diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-08-26 04:25:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-08-26 04:25:59 -0400 |
commit | 3cf430b0636045dc524759a0852293ba037732a7 (patch) | |
tree | 2c4e03f9028dc23ab4e6ca5a3a5a263af397984f | |
parent | 93dcf55f828b035fc93fc19eb03c1390e1e6d570 (diff) | |
parent | 83097aca8567a0bd593534853b71fe0fa9a75d69 (diff) |
Merge branch 'linus' into sched/devel
905 files changed, 12291 insertions, 8304 deletions
diff --git a/Documentation/arm/Samsung-S3C24XX/GPIO.txt b/Documentation/arm/Samsung-S3C24XX/GPIO.txt index b5d20c0b2ab4..ea7ccfc4b274 100644 --- a/Documentation/arm/Samsung-S3C24XX/GPIO.txt +++ b/Documentation/arm/Samsung-S3C24XX/GPIO.txt | |||
@@ -13,6 +13,21 @@ Introduction | |||
13 | data-sheet/users manual to find out the complete list. | 13 | data-sheet/users manual to find out the complete list. |
14 | 14 | ||
15 | 15 | ||
16 | GPIOLIB | ||
17 | ------- | ||
18 | |||
19 | With the event of the GPIOLIB in drivers/gpio, support for some | ||
20 | of the GPIO functions such as reading and writing a pin will | ||
21 | be removed in favour of this common access method. | ||
22 | |||
23 | Once all the extant drivers have been converted, the functions | ||
24 | listed below will be removed (they may be marked as __deprecated | ||
25 | in the near future). | ||
26 | |||
27 | - s3c2410_gpio_getpin | ||
28 | - s3c2410_gpio_setpin | ||
29 | |||
30 | |||
16 | Headers | 31 | Headers |
17 | ------- | 32 | ------- |
18 | 33 | ||
diff --git a/Documentation/arm/Samsung-S3C24XX/Overview.txt b/Documentation/arm/Samsung-S3C24XX/Overview.txt index 014a8ec4877d..cff6227b4484 100644 --- a/Documentation/arm/Samsung-S3C24XX/Overview.txt +++ b/Documentation/arm/Samsung-S3C24XX/Overview.txt | |||
@@ -8,9 +8,10 @@ Introduction | |||
8 | 8 | ||
9 | The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported | 9 | The Samsung S3C24XX range of ARM9 System-on-Chip CPUs are supported |
10 | by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, | 10 | by the 's3c2410' architecture of ARM Linux. Currently the S3C2410, |
11 | S3C2412, S3C2413, S3C2440 and S3C2442 devices are supported. | 11 | S3C2412, S3C2413, S3C2440, S3C2442 and S3C2443 devices are supported. |
12 | |||
13 | Support for the S3C2400 and S3C24A0 series are in progress. | ||
12 | 14 | ||
13 | Support for the S3C2400 series is in progress. | ||
14 | 15 | ||
15 | Configuration | 16 | Configuration |
16 | ------------- | 17 | ------------- |
@@ -38,6 +39,22 @@ Layout | |||
38 | Register, kernel and platform data definitions are held in the | 39 | Register, kernel and platform data definitions are held in the |
39 | arch/arm/mach-s3c2410 directory./include/mach | 40 | arch/arm/mach-s3c2410 directory./include/mach |
40 | 41 | ||
42 | arch/arm/plat-s3c24xx: | ||
43 | |||
44 | Files in here are either common to all the s3c24xx family, | ||
45 | or are common to only some of them with names to indicate this | ||
46 | status. The files that are not common to all are generally named | ||
47 | with the initial cpu they support in the series to ensure a short | ||
48 | name without any possibility of confusion with newer devices. | ||
49 | |||
50 | As an example, initially s3c244x would cover s3c2440 and s3c2442, but | ||
51 | with the s3c2443 which does not share many of the same drivers in | ||
52 | this directory, the name becomes invalid. We stick to s3c2440-<x> | ||
53 | to indicate a driver that is s3c2440 and s3c2442 compatible. | ||
54 | |||
55 | This does mean that to find the status of any given SoC, a number | ||
56 | of directories may need to be searched. | ||
57 | |||
41 | 58 | ||
42 | Machines | 59 | Machines |
43 | -------- | 60 | -------- |
@@ -159,6 +176,17 @@ NAND | |||
159 | For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt | 176 | For more information see Documentation/arm/Samsung-S3C24XX/NAND.txt |
160 | 177 | ||
161 | 178 | ||
179 | SD/MMC | ||
180 | ------ | ||
181 | |||
182 | The SD/MMC hardware pre S3C2443 is supported in the current | ||
183 | kernel, the driver is drivers/mmc/host/s3cmci.c and supports | ||
184 | 1 and 4 bit SD or MMC cards. | ||
185 | |||
186 | The SDIO behaviour of this driver has not been fully tested. There is no | ||
187 | current support for hardware SDIO interrupts. | ||
188 | |||
189 | |||
162 | Serial | 190 | Serial |
163 | ------ | 191 | ------ |
164 | 192 | ||
@@ -178,6 +206,9 @@ GPIO | |||
178 | The core contains support for manipulating the GPIO, see the | 206 | The core contains support for manipulating the GPIO, see the |
179 | documentation in GPIO.txt in the same directory as this file. | 207 | documentation in GPIO.txt in the same directory as this file. |
180 | 208 | ||
209 | Newer kernels carry GPIOLIB, and support is being moved towards | ||
210 | this with some of the older support in line to be removed. | ||
211 | |||
181 | 212 | ||
182 | Clock Management | 213 | Clock Management |
183 | ---------------- | 214 | ---------------- |
diff --git a/Documentation/filesystems/ext4.txt b/Documentation/filesystems/ext4.txt index 80e193d82e2e..0d5394920a31 100644 --- a/Documentation/filesystems/ext4.txt +++ b/Documentation/filesystems/ext4.txt | |||
@@ -26,6 +26,12 @@ Mailing list: linux-ext4@vger.kernel.org | |||
26 | 26 | ||
27 | git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git | 27 | git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git |
28 | 28 | ||
29 | - Note that it is highly important to install the mke2fs.conf file | ||
30 | that comes with the e2fsprogs 1.41.x sources in /etc/mke2fs.conf. If | ||
31 | you have edited the /etc/mke2fs.conf file installed on your system, | ||
32 | you will need to merge your changes with the version from e2fsprogs | ||
33 | 1.41.x. | ||
34 | |||
29 | - Create a new filesystem using the ext4dev filesystem type: | 35 | - Create a new filesystem using the ext4dev filesystem type: |
30 | 36 | ||
31 | # mke2fs -t ext4dev /dev/hda1 | 37 | # mke2fs -t ext4dev /dev/hda1 |
diff --git a/Documentation/filesystems/ubifs.txt b/Documentation/filesystems/ubifs.txt index 540e9e7f59c5..6a0d70a22f05 100644 --- a/Documentation/filesystems/ubifs.txt +++ b/Documentation/filesystems/ubifs.txt | |||
@@ -57,7 +57,7 @@ Similarly to JFFS2, UBIFS supports on-the-flight compression which makes | |||
57 | it possible to fit quite a lot of data to the flash. | 57 | it possible to fit quite a lot of data to the flash. |
58 | 58 | ||
59 | Similarly to JFFS2, UBIFS is tolerant of unclean reboots and power-cuts. | 59 | Similarly to JFFS2, UBIFS is tolerant of unclean reboots and power-cuts. |
60 | It does not need stuff like ckfs.ext2. UBIFS automatically replays its | 60 | It does not need stuff like fsck.ext2. UBIFS automatically replays its |
61 | journal and recovers from crashes, ensuring that the on-flash data | 61 | journal and recovers from crashes, ensuring that the on-flash data |
62 | structures are consistent. | 62 | structures are consistent. |
63 | 63 | ||
diff --git a/Documentation/hwmon/ibmaem b/Documentation/hwmon/ibmaem index 2fefaf582a43..e98bdfea3467 100644 --- a/Documentation/hwmon/ibmaem +++ b/Documentation/hwmon/ibmaem | |||
@@ -1,8 +1,11 @@ | |||
1 | Kernel driver ibmaem | 1 | Kernel driver ibmaem |
2 | ====================== | 2 | ====================== |
3 | 3 | ||
4 | This driver talks to the IBM Systems Director Active Energy Manager, known | ||
5 | henceforth as AEM. | ||
6 | |||
4 | Supported systems: | 7 | Supported systems: |
5 | * Any recent IBM System X server with Active Energy Manager support. | 8 | * Any recent IBM System X server with AEM support. |
6 | This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2, | 9 | This includes the x3350, x3550, x3650, x3655, x3755, x3850 M2, |
7 | x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface | 10 | x3950 M2, and certain HS2x/LS2x/QS2x blades. The IPMI host interface |
8 | driver ("ipmi-si") needs to be loaded for this driver to do anything. | 11 | driver ("ipmi-si") needs to be loaded for this driver to do anything. |
@@ -14,24 +17,22 @@ Author: Darrick J. Wong | |||
14 | Description | 17 | Description |
15 | ----------- | 18 | ----------- |
16 | 19 | ||
17 | This driver implements sensor reading support for the energy and power | 20 | This driver implements sensor reading support for the energy and power meters |
18 | meters available on various IBM System X hardware through the BMC. All | 21 | available on various IBM System X hardware through the BMC. All sensor banks |
19 | sensor banks will be exported as platform devices; this driver can talk | 22 | will be exported as platform devices; this driver can talk to both v1 and v2 |
20 | to both v1 and v2 interfaces. This driver is completely separate from the | 23 | interfaces. This driver is completely separate from the older ibmpex driver. |
21 | older ibmpex driver. | ||
22 | 24 | ||
23 | The v1 AEM interface has a simple set of features to monitor energy use. | 25 | The v1 AEM interface has a simple set of features to monitor energy use. There |
24 | There is a register that displays an estimate of raw energy consumption | 26 | is a register that displays an estimate of raw energy consumption since the |
25 | since the last BMC reset, and a power sensor that returns average power | 27 | last BMC reset, and a power sensor that returns average power use over a |
26 | use over a configurable interval. | 28 | configurable interval. |
27 | 29 | ||
28 | The v2 AEM interface is a bit more sophisticated, being able to present | 30 | The v2 AEM interface is a bit more sophisticated, being able to present a wider |
29 | a wider range of energy and power use registers, the power cap as | 31 | range of energy and power use registers, the power cap as set by the AEM |
30 | set by the AEM software, and temperature sensors. | 32 | software, and temperature sensors. |
31 | 33 | ||
32 | Special Features | 34 | Special Features |
33 | ---------------- | 35 | ---------------- |
34 | 36 | ||
35 | The "power_cap" value displays the current system power cap, as set by | 37 | The "power_cap" value displays the current system power cap, as set by the AEM |
36 | the Active Energy Manager software. Setting the power cap from the host | 38 | software. Setting the power cap from the host is not currently supported. |
37 | is not currently supported. | ||
diff --git a/Documentation/ja_JP/HOWTO b/Documentation/ja_JP/HOWTO index 488c77fa3aae..0775cf4798b2 100644 --- a/Documentation/ja_JP/HOWTO +++ b/Documentation/ja_JP/HOWTO | |||
@@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a | |||
11 | fork. So if you have any comments or updates for this file, please try | 11 | fork. So if you have any comments or updates for this file, please try |
12 | to update the original English file first. | 12 | to update the original English file first. |
13 | 13 | ||
14 | Last Updated: 2007/11/16 | 14 | Last Updated: 2008/08/21 |
15 | ================================== | 15 | ================================== |
16 | ã“ã‚Œã¯ã€ | 16 | ã“ã‚Œã¯ã€ |
17 | linux-2.6.24/Documentation/HOWTO | 17 | linux-2.6.27/Documentation/HOWTO |
18 | ã®å’Œè¨³ã§ã™ã€‚ | 18 | ã®å’Œè¨³ã§ã™ã€‚ |
19 | 19 | ||
20 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://www.linux.or.jp/JF/ > | 20 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://www.linux.or.jp/JF/ > |
21 | 翻訳日: 2007/11/10 | 21 | 翻訳日: 2008/8/5 |
22 | 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> | 22 | 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> |
23 | æ ¡æ£è€…: æ¾å€‰ã•ã‚“ <nbh--mats at nifty dot com> | 23 | æ ¡æ£è€…: æ¾å€‰ã•ã‚“ <nbh--mats at nifty dot com> |
24 | å°æž— é›…å…¸ã•ã‚“ (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> | 24 | å°æž— é›…å…¸ã•ã‚“ (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> |
@@ -287,13 +287,15 @@ Linux カーãƒãƒ«ã®é–‹ç™ºãƒ—ãƒã‚»ã‚¹ã¯ç¾åœ¨å¹¾ã¤ã‹ã®ç•°ãªã‚‹ãƒ¡ã‚¤ãƒ³ã‚ | |||
287 | ã«å®‰å®šã—ãŸçŠ¶æ…‹ã«ã‚ã‚‹ã¨åˆ¤æ–ã—ãŸã¨ãã«ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã¾ã™ã€‚目標ã¯æ¯Žé€±æ–° | 287 | ã«å®‰å®šã—ãŸçŠ¶æ…‹ã«ã‚ã‚‹ã¨åˆ¤æ–ã—ãŸã¨ãã«ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã¾ã™ã€‚目標ã¯æ¯Žé€±æ–° |
288 | ã—ã„ -rc カーãƒãƒ«ã‚’リリースã™ã‚‹ã“ã¨ã§ã™ã€‚ | 288 | ã—ã„ -rc カーãƒãƒ«ã‚’リリースã™ã‚‹ã“ã¨ã§ã™ã€‚ |
289 | 289 | ||
290 | - 以下㮠URL ã§å„ -rc リリースã«å˜åœ¨ã™ã‚‹æ—¢çŸ¥ã®å¾Œæˆ»ã‚Šå•é¡Œã®ãƒªã‚¹ãƒˆ | ||
291 | ãŒè¿½è·¡ã•ã‚Œã¾ã™- | ||
292 | http://kernelnewbies.org/known_regressions | ||
293 | |||
294 | - ã“ã®ãƒ—ãƒã‚»ã‚¹ã¯ã‚«ãƒ¼ãƒãƒ«ãŒ 「準備ãŒã§ããŸã€ã¨è€ƒãˆã‚‰ã‚Œã‚‹ã¾ã§ç¶™ç¶šã—ã¾ | 290 | - ã“ã®ãƒ—ãƒã‚»ã‚¹ã¯ã‚«ãƒ¼ãƒãƒ«ãŒ 「準備ãŒã§ããŸã€ã¨è€ƒãˆã‚‰ã‚Œã‚‹ã¾ã§ç¶™ç¶šã—ã¾ |
295 | ã™ã€‚ã“ã®ãƒ—ãƒã‚»ã‚¹ã¯ã ã„ãŸã„ 6週間継続ã—ã¾ã™ã€‚ | 291 | ã™ã€‚ã“ã®ãƒ—ãƒã‚»ã‚¹ã¯ã ã„ãŸã„ 6週間継続ã—ã¾ã™ã€‚ |
296 | 292 | ||
293 | - å„リリースã§ã®æ—¢çŸ¥ã®å¾Œæˆ»ã‚Šå•é¡Œ(regression: ã“ã®ãƒªãƒªãƒ¼ã‚¹ã®ä¸ã§æ–°è¦ | ||
294 | ã«ä½œã‚Šè¾¼ã¾ã‚ŒãŸå•é¡Œã‚’指ã™) ã¯ãã®éƒ½åº¦ Linux-kernel メーリングリスト | ||
295 | ã«æŠ•ç¨¿ã•ã‚Œã¾ã™ã€‚ゴールã¨ã—ã¦ã¯ã€ã‚«ãƒ¼ãƒãƒ«ãŒ 「準備ãŒã§ããŸã€ã¨å®£è¨€ | ||
296 | ã™ã‚‹å‰ã«ã“ã®ãƒªã‚¹ãƒˆã®é•·ã•ã‚’ゼãƒã«æ¸›ã‚‰ã™ã“ã¨ã§ã™ãŒã€ç¾å®Ÿã«ã¯ã€æ•°å€‹ã® | ||
297 | 後戻りå•é¡ŒãŒãƒªãƒªãƒ¼ã‚¹æ™‚ã«ãŸã³ãŸã³æ®‹ã£ã¦ã—ã¾ã„ã¾ã™ã€‚ | ||
298 | |||
297 | Andrew Morton ㌠Linux-kernel メーリングリストã«ã‚«ãƒ¼ãƒãƒ«ãƒªãƒªãƒ¼ã‚¹ã«ã¤ã„ | 299 | Andrew Morton ㌠Linux-kernel メーリングリストã«ã‚«ãƒ¼ãƒãƒ«ãƒªãƒªãƒ¼ã‚¹ã«ã¤ã„ |
298 | ã¦æ›¸ã„ãŸã“ã¨ã‚’ã“ã“ã§è¨€ã£ã¦ãŠãã“ã¨ã¯ä¾¡å€¤ãŒã‚ã‚Šã¾ã™- | 300 | ã¦æ›¸ã„ãŸã“ã¨ã‚’ã“ã“ã§è¨€ã£ã¦ãŠãã“ã¨ã¯ä¾¡å€¤ãŒã‚ã‚Šã¾ã™- |
299 | 「カーãƒãƒ«ãŒã„ã¤ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã‹ã¯èª°ã‚‚知りã¾ã›ã‚“。ãªãœãªã‚‰ã€ã“ã‚Œã¯ç¾ | 301 | 「カーãƒãƒ«ãŒã„ã¤ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã‚‹ã‹ã¯èª°ã‚‚知りã¾ã›ã‚“。ãªãœãªã‚‰ã€ã“ã‚Œã¯ç¾ |
@@ -303,18 +305,20 @@ Andrew Morton ㌠Linux-kernel メーリングリストã«ã‚«ãƒ¼ãƒãƒ«ãƒªãƒªãƒ¼ã | |||
303 | 2.6.x.y -stable カーãƒãƒ«ãƒ„リー | 305 | 2.6.x.y -stable カーãƒãƒ«ãƒ„リー |
304 | --------------------------- | 306 | --------------------------- |
305 | 307 | ||
306 | ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã«4ã¤ç›®ã®æ•°å—ãŒã¤ã„ãŸã‚«ãƒ¼ãƒãƒ«ã¯ -stable カーãƒãƒ«ã§ã™ã€‚ã“れ㫠| 308 | ãƒãƒ¼ã‚¸ãƒ§ãƒ³ç•ªå·ãŒ4ã¤ã®æ•°å—ã«åˆ†ã‹ã‚Œã¦ã„るカーãƒãƒ«ã¯ -stable カーãƒãƒ«ã§ã™ã€‚ |
307 | ã¯ã€2.6.x カーãƒãƒ«ã§è¦‹ã¤ã‹ã£ãŸã‚»ã‚ュリティå•é¡Œã‚„é‡å¤§ãªå¾Œæˆ»ã‚Šã«å¯¾ã™ã‚‹æ¯” | 309 | ã“ã‚Œã«ã¯ã€2.6.x カーãƒãƒ«ã§è¦‹ã¤ã‹ã£ãŸã‚»ã‚ュリティå•é¡Œã‚„é‡å¤§ãªå¾Œæˆ»ã‚Šã«å¯¾ |
308 | 較的å°ã•ã„é‡è¦ãªä¿®æ£ãŒå«ã¾ã‚Œã¾ã™ã€‚ | 310 | ã™ã‚‹æ¯”較的å°ã•ã„é‡è¦ãªä¿®æ£ãŒå«ã¾ã‚Œã¾ã™ã€‚ |
309 | 311 | ||
310 | ã“ã‚Œã¯ã€é–‹ç™º/実験的ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ†ã‚¹ãƒˆã«å”力ã™ã‚‹ã“ã¨ã«èˆˆå‘³ãŒç„¡ã〠| 312 | ã“ã‚Œã¯ã€é–‹ç™º/実験的ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ†ã‚¹ãƒˆã«å”力ã™ã‚‹ã“ã¨ã«èˆˆå‘³ãŒç„¡ã〠|
311 | 最新ã®å®‰å®šã—ãŸã‚«ãƒ¼ãƒãƒ«ã‚’使ã„ãŸã„ユーザã«æŽ¨å¥¨ã™ã‚‹ãƒ–ランãƒã§ã™ã€‚ | 313 | 最新ã®å®‰å®šã—ãŸã‚«ãƒ¼ãƒãƒ«ã‚’使ã„ãŸã„ユーザã«æŽ¨å¥¨ã™ã‚‹ãƒ–ランãƒã§ã™ã€‚ |
312 | 314 | ||
313 | ã‚‚ã—ã€2.6.x.y カーãƒãƒ«ãŒå˜åœ¨ã—ãªã„å ´åˆã«ã¯ã€ç•ªå·ãŒä¸€ç•ªå¤§ãã„ 2.6.x | 315 | ã‚‚ã—ã€2.6.x.y カーãƒãƒ«ãŒå˜åœ¨ã—ãªã„å ´åˆã«ã¯ã€ç•ªå·ãŒä¸€ç•ªå¤§ãã„ 2.6.x ㌠|
314 | ãŒæœ€æ–°ã®å®‰å®šç‰ˆã‚«ãƒ¼ãƒãƒ«ã§ã™ã€‚ | 316 | 最新ã®å®‰å®šç‰ˆã‚«ãƒ¼ãƒãƒ«ã§ã™ã€‚ |
315 | 317 | ||
316 | 2.6.x.y 㯠"stable" ãƒãƒ¼ãƒ <stable@kernel.org> ã§ãƒ¡ãƒ³ãƒ†ã•ã‚Œã¦ãŠã‚Šã€ã | 318 | 2.6.x.y 㯠"stable" ãƒãƒ¼ãƒ <stable@kernel.org> ã§ãƒ¡ãƒ³ãƒ†ã•ã‚Œã¦ãŠã‚Šã€å¿… |
317 | ã„ãŸã„隔週ã§ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã¦ã„ã¾ã™ã€‚ | 319 | è¦ã«å¿œã˜ã¦ãƒªãƒªãƒ¼ã‚¹ã•ã‚Œã¾ã™ã€‚通常ã®ãƒªãƒªãƒ¼ã‚¹æœŸé–“㯠2週間毎ã§ã™ãŒã€å·®ã—迫㣠|
320 | ãŸå•é¡ŒãŒãªã‘ã‚Œã°ã‚‚ã†å°‘ã—é•·ããªã‚‹ã“ã¨ã‚‚ã‚ã‚Šã¾ã™ã€‚ã‚»ã‚ュリティ関連ã®å•é¡Œ | ||
321 | ã®å ´åˆã¯ã“ã‚Œã«å¯¾ã—ã¦ã ã„ãŸã„ã®å ´åˆã€ã™ãã«ãƒªãƒªãƒ¼ã‚¹ãŒã•ã‚Œã¾ã™ã€‚ | ||
318 | 322 | ||
319 | カーãƒãƒ«ãƒ„リーã«å…¥ã£ã¦ã„ã‚‹ã€Documentation/stable_kernel_rules.txt ファ | 323 | カーãƒãƒ«ãƒ„リーã«å…¥ã£ã¦ã„ã‚‹ã€Documentation/stable_kernel_rules.txt ファ |
320 | イルã«ã¯ã©ã®ã‚ˆã†ãªç¨®é¡žã®å¤‰æ›´ãŒ -stable ツリーã«å—ã‘入れå¯èƒ½ã‹ã€ã¾ãŸãƒª | 324 | イルã«ã¯ã©ã®ã‚ˆã†ãªç¨®é¡žã®å¤‰æ›´ãŒ -stable ツリーã«å—ã‘入れå¯èƒ½ã‹ã€ã¾ãŸãƒª |
@@ -341,7 +345,9 @@ linux-kernel メーリングリストã§åŽé›†ã•ã‚ŒãŸå¤šæ•°ã®ãƒ‘ッãƒã¨åŒæ | |||
341 | メインラインã¸å…¥ã‚Œã‚‹ã‚ˆã†ã« Linus ã«ãƒ—ッシュã—ã¾ã™ã€‚ | 345 | メインラインã¸å…¥ã‚Œã‚‹ã‚ˆã†ã« Linus ã«ãƒ—ッシュã—ã¾ã™ã€‚ |
342 | 346 | ||
343 | メインカーãƒãƒ«ãƒ„リーã«å«ã‚ã‚‹ãŸã‚ã« Linus ã«é€ã‚‹å‰ã«ã€ã™ã¹ã¦ã®æ–°ã—ã„パッ | 347 | メインカーãƒãƒ«ãƒ„リーã«å«ã‚ã‚‹ãŸã‚ã« Linus ã«é€ã‚‹å‰ã«ã€ã™ã¹ã¦ã®æ–°ã—ã„パッ |
344 | ãƒãŒ -mm ツリーã§ãƒ†ã‚¹ãƒˆã•ã‚Œã‚‹ã“ã¨ãŒå¼·ã推奨ã•ã‚Œã¾ã™ã€‚ | 348 | ãƒãŒ -mm ツリーã§ãƒ†ã‚¹ãƒˆã•ã‚Œã‚‹ã“ã¨ãŒå¼·ã推奨ã•ã‚Œã¦ã„ã¾ã™ã€‚マージウィン |
349 | ドウãŒé–‹ãå‰ã« -mm ツリーã«ç¾ã‚Œãªã‹ã£ãŸãƒ‘ッãƒã¯ãƒ¡ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³ã«ãƒžãƒ¼ã‚¸ã• | ||
350 | れるã“ã¨ã¯å›°é›£ã«ãªã‚Šã¾ã™ã€‚ | ||
345 | 351 | ||
346 | ã“れらã®ã‚«ãƒ¼ãƒãƒ«ã¯å®‰å®šã—ã¦å‹•ä½œã™ã¹ãシステムã¨ã—ã¦ä½¿ã†ã®ã«ã¯é©åˆ‡ã§ã¯ã‚ | 352 | ã“れらã®ã‚«ãƒ¼ãƒãƒ«ã¯å®‰å®šã—ã¦å‹•ä½œã™ã¹ãシステムã¨ã—ã¦ä½¿ã†ã®ã«ã¯é©åˆ‡ã§ã¯ã‚ |
347 | ã‚Šã¾ã›ã‚“ã—ã€ã‚«ãƒ¼ãƒãƒ«ãƒ–ランãƒã®ä¸ã§ã‚‚ã‚‚ã£ã¨ã‚‚動作ã«ãƒªã‚¹ã‚¯ãŒé«˜ã„ã‚‚ã®ã§ã™ã€‚ | 353 | ã‚Šã¾ã›ã‚“ã—ã€ã‚«ãƒ¼ãƒãƒ«ãƒ–ランãƒã®ä¸ã§ã‚‚ã‚‚ã£ã¨ã‚‚動作ã«ãƒªã‚¹ã‚¯ãŒé«˜ã„ã‚‚ã®ã§ã™ã€‚ |
@@ -395,13 +401,15 @@ linux-kernel メーリングリストã§åŽé›†ã•ã‚ŒãŸå¤šæ•°ã®ãƒ‘ッãƒã¨åŒæ | |||
395 | - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> | 401 | - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> |
396 | git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git | 402 | git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git |
397 | 403 | ||
398 | - SCSI, James Bottomley <James.Bottomley@SteelEye.com> | 404 | - SCSI, James Bottomley <James.Bottomley@hansenpartnership.com> |
399 | git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git | 405 | git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git |
400 | 406 | ||
407 | - x86, Ingo Molnar <mingo@elte.hu> | ||
408 | git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git | ||
409 | |||
401 | quilt ツリー- | 410 | quilt ツリー- |
402 | - USB, PCI ドライãƒã‚³ã‚¢ã¨ I2C, Greg Kroah-Hartman <gregkh@suse.de> | 411 | - USB, ドライãƒã‚³ã‚¢ã¨ I2C, Greg Kroah-Hartman <gregkh@suse.de> |
403 | kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ | 412 | kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/ |
404 | - x86-64 㨠i386 ã®ä»²é–“ Andi Kleen <ak@suse.de> | ||
405 | 413 | ||
406 | ãã®ä»–ã®ã‚«ãƒ¼ãƒãƒ«ãƒ„リー㯠http://git.kernel.org/ 㨠MAINTAINERS ファ | 414 | ãã®ä»–ã®ã‚«ãƒ¼ãƒãƒ«ãƒ„リー㯠http://git.kernel.org/ 㨠MAINTAINERS ファ |
407 | イルã«ä¸€è¦§è¡¨ãŒã‚ã‚Šã¾ã™ã€‚ | 415 | イルã«ä¸€è¦§è¡¨ãŒã‚ã‚Šã¾ã™ã€‚ |
@@ -412,13 +420,32 @@ linux-kernel メーリングリストã§åŽé›†ã•ã‚ŒãŸå¤šæ•°ã®ãƒ‘ッãƒã¨åŒæ | |||
412 | bugzilla.kernel.org 㯠Linux カーãƒãƒ«é–‹ç™ºè€…ãŒã‚«ãƒ¼ãƒãƒ«ã®ãƒã‚°ã‚’追跡ã™ã‚‹ | 420 | bugzilla.kernel.org 㯠Linux カーãƒãƒ«é–‹ç™ºè€…ãŒã‚«ãƒ¼ãƒãƒ«ã®ãƒã‚°ã‚’追跡ã™ã‚‹ |
413 | å ´æ‰€ã§ã™ã€‚ユーザã¯è¦‹ã¤ã‘ãŸãƒã‚°ã®å…¨ã¦ã‚’ã“ã®ãƒ„ールã§å ±å‘Šã™ã¹ãã§ã™ã€‚ | 421 | å ´æ‰€ã§ã™ã€‚ユーザã¯è¦‹ã¤ã‘ãŸãƒã‚°ã®å…¨ã¦ã‚’ã“ã®ãƒ„ールã§å ±å‘Šã™ã¹ãã§ã™ã€‚ |
414 | ã©ã† kernel bugzilla を使ã†ã‹ã®è©³ç´°ã¯ã€ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„- | 422 | ã©ã† kernel bugzilla を使ã†ã‹ã®è©³ç´°ã¯ã€ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ãã ã•ã„- |
415 | http://test.kernel.org/bugzilla/faq.html | 423 | http://bugzilla.kernel.org/page.cgi?id=faq.html |
416 | |||
417 | メインカーãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚るファイル REPORTING-BUGS ã¯ã‚«ãƒ¼ãƒ | 424 | メインカーãƒãƒ«ã‚½ãƒ¼ã‚¹ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«ã‚るファイル REPORTING-BUGS ã¯ã‚«ãƒ¼ãƒ |
418 | ルãƒã‚°ã‚‰ã—ã„ã‚‚ã®ã«ã¤ã„ã¦ã©ã†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã‹ã®è‰¯ã„テンプレートã§ã‚ã‚Šã€å• | 425 | ルãƒã‚°ã‚‰ã—ã„ã‚‚ã®ã«ã¤ã„ã¦ã©ã†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹ã‹ã®è‰¯ã„テンプレートã§ã‚ã‚Šã€å• |
419 | é¡Œã®è¿½è·¡ã‚’助ã‘ã‚‹ãŸã‚ã«ã‚«ãƒ¼ãƒãƒ«é–‹ç™ºè€…ã«ã¨ã£ã¦ã©ã‚“ãªæƒ…å ±ãŒå¿…è¦ãªã®ã‹ã®è©³ | 426 | é¡Œã®è¿½è·¡ã‚’助ã‘ã‚‹ãŸã‚ã«ã‚«ãƒ¼ãƒãƒ«é–‹ç™ºè€…ã«ã¨ã£ã¦ã©ã‚“ãªæƒ…å ±ãŒå¿…è¦ãªã®ã‹ã®è©³ |
420 | ç´°ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚ | 427 | ç´°ãŒæ›¸ã‹ã‚Œã¦ã„ã¾ã™ã€‚ |
421 | 428 | ||
429 | ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã®ç®¡ç† | ||
430 | ------------------- | ||
431 | |||
432 | ã‚ãªãŸã®ãƒãƒƒã‚ングã®ã‚¹ã‚ルを訓練ã™ã‚‹æœ€é«˜ã®æ–¹æ³•ã®ã²ã¨ã¤ã«ã€ä»–人ãŒãƒ¬ãƒãƒ¼ | ||
433 | トã—ãŸãƒã‚°ã‚’ä¿®æ£ã™ã‚‹ã“ã¨ãŒã‚ã‚Šã¾ã™ã€‚ã‚ãªãŸãŒã‚«ãƒ¼ãƒãƒ«ã‚’より安定化ã•ã›ã‚‹ | ||
434 | ã“ã«å¯„与ã™ã‚‹ã¨ã„ã†ã“ã¨ã ã‘ã§ãªãã€ã‚ãªãŸã¯ ç¾å®Ÿã®å•é¡Œã‚’ä¿®æ£ã™ã‚‹ã“ã¨ã‚’ | ||
435 | å¦ã³ã€è‡ªåˆ†ã®ã‚¹ã‚ルも強化ã§ãã€ã¾ãŸä»–ã®é–‹ç™ºè€…ãŒã‚ãªãŸã®å˜åœ¨ã«æ°—ãŒã¤ã | ||
436 | ã¾ã™ã€‚ãƒã‚°ã‚’ä¿®æ£ã™ã‚‹ã“ã¨ã¯ã€å¤šãã®é–‹ç™ºè€…ã®ä¸ã‹ã‚‰è‡ªåˆ†ãŒåŠŸç¸¾ã‚’ã‚ã’る最善 | ||
437 | ã®é“ã§ã™ã€ãªãœãªã‚‰å¤šãã®äººã¯ä»–人ã®ãƒã‚°ã®ä¿®æ£ã«æ™‚間を浪費ã™ã‚‹ã“ã¨ã‚’好㾠| ||
438 | ãªã„ã‹ã‚‰ã§ã™ã€‚ | ||
439 | |||
440 | ã™ã§ã«ãƒ¬ãƒãƒ¼ãƒˆã•ã‚ŒãŸãƒã‚°ã®ãŸã‚ã«ä»•äº‹ã‚’ã™ã‚‹ãŸã‚ã«ã¯ã€ | ||
441 | http://bugzilla.kernel.org ã«è¡Œã£ã¦ãã ã•ã„。もã—今後ã®ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã« | ||
442 | ã¤ã„ã¦ã‚¢ãƒ‰ãƒã‚¤ã‚¹ã‚’å—ã‘ãŸã„ã®ã§ã‚ã‚Œã°ã€bugme-new メーリングリスト(æ–°ã— | ||
443 | ã„ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆã ã‘ãŒã“ã“ã«ãƒ¡ãƒ¼ãƒ«ã•ã‚Œã‚‹) ã¾ãŸã¯ bugme-janitor メーリン | ||
444 | グリスト(bugzilla ã®å¤‰æ›´æ¯Žã«ã“ã“ã«ãƒ¡ãƒ¼ãƒ«ã•ã‚Œã‚‹)ã‚’è³¼èªã§ãã¾ã™ã€‚ | ||
445 | |||
446 | http://lists.linux-foundation.org/mailman/listinfo/bugme-new | ||
447 | http://lists.linux-foundation.org/mailman/listinfo/bugme-janitors | ||
448 | |||
422 | メーリングリスト | 449 | メーリングリスト |
423 | ------------- | 450 | ------------- |
424 | 451 | ||
diff --git a/Documentation/ja_JP/SubmitChecklist b/Documentation/ja_JP/SubmitChecklist new file mode 100644 index 000000000000..6c42e071d723 --- /dev/null +++ b/Documentation/ja_JP/SubmitChecklist | |||
@@ -0,0 +1,111 @@ | |||
1 | NOTE: | ||
2 | This is a version of Documentation/SubmitChecklist into Japanese. | ||
3 | This document is maintained by Takenori Nagano <t-nagano@ah.jp.nec.com> | ||
4 | and the JF Project team <http://www.linux.or.jp/JF/>. | ||
5 | If you find any difference between this document and the original file | ||
6 | or a problem with the translation, | ||
7 | please contact the maintainer of this file or JF project. | ||
8 | |||
9 | Please also note that the purpose of this file is to be easier to read | ||
10 | for non English (read: Japanese) speakers and is not intended as a | ||
11 | fork. So if you have any comments or updates of this file, please try | ||
12 | to update the original English file first. | ||
13 | |||
14 | Last Updated: 2008/07/14 | ||
15 | ================================== | ||
16 | ã“ã‚Œã¯ã€ | ||
17 | linux-2.6.26/Documentation/SubmitChecklist ã®å’Œè¨³ã§ã™ã€‚ | ||
18 | |||
19 | 翻訳団体: JF プãƒã‚¸ã‚§ã‚¯ãƒˆ < http://www.linux.or.jp/JF/ > | ||
20 | 翻訳日: 2008/07/14 | ||
21 | 翻訳者: Takenori Nagano <t-nagano at ah dot jp dot nec dot com> | ||
22 | æ ¡æ£è€…: Masanori Kobayashi ã•ã‚“ <zap03216 at nifty dot ne dot jp> | ||
23 | ================================== | ||
24 | |||
25 | |||
26 | Linux カーãƒãƒ«ãƒ‘ッãƒæŠ•ç¨¿è€…å‘ã‘ãƒã‚§ãƒƒã‚¯ãƒªã‚¹ãƒˆ | ||
27 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
28 | |||
29 | 本書ã§ã¯ã€ãƒ‘ッãƒã‚’ã‚ˆã‚Šç´ æ—©ãå–り込んã§ã‚‚らã„ãŸã„開発者ãŒå®Ÿè·µã™ã¹ã基本的ãªäº‹æŸ„ | ||
30 | ã‚’ã„ãã¤ã‹ç´¹ä»‹ã—ã¾ã™ã€‚ã“ã“ã«ã‚ã‚‹å…¨ã¦ã®äº‹æŸ„ã¯ã€Documentation/SubmittingPatches | ||
31 | ãªã©ã®Linuxカーãƒãƒ«ãƒ‘ッãƒæŠ•ç¨¿ã«éš›ã—ã¦ã®å¿ƒå¾—を補足ã™ã‚‹ã‚‚ã®ã§ã™ã€‚ | ||
32 | |||
33 | 1: 妥当ãªCONFIGオプションや変更ã•ã‚ŒãŸCONFIGオプションã€ã¤ã¾ã‚Š =y, =m, =n | ||
34 | å…¨ã¦ã§æ£ã—ãビルドã§ãã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。ãã®éš›ã€gccåŠã³ãƒªãƒ³ã‚«ãŒ | ||
35 | warningã‚„errorを出ã—ã¦ã„ãªã„ã“ã¨ã‚‚確èªã—ã¦ãã ã•ã„。 | ||
36 | |||
37 | 2: allnoconfig, allmodconfig オプションを用ã„ã¦æ£ã—ãビルドã§ãã‚‹ã“ã¨ã‚’ | ||
38 | 確èªã—ã¦ãã ã•ã„。 | ||
39 | |||
40 | 3: 手許ã®ã‚¯ãƒã‚¹ã‚³ãƒ³ãƒ‘イルツールやOSDLã®PLMã®ã‚ˆã†ãªã‚‚ã®ã‚’用ã„ã¦ã€è¤‡æ•°ã® | ||
41 | アーã‚テクãƒãƒ£ã«ãŠã„ã¦ã‚‚æ£ã—ãビルドã§ãã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 | ||
42 | |||
43 | 4: 64bité•·ã®'unsigned long'を使用ã—ã¦ã„ã‚‹ppc64ã¯ã€ã‚¯ãƒã‚¹ã‚³ãƒ³ãƒ‘イルã§ã® | ||
44 | ãƒã‚§ãƒƒã‚¯ã«é©å½“ãªã‚¢ãƒ¼ã‚テクãƒãƒ£ã§ã™ã€‚ | ||
45 | |||
46 | 5: カーãƒãƒ«ã‚³ãƒ¼ãƒ‡ã‚£ãƒ³ã‚°ã‚¹ã‚¿ã‚¤ãƒ«ã«æº–æ‹ ã—ã¦ã„ã‚‹ã‹ã©ã†ã‹ç¢ºèªã—ã¦ãã ã•ã„(!) | ||
47 | |||
48 | 6: CONFIGオプションã®è¿½åŠ ・変更をã—ãŸå ´åˆã«ã¯ã€CONFIGメニューãŒå£Šã‚Œã¦ã„ãªã„ | ||
49 | ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 | ||
50 | |||
51 | 7: æ–°ã—ãKconfigã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’è¿½åŠ ã™ã‚‹éš›ã«ã¯ã€å¿…ãšãã®helpも記述ã—ã¦ãã ã•ã„。 | ||
52 | |||
53 | 8: é©åˆ‡ãªKconfigã®ä¾å˜é–¢ä¿‚を考ãˆãªãŒã‚‰æ…Žé‡ã«ãƒã‚§ãƒƒã‚¯ã—ã¦ãã ã•ã„。 | ||
54 | ãŸã ã—ã€ã“ã®ä½œæ¥ã¯ãƒžã‚·ãƒ³ã‚’使ã£ãŸãƒ†ã‚¹ãƒˆã§ãã¡ã‚“ã¨è¡Œã†ã®ãŒã¨ã¦ã‚‚困難ã§ã™ã€‚ | ||
55 | ã†ã¾ãã‚„ã‚‹ã«ã¯ã€è‡ªåˆ†ã®é ã§è€ƒãˆã‚‹ã“ã¨ã§ã™ã€‚ | ||
56 | |||
57 | 9: sparseを利用ã—ã¦ã¡ã‚ƒã‚“ã¨ã—ãŸã‚³ãƒ¼ãƒ‰ãƒã‚§ãƒƒã‚¯ã‚’ã—ã¦ãã ã•ã„。 | ||
58 | |||
59 | 10: 'make checkstack' 㨠'make namespacecheck' を利用ã—ã€å•é¡ŒãŒç™ºè¦‹ã•ã‚ŒãŸã‚‰ | ||
60 | ä¿®æ£ã—ã¦ãã ã•ã„。'make checkstack' ã¯æ˜Žç¤ºçš„ã«å•é¡Œã‚’示ã—ã¾ã›ã‚“ãŒã€ã©ã‚Œã‹ | ||
61 | 1ã¤ã®é–¢æ•°ãŒ512ãƒã‚¤ãƒˆã‚ˆã‚Šå¤§ãã„スタックを使ã£ã¦ã„ã‚Œã°ã€ä¿®æ£ã™ã¹ã候補㨠| ||
62 | ãªã‚Šã¾ã™ã€‚ | ||
63 | |||
64 | 11: ã‚°ãƒãƒ¼ãƒãƒ«ãªkernel API を説明ã™ã‚‹ kernel-doc をソースã®ä¸ã«å«ã‚ã¦ãã ã•ã„。 | ||
65 | ( staticãªé–¢æ•°ã«ãŠã„ã¦ã¯å¿…é ˆã§ã¯ã‚ã‚Šã¾ã›ã‚“ãŒã€å«ã‚ã¦ã‚‚らã£ã¦ã‚‚çµæ§‹ã§ã™ ) | ||
66 | ãã—ã¦ã€'make htmldocs' ã‚‚ã—ã㯠'make mandocs' を利用ã—ã¦è¿½è¨˜ã—㟠| ||
67 | ドã‚ュメントã®ãƒã‚§ãƒƒã‚¯ã‚’è¡Œã„ã€å•é¡ŒãŒè¦‹ã¤ã‹ã£ãŸå ´åˆã«ã¯ä¿®æ£ã‚’è¡Œã£ã¦ãã ã•ã„。 | ||
68 | |||
69 | 12: CONFIG_PREEMPT, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_SLAB, | ||
70 | CONFIG_DEBUG_PAGEALLOC, CONFIG_DEBUG_MUTEXES, CONFIG_DEBUG_SPINLOCK, | ||
71 | CONFIG_DEBUG_SPINLOCK_SLEEP ã“れら全ã¦ã‚’åŒæ™‚ã«æœ‰åŠ¹ã«ã—ã¦å‹•ä½œç¢ºèªã‚’ | ||
72 | è¡Œã£ã¦ãã ã•ã„。 | ||
73 | |||
74 | 13: CONFIG_SMP, CONFIG_PREEMPT を有効ã«ã—ãŸå ´åˆã¨ç„¡åŠ¹ã«ã—ãŸå ´åˆã®ä¸¡æ–¹ã§ | ||
75 | ビルドã—ãŸä¸Šã€å‹•ä½œç¢ºèªã‚’è¡Œã£ã¦ãã ã•ã„。 | ||
76 | |||
77 | 14: ã‚‚ã—パッãƒãŒãƒ‡ã‚£ã‚¹ã‚¯ã®I/O性能ãªã©ã«å½±éŸ¿ã‚’与ãˆã‚‹ã‚ˆã†ã§ã‚ã‚Œã°ã€ | ||
78 | 'CONFIG_LBD'オプションを有効ã«ã—ãŸå ´åˆã¨ç„¡åŠ¹ã«ã—ãŸå ´åˆã®ä¸¡æ–¹ã§ | ||
79 | テストを実施ã—ã¦ã¿ã¦ãã ã•ã„。 | ||
80 | |||
81 | 15: lockdepã®æ©Ÿèƒ½ã‚’å…¨ã¦æœ‰åŠ¹ã«ã—ãŸä¸Šã§ã€å…¨ã¦ã®ã‚³ãƒ¼ãƒ‰ãƒ‘スを評価ã—ã¦ãã ã•ã„。 | ||
82 | |||
83 | 16: /proc ã«æ–°ã—ã„ã‚¨ãƒ³ãƒˆãƒªã‚’è¿½åŠ ã—ãŸå ´åˆã«ã¯ã€Documentation/ é…下㫠| ||
84 | å¿…ãšãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 | ||
85 | |||
86 | 17: æ–°ã—ã„ãƒ–ãƒ¼ãƒˆãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã‚’è¿½åŠ ã—ãŸå ´åˆã«ã¯ã€ | ||
87 | å¿…ãšDocumentation/kernel-parameters.txt ã«èª¬æ˜Žã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 | ||
88 | |||
89 | 18: æ–°ã—ãmoduleã«ãƒ‘ãƒ©ãƒ¡ãƒ¼ã‚¿ã‚’è¿½åŠ ã—ãŸå ´åˆã«ã¯ã€MODULE_PARM_DESC()ã‚’ | ||
90 | 利用ã—ã¦å¿…ãšãã®èª¬æ˜Žã‚’記述ã—ã¦ãã ã•ã„。 | ||
91 | |||
92 | 19: æ–°ã—ã„userspaceインタフェースを作æˆã—ãŸå ´åˆã«ã¯ã€Documentation/ABI/ ã« | ||
93 | Documentation/ABI/README ã‚’å‚考ã«ã—ã¦å¿…ãšãƒ‰ã‚ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’è¿½åŠ ã—ã¦ãã ã•ã„。 | ||
94 | |||
95 | 20: 'make headers_check'を実行ã—ã¦å…¨ãå•é¡ŒãŒãªã„ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。 | ||
96 | |||
97 | 21: å°‘ãªãã¨ã‚‚slabã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¨pageã‚¢ãƒã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«å¤±æ•—ã—ãŸå ´åˆã® | ||
98 | 挙動ã«ã¤ã„ã¦ã€fault-injectionを利用ã—ã¦ç¢ºèªã—ã¦ãã ã•ã„。 | ||
99 | Documentation/fault-injection/ ã‚’å‚ç…§ã—ã¦ãã ã•ã„。 | ||
100 | |||
101 | è¿½åŠ ã—ãŸã‚³ãƒ¼ãƒ‰ãŒã‹ãªã‚Šã®é‡ã§ã‚ã£ãŸãªã‚‰ã°ã€ã‚µãƒ–システム特有㮠| ||
102 | fault-injectionã‚’è¿½åŠ ã—ãŸã»ã†ãŒè‰¯ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 | ||
103 | |||
104 | 22: æ–°ãŸã«è¿½åŠ ã—ãŸã‚³ãƒ¼ãƒ‰ã¯ã€`gcc -W'ã§ã‚³ãƒ³ãƒ‘イルã—ã¦ãã ã•ã„。 | ||
105 | ã“ã®ã‚ªãƒ—ションã¯å¤§é‡ã®ä¸è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’出力ã—ã¾ã™ãŒã€ | ||
106 | "warning: comparison between signed and unsigned" ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ | ||
107 | ãƒã‚°ã‚’見ã¤ã‘ã‚‹ã®ã«å½¹ã«ç«‹ã¡ã¾ã™ã€‚ | ||
108 | |||
109 | 23: 投稿ã—ãŸãƒ‘ッãƒãŒ -mm パッãƒã‚»ãƒƒãƒˆã«ãƒžãƒ¼ã‚¸ã•ã‚ŒãŸå¾Œã€å…¨ã¦ã®æ—¢å˜ã®ãƒ‘ッãƒã‚„ | ||
110 | VM, VFS ãŠã‚ˆã³ãã®ä»–ã®ã‚µãƒ–システムã«é–¢ã™ã‚‹æ§˜ã€…ãªå¤‰æ›´ã¨ã€ç¾æ™‚点ã§ã‚‚å…±å˜ | ||
111 | ã§ãã‚‹ã“ã¨ã‚’確èªã™ã‚‹ãƒ†ã‚¹ãƒˆã‚’è¡Œã£ã¦ãã ã•ã„。 | ||
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index e7bea3e85304..1150444a21ab 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -365,6 +365,8 @@ and is between 256 and 4096 characters. It is defined in the file | |||
365 | no delay (0). | 365 | no delay (0). |
366 | Format: integer | 366 | Format: integer |
367 | 367 | ||
368 | bootmem_debug [KNL] Enable bootmem allocator debug messages. | ||
369 | |||
368 | bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards) | 370 | bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards) |
369 | bttv.radio= Most important insmod options are available as | 371 | bttv.radio= Most important insmod options are available as |
370 | kernel args too. | 372 | kernel args too. |
@@ -1072,6 +1074,9 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1072 | 1074 | ||
1073 | * [no]ncq: Turn on or off NCQ. | 1075 | * [no]ncq: Turn on or off NCQ. |
1074 | 1076 | ||
1077 | * nohrst, nosrst, norst: suppress hard, soft | ||
1078 | and both resets. | ||
1079 | |||
1075 | If there are multiple matching configurations changing | 1080 | If there are multiple matching configurations changing |
1076 | the same attribute, the last one is used. | 1081 | the same attribute, the last one is used. |
1077 | 1082 | ||
diff --git a/Documentation/rfkill.txt b/Documentation/rfkill.txt index 28b6ec87c642..6fcb3060dec5 100644 --- a/Documentation/rfkill.txt +++ b/Documentation/rfkill.txt | |||
@@ -363,6 +363,11 @@ This rule exists because users of the rfkill subsystem expect to get (and set, | |||
363 | when possible) the overall transmitter rfkill state, not of a particular rfkill | 363 | when possible) the overall transmitter rfkill state, not of a particular rfkill |
364 | line. | 364 | line. |
365 | 365 | ||
366 | 5. During suspend, the rfkill class will attempt to soft-block the radio | ||
367 | through a call to rfkill->toggle_radio, and will try to restore its previous | ||
368 | state during resume. After a rfkill class is suspended, it will *not* call | ||
369 | rfkill->toggle_radio until it is resumed. | ||
370 | |||
366 | Example of a WLAN wireless driver connected to the rfkill subsystem: | 371 | Example of a WLAN wireless driver connected to the rfkill subsystem: |
367 | -------------------------------------------------------------------- | 372 | -------------------------------------------------------------------- |
368 | 373 | ||
diff --git a/Documentation/scsi/ChangeLog.megaraid_sas b/Documentation/scsi/ChangeLog.megaraid_sas index 716fcc1cafb5..c851ef497795 100644 --- a/Documentation/scsi/ChangeLog.megaraid_sas +++ b/Documentation/scsi/ChangeLog.megaraid_sas | |||
@@ -1,3 +1,26 @@ | |||
1 | |||
2 | 1 Release Date : Thur.July. 24 11:41:51 PST 2008 - | ||
3 | (emaild-id:megaraidlinux@lsi.com) | ||
4 | Sumant Patro | ||
5 | Bo Yang | ||
6 | |||
7 | 2 Current Version : 00.00.04.01 | ||
8 | 3 Older Version : 00.00.03.22 | ||
9 | |||
10 | 1. Add the new controller (0078, 0079) support to the driver | ||
11 | Those controllers are LSI's next generatation(gen2) SAS controllers. | ||
12 | |||
13 | 1 Release Date : Mon.June. 23 10:12:45 PST 2008 - | ||
14 | (emaild-id:megaraidlinux@lsi.com) | ||
15 | Sumant Patro | ||
16 | Bo Yang | ||
17 | |||
18 | 2 Current Version : 00.00.03.22 | ||
19 | 3 Older Version : 00.00.03.20 | ||
20 | |||
21 | 1. Add shutdown DCMD cmd to the shutdown routine to make FW shutdown proper. | ||
22 | 2. Unexpected interrupt occurs in HWR Linux driver, add the dumy readl pci flush will fix this issue. | ||
23 | |||
1 | 1 Release Date : Mon. March 10 11:02:31 PDT 2008 - | 24 | 1 Release Date : Mon. March 10 11:02:31 PDT 2008 - |
2 | (emaild-id:megaraidlinux@lsi.com) | 25 | (emaild-id:megaraidlinux@lsi.com) |
3 | Sumant Patro | 26 | Sumant Patro |
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt index 6f6d117ac7e2..b117e42a6166 100644 --- a/Documentation/sound/alsa/ALSA-Configuration.txt +++ b/Documentation/sound/alsa/ALSA-Configuration.txt | |||
@@ -1144,8 +1144,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
1144 | 1144 | ||
1145 | This module supports autoprobe and multiple cards. | 1145 | This module supports autoprobe and multiple cards. |
1146 | 1146 | ||
1147 | Power management is _not_ supported. | ||
1148 | |||
1149 | Module snd-ice1712 | 1147 | Module snd-ice1712 |
1150 | ------------------ | 1148 | ------------------ |
1151 | 1149 | ||
@@ -1628,8 +1626,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
1628 | 1626 | ||
1629 | This module supports autoprobe and multiple cards. | 1627 | This module supports autoprobe and multiple cards. |
1630 | 1628 | ||
1631 | Power management is _not_ supported. | ||
1632 | |||
1633 | Module snd-pcsp | 1629 | Module snd-pcsp |
1634 | ----------------- | 1630 | ----------------- |
1635 | 1631 | ||
@@ -2081,13 +2077,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. | |||
2081 | Module snd-virtuoso | 2077 | Module snd-virtuoso |
2082 | ------------------- | 2078 | ------------------- |
2083 | 2079 | ||
2084 | Module for sound cards based on the Asus AV200 chip, i.e., | 2080 | Module for sound cards based on the Asus AV100/AV200 chips, |
2085 | Xonar D2 and Xonar D2X. | 2081 | i.e., Xonar D1, DX, D2 and D2X. |
2086 | 2082 | ||
2087 | This module supports autoprobe and multiple cards. | 2083 | This module supports autoprobe and multiple cards. |
2088 | 2084 | ||
2089 | Power management is _not_ supported. | ||
2090 | |||
2091 | Module snd-vx222 | 2085 | Module snd-vx222 |
2092 | ---------------- | 2086 | ---------------- |
2093 | 2087 | ||
diff --git a/Documentation/vm/page_migration b/Documentation/vm/page_migration index 99f89aa10169..d5fdfd34bbaf 100644 --- a/Documentation/vm/page_migration +++ b/Documentation/vm/page_migration | |||
@@ -18,10 +18,11 @@ migrate_pages function call takes two sets of nodes and moves pages of a | |||
18 | process that are located on the from nodes to the destination nodes. | 18 | process that are located on the from nodes to the destination nodes. |
19 | Page migration functions are provided by the numactl package by Andi Kleen | 19 | Page migration functions are provided by the numactl package by Andi Kleen |
20 | (a version later than 0.9.3 is required. Get it from | 20 | (a version later than 0.9.3 is required. Get it from |
21 | ftp://ftp.suse.com/pub/people/ak). numactl provided libnuma which | 21 | ftp://oss.sgi.com/www/projects/libnuma/download/). numactl provides libnuma |
22 | provides an interface similar to other numa functionality for page migration. | 22 | which provides an interface similar to other numa functionality for page |
23 | cat /proc/<pid>/numa_maps allows an easy review of where the pages of | 23 | migration. cat /proc/<pid>/numa_maps allows an easy review of where the |
24 | a process are located. See also the numa_maps manpage in the numactl package. | 24 | pages of a process are located. See also the numa_maps documentation in the |
25 | proc(5) man page. | ||
25 | 26 | ||
26 | Manual migration is useful if for example the scheduler has relocated | 27 | Manual migration is useful if for example the scheduler has relocated |
27 | a process to a processor on a distant node. A batch scheduler or an | 28 | a process to a processor on a distant node. A batch scheduler or an |
diff --git a/MAINTAINERS b/MAINTAINERS index 4c5e9fe0f7db..28c69aaefcd9 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -175,12 +175,18 @@ M: bcrl@kvack.org | |||
175 | L: linux-aio@kvack.org | 175 | L: linux-aio@kvack.org |
176 | S: Supported | 176 | S: Supported |
177 | 177 | ||
178 | ABIT UGURU HARDWARE MONITOR DRIVER | 178 | ABIT UGURU 1,2 HARDWARE MONITOR DRIVER |
179 | P: Hans de Goede | 179 | P: Hans de Goede |
180 | M: j.w.r.degoede@hhs.nl | 180 | M: j.w.r.degoede@hhs.nl |
181 | L: lm-sensors@lm-sensors.org | 181 | L: lm-sensors@lm-sensors.org |
182 | S: Maintained | 182 | S: Maintained |
183 | 183 | ||
184 | ABIT UGURU 3 HARDWARE MONITOR DRIVER | ||
185 | P: Alistair John Strachan | ||
186 | M: alistair@devzero.co.uk | ||
187 | L: lm-sensors@lm-sensors.org | ||
188 | S: Maintained | ||
189 | |||
184 | ACENIC DRIVER | 190 | ACENIC DRIVER |
185 | P: Jes Sorensen | 191 | P: Jes Sorensen |
186 | M: jes@trained-monkey.org | 192 | M: jes@trained-monkey.org |
@@ -936,94 +942,19 @@ M: joern@lazybastard.org | |||
936 | L: linux-mtd@lists.infradead.org | 942 | L: linux-mtd@lists.infradead.org |
937 | S: Maintained | 943 | S: Maintained |
938 | 944 | ||
939 | BLUETOOTH SUBSYSTEM | 945 | BLUETOOTH DRIVERS |
940 | P: Marcel Holtmann | 946 | P: Marcel Holtmann |
941 | M: marcel@holtmann.org | 947 | M: marcel@holtmann.org |
942 | P: Maxim Krasnyansky | ||
943 | M: maxk@qualcomm.com | ||
944 | L: linux-bluetooth@vger.kernel.org | 948 | L: linux-bluetooth@vger.kernel.org |
945 | W: http://bluez.sf.net | 949 | W: http://www.bluez.org/ |
946 | W: http://www.bluez.org | ||
947 | W: http://www.holtmann.org/linux/bluetooth/ | ||
948 | T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git | ||
949 | S: Maintained | ||
950 | |||
951 | BLUETOOTH RFCOMM LAYER | ||
952 | P: Marcel Holtmann | ||
953 | M: marcel@holtmann.org | ||
954 | P: Maxim Krasnyansky | ||
955 | M: maxk@qualcomm.com | ||
956 | S: Maintained | ||
957 | |||
958 | BLUETOOTH BNEP LAYER | ||
959 | P: Marcel Holtmann | ||
960 | M: marcel@holtmann.org | ||
961 | P: Maxim Krasnyansky | ||
962 | M: maxk@qualcomm.com | ||
963 | S: Maintained | ||
964 | |||
965 | BLUETOOTH CMTP LAYER | ||
966 | P: Marcel Holtmann | ||
967 | M: marcel@holtmann.org | ||
968 | S: Maintained | ||
969 | |||
970 | BLUETOOTH HIDP LAYER | ||
971 | P: Marcel Holtmann | ||
972 | M: marcel@holtmann.org | ||
973 | S: Maintained | ||
974 | |||
975 | BLUETOOTH HCI UART DRIVER | ||
976 | P: Marcel Holtmann | ||
977 | M: marcel@holtmann.org | ||
978 | P: Maxim Krasnyansky | ||
979 | M: maxk@qualcomm.com | ||
980 | S: Maintained | ||
981 | |||
982 | BLUETOOTH HCI USB DRIVER | ||
983 | P: Marcel Holtmann | ||
984 | M: marcel@holtmann.org | ||
985 | P: Maxim Krasnyansky | ||
986 | M: maxk@qualcomm.com | ||
987 | S: Maintained | ||
988 | |||
989 | BLUETOOTH HCI BCM203X DRIVER | ||
990 | P: Marcel Holtmann | ||
991 | M: marcel@holtmann.org | ||
992 | S: Maintained | ||
993 | |||
994 | BLUETOOTH HCI BPA10X DRIVER | ||
995 | P: Marcel Holtmann | ||
996 | M: marcel@holtmann.org | ||
997 | S: Maintained | 950 | S: Maintained |
998 | 951 | ||
999 | BLUETOOTH HCI BFUSB DRIVER | 952 | BLUETOOTH SUBSYSTEM |
1000 | P: Marcel Holtmann | ||
1001 | M: marcel@holtmann.org | ||
1002 | S: Maintained | ||
1003 | |||
1004 | BLUETOOTH HCI DTL1 DRIVER | ||
1005 | P: Marcel Holtmann | ||
1006 | M: marcel@holtmann.org | ||
1007 | S: Maintained | ||
1008 | |||
1009 | BLUETOOTH HCI BLUECARD DRIVER | ||
1010 | P: Marcel Holtmann | ||
1011 | M: marcel@holtmann.org | ||
1012 | S: Maintained | ||
1013 | |||
1014 | BLUETOOTH HCI BT3C DRIVER | ||
1015 | P: Marcel Holtmann | ||
1016 | M: marcel@holtmann.org | ||
1017 | S: Maintained | ||
1018 | |||
1019 | BLUETOOTH HCI BTUART DRIVER | ||
1020 | P: Marcel Holtmann | 953 | P: Marcel Holtmann |
1021 | M: marcel@holtmann.org | 954 | M: marcel@holtmann.org |
1022 | S: Maintained | 955 | L: linux-bluetooth@vger.kernel.org |
1023 | 956 | W: http://www.bluez.org/ | |
1024 | BLUETOOTH HCI VHCI DRIVER | 957 | T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git |
1025 | P: Maxim Krasnyansky | ||
1026 | M: maxk@qualcomm.com | ||
1027 | S: Maintained | 958 | S: Maintained |
1028 | 959 | ||
1029 | BONDING DRIVER | 960 | BONDING DRIVER |
@@ -3748,6 +3679,16 @@ L: linux-visws-devel@lists.sf.net | |||
3748 | W: http://linux-visws.sf.net | 3679 | W: http://linux-visws.sf.net |
3749 | S: Maintained for 2.6. | 3680 | S: Maintained for 2.6. |
3750 | 3681 | ||
3682 | SGI GRU DRIVER | ||
3683 | P: Jack Steiner | ||
3684 | M: steiner@sgi.com | ||
3685 | S: Maintained | ||
3686 | |||
3687 | SGI XP/XPC/XPNET DRIVER | ||
3688 | P: Dean Nelson | ||
3689 | M: dcn@sgi.com | ||
3690 | S: Maintained | ||
3691 | |||
3751 | SIMTEC EB110ATX (Chalice CATS) | 3692 | SIMTEC EB110ATX (Chalice CATS) |
3752 | P: Ben Dooks | 3693 | P: Ben Dooks |
3753 | P: Vincent Sanders | 3694 | P: Vincent Sanders |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 27 | 3 | SUBLEVEL = 27 |
4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc4 |
5 | NAME = Rotary Wombat | 5 | NAME = Rotary Wombat |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/include/asm-alpha/8253pit.h b/arch/alpha/include/asm/8253pit.h index fef5c1450e47..fef5c1450e47 100644 --- a/include/asm-alpha/8253pit.h +++ b/arch/alpha/include/asm/8253pit.h | |||
diff --git a/include/asm-alpha/Kbuild b/arch/alpha/include/asm/Kbuild index b7c8f188b313..b7c8f188b313 100644 --- a/include/asm-alpha/Kbuild +++ b/arch/alpha/include/asm/Kbuild | |||
diff --git a/include/asm-alpha/a.out-core.h b/arch/alpha/include/asm/a.out-core.h index 9e33e92e524c..9e33e92e524c 100644 --- a/include/asm-alpha/a.out-core.h +++ b/arch/alpha/include/asm/a.out-core.h | |||
diff --git a/include/asm-alpha/a.out.h b/arch/alpha/include/asm/a.out.h index 02ce8473870a..02ce8473870a 100644 --- a/include/asm-alpha/a.out.h +++ b/arch/alpha/include/asm/a.out.h | |||
diff --git a/include/asm-alpha/agp.h b/arch/alpha/include/asm/agp.h index 26c179135293..26c179135293 100644 --- a/include/asm-alpha/agp.h +++ b/arch/alpha/include/asm/agp.h | |||
diff --git a/include/asm-alpha/agp_backend.h b/arch/alpha/include/asm/agp_backend.h index 55dd44a2cea7..55dd44a2cea7 100644 --- a/include/asm-alpha/agp_backend.h +++ b/arch/alpha/include/asm/agp_backend.h | |||
diff --git a/include/asm-alpha/atomic.h b/arch/alpha/include/asm/atomic.h index ca88e54dec93..ca88e54dec93 100644 --- a/include/asm-alpha/atomic.h +++ b/arch/alpha/include/asm/atomic.h | |||
diff --git a/include/asm-alpha/auxvec.h b/arch/alpha/include/asm/auxvec.h index e96fe880e310..e96fe880e310 100644 --- a/include/asm-alpha/auxvec.h +++ b/arch/alpha/include/asm/auxvec.h | |||
diff --git a/include/asm-alpha/barrier.h b/arch/alpha/include/asm/barrier.h index ac78eba909bc..ac78eba909bc 100644 --- a/include/asm-alpha/barrier.h +++ b/arch/alpha/include/asm/barrier.h | |||
diff --git a/include/asm-alpha/bitops.h b/arch/alpha/include/asm/bitops.h index 15f3ae25c511..15f3ae25c511 100644 --- a/include/asm-alpha/bitops.h +++ b/arch/alpha/include/asm/bitops.h | |||
diff --git a/include/asm-alpha/bug.h b/arch/alpha/include/asm/bug.h index 695a5ee4b5d3..695a5ee4b5d3 100644 --- a/include/asm-alpha/bug.h +++ b/arch/alpha/include/asm/bug.h | |||
diff --git a/include/asm-alpha/bugs.h b/arch/alpha/include/asm/bugs.h index 78030d1c7e7e..78030d1c7e7e 100644 --- a/include/asm-alpha/bugs.h +++ b/arch/alpha/include/asm/bugs.h | |||
diff --git a/include/asm-alpha/byteorder.h b/arch/alpha/include/asm/byteorder.h index 58e958fc7f1b..58e958fc7f1b 100644 --- a/include/asm-alpha/byteorder.h +++ b/arch/alpha/include/asm/byteorder.h | |||
diff --git a/include/asm-alpha/cache.h b/arch/alpha/include/asm/cache.h index f199e69a5d0b..f199e69a5d0b 100644 --- a/include/asm-alpha/cache.h +++ b/arch/alpha/include/asm/cache.h | |||
diff --git a/include/asm-alpha/cacheflush.h b/arch/alpha/include/asm/cacheflush.h index b686cc7fc44e..b686cc7fc44e 100644 --- a/include/asm-alpha/cacheflush.h +++ b/arch/alpha/include/asm/cacheflush.h | |||
diff --git a/include/asm-alpha/checksum.h b/arch/alpha/include/asm/checksum.h index d3854bbf0a9e..d3854bbf0a9e 100644 --- a/include/asm-alpha/checksum.h +++ b/arch/alpha/include/asm/checksum.h | |||
diff --git a/include/asm-alpha/compiler.h b/arch/alpha/include/asm/compiler.h index da6bb199839c..da6bb199839c 100644 --- a/include/asm-alpha/compiler.h +++ b/arch/alpha/include/asm/compiler.h | |||
diff --git a/include/asm-alpha/console.h b/arch/alpha/include/asm/console.h index a3ce4e62249b..a3ce4e62249b 100644 --- a/include/asm-alpha/console.h +++ b/arch/alpha/include/asm/console.h | |||
diff --git a/include/asm-alpha/core_apecs.h b/arch/alpha/include/asm/core_apecs.h index 6785ff7e02bc..6785ff7e02bc 100644 --- a/include/asm-alpha/core_apecs.h +++ b/arch/alpha/include/asm/core_apecs.h | |||
diff --git a/include/asm-alpha/core_cia.h b/arch/alpha/include/asm/core_cia.h index 9e0516c0ca27..9e0516c0ca27 100644 --- a/include/asm-alpha/core_cia.h +++ b/arch/alpha/include/asm/core_cia.h | |||
diff --git a/include/asm-alpha/core_irongate.h b/arch/alpha/include/asm/core_irongate.h index 24b2db541501..24b2db541501 100644 --- a/include/asm-alpha/core_irongate.h +++ b/arch/alpha/include/asm/core_irongate.h | |||
diff --git a/include/asm-alpha/core_lca.h b/arch/alpha/include/asm/core_lca.h index f7cb4b460954..f7cb4b460954 100644 --- a/include/asm-alpha/core_lca.h +++ b/arch/alpha/include/asm/core_lca.h | |||
diff --git a/include/asm-alpha/core_marvel.h b/arch/alpha/include/asm/core_marvel.h index 30d55fe7aaf6..30d55fe7aaf6 100644 --- a/include/asm-alpha/core_marvel.h +++ b/arch/alpha/include/asm/core_marvel.h | |||
diff --git a/include/asm-alpha/core_mcpcia.h b/arch/alpha/include/asm/core_mcpcia.h index acf55b483472..acf55b483472 100644 --- a/include/asm-alpha/core_mcpcia.h +++ b/arch/alpha/include/asm/core_mcpcia.h | |||
diff --git a/include/asm-alpha/core_polaris.h b/arch/alpha/include/asm/core_polaris.h index 2f966b64659d..2f966b64659d 100644 --- a/include/asm-alpha/core_polaris.h +++ b/arch/alpha/include/asm/core_polaris.h | |||
diff --git a/include/asm-alpha/core_t2.h b/arch/alpha/include/asm/core_t2.h index 46bfff58f670..46bfff58f670 100644 --- a/include/asm-alpha/core_t2.h +++ b/arch/alpha/include/asm/core_t2.h | |||
diff --git a/include/asm-alpha/core_titan.h b/arch/alpha/include/asm/core_titan.h index a17f6f33b68e..a17f6f33b68e 100644 --- a/include/asm-alpha/core_titan.h +++ b/arch/alpha/include/asm/core_titan.h | |||
diff --git a/include/asm-alpha/core_tsunami.h b/arch/alpha/include/asm/core_tsunami.h index 58d4fe48742c..58d4fe48742c 100644 --- a/include/asm-alpha/core_tsunami.h +++ b/arch/alpha/include/asm/core_tsunami.h | |||
diff --git a/include/asm-alpha/core_wildfire.h b/arch/alpha/include/asm/core_wildfire.h index cd562f544ba2..cd562f544ba2 100644 --- a/include/asm-alpha/core_wildfire.h +++ b/arch/alpha/include/asm/core_wildfire.h | |||
diff --git a/include/asm-alpha/cputime.h b/arch/alpha/include/asm/cputime.h index 19577fd93230..19577fd93230 100644 --- a/include/asm-alpha/cputime.h +++ b/arch/alpha/include/asm/cputime.h | |||
diff --git a/include/asm-alpha/current.h b/arch/alpha/include/asm/current.h index 094d285a1b34..094d285a1b34 100644 --- a/include/asm-alpha/current.h +++ b/arch/alpha/include/asm/current.h | |||
diff --git a/include/asm-alpha/delay.h b/arch/alpha/include/asm/delay.h index 2aa3f410f7e6..2aa3f410f7e6 100644 --- a/include/asm-alpha/delay.h +++ b/arch/alpha/include/asm/delay.h | |||
diff --git a/include/asm-alpha/device.h b/arch/alpha/include/asm/device.h index d8f9872b0e2d..d8f9872b0e2d 100644 --- a/include/asm-alpha/device.h +++ b/arch/alpha/include/asm/device.h | |||
diff --git a/include/asm-alpha/div64.h b/arch/alpha/include/asm/div64.h index 6cd978cefb28..6cd978cefb28 100644 --- a/include/asm-alpha/div64.h +++ b/arch/alpha/include/asm/div64.h | |||
diff --git a/include/asm-alpha/dma-mapping.h b/arch/alpha/include/asm/dma-mapping.h index a5801ae02e4b..a5801ae02e4b 100644 --- a/include/asm-alpha/dma-mapping.h +++ b/arch/alpha/include/asm/dma-mapping.h | |||
diff --git a/include/asm-alpha/dma.h b/arch/alpha/include/asm/dma.h index 87cfdbdf08fc..87cfdbdf08fc 100644 --- a/include/asm-alpha/dma.h +++ b/arch/alpha/include/asm/dma.h | |||
diff --git a/include/asm-alpha/elf.h b/arch/alpha/include/asm/elf.h index fc1002ea1e0c..fc1002ea1e0c 100644 --- a/include/asm-alpha/elf.h +++ b/arch/alpha/include/asm/elf.h | |||
diff --git a/include/asm-alpha/emergency-restart.h b/arch/alpha/include/asm/emergency-restart.h index 108d8c48e42e..108d8c48e42e 100644 --- a/include/asm-alpha/emergency-restart.h +++ b/arch/alpha/include/asm/emergency-restart.h | |||
diff --git a/include/asm-alpha/err_common.h b/arch/alpha/include/asm/err_common.h index c25095942107..c25095942107 100644 --- a/include/asm-alpha/err_common.h +++ b/arch/alpha/include/asm/err_common.h | |||
diff --git a/include/asm-alpha/err_ev6.h b/arch/alpha/include/asm/err_ev6.h index ea637791e4a9..ea637791e4a9 100644 --- a/include/asm-alpha/err_ev6.h +++ b/arch/alpha/include/asm/err_ev6.h | |||
diff --git a/include/asm-alpha/err_ev7.h b/arch/alpha/include/asm/err_ev7.h index 87f99777c2e4..87f99777c2e4 100644 --- a/include/asm-alpha/err_ev7.h +++ b/arch/alpha/include/asm/err_ev7.h | |||
diff --git a/include/asm-alpha/errno.h b/arch/alpha/include/asm/errno.h index 69e2655249d2..69e2655249d2 100644 --- a/include/asm-alpha/errno.h +++ b/arch/alpha/include/asm/errno.h | |||
diff --git a/include/asm-alpha/fb.h b/arch/alpha/include/asm/fb.h index fa9bbb96b2b3..fa9bbb96b2b3 100644 --- a/include/asm-alpha/fb.h +++ b/arch/alpha/include/asm/fb.h | |||
diff --git a/include/asm-alpha/fcntl.h b/arch/alpha/include/asm/fcntl.h index 25da0017ec87..25da0017ec87 100644 --- a/include/asm-alpha/fcntl.h +++ b/arch/alpha/include/asm/fcntl.h | |||
diff --git a/include/asm-alpha/floppy.h b/arch/alpha/include/asm/floppy.h index 0be50413b2b5..0be50413b2b5 100644 --- a/include/asm-alpha/floppy.h +++ b/arch/alpha/include/asm/floppy.h | |||
diff --git a/include/asm-alpha/fpu.h b/arch/alpha/include/asm/fpu.h index ecb17a72acc3..ecb17a72acc3 100644 --- a/include/asm-alpha/fpu.h +++ b/arch/alpha/include/asm/fpu.h | |||
diff --git a/include/asm-alpha/futex.h b/arch/alpha/include/asm/futex.h index 6a332a9f099c..6a332a9f099c 100644 --- a/include/asm-alpha/futex.h +++ b/arch/alpha/include/asm/futex.h | |||
diff --git a/include/asm-alpha/gct.h b/arch/alpha/include/asm/gct.h index 3504c704927c..3504c704927c 100644 --- a/include/asm-alpha/gct.h +++ b/arch/alpha/include/asm/gct.h | |||
diff --git a/include/asm-alpha/gentrap.h b/arch/alpha/include/asm/gentrap.h index ae50cc3192c7..ae50cc3192c7 100644 --- a/include/asm-alpha/gentrap.h +++ b/arch/alpha/include/asm/gentrap.h | |||
diff --git a/include/asm-alpha/hardirq.h b/arch/alpha/include/asm/hardirq.h index d953e234daa8..d953e234daa8 100644 --- a/include/asm-alpha/hardirq.h +++ b/arch/alpha/include/asm/hardirq.h | |||
diff --git a/include/asm-alpha/hw_irq.h b/arch/alpha/include/asm/hw_irq.h index a37db0f95092..a37db0f95092 100644 --- a/include/asm-alpha/hw_irq.h +++ b/arch/alpha/include/asm/hw_irq.h | |||
diff --git a/include/asm-alpha/hwrpb.h b/arch/alpha/include/asm/hwrpb.h index 8e8f871af7cf..8e8f871af7cf 100644 --- a/include/asm-alpha/hwrpb.h +++ b/arch/alpha/include/asm/hwrpb.h | |||
diff --git a/include/asm-alpha/io.h b/arch/alpha/include/asm/io.h index e971ab000f95..e971ab000f95 100644 --- a/include/asm-alpha/io.h +++ b/arch/alpha/include/asm/io.h | |||
diff --git a/include/asm-alpha/io_trivial.h b/arch/alpha/include/asm/io_trivial.h index 1c77f10b4b36..1c77f10b4b36 100644 --- a/include/asm-alpha/io_trivial.h +++ b/arch/alpha/include/asm/io_trivial.h | |||
diff --git a/include/asm-alpha/ioctl.h b/arch/alpha/include/asm/ioctl.h index fc63727f4178..fc63727f4178 100644 --- a/include/asm-alpha/ioctl.h +++ b/arch/alpha/include/asm/ioctl.h | |||
diff --git a/include/asm-alpha/ioctls.h b/arch/alpha/include/asm/ioctls.h index 67bb9f6fdbe4..67bb9f6fdbe4 100644 --- a/include/asm-alpha/ioctls.h +++ b/arch/alpha/include/asm/ioctls.h | |||
diff --git a/include/asm-alpha/ipcbuf.h b/arch/alpha/include/asm/ipcbuf.h index d9c0e1a50702..d9c0e1a50702 100644 --- a/include/asm-alpha/ipcbuf.h +++ b/arch/alpha/include/asm/ipcbuf.h | |||
diff --git a/include/asm-alpha/irq.h b/arch/alpha/include/asm/irq.h index 06377400dc09..06377400dc09 100644 --- a/include/asm-alpha/irq.h +++ b/arch/alpha/include/asm/irq.h | |||
diff --git a/include/asm-alpha/irq_regs.h b/arch/alpha/include/asm/irq_regs.h index 3dd9c0b70270..3dd9c0b70270 100644 --- a/include/asm-alpha/irq_regs.h +++ b/arch/alpha/include/asm/irq_regs.h | |||
diff --git a/include/asm-alpha/jensen.h b/arch/alpha/include/asm/jensen.h index 964b06ead43b..964b06ead43b 100644 --- a/include/asm-alpha/jensen.h +++ b/arch/alpha/include/asm/jensen.h | |||
diff --git a/include/asm-alpha/kdebug.h b/arch/alpha/include/asm/kdebug.h index 6ece1b037665..6ece1b037665 100644 --- a/include/asm-alpha/kdebug.h +++ b/arch/alpha/include/asm/kdebug.h | |||
diff --git a/include/asm-alpha/kmap_types.h b/arch/alpha/include/asm/kmap_types.h index 3e6735a34c57..3e6735a34c57 100644 --- a/include/asm-alpha/kmap_types.h +++ b/arch/alpha/include/asm/kmap_types.h | |||
diff --git a/include/asm-alpha/linkage.h b/arch/alpha/include/asm/linkage.h index 291c2d01c44f..291c2d01c44f 100644 --- a/include/asm-alpha/linkage.h +++ b/arch/alpha/include/asm/linkage.h | |||
diff --git a/include/asm-alpha/local.h b/arch/alpha/include/asm/local.h index 6ad3ea696421..6ad3ea696421 100644 --- a/include/asm-alpha/local.h +++ b/arch/alpha/include/asm/local.h | |||
diff --git a/include/asm-alpha/machvec.h b/arch/alpha/include/asm/machvec.h index a86c083cdf7f..a86c083cdf7f 100644 --- a/include/asm-alpha/machvec.h +++ b/arch/alpha/include/asm/machvec.h | |||
diff --git a/include/asm-alpha/mc146818rtc.h b/arch/alpha/include/asm/mc146818rtc.h index 097703f1c8cb..097703f1c8cb 100644 --- a/include/asm-alpha/mc146818rtc.h +++ b/arch/alpha/include/asm/mc146818rtc.h | |||
diff --git a/include/asm-alpha/md.h b/arch/alpha/include/asm/md.h index 6c9b8222a4f2..6c9b8222a4f2 100644 --- a/include/asm-alpha/md.h +++ b/arch/alpha/include/asm/md.h | |||
diff --git a/include/asm-alpha/mman.h b/arch/alpha/include/asm/mman.h index 90d7c35d2867..90d7c35d2867 100644 --- a/include/asm-alpha/mman.h +++ b/arch/alpha/include/asm/mman.h | |||
diff --git a/include/asm-alpha/mmu.h b/arch/alpha/include/asm/mmu.h index 3dc127779329..3dc127779329 100644 --- a/include/asm-alpha/mmu.h +++ b/arch/alpha/include/asm/mmu.h | |||
diff --git a/include/asm-alpha/mmu_context.h b/arch/alpha/include/asm/mmu_context.h index 86c08a02d239..86c08a02d239 100644 --- a/include/asm-alpha/mmu_context.h +++ b/arch/alpha/include/asm/mmu_context.h | |||
diff --git a/include/asm-alpha/mmzone.h b/arch/alpha/include/asm/mmzone.h index 8af56ce346ad..8af56ce346ad 100644 --- a/include/asm-alpha/mmzone.h +++ b/arch/alpha/include/asm/mmzone.h | |||
diff --git a/include/asm-alpha/module.h b/arch/alpha/include/asm/module.h index 7b63743c534a..7b63743c534a 100644 --- a/include/asm-alpha/module.h +++ b/arch/alpha/include/asm/module.h | |||
diff --git a/include/asm-alpha/msgbuf.h b/arch/alpha/include/asm/msgbuf.h index 98496501a2bb..98496501a2bb 100644 --- a/include/asm-alpha/msgbuf.h +++ b/arch/alpha/include/asm/msgbuf.h | |||
diff --git a/include/asm-alpha/mutex.h b/arch/alpha/include/asm/mutex.h index 458c1f7fbc18..458c1f7fbc18 100644 --- a/include/asm-alpha/mutex.h +++ b/arch/alpha/include/asm/mutex.h | |||
diff --git a/include/asm-alpha/page.h b/arch/alpha/include/asm/page.h index 0995f9d13417..0995f9d13417 100644 --- a/include/asm-alpha/page.h +++ b/arch/alpha/include/asm/page.h | |||
diff --git a/include/asm-alpha/pal.h b/arch/alpha/include/asm/pal.h index 9b4ba0d6f00b..9b4ba0d6f00b 100644 --- a/include/asm-alpha/pal.h +++ b/arch/alpha/include/asm/pal.h | |||
diff --git a/include/asm-alpha/param.h b/arch/alpha/include/asm/param.h index e691ecfedb2c..e691ecfedb2c 100644 --- a/include/asm-alpha/param.h +++ b/arch/alpha/include/asm/param.h | |||
diff --git a/include/asm-alpha/parport.h b/arch/alpha/include/asm/parport.h index c5ee7cbb2fcd..c5ee7cbb2fcd 100644 --- a/include/asm-alpha/parport.h +++ b/arch/alpha/include/asm/parport.h | |||
diff --git a/include/asm-alpha/pci.h b/arch/alpha/include/asm/pci.h index 2a14302c17a3..2a14302c17a3 100644 --- a/include/asm-alpha/pci.h +++ b/arch/alpha/include/asm/pci.h | |||
diff --git a/include/asm-alpha/percpu.h b/arch/alpha/include/asm/percpu.h index 3495e8e00d70..3495e8e00d70 100644 --- a/include/asm-alpha/percpu.h +++ b/arch/alpha/include/asm/percpu.h | |||
diff --git a/include/asm-alpha/pgalloc.h b/arch/alpha/include/asm/pgalloc.h index fd090155dccd..fd090155dccd 100644 --- a/include/asm-alpha/pgalloc.h +++ b/arch/alpha/include/asm/pgalloc.h | |||
diff --git a/include/asm-alpha/pgtable.h b/arch/alpha/include/asm/pgtable.h index 3f0c59f6d8aa..3f0c59f6d8aa 100644 --- a/include/asm-alpha/pgtable.h +++ b/arch/alpha/include/asm/pgtable.h | |||
diff --git a/include/asm-alpha/poll.h b/arch/alpha/include/asm/poll.h index c98509d3149e..c98509d3149e 100644 --- a/include/asm-alpha/poll.h +++ b/arch/alpha/include/asm/poll.h | |||
diff --git a/include/asm-alpha/posix_types.h b/arch/alpha/include/asm/posix_types.h index db167413300b..db167413300b 100644 --- a/include/asm-alpha/posix_types.h +++ b/arch/alpha/include/asm/posix_types.h | |||
diff --git a/include/asm-alpha/processor.h b/arch/alpha/include/asm/processor.h index 94afe5859301..94afe5859301 100644 --- a/include/asm-alpha/processor.h +++ b/arch/alpha/include/asm/processor.h | |||
diff --git a/include/asm-alpha/ptrace.h b/arch/alpha/include/asm/ptrace.h index 32c7a5cddd59..32c7a5cddd59 100644 --- a/include/asm-alpha/ptrace.h +++ b/arch/alpha/include/asm/ptrace.h | |||
diff --git a/include/asm-alpha/reg.h b/arch/alpha/include/asm/reg.h index 86ff916fb069..86ff916fb069 100644 --- a/include/asm-alpha/reg.h +++ b/arch/alpha/include/asm/reg.h | |||
diff --git a/include/asm-alpha/regdef.h b/arch/alpha/include/asm/regdef.h index 142df9c4f8b8..142df9c4f8b8 100644 --- a/include/asm-alpha/regdef.h +++ b/arch/alpha/include/asm/regdef.h | |||
diff --git a/include/asm-alpha/resource.h b/arch/alpha/include/asm/resource.h index c10874ff5973..c10874ff5973 100644 --- a/include/asm-alpha/resource.h +++ b/arch/alpha/include/asm/resource.h | |||
diff --git a/include/asm-alpha/rtc.h b/arch/alpha/include/asm/rtc.h index 4e854b1333eb..4e854b1333eb 100644 --- a/include/asm-alpha/rtc.h +++ b/arch/alpha/include/asm/rtc.h | |||
diff --git a/include/asm-alpha/rwsem.h b/arch/alpha/include/asm/rwsem.h index 1570c0b54336..1570c0b54336 100644 --- a/include/asm-alpha/rwsem.h +++ b/arch/alpha/include/asm/rwsem.h | |||
diff --git a/include/asm-alpha/scatterlist.h b/arch/alpha/include/asm/scatterlist.h index 440747ca6349..440747ca6349 100644 --- a/include/asm-alpha/scatterlist.h +++ b/arch/alpha/include/asm/scatterlist.h | |||
diff --git a/include/asm-alpha/sections.h b/arch/alpha/include/asm/sections.h index 43b40edd6e44..43b40edd6e44 100644 --- a/include/asm-alpha/sections.h +++ b/arch/alpha/include/asm/sections.h | |||
diff --git a/include/asm-alpha/segment.h b/arch/alpha/include/asm/segment.h index 0453d97daae7..0453d97daae7 100644 --- a/include/asm-alpha/segment.h +++ b/arch/alpha/include/asm/segment.h | |||
diff --git a/include/asm-alpha/sembuf.h b/arch/alpha/include/asm/sembuf.h index 7b38b1534784..7b38b1534784 100644 --- a/include/asm-alpha/sembuf.h +++ b/arch/alpha/include/asm/sembuf.h | |||
diff --git a/include/asm-alpha/serial.h b/arch/alpha/include/asm/serial.h index 9d263e8d8ccc..9d263e8d8ccc 100644 --- a/include/asm-alpha/serial.h +++ b/arch/alpha/include/asm/serial.h | |||
diff --git a/include/asm-alpha/setup.h b/arch/alpha/include/asm/setup.h index 2e023a4aa317..2e023a4aa317 100644 --- a/include/asm-alpha/setup.h +++ b/arch/alpha/include/asm/setup.h | |||
diff --git a/include/asm-alpha/sfp-machine.h b/arch/alpha/include/asm/sfp-machine.h index 5fe63afbd474..5fe63afbd474 100644 --- a/include/asm-alpha/sfp-machine.h +++ b/arch/alpha/include/asm/sfp-machine.h | |||
diff --git a/include/asm-alpha/shmbuf.h b/arch/alpha/include/asm/shmbuf.h index 37ee84f05085..37ee84f05085 100644 --- a/include/asm-alpha/shmbuf.h +++ b/arch/alpha/include/asm/shmbuf.h | |||
diff --git a/include/asm-alpha/shmparam.h b/arch/alpha/include/asm/shmparam.h index cc901d58aebb..cc901d58aebb 100644 --- a/include/asm-alpha/shmparam.h +++ b/arch/alpha/include/asm/shmparam.h | |||
diff --git a/include/asm-alpha/sigcontext.h b/arch/alpha/include/asm/sigcontext.h index 323cdb026198..323cdb026198 100644 --- a/include/asm-alpha/sigcontext.h +++ b/arch/alpha/include/asm/sigcontext.h | |||
diff --git a/include/asm-alpha/siginfo.h b/arch/alpha/include/asm/siginfo.h index 9822362a8424..9822362a8424 100644 --- a/include/asm-alpha/siginfo.h +++ b/arch/alpha/include/asm/siginfo.h | |||
diff --git a/include/asm-alpha/signal.h b/arch/alpha/include/asm/signal.h index 13c2305d35ef..13c2305d35ef 100644 --- a/include/asm-alpha/signal.h +++ b/arch/alpha/include/asm/signal.h | |||
diff --git a/include/asm-alpha/smp.h b/arch/alpha/include/asm/smp.h index 544c69af8168..544c69af8168 100644 --- a/include/asm-alpha/smp.h +++ b/arch/alpha/include/asm/smp.h | |||
diff --git a/include/asm-alpha/socket.h b/arch/alpha/include/asm/socket.h index a1057c2d95e7..a1057c2d95e7 100644 --- a/include/asm-alpha/socket.h +++ b/arch/alpha/include/asm/socket.h | |||
diff --git a/include/asm-alpha/sockios.h b/arch/alpha/include/asm/sockios.h index 7932c7ab4a4d..7932c7ab4a4d 100644 --- a/include/asm-alpha/sockios.h +++ b/arch/alpha/include/asm/sockios.h | |||
diff --git a/include/asm-alpha/spinlock.h b/arch/alpha/include/asm/spinlock.h index aeeb125f6851..aeeb125f6851 100644 --- a/include/asm-alpha/spinlock.h +++ b/arch/alpha/include/asm/spinlock.h | |||
diff --git a/include/asm-alpha/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h index 8141eb5ebf0d..8141eb5ebf0d 100644 --- a/include/asm-alpha/spinlock_types.h +++ b/arch/alpha/include/asm/spinlock_types.h | |||
diff --git a/include/asm-alpha/stat.h b/arch/alpha/include/asm/stat.h index 07ad3e6b3f3e..07ad3e6b3f3e 100644 --- a/include/asm-alpha/stat.h +++ b/arch/alpha/include/asm/stat.h | |||
diff --git a/include/asm-alpha/statfs.h b/arch/alpha/include/asm/statfs.h index ad15830baefe..ad15830baefe 100644 --- a/include/asm-alpha/statfs.h +++ b/arch/alpha/include/asm/statfs.h | |||
diff --git a/include/asm-alpha/string.h b/arch/alpha/include/asm/string.h index b02b8a282940..b02b8a282940 100644 --- a/include/asm-alpha/string.h +++ b/arch/alpha/include/asm/string.h | |||
diff --git a/include/asm-alpha/suspend.h b/arch/alpha/include/asm/suspend.h index c7042d575851..c7042d575851 100644 --- a/include/asm-alpha/suspend.h +++ b/arch/alpha/include/asm/suspend.h | |||
diff --git a/include/asm-alpha/sysinfo.h b/arch/alpha/include/asm/sysinfo.h index 086aba284df2..086aba284df2 100644 --- a/include/asm-alpha/sysinfo.h +++ b/arch/alpha/include/asm/sysinfo.h | |||
diff --git a/include/asm-alpha/system.h b/arch/alpha/include/asm/system.h index afe20fa58c99..afe20fa58c99 100644 --- a/include/asm-alpha/system.h +++ b/arch/alpha/include/asm/system.h | |||
diff --git a/include/asm-alpha/termbits.h b/arch/alpha/include/asm/termbits.h index ad854a4a3af6..ad854a4a3af6 100644 --- a/include/asm-alpha/termbits.h +++ b/arch/alpha/include/asm/termbits.h | |||
diff --git a/include/asm-alpha/termios.h b/arch/alpha/include/asm/termios.h index fa13716a11c3..fa13716a11c3 100644 --- a/include/asm-alpha/termios.h +++ b/arch/alpha/include/asm/termios.h | |||
diff --git a/include/asm-alpha/thread_info.h b/arch/alpha/include/asm/thread_info.h index 15fda4344424..15fda4344424 100644 --- a/include/asm-alpha/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
diff --git a/include/asm-alpha/timex.h b/arch/alpha/include/asm/timex.h index afa0c45e3e98..afa0c45e3e98 100644 --- a/include/asm-alpha/timex.h +++ b/arch/alpha/include/asm/timex.h | |||
diff --git a/include/asm-alpha/tlb.h b/arch/alpha/include/asm/tlb.h index c13636575fba..c13636575fba 100644 --- a/include/asm-alpha/tlb.h +++ b/arch/alpha/include/asm/tlb.h | |||
diff --git a/include/asm-alpha/tlbflush.h b/arch/alpha/include/asm/tlbflush.h index 9d87aaa08c0d..9d87aaa08c0d 100644 --- a/include/asm-alpha/tlbflush.h +++ b/arch/alpha/include/asm/tlbflush.h | |||
diff --git a/include/asm-alpha/topology.h b/arch/alpha/include/asm/topology.h index 149532e162c4..149532e162c4 100644 --- a/include/asm-alpha/topology.h +++ b/arch/alpha/include/asm/topology.h | |||
diff --git a/include/asm-alpha/types.h b/arch/alpha/include/asm/types.h index c1541353ccef..c1541353ccef 100644 --- a/include/asm-alpha/types.h +++ b/arch/alpha/include/asm/types.h | |||
diff --git a/include/asm-alpha/uaccess.h b/arch/alpha/include/asm/uaccess.h index 22de3b434a22..22de3b434a22 100644 --- a/include/asm-alpha/uaccess.h +++ b/arch/alpha/include/asm/uaccess.h | |||
diff --git a/include/asm-alpha/ucontext.h b/arch/alpha/include/asm/ucontext.h index 47578ab42152..47578ab42152 100644 --- a/include/asm-alpha/ucontext.h +++ b/arch/alpha/include/asm/ucontext.h | |||
diff --git a/include/asm-alpha/unaligned.h b/arch/alpha/include/asm/unaligned.h index 3787c60aed3f..3787c60aed3f 100644 --- a/include/asm-alpha/unaligned.h +++ b/arch/alpha/include/asm/unaligned.h | |||
diff --git a/include/asm-alpha/unistd.h b/arch/alpha/include/asm/unistd.h index 5b5c17485942..5b5c17485942 100644 --- a/include/asm-alpha/unistd.h +++ b/arch/alpha/include/asm/unistd.h | |||
diff --git a/include/asm-alpha/user.h b/arch/alpha/include/asm/user.h index a4eb6a4ca8d1..a4eb6a4ca8d1 100644 --- a/include/asm-alpha/user.h +++ b/arch/alpha/include/asm/user.h | |||
diff --git a/include/asm-alpha/vga.h b/arch/alpha/include/asm/vga.h index c00106bac521..c00106bac521 100644 --- a/include/asm-alpha/vga.h +++ b/arch/alpha/include/asm/vga.h | |||
diff --git a/include/asm-alpha/xor.h b/arch/alpha/include/asm/xor.h index 5ee1c2bc0499..5ee1c2bc0499 100644 --- a/include/asm-alpha/xor.h +++ b/arch/alpha/include/asm/xor.h | |||
diff --git a/arch/arm/boot/compressed/.gitignore b/arch/arm/boot/compressed/.gitignore index b15f927a5926..ab204db594d3 100644 --- a/arch/arm/boot/compressed/.gitignore +++ b/arch/arm/boot/compressed/.gitignore | |||
@@ -1,2 +1,3 @@ | |||
1 | piggy.gz | ||
2 | font.c | 1 | font.c |
2 | piggy.gz | ||
3 | vmlinux.lds | ||
diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 69130f365904..aecc6c3f908f 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c | |||
@@ -246,9 +246,9 @@ map_single(struct device *dev, void *ptr, size_t size, | |||
246 | } | 246 | } |
247 | 247 | ||
248 | dev_dbg(dev, | 248 | dev_dbg(dev, |
249 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 249 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
250 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 250 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
251 | buf->safe, (void *) buf->safe_dma_addr); | 251 | buf->safe, buf->safe_dma_addr); |
252 | 252 | ||
253 | if ((dir == DMA_TO_DEVICE) || | 253 | if ((dir == DMA_TO_DEVICE) || |
254 | (dir == DMA_BIDIRECTIONAL)) { | 254 | (dir == DMA_BIDIRECTIONAL)) { |
@@ -292,9 +292,9 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
292 | BUG_ON(buf->size != size); | 292 | BUG_ON(buf->size != size); |
293 | 293 | ||
294 | dev_dbg(dev, | 294 | dev_dbg(dev, |
295 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 295 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
296 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 296 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
297 | buf->safe, (void *) buf->safe_dma_addr); | 297 | buf->safe, buf->safe_dma_addr); |
298 | 298 | ||
299 | DO_STATS ( device_info->bounce_count++ ); | 299 | DO_STATS ( device_info->bounce_count++ ); |
300 | 300 | ||
@@ -321,9 +321,8 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
321 | } | 321 | } |
322 | } | 322 | } |
323 | 323 | ||
324 | static inline void | 324 | static int sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, |
325 | sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | 325 | enum dma_data_direction dir) |
326 | enum dma_data_direction dir) | ||
327 | { | 326 | { |
328 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; | 327 | struct dmabounce_device_info *device_info = dev->archdata.dmabounce; |
329 | struct safe_buffer *buf = NULL; | 328 | struct safe_buffer *buf = NULL; |
@@ -355,9 +354,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
355 | */ | 354 | */ |
356 | 355 | ||
357 | dev_dbg(dev, | 356 | dev_dbg(dev, |
358 | "%s: unsafe buffer %p (phy=%p) mapped to %p (phy=%p)\n", | 357 | "%s: unsafe buffer %p (dma=%#x) mapped to %p (dma=%#x)\n", |
359 | __func__, buf->ptr, (void *) virt_to_dma(dev, buf->ptr), | 358 | __func__, buf->ptr, virt_to_dma(dev, buf->ptr), |
360 | buf->safe, (void *) buf->safe_dma_addr); | 359 | buf->safe, buf->safe_dma_addr); |
361 | 360 | ||
362 | DO_STATS ( device_info->bounce_count++ ); | 361 | DO_STATS ( device_info->bounce_count++ ); |
363 | 362 | ||
@@ -383,8 +382,9 @@ sync_single(struct device *dev, dma_addr_t dma_addr, size_t size, | |||
383 | * No need to sync the safe buffer - it was allocated | 382 | * No need to sync the safe buffer - it was allocated |
384 | * via the coherent allocators. | 383 | * via the coherent allocators. |
385 | */ | 384 | */ |
385 | return 0; | ||
386 | } else { | 386 | } else { |
387 | dma_cache_maint(dma_to_virt(dev, dma_addr), size, dir); | 387 | return 1; |
388 | } | 388 | } |
389 | } | 389 | } |
390 | 390 | ||
@@ -474,25 +474,29 @@ dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
474 | } | 474 | } |
475 | } | 475 | } |
476 | 476 | ||
477 | void | 477 | void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_addr, |
478 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_addr, size_t size, | 478 | unsigned long offset, size_t size, |
479 | enum dma_data_direction dir) | 479 | enum dma_data_direction dir) |
480 | { | 480 | { |
481 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", | 481 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n", |
482 | __func__, (void *) dma_addr, size, dir); | 482 | __func__, dma_addr, offset, size, dir); |
483 | 483 | ||
484 | sync_single(dev, dma_addr, size, dir); | 484 | if (sync_single(dev, dma_addr, offset + size, dir)) |
485 | dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir); | ||
485 | } | 486 | } |
487 | EXPORT_SYMBOL(dma_sync_single_range_for_cpu); | ||
486 | 488 | ||
487 | void | 489 | void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_addr, |
488 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_addr, size_t size, | 490 | unsigned long offset, size_t size, |
489 | enum dma_data_direction dir) | 491 | enum dma_data_direction dir) |
490 | { | 492 | { |
491 | dev_dbg(dev, "%s(ptr=%p,size=%d,dir=%x)\n", | 493 | dev_dbg(dev, "%s(dma=%#x,off=%#lx,size=%zx,dir=%x)\n", |
492 | __func__, (void *) dma_addr, size, dir); | 494 | __func__, dma_addr, offset, size, dir); |
493 | 495 | ||
494 | sync_single(dev, dma_addr, size, dir); | 496 | if (sync_single(dev, dma_addr, offset + size, dir)) |
497 | dma_cache_maint(dma_to_virt(dev, dma_addr) + offset, size, dir); | ||
495 | } | 498 | } |
499 | EXPORT_SYMBOL(dma_sync_single_range_for_device); | ||
496 | 500 | ||
497 | void | 501 | void |
498 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, | 502 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, |
@@ -644,8 +648,6 @@ EXPORT_SYMBOL(dma_map_single); | |||
644 | EXPORT_SYMBOL(dma_unmap_single); | 648 | EXPORT_SYMBOL(dma_unmap_single); |
645 | EXPORT_SYMBOL(dma_map_sg); | 649 | EXPORT_SYMBOL(dma_map_sg); |
646 | EXPORT_SYMBOL(dma_unmap_sg); | 650 | EXPORT_SYMBOL(dma_unmap_sg); |
647 | EXPORT_SYMBOL(dma_sync_single_for_cpu); | ||
648 | EXPORT_SYMBOL(dma_sync_single_for_device); | ||
649 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); | 651 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); |
650 | EXPORT_SYMBOL(dma_sync_sg_for_device); | 652 | EXPORT_SYMBOL(dma_sync_sg_for_device); |
651 | EXPORT_SYMBOL(dmabounce_register_dev); | 653 | EXPORT_SYMBOL(dmabounce_register_dev); |
diff --git a/arch/arm/configs/orion5x_defconfig b/arch/arm/configs/orion5x_defconfig index 9578b5d9f9c7..1464ffe71717 100644 --- a/arch/arm/configs/orion5x_defconfig +++ b/arch/arm/configs/orion5x_defconfig | |||
@@ -757,7 +757,14 @@ CONFIG_INPUT_EVDEV=y | |||
757 | # | 757 | # |
758 | # Input Device Drivers | 758 | # Input Device Drivers |
759 | # | 759 | # |
760 | # CONFIG_INPUT_KEYBOARD is not set | 760 | CONFIG_INPUT_KEYBOARD=y |
761 | # CONFIG_KEYBOARD_ATKBD is not set | ||
762 | # CONFIG_KEYBOARD_SUNKBD is not set | ||
763 | # CONFIG_KEYBOARD_LKKBD is not set | ||
764 | # CONFIG_KEYBOARD_XTKBD is not set | ||
765 | # CONFIG_KEYBOARD_NEWTON is not set | ||
766 | # CONFIG_KEYBOARD_STOWAWAY is not set | ||
767 | CONFIG_KEYBOARD_GPIO=y | ||
761 | # CONFIG_INPUT_MOUSE is not set | 768 | # CONFIG_INPUT_MOUSE is not set |
762 | # CONFIG_INPUT_JOYSTICK is not set | 769 | # CONFIG_INPUT_JOYSTICK is not set |
763 | # CONFIG_INPUT_TABLET is not set | 770 | # CONFIG_INPUT_TABLET is not set |
@@ -1111,11 +1118,11 @@ CONFIG_RTC_DRV_DS1307=y | |||
1111 | CONFIG_RTC_DRV_RS5C372=y | 1118 | CONFIG_RTC_DRV_RS5C372=y |
1112 | # CONFIG_RTC_DRV_ISL1208 is not set | 1119 | # CONFIG_RTC_DRV_ISL1208 is not set |
1113 | # CONFIG_RTC_DRV_X1205 is not set | 1120 | # CONFIG_RTC_DRV_X1205 is not set |
1114 | # CONFIG_RTC_DRV_PCF8563 is not set | 1121 | CONFIG_RTC_DRV_PCF8563=y |
1115 | # CONFIG_RTC_DRV_PCF8583 is not set | 1122 | # CONFIG_RTC_DRV_PCF8583 is not set |
1116 | CONFIG_RTC_DRV_M41T80=y | 1123 | CONFIG_RTC_DRV_M41T80=y |
1117 | # CONFIG_RTC_DRV_M41T80_WDT is not set | 1124 | # CONFIG_RTC_DRV_M41T80_WDT is not set |
1118 | # CONFIG_RTC_DRV_S35390A is not set | 1125 | CONFIG_RTC_DRV_S35390A=y |
1119 | 1126 | ||
1120 | # | 1127 | # |
1121 | # SPI RTC drivers | 1128 | # SPI RTC drivers |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 45329fca1b64..7b95d2058395 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
@@ -3,11 +3,48 @@ | |||
3 | 3 | ||
4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
5 | 5 | ||
6 | #include <linux/mm.h> /* need struct page */ | 6 | #include <linux/mm_types.h> |
7 | |||
8 | #include <linux/scatterlist.h> | 7 | #include <linux/scatterlist.h> |
9 | 8 | ||
10 | #include <asm-generic/dma-coherent.h> | 9 | #include <asm-generic/dma-coherent.h> |
10 | #include <asm/memory.h> | ||
11 | |||
12 | /* | ||
13 | * page_to_dma/dma_to_virt/virt_to_dma are architecture private functions | ||
14 | * used internally by the DMA-mapping API to provide DMA addresses. They | ||
15 | * must not be used by drivers. | ||
16 | */ | ||
17 | #ifndef __arch_page_to_dma | ||
18 | static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | ||
19 | { | ||
20 | return (dma_addr_t)__virt_to_bus((unsigned long)page_address(page)); | ||
21 | } | ||
22 | |||
23 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) | ||
24 | { | ||
25 | return (void *)__bus_to_virt(addr); | ||
26 | } | ||
27 | |||
28 | static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | ||
29 | { | ||
30 | return (dma_addr_t)__virt_to_bus((unsigned long)(addr)); | ||
31 | } | ||
32 | #else | ||
33 | static inline dma_addr_t page_to_dma(struct device *dev, struct page *page) | ||
34 | { | ||
35 | return __arch_page_to_dma(dev, page); | ||
36 | } | ||
37 | |||
38 | static inline void *dma_to_virt(struct device *dev, dma_addr_t addr) | ||
39 | { | ||
40 | return __arch_dma_to_virt(dev, addr); | ||
41 | } | ||
42 | |||
43 | static inline dma_addr_t virt_to_dma(struct device *dev, void *addr) | ||
44 | { | ||
45 | return __arch_virt_to_dma(dev, addr); | ||
46 | } | ||
47 | #endif | ||
11 | 48 | ||
12 | /* | 49 | /* |
13 | * DMA-consistent mapping functions. These allocate/free a region of | 50 | * DMA-consistent mapping functions. These allocate/free a region of |
@@ -169,7 +206,7 @@ dma_map_single(struct device *dev, void *cpu_addr, size_t size, | |||
169 | if (!arch_is_coherent()) | 206 | if (!arch_is_coherent()) |
170 | dma_cache_maint(cpu_addr, size, dir); | 207 | dma_cache_maint(cpu_addr, size, dir); |
171 | 208 | ||
172 | return virt_to_dma(dev, (unsigned long)cpu_addr); | 209 | return virt_to_dma(dev, cpu_addr); |
173 | } | 210 | } |
174 | #else | 211 | #else |
175 | extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction); | 212 | extern dma_addr_t dma_map_single(struct device *,void *, size_t, enum dma_data_direction); |
@@ -195,7 +232,7 @@ dma_map_page(struct device *dev, struct page *page, | |||
195 | unsigned long offset, size_t size, | 232 | unsigned long offset, size_t size, |
196 | enum dma_data_direction dir) | 233 | enum dma_data_direction dir) |
197 | { | 234 | { |
198 | return dma_map_single(dev, page_address(page) + offset, size, (int)dir); | 235 | return dma_map_single(dev, page_address(page) + offset, size, dir); |
199 | } | 236 | } |
200 | 237 | ||
201 | /** | 238 | /** |
@@ -241,7 +278,7 @@ static inline void | |||
241 | dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size, | 278 | dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size, |
242 | enum dma_data_direction dir) | 279 | enum dma_data_direction dir) |
243 | { | 280 | { |
244 | dma_unmap_single(dev, handle, size, (int)dir); | 281 | dma_unmap_single(dev, handle, size, dir); |
245 | } | 282 | } |
246 | 283 | ||
247 | /** | 284 | /** |
@@ -314,11 +351,12 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da | |||
314 | 351 | ||
315 | 352 | ||
316 | /** | 353 | /** |
317 | * dma_sync_single_for_cpu | 354 | * dma_sync_single_range_for_cpu |
318 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices | 355 | * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices |
319 | * @handle: DMA address of buffer | 356 | * @handle: DMA address of buffer |
320 | * @size: size of buffer to map | 357 | * @offset: offset of region to start sync |
321 | * @dir: DMA transfer direction | 358 | * @size: size of region to sync |
359 | * @dir: DMA transfer direction (same as passed to dma_map_single) | ||
322 | * | 360 | * |
323 | * Make physical memory consistent for a single streaming mode DMA | 361 | * Make physical memory consistent for a single streaming mode DMA |
324 | * translation after a transfer. | 362 | * translation after a transfer. |
@@ -332,25 +370,41 @@ extern void dma_unmap_sg(struct device *, struct scatterlist *, int, enum dma_da | |||
332 | */ | 370 | */ |
333 | #ifndef CONFIG_DMABOUNCE | 371 | #ifndef CONFIG_DMABOUNCE |
334 | static inline void | 372 | static inline void |
335 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, | 373 | dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t handle, |
336 | enum dma_data_direction dir) | 374 | unsigned long offset, size_t size, |
375 | enum dma_data_direction dir) | ||
337 | { | 376 | { |
338 | if (!arch_is_coherent()) | 377 | if (!arch_is_coherent()) |
339 | dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir); | 378 | dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir); |
340 | } | 379 | } |
341 | 380 | ||
342 | static inline void | 381 | static inline void |
343 | dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size, | 382 | dma_sync_single_range_for_device(struct device *dev, dma_addr_t handle, |
344 | enum dma_data_direction dir) | 383 | unsigned long offset, size_t size, |
384 | enum dma_data_direction dir) | ||
345 | { | 385 | { |
346 | if (!arch_is_coherent()) | 386 | if (!arch_is_coherent()) |
347 | dma_cache_maint((void *)dma_to_virt(dev, handle), size, dir); | 387 | dma_cache_maint(dma_to_virt(dev, handle) + offset, size, dir); |
348 | } | 388 | } |
349 | #else | 389 | #else |
350 | extern void dma_sync_single_for_cpu(struct device*, dma_addr_t, size_t, enum dma_data_direction); | 390 | extern void dma_sync_single_range_for_cpu(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction); |
351 | extern void dma_sync_single_for_device(struct device*, dma_addr_t, size_t, enum dma_data_direction); | 391 | extern void dma_sync_single_range_for_device(struct device *, dma_addr_t, unsigned long, size_t, enum dma_data_direction); |
352 | #endif | 392 | #endif |
353 | 393 | ||
394 | static inline void | ||
395 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t handle, size_t size, | ||
396 | enum dma_data_direction dir) | ||
397 | { | ||
398 | dma_sync_single_range_for_cpu(dev, handle, 0, size, dir); | ||
399 | } | ||
400 | |||
401 | static inline void | ||
402 | dma_sync_single_for_device(struct device *dev, dma_addr_t handle, size_t size, | ||
403 | enum dma_data_direction dir) | ||
404 | { | ||
405 | dma_sync_single_range_for_device(dev, handle, 0, size, dir); | ||
406 | } | ||
407 | |||
354 | 408 | ||
355 | /** | 409 | /** |
356 | * dma_sync_sg_for_cpu | 410 | * dma_sync_sg_for_cpu |
diff --git a/arch/arm/include/asm/kexec.h b/arch/arm/include/asm/kexec.h index c8986bb99ed5..df15a0dc228e 100644 --- a/arch/arm/include/asm/kexec.h +++ b/arch/arm/include/asm/kexec.h | |||
@@ -10,7 +10,7 @@ | |||
10 | /* Maximum address we can use for the control code buffer */ | 10 | /* Maximum address we can use for the control code buffer */ |
11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) | 11 | #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL) |
12 | 12 | ||
13 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 13 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
14 | 14 | ||
15 | #define KEXEC_ARCH KEXEC_ARCH_ARM | 15 | #define KEXEC_ARCH KEXEC_ARCH_ARM |
16 | 16 | ||
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index 1e070a2b561a..bf7c737c9226 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
@@ -150,6 +150,14 @@ | |||
150 | #endif | 150 | #endif |
151 | 151 | ||
152 | /* | 152 | /* |
153 | * Amount of memory reserved for the vmalloc() area, and minimum | ||
154 | * address for vmalloc mappings. | ||
155 | */ | ||
156 | extern unsigned long vmalloc_reserve; | ||
157 | |||
158 | #define VMALLOC_MIN (void *)(VMALLOC_END - vmalloc_reserve) | ||
159 | |||
160 | /* | ||
153 | * PFNs are used to describe any physical page; this means | 161 | * PFNs are used to describe any physical page; this means |
154 | * PFN 0 == physical address 0. | 162 | * PFN 0 == physical address 0. |
155 | * | 163 | * |
@@ -306,20 +314,6 @@ static inline __deprecated void *bus_to_virt(unsigned long x) | |||
306 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) | 314 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
307 | 315 | ||
308 | /* | 316 | /* |
309 | * Optional device DMA address remapping. Do _not_ use directly! | ||
310 | * We should really eliminate virt_to_bus() here - it's deprecated. | ||
311 | */ | ||
312 | #ifndef __arch_page_to_dma | ||
313 | #define page_to_dma(dev, page) ((dma_addr_t)__virt_to_bus((unsigned long)page_address(page))) | ||
314 | #define dma_to_virt(dev, addr) ((void *)__bus_to_virt(addr)) | ||
315 | #define virt_to_dma(dev, addr) ((dma_addr_t)__virt_to_bus((unsigned long)(addr))) | ||
316 | #else | ||
317 | #define page_to_dma(dev, page) (__arch_page_to_dma(dev, page)) | ||
318 | #define dma_to_virt(dev, addr) (__arch_dma_to_virt(dev, addr)) | ||
319 | #define virt_to_dma(dev, addr) (__arch_virt_to_dma(dev, addr)) | ||
320 | #endif | ||
321 | |||
322 | /* | ||
323 | * Optional coherency support. Currently used only by selected | 317 | * Optional coherency support. Currently used only by selected |
324 | * Intel XSC3-based systems. | 318 | * Intel XSC3-based systems. |
325 | */ | 319 | */ |
diff --git a/arch/arm/include/asm/mtd-xip.h b/arch/arm/include/asm/mtd-xip.h index 4225372a26f3..d8fbe2d9b8b9 100644 --- a/arch/arm/include/asm/mtd-xip.h +++ b/arch/arm/include/asm/mtd-xip.h | |||
@@ -10,8 +10,6 @@ | |||
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | ||
14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
15 | */ | 13 | */ |
16 | 14 | ||
17 | #ifndef __ARM_MTD_XIP_H__ | 15 | #ifndef __ARM_MTD_XIP_H__ |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index b01d5e7e3d5a..517a4d6ffc74 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
@@ -112,9 +112,9 @@ extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | |||
112 | static inline void prefetch(const void *ptr) | 112 | static inline void prefetch(const void *ptr) |
113 | { | 113 | { |
114 | __asm__ __volatile__( | 114 | __asm__ __volatile__( |
115 | "pld\t%0" | 115 | "pld\t%a0" |
116 | : | 116 | : |
117 | : "o" (*(char *)ptr) | 117 | : "p" (ptr) |
118 | : "cc"); | 118 | : "cc"); |
119 | } | 119 | } |
120 | 120 | ||
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index 0d0d40f1b599..b543a054a17e 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
@@ -54,6 +54,7 @@ | |||
54 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction | 54 | * v4wbi - ARMv4 with write buffer with I TLB flush entry instruction |
55 | * fr - Feroceon (v4wbi with non-outer-cacheable page table walks) | 55 | * fr - Feroceon (v4wbi with non-outer-cacheable page table walks) |
56 | * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction | 56 | * v6wbi - ARMv6 with write buffer with I TLB flush entry instruction |
57 | * v7wbi - identical to v6wbi | ||
57 | */ | 58 | */ |
58 | #undef _TLB | 59 | #undef _TLB |
59 | #undef MULTI_TLB | 60 | #undef MULTI_TLB |
@@ -266,14 +267,16 @@ extern struct cpu_tlb_fns cpu_tlb; | |||
266 | v4wbi_possible_flags | \ | 267 | v4wbi_possible_flags | \ |
267 | fr_possible_flags | \ | 268 | fr_possible_flags | \ |
268 | v4wb_possible_flags | \ | 269 | v4wb_possible_flags | \ |
269 | v6wbi_possible_flags) | 270 | v6wbi_possible_flags | \ |
271 | v7wbi_possible_flags) | ||
270 | 272 | ||
271 | #define always_tlb_flags (v3_always_flags & \ | 273 | #define always_tlb_flags (v3_always_flags & \ |
272 | v4_always_flags & \ | 274 | v4_always_flags & \ |
273 | v4wbi_always_flags & \ | 275 | v4wbi_always_flags & \ |
274 | fr_always_flags & \ | 276 | fr_always_flags & \ |
275 | v4wb_always_flags & \ | 277 | v4wb_always_flags & \ |
276 | v6wbi_always_flags) | 278 | v6wbi_always_flags & \ |
279 | v7wbi_always_flags) | ||
277 | 280 | ||
278 | #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) | 281 | #define tlb_flag(f) ((always_tlb_flags & (f)) || (__tlb_flag & possible_tlb_flags & (f))) |
279 | 282 | ||
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index f95fbb2fcb5f..010618487cf1 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
@@ -381,6 +381,12 @@ | |||
381 | #define __NR_fallocate (__NR_SYSCALL_BASE+352) | 381 | #define __NR_fallocate (__NR_SYSCALL_BASE+352) |
382 | #define __NR_timerfd_settime (__NR_SYSCALL_BASE+353) | 382 | #define __NR_timerfd_settime (__NR_SYSCALL_BASE+353) |
383 | #define __NR_timerfd_gettime (__NR_SYSCALL_BASE+354) | 383 | #define __NR_timerfd_gettime (__NR_SYSCALL_BASE+354) |
384 | #define __NR_signalfd4 (__NR_SYSCALL_BASE+355) | ||
385 | #define __NR_eventfd2 (__NR_SYSCALL_BASE+356) | ||
386 | #define __NR_epoll_create1 (__NR_SYSCALL_BASE+357) | ||
387 | #define __NR_dup3 (__NR_SYSCALL_BASE+358) | ||
388 | #define __NR_pipe2 (__NR_SYSCALL_BASE+359) | ||
389 | #define __NR_inotify_init1 (__NR_SYSCALL_BASE+360) | ||
384 | 390 | ||
385 | /* | 391 | /* |
386 | * The following SWIs are ARM private. | 392 | * The following SWIs are ARM private. |
diff --git a/arch/arm/kernel/.gitignore b/arch/arm/kernel/.gitignore new file mode 100644 index 000000000000..c5f676c3c224 --- /dev/null +++ b/arch/arm/kernel/.gitignore | |||
@@ -0,0 +1 @@ | |||
vmlinux.lds | |||
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 30a67a5a40a8..09a061cb7838 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
@@ -262,10 +262,10 @@ | |||
262 | /* 250 */ CALL(sys_epoll_create) | 262 | /* 250 */ CALL(sys_epoll_create) |
263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) | 263 | CALL(ABI(sys_epoll_ctl, sys_oabi_epoll_ctl)) |
264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) | 264 | CALL(ABI(sys_epoll_wait, sys_oabi_epoll_wait)) |
265 | CALL(sys_remap_file_pages) | 265 | CALL(sys_remap_file_pages) |
266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ | 266 | CALL(sys_ni_syscall) /* sys_set_thread_area */ |
267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ | 267 | /* 255 */ CALL(sys_ni_syscall) /* sys_get_thread_area */ |
268 | CALL(sys_set_tid_address) | 268 | CALL(sys_set_tid_address) |
269 | CALL(sys_timer_create) | 269 | CALL(sys_timer_create) |
270 | CALL(sys_timer_settime) | 270 | CALL(sys_timer_settime) |
271 | CALL(sys_timer_gettime) | 271 | CALL(sys_timer_gettime) |
@@ -364,6 +364,12 @@ | |||
364 | CALL(sys_fallocate) | 364 | CALL(sys_fallocate) |
365 | CALL(sys_timerfd_settime) | 365 | CALL(sys_timerfd_settime) |
366 | CALL(sys_timerfd_gettime) | 366 | CALL(sys_timerfd_gettime) |
367 | /* 355 */ CALL(sys_signalfd4) | ||
368 | CALL(sys_eventfd2) | ||
369 | CALL(sys_epoll_create1) | ||
370 | CALL(sys_dup3) | ||
371 | CALL(sys_pipe2) | ||
372 | /* 360 */ CALL(sys_inotify_init1) | ||
367 | #ifndef syscalls_counted | 373 | #ifndef syscalls_counted |
368 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 374 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
369 | #define syscalls_counted | 375 | #define syscalls_counted |
diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c index db8f54a3451f..fae5beb3c3d6 100644 --- a/arch/arm/kernel/machine_kexec.c +++ b/arch/arm/kernel/machine_kexec.c | |||
@@ -71,7 +71,7 @@ void machine_kexec(struct kimage *image) | |||
71 | 71 | ||
72 | 72 | ||
73 | flush_icache_range((unsigned long) reboot_code_buffer, | 73 | flush_icache_range((unsigned long) reboot_code_buffer, |
74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 74 | (unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
75 | printk(KERN_INFO "Bye!\n"); | 75 | printk(KERN_INFO "Bye!\n"); |
76 | 76 | ||
77 | cpu_proc_fin(); | 77 | cpu_proc_fin(); |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 38f0e7940a13..2ca7038b67a7 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
@@ -81,6 +81,8 @@ EXPORT_SYMBOL(system_serial_high); | |||
81 | unsigned int elf_hwcap; | 81 | unsigned int elf_hwcap; |
82 | EXPORT_SYMBOL(elf_hwcap); | 82 | EXPORT_SYMBOL(elf_hwcap); |
83 | 83 | ||
84 | unsigned long __initdata vmalloc_reserve = 128 << 20; | ||
85 | |||
84 | 86 | ||
85 | #ifdef MULTI_CPU | 87 | #ifdef MULTI_CPU |
86 | struct processor processor; | 88 | struct processor processor; |
@@ -501,6 +503,17 @@ static void __init early_mem(char **p) | |||
501 | __early_param("mem=", early_mem); | 503 | __early_param("mem=", early_mem); |
502 | 504 | ||
503 | /* | 505 | /* |
506 | * vmalloc=size forces the vmalloc area to be exactly 'size' | ||
507 | * bytes. This can be used to increase (or decrease) the vmalloc | ||
508 | * area - the default is 128m. | ||
509 | */ | ||
510 | static void __init early_vmalloc(char **arg) | ||
511 | { | ||
512 | vmalloc_reserve = memparse(*arg, arg); | ||
513 | } | ||
514 | __early_param("vmalloc=", early_vmalloc); | ||
515 | |||
516 | /* | ||
504 | * Initial parsing of the command line. | 517 | * Initial parsing of the command line. |
505 | */ | 518 | */ |
506 | static void __init parse_cmdline(char **cmdline_p, char *from) | 519 | static void __init parse_cmdline(char **cmdline_p, char *from) |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 7277aef83098..872f1f8fbb57 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -288,14 +288,28 @@ void unregister_undef_hook(struct undef_hook *hook) | |||
288 | spin_unlock_irqrestore(&undef_lock, flags); | 288 | spin_unlock_irqrestore(&undef_lock, flags); |
289 | } | 289 | } |
290 | 290 | ||
291 | static int call_undef_hook(struct pt_regs *regs, unsigned int instr) | ||
292 | { | ||
293 | struct undef_hook *hook; | ||
294 | unsigned long flags; | ||
295 | int (*fn)(struct pt_regs *regs, unsigned int instr) = NULL; | ||
296 | |||
297 | spin_lock_irqsave(&undef_lock, flags); | ||
298 | list_for_each_entry(hook, &undef_hook, node) | ||
299 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
300 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) | ||
301 | fn = hook->fn; | ||
302 | spin_unlock_irqrestore(&undef_lock, flags); | ||
303 | |||
304 | return fn ? fn(regs, instr) : 1; | ||
305 | } | ||
306 | |||
291 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | 307 | asmlinkage void __exception do_undefinstr(struct pt_regs *regs) |
292 | { | 308 | { |
293 | unsigned int correction = thumb_mode(regs) ? 2 : 4; | 309 | unsigned int correction = thumb_mode(regs) ? 2 : 4; |
294 | unsigned int instr; | 310 | unsigned int instr; |
295 | struct undef_hook *hook; | ||
296 | siginfo_t info; | 311 | siginfo_t info; |
297 | void __user *pc; | 312 | void __user *pc; |
298 | unsigned long flags; | ||
299 | 313 | ||
300 | /* | 314 | /* |
301 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, | 315 | * According to the ARM ARM, PC is 2 or 4 bytes ahead, |
@@ -325,17 +339,8 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
325 | } | 339 | } |
326 | #endif | 340 | #endif |
327 | 341 | ||
328 | spin_lock_irqsave(&undef_lock, flags); | 342 | if (call_undef_hook(regs, instr) == 0) |
329 | list_for_each_entry(hook, &undef_hook, node) { | 343 | return; |
330 | if ((instr & hook->instr_mask) == hook->instr_val && | ||
331 | (regs->ARM_cpsr & hook->cpsr_mask) == hook->cpsr_val) { | ||
332 | if (hook->fn(regs, instr) == 0) { | ||
333 | spin_unlock_irqrestore(&undef_lock, flags); | ||
334 | return; | ||
335 | } | ||
336 | } | ||
337 | } | ||
338 | spin_unlock_irqrestore(&undef_lock, flags); | ||
339 | 344 | ||
340 | #ifdef CONFIG_DEBUG_USER | 345 | #ifdef CONFIG_DEBUG_USER |
341 | if (user_debug & UDBG_UNDEFINED) { | 346 | if (user_debug & UDBG_UNDEFINED) { |
diff --git a/arch/arm/mach-footbridge/cats-pci.c b/arch/arm/mach-footbridge/cats-pci.c index 35eb232a649a..ae3e1c8c7583 100644 --- a/arch/arm/mach-footbridge/cats-pci.c +++ b/arch/arm/mach-footbridge/cats-pci.c | |||
@@ -18,6 +18,9 @@ static int irqmap_cats[] __initdata = { IRQ_PCI, IRQ_IN0, IRQ_IN1, IRQ_IN3 }; | |||
18 | 18 | ||
19 | static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | 19 | static int __init cats_map_irq(struct pci_dev *dev, u8 slot, u8 pin) |
20 | { | 20 | { |
21 | if (dev->irq >= 255) | ||
22 | return -1; /* not a valid interrupt. */ | ||
23 | |||
21 | if (dev->irq >= 128) | 24 | if (dev->irq >= 128) |
22 | return dev->irq & 0x1f; | 25 | return dev->irq & 0x1f; |
23 | 26 | ||
diff --git a/arch/arm/mach-integrator/cpu.c b/arch/arm/mach-integrator/cpu.c index ce5ea7c26675..7c49d55e6b27 100644 --- a/arch/arm/mach-integrator/cpu.c +++ b/arch/arm/mach-integrator/cpu.c | |||
@@ -3,8 +3,6 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. | 4 | * Copyright (C) 2001-2002 Deep Blue Solutions Ltd. |
5 | * | 5 | * |
6 | * $Id: cpu.c,v 1.6 2002/07/18 13:58:51 rmk Exp $ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
10 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c index 0a7b3267c8d8..3c8383dbe9e6 100644 --- a/arch/arm/mach-integrator/impd1.c +++ b/arch/arm/mach-integrator/impd1.c | |||
@@ -405,7 +405,7 @@ static int impd1_probe(struct lm_device *dev) | |||
405 | 405 | ||
406 | ret = amba_device_register(d, &dev->resource); | 406 | ret = amba_device_register(d, &dev->resource); |
407 | if (ret) { | 407 | if (ret) { |
408 | dev_err(&d->dev, "unable to register device: %d\n"); | 408 | dev_err(&d->dev, "unable to register device: %d\n", ret); |
409 | kfree(d); | 409 | kfree(d); |
410 | } | 410 | } |
411 | } | 411 | } |
diff --git a/arch/arm/mach-integrator/include/mach/platform.h b/arch/arm/mach-integrator/include/mach/platform.h index 83c4c1ceb411..028b87839c0f 100644 --- a/arch/arm/mach-integrator/include/mach/platform.h +++ b/arch/arm/mach-integrator/include/mach/platform.h | |||
@@ -26,8 +26,6 @@ | |||
26 | * NOTE: This is a multi-hosted header file for use with uHAL and | 26 | * NOTE: This is a multi-hosted header file for use with uHAL and |
27 | * supported debuggers. | 27 | * supported debuggers. |
28 | * | 28 | * |
29 | * $Id: platform.s,v 1.32 2000/02/18 10:51:39 asims Exp $ | ||
30 | * | ||
31 | * ***********************************************************************/ | 29 | * ***********************************************************************/ |
32 | 30 | ||
33 | #ifndef __address_h | 31 | #ifndef __address_h |
diff --git a/arch/arm/mach-ixp4xx/fsg-setup.c b/arch/arm/mach-ixp4xx/fsg-setup.c index 0db3a909ae61..501dfdcc39fe 100644 --- a/arch/arm/mach-ixp4xx/fsg-setup.c +++ b/arch/arm/mach-ixp4xx/fsg-setup.c | |||
@@ -64,7 +64,7 @@ static struct platform_device fsg_i2c_gpio = { | |||
64 | 64 | ||
65 | static struct i2c_board_info __initdata fsg_i2c_board_info [] = { | 65 | static struct i2c_board_info __initdata fsg_i2c_board_info [] = { |
66 | { | 66 | { |
67 | I2C_BOARD_INFO("rtc-isl1208", 0x6f), | 67 | I2C_BOARD_INFO("isl1208", 0x6f), |
68 | }, | 68 | }, |
69 | }; | 69 | }; |
70 | 70 | ||
@@ -179,7 +179,6 @@ static void __init fsg_init(void) | |||
179 | { | 179 | { |
180 | DECLARE_MAC_BUF(mac_buf); | 180 | DECLARE_MAC_BUF(mac_buf); |
181 | uint8_t __iomem *f; | 181 | uint8_t __iomem *f; |
182 | int i; | ||
183 | 182 | ||
184 | ixp4xx_sys_init(); | 183 | ixp4xx_sys_init(); |
185 | 184 | ||
@@ -228,6 +227,7 @@ static void __init fsg_init(void) | |||
228 | f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000); | 227 | f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000); |
229 | if (f) { | 228 | if (f) { |
230 | #ifdef __ARMEB__ | 229 | #ifdef __ARMEB__ |
230 | int i; | ||
231 | for (i = 0; i < 6; i++) { | 231 | for (i = 0; i < 6; i++) { |
232 | fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i); | 232 | fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i); |
233 | fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i); | 233 | fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i); |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index 0e509b8ad56e..189f16f3619d 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
@@ -15,15 +15,17 @@ | |||
15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
16 | #include <linux/mv643xx_eth.h> | 16 | #include <linux/mv643xx_eth.h> |
17 | #include <linux/ata_platform.h> | 17 | #include <linux/ata_platform.h> |
18 | #include <linux/spi/orion_spi.h> | ||
18 | #include <asm/page.h> | 19 | #include <asm/page.h> |
19 | #include <asm/timex.h> | 20 | #include <asm/timex.h> |
20 | #include <asm/mach/map.h> | 21 | #include <asm/mach/map.h> |
21 | #include <asm/mach/time.h> | 22 | #include <asm/mach/time.h> |
22 | #include <mach/kirkwood.h> | 23 | #include <mach/kirkwood.h> |
23 | #include <asm/plat-orion/cache-feroceon-l2.h> | 24 | #include <plat/cache-feroceon-l2.h> |
24 | #include <asm/plat-orion/ehci-orion.h> | 25 | #include <plat/ehci-orion.h> |
25 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <plat/mv_xor.h> |
26 | #include <asm/plat-orion/time.h> | 27 | #include <plat/orion_nand.h> |
28 | #include <plat/time.h> | ||
27 | #include "common.h" | 29 | #include "common.h" |
28 | 30 | ||
29 | /***************************************************************************** | 31 | /***************************************************************************** |
@@ -196,6 +198,37 @@ void __init kirkwood_sata_init(struct mv_sata_platform_data *sata_data) | |||
196 | 198 | ||
197 | 199 | ||
198 | /***************************************************************************** | 200 | /***************************************************************************** |
201 | * SPI | ||
202 | ****************************************************************************/ | ||
203 | static struct orion_spi_info kirkwood_spi_plat_data = { | ||
204 | .tclk = KIRKWOOD_TCLK, | ||
205 | }; | ||
206 | |||
207 | static struct resource kirkwood_spi_resources[] = { | ||
208 | { | ||
209 | .start = SPI_PHYS_BASE, | ||
210 | .end = SPI_PHYS_BASE + SZ_512 - 1, | ||
211 | .flags = IORESOURCE_MEM, | ||
212 | }, | ||
213 | }; | ||
214 | |||
215 | static struct platform_device kirkwood_spi = { | ||
216 | .name = "orion_spi", | ||
217 | .id = 0, | ||
218 | .resource = kirkwood_spi_resources, | ||
219 | .dev = { | ||
220 | .platform_data = &kirkwood_spi_plat_data, | ||
221 | }, | ||
222 | .num_resources = ARRAY_SIZE(kirkwood_spi_resources), | ||
223 | }; | ||
224 | |||
225 | void __init kirkwood_spi_init() | ||
226 | { | ||
227 | platform_device_register(&kirkwood_spi); | ||
228 | } | ||
229 | |||
230 | |||
231 | /***************************************************************************** | ||
199 | * UART0 | 232 | * UART0 |
200 | ****************************************************************************/ | 233 | ****************************************************************************/ |
201 | static struct plat_serial8250_port kirkwood_uart0_data[] = { | 234 | static struct plat_serial8250_port kirkwood_uart0_data[] = { |
@@ -284,6 +317,212 @@ void __init kirkwood_uart1_init(void) | |||
284 | 317 | ||
285 | 318 | ||
286 | /***************************************************************************** | 319 | /***************************************************************************** |
320 | * XOR | ||
321 | ****************************************************************************/ | ||
322 | static struct mv_xor_platform_shared_data kirkwood_xor_shared_data = { | ||
323 | .dram = &kirkwood_mbus_dram_info, | ||
324 | }; | ||
325 | |||
326 | static u64 kirkwood_xor_dmamask = DMA_32BIT_MASK; | ||
327 | |||
328 | |||
329 | /***************************************************************************** | ||
330 | * XOR0 | ||
331 | ****************************************************************************/ | ||
332 | static struct resource kirkwood_xor0_shared_resources[] = { | ||
333 | { | ||
334 | .name = "xor 0 low", | ||
335 | .start = XOR0_PHYS_BASE, | ||
336 | .end = XOR0_PHYS_BASE + 0xff, | ||
337 | .flags = IORESOURCE_MEM, | ||
338 | }, { | ||
339 | .name = "xor 0 high", | ||
340 | .start = XOR0_HIGH_PHYS_BASE, | ||
341 | .end = XOR0_HIGH_PHYS_BASE + 0xff, | ||
342 | .flags = IORESOURCE_MEM, | ||
343 | }, | ||
344 | }; | ||
345 | |||
346 | static struct platform_device kirkwood_xor0_shared = { | ||
347 | .name = MV_XOR_SHARED_NAME, | ||
348 | .id = 0, | ||
349 | .dev = { | ||
350 | .platform_data = &kirkwood_xor_shared_data, | ||
351 | }, | ||
352 | .num_resources = ARRAY_SIZE(kirkwood_xor0_shared_resources), | ||
353 | .resource = kirkwood_xor0_shared_resources, | ||
354 | }; | ||
355 | |||
356 | static struct resource kirkwood_xor00_resources[] = { | ||
357 | [0] = { | ||
358 | .start = IRQ_KIRKWOOD_XOR_00, | ||
359 | .end = IRQ_KIRKWOOD_XOR_00, | ||
360 | .flags = IORESOURCE_IRQ, | ||
361 | }, | ||
362 | }; | ||
363 | |||
364 | static struct mv_xor_platform_data kirkwood_xor00_data = { | ||
365 | .shared = &kirkwood_xor0_shared, | ||
366 | .hw_id = 0, | ||
367 | .pool_size = PAGE_SIZE, | ||
368 | }; | ||
369 | |||
370 | static struct platform_device kirkwood_xor00_channel = { | ||
371 | .name = MV_XOR_NAME, | ||
372 | .id = 0, | ||
373 | .num_resources = ARRAY_SIZE(kirkwood_xor00_resources), | ||
374 | .resource = kirkwood_xor00_resources, | ||
375 | .dev = { | ||
376 | .dma_mask = &kirkwood_xor_dmamask, | ||
377 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
378 | .platform_data = (void *)&kirkwood_xor00_data, | ||
379 | }, | ||
380 | }; | ||
381 | |||
382 | static struct resource kirkwood_xor01_resources[] = { | ||
383 | [0] = { | ||
384 | .start = IRQ_KIRKWOOD_XOR_01, | ||
385 | .end = IRQ_KIRKWOOD_XOR_01, | ||
386 | .flags = IORESOURCE_IRQ, | ||
387 | }, | ||
388 | }; | ||
389 | |||
390 | static struct mv_xor_platform_data kirkwood_xor01_data = { | ||
391 | .shared = &kirkwood_xor0_shared, | ||
392 | .hw_id = 1, | ||
393 | .pool_size = PAGE_SIZE, | ||
394 | }; | ||
395 | |||
396 | static struct platform_device kirkwood_xor01_channel = { | ||
397 | .name = MV_XOR_NAME, | ||
398 | .id = 1, | ||
399 | .num_resources = ARRAY_SIZE(kirkwood_xor01_resources), | ||
400 | .resource = kirkwood_xor01_resources, | ||
401 | .dev = { | ||
402 | .dma_mask = &kirkwood_xor_dmamask, | ||
403 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
404 | .platform_data = (void *)&kirkwood_xor01_data, | ||
405 | }, | ||
406 | }; | ||
407 | |||
408 | void __init kirkwood_xor0_init(void) | ||
409 | { | ||
410 | platform_device_register(&kirkwood_xor0_shared); | ||
411 | |||
412 | /* | ||
413 | * two engines can't do memset simultaneously, this limitation | ||
414 | * satisfied by removing memset support from one of the engines. | ||
415 | */ | ||
416 | dma_cap_set(DMA_MEMCPY, kirkwood_xor00_data.cap_mask); | ||
417 | dma_cap_set(DMA_XOR, kirkwood_xor00_data.cap_mask); | ||
418 | platform_device_register(&kirkwood_xor00_channel); | ||
419 | |||
420 | dma_cap_set(DMA_MEMCPY, kirkwood_xor01_data.cap_mask); | ||
421 | dma_cap_set(DMA_MEMSET, kirkwood_xor01_data.cap_mask); | ||
422 | dma_cap_set(DMA_XOR, kirkwood_xor01_data.cap_mask); | ||
423 | platform_device_register(&kirkwood_xor01_channel); | ||
424 | } | ||
425 | |||
426 | |||
427 | /***************************************************************************** | ||
428 | * XOR1 | ||
429 | ****************************************************************************/ | ||
430 | static struct resource kirkwood_xor1_shared_resources[] = { | ||
431 | { | ||
432 | .name = "xor 1 low", | ||
433 | .start = XOR1_PHYS_BASE, | ||
434 | .end = XOR1_PHYS_BASE + 0xff, | ||
435 | .flags = IORESOURCE_MEM, | ||
436 | }, { | ||
437 | .name = "xor 1 high", | ||
438 | .start = XOR1_HIGH_PHYS_BASE, | ||
439 | .end = XOR1_HIGH_PHYS_BASE + 0xff, | ||
440 | .flags = IORESOURCE_MEM, | ||
441 | }, | ||
442 | }; | ||
443 | |||
444 | static struct platform_device kirkwood_xor1_shared = { | ||
445 | .name = MV_XOR_SHARED_NAME, | ||
446 | .id = 1, | ||
447 | .dev = { | ||
448 | .platform_data = &kirkwood_xor_shared_data, | ||
449 | }, | ||
450 | .num_resources = ARRAY_SIZE(kirkwood_xor1_shared_resources), | ||
451 | .resource = kirkwood_xor1_shared_resources, | ||
452 | }; | ||
453 | |||
454 | static struct resource kirkwood_xor10_resources[] = { | ||
455 | [0] = { | ||
456 | .start = IRQ_KIRKWOOD_XOR_10, | ||
457 | .end = IRQ_KIRKWOOD_XOR_10, | ||
458 | .flags = IORESOURCE_IRQ, | ||
459 | }, | ||
460 | }; | ||
461 | |||
462 | static struct mv_xor_platform_data kirkwood_xor10_data = { | ||
463 | .shared = &kirkwood_xor1_shared, | ||
464 | .hw_id = 0, | ||
465 | .pool_size = PAGE_SIZE, | ||
466 | }; | ||
467 | |||
468 | static struct platform_device kirkwood_xor10_channel = { | ||
469 | .name = MV_XOR_NAME, | ||
470 | .id = 2, | ||
471 | .num_resources = ARRAY_SIZE(kirkwood_xor10_resources), | ||
472 | .resource = kirkwood_xor10_resources, | ||
473 | .dev = { | ||
474 | .dma_mask = &kirkwood_xor_dmamask, | ||
475 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
476 | .platform_data = (void *)&kirkwood_xor10_data, | ||
477 | }, | ||
478 | }; | ||
479 | |||
480 | static struct resource kirkwood_xor11_resources[] = { | ||
481 | [0] = { | ||
482 | .start = IRQ_KIRKWOOD_XOR_11, | ||
483 | .end = IRQ_KIRKWOOD_XOR_11, | ||
484 | .flags = IORESOURCE_IRQ, | ||
485 | }, | ||
486 | }; | ||
487 | |||
488 | static struct mv_xor_platform_data kirkwood_xor11_data = { | ||
489 | .shared = &kirkwood_xor1_shared, | ||
490 | .hw_id = 1, | ||
491 | .pool_size = PAGE_SIZE, | ||
492 | }; | ||
493 | |||
494 | static struct platform_device kirkwood_xor11_channel = { | ||
495 | .name = MV_XOR_NAME, | ||
496 | .id = 3, | ||
497 | .num_resources = ARRAY_SIZE(kirkwood_xor11_resources), | ||
498 | .resource = kirkwood_xor11_resources, | ||
499 | .dev = { | ||
500 | .dma_mask = &kirkwood_xor_dmamask, | ||
501 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
502 | .platform_data = (void *)&kirkwood_xor11_data, | ||
503 | }, | ||
504 | }; | ||
505 | |||
506 | void __init kirkwood_xor1_init(void) | ||
507 | { | ||
508 | platform_device_register(&kirkwood_xor1_shared); | ||
509 | |||
510 | /* | ||
511 | * two engines can't do memset simultaneously, this limitation | ||
512 | * satisfied by removing memset support from one of the engines. | ||
513 | */ | ||
514 | dma_cap_set(DMA_MEMCPY, kirkwood_xor10_data.cap_mask); | ||
515 | dma_cap_set(DMA_XOR, kirkwood_xor10_data.cap_mask); | ||
516 | platform_device_register(&kirkwood_xor10_channel); | ||
517 | |||
518 | dma_cap_set(DMA_MEMCPY, kirkwood_xor11_data.cap_mask); | ||
519 | dma_cap_set(DMA_MEMSET, kirkwood_xor11_data.cap_mask); | ||
520 | dma_cap_set(DMA_XOR, kirkwood_xor11_data.cap_mask); | ||
521 | platform_device_register(&kirkwood_xor11_channel); | ||
522 | } | ||
523 | |||
524 | |||
525 | /***************************************************************************** | ||
287 | * Time handling | 526 | * Time handling |
288 | ****************************************************************************/ | 527 | ****************************************************************************/ |
289 | static void kirkwood_timer_init(void) | 528 | static void kirkwood_timer_init(void) |
diff --git a/arch/arm/mach-kirkwood/common.h b/arch/arm/mach-kirkwood/common.h index 5dee2f6b40a5..69cd113af03a 100644 --- a/arch/arm/mach-kirkwood/common.h +++ b/arch/arm/mach-kirkwood/common.h | |||
@@ -33,8 +33,11 @@ void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data); | |||
33 | void kirkwood_pcie_init(void); | 33 | void kirkwood_pcie_init(void); |
34 | void kirkwood_rtc_init(void); | 34 | void kirkwood_rtc_init(void); |
35 | void kirkwood_sata_init(struct mv_sata_platform_data *sata_data); | 35 | void kirkwood_sata_init(struct mv_sata_platform_data *sata_data); |
36 | void kirkwood_spi_init(void); | ||
36 | void kirkwood_uart0_init(void); | 37 | void kirkwood_uart0_init(void); |
37 | void kirkwood_uart1_init(void); | 38 | void kirkwood_uart1_init(void); |
39 | void kirkwood_xor0_init(void); | ||
40 | void kirkwood_xor1_init(void); | ||
38 | 41 | ||
39 | extern struct sys_timer kirkwood_timer; | 42 | extern struct sys_timer kirkwood_timer; |
40 | 43 | ||
diff --git a/arch/arm/mach-kirkwood/include/mach/kirkwood.h b/arch/arm/mach-kirkwood/include/mach/kirkwood.h index d1336b41f0fb..5c69992295e8 100644 --- a/arch/arm/mach-kirkwood/include/mach/kirkwood.h +++ b/arch/arm/mach-kirkwood/include/mach/kirkwood.h | |||
@@ -88,6 +88,15 @@ | |||
88 | 88 | ||
89 | #define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000) | 89 | #define USB_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x50000) |
90 | 90 | ||
91 | #define XOR0_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60800) | ||
92 | #define XOR0_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60800) | ||
93 | #define XOR1_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60900) | ||
94 | #define XOR1_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60900) | ||
95 | #define XOR0_HIGH_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60A00) | ||
96 | #define XOR0_HIGH_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60A00) | ||
97 | #define XOR1_HIGH_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x60B00) | ||
98 | #define XOR1_HIGH_VIRT_BASE (KIRKWOOD_REGS_VIRT_BASE | 0x60B00) | ||
99 | |||
91 | #define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000) | 100 | #define GE00_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x70000) |
92 | #define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000) | 101 | #define GE01_PHYS_BASE (KIRKWOOD_REGS_PHYS_BASE | 0x74000) |
93 | 102 | ||
diff --git a/arch/arm/mach-kirkwood/irq.c b/arch/arm/mach-kirkwood/irq.c index 302bb2cf6669..5790643ffe07 100644 --- a/arch/arm/mach-kirkwood/irq.c +++ b/arch/arm/mach-kirkwood/irq.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
16 | #include "common.h" | 16 | #include "common.h" |
17 | 17 | ||
18 | void __init kirkwood_init_irq(void) | 18 | void __init kirkwood_init_irq(void) |
diff --git a/arch/arm/mach-kirkwood/pcie.c b/arch/arm/mach-kirkwood/pcie.c index 8282d0ff84bf..2195fa31f6b7 100644 --- a/arch/arm/mach-kirkwood/pcie.c +++ b/arch/arm/mach-kirkwood/pcie.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
16 | #include "common.h" | 16 | #include "common.h" |
17 | 17 | ||
18 | 18 | ||
diff --git a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c index 182230a5d198..a3012d445971 100644 --- a/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6192-nas-setup.c | |||
@@ -18,6 +18,9 @@ | |||
18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
19 | #include <linux/ata_platform.h> | 19 | #include <linux/ata_platform.h> |
20 | #include <linux/mv643xx_eth.h> | 20 | #include <linux/mv643xx_eth.h> |
21 | #include <linux/spi/flash.h> | ||
22 | #include <linux/spi/spi.h> | ||
23 | #include <linux/spi/orion_spi.h> | ||
21 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
22 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
23 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
@@ -34,6 +37,21 @@ static struct mv_sata_platform_data rd88f6192_sata_data = { | |||
34 | .n_ports = 2, | 37 | .n_ports = 2, |
35 | }; | 38 | }; |
36 | 39 | ||
40 | static const struct flash_platform_data rd88F6192_spi_slave_data = { | ||
41 | .type = "m25p128", | ||
42 | }; | ||
43 | |||
44 | static struct spi_board_info __initdata rd88F6192_spi_slave_info[] = { | ||
45 | { | ||
46 | .modalias = "m25p80", | ||
47 | .platform_data = &rd88F6192_spi_slave_data, | ||
48 | .irq = -1, | ||
49 | .max_speed_hz = 20000000, | ||
50 | .bus_num = 0, | ||
51 | .chip_select = 0, | ||
52 | }, | ||
53 | }; | ||
54 | |||
37 | static void __init rd88f6192_init(void) | 55 | static void __init rd88f6192_init(void) |
38 | { | 56 | { |
39 | /* | 57 | /* |
@@ -45,7 +63,12 @@ static void __init rd88f6192_init(void) | |||
45 | kirkwood_ge00_init(&rd88f6192_ge00_data); | 63 | kirkwood_ge00_init(&rd88f6192_ge00_data); |
46 | kirkwood_rtc_init(); | 64 | kirkwood_rtc_init(); |
47 | kirkwood_sata_init(&rd88f6192_sata_data); | 65 | kirkwood_sata_init(&rd88f6192_sata_data); |
66 | spi_register_board_info(rd88F6192_spi_slave_info, | ||
67 | ARRAY_SIZE(rd88F6192_spi_slave_info)); | ||
68 | kirkwood_spi_init(); | ||
48 | kirkwood_uart0_init(); | 69 | kirkwood_uart0_init(); |
70 | kirkwood_xor0_init(); | ||
71 | kirkwood_xor1_init(); | ||
49 | } | 72 | } |
50 | 73 | ||
51 | static int __init rd88f6192_pci_init(void) | 74 | static int __init rd88f6192_pci_init(void) |
diff --git a/arch/arm/mach-kirkwood/rd88f6281-setup.c b/arch/arm/mach-kirkwood/rd88f6281-setup.c index d8a43018c7d3..d96487a0f18b 100644 --- a/arch/arm/mach-kirkwood/rd88f6281-setup.c +++ b/arch/arm/mach-kirkwood/rd88f6281-setup.c | |||
@@ -23,7 +23,7 @@ | |||
23 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
24 | #include <asm/mach/pci.h> | 24 | #include <asm/mach/pci.h> |
25 | #include <mach/kirkwood.h> | 25 | #include <mach/kirkwood.h> |
26 | #include <asm/plat-orion/orion_nand.h> | 26 | #include <plat/orion_nand.h> |
27 | #include "common.h" | 27 | #include "common.h" |
28 | 28 | ||
29 | static struct mtd_partition rd88f6281_nand_parts[] = { | 29 | static struct mtd_partition rd88f6281_nand_parts[] = { |
diff --git a/arch/arm/mach-lh7a40x/include/mach/ssp.h b/arch/arm/mach-lh7a40x/include/mach/ssp.h index 132b1c4d5ce6..509916182e34 100644 --- a/arch/arm/mach-lh7a40x/include/mach/ssp.h +++ b/arch/arm/mach-lh7a40x/include/mach/ssp.h | |||
@@ -1,5 +1,4 @@ | |||
1 | /* ssp.h | 1 | /* ssp.h |
2 | $Id$ | ||
3 | 2 | ||
4 | written by Marc Singer | 3 | written by Marc Singer |
5 | 6 Dec 2004 | 4 | 6 Dec 2004 |
diff --git a/arch/arm/mach-lh7a40x/lcd-panel.h b/arch/arm/mach-lh7a40x/lcd-panel.h index df6e38ed425b..a7f5027b2f78 100644 --- a/arch/arm/mach-lh7a40x/lcd-panel.h +++ b/arch/arm/mach-lh7a40x/lcd-panel.h | |||
@@ -1,5 +1,4 @@ | |||
1 | /* lcd-panel.h | 1 | /* lcd-panel.h |
2 | $Id$ | ||
3 | 2 | ||
4 | written by Marc Singer | 3 | written by Marc Singer |
5 | 18 Jul 2005 | 4 | 18 Jul 2005 |
diff --git a/arch/arm/mach-loki/common.c b/arch/arm/mach-loki/common.c index e20cdbca1ebe..c0d2d9d12e74 100644 --- a/arch/arm/mach-loki/common.c +++ b/arch/arm/mach-loki/common.c | |||
@@ -19,8 +19,8 @@ | |||
19 | #include <asm/mach/map.h> | 19 | #include <asm/mach/map.h> |
20 | #include <asm/mach/time.h> | 20 | #include <asm/mach/time.h> |
21 | #include <mach/loki.h> | 21 | #include <mach/loki.h> |
22 | #include <asm/plat-orion/orion_nand.h> | 22 | #include <plat/orion_nand.h> |
23 | #include <asm/plat-orion/time.h> | 23 | #include <plat/time.h> |
24 | #include "common.h" | 24 | #include "common.h" |
25 | 25 | ||
26 | /***************************************************************************** | 26 | /***************************************************************************** |
diff --git a/arch/arm/mach-loki/irq.c b/arch/arm/mach-loki/irq.c index d839af91fe03..5a487930cb2f 100644 --- a/arch/arm/mach-loki/irq.c +++ b/arch/arm/mach-loki/irq.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <asm/io.h> | 14 | #include <asm/io.h> |
15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
16 | #include "common.h" | 16 | #include "common.h" |
17 | 17 | ||
18 | void __init loki_init_irq(void) | 18 | void __init loki_init_irq(void) |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index e633f9cb239f..953a26c469cb 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
@@ -18,10 +18,10 @@ | |||
18 | #include <asm/mach/map.h> | 18 | #include <asm/mach/map.h> |
19 | #include <asm/mach/time.h> | 19 | #include <asm/mach/time.h> |
20 | #include <mach/mv78xx0.h> | 20 | #include <mach/mv78xx0.h> |
21 | #include <asm/plat-orion/cache-feroceon-l2.h> | 21 | #include <plat/cache-feroceon-l2.h> |
22 | #include <asm/plat-orion/ehci-orion.h> | 22 | #include <plat/ehci-orion.h> |
23 | #include <asm/plat-orion/orion_nand.h> | 23 | #include <plat/orion_nand.h> |
24 | #include <asm/plat-orion/time.h> | 24 | #include <plat/time.h> |
25 | #include "common.h" | 25 | #include "common.h" |
26 | 26 | ||
27 | 27 | ||
diff --git a/arch/arm/mach-mv78xx0/irq.c b/arch/arm/mach-mv78xx0/irq.c index 3198abf54c90..28248d37b999 100644 --- a/arch/arm/mach-mv78xx0/irq.c +++ b/arch/arm/mach-mv78xx0/irq.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/pci.h> | 13 | #include <linux/pci.h> |
14 | #include <mach/mv78xx0.h> | 14 | #include <mach/mv78xx0.h> |
15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
16 | #include "common.h" | 16 | #include "common.h" |
17 | 17 | ||
18 | void __init mv78xx0_init_irq(void) | 18 | void __init mv78xx0_init_irq(void) |
diff --git a/arch/arm/mach-mv78xx0/pcie.c b/arch/arm/mach-mv78xx0/pcie.c index b78e1443159f..430ea84d587d 100644 --- a/arch/arm/mach-mv78xx0/pcie.c +++ b/arch/arm/mach-mv78xx0/pcie.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
16 | #include "common.h" | 16 | #include "common.h" |
17 | 17 | ||
18 | struct pcie_port { | 18 | struct pcie_port { |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 168eeacaa4c0..7b11e552bc5a 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
@@ -26,9 +26,10 @@ | |||
26 | #include <asm/mach/time.h> | 26 | #include <asm/mach/time.h> |
27 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
28 | #include <mach/orion5x.h> | 28 | #include <mach/orion5x.h> |
29 | #include <asm/plat-orion/ehci-orion.h> | 29 | #include <plat/ehci-orion.h> |
30 | #include <asm/plat-orion/orion_nand.h> | 30 | #include <plat/mv_xor.h> |
31 | #include <asm/plat-orion/time.h> | 31 | #include <plat/orion_nand.h> |
32 | #include <plat/time.h> | ||
32 | #include "common.h" | 33 | #include "common.h" |
33 | 34 | ||
34 | /***************************************************************************** | 35 | /***************************************************************************** |
@@ -355,6 +356,103 @@ void __init orion5x_uart1_init(void) | |||
355 | 356 | ||
356 | 357 | ||
357 | /***************************************************************************** | 358 | /***************************************************************************** |
359 | * XOR engine | ||
360 | ****************************************************************************/ | ||
361 | static struct resource orion5x_xor_shared_resources[] = { | ||
362 | { | ||
363 | .name = "xor low", | ||
364 | .start = ORION5X_XOR_PHYS_BASE, | ||
365 | .end = ORION5X_XOR_PHYS_BASE + 0xff, | ||
366 | .flags = IORESOURCE_MEM, | ||
367 | }, { | ||
368 | .name = "xor high", | ||
369 | .start = ORION5X_XOR_PHYS_BASE + 0x200, | ||
370 | .end = ORION5X_XOR_PHYS_BASE + 0x2ff, | ||
371 | .flags = IORESOURCE_MEM, | ||
372 | }, | ||
373 | }; | ||
374 | |||
375 | static struct platform_device orion5x_xor_shared = { | ||
376 | .name = MV_XOR_SHARED_NAME, | ||
377 | .id = 0, | ||
378 | .num_resources = ARRAY_SIZE(orion5x_xor_shared_resources), | ||
379 | .resource = orion5x_xor_shared_resources, | ||
380 | }; | ||
381 | |||
382 | static u64 orion5x_xor_dmamask = DMA_32BIT_MASK; | ||
383 | |||
384 | static struct resource orion5x_xor0_resources[] = { | ||
385 | [0] = { | ||
386 | .start = IRQ_ORION5X_XOR0, | ||
387 | .end = IRQ_ORION5X_XOR0, | ||
388 | .flags = IORESOURCE_IRQ, | ||
389 | }, | ||
390 | }; | ||
391 | |||
392 | static struct mv_xor_platform_data orion5x_xor0_data = { | ||
393 | .shared = &orion5x_xor_shared, | ||
394 | .hw_id = 0, | ||
395 | .pool_size = PAGE_SIZE, | ||
396 | }; | ||
397 | |||
398 | static struct platform_device orion5x_xor0_channel = { | ||
399 | .name = MV_XOR_NAME, | ||
400 | .id = 0, | ||
401 | .num_resources = ARRAY_SIZE(orion5x_xor0_resources), | ||
402 | .resource = orion5x_xor0_resources, | ||
403 | .dev = { | ||
404 | .dma_mask = &orion5x_xor_dmamask, | ||
405 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
406 | .platform_data = (void *)&orion5x_xor0_data, | ||
407 | }, | ||
408 | }; | ||
409 | |||
410 | static struct resource orion5x_xor1_resources[] = { | ||
411 | [0] = { | ||
412 | .start = IRQ_ORION5X_XOR1, | ||
413 | .end = IRQ_ORION5X_XOR1, | ||
414 | .flags = IORESOURCE_IRQ, | ||
415 | }, | ||
416 | }; | ||
417 | |||
418 | static struct mv_xor_platform_data orion5x_xor1_data = { | ||
419 | .shared = &orion5x_xor_shared, | ||
420 | .hw_id = 1, | ||
421 | .pool_size = PAGE_SIZE, | ||
422 | }; | ||
423 | |||
424 | static struct platform_device orion5x_xor1_channel = { | ||
425 | .name = MV_XOR_NAME, | ||
426 | .id = 1, | ||
427 | .num_resources = ARRAY_SIZE(orion5x_xor1_resources), | ||
428 | .resource = orion5x_xor1_resources, | ||
429 | .dev = { | ||
430 | .dma_mask = &orion5x_xor_dmamask, | ||
431 | .coherent_dma_mask = DMA_64BIT_MASK, | ||
432 | .platform_data = (void *)&orion5x_xor1_data, | ||
433 | }, | ||
434 | }; | ||
435 | |||
436 | void __init orion5x_xor_init(void) | ||
437 | { | ||
438 | platform_device_register(&orion5x_xor_shared); | ||
439 | |||
440 | /* | ||
441 | * two engines can't do memset simultaneously, this limitation | ||
442 | * satisfied by removing memset support from one of the engines. | ||
443 | */ | ||
444 | dma_cap_set(DMA_MEMCPY, orion5x_xor0_data.cap_mask); | ||
445 | dma_cap_set(DMA_XOR, orion5x_xor0_data.cap_mask); | ||
446 | platform_device_register(&orion5x_xor0_channel); | ||
447 | |||
448 | dma_cap_set(DMA_MEMCPY, orion5x_xor1_data.cap_mask); | ||
449 | dma_cap_set(DMA_MEMSET, orion5x_xor1_data.cap_mask); | ||
450 | dma_cap_set(DMA_XOR, orion5x_xor1_data.cap_mask); | ||
451 | platform_device_register(&orion5x_xor1_channel); | ||
452 | } | ||
453 | |||
454 | |||
455 | /***************************************************************************** | ||
358 | * Time handling | 456 | * Time handling |
359 | ****************************************************************************/ | 457 | ****************************************************************************/ |
360 | static void orion5x_timer_init(void) | 458 | static void orion5x_timer_init(void) |
@@ -382,6 +480,8 @@ static void __init orion5x_id(u32 *dev, u32 *rev, char **dev_name) | |||
382 | *dev_name = "MV88F5281-D2"; | 480 | *dev_name = "MV88F5281-D2"; |
383 | } else if (*rev == MV88F5281_REV_D1) { | 481 | } else if (*rev == MV88F5281_REV_D1) { |
384 | *dev_name = "MV88F5281-D1"; | 482 | *dev_name = "MV88F5281-D1"; |
483 | } else if (*rev == MV88F5281_REV_D0) { | ||
484 | *dev_name = "MV88F5281-D0"; | ||
385 | } else { | 485 | } else { |
386 | *dev_name = "MV88F5281-Rev-Unsupported"; | 486 | *dev_name = "MV88F5281-Rev-Unsupported"; |
387 | } | 487 | } |
@@ -416,6 +516,15 @@ void __init orion5x_init(void) | |||
416 | * Setup Orion address map | 516 | * Setup Orion address map |
417 | */ | 517 | */ |
418 | orion5x_setup_cpu_mbus_bridge(); | 518 | orion5x_setup_cpu_mbus_bridge(); |
519 | |||
520 | /* | ||
521 | * Don't issue "Wait for Interrupt" instruction if we are | ||
522 | * running on D0 5281 silicon. | ||
523 | */ | ||
524 | if (dev == MV88F5281_DEV_ID && rev == MV88F5281_REV_D0) { | ||
525 | printk(KERN_INFO "Orion: Applying 5281 D0 WFI workaround.\n"); | ||
526 | disable_hlt(); | ||
527 | } | ||
419 | } | 528 | } |
420 | 529 | ||
421 | /* | 530 | /* |
diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h index f72cf0e77544..e75bd7004b94 100644 --- a/arch/arm/mach-orion5x/common.h +++ b/arch/arm/mach-orion5x/common.h | |||
@@ -32,6 +32,7 @@ void orion5x_i2c_init(void); | |||
32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); | 32 | void orion5x_sata_init(struct mv_sata_platform_data *sata_data); |
33 | void orion5x_uart0_init(void); | 33 | void orion5x_uart0_init(void); |
34 | void orion5x_uart1_init(void); | 34 | void orion5x_uart1_init(void); |
35 | void orion5x_xor_init(void); | ||
35 | 36 | ||
36 | /* | 37 | /* |
37 | * PCIe/PCI functions. | 38 | * PCIe/PCI functions. |
diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index 48ce6d0e0020..ff13e9060b18 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
27 | #include <mach/orion5x.h> | 27 | #include <mach/orion5x.h> |
28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <plat/orion_nand.h> |
29 | #include "common.h" | 29 | #include "common.h" |
30 | #include "mpp.h" | 30 | #include "mpp.h" |
31 | 31 | ||
diff --git a/arch/arm/mach-orion5x/include/mach/orion5x.h b/arch/arm/mach-orion5x/include/mach/orion5x.h index f52a7d65bec2..61eb74a88862 100644 --- a/arch/arm/mach-orion5x/include/mach/orion5x.h +++ b/arch/arm/mach-orion5x/include/mach/orion5x.h | |||
@@ -73,6 +73,7 @@ | |||
73 | #define MV88F5182_REV_A2 2 | 73 | #define MV88F5182_REV_A2 2 |
74 | /* Orion-2 (88F5281) */ | 74 | /* Orion-2 (88F5281) */ |
75 | #define MV88F5281_DEV_ID 0x5281 | 75 | #define MV88F5281_DEV_ID 0x5281 |
76 | #define MV88F5281_REV_D0 4 | ||
76 | #define MV88F5281_REV_D1 5 | 77 | #define MV88F5281_REV_D1 5 |
77 | #define MV88F5281_REV_D2 6 | 78 | #define MV88F5281_REV_D2 6 |
78 | 79 | ||
@@ -105,6 +106,10 @@ | |||
105 | #define ORION5X_USB0_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x50000) | 106 | #define ORION5X_USB0_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x50000) |
106 | #define ORION5X_USB0_REG(x) (ORION5X_USB0_VIRT_BASE | (x)) | 107 | #define ORION5X_USB0_REG(x) (ORION5X_USB0_VIRT_BASE | (x)) |
107 | 108 | ||
109 | #define ORION5X_XOR_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x60900) | ||
110 | #define ORION5X_XOR_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x60900) | ||
111 | #define ORION5X_XOR_REG(x) (ORION5X_XOR_VIRT_BASE | (x)) | ||
112 | |||
108 | #define ORION5X_ETH_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x70000) | 113 | #define ORION5X_ETH_PHYS_BASE (ORION5X_REGS_PHYS_BASE | 0x70000) |
109 | #define ORION5X_ETH_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x70000) | 114 | #define ORION5X_ETH_VIRT_BASE (ORION5X_REGS_VIRT_BASE | 0x70000) |
110 | #define ORION5X_ETH_REG(x) (ORION5X_ETH_VIRT_BASE | (x)) | 115 | #define ORION5X_ETH_REG(x) (ORION5X_ETH_VIRT_BASE | (x)) |
diff --git a/arch/arm/mach-orion5x/irq.c b/arch/arm/mach-orion5x/irq.c index cc2a017fd2a9..2545ff9e5830 100644 --- a/arch/arm/mach-orion5x/irq.c +++ b/arch/arm/mach-orion5x/irq.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <asm/gpio.h> | 16 | #include <asm/gpio.h> |
17 | #include <asm/io.h> | 17 | #include <asm/io.h> |
18 | #include <mach/orion5x.h> | 18 | #include <mach/orion5x.h> |
19 | #include <asm/plat-orion/irq.h> | 19 | #include <plat/irq.h> |
20 | #include "common.h" | 20 | #include "common.h" |
21 | 21 | ||
22 | /***************************************************************************** | 22 | /***************************************************************************** |
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 0caaaac74bc1..cb72f1bb9cb7 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <asm/mach/arch.h> | 25 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/pci.h> | 26 | #include <asm/mach/pci.h> |
27 | #include <mach/orion5x.h> | 27 | #include <mach/orion5x.h> |
28 | #include <asm/plat-orion/orion_nand.h> | 28 | #include <plat/orion_nand.h> |
29 | #include "common.h" | 29 | #include "common.h" |
30 | #include "mpp.h" | 30 | #include "mpp.h" |
31 | 31 | ||
@@ -356,6 +356,7 @@ static void __init kurobox_pro_init(void) | |||
356 | orion5x_sata_init(&kurobox_pro_sata_data); | 356 | orion5x_sata_init(&kurobox_pro_sata_data); |
357 | orion5x_uart0_init(); | 357 | orion5x_uart0_init(); |
358 | orion5x_uart1_init(); | 358 | orion5x_uart1_init(); |
359 | orion5x_xor_init(); | ||
359 | 360 | ||
360 | orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, | 361 | orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE, |
361 | KUROBOX_PRO_NOR_BOOT_SIZE); | 362 | KUROBOX_PRO_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/mss2-setup.c b/arch/arm/mach-orion5x/mss2-setup.c index 4403cc963d66..53ff1893b883 100644 --- a/arch/arm/mach-orion5x/mss2-setup.c +++ b/arch/arm/mach-orion5x/mss2-setup.c | |||
@@ -239,6 +239,7 @@ static void __init mss2_init(void) | |||
239 | orion5x_i2c_init(); | 239 | orion5x_i2c_init(); |
240 | orion5x_sata_init(&mss2_sata_data); | 240 | orion5x_sata_init(&mss2_sata_data); |
241 | orion5x_uart0_init(); | 241 | orion5x_uart0_init(); |
242 | orion5x_xor_init(); | ||
242 | 243 | ||
243 | orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE); | 244 | orion5x_setup_dev_boot_win(MSS2_NOR_BOOT_BASE, MSS2_NOR_BOOT_SIZE); |
244 | platform_device_register(&mss2_nor_flash); | 245 | platform_device_register(&mss2_nor_flash); |
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c index 67b2c0df615f..978d4d599396 100644 --- a/arch/arm/mach-orion5x/mv2120-setup.c +++ b/arch/arm/mach-orion5x/mv2120-setup.c | |||
@@ -203,6 +203,7 @@ static void __init mv2120_init(void) | |||
203 | orion5x_i2c_init(); | 203 | orion5x_i2c_init(); |
204 | orion5x_sata_init(&mv2120_sata_data); | 204 | orion5x_sata_init(&mv2120_sata_data); |
205 | orion5x_uart0_init(); | 205 | orion5x_uart0_init(); |
206 | orion5x_xor_init(); | ||
206 | 207 | ||
207 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); | 208 | orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE); |
208 | platform_device_register(&mv2120_nor_flash); | 209 | platform_device_register(&mv2120_nor_flash); |
diff --git a/arch/arm/mach-orion5x/pci.c b/arch/arm/mach-orion5x/pci.c index 256a4f680935..fbceecc4b7ec 100644 --- a/arch/arm/mach-orion5x/pci.c +++ b/arch/arm/mach-orion5x/pci.c | |||
@@ -14,7 +14,7 @@ | |||
14 | #include <linux/pci.h> | 14 | #include <linux/pci.h> |
15 | #include <linux/mbus.h> | 15 | #include <linux/mbus.h> |
16 | #include <asm/mach/pci.h> | 16 | #include <asm/mach/pci.h> |
17 | #include <asm/plat-orion/pcie.h> | 17 | #include <plat/pcie.h> |
18 | #include "common.h" | 18 | #include "common.h" |
19 | 19 | ||
20 | /***************************************************************************** | 20 | /***************************************************************************** |
diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index 8771cb76f0dc..4c3bcd76ac85 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c | |||
@@ -292,6 +292,7 @@ static void __init rd88f5182_init(void) | |||
292 | orion5x_i2c_init(); | 292 | orion5x_i2c_init(); |
293 | orion5x_sata_init(&rd88f5182_sata_data); | 293 | orion5x_sata_init(&rd88f5182_sata_data); |
294 | orion5x_uart0_init(); | 294 | orion5x_uart0_init(); |
295 | orion5x_xor_init(); | ||
295 | 296 | ||
296 | orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE, | 297 | orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE, |
297 | RD88F5182_NOR_BOOT_SIZE); | 298 | RD88F5182_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 809132de31d2..dd657163cd8d 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c | |||
@@ -207,12 +207,12 @@ static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = { | |||
207 | 207 | ||
208 | static struct gpio_keys_button qnap_ts209_buttons[] = { | 208 | static struct gpio_keys_button qnap_ts209_buttons[] = { |
209 | { | 209 | { |
210 | .code = KEY_RESTART, | 210 | .code = KEY_COPY, |
211 | .gpio = QNAP_TS209_GPIO_KEY_MEDIA, | 211 | .gpio = QNAP_TS209_GPIO_KEY_MEDIA, |
212 | .desc = "USB Copy Button", | 212 | .desc = "USB Copy Button", |
213 | .active_low = 1, | 213 | .active_low = 1, |
214 | }, { | 214 | }, { |
215 | .code = KEY_POWER, | 215 | .code = KEY_RESTART, |
216 | .gpio = QNAP_TS209_GPIO_KEY_RESET, | 216 | .gpio = QNAP_TS209_GPIO_KEY_RESET, |
217 | .desc = "Reset Button", | 217 | .desc = "Reset Button", |
218 | .active_low = 1, | 218 | .active_low = 1, |
@@ -296,6 +296,7 @@ static void __init qnap_ts209_init(void) | |||
296 | orion5x_i2c_init(); | 296 | orion5x_i2c_init(); |
297 | orion5x_sata_init(&qnap_ts209_sata_data); | 297 | orion5x_sata_init(&qnap_ts209_sata_data); |
298 | orion5x_uart0_init(); | 298 | orion5x_uart0_init(); |
299 | orion5x_xor_init(); | ||
299 | 300 | ||
300 | orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE, | 301 | orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE, |
301 | QNAP_TS209_NOR_BOOT_SIZE); | 302 | QNAP_TS209_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c index 6053e76ac967..b27d2b762081 100644 --- a/arch/arm/mach-orion5x/ts409-setup.c +++ b/arch/arm/mach-orion5x/ts409-setup.c | |||
@@ -3,6 +3,9 @@ | |||
3 | * | 3 | * |
4 | * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> | 4 | * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com> |
5 | * | 5 | * |
6 | * Copyright (C) 2008 Sylver Bruneau <sylver.bruneau@gmail.com> | ||
7 | * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com> | ||
8 | * | ||
6 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
8 | * as published by the Free Software Foundation; either version | 11 | * as published by the Free Software Foundation; either version |
@@ -16,6 +19,7 @@ | |||
16 | #include <linux/irq.h> | 19 | #include <linux/irq.h> |
17 | #include <linux/mtd/physmap.h> | 20 | #include <linux/mtd/physmap.h> |
18 | #include <linux/mv643xx_eth.h> | 21 | #include <linux/mv643xx_eth.h> |
22 | #include <linux/leds.h> | ||
19 | #include <linux/gpio_keys.h> | 23 | #include <linux/gpio_keys.h> |
20 | #include <linux/input.h> | 24 | #include <linux/input.h> |
21 | #include <linux/i2c.h> | 25 | #include <linux/i2c.h> |
@@ -162,16 +166,59 @@ static struct i2c_board_info __initdata qnap_ts409_i2c_rtc = { | |||
162 | I2C_BOARD_INFO("s35390a", 0x30), | 166 | I2C_BOARD_INFO("s35390a", 0x30), |
163 | }; | 167 | }; |
164 | 168 | ||
169 | /***************************************************************************** | ||
170 | * LEDs attached to GPIO | ||
171 | ****************************************************************************/ | ||
172 | |||
173 | static struct gpio_led ts409_led_pins[] = { | ||
174 | { | ||
175 | .name = "ts409:red:sata1", | ||
176 | .gpio = 4, | ||
177 | .active_low = 1, | ||
178 | }, { | ||
179 | .name = "ts409:red:sata2", | ||
180 | .gpio = 5, | ||
181 | .active_low = 1, | ||
182 | }, { | ||
183 | .name = "ts409:red:sata3", | ||
184 | .gpio = 6, | ||
185 | .active_low = 1, | ||
186 | }, { | ||
187 | .name = "ts409:red:sata4", | ||
188 | .gpio = 7, | ||
189 | .active_low = 1, | ||
190 | }, | ||
191 | }; | ||
192 | |||
193 | static struct gpio_led_platform_data ts409_led_data = { | ||
194 | .leds = ts409_led_pins, | ||
195 | .num_leds = ARRAY_SIZE(ts409_led_pins), | ||
196 | }; | ||
197 | |||
198 | static struct platform_device ts409_leds = { | ||
199 | .name = "leds-gpio", | ||
200 | .id = -1, | ||
201 | .dev = { | ||
202 | .platform_data = &ts409_led_data, | ||
203 | }, | ||
204 | }; | ||
205 | |||
165 | /**************************************************************************** | 206 | /**************************************************************************** |
166 | * GPIO Attached Keys | 207 | * GPIO Attached Keys |
167 | * Power button is attached to the PIC microcontroller | 208 | * Power button is attached to the PIC microcontroller |
168 | ****************************************************************************/ | 209 | ****************************************************************************/ |
169 | 210 | ||
211 | #define QNAP_TS409_GPIO_KEY_RESET 14 | ||
170 | #define QNAP_TS409_GPIO_KEY_MEDIA 15 | 212 | #define QNAP_TS409_GPIO_KEY_MEDIA 15 |
171 | 213 | ||
172 | static struct gpio_keys_button qnap_ts409_buttons[] = { | 214 | static struct gpio_keys_button qnap_ts409_buttons[] = { |
173 | { | 215 | { |
174 | .code = KEY_RESTART, | 216 | .code = KEY_RESTART, |
217 | .gpio = QNAP_TS409_GPIO_KEY_RESET, | ||
218 | .desc = "Reset Button", | ||
219 | .active_low = 1, | ||
220 | }, { | ||
221 | .code = KEY_COPY, | ||
175 | .gpio = QNAP_TS409_GPIO_KEY_MEDIA, | 222 | .gpio = QNAP_TS409_GPIO_KEY_MEDIA, |
176 | .desc = "USB Copy Button", | 223 | .desc = "USB Copy Button", |
177 | .active_low = 1, | 224 | .active_low = 1, |
@@ -255,6 +302,7 @@ static void __init qnap_ts409_init(void) | |||
255 | if (qnap_ts409_i2c_rtc.irq == 0) | 302 | if (qnap_ts409_i2c_rtc.irq == 0) |
256 | pr_warning("qnap_ts409_init: failed to get RTC IRQ\n"); | 303 | pr_warning("qnap_ts409_init: failed to get RTC IRQ\n"); |
257 | i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1); | 304 | i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1); |
305 | platform_device_register(&ts409_leds); | ||
258 | 306 | ||
259 | /* register tsx09 specific power-off method */ | 307 | /* register tsx09 specific power-off method */ |
260 | pm_power_off = qnap_tsx09_power_off; | 308 | pm_power_off = qnap_tsx09_power_off; |
diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c index 014916a28fdc..ae0a5dccd2a1 100644 --- a/arch/arm/mach-orion5x/ts78xx-setup.c +++ b/arch/arm/mach-orion5x/ts78xx-setup.c | |||
@@ -256,6 +256,7 @@ static void __init ts78xx_init(void) | |||
256 | orion5x_sata_init(&ts78xx_sata_data); | 256 | orion5x_sata_init(&ts78xx_sata_data); |
257 | orion5x_uart0_init(); | 257 | orion5x_uart0_init(); |
258 | orion5x_uart1_init(); | 258 | orion5x_uart1_init(); |
259 | orion5x_xor_init(); | ||
259 | 260 | ||
260 | orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE, | 261 | orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE, |
261 | TS78XX_NOR_BOOT_SIZE); | 262 | TS78XX_NOR_BOOT_SIZE); |
diff --git a/arch/arm/mach-pxa/clock.c b/arch/arm/mach-pxa/clock.c index c01eea88f787..ca8e20538157 100644 --- a/arch/arm/mach-pxa/clock.c +++ b/arch/arm/mach-pxa/clock.c | |||
@@ -125,3 +125,28 @@ void clks_register(struct clk *clks, size_t num) | |||
125 | list_add(&clks[i].node, &clocks); | 125 | list_add(&clks[i].node, &clocks); |
126 | mutex_unlock(&clocks_mutex); | 126 | mutex_unlock(&clocks_mutex); |
127 | } | 127 | } |
128 | |||
129 | int clk_add_alias(char *alias, struct device *alias_dev, char *id, | ||
130 | struct device *dev) | ||
131 | { | ||
132 | struct clk *r = clk_lookup(dev, id); | ||
133 | struct clk *new; | ||
134 | |||
135 | if (!r) | ||
136 | return -ENODEV; | ||
137 | |||
138 | new = kzalloc(sizeof(struct clk), GFP_KERNEL); | ||
139 | |||
140 | if (!new) | ||
141 | return -ENOMEM; | ||
142 | |||
143 | new->name = alias; | ||
144 | new->dev = alias_dev; | ||
145 | new->other = r; | ||
146 | |||
147 | mutex_lock(&clocks_mutex); | ||
148 | list_add(&new->node, &clocks); | ||
149 | mutex_unlock(&clocks_mutex); | ||
150 | |||
151 | return 0; | ||
152 | } | ||
diff --git a/arch/arm/mach-pxa/clock.h b/arch/arm/mach-pxa/clock.h index 1ec8f9178aaf..73be795fe3bf 100644 --- a/arch/arm/mach-pxa/clock.h +++ b/arch/arm/mach-pxa/clock.h | |||
@@ -1,3 +1,5 @@ | |||
1 | #include <linux/list.h> | ||
2 | |||
1 | struct clk; | 3 | struct clk; |
2 | 4 | ||
3 | struct clkops { | 5 | struct clkops { |
@@ -86,3 +88,6 @@ extern void clk_pxa3xx_cken_disable(struct clk *); | |||
86 | #endif | 88 | #endif |
87 | 89 | ||
88 | void clks_register(struct clk *clks, size_t num); | 90 | void clks_register(struct clk *clks, size_t num); |
91 | int clk_add_alias(char *alias, struct device *alias_dev, char *id, | ||
92 | struct device *dev); | ||
93 | |||
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c index 03942450885b..001a252bd514 100644 --- a/arch/arm/mach-pxa/eseries.c +++ b/arch/arm/mach-pxa/eseries.c | |||
@@ -10,18 +10,78 @@ | |||
10 | * | 10 | * |
11 | */ | 11 | */ |
12 | 12 | ||
13 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | 14 | #include <linux/init.h> |
14 | 15 | ||
15 | #include <asm/setup.h> | 16 | #include <asm/setup.h> |
16 | #include <asm/mach/arch.h> | 17 | #include <asm/mach/arch.h> |
17 | #include <mach/hardware.h> | ||
18 | #include <asm/mach-types.h> | 18 | #include <asm/mach-types.h> |
19 | 19 | ||
20 | #include <mach/mfp-pxa25x.h> | ||
21 | #include <mach/hardware.h> | ||
22 | |||
20 | #include "generic.h" | 23 | #include "generic.h" |
21 | 24 | ||
25 | static unsigned long e740_pin_config[] __initdata = { | ||
26 | /* Chip selects */ | ||
27 | GPIO15_nCS_1, /* CS1 - Flash */ | ||
28 | GPIO79_nCS_3, /* CS3 - IMAGEON */ | ||
29 | GPIO80_nCS_4, /* CS4 - TMIO */ | ||
30 | |||
31 | /* Clocks */ | ||
32 | GPIO12_32KHz, | ||
33 | |||
34 | /* BTUART */ | ||
35 | GPIO42_BTUART_RXD, | ||
36 | GPIO43_BTUART_TXD, | ||
37 | GPIO44_BTUART_CTS, | ||
38 | GPIO45_GPIO, /* Used by TMIO for #SUSPEND */ | ||
39 | |||
40 | /* PC Card */ | ||
41 | GPIO8_GPIO, /* CD0 */ | ||
42 | GPIO44_GPIO, /* CD1 */ | ||
43 | GPIO11_GPIO, /* IRQ0 */ | ||
44 | GPIO6_GPIO, /* IRQ1 */ | ||
45 | GPIO27_GPIO, /* RST0 */ | ||
46 | GPIO24_GPIO, /* RST1 */ | ||
47 | GPIO20_GPIO, /* PWR0 */ | ||
48 | GPIO23_GPIO, /* PWR1 */ | ||
49 | GPIO48_nPOE, | ||
50 | GPIO49_nPWE, | ||
51 | GPIO50_nPIOR, | ||
52 | GPIO51_nPIOW, | ||
53 | GPIO52_nPCE_1, | ||
54 | GPIO53_nPCE_2, | ||
55 | GPIO54_nPSKTSEL, | ||
56 | GPIO55_nPREG, | ||
57 | GPIO56_nPWAIT, | ||
58 | GPIO57_nIOIS16, | ||
59 | |||
60 | /* wakeup */ | ||
61 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | ||
62 | }; | ||
63 | |||
64 | static unsigned long e400_pin_config[] __initdata = { | ||
65 | /* Chip selects */ | ||
66 | GPIO15_nCS_1, /* CS1 - Flash */ | ||
67 | GPIO80_nCS_4, /* CS4 - TMIO */ | ||
68 | |||
69 | /* Clocks */ | ||
70 | GPIO12_32KHz, | ||
71 | |||
72 | /* BTUART */ | ||
73 | GPIO42_BTUART_RXD, | ||
74 | GPIO43_BTUART_TXD, | ||
75 | GPIO44_BTUART_CTS, | ||
76 | GPIO45_GPIO, /* Used by TMIO for #SUSPEND */ | ||
77 | |||
78 | /* wakeup */ | ||
79 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | ||
80 | }; | ||
81 | |||
22 | /* Only e800 has 128MB RAM */ | 82 | /* Only e800 has 128MB RAM */ |
23 | static void __init eseries_fixup(struct machine_desc *desc, | 83 | static void __init eseries_fixup(struct machine_desc *desc, |
24 | struct tag *tags, char **cmdline, struct meminfo *mi) | 84 | struct tag *tags, char **cmdline, struct meminfo *mi) |
25 | { | 85 | { |
26 | mi->nr_banks=1; | 86 | mi->nr_banks=1; |
27 | mi->bank[0].start = 0xa0000000; | 87 | mi->bank[0].start = 0xa0000000; |
@@ -32,83 +92,95 @@ static void __init eseries_fixup(struct machine_desc *desc, | |||
32 | mi->bank[0].size = (64*1024*1024); | 92 | mi->bank[0].size = (64*1024*1024); |
33 | } | 93 | } |
34 | 94 | ||
95 | static void __init e740_init(void) | ||
96 | { | ||
97 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config)); | ||
98 | } | ||
99 | |||
100 | static void __init e400_init(void) | ||
101 | { | ||
102 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config)); | ||
103 | } | ||
104 | |||
35 | /* e-series machine definitions */ | 105 | /* e-series machine definitions */ |
36 | 106 | ||
37 | #ifdef CONFIG_MACH_E330 | 107 | #ifdef CONFIG_MACH_E330 |
38 | MACHINE_START(E330, "Toshiba e330") | 108 | MACHINE_START(E330, "Toshiba e330") |
39 | /* Maintainer: Ian Molton (spyro@f2s.com) */ | 109 | /* Maintainer: Ian Molton (spyro@f2s.com) */ |
40 | .phys_io = 0x40000000, | 110 | .phys_io = 0x40000000, |
41 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 111 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
42 | .boot_params = 0xa0000100, | 112 | .boot_params = 0xa0000100, |
43 | .map_io = pxa_map_io, | 113 | .map_io = pxa_map_io, |
44 | .init_irq = pxa25x_init_irq, | 114 | .init_irq = pxa25x_init_irq, |
45 | .fixup = eseries_fixup, | 115 | .fixup = eseries_fixup, |
46 | .timer = &pxa_timer, | 116 | .timer = &pxa_timer, |
47 | MACHINE_END | 117 | MACHINE_END |
48 | #endif | 118 | #endif |
49 | 119 | ||
50 | #ifdef CONFIG_MACH_E350 | 120 | #ifdef CONFIG_MACH_E350 |
51 | MACHINE_START(E350, "Toshiba e350") | 121 | MACHINE_START(E350, "Toshiba e350") |
52 | /* Maintainer: Ian Molton (spyro@f2s.com) */ | 122 | /* Maintainer: Ian Molton (spyro@f2s.com) */ |
53 | .phys_io = 0x40000000, | 123 | .phys_io = 0x40000000, |
54 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 124 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
55 | .boot_params = 0xa0000100, | 125 | .boot_params = 0xa0000100, |
56 | .map_io = pxa_map_io, | 126 | .map_io = pxa_map_io, |
57 | .init_irq = pxa25x_init_irq, | 127 | .init_irq = pxa25x_init_irq, |
58 | .fixup = eseries_fixup, | 128 | .fixup = eseries_fixup, |
59 | .timer = &pxa_timer, | 129 | .timer = &pxa_timer, |
60 | MACHINE_END | 130 | MACHINE_END |
61 | #endif | 131 | #endif |
62 | 132 | ||
63 | #ifdef CONFIG_MACH_E740 | 133 | #ifdef CONFIG_MACH_E740 |
64 | MACHINE_START(E740, "Toshiba e740") | 134 | MACHINE_START(E740, "Toshiba e740") |
65 | /* Maintainer: Ian Molton (spyro@f2s.com) */ | 135 | /* Maintainer: Ian Molton (spyro@f2s.com) */ |
66 | .phys_io = 0x40000000, | 136 | .phys_io = 0x40000000, |
67 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 137 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
68 | .boot_params = 0xa0000100, | 138 | .boot_params = 0xa0000100, |
69 | .map_io = pxa_map_io, | 139 | .map_io = pxa_map_io, |
70 | .init_irq = pxa25x_init_irq, | 140 | .init_irq = pxa25x_init_irq, |
71 | .fixup = eseries_fixup, | 141 | .fixup = eseries_fixup, |
72 | .timer = &pxa_timer, | 142 | .init_machine = e740_init, |
143 | .timer = &pxa_timer, | ||
73 | MACHINE_END | 144 | MACHINE_END |
74 | #endif | 145 | #endif |
75 | 146 | ||
76 | #ifdef CONFIG_MACH_E750 | 147 | #ifdef CONFIG_MACH_E750 |
77 | MACHINE_START(E750, "Toshiba e750") | 148 | MACHINE_START(E750, "Toshiba e750") |
78 | /* Maintainer: Ian Molton (spyro@f2s.com) */ | 149 | /* Maintainer: Ian Molton (spyro@f2s.com) */ |
79 | .phys_io = 0x40000000, | 150 | .phys_io = 0x40000000, |
80 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 151 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
81 | .boot_params = 0xa0000100, | 152 | .boot_params = 0xa0000100, |
82 | .map_io = pxa_map_io, | 153 | .map_io = pxa_map_io, |
83 | .init_irq = pxa25x_init_irq, | 154 | .init_irq = pxa25x_init_irq, |
84 | .fixup = eseries_fixup, | 155 | .fixup = eseries_fixup, |
85 | .timer = &pxa_timer, | 156 | .timer = &pxa_timer, |
86 | MACHINE_END | 157 | MACHINE_END |
87 | #endif | 158 | #endif |
88 | 159 | ||
89 | #ifdef CONFIG_MACH_E400 | 160 | #ifdef CONFIG_MACH_E400 |
90 | MACHINE_START(E400, "Toshiba e400") | 161 | MACHINE_START(E400, "Toshiba e400") |
91 | /* Maintainer: Ian Molton (spyro@f2s.com) */ | 162 | /* Maintainer: Ian Molton (spyro@f2s.com) */ |
92 | .phys_io = 0x40000000, | 163 | .phys_io = 0x40000000, |
93 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 164 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
94 | .boot_params = 0xa0000100, | 165 | .boot_params = 0xa0000100, |
95 | .map_io = pxa_map_io, | 166 | .map_io = pxa_map_io, |
96 | .init_irq = pxa25x_init_irq, | 167 | .init_irq = pxa25x_init_irq, |
97 | .fixup = eseries_fixup, | 168 | .fixup = eseries_fixup, |
98 | .timer = &pxa_timer, | 169 | .init_machine = e400_init, |
170 | .timer = &pxa_timer, | ||
99 | MACHINE_END | 171 | MACHINE_END |
100 | #endif | 172 | #endif |
101 | 173 | ||
102 | #ifdef CONFIG_MACH_E800 | 174 | #ifdef CONFIG_MACH_E800 |
103 | MACHINE_START(E800, "Toshiba e800") | 175 | MACHINE_START(E800, "Toshiba e800") |
104 | /* Maintainer: Ian Molton (spyro@f2s.com) */ | 176 | /* Maintainer: Ian Molton (spyro@f2s.com) */ |
105 | .phys_io = 0x40000000, | 177 | .phys_io = 0x40000000, |
106 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 178 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
107 | .boot_params = 0xa0000100, | 179 | .boot_params = 0xa0000100, |
108 | .map_io = pxa_map_io, | 180 | .map_io = pxa_map_io, |
109 | .init_irq = pxa25x_init_irq, | 181 | .init_irq = pxa25x_init_irq, |
110 | .fixup = eseries_fixup, | 182 | .fixup = eseries_fixup, |
111 | .timer = &pxa_timer, | 183 | .timer = &pxa_timer, |
112 | MACHINE_END | 184 | MACHINE_END |
113 | #endif | 185 | #endif |
114 | 186 | ||
diff --git a/arch/arm/mach-pxa/include/mach/irqs.h b/arch/arm/mach-pxa/include/mach/irqs.h index 32772bc6925c..108b5db9b2af 100644 --- a/arch/arm/mach-pxa/include/mach/irqs.h +++ b/arch/arm/mach-pxa/include/mach/irqs.h | |||
@@ -183,6 +183,7 @@ | |||
183 | defined(CONFIG_MACH_TOSA) || \ | 183 | defined(CONFIG_MACH_TOSA) || \ |
184 | defined(CONFIG_MACH_MAINSTONE) || \ | 184 | defined(CONFIG_MACH_MAINSTONE) || \ |
185 | defined(CONFIG_MACH_PCM027) || \ | 185 | defined(CONFIG_MACH_PCM027) || \ |
186 | defined(CONFIG_ARCH_PXA_ESERIES) || \ | ||
186 | defined(CONFIG_MACH_MAGICIAN) | 187 | defined(CONFIG_MACH_MAGICIAN) |
187 | #define NR_IRQS (IRQ_BOARD_END) | 188 | #define NR_IRQS (IRQ_BOARD_END) |
188 | #elif defined(CONFIG_MACH_ZYLONITE) | 189 | #elif defined(CONFIG_MACH_ZYLONITE) |
diff --git a/arch/arm/mach-pxa/include/mach/mtd-xip.h b/arch/arm/mach-pxa/include/mach/mtd-xip.h index 351f32f13ce4..4d452fcb1508 100644 --- a/arch/arm/mach-pxa/include/mach/mtd-xip.h +++ b/arch/arm/mach-pxa/include/mach/mtd-xip.h | |||
@@ -10,8 +10,6 @@ | |||
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | ||
14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
15 | */ | 13 | */ |
16 | 14 | ||
17 | #ifndef __ARCH_PXA_MTD_XIP_H__ | 15 | #ifndef __ARCH_PXA_MTD_XIP_H__ |
diff --git a/arch/arm/mach-pxa/include/mach/poodle.h b/arch/arm/mach-pxa/include/mach/poodle.h index 8956afe8195e..67debc47e8c6 100644 --- a/arch/arm/mach-pxa/include/mach/poodle.h +++ b/arch/arm/mach-pxa/include/mach/poodle.h | |||
@@ -70,6 +70,12 @@ | |||
70 | #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) | 70 | #define POODLE_SCOOP_IO_DIR ( POODLE_SCOOP_VPEN | POODLE_SCOOP_HS_OUT ) |
71 | #define POODLE_SCOOP_IO_OUT ( 0 ) | 71 | #define POODLE_SCOOP_IO_OUT ( 0 ) |
72 | 72 | ||
73 | #define POODLE_LOCOMO_GPIO_AMP_ON LOCOMO_GPIO(8) | ||
74 | #define POODLE_LOCOMO_GPIO_MUTE_L LOCOMO_GPIO(10) | ||
75 | #define POODLE_LOCOMO_GPIO_MUTE_R LOCOMO_GPIO(11) | ||
76 | #define POODLE_LOCOMO_GPIO_232VCC_ON LOCOMO_GPIO(12) | ||
77 | #define POODLE_LOCOMO_GPIO_JK_B LOCOMO_GPIO(13) | ||
78 | |||
73 | extern struct platform_device poodle_locomo_device; | 79 | extern struct platform_device poodle_locomo_device; |
74 | 80 | ||
75 | #endif /* __ASM_ARCH_POODLE_H */ | 81 | #endif /* __ASM_ARCH_POODLE_H */ |
diff --git a/arch/arm/mach-pxa/include/mach/pxafb.h b/arch/arm/mach-pxa/include/mach/pxafb.h index 65447549616f..8e591118371e 100644 --- a/arch/arm/mach-pxa/include/mach/pxafb.h +++ b/arch/arm/mach-pxa/include/mach/pxafb.h | |||
@@ -28,6 +28,7 @@ | |||
28 | * bits 10-17 : for AC Bias Pin Frequency | 28 | * bits 10-17 : for AC Bias Pin Frequency |
29 | * bit 18 : for output enable polarity | 29 | * bit 18 : for output enable polarity |
30 | * bit 19 : for pixel clock edge | 30 | * bit 19 : for pixel clock edge |
31 | * bit 20 : for output pixel format when base is RGBT16 | ||
31 | */ | 32 | */ |
32 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) | 33 | #define LCD_CONN_TYPE(_x) ((_x) & 0x0f) |
33 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) | 34 | #define LCD_CONN_WIDTH(_x) (((_x) >> 4) & 0x1f) |
@@ -53,10 +54,11 @@ | |||
53 | #define LCD_SMART_PANEL_18BPP ((18 << 4) | LCD_TYPE_SMART_PANEL) | 54 | #define LCD_SMART_PANEL_18BPP ((18 << 4) | LCD_TYPE_SMART_PANEL) |
54 | 55 | ||
55 | #define LCD_AC_BIAS_FREQ(x) (((x) & 0xff) << 10) | 56 | #define LCD_AC_BIAS_FREQ(x) (((x) & 0xff) << 10) |
56 | #define LCD_BIAS_ACTIVE_HIGH (0 << 17) | 57 | #define LCD_BIAS_ACTIVE_HIGH (0 << 18) |
57 | #define LCD_BIAS_ACTIVE_LOW (1 << 17) | 58 | #define LCD_BIAS_ACTIVE_LOW (1 << 18) |
58 | #define LCD_PCLK_EDGE_RISE (0 << 18) | 59 | #define LCD_PCLK_EDGE_RISE (0 << 19) |
59 | #define LCD_PCLK_EDGE_FALL (1 << 18) | 60 | #define LCD_PCLK_EDGE_FALL (1 << 19) |
61 | #define LCD_ALTERNATE_MAPPING (1 << 20) | ||
60 | 62 | ||
61 | /* | 63 | /* |
62 | * This structure describes the machine which we are running on. | 64 | * This structure describes the machine which we are running on. |
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index bb9e09208b9f..4ffdff2d9ff1 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <mach/mmc.h> | 52 | #include <mach/mmc.h> |
53 | 53 | ||
54 | #include "generic.h" | 54 | #include "generic.h" |
55 | #include "clock.h" | ||
55 | #include "devices.h" | 56 | #include "devices.h" |
56 | 57 | ||
57 | static unsigned long lubbock_pin_config[] __initdata = { | 58 | static unsigned long lubbock_pin_config[] __initdata = { |
@@ -485,6 +486,7 @@ static void __init lubbock_init(void) | |||
485 | 486 | ||
486 | pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config)); | 487 | pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config)); |
487 | 488 | ||
489 | clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL); | ||
488 | pxa_set_udc_info(&udc_info); | 490 | pxa_set_udc_info(&udc_info); |
489 | set_pxa_fb_info(&sharp_lm8v31); | 491 | set_pxa_fb_info(&sharp_lm8v31); |
490 | pxa_set_mci_info(&lubbock_mci_platform_data); | 492 | pxa_set_mci_info(&lubbock_mci_platform_data); |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 9e5d8a8c6424..305452b56e91 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -166,8 +166,7 @@ static struct clk pxa25x_hwuart_clk = | |||
166 | ; | 166 | ; |
167 | 167 | ||
168 | /* | 168 | /* |
169 | * PXA 2xx clock declarations. Order is important (see aliases below) | 169 | * PXA 2xx clock declarations. |
170 | * Please be careful not to disrupt the ordering. | ||
171 | */ | 170 | */ |
172 | static struct clk pxa25x_clks[] = { | 171 | static struct clk pxa25x_clks[] = { |
173 | INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), | 172 | INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev), |
@@ -194,11 +193,6 @@ static struct clk pxa25x_clks[] = { | |||
194 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), | 193 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), |
195 | }; | 194 | }; |
196 | 195 | ||
197 | static struct clk pxa2xx_clk_aliases[] = { | ||
198 | INIT_CKOTHER("GPIO7_CLK", &pxa25x_clks[4], NULL), | ||
199 | INIT_CKOTHER("SA1111_CLK", &pxa25x_clks[5], NULL), | ||
200 | }; | ||
201 | |||
202 | #ifdef CONFIG_PM | 196 | #ifdef CONFIG_PM |
203 | 197 | ||
204 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x | 198 | #define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x |
@@ -375,8 +369,6 @@ static int __init pxa25x_init(void) | |||
375 | if (cpu_is_pxa255()) | 369 | if (cpu_is_pxa255()) |
376 | ret = platform_device_register(&pxa_device_hwuart); | 370 | ret = platform_device_register(&pxa_device_hwuart); |
377 | 371 | ||
378 | clks_register(pxa2xx_clk_aliases, ARRAY_SIZE(pxa2xx_clk_aliases)); | ||
379 | |||
380 | return ret; | 372 | return ret; |
381 | } | 373 | } |
382 | 374 | ||
diff --git a/arch/arm/mach-pxa/pxa300.c b/arch/arm/mach-pxa/pxa300.c index 494fc1f032db..9adc7fc4618a 100644 --- a/arch/arm/mach-pxa/pxa300.c +++ b/arch/arm/mach-pxa/pxa300.c | |||
@@ -90,7 +90,9 @@ static struct clk common_clks[] = { | |||
90 | }; | 90 | }; |
91 | 91 | ||
92 | static struct clk pxa310_clks[] = { | 92 | static struct clk pxa310_clks[] = { |
93 | #ifdef CONFIG_CPU_PXA310 | ||
93 | PXA3xx_CKEN("MMCCLK", MMC3, 19500000, 0, &pxa3xx_device_mci3.dev), | 94 | PXA3xx_CKEN("MMCCLK", MMC3, 19500000, 0, &pxa3xx_device_mci3.dev), |
95 | #endif | ||
94 | }; | 96 | }; |
95 | 97 | ||
96 | static int __init pxa300_init(void) | 98 | static int __init pxa300_init(void) |
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-clock.h b/arch/arm/mach-s3c2410/include/mach/regs-clock.h index d583688458a4..b3f90aa78076 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-clock.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-clock.h | |||
@@ -11,7 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #ifndef __ASM_ARM_REGS_CLOCK | 13 | #ifndef __ASM_ARM_REGS_CLOCK |
14 | #define __ASM_ARM_REGS_CLOCK "$Id: clock.h,v 1.4 2003/04/30 14:50:51 ben Exp $" | 14 | #define __ASM_ARM_REGS_CLOCK |
15 | 15 | ||
16 | #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR) | 16 | #define S3C2410_CLKREG(x) ((x) + S3C24XX_VA_CLKPWR) |
17 | 17 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-gpio.h b/arch/arm/mach-s3c2410/include/mach/regs-gpio.h index 30bec027f5fa..528080ceac44 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-gpio.h | |||
@@ -12,7 +12,7 @@ | |||
12 | 12 | ||
13 | 13 | ||
14 | #ifndef __ASM_ARCH_REGS_GPIO_H | 14 | #ifndef __ASM_ARCH_REGS_GPIO_H |
15 | #define __ASM_ARCH_REGS_GPIO_H "$Id: gpio.h,v 1.5 2003/05/19 12:51:08 ben Exp $" | 15 | #define __ASM_ARCH_REGS_GPIO_H |
16 | 16 | ||
17 | #define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) | 17 | #define S3C2410_GPIONO(bank,offset) ((bank) + (offset)) |
18 | 18 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-irq.h b/arch/arm/mach-s3c2410/include/mach/regs-irq.h index b057c06d167a..de86ee8812bd 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-irq.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-irq.h | |||
@@ -10,7 +10,7 @@ | |||
10 | 10 | ||
11 | 11 | ||
12 | #ifndef ___ASM_ARCH_REGS_IRQ_H | 12 | #ifndef ___ASM_ARCH_REGS_IRQ_H |
13 | #define ___ASM_ARCH_REGS_IRQ_H "$Id: irq.h,v 1.3 2003/03/25 21:29:06 ben Exp $" | 13 | #define ___ASM_ARCH_REGS_IRQ_H |
14 | 14 | ||
15 | /* interrupt controller */ | 15 | /* interrupt controller */ |
16 | 16 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-lcd.h b/arch/arm/mach-s3c2410/include/mach/regs-lcd.h index 893b8742f954..ee8f040aff5f 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-lcd.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-lcd.h | |||
@@ -10,7 +10,7 @@ | |||
10 | 10 | ||
11 | 11 | ||
12 | #ifndef ___ASM_ARCH_REGS_LCD_H | 12 | #ifndef ___ASM_ARCH_REGS_LCD_H |
13 | #define ___ASM_ARCH_REGS_LCD_H "$Id: lcd.h,v 1.3 2003/06/26 13:25:06 ben Exp $" | 13 | #define ___ASM_ARCH_REGS_LCD_H |
14 | 14 | ||
15 | #define S3C2410_LCDREG(x) (x) | 15 | #define S3C2410_LCDREG(x) (x) |
16 | 16 | ||
diff --git a/arch/arm/mach-s3c2410/include/mach/regs-mem.h b/arch/arm/mach-s3c2410/include/mach/regs-mem.h index f9926abd5cde..57759804e2fa 100644 --- a/arch/arm/mach-s3c2410/include/mach/regs-mem.h +++ b/arch/arm/mach-s3c2410/include/mach/regs-mem.h | |||
@@ -11,7 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #ifndef __ASM_ARM_MEMREGS_H | 13 | #ifndef __ASM_ARM_MEMREGS_H |
14 | #define __ASM_ARM_MEMREGS_H "$Id: regs.h,v 1.8 2003/05/01 15:55:41 ben Exp $" | 14 | #define __ASM_ARM_MEMREGS_H |
15 | 15 | ||
16 | #ifndef S3C2410_MEMREG | 16 | #ifndef S3C2410_MEMREG |
17 | #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) | 17 | #define S3C2410_MEMREG(x) (S3C24XX_VA_MEMCTRL + (x)) |
diff --git a/arch/arm/mach-s3c2410/mach-bast.c b/arch/arm/mach-s3c2410/mach-bast.c index fb1e78e28e50..24c6334fac89 100644 --- a/arch/arm/mach-s3c2410/mach-bast.c +++ b/arch/arm/mach-s3c2410/mach-bast.c | |||
@@ -562,7 +562,7 @@ static struct platform_device *bast_devices[] __initdata = { | |||
562 | &bast_sio, | 562 | &bast_sio, |
563 | }; | 563 | }; |
564 | 564 | ||
565 | static struct clk *bast_clocks[] = { | 565 | static struct clk *bast_clocks[] __initdata = { |
566 | &s3c24xx_dclk0, | 566 | &s3c24xx_dclk0, |
567 | &s3c24xx_dclk1, | 567 | &s3c24xx_dclk1, |
568 | &s3c24xx_clkout0, | 568 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2410/mach-smdk2410.c b/arch/arm/mach-s3c2410/mach-smdk2410.c index c9040080727e..b88939d72282 100644 --- a/arch/arm/mach-s3c2410/mach-smdk2410.c +++ b/arch/arm/mach-s3c2410/mach-smdk2410.c | |||
@@ -5,7 +5,6 @@ | |||
5 | * Copyright (C) 2004 by FS Forth-Systeme GmbH | 5 | * Copyright (C) 2004 by FS Forth-Systeme GmbH |
6 | * All rights reserved. | 6 | * All rights reserved. |
7 | * | 7 | * |
8 | * $Id: mach-smdk2410.c,v 1.1 2004/05/11 14:15:38 mpietrek Exp $ | ||
9 | * @Author: Jonas Dietsche | 8 | * @Author: Jonas Dietsche |
10 | * | 9 | * |
11 | * This program is free software; you can redistribute it and/or | 10 | * This program is free software; you can redistribute it and/or |
diff --git a/arch/arm/mach-s3c2410/mach-vr1000.c b/arch/arm/mach-s3c2410/mach-vr1000.c index 12cbca68f57d..fbc0213d5485 100644 --- a/arch/arm/mach-s3c2410/mach-vr1000.c +++ b/arch/arm/mach-s3c2410/mach-vr1000.c | |||
@@ -344,7 +344,7 @@ static struct platform_device *vr1000_devices[] __initdata = { | |||
344 | &vr1000_led3, | 344 | &vr1000_led3, |
345 | }; | 345 | }; |
346 | 346 | ||
347 | static struct clk *vr1000_clocks[] = { | 347 | static struct clk *vr1000_clocks[] __initdata = { |
348 | &s3c24xx_dclk0, | 348 | &s3c24xx_dclk0, |
349 | &s3c24xx_dclk1, | 349 | &s3c24xx_dclk1, |
350 | &s3c24xx_clkout0, | 350 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2412/mach-jive.c b/arch/arm/mach-s3c2412/mach-jive.c index 30f613a79bfe..4c061d29463c 100644 --- a/arch/arm/mach-s3c2412/mach-jive.c +++ b/arch/arm/mach-s3c2412/mach-jive.c | |||
@@ -26,9 +26,6 @@ | |||
26 | 26 | ||
27 | #include <linux/spi/spi.h> | 27 | #include <linux/spi/spi.h> |
28 | 28 | ||
29 | #include <linux/mtd/mtd.h> | ||
30 | #include <linux/mtd/partitions.h> | ||
31 | |||
32 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
33 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
34 | #include <asm/mach/irq.h> | 31 | #include <asm/mach/irq.h> |
diff --git a/arch/arm/mach-s3c2440/mach-anubis.c b/arch/arm/mach-s3c2440/mach-anubis.c index 265c77dec9d7..441f4bc09472 100644 --- a/arch/arm/mach-s3c2440/mach-anubis.c +++ b/arch/arm/mach-s3c2440/mach-anubis.c | |||
@@ -414,7 +414,7 @@ static struct platform_device *anubis_devices[] __initdata = { | |||
414 | &anubis_device_sm501, | 414 | &anubis_device_sm501, |
415 | }; | 415 | }; |
416 | 416 | ||
417 | static struct clk *anubis_clocks[] = { | 417 | static struct clk *anubis_clocks[] __initdata = { |
418 | &s3c24xx_dclk0, | 418 | &s3c24xx_dclk0, |
419 | &s3c24xx_dclk1, | 419 | &s3c24xx_dclk1, |
420 | &s3c24xx_clkout0, | 420 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-s3c2440/mach-osiris.c b/arch/arm/mach-s3c2440/mach-osiris.c index d2ee0cd148c6..8b83f93b6102 100644 --- a/arch/arm/mach-s3c2440/mach-osiris.c +++ b/arch/arm/mach-s3c2440/mach-osiris.c | |||
@@ -341,7 +341,7 @@ static struct platform_device *osiris_devices[] __initdata = { | |||
341 | &osiris_pcmcia, | 341 | &osiris_pcmcia, |
342 | }; | 342 | }; |
343 | 343 | ||
344 | static struct clk *osiris_clocks[] = { | 344 | static struct clk *osiris_clocks[] __initdata = { |
345 | &s3c24xx_dclk0, | 345 | &s3c24xx_dclk0, |
346 | &s3c24xx_dclk1, | 346 | &s3c24xx_dclk1, |
347 | &s3c24xx_clkout0, | 347 | &s3c24xx_clkout0, |
diff --git a/arch/arm/mach-sa1100/cpu-sa1110.c b/arch/arm/mach-sa1100/cpu-sa1110.c index 39d38c801736..029dbfbbafcf 100644 --- a/arch/arm/mach-sa1100/cpu-sa1110.c +++ b/arch/arm/mach-sa1100/cpu-sa1110.c | |||
@@ -3,8 +3,6 @@ | |||
3 | * | 3 | * |
4 | * Copyright (C) 2001 Russell King | 4 | * Copyright (C) 2001 Russell King |
5 | * | 5 | * |
6 | * $Id: cpu-sa1110.c,v 1.9 2002/07/06 16:53:18 rmk Exp $ | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
10 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
diff --git a/arch/arm/mach-sa1100/include/mach/mtd-xip.h b/arch/arm/mach-sa1100/include/mach/mtd-xip.h index 80cfdac2b944..eaa09e86ad16 100644 --- a/arch/arm/mach-sa1100/include/mach/mtd-xip.h +++ b/arch/arm/mach-sa1100/include/mach/mtd-xip.h | |||
@@ -10,8 +10,6 @@ | |||
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License version 2 as | 11 | * it under the terms of the GNU General Public License version 2 as |
12 | * published by the Free Software Foundation. | 12 | * published by the Free Software Foundation. |
13 | * | ||
14 | * $Id: xip.h,v 1.2 2004/12/01 15:49:10 nico Exp $ | ||
15 | */ | 13 | */ |
16 | 14 | ||
17 | #ifndef __ARCH_SA1100_MTD_XIP_H__ | 15 | #ifndef __ARCH_SA1100_MTD_XIP_H__ |
diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c index 20eec4ba173f..7b5a25d81576 100644 --- a/arch/arm/mm/cache-feroceon-l2.c +++ b/arch/arm/mm/cache-feroceon-l2.c | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <asm/cacheflush.h> | 16 | #include <asm/cacheflush.h> |
17 | #include <asm/plat-orion/cache-feroceon-l2.h> | 17 | #include <plat/cache-feroceon-l2.h> |
18 | 18 | ||
19 | 19 | ||
20 | /* | 20 | /* |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 2d6d682c206a..25d9a11eb617 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
@@ -568,6 +568,55 @@ void __init iotable_init(struct map_desc *io_desc, int nr) | |||
568 | create_mapping(io_desc + i); | 568 | create_mapping(io_desc + i); |
569 | } | 569 | } |
570 | 570 | ||
571 | static int __init check_membank_valid(struct membank *mb) | ||
572 | { | ||
573 | /* | ||
574 | * Check whether this memory region has non-zero size. | ||
575 | */ | ||
576 | if (mb->size == 0) | ||
577 | return 0; | ||
578 | |||
579 | /* | ||
580 | * Check whether this memory region would entirely overlap | ||
581 | * the vmalloc area. | ||
582 | */ | ||
583 | if (phys_to_virt(mb->start) >= VMALLOC_MIN) { | ||
584 | printk(KERN_NOTICE "Ignoring RAM at %.8lx-%.8lx " | ||
585 | "(vmalloc region overlap).\n", | ||
586 | mb->start, mb->start + mb->size - 1); | ||
587 | return 0; | ||
588 | } | ||
589 | |||
590 | /* | ||
591 | * Check whether this memory region would partially overlap | ||
592 | * the vmalloc area. | ||
593 | */ | ||
594 | if (phys_to_virt(mb->start + mb->size) < phys_to_virt(mb->start) || | ||
595 | phys_to_virt(mb->start + mb->size) > VMALLOC_MIN) { | ||
596 | unsigned long newsize = VMALLOC_MIN - phys_to_virt(mb->start); | ||
597 | |||
598 | printk(KERN_NOTICE "Truncating RAM at %.8lx-%.8lx " | ||
599 | "to -%.8lx (vmalloc region overlap).\n", | ||
600 | mb->start, mb->start + mb->size - 1, | ||
601 | mb->start + newsize - 1); | ||
602 | mb->size = newsize; | ||
603 | } | ||
604 | |||
605 | return 1; | ||
606 | } | ||
607 | |||
608 | static void __init sanity_check_meminfo(struct meminfo *mi) | ||
609 | { | ||
610 | int i; | ||
611 | int j; | ||
612 | |||
613 | for (i = 0, j = 0; i < mi->nr_banks; i++) { | ||
614 | if (check_membank_valid(&mi->bank[i])) | ||
615 | mi->bank[j++] = mi->bank[i]; | ||
616 | } | ||
617 | mi->nr_banks = j; | ||
618 | } | ||
619 | |||
571 | static inline void prepare_page_table(struct meminfo *mi) | 620 | static inline void prepare_page_table(struct meminfo *mi) |
572 | { | 621 | { |
573 | unsigned long addr; | 622 | unsigned long addr; |
@@ -753,6 +802,7 @@ void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc) | |||
753 | void *zero_page; | 802 | void *zero_page; |
754 | 803 | ||
755 | build_mem_type_table(); | 804 | build_mem_type_table(); |
805 | sanity_check_meminfo(mi); | ||
756 | prepare_page_table(mi); | 806 | prepare_page_table(mi); |
757 | bootmem_init(mi); | 807 | bootmem_init(mi); |
758 | devicemaps_init(mdesc); | 808 | devicemaps_init(mdesc); |
diff --git a/arch/arm/mm/proc-arm940.S b/arch/arm/mm/proc-arm940.S index 1a3d63df8e90..551244d5ca19 100644 --- a/arch/arm/mm/proc-arm940.S +++ b/arch/arm/mm/proc-arm940.S | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <asm/pgtable-hwdef.h> | 15 | #include <asm/pgtable-hwdef.h> |
16 | #include <asm/pgtable.h> | 16 | #include <asm/pgtable.h> |
17 | #include <asm/ptrace.h> | 17 | #include <asm/ptrace.h> |
18 | #include "proc-macros.S" | ||
18 | 19 | ||
19 | /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */ | 20 | /* ARM940T has a 4KB DCache comprising 256 lines of 4 words */ |
20 | #define CACHE_DLINESIZE 16 | 21 | #define CACHE_DLINESIZE 16 |
diff --git a/arch/arm/mm/proc-arm946.S b/arch/arm/mm/proc-arm946.S index 82d579ac9b98..6168c6160dee 100644 --- a/arch/arm/mm/proc-arm946.S +++ b/arch/arm/mm/proc-arm946.S | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/pgtable-hwdef.h> | 17 | #include <asm/pgtable-hwdef.h> |
18 | #include <asm/pgtable.h> | 18 | #include <asm/pgtable.h> |
19 | #include <asm/ptrace.h> | 19 | #include <asm/ptrace.h> |
20 | #include "proc-macros.S" | ||
20 | 21 | ||
21 | /* | 22 | /* |
22 | * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache, | 23 | * ARM946E-S is synthesizable to have 0KB to 1MB sized D-Cache, |
diff --git a/arch/arm/plat-omap/clock.c b/arch/arm/plat-omap/clock.c index 23a070599993..197974defbe4 100644 --- a/arch/arm/plat-omap/clock.c +++ b/arch/arm/plat-omap/clock.c | |||
@@ -10,7 +10,6 @@ | |||
10 | * it under the terms of the GNU General Public License version 2 as | 10 | * it under the terms of the GNU General Public License version 2 as |
11 | * published by the Free Software Foundation. | 11 | * published by the Free Software Foundation. |
12 | */ | 12 | */ |
13 | #include <linux/version.h> | ||
14 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
15 | #include <linux/init.h> | 14 | #include <linux/init.h> |
16 | #include <linux/module.h> | 15 | #include <linux/module.h> |
diff --git a/arch/arm/plat-omap/include/mach/memory.h b/arch/arm/plat-omap/include/mach/memory.h index 037486c5f4a4..a325caf80d04 100644 --- a/arch/arm/plat-omap/include/mach/memory.h +++ b/arch/arm/plat-omap/include/mach/memory.h | |||
@@ -76,13 +76,14 @@ | |||
76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ | 76 | (dma_addr_t)virt_to_lbus(page_address(page)) : \ |
77 | (dma_addr_t)__virt_to_bus(page_address(page));}) | 77 | (dma_addr_t)__virt_to_bus(page_address(page));}) |
78 | 78 | ||
79 | #define __arch_dma_to_virt(dev, addr) ({is_lbus_device(dev) ? \ | 79 | #define __arch_dma_to_virt(dev, addr) ({ (void *) (is_lbus_device(dev) ? \ |
80 | lbus_to_virt(addr) : \ | 80 | lbus_to_virt(addr) : \ |
81 | __bus_to_virt(addr);}) | 81 | __bus_to_virt(addr)); }) |
82 | 82 | ||
83 | #define __arch_virt_to_dma(dev, addr) ({is_lbus_device(dev) ? \ | 83 | #define __arch_virt_to_dma(dev, addr) ({ unsigned long __addr = (unsigned long)(addr); \ |
84 | virt_to_lbus(addr) : \ | 84 | (dma_addr_t) (is_lbus_device(dev) ? \ |
85 | __virt_to_bus(addr);}) | 85 | virt_to_lbus(__addr) : \ |
86 | __virt_to_bus(__addr)); }) | ||
86 | 87 | ||
87 | #endif /* CONFIG_ARCH_OMAP15XX */ | 88 | #endif /* CONFIG_ARCH_OMAP15XX */ |
88 | 89 | ||
diff --git a/include/asm-arm/plat-orion/cache-feroceon-l2.h b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h index ba4e016d3ec0..06f982d55697 100644 --- a/include/asm-arm/plat-orion/cache-feroceon-l2.h +++ b/arch/arm/plat-orion/include/plat/cache-feroceon-l2.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-arm/plat-orion/cache-feroceon-l2.h | 2 | * arch/arm/plat-orion/include/plat/cache-feroceon-l2.h |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Marvell Semiconductor | 4 | * Copyright (C) 2008 Marvell Semiconductor |
5 | * | 5 | * |
diff --git a/include/asm-arm/plat-orion/ehci-orion.h b/arch/arm/plat-orion/include/plat/ehci-orion.h index 785705651e24..64343051095a 100644 --- a/include/asm-arm/plat-orion/ehci-orion.h +++ b/arch/arm/plat-orion/include/plat/ehci-orion.h | |||
@@ -1,13 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-arm/plat-orion/ehci-orion.h | 2 | * arch/arm/plat-orion/include/plat/ehci-orion.h |
3 | * | 3 | * |
4 | * This file is licensed under the terms of the GNU General Public | 4 | * This file is licensed under the terms of the GNU General Public |
5 | * License version 2. This program is licensed "as is" without any | 5 | * License version 2. This program is licensed "as is" without any |
6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef __ASM_PLAT_ORION_EHCI_ORION_H | 9 | #ifndef __PLAT_EHCI_ORION_H |
10 | #define __ASM_PLAT_ORION_EHCI_ORION_H | 10 | #define __PLAT_EHCI_ORION_H |
11 | 11 | ||
12 | #include <linux/mbus.h> | 12 | #include <linux/mbus.h> |
13 | 13 | ||
diff --git a/include/asm-arm/plat-orion/irq.h b/arch/arm/plat-orion/include/plat/irq.h index 94aeed919d5b..f05eeab94968 100644 --- a/include/asm-arm/plat-orion/irq.h +++ b/arch/arm/plat-orion/include/plat/irq.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-arm/plat-orion/irq.h | 2 | * arch/arm/plat-orion/include/plat/irq.h |
3 | * | 3 | * |
4 | * Marvell Orion SoC IRQ handling. | 4 | * Marvell Orion SoC IRQ handling. |
5 | * | 5 | * |
@@ -8,8 +8,8 @@ | |||
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef __ASM_PLAT_ORION_IRQ_H | 11 | #ifndef __PLAT_IRQ_H |
12 | #define __ASM_PLAT_ORION_IRQ_H | 12 | #define __PLAT_IRQ_H |
13 | 13 | ||
14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); | 14 | void orion_irq_init(unsigned int irq_start, void __iomem *maskaddr); |
15 | 15 | ||
diff --git a/include/asm-arm/plat-orion/mv_xor.h b/arch/arm/plat-orion/include/plat/mv_xor.h index c349e8ff5cc0..bd5f3bdb4ae3 100644 --- a/include/asm-arm/plat-orion/mv_xor.h +++ b/arch/arm/plat-orion/include/plat/mv_xor.h | |||
@@ -1,9 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | * arch/arm/plat-orion/include/plat/mv_xor.h | ||
3 | * | ||
2 | * Marvell XOR platform device data definition file. | 4 | * Marvell XOR platform device data definition file. |
3 | */ | 5 | */ |
4 | 6 | ||
5 | #ifndef __ASM_PLAT_ORION_MV_XOR_H | 7 | #ifndef __PLAT_MV_XOR_H |
6 | #define __ASM_PLAT_ORION_MV_XOR_H | 8 | #define __PLAT_MV_XOR_H |
7 | 9 | ||
8 | #include <linux/dmaengine.h> | 10 | #include <linux/dmaengine.h> |
9 | #include <linux/mbus.h> | 11 | #include <linux/mbus.h> |
diff --git a/include/asm-arm/plat-orion/orion_nand.h b/arch/arm/plat-orion/include/plat/orion_nand.h index ad4ce94c1998..d6a4cfa37785 100644 --- a/include/asm-arm/plat-orion/orion_nand.h +++ b/arch/arm/plat-orion/include/plat/orion_nand.h | |||
@@ -1,13 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-arm/plat-orion/orion_nand.h | 2 | * arch/arm/plat-orion/include/plat/orion_nand.h |
3 | * | 3 | * |
4 | * This file is licensed under the terms of the GNU General Public | 4 | * This file is licensed under the terms of the GNU General Public |
5 | * License version 2. This program is licensed "as is" without any | 5 | * License version 2. This program is licensed "as is" without any |
6 | * warranty of any kind, whether express or implied. | 6 | * warranty of any kind, whether express or implied. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef __ASM_PLAT_ORION_ORION_NAND_H | 9 | #ifndef __PLAT_ORION_NAND_H |
10 | #define __ASM_PLAT_ORION_ORION_NAND_H | 10 | #define __PLAT_ORION_NAND_H |
11 | 11 | ||
12 | /* | 12 | /* |
13 | * Device bus NAND private data | 13 | * Device bus NAND private data |
diff --git a/include/asm-arm/plat-orion/pcie.h b/arch/arm/plat-orion/include/plat/pcie.h index e61b7bd97af5..3ebfef72b4e7 100644 --- a/include/asm-arm/plat-orion/pcie.h +++ b/arch/arm/plat-orion/include/plat/pcie.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-arm/plat-orion/pcie.h | 2 | * arch/arm/plat-orion/include/plat/pcie.h |
3 | * | 3 | * |
4 | * Marvell Orion SoC PCIe handling. | 4 | * Marvell Orion SoC PCIe handling. |
5 | * | 5 | * |
@@ -8,8 +8,8 @@ | |||
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef __ASM_PLAT_ORION_PCIE_H | 11 | #ifndef __PLAT_PCIE_H |
12 | #define __ASM_PLAT_ORION_PCIE_H | 12 | #define __PLAT_PCIE_H |
13 | 13 | ||
14 | u32 orion_pcie_dev_id(void __iomem *base); | 14 | u32 orion_pcie_dev_id(void __iomem *base); |
15 | u32 orion_pcie_rev(void __iomem *base); | 15 | u32 orion_pcie_rev(void __iomem *base); |
diff --git a/include/asm-arm/plat-orion/time.h b/arch/arm/plat-orion/include/plat/time.h index 0e85cc8f44d9..c06ca35f3613 100644 --- a/include/asm-arm/plat-orion/time.h +++ b/arch/arm/plat-orion/include/plat/time.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-arm/plat-orion/time.h | 2 | * arch/arm/plat-orion/include/plat/time.h |
3 | * | 3 | * |
4 | * Marvell Orion SoC time handling. | 4 | * Marvell Orion SoC time handling. |
5 | * | 5 | * |
@@ -8,8 +8,8 @@ | |||
8 | * warranty of any kind, whether express or implied. | 8 | * warranty of any kind, whether express or implied. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #ifndef __ASM_PLAT_ORION_TIME_H | 11 | #ifndef __PLAT_TIME_H |
12 | #define __ASM_PLAT_ORION_TIME_H | 12 | #define __PLAT_TIME_H |
13 | 13 | ||
14 | void orion_time_init(unsigned int irq, unsigned int tclk); | 14 | void orion_time_init(unsigned int irq, unsigned int tclk); |
15 | 15 | ||
diff --git a/arch/arm/plat-orion/irq.c b/arch/arm/plat-orion/irq.c index fe66a1835169..3f9d34fc738c 100644 --- a/arch/arm/plat-orion/irq.c +++ b/arch/arm/plat-orion/irq.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | #include <asm/plat-orion/irq.h> | 15 | #include <plat/irq.h> |
16 | 16 | ||
17 | static void orion_irq_mask(u32 irq) | 17 | static void orion_irq_mask(u32 irq) |
18 | { | 18 | { |
diff --git a/arch/arm/plat-orion/pcie.c b/arch/arm/plat-orion/pcie.c index ca32c60e14d7..883902fead89 100644 --- a/arch/arm/plat-orion/pcie.c +++ b/arch/arm/plat-orion/pcie.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/pci.h> | 12 | #include <linux/pci.h> |
13 | #include <linux/mbus.h> | 13 | #include <linux/mbus.h> |
14 | #include <asm/mach/pci.h> | 14 | #include <asm/mach/pci.h> |
15 | #include <asm/plat-orion/pcie.h> | 15 | #include <plat/pcie.h> |
16 | 16 | ||
17 | /* | 17 | /* |
18 | * PCIe unit register offsets. | 18 | * PCIe unit register offsets. |
diff --git a/arch/arm/plat-s3c24xx/cpu.c b/arch/arm/plat-s3c24xx/cpu.c index 6d60f0476bb8..89ce60eabd5b 100644 --- a/arch/arm/plat-s3c24xx/cpu.c +++ b/arch/arm/plat-s3c24xx/cpu.c | |||
@@ -169,9 +169,7 @@ static struct map_desc s3c_iodesc[] __initdata = { | |||
169 | IODESC_ENT(UART) | 169 | IODESC_ENT(UART) |
170 | }; | 170 | }; |
171 | 171 | ||
172 | 172 | static struct cpu_table * __init s3c_lookup_cpu(unsigned long idcode) | |
173 | static struct cpu_table * | ||
174 | s3c_lookup_cpu(unsigned long idcode) | ||
175 | { | 173 | { |
176 | struct cpu_table *tab; | 174 | struct cpu_table *tab; |
177 | int count; | 175 | int count; |
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 8b8f564c3aa2..56281c030a7b 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
@@ -12,7 +12,7 @@ | |||
12 | # | 12 | # |
13 | # http://www.arm.linux.org.uk/developer/machines/?action=new | 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new |
14 | # | 14 | # |
15 | # Last update: Sun Jul 13 12:04:05 2008 | 15 | # Last update: Wed Aug 13 21:56:02 2008 |
16 | # | 16 | # |
17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
18 | # | 18 | # |
@@ -843,7 +843,7 @@ borzoi MACH_BORZOI BORZOI 831 | |||
843 | gecko MACH_GECKO GECKO 832 | 843 | gecko MACH_GECKO GECKO 832 |
844 | ds101 MACH_DS101 DS101 833 | 844 | ds101 MACH_DS101 DS101 833 |
845 | omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 | 845 | omap_palmtt2 MACH_OMAP_PALMTT2 OMAP_PALMTT2 834 |
846 | xscale_palmld MACH_XSCALE_PALMLD XSCALE_PALMLD 835 | 846 | palmld MACH_PALMLD PALMLD 835 |
847 | cc9c MACH_CC9C CC9C 836 | 847 | cc9c MACH_CC9C CC9C 836 |
848 | sbc1670 MACH_SBC1670 SBC1670 837 | 848 | sbc1670 MACH_SBC1670 SBC1670 837 |
849 | ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 | 849 | ixdp28x5 MACH_IXDP28X5 IXDP28X5 838 |
@@ -852,7 +852,7 @@ ml696k MACH_ML696K ML696K 840 | |||
852 | arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 | 852 | arcom_zeus MACH_ARCOM_ZEUS ARCOM_ZEUS 841 |
853 | osiris MACH_OSIRIS OSIRIS 842 | 853 | osiris MACH_OSIRIS OSIRIS 842 |
854 | maestro MACH_MAESTRO MAESTRO 843 | 854 | maestro MACH_MAESTRO MAESTRO 843 |
855 | tunge2 MACH_TUNGE2 TUNGE2 844 | 855 | palmte2 MACH_PALMTE2 PALMTE2 844 |
856 | ixbbm MACH_IXBBM IXBBM 845 | 856 | ixbbm MACH_IXBBM IXBBM 845 |
857 | mx27ads MACH_MX27ADS MX27ADS 846 | 857 | mx27ads MACH_MX27ADS MX27ADS 846 |
858 | ax8004 MACH_AX8004 AX8004 847 | 858 | ax8004 MACH_AX8004 AX8004 847 |
@@ -916,7 +916,7 @@ nxdb500 MACH_NXDB500 NXDB500 905 | |||
916 | apf9328 MACH_APF9328 APF9328 906 | 916 | apf9328 MACH_APF9328 APF9328 906 |
917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 | 917 | omap_wipoq MACH_OMAP_WIPOQ OMAP_WIPOQ 907 |
918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 | 918 | omap_twip MACH_OMAP_TWIP OMAP_TWIP 908 |
919 | palmtreo650 MACH_PALMTREO650 PALMTREO650 909 | 919 | palmt650 MACH_PALMT650 PALMT650 909 |
920 | acumen MACH_ACUMEN ACUMEN 910 | 920 | acumen MACH_ACUMEN ACUMEN 910 |
921 | xp100 MACH_XP100 XP100 911 | 921 | xp100 MACH_XP100 XP100 911 |
922 | fs2410 MACH_FS2410 FS2410 912 | 922 | fs2410 MACH_FS2410 FS2410 912 |
@@ -1096,7 +1096,7 @@ atc6 MACH_ATC6 ATC6 1086 | |||
1096 | multmdw MACH_MULTMDW MULTMDW 1087 | 1096 | multmdw MACH_MULTMDW MULTMDW 1087 |
1097 | mba2440 MACH_MBA2440 MBA2440 1088 | 1097 | mba2440 MACH_MBA2440 MBA2440 1088 |
1098 | ecsd MACH_ECSD ECSD 1089 | 1098 | ecsd MACH_ECSD ECSD 1089 |
1099 | zire31 MACH_ZIRE31 ZIRE31 1090 | 1099 | palmz31 MACH_PALMZ31 PALMZ31 1090 |
1100 | fsg MACH_FSG FSG 1091 | 1100 | fsg MACH_FSG FSG 1091 |
1101 | razor101 MACH_RAZOR101 RAZOR101 1092 | 1101 | razor101 MACH_RAZOR101 RAZOR101 1092 |
1102 | opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 | 1102 | opera_tdm MACH_OPERA_TDM OPERA_TDM 1093 |
@@ -1810,7 +1810,7 @@ kriss_sensor MACH_KRISS_SENSOR KRISS_SENSOR 1819 | |||
1810 | pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 | 1810 | pilz_pmi5 MACH_PILZ_PMI5 PILZ_PMI5 1820 |
1811 | jade MACH_JADE JADE 1821 | 1811 | jade MACH_JADE JADE 1821 |
1812 | ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 | 1812 | ks8695_softplc MACH_KS8695_SOFTPLC KS8695_SOFTPLC 1822 |
1813 | gprisc4 MACH_GPRISC4 GPRISC4 1823 | 1813 | gprisc3 MACH_GPRISC4 GPRISC4 1823 |
1814 | stamp9260 MACH_STAMP9260 STAMP9260 1824 | 1814 | stamp9260 MACH_STAMP9260 STAMP9260 1824 |
1815 | smdk6430 MACH_SMDK6430 SMDK6430 1825 | 1815 | smdk6430 MACH_SMDK6430 SMDK6430 1825 |
1816 | smdkc100 MACH_SMDKC100 SMDKC100 1826 | 1816 | smdkc100 MACH_SMDKC100 SMDKC100 1826 |
@@ -1820,3 +1820,44 @@ deister_eyecam MACH_DEISTER_EYECAM DEISTER_EYECAM 1829 | |||
1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 | 1820 | at91sam9m10ek MACH_AT91SAM9M10EK AT91SAM9M10EK 1830 |
1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 | 1821 | linkstation_produo MACH_LINKSTATION_PRODUO LINKSTATION_PRODUO 1831 |
1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 | 1822 | hit_b0 MACH_HIT_B0 HIT_B0 1832 |
1823 | adx_rmu MACH_ADX_RMU ADX_RMU 1833 | ||
1824 | xg_cpe_main MACH_XG_CPE_MAIN XG_CPE_MAIN 1834 | ||
1825 | edb9407a MACH_EDB9407A EDB9407A 1835 | ||
1826 | dtb9608 MACH_DTB9608 DTB9608 1836 | ||
1827 | em104v1 MACH_EM104V1 EM104V1 1837 | ||
1828 | demo MACH_DEMO DEMO 1838 | ||
1829 | logi9260 MACH_LOGI9260 LOGI9260 1839 | ||
1830 | mx31_exm32 MACH_MX31_EXM32 MX31_EXM32 1840 | ||
1831 | usb_a9g20 MACH_USB_A9G20 USB_A9G20 1841 | ||
1832 | picproje2008 MACH_PICPROJE2008 PICPROJE2008 1842 | ||
1833 | cs_e9315 MACH_CS_E9315 CS_E9315 1843 | ||
1834 | qil_a9g20 MACH_QIL_A9G20 QIL_A9G20 1844 | ||
1835 | sha_pon020 MACH_SHA_PON020 SHA_PON020 1845 | ||
1836 | nad MACH_NAD NAD 1846 | ||
1837 | sbc35_a9260 MACH_SBC35_A9260 SBC35_A9260 1847 | ||
1838 | sbc35_a9g20 MACH_SBC35_A9G20 SBC35_A9G20 1848 | ||
1839 | davinci_beginning MACH_DAVINCI_BEGINNING DAVINCI_BEGINNING 1849 | ||
1840 | uwc MACH_UWC UWC 1850 | ||
1841 | mxlads MACH_MXLADS MXLADS 1851 | ||
1842 | htcnike MACH_HTCNIKE HTCNIKE 1852 | ||
1843 | deister_pxa270 MACH_DEISTER_PXA270 DEISTER_PXA270 1853 | ||
1844 | cme9210js MACH_CME9210JS CME9210JS 1854 | ||
1845 | cc9p9360 MACH_CC9P9360 CC9P9360 1855 | ||
1846 | mocha MACH_MOCHA MOCHA 1856 | ||
1847 | wapd170ag MACH_WAPD170AG WAPD170AG 1857 | ||
1848 | linkstation_mini MACH_LINKSTATION_MINI LINKSTATION_MINI 1858 | ||
1849 | afeb9260 MACH_AFEB9260 AFEB9260 1859 | ||
1850 | w90x900 MACH_W90X900 W90X900 1860 | ||
1851 | w90x700 MACH_W90X700 W90X700 1861 | ||
1852 | kt300ip MACH_KT300IP KT300IP 1862 | ||
1853 | kt300ip_g20 MACH_KT300IP_G20 KT300IP_G20 1863 | ||
1854 | srcm MACH_SRCM SRCM 1864 | ||
1855 | wlnx_9260 MACH_WLNX_9260 WLNX_9260 1865 | ||
1856 | openmoko_gta03 MACH_OPENMOKO_GTA03 OPENMOKO_GTA03 1866 | ||
1857 | osprey2 MACH_OSPREY2 OSPREY2 1867 | ||
1858 | kbio9260 MACH_KBIO9260 KBIO9260 1868 | ||
1859 | ginza MACH_GINZA GINZA 1869 | ||
1860 | a636n MACH_A636N A636N 1870 | ||
1861 | imx27ipcam MACH_IMX27IPCAM IMX27IPCAM 1871 | ||
1862 | nenoc MACH_NEMOC NEMOC 1872 | ||
1863 | geneva MACH_GENEVA GENEVA 1873 | ||
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index 5a097c46bc46..f64d25973a37 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
@@ -249,7 +249,7 @@ config MEM_MT48LC8M32B2B5_7 | |||
249 | 249 | ||
250 | config MEM_MT48LC32M16A2TG_75 | 250 | config MEM_MT48LC32M16A2TG_75 |
251 | bool | 251 | bool |
252 | depends on (BFIN527_EZKIT || BFIN532_IP0X) | 252 | depends on (BFIN527_EZKIT || BFIN532_IP0X || BLACKSTAMP) |
253 | default y | 253 | default y |
254 | 254 | ||
255 | source "arch/blackfin/mach-bf527/Kconfig" | 255 | source "arch/blackfin/mach-bf527/Kconfig" |
@@ -292,7 +292,7 @@ config CLKIN_HZ | |||
292 | int "Frequency of the crystal on the board in Hz" | 292 | int "Frequency of the crystal on the board in Hz" |
293 | default "11059200" if BFIN533_STAMP | 293 | default "11059200" if BFIN533_STAMP |
294 | default "27000000" if BFIN533_EZKIT | 294 | default "27000000" if BFIN533_EZKIT |
295 | default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS) | 295 | default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS || BLACKSTAMP) |
296 | default "30000000" if BFIN561_EZKIT | 296 | default "30000000" if BFIN561_EZKIT |
297 | default "24576000" if PNAV10 | 297 | default "24576000" if PNAV10 |
298 | default "10000000" if BFIN532_IP0X | 298 | default "10000000" if BFIN532_IP0X |
@@ -332,7 +332,7 @@ config VCO_MULT | |||
332 | default "22" if BFIN533_BLUETECHNIX_CM | 332 | default "22" if BFIN533_BLUETECHNIX_CM |
333 | default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) | 333 | default "20" if (BFIN537_BLUETECHNIX_CM || BFIN527_BLUETECHNIX_CM || BFIN561_BLUETECHNIX_CM) |
334 | default "20" if BFIN561_EZKIT | 334 | default "20" if BFIN561_EZKIT |
335 | default "16" if H8606_HVSISTEMAS | 335 | default "16" if (H8606_HVSISTEMAS || BLACKSTAMP) |
336 | help | 336 | help |
337 | This controls the frequency of the on-chip PLL. This can be between 1 and 64. | 337 | This controls the frequency of the on-chip PLL. This can be between 1 and 64. |
338 | PLL Frequency = (Crystal Frequency) * (this setting) | 338 | PLL Frequency = (Crystal Frequency) * (this setting) |
@@ -622,6 +622,33 @@ config CPLB_SWITCH_TAB_L1 | |||
622 | If enabled, the CPLB Switch Tables are linked | 622 | If enabled, the CPLB Switch Tables are linked |
623 | into L1 data memory. (less latency) | 623 | into L1 data memory. (less latency) |
624 | 624 | ||
625 | comment "Speed Optimizations" | ||
626 | config BFIN_INS_LOWOVERHEAD | ||
627 | bool "ins[bwl] low overhead, higher interrupt latency" | ||
628 | default y | ||
629 | help | ||
630 | Reads on the Blackfin are speculative. In Blackfin terms, this means | ||
631 | they can be interrupted at any time (even after they have been issued | ||
632 | on to the external bus), and re-issued after the interrupt occurs. | ||
633 | For memory - this is not a big deal, since memory does not change if | ||
634 | it sees a read. | ||
635 | |||
636 | If a FIFO is sitting on the end of the read, it will see two reads, | ||
637 | when the core only sees one since the FIFO receives both the read | ||
638 | which is cancelled (and not delivered to the core) and the one which | ||
639 | is re-issued (which is delivered to the core). | ||
640 | |||
641 | To solve this, interrupts are turned off before reads occur to | ||
642 | I/O space. This option controls which the overhead/latency of | ||
643 | controlling interrupts during this time | ||
644 | "n" turns interrupts off every read | ||
645 | (higher overhead, but lower interrupt latency) | ||
646 | "y" turns interrupts off every loop | ||
647 | (low overhead, but longer interrupt latency) | ||
648 | |||
649 | default behavior is to leave this set to on (type "Y"). If you are experiencing | ||
650 | interrupt latency issues, it is safe and OK to turn this off. | ||
651 | |||
625 | endmenu | 652 | endmenu |
626 | 653 | ||
627 | 654 | ||
@@ -933,13 +960,6 @@ endchoice | |||
933 | comment "Possible Suspend Mem / Hibernate Wake-Up Sources" | 960 | comment "Possible Suspend Mem / Hibernate Wake-Up Sources" |
934 | depends on PM | 961 | depends on PM |
935 | 962 | ||
936 | config PM_BFIN_WAKE_RTC | ||
937 | bool "Allow Wake-Up from RESET and on-chip RTC" | ||
938 | depends on PM | ||
939 | default n | ||
940 | help | ||
941 | Enable RTC Wake-Up (Voltage Regulator Power-Up) | ||
942 | |||
943 | config PM_BFIN_WAKE_PH6 | 963 | config PM_BFIN_WAKE_PH6 |
944 | bool "Allow Wake-Up from on-chip PHY or PH6 GP" | 964 | bool "Allow Wake-Up from on-chip PHY or PH6 GP" |
945 | depends on PM && (BF52x || BF534 || BF536 || BF537) | 965 | depends on PM && (BF52x || BF534 || BF536 || BF537) |
@@ -947,41 +967,12 @@ config PM_BFIN_WAKE_PH6 | |||
947 | help | 967 | help |
948 | Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up) | 968 | Enable PHY and PH6 GP Wake-Up (Voltage Regulator Power-Up) |
949 | 969 | ||
950 | config PM_BFIN_WAKE_CAN | ||
951 | bool "Allow Wake-Up from on-chip CAN0/1" | ||
952 | depends on PM && (BF54x || BF534 || BF536 || BF537) | ||
953 | default n | ||
954 | help | ||
955 | Enable CAN0/1 Wake-Up (Voltage Regulator Power-Up) | ||
956 | |||
957 | config PM_BFIN_WAKE_GP | 970 | config PM_BFIN_WAKE_GP |
958 | bool "Allow Wake-Up from GPIOs" | 971 | bool "Allow Wake-Up from GPIOs" |
959 | depends on PM && BF54x | 972 | depends on PM && BF54x |
960 | default n | 973 | default n |
961 | help | 974 | help |
962 | Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) | 975 | Enable General-Purpose Wake-Up (Voltage Regulator Power-Up) |
963 | |||
964 | config PM_BFIN_WAKE_USB | ||
965 | bool "Allow Wake-Up from on-chip USB" | ||
966 | depends on PM && (BF54x || BF52x) | ||
967 | default n | ||
968 | help | ||
969 | Enable USB Wake-Up (Voltage Regulator Power-Up) | ||
970 | |||
971 | config PM_BFIN_WAKE_KEYPAD | ||
972 | bool "Allow Wake-Up from on-chip Keypad" | ||
973 | depends on PM && BF54x | ||
974 | default n | ||
975 | help | ||
976 | Enable Keypad Wake-Up (Voltage Regulator Power-Up) | ||
977 | |||
978 | config PM_BFIN_WAKE_ROTARY | ||
979 | bool "Allow Wake-Up from on-chip Rotary" | ||
980 | depends on PM && BF54x | ||
981 | default n | ||
982 | help | ||
983 | Enable Rotary Wake-Up (Voltage Regulator Power-Up) | ||
984 | |||
985 | endmenu | 976 | endmenu |
986 | 977 | ||
987 | menu "CPU Frequency scaling" | 978 | menu "CPU Frequency scaling" |
diff --git a/arch/blackfin/configs/BlackStamp_defconfig b/arch/blackfin/configs/BlackStamp_defconfig new file mode 100644 index 000000000000..2921f9952d5f --- /dev/null +++ b/arch/blackfin/configs/BlackStamp_defconfig | |||
@@ -0,0 +1,1195 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.26.2 | ||
4 | # | ||
5 | # CONFIG_MMU is not set | ||
6 | # CONFIG_FPU is not set | ||
7 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
8 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
9 | CONFIG_BLACKFIN=y | ||
10 | CONFIG_ZONE_DMA=y | ||
11 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
12 | CONFIG_GENERIC_HWEIGHT=y | ||
13 | CONFIG_GENERIC_HARDIRQS=y | ||
14 | CONFIG_GENERIC_IRQ_PROBE=y | ||
15 | CONFIG_GENERIC_GPIO=y | ||
16 | CONFIG_FORCE_MAX_ZONEORDER=14 | ||
17 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
18 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
19 | |||
20 | # | ||
21 | # General setup | ||
22 | # | ||
23 | CONFIG_EXPERIMENTAL=y | ||
24 | CONFIG_BROKEN_ON_SMP=y | ||
25 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
26 | CONFIG_LOCALVERSION="" | ||
27 | CONFIG_LOCALVERSION_AUTO=y | ||
28 | CONFIG_SYSVIPC=y | ||
29 | CONFIG_SYSVIPC_SYSCTL=y | ||
30 | # CONFIG_POSIX_MQUEUE is not set | ||
31 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
32 | # CONFIG_TASKSTATS is not set | ||
33 | # CONFIG_AUDIT is not set | ||
34 | CONFIG_IKCONFIG=y | ||
35 | CONFIG_IKCONFIG_PROC=y | ||
36 | CONFIG_LOG_BUF_SHIFT=14 | ||
37 | # CONFIG_CGROUPS is not set | ||
38 | # CONFIG_GROUP_SCHED is not set | ||
39 | CONFIG_SYSFS_DEPRECATED=y | ||
40 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
41 | # CONFIG_RELAY is not set | ||
42 | # CONFIG_NAMESPACES is not set | ||
43 | CONFIG_BLK_DEV_INITRD=y | ||
44 | CONFIG_INITRAMFS_SOURCE="" | ||
45 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
46 | CONFIG_SYSCTL=y | ||
47 | CONFIG_EMBEDDED=y | ||
48 | CONFIG_UID16=y | ||
49 | CONFIG_SYSCTL_SYSCALL=y | ||
50 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
51 | CONFIG_KALLSYMS=y | ||
52 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
53 | CONFIG_HOTPLUG=y | ||
54 | CONFIG_PRINTK=y | ||
55 | CONFIG_BUG=y | ||
56 | CONFIG_ELF_CORE=y | ||
57 | CONFIG_COMPAT_BRK=y | ||
58 | CONFIG_BASE_FULL=y | ||
59 | CONFIG_FUTEX=y | ||
60 | CONFIG_ANON_INODES=y | ||
61 | CONFIG_EPOLL=y | ||
62 | CONFIG_SIGNALFD=y | ||
63 | CONFIG_TIMERFD=y | ||
64 | CONFIG_EVENTFD=y | ||
65 | CONFIG_VM_EVENT_COUNTERS=y | ||
66 | CONFIG_SLAB=y | ||
67 | # CONFIG_SLUB is not set | ||
68 | # CONFIG_SLOB is not set | ||
69 | # CONFIG_PROFILING is not set | ||
70 | # CONFIG_MARKERS is not set | ||
71 | CONFIG_HAVE_OPROFILE=y | ||
72 | # CONFIG_HAVE_KPROBES is not set | ||
73 | # CONFIG_HAVE_KRETPROBES is not set | ||
74 | # CONFIG_HAVE_DMA_ATTRS is not set | ||
75 | CONFIG_SLABINFO=y | ||
76 | CONFIG_RT_MUTEXES=y | ||
77 | CONFIG_TINY_SHMEM=y | ||
78 | CONFIG_BASE_SMALL=0 | ||
79 | CONFIG_MODULES=y | ||
80 | # CONFIG_MODULE_FORCE_LOAD is not set | ||
81 | CONFIG_MODULE_UNLOAD=y | ||
82 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
83 | # CONFIG_MODVERSIONS is not set | ||
84 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
85 | CONFIG_KMOD=y | ||
86 | CONFIG_BLOCK=y | ||
87 | # CONFIG_LBD is not set | ||
88 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
89 | # CONFIG_LSF is not set | ||
90 | # CONFIG_BLK_DEV_BSG is not set | ||
91 | |||
92 | # | ||
93 | # IO Schedulers | ||
94 | # | ||
95 | CONFIG_IOSCHED_NOOP=y | ||
96 | CONFIG_IOSCHED_AS=y | ||
97 | # CONFIG_IOSCHED_DEADLINE is not set | ||
98 | CONFIG_IOSCHED_CFQ=y | ||
99 | CONFIG_DEFAULT_AS=y | ||
100 | # CONFIG_DEFAULT_DEADLINE is not set | ||
101 | # CONFIG_DEFAULT_CFQ is not set | ||
102 | # CONFIG_DEFAULT_NOOP is not set | ||
103 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
104 | CONFIG_CLASSIC_RCU=y | ||
105 | # CONFIG_PREEMPT_NONE is not set | ||
106 | CONFIG_PREEMPT_VOLUNTARY=y | ||
107 | # CONFIG_PREEMPT is not set | ||
108 | |||
109 | # | ||
110 | # Blackfin Processor Options | ||
111 | # | ||
112 | |||
113 | # | ||
114 | # Processor and Board Settings | ||
115 | # | ||
116 | # CONFIG_BF522 is not set | ||
117 | # CONFIG_BF523 is not set | ||
118 | # CONFIG_BF524 is not set | ||
119 | # CONFIG_BF525 is not set | ||
120 | # CONFIG_BF526 is not set | ||
121 | # CONFIG_BF527 is not set | ||
122 | # CONFIG_BF531 is not set | ||
123 | CONFIG_BF532=y | ||
124 | # CONFIG_BF533 is not set | ||
125 | # CONFIG_BF534 is not set | ||
126 | # CONFIG_BF536 is not set | ||
127 | # CONFIG_BF537 is not set | ||
128 | # CONFIG_BF542 is not set | ||
129 | # CONFIG_BF544 is not set | ||
130 | # CONFIG_BF547 is not set | ||
131 | # CONFIG_BF548 is not set | ||
132 | # CONFIG_BF549 is not set | ||
133 | # CONFIG_BF561 is not set | ||
134 | # CONFIG_BF_REV_0_0 is not set | ||
135 | # CONFIG_BF_REV_0_1 is not set | ||
136 | # CONFIG_BF_REV_0_2 is not set | ||
137 | # CONFIG_BF_REV_0_3 is not set | ||
138 | # CONFIG_BF_REV_0_4 is not set | ||
139 | CONFIG_BF_REV_0_5=y | ||
140 | # CONFIG_BF_REV_ANY is not set | ||
141 | # CONFIG_BF_REV_NONE is not set | ||
142 | CONFIG_BF53x=y | ||
143 | CONFIG_MEM_MT48LC32M16A2TG_75=y | ||
144 | # CONFIG_BFIN533_EZKIT is not set | ||
145 | # CONFIG_BFIN533_STAMP is not set | ||
146 | # CONFIG_BFIN533_BLUETECHNIX_CM is not set | ||
147 | # CONFIG_H8606_HVSISTEMAS is not set | ||
148 | # CONFIG_BFIN532_IP0X is not set | ||
149 | CONFIG_BLACKSTAMP=y | ||
150 | # CONFIG_GENERIC_BF533_BOARD is not set | ||
151 | |||
152 | # | ||
153 | # BF533/2/1 Specific Configuration | ||
154 | # | ||
155 | |||
156 | # | ||
157 | # Interrupt Priority Assignment | ||
158 | # | ||
159 | |||
160 | # | ||
161 | # Priority | ||
162 | # | ||
163 | CONFIG_UART_ERROR=7 | ||
164 | CONFIG_SPORT0_ERROR=7 | ||
165 | CONFIG_SPI_ERROR=7 | ||
166 | CONFIG_SPORT1_ERROR=7 | ||
167 | CONFIG_PPI_ERROR=7 | ||
168 | CONFIG_DMA_ERROR=7 | ||
169 | CONFIG_PLLWAKE_ERROR=7 | ||
170 | CONFIG_RTC_ERROR=8 | ||
171 | CONFIG_DMA0_PPI=8 | ||
172 | CONFIG_DMA1_SPORT0RX=9 | ||
173 | CONFIG_DMA2_SPORT0TX=9 | ||
174 | CONFIG_DMA3_SPORT1RX=9 | ||
175 | CONFIG_DMA4_SPORT1TX=9 | ||
176 | CONFIG_DMA5_SPI=10 | ||
177 | CONFIG_DMA6_UARTRX=10 | ||
178 | CONFIG_DMA7_UARTTX=10 | ||
179 | CONFIG_TIMER0=11 | ||
180 | CONFIG_TIMER1=11 | ||
181 | CONFIG_TIMER2=11 | ||
182 | CONFIG_PFA=12 | ||
183 | CONFIG_PFB=12 | ||
184 | CONFIG_MEMDMA0=13 | ||
185 | CONFIG_MEMDMA1=13 | ||
186 | CONFIG_WDTIMER=13 | ||
187 | |||
188 | # | ||
189 | # Board customizations | ||
190 | # | ||
191 | # CONFIG_CMDLINE_BOOL is not set | ||
192 | CONFIG_BOOT_LOAD=0x1000 | ||
193 | |||
194 | # | ||
195 | # Clock/PLL Setup | ||
196 | # | ||
197 | CONFIG_CLKIN_HZ=25000000 | ||
198 | # CONFIG_BFIN_KERNEL_CLOCK is not set | ||
199 | # CONFIG_PLL_BYPASS is not set | ||
200 | # CONFIG_CLKIN_HALF is not set | ||
201 | CONFIG_VCO_MULT=16 | ||
202 | CONFIG_CCLK_DIV_1=y | ||
203 | # CONFIG_CCLK_DIV_2 is not set | ||
204 | # CONFIG_CCLK_DIV_4 is not set | ||
205 | # CONFIG_CCLK_DIV_8 is not set | ||
206 | CONFIG_SCLK_DIV=3 | ||
207 | CONFIG_MAX_MEM_SIZE=64 | ||
208 | CONFIG_MAX_VCO_HZ=400000000 | ||
209 | CONFIG_MIN_VCO_HZ=50000000 | ||
210 | CONFIG_MAX_SCLK_HZ=133333333 | ||
211 | CONFIG_MIN_SCLK_HZ=27000000 | ||
212 | |||
213 | # | ||
214 | # Kernel Timer/Scheduler | ||
215 | # | ||
216 | # CONFIG_HZ_100 is not set | ||
217 | CONFIG_HZ_250=y | ||
218 | # CONFIG_HZ_300 is not set | ||
219 | # CONFIG_HZ_1000 is not set | ||
220 | CONFIG_HZ=250 | ||
221 | # CONFIG_SCHED_HRTICK is not set | ||
222 | CONFIG_GENERIC_TIME=y | ||
223 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
224 | # CONFIG_CYCLES_CLOCKSOURCE is not set | ||
225 | CONFIG_TICK_ONESHOT=y | ||
226 | # CONFIG_NO_HZ is not set | ||
227 | CONFIG_HIGH_RES_TIMERS=y | ||
228 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
229 | |||
230 | # | ||
231 | # Memory Setup | ||
232 | # | ||
233 | |||
234 | # | ||
235 | # Misc | ||
236 | # | ||
237 | CONFIG_BFIN_SCRATCH_REG_RETN=y | ||
238 | # CONFIG_BFIN_SCRATCH_REG_RETE is not set | ||
239 | # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set | ||
240 | |||
241 | # | ||
242 | # Blackfin Kernel Optimizations | ||
243 | # | ||
244 | |||
245 | # | ||
246 | # Memory Optimizations | ||
247 | # | ||
248 | CONFIG_I_ENTRY_L1=y | ||
249 | CONFIG_EXCPT_IRQ_SYSC_L1=y | ||
250 | CONFIG_DO_IRQ_L1=y | ||
251 | CONFIG_CORE_TIMER_IRQ_L1=y | ||
252 | CONFIG_IDLE_L1=y | ||
253 | CONFIG_SCHEDULE_L1=y | ||
254 | CONFIG_ARITHMETIC_OPS_L1=y | ||
255 | CONFIG_ACCESS_OK_L1=y | ||
256 | CONFIG_MEMSET_L1=y | ||
257 | CONFIG_MEMCPY_L1=y | ||
258 | CONFIG_SYS_BFIN_SPINLOCK_L1=y | ||
259 | # CONFIG_IP_CHECKSUM_L1 is not set | ||
260 | CONFIG_CACHELINE_ALIGNED_L1=y | ||
261 | # CONFIG_SYSCALL_TAB_L1 is not set | ||
262 | # CONFIG_CPLB_SWITCH_TAB_L1 is not set | ||
263 | # CONFIG_RAMKERNEL is not set | ||
264 | CONFIG_ROMKERNEL=y | ||
265 | CONFIG_SELECT_MEMORY_MODEL=y | ||
266 | CONFIG_FLATMEM_MANUAL=y | ||
267 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
268 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
269 | CONFIG_FLATMEM=y | ||
270 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
271 | # CONFIG_SPARSEMEM_STATIC is not set | ||
272 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
273 | CONFIG_PAGEFLAGS_EXTENDED=y | ||
274 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
275 | # CONFIG_RESOURCES_64BIT is not set | ||
276 | CONFIG_ZONE_DMA_FLAG=1 | ||
277 | CONFIG_VIRT_TO_BUS=y | ||
278 | CONFIG_BFIN_GPTIMERS=y | ||
279 | CONFIG_BFIN_DMA_5XX=y | ||
280 | # CONFIG_DMA_UNCACHED_4M is not set | ||
281 | # CONFIG_DMA_UNCACHED_2M is not set | ||
282 | CONFIG_DMA_UNCACHED_1M=y | ||
283 | # CONFIG_DMA_UNCACHED_NONE is not set | ||
284 | |||
285 | # | ||
286 | # Cache Support | ||
287 | # | ||
288 | CONFIG_BFIN_ICACHE=y | ||
289 | CONFIG_BFIN_DCACHE=y | ||
290 | # CONFIG_BFIN_DCACHE_BANKA is not set | ||
291 | # CONFIG_BFIN_ICACHE_LOCK is not set | ||
292 | # CONFIG_BFIN_WB is not set | ||
293 | CONFIG_BFIN_WT=y | ||
294 | # CONFIG_MPU is not set | ||
295 | |||
296 | # | ||
297 | # Asynchonous Memory Configuration | ||
298 | # | ||
299 | |||
300 | # | ||
301 | # EBIU_AMGCTL Global Control | ||
302 | # | ||
303 | CONFIG_C_AMCKEN=y | ||
304 | CONFIG_C_CDPRIO=y | ||
305 | # CONFIG_C_AMBEN is not set | ||
306 | # CONFIG_C_AMBEN_B0 is not set | ||
307 | # CONFIG_C_AMBEN_B0_B1 is not set | ||
308 | # CONFIG_C_AMBEN_B0_B1_B2 is not set | ||
309 | CONFIG_C_AMBEN_ALL=y | ||
310 | |||
311 | # | ||
312 | # EBIU_AMBCTL Control | ||
313 | # | ||
314 | CONFIG_BANK_0=0x7BB0 | ||
315 | CONFIG_BANK_1=0x7BB0 | ||
316 | CONFIG_BANK_2=0x7BB0 | ||
317 | CONFIG_BANK_3=0xAAC2 | ||
318 | |||
319 | # | ||
320 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
321 | # | ||
322 | # CONFIG_PCI is not set | ||
323 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
324 | # CONFIG_PCCARD is not set | ||
325 | |||
326 | # | ||
327 | # Executable file formats | ||
328 | # | ||
329 | CONFIG_BINFMT_ELF_FDPIC=y | ||
330 | CONFIG_BINFMT_FLAT=y | ||
331 | CONFIG_BINFMT_ZFLAT=y | ||
332 | CONFIG_BINFMT_SHARED_FLAT=y | ||
333 | # CONFIG_BINFMT_MISC is not set | ||
334 | |||
335 | # | ||
336 | # Power management options | ||
337 | # | ||
338 | CONFIG_PM=y | ||
339 | # CONFIG_PM_DEBUG is not set | ||
340 | CONFIG_PM_SLEEP=y | ||
341 | CONFIG_SUSPEND=y | ||
342 | CONFIG_SUSPEND_FREEZER=y | ||
343 | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||
344 | CONFIG_PM_BFIN_SLEEP_DEEPER=y | ||
345 | # CONFIG_PM_BFIN_SLEEP is not set | ||
346 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
347 | |||
348 | # | ||
349 | # Possible Suspend Mem / Hibernate Wake-Up Sources | ||
350 | # | ||
351 | |||
352 | # | ||
353 | # CPU Frequency scaling | ||
354 | # | ||
355 | # CONFIG_CPU_FREQ is not set | ||
356 | |||
357 | # | ||
358 | # Networking | ||
359 | # | ||
360 | CONFIG_NET=y | ||
361 | |||
362 | # | ||
363 | # Networking options | ||
364 | # | ||
365 | CONFIG_PACKET=y | ||
366 | # CONFIG_PACKET_MMAP is not set | ||
367 | CONFIG_UNIX=y | ||
368 | CONFIG_XFRM=y | ||
369 | # CONFIG_XFRM_USER is not set | ||
370 | # CONFIG_XFRM_SUB_POLICY is not set | ||
371 | # CONFIG_XFRM_MIGRATE is not set | ||
372 | # CONFIG_XFRM_STATISTICS is not set | ||
373 | # CONFIG_NET_KEY is not set | ||
374 | CONFIG_INET=y | ||
375 | # CONFIG_IP_MULTICAST is not set | ||
376 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
377 | CONFIG_IP_FIB_HASH=y | ||
378 | CONFIG_IP_PNP=y | ||
379 | # CONFIG_IP_PNP_DHCP is not set | ||
380 | # CONFIG_IP_PNP_BOOTP is not set | ||
381 | # CONFIG_IP_PNP_RARP is not set | ||
382 | # CONFIG_NET_IPIP is not set | ||
383 | # CONFIG_NET_IPGRE is not set | ||
384 | # CONFIG_ARPD is not set | ||
385 | CONFIG_SYN_COOKIES=y | ||
386 | # CONFIG_INET_AH is not set | ||
387 | # CONFIG_INET_ESP is not set | ||
388 | # CONFIG_INET_IPCOMP is not set | ||
389 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
390 | # CONFIG_INET_TUNNEL is not set | ||
391 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
392 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
393 | CONFIG_INET_XFRM_MODE_BEET=y | ||
394 | # CONFIG_INET_LRO is not set | ||
395 | CONFIG_INET_DIAG=y | ||
396 | CONFIG_INET_TCP_DIAG=y | ||
397 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
398 | CONFIG_TCP_CONG_CUBIC=y | ||
399 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
400 | # CONFIG_TCP_MD5SIG is not set | ||
401 | # CONFIG_IPV6 is not set | ||
402 | # CONFIG_NETLABEL is not set | ||
403 | # CONFIG_NETWORK_SECMARK is not set | ||
404 | # CONFIG_NETFILTER is not set | ||
405 | # CONFIG_IP_DCCP is not set | ||
406 | # CONFIG_IP_SCTP is not set | ||
407 | # CONFIG_TIPC is not set | ||
408 | # CONFIG_ATM is not set | ||
409 | # CONFIG_BRIDGE is not set | ||
410 | # CONFIG_VLAN_8021Q is not set | ||
411 | # CONFIG_DECNET is not set | ||
412 | # CONFIG_LLC2 is not set | ||
413 | # CONFIG_IPX is not set | ||
414 | # CONFIG_ATALK is not set | ||
415 | # CONFIG_X25 is not set | ||
416 | # CONFIG_LAPB is not set | ||
417 | # CONFIG_ECONET is not set | ||
418 | # CONFIG_WAN_ROUTER is not set | ||
419 | # CONFIG_NET_SCHED is not set | ||
420 | |||
421 | # | ||
422 | # Network testing | ||
423 | # | ||
424 | # CONFIG_NET_PKTGEN is not set | ||
425 | # CONFIG_HAMRADIO is not set | ||
426 | # CONFIG_CAN is not set | ||
427 | # CONFIG_IRDA is not set | ||
428 | # CONFIG_BT is not set | ||
429 | # CONFIG_AF_RXRPC is not set | ||
430 | |||
431 | # | ||
432 | # Wireless | ||
433 | # | ||
434 | # CONFIG_CFG80211 is not set | ||
435 | # CONFIG_WIRELESS_EXT is not set | ||
436 | # CONFIG_MAC80211 is not set | ||
437 | # CONFIG_IEEE80211 is not set | ||
438 | # CONFIG_RFKILL is not set | ||
439 | # CONFIG_NET_9P is not set | ||
440 | |||
441 | # | ||
442 | # Device Drivers | ||
443 | # | ||
444 | |||
445 | # | ||
446 | # Generic Driver Options | ||
447 | # | ||
448 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
449 | CONFIG_STANDALONE=y | ||
450 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
451 | # CONFIG_FW_LOADER is not set | ||
452 | # CONFIG_SYS_HYPERVISOR is not set | ||
453 | # CONFIG_CONNECTOR is not set | ||
454 | CONFIG_MTD=y | ||
455 | # CONFIG_MTD_DEBUG is not set | ||
456 | # CONFIG_MTD_CONCAT is not set | ||
457 | CONFIG_MTD_PARTITIONS=y | ||
458 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
459 | CONFIG_MTD_CMDLINE_PARTS=y | ||
460 | # CONFIG_MTD_AR7_PARTS is not set | ||
461 | |||
462 | # | ||
463 | # User Modules And Translation Layers | ||
464 | # | ||
465 | CONFIG_MTD_CHAR=m | ||
466 | CONFIG_MTD_BLKDEVS=y | ||
467 | CONFIG_MTD_BLOCK=y | ||
468 | # CONFIG_FTL is not set | ||
469 | # CONFIG_NFTL is not set | ||
470 | # CONFIG_INFTL is not set | ||
471 | # CONFIG_RFD_FTL is not set | ||
472 | # CONFIG_SSFDC is not set | ||
473 | # CONFIG_MTD_OOPS is not set | ||
474 | |||
475 | # | ||
476 | # RAM/ROM/Flash chip drivers | ||
477 | # | ||
478 | CONFIG_MTD_CFI=m | ||
479 | # CONFIG_MTD_JEDECPROBE is not set | ||
480 | CONFIG_MTD_GEN_PROBE=m | ||
481 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
482 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
483 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
484 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
485 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
486 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
487 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
488 | CONFIG_MTD_CFI_I1=y | ||
489 | CONFIG_MTD_CFI_I2=y | ||
490 | # CONFIG_MTD_CFI_I4 is not set | ||
491 | # CONFIG_MTD_CFI_I8 is not set | ||
492 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
493 | CONFIG_MTD_CFI_AMDSTD=m | ||
494 | # CONFIG_MTD_CFI_STAA is not set | ||
495 | CONFIG_MTD_CFI_UTIL=m | ||
496 | CONFIG_MTD_RAM=y | ||
497 | CONFIG_MTD_ROM=m | ||
498 | # CONFIG_MTD_ABSENT is not set | ||
499 | |||
500 | # | ||
501 | # Mapping drivers for chip access | ||
502 | # | ||
503 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
504 | # CONFIG_MTD_PHYSMAP is not set | ||
505 | # CONFIG_MTD_GPIO_ADDR is not set | ||
506 | # CONFIG_MTD_UCLINUX is not set | ||
507 | # CONFIG_MTD_PLATRAM is not set | ||
508 | |||
509 | # | ||
510 | # Self-contained MTD device drivers | ||
511 | # | ||
512 | # CONFIG_MTD_DATAFLASH is not set | ||
513 | CONFIG_MTD_M25P80=y | ||
514 | # CONFIG_M25PXX_USE_FAST_READ is not set | ||
515 | # CONFIG_MTD_SLRAM is not set | ||
516 | # CONFIG_MTD_PHRAM is not set | ||
517 | # CONFIG_MTD_MTDRAM is not set | ||
518 | # CONFIG_MTD_BLOCK2MTD is not set | ||
519 | |||
520 | # | ||
521 | # Disk-On-Chip Device Drivers | ||
522 | # | ||
523 | # CONFIG_MTD_DOC2000 is not set | ||
524 | # CONFIG_MTD_DOC2001 is not set | ||
525 | # CONFIG_MTD_DOC2001PLUS is not set | ||
526 | # CONFIG_MTD_NAND is not set | ||
527 | # CONFIG_MTD_ONENAND is not set | ||
528 | |||
529 | # | ||
530 | # UBI - Unsorted block images | ||
531 | # | ||
532 | # CONFIG_MTD_UBI is not set | ||
533 | # CONFIG_PARPORT is not set | ||
534 | CONFIG_BLK_DEV=y | ||
535 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
536 | CONFIG_BLK_DEV_LOOP=y | ||
537 | # CONFIG_BLK_DEV_CRYPTOLOOP is not set | ||
538 | CONFIG_BLK_DEV_NBD=y | ||
539 | CONFIG_BLK_DEV_RAM=y | ||
540 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
541 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
542 | # CONFIG_BLK_DEV_XIP is not set | ||
543 | # CONFIG_CDROM_PKTCDVD is not set | ||
544 | # CONFIG_ATA_OVER_ETH is not set | ||
545 | CONFIG_MISC_DEVICES=y | ||
546 | # CONFIG_EEPROM_93CX6 is not set | ||
547 | # CONFIG_ENCLOSURE_SERVICES is not set | ||
548 | CONFIG_HAVE_IDE=y | ||
549 | # CONFIG_IDE is not set | ||
550 | |||
551 | # | ||
552 | # SCSI device support | ||
553 | # | ||
554 | # CONFIG_RAID_ATTRS is not set | ||
555 | # CONFIG_SCSI is not set | ||
556 | # CONFIG_SCSI_DMA is not set | ||
557 | # CONFIG_SCSI_NETLINK is not set | ||
558 | # CONFIG_ATA is not set | ||
559 | # CONFIG_MD is not set | ||
560 | CONFIG_NETDEVICES=y | ||
561 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
562 | # CONFIG_DUMMY is not set | ||
563 | # CONFIG_BONDING is not set | ||
564 | # CONFIG_MACVLAN is not set | ||
565 | # CONFIG_EQUALIZER is not set | ||
566 | # CONFIG_TUN is not set | ||
567 | # CONFIG_VETH is not set | ||
568 | # CONFIG_PHYLIB is not set | ||
569 | CONFIG_NET_ETHERNET=y | ||
570 | CONFIG_MII=y | ||
571 | CONFIG_SMC91X=y | ||
572 | # CONFIG_SMSC911X is not set | ||
573 | # CONFIG_DM9000 is not set | ||
574 | # CONFIG_ENC28J60 is not set | ||
575 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | ||
576 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | ||
577 | # CONFIG_IBM_NEW_EMAC_TAH is not set | ||
578 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | ||
579 | # CONFIG_B44 is not set | ||
580 | # CONFIG_NETDEV_1000 is not set | ||
581 | # CONFIG_NETDEV_10000 is not set | ||
582 | |||
583 | # | ||
584 | # Wireless LAN | ||
585 | # | ||
586 | # CONFIG_WLAN_PRE80211 is not set | ||
587 | # CONFIG_WLAN_80211 is not set | ||
588 | # CONFIG_IWLWIFI_LEDS is not set | ||
589 | # CONFIG_WAN is not set | ||
590 | # CONFIG_PPP is not set | ||
591 | # CONFIG_SLIP is not set | ||
592 | # CONFIG_NETCONSOLE is not set | ||
593 | # CONFIG_NETPOLL is not set | ||
594 | # CONFIG_NET_POLL_CONTROLLER is not set | ||
595 | # CONFIG_ISDN is not set | ||
596 | # CONFIG_PHONE is not set | ||
597 | |||
598 | # | ||
599 | # Input device support | ||
600 | # | ||
601 | CONFIG_INPUT=y | ||
602 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
603 | # CONFIG_INPUT_POLLDEV is not set | ||
604 | |||
605 | # | ||
606 | # Userland interfaces | ||
607 | # | ||
608 | # CONFIG_INPUT_MOUSEDEV is not set | ||
609 | # CONFIG_INPUT_JOYDEV is not set | ||
610 | CONFIG_INPUT_EVDEV=m | ||
611 | # CONFIG_INPUT_EVBUG is not set | ||
612 | |||
613 | # | ||
614 | # Input Device Drivers | ||
615 | # | ||
616 | # CONFIG_INPUT_KEYBOARD is not set | ||
617 | # CONFIG_INPUT_MOUSE is not set | ||
618 | # CONFIG_INPUT_JOYSTICK is not set | ||
619 | # CONFIG_INPUT_TABLET is not set | ||
620 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
621 | # CONFIG_INPUT_MISC is not set | ||
622 | |||
623 | # | ||
624 | # Hardware I/O ports | ||
625 | # | ||
626 | # CONFIG_SERIO is not set | ||
627 | # CONFIG_GAMEPORT is not set | ||
628 | |||
629 | # | ||
630 | # Character devices | ||
631 | # | ||
632 | # CONFIG_AD9960 is not set | ||
633 | # CONFIG_SPI_ADC_BF533 is not set | ||
634 | # CONFIG_BF5xx_PPIFCD is not set | ||
635 | # CONFIG_BFIN_SIMPLE_TIMER is not set | ||
636 | CONFIG_BF5xx_PPI=y | ||
637 | CONFIG_BFIN_SPORT=y | ||
638 | # CONFIG_BFIN_TIMER_LATENCY is not set | ||
639 | # CONFIG_TWI_LCD is not set | ||
640 | CONFIG_SIMPLE_GPIO=m | ||
641 | # CONFIG_VT is not set | ||
642 | CONFIG_DEVKMEM=y | ||
643 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
644 | |||
645 | # | ||
646 | # Serial drivers | ||
647 | # | ||
648 | # CONFIG_SERIAL_8250 is not set | ||
649 | |||
650 | # | ||
651 | # Non-8250 serial port support | ||
652 | # | ||
653 | CONFIG_SERIAL_BFIN=y | ||
654 | CONFIG_SERIAL_BFIN_CONSOLE=y | ||
655 | CONFIG_SERIAL_BFIN_DMA=y | ||
656 | # CONFIG_SERIAL_BFIN_PIO is not set | ||
657 | CONFIG_SERIAL_BFIN_UART0=y | ||
658 | # CONFIG_BFIN_UART0_CTSRTS is not set | ||
659 | CONFIG_SERIAL_CORE=y | ||
660 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
661 | # CONFIG_SERIAL_BFIN_SPORT is not set | ||
662 | CONFIG_UNIX98_PTYS=y | ||
663 | # CONFIG_LEGACY_PTYS is not set | ||
664 | |||
665 | # | ||
666 | # CAN, the car bus and industrial fieldbus | ||
667 | # | ||
668 | # CONFIG_CAN4LINUX is not set | ||
669 | # CONFIG_IPMI_HANDLER is not set | ||
670 | CONFIG_HW_RANDOM=y | ||
671 | # CONFIG_R3964 is not set | ||
672 | # CONFIG_RAW_DRIVER is not set | ||
673 | # CONFIG_TCG_TPM is not set | ||
674 | CONFIG_I2C=m | ||
675 | CONFIG_I2C_BOARDINFO=y | ||
676 | CONFIG_I2C_CHARDEV=m | ||
677 | CONFIG_I2C_ALGOBIT=m | ||
678 | |||
679 | # | ||
680 | # I2C Hardware Bus support | ||
681 | # | ||
682 | CONFIG_I2C_GPIO=m | ||
683 | # CONFIG_I2C_OCORES is not set | ||
684 | # CONFIG_I2C_PARPORT_LIGHT is not set | ||
685 | # CONFIG_I2C_SIMTEC is not set | ||
686 | # CONFIG_I2C_TAOS_EVM is not set | ||
687 | # CONFIG_I2C_STUB is not set | ||
688 | # CONFIG_I2C_PCA_PLATFORM is not set | ||
689 | |||
690 | # | ||
691 | # Miscellaneous I2C Chip support | ||
692 | # | ||
693 | # CONFIG_DS1682 is not set | ||
694 | # CONFIG_SENSORS_AD5252 is not set | ||
695 | # CONFIG_SENSORS_EEPROM is not set | ||
696 | # CONFIG_SENSORS_PCF8574 is not set | ||
697 | # CONFIG_PCF8575 is not set | ||
698 | # CONFIG_SENSORS_PCF8591 is not set | ||
699 | # CONFIG_SENSORS_MAX6875 is not set | ||
700 | # CONFIG_SENSORS_TSL2550 is not set | ||
701 | # CONFIG_I2C_DEBUG_CORE is not set | ||
702 | # CONFIG_I2C_DEBUG_ALGO is not set | ||
703 | # CONFIG_I2C_DEBUG_BUS is not set | ||
704 | # CONFIG_I2C_DEBUG_CHIP is not set | ||
705 | CONFIG_SPI=y | ||
706 | CONFIG_SPI_MASTER=y | ||
707 | |||
708 | # | ||
709 | # SPI Master Controller Drivers | ||
710 | # | ||
711 | CONFIG_SPI_BFIN=y | ||
712 | # CONFIG_SPI_BITBANG is not set | ||
713 | |||
714 | # | ||
715 | # SPI Protocol Masters | ||
716 | # | ||
717 | CONFIG_SPI_AT25=y | ||
718 | CONFIG_SPI_SPIDEV=m | ||
719 | # CONFIG_SPI_TLE62X0 is not set | ||
720 | # CONFIG_W1 is not set | ||
721 | # CONFIG_POWER_SUPPLY is not set | ||
722 | # CONFIG_HWMON is not set | ||
723 | # CONFIG_HWMON_VID is not set | ||
724 | # CONFIG_SENSORS_AD7418 is not set | ||
725 | # CONFIG_SENSORS_ADM1021 is not set | ||
726 | # CONFIG_SENSORS_ADM1025 is not set | ||
727 | # CONFIG_SENSORS_ADM1026 is not set | ||
728 | # CONFIG_SENSORS_ADM1029 is not set | ||
729 | # CONFIG_SENSORS_ADM1031 is not set | ||
730 | # CONFIG_SENSORS_ADM9240 is not set | ||
731 | # CONFIG_SENSORS_ADT7470 is not set | ||
732 | # CONFIG_SENSORS_ADT7473 is not set | ||
733 | # CONFIG_SENSORS_ATXP1 is not set | ||
734 | # CONFIG_SENSORS_DS1621 is not set | ||
735 | # CONFIG_SENSORS_F71805F is not set | ||
736 | # CONFIG_SENSORS_F71882FG is not set | ||
737 | # CONFIG_SENSORS_F75375S is not set | ||
738 | # CONFIG_SENSORS_GL518SM is not set | ||
739 | # CONFIG_SENSORS_GL520SM is not set | ||
740 | # CONFIG_SENSORS_IT87 is not set | ||
741 | # CONFIG_SENSORS_LM63 is not set | ||
742 | # CONFIG_SENSORS_LM70 is not set | ||
743 | # CONFIG_SENSORS_LM75 is not set | ||
744 | # CONFIG_SENSORS_LM77 is not set | ||
745 | # CONFIG_SENSORS_LM78 is not set | ||
746 | # CONFIG_SENSORS_LM80 is not set | ||
747 | # CONFIG_SENSORS_LM83 is not set | ||
748 | # CONFIG_SENSORS_LM85 is not set | ||
749 | # CONFIG_SENSORS_LM87 is not set | ||
750 | # CONFIG_SENSORS_LM90 is not set | ||
751 | # CONFIG_SENSORS_LM92 is not set | ||
752 | # CONFIG_SENSORS_LM93 is not set | ||
753 | # CONFIG_SENSORS_MAX1619 is not set | ||
754 | # CONFIG_SENSORS_MAX6650 is not set | ||
755 | # CONFIG_SENSORS_PC87360 is not set | ||
756 | # CONFIG_SENSORS_PC87427 is not set | ||
757 | # CONFIG_SENSORS_DME1737 is not set | ||
758 | # CONFIG_SENSORS_SMSC47M1 is not set | ||
759 | # CONFIG_SENSORS_SMSC47M192 is not set | ||
760 | # CONFIG_SENSORS_SMSC47B397 is not set | ||
761 | # CONFIG_SENSORS_ADS7828 is not set | ||
762 | # CONFIG_SENSORS_THMC50 is not set | ||
763 | # CONFIG_SENSORS_VT1211 is not set | ||
764 | # CONFIG_SENSORS_W83781D is not set | ||
765 | # CONFIG_SENSORS_W83791D is not set | ||
766 | # CONFIG_SENSORS_W83792D is not set | ||
767 | # CONFIG_SENSORS_W83793 is not set | ||
768 | # CONFIG_SENSORS_W83L785TS is not set | ||
769 | # CONFIG_SENSORS_W83L786NG is not set | ||
770 | # CONFIG_SENSORS_W83627HF is not set | ||
771 | # CONFIG_SENSORS_W83627EHF is not set | ||
772 | # CONFIG_HWMON_DEBUG_CHIP is not set | ||
773 | # CONFIG_THERMAL is not set | ||
774 | # CONFIG_THERMAL_HWMON is not set | ||
775 | CONFIG_WATCHDOG=y | ||
776 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
777 | |||
778 | # | ||
779 | # Watchdog Device Drivers | ||
780 | # | ||
781 | # CONFIG_SOFT_WATCHDOG is not set | ||
782 | CONFIG_BFIN_WDT=y | ||
783 | |||
784 | # | ||
785 | # Sonics Silicon Backplane | ||
786 | # | ||
787 | CONFIG_SSB_POSSIBLE=y | ||
788 | # CONFIG_SSB is not set | ||
789 | |||
790 | # | ||
791 | # Multifunction device drivers | ||
792 | # | ||
793 | # CONFIG_MFD_SM501 is not set | ||
794 | # CONFIG_HTC_PASIC3 is not set | ||
795 | |||
796 | # | ||
797 | # Multimedia devices | ||
798 | # | ||
799 | |||
800 | # | ||
801 | # Multimedia core support | ||
802 | # | ||
803 | # CONFIG_VIDEO_DEV is not set | ||
804 | # CONFIG_DVB_CORE is not set | ||
805 | # CONFIG_VIDEO_MEDIA is not set | ||
806 | |||
807 | # | ||
808 | # Multimedia drivers | ||
809 | # | ||
810 | # CONFIG_DAB is not set | ||
811 | |||
812 | # | ||
813 | # Graphics support | ||
814 | # | ||
815 | # CONFIG_VGASTATE is not set | ||
816 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
817 | # CONFIG_FB is not set | ||
818 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
819 | |||
820 | # | ||
821 | # Display device support | ||
822 | # | ||
823 | # CONFIG_DISPLAY_SUPPORT is not set | ||
824 | |||
825 | # | ||
826 | # Sound | ||
827 | # | ||
828 | # CONFIG_SOUND is not set | ||
829 | CONFIG_HID_SUPPORT=y | ||
830 | CONFIG_HID=y | ||
831 | # CONFIG_HID_DEBUG is not set | ||
832 | # CONFIG_HIDRAW is not set | ||
833 | # CONFIG_USB_SUPPORT is not set | ||
834 | CONFIG_MMC=y | ||
835 | # CONFIG_MMC_DEBUG is not set | ||
836 | # CONFIG_MMC_UNSAFE_RESUME is not set | ||
837 | |||
838 | # | ||
839 | # MMC/SD Card Drivers | ||
840 | # | ||
841 | CONFIG_MMC_BLOCK=y | ||
842 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
843 | # CONFIG_SDIO_UART is not set | ||
844 | # CONFIG_MMC_TEST is not set | ||
845 | |||
846 | # | ||
847 | # MMC/SD Host Controller Drivers | ||
848 | # | ||
849 | CONFIG_MMC_SPI=y | ||
850 | # CONFIG_SPI_MMC is not set | ||
851 | # CONFIG_MEMSTICK is not set | ||
852 | # CONFIG_NEW_LEDS is not set | ||
853 | # CONFIG_ACCESSIBILITY is not set | ||
854 | CONFIG_RTC_LIB=y | ||
855 | CONFIG_RTC_CLASS=y | ||
856 | CONFIG_RTC_HCTOSYS=y | ||
857 | CONFIG_RTC_HCTOSYS_DEVICE="rtc0" | ||
858 | # CONFIG_RTC_DEBUG is not set | ||
859 | |||
860 | # | ||
861 | # RTC interfaces | ||
862 | # | ||
863 | CONFIG_RTC_INTF_SYSFS=y | ||
864 | CONFIG_RTC_INTF_PROC=y | ||
865 | CONFIG_RTC_INTF_DEV=y | ||
866 | # CONFIG_RTC_INTF_DEV_UIE_EMUL is not set | ||
867 | # CONFIG_RTC_DRV_TEST is not set | ||
868 | |||
869 | # | ||
870 | # I2C RTC drivers | ||
871 | # | ||
872 | # CONFIG_RTC_DRV_DS1307 is not set | ||
873 | # CONFIG_RTC_DRV_DS1374 is not set | ||
874 | # CONFIG_RTC_DRV_DS1672 is not set | ||
875 | # CONFIG_RTC_DRV_MAX6900 is not set | ||
876 | # CONFIG_RTC_DRV_RS5C372 is not set | ||
877 | # CONFIG_RTC_DRV_ISL1208 is not set | ||
878 | # CONFIG_RTC_DRV_X1205 is not set | ||
879 | # CONFIG_RTC_DRV_PCF8563 is not set | ||
880 | # CONFIG_RTC_DRV_PCF8583 is not set | ||
881 | # CONFIG_RTC_DRV_M41T80 is not set | ||
882 | # CONFIG_RTC_DRV_S35390A is not set | ||
883 | # CONFIG_RTC_DRV_FM3130 is not set | ||
884 | |||
885 | # | ||
886 | # SPI RTC drivers | ||
887 | # | ||
888 | # CONFIG_RTC_DRV_MAX6902 is not set | ||
889 | # CONFIG_RTC_DRV_R9701 is not set | ||
890 | # CONFIG_RTC_DRV_RS5C348 is not set | ||
891 | |||
892 | # | ||
893 | # Platform RTC drivers | ||
894 | # | ||
895 | # CONFIG_RTC_DRV_DS1511 is not set | ||
896 | # CONFIG_RTC_DRV_DS1553 is not set | ||
897 | # CONFIG_RTC_DRV_DS1742 is not set | ||
898 | # CONFIG_RTC_DRV_STK17TA8 is not set | ||
899 | # CONFIG_RTC_DRV_M48T86 is not set | ||
900 | # CONFIG_RTC_DRV_M48T59 is not set | ||
901 | # CONFIG_RTC_DRV_V3020 is not set | ||
902 | |||
903 | # | ||
904 | # on-CPU RTC drivers | ||
905 | # | ||
906 | CONFIG_RTC_DRV_BFIN=y | ||
907 | # CONFIG_UIO is not set | ||
908 | |||
909 | # | ||
910 | # File systems | ||
911 | # | ||
912 | # CONFIG_EXT2_FS is not set | ||
913 | # CONFIG_EXT3_FS is not set | ||
914 | # CONFIG_EXT4DEV_FS is not set | ||
915 | # CONFIG_REISERFS_FS is not set | ||
916 | # CONFIG_JFS_FS is not set | ||
917 | # CONFIG_FS_POSIX_ACL is not set | ||
918 | # CONFIG_XFS_FS is not set | ||
919 | # CONFIG_OCFS2_FS is not set | ||
920 | # CONFIG_DNOTIFY is not set | ||
921 | CONFIG_INOTIFY=y | ||
922 | CONFIG_INOTIFY_USER=y | ||
923 | # CONFIG_QUOTA is not set | ||
924 | # CONFIG_AUTOFS_FS is not set | ||
925 | # CONFIG_AUTOFS4_FS is not set | ||
926 | # CONFIG_FUSE_FS is not set | ||
927 | |||
928 | # | ||
929 | # CD-ROM/DVD Filesystems | ||
930 | # | ||
931 | # CONFIG_ISO9660_FS is not set | ||
932 | # CONFIG_UDF_FS is not set | ||
933 | |||
934 | # | ||
935 | # DOS/FAT/NT Filesystems | ||
936 | # | ||
937 | CONFIG_FAT_FS=y | ||
938 | CONFIG_MSDOS_FS=y | ||
939 | CONFIG_VFAT_FS=y | ||
940 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
941 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
942 | # CONFIG_NTFS_FS is not set | ||
943 | |||
944 | # | ||
945 | # Pseudo filesystems | ||
946 | # | ||
947 | CONFIG_PROC_FS=y | ||
948 | CONFIG_PROC_SYSCTL=y | ||
949 | CONFIG_SYSFS=y | ||
950 | # CONFIG_TMPFS is not set | ||
951 | # CONFIG_HUGETLB_PAGE is not set | ||
952 | # CONFIG_CONFIGFS_FS is not set | ||
953 | |||
954 | # | ||
955 | # Miscellaneous filesystems | ||
956 | # | ||
957 | # CONFIG_ADFS_FS is not set | ||
958 | # CONFIG_AFFS_FS is not set | ||
959 | # CONFIG_HFS_FS is not set | ||
960 | # CONFIG_HFSPLUS_FS is not set | ||
961 | # CONFIG_BEFS_FS is not set | ||
962 | # CONFIG_BFS_FS is not set | ||
963 | # CONFIG_EFS_FS is not set | ||
964 | CONFIG_YAFFS_FS=m | ||
965 | CONFIG_YAFFS_YAFFS1=y | ||
966 | # CONFIG_YAFFS_9BYTE_TAGS is not set | ||
967 | # CONFIG_YAFFS_DOES_ECC is not set | ||
968 | CONFIG_YAFFS_YAFFS2=y | ||
969 | CONFIG_YAFFS_AUTO_YAFFS2=y | ||
970 | # CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set | ||
971 | # CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set | ||
972 | # CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set | ||
973 | CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y | ||
974 | CONFIG_JFFS2_FS=y | ||
975 | CONFIG_JFFS2_FS_DEBUG=0 | ||
976 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
977 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set | ||
978 | # CONFIG_JFFS2_SUMMARY is not set | ||
979 | # CONFIG_JFFS2_FS_XATTR is not set | ||
980 | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||
981 | CONFIG_JFFS2_ZLIB=y | ||
982 | # CONFIG_JFFS2_LZO is not set | ||
983 | CONFIG_JFFS2_RTIME=y | ||
984 | # CONFIG_JFFS2_RUBIN is not set | ||
985 | # CONFIG_CRAMFS is not set | ||
986 | # CONFIG_VXFS_FS is not set | ||
987 | # CONFIG_MINIX_FS is not set | ||
988 | # CONFIG_HPFS_FS is not set | ||
989 | # CONFIG_QNX4FS_FS is not set | ||
990 | # CONFIG_ROMFS_FS is not set | ||
991 | # CONFIG_SYSV_FS is not set | ||
992 | # CONFIG_UFS_FS is not set | ||
993 | CONFIG_NETWORK_FILESYSTEMS=y | ||
994 | CONFIG_NFS_FS=y | ||
995 | CONFIG_NFS_V3=y | ||
996 | # CONFIG_NFS_V3_ACL is not set | ||
997 | CONFIG_NFS_V4=y | ||
998 | # CONFIG_NFSD is not set | ||
999 | # CONFIG_ROOT_NFS is not set | ||
1000 | CONFIG_LOCKD=y | ||
1001 | CONFIG_LOCKD_V4=y | ||
1002 | CONFIG_NFS_COMMON=y | ||
1003 | CONFIG_SUNRPC=y | ||
1004 | CONFIG_SUNRPC_GSS=y | ||
1005 | # CONFIG_SUNRPC_BIND34 is not set | ||
1006 | CONFIG_RPCSEC_GSS_KRB5=y | ||
1007 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1008 | CONFIG_SMB_FS=y | ||
1009 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
1010 | CONFIG_CIFS=y | ||
1011 | # CONFIG_CIFS_STATS is not set | ||
1012 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
1013 | # CONFIG_CIFS_XATTR is not set | ||
1014 | # CONFIG_CIFS_DEBUG2 is not set | ||
1015 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
1016 | # CONFIG_NCP_FS is not set | ||
1017 | # CONFIG_CODA_FS is not set | ||
1018 | # CONFIG_AFS_FS is not set | ||
1019 | |||
1020 | # | ||
1021 | # Partition Types | ||
1022 | # | ||
1023 | # CONFIG_PARTITION_ADVANCED is not set | ||
1024 | CONFIG_MSDOS_PARTITION=y | ||
1025 | CONFIG_NLS=y | ||
1026 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1027 | CONFIG_NLS_CODEPAGE_437=y | ||
1028 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1029 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1030 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1031 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1032 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1033 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1034 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1035 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1036 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1037 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1038 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1039 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1040 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1041 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1042 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1043 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1044 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1045 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1046 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1047 | # CONFIG_NLS_ISO8859_8 is not set | ||
1048 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1049 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1050 | CONFIG_NLS_ASCII=y | ||
1051 | # CONFIG_NLS_ISO8859_1 is not set | ||
1052 | # CONFIG_NLS_ISO8859_2 is not set | ||
1053 | # CONFIG_NLS_ISO8859_3 is not set | ||
1054 | # CONFIG_NLS_ISO8859_4 is not set | ||
1055 | # CONFIG_NLS_ISO8859_5 is not set | ||
1056 | # CONFIG_NLS_ISO8859_6 is not set | ||
1057 | # CONFIG_NLS_ISO8859_7 is not set | ||
1058 | # CONFIG_NLS_ISO8859_9 is not set | ||
1059 | # CONFIG_NLS_ISO8859_13 is not set | ||
1060 | # CONFIG_NLS_ISO8859_14 is not set | ||
1061 | # CONFIG_NLS_ISO8859_15 is not set | ||
1062 | # CONFIG_NLS_KOI8_R is not set | ||
1063 | # CONFIG_NLS_KOI8_U is not set | ||
1064 | CONFIG_NLS_UTF8=y | ||
1065 | # CONFIG_DLM is not set | ||
1066 | |||
1067 | # | ||
1068 | # Kernel hacking | ||
1069 | # | ||
1070 | # CONFIG_PRINTK_TIME is not set | ||
1071 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
1072 | CONFIG_ENABLE_MUST_CHECK=y | ||
1073 | CONFIG_FRAME_WARN=1024 | ||
1074 | # CONFIG_MAGIC_SYSRQ is not set | ||
1075 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1076 | CONFIG_DEBUG_FS=y | ||
1077 | # CONFIG_HEADERS_CHECK is not set | ||
1078 | # CONFIG_DEBUG_KERNEL is not set | ||
1079 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
1080 | # CONFIG_SAMPLES is not set | ||
1081 | CONFIG_DEBUG_MMRS=y | ||
1082 | CONFIG_DEBUG_HUNT_FOR_ZERO=y | ||
1083 | CONFIG_DEBUG_BFIN_HWTRACE_ON=y | ||
1084 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y | ||
1085 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set | ||
1086 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set | ||
1087 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0 | ||
1088 | # CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set | ||
1089 | # CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set | ||
1090 | CONFIG_EARLY_PRINTK=y | ||
1091 | CONFIG_CPLB_INFO=y | ||
1092 | CONFIG_ACCESS_CHECK=y | ||
1093 | |||
1094 | # | ||
1095 | # Security options | ||
1096 | # | ||
1097 | # CONFIG_KEYS is not set | ||
1098 | CONFIG_SECURITY=y | ||
1099 | # CONFIG_SECURITY_NETWORK is not set | ||
1100 | # CONFIG_SECURITY_CAPABILITIES is not set | ||
1101 | CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR=0 | ||
1102 | CONFIG_CRYPTO=y | ||
1103 | |||
1104 | # | ||
1105 | # Crypto core or helper | ||
1106 | # | ||
1107 | CONFIG_CRYPTO_ALGAPI=y | ||
1108 | CONFIG_CRYPTO_BLKCIPHER=y | ||
1109 | CONFIG_CRYPTO_MANAGER=y | ||
1110 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1111 | # CONFIG_CRYPTO_NULL is not set | ||
1112 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1113 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1114 | # CONFIG_CRYPTO_TEST is not set | ||
1115 | |||
1116 | # | ||
1117 | # Authenticated Encryption with Associated Data | ||
1118 | # | ||
1119 | # CONFIG_CRYPTO_CCM is not set | ||
1120 | # CONFIG_CRYPTO_GCM is not set | ||
1121 | # CONFIG_CRYPTO_SEQIV is not set | ||
1122 | |||
1123 | # | ||
1124 | # Block modes | ||
1125 | # | ||
1126 | CONFIG_CRYPTO_CBC=y | ||
1127 | # CONFIG_CRYPTO_CTR is not set | ||
1128 | # CONFIG_CRYPTO_CTS is not set | ||
1129 | # CONFIG_CRYPTO_ECB is not set | ||
1130 | # CONFIG_CRYPTO_LRW is not set | ||
1131 | # CONFIG_CRYPTO_PCBC is not set | ||
1132 | # CONFIG_CRYPTO_XTS is not set | ||
1133 | |||
1134 | # | ||
1135 | # Hash modes | ||
1136 | # | ||
1137 | # CONFIG_CRYPTO_HMAC is not set | ||
1138 | # CONFIG_CRYPTO_XCBC is not set | ||
1139 | |||
1140 | # | ||
1141 | # Digest | ||
1142 | # | ||
1143 | # CONFIG_CRYPTO_CRC32C is not set | ||
1144 | # CONFIG_CRYPTO_MD4 is not set | ||
1145 | CONFIG_CRYPTO_MD5=y | ||
1146 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1147 | # CONFIG_CRYPTO_SHA1 is not set | ||
1148 | # CONFIG_CRYPTO_SHA256 is not set | ||
1149 | # CONFIG_CRYPTO_SHA512 is not set | ||
1150 | # CONFIG_CRYPTO_TGR192 is not set | ||
1151 | # CONFIG_CRYPTO_WP512 is not set | ||
1152 | |||
1153 | # | ||
1154 | # Ciphers | ||
1155 | # | ||
1156 | # CONFIG_CRYPTO_AES is not set | ||
1157 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1158 | # CONFIG_CRYPTO_ARC4 is not set | ||
1159 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1160 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1161 | # CONFIG_CRYPTO_CAST5 is not set | ||
1162 | # CONFIG_CRYPTO_CAST6 is not set | ||
1163 | CONFIG_CRYPTO_DES=y | ||
1164 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1165 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1166 | # CONFIG_CRYPTO_SALSA20 is not set | ||
1167 | # CONFIG_CRYPTO_SEED is not set | ||
1168 | # CONFIG_CRYPTO_SERPENT is not set | ||
1169 | # CONFIG_CRYPTO_TEA is not set | ||
1170 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1171 | |||
1172 | # | ||
1173 | # Compression | ||
1174 | # | ||
1175 | # CONFIG_CRYPTO_DEFLATE is not set | ||
1176 | # CONFIG_CRYPTO_LZO is not set | ||
1177 | CONFIG_CRYPTO_HW=y | ||
1178 | |||
1179 | # | ||
1180 | # Library routines | ||
1181 | # | ||
1182 | CONFIG_BITREVERSE=y | ||
1183 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | ||
1184 | CONFIG_CRC_CCITT=m | ||
1185 | # CONFIG_CRC16 is not set | ||
1186 | CONFIG_CRC_ITU_T=y | ||
1187 | CONFIG_CRC32=y | ||
1188 | CONFIG_CRC7=y | ||
1189 | # CONFIG_LIBCRC32C is not set | ||
1190 | CONFIG_ZLIB_INFLATE=y | ||
1191 | CONFIG_ZLIB_DEFLATE=y | ||
1192 | CONFIG_PLIST=y | ||
1193 | CONFIG_HAS_IOMEM=y | ||
1194 | CONFIG_HAS_IOPORT=y | ||
1195 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/blackfin/configs/TCM-BF537_defconfig b/arch/blackfin/configs/TCM-BF537_defconfig new file mode 100644 index 000000000000..c482ee171f9e --- /dev/null +++ b/arch/blackfin/configs/TCM-BF537_defconfig | |||
@@ -0,0 +1,693 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.24.7 | ||
4 | # Thu Jul 31 00:53:15 2008 | ||
5 | # | ||
6 | # CONFIG_MMU is not set | ||
7 | # CONFIG_FPU is not set | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | ||
9 | # CONFIG_RWSEM_XCHGADD_ALGORITHM is not set | ||
10 | CONFIG_BLACKFIN=y | ||
11 | CONFIG_ZONE_DMA=y | ||
12 | CONFIG_SEMAPHORE_SLEEPERS=y | ||
13 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
14 | CONFIG_GENERIC_HWEIGHT=y | ||
15 | CONFIG_GENERIC_HARDIRQS=y | ||
16 | CONFIG_GENERIC_IRQ_PROBE=y | ||
17 | CONFIG_GENERIC_GPIO=y | ||
18 | CONFIG_FORCE_MAX_ZONEORDER=14 | ||
19 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
20 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
21 | |||
22 | # | ||
23 | # General setup | ||
24 | # | ||
25 | CONFIG_EXPERIMENTAL=y | ||
26 | CONFIG_BROKEN_ON_SMP=y | ||
27 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
28 | CONFIG_LOCALVERSION="" | ||
29 | CONFIG_LOCALVERSION_AUTO=y | ||
30 | CONFIG_SYSVIPC=y | ||
31 | CONFIG_SYSVIPC_SYSCTL=y | ||
32 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
33 | # CONFIG_USER_NS is not set | ||
34 | # CONFIG_PID_NS is not set | ||
35 | CONFIG_IKCONFIG=y | ||
36 | CONFIG_IKCONFIG_PROC=y | ||
37 | CONFIG_LOG_BUF_SHIFT=14 | ||
38 | # CONFIG_CGROUPS is not set | ||
39 | CONFIG_FAIR_GROUP_SCHED=y | ||
40 | CONFIG_FAIR_USER_SCHED=y | ||
41 | # CONFIG_FAIR_CGROUP_SCHED is not set | ||
42 | CONFIG_SYSFS_DEPRECATED=y | ||
43 | # CONFIG_RELAY is not set | ||
44 | # CONFIG_BLK_DEV_INITRD is not set | ||
45 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
46 | CONFIG_SYSCTL=y | ||
47 | CONFIG_EMBEDDED=y | ||
48 | # CONFIG_UID16 is not set | ||
49 | CONFIG_SYSCTL_SYSCALL=y | ||
50 | CONFIG_KALLSYMS=y | ||
51 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
52 | # CONFIG_HOTPLUG is not set | ||
53 | CONFIG_PRINTK=y | ||
54 | CONFIG_BUG=y | ||
55 | CONFIG_ELF_CORE=y | ||
56 | CONFIG_BASE_FULL=y | ||
57 | CONFIG_FUTEX=y | ||
58 | CONFIG_ANON_INODES=y | ||
59 | CONFIG_EPOLL=y | ||
60 | CONFIG_SIGNALFD=y | ||
61 | CONFIG_EVENTFD=y | ||
62 | CONFIG_VM_EVENT_COUNTERS=y | ||
63 | CONFIG_SLAB=y | ||
64 | # CONFIG_SLUB is not set | ||
65 | # CONFIG_SLOB is not set | ||
66 | CONFIG_SLABINFO=y | ||
67 | CONFIG_RT_MUTEXES=y | ||
68 | CONFIG_TINY_SHMEM=y | ||
69 | CONFIG_BASE_SMALL=0 | ||
70 | CONFIG_MODULES=y | ||
71 | CONFIG_MODULE_UNLOAD=y | ||
72 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
73 | # CONFIG_MODVERSIONS is not set | ||
74 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
75 | CONFIG_KMOD=y | ||
76 | CONFIG_BLOCK=y | ||
77 | # CONFIG_LBD is not set | ||
78 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
79 | # CONFIG_LSF is not set | ||
80 | # CONFIG_BLK_DEV_BSG is not set | ||
81 | |||
82 | # | ||
83 | # IO Schedulers | ||
84 | # | ||
85 | CONFIG_IOSCHED_NOOP=y | ||
86 | # CONFIG_IOSCHED_AS is not set | ||
87 | # CONFIG_IOSCHED_DEADLINE is not set | ||
88 | CONFIG_IOSCHED_CFQ=y | ||
89 | # CONFIG_DEFAULT_AS is not set | ||
90 | # CONFIG_DEFAULT_DEADLINE is not set | ||
91 | # CONFIG_DEFAULT_CFQ is not set | ||
92 | CONFIG_DEFAULT_NOOP=y | ||
93 | CONFIG_DEFAULT_IOSCHED="noop" | ||
94 | CONFIG_PREEMPT_NONE=y | ||
95 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
96 | # CONFIG_PREEMPT is not set | ||
97 | |||
98 | # | ||
99 | # Blackfin Processor Options | ||
100 | # | ||
101 | |||
102 | # | ||
103 | # Processor and Board Settings | ||
104 | # | ||
105 | # CONFIG_BF522 is not set | ||
106 | # CONFIG_BF523 is not set | ||
107 | # CONFIG_BF524 is not set | ||
108 | # CONFIG_BF525 is not set | ||
109 | # CONFIG_BF526 is not set | ||
110 | # CONFIG_BF527 is not set | ||
111 | # CONFIG_BF531 is not set | ||
112 | # CONFIG_BF532 is not set | ||
113 | # CONFIG_BF533 is not set | ||
114 | # CONFIG_BF534 is not set | ||
115 | # CONFIG_BF536 is not set | ||
116 | CONFIG_BF537=y | ||
117 | # CONFIG_BF542 is not set | ||
118 | # CONFIG_BF544 is not set | ||
119 | # CONFIG_BF547 is not set | ||
120 | # CONFIG_BF548 is not set | ||
121 | # CONFIG_BF549 is not set | ||
122 | # CONFIG_BF561 is not set | ||
123 | # CONFIG_BF_REV_0_0 is not set | ||
124 | # CONFIG_BF_REV_0_1 is not set | ||
125 | CONFIG_BF_REV_0_2=y | ||
126 | # CONFIG_BF_REV_0_3 is not set | ||
127 | # CONFIG_BF_REV_0_4 is not set | ||
128 | # CONFIG_BF_REV_0_5 is not set | ||
129 | # CONFIG_BF_REV_ANY is not set | ||
130 | # CONFIG_BF_REV_NONE is not set | ||
131 | CONFIG_BF53x=y | ||
132 | CONFIG_IRQ_PLL_WAKEUP=7 | ||
133 | CONFIG_IRQ_RTC=8 | ||
134 | CONFIG_IRQ_PPI=8 | ||
135 | CONFIG_IRQ_SPORT0_RX=9 | ||
136 | CONFIG_IRQ_SPORT0_TX=9 | ||
137 | CONFIG_IRQ_SPORT1_RX=9 | ||
138 | CONFIG_IRQ_SPORT1_TX=9 | ||
139 | CONFIG_IRQ_TWI=10 | ||
140 | CONFIG_IRQ_SPI=10 | ||
141 | CONFIG_IRQ_UART0_RX=10 | ||
142 | CONFIG_IRQ_UART0_TX=10 | ||
143 | CONFIG_IRQ_UART1_RX=10 | ||
144 | CONFIG_IRQ_UART1_TX=10 | ||
145 | CONFIG_IRQ_MAC_RX=11 | ||
146 | CONFIG_IRQ_MAC_TX=11 | ||
147 | CONFIG_IRQ_TMR0=12 | ||
148 | CONFIG_IRQ_TMR1=12 | ||
149 | CONFIG_IRQ_TMR2=12 | ||
150 | CONFIG_IRQ_TMR3=12 | ||
151 | CONFIG_IRQ_TMR4=12 | ||
152 | CONFIG_IRQ_TMR5=12 | ||
153 | CONFIG_IRQ_TMR6=12 | ||
154 | CONFIG_IRQ_TMR7=12 | ||
155 | CONFIG_IRQ_PORTG_INTB=12 | ||
156 | CONFIG_IRQ_MEM_DMA0=13 | ||
157 | CONFIG_IRQ_MEM_DMA1=13 | ||
158 | CONFIG_IRQ_WATCH=13 | ||
159 | # CONFIG_BFIN537_STAMP is not set | ||
160 | # CONFIG_BFIN537_BLUETECHNIX_CM is not set | ||
161 | CONFIG_BFIN537_BLUETECHNIX_TCM=y | ||
162 | # CONFIG_PNAV10 is not set | ||
163 | # CONFIG_CAMSIG_MINOTAUR is not set | ||
164 | # CONFIG_GENERIC_BF537_BOARD is not set | ||
165 | |||
166 | # | ||
167 | # BF537 Specific Configuration | ||
168 | # | ||
169 | |||
170 | # | ||
171 | # Interrupt Priority Assignment | ||
172 | # | ||
173 | |||
174 | # | ||
175 | # Priority | ||
176 | # | ||
177 | CONFIG_IRQ_DMA_ERROR=7 | ||
178 | CONFIG_IRQ_ERROR=7 | ||
179 | CONFIG_IRQ_CAN_RX=11 | ||
180 | CONFIG_IRQ_CAN_TX=11 | ||
181 | CONFIG_IRQ_PROG_INTA=12 | ||
182 | |||
183 | # | ||
184 | # Board customizations | ||
185 | # | ||
186 | # CONFIG_CMDLINE_BOOL is not set | ||
187 | CONFIG_BOOT_LOAD=0x1000 | ||
188 | |||
189 | # | ||
190 | # Clock/PLL Setup | ||
191 | # | ||
192 | CONFIG_CLKIN_HZ=25000000 | ||
193 | # CONFIG_BFIN_KERNEL_CLOCK is not set | ||
194 | CONFIG_MAX_MEM_SIZE=32 | ||
195 | CONFIG_MAX_VCO_HZ=600000000 | ||
196 | CONFIG_MIN_VCO_HZ=50000000 | ||
197 | CONFIG_MAX_SCLK_HZ=133333333 | ||
198 | CONFIG_MIN_SCLK_HZ=27000000 | ||
199 | |||
200 | # | ||
201 | # Kernel Timer/Scheduler | ||
202 | # | ||
203 | # CONFIG_HZ_100 is not set | ||
204 | CONFIG_HZ_250=y | ||
205 | # CONFIG_HZ_300 is not set | ||
206 | # CONFIG_HZ_1000 is not set | ||
207 | CONFIG_HZ=250 | ||
208 | CONFIG_GENERIC_TIME=y | ||
209 | CONFIG_GENERIC_CLOCKEVENTS=y | ||
210 | # CONFIG_CYCLES_CLOCKSOURCE is not set | ||
211 | # CONFIG_TICK_ONESHOT is not set | ||
212 | # CONFIG_NO_HZ is not set | ||
213 | # CONFIG_HIGH_RES_TIMERS is not set | ||
214 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | ||
215 | |||
216 | # | ||
217 | # Misc | ||
218 | # | ||
219 | CONFIG_BFIN_SCRATCH_REG_RETN=y | ||
220 | # CONFIG_BFIN_SCRATCH_REG_RETE is not set | ||
221 | # CONFIG_BFIN_SCRATCH_REG_CYCLES is not set | ||
222 | |||
223 | # | ||
224 | # Blackfin Kernel Optimizations | ||
225 | # | ||
226 | |||
227 | # | ||
228 | # Memory Optimizations | ||
229 | # | ||
230 | CONFIG_I_ENTRY_L1=y | ||
231 | CONFIG_EXCPT_IRQ_SYSC_L1=y | ||
232 | CONFIG_DO_IRQ_L1=y | ||
233 | CONFIG_CORE_TIMER_IRQ_L1=y | ||
234 | CONFIG_IDLE_L1=y | ||
235 | CONFIG_SCHEDULE_L1=y | ||
236 | CONFIG_ARITHMETIC_OPS_L1=y | ||
237 | CONFIG_ACCESS_OK_L1=y | ||
238 | CONFIG_MEMSET_L1=y | ||
239 | CONFIG_MEMCPY_L1=y | ||
240 | CONFIG_SYS_BFIN_SPINLOCK_L1=y | ||
241 | CONFIG_IP_CHECKSUM_L1=y | ||
242 | CONFIG_CACHELINE_ALIGNED_L1=y | ||
243 | CONFIG_SYSCALL_TAB_L1=y | ||
244 | CONFIG_CPLB_SWITCH_TAB_L1=y | ||
245 | CONFIG_RAMKERNEL=y | ||
246 | # CONFIG_ROMKERNEL is not set | ||
247 | CONFIG_SELECT_MEMORY_MODEL=y | ||
248 | CONFIG_FLATMEM_MANUAL=y | ||
249 | # CONFIG_DISCONTIGMEM_MANUAL is not set | ||
250 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
251 | CONFIG_FLATMEM=y | ||
252 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
253 | # CONFIG_SPARSEMEM_STATIC is not set | ||
254 | # CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set | ||
255 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
256 | # CONFIG_RESOURCES_64BIT is not set | ||
257 | CONFIG_ZONE_DMA_FLAG=1 | ||
258 | CONFIG_VIRT_TO_BUS=y | ||
259 | # CONFIG_BFIN_GPTIMERS is not set | ||
260 | CONFIG_BFIN_DMA_5XX=y | ||
261 | # CONFIG_DMA_UNCACHED_4M is not set | ||
262 | # CONFIG_DMA_UNCACHED_2M is not set | ||
263 | CONFIG_DMA_UNCACHED_1M=y | ||
264 | # CONFIG_DMA_UNCACHED_NONE is not set | ||
265 | |||
266 | # | ||
267 | # Cache Support | ||
268 | # | ||
269 | CONFIG_BFIN_ICACHE=y | ||
270 | CONFIG_BFIN_DCACHE=y | ||
271 | # CONFIG_BFIN_DCACHE_BANKA is not set | ||
272 | # CONFIG_BFIN_ICACHE_LOCK is not set | ||
273 | CONFIG_BFIN_WB=y | ||
274 | # CONFIG_BFIN_WT is not set | ||
275 | # CONFIG_MPU is not set | ||
276 | |||
277 | # | ||
278 | # Asynchonous Memory Configuration | ||
279 | # | ||
280 | |||
281 | # | ||
282 | # EBIU_AMGCTL Global Control | ||
283 | # | ||
284 | CONFIG_C_AMCKEN=y | ||
285 | CONFIG_C_CDPRIO=y | ||
286 | # CONFIG_C_AMBEN is not set | ||
287 | # CONFIG_C_AMBEN_B0 is not set | ||
288 | # CONFIG_C_AMBEN_B0_B1 is not set | ||
289 | # CONFIG_C_AMBEN_B0_B1_B2 is not set | ||
290 | CONFIG_C_AMBEN_ALL=y | ||
291 | |||
292 | # | ||
293 | # EBIU_AMBCTL Control | ||
294 | # | ||
295 | CONFIG_BANK_0=0x7BB0 | ||
296 | CONFIG_BANK_1=0x7BB0 | ||
297 | CONFIG_BANK_2=0x7BB0 | ||
298 | CONFIG_BANK_3=0xFFC2 | ||
299 | |||
300 | # | ||
301 | # Bus options (PCI, PCMCIA, EISA, MCA, ISA) | ||
302 | # | ||
303 | # CONFIG_PCI is not set | ||
304 | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||
305 | |||
306 | # | ||
307 | # Executable file formats | ||
308 | # | ||
309 | CONFIG_BINFMT_ELF_FDPIC=y | ||
310 | CONFIG_BINFMT_FLAT=y | ||
311 | CONFIG_BINFMT_ZFLAT=y | ||
312 | CONFIG_BINFMT_SHARED_FLAT=y | ||
313 | # CONFIG_BINFMT_MISC is not set | ||
314 | |||
315 | # | ||
316 | # Power management options | ||
317 | # | ||
318 | # CONFIG_PM is not set | ||
319 | CONFIG_SUSPEND_UP_POSSIBLE=y | ||
320 | # CONFIG_PM_WAKEUP_BY_GPIO is not set | ||
321 | |||
322 | # | ||
323 | # CPU Frequency scaling | ||
324 | # | ||
325 | # CONFIG_CPU_FREQ is not set | ||
326 | |||
327 | # | ||
328 | # Networking | ||
329 | # | ||
330 | # CONFIG_NET is not set | ||
331 | |||
332 | # | ||
333 | # Device Drivers | ||
334 | # | ||
335 | |||
336 | # | ||
337 | # Generic Driver Options | ||
338 | # | ||
339 | CONFIG_STANDALONE=y | ||
340 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
341 | # CONFIG_SYS_HYPERVISOR is not set | ||
342 | CONFIG_MTD=y | ||
343 | # CONFIG_MTD_DEBUG is not set | ||
344 | # CONFIG_MTD_CONCAT is not set | ||
345 | CONFIG_MTD_PARTITIONS=y | ||
346 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
347 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
348 | |||
349 | # | ||
350 | # User Modules And Translation Layers | ||
351 | # | ||
352 | CONFIG_MTD_CHAR=y | ||
353 | CONFIG_MTD_BLKDEVS=y | ||
354 | CONFIG_MTD_BLOCK=y | ||
355 | # CONFIG_FTL is not set | ||
356 | # CONFIG_NFTL is not set | ||
357 | # CONFIG_INFTL is not set | ||
358 | # CONFIG_RFD_FTL is not set | ||
359 | # CONFIG_SSFDC is not set | ||
360 | # CONFIG_MTD_OOPS is not set | ||
361 | |||
362 | # | ||
363 | # RAM/ROM/Flash chip drivers | ||
364 | # | ||
365 | # CONFIG_MTD_CFI is not set | ||
366 | # CONFIG_MTD_JEDECPROBE is not set | ||
367 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
368 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
369 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
370 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
371 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
372 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
373 | CONFIG_MTD_CFI_I1=y | ||
374 | CONFIG_MTD_CFI_I2=y | ||
375 | # CONFIG_MTD_CFI_I4 is not set | ||
376 | # CONFIG_MTD_CFI_I8 is not set | ||
377 | CONFIG_MTD_RAM=y | ||
378 | # CONFIG_MTD_ROM is not set | ||
379 | # CONFIG_MTD_ABSENT is not set | ||
380 | |||
381 | # | ||
382 | # Mapping drivers for chip access | ||
383 | # | ||
384 | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||
385 | # CONFIG_MTD_GPIO_ADDR is not set | ||
386 | CONFIG_MTD_UCLINUX=y | ||
387 | # CONFIG_MTD_PLATRAM is not set | ||
388 | |||
389 | # | ||
390 | # Self-contained MTD device drivers | ||
391 | # | ||
392 | # CONFIG_MTD_DATAFLASH is not set | ||
393 | # CONFIG_MTD_M25P80 is not set | ||
394 | # CONFIG_MTD_SLRAM is not set | ||
395 | # CONFIG_MTD_PHRAM is not set | ||
396 | # CONFIG_MTD_MTDRAM is not set | ||
397 | # CONFIG_MTD_BLOCK2MTD is not set | ||
398 | |||
399 | # | ||
400 | # Disk-On-Chip Device Drivers | ||
401 | # | ||
402 | # CONFIG_MTD_DOC2000 is not set | ||
403 | # CONFIG_MTD_DOC2001 is not set | ||
404 | # CONFIG_MTD_DOC2001PLUS is not set | ||
405 | # CONFIG_MTD_NAND is not set | ||
406 | # CONFIG_MTD_ONENAND is not set | ||
407 | |||
408 | # | ||
409 | # UBI - Unsorted block images | ||
410 | # | ||
411 | # CONFIG_MTD_UBI is not set | ||
412 | # CONFIG_PARPORT is not set | ||
413 | CONFIG_BLK_DEV=y | ||
414 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
415 | # CONFIG_BLK_DEV_LOOP is not set | ||
416 | CONFIG_BLK_DEV_RAM=y | ||
417 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
418 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
419 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
420 | # CONFIG_CDROM_PKTCDVD is not set | ||
421 | CONFIG_MISC_DEVICES=y | ||
422 | # CONFIG_EEPROM_93CX6 is not set | ||
423 | # CONFIG_IDE is not set | ||
424 | |||
425 | # | ||
426 | # SCSI device support | ||
427 | # | ||
428 | # CONFIG_RAID_ATTRS is not set | ||
429 | # CONFIG_SCSI is not set | ||
430 | # CONFIG_SCSI_DMA is not set | ||
431 | # CONFIG_SCSI_NETLINK is not set | ||
432 | # CONFIG_ATA is not set | ||
433 | # CONFIG_MD is not set | ||
434 | # CONFIG_PHONE is not set | ||
435 | |||
436 | # | ||
437 | # Input device support | ||
438 | # | ||
439 | # CONFIG_INPUT is not set | ||
440 | |||
441 | # | ||
442 | # Hardware I/O ports | ||
443 | # | ||
444 | # CONFIG_SERIO is not set | ||
445 | # CONFIG_GAMEPORT is not set | ||
446 | |||
447 | # | ||
448 | # Character devices | ||
449 | # | ||
450 | # CONFIG_AD9960 is not set | ||
451 | # CONFIG_SPI_ADC_BF533 is not set | ||
452 | # CONFIG_BF5xx_PPIFCD is not set | ||
453 | # CONFIG_BFIN_SIMPLE_TIMER is not set | ||
454 | # CONFIG_BF5xx_PPI is not set | ||
455 | CONFIG_BFIN_SPORT=y | ||
456 | # CONFIG_BFIN_TIMER_LATENCY is not set | ||
457 | # CONFIG_SIMPLE_GPIO is not set | ||
458 | # CONFIG_VT is not set | ||
459 | # CONFIG_SERIAL_NONSTANDARD is not set | ||
460 | |||
461 | # | ||
462 | # Serial drivers | ||
463 | # | ||
464 | # CONFIG_SERIAL_8250 is not set | ||
465 | |||
466 | # | ||
467 | # Non-8250 serial port support | ||
468 | # | ||
469 | CONFIG_SERIAL_BFIN=y | ||
470 | CONFIG_SERIAL_BFIN_CONSOLE=y | ||
471 | CONFIG_SERIAL_BFIN_DMA=y | ||
472 | # CONFIG_SERIAL_BFIN_PIO is not set | ||
473 | CONFIG_SERIAL_BFIN_UART0=y | ||
474 | # CONFIG_BFIN_UART0_CTSRTS is not set | ||
475 | CONFIG_SERIAL_BFIN_UART1=y | ||
476 | # CONFIG_BFIN_UART1_CTSRTS is not set | ||
477 | CONFIG_SERIAL_CORE=y | ||
478 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
479 | # CONFIG_SERIAL_BFIN_SPORT is not set | ||
480 | CONFIG_UNIX98_PTYS=y | ||
481 | # CONFIG_LEGACY_PTYS is not set | ||
482 | |||
483 | # | ||
484 | # CAN, the car bus and industrial fieldbus | ||
485 | # | ||
486 | # CONFIG_CAN4LINUX is not set | ||
487 | # CONFIG_IPMI_HANDLER is not set | ||
488 | # CONFIG_HW_RANDOM is not set | ||
489 | # CONFIG_GEN_RTC is not set | ||
490 | # CONFIG_R3964 is not set | ||
491 | # CONFIG_RAW_DRIVER is not set | ||
492 | # CONFIG_TCG_TPM is not set | ||
493 | # CONFIG_I2C is not set | ||
494 | |||
495 | # | ||
496 | # SPI support | ||
497 | # | ||
498 | CONFIG_SPI=y | ||
499 | CONFIG_SPI_MASTER=y | ||
500 | |||
501 | # | ||
502 | # SPI Master Controller Drivers | ||
503 | # | ||
504 | CONFIG_SPI_BFIN=y | ||
505 | # CONFIG_SPI_BITBANG is not set | ||
506 | |||
507 | # | ||
508 | # SPI Protocol Masters | ||
509 | # | ||
510 | # CONFIG_SPI_AT25 is not set | ||
511 | # CONFIG_SPI_SPIDEV is not set | ||
512 | # CONFIG_SPI_TLE62X0 is not set | ||
513 | # CONFIG_W1 is not set | ||
514 | # CONFIG_POWER_SUPPLY is not set | ||
515 | # CONFIG_HWMON is not set | ||
516 | CONFIG_WATCHDOG=y | ||
517 | # CONFIG_WATCHDOG_NOWAYOUT is not set | ||
518 | |||
519 | # | ||
520 | # Watchdog Device Drivers | ||
521 | # | ||
522 | # CONFIG_SOFT_WATCHDOG is not set | ||
523 | CONFIG_BFIN_WDT=y | ||
524 | |||
525 | # | ||
526 | # Sonics Silicon Backplane | ||
527 | # | ||
528 | CONFIG_SSB_POSSIBLE=y | ||
529 | # CONFIG_SSB is not set | ||
530 | |||
531 | # | ||
532 | # Multifunction device drivers | ||
533 | # | ||
534 | # CONFIG_MFD_SM501 is not set | ||
535 | |||
536 | # | ||
537 | # Multimedia devices | ||
538 | # | ||
539 | # CONFIG_VIDEO_DEV is not set | ||
540 | # CONFIG_DAB is not set | ||
541 | |||
542 | # | ||
543 | # Graphics support | ||
544 | # | ||
545 | # CONFIG_VGASTATE is not set | ||
546 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | ||
547 | # CONFIG_FB is not set | ||
548 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
549 | |||
550 | # | ||
551 | # Display device support | ||
552 | # | ||
553 | # CONFIG_DISPLAY_SUPPORT is not set | ||
554 | |||
555 | # | ||
556 | # Sound | ||
557 | # | ||
558 | # CONFIG_SOUND is not set | ||
559 | # CONFIG_USB_SUPPORT is not set | ||
560 | # CONFIG_MMC is not set | ||
561 | # CONFIG_NEW_LEDS is not set | ||
562 | # CONFIG_RTC_CLASS is not set | ||
563 | |||
564 | # | ||
565 | # Userspace I/O | ||
566 | # | ||
567 | # CONFIG_UIO is not set | ||
568 | |||
569 | # | ||
570 | # File systems | ||
571 | # | ||
572 | CONFIG_EXT2_FS=y | ||
573 | CONFIG_EXT2_FS_XATTR=y | ||
574 | # CONFIG_EXT2_FS_POSIX_ACL is not set | ||
575 | # CONFIG_EXT2_FS_SECURITY is not set | ||
576 | # CONFIG_EXT3_FS is not set | ||
577 | # CONFIG_EXT4DEV_FS is not set | ||
578 | CONFIG_FS_MBCACHE=y | ||
579 | # CONFIG_REISERFS_FS is not set | ||
580 | # CONFIG_JFS_FS is not set | ||
581 | # CONFIG_FS_POSIX_ACL is not set | ||
582 | # CONFIG_XFS_FS is not set | ||
583 | # CONFIG_GFS2_FS is not set | ||
584 | # CONFIG_MINIX_FS is not set | ||
585 | # CONFIG_ROMFS_FS is not set | ||
586 | CONFIG_INOTIFY=y | ||
587 | CONFIG_INOTIFY_USER=y | ||
588 | # CONFIG_QUOTA is not set | ||
589 | # CONFIG_DNOTIFY is not set | ||
590 | # CONFIG_AUTOFS_FS is not set | ||
591 | # CONFIG_AUTOFS4_FS is not set | ||
592 | # CONFIG_FUSE_FS is not set | ||
593 | |||
594 | # | ||
595 | # CD-ROM/DVD Filesystems | ||
596 | # | ||
597 | # CONFIG_ISO9660_FS is not set | ||
598 | # CONFIG_UDF_FS is not set | ||
599 | |||
600 | # | ||
601 | # DOS/FAT/NT Filesystems | ||
602 | # | ||
603 | # CONFIG_MSDOS_FS is not set | ||
604 | # CONFIG_VFAT_FS is not set | ||
605 | # CONFIG_NTFS_FS is not set | ||
606 | |||
607 | # | ||
608 | # Pseudo filesystems | ||
609 | # | ||
610 | CONFIG_PROC_FS=y | ||
611 | CONFIG_PROC_SYSCTL=y | ||
612 | CONFIG_SYSFS=y | ||
613 | # CONFIG_TMPFS is not set | ||
614 | # CONFIG_HUGETLB_PAGE is not set | ||
615 | # CONFIG_CONFIGFS_FS is not set | ||
616 | |||
617 | # | ||
618 | # Miscellaneous filesystems | ||
619 | # | ||
620 | # CONFIG_ADFS_FS is not set | ||
621 | # CONFIG_AFFS_FS is not set | ||
622 | # CONFIG_HFS_FS is not set | ||
623 | # CONFIG_HFSPLUS_FS is not set | ||
624 | # CONFIG_BEFS_FS is not set | ||
625 | # CONFIG_BFS_FS is not set | ||
626 | # CONFIG_EFS_FS is not set | ||
627 | # CONFIG_YAFFS_FS is not set | ||
628 | # CONFIG_JFFS2_FS is not set | ||
629 | # CONFIG_CRAMFS is not set | ||
630 | # CONFIG_VXFS_FS is not set | ||
631 | # CONFIG_HPFS_FS is not set | ||
632 | # CONFIG_QNX4FS_FS is not set | ||
633 | # CONFIG_SYSV_FS is not set | ||
634 | # CONFIG_UFS_FS is not set | ||
635 | |||
636 | # | ||
637 | # Partition Types | ||
638 | # | ||
639 | # CONFIG_PARTITION_ADVANCED is not set | ||
640 | CONFIG_MSDOS_PARTITION=y | ||
641 | # CONFIG_NLS is not set | ||
642 | # CONFIG_INSTRUMENTATION is not set | ||
643 | |||
644 | # | ||
645 | # Kernel hacking | ||
646 | # | ||
647 | # CONFIG_PRINTK_TIME is not set | ||
648 | CONFIG_ENABLE_WARN_DEPRECATED=y | ||
649 | CONFIG_ENABLE_MUST_CHECK=y | ||
650 | # CONFIG_MAGIC_SYSRQ is not set | ||
651 | # CONFIG_UNUSED_SYMBOLS is not set | ||
652 | CONFIG_DEBUG_FS=y | ||
653 | # CONFIG_HEADERS_CHECK is not set | ||
654 | # CONFIG_DEBUG_KERNEL is not set | ||
655 | # CONFIG_DEBUG_BUGVERBOSE is not set | ||
656 | # CONFIG_SAMPLES is not set | ||
657 | CONFIG_DEBUG_MMRS=y | ||
658 | CONFIG_DEBUG_HUNT_FOR_ZERO=y | ||
659 | CONFIG_DEBUG_BFIN_HWTRACE_ON=y | ||
660 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_OFF=y | ||
661 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_ONE is not set | ||
662 | # CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION_TWO is not set | ||
663 | CONFIG_DEBUG_BFIN_HWTRACE_COMPRESSION=0 | ||
664 | # CONFIG_DEBUG_BFIN_HWTRACE_EXPAND is not set | ||
665 | # CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE is not set | ||
666 | # CONFIG_EARLY_PRINTK is not set | ||
667 | CONFIG_CPLB_INFO=y | ||
668 | CONFIG_ACCESS_CHECK=y | ||
669 | |||
670 | # | ||
671 | # Security options | ||
672 | # | ||
673 | # CONFIG_KEYS is not set | ||
674 | CONFIG_SECURITY=y | ||
675 | # CONFIG_SECURITY_NETWORK is not set | ||
676 | CONFIG_SECURITY_CAPABILITIES=y | ||
677 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
678 | # CONFIG_CRYPTO is not set | ||
679 | |||
680 | # | ||
681 | # Library routines | ||
682 | # | ||
683 | # CONFIG_CRC_CCITT is not set | ||
684 | # CONFIG_CRC16 is not set | ||
685 | # CONFIG_CRC_ITU_T is not set | ||
686 | # CONFIG_CRC32 is not set | ||
687 | # CONFIG_CRC7 is not set | ||
688 | # CONFIG_LIBCRC32C is not set | ||
689 | CONFIG_ZLIB_INFLATE=y | ||
690 | CONFIG_PLIST=y | ||
691 | CONFIG_HAS_IOMEM=y | ||
692 | CONFIG_HAS_IOPORT=y | ||
693 | CONFIG_HAS_DMA=y | ||
diff --git a/arch/blackfin/kernel/cplb-mpu/cacheinit.c b/arch/blackfin/kernel/cplb-mpu/cacheinit.c index 9eecfa403187..a8b712a24c59 100644 --- a/arch/blackfin/kernel/cplb-mpu/cacheinit.c +++ b/arch/blackfin/kernel/cplb-mpu/cacheinit.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <asm/cplbinit.h> | 25 | #include <asm/cplbinit.h> |
26 | 26 | ||
27 | #if defined(CONFIG_BFIN_ICACHE) | 27 | #if defined(CONFIG_BFIN_ICACHE) |
28 | void bfin_icache_init(void) | 28 | void __init bfin_icache_init(void) |
29 | { | 29 | { |
30 | unsigned long ctrl; | 30 | unsigned long ctrl; |
31 | int i; | 31 | int i; |
@@ -43,7 +43,7 @@ void bfin_icache_init(void) | |||
43 | #endif | 43 | #endif |
44 | 44 | ||
45 | #if defined(CONFIG_BFIN_DCACHE) | 45 | #if defined(CONFIG_BFIN_DCACHE) |
46 | void bfin_dcache_init(void) | 46 | void __init bfin_dcache_init(void) |
47 | { | 47 | { |
48 | unsigned long ctrl; | 48 | unsigned long ctrl; |
49 | int i; | 49 | int i; |
diff --git a/arch/blackfin/kernel/cplb-nompu/cacheinit.c b/arch/blackfin/kernel/cplb-nompu/cacheinit.c index 8a18399f6072..bd0831592c2c 100644 --- a/arch/blackfin/kernel/cplb-nompu/cacheinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cacheinit.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <asm/cplbinit.h> | 25 | #include <asm/cplbinit.h> |
26 | 26 | ||
27 | #if defined(CONFIG_BFIN_ICACHE) | 27 | #if defined(CONFIG_BFIN_ICACHE) |
28 | void bfin_icache_init(void) | 28 | void __init bfin_icache_init(void) |
29 | { | 29 | { |
30 | unsigned long *table = icplb_table; | 30 | unsigned long *table = icplb_table; |
31 | unsigned long ctrl; | 31 | unsigned long ctrl; |
@@ -47,7 +47,7 @@ void bfin_icache_init(void) | |||
47 | #endif | 47 | #endif |
48 | 48 | ||
49 | #if defined(CONFIG_BFIN_DCACHE) | 49 | #if defined(CONFIG_BFIN_DCACHE) |
50 | void bfin_dcache_init(void) | 50 | void __init bfin_dcache_init(void) |
51 | { | 51 | { |
52 | unsigned long *table = dcplb_table; | 52 | unsigned long *table = dcplb_table; |
53 | unsigned long ctrl; | 53 | unsigned long ctrl; |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbinit.c b/arch/blackfin/kernel/cplb-nompu/cplbinit.c index 224e7cc30bc5..728f708d3981 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbinit.c | |||
@@ -164,17 +164,13 @@ static struct cplb_desc cplb_data[] = { | |||
164 | .name = "Asynchronous Memory Banks", | 164 | .name = "Asynchronous Memory Banks", |
165 | }, | 165 | }, |
166 | { | 166 | { |
167 | #ifdef L2_START | ||
168 | .start = L2_START, | 167 | .start = L2_START, |
169 | .end = L2_START + L2_LENGTH, | 168 | .end = L2_START + L2_LENGTH, |
170 | .psize = SIZE_1M, | 169 | .psize = SIZE_1M, |
171 | .attr = SWITCH_T | I_CPLB | D_CPLB, | 170 | .attr = SWITCH_T | I_CPLB | D_CPLB, |
172 | .i_conf = L2_MEMORY, | 171 | .i_conf = L2_MEMORY, |
173 | .d_conf = L2_MEMORY, | 172 | .d_conf = L2_MEMORY, |
174 | .valid = 1, | 173 | .valid = (L2_LENGTH > 0), |
175 | #else | ||
176 | .valid = 0, | ||
177 | #endif | ||
178 | .name = "L2 Memory", | 174 | .name = "L2 Memory", |
179 | }, | 175 | }, |
180 | { | 176 | { |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 23e637eb78da..7a82d10b4ebf 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -52,6 +52,7 @@ EXPORT_SYMBOL(mtd_size); | |||
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | char __initdata command_line[COMMAND_LINE_SIZE]; | 54 | char __initdata command_line[COMMAND_LINE_SIZE]; |
55 | unsigned int __initdata *__retx; | ||
55 | 56 | ||
56 | /* boot memmap, for parsing "memmap=" */ | 57 | /* boot memmap, for parsing "memmap=" */ |
57 | #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ | 58 | #define BFIN_MEMMAP_MAX 128 /* number of entries in bfin_memmap */ |
@@ -131,14 +132,14 @@ void __init bf53x_relocate_l1_mem(void) | |||
131 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + | 132 | dma_memcpy(_sdata_b_l1, _l1_lma_start + l1_code_length + |
132 | l1_data_a_length, l1_data_b_length); | 133 | l1_data_a_length, l1_data_b_length); |
133 | 134 | ||
134 | #ifdef L2_LENGTH | 135 | if (L2_LENGTH != 0) { |
135 | l2_length = _ebss_l2 - _stext_l2; | 136 | l2_length = _ebss_l2 - _stext_l2; |
136 | if (l2_length > L2_LENGTH) | 137 | if (l2_length > L2_LENGTH) |
137 | panic("L2 SRAM Overflow\n"); | 138 | panic("L2 SRAM Overflow\n"); |
138 | 139 | ||
139 | /* Copy _stext_l2 to _edata_l2 to L2 SRAM */ | 140 | /* Copy _stext_l2 to _edata_l2 to L2 SRAM */ |
140 | dma_memcpy(_stext_l2, _l2_lma_start, l2_length); | 141 | dma_memcpy(_stext_l2, _l2_lma_start, l2_length); |
141 | #endif | 142 | } |
142 | } | 143 | } |
143 | 144 | ||
144 | /* add_memory_region to memmap */ | 145 | /* add_memory_region to memmap */ |
@@ -738,6 +739,16 @@ void __init setup_arch(char **cmdline_p) | |||
738 | 739 | ||
739 | memory_setup(); | 740 | memory_setup(); |
740 | 741 | ||
742 | /* Initialize Async memory banks */ | ||
743 | bfin_write_EBIU_AMBCTL0(AMBCTL0VAL); | ||
744 | bfin_write_EBIU_AMBCTL1(AMBCTL1VAL); | ||
745 | bfin_write_EBIU_AMGCTL(AMGCTLVAL); | ||
746 | #ifdef CONFIG_EBIU_MBSCTLVAL | ||
747 | bfin_write_EBIU_MBSCTL(CONFIG_EBIU_MBSCTLVAL); | ||
748 | bfin_write_EBIU_MODE(CONFIG_EBIU_MODEVAL); | ||
749 | bfin_write_EBIU_FCTL(CONFIG_EBIU_FCTLVAL); | ||
750 | #endif | ||
751 | |||
741 | cclk = get_cclk(); | 752 | cclk = get_cclk(); |
742 | sclk = get_sclk(); | 753 | sclk = get_sclk(); |
743 | 754 | ||
@@ -775,7 +786,11 @@ void __init setup_arch(char **cmdline_p) | |||
775 | bfin_write_SWRST(DOUBLE_FAULT); | 786 | bfin_write_SWRST(DOUBLE_FAULT); |
776 | 787 | ||
777 | if (_bfin_swrst & RESET_DOUBLE) | 788 | if (_bfin_swrst & RESET_DOUBLE) |
778 | printk(KERN_INFO "Recovering from Double Fault event\n"); | 789 | /* |
790 | * don't decode the address, since you don't know if this | ||
791 | * kernel's symbol map is the same as the crashing kernel | ||
792 | */ | ||
793 | printk(KERN_INFO "Recovering from Double Fault event at %pF\n", __retx); | ||
779 | else if (_bfin_swrst & RESET_WDOG) | 794 | else if (_bfin_swrst & RESET_WDOG) |
780 | printk(KERN_INFO "Recovering from Watchdog event\n"); | 795 | printk(KERN_INFO "Recovering from Watchdog event\n"); |
781 | else if (_bfin_swrst & RESET_SOFTWARE) | 796 | else if (_bfin_swrst & RESET_SOFTWARE) |
@@ -1049,7 +1064,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1049 | dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS, | 1064 | dsup_banks, BFIN_DSUBBANKS, BFIN_DWAYS, |
1050 | BFIN_DLINES); | 1065 | BFIN_DLINES); |
1051 | #ifdef CONFIG_BFIN_ICACHE_LOCK | 1066 | #ifdef CONFIG_BFIN_ICACHE_LOCK |
1052 | switch (read_iloc()) { | 1067 | switch ((bfin_read_IMEM_CONTROL() >> 3) & WAYALL_L) { |
1053 | case WAY0_L: | 1068 | case WAY0_L: |
1054 | seq_printf(m, "Way0 Locked-Down\n"); | 1069 | seq_printf(m, "Way0 Locked-Down\n"); |
1055 | break; | 1070 | break; |
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index ad922ab91543..9a9d5083acfd 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -567,7 +567,7 @@ bool get_instruction(unsigned short *val, unsigned short *address) | |||
567 | * we don't read something in the async space that can hang forever | 567 | * we don't read something in the async space that can hang forever |
568 | */ | 568 | */ |
569 | if ((addr >= FIXED_CODE_START && (addr + 2) <= physical_mem_end) || | 569 | if ((addr >= FIXED_CODE_START && (addr + 2) <= physical_mem_end) || |
570 | #ifdef L2_START | 570 | #if L2_LENGTH != 0 |
571 | (addr >= L2_START && (addr + 2) <= (L2_START + L2_LENGTH)) || | 571 | (addr >= L2_START && (addr + 2) <= (L2_START + L2_LENGTH)) || |
572 | #endif | 572 | #endif |
573 | (addr >= BOOT_ROM_START && (addr + 2) <= (BOOT_ROM_START + BOOT_ROM_LENGTH)) || | 573 | (addr >= BOOT_ROM_START && (addr + 2) <= (BOOT_ROM_START + BOOT_ROM_LENGTH)) || |
@@ -601,12 +601,55 @@ bool get_instruction(unsigned short *val, unsigned short *address) | |||
601 | return false; | 601 | return false; |
602 | } | 602 | } |
603 | 603 | ||
604 | /* | ||
605 | * decode the instruction if we are printing out the trace, as it | ||
606 | * makes things easier to follow, without running it through objdump | ||
607 | * These are the normal instructions which cause change of flow, which | ||
608 | * would be at the source of the trace buffer | ||
609 | */ | ||
610 | void decode_instruction(unsigned short *address) | ||
611 | { | ||
612 | unsigned short opcode; | ||
613 | |||
614 | if (get_instruction(&opcode, address)) { | ||
615 | if (opcode == 0x0010) | ||
616 | printk("RTS"); | ||
617 | else if (opcode == 0x0011) | ||
618 | printk("RTI"); | ||
619 | else if (opcode == 0x0012) | ||
620 | printk("RTX"); | ||
621 | else if (opcode >= 0x0050 && opcode <= 0x0057) | ||
622 | printk("JUMP (P%i)", opcode & 7); | ||
623 | else if (opcode >= 0x0060 && opcode <= 0x0067) | ||
624 | printk("CALL (P%i)", opcode & 7); | ||
625 | else if (opcode >= 0x0070 && opcode <= 0x0077) | ||
626 | printk("CALL (PC+P%i)", opcode & 7); | ||
627 | else if (opcode >= 0x0080 && opcode <= 0x0087) | ||
628 | printk("JUMP (PC+P%i)", opcode & 7); | ||
629 | else if ((opcode >= 0x1000 && opcode <= 0x13FF) || (opcode >= 0x1800 && opcode <= 0x1BFF)) | ||
630 | printk("IF !CC JUMP"); | ||
631 | else if ((opcode >= 0x1400 && opcode <= 0x17ff) || (opcode >= 0x1c00 && opcode <= 0x1fff)) | ||
632 | printk("IF CC JUMP"); | ||
633 | else if (opcode >= 0x2000 && opcode <= 0x2fff) | ||
634 | printk("JUMP.S"); | ||
635 | else if (opcode >= 0xe080 && opcode <= 0xe0ff) | ||
636 | printk("LSETUP"); | ||
637 | else if (opcode >= 0xe200 && opcode <= 0xe2ff) | ||
638 | printk("JUMP.L"); | ||
639 | else if (opcode >= 0xe300 && opcode <= 0xe3ff) | ||
640 | printk("CALL pcrel"); | ||
641 | else | ||
642 | printk("0x%04x", opcode); | ||
643 | } | ||
644 | |||
645 | } | ||
646 | |||
604 | void dump_bfin_trace_buffer(void) | 647 | void dump_bfin_trace_buffer(void) |
605 | { | 648 | { |
606 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON | 649 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON |
607 | int tflags, i = 0; | 650 | int tflags, i = 0; |
608 | char buf[150]; | 651 | char buf[150]; |
609 | unsigned short val = 0, *addr; | 652 | unsigned short *addr; |
610 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND | 653 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND |
611 | int j, index; | 654 | int j, index; |
612 | #endif | 655 | #endif |
@@ -615,6 +658,10 @@ void dump_bfin_trace_buffer(void) | |||
615 | 658 | ||
616 | printk(KERN_NOTICE "Hardware Trace:\n"); | 659 | printk(KERN_NOTICE "Hardware Trace:\n"); |
617 | 660 | ||
661 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND | ||
662 | printk(KERN_NOTICE "WARNING: Expanded trace turned on - can not trace exceptions\n"); | ||
663 | #endif | ||
664 | |||
618 | if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) { | 665 | if (likely(bfin_read_TBUFSTAT() & TBUFCNT)) { |
619 | for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) { | 666 | for (; bfin_read_TBUFSTAT() & TBUFCNT; i++) { |
620 | decode_address(buf, (unsigned long)bfin_read_TBUF()); | 667 | decode_address(buf, (unsigned long)bfin_read_TBUF()); |
@@ -622,45 +669,14 @@ void dump_bfin_trace_buffer(void) | |||
622 | addr = (unsigned short *)bfin_read_TBUF(); | 669 | addr = (unsigned short *)bfin_read_TBUF(); |
623 | decode_address(buf, (unsigned long)addr); | 670 | decode_address(buf, (unsigned long)addr); |
624 | printk(KERN_NOTICE " Source : %s ", buf); | 671 | printk(KERN_NOTICE " Source : %s ", buf); |
625 | if (get_instruction(&val, addr)) { | 672 | decode_instruction(addr); |
626 | if (val == 0x0010) | ||
627 | printk("RTS"); | ||
628 | else if (val == 0x0011) | ||
629 | printk("RTI"); | ||
630 | else if (val == 0x0012) | ||
631 | printk("RTX"); | ||
632 | else if (val >= 0x0050 && val <= 0x0057) | ||
633 | printk("JUMP (P%i)", val & 7); | ||
634 | else if (val >= 0x0060 && val <= 0x0067) | ||
635 | printk("CALL (P%i)", val & 7); | ||
636 | else if (val >= 0x0070 && val <= 0x0077) | ||
637 | printk("CALL (PC+P%i)", val & 7); | ||
638 | else if (val >= 0x0080 && val <= 0x0087) | ||
639 | printk("JUMP (PC+P%i)", val & 7); | ||
640 | else if ((val >= 0x1000 && val <= 0x13FF) || | ||
641 | (val >= 0x1800 && val <= 0x1BFF)) | ||
642 | printk("IF !CC JUMP"); | ||
643 | else if ((val >= 0x1400 && val <= 0x17ff) || | ||
644 | (val >= 0x1c00 && val <= 0x1fff)) | ||
645 | printk("IF CC JUMP"); | ||
646 | else if (val >= 0x2000 && val <= 0x2fff) | ||
647 | printk("JUMP.S"); | ||
648 | else if (val >= 0xe080 && val <= 0xe0ff) | ||
649 | printk("LSETUP"); | ||
650 | else if (val >= 0xe200 && val <= 0xe2ff) | ||
651 | printk("JUMP.L"); | ||
652 | else if (val >= 0xe300 && val <= 0xe3ff) | ||
653 | printk("CALL pcrel"); | ||
654 | else | ||
655 | printk("0x%04x", val); | ||
656 | } | ||
657 | printk("\n"); | 673 | printk("\n"); |
658 | } | 674 | } |
659 | } | 675 | } |
660 | 676 | ||
661 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND | 677 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_EXPAND |
662 | if (trace_buff_offset) | 678 | if (trace_buff_offset) |
663 | index = trace_buff_offset/4 - 1; | 679 | index = trace_buff_offset / 4; |
664 | else | 680 | else |
665 | index = EXPAND_LEN; | 681 | index = EXPAND_LEN; |
666 | 682 | ||
@@ -672,7 +688,9 @@ void dump_bfin_trace_buffer(void) | |||
672 | if (index < 0 ) | 688 | if (index < 0 ) |
673 | index = EXPAND_LEN; | 689 | index = EXPAND_LEN; |
674 | decode_address(buf, software_trace_buff[index]); | 690 | decode_address(buf, software_trace_buff[index]); |
675 | printk(KERN_NOTICE " Source : %s\n", buf); | 691 | printk(KERN_NOTICE " Source : %s ", buf); |
692 | decode_instruction((unsigned short *)software_trace_buff[index]); | ||
693 | printk("\n"); | ||
676 | index -= 1; | 694 | index -= 1; |
677 | if (index < 0) | 695 | if (index < 0) |
678 | index = EXPAND_LEN; | 696 | index = EXPAND_LEN; |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index 0896e38d6108..7d12c6692a65 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
@@ -83,6 +83,7 @@ SECTIONS | |||
83 | #if !L1_DATA_B_LENGTH | 83 | #if !L1_DATA_B_LENGTH |
84 | *(.l1.bss.B) | 84 | *(.l1.bss.B) |
85 | #endif | 85 | #endif |
86 | . = ALIGN(4); | ||
86 | ___bss_stop = .; | 87 | ___bss_stop = .; |
87 | } | 88 | } |
88 | 89 | ||
@@ -101,7 +102,7 @@ SECTIONS | |||
101 | #if !L1_DATA_B_LENGTH | 102 | #if !L1_DATA_B_LENGTH |
102 | *(.l1.data.B) | 103 | *(.l1.data.B) |
103 | #endif | 104 | #endif |
104 | #ifndef L2_LENGTH | 105 | #if !L2_LENGTH |
105 | . = ALIGN(32); | 106 | . = ALIGN(32); |
106 | *(.data_l2.cacheline_aligned) | 107 | *(.data_l2.cacheline_aligned) |
107 | *(.l2.data) | 108 | *(.l2.data) |
@@ -211,20 +212,19 @@ SECTIONS | |||
211 | __ebss_b_l1 = .; | 212 | __ebss_b_l1 = .; |
212 | } | 213 | } |
213 | 214 | ||
214 | #ifdef L2_LENGTH | ||
215 | __l2_lma_start = .; | 215 | __l2_lma_start = .; |
216 | 216 | ||
217 | .text_data_l2 L2_START : AT(LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1)) | 217 | .text_data_l2 L2_START : AT(LOADADDR(.data_b_l1) + SIZEOF(.data_b_l1)) |
218 | { | 218 | { |
219 | . = ALIGN(4); | 219 | . = ALIGN(4); |
220 | __stext_l2 = .; | 220 | __stext_l2 = .; |
221 | *(.l1.text) | 221 | *(.l2.text) |
222 | . = ALIGN(4); | 222 | . = ALIGN(4); |
223 | __etext_l2 = .; | 223 | __etext_l2 = .; |
224 | 224 | ||
225 | . = ALIGN(4); | 225 | . = ALIGN(4); |
226 | __sdata_l2 = .; | 226 | __sdata_l2 = .; |
227 | *(.l1.data) | 227 | *(.l2.data) |
228 | __edata_l2 = .; | 228 | __edata_l2 = .; |
229 | 229 | ||
230 | . = ALIGN(32); | 230 | . = ALIGN(32); |
@@ -232,11 +232,10 @@ SECTIONS | |||
232 | 232 | ||
233 | . = ALIGN(4); | 233 | . = ALIGN(4); |
234 | __sbss_l2 = .; | 234 | __sbss_l2 = .; |
235 | *(.l1.bss) | 235 | *(.l2.bss) |
236 | . = ALIGN(4); | 236 | . = ALIGN(4); |
237 | __ebss_l2 = .; | 237 | __ebss_l2 = .; |
238 | } | 238 | } |
239 | #endif | ||
240 | 239 | ||
241 | /* Force trailing alignment of our init section so that when we | 240 | /* Force trailing alignment of our init section so that when we |
242 | * free our init memory, we don't leave behind a partial page. | 241 | * free our init memory, we don't leave behind a partial page. |
diff --git a/arch/blackfin/lib/ins.S b/arch/blackfin/lib/ins.S index eba2343b1b59..d60554dce87b 100644 --- a/arch/blackfin/lib/ins.S +++ b/arch/blackfin/lib/ins.S | |||
@@ -33,7 +33,28 @@ | |||
33 | 33 | ||
34 | .align 2 | 34 | .align 2 |
35 | 35 | ||
36 | /* | ||
37 | * Reads on the Blackfin are speculative. In Blackfin terms, this means they | ||
38 | * can be interrupted at any time (even after they have been issued on to the | ||
39 | * external bus), and re-issued after the interrupt occurs. | ||
40 | * | ||
41 | * If a FIFO is sitting on the end of the read, it will see two reads, | ||
42 | * when the core only sees one. The FIFO receives the read which is cancelled, | ||
43 | * and not delivered to the core. | ||
44 | * | ||
45 | * To solve this, interrupts are turned off before reads occur to I/O space. | ||
46 | * There are 3 versions of all these functions | ||
47 | * - turns interrupts off every read (higher overhead, but lower latency) | ||
48 | * - turns interrupts off every loop (low overhead, but longer latency) | ||
49 | * - DMA version, which do not suffer from this issue. DMA versions have | ||
50 | * different name (prefixed by dma_ ), and are located in | ||
51 | * ../kernel/bfin_dma_5xx.c | ||
52 | * Using the dma related functions are recommended for transfering large | ||
53 | * buffers in/out of FIFOs. | ||
54 | */ | ||
55 | |||
36 | ENTRY(_insl) | 56 | ENTRY(_insl) |
57 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
37 | P0 = R0; /* P0 = port */ | 58 | P0 = R0; /* P0 = port */ |
38 | cli R3; | 59 | cli R3; |
39 | P1 = R1; /* P1 = address */ | 60 | P1 = R1; /* P1 = address */ |
@@ -46,9 +67,26 @@ ENTRY(_insl) | |||
46 | .Llong_loop_e: NOP; | 67 | .Llong_loop_e: NOP; |
47 | sti R3; | 68 | sti R3; |
48 | RTS; | 69 | RTS; |
70 | #else | ||
71 | P0 = R0; /* P0 = port */ | ||
72 | P1 = R1; /* P1 = address */ | ||
73 | P2 = R2; /* P2 = count */ | ||
74 | SSYNC; | ||
75 | LSETUP( .Llong_loop_s, .Llong_loop_e) LC0 = P2; | ||
76 | .Llong_loop_s: | ||
77 | CLI R3; | ||
78 | NOP; NOP; NOP; | ||
79 | R0 = [P0]; | ||
80 | [P1++] = R0; | ||
81 | .Llong_loop_e: | ||
82 | STI R3; | ||
83 | |||
84 | RTS; | ||
85 | #endif | ||
49 | ENDPROC(_insl) | 86 | ENDPROC(_insl) |
50 | 87 | ||
51 | ENTRY(_insw) | 88 | ENTRY(_insw) |
89 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
52 | P0 = R0; /* P0 = port */ | 90 | P0 = R0; /* P0 = port */ |
53 | cli R3; | 91 | cli R3; |
54 | P1 = R1; /* P1 = address */ | 92 | P1 = R1; /* P1 = address */ |
@@ -61,9 +99,26 @@ ENTRY(_insw) | |||
61 | .Lword_loop_e: NOP; | 99 | .Lword_loop_e: NOP; |
62 | sti R3; | 100 | sti R3; |
63 | RTS; | 101 | RTS; |
102 | #else | ||
103 | P0 = R0; /* P0 = port */ | ||
104 | P1 = R1; /* P1 = address */ | ||
105 | P2 = R2; /* P2 = count */ | ||
106 | SSYNC; | ||
107 | LSETUP( .Lword_loop_s, .Lword_loop_e) LC0 = P2; | ||
108 | .Lword_loop_s: | ||
109 | CLI R3; | ||
110 | NOP; NOP; NOP; | ||
111 | R0 = W[P0]; | ||
112 | W[P1++] = R0; | ||
113 | .Lword_loop_e: | ||
114 | STI R3; | ||
115 | RTS; | ||
116 | |||
117 | #endif | ||
64 | ENDPROC(_insw) | 118 | ENDPROC(_insw) |
65 | 119 | ||
66 | ENTRY(_insw_8) | 120 | ENTRY(_insw_8) |
121 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
67 | P0 = R0; /* P0 = port */ | 122 | P0 = R0; /* P0 = port */ |
68 | cli R3; | 123 | cli R3; |
69 | P1 = R1; /* P1 = address */ | 124 | P1 = R1; /* P1 = address */ |
@@ -78,9 +133,29 @@ ENTRY(_insw_8) | |||
78 | .Lword8_loop_e: NOP; | 133 | .Lword8_loop_e: NOP; |
79 | sti R3; | 134 | sti R3; |
80 | RTS; | 135 | RTS; |
136 | #else | ||
137 | P0 = R0; /* P0 = port */ | ||
138 | P1 = R1; /* P1 = address */ | ||
139 | P2 = R2; /* P2 = count */ | ||
140 | SSYNC; | ||
141 | LSETUP( .Lword8_loop_s, .Lword8_loop_e) LC0 = P2; | ||
142 | .Lword8_loop_s: | ||
143 | CLI R3; | ||
144 | NOP; NOP; NOP; | ||
145 | R0 = W[P0]; | ||
146 | B[P1++] = R0; | ||
147 | R0 = R0 >> 8; | ||
148 | B[P1++] = R0; | ||
149 | NOP; | ||
150 | .Lword8_loop_e: | ||
151 | STI R3; | ||
152 | |||
153 | RTS; | ||
154 | #endif | ||
81 | ENDPROC(_insw_8) | 155 | ENDPROC(_insw_8) |
82 | 156 | ||
83 | ENTRY(_insb) | 157 | ENTRY(_insb) |
158 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
84 | P0 = R0; /* P0 = port */ | 159 | P0 = R0; /* P0 = port */ |
85 | cli R3; | 160 | cli R3; |
86 | P1 = R1; /* P1 = address */ | 161 | P1 = R1; /* P1 = address */ |
@@ -93,9 +168,26 @@ ENTRY(_insb) | |||
93 | .Lbyte_loop_e: NOP; | 168 | .Lbyte_loop_e: NOP; |
94 | sti R3; | 169 | sti R3; |
95 | RTS; | 170 | RTS; |
171 | #else | ||
172 | P0 = R0; /* P0 = port */ | ||
173 | P1 = R1; /* P1 = address */ | ||
174 | P2 = R2; /* P2 = count */ | ||
175 | SSYNC; | ||
176 | LSETUP( .Lbyte_loop_s, .Lbyte_loop_e) LC0 = P2; | ||
177 | .Lbyte_loop_s: | ||
178 | CLI R3; | ||
179 | NOP; NOP; NOP; | ||
180 | R0 = B[P0]; | ||
181 | B[P1++] = R0; | ||
182 | .Lbyte_loop_e: | ||
183 | STI R3; | ||
184 | |||
185 | RTS; | ||
186 | #endif | ||
96 | ENDPROC(_insb) | 187 | ENDPROC(_insb) |
97 | 188 | ||
98 | ENTRY(_insl_16) | 189 | ENTRY(_insl_16) |
190 | #ifdef CONFIG_BFIN_INS_LOWOVERHEAD | ||
99 | P0 = R0; /* P0 = port */ | 191 | P0 = R0; /* P0 = port */ |
100 | cli R3; | 192 | cli R3; |
101 | P1 = R1; /* P1 = address */ | 193 | P1 = R1; /* P1 = address */ |
@@ -110,4 +202,21 @@ ENTRY(_insl_16) | |||
110 | .Llong16_loop_e: NOP; | 202 | .Llong16_loop_e: NOP; |
111 | sti R3; | 203 | sti R3; |
112 | RTS; | 204 | RTS; |
205 | #else | ||
206 | P0 = R0; /* P0 = port */ | ||
207 | P1 = R1; /* P1 = address */ | ||
208 | P2 = R2; /* P2 = count */ | ||
209 | SSYNC; | ||
210 | LSETUP( .Llong16_loop_s, .Llong16_loop_e) LC0 = P2; | ||
211 | .Llong16_loop_s: | ||
212 | CLI R3; | ||
213 | NOP; NOP; NOP; | ||
214 | R0 = [P0]; | ||
215 | W[P1++] = R0; | ||
216 | R0 = R0 >> 16; | ||
217 | W[P1++] = R0; | ||
218 | .Llong16_loop_e: | ||
219 | STI R3; | ||
220 | RTS; | ||
221 | #endif | ||
113 | ENDPROC(_insl_16) | 222 | ENDPROC(_insl_16) |
diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c index 0b26ae2de5ee..d22bc7773717 100644 --- a/arch/blackfin/mach-bf527/boards/cm_bf527.c +++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c | |||
@@ -39,7 +39,6 @@ | |||
39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
40 | #include <linux/usb/isp1362.h> | 40 | #include <linux/usb/isp1362.h> |
41 | #endif | 41 | #endif |
42 | #include <linux/pata_platform.h> | ||
43 | #include <linux/i2c.h> | 42 | #include <linux/i2c.h> |
44 | #include <linux/irq.h> | 43 | #include <linux/irq.h> |
45 | #include <linux/interrupt.h> | 44 | #include <linux/interrupt.h> |
@@ -160,15 +159,15 @@ static struct platform_device musb_device = { | |||
160 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 159 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
161 | static struct mtd_partition ezkit_partitions[] = { | 160 | static struct mtd_partition ezkit_partitions[] = { |
162 | { | 161 | { |
163 | .name = "Bootloader", | 162 | .name = "bootloader(nor)", |
164 | .size = 0x40000, | 163 | .size = 0x40000, |
165 | .offset = 0, | 164 | .offset = 0, |
166 | }, { | 165 | }, { |
167 | .name = "Kernel", | 166 | .name = "linux kernel(nor)", |
168 | .size = 0x1C0000, | 167 | .size = 0x1C0000, |
169 | .offset = MTDPART_OFS_APPEND, | 168 | .offset = MTDPART_OFS_APPEND, |
170 | }, { | 169 | }, { |
171 | .name = "RootFS", | 170 | .name = "file system(nor)", |
172 | .size = MTDPART_SIZ_FULL, | 171 | .size = MTDPART_SIZ_FULL, |
173 | .offset = MTDPART_OFS_APPEND, | 172 | .offset = MTDPART_OFS_APPEND, |
174 | } | 173 | } |
@@ -200,12 +199,12 @@ static struct platform_device ezkit_flash_device = { | |||
200 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 199 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
201 | static struct mtd_partition partition_info[] = { | 200 | static struct mtd_partition partition_info[] = { |
202 | { | 201 | { |
203 | .name = "Linux Kernel", | 202 | .name = "linux kernel(nand)", |
204 | .offset = 0, | 203 | .offset = 0, |
205 | .size = 4 * SIZE_1M, | 204 | .size = 4 * SIZE_1M, |
206 | }, | 205 | }, |
207 | { | 206 | { |
208 | .name = "File System", | 207 | .name = "file system(nand)", |
209 | .offset = MTDPART_OFS_APPEND, | 208 | .offset = MTDPART_OFS_APPEND, |
210 | .size = MTDPART_SIZ_FULL, | 209 | .size = MTDPART_SIZ_FULL, |
211 | }, | 210 | }, |
@@ -438,12 +437,12 @@ static struct platform_device net2272_bfin_device = { | |||
438 | || defined(CONFIG_MTD_M25P80_MODULE) | 437 | || defined(CONFIG_MTD_M25P80_MODULE) |
439 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 438 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
440 | { | 439 | { |
441 | .name = "bootloader", | 440 | .name = "bootloader(spi)", |
442 | .size = 0x00040000, | 441 | .size = 0x00040000, |
443 | .offset = 0, | 442 | .offset = 0, |
444 | .mask_flags = MTD_CAP_ROM | 443 | .mask_flags = MTD_CAP_ROM |
445 | }, { | 444 | }, { |
446 | .name = "linux kernel", | 445 | .name = "linux kernel(spi)", |
447 | .size = MTDPART_SIZ_FULL, | 446 | .size = MTDPART_SIZ_FULL, |
448 | .offset = MTDPART_OFS_APPEND, | 447 | .offset = MTDPART_OFS_APPEND, |
449 | } | 448 | } |
@@ -799,43 +798,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
799 | }; | 798 | }; |
800 | #endif | 799 | #endif |
801 | 800 | ||
802 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
803 | #define PATA_INT 55 | ||
804 | |||
805 | static struct pata_platform_info bfin_pata_platform_data = { | ||
806 | .ioport_shift = 1, | ||
807 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
808 | }; | ||
809 | |||
810 | static struct resource bfin_pata_resources[] = { | ||
811 | { | ||
812 | .start = 0x20314020, | ||
813 | .end = 0x2031403F, | ||
814 | .flags = IORESOURCE_MEM, | ||
815 | }, | ||
816 | { | ||
817 | .start = 0x2031401C, | ||
818 | .end = 0x2031401F, | ||
819 | .flags = IORESOURCE_MEM, | ||
820 | }, | ||
821 | { | ||
822 | .start = PATA_INT, | ||
823 | .end = PATA_INT, | ||
824 | .flags = IORESOURCE_IRQ, | ||
825 | }, | ||
826 | }; | ||
827 | |||
828 | static struct platform_device bfin_pata_device = { | ||
829 | .name = "pata_platform", | ||
830 | .id = -1, | ||
831 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
832 | .resource = bfin_pata_resources, | ||
833 | .dev = { | ||
834 | .platform_data = &bfin_pata_platform_data, | ||
835 | } | ||
836 | }; | ||
837 | #endif | ||
838 | |||
839 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 801 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
840 | #include <linux/input.h> | 802 | #include <linux/input.h> |
841 | #include <linux/gpio_keys.h> | 803 | #include <linux/gpio_keys.h> |
@@ -961,10 +923,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
961 | &bfin_sport1_uart_device, | 923 | &bfin_sport1_uart_device, |
962 | #endif | 924 | #endif |
963 | 925 | ||
964 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
965 | &bfin_pata_device, | ||
966 | #endif | ||
967 | |||
968 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 926 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
969 | &bfin_device_gpiokeys, | 927 | &bfin_device_gpiokeys, |
970 | #endif | 928 | #endif |
@@ -987,10 +945,6 @@ static int __init stamp_init(void) | |||
987 | 945 | ||
988 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); | 946 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); |
989 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 947 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
990 | |||
991 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
992 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
993 | #endif | ||
994 | return 0; | 948 | return 0; |
995 | } | 949 | } |
996 | 950 | ||
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c index 689b69c98ee4..762f754c06cc 100644 --- a/arch/blackfin/mach-bf527/boards/ezkit.c +++ b/arch/blackfin/mach-bf527/boards/ezkit.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
40 | #endif | 40 | #endif |
41 | #include <linux/ata_platform.h> | ||
42 | #include <linux/i2c.h> | 41 | #include <linux/i2c.h> |
43 | #include <linux/irq.h> | 42 | #include <linux/irq.h> |
44 | #include <linux/interrupt.h> | 43 | #include <linux/interrupt.h> |
@@ -177,15 +176,15 @@ static struct platform_device bf52x_t350mcqb_device = { | |||
177 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 176 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
178 | static struct mtd_partition ezkit_partitions[] = { | 177 | static struct mtd_partition ezkit_partitions[] = { |
179 | { | 178 | { |
180 | .name = "Bootloader", | 179 | .name = "bootloader(nor)", |
181 | .size = 0x40000, | 180 | .size = 0x40000, |
182 | .offset = 0, | 181 | .offset = 0, |
183 | }, { | 182 | }, { |
184 | .name = "Kernel", | 183 | .name = "linux kernel(nor)", |
185 | .size = 0x1C0000, | 184 | .size = 0x1C0000, |
186 | .offset = MTDPART_OFS_APPEND, | 185 | .offset = MTDPART_OFS_APPEND, |
187 | }, { | 186 | }, { |
188 | .name = "RootFS", | 187 | .name = "file system(nor)", |
189 | .size = MTDPART_SIZ_FULL, | 188 | .size = MTDPART_SIZ_FULL, |
190 | .offset = MTDPART_OFS_APPEND, | 189 | .offset = MTDPART_OFS_APPEND, |
191 | } | 190 | } |
@@ -217,12 +216,12 @@ static struct platform_device ezkit_flash_device = { | |||
217 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 216 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
218 | static struct mtd_partition partition_info[] = { | 217 | static struct mtd_partition partition_info[] = { |
219 | { | 218 | { |
220 | .name = "Linux Kernel", | 219 | .name = "linux kernel(nand)", |
221 | .offset = 0, | 220 | .offset = 0, |
222 | .size = 4 * SIZE_1M, | 221 | .size = 4 * SIZE_1M, |
223 | }, | 222 | }, |
224 | { | 223 | { |
225 | .name = "File System", | 224 | .name = "file system(nand)", |
226 | .offset = MTDPART_OFS_APPEND, | 225 | .offset = MTDPART_OFS_APPEND, |
227 | .size = MTDPART_SIZ_FULL, | 226 | .size = MTDPART_SIZ_FULL, |
228 | }, | 227 | }, |
@@ -460,12 +459,12 @@ static struct platform_device net2272_bfin_device = { | |||
460 | || defined(CONFIG_MTD_M25P80_MODULE) | 459 | || defined(CONFIG_MTD_M25P80_MODULE) |
461 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 460 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
462 | { | 461 | { |
463 | .name = "bootloader", | 462 | .name = "bootloader(spi)", |
464 | .size = 0x00040000, | 463 | .size = 0x00040000, |
465 | .offset = 0, | 464 | .offset = 0, |
466 | .mask_flags = MTD_CAP_ROM | 465 | .mask_flags = MTD_CAP_ROM |
467 | }, { | 466 | }, { |
468 | .name = "linux kernel", | 467 | .name = "linux kernel(spi)", |
469 | .size = MTDPART_SIZ_FULL, | 468 | .size = MTDPART_SIZ_FULL, |
470 | .offset = MTDPART_OFS_APPEND, | 469 | .offset = MTDPART_OFS_APPEND, |
471 | } | 470 | } |
@@ -825,43 +824,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
825 | }; | 824 | }; |
826 | #endif | 825 | #endif |
827 | 826 | ||
828 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
829 | #define PATA_INT 55 | ||
830 | |||
831 | static struct pata_platform_info bfin_pata_platform_data = { | ||
832 | .ioport_shift = 1, | ||
833 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
834 | }; | ||
835 | |||
836 | static struct resource bfin_pata_resources[] = { | ||
837 | { | ||
838 | .start = 0x20314020, | ||
839 | .end = 0x2031403F, | ||
840 | .flags = IORESOURCE_MEM, | ||
841 | }, | ||
842 | { | ||
843 | .start = 0x2031401C, | ||
844 | .end = 0x2031401F, | ||
845 | .flags = IORESOURCE_MEM, | ||
846 | }, | ||
847 | { | ||
848 | .start = PATA_INT, | ||
849 | .end = PATA_INT, | ||
850 | .flags = IORESOURCE_IRQ, | ||
851 | }, | ||
852 | }; | ||
853 | |||
854 | static struct platform_device bfin_pata_device = { | ||
855 | .name = "pata_platform", | ||
856 | .id = -1, | ||
857 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
858 | .resource = bfin_pata_resources, | ||
859 | .dev = { | ||
860 | .platform_data = &bfin_pata_platform_data, | ||
861 | } | ||
862 | }; | ||
863 | #endif | ||
864 | |||
865 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 827 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
866 | #include <linux/input.h> | 828 | #include <linux/input.h> |
867 | #include <linux/gpio_keys.h> | 829 | #include <linux/gpio_keys.h> |
@@ -996,10 +958,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
996 | &bfin_sport1_uart_device, | 958 | &bfin_sport1_uart_device, |
997 | #endif | 959 | #endif |
998 | 960 | ||
999 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
1000 | &bfin_pata_device, | ||
1001 | #endif | ||
1002 | |||
1003 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 961 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
1004 | &bfin_device_gpiokeys, | 962 | &bfin_device_gpiokeys, |
1005 | #endif | 963 | #endif |
@@ -1022,10 +980,6 @@ static int __init stamp_init(void) | |||
1022 | 980 | ||
1023 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); | 981 | platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); |
1024 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 982 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
1025 | |||
1026 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
1027 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
1028 | #endif | ||
1029 | return 0; | 983 | return 0; |
1030 | } | 984 | } |
1031 | 985 | ||
diff --git a/arch/blackfin/mach-bf527/head.S b/arch/blackfin/mach-bf527/head.S index fe05cc1ef174..c3334cc5bcb7 100644 --- a/arch/blackfin/mach-bf527/head.S +++ b/arch/blackfin/mach-bf527/head.S | |||
@@ -30,293 +30,11 @@ | |||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | #include <asm/trace.h> | ||
34 | |||
35 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
36 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
37 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
38 | #endif | 36 | #endif |
39 | 37 | ||
40 | .extern ___bss_stop | ||
41 | .extern ___bss_start | ||
42 | .extern _bf53x_relocate_l1_mem | ||
43 | |||
44 | #define INITIAL_STACK 0xFFB01000 | ||
45 | |||
46 | __INIT | ||
47 | |||
48 | ENTRY(__start) | ||
49 | /* R0: argument of command line string, passed from uboot, save it */ | ||
50 | R7 = R0; | ||
51 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
52 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
53 | R0 = SYSCFG_SNEN; | ||
54 | #else | ||
55 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
56 | #endif | ||
57 | SYSCFG = R0; | ||
58 | R0 = 0; | ||
59 | |||
60 | /* Clear Out All the data and pointer Registers */ | ||
61 | R1 = R0; | ||
62 | R2 = R0; | ||
63 | R3 = R0; | ||
64 | R4 = R0; | ||
65 | R5 = R0; | ||
66 | R6 = R0; | ||
67 | |||
68 | P0 = R0; | ||
69 | P1 = R0; | ||
70 | P2 = R0; | ||
71 | P3 = R0; | ||
72 | P4 = R0; | ||
73 | P5 = R0; | ||
74 | |||
75 | LC0 = r0; | ||
76 | LC1 = r0; | ||
77 | L0 = r0; | ||
78 | L1 = r0; | ||
79 | L2 = r0; | ||
80 | L3 = r0; | ||
81 | |||
82 | /* Clear Out All the DAG Registers */ | ||
83 | B0 = r0; | ||
84 | B1 = r0; | ||
85 | B2 = r0; | ||
86 | B3 = r0; | ||
87 | |||
88 | I0 = r0; | ||
89 | I1 = r0; | ||
90 | I2 = r0; | ||
91 | I3 = r0; | ||
92 | |||
93 | M0 = r0; | ||
94 | M1 = r0; | ||
95 | M2 = r0; | ||
96 | M3 = r0; | ||
97 | |||
98 | trace_buffer_init(p0,r0); | ||
99 | P0 = R1; | ||
100 | R0 = R1; | ||
101 | |||
102 | /* Turn off the icache */ | ||
103 | p0.l = LO(IMEM_CONTROL); | ||
104 | p0.h = HI(IMEM_CONTROL); | ||
105 | R1 = [p0]; | ||
106 | R0 = ~ENICPLB; | ||
107 | R0 = R0 & R1; | ||
108 | |||
109 | /* Anomaly 05000125 */ | ||
110 | #if ANOMALY_05000125 | ||
111 | CLI R2; | ||
112 | SSYNC; | ||
113 | #endif | ||
114 | [p0] = R0; | ||
115 | SSYNC; | ||
116 | #if ANOMALY_05000125 | ||
117 | STI R2; | ||
118 | #endif | ||
119 | |||
120 | /* Turn off the dcache */ | ||
121 | p0.l = LO(DMEM_CONTROL); | ||
122 | p0.h = HI(DMEM_CONTROL); | ||
123 | R1 = [p0]; | ||
124 | R0 = ~ENDCPLB; | ||
125 | R0 = R0 & R1; | ||
126 | |||
127 | /* Anomaly 05000125 */ | ||
128 | #if ANOMALY_05000125 | ||
129 | CLI R2; | ||
130 | SSYNC; | ||
131 | #endif | ||
132 | [p0] = R0; | ||
133 | SSYNC; | ||
134 | #if ANOMALY_05000125 | ||
135 | STI R2; | ||
136 | #endif | ||
137 | |||
138 | |||
139 | #if defined(CONFIG_BF527) | ||
140 | p0.h = hi(EMAC_SYSTAT); | ||
141 | p0.l = lo(EMAC_SYSTAT); | ||
142 | R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */ | ||
143 | R0.l = 0xFFFF; | ||
144 | [P0] = R0; | ||
145 | SSYNC; | ||
146 | #endif | ||
147 | |||
148 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
149 | * so if we dont initalize here, our serial console gets hosed */ | ||
150 | p0.h = hi(UART1_LCR); | ||
151 | p0.l = lo(UART1_LCR); | ||
152 | r0 = 0x0(Z); | ||
153 | w[p0] = r0.L; /* To enable DLL writes */ | ||
154 | ssync; | ||
155 | |||
156 | p0.h = hi(UART1_DLL); | ||
157 | p0.l = lo(UART1_DLL); | ||
158 | r0 = 0x0(Z); | ||
159 | w[p0] = r0.L; | ||
160 | ssync; | ||
161 | |||
162 | p0.h = hi(UART1_DLH); | ||
163 | p0.l = lo(UART1_DLH); | ||
164 | r0 = 0x00(Z); | ||
165 | w[p0] = r0.L; | ||
166 | ssync; | ||
167 | |||
168 | p0.h = hi(UART1_GCTL); | ||
169 | p0.l = lo(UART1_GCTL); | ||
170 | r0 = 0x0(Z); | ||
171 | w[p0] = r0.L; /* To enable UART clock */ | ||
172 | ssync; | ||
173 | |||
174 | /* Initialize stack pointer */ | ||
175 | sp.l = lo(INITIAL_STACK); | ||
176 | sp.h = hi(INITIAL_STACK); | ||
177 | fp = sp; | ||
178 | usp = sp; | ||
179 | |||
180 | #ifdef CONFIG_EARLY_PRINTK | ||
181 | SP += -12; | ||
182 | call _init_early_exception_vectors; | ||
183 | SP += 12; | ||
184 | #endif | ||
185 | |||
186 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
187 | call _bf53x_relocate_l1_mem; | ||
188 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
189 | call _start_dma_code; | ||
190 | #endif | ||
191 | |||
192 | /* Code for initializing Async memory banks */ | ||
193 | |||
194 | p2.h = hi(EBIU_AMBCTL1); | ||
195 | p2.l = lo(EBIU_AMBCTL1); | ||
196 | r0.h = hi(AMBCTL1VAL); | ||
197 | r0.l = lo(AMBCTL1VAL); | ||
198 | [p2] = r0; | ||
199 | ssync; | ||
200 | |||
201 | p2.h = hi(EBIU_AMBCTL0); | ||
202 | p2.l = lo(EBIU_AMBCTL0); | ||
203 | r0.h = hi(AMBCTL0VAL); | ||
204 | r0.l = lo(AMBCTL0VAL); | ||
205 | [p2] = r0; | ||
206 | ssync; | ||
207 | |||
208 | p2.h = hi(EBIU_AMGCTL); | ||
209 | p2.l = lo(EBIU_AMGCTL); | ||
210 | r0 = AMGCTLVAL; | ||
211 | w[p2] = r0; | ||
212 | ssync; | ||
213 | |||
214 | /* This section keeps the processor in supervisor mode | ||
215 | * during kernel boot. Switches to user mode at end of boot. | ||
216 | * See page 3-9 of Hardware Reference manual for documentation. | ||
217 | */ | ||
218 | |||
219 | /* EVT15 = _real_start */ | ||
220 | |||
221 | p0.l = lo(EVT15); | ||
222 | p0.h = hi(EVT15); | ||
223 | p1.l = _real_start; | ||
224 | p1.h = _real_start; | ||
225 | [p0] = p1; | ||
226 | csync; | ||
227 | |||
228 | p0.l = lo(IMASK); | ||
229 | p0.h = hi(IMASK); | ||
230 | p1.l = IMASK_IVG15; | ||
231 | p1.h = 0x0; | ||
232 | [p0] = p1; | ||
233 | csync; | ||
234 | |||
235 | raise 15; | ||
236 | p0.l = .LWAIT_HERE; | ||
237 | p0.h = .LWAIT_HERE; | ||
238 | reti = p0; | ||
239 | #if ANOMALY_05000281 | ||
240 | nop; nop; nop; | ||
241 | #endif | ||
242 | rti; | ||
243 | |||
244 | .LWAIT_HERE: | ||
245 | jump .LWAIT_HERE; | ||
246 | ENDPROC(__start) | ||
247 | |||
248 | ENTRY(_real_start) | ||
249 | [ -- sp ] = reti; | ||
250 | p0.l = lo(WDOG_CTL); | ||
251 | p0.h = hi(WDOG_CTL); | ||
252 | r0 = 0xAD6(z); | ||
253 | w[p0] = r0; /* watchdog off for now */ | ||
254 | ssync; | ||
255 | |||
256 | /* Code update for BSS size == 0 | ||
257 | * Zero out the bss region. | ||
258 | */ | ||
259 | |||
260 | p1.l = ___bss_start; | ||
261 | p1.h = ___bss_start; | ||
262 | p2.l = ___bss_stop; | ||
263 | p2.h = ___bss_stop; | ||
264 | r0 = 0; | ||
265 | p2 -= p1; | ||
266 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
267 | .L_clear_bss: | ||
268 | B[p1++] = r0; | ||
269 | |||
270 | /* In case there is a NULL pointer reference | ||
271 | * Zero out region before stext | ||
272 | */ | ||
273 | |||
274 | p1.l = 0x0; | ||
275 | p1.h = 0x0; | ||
276 | r0.l = __stext; | ||
277 | r0.h = __stext; | ||
278 | r0 = r0 >> 1; | ||
279 | p2 = r0; | ||
280 | r0 = 0; | ||
281 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
282 | .L_clear_zero: | ||
283 | W[p1++] = r0; | ||
284 | |||
285 | /* pass the uboot arguments to the global value command line */ | ||
286 | R0 = R7; | ||
287 | call _cmdline_init; | ||
288 | |||
289 | p1.l = __rambase; | ||
290 | p1.h = __rambase; | ||
291 | r0.l = __sdata; | ||
292 | r0.h = __sdata; | ||
293 | [p1] = r0; | ||
294 | |||
295 | p1.l = __ramstart; | ||
296 | p1.h = __ramstart; | ||
297 | p3.l = ___bss_stop; | ||
298 | p3.h = ___bss_stop; | ||
299 | |||
300 | r1 = p3; | ||
301 | [p1] = r1; | ||
302 | |||
303 | /* | ||
304 | * load the current thread pointer and stack | ||
305 | */ | ||
306 | r1.l = _init_thread_union; | ||
307 | r1.h = _init_thread_union; | ||
308 | |||
309 | r2.l = 0x2000; | ||
310 | r2.h = 0x0000; | ||
311 | r1 = r1 + r2; | ||
312 | sp = r1; | ||
313 | usp = sp; | ||
314 | fp = sp; | ||
315 | jump.l _start_kernel; | ||
316 | ENDPROC(_real_start) | ||
317 | |||
318 | __FINIT | ||
319 | |||
320 | .section .l1.text | 38 | .section .l1.text |
321 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
322 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
@@ -420,13 +138,6 @@ ENTRY(_start_dma_code) | |||
420 | [P2] = R1; | 138 | [P2] = R1; |
421 | SSYNC; | 139 | SSYNC; |
422 | 140 | ||
423 | p0.h = hi(SIC_IWR0); | ||
424 | p0.l = lo(SIC_IWR0); | ||
425 | r0.l = lo(IWR_ENABLE_ALL); | ||
426 | r0.h = hi(IWR_ENABLE_ALL); | ||
427 | [p0] = r0; | ||
428 | SSYNC; | ||
429 | |||
430 | RTS; | 141 | RTS; |
431 | ENDPROC(_start_dma_code) | 142 | ENDPROC(_start_dma_code) |
432 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 143 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf527/ints-priority.c b/arch/blackfin/mach-bf527/ints-priority.c index 1fa389793968..8a2367403d2b 100644 --- a/arch/blackfin/mach-bf527/ints-priority.c +++ b/arch/blackfin/mach-bf527/ints-priority.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | 33 | ||
34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
35 | { | 35 | { |
36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-bf533/boards/H8606.c b/arch/blackfin/mach-bf533/boards/H8606.c index 4103a97c1a70..c66a68f30239 100644 --- a/arch/blackfin/mach-bf533/boards/H8606.c +++ b/arch/blackfin/mach-bf533/boards/H8606.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
40 | #endif | 40 | #endif |
41 | #include <linux/ata_platform.h> | ||
42 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
43 | 42 | ||
44 | #include <asm/dma.h> | 43 | #include <asm/dma.h> |
@@ -141,16 +140,16 @@ static struct platform_device net2272_bfin_device = { | |||
141 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 140 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
142 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 141 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
143 | { | 142 | { |
144 | .name = "bootloader", | 143 | .name = "bootloader(spi)", |
145 | .size = 0x00060000, | 144 | .size = 0x00060000, |
146 | .offset = 0, | 145 | .offset = 0, |
147 | .mask_flags = MTD_CAP_ROM | 146 | .mask_flags = MTD_CAP_ROM |
148 | }, { | 147 | }, { |
149 | .name = "kernel", | 148 | .name = "linux kernel(spi)", |
150 | .size = 0x100000, | 149 | .size = 0x100000, |
151 | .offset = 0x60000 | 150 | .offset = 0x60000 |
152 | }, { | 151 | }, { |
153 | .name = "file system", | 152 | .name = "file system(spi)", |
154 | .size = 0x6a0000, | 153 | .size = 0x6a0000, |
155 | .offset = 0x00160000, | 154 | .offset = 0x00160000, |
156 | } | 155 | } |
diff --git a/arch/blackfin/mach-bf533/boards/Kconfig b/arch/blackfin/mach-bf533/boards/Kconfig index 840059241fbe..308c98dc5aba 100644 --- a/arch/blackfin/mach-bf533/boards/Kconfig +++ b/arch/blackfin/mach-bf533/boards/Kconfig | |||
@@ -14,6 +14,12 @@ config BFIN533_STAMP | |||
14 | help | 14 | help |
15 | BF533-STAMP board support. | 15 | BF533-STAMP board support. |
16 | 16 | ||
17 | config BLACKSTAMP | ||
18 | bool "BlackStamp" | ||
19 | help | ||
20 | Support for the BlackStamp board. Hardware info available at | ||
21 | http://blackfin.uclinux.org/gf/project/blackstamp/ | ||
22 | |||
17 | config BFIN533_BLUETECHNIX_CM | 23 | config BFIN533_BLUETECHNIX_CM |
18 | bool "Bluetechnix CM-BF533" | 24 | bool "Bluetechnix CM-BF533" |
19 | depends on (BF533) | 25 | depends on (BF533) |
diff --git a/arch/blackfin/mach-bf533/boards/Makefile b/arch/blackfin/mach-bf533/boards/Makefile index b7a1a1d79bda..9afbe72b484f 100644 --- a/arch/blackfin/mach-bf533/boards/Makefile +++ b/arch/blackfin/mach-bf533/boards/Makefile | |||
@@ -7,4 +7,5 @@ obj-$(CONFIG_BFIN533_STAMP) += stamp.o | |||
7 | obj-$(CONFIG_BFIN532_IP0X) += ip0x.o | 7 | obj-$(CONFIG_BFIN532_IP0X) += ip0x.o |
8 | obj-$(CONFIG_BFIN533_EZKIT) += ezkit.o | 8 | obj-$(CONFIG_BFIN533_EZKIT) += ezkit.o |
9 | obj-$(CONFIG_BFIN533_BLUETECHNIX_CM) += cm_bf533.o | 9 | obj-$(CONFIG_BFIN533_BLUETECHNIX_CM) += cm_bf533.o |
10 | obj-$(CONFIG_BLACKSTAMP) += blackstamp.o | ||
10 | obj-$(CONFIG_H8606_HVSISTEMAS) += H8606.o | 11 | obj-$(CONFIG_H8606_HVSISTEMAS) += H8606.o |
diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c new file mode 100644 index 000000000000..d064ded87719 --- /dev/null +++ b/arch/blackfin/mach-bf533/boards/blackstamp.c | |||
@@ -0,0 +1,401 @@ | |||
1 | /* | ||
2 | * File: arch/blackfin/mach-bf533/blackstamp.c | ||
3 | * Based on: arch/blackfin/mach-bf533/stamp.c | ||
4 | * Author: Benjamin Matthews <bmat@lle.rochester.edu> | ||
5 | * Aidan Williams <aidan@nicta.com.au> | ||
6 | * | ||
7 | * Created: 2008 | ||
8 | * Description: Board Info File for the BlackStamp | ||
9 | * | ||
10 | * Copyright 2005 National ICT Australia (NICTA) | ||
11 | * Copyright 2004-2008 Analog Devices Inc. | ||
12 | * | ||
13 | * Enter bugs at http://blackfin.uclinux.org/ | ||
14 | * | ||
15 | * More info about the BlackStamp at: | ||
16 | * http://blackfin.uclinux.org/gf/project/blackstamp/ | ||
17 | * | ||
18 | * Licensed under the GPL-2 or later. | ||
19 | */ | ||
20 | |||
21 | #include <linux/device.h> | ||
22 | #include <linux/platform_device.h> | ||
23 | #include <linux/mtd/mtd.h> | ||
24 | #include <linux/mtd/partitions.h> | ||
25 | #include <linux/mtd/physmap.h> | ||
26 | #include <linux/spi/spi.h> | ||
27 | #include <linux/spi/flash.h> | ||
28 | #include <linux/irq.h> | ||
29 | #include <linux/i2c.h> | ||
30 | #include <asm/dma.h> | ||
31 | #include <asm/bfin5xx_spi.h> | ||
32 | #include <asm/portmux.h> | ||
33 | #include <asm/dpmc.h> | ||
34 | |||
35 | /* | ||
36 | * Name the Board for the /proc/cpuinfo | ||
37 | */ | ||
38 | const char bfin_board_name[] = "BlackStamp"; | ||
39 | |||
40 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
41 | static struct platform_device rtc_device = { | ||
42 | .name = "rtc-bfin", | ||
43 | .id = -1, | ||
44 | }; | ||
45 | #endif | ||
46 | |||
47 | /* | ||
48 | * Driver needs to know address, irq and flag pin. | ||
49 | */ | ||
50 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
51 | static struct resource smc91x_resources[] = { | ||
52 | { | ||
53 | .name = "smc91x-regs", | ||
54 | .start = 0x20300300, | ||
55 | .end = 0x20300300 + 16, | ||
56 | .flags = IORESOURCE_MEM, | ||
57 | }, { | ||
58 | .start = IRQ_PF3, | ||
59 | .end = IRQ_PF3, | ||
60 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
61 | }, | ||
62 | }; | ||
63 | |||
64 | static struct platform_device smc91x_device = { | ||
65 | .name = "smc91x", | ||
66 | .id = 0, | ||
67 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
68 | .resource = smc91x_resources, | ||
69 | }; | ||
70 | #endif | ||
71 | |||
72 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
73 | static struct mtd_partition bfin_spi_flash_partitions[] = { | ||
74 | { | ||
75 | .name = "bootloader(spi)", | ||
76 | .size = 0x00040000, | ||
77 | .offset = 0, | ||
78 | .mask_flags = MTD_CAP_ROM | ||
79 | }, { | ||
80 | .name = "linux kernel(spi)", | ||
81 | .size = 0x180000, | ||
82 | .offset = MTDPART_OFS_APPEND, | ||
83 | }, { | ||
84 | .name = "file system(spi)", | ||
85 | .size = MTDPART_SIZ_FULL, | ||
86 | .offset = MTDPART_OFS_APPEND, | ||
87 | } | ||
88 | }; | ||
89 | |||
90 | static struct flash_platform_data bfin_spi_flash_data = { | ||
91 | .name = "m25p80", | ||
92 | .parts = bfin_spi_flash_partitions, | ||
93 | .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions), | ||
94 | .type = "m25p64", | ||
95 | }; | ||
96 | |||
97 | /* SPI flash chip (m25p64) */ | ||
98 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | ||
99 | .enable_dma = 0, /* use dma transfer with this chip*/ | ||
100 | .bits_per_word = 8, | ||
101 | }; | ||
102 | #endif | ||
103 | |||
104 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
105 | static struct bfin5xx_spi_chip spi_mmc_chip_info = { | ||
106 | .enable_dma = 1, | ||
107 | .bits_per_word = 8, | ||
108 | }; | ||
109 | #endif | ||
110 | |||
111 | #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) | ||
112 | static struct bfin5xx_spi_chip spidev_chip_info = { | ||
113 | .enable_dma = 0, | ||
114 | .bits_per_word = 8, | ||
115 | }; | ||
116 | #endif | ||
117 | |||
118 | static struct spi_board_info bfin_spi_board_info[] __initdata = { | ||
119 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
120 | { | ||
121 | /* the modalias must be the same as spi device driver name */ | ||
122 | .modalias = "m25p80", /* Name of spi_driver for this device */ | ||
123 | .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */ | ||
124 | .bus_num = 0, /* Framework bus number */ | ||
125 | .chip_select = 2, /* Framework chip select. */ | ||
126 | .platform_data = &bfin_spi_flash_data, | ||
127 | .controller_data = &spi_flash_chip_info, | ||
128 | .mode = SPI_MODE_3, | ||
129 | }, | ||
130 | #endif | ||
131 | |||
132 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
133 | { | ||
134 | .modalias = "spi_mmc_dummy", | ||
135 | .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */ | ||
136 | .bus_num = 0, | ||
137 | .chip_select = 0, | ||
138 | .platform_data = NULL, | ||
139 | .controller_data = &spi_mmc_chip_info, | ||
140 | .mode = SPI_MODE_3, | ||
141 | }, | ||
142 | { | ||
143 | .modalias = "spi_mmc", | ||
144 | .max_speed_hz = 20000000, /* max spi clock (SCK) speed in HZ */ | ||
145 | .bus_num = 0, | ||
146 | .chip_select = CONFIG_SPI_MMC_CS_CHAN, | ||
147 | .platform_data = NULL, | ||
148 | .controller_data = &spi_mmc_chip_info, | ||
149 | .mode = SPI_MODE_3, | ||
150 | }, | ||
151 | #endif | ||
152 | |||
153 | #if defined(CONFIG_SPI_SPIDEV) || defined(CONFIG_SPI_SPIDEV_MODULE) | ||
154 | { | ||
155 | .modalias = "spidev", | ||
156 | .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ | ||
157 | .bus_num = 0, | ||
158 | .chip_select = 7, | ||
159 | .controller_data = &spidev_chip_info, | ||
160 | }, | ||
161 | #endif | ||
162 | }; | ||
163 | |||
164 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
165 | /* SPI (0) */ | ||
166 | static struct resource bfin_spi0_resource[] = { | ||
167 | [0] = { | ||
168 | .start = SPI0_REGBASE, | ||
169 | .end = SPI0_REGBASE + 0xFF, | ||
170 | .flags = IORESOURCE_MEM, | ||
171 | }, | ||
172 | [1] = { | ||
173 | .start = CH_SPI, | ||
174 | .end = CH_SPI, | ||
175 | .flags = IORESOURCE_IRQ, | ||
176 | } | ||
177 | }; | ||
178 | |||
179 | /* SPI controller data */ | ||
180 | static struct bfin5xx_spi_master bfin_spi0_info = { | ||
181 | .num_chipselect = 8, | ||
182 | .enable_dma = 1, /* master has the ability to do dma transfer */ | ||
183 | .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, | ||
184 | }; | ||
185 | |||
186 | static struct platform_device bfin_spi0_device = { | ||
187 | .name = "bfin-spi", | ||
188 | .id = 0, /* Bus number */ | ||
189 | .num_resources = ARRAY_SIZE(bfin_spi0_resource), | ||
190 | .resource = bfin_spi0_resource, | ||
191 | .dev = { | ||
192 | .platform_data = &bfin_spi0_info, /* Passed to driver */ | ||
193 | }, | ||
194 | }; | ||
195 | #endif /* spi master and devices */ | ||
196 | |||
197 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
198 | static struct resource bfin_uart_resources[] = { | ||
199 | { | ||
200 | .start = 0xFFC00400, | ||
201 | .end = 0xFFC004FF, | ||
202 | .flags = IORESOURCE_MEM, | ||
203 | }, | ||
204 | }; | ||
205 | |||
206 | static struct platform_device bfin_uart_device = { | ||
207 | .name = "bfin-uart", | ||
208 | .id = 1, | ||
209 | .num_resources = ARRAY_SIZE(bfin_uart_resources), | ||
210 | .resource = bfin_uart_resources, | ||
211 | }; | ||
212 | #endif | ||
213 | |||
214 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
215 | static struct resource bfin_sir_resources[] = { | ||
216 | #ifdef CONFIG_BFIN_SIR0 | ||
217 | { | ||
218 | .start = 0xFFC00400, | ||
219 | .end = 0xFFC004FF, | ||
220 | .flags = IORESOURCE_MEM, | ||
221 | }, | ||
222 | #endif | ||
223 | }; | ||
224 | |||
225 | static struct platform_device bfin_sir_device = { | ||
226 | .name = "bfin_sir", | ||
227 | .id = 0, | ||
228 | .num_resources = ARRAY_SIZE(bfin_sir_resources), | ||
229 | .resource = bfin_sir_resources, | ||
230 | }; | ||
231 | #endif | ||
232 | |||
233 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
234 | static struct platform_device bfin_sport0_uart_device = { | ||
235 | .name = "bfin-sport-uart", | ||
236 | .id = 0, | ||
237 | }; | ||
238 | |||
239 | static struct platform_device bfin_sport1_uart_device = { | ||
240 | .name = "bfin-sport-uart", | ||
241 | .id = 1, | ||
242 | }; | ||
243 | #endif | ||
244 | |||
245 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
246 | #include <linux/input.h> | ||
247 | #include <linux/gpio_keys.h> | ||
248 | |||
249 | static struct gpio_keys_button bfin_gpio_keys_table[] = { | ||
250 | {BTN_0, GPIO_PF4, 0, "gpio-keys: BTN0"}, | ||
251 | {BTN_1, GPIO_PF5, 0, "gpio-keys: BTN1"}, | ||
252 | {BTN_2, GPIO_PF6, 0, "gpio-keys: BTN2"}, | ||
253 | }; /* Mapped to the first three PF Test Points */ | ||
254 | |||
255 | static struct gpio_keys_platform_data bfin_gpio_keys_data = { | ||
256 | .buttons = bfin_gpio_keys_table, | ||
257 | .nbuttons = ARRAY_SIZE(bfin_gpio_keys_table), | ||
258 | }; | ||
259 | |||
260 | static struct platform_device bfin_device_gpiokeys = { | ||
261 | .name = "gpio-keys", | ||
262 | .dev = { | ||
263 | .platform_data = &bfin_gpio_keys_data, | ||
264 | }, | ||
265 | }; | ||
266 | #endif | ||
267 | |||
268 | static struct resource bfin_gpios_resources = { | ||
269 | .start = 0, | ||
270 | .end = MAX_BLACKFIN_GPIOS - 1, | ||
271 | .flags = IORESOURCE_IRQ, | ||
272 | }; | ||
273 | |||
274 | static struct platform_device bfin_gpios_device = { | ||
275 | .name = "simple-gpio", | ||
276 | .id = -1, | ||
277 | .num_resources = 1, | ||
278 | .resource = &bfin_gpios_resources, | ||
279 | }; | ||
280 | |||
281 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | ||
282 | #include <linux/i2c-gpio.h> | ||
283 | |||
284 | static struct i2c_gpio_platform_data i2c_gpio_data = { | ||
285 | .sda_pin = 8, | ||
286 | .scl_pin = 9, | ||
287 | .sda_is_open_drain = 0, | ||
288 | .scl_is_open_drain = 0, | ||
289 | .udelay = 40, | ||
290 | }; /* This hasn't actually been used these pins | ||
291 | * are (currently) free pins on the expansion connector */ | ||
292 | |||
293 | static struct platform_device i2c_gpio_device = { | ||
294 | .name = "i2c-gpio", | ||
295 | .id = 0, | ||
296 | .dev = { | ||
297 | .platform_data = &i2c_gpio_data, | ||
298 | }, | ||
299 | }; | ||
300 | #endif | ||
301 | |||
302 | #ifdef CONFIG_I2C_BOARDINFO | ||
303 | static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | ||
304 | }; | ||
305 | #endif | ||
306 | |||
307 | static const unsigned int cclk_vlev_datasheet[] = | ||
308 | { | ||
309 | VRPAIR(VLEV_085, 250000000), | ||
310 | VRPAIR(VLEV_090, 376000000), | ||
311 | VRPAIR(VLEV_095, 426000000), | ||
312 | VRPAIR(VLEV_100, 426000000), | ||
313 | VRPAIR(VLEV_105, 476000000), | ||
314 | VRPAIR(VLEV_110, 476000000), | ||
315 | VRPAIR(VLEV_115, 476000000), | ||
316 | VRPAIR(VLEV_120, 600000000), | ||
317 | VRPAIR(VLEV_125, 600000000), | ||
318 | VRPAIR(VLEV_130, 600000000), | ||
319 | }; | ||
320 | |||
321 | static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = { | ||
322 | .tuple_tab = cclk_vlev_datasheet, | ||
323 | .tabsize = ARRAY_SIZE(cclk_vlev_datasheet), | ||
324 | .vr_settling_time = 25 /* us */, | ||
325 | }; | ||
326 | |||
327 | static struct platform_device bfin_dpmc = { | ||
328 | .name = "bfin dpmc", | ||
329 | .dev = { | ||
330 | .platform_data = &bfin_dmpc_vreg_data, | ||
331 | }, | ||
332 | }; | ||
333 | |||
334 | static struct platform_device *stamp_devices[] __initdata = { | ||
335 | |||
336 | &bfin_dpmc, | ||
337 | |||
338 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
339 | &rtc_device, | ||
340 | #endif | ||
341 | |||
342 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
343 | &smc91x_device, | ||
344 | #endif | ||
345 | |||
346 | |||
347 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
348 | &bfin_spi0_device, | ||
349 | #endif | ||
350 | |||
351 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
352 | &bfin_uart_device, | ||
353 | #endif | ||
354 | |||
355 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
356 | &bfin_sir_device, | ||
357 | #endif | ||
358 | |||
359 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
360 | &bfin_sport0_uart_device, | ||
361 | &bfin_sport1_uart_device, | ||
362 | #endif | ||
363 | |||
364 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | ||
365 | &bfin_device_gpiokeys, | ||
366 | #endif | ||
367 | |||
368 | #if defined(CONFIG_I2C_GPIO) || defined(CONFIG_I2C_GPIO_MODULE) | ||
369 | &i2c_gpio_device, | ||
370 | #endif | ||
371 | |||
372 | &bfin_gpios_device, | ||
373 | }; | ||
374 | |||
375 | static int __init blackstamp_init(void) | ||
376 | { | ||
377 | int ret; | ||
378 | |||
379 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | ||
380 | |||
381 | #ifdef CONFIG_I2C_BOARDINFO | ||
382 | i2c_register_board_info(0, bfin_i2c_board_info, | ||
383 | ARRAY_SIZE(bfin_i2c_board_info)); | ||
384 | #endif | ||
385 | |||
386 | ret = platform_add_devices(stamp_devices, ARRAY_SIZE(stamp_devices)); | ||
387 | if (ret < 0) | ||
388 | return ret; | ||
389 | |||
390 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
391 | /* setup BF533_STAMP CPLD to route AMS3 to Ethernet MAC */ | ||
392 | bfin_write_FIO_DIR(bfin_read_FIO_DIR() | PF0); | ||
393 | bfin_write_FIO_FLAG_S(PF0); | ||
394 | SSYNC(); | ||
395 | #endif | ||
396 | |||
397 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | ||
398 | return 0; | ||
399 | } | ||
400 | |||
401 | arch_initcall(blackstamp_init); | ||
diff --git a/arch/blackfin/mach-bf533/boards/cm_bf533.c b/arch/blackfin/mach-bf533/boards/cm_bf533.c index ed2b0b8f5dc9..575843f6d9ef 100644 --- a/arch/blackfin/mach-bf533/boards/cm_bf533.c +++ b/arch/blackfin/mach-bf533/boards/cm_bf533.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 36 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
37 | #include <linux/usb/isp1362.h> | 37 | #include <linux/usb/isp1362.h> |
38 | #endif | 38 | #endif |
39 | #include <linux/ata_platform.h> | ||
40 | #include <linux/irq.h> | 39 | #include <linux/irq.h> |
41 | #include <asm/dma.h> | 40 | #include <asm/dma.h> |
42 | #include <asm/bfin5xx_spi.h> | 41 | #include <asm/bfin5xx_spi.h> |
@@ -53,16 +52,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF533"; | |||
53 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 52 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
54 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 53 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
55 | { | 54 | { |
56 | .name = "bootloader", | 55 | .name = "bootloader(spi)", |
57 | .size = 0x00020000, | 56 | .size = 0x00020000, |
58 | .offset = 0, | 57 | .offset = 0, |
59 | .mask_flags = MTD_CAP_ROM | 58 | .mask_flags = MTD_CAP_ROM |
60 | }, { | 59 | }, { |
61 | .name = "kernel", | 60 | .name = "linux kernel(spi)", |
62 | .size = 0xe0000, | 61 | .size = 0xe0000, |
63 | .offset = 0x20000 | 62 | .offset = 0x20000 |
64 | }, { | 63 | }, { |
65 | .name = "file system", | 64 | .name = "file system(spi)", |
66 | .size = 0x700000, | 65 | .size = 0x700000, |
67 | .offset = 0x00100000, | 66 | .offset = 0x00100000, |
68 | } | 67 | } |
@@ -307,43 +306,6 @@ static struct platform_device isp1362_hcd_device = { | |||
307 | }; | 306 | }; |
308 | #endif | 307 | #endif |
309 | 308 | ||
310 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
311 | #define PATA_INT 38 | ||
312 | |||
313 | static struct pata_platform_info bfin_pata_platform_data = { | ||
314 | .ioport_shift = 2, | ||
315 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
316 | }; | ||
317 | |||
318 | static struct resource bfin_pata_resources[] = { | ||
319 | { | ||
320 | .start = 0x2030C000, | ||
321 | .end = 0x2030C01F, | ||
322 | .flags = IORESOURCE_MEM, | ||
323 | }, | ||
324 | { | ||
325 | .start = 0x2030D018, | ||
326 | .end = 0x2030D01B, | ||
327 | .flags = IORESOURCE_MEM, | ||
328 | }, | ||
329 | { | ||
330 | .start = PATA_INT, | ||
331 | .end = PATA_INT, | ||
332 | .flags = IORESOURCE_IRQ, | ||
333 | }, | ||
334 | }; | ||
335 | |||
336 | static struct platform_device bfin_pata_device = { | ||
337 | .name = "pata_platform", | ||
338 | .id = -1, | ||
339 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
340 | .resource = bfin_pata_resources, | ||
341 | .dev = { | ||
342 | .platform_data = &bfin_pata_platform_data, | ||
343 | } | ||
344 | }; | ||
345 | #endif | ||
346 | |||
347 | static const unsigned int cclk_vlev_datasheet[] = | 309 | static const unsigned int cclk_vlev_datasheet[] = |
348 | { | 310 | { |
349 | VRPAIR(VLEV_085, 250000000), | 311 | VRPAIR(VLEV_085, 250000000), |
@@ -403,10 +365,6 @@ static struct platform_device *cm_bf533_devices[] __initdata = { | |||
403 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | 365 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) |
404 | &bfin_spi0_device, | 366 | &bfin_spi0_device, |
405 | #endif | 367 | #endif |
406 | |||
407 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
408 | &bfin_pata_device, | ||
409 | #endif | ||
410 | }; | 368 | }; |
411 | 369 | ||
412 | static int __init cm_bf533_init(void) | 370 | static int __init cm_bf533_init(void) |
@@ -416,10 +374,6 @@ static int __init cm_bf533_init(void) | |||
416 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | 374 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) |
417 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 375 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
418 | #endif | 376 | #endif |
419 | |||
420 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
421 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
422 | #endif | ||
423 | return 0; | 377 | return 0; |
424 | } | 378 | } |
425 | 379 | ||
diff --git a/arch/blackfin/mach-bf533/boards/ezkit.c b/arch/blackfin/mach-bf533/boards/ezkit.c index 079389cbd859..cc2e7eeb1d5a 100644 --- a/arch/blackfin/mach-bf533/boards/ezkit.c +++ b/arch/blackfin/mach-bf533/boards/ezkit.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 37 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
38 | #include <linux/usb/isp1362.h> | 38 | #include <linux/usb/isp1362.h> |
39 | #endif | 39 | #endif |
40 | #include <linux/ata_platform.h> | ||
41 | #include <linux/irq.h> | 40 | #include <linux/irq.h> |
42 | #include <asm/dma.h> | 41 | #include <asm/dma.h> |
43 | #include <asm/bfin5xx_spi.h> | 42 | #include <asm/bfin5xx_spi.h> |
@@ -90,16 +89,16 @@ static struct platform_device smc91x_device = { | |||
90 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 89 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
91 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 90 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
92 | { | 91 | { |
93 | .name = "bootloader", | 92 | .name = "bootloader(spi)", |
94 | .size = 0x00020000, | 93 | .size = 0x00020000, |
95 | .offset = 0, | 94 | .offset = 0, |
96 | .mask_flags = MTD_CAP_ROM | 95 | .mask_flags = MTD_CAP_ROM |
97 | }, { | 96 | }, { |
98 | .name = "kernel", | 97 | .name = "linux kernel(spi)", |
99 | .size = 0xe0000, | 98 | .size = 0xe0000, |
100 | .offset = MTDPART_OFS_APPEND, | 99 | .offset = MTDPART_OFS_APPEND, |
101 | }, { | 100 | }, { |
102 | .name = "file system", | 101 | .name = "file system(spi)", |
103 | .size = MTDPART_SIZ_FULL, | 102 | .size = MTDPART_SIZ_FULL, |
104 | .offset = MTDPART_OFS_APPEND, | 103 | .offset = MTDPART_OFS_APPEND, |
105 | } | 104 | } |
@@ -255,43 +254,6 @@ static struct platform_device bfin_sir_device = { | |||
255 | }; | 254 | }; |
256 | #endif | 255 | #endif |
257 | 256 | ||
258 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
259 | #define PATA_INT 55 | ||
260 | |||
261 | static struct pata_platform_info bfin_pata_platform_data = { | ||
262 | .ioport_shift = 1, | ||
263 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
264 | }; | ||
265 | |||
266 | static struct resource bfin_pata_resources[] = { | ||
267 | { | ||
268 | .start = 0x20314020, | ||
269 | .end = 0x2031403F, | ||
270 | .flags = IORESOURCE_MEM, | ||
271 | }, | ||
272 | { | ||
273 | .start = 0x2031401C, | ||
274 | .end = 0x2031401F, | ||
275 | .flags = IORESOURCE_MEM, | ||
276 | }, | ||
277 | { | ||
278 | .start = PATA_INT, | ||
279 | .end = PATA_INT, | ||
280 | .flags = IORESOURCE_IRQ, | ||
281 | }, | ||
282 | }; | ||
283 | |||
284 | static struct platform_device bfin_pata_device = { | ||
285 | .name = "pata_platform", | ||
286 | .id = -1, | ||
287 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
288 | .resource = bfin_pata_resources, | ||
289 | .dev = { | ||
290 | .platform_data = &bfin_pata_platform_data, | ||
291 | } | ||
292 | }; | ||
293 | #endif | ||
294 | |||
295 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 257 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
296 | #include <linux/input.h> | 258 | #include <linux/input.h> |
297 | #include <linux/gpio_keys.h> | 259 | #include <linux/gpio_keys.h> |
@@ -404,10 +366,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
404 | &bfin_sir_device, | 366 | &bfin_sir_device, |
405 | #endif | 367 | #endif |
406 | 368 | ||
407 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
408 | &bfin_pata_device, | ||
409 | #endif | ||
410 | |||
411 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 369 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
412 | &bfin_device_gpiokeys, | 370 | &bfin_device_gpiokeys, |
413 | #endif | 371 | #endif |
@@ -424,10 +382,6 @@ static int __init ezkit_init(void) | |||
424 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | 382 | printk(KERN_INFO "%s(): registering device resources\n", __func__); |
425 | platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); | 383 | platform_add_devices(ezkit_devices, ARRAY_SIZE(ezkit_devices)); |
426 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 384 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
427 | |||
428 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
429 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
430 | #endif | ||
431 | return 0; | 385 | return 0; |
432 | } | 386 | } |
433 | 387 | ||
diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c index 13ae49515f73..050ffca53530 100644 --- a/arch/blackfin/mach-bf533/boards/stamp.c +++ b/arch/blackfin/mach-bf533/boards/stamp.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
40 | #endif | 40 | #endif |
41 | #include <linux/ata_platform.h> | ||
42 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
43 | #include <linux/i2c.h> | 42 | #include <linux/i2c.h> |
44 | #include <asm/dma.h> | 43 | #include <asm/dma.h> |
@@ -114,15 +113,15 @@ static struct platform_device net2272_bfin_device = { | |||
114 | #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE) | 113 | #if defined(CONFIG_MTD_BFIN_ASYNC) || defined(CONFIG_MTD_BFIN_ASYNC_MODULE) |
115 | static struct mtd_partition stamp_partitions[] = { | 114 | static struct mtd_partition stamp_partitions[] = { |
116 | { | 115 | { |
117 | .name = "Bootloader", | 116 | .name = "bootloader(nor)", |
118 | .size = 0x40000, | 117 | .size = 0x40000, |
119 | .offset = 0, | 118 | .offset = 0, |
120 | }, { | 119 | }, { |
121 | .name = "Kernel", | 120 | .name = "linux kernel(nor)", |
122 | .size = 0xE0000, | 121 | .size = 0xE0000, |
123 | .offset = MTDPART_OFS_APPEND, | 122 | .offset = MTDPART_OFS_APPEND, |
124 | }, { | 123 | }, { |
125 | .name = "RootFS", | 124 | .name = "file system(nor)", |
126 | .size = MTDPART_SIZ_FULL, | 125 | .size = MTDPART_SIZ_FULL, |
127 | .offset = MTDPART_OFS_APPEND, | 126 | .offset = MTDPART_OFS_APPEND, |
128 | } | 127 | } |
@@ -164,16 +163,16 @@ static struct platform_device stamp_flash_device = { | |||
164 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 163 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
165 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 164 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
166 | { | 165 | { |
167 | .name = "bootloader", | 166 | .name = "bootloader(spi)", |
168 | .size = 0x00040000, | 167 | .size = 0x00040000, |
169 | .offset = 0, | 168 | .offset = 0, |
170 | .mask_flags = MTD_CAP_ROM | 169 | .mask_flags = MTD_CAP_ROM |
171 | }, { | 170 | }, { |
172 | .name = "kernel", | 171 | .name = "linux kernel(spi)", |
173 | .size = 0xe0000, | 172 | .size = 0xe0000, |
174 | .offset = MTDPART_OFS_APPEND, | 173 | .offset = MTDPART_OFS_APPEND, |
175 | }, { | 174 | }, { |
176 | .name = "file system", | 175 | .name = "file system(spi)", |
177 | .size = MTDPART_SIZ_FULL, | 176 | .size = MTDPART_SIZ_FULL, |
178 | .offset = MTDPART_OFS_APPEND, | 177 | .offset = MTDPART_OFS_APPEND, |
179 | } | 178 | } |
@@ -404,43 +403,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
404 | }; | 403 | }; |
405 | #endif | 404 | #endif |
406 | 405 | ||
407 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
408 | #define PATA_INT 55 | ||
409 | |||
410 | static struct pata_platform_info bfin_pata_platform_data = { | ||
411 | .ioport_shift = 1, | ||
412 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
413 | }; | ||
414 | |||
415 | static struct resource bfin_pata_resources[] = { | ||
416 | { | ||
417 | .start = 0x20314020, | ||
418 | .end = 0x2031403F, | ||
419 | .flags = IORESOURCE_MEM, | ||
420 | }, | ||
421 | { | ||
422 | .start = 0x2031401C, | ||
423 | .end = 0x2031401F, | ||
424 | .flags = IORESOURCE_MEM, | ||
425 | }, | ||
426 | { | ||
427 | .start = PATA_INT, | ||
428 | .end = PATA_INT, | ||
429 | .flags = IORESOURCE_IRQ, | ||
430 | }, | ||
431 | }; | ||
432 | |||
433 | static struct platform_device bfin_pata_device = { | ||
434 | .name = "pata_platform", | ||
435 | .id = -1, | ||
436 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
437 | .resource = bfin_pata_resources, | ||
438 | .dev = { | ||
439 | .platform_data = &bfin_pata_platform_data, | ||
440 | } | ||
441 | }; | ||
442 | #endif | ||
443 | |||
444 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 406 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
445 | #include <linux/input.h> | 407 | #include <linux/input.h> |
446 | #include <linux/gpio_keys.h> | 408 | #include <linux/gpio_keys.h> |
@@ -583,10 +545,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
583 | &bfin_sport1_uart_device, | 545 | &bfin_sport1_uart_device, |
584 | #endif | 546 | #endif |
585 | 547 | ||
586 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
587 | &bfin_pata_device, | ||
588 | #endif | ||
589 | |||
590 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 548 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
591 | &bfin_device_gpiokeys, | 549 | &bfin_device_gpiokeys, |
592 | #endif | 550 | #endif |
@@ -625,10 +583,6 @@ static int __init stamp_init(void) | |||
625 | #endif | 583 | #endif |
626 | 584 | ||
627 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 585 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
628 | |||
629 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
630 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
631 | #endif | ||
632 | return 0; | 586 | return 0; |
633 | } | 587 | } |
634 | 588 | ||
diff --git a/arch/blackfin/mach-bf533/head.S b/arch/blackfin/mach-bf533/head.S index c671e8549b17..d59db86195b6 100644 --- a/arch/blackfin/mach-bf533/head.S +++ b/arch/blackfin/mach-bf533/head.S | |||
@@ -30,294 +30,11 @@ | |||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | #include <asm/trace.h> | ||
34 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
35 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
36 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
37 | #endif | 36 | #endif |
38 | 37 | ||
39 | .extern ___bss_stop | ||
40 | .extern ___bss_start | ||
41 | .extern _bf53x_relocate_l1_mem | ||
42 | |||
43 | #define INITIAL_STACK 0xFFB01000 | ||
44 | |||
45 | __INIT | ||
46 | |||
47 | ENTRY(__start) | ||
48 | /* R0: argument of command line string, passed from uboot, save it */ | ||
49 | R7 = R0; | ||
50 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
51 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
52 | R0 = SYSCFG_SNEN; | ||
53 | #else | ||
54 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
55 | #endif | ||
56 | SYSCFG = R0; | ||
57 | R0 = 0; | ||
58 | |||
59 | /* Clear Out All the data and pointer Registers */ | ||
60 | R1 = R0; | ||
61 | R2 = R0; | ||
62 | R3 = R0; | ||
63 | R4 = R0; | ||
64 | R5 = R0; | ||
65 | R6 = R0; | ||
66 | |||
67 | P0 = R0; | ||
68 | P1 = R0; | ||
69 | P2 = R0; | ||
70 | P3 = R0; | ||
71 | P4 = R0; | ||
72 | P5 = R0; | ||
73 | |||
74 | LC0 = r0; | ||
75 | LC1 = r0; | ||
76 | L0 = r0; | ||
77 | L1 = r0; | ||
78 | L2 = r0; | ||
79 | L3 = r0; | ||
80 | |||
81 | /* Clear Out All the DAG Registers */ | ||
82 | B0 = r0; | ||
83 | B1 = r0; | ||
84 | B2 = r0; | ||
85 | B3 = r0; | ||
86 | |||
87 | I0 = r0; | ||
88 | I1 = r0; | ||
89 | I2 = r0; | ||
90 | I3 = r0; | ||
91 | |||
92 | M0 = r0; | ||
93 | M1 = r0; | ||
94 | M2 = r0; | ||
95 | M3 = r0; | ||
96 | |||
97 | trace_buffer_init(p0,r0); | ||
98 | P0 = R1; | ||
99 | R0 = R1; | ||
100 | |||
101 | p0.h = hi(FIO_MASKA_C); | ||
102 | p0.l = lo(FIO_MASKA_C); | ||
103 | r0 = 0xFFFF(Z); | ||
104 | w[p0] = r0.L; /* Disable all interrupts */ | ||
105 | ssync; | ||
106 | |||
107 | p0.h = hi(FIO_MASKB_C); | ||
108 | p0.l = lo(FIO_MASKB_C); | ||
109 | r0 = 0xFFFF(Z); | ||
110 | w[p0] = r0.L; /* Disable all interrupts */ | ||
111 | ssync; | ||
112 | |||
113 | /* Turn off the icache */ | ||
114 | p0.l = LO(IMEM_CONTROL); | ||
115 | p0.h = HI(IMEM_CONTROL); | ||
116 | R1 = [p0]; | ||
117 | R0 = ~ENICPLB; | ||
118 | R0 = R0 & R1; | ||
119 | |||
120 | /* Anomaly 05000125 */ | ||
121 | #if ANOMALY_05000125 | ||
122 | CLI R2; | ||
123 | SSYNC; | ||
124 | #endif | ||
125 | [p0] = R0; | ||
126 | SSYNC; | ||
127 | #if ANOMALY_05000125 | ||
128 | STI R2; | ||
129 | #endif | ||
130 | |||
131 | /* Turn off the dcache */ | ||
132 | p0.l = LO(DMEM_CONTROL); | ||
133 | p0.h = HI(DMEM_CONTROL); | ||
134 | R1 = [p0]; | ||
135 | R0 = ~ENDCPLB; | ||
136 | R0 = R0 & R1; | ||
137 | |||
138 | /* Anomaly 05000125 */ | ||
139 | #if ANOMALY_05000125 | ||
140 | CLI R2; | ||
141 | SSYNC; | ||
142 | #endif | ||
143 | [p0] = R0; | ||
144 | SSYNC; | ||
145 | #if ANOMALY_05000125 | ||
146 | STI R2; | ||
147 | #endif | ||
148 | |||
149 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
150 | * so if we dont initalize here, our serial console gets hosed */ | ||
151 | p0.h = hi(BFIN_UART_LCR); | ||
152 | p0.l = lo(BFIN_UART_LCR); | ||
153 | r0 = 0x0(Z); | ||
154 | w[p0] = r0.L; /* To enable DLL writes */ | ||
155 | ssync; | ||
156 | |||
157 | p0.h = hi(BFIN_UART_DLL); | ||
158 | p0.l = lo(BFIN_UART_DLL); | ||
159 | r0 = 0x0(Z); | ||
160 | w[p0] = r0.L; | ||
161 | ssync; | ||
162 | |||
163 | p0.h = hi(BFIN_UART_DLH); | ||
164 | p0.l = lo(BFIN_UART_DLH); | ||
165 | r0 = 0x00(Z); | ||
166 | w[p0] = r0.L; | ||
167 | ssync; | ||
168 | |||
169 | p0.h = hi(BFIN_UART_GCTL); | ||
170 | p0.l = lo(BFIN_UART_GCTL); | ||
171 | r0 = 0x0(Z); | ||
172 | w[p0] = r0.L; /* To enable UART clock */ | ||
173 | ssync; | ||
174 | |||
175 | /* Initialize stack pointer */ | ||
176 | sp.l = lo(INITIAL_STACK); | ||
177 | sp.h = hi(INITIAL_STACK); | ||
178 | fp = sp; | ||
179 | usp = sp; | ||
180 | |||
181 | #ifdef CONFIG_EARLY_PRINTK | ||
182 | SP += -12; | ||
183 | call _init_early_exception_vectors; | ||
184 | SP += 12; | ||
185 | #endif | ||
186 | |||
187 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
188 | call _bf53x_relocate_l1_mem; | ||
189 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
190 | call _start_dma_code; | ||
191 | #endif | ||
192 | |||
193 | /* Code for initializing Async memory banks */ | ||
194 | |||
195 | p2.h = hi(EBIU_AMBCTL1); | ||
196 | p2.l = lo(EBIU_AMBCTL1); | ||
197 | r0.h = hi(AMBCTL1VAL); | ||
198 | r0.l = lo(AMBCTL1VAL); | ||
199 | [p2] = r0; | ||
200 | ssync; | ||
201 | |||
202 | p2.h = hi(EBIU_AMBCTL0); | ||
203 | p2.l = lo(EBIU_AMBCTL0); | ||
204 | r0.h = hi(AMBCTL0VAL); | ||
205 | r0.l = lo(AMBCTL0VAL); | ||
206 | [p2] = r0; | ||
207 | ssync; | ||
208 | |||
209 | p2.h = hi(EBIU_AMGCTL); | ||
210 | p2.l = lo(EBIU_AMGCTL); | ||
211 | r0 = AMGCTLVAL; | ||
212 | w[p2] = r0; | ||
213 | ssync; | ||
214 | |||
215 | /* This section keeps the processor in supervisor mode | ||
216 | * during kernel boot. Switches to user mode at end of boot. | ||
217 | * See page 3-9 of Hardware Reference manual for documentation. | ||
218 | */ | ||
219 | |||
220 | /* EVT15 = _real_start */ | ||
221 | |||
222 | p0.l = lo(EVT15); | ||
223 | p0.h = hi(EVT15); | ||
224 | p1.l = _real_start; | ||
225 | p1.h = _real_start; | ||
226 | [p0] = p1; | ||
227 | csync; | ||
228 | |||
229 | p0.l = lo(IMASK); | ||
230 | p0.h = hi(IMASK); | ||
231 | p1.l = IMASK_IVG15; | ||
232 | p1.h = 0x0; | ||
233 | [p0] = p1; | ||
234 | csync; | ||
235 | |||
236 | raise 15; | ||
237 | p0.l = .LWAIT_HERE; | ||
238 | p0.h = .LWAIT_HERE; | ||
239 | reti = p0; | ||
240 | #if ANOMALY_05000281 | ||
241 | nop; nop; nop; | ||
242 | #endif | ||
243 | rti; | ||
244 | |||
245 | .LWAIT_HERE: | ||
246 | jump .LWAIT_HERE; | ||
247 | ENDPROC(__start) | ||
248 | |||
249 | ENTRY(_real_start) | ||
250 | [ -- sp ] = reti; | ||
251 | p0.l = lo(WDOG_CTL); | ||
252 | p0.h = hi(WDOG_CTL); | ||
253 | r0 = 0xAD6(z); | ||
254 | w[p0] = r0; /* watchdog off for now */ | ||
255 | ssync; | ||
256 | |||
257 | /* Code update for BSS size == 0 | ||
258 | * Zero out the bss region. | ||
259 | */ | ||
260 | |||
261 | p1.l = ___bss_start; | ||
262 | p1.h = ___bss_start; | ||
263 | p2.l = ___bss_stop; | ||
264 | p2.h = ___bss_stop; | ||
265 | r0 = 0; | ||
266 | p2 -= p1; | ||
267 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
268 | .L_clear_bss: | ||
269 | B[p1++] = r0; | ||
270 | |||
271 | /* In case there is a NULL pointer reference | ||
272 | * Zero out region before stext | ||
273 | */ | ||
274 | |||
275 | p1.l = 0x0; | ||
276 | p1.h = 0x0; | ||
277 | r0.l = __stext; | ||
278 | r0.h = __stext; | ||
279 | r0 = r0 >> 1; | ||
280 | p2 = r0; | ||
281 | r0 = 0; | ||
282 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
283 | .L_clear_zero: | ||
284 | W[p1++] = r0; | ||
285 | |||
286 | /* pass the uboot arguments to the global value command line */ | ||
287 | R0 = R7; | ||
288 | call _cmdline_init; | ||
289 | |||
290 | p1.l = __rambase; | ||
291 | p1.h = __rambase; | ||
292 | r0.l = __sdata; | ||
293 | r0.h = __sdata; | ||
294 | [p1] = r0; | ||
295 | |||
296 | p1.l = __ramstart; | ||
297 | p1.h = __ramstart; | ||
298 | p3.l = ___bss_stop; | ||
299 | p3.h = ___bss_stop; | ||
300 | |||
301 | r1 = p3; | ||
302 | [p1] = r1; | ||
303 | |||
304 | /* | ||
305 | * load the current thread pointer and stack | ||
306 | */ | ||
307 | r1.l = _init_thread_union; | ||
308 | r1.h = _init_thread_union; | ||
309 | |||
310 | r2.l = 0x2000; | ||
311 | r2.h = 0x0000; | ||
312 | r1 = r1 + r2; | ||
313 | sp = r1; | ||
314 | usp = sp; | ||
315 | fp = sp; | ||
316 | jump.l _start_kernel; | ||
317 | ENDPROC(_real_start) | ||
318 | |||
319 | __FINIT | ||
320 | |||
321 | .section .l1.text | 38 | .section .l1.text |
322 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
323 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
@@ -412,13 +129,6 @@ ENTRY(_start_dma_code) | |||
412 | [P2] = R1; | 129 | [P2] = R1; |
413 | SSYNC; | 130 | SSYNC; |
414 | 131 | ||
415 | p0.h = hi(SIC_IWR); | ||
416 | p0.l = lo(SIC_IWR); | ||
417 | r0.l = lo(IWR_ENABLE_ALL); | ||
418 | r0.h = hi(IWR_ENABLE_ALL); | ||
419 | [p0] = r0; | ||
420 | SSYNC; | ||
421 | |||
422 | RTS; | 132 | RTS; |
423 | ENDPROC(_start_dma_code) | 133 | ENDPROC(_start_dma_code) |
424 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 134 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf533/ints-priority.c b/arch/blackfin/mach-bf533/ints-priority.c index 7d79e0f9503d..f51994b7a2b9 100644 --- a/arch/blackfin/mach-bf533/ints-priority.c +++ b/arch/blackfin/mach-bf533/ints-priority.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | 33 | ||
34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
35 | { | 35 | { |
36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
37 | bfin_write_SIC_IAR0(((CONFIG_PLLWAKE_ERROR - 7) << PLLWAKE_ERROR_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_PLLWAKE_ERROR - 7) << PLLWAKE_ERROR_POS) | |
diff --git a/arch/blackfin/mach-bf537/boards/Kconfig b/arch/blackfin/mach-bf537/boards/Kconfig index 7e789dbef036..42a57b0acb29 100644 --- a/arch/blackfin/mach-bf537/boards/Kconfig +++ b/arch/blackfin/mach-bf537/boards/Kconfig | |||
@@ -15,6 +15,12 @@ config BFIN537_BLUETECHNIX_CM | |||
15 | help | 15 | help |
16 | CM-BF537 support for EVAL- and DEV-Board. | 16 | CM-BF537 support for EVAL- and DEV-Board. |
17 | 17 | ||
18 | config BFIN537_BLUETECHNIX_TCM | ||
19 | bool "Bluetechnix TCM-BF537" | ||
20 | depends on (BF537) | ||
21 | help | ||
22 | TCM-BF537 support for EVAL- and DEV-Board. | ||
23 | |||
18 | config PNAV10 | 24 | config PNAV10 |
19 | bool "PNAV board" | 25 | bool "PNAV board" |
20 | depends on (BF537) | 26 | depends on (BF537) |
diff --git a/arch/blackfin/mach-bf537/boards/Makefile b/arch/blackfin/mach-bf537/boards/Makefile index c94f7a5b8211..7168cc14afd8 100644 --- a/arch/blackfin/mach-bf537/boards/Makefile +++ b/arch/blackfin/mach-bf537/boards/Makefile | |||
@@ -5,5 +5,6 @@ | |||
5 | obj-$(CONFIG_GENERIC_BF537_BOARD) += generic_board.o | 5 | obj-$(CONFIG_GENERIC_BF537_BOARD) += generic_board.o |
6 | obj-$(CONFIG_BFIN537_STAMP) += stamp.o | 6 | obj-$(CONFIG_BFIN537_STAMP) += stamp.o |
7 | obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o | 7 | obj-$(CONFIG_BFIN537_BLUETECHNIX_CM) += cm_bf537.o |
8 | obj-$(CONFIG_BFIN537_BLUETECHNIX_TCM) += tcm_bf537.o | ||
8 | obj-$(CONFIG_PNAV10) += pnav10.o | 9 | obj-$(CONFIG_PNAV10) += pnav10.o |
9 | obj-$(CONFIG_CAMSIG_MINOTAUR) += minotaur.o | 10 | obj-$(CONFIG_CAMSIG_MINOTAUR) += minotaur.o |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537.c b/arch/blackfin/mach-bf537/boards/cm_bf537.c index 73f2142875e2..dde14720b0ea 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/platform_device.h> | 33 | #include <linux/platform_device.h> |
34 | #include <linux/mtd/mtd.h> | 34 | #include <linux/mtd/mtd.h> |
35 | #include <linux/mtd/partitions.h> | 35 | #include <linux/mtd/partitions.h> |
36 | #include <linux/mtd/physmap.h> | ||
36 | #include <linux/spi/spi.h> | 37 | #include <linux/spi/spi.h> |
37 | #include <linux/spi/flash.h> | 38 | #include <linux/spi/flash.h> |
38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
@@ -56,16 +57,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF537"; | |||
56 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 57 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
57 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 58 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
58 | { | 59 | { |
59 | .name = "bootloader", | 60 | .name = "bootloader(spi)", |
60 | .size = 0x00020000, | 61 | .size = 0x00020000, |
61 | .offset = 0, | 62 | .offset = 0, |
62 | .mask_flags = MTD_CAP_ROM | 63 | .mask_flags = MTD_CAP_ROM |
63 | }, { | 64 | }, { |
64 | .name = "kernel", | 65 | .name = "linux kernel(spi)", |
65 | .size = 0xe0000, | 66 | .size = 0xe0000, |
66 | .offset = 0x20000 | 67 | .offset = 0x20000 |
67 | }, { | 68 | }, { |
68 | .name = "file system", | 69 | .name = "file system(spi)", |
69 | .size = 0x700000, | 70 | .size = 0x700000, |
70 | .offset = 0x00100000, | 71 | .offset = 0x00100000, |
71 | } | 72 | } |
@@ -307,6 +308,55 @@ static struct platform_device net2272_bfin_device = { | |||
307 | }; | 308 | }; |
308 | #endif | 309 | #endif |
309 | 310 | ||
311 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
312 | static struct mtd_partition cm_partitions[] = { | ||
313 | { | ||
314 | .name = "bootloader(nor)", | ||
315 | .size = 0x40000, | ||
316 | .offset = 0, | ||
317 | }, { | ||
318 | .name = "linux kernel(nor)", | ||
319 | .size = 0xE0000, | ||
320 | .offset = MTDPART_OFS_APPEND, | ||
321 | }, { | ||
322 | .name = "file system(nor)", | ||
323 | .size = MTDPART_SIZ_FULL, | ||
324 | .offset = MTDPART_OFS_APPEND, | ||
325 | } | ||
326 | }; | ||
327 | |||
328 | static struct physmap_flash_data cm_flash_data = { | ||
329 | .width = 2, | ||
330 | .parts = cm_partitions, | ||
331 | .nr_parts = ARRAY_SIZE(cm_partitions), | ||
332 | }; | ||
333 | |||
334 | static unsigned cm_flash_gpios[] = { GPIO_PF4 }; | ||
335 | |||
336 | static struct resource cm_flash_resource[] = { | ||
337 | { | ||
338 | .name = "cfi_probe", | ||
339 | .start = 0x20000000, | ||
340 | .end = 0x201fffff, | ||
341 | .flags = IORESOURCE_MEM, | ||
342 | }, { | ||
343 | .start = (unsigned long)cm_flash_gpios, | ||
344 | .end = ARRAY_SIZE(cm_flash_gpios), | ||
345 | .flags = IORESOURCE_IRQ, | ||
346 | } | ||
347 | }; | ||
348 | |||
349 | static struct platform_device cm_flash_device = { | ||
350 | .name = "gpio-addr-flash", | ||
351 | .id = 0, | ||
352 | .dev = { | ||
353 | .platform_data = &cm_flash_data, | ||
354 | }, | ||
355 | .num_resources = ARRAY_SIZE(cm_flash_resource), | ||
356 | .resource = cm_flash_resource, | ||
357 | }; | ||
358 | #endif | ||
359 | |||
310 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | 360 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) |
311 | static struct resource bfin_uart_resources[] = { | 361 | static struct resource bfin_uart_resources[] = { |
312 | { | 362 | { |
@@ -395,7 +445,7 @@ static struct platform_device bfin_mac_device = { | |||
395 | #endif | 445 | #endif |
396 | 446 | ||
397 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 447 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
398 | #define PATA_INT 64 | 448 | #define PATA_INT IRQ_PF14 |
399 | 449 | ||
400 | static struct pata_platform_info bfin_pata_platform_data = { | 450 | static struct pata_platform_info bfin_pata_platform_data = { |
401 | .ioport_shift = 2, | 451 | .ioport_shift = 2, |
@@ -510,6 +560,10 @@ static struct platform_device *cm_bf537_devices[] __initdata = { | |||
510 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 560 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
511 | &bfin_pata_device, | 561 | &bfin_pata_device, |
512 | #endif | 562 | #endif |
563 | |||
564 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
565 | &cm_flash_device, | ||
566 | #endif | ||
513 | }; | 567 | }; |
514 | 568 | ||
515 | static int __init cm_bf537_init(void) | 569 | static int __init cm_bf537_init(void) |
diff --git a/arch/blackfin/mach-bf537/boards/generic_board.c b/arch/blackfin/mach-bf537/boards/generic_board.c index 01b63e2ec18f..78a13d5bfd55 100644 --- a/arch/blackfin/mach-bf537/boards/generic_board.c +++ b/arch/blackfin/mach-bf537/boards/generic_board.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | 38 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) |
39 | #include <linux/usb/isp1362.h> | 39 | #include <linux/usb/isp1362.h> |
40 | #endif | 40 | #endif |
41 | #include <linux/ata_platform.h> | ||
42 | #include <linux/irq.h> | 41 | #include <linux/irq.h> |
43 | #include <linux/interrupt.h> | 42 | #include <linux/interrupt.h> |
44 | #include <linux/usb/sl811.h> | 43 | #include <linux/usb/sl811.h> |
@@ -307,16 +306,16 @@ static struct platform_device net2272_bfin_device = { | |||
307 | || defined(CONFIG_MTD_M25P80_MODULE) | 306 | || defined(CONFIG_MTD_M25P80_MODULE) |
308 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 307 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
309 | { | 308 | { |
310 | .name = "bootloader", | 309 | .name = "bootloader(spi)", |
311 | .size = 0x00020000, | 310 | .size = 0x00020000, |
312 | .offset = 0, | 311 | .offset = 0, |
313 | .mask_flags = MTD_CAP_ROM | 312 | .mask_flags = MTD_CAP_ROM |
314 | }, { | 313 | }, { |
315 | .name = "kernel", | 314 | .name = "linux kernel(spi)", |
316 | .size = 0xe0000, | 315 | .size = 0xe0000, |
317 | .offset = 0x20000 | 316 | .offset = 0x20000 |
318 | }, { | 317 | }, { |
319 | .name = "file system", | 318 | .name = "file system(spi)", |
320 | .size = 0x700000, | 319 | .size = 0x700000, |
321 | .offset = 0x00100000, | 320 | .offset = 0x00100000, |
322 | } | 321 | } |
@@ -619,43 +618,6 @@ static struct platform_device bfin_sport1_uart_device = { | |||
619 | }; | 618 | }; |
620 | #endif | 619 | #endif |
621 | 620 | ||
622 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
623 | #define PATA_INT 55 | ||
624 | |||
625 | static struct pata_platform_info bfin_pata_platform_data = { | ||
626 | .ioport_shift = 1, | ||
627 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
628 | }; | ||
629 | |||
630 | static struct resource bfin_pata_resources[] = { | ||
631 | { | ||
632 | .start = 0x20314020, | ||
633 | .end = 0x2031403F, | ||
634 | .flags = IORESOURCE_MEM, | ||
635 | }, | ||
636 | { | ||
637 | .start = 0x2031401C, | ||
638 | .end = 0x2031401F, | ||
639 | .flags = IORESOURCE_MEM, | ||
640 | }, | ||
641 | { | ||
642 | .start = PATA_INT, | ||
643 | .end = PATA_INT, | ||
644 | .flags = IORESOURCE_IRQ, | ||
645 | }, | ||
646 | }; | ||
647 | |||
648 | static struct platform_device bfin_pata_device = { | ||
649 | .name = "pata_platform", | ||
650 | .id = -1, | ||
651 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
652 | .resource = bfin_pata_resources, | ||
653 | .dev = { | ||
654 | .platform_data = &bfin_pata_platform_data, | ||
655 | } | ||
656 | }; | ||
657 | #endif | ||
658 | |||
659 | static struct platform_device *stamp_devices[] __initdata = { | 621 | static struct platform_device *stamp_devices[] __initdata = { |
660 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) | 622 | #if defined(CONFIG_BFIN_CFPCMCIA) || defined(CONFIG_BFIN_CFPCMCIA_MODULE) |
661 | &bfin_pcmcia_cf_device, | 623 | &bfin_pcmcia_cf_device, |
@@ -717,10 +679,6 @@ static struct platform_device *stamp_devices[] __initdata = { | |||
717 | &bfin_sport0_uart_device, | 679 | &bfin_sport0_uart_device, |
718 | &bfin_sport1_uart_device, | 680 | &bfin_sport1_uart_device, |
719 | #endif | 681 | #endif |
720 | |||
721 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
722 | &bfin_pata_device, | ||
723 | #endif | ||
724 | }; | 682 | }; |
725 | 683 | ||
726 | static int __init stamp_init(void) | 684 | static int __init stamp_init(void) |
@@ -732,9 +690,6 @@ static int __init stamp_init(void) | |||
732 | ARRAY_SIZE(bfin_spi_board_info)); | 690 | ARRAY_SIZE(bfin_spi_board_info)); |
733 | #endif | 691 | #endif |
734 | 692 | ||
735 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
736 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
737 | #endif | ||
738 | return 0; | 693 | return 0; |
739 | } | 694 | } |
740 | 695 | ||
diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c index 18ddf7a52005..48c4cd2d1be6 100644 --- a/arch/blackfin/mach-bf537/boards/minotaur.c +++ b/arch/blackfin/mach-bf537/boards/minotaur.c | |||
@@ -100,16 +100,16 @@ static struct platform_device net2272_bfin_device = { | |||
100 | 100 | ||
101 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 101 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
102 | { | 102 | { |
103 | .name = "uboot", | 103 | .name = "bootloader(spi)", |
104 | .size = PSIZE_UBOOT, | 104 | .size = PSIZE_UBOOT, |
105 | .offset = 0x000000, | 105 | .offset = 0x000000, |
106 | .mask_flags = MTD_CAP_ROM | 106 | .mask_flags = MTD_CAP_ROM |
107 | }, { | 107 | }, { |
108 | .name = "initramfs", | 108 | .name = "initramfs(spi)", |
109 | .size = PSIZE_INITRAMFS, | 109 | .size = PSIZE_INITRAMFS, |
110 | .offset = PSIZE_UBOOT | 110 | .offset = PSIZE_UBOOT |
111 | }, { | 111 | }, { |
112 | .name = "opt", | 112 | .name = "opt(spi)", |
113 | .size = FLASH_SIZE - (PSIZE_UBOOT + PSIZE_INITRAMFS), | 113 | .size = FLASH_SIZE - (PSIZE_UBOOT + PSIZE_INITRAMFS), |
114 | .offset = PSIZE_UBOOT + PSIZE_INITRAMFS, | 114 | .offset = PSIZE_UBOOT + PSIZE_INITRAMFS, |
115 | } | 115 | } |
diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c index 51c3bab14a69..f9174c11cbd4 100644 --- a/arch/blackfin/mach-bf537/boards/pnav10.c +++ b/arch/blackfin/mach-bf537/boards/pnav10.c | |||
@@ -231,16 +231,16 @@ static struct platform_device net2272_bfin_device = { | |||
231 | || defined(CONFIG_MTD_M25P80_MODULE) | 231 | || defined(CONFIG_MTD_M25P80_MODULE) |
232 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 232 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
233 | { | 233 | { |
234 | .name = "bootloader", | 234 | .name = "bootloader(spi)", |
235 | .size = 0x00020000, | 235 | .size = 0x00020000, |
236 | .offset = 0, | 236 | .offset = 0, |
237 | .mask_flags = MTD_CAP_ROM | 237 | .mask_flags = MTD_CAP_ROM |
238 | }, { | 238 | }, { |
239 | .name = "kernel", | 239 | .name = "linux kernel(spi)", |
240 | .size = 0xe0000, | 240 | .size = 0xe0000, |
241 | .offset = 0x20000 | 241 | .offset = 0x20000 |
242 | }, { | 242 | }, { |
243 | .name = "file system", | 243 | .name = "file system(spi)", |
244 | .size = 0x700000, | 244 | .size = 0x700000, |
245 | .offset = 0x00100000, | 245 | .offset = 0x00100000, |
246 | } | 246 | } |
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index 6dbc76fb080b..e93964fdb432 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
@@ -364,11 +364,11 @@ const char *part_probes[] = { "cmdlinepart", "RedBoot", NULL }; | |||
364 | 364 | ||
365 | static struct mtd_partition bfin_plat_nand_partitions[] = { | 365 | static struct mtd_partition bfin_plat_nand_partitions[] = { |
366 | { | 366 | { |
367 | .name = "linux kernel", | 367 | .name = "linux kernel(nand)", |
368 | .size = 0x400000, | 368 | .size = 0x400000, |
369 | .offset = 0, | 369 | .offset = 0, |
370 | }, { | 370 | }, { |
371 | .name = "file system", | 371 | .name = "file system(nand)", |
372 | .size = MTDPART_SIZ_FULL, | 372 | .size = MTDPART_SIZ_FULL, |
373 | .offset = MTDPART_OFS_APPEND, | 373 | .offset = MTDPART_OFS_APPEND, |
374 | }, | 374 | }, |
@@ -439,19 +439,19 @@ static void bfin_plat_nand_init(void) {} | |||
439 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 439 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
440 | static struct mtd_partition stamp_partitions[] = { | 440 | static struct mtd_partition stamp_partitions[] = { |
441 | { | 441 | { |
442 | .name = "Bootloader", | 442 | .name = "bootloader(nor)", |
443 | .size = 0x40000, | 443 | .size = 0x40000, |
444 | .offset = 0, | 444 | .offset = 0, |
445 | }, { | 445 | }, { |
446 | .name = "Kernel", | 446 | .name = "linux kernel(nor)", |
447 | .size = 0xE0000, | 447 | .size = 0xE0000, |
448 | .offset = MTDPART_OFS_APPEND, | 448 | .offset = MTDPART_OFS_APPEND, |
449 | }, { | 449 | }, { |
450 | .name = "RootFS", | 450 | .name = "file system(nor)", |
451 | .size = 0x400000 - 0x40000 - 0xE0000 - 0x10000, | 451 | .size = 0x400000 - 0x40000 - 0xE0000 - 0x10000, |
452 | .offset = MTDPART_OFS_APPEND, | 452 | .offset = MTDPART_OFS_APPEND, |
453 | }, { | 453 | }, { |
454 | .name = "MAC Address", | 454 | .name = "MAC Address(nor)", |
455 | .size = MTDPART_SIZ_FULL, | 455 | .size = MTDPART_SIZ_FULL, |
456 | .offset = 0x3F0000, | 456 | .offset = 0x3F0000, |
457 | .mask_flags = MTD_WRITEABLE, | 457 | .mask_flags = MTD_WRITEABLE, |
@@ -485,16 +485,16 @@ static struct platform_device stamp_flash_device = { | |||
485 | || defined(CONFIG_MTD_M25P80_MODULE) | 485 | || defined(CONFIG_MTD_M25P80_MODULE) |
486 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 486 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
487 | { | 487 | { |
488 | .name = "bootloader", | 488 | .name = "bootloader(spi)", |
489 | .size = 0x00040000, | 489 | .size = 0x00040000, |
490 | .offset = 0, | 490 | .offset = 0, |
491 | .mask_flags = MTD_CAP_ROM | 491 | .mask_flags = MTD_CAP_ROM |
492 | }, { | 492 | }, { |
493 | .name = "kernel", | 493 | .name = "linux kernel(spi)", |
494 | .size = 0xe0000, | 494 | .size = 0xe0000, |
495 | .offset = MTDPART_OFS_APPEND, | 495 | .offset = MTDPART_OFS_APPEND, |
496 | }, { | 496 | }, { |
497 | .name = "file system", | 497 | .name = "file system(spi)", |
498 | .size = MTDPART_SIZ_FULL, | 498 | .size = MTDPART_SIZ_FULL, |
499 | .offset = MTDPART_OFS_APPEND, | 499 | .offset = MTDPART_OFS_APPEND, |
500 | } | 500 | } |
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c new file mode 100644 index 000000000000..d5ff705a5129 --- /dev/null +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c | |||
@@ -0,0 +1,590 @@ | |||
1 | /* | ||
2 | * File: arch/blackfin/mach-bf537/boards/tcm_bf537.c | ||
3 | * Based on: arch/blackfin/mach-bf533/boards/cm_bf537.c | ||
4 | * Author: Aidan Williams <aidan@nicta.com.au> | ||
5 | * | ||
6 | * Created: 2005 | ||
7 | * Description: Board description file | ||
8 | * | ||
9 | * Modified: | ||
10 | * Copyright 2005 National ICT Australia (NICTA) | ||
11 | * Copyright 2004-2006 Analog Devices Inc. | ||
12 | * | ||
13 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, see the file COPYING, or write | ||
27 | * to the Free Software Foundation, Inc., | ||
28 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
29 | */ | ||
30 | |||
31 | #include <linux/device.h> | ||
32 | #include <linux/etherdevice.h> | ||
33 | #include <linux/platform_device.h> | ||
34 | #include <linux/mtd/mtd.h> | ||
35 | #include <linux/mtd/partitions.h> | ||
36 | #include <linux/mtd/physmap.h> | ||
37 | #include <linux/spi/spi.h> | ||
38 | #include <linux/spi/flash.h> | ||
39 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | ||
40 | #include <linux/usb/isp1362.h> | ||
41 | #endif | ||
42 | #include <linux/ata_platform.h> | ||
43 | #include <linux/irq.h> | ||
44 | #include <asm/dma.h> | ||
45 | #include <asm/bfin5xx_spi.h> | ||
46 | #include <asm/portmux.h> | ||
47 | #include <asm/dpmc.h> | ||
48 | |||
49 | /* | ||
50 | * Name the Board for the /proc/cpuinfo | ||
51 | */ | ||
52 | const char bfin_board_name[] = "Bluetechnix TCM BF537"; | ||
53 | |||
54 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
55 | /* all SPI peripherals info goes here */ | ||
56 | |||
57 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
58 | static struct mtd_partition bfin_spi_flash_partitions[] = { | ||
59 | { | ||
60 | .name = "bootloader(spi)", | ||
61 | .size = 0x00020000, | ||
62 | .offset = 0, | ||
63 | .mask_flags = MTD_CAP_ROM | ||
64 | }, { | ||
65 | .name = "linux kernel(spi)", | ||
66 | .size = 0xe0000, | ||
67 | .offset = 0x20000 | ||
68 | }, { | ||
69 | .name = "file system(spi)", | ||
70 | .size = 0x700000, | ||
71 | .offset = 0x00100000, | ||
72 | } | ||
73 | }; | ||
74 | |||
75 | static struct flash_platform_data bfin_spi_flash_data = { | ||
76 | .name = "m25p80", | ||
77 | .parts = bfin_spi_flash_partitions, | ||
78 | .nr_parts = ARRAY_SIZE(bfin_spi_flash_partitions), | ||
79 | .type = "m25p64", | ||
80 | }; | ||
81 | |||
82 | /* SPI flash chip (m25p64) */ | ||
83 | static struct bfin5xx_spi_chip spi_flash_chip_info = { | ||
84 | .enable_dma = 0, /* use dma transfer with this chip*/ | ||
85 | .bits_per_word = 8, | ||
86 | }; | ||
87 | #endif | ||
88 | |||
89 | #if defined(CONFIG_SPI_ADC_BF533) || defined(CONFIG_SPI_ADC_BF533_MODULE) | ||
90 | /* SPI ADC chip */ | ||
91 | static struct bfin5xx_spi_chip spi_adc_chip_info = { | ||
92 | .enable_dma = 1, /* use dma transfer with this chip*/ | ||
93 | .bits_per_word = 16, | ||
94 | }; | ||
95 | #endif | ||
96 | |||
97 | #if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE) | ||
98 | static struct bfin5xx_spi_chip ad1836_spi_chip_info = { | ||
99 | .enable_dma = 0, | ||
100 | .bits_per_word = 16, | ||
101 | }; | ||
102 | #endif | ||
103 | |||
104 | #if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE) | ||
105 | static struct bfin5xx_spi_chip ad9960_spi_chip_info = { | ||
106 | .enable_dma = 0, | ||
107 | .bits_per_word = 16, | ||
108 | }; | ||
109 | #endif | ||
110 | |||
111 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
112 | static struct bfin5xx_spi_chip spi_mmc_chip_info = { | ||
113 | .enable_dma = 1, | ||
114 | .bits_per_word = 8, | ||
115 | }; | ||
116 | #endif | ||
117 | |||
118 | static struct spi_board_info bfin_spi_board_info[] __initdata = { | ||
119 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | ||
120 | { | ||
121 | /* the modalias must be the same as spi device driver name */ | ||
122 | .modalias = "m25p80", /* Name of spi_driver for this device */ | ||
123 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | ||
124 | .bus_num = 0, /* Framework bus number */ | ||
125 | .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/ | ||
126 | .platform_data = &bfin_spi_flash_data, | ||
127 | .controller_data = &spi_flash_chip_info, | ||
128 | .mode = SPI_MODE_3, | ||
129 | }, | ||
130 | #endif | ||
131 | |||
132 | #if defined(CONFIG_SPI_ADC_BF533) || defined(CONFIG_SPI_ADC_BF533_MODULE) | ||
133 | { | ||
134 | .modalias = "bfin_spi_adc", /* Name of spi_driver for this device */ | ||
135 | .max_speed_hz = 6250000, /* max spi clock (SCK) speed in HZ */ | ||
136 | .bus_num = 0, /* Framework bus number */ | ||
137 | .chip_select = 1, /* Framework chip select. */ | ||
138 | .platform_data = NULL, /* No spi_driver specific config */ | ||
139 | .controller_data = &spi_adc_chip_info, | ||
140 | }, | ||
141 | #endif | ||
142 | |||
143 | #if defined(CONFIG_SND_BLACKFIN_AD1836) || defined(CONFIG_SND_BLACKFIN_AD1836_MODULE) | ||
144 | { | ||
145 | .modalias = "ad1836-spi", | ||
146 | .max_speed_hz = 3125000, /* max spi clock (SCK) speed in HZ */ | ||
147 | .bus_num = 0, | ||
148 | .chip_select = CONFIG_SND_BLACKFIN_SPI_PFBIT, | ||
149 | .controller_data = &ad1836_spi_chip_info, | ||
150 | }, | ||
151 | #endif | ||
152 | |||
153 | #if defined(CONFIG_AD9960) || defined(CONFIG_AD9960_MODULE) | ||
154 | { | ||
155 | .modalias = "ad9960-spi", | ||
156 | .max_speed_hz = 10000000, /* max spi clock (SCK) speed in HZ */ | ||
157 | .bus_num = 0, | ||
158 | .chip_select = 1, | ||
159 | .controller_data = &ad9960_spi_chip_info, | ||
160 | }, | ||
161 | #endif | ||
162 | |||
163 | #if defined(CONFIG_SPI_MMC) || defined(CONFIG_SPI_MMC_MODULE) | ||
164 | { | ||
165 | .modalias = "spi_mmc_dummy", | ||
166 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | ||
167 | .bus_num = 0, | ||
168 | .chip_select = 7, | ||
169 | .platform_data = NULL, | ||
170 | .controller_data = &spi_mmc_chip_info, | ||
171 | .mode = SPI_MODE_3, | ||
172 | }, | ||
173 | { | ||
174 | .modalias = "spi_mmc", | ||
175 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | ||
176 | .bus_num = 0, | ||
177 | .chip_select = CONFIG_SPI_MMC_CS_CHAN, | ||
178 | .platform_data = NULL, | ||
179 | .controller_data = &spi_mmc_chip_info, | ||
180 | .mode = SPI_MODE_3, | ||
181 | }, | ||
182 | #endif | ||
183 | }; | ||
184 | |||
185 | /* SPI (0) */ | ||
186 | static struct resource bfin_spi0_resource[] = { | ||
187 | [0] = { | ||
188 | .start = SPI0_REGBASE, | ||
189 | .end = SPI0_REGBASE + 0xFF, | ||
190 | .flags = IORESOURCE_MEM, | ||
191 | }, | ||
192 | [1] = { | ||
193 | .start = CH_SPI, | ||
194 | .end = CH_SPI, | ||
195 | .flags = IORESOURCE_IRQ, | ||
196 | } | ||
197 | }; | ||
198 | |||
199 | /* SPI controller data */ | ||
200 | static struct bfin5xx_spi_master bfin_spi0_info = { | ||
201 | .num_chipselect = 8, | ||
202 | .enable_dma = 1, /* master has the ability to do dma transfer */ | ||
203 | .pin_req = {P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0}, | ||
204 | }; | ||
205 | |||
206 | static struct platform_device bfin_spi0_device = { | ||
207 | .name = "bfin-spi", | ||
208 | .id = 0, /* Bus number */ | ||
209 | .num_resources = ARRAY_SIZE(bfin_spi0_resource), | ||
210 | .resource = bfin_spi0_resource, | ||
211 | .dev = { | ||
212 | .platform_data = &bfin_spi0_info, /* Passed to driver */ | ||
213 | }, | ||
214 | }; | ||
215 | #endif /* spi master and devices */ | ||
216 | |||
217 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
218 | static struct platform_device rtc_device = { | ||
219 | .name = "rtc-bfin", | ||
220 | .id = -1, | ||
221 | }; | ||
222 | #endif | ||
223 | |||
224 | #if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE) | ||
225 | static struct platform_device hitachi_fb_device = { | ||
226 | .name = "hitachi-tx09", | ||
227 | }; | ||
228 | #endif | ||
229 | |||
230 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
231 | static struct resource smc91x_resources[] = { | ||
232 | { | ||
233 | .start = 0x20200300, | ||
234 | .end = 0x20200300 + 16, | ||
235 | .flags = IORESOURCE_MEM, | ||
236 | }, { | ||
237 | .start = IRQ_PF14, | ||
238 | .end = IRQ_PF14, | ||
239 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
240 | }, | ||
241 | }; | ||
242 | |||
243 | static struct platform_device smc91x_device = { | ||
244 | .name = "smc91x", | ||
245 | .id = 0, | ||
246 | .num_resources = ARRAY_SIZE(smc91x_resources), | ||
247 | .resource = smc91x_resources, | ||
248 | }; | ||
249 | #endif | ||
250 | |||
251 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | ||
252 | static struct resource isp1362_hcd_resources[] = { | ||
253 | { | ||
254 | .start = 0x20308000, | ||
255 | .end = 0x20308000, | ||
256 | .flags = IORESOURCE_MEM, | ||
257 | }, { | ||
258 | .start = 0x20308004, | ||
259 | .end = 0x20308004, | ||
260 | .flags = IORESOURCE_MEM, | ||
261 | }, { | ||
262 | .start = IRQ_PG15, | ||
263 | .end = IRQ_PG15, | ||
264 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
265 | }, | ||
266 | }; | ||
267 | |||
268 | static struct isp1362_platform_data isp1362_priv = { | ||
269 | .sel15Kres = 1, | ||
270 | .clknotstop = 0, | ||
271 | .oc_enable = 0, | ||
272 | .int_act_high = 0, | ||
273 | .int_edge_triggered = 0, | ||
274 | .remote_wakeup_connected = 0, | ||
275 | .no_power_switching = 1, | ||
276 | .power_switching_mode = 0, | ||
277 | }; | ||
278 | |||
279 | static struct platform_device isp1362_hcd_device = { | ||
280 | .name = "isp1362-hcd", | ||
281 | .id = 0, | ||
282 | .dev = { | ||
283 | .platform_data = &isp1362_priv, | ||
284 | }, | ||
285 | .num_resources = ARRAY_SIZE(isp1362_hcd_resources), | ||
286 | .resource = isp1362_hcd_resources, | ||
287 | }; | ||
288 | #endif | ||
289 | |||
290 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) | ||
291 | static struct resource net2272_bfin_resources[] = { | ||
292 | { | ||
293 | .start = 0x20200000, | ||
294 | .end = 0x20200000 + 0x100, | ||
295 | .flags = IORESOURCE_MEM, | ||
296 | }, { | ||
297 | .start = IRQ_PH14, | ||
298 | .end = IRQ_PH14, | ||
299 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL, | ||
300 | }, | ||
301 | }; | ||
302 | |||
303 | static struct platform_device net2272_bfin_device = { | ||
304 | .name = "net2272", | ||
305 | .id = -1, | ||
306 | .num_resources = ARRAY_SIZE(net2272_bfin_resources), | ||
307 | .resource = net2272_bfin_resources, | ||
308 | }; | ||
309 | #endif | ||
310 | |||
311 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
312 | static struct mtd_partition cm_partitions[] = { | ||
313 | { | ||
314 | .name = "bootloader(nor)", | ||
315 | .size = 0x40000, | ||
316 | .offset = 0, | ||
317 | }, { | ||
318 | .name = "linux kernel(nor)", | ||
319 | .size = 0xE0000, | ||
320 | .offset = MTDPART_OFS_APPEND, | ||
321 | }, { | ||
322 | .name = "file system(nor)", | ||
323 | .size = MTDPART_SIZ_FULL, | ||
324 | .offset = MTDPART_OFS_APPEND, | ||
325 | } | ||
326 | }; | ||
327 | |||
328 | static struct physmap_flash_data cm_flash_data = { | ||
329 | .width = 2, | ||
330 | .parts = cm_partitions, | ||
331 | .nr_parts = ARRAY_SIZE(cm_partitions), | ||
332 | }; | ||
333 | |||
334 | static unsigned cm_flash_gpios[] = { GPIO_PF4, GPIO_PF5 }; | ||
335 | |||
336 | static struct resource cm_flash_resource[] = { | ||
337 | { | ||
338 | .name = "cfi_probe", | ||
339 | .start = 0x20000000, | ||
340 | .end = 0x201fffff, | ||
341 | .flags = IORESOURCE_MEM, | ||
342 | }, { | ||
343 | .start = (unsigned long)cm_flash_gpios, | ||
344 | .end = ARRAY_SIZE(cm_flash_gpios), | ||
345 | .flags = IORESOURCE_IRQ, | ||
346 | } | ||
347 | }; | ||
348 | |||
349 | static struct platform_device cm_flash_device = { | ||
350 | .name = "gpio-addr-flash", | ||
351 | .id = 0, | ||
352 | .dev = { | ||
353 | .platform_data = &cm_flash_data, | ||
354 | }, | ||
355 | .num_resources = ARRAY_SIZE(cm_flash_resource), | ||
356 | .resource = cm_flash_resource, | ||
357 | }; | ||
358 | #endif | ||
359 | |||
360 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
361 | static struct resource bfin_uart_resources[] = { | ||
362 | { | ||
363 | .start = 0xFFC00400, | ||
364 | .end = 0xFFC004FF, | ||
365 | .flags = IORESOURCE_MEM, | ||
366 | }, { | ||
367 | .start = 0xFFC02000, | ||
368 | .end = 0xFFC020FF, | ||
369 | .flags = IORESOURCE_MEM, | ||
370 | }, | ||
371 | }; | ||
372 | |||
373 | static struct platform_device bfin_uart_device = { | ||
374 | .name = "bfin-uart", | ||
375 | .id = 1, | ||
376 | .num_resources = ARRAY_SIZE(bfin_uart_resources), | ||
377 | .resource = bfin_uart_resources, | ||
378 | }; | ||
379 | #endif | ||
380 | |||
381 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
382 | static struct resource bfin_sir_resources[] = { | ||
383 | #ifdef CONFIG_BFIN_SIR0 | ||
384 | { | ||
385 | .start = 0xFFC00400, | ||
386 | .end = 0xFFC004FF, | ||
387 | .flags = IORESOURCE_MEM, | ||
388 | }, | ||
389 | #endif | ||
390 | #ifdef CONFIG_BFIN_SIR1 | ||
391 | { | ||
392 | .start = 0xFFC02000, | ||
393 | .end = 0xFFC020FF, | ||
394 | .flags = IORESOURCE_MEM, | ||
395 | }, | ||
396 | #endif | ||
397 | }; | ||
398 | |||
399 | static struct platform_device bfin_sir_device = { | ||
400 | .name = "bfin_sir", | ||
401 | .id = 0, | ||
402 | .num_resources = ARRAY_SIZE(bfin_sir_resources), | ||
403 | .resource = bfin_sir_resources, | ||
404 | }; | ||
405 | #endif | ||
406 | |||
407 | #if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE) | ||
408 | static struct resource bfin_twi0_resource[] = { | ||
409 | [0] = { | ||
410 | .start = TWI0_REGBASE, | ||
411 | .end = TWI0_REGBASE, | ||
412 | .flags = IORESOURCE_MEM, | ||
413 | }, | ||
414 | [1] = { | ||
415 | .start = IRQ_TWI, | ||
416 | .end = IRQ_TWI, | ||
417 | .flags = IORESOURCE_IRQ, | ||
418 | }, | ||
419 | }; | ||
420 | |||
421 | static struct platform_device i2c_bfin_twi_device = { | ||
422 | .name = "i2c-bfin-twi", | ||
423 | .id = 0, | ||
424 | .num_resources = ARRAY_SIZE(bfin_twi0_resource), | ||
425 | .resource = bfin_twi0_resource, | ||
426 | }; | ||
427 | #endif | ||
428 | |||
429 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
430 | static struct platform_device bfin_sport0_uart_device = { | ||
431 | .name = "bfin-sport-uart", | ||
432 | .id = 0, | ||
433 | }; | ||
434 | |||
435 | static struct platform_device bfin_sport1_uart_device = { | ||
436 | .name = "bfin-sport-uart", | ||
437 | .id = 1, | ||
438 | }; | ||
439 | #endif | ||
440 | |||
441 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | ||
442 | static struct platform_device bfin_mac_device = { | ||
443 | .name = "bfin_mac", | ||
444 | }; | ||
445 | #endif | ||
446 | |||
447 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
448 | #define PATA_INT IRQ_PF14 | ||
449 | |||
450 | static struct pata_platform_info bfin_pata_platform_data = { | ||
451 | .ioport_shift = 2, | ||
452 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
453 | }; | ||
454 | |||
455 | static struct resource bfin_pata_resources[] = { | ||
456 | { | ||
457 | .start = 0x2030C000, | ||
458 | .end = 0x2030C01F, | ||
459 | .flags = IORESOURCE_MEM, | ||
460 | }, | ||
461 | { | ||
462 | .start = 0x2030D018, | ||
463 | .end = 0x2030D01B, | ||
464 | .flags = IORESOURCE_MEM, | ||
465 | }, | ||
466 | { | ||
467 | .start = PATA_INT, | ||
468 | .end = PATA_INT, | ||
469 | .flags = IORESOURCE_IRQ, | ||
470 | }, | ||
471 | }; | ||
472 | |||
473 | static struct platform_device bfin_pata_device = { | ||
474 | .name = "pata_platform", | ||
475 | .id = -1, | ||
476 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
477 | .resource = bfin_pata_resources, | ||
478 | .dev = { | ||
479 | .platform_data = &bfin_pata_platform_data, | ||
480 | } | ||
481 | }; | ||
482 | #endif | ||
483 | |||
484 | static const unsigned int cclk_vlev_datasheet[] = | ||
485 | { | ||
486 | VRPAIR(VLEV_085, 250000000), | ||
487 | VRPAIR(VLEV_090, 376000000), | ||
488 | VRPAIR(VLEV_095, 426000000), | ||
489 | VRPAIR(VLEV_100, 426000000), | ||
490 | VRPAIR(VLEV_105, 476000000), | ||
491 | VRPAIR(VLEV_110, 476000000), | ||
492 | VRPAIR(VLEV_115, 476000000), | ||
493 | VRPAIR(VLEV_120, 500000000), | ||
494 | VRPAIR(VLEV_125, 533000000), | ||
495 | VRPAIR(VLEV_130, 600000000), | ||
496 | }; | ||
497 | |||
498 | static struct bfin_dpmc_platform_data bfin_dmpc_vreg_data = { | ||
499 | .tuple_tab = cclk_vlev_datasheet, | ||
500 | .tabsize = ARRAY_SIZE(cclk_vlev_datasheet), | ||
501 | .vr_settling_time = 25 /* us */, | ||
502 | }; | ||
503 | |||
504 | static struct platform_device bfin_dpmc = { | ||
505 | .name = "bfin dpmc", | ||
506 | .dev = { | ||
507 | .platform_data = &bfin_dmpc_vreg_data, | ||
508 | }, | ||
509 | }; | ||
510 | |||
511 | static struct platform_device *cm_bf537_devices[] __initdata = { | ||
512 | |||
513 | &bfin_dpmc, | ||
514 | |||
515 | #if defined(CONFIG_FB_HITACHI_TX09) || defined(CONFIG_FB_HITACHI_TX09_MODULE) | ||
516 | &hitachi_fb_device, | ||
517 | #endif | ||
518 | |||
519 | #if defined(CONFIG_RTC_DRV_BFIN) || defined(CONFIG_RTC_DRV_BFIN_MODULE) | ||
520 | &rtc_device, | ||
521 | #endif | ||
522 | |||
523 | #if defined(CONFIG_SERIAL_BFIN) || defined(CONFIG_SERIAL_BFIN_MODULE) | ||
524 | &bfin_uart_device, | ||
525 | #endif | ||
526 | |||
527 | #if defined(CONFIG_BFIN_SIR) || defined(CONFIG_BFIN_SIR_MODULE) | ||
528 | &bfin_sir_device, | ||
529 | #endif | ||
530 | |||
531 | #if defined(CONFIG_I2C_BLACKFIN_TWI) || defined(CONFIG_I2C_BLACKFIN_TWI_MODULE) | ||
532 | &i2c_bfin_twi_device, | ||
533 | #endif | ||
534 | |||
535 | #if defined(CONFIG_SERIAL_BFIN_SPORT) || defined(CONFIG_SERIAL_BFIN_SPORT_MODULE) | ||
536 | &bfin_sport0_uart_device, | ||
537 | &bfin_sport1_uart_device, | ||
538 | #endif | ||
539 | |||
540 | #if defined(CONFIG_USB_ISP1362_HCD) || defined(CONFIG_USB_ISP1362_HCD_MODULE) | ||
541 | &isp1362_hcd_device, | ||
542 | #endif | ||
543 | |||
544 | #if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) | ||
545 | &smc91x_device, | ||
546 | #endif | ||
547 | |||
548 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | ||
549 | &bfin_mac_device, | ||
550 | #endif | ||
551 | |||
552 | #if defined(CONFIG_USB_NET2272) || defined(CONFIG_USB_NET2272_MODULE) | ||
553 | &net2272_bfin_device, | ||
554 | #endif | ||
555 | |||
556 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
557 | &bfin_spi0_device, | ||
558 | #endif | ||
559 | |||
560 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
561 | &bfin_pata_device, | ||
562 | #endif | ||
563 | |||
564 | #if defined(CONFIG_MTD_GPIO_ADDR) || defined(CONFIG_MTD_GPIO_ADDR_MODULE) | ||
565 | &cm_flash_device, | ||
566 | #endif | ||
567 | }; | ||
568 | |||
569 | static int __init cm_bf537_init(void) | ||
570 | { | ||
571 | printk(KERN_INFO "%s(): registering device resources\n", __func__); | ||
572 | platform_add_devices(cm_bf537_devices, ARRAY_SIZE(cm_bf537_devices)); | ||
573 | #if defined(CONFIG_SPI_BFIN) || defined(CONFIG_SPI_BFIN_MODULE) | ||
574 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | ||
575 | #endif | ||
576 | |||
577 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
578 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
579 | #endif | ||
580 | return 0; | ||
581 | } | ||
582 | |||
583 | arch_initcall(cm_bf537_init); | ||
584 | |||
585 | void bfin_get_ether_addr(char *addr) | ||
586 | { | ||
587 | random_ether_addr(addr); | ||
588 | printk(KERN_WARNING "%s:%s: Setting Ethernet MAC to a random one\n", __FILE__, __func__); | ||
589 | } | ||
590 | EXPORT_SYMBOL(bfin_get_ether_addr); | ||
diff --git a/arch/blackfin/mach-bf537/head.S b/arch/blackfin/mach-bf537/head.S index 6b019eaee0b6..64e0287ab266 100644 --- a/arch/blackfin/mach-bf537/head.S +++ b/arch/blackfin/mach-bf537/head.S | |||
@@ -30,325 +30,11 @@ | |||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | #include <asm/trace.h> | ||
34 | |||
35 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
36 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
37 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
38 | #endif | 36 | #endif |
39 | 37 | ||
40 | .extern ___bss_stop | ||
41 | .extern ___bss_start | ||
42 | .extern _bf53x_relocate_l1_mem | ||
43 | |||
44 | #define INITIAL_STACK 0xFFB01000 | ||
45 | |||
46 | __INIT | ||
47 | |||
48 | ENTRY(__start) | ||
49 | /* R0: argument of command line string, passed from uboot, save it */ | ||
50 | R7 = R0; | ||
51 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
52 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
53 | R0 = SYSCFG_SNEN; | ||
54 | #else | ||
55 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
56 | #endif | ||
57 | SYSCFG = R0; | ||
58 | R0 = 0; | ||
59 | |||
60 | /* Clear Out All the data and pointer Registers */ | ||
61 | R1 = R0; | ||
62 | R2 = R0; | ||
63 | R3 = R0; | ||
64 | R4 = R0; | ||
65 | R5 = R0; | ||
66 | R6 = R0; | ||
67 | |||
68 | P0 = R0; | ||
69 | P1 = R0; | ||
70 | P2 = R0; | ||
71 | P3 = R0; | ||
72 | P4 = R0; | ||
73 | P5 = R0; | ||
74 | |||
75 | LC0 = r0; | ||
76 | LC1 = r0; | ||
77 | L0 = r0; | ||
78 | L1 = r0; | ||
79 | L2 = r0; | ||
80 | L3 = r0; | ||
81 | |||
82 | /* Clear Out All the DAG Registers */ | ||
83 | B0 = r0; | ||
84 | B1 = r0; | ||
85 | B2 = r0; | ||
86 | B3 = r0; | ||
87 | |||
88 | I0 = r0; | ||
89 | I1 = r0; | ||
90 | I2 = r0; | ||
91 | I3 = r0; | ||
92 | |||
93 | M0 = r0; | ||
94 | M1 = r0; | ||
95 | M2 = r0; | ||
96 | M3 = r0; | ||
97 | |||
98 | trace_buffer_init(p0,r0); | ||
99 | P0 = R1; | ||
100 | R0 = R1; | ||
101 | |||
102 | /* Turn off the icache */ | ||
103 | p0.l = LO(IMEM_CONTROL); | ||
104 | p0.h = HI(IMEM_CONTROL); | ||
105 | R1 = [p0]; | ||
106 | R0 = ~ENICPLB; | ||
107 | R0 = R0 & R1; | ||
108 | |||
109 | /* Anomaly 05000125 */ | ||
110 | #if ANOMALY_05000125 | ||
111 | CLI R2; | ||
112 | SSYNC; | ||
113 | #endif | ||
114 | [p0] = R0; | ||
115 | SSYNC; | ||
116 | #if ANOMALY_05000125 | ||
117 | STI R2; | ||
118 | #endif | ||
119 | |||
120 | /* Turn off the dcache */ | ||
121 | p0.l = LO(DMEM_CONTROL); | ||
122 | p0.h = HI(DMEM_CONTROL); | ||
123 | R1 = [p0]; | ||
124 | R0 = ~ENDCPLB; | ||
125 | R0 = R0 & R1; | ||
126 | |||
127 | /* Anomaly 05000125 */ | ||
128 | #if ANOMALY_05000125 | ||
129 | CLI R2; | ||
130 | SSYNC; | ||
131 | #endif | ||
132 | [p0] = R0; | ||
133 | SSYNC; | ||
134 | #if ANOMALY_05000125 | ||
135 | STI R2; | ||
136 | #endif | ||
137 | |||
138 | /* Initialise General-Purpose I/O Modules on BF537 */ | ||
139 | /* Rev 0.0 Anomaly 05000212 - PORTx_FER, | ||
140 | * PORT_MUX Registers Do Not accept "writes" correctly: | ||
141 | */ | ||
142 | p0.h = hi(BFIN_PORT_MUX); | ||
143 | p0.l = lo(BFIN_PORT_MUX); | ||
144 | #if ANOMALY_05000212 | ||
145 | R0.L = W[P0]; /* Read */ | ||
146 | SSYNC; | ||
147 | #endif | ||
148 | R0 = (PGDE_UART | PFTE_UART)(Z); | ||
149 | #if ANOMALY_05000212 | ||
150 | W[P0] = R0.L; /* Write */ | ||
151 | SSYNC; | ||
152 | #endif | ||
153 | W[P0] = R0.L; /* Enable both UARTS */ | ||
154 | SSYNC; | ||
155 | |||
156 | p0.h = hi(PORTF_FER); | ||
157 | p0.l = lo(PORTF_FER); | ||
158 | #if ANOMALY_05000212 | ||
159 | R0.L = W[P0]; /* Read */ | ||
160 | SSYNC; | ||
161 | #endif | ||
162 | R0 = 0x000F(Z); | ||
163 | #if ANOMALY_05000212 | ||
164 | W[P0] = R0.L; /* Write */ | ||
165 | SSYNC; | ||
166 | #endif | ||
167 | /* Enable peripheral function of PORTF for UART0 and UART1 */ | ||
168 | W[P0] = R0.L; | ||
169 | SSYNC; | ||
170 | |||
171 | #if !defined(CONFIG_BF534) | ||
172 | p0.h = hi(EMAC_SYSTAT); | ||
173 | p0.l = lo(EMAC_SYSTAT); | ||
174 | R0.h = 0xFFFF; /* Clear EMAC Interrupt Status bits */ | ||
175 | R0.l = 0xFFFF; | ||
176 | [P0] = R0; | ||
177 | SSYNC; | ||
178 | #endif | ||
179 | |||
180 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
181 | * so if we dont initalize here, our serial console gets hosed */ | ||
182 | p0.h = hi(BFIN_UART_LCR); | ||
183 | p0.l = lo(BFIN_UART_LCR); | ||
184 | r0 = 0x0(Z); | ||
185 | w[p0] = r0.L; /* To enable DLL writes */ | ||
186 | ssync; | ||
187 | |||
188 | p0.h = hi(BFIN_UART_DLL); | ||
189 | p0.l = lo(BFIN_UART_DLL); | ||
190 | r0 = 0x0(Z); | ||
191 | w[p0] = r0.L; | ||
192 | ssync; | ||
193 | |||
194 | p0.h = hi(BFIN_UART_DLH); | ||
195 | p0.l = lo(BFIN_UART_DLH); | ||
196 | r0 = 0x00(Z); | ||
197 | w[p0] = r0.L; | ||
198 | ssync; | ||
199 | |||
200 | p0.h = hi(BFIN_UART_GCTL); | ||
201 | p0.l = lo(BFIN_UART_GCTL); | ||
202 | r0 = 0x0(Z); | ||
203 | w[p0] = r0.L; /* To enable UART clock */ | ||
204 | ssync; | ||
205 | |||
206 | /* Initialize stack pointer */ | ||
207 | sp.l = lo(INITIAL_STACK); | ||
208 | sp.h = hi(INITIAL_STACK); | ||
209 | fp = sp; | ||
210 | usp = sp; | ||
211 | |||
212 | #ifdef CONFIG_EARLY_PRINTK | ||
213 | SP += -12; | ||
214 | call _init_early_exception_vectors; | ||
215 | SP += 12; | ||
216 | #endif | ||
217 | |||
218 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
219 | call _bf53x_relocate_l1_mem; | ||
220 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
221 | call _start_dma_code; | ||
222 | #endif | ||
223 | |||
224 | /* Code for initializing Async memory banks */ | ||
225 | |||
226 | p2.h = hi(EBIU_AMBCTL1); | ||
227 | p2.l = lo(EBIU_AMBCTL1); | ||
228 | r0.h = hi(AMBCTL1VAL); | ||
229 | r0.l = lo(AMBCTL1VAL); | ||
230 | [p2] = r0; | ||
231 | ssync; | ||
232 | |||
233 | p2.h = hi(EBIU_AMBCTL0); | ||
234 | p2.l = lo(EBIU_AMBCTL0); | ||
235 | r0.h = hi(AMBCTL0VAL); | ||
236 | r0.l = lo(AMBCTL0VAL); | ||
237 | [p2] = r0; | ||
238 | ssync; | ||
239 | |||
240 | p2.h = hi(EBIU_AMGCTL); | ||
241 | p2.l = lo(EBIU_AMGCTL); | ||
242 | r0 = AMGCTLVAL; | ||
243 | w[p2] = r0; | ||
244 | ssync; | ||
245 | |||
246 | /* This section keeps the processor in supervisor mode | ||
247 | * during kernel boot. Switches to user mode at end of boot. | ||
248 | * See page 3-9 of Hardware Reference manual for documentation. | ||
249 | */ | ||
250 | |||
251 | /* EVT15 = _real_start */ | ||
252 | |||
253 | p0.l = lo(EVT15); | ||
254 | p0.h = hi(EVT15); | ||
255 | p1.l = _real_start; | ||
256 | p1.h = _real_start; | ||
257 | [p0] = p1; | ||
258 | csync; | ||
259 | |||
260 | p0.l = lo(IMASK); | ||
261 | p0.h = hi(IMASK); | ||
262 | p1.l = IMASK_IVG15; | ||
263 | p1.h = 0x0; | ||
264 | [p0] = p1; | ||
265 | csync; | ||
266 | |||
267 | raise 15; | ||
268 | p0.l = .LWAIT_HERE; | ||
269 | p0.h = .LWAIT_HERE; | ||
270 | reti = p0; | ||
271 | #if ANOMALY_05000281 | ||
272 | nop; nop; nop; | ||
273 | #endif | ||
274 | rti; | ||
275 | |||
276 | .LWAIT_HERE: | ||
277 | jump .LWAIT_HERE; | ||
278 | ENDPROC(__start) | ||
279 | |||
280 | ENTRY(_real_start) | ||
281 | [ -- sp ] = reti; | ||
282 | p0.l = lo(WDOG_CTL); | ||
283 | p0.h = hi(WDOG_CTL); | ||
284 | r0 = 0xAD6(z); | ||
285 | w[p0] = r0; /* watchdog off for now */ | ||
286 | ssync; | ||
287 | |||
288 | /* Code update for BSS size == 0 | ||
289 | * Zero out the bss region. | ||
290 | */ | ||
291 | |||
292 | p1.l = ___bss_start; | ||
293 | p1.h = ___bss_start; | ||
294 | p2.l = ___bss_stop; | ||
295 | p2.h = ___bss_stop; | ||
296 | r0 = 0; | ||
297 | p2 -= p1; | ||
298 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
299 | .L_clear_bss: | ||
300 | B[p1++] = r0; | ||
301 | |||
302 | /* In case there is a NULL pointer reference | ||
303 | * Zero out region before stext | ||
304 | */ | ||
305 | |||
306 | p1.l = 0x0; | ||
307 | p1.h = 0x0; | ||
308 | r0.l = __stext; | ||
309 | r0.h = __stext; | ||
310 | r0 = r0 >> 1; | ||
311 | p2 = r0; | ||
312 | r0 = 0; | ||
313 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
314 | .L_clear_zero: | ||
315 | W[p1++] = r0; | ||
316 | |||
317 | /* pass the uboot arguments to the global value command line */ | ||
318 | R0 = R7; | ||
319 | call _cmdline_init; | ||
320 | |||
321 | p1.l = __rambase; | ||
322 | p1.h = __rambase; | ||
323 | r0.l = __sdata; | ||
324 | r0.h = __sdata; | ||
325 | [p1] = r0; | ||
326 | |||
327 | p1.l = __ramstart; | ||
328 | p1.h = __ramstart; | ||
329 | p3.l = ___bss_stop; | ||
330 | p3.h = ___bss_stop; | ||
331 | |||
332 | r1 = p3; | ||
333 | [p1] = r1; | ||
334 | |||
335 | /* | ||
336 | * load the current thread pointer and stack | ||
337 | */ | ||
338 | r1.l = _init_thread_union; | ||
339 | r1.h = _init_thread_union; | ||
340 | |||
341 | r2.l = 0x2000; | ||
342 | r2.h = 0x0000; | ||
343 | r1 = r1 + r2; | ||
344 | sp = r1; | ||
345 | usp = sp; | ||
346 | fp = sp; | ||
347 | jump.l _start_kernel; | ||
348 | ENDPROC(_real_start) | ||
349 | |||
350 | __FINIT | ||
351 | |||
352 | .section .l1.text | 38 | .section .l1.text |
353 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
354 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
@@ -452,13 +138,6 @@ ENTRY(_start_dma_code) | |||
452 | [P2] = R1; | 138 | [P2] = R1; |
453 | SSYNC; | 139 | SSYNC; |
454 | 140 | ||
455 | p0.h = hi(SIC_IWR); | ||
456 | p0.l = lo(SIC_IWR); | ||
457 | r0.l = lo(IWR_ENABLE_ALL); | ||
458 | r0.h = hi(IWR_ENABLE_ALL); | ||
459 | [p0] = r0; | ||
460 | SSYNC; | ||
461 | |||
462 | RTS; | 141 | RTS; |
463 | ENDPROC(_start_dma_code) | 142 | ENDPROC(_start_dma_code) |
464 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 143 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf537/ints-priority.c b/arch/blackfin/mach-bf537/ints-priority.c index a8b915f202ec..b1300b3f1812 100644 --- a/arch/blackfin/mach-bf537/ints-priority.c +++ b/arch/blackfin/mach-bf537/ints-priority.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | 33 | ||
34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
35 | { | 35 | { |
36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-bf548/boards/cm_bf548.c b/arch/blackfin/mach-bf548/boards/cm_bf548.c index 4f4ae8787edf..58abbed0a225 100644 --- a/arch/blackfin/mach-bf548/boards/cm_bf548.c +++ b/arch/blackfin/mach-bf548/boards/cm_bf548.c | |||
@@ -319,12 +319,12 @@ static struct platform_device bfin_atapi_device = { | |||
319 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 319 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
320 | static struct mtd_partition partition_info[] = { | 320 | static struct mtd_partition partition_info[] = { |
321 | { | 321 | { |
322 | .name = "Linux Kernel", | 322 | .name = "linux kernel(nand)", |
323 | .offset = 0, | 323 | .offset = 0, |
324 | .size = 4 * SIZE_1M, | 324 | .size = 4 * SIZE_1M, |
325 | }, | 325 | }, |
326 | { | 326 | { |
327 | .name = "File System", | 327 | .name = "file system(nand)", |
328 | .offset = 4 * SIZE_1M, | 328 | .offset = 4 * SIZE_1M, |
329 | .size = (256 - 4) * SIZE_1M, | 329 | .size = (256 - 4) * SIZE_1M, |
330 | }, | 330 | }, |
@@ -377,12 +377,12 @@ static struct platform_device bf54x_sdh_device = { | |||
377 | /* SPI flash chip (m25p16) */ | 377 | /* SPI flash chip (m25p16) */ |
378 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 378 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
379 | { | 379 | { |
380 | .name = "bootloader", | 380 | .name = "bootloader(spi)", |
381 | .size = 0x00040000, | 381 | .size = 0x00040000, |
382 | .offset = 0, | 382 | .offset = 0, |
383 | .mask_flags = MTD_CAP_ROM | 383 | .mask_flags = MTD_CAP_ROM |
384 | }, { | 384 | }, { |
385 | .name = "linux kernel", | 385 | .name = "linux kernel(spi)", |
386 | .size = 0x1c0000, | 386 | .size = 0x1c0000, |
387 | .offset = 0x40000 | 387 | .offset = 0x40000 |
388 | } | 388 | } |
diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c index 166fa2201ee7..0d6333ada1d9 100644 --- a/arch/blackfin/mach-bf548/boards/ezkit.c +++ b/arch/blackfin/mach-bf548/boards/ezkit.c | |||
@@ -365,12 +365,12 @@ static struct platform_device bfin_atapi_device = { | |||
365 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) | 365 | #if defined(CONFIG_MTD_NAND_BF5XX) || defined(CONFIG_MTD_NAND_BF5XX_MODULE) |
366 | static struct mtd_partition partition_info[] = { | 366 | static struct mtd_partition partition_info[] = { |
367 | { | 367 | { |
368 | .name = "Linux Kernel", | 368 | .name = "linux kernel(nand)", |
369 | .offset = 0, | 369 | .offset = 0, |
370 | .size = 4 * SIZE_1M, | 370 | .size = 4 * SIZE_1M, |
371 | }, | 371 | }, |
372 | { | 372 | { |
373 | .name = "File System", | 373 | .name = "file system(nand)", |
374 | .offset = MTDPART_OFS_APPEND, | 374 | .offset = MTDPART_OFS_APPEND, |
375 | .size = MTDPART_SIZ_FULL, | 375 | .size = MTDPART_SIZ_FULL, |
376 | }, | 376 | }, |
@@ -419,15 +419,15 @@ static struct platform_device bf54x_sdh_device = { | |||
419 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 419 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
420 | static struct mtd_partition ezkit_partitions[] = { | 420 | static struct mtd_partition ezkit_partitions[] = { |
421 | { | 421 | { |
422 | .name = "Bootloader", | 422 | .name = "bootloader(nor)", |
423 | .size = 0x40000, | 423 | .size = 0x40000, |
424 | .offset = 0, | 424 | .offset = 0, |
425 | }, { | 425 | }, { |
426 | .name = "Kernel", | 426 | .name = "linux kernel(nor)", |
427 | .size = 0x1C0000, | 427 | .size = 0x1C0000, |
428 | .offset = MTDPART_OFS_APPEND, | 428 | .offset = MTDPART_OFS_APPEND, |
429 | }, { | 429 | }, { |
430 | .name = "RootFS", | 430 | .name = "file system(nor)", |
431 | .size = MTDPART_SIZ_FULL, | 431 | .size = MTDPART_SIZ_FULL, |
432 | .offset = MTDPART_OFS_APPEND, | 432 | .offset = MTDPART_OFS_APPEND, |
433 | } | 433 | } |
@@ -461,12 +461,12 @@ static struct platform_device ezkit_flash_device = { | |||
461 | /* SPI flash chip (m25p16) */ | 461 | /* SPI flash chip (m25p16) */ |
462 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 462 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
463 | { | 463 | { |
464 | .name = "bootloader", | 464 | .name = "bootloader(spi)", |
465 | .size = 0x00040000, | 465 | .size = 0x00040000, |
466 | .offset = 0, | 466 | .offset = 0, |
467 | .mask_flags = MTD_CAP_ROM | 467 | .mask_flags = MTD_CAP_ROM |
468 | }, { | 468 | }, { |
469 | .name = "linux kernel", | 469 | .name = "linux kernel(spi)", |
470 | .size = MTDPART_SIZ_FULL, | 470 | .size = MTDPART_SIZ_FULL, |
471 | .offset = MTDPART_OFS_APPEND, | 471 | .offset = MTDPART_OFS_APPEND, |
472 | } | 472 | } |
diff --git a/arch/blackfin/mach-bf548/head.S b/arch/blackfin/mach-bf548/head.S index 06b9178cfcfe..e3000f70a26e 100644 --- a/arch/blackfin/mach-bf548/head.S +++ b/arch/blackfin/mach-bf548/head.S | |||
@@ -30,263 +30,11 @@ | |||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | #include <asm/trace.h> | ||
34 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
35 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
36 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
37 | #endif | 36 | #endif |
38 | 37 | ||
39 | .extern ___bss_stop | ||
40 | .extern ___bss_start | ||
41 | .extern _bf53x_relocate_l1_mem | ||
42 | |||
43 | #define INITIAL_STACK 0xFFB01000 | ||
44 | |||
45 | __INIT | ||
46 | |||
47 | ENTRY(__start) | ||
48 | /* R0: argument of command line string, passed from uboot, save it */ | ||
49 | R7 = R0; | ||
50 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
51 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
52 | R0 = SYSCFG_SNEN; | ||
53 | #else | ||
54 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
55 | #endif | ||
56 | SYSCFG = R0; | ||
57 | R0 = 0; | ||
58 | |||
59 | /* Clear Out All the data and pointer Registers*/ | ||
60 | R1 = R0; | ||
61 | R2 = R0; | ||
62 | R3 = R0; | ||
63 | R4 = R0; | ||
64 | R5 = R0; | ||
65 | R6 = R0; | ||
66 | |||
67 | P0 = R0; | ||
68 | P1 = R0; | ||
69 | P2 = R0; | ||
70 | P3 = R0; | ||
71 | P4 = R0; | ||
72 | P5 = R0; | ||
73 | |||
74 | LC0 = r0; | ||
75 | LC1 = r0; | ||
76 | L0 = r0; | ||
77 | L1 = r0; | ||
78 | L2 = r0; | ||
79 | L3 = r0; | ||
80 | |||
81 | /* Clear Out All the DAG Registers*/ | ||
82 | B0 = r0; | ||
83 | B1 = r0; | ||
84 | B2 = r0; | ||
85 | B3 = r0; | ||
86 | |||
87 | I0 = r0; | ||
88 | I1 = r0; | ||
89 | I2 = r0; | ||
90 | I3 = r0; | ||
91 | |||
92 | M0 = r0; | ||
93 | M1 = r0; | ||
94 | M2 = r0; | ||
95 | M3 = r0; | ||
96 | |||
97 | trace_buffer_init(p0,r0); | ||
98 | P0 = R1; | ||
99 | R0 = R1; | ||
100 | |||
101 | /* Turn off the icache */ | ||
102 | p0.l = LO(IMEM_CONTROL); | ||
103 | p0.h = HI(IMEM_CONTROL); | ||
104 | R1 = [p0]; | ||
105 | R0 = ~ENICPLB; | ||
106 | R0 = R0 & R1; | ||
107 | [p0] = R0; | ||
108 | SSYNC; | ||
109 | |||
110 | /* Turn off the dcache */ | ||
111 | p0.l = LO(DMEM_CONTROL); | ||
112 | p0.h = HI(DMEM_CONTROL); | ||
113 | R1 = [p0]; | ||
114 | R0 = ~ENDCPLB; | ||
115 | R0 = R0 & R1; | ||
116 | [p0] = R0; | ||
117 | SSYNC; | ||
118 | |||
119 | /* Initialize stack pointer */ | ||
120 | SP.L = LO(INITIAL_STACK); | ||
121 | SP.H = HI(INITIAL_STACK); | ||
122 | FP = SP; | ||
123 | USP = SP; | ||
124 | |||
125 | #ifdef CONFIG_EARLY_PRINTK | ||
126 | SP += -12; | ||
127 | call _init_early_exception_vectors; | ||
128 | SP += 12; | ||
129 | #endif | ||
130 | |||
131 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
132 | call _bf53x_relocate_l1_mem; | ||
133 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
134 | call _start_dma_code; | ||
135 | #endif | ||
136 | /* Code for initializing Async memory banks */ | ||
137 | |||
138 | p2.h = hi(EBIU_AMBCTL1); | ||
139 | p2.l = lo(EBIU_AMBCTL1); | ||
140 | r0.h = hi(AMBCTL1VAL); | ||
141 | r0.l = lo(AMBCTL1VAL); | ||
142 | [p2] = r0; | ||
143 | ssync; | ||
144 | |||
145 | p2.h = hi(EBIU_AMBCTL0); | ||
146 | p2.l = lo(EBIU_AMBCTL0); | ||
147 | r0.h = hi(AMBCTL0VAL); | ||
148 | r0.l = lo(AMBCTL0VAL); | ||
149 | [p2] = r0; | ||
150 | ssync; | ||
151 | |||
152 | p2.h = hi(EBIU_AMGCTL); | ||
153 | p2.l = lo(EBIU_AMGCTL); | ||
154 | r0 = AMGCTLVAL; | ||
155 | w[p2] = r0; | ||
156 | ssync; | ||
157 | |||
158 | p2.h = hi(EBIU_MBSCTL); | ||
159 | p2.l = lo(EBIU_MBSCTL); | ||
160 | r0.h = hi(CONFIG_EBIU_MBSCTLVAL); | ||
161 | r0.l = lo(CONFIG_EBIU_MBSCTLVAL); | ||
162 | [p2] = r0; | ||
163 | ssync; | ||
164 | |||
165 | p2.h = hi(EBIU_MODE); | ||
166 | p2.l = lo(EBIU_MODE); | ||
167 | r0.h = hi(CONFIG_EBIU_MODEVAL); | ||
168 | r0.l = lo(CONFIG_EBIU_MODEVAL); | ||
169 | [p2] = r0; | ||
170 | ssync; | ||
171 | |||
172 | p2.h = hi(EBIU_FCTL); | ||
173 | p2.l = lo(EBIU_FCTL); | ||
174 | r0.h = hi(CONFIG_EBIU_FCTLVAL); | ||
175 | r0.l = lo(CONFIG_EBIU_FCTLVAL); | ||
176 | [p2] = r0; | ||
177 | ssync; | ||
178 | |||
179 | /* This section keeps the processor in supervisor mode | ||
180 | * during kernel boot. Switches to user mode at end of boot. | ||
181 | * See page 3-9 of Hardware Reference manual for documentation. | ||
182 | */ | ||
183 | |||
184 | /* EVT15 = _real_start */ | ||
185 | |||
186 | p0.l = lo(EVT15); | ||
187 | p0.h = hi(EVT15); | ||
188 | p1.l = _real_start; | ||
189 | p1.h = _real_start; | ||
190 | [p0] = p1; | ||
191 | csync; | ||
192 | |||
193 | p0.l = lo(IMASK); | ||
194 | p0.h = hi(IMASK); | ||
195 | p1.l = IMASK_IVG15; | ||
196 | p1.h = 0x0; | ||
197 | [p0] = p1; | ||
198 | csync; | ||
199 | |||
200 | raise 15; | ||
201 | p0.l = .LWAIT_HERE; | ||
202 | p0.h = .LWAIT_HERE; | ||
203 | reti = p0; | ||
204 | #if ANOMALY_05000281 | ||
205 | nop; | ||
206 | nop; | ||
207 | nop; | ||
208 | #endif | ||
209 | rti; | ||
210 | |||
211 | .LWAIT_HERE: | ||
212 | jump .LWAIT_HERE; | ||
213 | ENDPROC(__start) | ||
214 | |||
215 | ENTRY(_real_start) | ||
216 | [ -- sp ] = reti; | ||
217 | p0.l = lo(WDOG_CTL); | ||
218 | p0.h = hi(WDOG_CTL); | ||
219 | r0 = 0xAD6(z); | ||
220 | w[p0] = r0; /* watchdog off for now */ | ||
221 | ssync; | ||
222 | |||
223 | /* Code update for BSS size == 0 | ||
224 | * Zero out the bss region. | ||
225 | */ | ||
226 | |||
227 | p1.l = ___bss_start; | ||
228 | p1.h = ___bss_start; | ||
229 | p2.l = ___bss_stop; | ||
230 | p2.h = ___bss_stop; | ||
231 | r0 = 0; | ||
232 | p2 -= p1; | ||
233 | lsetup (.L_clear_bss, .L_clear_bss ) lc0 = p2; | ||
234 | .L_clear_bss: | ||
235 | B[p1++] = r0; | ||
236 | |||
237 | /* In case there is a NULL pointer reference | ||
238 | * Zero out region before stext | ||
239 | */ | ||
240 | |||
241 | p1.l = 0x0; | ||
242 | p1.h = 0x0; | ||
243 | r0.l = __stext; | ||
244 | r0.h = __stext; | ||
245 | r0 = r0 >> 1; | ||
246 | p2 = r0; | ||
247 | r0 = 0; | ||
248 | lsetup (.L_clear_zero, .L_clear_zero ) lc0 = p2; | ||
249 | .L_clear_zero: | ||
250 | W[p1++] = r0; | ||
251 | |||
252 | /* pass the uboot arguments to the global value command line */ | ||
253 | R0 = R7; | ||
254 | call _cmdline_init; | ||
255 | |||
256 | p1.l = __rambase; | ||
257 | p1.h = __rambase; | ||
258 | r0.l = __sdata; | ||
259 | r0.h = __sdata; | ||
260 | [p1] = r0; | ||
261 | |||
262 | p1.l = __ramstart; | ||
263 | p1.h = __ramstart; | ||
264 | p3.l = ___bss_stop; | ||
265 | p3.h = ___bss_stop; | ||
266 | |||
267 | r1 = p3; | ||
268 | [p1] = r1; | ||
269 | |||
270 | |||
271 | /* | ||
272 | * load the current thread pointer and stack | ||
273 | */ | ||
274 | r1.l = _init_thread_union; | ||
275 | r1.h = _init_thread_union; | ||
276 | |||
277 | r2.l = 0x2000; | ||
278 | r2.h = 0x0000; | ||
279 | r1 = r1 + r2; | ||
280 | sp = r1; | ||
281 | usp = sp; | ||
282 | fp = sp; | ||
283 | call _start_kernel; | ||
284 | .L_exit: | ||
285 | jump.s .L_exit; | ||
286 | ENDPROC(_real_start) | ||
287 | |||
288 | __FINIT | ||
289 | |||
290 | .section .l1.text | 38 | .section .l1.text |
291 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
292 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
@@ -443,13 +191,6 @@ ENTRY(_start_dma_code) | |||
443 | SSYNC; | 191 | SSYNC; |
444 | #endif | 192 | #endif |
445 | 193 | ||
446 | p0.h = hi(SIC_IWR0); | ||
447 | p0.l = lo(SIC_IWR0); | ||
448 | r0.l = lo(IWR_ENABLE_ALL); | ||
449 | r0.h = hi(IWR_ENABLE_ALL); | ||
450 | [p0] = r0; | ||
451 | SSYNC; | ||
452 | |||
453 | RTS; | 194 | RTS; |
454 | ENDPROC(_start_dma_code) | 195 | ENDPROC(_start_dma_code) |
455 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 196 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
diff --git a/arch/blackfin/mach-bf548/ints-priority.c b/arch/blackfin/mach-bf548/ints-priority.c index 2665653cee37..9dd0fa3ac4de 100644 --- a/arch/blackfin/mach-bf548/ints-priority.c +++ b/arch/blackfin/mach-bf548/ints-priority.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | 33 | ||
34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
35 | { | 35 | { |
36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SIC_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 466ef5929a25..8f40990eea2f 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
@@ -54,16 +54,16 @@ const char bfin_board_name[] = "Bluetechnix CM BF561"; | |||
54 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) | 54 | #if defined(CONFIG_MTD_M25P80) || defined(CONFIG_MTD_M25P80_MODULE) |
55 | static struct mtd_partition bfin_spi_flash_partitions[] = { | 55 | static struct mtd_partition bfin_spi_flash_partitions[] = { |
56 | { | 56 | { |
57 | .name = "bootloader", | 57 | .name = "bootloader(spi)", |
58 | .size = 0x00020000, | 58 | .size = 0x00020000, |
59 | .offset = 0, | 59 | .offset = 0, |
60 | .mask_flags = MTD_CAP_ROM | 60 | .mask_flags = MTD_CAP_ROM |
61 | }, { | 61 | }, { |
62 | .name = "kernel", | 62 | .name = "linux kernel(spi)", |
63 | .size = 0xe0000, | 63 | .size = 0xe0000, |
64 | .offset = 0x20000 | 64 | .offset = 0x20000 |
65 | }, { | 65 | }, { |
66 | .name = "file system", | 66 | .name = "file system(spi)", |
67 | .size = 0x700000, | 67 | .size = 0x700000, |
68 | .offset = 0x00100000, | 68 | .offset = 0x00100000, |
69 | } | 69 | } |
@@ -306,7 +306,7 @@ static struct platform_device bfin_sir_device = { | |||
306 | #endif | 306 | #endif |
307 | 307 | ||
308 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | 308 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) |
309 | #define PATA_INT 119 | 309 | #define PATA_INT IRQ_PF46 |
310 | 310 | ||
311 | static struct pata_platform_info bfin_pata_platform_data = { | 311 | static struct pata_platform_info bfin_pata_platform_data = { |
312 | .ioport_shift = 2, | 312 | .ioport_shift = 2, |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index bc6feded8569..50b4cdceccfe 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/spi/spi.h> | 35 | #include <linux/spi/spi.h> |
36 | #include <linux/irq.h> | 36 | #include <linux/irq.h> |
37 | #include <linux/interrupt.h> | 37 | #include <linux/interrupt.h> |
38 | #include <linux/ata_platform.h> | ||
39 | #include <asm/dma.h> | 38 | #include <asm/dma.h> |
40 | #include <asm/bfin5xx_spi.h> | 39 | #include <asm/bfin5xx_spi.h> |
41 | #include <asm/portmux.h> | 40 | #include <asm/portmux.h> |
@@ -243,15 +242,15 @@ static struct platform_device bfin_sir_device = { | |||
243 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) | 242 | #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE) |
244 | static struct mtd_partition ezkit_partitions[] = { | 243 | static struct mtd_partition ezkit_partitions[] = { |
245 | { | 244 | { |
246 | .name = "Bootloader", | 245 | .name = "bootloader(nor)", |
247 | .size = 0x40000, | 246 | .size = 0x40000, |
248 | .offset = 0, | 247 | .offset = 0, |
249 | }, { | 248 | }, { |
250 | .name = "Kernel", | 249 | .name = "linux kernel(nor)", |
251 | .size = 0x1C0000, | 250 | .size = 0x1C0000, |
252 | .offset = MTDPART_OFS_APPEND, | 251 | .offset = MTDPART_OFS_APPEND, |
253 | }, { | 252 | }, { |
254 | .name = "RootFS", | 253 | .name = "file system(nor)", |
255 | .size = MTDPART_SIZ_FULL, | 254 | .size = MTDPART_SIZ_FULL, |
256 | .offset = MTDPART_OFS_APPEND, | 255 | .offset = MTDPART_OFS_APPEND, |
257 | } | 256 | } |
@@ -350,43 +349,6 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
350 | #endif | 349 | #endif |
351 | }; | 350 | }; |
352 | 351 | ||
353 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
354 | #define PATA_INT 55 | ||
355 | |||
356 | static struct pata_platform_info bfin_pata_platform_data = { | ||
357 | .ioport_shift = 1, | ||
358 | .irq_type = IRQF_TRIGGER_HIGH | IRQF_DISABLED, | ||
359 | }; | ||
360 | |||
361 | static struct resource bfin_pata_resources[] = { | ||
362 | { | ||
363 | .start = 0x20314020, | ||
364 | .end = 0x2031403F, | ||
365 | .flags = IORESOURCE_MEM, | ||
366 | }, | ||
367 | { | ||
368 | .start = 0x2031401C, | ||
369 | .end = 0x2031401F, | ||
370 | .flags = IORESOURCE_MEM, | ||
371 | }, | ||
372 | { | ||
373 | .start = PATA_INT, | ||
374 | .end = PATA_INT, | ||
375 | .flags = IORESOURCE_IRQ, | ||
376 | }, | ||
377 | }; | ||
378 | |||
379 | static struct platform_device bfin_pata_device = { | ||
380 | .name = "pata_platform", | ||
381 | .id = -1, | ||
382 | .num_resources = ARRAY_SIZE(bfin_pata_resources), | ||
383 | .resource = bfin_pata_resources, | ||
384 | .dev = { | ||
385 | .platform_data = &bfin_pata_platform_data, | ||
386 | } | ||
387 | }; | ||
388 | #endif | ||
389 | |||
390 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 352 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
391 | #include <linux/input.h> | 353 | #include <linux/input.h> |
392 | #include <linux/gpio_keys.h> | 354 | #include <linux/gpio_keys.h> |
@@ -499,10 +461,6 @@ static struct platform_device *ezkit_devices[] __initdata = { | |||
499 | &bfin_sir_device, | 461 | &bfin_sir_device, |
500 | #endif | 462 | #endif |
501 | 463 | ||
502 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
503 | &bfin_pata_device, | ||
504 | #endif | ||
505 | |||
506 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) | 464 | #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) |
507 | &bfin_device_gpiokeys, | 465 | &bfin_device_gpiokeys, |
508 | #endif | 466 | #endif |
@@ -538,10 +496,6 @@ static int __init ezkit_init(void) | |||
538 | #endif | 496 | #endif |
539 | 497 | ||
540 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); | 498 | spi_register_board_info(bfin_spi_board_info, ARRAY_SIZE(bfin_spi_board_info)); |
541 | |||
542 | #if defined(CONFIG_PATA_PLATFORM) || defined(CONFIG_PATA_PLATFORM_MODULE) | ||
543 | irq_desc[PATA_INT].status |= IRQ_NOAUTOEN; | ||
544 | #endif | ||
545 | return 0; | 499 | return 0; |
546 | } | 500 | } |
547 | 501 | ||
diff --git a/arch/blackfin/mach-bf561/head.S b/arch/blackfin/mach-bf561/head.S index cf1a2dff01e7..c7a81e34703d 100644 --- a/arch/blackfin/mach-bf561/head.S +++ b/arch/blackfin/mach-bf561/head.S | |||
@@ -30,284 +30,13 @@ | |||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <linux/init.h> | 31 | #include <linux/init.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | #include <asm/trace.h> | 33 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
34 | |||
35 | #if CONFIG_BFIN_KERNEL_CLOCK | ||
36 | #include <asm/mach-common/clocks.h> | 34 | #include <asm/mach-common/clocks.h> |
37 | #include <asm/mach/mem_init.h> | 35 | #include <asm/mach/mem_init.h> |
38 | #endif | 36 | #endif |
39 | 37 | ||
40 | .extern ___bss_stop | ||
41 | .extern ___bss_start | ||
42 | .extern _bf53x_relocate_l1_mem | ||
43 | |||
44 | #define INITIAL_STACK 0xFFB01000 | ||
45 | |||
46 | __INIT | ||
47 | |||
48 | ENTRY(__start) | ||
49 | /* R0: argument of command line string, passed from uboot, save it */ | ||
50 | R7 = R0; | ||
51 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
52 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
53 | R0 = SYSCFG_SNEN; | ||
54 | #else | ||
55 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
56 | #endif | ||
57 | SYSCFG = R0; | ||
58 | R0 = 0; | ||
59 | |||
60 | /* Clear Out All the data and pointer Registers */ | ||
61 | R1 = R0; | ||
62 | R2 = R0; | ||
63 | R3 = R0; | ||
64 | R4 = R0; | ||
65 | R5 = R0; | ||
66 | R6 = R0; | ||
67 | |||
68 | P0 = R0; | ||
69 | P1 = R0; | ||
70 | P2 = R0; | ||
71 | P3 = R0; | ||
72 | P4 = R0; | ||
73 | P5 = R0; | ||
74 | |||
75 | LC0 = r0; | ||
76 | LC1 = r0; | ||
77 | L0 = r0; | ||
78 | L1 = r0; | ||
79 | L2 = r0; | ||
80 | L3 = r0; | ||
81 | |||
82 | /* Clear Out All the DAG Registers */ | ||
83 | B0 = r0; | ||
84 | B1 = r0; | ||
85 | B2 = r0; | ||
86 | B3 = r0; | ||
87 | |||
88 | I0 = r0; | ||
89 | I1 = r0; | ||
90 | I2 = r0; | ||
91 | I3 = r0; | ||
92 | |||
93 | M0 = r0; | ||
94 | M1 = r0; | ||
95 | M2 = r0; | ||
96 | M3 = r0; | ||
97 | |||
98 | trace_buffer_init(p0,r0); | ||
99 | P0 = R1; | ||
100 | R0 = R1; | ||
101 | |||
102 | /* Turn off the icache */ | ||
103 | p0.l = LO(IMEM_CONTROL); | ||
104 | p0.h = HI(IMEM_CONTROL); | ||
105 | R1 = [p0]; | ||
106 | R0 = ~ENICPLB; | ||
107 | R0 = R0 & R1; | ||
108 | |||
109 | #if ANOMALY_05000125 | ||
110 | CLI R2; | ||
111 | SSYNC; | ||
112 | #endif | ||
113 | [p0] = R0; | ||
114 | SSYNC; | ||
115 | #if ANOMALY_05000125 | ||
116 | STI R2; | ||
117 | #endif | ||
118 | |||
119 | /* Turn off the dcache */ | ||
120 | p0.l = LO(DMEM_CONTROL); | ||
121 | p0.h = HI(DMEM_CONTROL); | ||
122 | R1 = [p0]; | ||
123 | R0 = ~ENDCPLB; | ||
124 | R0 = R0 & R1; | ||
125 | |||
126 | /* Anomaly 05000125 */ | ||
127 | #if ANOMALY_05000125 | ||
128 | CLI R2; | ||
129 | SSYNC; | ||
130 | #endif | ||
131 | [p0] = R0; | ||
132 | SSYNC; | ||
133 | #if ANOMALY_05000125 | ||
134 | STI R2; | ||
135 | #endif | ||
136 | |||
137 | /* Initialise UART - when booting from u-boot, the UART is not disabled | ||
138 | * so if we dont initalize here, our serial console gets hosed */ | ||
139 | p0.h = hi(BFIN_UART_LCR); | ||
140 | p0.l = lo(BFIN_UART_LCR); | ||
141 | r0 = 0x0(Z); | ||
142 | w[p0] = r0.L; /* To enable DLL writes */ | ||
143 | ssync; | ||
144 | |||
145 | p0.h = hi(BFIN_UART_DLL); | ||
146 | p0.l = lo(BFIN_UART_DLL); | ||
147 | r0 = 0x0(Z); | ||
148 | w[p0] = r0.L; | ||
149 | ssync; | ||
150 | |||
151 | p0.h = hi(BFIN_UART_DLH); | ||
152 | p0.l = lo(BFIN_UART_DLH); | ||
153 | r0 = 0x00(Z); | ||
154 | w[p0] = r0.L; | ||
155 | ssync; | ||
156 | |||
157 | p0.h = hi(BFIN_UART_GCTL); | ||
158 | p0.l = lo(BFIN_UART_GCTL); | ||
159 | r0 = 0x0(Z); | ||
160 | w[p0] = r0.L; /* To enable UART clock */ | ||
161 | ssync; | ||
162 | |||
163 | /* Initialize stack pointer */ | ||
164 | sp.l = lo(INITIAL_STACK); | ||
165 | sp.h = hi(INITIAL_STACK); | ||
166 | fp = sp; | ||
167 | usp = sp; | ||
168 | |||
169 | #ifdef CONFIG_EARLY_PRINTK | ||
170 | SP += -12; | ||
171 | call _init_early_exception_vectors; | ||
172 | SP += 12; | ||
173 | #endif | ||
174 | |||
175 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
176 | call _bf53x_relocate_l1_mem; | ||
177 | #if CONFIG_BFIN_KERNEL_CLOCK | ||
178 | call _start_dma_code; | ||
179 | #endif | ||
180 | |||
181 | /* Code for initializing Async memory banks */ | ||
182 | |||
183 | p2.h = hi(EBIU_AMBCTL1); | ||
184 | p2.l = lo(EBIU_AMBCTL1); | ||
185 | r0.h = hi(AMBCTL1VAL); | ||
186 | r0.l = lo(AMBCTL1VAL); | ||
187 | [p2] = r0; | ||
188 | ssync; | ||
189 | |||
190 | p2.h = hi(EBIU_AMBCTL0); | ||
191 | p2.l = lo(EBIU_AMBCTL0); | ||
192 | r0.h = hi(AMBCTL0VAL); | ||
193 | r0.l = lo(AMBCTL0VAL); | ||
194 | [p2] = r0; | ||
195 | ssync; | ||
196 | |||
197 | p2.h = hi(EBIU_AMGCTL); | ||
198 | p2.l = lo(EBIU_AMGCTL); | ||
199 | r0 = AMGCTLVAL; | ||
200 | w[p2] = r0; | ||
201 | ssync; | ||
202 | |||
203 | /* This section keeps the processor in supervisor mode | ||
204 | * during kernel boot. Switches to user mode at end of boot. | ||
205 | * See page 3-9 of Hardware Reference manual for documentation. | ||
206 | */ | ||
207 | |||
208 | /* EVT15 = _real_start */ | ||
209 | |||
210 | p0.l = lo(EVT15); | ||
211 | p0.h = hi(EVT15); | ||
212 | p1.l = _real_start; | ||
213 | p1.h = _real_start; | ||
214 | [p0] = p1; | ||
215 | csync; | ||
216 | |||
217 | p0.l = lo(IMASK); | ||
218 | p0.h = hi(IMASK); | ||
219 | p1.l = IMASK_IVG15; | ||
220 | p1.h = 0x0; | ||
221 | [p0] = p1; | ||
222 | csync; | ||
223 | |||
224 | raise 15; | ||
225 | p0.l = .LWAIT_HERE; | ||
226 | p0.h = .LWAIT_HERE; | ||
227 | reti = p0; | ||
228 | #if ANOMALY_05000281 | ||
229 | nop; nop; nop; | ||
230 | #endif | ||
231 | rti; | ||
232 | |||
233 | .LWAIT_HERE: | ||
234 | jump .LWAIT_HERE; | ||
235 | ENDPROC(__start) | ||
236 | |||
237 | ENTRY(_real_start) | ||
238 | [ -- sp ] = reti; | ||
239 | p0.l = lo(WDOGA_CTL); | ||
240 | p0.h = hi(WDOGA_CTL); | ||
241 | r0 = 0xAD6(z); | ||
242 | w[p0] = r0; /* watchdog off for now */ | ||
243 | ssync; | ||
244 | |||
245 | /* Code update for BSS size == 0 | ||
246 | * Zero out the bss region. | ||
247 | */ | ||
248 | |||
249 | p1.l = ___bss_start; | ||
250 | p1.h = ___bss_start; | ||
251 | p2.l = ___bss_stop; | ||
252 | p2.h = ___bss_stop; | ||
253 | r0 = 0; | ||
254 | p2 -= p1; | ||
255 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
256 | .L_clear_bss: | ||
257 | B[p1++] = r0; | ||
258 | |||
259 | /* In case there is a NULL pointer reference | ||
260 | * Zero out region before stext | ||
261 | */ | ||
262 | |||
263 | p1.l = 0x0; | ||
264 | p1.h = 0x0; | ||
265 | r0.l = __stext; | ||
266 | r0.h = __stext; | ||
267 | r0 = r0 >> 1; | ||
268 | p2 = r0; | ||
269 | r0 = 0; | ||
270 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
271 | .L_clear_zero: | ||
272 | W[p1++] = r0; | ||
273 | |||
274 | /* pass the uboot arguments to the global value command line */ | ||
275 | R0 = R7; | ||
276 | call _cmdline_init; | ||
277 | |||
278 | p1.l = __rambase; | ||
279 | p1.h = __rambase; | ||
280 | r0.l = __sdata; | ||
281 | r0.h = __sdata; | ||
282 | [p1] = r0; | ||
283 | |||
284 | p1.l = __ramstart; | ||
285 | p1.h = __ramstart; | ||
286 | p3.l = ___bss_stop; | ||
287 | p3.h = ___bss_stop; | ||
288 | |||
289 | r1 = p3; | ||
290 | [p1] = r1; | ||
291 | |||
292 | /* | ||
293 | * load the current thread pointer and stack | ||
294 | */ | ||
295 | r1.l = _init_thread_union; | ||
296 | r1.h = _init_thread_union; | ||
297 | |||
298 | r2.l = 0x2000; | ||
299 | r2.h = 0x0000; | ||
300 | r1 = r1 + r2; | ||
301 | sp = r1; | ||
302 | usp = sp; | ||
303 | fp = sp; | ||
304 | jump.l _start_kernel; | ||
305 | ENDPROC(_real_start) | ||
306 | |||
307 | __FINIT | ||
308 | |||
309 | .section .l1.text | 38 | .section .l1.text |
310 | #if CONFIG_BFIN_KERNEL_CLOCK | 39 | #ifdef CONFIG_BFIN_KERNEL_CLOCK |
311 | ENTRY(_start_dma_code) | 40 | ENTRY(_start_dma_code) |
312 | p0.h = hi(SICA_IWR0); | 41 | p0.h = hi(SICA_IWR0); |
313 | p0.l = lo(SICA_IWR0); | 42 | p0.l = lo(SICA_IWR0); |
diff --git a/arch/blackfin/mach-bf561/ints-priority.c b/arch/blackfin/mach-bf561/ints-priority.c index 09b541b0f7c2..9d2f23344720 100644 --- a/arch/blackfin/mach-bf561/ints-priority.c +++ b/arch/blackfin/mach-bf561/ints-priority.c | |||
@@ -31,7 +31,7 @@ | |||
31 | #include <linux/irq.h> | 31 | #include <linux/irq.h> |
32 | #include <asm/blackfin.h> | 32 | #include <asm/blackfin.h> |
33 | 33 | ||
34 | void program_IAR(void) | 34 | void __init program_IAR(void) |
35 | { | 35 | { |
36 | /* Program the IAR0 Register with the configured priority */ | 36 | /* Program the IAR0 Register with the configured priority */ |
37 | bfin_write_SICA_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | | 37 | bfin_write_SICA_IAR0(((CONFIG_IRQ_PLL_WAKEUP - 7) << IRQ_PLL_WAKEUP_POS) | |
diff --git a/arch/blackfin/mach-common/Makefile b/arch/blackfin/mach-common/Makefile index 422bfee34adc..e6ed57c56d4b 100644 --- a/arch/blackfin/mach-common/Makefile +++ b/arch/blackfin/mach-common/Makefile | |||
@@ -3,9 +3,10 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := \ | 5 | obj-y := \ |
6 | cache.o cacheinit.o entry.o \ | 6 | cache.o entry.o head.o \ |
7 | interrupt.o lock.o irqpanic.o arch_checks.o ints-priority.o | 7 | interrupt.o irqpanic.o arch_checks.o ints-priority.o |
8 | 8 | ||
9 | obj-$(CONFIG_BFIN_ICACHE_LOCK) += lock.o | ||
9 | obj-$(CONFIG_PM) += pm.o dpmc_modes.o | 10 | obj-$(CONFIG_PM) += pm.o dpmc_modes.o |
10 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o | 11 | obj-$(CONFIG_CPU_FREQ) += cpufreq.o |
11 | obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o | 12 | obj-$(CONFIG_CPU_VOLTAGE) += dpmc.o |
diff --git a/arch/blackfin/mach-common/arch_checks.c b/arch/blackfin/mach-common/arch_checks.c index f9160d83b91f..5986758b2752 100644 --- a/arch/blackfin/mach-common/arch_checks.c +++ b/arch/blackfin/mach-common/arch_checks.c | |||
@@ -27,6 +27,7 @@ | |||
27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <asm/fixed_code.h> | ||
30 | #include <asm/mach/anomaly.h> | 31 | #include <asm/mach/anomaly.h> |
31 | #include <asm/mach-common/clocks.h> | 32 | #include <asm/mach-common/clocks.h> |
32 | 33 | ||
@@ -53,3 +54,11 @@ | |||
53 | # endif | 54 | # endif |
54 | 55 | ||
55 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ | 56 | #endif /* CONFIG_BFIN_KERNEL_CLOCK */ |
57 | |||
58 | #if CONFIG_BOOT_LOAD < FIXED_CODE_END | ||
59 | # error "The kernel load address must be after the fixed code section" | ||
60 | #endif | ||
61 | |||
62 | #if (CONFIG_BOOT_LOAD & 0x3) | ||
63 | # error "The kernel load address must be 4 byte aligned" | ||
64 | #endif | ||
diff --git a/arch/blackfin/mach-common/cache.S b/arch/blackfin/mach-common/cache.S index 0521b1588204..85f8c79b3c37 100644 --- a/arch/blackfin/mach-common/cache.S +++ b/arch/blackfin/mach-common/cache.S | |||
@@ -34,81 +34,6 @@ | |||
34 | #include <asm/cache.h> | 34 | #include <asm/cache.h> |
35 | 35 | ||
36 | .text | 36 | .text |
37 | .align 2 | ||
38 | ENTRY(_cache_invalidate) | ||
39 | |||
40 | /* | ||
41 | * Icache or DcacheA or DcacheB Invalidation | ||
42 | * or any combination thereof | ||
43 | * R0 has bits | ||
44 | * CPLB_ENABLE_ICACHE_P,CPLB_ENABLE_DCACHE_P,CPLB_ENABLE_DCACHE2_P | ||
45 | * set as required | ||
46 | */ | ||
47 | [--SP] = R7; | ||
48 | |||
49 | R7 = R0; | ||
50 | CC = BITTST(R7,CPLB_ENABLE_ICACHE_P); | ||
51 | IF !CC JUMP .Lno_icache; | ||
52 | [--SP] = RETS; | ||
53 | CALL _icache_invalidate; | ||
54 | RETS = [SP++]; | ||
55 | .Lno_icache: | ||
56 | CC = BITTST(R7,CPLB_ENABLE_DCACHE_P); | ||
57 | IF !CC JUMP .Lno_dcache_a; | ||
58 | R0 = 0; /* specifies bank A */ | ||
59 | [--SP] = RETS; | ||
60 | CALL _dcache_invalidate; | ||
61 | RETS = [SP++]; | ||
62 | .Lno_dcache_a: | ||
63 | CC = BITTST(R7,CPLB_ENABLE_DCACHE2_P); | ||
64 | IF !CC JUMP .Lno_dcache_b; | ||
65 | R0 = 0; | ||
66 | BITSET(R0, 23); /* specifies bank B */ | ||
67 | [--SP] = RETS; | ||
68 | CALL _dcache_invalidate; | ||
69 | RETS = [SP++]; | ||
70 | .Lno_dcache_b: | ||
71 | R7 = [SP++]; | ||
72 | RTS; | ||
73 | ENDPROC(_cache_invalidate) | ||
74 | |||
75 | /* Invalidate the Entire Instruction cache by | ||
76 | * disabling IMC bit | ||
77 | */ | ||
78 | ENTRY(_icache_invalidate) | ||
79 | ENTRY(_invalidate_entire_icache) | ||
80 | [--SP] = ( R7:5); | ||
81 | |||
82 | P0.L = LO(IMEM_CONTROL); | ||
83 | P0.H = HI(IMEM_CONTROL); | ||
84 | R7 = [P0]; | ||
85 | |||
86 | /* Clear the IMC bit , All valid bits in the instruction | ||
87 | * cache are set to the invalid state | ||
88 | */ | ||
89 | BITCLR(R7,IMC_P); | ||
90 | CLI R6; | ||
91 | SSYNC; /* SSYNC required before invalidating cache. */ | ||
92 | .align 8; | ||
93 | [P0] = R7; | ||
94 | SSYNC; | ||
95 | STI R6; | ||
96 | |||
97 | /* Configures the instruction cache agian */ | ||
98 | R6 = (IMC | ENICPLB); | ||
99 | R7 = R7 | R6; | ||
100 | |||
101 | CLI R6; | ||
102 | SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ | ||
103 | .align 8; | ||
104 | [P0] = R7; | ||
105 | SSYNC; | ||
106 | STI R6; | ||
107 | |||
108 | ( R7:5) = [SP++]; | ||
109 | RTS; | ||
110 | ENDPROC(_invalidate_entire_icache) | ||
111 | ENDPROC(_icache_invalidate) | ||
112 | 37 | ||
113 | /* | 38 | /* |
114 | * blackfin_cache_flush_range(start, end) | 39 | * blackfin_cache_flush_range(start, end) |
@@ -190,46 +115,6 @@ ENTRY(_blackfin_dcache_invalidate_range) | |||
190 | RTS; | 115 | RTS; |
191 | ENDPROC(_blackfin_dcache_invalidate_range) | 116 | ENDPROC(_blackfin_dcache_invalidate_range) |
192 | 117 | ||
193 | /* Invalidate the Entire Data cache by | ||
194 | * clearing DMC[1:0] bits | ||
195 | */ | ||
196 | ENTRY(_invalidate_entire_dcache) | ||
197 | ENTRY(_dcache_invalidate) | ||
198 | [--SP] = ( R7:6); | ||
199 | |||
200 | P0.L = LO(DMEM_CONTROL); | ||
201 | P0.H = HI(DMEM_CONTROL); | ||
202 | R7 = [P0]; | ||
203 | |||
204 | /* Clear the DMC[1:0] bits, All valid bits in the data | ||
205 | * cache are set to the invalid state | ||
206 | */ | ||
207 | BITCLR(R7,DMC0_P); | ||
208 | BITCLR(R7,DMC1_P); | ||
209 | CLI R6; | ||
210 | SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ | ||
211 | .align 8; | ||
212 | [P0] = R7; | ||
213 | SSYNC; | ||
214 | STI R6; | ||
215 | |||
216 | /* Configures the data cache again */ | ||
217 | |||
218 | R6 = DMEM_CNTR; | ||
219 | R7 = R7 | R6; | ||
220 | |||
221 | CLI R6; | ||
222 | SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ | ||
223 | .align 8; | ||
224 | [P0] = R7; | ||
225 | SSYNC; | ||
226 | STI R6; | ||
227 | |||
228 | ( R7:6) = [SP++]; | ||
229 | RTS; | ||
230 | ENDPROC(_dcache_invalidate) | ||
231 | ENDPROC(_invalidate_entire_dcache) | ||
232 | |||
233 | ENTRY(_blackfin_dcache_flush_range) | 118 | ENTRY(_blackfin_dcache_flush_range) |
234 | R2 = -L1_CACHE_BYTES; | 119 | R2 = -L1_CACHE_BYTES; |
235 | R2 = R0 & R2; | 120 | R2 = R0 & R2; |
diff --git a/arch/blackfin/mach-common/cacheinit.S b/arch/blackfin/mach-common/cacheinit.S deleted file mode 100644 index 22fada0c1cb3..000000000000 --- a/arch/blackfin/mach-common/cacheinit.S +++ /dev/null | |||
@@ -1,77 +0,0 @@ | |||
1 | /* | ||
2 | * File: arch/blackfin/mach-common/cacheinit.S | ||
3 | * Based on: | ||
4 | * Author: LG Soft India | ||
5 | * | ||
6 | * Created: ? | ||
7 | * Description: cache initialization | ||
8 | * | ||
9 | * Modified: | ||
10 | * Copyright 2004-2006 Analog Devices Inc. | ||
11 | * | ||
12 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License as published by | ||
16 | * the Free Software Foundation; either version 2 of the License, or | ||
17 | * (at your option) any later version. | ||
18 | * | ||
19 | * This program is distributed in the hope that it will be useful, | ||
20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
22 | * GNU General Public License for more details. | ||
23 | * | ||
24 | * You should have received a copy of the GNU General Public License | ||
25 | * along with this program; if not, see the file COPYING, or write | ||
26 | * to the Free Software Foundation, Inc., | ||
27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
28 | */ | ||
29 | |||
30 | /* This function sets up the data and instruction cache. The | ||
31 | * tables like icplb table, dcplb table and Page Descriptor table | ||
32 | * are defined in cplbtab.h. You can configure those tables for | ||
33 | * your suitable requirements | ||
34 | */ | ||
35 | |||
36 | #include <linux/linkage.h> | ||
37 | #include <asm/blackfin.h> | ||
38 | |||
39 | .text | ||
40 | |||
41 | #if ANOMALY_05000125 | ||
42 | #if defined(CONFIG_BFIN_ICACHE) | ||
43 | ENTRY(_bfin_write_IMEM_CONTROL) | ||
44 | |||
45 | /* Enable Instruction Cache */ | ||
46 | P0.l = LO(IMEM_CONTROL); | ||
47 | P0.h = HI(IMEM_CONTROL); | ||
48 | |||
49 | /* Anomaly 05000125 */ | ||
50 | CLI R1; | ||
51 | SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ | ||
52 | .align 8; | ||
53 | [P0] = R0; | ||
54 | SSYNC; | ||
55 | STI R1; | ||
56 | RTS; | ||
57 | |||
58 | ENDPROC(_bfin_write_IMEM_CONTROL) | ||
59 | #endif | ||
60 | |||
61 | #if defined(CONFIG_BFIN_DCACHE) | ||
62 | ENTRY(_bfin_write_DMEM_CONTROL) | ||
63 | P0.l = LO(DMEM_CONTROL); | ||
64 | P0.h = HI(DMEM_CONTROL); | ||
65 | |||
66 | CLI R1; | ||
67 | SSYNC; /* SSYNC required before writing to DMEM_CONTROL. */ | ||
68 | .align 8; | ||
69 | [P0] = R0; | ||
70 | SSYNC; | ||
71 | STI R1; | ||
72 | RTS; | ||
73 | |||
74 | ENDPROC(_bfin_write_DMEM_CONTROL) | ||
75 | #endif | ||
76 | |||
77 | #endif | ||
diff --git a/arch/blackfin/mach-common/dpmc_modes.S b/arch/blackfin/mach-common/dpmc_modes.S index 5e3f1d8a4fb8..838b0b2ce9a5 100644 --- a/arch/blackfin/mach-common/dpmc_modes.S +++ b/arch/blackfin/mach-common/dpmc_modes.S | |||
@@ -78,62 +78,6 @@ ENTRY(_hibernate_mode) | |||
78 | jump .Lforever; | 78 | jump .Lforever; |
79 | ENDPROC(_hibernate_mode) | 79 | ENDPROC(_hibernate_mode) |
80 | 80 | ||
81 | ENTRY(_deep_sleep) | ||
82 | [--SP] = ( R7:0, P5:0 ); | ||
83 | [--SP] = RETS; | ||
84 | |||
85 | CLI R4; | ||
86 | |||
87 | R0 = IWR_ENABLE(0); | ||
88 | R1 = IWR_DISABLE_ALL; | ||
89 | R2 = IWR_DISABLE_ALL; | ||
90 | |||
91 | call _set_sic_iwr; | ||
92 | |||
93 | call _set_dram_srfs; | ||
94 | |||
95 | /* Clear all the interrupts,bits sticky */ | ||
96 | R0 = 0xFFFF (Z); | ||
97 | call _set_rtc_istat | ||
98 | |||
99 | P0.H = hi(PLL_CTL); | ||
100 | P0.L = lo(PLL_CTL); | ||
101 | R0 = W[P0](z); | ||
102 | BITSET (R0, 5); | ||
103 | W[P0] = R0.L; | ||
104 | |||
105 | call _test_pll_locked; | ||
106 | |||
107 | SSYNC; | ||
108 | IDLE; | ||
109 | |||
110 | call _unset_dram_srfs; | ||
111 | |||
112 | call _test_pll_locked; | ||
113 | |||
114 | R0 = IWR_ENABLE(0); | ||
115 | R1 = IWR_DISABLE_ALL; | ||
116 | R2 = IWR_DISABLE_ALL; | ||
117 | |||
118 | call _set_sic_iwr; | ||
119 | |||
120 | P0.H = hi(PLL_CTL); | ||
121 | P0.L = lo(PLL_CTL); | ||
122 | R0 = w[p0](z); | ||
123 | BITCLR (R0, 3); | ||
124 | BITCLR (R0, 5); | ||
125 | BITCLR (R0, 8); | ||
126 | w[p0] = R0; | ||
127 | IDLE; | ||
128 | call _test_pll_locked; | ||
129 | |||
130 | STI R4; | ||
131 | |||
132 | RETS = [SP++]; | ||
133 | ( R7:0, P5:0 ) = [SP++]; | ||
134 | RTS; | ||
135 | ENDPROC(_deep_sleep) | ||
136 | |||
137 | ENTRY(_sleep_deeper) | 81 | ENTRY(_sleep_deeper) |
138 | [--SP] = ( R7:0, P5:0 ); | 82 | [--SP] = ( R7:0, P5:0 ); |
139 | [--SP] = RETS; | 83 | [--SP] = RETS; |
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index eceb484d90f9..117c01c2c6b0 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -158,14 +158,16 @@ ENTRY(_ex_single_step) | |||
158 | cc = r7 == r6; | 158 | cc = r7 == r6; |
159 | if cc jump _bfin_return_from_exception; | 159 | if cc jump _bfin_return_from_exception; |
160 | 160 | ||
161 | #ifdef CONFIG_KGDB | ||
161 | /* Don't do single step in hardware exception handler */ | 162 | /* Don't do single step in hardware exception handler */ |
162 | p5.l = lo(IPEND); | 163 | p5.l = lo(IPEND); |
163 | p5.h = hi(IPEND); | 164 | p5.h = hi(IPEND); |
164 | r6 = [p5]; | 165 | r6 = [p5]; |
166 | cc = bittst(r6, 4); | ||
167 | if cc jump _bfin_return_from_exception; | ||
165 | cc = bittst(r6, 5); | 168 | cc = bittst(r6, 5); |
166 | if cc jump _bfin_return_from_exception; | 169 | if cc jump _bfin_return_from_exception; |
167 | 170 | ||
168 | #ifdef CONFIG_KGDB | ||
169 | /* skip single step if current interrupt priority is higher than | 171 | /* skip single step if current interrupt priority is higher than |
170 | * that of the first instruction, from which gdb starts single step */ | 172 | * that of the first instruction, from which gdb starts single step */ |
171 | r6 >>= 6; | 173 | r6 >>= 6; |
@@ -186,17 +188,27 @@ ENTRY(_ex_single_step) | |||
186 | if cc jump .Ldo_single_step; | 188 | if cc jump .Ldo_single_step; |
187 | r6 += -1; | 189 | r6 += -1; |
188 | cc = r6 < r7; | 190 | cc = r6 < r7; |
189 | if cc jump _bfin_return_from_exception; | 191 | if cc jump 1f; |
190 | .Ldo_single_step: | 192 | .Ldo_single_step: |
191 | #endif | 193 | #else |
192 | |||
193 | /* If we were in user mode, do the single step normally. */ | 194 | /* If we were in user mode, do the single step normally. */ |
195 | p5.l = lo(IPEND); | ||
196 | p5.h = hi(IPEND); | ||
194 | r6 = [p5]; | 197 | r6 = [p5]; |
195 | r7 = 0xffe0 (z); | 198 | r7 = 0xffe0 (z); |
196 | r7 = r7 & r6; | 199 | r7 = r7 & r6; |
197 | cc = r7 == 0; | 200 | cc = r7 == 0; |
198 | if cc jump 1f; | 201 | if !cc jump 1f; |
202 | #endif | ||
199 | 203 | ||
204 | /* Single stepping only a single instruction, so clear the trace | ||
205 | * bit here. */ | ||
206 | r7 = syscfg; | ||
207 | bitclr (r7, 0); | ||
208 | syscfg = R7; | ||
209 | jump _ex_trap_c; | ||
210 | |||
211 | 1: | ||
200 | /* | 212 | /* |
201 | * We were in an interrupt handler. By convention, all of them save | 213 | * We were in an interrupt handler. By convention, all of them save |
202 | * SYSCFG with their first instruction, so by checking whether our | 214 | * SYSCFG with their first instruction, so by checking whether our |
@@ -224,15 +236,11 @@ ENTRY(_ex_single_step) | |||
224 | cc = R7 == R6; | 236 | cc = R7 == R6; |
225 | if !cc jump _bfin_return_from_exception; | 237 | if !cc jump _bfin_return_from_exception; |
226 | 238 | ||
227 | 1: | ||
228 | /* Single stepping only a single instruction, so clear the trace | ||
229 | * bit here. */ | ||
230 | r7 = syscfg; | 239 | r7 = syscfg; |
231 | bitclr (r7, 0); | 240 | bitclr (r7, 0); |
232 | syscfg = R7; | 241 | syscfg = R7; |
233 | 242 | ||
234 | jump _ex_trap_c; | 243 | /* Fall through to _bfin_return_from_exception. */ |
235 | |||
236 | ENDPROC(_ex_single_step) | 244 | ENDPROC(_ex_single_step) |
237 | 245 | ||
238 | ENTRY(_bfin_return_from_exception) | 246 | ENTRY(_bfin_return_from_exception) |
@@ -1414,6 +1422,12 @@ ENTRY(_sys_call_table) | |||
1414 | .long _sys_semtimedop | 1422 | .long _sys_semtimedop |
1415 | .long _sys_timerfd_settime | 1423 | .long _sys_timerfd_settime |
1416 | .long _sys_timerfd_gettime | 1424 | .long _sys_timerfd_gettime |
1425 | .long _sys_signalfd4 /* 360 */ | ||
1426 | .long _sys_eventfd2 | ||
1427 | .long _sys_epoll_create1 | ||
1428 | .long _sys_dup3 | ||
1429 | .long _sys_pipe2 | ||
1430 | .long _sys_inotify_init1 /* 365 */ | ||
1417 | 1431 | ||
1418 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1432 | .rept NR_syscalls-(.-_sys_call_table)/4 |
1419 | .long _sys_ni_syscall | 1433 | .long _sys_ni_syscall |
diff --git a/arch/blackfin/mach-common/head.S b/arch/blackfin/mach-common/head.S new file mode 100644 index 000000000000..191b4e974c4b --- /dev/null +++ b/arch/blackfin/mach-common/head.S | |||
@@ -0,0 +1,207 @@ | |||
1 | /* | ||
2 | * Common Blackfin startup code | ||
3 | * | ||
4 | * Copyright 2004-2008 Analog Devices Inc. | ||
5 | * | ||
6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
7 | * | ||
8 | * Licensed under the GPL-2 or later. | ||
9 | */ | ||
10 | |||
11 | #include <linux/linkage.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <asm/blackfin.h> | ||
14 | #include <asm/thread_info.h> | ||
15 | #include <asm/trace.h> | ||
16 | |||
17 | __INIT | ||
18 | |||
19 | #define INITIAL_STACK (L1_SCRATCH_START + L1_SCRATCH_LENGTH - 12) | ||
20 | |||
21 | ENTRY(__start) | ||
22 | /* R0: argument of command line string, passed from uboot, save it */ | ||
23 | R7 = R0; | ||
24 | /* Enable Cycle Counter and Nesting Of Interrupts */ | ||
25 | #ifdef CONFIG_BFIN_SCRATCH_REG_CYCLES | ||
26 | R0 = SYSCFG_SNEN; | ||
27 | #else | ||
28 | R0 = SYSCFG_SNEN | SYSCFG_CCEN; | ||
29 | #endif | ||
30 | SYSCFG = R0; | ||
31 | R0 = 0; | ||
32 | |||
33 | /* Clear Out All the data and pointer Registers */ | ||
34 | R1 = R0; | ||
35 | R2 = R0; | ||
36 | R3 = R0; | ||
37 | R4 = R0; | ||
38 | R5 = R0; | ||
39 | R6 = R0; | ||
40 | |||
41 | P0 = R0; | ||
42 | P1 = R0; | ||
43 | P2 = R0; | ||
44 | P3 = R0; | ||
45 | P4 = R0; | ||
46 | P5 = R0; | ||
47 | |||
48 | LC0 = r0; | ||
49 | LC1 = r0; | ||
50 | L0 = r0; | ||
51 | L1 = r0; | ||
52 | L2 = r0; | ||
53 | L3 = r0; | ||
54 | |||
55 | /* Clear Out All the DAG Registers */ | ||
56 | B0 = r0; | ||
57 | B1 = r0; | ||
58 | B2 = r0; | ||
59 | B3 = r0; | ||
60 | |||
61 | I0 = r0; | ||
62 | I1 = r0; | ||
63 | I2 = r0; | ||
64 | I3 = r0; | ||
65 | |||
66 | M0 = r0; | ||
67 | M1 = r0; | ||
68 | M2 = r0; | ||
69 | M3 = r0; | ||
70 | |||
71 | trace_buffer_init(p0,r0); | ||
72 | P0 = R1; | ||
73 | R0 = R1; | ||
74 | |||
75 | /* Turn off the icache */ | ||
76 | p0.l = LO(IMEM_CONTROL); | ||
77 | p0.h = HI(IMEM_CONTROL); | ||
78 | R1 = [p0]; | ||
79 | R0 = ~ENICPLB; | ||
80 | R0 = R0 & R1; | ||
81 | [p0] = R0; | ||
82 | SSYNC; | ||
83 | |||
84 | /* Turn off the dcache */ | ||
85 | p0.l = LO(DMEM_CONTROL); | ||
86 | p0.h = HI(DMEM_CONTROL); | ||
87 | R1 = [p0]; | ||
88 | R0 = ~ENDCPLB; | ||
89 | R0 = R0 & R1; | ||
90 | [p0] = R0; | ||
91 | SSYNC; | ||
92 | |||
93 | /* Save RETX, in case of doublefault */ | ||
94 | p0.l = ___retx; | ||
95 | p0.h = ___retx; | ||
96 | R0 = RETX; | ||
97 | [P0] = R0; | ||
98 | |||
99 | /* Initialize stack pointer */ | ||
100 | sp.l = lo(INITIAL_STACK); | ||
101 | sp.h = hi(INITIAL_STACK); | ||
102 | fp = sp; | ||
103 | usp = sp; | ||
104 | |||
105 | #ifdef CONFIG_EARLY_PRINTK | ||
106 | call _init_early_exception_vectors; | ||
107 | #endif | ||
108 | |||
109 | /* Put The Code for PLL Programming and SDRAM Programming in L1 ISRAM */ | ||
110 | call _bf53x_relocate_l1_mem; | ||
111 | #ifdef CONFIG_BFIN_KERNEL_CLOCK | ||
112 | call _start_dma_code; | ||
113 | #endif | ||
114 | |||
115 | /* This section keeps the processor in supervisor mode | ||
116 | * during kernel boot. Switches to user mode at end of boot. | ||
117 | * See page 3-9 of Hardware Reference manual for documentation. | ||
118 | */ | ||
119 | |||
120 | /* EVT15 = _real_start */ | ||
121 | |||
122 | p0.l = lo(EVT15); | ||
123 | p0.h = hi(EVT15); | ||
124 | p1.l = _real_start; | ||
125 | p1.h = _real_start; | ||
126 | [p0] = p1; | ||
127 | csync; | ||
128 | |||
129 | p0.l = lo(IMASK); | ||
130 | p0.h = hi(IMASK); | ||
131 | p1.l = IMASK_IVG15; | ||
132 | p1.h = 0x0; | ||
133 | [p0] = p1; | ||
134 | csync; | ||
135 | |||
136 | raise 15; | ||
137 | p0.l = .LWAIT_HERE; | ||
138 | p0.h = .LWAIT_HERE; | ||
139 | reti = p0; | ||
140 | #if ANOMALY_05000281 | ||
141 | nop; nop; nop; | ||
142 | #endif | ||
143 | rti; | ||
144 | |||
145 | .LWAIT_HERE: | ||
146 | jump .LWAIT_HERE; | ||
147 | ENDPROC(__start) | ||
148 | |||
149 | /* A little BF561 glue ... */ | ||
150 | #ifndef WDOG_CTL | ||
151 | # define WDOG_CTL WDOGA_CTL | ||
152 | #endif | ||
153 | |||
154 | ENTRY(_real_start) | ||
155 | /* Enable nested interrupts */ | ||
156 | [--sp] = reti; | ||
157 | |||
158 | /* watchdog off for now */ | ||
159 | p0.l = lo(WDOG_CTL); | ||
160 | p0.h = hi(WDOG_CTL); | ||
161 | r0 = 0xAD6(z); | ||
162 | w[p0] = r0; | ||
163 | ssync; | ||
164 | |||
165 | /* Zero out the bss region | ||
166 | * Note: this will fail if bss is 0 bytes ... | ||
167 | */ | ||
168 | r0 = 0 (z); | ||
169 | r1.l = ___bss_start; | ||
170 | r1.h = ___bss_start; | ||
171 | r2.l = ___bss_stop; | ||
172 | r2.h = ___bss_stop; | ||
173 | r2 = r2 - r1; | ||
174 | r2 >>= 2; | ||
175 | p1 = r1; | ||
176 | p2 = r2; | ||
177 | lsetup (.L_clear_bss, .L_clear_bss) lc0 = p2; | ||
178 | .L_clear_bss: | ||
179 | [p1++] = r0; | ||
180 | |||
181 | /* In case there is a NULL pointer reference, | ||
182 | * zero out region before stext | ||
183 | */ | ||
184 | p1 = r0; | ||
185 | r2.l = __stext; | ||
186 | r2.h = __stext; | ||
187 | r2 >>= 2; | ||
188 | p2 = r2; | ||
189 | lsetup (.L_clear_zero, .L_clear_zero) lc0 = p2; | ||
190 | .L_clear_zero: | ||
191 | [p1++] = r0; | ||
192 | |||
193 | /* Pass the u-boot arguments to the global value command line */ | ||
194 | R0 = R7; | ||
195 | call _cmdline_init; | ||
196 | |||
197 | /* Load the current thread pointer and stack */ | ||
198 | sp.l = _init_thread_union; | ||
199 | sp.h = _init_thread_union; | ||
200 | p1 = THREAD_SIZE (z); | ||
201 | sp = sp + p1; | ||
202 | usp = sp; | ||
203 | fp = sp; | ||
204 | jump.l _start_kernel; | ||
205 | ENDPROC(_real_start) | ||
206 | |||
207 | __FINIT | ||
diff --git a/arch/blackfin/mach-common/ints-priority.c b/arch/blackfin/mach-common/ints-priority.c index 64d746114e4b..62f8883a5c27 100644 --- a/arch/blackfin/mach-common/ints-priority.c +++ b/arch/blackfin/mach-common/ints-priority.c | |||
@@ -71,6 +71,7 @@ atomic_t num_spurious; | |||
71 | 71 | ||
72 | #ifdef CONFIG_PM | 72 | #ifdef CONFIG_PM |
73 | unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ | 73 | unsigned long bfin_sic_iwr[3]; /* Up to 3 SIC_IWRx registers */ |
74 | unsigned vr_wakeup; | ||
74 | #endif | 75 | #endif |
75 | 76 | ||
76 | struct ivgx { | 77 | struct ivgx { |
@@ -184,17 +185,56 @@ static void bfin_internal_unmask_irq(unsigned int irq) | |||
184 | #ifdef CONFIG_PM | 185 | #ifdef CONFIG_PM |
185 | int bfin_internal_set_wake(unsigned int irq, unsigned int state) | 186 | int bfin_internal_set_wake(unsigned int irq, unsigned int state) |
186 | { | 187 | { |
187 | unsigned bank, bit; | 188 | unsigned bank, bit, wakeup = 0; |
188 | unsigned long flags; | 189 | unsigned long flags; |
189 | bank = SIC_SYSIRQ(irq) / 32; | 190 | bank = SIC_SYSIRQ(irq) / 32; |
190 | bit = SIC_SYSIRQ(irq) % 32; | 191 | bit = SIC_SYSIRQ(irq) % 32; |
191 | 192 | ||
193 | switch (irq) { | ||
194 | #ifdef IRQ_RTC | ||
195 | case IRQ_RTC: | ||
196 | wakeup |= WAKE; | ||
197 | break; | ||
198 | #endif | ||
199 | #ifdef IRQ_CAN0_RX | ||
200 | case IRQ_CAN0_RX: | ||
201 | wakeup |= CANWE; | ||
202 | break; | ||
203 | #endif | ||
204 | #ifdef IRQ_CAN1_RX | ||
205 | case IRQ_CAN1_RX: | ||
206 | wakeup |= CANWE; | ||
207 | break; | ||
208 | #endif | ||
209 | #ifdef IRQ_USB_INT0 | ||
210 | case IRQ_USB_INT0: | ||
211 | wakeup |= USBWE; | ||
212 | break; | ||
213 | #endif | ||
214 | #ifdef IRQ_KEY | ||
215 | case IRQ_KEY: | ||
216 | wakeup |= KPADWE; | ||
217 | break; | ||
218 | #endif | ||
219 | #ifdef IRQ_CNT | ||
220 | case IRQ_CNT: | ||
221 | wakeup |= ROTWE; | ||
222 | break; | ||
223 | #endif | ||
224 | default: | ||
225 | break; | ||
226 | } | ||
227 | |||
192 | local_irq_save(flags); | 228 | local_irq_save(flags); |
193 | 229 | ||
194 | if (state) | 230 | if (state) { |
195 | bfin_sic_iwr[bank] |= (1 << bit); | 231 | bfin_sic_iwr[bank] |= (1 << bit); |
196 | else | 232 | vr_wakeup |= wakeup; |
233 | |||
234 | } else { | ||
197 | bfin_sic_iwr[bank] &= ~(1 << bit); | 235 | bfin_sic_iwr[bank] &= ~(1 << bit); |
236 | vr_wakeup &= ~wakeup; | ||
237 | } | ||
198 | 238 | ||
199 | local_irq_restore(flags); | 239 | local_irq_restore(flags); |
200 | 240 | ||
@@ -943,6 +983,11 @@ int __init init_arch_irq(void) | |||
943 | 983 | ||
944 | local_irq_disable(); | 984 | local_irq_disable(); |
945 | 985 | ||
986 | #if defined(CONFIG_BF527) || defined(CONFIG_BF536) || defined(CONFIG_BF537) | ||
987 | /* Clear EMAC Interrupt Status bits so we can demux it later */ | ||
988 | bfin_write_EMAC_SYSTAT(-1); | ||
989 | #endif | ||
990 | |||
946 | #ifdef CONFIG_BF54x | 991 | #ifdef CONFIG_BF54x |
947 | # ifdef CONFIG_PINTx_REASSIGN | 992 | # ifdef CONFIG_PINTx_REASSIGN |
948 | pint[0]->assign = CONFIG_PINT0_ASSIGN; | 993 | pint[0]->assign = CONFIG_PINT0_ASSIGN; |
@@ -1028,13 +1073,22 @@ int __init init_arch_irq(void) | |||
1028 | IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW; | 1073 | IMASK_IVG10 | IMASK_IVG9 | IMASK_IVG8 | IMASK_IVG7 | IMASK_IVGHW; |
1029 | 1074 | ||
1030 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | 1075 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) |
1031 | bfin_write_SIC_IWR0(IWR_ENABLE_ALL); | 1076 | bfin_write_SIC_IWR0(IWR_DISABLE_ALL); |
1032 | bfin_write_SIC_IWR1(IWR_ENABLE_ALL); | 1077 | #if defined(CONFIG_BF52x) |
1078 | /* BF52x system reset does not properly reset SIC_IWR1 which | ||
1079 | * will screw up the bootrom as it relies on MDMA0/1 waking it | ||
1080 | * up from IDLE instructions. See this report for more info: | ||
1081 | * http://blackfin.uclinux.org/gf/tracker/4323 | ||
1082 | */ | ||
1083 | bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11)); | ||
1084 | #else | ||
1085 | bfin_write_SIC_IWR1(IWR_DISABLE_ALL); | ||
1086 | #endif | ||
1033 | # ifdef CONFIG_BF54x | 1087 | # ifdef CONFIG_BF54x |
1034 | bfin_write_SIC_IWR2(IWR_ENABLE_ALL); | 1088 | bfin_write_SIC_IWR2(IWR_DISABLE_ALL); |
1035 | # endif | 1089 | # endif |
1036 | #else | 1090 | #else |
1037 | bfin_write_SIC_IWR(IWR_ENABLE_ALL); | 1091 | bfin_write_SIC_IWR(IWR_DISABLE_ALL); |
1038 | #endif | 1092 | #endif |
1039 | 1093 | ||
1040 | return 0; | 1094 | return 0; |
diff --git a/arch/blackfin/mach-common/lock.S b/arch/blackfin/mach-common/lock.S index 30b887e67dd6..9daf01201e9f 100644 --- a/arch/blackfin/mach-common/lock.S +++ b/arch/blackfin/mach-common/lock.S | |||
@@ -28,13 +28,10 @@ | |||
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
31 | #include <asm/cplb.h> | ||
32 | #include <asm/blackfin.h> | 31 | #include <asm/blackfin.h> |
33 | 32 | ||
34 | .text | 33 | .text |
35 | 34 | ||
36 | #ifdef CONFIG_BFIN_ICACHE_LOCK | ||
37 | |||
38 | /* When you come here, it is assumed that | 35 | /* When you come here, it is assumed that |
39 | * R0 - Which way to be locked | 36 | * R0 - Which way to be locked |
40 | */ | 37 | */ |
@@ -189,18 +186,38 @@ ENTRY(_cache_lock) | |||
189 | RTS; | 186 | RTS; |
190 | ENDPROC(_cache_lock) | 187 | ENDPROC(_cache_lock) |
191 | 188 | ||
192 | #endif /* BFIN_ICACHE_LOCK */ | 189 | /* Invalidate the Entire Instruction cache by |
193 | 190 | * disabling IMC bit | |
194 | /* Return the ILOC bits of IMEM_CONTROL | ||
195 | */ | 191 | */ |
192 | ENTRY(_invalidate_entire_icache) | ||
193 | [--SP] = ( R7:5); | ||
196 | 194 | ||
197 | ENTRY(_read_iloc) | 195 | P0.L = LO(IMEM_CONTROL); |
198 | P1.H = HI(IMEM_CONTROL); | 196 | P0.H = HI(IMEM_CONTROL); |
199 | P1.L = LO(IMEM_CONTROL); | 197 | R7 = [P0]; |
200 | R1 = 0xF; | 198 | |
201 | R0 = [P1]; | 199 | /* Clear the IMC bit , All valid bits in the instruction |
202 | R0 = R0 >> 3; | 200 | * cache are set to the invalid state |
203 | R0 = R0 & R1; | 201 | */ |
202 | BITCLR(R7,IMC_P); | ||
203 | CLI R6; | ||
204 | SSYNC; /* SSYNC required before invalidating cache. */ | ||
205 | .align 8; | ||
206 | [P0] = R7; | ||
207 | SSYNC; | ||
208 | STI R6; | ||
209 | |||
210 | /* Configures the instruction cache agian */ | ||
211 | R6 = (IMC | ENICPLB); | ||
212 | R7 = R7 | R6; | ||
213 | |||
214 | CLI R6; | ||
215 | SSYNC; /* SSYNC required before writing to IMEM_CONTROL. */ | ||
216 | .align 8; | ||
217 | [P0] = R7; | ||
218 | SSYNC; | ||
219 | STI R6; | ||
204 | 220 | ||
221 | ( R7:5) = [SP++]; | ||
205 | RTS; | 222 | RTS; |
206 | ENDPROC(_read_iloc) | 223 | ENDPROC(_invalidate_entire_icache) |
diff --git a/arch/blackfin/mach-common/pm.c b/arch/blackfin/mach-common/pm.c index 4fe6a2366b13..e28c6af1f415 100644 --- a/arch/blackfin/mach-common/pm.c +++ b/arch/blackfin/mach-common/pm.c | |||
@@ -83,13 +83,22 @@ void bfin_pm_suspend_standby_enter(void) | |||
83 | bfin_pm_standby_restore(); | 83 | bfin_pm_standby_restore(); |
84 | 84 | ||
85 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) | 85 | #if defined(CONFIG_BF54x) || defined(CONFIG_BF52x) || defined(CONFIG_BF561) |
86 | bfin_write_SIC_IWR0(IWR_ENABLE_ALL); | 86 | bfin_write_SIC_IWR0(IWR_DISABLE_ALL); |
87 | bfin_write_SIC_IWR1(IWR_ENABLE_ALL); | 87 | #if defined(CONFIG_BF52x) |
88 | /* BF52x system reset does not properly reset SIC_IWR1 which | ||
89 | * will screw up the bootrom as it relies on MDMA0/1 waking it | ||
90 | * up from IDLE instructions. See this report for more info: | ||
91 | * http://blackfin.uclinux.org/gf/tracker/4323 | ||
92 | */ | ||
93 | bfin_write_SIC_IWR1(IWR_ENABLE(10) | IWR_ENABLE(11)); | ||
94 | #else | ||
95 | bfin_write_SIC_IWR1(IWR_DISABLE_ALL); | ||
96 | #endif | ||
88 | # ifdef CONFIG_BF54x | 97 | # ifdef CONFIG_BF54x |
89 | bfin_write_SIC_IWR2(IWR_ENABLE_ALL); | 98 | bfin_write_SIC_IWR2(IWR_DISABLE_ALL); |
90 | # endif | 99 | # endif |
91 | #else | 100 | #else |
92 | bfin_write_SIC_IWR(IWR_ENABLE_ALL); | 101 | bfin_write_SIC_IWR(IWR_DISABLE_ALL); |
93 | #endif | 102 | #endif |
94 | 103 | ||
95 | local_irq_restore(flags); | 104 | local_irq_restore(flags); |
@@ -229,28 +238,12 @@ int bfin_pm_suspend_mem_enter(void) | |||
229 | wakeup = bfin_read_VR_CTL() & ~FREQ; | 238 | wakeup = bfin_read_VR_CTL() & ~FREQ; |
230 | wakeup |= SCKELOW; | 239 | wakeup |= SCKELOW; |
231 | 240 | ||
232 | /* FIXME: merge this somehow with set_irq_wake */ | ||
233 | #ifdef CONFIG_PM_BFIN_WAKE_RTC | ||
234 | wakeup |= WAKE; | ||
235 | #endif | ||
236 | #ifdef CONFIG_PM_BFIN_WAKE_PH6 | 241 | #ifdef CONFIG_PM_BFIN_WAKE_PH6 |
237 | wakeup |= PHYWE; | 242 | wakeup |= PHYWE; |
238 | #endif | 243 | #endif |
239 | #ifdef CONFIG_PM_BFIN_WAKE_CAN | ||
240 | wakeup |= CANWE; | ||
241 | #endif | ||
242 | #ifdef CONFIG_PM_BFIN_WAKE_GP | 244 | #ifdef CONFIG_PM_BFIN_WAKE_GP |
243 | wakeup |= GPWE; | 245 | wakeup |= GPWE; |
244 | #endif | 246 | #endif |
245 | #ifdef CONFIG_PM_BFIN_WAKE_USB | ||
246 | wakeup |= USBWE; | ||
247 | #endif | ||
248 | #ifdef CONFIG_PM_BFIN_WAKE_KEYPAD | ||
249 | wakeup |= KPADWE; | ||
250 | #endif | ||
251 | #ifdef CONFIG_PM_BFIN_WAKE_ROTARY | ||
252 | wakeup |= ROTWE; | ||
253 | #endif | ||
254 | 247 | ||
255 | local_irq_save(flags); | 248 | local_irq_save(flags); |
256 | 249 | ||
@@ -268,7 +261,7 @@ int bfin_pm_suspend_mem_enter(void) | |||
268 | icache_disable(); | 261 | icache_disable(); |
269 | bf53x_suspend_l1_mem(memptr); | 262 | bf53x_suspend_l1_mem(memptr); |
270 | 263 | ||
271 | do_hibernate(wakeup); /* Goodbye */ | 264 | do_hibernate(wakeup | vr_wakeup); /* Goodbye */ |
272 | 265 | ||
273 | bf53x_resume_l1_mem(memptr); | 266 | bf53x_resume_l1_mem(memptr); |
274 | 267 | ||
diff --git a/arch/blackfin/mm/blackfin_sram.c b/arch/blackfin/mm/blackfin_sram.c index 5af3c31c9365..9d2be43ac3da 100644 --- a/arch/blackfin/mm/blackfin_sram.c +++ b/arch/blackfin/mm/blackfin_sram.c | |||
@@ -66,7 +66,7 @@ static struct sram_piece free_l1_data_B_sram_head, used_l1_data_B_sram_head; | |||
66 | static struct sram_piece free_l1_inst_sram_head, used_l1_inst_sram_head; | 66 | static struct sram_piece free_l1_inst_sram_head, used_l1_inst_sram_head; |
67 | #endif | 67 | #endif |
68 | 68 | ||
69 | #ifdef L2_LENGTH | 69 | #if L2_LENGTH != 0 |
70 | static struct sram_piece free_l2_sram_head, used_l2_sram_head; | 70 | static struct sram_piece free_l2_sram_head, used_l2_sram_head; |
71 | #endif | 71 | #endif |
72 | 72 | ||
@@ -175,7 +175,7 @@ static void __init l1_inst_sram_init(void) | |||
175 | 175 | ||
176 | static void __init l2_sram_init(void) | 176 | static void __init l2_sram_init(void) |
177 | { | 177 | { |
178 | #ifdef L2_LENGTH | 178 | #if L2_LENGTH != 0 |
179 | free_l2_sram_head.next = | 179 | free_l2_sram_head.next = |
180 | kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); | 180 | kmem_cache_alloc(sram_piece_cache, GFP_KERNEL); |
181 | if (!free_l2_sram_head.next) { | 181 | if (!free_l2_sram_head.next) { |
@@ -367,7 +367,7 @@ int sram_free(const void *addr) | |||
367 | && addr < (void *)(L1_DATA_B_START + L1_DATA_B_LENGTH)) | 367 | && addr < (void *)(L1_DATA_B_START + L1_DATA_B_LENGTH)) |
368 | return l1_data_B_sram_free(addr); | 368 | return l1_data_B_sram_free(addr); |
369 | #endif | 369 | #endif |
370 | #ifdef L2_LENGTH | 370 | #if L2_LENGTH != 0 |
371 | else if (addr >= (void *)L2_START | 371 | else if (addr >= (void *)L2_START |
372 | && addr < (void *)(L2_START + L2_LENGTH)) | 372 | && addr < (void *)(L2_START + L2_LENGTH)) |
373 | return l2_sram_free(addr); | 373 | return l2_sram_free(addr); |
@@ -604,7 +604,7 @@ int l1sram_free(const void *addr) | |||
604 | 604 | ||
605 | void *l2_sram_alloc(size_t size) | 605 | void *l2_sram_alloc(size_t size) |
606 | { | 606 | { |
607 | #ifdef L2_LENGTH | 607 | #if L2_LENGTH != 0 |
608 | unsigned flags; | 608 | unsigned flags; |
609 | void *addr; | 609 | void *addr; |
610 | 610 | ||
@@ -640,7 +640,7 @@ EXPORT_SYMBOL(l2_sram_zalloc); | |||
640 | 640 | ||
641 | int l2_sram_free(const void *addr) | 641 | int l2_sram_free(const void *addr) |
642 | { | 642 | { |
643 | #ifdef L2_LENGTH | 643 | #if L2_LENGTH != 0 |
644 | unsigned flags; | 644 | unsigned flags; |
645 | int ret; | 645 | int ret; |
646 | 646 | ||
@@ -779,7 +779,7 @@ static int sram_proc_read(char *buf, char **start, off_t offset, int count, | |||
779 | &free_l1_inst_sram_head, &used_l1_inst_sram_head)) | 779 | &free_l1_inst_sram_head, &used_l1_inst_sram_head)) |
780 | goto not_done; | 780 | goto not_done; |
781 | #endif | 781 | #endif |
782 | #ifdef L2_LENGTH | 782 | #if L2_LENGTH != 0 |
783 | if (_sram_proc_read(buf, &len, count, "L2", | 783 | if (_sram_proc_read(buf, &len, count, "L2", |
784 | &free_l2_sram_head, &used_l2_sram_head)) | 784 | &free_l2_sram_head, &used_l2_sram_head)) |
785 | goto not_done; | 785 | goto not_done; |
diff --git a/arch/cris/arch-v32/kernel/fasttimer.c b/arch/cris/arch-v32/kernel/fasttimer.c index 2de9d5849ef0..111caa1a2efb 100644 --- a/arch/cris/arch-v32/kernel/fasttimer.c +++ b/arch/cris/arch-v32/kernel/fasttimer.c | |||
@@ -19,8 +19,6 @@ | |||
19 | #include <asm/irq.h> | 19 | #include <asm/irq.h> |
20 | #include <asm/system.h> | 20 | #include <asm/system.h> |
21 | 21 | ||
22 | #include <linux/version.h> | ||
23 | |||
24 | #include <hwregs/reg_map.h> | 22 | #include <hwregs/reg_map.h> |
25 | #include <hwregs/reg_rdwr.h> | 23 | #include <hwregs/reg_rdwr.h> |
26 | #include <hwregs/timer_defs.h> | 24 | #include <hwregs/timer_defs.h> |
diff --git a/arch/ia64/configs/sn2_defconfig b/arch/ia64/configs/sn2_defconfig deleted file mode 100644 index 7f6b2377d13f..000000000000 --- a/arch/ia64/configs/sn2_defconfig +++ /dev/null | |||
@@ -1,1285 +0,0 @@ | |||
1 | # | ||
2 | # Automatically generated make config: don't edit | ||
3 | # Linux kernel version: 2.6.23 | ||
4 | # Thu Oct 18 16:03:40 2007 | ||
5 | # | ||
6 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | ||
7 | |||
8 | # | ||
9 | # General setup | ||
10 | # | ||
11 | CONFIG_EXPERIMENTAL=y | ||
12 | CONFIG_LOCK_KERNEL=y | ||
13 | CONFIG_INIT_ENV_ARG_LIMIT=32 | ||
14 | CONFIG_LOCALVERSION="" | ||
15 | # CONFIG_LOCALVERSION_AUTO is not set | ||
16 | CONFIG_SWAP=y | ||
17 | CONFIG_SYSVIPC=y | ||
18 | CONFIG_SYSVIPC_SYSCTL=y | ||
19 | CONFIG_POSIX_MQUEUE=y | ||
20 | # CONFIG_BSD_PROCESS_ACCT is not set | ||
21 | CONFIG_TASKSTATS=y | ||
22 | # CONFIG_TASK_DELAY_ACCT is not set | ||
23 | CONFIG_TASK_XACCT=y | ||
24 | CONFIG_TASK_IO_ACCOUNTING=y | ||
25 | # CONFIG_USER_NS is not set | ||
26 | # CONFIG_AUDIT is not set | ||
27 | # CONFIG_IKCONFIG is not set | ||
28 | CONFIG_LOG_BUF_SHIFT=20 | ||
29 | CONFIG_CGROUPS=y | ||
30 | CONFIG_CPUSETS=y | ||
31 | CONFIG_FAIR_GROUP_SCHED=y | ||
32 | CONFIG_FAIR_USER_SCHED=y | ||
33 | CONFIG_SYSFS_DEPRECATED=y | ||
34 | CONFIG_RELAY=y | ||
35 | CONFIG_BLK_DEV_INITRD=y | ||
36 | CONFIG_INITRAMFS_SOURCE="" | ||
37 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
38 | CONFIG_SYSCTL=y | ||
39 | # CONFIG_EMBEDDED is not set | ||
40 | CONFIG_SYSCTL_SYSCALL=y | ||
41 | CONFIG_KALLSYMS=y | ||
42 | CONFIG_KALLSYMS_ALL=y | ||
43 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | ||
44 | CONFIG_HOTPLUG=y | ||
45 | CONFIG_PRINTK=y | ||
46 | CONFIG_BUG=y | ||
47 | CONFIG_ELF_CORE=y | ||
48 | CONFIG_BASE_FULL=y | ||
49 | CONFIG_FUTEX=y | ||
50 | CONFIG_ANON_INODES=y | ||
51 | CONFIG_EPOLL=y | ||
52 | CONFIG_SIGNALFD=y | ||
53 | CONFIG_EVENTFD=y | ||
54 | CONFIG_SHMEM=y | ||
55 | CONFIG_VM_EVENT_COUNTERS=y | ||
56 | CONFIG_SLUB_DEBUG=y | ||
57 | # CONFIG_SLAB is not set | ||
58 | CONFIG_SLUB=y | ||
59 | # CONFIG_SLOB is not set | ||
60 | CONFIG_RT_MUTEXES=y | ||
61 | # CONFIG_TINY_SHMEM is not set | ||
62 | CONFIG_BASE_SMALL=0 | ||
63 | CONFIG_MODULES=y | ||
64 | CONFIG_MODULE_UNLOAD=y | ||
65 | # CONFIG_MODULE_FORCE_UNLOAD is not set | ||
66 | # CONFIG_MODVERSIONS is not set | ||
67 | # CONFIG_MODULE_SRCVERSION_ALL is not set | ||
68 | CONFIG_KMOD=y | ||
69 | CONFIG_STOP_MACHINE=y | ||
70 | CONFIG_BLOCK=y | ||
71 | # CONFIG_BLK_DEV_IO_TRACE is not set | ||
72 | CONFIG_BLK_DEV_BSG=y | ||
73 | CONFIG_BLOCK_COMPAT=y | ||
74 | |||
75 | # | ||
76 | # IO Schedulers | ||
77 | # | ||
78 | CONFIG_IOSCHED_NOOP=y | ||
79 | CONFIG_IOSCHED_AS=y | ||
80 | CONFIG_IOSCHED_DEADLINE=y | ||
81 | CONFIG_IOSCHED_CFQ=y | ||
82 | CONFIG_DEFAULT_AS=y | ||
83 | # CONFIG_DEFAULT_DEADLINE is not set | ||
84 | # CONFIG_DEFAULT_CFQ is not set | ||
85 | # CONFIG_DEFAULT_NOOP is not set | ||
86 | CONFIG_DEFAULT_IOSCHED="anticipatory" | ||
87 | |||
88 | # | ||
89 | # Processor type and features | ||
90 | # | ||
91 | CONFIG_IA64=y | ||
92 | CONFIG_64BIT=y | ||
93 | CONFIG_QUICKLIST=y | ||
94 | CONFIG_MMU=y | ||
95 | CONFIG_RWSEM_XCHGADD_ALGORITHM=y | ||
96 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||
97 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||
98 | CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y | ||
99 | CONFIG_GENERIC_FIND_NEXT_BIT=y | ||
100 | CONFIG_GENERIC_CALIBRATE_DELAY=y | ||
101 | CONFIG_GENERIC_TIME=y | ||
102 | CONFIG_GENERIC_TIME_VSYSCALL=y | ||
103 | CONFIG_DMI=y | ||
104 | CONFIG_EFI=y | ||
105 | CONFIG_GENERIC_IOMAP=y | ||
106 | CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y | ||
107 | CONFIG_IA64_UNCACHED_ALLOCATOR=y | ||
108 | CONFIG_AUDIT_ARCH=y | ||
109 | # CONFIG_IA64_GENERIC is not set | ||
110 | # CONFIG_IA64_DIG is not set | ||
111 | # CONFIG_IA64_HP_ZX1 is not set | ||
112 | # CONFIG_IA64_HP_ZX1_SWIOTLB is not set | ||
113 | CONFIG_IA64_SGI_SN2=y | ||
114 | # CONFIG_IA64_HP_SIM is not set | ||
115 | # CONFIG_ITANIUM is not set | ||
116 | CONFIG_MCKINLEY=y | ||
117 | # CONFIG_IA64_PAGE_SIZE_4KB is not set | ||
118 | # CONFIG_IA64_PAGE_SIZE_8KB is not set | ||
119 | # CONFIG_IA64_PAGE_SIZE_16KB is not set | ||
120 | CONFIG_IA64_PAGE_SIZE_64KB=y | ||
121 | CONFIG_PGTABLE_3=y | ||
122 | # CONFIG_PGTABLE_4 is not set | ||
123 | # CONFIG_HZ_100 is not set | ||
124 | CONFIG_HZ_250=y | ||
125 | # CONFIG_HZ_300 is not set | ||
126 | # CONFIG_HZ_1000 is not set | ||
127 | CONFIG_HZ=250 | ||
128 | CONFIG_IA64_L1_CACHE_SHIFT=7 | ||
129 | # CONFIG_IA64_CYCLONE is not set | ||
130 | CONFIG_IOSAPIC=y | ||
131 | CONFIG_IA64_SGI_SN_XP=m | ||
132 | CONFIG_FORCE_MAX_ZONEORDER=17 | ||
133 | CONFIG_SMP=y | ||
134 | CONFIG_NR_CPUS=1024 | ||
135 | # CONFIG_HOTPLUG_CPU is not set | ||
136 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
137 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
138 | CONFIG_SCHED_SMT=y | ||
139 | CONFIG_PREEMPT_NONE=y | ||
140 | # CONFIG_PREEMPT_VOLUNTARY is not set | ||
141 | # CONFIG_PREEMPT is not set | ||
142 | CONFIG_PREEMPT_BKL=y | ||
143 | CONFIG_SELECT_MEMORY_MODEL=y | ||
144 | # CONFIG_FLATMEM_MANUAL is not set | ||
145 | CONFIG_DISCONTIGMEM_MANUAL=y | ||
146 | # CONFIG_SPARSEMEM_MANUAL is not set | ||
147 | CONFIG_DISCONTIGMEM=y | ||
148 | CONFIG_FLAT_NODE_MEM_MAP=y | ||
149 | CONFIG_NEED_MULTIPLE_NODES=y | ||
150 | # CONFIG_SPARSEMEM_STATIC is not set | ||
151 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | ||
152 | CONFIG_SPLIT_PTLOCK_CPUS=4 | ||
153 | CONFIG_MIGRATION=y | ||
154 | CONFIG_RESOURCES_64BIT=y | ||
155 | CONFIG_ZONE_DMA_FLAG=0 | ||
156 | CONFIG_NR_QUICK=1 | ||
157 | CONFIG_VIRT_TO_BUS=y | ||
158 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | ||
159 | CONFIG_ARCH_DISCONTIGMEM_ENABLE=y | ||
160 | CONFIG_ARCH_FLATMEM_ENABLE=y | ||
161 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | ||
162 | CONFIG_ARCH_DISCONTIGMEM_DEFAULT=y | ||
163 | CONFIG_NUMA=y | ||
164 | CONFIG_NODES_SHIFT=10 | ||
165 | CONFIG_ARCH_POPULATES_NODE_MAP=y | ||
166 | CONFIG_VIRTUAL_MEM_MAP=y | ||
167 | CONFIG_HOLES_IN_ZONE=y | ||
168 | CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID=y | ||
169 | CONFIG_HAVE_ARCH_NODEDATA_EXTENSION=y | ||
170 | CONFIG_IA32_SUPPORT=y | ||
171 | CONFIG_COMPAT=y | ||
172 | CONFIG_COMPAT_FOR_U64_ALIGNMENT=y | ||
173 | CONFIG_IA64_MCA_RECOVERY=y | ||
174 | CONFIG_PERFMON=y | ||
175 | CONFIG_IA64_PALINFO=y | ||
176 | CONFIG_IA64_MC_ERR_INJECT=y | ||
177 | CONFIG_SGI_SN=y | ||
178 | # CONFIG_IA64_ESI is not set | ||
179 | # CONFIG_IA64_HP_AML_NFW is not set | ||
180 | |||
181 | # | ||
182 | # SN Devices | ||
183 | # | ||
184 | CONFIG_SGI_IOC3=y | ||
185 | |||
186 | # | ||
187 | # Firmware Drivers | ||
188 | # | ||
189 | CONFIG_EFI_VARS=y | ||
190 | CONFIG_EFI_PCDP=y | ||
191 | CONFIG_DMIID=y | ||
192 | CONFIG_BINFMT_ELF=y | ||
193 | # CONFIG_BINFMT_MISC is not set | ||
194 | |||
195 | # | ||
196 | # Power management and ACPI | ||
197 | # | ||
198 | CONFIG_PM=y | ||
199 | # CONFIG_PM_LEGACY is not set | ||
200 | # CONFIG_PM_DEBUG is not set | ||
201 | CONFIG_ACPI=y | ||
202 | # CONFIG_ACPI_PROCFS is not set | ||
203 | CONFIG_ACPI_PROC_EVENT=y | ||
204 | # CONFIG_ACPI_BUTTON is not set | ||
205 | # CONFIG_ACPI_FAN is not set | ||
206 | # CONFIG_ACPI_DOCK is not set | ||
207 | # CONFIG_ACPI_PROCESSOR is not set | ||
208 | CONFIG_ACPI_NUMA=y | ||
209 | CONFIG_ACPI_BLACKLIST_YEAR=0 | ||
210 | # CONFIG_ACPI_DEBUG is not set | ||
211 | CONFIG_ACPI_EC=y | ||
212 | CONFIG_ACPI_POWER=y | ||
213 | CONFIG_ACPI_SYSTEM=y | ||
214 | # CONFIG_ACPI_CONTAINER is not set | ||
215 | |||
216 | # | ||
217 | # CPU Frequency scaling | ||
218 | # | ||
219 | # CONFIG_CPU_FREQ is not set | ||
220 | |||
221 | # | ||
222 | # Bus options (PCI, PCMCIA) | ||
223 | # | ||
224 | CONFIG_PCI=y | ||
225 | CONFIG_PCI_DOMAINS=y | ||
226 | CONFIG_PCI_SYSCALL=y | ||
227 | CONFIG_PCIEPORTBUS=y | ||
228 | CONFIG_HOTPLUG_PCI_PCIE=y | ||
229 | CONFIG_PCIEAER=y | ||
230 | CONFIG_ARCH_SUPPORTS_MSI=y | ||
231 | # CONFIG_PCI_MSI is not set | ||
232 | # CONFIG_PCI_DEBUG is not set | ||
233 | CONFIG_HOTPLUG_PCI=y | ||
234 | # CONFIG_HOTPLUG_PCI_FAKE is not set | ||
235 | # CONFIG_HOTPLUG_PCI_ACPI is not set | ||
236 | # CONFIG_HOTPLUG_PCI_CPCI is not set | ||
237 | # CONFIG_HOTPLUG_PCI_SHPC is not set | ||
238 | CONFIG_HOTPLUG_PCI_SGI=y | ||
239 | # CONFIG_PCCARD is not set | ||
240 | |||
241 | # | ||
242 | # Networking | ||
243 | # | ||
244 | CONFIG_NET=y | ||
245 | |||
246 | # | ||
247 | # Networking options | ||
248 | # | ||
249 | CONFIG_PACKET=y | ||
250 | CONFIG_PACKET_MMAP=y | ||
251 | CONFIG_UNIX=y | ||
252 | CONFIG_XFRM=y | ||
253 | # CONFIG_XFRM_USER is not set | ||
254 | # CONFIG_XFRM_SUB_POLICY is not set | ||
255 | # CONFIG_XFRM_MIGRATE is not set | ||
256 | # CONFIG_NET_KEY is not set | ||
257 | CONFIG_INET=y | ||
258 | CONFIG_IP_MULTICAST=y | ||
259 | # CONFIG_IP_ADVANCED_ROUTER is not set | ||
260 | CONFIG_IP_FIB_HASH=y | ||
261 | # CONFIG_IP_PNP is not set | ||
262 | # CONFIG_NET_IPIP is not set | ||
263 | # CONFIG_NET_IPGRE is not set | ||
264 | # CONFIG_IP_MROUTE is not set | ||
265 | # CONFIG_ARPD is not set | ||
266 | CONFIG_SYN_COOKIES=y | ||
267 | # CONFIG_INET_AH is not set | ||
268 | # CONFIG_INET_ESP is not set | ||
269 | # CONFIG_INET_IPCOMP is not set | ||
270 | # CONFIG_INET_XFRM_TUNNEL is not set | ||
271 | CONFIG_INET_TUNNEL=m | ||
272 | CONFIG_INET_XFRM_MODE_TRANSPORT=y | ||
273 | CONFIG_INET_XFRM_MODE_TUNNEL=y | ||
274 | CONFIG_INET_XFRM_MODE_BEET=y | ||
275 | CONFIG_INET_LRO=y | ||
276 | CONFIG_INET_DIAG=m | ||
277 | CONFIG_INET_TCP_DIAG=m | ||
278 | # CONFIG_TCP_CONG_ADVANCED is not set | ||
279 | CONFIG_TCP_CONG_CUBIC=y | ||
280 | CONFIG_DEFAULT_TCP_CONG="cubic" | ||
281 | # CONFIG_TCP_MD5SIG is not set | ||
282 | CONFIG_IPV6=m | ||
283 | # CONFIG_IPV6_PRIVACY is not set | ||
284 | # CONFIG_IPV6_ROUTER_PREF is not set | ||
285 | # CONFIG_IPV6_OPTIMISTIC_DAD is not set | ||
286 | # CONFIG_INET6_AH is not set | ||
287 | # CONFIG_INET6_ESP is not set | ||
288 | # CONFIG_INET6_IPCOMP is not set | ||
289 | # CONFIG_IPV6_MIP6 is not set | ||
290 | # CONFIG_INET6_XFRM_TUNNEL is not set | ||
291 | # CONFIG_INET6_TUNNEL is not set | ||
292 | CONFIG_INET6_XFRM_MODE_TRANSPORT=m | ||
293 | CONFIG_INET6_XFRM_MODE_TUNNEL=m | ||
294 | CONFIG_INET6_XFRM_MODE_BEET=m | ||
295 | # CONFIG_INET6_XFRM_MODE_ROUTEOPTIMIZATION is not set | ||
296 | CONFIG_IPV6_SIT=m | ||
297 | # CONFIG_IPV6_TUNNEL is not set | ||
298 | # CONFIG_IPV6_MULTIPLE_TABLES is not set | ||
299 | # CONFIG_NETWORK_SECMARK is not set | ||
300 | # CONFIG_NETFILTER is not set | ||
301 | # CONFIG_IP_DCCP is not set | ||
302 | # CONFIG_IP_SCTP is not set | ||
303 | # CONFIG_TIPC is not set | ||
304 | # CONFIG_ATM is not set | ||
305 | # CONFIG_BRIDGE is not set | ||
306 | # CONFIG_VLAN_8021Q is not set | ||
307 | # CONFIG_DECNET is not set | ||
308 | # CONFIG_LLC2 is not set | ||
309 | # CONFIG_IPX is not set | ||
310 | # CONFIG_ATALK is not set | ||
311 | # CONFIG_X25 is not set | ||
312 | # CONFIG_LAPB is not set | ||
313 | # CONFIG_ECONET is not set | ||
314 | # CONFIG_WAN_ROUTER is not set | ||
315 | |||
316 | # | ||
317 | # QoS and/or fair queueing | ||
318 | # | ||
319 | # CONFIG_NET_SCHED is not set | ||
320 | |||
321 | # | ||
322 | # Network testing | ||
323 | # | ||
324 | # CONFIG_NET_PKTGEN is not set | ||
325 | # CONFIG_HAMRADIO is not set | ||
326 | # CONFIG_IRDA is not set | ||
327 | # CONFIG_BT is not set | ||
328 | # CONFIG_AF_RXRPC is not set | ||
329 | |||
330 | # | ||
331 | # Wireless | ||
332 | # | ||
333 | # CONFIG_CFG80211 is not set | ||
334 | # CONFIG_WIRELESS_EXT is not set | ||
335 | # CONFIG_MAC80211 is not set | ||
336 | # CONFIG_IEEE80211 is not set | ||
337 | # CONFIG_RFKILL is not set | ||
338 | # CONFIG_NET_9P is not set | ||
339 | |||
340 | # | ||
341 | # Device Drivers | ||
342 | # | ||
343 | |||
344 | # | ||
345 | # Generic Driver Options | ||
346 | # | ||
347 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
348 | CONFIG_STANDALONE=y | ||
349 | CONFIG_PREVENT_FIRMWARE_BUILD=y | ||
350 | CONFIG_FW_LOADER=y | ||
351 | # CONFIG_DEBUG_DRIVER is not set | ||
352 | # CONFIG_DEBUG_DEVRES is not set | ||
353 | # CONFIG_SYS_HYPERVISOR is not set | ||
354 | # CONFIG_CONNECTOR is not set | ||
355 | # CONFIG_MTD is not set | ||
356 | # CONFIG_PARPORT is not set | ||
357 | CONFIG_PNP=y | ||
358 | # CONFIG_PNP_DEBUG is not set | ||
359 | |||
360 | # | ||
361 | # Protocols | ||
362 | # | ||
363 | CONFIG_PNPACPI=y | ||
364 | CONFIG_BLK_DEV=y | ||
365 | # CONFIG_BLK_CPQ_DA is not set | ||
366 | # CONFIG_BLK_CPQ_CISS_DA is not set | ||
367 | # CONFIG_BLK_DEV_DAC960 is not set | ||
368 | # CONFIG_BLK_DEV_UMEM is not set | ||
369 | # CONFIG_BLK_DEV_COW_COMMON is not set | ||
370 | CONFIG_BLK_DEV_LOOP=y | ||
371 | CONFIG_BLK_DEV_CRYPTOLOOP=m | ||
372 | CONFIG_BLK_DEV_NBD=m | ||
373 | # CONFIG_BLK_DEV_SX8 is not set | ||
374 | # CONFIG_BLK_DEV_UB is not set | ||
375 | CONFIG_BLK_DEV_RAM=y | ||
376 | CONFIG_BLK_DEV_RAM_COUNT=16 | ||
377 | CONFIG_BLK_DEV_RAM_SIZE=4096 | ||
378 | CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024 | ||
379 | # CONFIG_CDROM_PKTCDVD is not set | ||
380 | CONFIG_ATA_OVER_ETH=m | ||
381 | CONFIG_MISC_DEVICES=y | ||
382 | # CONFIG_PHANTOM is not set | ||
383 | # CONFIG_EEPROM_93CX6 is not set | ||
384 | CONFIG_SGI_IOC4=y | ||
385 | # CONFIG_TIFM_CORE is not set | ||
386 | CONFIG_IDE=y | ||
387 | CONFIG_IDE_MAX_HWIFS=4 | ||
388 | CONFIG_BLK_DEV_IDE=y | ||
389 | |||
390 | # | ||
391 | # Please see Documentation/ide.txt for help/info on IDE drives | ||
392 | # | ||
393 | # CONFIG_BLK_DEV_IDE_SATA is not set | ||
394 | CONFIG_BLK_DEV_IDEDISK=y | ||
395 | # CONFIG_IDEDISK_MULTI_MODE is not set | ||
396 | CONFIG_BLK_DEV_IDECD=y | ||
397 | # CONFIG_BLK_DEV_IDETAPE is not set | ||
398 | # CONFIG_BLK_DEV_IDEFLOPPY is not set | ||
399 | # CONFIG_BLK_DEV_IDESCSI is not set | ||
400 | # CONFIG_BLK_DEV_IDEACPI is not set | ||
401 | # CONFIG_IDE_TASK_IOCTL is not set | ||
402 | CONFIG_IDE_PROC_FS=y | ||
403 | |||
404 | # | ||
405 | # IDE chipset support/bugfixes | ||
406 | # | ||
407 | CONFIG_IDE_GENERIC=y | ||
408 | # CONFIG_BLK_DEV_PLATFORM is not set | ||
409 | # CONFIG_BLK_DEV_IDEPNP is not set | ||
410 | |||
411 | # | ||
412 | # PCI IDE chipsets support | ||
413 | # | ||
414 | CONFIG_BLK_DEV_IDEPCI=y | ||
415 | CONFIG_IDEPCI_SHARE_IRQ=y | ||
416 | CONFIG_IDEPCI_PCIBUS_ORDER=y | ||
417 | # CONFIG_BLK_DEV_OFFBOARD is not set | ||
418 | # CONFIG_BLK_DEV_GENERIC is not set | ||
419 | # CONFIG_BLK_DEV_OPTI621 is not set | ||
420 | CONFIG_BLK_DEV_IDEDMA_PCI=y | ||
421 | # CONFIG_BLK_DEV_AEC62XX is not set | ||
422 | # CONFIG_BLK_DEV_ALI15X3 is not set | ||
423 | # CONFIG_BLK_DEV_AMD74XX is not set | ||
424 | # CONFIG_BLK_DEV_CMD64X is not set | ||
425 | # CONFIG_BLK_DEV_TRIFLEX is not set | ||
426 | # CONFIG_BLK_DEV_CY82C693 is not set | ||
427 | # CONFIG_BLK_DEV_CS5520 is not set | ||
428 | # CONFIG_BLK_DEV_CS5530 is not set | ||
429 | # CONFIG_BLK_DEV_HPT34X is not set | ||
430 | # CONFIG_BLK_DEV_HPT366 is not set | ||
431 | # CONFIG_BLK_DEV_JMICRON is not set | ||
432 | # CONFIG_BLK_DEV_SC1200 is not set | ||
433 | # CONFIG_BLK_DEV_PIIX is not set | ||
434 | # CONFIG_BLK_DEV_IT8213 is not set | ||
435 | # CONFIG_BLK_DEV_IT821X is not set | ||
436 | # CONFIG_BLK_DEV_NS87415 is not set | ||
437 | # CONFIG_BLK_DEV_PDC202XX_OLD is not set | ||
438 | # CONFIG_BLK_DEV_PDC202XX_NEW is not set | ||
439 | # CONFIG_BLK_DEV_SVWKS is not set | ||
440 | CONFIG_BLK_DEV_SGIIOC4=y | ||
441 | # CONFIG_BLK_DEV_SIIMAGE is not set | ||
442 | # CONFIG_BLK_DEV_SLC90E66 is not set | ||
443 | # CONFIG_BLK_DEV_TRM290 is not set | ||
444 | # CONFIG_BLK_DEV_VIA82CXXX is not set | ||
445 | # CONFIG_BLK_DEV_TC86C001 is not set | ||
446 | # CONFIG_IDE_ARM is not set | ||
447 | CONFIG_BLK_DEV_IDEDMA=y | ||
448 | # CONFIG_BLK_DEV_HD is not set | ||
449 | |||
450 | # | ||
451 | # SCSI device support | ||
452 | # | ||
453 | # CONFIG_RAID_ATTRS is not set | ||
454 | CONFIG_SCSI=y | ||
455 | CONFIG_SCSI_DMA=y | ||
456 | # CONFIG_SCSI_TGT is not set | ||
457 | CONFIG_SCSI_NETLINK=y | ||
458 | CONFIG_SCSI_PROC_FS=y | ||
459 | |||
460 | # | ||
461 | # SCSI support type (disk, tape, CD-ROM) | ||
462 | # | ||
463 | CONFIG_BLK_DEV_SD=y | ||
464 | CONFIG_CHR_DEV_ST=m | ||
465 | # CONFIG_CHR_DEV_OSST is not set | ||
466 | CONFIG_BLK_DEV_SR=m | ||
467 | # CONFIG_BLK_DEV_SR_VENDOR is not set | ||
468 | CONFIG_CHR_DEV_SG=m | ||
469 | CONFIG_CHR_DEV_SCH=m | ||
470 | |||
471 | # | ||
472 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
473 | # | ||
474 | # CONFIG_SCSI_MULTI_LUN is not set | ||
475 | CONFIG_SCSI_CONSTANTS=y | ||
476 | # CONFIG_SCSI_LOGGING is not set | ||
477 | # CONFIG_SCSI_SCAN_ASYNC is not set | ||
478 | CONFIG_SCSI_WAIT_SCAN=m | ||
479 | |||
480 | # | ||
481 | # SCSI Transports | ||
482 | # | ||
483 | CONFIG_SCSI_SPI_ATTRS=y | ||
484 | CONFIG_SCSI_FC_ATTRS=y | ||
485 | CONFIG_SCSI_ISCSI_ATTRS=m | ||
486 | CONFIG_SCSI_SAS_ATTRS=y | ||
487 | CONFIG_SCSI_SAS_LIBSAS=y | ||
488 | # CONFIG_SCSI_SAS_ATA is not set | ||
489 | # CONFIG_SCSI_SAS_LIBSAS_DEBUG is not set | ||
490 | CONFIG_SCSI_SRP_ATTRS=y | ||
491 | CONFIG_SCSI_LOWLEVEL=y | ||
492 | CONFIG_ISCSI_TCP=m | ||
493 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | ||
494 | # CONFIG_SCSI_3W_9XXX is not set | ||
495 | # CONFIG_SCSI_ACARD is not set | ||
496 | # CONFIG_SCSI_AACRAID is not set | ||
497 | # CONFIG_SCSI_AIC7XXX is not set | ||
498 | # CONFIG_SCSI_AIC7XXX_OLD is not set | ||
499 | # CONFIG_SCSI_AIC79XX is not set | ||
500 | # CONFIG_SCSI_AIC94XX is not set | ||
501 | # CONFIG_SCSI_ADVANSYS is not set | ||
502 | # CONFIG_SCSI_ARCMSR is not set | ||
503 | # CONFIG_MEGARAID_NEWGEN is not set | ||
504 | # CONFIG_MEGARAID_LEGACY is not set | ||
505 | # CONFIG_MEGARAID_SAS is not set | ||
506 | # CONFIG_SCSI_HPTIOP is not set | ||
507 | # CONFIG_SCSI_DMX3191D is not set | ||
508 | # CONFIG_SCSI_FUTURE_DOMAIN is not set | ||
509 | # CONFIG_SCSI_IPS is not set | ||
510 | # CONFIG_SCSI_INITIO is not set | ||
511 | # CONFIG_SCSI_INIA100 is not set | ||
512 | # CONFIG_SCSI_STEX is not set | ||
513 | # CONFIG_SCSI_SYM53C8XX_2 is not set | ||
514 | # CONFIG_SCSI_IPR is not set | ||
515 | CONFIG_SCSI_QLOGIC_1280=y | ||
516 | CONFIG_SCSI_QLA_FC=y | ||
517 | # CONFIG_SCSI_QLA_ISCSI is not set | ||
518 | # CONFIG_SCSI_LPFC is not set | ||
519 | # CONFIG_SCSI_DC395x is not set | ||
520 | # CONFIG_SCSI_DC390T is not set | ||
521 | # CONFIG_SCSI_DEBUG is not set | ||
522 | # CONFIG_SCSI_SRP is not set | ||
523 | CONFIG_ATA=y | ||
524 | CONFIG_ATA_NONSTANDARD=y | ||
525 | CONFIG_ATA_ACPI=y | ||
526 | # CONFIG_SATA_AHCI is not set | ||
527 | # CONFIG_SATA_SVW is not set | ||
528 | # CONFIG_ATA_PIIX is not set | ||
529 | # CONFIG_SATA_MV is not set | ||
530 | # CONFIG_SATA_NV is not set | ||
531 | # CONFIG_PDC_ADMA is not set | ||
532 | # CONFIG_SATA_QSTOR is not set | ||
533 | # CONFIG_SATA_PROMISE is not set | ||
534 | # CONFIG_SATA_SX4 is not set | ||
535 | # CONFIG_SATA_SIL is not set | ||
536 | # CONFIG_SATA_SIL24 is not set | ||
537 | # CONFIG_SATA_SIS is not set | ||
538 | # CONFIG_SATA_ULI is not set | ||
539 | # CONFIG_SATA_VIA is not set | ||
540 | CONFIG_SATA_VITESSE=y | ||
541 | # CONFIG_SATA_INIC162X is not set | ||
542 | # CONFIG_PATA_ACPI is not set | ||
543 | # CONFIG_PATA_ALI is not set | ||
544 | # CONFIG_PATA_AMD is not set | ||
545 | # CONFIG_PATA_ARTOP is not set | ||
546 | # CONFIG_PATA_ATIIXP is not set | ||
547 | # CONFIG_PATA_CMD640_PCI is not set | ||
548 | # CONFIG_PATA_CMD64X is not set | ||
549 | # CONFIG_PATA_CS5520 is not set | ||
550 | # CONFIG_PATA_CS5530 is not set | ||
551 | # CONFIG_PATA_CYPRESS is not set | ||
552 | # CONFIG_PATA_EFAR is not set | ||
553 | # CONFIG_ATA_GENERIC is not set | ||
554 | # CONFIG_PATA_HPT366 is not set | ||
555 | # CONFIG_PATA_HPT37X is not set | ||
556 | # CONFIG_PATA_HPT3X2N is not set | ||
557 | # CONFIG_PATA_HPT3X3 is not set | ||
558 | # CONFIG_PATA_IT821X is not set | ||
559 | # CONFIG_PATA_IT8213 is not set | ||
560 | # CONFIG_PATA_JMICRON is not set | ||
561 | # CONFIG_PATA_TRIFLEX is not set | ||
562 | # CONFIG_PATA_MARVELL is not set | ||
563 | # CONFIG_PATA_MPIIX is not set | ||
564 | # CONFIG_PATA_OLDPIIX is not set | ||
565 | # CONFIG_PATA_NETCELL is not set | ||
566 | # CONFIG_PATA_NS87410 is not set | ||
567 | # CONFIG_PATA_NS87415 is not set | ||
568 | # CONFIG_PATA_OPTI is not set | ||
569 | # CONFIG_PATA_OPTIDMA is not set | ||
570 | # CONFIG_PATA_PDC_OLD is not set | ||
571 | # CONFIG_PATA_RADISYS is not set | ||
572 | # CONFIG_PATA_RZ1000 is not set | ||
573 | # CONFIG_PATA_SC1200 is not set | ||
574 | # CONFIG_PATA_SERVERWORKS is not set | ||
575 | # CONFIG_PATA_PDC2027X is not set | ||
576 | # CONFIG_PATA_SIL680 is not set | ||
577 | # CONFIG_PATA_SIS is not set | ||
578 | # CONFIG_PATA_VIA is not set | ||
579 | # CONFIG_PATA_WINBOND is not set | ||
580 | CONFIG_MD=y | ||
581 | CONFIG_BLK_DEV_MD=y | ||
582 | CONFIG_MD_LINEAR=y | ||
583 | CONFIG_MD_RAID0=y | ||
584 | CONFIG_MD_RAID1=y | ||
585 | # CONFIG_MD_RAID10 is not set | ||
586 | CONFIG_MD_RAID456=y | ||
587 | # CONFIG_MD_RAID5_RESHAPE is not set | ||
588 | CONFIG_MD_MULTIPATH=y | ||
589 | # CONFIG_MD_FAULTY is not set | ||
590 | CONFIG_BLK_DEV_DM=y | ||
591 | # CONFIG_DM_DEBUG is not set | ||
592 | CONFIG_DM_CRYPT=m | ||
593 | CONFIG_DM_SNAPSHOT=m | ||
594 | CONFIG_DM_MIRROR=m | ||
595 | CONFIG_DM_ZERO=m | ||
596 | CONFIG_DM_MULTIPATH=m | ||
597 | CONFIG_DM_MULTIPATH_EMC=m | ||
598 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
599 | # CONFIG_DM_DELAY is not set | ||
600 | CONFIG_FUSION=y | ||
601 | CONFIG_FUSION_SPI=y | ||
602 | CONFIG_FUSION_FC=y | ||
603 | CONFIG_FUSION_SAS=y | ||
604 | CONFIG_FUSION_MAX_SGE=128 | ||
605 | CONFIG_FUSION_CTL=m | ||
606 | CONFIG_FUSION_LOGGING=y | ||
607 | |||
608 | # | ||
609 | # IEEE 1394 (FireWire) support | ||
610 | # | ||
611 | # CONFIG_FIREWIRE is not set | ||
612 | # CONFIG_IEEE1394 is not set | ||
613 | # CONFIG_I2O is not set | ||
614 | CONFIG_NETDEVICES=y | ||
615 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
616 | # CONFIG_DUMMY is not set | ||
617 | # CONFIG_BONDING is not set | ||
618 | # CONFIG_MACVLAN is not set | ||
619 | # CONFIG_EQUALIZER is not set | ||
620 | # CONFIG_TUN is not set | ||
621 | # CONFIG_VETH is not set | ||
622 | # CONFIG_NET_SB1000 is not set | ||
623 | # CONFIG_IP1000 is not set | ||
624 | # CONFIG_ARCNET is not set | ||
625 | # CONFIG_NET_ETHERNET is not set | ||
626 | CONFIG_NETDEV_1000=y | ||
627 | # CONFIG_ACENIC is not set | ||
628 | # CONFIG_DL2K is not set | ||
629 | # CONFIG_E1000 is not set | ||
630 | # CONFIG_E1000E is not set | ||
631 | # CONFIG_NS83820 is not set | ||
632 | # CONFIG_HAMACHI is not set | ||
633 | # CONFIG_YELLOWFIN is not set | ||
634 | # CONFIG_R8169 is not set | ||
635 | # CONFIG_SIS190 is not set | ||
636 | # CONFIG_SKGE is not set | ||
637 | # CONFIG_SKY2 is not set | ||
638 | # CONFIG_SK98LIN is not set | ||
639 | # CONFIG_VIA_VELOCITY is not set | ||
640 | CONFIG_TIGON3=y | ||
641 | # CONFIG_BNX2 is not set | ||
642 | # CONFIG_QLA3XXX is not set | ||
643 | # CONFIG_ATL1 is not set | ||
644 | CONFIG_NETDEV_10000=y | ||
645 | CONFIG_CHELSIO_T1=m | ||
646 | CONFIG_CHELSIO_T1_1G=y | ||
647 | # CONFIG_CHELSIO_T1_NAPI is not set | ||
648 | CONFIG_CHELSIO_T3=m | ||
649 | CONFIG_IXGBE=m | ||
650 | # CONFIG_IXGB is not set | ||
651 | CONFIG_S2IO=m | ||
652 | # CONFIG_S2IO_NAPI is not set | ||
653 | # CONFIG_MYRI10GE is not set | ||
654 | # CONFIG_NETXEN_NIC is not set | ||
655 | # CONFIG_NIU is not set | ||
656 | # CONFIG_MLX4_CORE is not set | ||
657 | # CONFIG_TEHUTI is not set | ||
658 | # CONFIG_TR is not set | ||
659 | |||
660 | # | ||
661 | # Wireless LAN | ||
662 | # | ||
663 | # CONFIG_WLAN_PRE80211 is not set | ||
664 | # CONFIG_WLAN_80211 is not set | ||
665 | |||
666 | # | ||
667 | # USB Network Adapters | ||
668 | # | ||
669 | # CONFIG_USB_CATC is not set | ||
670 | # CONFIG_USB_KAWETH is not set | ||
671 | # CONFIG_USB_PEGASUS is not set | ||
672 | # CONFIG_USB_RTL8150 is not set | ||
673 | # CONFIG_USB_USBNET_MII is not set | ||
674 | # CONFIG_USB_USBNET is not set | ||
675 | # CONFIG_WAN is not set | ||
676 | # CONFIG_FDDI is not set | ||
677 | # CONFIG_HIPPI is not set | ||
678 | # CONFIG_PPP is not set | ||
679 | # CONFIG_SLIP is not set | ||
680 | # CONFIG_NET_FC is not set | ||
681 | # CONFIG_SHAPER is not set | ||
682 | CONFIG_NETCONSOLE=y | ||
683 | # CONFIG_NETCONSOLE_DYNAMIC is not set | ||
684 | CONFIG_NETPOLL=y | ||
685 | # CONFIG_NETPOLL_TRAP is not set | ||
686 | CONFIG_NET_POLL_CONTROLLER=y | ||
687 | # CONFIG_ISDN is not set | ||
688 | # CONFIG_PHONE is not set | ||
689 | |||
690 | # | ||
691 | # Input device support | ||
692 | # | ||
693 | CONFIG_INPUT=y | ||
694 | # CONFIG_INPUT_FF_MEMLESS is not set | ||
695 | # CONFIG_INPUT_POLLDEV is not set | ||
696 | |||
697 | # | ||
698 | # Userland interfaces | ||
699 | # | ||
700 | CONFIG_INPUT_MOUSEDEV=y | ||
701 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
702 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 | ||
703 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 | ||
704 | # CONFIG_INPUT_JOYDEV is not set | ||
705 | # CONFIG_INPUT_EVDEV is not set | ||
706 | # CONFIG_INPUT_EVBUG is not set | ||
707 | |||
708 | # | ||
709 | # Input Device Drivers | ||
710 | # | ||
711 | # CONFIG_INPUT_KEYBOARD is not set | ||
712 | # CONFIG_INPUT_MOUSE is not set | ||
713 | # CONFIG_INPUT_JOYSTICK is not set | ||
714 | # CONFIG_INPUT_TABLET is not set | ||
715 | # CONFIG_INPUT_TOUCHSCREEN is not set | ||
716 | # CONFIG_INPUT_MISC is not set | ||
717 | |||
718 | # | ||
719 | # Hardware I/O ports | ||
720 | # | ||
721 | # CONFIG_SERIO is not set | ||
722 | # CONFIG_GAMEPORT is not set | ||
723 | |||
724 | # | ||
725 | # Character devices | ||
726 | # | ||
727 | CONFIG_VT=y | ||
728 | # CONFIG_VT_UNICODE is not set | ||
729 | CONFIG_VT_CONSOLE=y | ||
730 | CONFIG_HW_CONSOLE=y | ||
731 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
732 | CONFIG_SERIAL_NONSTANDARD=y | ||
733 | # CONFIG_COMPUTONE is not set | ||
734 | # CONFIG_ROCKETPORT is not set | ||
735 | # CONFIG_CYCLADES is not set | ||
736 | # CONFIG_DIGIEPCA is not set | ||
737 | # CONFIG_MOXA_INTELLIO is not set | ||
738 | # CONFIG_MOXA_SMARTIO is not set | ||
739 | # CONFIG_MOXA_SMARTIO_NEW is not set | ||
740 | # CONFIG_ISI is not set | ||
741 | # CONFIG_SYNCLINKMP is not set | ||
742 | # CONFIG_SYNCLINK_GT is not set | ||
743 | # CONFIG_N_HDLC is not set | ||
744 | # CONFIG_SPECIALIX is not set | ||
745 | # CONFIG_SX is not set | ||
746 | # CONFIG_RIO is not set | ||
747 | # CONFIG_STALDRV is not set | ||
748 | CONFIG_SGI_SNSC=y | ||
749 | CONFIG_SGI_TIOCX=y | ||
750 | CONFIG_SGI_MBCS=m | ||
751 | |||
752 | # | ||
753 | # Serial drivers | ||
754 | # | ||
755 | # CONFIG_SERIAL_8250 is not set | ||
756 | |||
757 | # | ||
758 | # Non-8250 serial port support | ||
759 | # | ||
760 | CONFIG_SERIAL_CORE=y | ||
761 | CONFIG_SERIAL_CORE_CONSOLE=y | ||
762 | CONFIG_SERIAL_SGI_L1_CONSOLE=y | ||
763 | # CONFIG_SERIAL_JSM is not set | ||
764 | CONFIG_SERIAL_SGI_IOC4=y | ||
765 | CONFIG_SERIAL_SGI_IOC3=y | ||
766 | CONFIG_UNIX98_PTYS=y | ||
767 | CONFIG_LEGACY_PTYS=y | ||
768 | CONFIG_LEGACY_PTY_COUNT=256 | ||
769 | # CONFIG_IPMI_HANDLER is not set | ||
770 | # CONFIG_WATCHDOG is not set | ||
771 | # CONFIG_HW_RANDOM is not set | ||
772 | CONFIG_EFI_RTC=y | ||
773 | # CONFIG_R3964 is not set | ||
774 | # CONFIG_APPLICOM is not set | ||
775 | CONFIG_RAW_DRIVER=m | ||
776 | CONFIG_MAX_RAW_DEVS=256 | ||
777 | # CONFIG_HPET is not set | ||
778 | # CONFIG_HANGCHECK_TIMER is not set | ||
779 | CONFIG_MMTIMER=y | ||
780 | # CONFIG_TCG_TPM is not set | ||
781 | CONFIG_DEVPORT=y | ||
782 | # CONFIG_I2C is not set | ||
783 | |||
784 | # | ||
785 | # SPI support | ||
786 | # | ||
787 | # CONFIG_SPI is not set | ||
788 | # CONFIG_SPI_MASTER is not set | ||
789 | # CONFIG_W1 is not set | ||
790 | # CONFIG_POWER_SUPPLY is not set | ||
791 | # CONFIG_HWMON is not set | ||
792 | |||
793 | # | ||
794 | # Sonics Silicon Backplane | ||
795 | # | ||
796 | CONFIG_SSB_POSSIBLE=y | ||
797 | # CONFIG_SSB is not set | ||
798 | |||
799 | # | ||
800 | # Multifunction device drivers | ||
801 | # | ||
802 | # CONFIG_MFD_SM501 is not set | ||
803 | |||
804 | # | ||
805 | # Multimedia devices | ||
806 | # | ||
807 | # CONFIG_VIDEO_DEV is not set | ||
808 | # CONFIG_DVB_CORE is not set | ||
809 | # CONFIG_DAB is not set | ||
810 | |||
811 | # | ||
812 | # Graphics support | ||
813 | # | ||
814 | CONFIG_AGP=y | ||
815 | CONFIG_AGP_SGI_TIOCA=y | ||
816 | # CONFIG_DRM is not set | ||
817 | # CONFIG_VGASTATE is not set | ||
818 | CONFIG_VIDEO_OUTPUT_CONTROL=m | ||
819 | # CONFIG_FB is not set | ||
820 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | ||
821 | |||
822 | # | ||
823 | # Display device support | ||
824 | # | ||
825 | # CONFIG_DISPLAY_SUPPORT is not set | ||
826 | |||
827 | # | ||
828 | # Console display driver support | ||
829 | # | ||
830 | CONFIG_VGA_CONSOLE=y | ||
831 | # CONFIG_VGACON_SOFT_SCROLLBACK is not set | ||
832 | CONFIG_DUMMY_CONSOLE=y | ||
833 | |||
834 | # | ||
835 | # Sound | ||
836 | # | ||
837 | # CONFIG_SOUND is not set | ||
838 | CONFIG_HID_SUPPORT=y | ||
839 | CONFIG_HID=y | ||
840 | CONFIG_HID_DEBUG=y | ||
841 | # CONFIG_HIDRAW is not set | ||
842 | |||
843 | # | ||
844 | # USB Input Devices | ||
845 | # | ||
846 | CONFIG_USB_HID=m | ||
847 | # CONFIG_USB_HIDINPUT_POWERBOOK is not set | ||
848 | # CONFIG_HID_FF is not set | ||
849 | # CONFIG_USB_HIDDEV is not set | ||
850 | |||
851 | # | ||
852 | # USB HID Boot Protocol drivers | ||
853 | # | ||
854 | # CONFIG_USB_KBD is not set | ||
855 | # CONFIG_USB_MOUSE is not set | ||
856 | CONFIG_USB_SUPPORT=y | ||
857 | CONFIG_USB_ARCH_HAS_HCD=y | ||
858 | CONFIG_USB_ARCH_HAS_OHCI=y | ||
859 | CONFIG_USB_ARCH_HAS_EHCI=y | ||
860 | CONFIG_USB=m | ||
861 | # CONFIG_USB_DEBUG is not set | ||
862 | |||
863 | # | ||
864 | # Miscellaneous USB options | ||
865 | # | ||
866 | # CONFIG_USB_DEVICEFS is not set | ||
867 | CONFIG_USB_DEVICE_CLASS=y | ||
868 | # CONFIG_USB_DYNAMIC_MINORS is not set | ||
869 | # CONFIG_USB_SUSPEND is not set | ||
870 | # CONFIG_USB_PERSIST is not set | ||
871 | # CONFIG_USB_OTG is not set | ||
872 | |||
873 | # | ||
874 | # USB Host Controller Drivers | ||
875 | # | ||
876 | CONFIG_USB_EHCI_HCD=m | ||
877 | # CONFIG_USB_EHCI_SPLIT_ISO is not set | ||
878 | # CONFIG_USB_EHCI_ROOT_HUB_TT is not set | ||
879 | # CONFIG_USB_EHCI_TT_NEWSCHED is not set | ||
880 | # CONFIG_USB_ISP116X_HCD is not set | ||
881 | CONFIG_USB_OHCI_HCD=m | ||
882 | # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set | ||
883 | # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set | ||
884 | CONFIG_USB_OHCI_LITTLE_ENDIAN=y | ||
885 | CONFIG_USB_UHCI_HCD=m | ||
886 | # CONFIG_USB_SL811_HCD is not set | ||
887 | # CONFIG_USB_R8A66597_HCD is not set | ||
888 | |||
889 | # | ||
890 | # USB Device Class drivers | ||
891 | # | ||
892 | # CONFIG_USB_ACM is not set | ||
893 | # CONFIG_USB_PRINTER is not set | ||
894 | |||
895 | # | ||
896 | # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' | ||
897 | # | ||
898 | |||
899 | # | ||
900 | # may also be needed; see USB_STORAGE Help for more information | ||
901 | # | ||
902 | # CONFIG_USB_STORAGE is not set | ||
903 | # CONFIG_USB_LIBUSUAL is not set | ||
904 | |||
905 | # | ||
906 | # USB Imaging devices | ||
907 | # | ||
908 | # CONFIG_USB_MDC800 is not set | ||
909 | # CONFIG_USB_MICROTEK is not set | ||
910 | CONFIG_USB_MON=y | ||
911 | |||
912 | # | ||
913 | # USB port drivers | ||
914 | # | ||
915 | |||
916 | # | ||
917 | # USB Serial Converter support | ||
918 | # | ||
919 | # CONFIG_USB_SERIAL is not set | ||
920 | |||
921 | # | ||
922 | # USB Miscellaneous drivers | ||
923 | # | ||
924 | # CONFIG_USB_EMI62 is not set | ||
925 | # CONFIG_USB_EMI26 is not set | ||
926 | # CONFIG_USB_ADUTUX is not set | ||
927 | # CONFIG_USB_AUERSWALD is not set | ||
928 | # CONFIG_USB_RIO500 is not set | ||
929 | # CONFIG_USB_LEGOTOWER is not set | ||
930 | # CONFIG_USB_LCD is not set | ||
931 | # CONFIG_USB_BERRY_CHARGE is not set | ||
932 | # CONFIG_USB_LED is not set | ||
933 | # CONFIG_USB_CYPRESS_CY7C63 is not set | ||
934 | # CONFIG_USB_CYTHERM is not set | ||
935 | # CONFIG_USB_PHIDGET is not set | ||
936 | # CONFIG_USB_IDMOUSE is not set | ||
937 | # CONFIG_USB_FTDI_ELAN is not set | ||
938 | # CONFIG_USB_APPLEDISPLAY is not set | ||
939 | # CONFIG_USB_SISUSBVGA is not set | ||
940 | # CONFIG_USB_LD is not set | ||
941 | # CONFIG_USB_TRANCEVIBRATOR is not set | ||
942 | # CONFIG_USB_IOWARRIOR is not set | ||
943 | |||
944 | # | ||
945 | # USB DSL modem support | ||
946 | # | ||
947 | |||
948 | # | ||
949 | # USB Gadget Support | ||
950 | # | ||
951 | # CONFIG_USB_GADGET is not set | ||
952 | # CONFIG_MMC is not set | ||
953 | # CONFIG_NEW_LEDS is not set | ||
954 | CONFIG_INFINIBAND=m | ||
955 | # CONFIG_INFINIBAND_USER_MAD is not set | ||
956 | CONFIG_INFINIBAND_USER_ACCESS=m | ||
957 | CONFIG_INFINIBAND_USER_MEM=y | ||
958 | CONFIG_INFINIBAND_ADDR_TRANS=y | ||
959 | CONFIG_INFINIBAND_MTHCA=m | ||
960 | CONFIG_INFINIBAND_MTHCA_DEBUG=y | ||
961 | # CONFIG_INFINIBAND_AMSO1100 is not set | ||
962 | # CONFIG_INFINIBAND_CXGB3 is not set | ||
963 | # CONFIG_MLX4_INFINIBAND is not set | ||
964 | CONFIG_INFINIBAND_IPOIB=m | ||
965 | # CONFIG_INFINIBAND_IPOIB_CM is not set | ||
966 | CONFIG_INFINIBAND_IPOIB_DEBUG=y | ||
967 | # CONFIG_INFINIBAND_IPOIB_DEBUG_DATA is not set | ||
968 | CONFIG_INFINIBAND_SRP=m | ||
969 | # CONFIG_INFINIBAND_ISER is not set | ||
970 | # CONFIG_RTC_CLASS is not set | ||
971 | |||
972 | # | ||
973 | # Userspace I/O | ||
974 | # | ||
975 | # CONFIG_UIO is not set | ||
976 | CONFIG_MSPEC=y | ||
977 | |||
978 | # | ||
979 | # File systems | ||
980 | # | ||
981 | CONFIG_EXT2_FS=y | ||
982 | CONFIG_EXT2_FS_XATTR=y | ||
983 | CONFIG_EXT2_FS_POSIX_ACL=y | ||
984 | CONFIG_EXT2_FS_SECURITY=y | ||
985 | # CONFIG_EXT2_FS_XIP is not set | ||
986 | CONFIG_EXT3_FS=y | ||
987 | CONFIG_EXT3_FS_XATTR=y | ||
988 | CONFIG_EXT3_FS_POSIX_ACL=y | ||
989 | CONFIG_EXT3_FS_SECURITY=y | ||
990 | # CONFIG_EXT4DEV_FS is not set | ||
991 | CONFIG_JBD=y | ||
992 | # CONFIG_JBD_DEBUG is not set | ||
993 | CONFIG_FS_MBCACHE=y | ||
994 | CONFIG_REISERFS_FS=y | ||
995 | # CONFIG_REISERFS_CHECK is not set | ||
996 | # CONFIG_REISERFS_PROC_INFO is not set | ||
997 | CONFIG_REISERFS_FS_XATTR=y | ||
998 | CONFIG_REISERFS_FS_POSIX_ACL=y | ||
999 | CONFIG_REISERFS_FS_SECURITY=y | ||
1000 | # CONFIG_JFS_FS is not set | ||
1001 | CONFIG_FS_POSIX_ACL=y | ||
1002 | CONFIG_XFS_FS=y | ||
1003 | CONFIG_XFS_QUOTA=y | ||
1004 | # CONFIG_XFS_SECURITY is not set | ||
1005 | CONFIG_XFS_POSIX_ACL=y | ||
1006 | CONFIG_XFS_RT=y | ||
1007 | # CONFIG_GFS2_FS is not set | ||
1008 | # CONFIG_OCFS2_FS is not set | ||
1009 | # CONFIG_MINIX_FS is not set | ||
1010 | # CONFIG_ROMFS_FS is not set | ||
1011 | CONFIG_INOTIFY=y | ||
1012 | CONFIG_INOTIFY_USER=y | ||
1013 | CONFIG_QUOTA=y | ||
1014 | CONFIG_QUOTA_NETLINK_INTERFACE=y | ||
1015 | CONFIG_PRINT_QUOTA_WARNING=y | ||
1016 | # CONFIG_QFMT_V1 is not set | ||
1017 | # CONFIG_QFMT_V2 is not set | ||
1018 | CONFIG_QUOTACTL=y | ||
1019 | CONFIG_DNOTIFY=y | ||
1020 | CONFIG_AUTOFS_FS=m | ||
1021 | CONFIG_AUTOFS4_FS=m | ||
1022 | CONFIG_FUSE_FS=m | ||
1023 | |||
1024 | # | ||
1025 | # CD-ROM/DVD Filesystems | ||
1026 | # | ||
1027 | CONFIG_ISO9660_FS=y | ||
1028 | CONFIG_JOLIET=y | ||
1029 | # CONFIG_ZISOFS is not set | ||
1030 | CONFIG_UDF_FS=m | ||
1031 | CONFIG_UDF_NLS=y | ||
1032 | |||
1033 | # | ||
1034 | # DOS/FAT/NT Filesystems | ||
1035 | # | ||
1036 | CONFIG_FAT_FS=y | ||
1037 | # CONFIG_MSDOS_FS is not set | ||
1038 | CONFIG_VFAT_FS=y | ||
1039 | CONFIG_FAT_DEFAULT_CODEPAGE=437 | ||
1040 | CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" | ||
1041 | # CONFIG_NTFS_FS is not set | ||
1042 | |||
1043 | # | ||
1044 | # Pseudo filesystems | ||
1045 | # | ||
1046 | CONFIG_PROC_FS=y | ||
1047 | CONFIG_PROC_KCORE=y | ||
1048 | CONFIG_PROC_SYSCTL=y | ||
1049 | CONFIG_SYSFS=y | ||
1050 | CONFIG_TMPFS=y | ||
1051 | # CONFIG_TMPFS_POSIX_ACL is not set | ||
1052 | CONFIG_HUGETLBFS=y | ||
1053 | CONFIG_HUGETLB_PAGE=y | ||
1054 | # CONFIG_CONFIGFS_FS is not set | ||
1055 | |||
1056 | # | ||
1057 | # Miscellaneous filesystems | ||
1058 | # | ||
1059 | # CONFIG_ADFS_FS is not set | ||
1060 | # CONFIG_AFFS_FS is not set | ||
1061 | # CONFIG_HFS_FS is not set | ||
1062 | # CONFIG_HFSPLUS_FS is not set | ||
1063 | # CONFIG_BEFS_FS is not set | ||
1064 | # CONFIG_BFS_FS is not set | ||
1065 | # CONFIG_EFS_FS is not set | ||
1066 | # CONFIG_CRAMFS is not set | ||
1067 | # CONFIG_VXFS_FS is not set | ||
1068 | # CONFIG_HPFS_FS is not set | ||
1069 | # CONFIG_QNX4FS_FS is not set | ||
1070 | # CONFIG_SYSV_FS is not set | ||
1071 | # CONFIG_UFS_FS is not set | ||
1072 | CONFIG_NETWORK_FILESYSTEMS=y | ||
1073 | CONFIG_NFS_FS=m | ||
1074 | CONFIG_NFS_V3=y | ||
1075 | # CONFIG_NFS_V3_ACL is not set | ||
1076 | CONFIG_NFS_V4=y | ||
1077 | CONFIG_NFS_DIRECTIO=y | ||
1078 | CONFIG_NFSD=m | ||
1079 | CONFIG_NFSD_V3=y | ||
1080 | # CONFIG_NFSD_V3_ACL is not set | ||
1081 | CONFIG_NFSD_V4=y | ||
1082 | CONFIG_NFSD_TCP=y | ||
1083 | CONFIG_LOCKD=m | ||
1084 | CONFIG_LOCKD_V4=y | ||
1085 | CONFIG_EXPORTFS=m | ||
1086 | CONFIG_NFS_COMMON=y | ||
1087 | CONFIG_SUNRPC=m | ||
1088 | CONFIG_SUNRPC_GSS=m | ||
1089 | CONFIG_SUNRPC_XPRT_RDMA=m | ||
1090 | # CONFIG_SUNRPC_BIND34 is not set | ||
1091 | CONFIG_RPCSEC_GSS_KRB5=m | ||
1092 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | ||
1093 | CONFIG_SMB_FS=m | ||
1094 | # CONFIG_SMB_NLS_DEFAULT is not set | ||
1095 | CONFIG_CIFS=m | ||
1096 | # CONFIG_CIFS_STATS is not set | ||
1097 | # CONFIG_CIFS_WEAK_PW_HASH is not set | ||
1098 | # CONFIG_CIFS_XATTR is not set | ||
1099 | # CONFIG_CIFS_DEBUG2 is not set | ||
1100 | # CONFIG_CIFS_EXPERIMENTAL is not set | ||
1101 | # CONFIG_NCP_FS is not set | ||
1102 | # CONFIG_CODA_FS is not set | ||
1103 | # CONFIG_AFS_FS is not set | ||
1104 | |||
1105 | # | ||
1106 | # Partition Types | ||
1107 | # | ||
1108 | CONFIG_PARTITION_ADVANCED=y | ||
1109 | # CONFIG_ACORN_PARTITION is not set | ||
1110 | # CONFIG_OSF_PARTITION is not set | ||
1111 | # CONFIG_AMIGA_PARTITION is not set | ||
1112 | # CONFIG_ATARI_PARTITION is not set | ||
1113 | # CONFIG_MAC_PARTITION is not set | ||
1114 | CONFIG_MSDOS_PARTITION=y | ||
1115 | # CONFIG_BSD_DISKLABEL is not set | ||
1116 | # CONFIG_MINIX_SUBPARTITION is not set | ||
1117 | # CONFIG_SOLARIS_X86_PARTITION is not set | ||
1118 | # CONFIG_UNIXWARE_DISKLABEL is not set | ||
1119 | # CONFIG_LDM_PARTITION is not set | ||
1120 | CONFIG_SGI_PARTITION=y | ||
1121 | # CONFIG_ULTRIX_PARTITION is not set | ||
1122 | # CONFIG_SUN_PARTITION is not set | ||
1123 | # CONFIG_KARMA_PARTITION is not set | ||
1124 | CONFIG_EFI_PARTITION=y | ||
1125 | # CONFIG_SYSV68_PARTITION is not set | ||
1126 | CONFIG_NLS=y | ||
1127 | CONFIG_NLS_DEFAULT="iso8859-1" | ||
1128 | CONFIG_NLS_CODEPAGE_437=y | ||
1129 | # CONFIG_NLS_CODEPAGE_737 is not set | ||
1130 | # CONFIG_NLS_CODEPAGE_775 is not set | ||
1131 | # CONFIG_NLS_CODEPAGE_850 is not set | ||
1132 | # CONFIG_NLS_CODEPAGE_852 is not set | ||
1133 | # CONFIG_NLS_CODEPAGE_855 is not set | ||
1134 | # CONFIG_NLS_CODEPAGE_857 is not set | ||
1135 | # CONFIG_NLS_CODEPAGE_860 is not set | ||
1136 | # CONFIG_NLS_CODEPAGE_861 is not set | ||
1137 | # CONFIG_NLS_CODEPAGE_862 is not set | ||
1138 | # CONFIG_NLS_CODEPAGE_863 is not set | ||
1139 | # CONFIG_NLS_CODEPAGE_864 is not set | ||
1140 | # CONFIG_NLS_CODEPAGE_865 is not set | ||
1141 | # CONFIG_NLS_CODEPAGE_866 is not set | ||
1142 | # CONFIG_NLS_CODEPAGE_869 is not set | ||
1143 | # CONFIG_NLS_CODEPAGE_936 is not set | ||
1144 | # CONFIG_NLS_CODEPAGE_950 is not set | ||
1145 | # CONFIG_NLS_CODEPAGE_932 is not set | ||
1146 | # CONFIG_NLS_CODEPAGE_949 is not set | ||
1147 | # CONFIG_NLS_CODEPAGE_874 is not set | ||
1148 | # CONFIG_NLS_ISO8859_8 is not set | ||
1149 | # CONFIG_NLS_CODEPAGE_1250 is not set | ||
1150 | # CONFIG_NLS_CODEPAGE_1251 is not set | ||
1151 | # CONFIG_NLS_ASCII is not set | ||
1152 | CONFIG_NLS_ISO8859_1=y | ||
1153 | # CONFIG_NLS_ISO8859_2 is not set | ||
1154 | # CONFIG_NLS_ISO8859_3 is not set | ||
1155 | # CONFIG_NLS_ISO8859_4 is not set | ||
1156 | # CONFIG_NLS_ISO8859_5 is not set | ||
1157 | # CONFIG_NLS_ISO8859_6 is not set | ||
1158 | # CONFIG_NLS_ISO8859_7 is not set | ||
1159 | # CONFIG_NLS_ISO8859_9 is not set | ||
1160 | # CONFIG_NLS_ISO8859_13 is not set | ||
1161 | # CONFIG_NLS_ISO8859_14 is not set | ||
1162 | # CONFIG_NLS_ISO8859_15 is not set | ||
1163 | # CONFIG_NLS_KOI8_R is not set | ||
1164 | # CONFIG_NLS_KOI8_U is not set | ||
1165 | CONFIG_NLS_UTF8=y | ||
1166 | # CONFIG_DLM is not set | ||
1167 | |||
1168 | # | ||
1169 | # Library routines | ||
1170 | # | ||
1171 | CONFIG_BITREVERSE=y | ||
1172 | # CONFIG_CRC_CCITT is not set | ||
1173 | CONFIG_CRC16=m | ||
1174 | # CONFIG_CRC_ITU_T is not set | ||
1175 | CONFIG_CRC32=y | ||
1176 | # CONFIG_CRC7 is not set | ||
1177 | CONFIG_LIBCRC32C=m | ||
1178 | CONFIG_ZLIB_INFLATE=m | ||
1179 | CONFIG_ZLIB_DEFLATE=m | ||
1180 | CONFIG_GENERIC_ALLOCATOR=y | ||
1181 | CONFIG_PLIST=y | ||
1182 | CONFIG_HAS_IOMEM=y | ||
1183 | CONFIG_HAS_IOPORT=y | ||
1184 | CONFIG_HAS_DMA=y | ||
1185 | CONFIG_GENERIC_HARDIRQS=y | ||
1186 | CONFIG_GENERIC_IRQ_PROBE=y | ||
1187 | CONFIG_GENERIC_PENDING_IRQ=y | ||
1188 | CONFIG_IRQ_PER_CPU=y | ||
1189 | |||
1190 | # | ||
1191 | # Instrumentation Support | ||
1192 | # | ||
1193 | # CONFIG_PROFILING is not set | ||
1194 | # CONFIG_KPROBES is not set | ||
1195 | |||
1196 | # | ||
1197 | # Kernel hacking | ||
1198 | # | ||
1199 | # CONFIG_PRINTK_TIME is not set | ||
1200 | CONFIG_ENABLE_MUST_CHECK=y | ||
1201 | CONFIG_MAGIC_SYSRQ=y | ||
1202 | # CONFIG_UNUSED_SYMBOLS is not set | ||
1203 | # CONFIG_DEBUG_FS is not set | ||
1204 | # CONFIG_HEADERS_CHECK is not set | ||
1205 | CONFIG_DEBUG_KERNEL=y | ||
1206 | # CONFIG_DEBUG_SHIRQ is not set | ||
1207 | CONFIG_DETECT_SOFTLOCKUP=y | ||
1208 | CONFIG_SCHED_DEBUG=y | ||
1209 | # CONFIG_SCHEDSTATS is not set | ||
1210 | # CONFIG_TIMER_STATS is not set | ||
1211 | # CONFIG_SLUB_DEBUG_ON is not set | ||
1212 | # CONFIG_DEBUG_RT_MUTEXES is not set | ||
1213 | # CONFIG_RT_MUTEX_TESTER is not set | ||
1214 | # CONFIG_DEBUG_SPINLOCK is not set | ||
1215 | # CONFIG_DEBUG_MUTEXES is not set | ||
1216 | # CONFIG_DEBUG_SPINLOCK_SLEEP is not set | ||
1217 | # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set | ||
1218 | # CONFIG_DEBUG_KOBJECT is not set | ||
1219 | CONFIG_DEBUG_INFO=y | ||
1220 | # CONFIG_DEBUG_VM is not set | ||
1221 | # CONFIG_DEBUG_LIST is not set | ||
1222 | CONFIG_FORCED_INLINING=y | ||
1223 | # CONFIG_BOOT_PRINTK_DELAY is not set | ||
1224 | # CONFIG_RCU_TORTURE_TEST is not set | ||
1225 | # CONFIG_FAULT_INJECTION is not set | ||
1226 | CONFIG_IA64_GRANULE_16MB=y | ||
1227 | # CONFIG_IA64_GRANULE_64MB is not set | ||
1228 | # CONFIG_IA64_PRINT_HAZARDS is not set | ||
1229 | # CONFIG_DISABLE_VHPT is not set | ||
1230 | # CONFIG_IA64_DEBUG_CMPXCHG is not set | ||
1231 | # CONFIG_IA64_DEBUG_IRQ is not set | ||
1232 | CONFIG_SYSVIPC_COMPAT=y | ||
1233 | |||
1234 | # | ||
1235 | # Security options | ||
1236 | # | ||
1237 | # CONFIG_KEYS is not set | ||
1238 | # CONFIG_SECURITY is not set | ||
1239 | # CONFIG_SECURITY_FILE_CAPABILITIES is not set | ||
1240 | CONFIG_XOR_BLOCKS=y | ||
1241 | CONFIG_ASYNC_CORE=y | ||
1242 | CONFIG_ASYNC_MEMCPY=y | ||
1243 | CONFIG_ASYNC_XOR=y | ||
1244 | CONFIG_CRYPTO=y | ||
1245 | CONFIG_CRYPTO_ALGAPI=y | ||
1246 | CONFIG_CRYPTO_BLKCIPHER=m | ||
1247 | CONFIG_CRYPTO_HASH=y | ||
1248 | CONFIG_CRYPTO_MANAGER=y | ||
1249 | CONFIG_CRYPTO_HMAC=y | ||
1250 | # CONFIG_CRYPTO_XCBC is not set | ||
1251 | # CONFIG_CRYPTO_NULL is not set | ||
1252 | # CONFIG_CRYPTO_MD4 is not set | ||
1253 | CONFIG_CRYPTO_MD5=y | ||
1254 | CONFIG_CRYPTO_SHA1=m | ||
1255 | # CONFIG_CRYPTO_SHA256 is not set | ||
1256 | # CONFIG_CRYPTO_SHA512 is not set | ||
1257 | # CONFIG_CRYPTO_WP512 is not set | ||
1258 | # CONFIG_CRYPTO_TGR192 is not set | ||
1259 | # CONFIG_CRYPTO_GF128MUL is not set | ||
1260 | CONFIG_CRYPTO_ECB=m | ||
1261 | CONFIG_CRYPTO_CBC=m | ||
1262 | CONFIG_CRYPTO_PCBC=m | ||
1263 | # CONFIG_CRYPTO_LRW is not set | ||
1264 | # CONFIG_CRYPTO_XTS is not set | ||
1265 | # CONFIG_CRYPTO_CRYPTD is not set | ||
1266 | CONFIG_CRYPTO_DES=m | ||
1267 | # CONFIG_CRYPTO_FCRYPT is not set | ||
1268 | # CONFIG_CRYPTO_BLOWFISH is not set | ||
1269 | # CONFIG_CRYPTO_TWOFISH is not set | ||
1270 | # CONFIG_CRYPTO_SERPENT is not set | ||
1271 | # CONFIG_CRYPTO_AES is not set | ||
1272 | # CONFIG_CRYPTO_CAST5 is not set | ||
1273 | # CONFIG_CRYPTO_CAST6 is not set | ||
1274 | # CONFIG_CRYPTO_TEA is not set | ||
1275 | # CONFIG_CRYPTO_ARC4 is not set | ||
1276 | # CONFIG_CRYPTO_KHAZAD is not set | ||
1277 | # CONFIG_CRYPTO_ANUBIS is not set | ||
1278 | # CONFIG_CRYPTO_SEED is not set | ||
1279 | CONFIG_CRYPTO_DEFLATE=m | ||
1280 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | ||
1281 | CONFIG_CRYPTO_CRC32C=m | ||
1282 | # CONFIG_CRYPTO_CAMELLIA is not set | ||
1283 | # CONFIG_CRYPTO_TEST is not set | ||
1284 | # CONFIG_CRYPTO_AUTHENC is not set | ||
1285 | # CONFIG_CRYPTO_HW is not set | ||
diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S index 06efd1f9b800..ff88c48c5d19 100644 --- a/arch/ia64/ia32/ia32_entry.S +++ b/arch/ia64/ia32/ia32_entry.S | |||
@@ -262,7 +262,7 @@ ia32_syscall_table: | |||
262 | data8 sys_uselib | 262 | data8 sys_uselib |
263 | data8 sys_swapon | 263 | data8 sys_swapon |
264 | data8 sys_reboot | 264 | data8 sys_reboot |
265 | data8 sys32_readdir | 265 | data8 compat_sys_old_readdir |
266 | data8 sys32_mmap /* 90 */ | 266 | data8 sys32_mmap /* 90 */ |
267 | data8 sys32_munmap | 267 | data8 sys32_munmap |
268 | data8 sys_truncate | 268 | data8 sys_truncate |
diff --git a/arch/ia64/ia32/ia32priv.h b/arch/ia64/ia32/ia32priv.h index c5c872b250da..dd0c53687a96 100644 --- a/arch/ia64/ia32/ia32priv.h +++ b/arch/ia64/ia32/ia32priv.h | |||
@@ -276,13 +276,6 @@ typedef struct compat_siginfo { | |||
276 | } _sifields; | 276 | } _sifields; |
277 | } compat_siginfo_t; | 277 | } compat_siginfo_t; |
278 | 278 | ||
279 | struct old_linux32_dirent { | ||
280 | u32 d_ino; | ||
281 | u32 d_offset; | ||
282 | u16 d_namlen; | ||
283 | char d_name[1]; | ||
284 | }; | ||
285 | |||
286 | /* | 279 | /* |
287 | * IA-32 ELF specific definitions for IA-64. | 280 | * IA-32 ELF specific definitions for IA-64. |
288 | */ | 281 | */ |
diff --git a/arch/ia64/ia32/sys_ia32.c b/arch/ia64/ia32/sys_ia32.c index 465116aecb85..bf196cbb3796 100644 --- a/arch/ia64/ia32/sys_ia32.c +++ b/arch/ia64/ia32/sys_ia32.c | |||
@@ -1210,138 +1210,6 @@ sys32_settimeofday (struct compat_timeval __user *tv, struct timezone __user *tz | |||
1210 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); | 1210 | return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL); |
1211 | } | 1211 | } |
1212 | 1212 | ||
1213 | struct getdents32_callback { | ||
1214 | struct compat_dirent __user *current_dir; | ||
1215 | struct compat_dirent __user *previous; | ||
1216 | int count; | ||
1217 | int error; | ||
1218 | }; | ||
1219 | |||
1220 | struct readdir32_callback { | ||
1221 | struct old_linux32_dirent __user * dirent; | ||
1222 | int count; | ||
1223 | }; | ||
1224 | |||
1225 | static int | ||
1226 | filldir32 (void *__buf, const char *name, int namlen, loff_t offset, u64 ino, | ||
1227 | unsigned int d_type) | ||
1228 | { | ||
1229 | struct compat_dirent __user * dirent; | ||
1230 | struct getdents32_callback * buf = (struct getdents32_callback *) __buf; | ||
1231 | int reclen = ROUND_UP(offsetof(struct compat_dirent, d_name) + namlen + 1, 4); | ||
1232 | u32 d_ino; | ||
1233 | |||
1234 | buf->error = -EINVAL; /* only used if we fail.. */ | ||
1235 | if (reclen > buf->count) | ||
1236 | return -EINVAL; | ||
1237 | d_ino = ino; | ||
1238 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
1239 | return -EOVERFLOW; | ||
1240 | buf->error = -EFAULT; /* only used if we fail.. */ | ||
1241 | dirent = buf->previous; | ||
1242 | if (dirent) | ||
1243 | if (put_user(offset, &dirent->d_off)) | ||
1244 | return -EFAULT; | ||
1245 | dirent = buf->current_dir; | ||
1246 | buf->previous = dirent; | ||
1247 | if (put_user(d_ino, &dirent->d_ino) | ||
1248 | || put_user(reclen, &dirent->d_reclen) | ||
1249 | || copy_to_user(dirent->d_name, name, namlen) | ||
1250 | || put_user(0, dirent->d_name + namlen)) | ||
1251 | return -EFAULT; | ||
1252 | dirent = (struct compat_dirent __user *) ((char __user *) dirent + reclen); | ||
1253 | buf->current_dir = dirent; | ||
1254 | buf->count -= reclen; | ||
1255 | return 0; | ||
1256 | } | ||
1257 | |||
1258 | asmlinkage long | ||
1259 | sys32_getdents (unsigned int fd, struct compat_dirent __user *dirent, unsigned int count) | ||
1260 | { | ||
1261 | struct file * file; | ||
1262 | struct compat_dirent __user * lastdirent; | ||
1263 | struct getdents32_callback buf; | ||
1264 | int error; | ||
1265 | |||
1266 | error = -EFAULT; | ||
1267 | if (!access_ok(VERIFY_WRITE, dirent, count)) | ||
1268 | goto out; | ||
1269 | |||
1270 | error = -EBADF; | ||
1271 | file = fget(fd); | ||
1272 | if (!file) | ||
1273 | goto out; | ||
1274 | |||
1275 | buf.current_dir = dirent; | ||
1276 | buf.previous = NULL; | ||
1277 | buf.count = count; | ||
1278 | buf.error = 0; | ||
1279 | |||
1280 | error = vfs_readdir(file, filldir32, &buf); | ||
1281 | if (error < 0) | ||
1282 | goto out_putf; | ||
1283 | error = buf.error; | ||
1284 | lastdirent = buf.previous; | ||
1285 | if (lastdirent) { | ||
1286 | if (put_user(file->f_pos, &lastdirent->d_off)) | ||
1287 | error = -EFAULT; | ||
1288 | else | ||
1289 | error = count - buf.count; | ||
1290 | } | ||
1291 | |||
1292 | out_putf: | ||
1293 | fput(file); | ||
1294 | out: | ||
1295 | return error; | ||
1296 | } | ||
1297 | |||
1298 | static int | ||
1299 | fillonedir32 (void * __buf, const char * name, int namlen, loff_t offset, u64 ino, | ||
1300 | unsigned int d_type) | ||
1301 | { | ||
1302 | struct readdir32_callback * buf = (struct readdir32_callback *) __buf; | ||
1303 | struct old_linux32_dirent __user * dirent; | ||
1304 | u32 d_ino; | ||
1305 | |||
1306 | if (buf->count) | ||
1307 | return -EINVAL; | ||
1308 | d_ino = ino; | ||
1309 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
1310 | return -EOVERFLOW; | ||
1311 | buf->count++; | ||
1312 | dirent = buf->dirent; | ||
1313 | if (put_user(d_ino, &dirent->d_ino) | ||
1314 | || put_user(offset, &dirent->d_offset) | ||
1315 | || put_user(namlen, &dirent->d_namlen) | ||
1316 | || copy_to_user(dirent->d_name, name, namlen) | ||
1317 | || put_user(0, dirent->d_name + namlen)) | ||
1318 | return -EFAULT; | ||
1319 | return 0; | ||
1320 | } | ||
1321 | |||
1322 | asmlinkage long | ||
1323 | sys32_readdir (unsigned int fd, void __user *dirent, unsigned int count) | ||
1324 | { | ||
1325 | int error; | ||
1326 | struct file * file; | ||
1327 | struct readdir32_callback buf; | ||
1328 | |||
1329 | error = -EBADF; | ||
1330 | file = fget(fd); | ||
1331 | if (!file) | ||
1332 | goto out; | ||
1333 | |||
1334 | buf.count = 0; | ||
1335 | buf.dirent = dirent; | ||
1336 | |||
1337 | error = vfs_readdir(file, fillonedir32, &buf); | ||
1338 | if (error >= 0) | ||
1339 | error = buf.count; | ||
1340 | fput(file); | ||
1341 | out: | ||
1342 | return error; | ||
1343 | } | ||
1344 | |||
1345 | struct sel_arg_struct { | 1213 | struct sel_arg_struct { |
1346 | unsigned int n; | 1214 | unsigned int n; |
1347 | unsigned int inp; | 1215 | unsigned int inp; |
diff --git a/arch/ia64/include/asm/kexec.h b/arch/ia64/include/asm/kexec.h index 541be835fc5a..e1d58f819d78 100644 --- a/arch/ia64/include/asm/kexec.h +++ b/arch/ia64/include/asm/kexec.h | |||
@@ -9,7 +9,7 @@ | |||
9 | /* Maximum address we can use for the control code buffer */ | 9 | /* Maximum address we can use for the control code buffer */ |
10 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 10 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
11 | 11 | ||
12 | #define KEXEC_CONTROL_CODE_SIZE (8192 + 8192 + 4096) | 12 | #define KEXEC_CONTROL_PAGE_SIZE (8192 + 8192 + 4096) |
13 | 13 | ||
14 | /* The native architecture */ | 14 | /* The native architecture */ |
15 | #define KEXEC_ARCH KEXEC_ARCH_IA_64 | 15 | #define KEXEC_ARCH KEXEC_ARCH_IA_64 |
diff --git a/arch/ia64/kernel/smp.c b/arch/ia64/kernel/smp.c index 3676468612b6..da8f020d82c1 100644 --- a/arch/ia64/kernel/smp.c +++ b/arch/ia64/kernel/smp.c | |||
@@ -58,7 +58,7 @@ static struct local_tlb_flush_counts { | |||
58 | unsigned int count; | 58 | unsigned int count; |
59 | } __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS]; | 59 | } __attribute__((__aligned__(32))) local_tlb_flush_counts[NR_CPUS]; |
60 | 60 | ||
61 | static DEFINE_PER_CPU(unsigned int, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned; | 61 | static DEFINE_PER_CPU(unsigned short, shadow_flush_counts[NR_CPUS]) ____cacheline_aligned; |
62 | 62 | ||
63 | #define IPI_CALL_FUNC 0 | 63 | #define IPI_CALL_FUNC 0 |
64 | #define IPI_CPU_STOP 1 | 64 | #define IPI_CPU_STOP 1 |
@@ -254,7 +254,7 @@ smp_local_flush_tlb(void) | |||
254 | void | 254 | void |
255 | smp_flush_tlb_cpumask(cpumask_t xcpumask) | 255 | smp_flush_tlb_cpumask(cpumask_t xcpumask) |
256 | { | 256 | { |
257 | unsigned int *counts = __ia64_per_cpu_var(shadow_flush_counts); | 257 | unsigned short *counts = __ia64_per_cpu_var(shadow_flush_counts); |
258 | cpumask_t cpumask = xcpumask; | 258 | cpumask_t cpumask = xcpumask; |
259 | int mycpu, cpu, flush_mycpu = 0; | 259 | int mycpu, cpu, flush_mycpu = 0; |
260 | 260 | ||
@@ -262,7 +262,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask) | |||
262 | mycpu = smp_processor_id(); | 262 | mycpu = smp_processor_id(); |
263 | 263 | ||
264 | for_each_cpu_mask(cpu, cpumask) | 264 | for_each_cpu_mask(cpu, cpumask) |
265 | counts[cpu] = local_tlb_flush_counts[cpu].count; | 265 | counts[cpu] = local_tlb_flush_counts[cpu].count & 0xffff; |
266 | 266 | ||
267 | mb(); | 267 | mb(); |
268 | for_each_cpu_mask(cpu, cpumask) { | 268 | for_each_cpu_mask(cpu, cpumask) { |
@@ -276,7 +276,7 @@ smp_flush_tlb_cpumask(cpumask_t xcpumask) | |||
276 | smp_local_flush_tlb(); | 276 | smp_local_flush_tlb(); |
277 | 277 | ||
278 | for_each_cpu_mask(cpu, cpumask) | 278 | for_each_cpu_mask(cpu, cpumask) |
279 | while(counts[cpu] == local_tlb_flush_counts[cpu].count) | 279 | while(counts[cpu] == (local_tlb_flush_counts[cpu].count & 0xffff)) |
280 | udelay(FLUSH_DELAY); | 280 | udelay(FLUSH_DELAY); |
281 | 281 | ||
282 | preempt_enable(); | 282 | preempt_enable(); |
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 77b15f80f101..7545037a8625 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c | |||
@@ -324,7 +324,6 @@ pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl) | |||
324 | struct pci_bus * __devinit | 324 | struct pci_bus * __devinit |
325 | pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) | 325 | pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) |
326 | { | 326 | { |
327 | struct pci_root_info info; | ||
328 | struct pci_controller *controller; | 327 | struct pci_controller *controller; |
329 | unsigned int windows = 0; | 328 | unsigned int windows = 0; |
330 | struct pci_bus *pbus; | 329 | struct pci_bus *pbus; |
@@ -346,22 +345,24 @@ pci_acpi_scan_root(struct acpi_device *device, int domain, int bus) | |||
346 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, | 345 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window, |
347 | &windows); | 346 | &windows); |
348 | if (windows) { | 347 | if (windows) { |
348 | struct pci_root_info info; | ||
349 | |||
349 | controller->window = | 350 | controller->window = |
350 | kmalloc_node(sizeof(*controller->window) * windows, | 351 | kmalloc_node(sizeof(*controller->window) * windows, |
351 | GFP_KERNEL, controller->node); | 352 | GFP_KERNEL, controller->node); |
352 | if (!controller->window) | 353 | if (!controller->window) |
353 | goto out2; | 354 | goto out2; |
354 | } | ||
355 | 355 | ||
356 | name = kmalloc(16, GFP_KERNEL); | 356 | name = kmalloc(16, GFP_KERNEL); |
357 | if (!name) | 357 | if (!name) |
358 | goto out3; | 358 | goto out3; |
359 | 359 | ||
360 | sprintf(name, "PCI Bus %04x:%02x", domain, bus); | 360 | sprintf(name, "PCI Bus %04x:%02x", domain, bus); |
361 | info.controller = controller; | 361 | info.controller = controller; |
362 | info.name = name; | 362 | info.name = name; |
363 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, add_window, | 363 | acpi_walk_resources(device->handle, METHOD_NAME__CRS, |
364 | &info); | 364 | add_window, &info); |
365 | } | ||
365 | /* | 366 | /* |
366 | * See arch/x86/pci/acpi.c. | 367 | * See arch/x86/pci/acpi.c. |
367 | * The desired pci bus might already be scanned in a quirk. We | 368 | * The desired pci bus might already be scanned in a quirk. We |
diff --git a/arch/mn10300/kernel/mn10300-serial.c b/arch/mn10300/kernel/mn10300-serial.c index 8b054e7a8ae8..aa07d0cd1905 100644 --- a/arch/mn10300/kernel/mn10300-serial.c +++ b/arch/mn10300/kernel/mn10300-serial.c | |||
@@ -17,7 +17,6 @@ static const char serial_revdate[] = "2007-11-06"; | |||
17 | #define SUPPORT_SYSRQ | 17 | #define SUPPORT_SYSRQ |
18 | #endif | 18 | #endif |
19 | 19 | ||
20 | #include <linux/version.h> | ||
21 | #include <linux/module.h> | 20 | #include <linux/module.h> |
22 | #include <linux/serial.h> | 21 | #include <linux/serial.h> |
23 | #include <linux/circ_buf.h> | 22 | #include <linux/circ_buf.h> |
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index fbe2932fa9e9..6251a4b10be7 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h | |||
@@ -291,6 +291,28 @@ struct hvcall_mpp_data { | |||
291 | }; | 291 | }; |
292 | 292 | ||
293 | int h_get_mpp(struct hvcall_mpp_data *); | 293 | int h_get_mpp(struct hvcall_mpp_data *); |
294 | |||
295 | #ifdef CONFIG_PPC_PSERIES | ||
296 | extern int CMO_PrPSP; | ||
297 | extern int CMO_SecPSP; | ||
298 | extern unsigned long CMO_PageSize; | ||
299 | |||
300 | static inline int cmo_get_primary_psp(void) | ||
301 | { | ||
302 | return CMO_PrPSP; | ||
303 | } | ||
304 | |||
305 | static inline int cmo_get_secondary_psp(void) | ||
306 | { | ||
307 | return CMO_SecPSP; | ||
308 | } | ||
309 | |||
310 | static inline unsigned long cmo_get_page_size(void) | ||
311 | { | ||
312 | return CMO_PageSize; | ||
313 | } | ||
314 | #endif /* CONFIG_PPC_PSERIES */ | ||
315 | |||
294 | #endif /* __ASSEMBLY__ */ | 316 | #endif /* __ASSEMBLY__ */ |
295 | #endif /* __KERNEL__ */ | 317 | #endif /* __KERNEL__ */ |
296 | #endif /* _ASM_POWERPC_HVCALL_H */ | 318 | #endif /* _ASM_POWERPC_HVCALL_H */ |
diff --git a/arch/powerpc/include/asm/ide.h b/arch/powerpc/include/asm/ide.h index 048480e340f2..da01b20aea59 100644 --- a/arch/powerpc/include/asm/ide.h +++ b/arch/powerpc/include/asm/ide.h | |||
@@ -6,12 +6,7 @@ | |||
6 | #ifndef _ASM_POWERPC_IDE_H | 6 | #ifndef _ASM_POWERPC_IDE_H |
7 | #define _ASM_POWERPC_IDE_H | 7 | #define _ASM_POWERPC_IDE_H |
8 | 8 | ||
9 | #ifdef __KERNEL__ | 9 | #include <linux/compiler.h> |
10 | |||
11 | #ifndef __powerpc64__ | ||
12 | #include <linux/sched.h> | ||
13 | #include <asm/mpc8xx.h> | ||
14 | #endif | ||
15 | #include <asm/io.h> | 10 | #include <asm/io.h> |
16 | 11 | ||
17 | #define __ide_mm_insw(p, a, c) readsw((void __iomem *)(p), (a), (c)) | 12 | #define __ide_mm_insw(p, a, c) readsw((void __iomem *)(p), (a), (c)) |
@@ -19,40 +14,4 @@ | |||
19 | #define __ide_mm_outsw(p, a, c) writesw((void __iomem *)(p), (a), (c)) | 14 | #define __ide_mm_outsw(p, a, c) writesw((void __iomem *)(p), (a), (c)) |
20 | #define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c)) | 15 | #define __ide_mm_outsl(p, a, c) writesl((void __iomem *)(p), (a), (c)) |
21 | 16 | ||
22 | #ifndef __powerpc64__ | ||
23 | #include <linux/ioport.h> | ||
24 | |||
25 | /* FIXME: use ide_platform host driver */ | ||
26 | static __inline__ int ide_default_irq(unsigned long base) | ||
27 | { | ||
28 | #ifdef CONFIG_PPLUS | ||
29 | switch (base) { | ||
30 | case 0x1f0: return 14; | ||
31 | case 0x170: return 15; | ||
32 | } | ||
33 | #endif | ||
34 | return 0; | ||
35 | } | ||
36 | |||
37 | /* FIXME: use ide_platform host driver */ | ||
38 | static __inline__ unsigned long ide_default_io_base(int index) | ||
39 | { | ||
40 | #ifdef CONFIG_PPLUS | ||
41 | switch (index) { | ||
42 | case 0: return 0x1f0; | ||
43 | case 1: return 0x170; | ||
44 | } | ||
45 | #endif | ||
46 | return 0; | ||
47 | } | ||
48 | |||
49 | #ifdef CONFIG_BLK_DEV_MPC8xx_IDE | ||
50 | #define IDE_ARCH_ACK_INTR 1 | ||
51 | #define ide_ack_intr(hwif) ((hwif)->ack_intr ? (hwif)->ack_intr(hwif) : 1) | ||
52 | #endif | ||
53 | |||
54 | #endif /* __powerpc64__ */ | ||
55 | |||
56 | #endif /* __KERNEL__ */ | ||
57 | |||
58 | #endif /* _ASM_POWERPC_IDE_H */ | 17 | #endif /* _ASM_POWERPC_IDE_H */ |
diff --git a/arch/powerpc/include/asm/irqflags.h b/arch/powerpc/include/asm/irqflags.h index 17ba3a881bfd..5f68ecfdf516 100644 --- a/arch/powerpc/include/asm/irqflags.h +++ b/arch/powerpc/include/asm/irqflags.h | |||
@@ -20,7 +20,7 @@ | |||
20 | #define TRACE_ENABLE_INTS bl .trace_hardirqs_on | 20 | #define TRACE_ENABLE_INTS bl .trace_hardirqs_on |
21 | #define TRACE_DISABLE_INTS bl .trace_hardirqs_off | 21 | #define TRACE_DISABLE_INTS bl .trace_hardirqs_off |
22 | #define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) \ | 22 | #define TRACE_AND_RESTORE_IRQ_PARTIAL(en,skip) \ |
23 | cmpdi en, 0; \ | 23 | cmpdi en,0; \ |
24 | bne 95f; \ | 24 | bne 95f; \ |
25 | stb en,PACASOFTIRQEN(r13); \ | 25 | stb en,PACASOFTIRQEN(r13); \ |
26 | bl .trace_hardirqs_off; \ | 26 | bl .trace_hardirqs_off; \ |
@@ -29,7 +29,8 @@ | |||
29 | li en,1; | 29 | li en,1; |
30 | #define TRACE_AND_RESTORE_IRQ(en) \ | 30 | #define TRACE_AND_RESTORE_IRQ(en) \ |
31 | TRACE_AND_RESTORE_IRQ_PARTIAL(en,96f); \ | 31 | TRACE_AND_RESTORE_IRQ_PARTIAL(en,96f); \ |
32 | 96: stb en,PACASOFTIRQEN(r13) | 32 | stb en,PACASOFTIRQEN(r13); \ |
33 | 96: | ||
33 | #else | 34 | #else |
34 | #define TRACE_ENABLE_INTS | 35 | #define TRACE_ENABLE_INTS |
35 | #define TRACE_DISABLE_INTS | 36 | #define TRACE_DISABLE_INTS |
diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h index acdcdc66f1b6..3736d9b33289 100644 --- a/arch/powerpc/include/asm/kexec.h +++ b/arch/powerpc/include/asm/kexec.h | |||
@@ -22,7 +22,7 @@ | |||
22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
23 | #endif | 23 | #endif |
24 | 24 | ||
25 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 25 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
26 | 26 | ||
27 | /* The native architecture */ | 27 | /* The native architecture */ |
28 | #ifdef __powerpc64__ | 28 | #ifdef __powerpc64__ |
diff --git a/arch/powerpc/include/asm/mmu_context.h b/arch/powerpc/include/asm/mmu_context.h index 9102b8bf0ead..6b993ef452ff 100644 --- a/arch/powerpc/include/asm/mmu_context.h +++ b/arch/powerpc/include/asm/mmu_context.h | |||
@@ -147,7 +147,6 @@ static inline void get_mmu_context(struct mm_struct *mm) | |||
147 | static inline int init_new_context(struct task_struct *t, struct mm_struct *mm) | 147 | static inline int init_new_context(struct task_struct *t, struct mm_struct *mm) |
148 | { | 148 | { |
149 | mm->context.id = NO_CONTEXT; | 149 | mm->context.id = NO_CONTEXT; |
150 | mm->context.vdso_base = 0; | ||
151 | return 0; | 150 | return 0; |
152 | } | 151 | } |
153 | 152 | ||
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index e084272ed1c2..f6cc7a43b4fa 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -92,7 +92,7 @@ COMPAT_SYS_SPU(readlink) | |||
92 | SYSCALL(uselib) | 92 | SYSCALL(uselib) |
93 | SYSCALL(swapon) | 93 | SYSCALL(swapon) |
94 | SYSCALL(reboot) | 94 | SYSCALL(reboot) |
95 | SYSX(sys_ni_syscall,old32_readdir,old_readdir) | 95 | SYSX(sys_ni_syscall,compat_sys_old_readdir,old_readdir) |
96 | SYSCALL_SPU(mmap) | 96 | SYSCALL_SPU(mmap) |
97 | SYSCALL_SPU(munmap) | 97 | SYSCALL_SPU(munmap) |
98 | SYSCALL_SPU(truncate) | 98 | SYSCALL_SPU(truncate) |
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index e0debcca0bfa..a323c9b32ee1 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
@@ -86,6 +86,19 @@ static int __init parse_savemaxmem(char *p) | |||
86 | } | 86 | } |
87 | __setup("savemaxmem=", parse_savemaxmem); | 87 | __setup("savemaxmem=", parse_savemaxmem); |
88 | 88 | ||
89 | |||
90 | static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize, | ||
91 | unsigned long offset, int userbuf) | ||
92 | { | ||
93 | if (userbuf) { | ||
94 | if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) | ||
95 | return -EFAULT; | ||
96 | } else | ||
97 | memcpy(buf, (vaddr + offset), csize); | ||
98 | |||
99 | return csize; | ||
100 | } | ||
101 | |||
89 | /** | 102 | /** |
90 | * copy_oldmem_page - copy one page from "oldmem" | 103 | * copy_oldmem_page - copy one page from "oldmem" |
91 | * @pfn: page frame number to be copied | 104 | * @pfn: page frame number to be copied |
@@ -107,16 +120,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, | |||
107 | if (!csize) | 120 | if (!csize) |
108 | return 0; | 121 | return 0; |
109 | 122 | ||
110 | vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); | 123 | csize = min(csize, PAGE_SIZE); |
111 | 124 | ||
112 | if (userbuf) { | 125 | if (pfn < max_pfn) { |
113 | if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) { | 126 | vaddr = __va(pfn << PAGE_SHIFT); |
114 | iounmap(vaddr); | 127 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); |
115 | return -EFAULT; | 128 | } else { |
116 | } | 129 | vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0); |
117 | } else | 130 | csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf); |
118 | memcpy(buf, (vaddr + offset), csize); | 131 | iounmap(vaddr); |
132 | } | ||
119 | 133 | ||
120 | iounmap(vaddr); | ||
121 | return csize; | 134 | return csize; |
122 | } | 135 | } |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 99ee2f0f0f2b..8bb657519299 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
@@ -1155,7 +1155,7 @@ flush_tlbs: | |||
1155 | lis r10, 0x40 | 1155 | lis r10, 0x40 |
1156 | 1: addic. r10, r10, -0x1000 | 1156 | 1: addic. r10, r10, -0x1000 |
1157 | tlbie r10 | 1157 | tlbie r10 |
1158 | blt 1b | 1158 | bgt 1b |
1159 | sync | 1159 | sync |
1160 | blr | 1160 | blr |
1161 | 1161 | ||
diff --git a/arch/powerpc/kernel/ibmebus.c b/arch/powerpc/kernel/ibmebus.c index 9d42eb57aea3..a06362223f8d 100644 --- a/arch/powerpc/kernel/ibmebus.c +++ b/arch/powerpc/kernel/ibmebus.c | |||
@@ -233,17 +233,6 @@ void ibmebus_free_irq(u32 ist, void *dev_id) | |||
233 | } | 233 | } |
234 | EXPORT_SYMBOL(ibmebus_free_irq); | 234 | EXPORT_SYMBOL(ibmebus_free_irq); |
235 | 235 | ||
236 | static ssize_t name_show(struct device *dev, | ||
237 | struct device_attribute *attr, char *buf) | ||
238 | { | ||
239 | return sprintf(buf, "%s\n", to_of_device(dev)->node->name); | ||
240 | } | ||
241 | |||
242 | static struct device_attribute ibmebus_dev_attrs[] = { | ||
243 | __ATTR_RO(name), | ||
244 | __ATTR_NULL | ||
245 | }; | ||
246 | |||
247 | static char *ibmebus_chomp(const char *in, size_t count) | 236 | static char *ibmebus_chomp(const char *in, size_t count) |
248 | { | 237 | { |
249 | char *out = kmalloc(count + 1, GFP_KERNEL); | 238 | char *out = kmalloc(count + 1, GFP_KERNEL); |
@@ -327,7 +316,6 @@ static struct bus_attribute ibmebus_bus_attrs[] = { | |||
327 | 316 | ||
328 | struct bus_type ibmebus_bus_type = { | 317 | struct bus_type ibmebus_bus_type = { |
329 | .uevent = of_device_uevent, | 318 | .uevent = of_device_uevent, |
330 | .dev_attrs = ibmebus_dev_attrs, | ||
331 | .bus_attrs = ibmebus_bus_attrs | 319 | .bus_attrs = ibmebus_bus_attrs |
332 | }; | 320 | }; |
333 | EXPORT_SYMBOL(ibmebus_bus_type); | 321 | EXPORT_SYMBOL(ibmebus_bus_type); |
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c index 1a09719c7628..b3eef30b5131 100644 --- a/arch/powerpc/kernel/lparcfg.c +++ b/arch/powerpc/kernel/lparcfg.c | |||
@@ -416,6 +416,8 @@ static void pseries_cmo_data(struct seq_file *m) | |||
416 | unsigned long cmo_faults = 0; | 416 | unsigned long cmo_faults = 0; |
417 | unsigned long cmo_fault_time = 0; | 417 | unsigned long cmo_fault_time = 0; |
418 | 418 | ||
419 | seq_printf(m, "cmo_enabled=%d\n", firmware_has_feature(FW_FEATURE_CMO)); | ||
420 | |||
419 | if (!firmware_has_feature(FW_FEATURE_CMO)) | 421 | if (!firmware_has_feature(FW_FEATURE_CMO)) |
420 | return; | 422 | return; |
421 | 423 | ||
@@ -427,6 +429,9 @@ static void pseries_cmo_data(struct seq_file *m) | |||
427 | seq_printf(m, "cmo_faults=%lu\n", cmo_faults); | 429 | seq_printf(m, "cmo_faults=%lu\n", cmo_faults); |
428 | seq_printf(m, "cmo_fault_time_usec=%lu\n", | 430 | seq_printf(m, "cmo_fault_time_usec=%lu\n", |
429 | cmo_fault_time / tb_ticks_per_usec); | 431 | cmo_fault_time / tb_ticks_per_usec); |
432 | seq_printf(m, "cmo_primary_psp=%d\n", cmo_get_primary_psp()); | ||
433 | seq_printf(m, "cmo_secondary_psp=%d\n", cmo_get_secondary_psp()); | ||
434 | seq_printf(m, "cmo_page_size=%lu\n", cmo_get_page_size()); | ||
430 | } | 435 | } |
431 | 436 | ||
432 | static int pseries_lparcfg_data(struct seq_file *m, void *v) | 437 | static int pseries_lparcfg_data(struct seq_file *m, void *v) |
diff --git a/arch/powerpc/kernel/machine_kexec_32.c b/arch/powerpc/kernel/machine_kexec_32.c index cbaa34196797..ae63a964b858 100644 --- a/arch/powerpc/kernel/machine_kexec_32.c +++ b/arch/powerpc/kernel/machine_kexec_32.c | |||
@@ -51,7 +51,7 @@ void default_machine_kexec(struct kimage *image) | |||
51 | relocate_new_kernel_size); | 51 | relocate_new_kernel_size); |
52 | 52 | ||
53 | flush_icache_range(reboot_code_buffer, | 53 | flush_icache_range(reboot_code_buffer, |
54 | reboot_code_buffer + KEXEC_CONTROL_CODE_SIZE); | 54 | reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE); |
55 | printk(KERN_INFO "Bye!\n"); | 55 | printk(KERN_INFO "Bye!\n"); |
56 | 56 | ||
57 | /* now call it */ | 57 | /* now call it */ |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 6321ae36f729..7a6dfbca7682 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
@@ -899,7 +899,7 @@ relocate_new_kernel: | |||
899 | 899 | ||
900 | /* set a new stack at the bottom of our page... */ | 900 | /* set a new stack at the bottom of our page... */ |
901 | /* (not really needed now) */ | 901 | /* (not really needed now) */ |
902 | addi r1, r4, KEXEC_CONTROL_CODE_SIZE - 8 /* for LR Save+Back Chain */ | 902 | addi r1, r4, KEXEC_CONTROL_PAGE_SIZE - 8 /* for LR Save+Back Chain */ |
903 | stw r0, 0(r1) | 903 | stw r0, 0(r1) |
904 | 904 | ||
905 | /* Do the copies */ | 905 | /* Do the copies */ |
diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c index af07003573c4..7ff292475269 100644 --- a/arch/powerpc/kernel/module.c +++ b/arch/powerpc/kernel/module.c | |||
@@ -99,18 +99,3 @@ void module_arch_cleanup(struct module *mod) | |||
99 | { | 99 | { |
100 | module_bug_cleanup(mod); | 100 | module_bug_cleanup(mod); |
101 | } | 101 | } |
102 | |||
103 | struct bug_entry *module_find_bug(unsigned long bugaddr) | ||
104 | { | ||
105 | struct mod_arch_specific *mod; | ||
106 | unsigned int i; | ||
107 | struct bug_entry *bug; | ||
108 | |||
109 | list_for_each_entry(mod, &module_bug_list, bug_list) { | ||
110 | bug = mod->bug_table; | ||
111 | for (i = 0; i < mod->num_bugs; ++i, ++bug) | ||
112 | if (bugaddr == bug->bug_addr) | ||
113 | return bug; | ||
114 | } | ||
115 | return NULL; | ||
116 | } | ||
diff --git a/arch/powerpc/kernel/sys_ppc32.c b/arch/powerpc/kernel/sys_ppc32.c index 709f8cb8bfca..d98634c76060 100644 --- a/arch/powerpc/kernel/sys_ppc32.c +++ b/arch/powerpc/kernel/sys_ppc32.c | |||
@@ -52,63 +52,6 @@ | |||
52 | #include <asm/ppc-pci.h> | 52 | #include <asm/ppc-pci.h> |
53 | #include <asm/syscalls.h> | 53 | #include <asm/syscalls.h> |
54 | 54 | ||
55 | struct old_linux_dirent32 { | ||
56 | u32 d_ino; | ||
57 | u32 d_offset; | ||
58 | unsigned short d_namlen; | ||
59 | char d_name[1]; | ||
60 | }; | ||
61 | |||
62 | struct readdir_callback32 { | ||
63 | struct old_linux_dirent32 __user * dirent; | ||
64 | int count; | ||
65 | }; | ||
66 | |||
67 | static int fillonedir(void * __buf, const char * name, int namlen, | ||
68 | off_t offset, u64 ino, unsigned int d_type) | ||
69 | { | ||
70 | struct readdir_callback32 * buf = (struct readdir_callback32 *) __buf; | ||
71 | struct old_linux_dirent32 __user * dirent; | ||
72 | ino_t d_ino; | ||
73 | |||
74 | if (buf->count) | ||
75 | return -EINVAL; | ||
76 | d_ino = ino; | ||
77 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
78 | return -EOVERFLOW; | ||
79 | buf->count++; | ||
80 | dirent = buf->dirent; | ||
81 | put_user(d_ino, &dirent->d_ino); | ||
82 | put_user(offset, &dirent->d_offset); | ||
83 | put_user(namlen, &dirent->d_namlen); | ||
84 | copy_to_user(dirent->d_name, name, namlen); | ||
85 | put_user(0, dirent->d_name + namlen); | ||
86 | return 0; | ||
87 | } | ||
88 | |||
89 | asmlinkage int old32_readdir(unsigned int fd, struct old_linux_dirent32 __user *dirent, unsigned int count) | ||
90 | { | ||
91 | int error = -EBADF; | ||
92 | struct file * file; | ||
93 | struct readdir_callback32 buf; | ||
94 | |||
95 | file = fget(fd); | ||
96 | if (!file) | ||
97 | goto out; | ||
98 | |||
99 | buf.count = 0; | ||
100 | buf.dirent = dirent; | ||
101 | |||
102 | error = vfs_readdir(file, (filldir_t)fillonedir, &buf); | ||
103 | if (error < 0) | ||
104 | goto out_putf; | ||
105 | error = buf.count; | ||
106 | |||
107 | out_putf: | ||
108 | fput(file); | ||
109 | out: | ||
110 | return error; | ||
111 | } | ||
112 | 55 | ||
113 | asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp, | 56 | asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp, |
114 | compat_ulong_t __user *outp, compat_ulong_t __user *exp, | 57 | compat_ulong_t __user *outp, compat_ulong_t __user *exp, |
diff --git a/arch/powerpc/kernel/vio.c b/arch/powerpc/kernel/vio.c index 22a3c33fd751..2750fbab1975 100644 --- a/arch/powerpc/kernel/vio.c +++ b/arch/powerpc/kernel/vio.c | |||
@@ -1113,7 +1113,7 @@ static int vio_bus_probe(struct device *dev) | |||
1113 | return error; | 1113 | return error; |
1114 | } | 1114 | } |
1115 | error = viodrv->probe(viodev, id); | 1115 | error = viodrv->probe(viodev, id); |
1116 | if (error) | 1116 | if (error && firmware_has_feature(FW_FEATURE_CMO)) |
1117 | vio_cmo_bus_remove(viodev); | 1117 | vio_cmo_bus_remove(viodev); |
1118 | } | 1118 | } |
1119 | 1119 | ||
diff --git a/arch/powerpc/platforms/cell/spufs/run.c b/arch/powerpc/platforms/cell/spufs/run.c index f7edba6cb795..c9bb7cfd3dca 100644 --- a/arch/powerpc/platforms/cell/spufs/run.c +++ b/arch/powerpc/platforms/cell/spufs/run.c | |||
@@ -206,11 +206,6 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc) | |||
206 | (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE); | 206 | (SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE); |
207 | if (runcntl == 0) | 207 | if (runcntl == 0) |
208 | runcntl = SPU_RUNCNTL_RUNNABLE; | 208 | runcntl = SPU_RUNCNTL_RUNNABLE; |
209 | } | ||
210 | |||
211 | if (ctx->flags & SPU_CREATE_NOSCHED) { | ||
212 | spuctx_switch_state(ctx, SPU_UTIL_USER); | ||
213 | ctx->ops->runcntl_write(ctx, runcntl); | ||
214 | } else { | 209 | } else { |
215 | unsigned long privcntl; | 210 | unsigned long privcntl; |
216 | 211 | ||
@@ -219,9 +214,15 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc) | |||
219 | else | 214 | else |
220 | privcntl = SPU_PRIVCNTL_MODE_NORMAL; | 215 | privcntl = SPU_PRIVCNTL_MODE_NORMAL; |
221 | 216 | ||
222 | ctx->ops->npc_write(ctx, *npc); | ||
223 | ctx->ops->privcntl_write(ctx, privcntl); | 217 | ctx->ops->privcntl_write(ctx, privcntl); |
224 | ctx->ops->runcntl_write(ctx, runcntl); | 218 | ctx->ops->npc_write(ctx, *npc); |
219 | } | ||
220 | |||
221 | ctx->ops->runcntl_write(ctx, runcntl); | ||
222 | |||
223 | if (ctx->flags & SPU_CREATE_NOSCHED) { | ||
224 | spuctx_switch_state(ctx, SPU_UTIL_USER); | ||
225 | } else { | ||
225 | 226 | ||
226 | if (ctx->state == SPU_STATE_SAVED) { | 227 | if (ctx->state == SPU_STATE_SAVED) { |
227 | ret = spu_activate(ctx, 0); | 228 | ret = spu_activate(ctx, 0); |
diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c index 2deeeba7eccf..1c1b627ee843 100644 --- a/arch/powerpc/platforms/cell/spufs/sched.c +++ b/arch/powerpc/platforms/cell/spufs/sched.c | |||
@@ -641,8 +641,10 @@ static struct spu *find_victim(struct spu_context *ctx) | |||
641 | 641 | ||
642 | if (tmp && tmp->prio > ctx->prio && | 642 | if (tmp && tmp->prio > ctx->prio && |
643 | !(tmp->flags & SPU_CREATE_NOSCHED) && | 643 | !(tmp->flags & SPU_CREATE_NOSCHED) && |
644 | (!victim || tmp->prio > victim->prio)) | 644 | (!victim || tmp->prio > victim->prio)) { |
645 | victim = spu->ctx; | 645 | victim = spu->ctx; |
646 | get_spu_context(victim); | ||
647 | } | ||
646 | } | 648 | } |
647 | mutex_unlock(&cbe_spu_info[node].list_mutex); | 649 | mutex_unlock(&cbe_spu_info[node].list_mutex); |
648 | 650 | ||
@@ -658,6 +660,7 @@ static struct spu *find_victim(struct spu_context *ctx) | |||
658 | * look at another context or give up after X retries. | 660 | * look at another context or give up after X retries. |
659 | */ | 661 | */ |
660 | if (!mutex_trylock(&victim->state_mutex)) { | 662 | if (!mutex_trylock(&victim->state_mutex)) { |
663 | put_spu_context(victim); | ||
661 | victim = NULL; | 664 | victim = NULL; |
662 | goto restart; | 665 | goto restart; |
663 | } | 666 | } |
@@ -670,6 +673,7 @@ static struct spu *find_victim(struct spu_context *ctx) | |||
670 | * restart the search. | 673 | * restart the search. |
671 | */ | 674 | */ |
672 | mutex_unlock(&victim->state_mutex); | 675 | mutex_unlock(&victim->state_mutex); |
676 | put_spu_context(victim); | ||
673 | victim = NULL; | 677 | victim = NULL; |
674 | goto restart; | 678 | goto restart; |
675 | } | 679 | } |
@@ -687,6 +691,7 @@ static struct spu *find_victim(struct spu_context *ctx) | |||
687 | spu_add_to_rq(victim); | 691 | spu_add_to_rq(victim); |
688 | 692 | ||
689 | mutex_unlock(&victim->state_mutex); | 693 | mutex_unlock(&victim->state_mutex); |
694 | put_spu_context(victim); | ||
690 | 695 | ||
691 | return spu; | 696 | return spu; |
692 | } | 697 | } |
@@ -985,9 +990,11 @@ static int spusched_thread(void *unused) | |||
985 | struct spu_context *ctx = spu->ctx; | 990 | struct spu_context *ctx = spu->ctx; |
986 | 991 | ||
987 | if (ctx) { | 992 | if (ctx) { |
993 | get_spu_context(ctx); | ||
988 | mutex_unlock(mtx); | 994 | mutex_unlock(mtx); |
989 | spusched_tick(ctx); | 995 | spusched_tick(ctx); |
990 | mutex_lock(mtx); | 996 | mutex_lock(mtx); |
997 | put_spu_context(ctx); | ||
991 | } | 998 | } |
992 | } | 999 | } |
993 | mutex_unlock(mtx); | 1000 | mutex_unlock(mtx); |
@@ -1030,7 +1037,7 @@ void spuctx_switch_state(struct spu_context *ctx, | |||
1030 | node = spu->node; | 1037 | node = spu->node; |
1031 | if (old_state == SPU_UTIL_USER) | 1038 | if (old_state == SPU_UTIL_USER) |
1032 | atomic_dec(&cbe_spu_info[node].busy_spus); | 1039 | atomic_dec(&cbe_spu_info[node].busy_spus); |
1033 | if (new_state == SPU_UTIL_USER); | 1040 | if (new_state == SPU_UTIL_USER) |
1034 | atomic_inc(&cbe_spu_info[node].busy_spus); | 1041 | atomic_inc(&cbe_spu_info[node].busy_spus); |
1035 | } | 1042 | } |
1036 | } | 1043 | } |
diff --git a/arch/powerpc/platforms/pseries/plpar_wrappers.h b/arch/powerpc/platforms/pseries/plpar_wrappers.h index a437267c6bf8..d967c1893ab5 100644 --- a/arch/powerpc/platforms/pseries/plpar_wrappers.h +++ b/arch/powerpc/platforms/pseries/plpar_wrappers.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define _PSERIES_PLPAR_WRAPPERS_H | 2 | #define _PSERIES_PLPAR_WRAPPERS_H |
3 | 3 | ||
4 | #include <asm/hvcall.h> | 4 | #include <asm/hvcall.h> |
5 | #include <asm/page.h> | ||
5 | 6 | ||
6 | static inline long poll_pending(void) | 7 | static inline long poll_pending(void) |
7 | { | 8 | { |
@@ -44,12 +45,34 @@ static inline long register_slb_shadow(unsigned long cpu, unsigned long vpa) | |||
44 | 45 | ||
45 | static inline long plpar_page_set_loaned(unsigned long vpa) | 46 | static inline long plpar_page_set_loaned(unsigned long vpa) |
46 | { | 47 | { |
47 | return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa, 0); | 48 | unsigned long cmo_page_sz = cmo_get_page_size(); |
49 | long rc = 0; | ||
50 | int i; | ||
51 | |||
52 | for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz) | ||
53 | rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, vpa + i, 0); | ||
54 | |||
55 | for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz) | ||
56 | plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, | ||
57 | vpa + i - cmo_page_sz, 0); | ||
58 | |||
59 | return rc; | ||
48 | } | 60 | } |
49 | 61 | ||
50 | static inline long plpar_page_set_active(unsigned long vpa) | 62 | static inline long plpar_page_set_active(unsigned long vpa) |
51 | { | 63 | { |
52 | return plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa, 0); | 64 | unsigned long cmo_page_sz = cmo_get_page_size(); |
65 | long rc = 0; | ||
66 | int i; | ||
67 | |||
68 | for (i = 0; !rc && i < PAGE_SIZE; i += cmo_page_sz) | ||
69 | rc = plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_ACTIVE, vpa + i, 0); | ||
70 | |||
71 | for (i -= cmo_page_sz; rc && i != 0; i -= cmo_page_sz) | ||
72 | plpar_hcall_norets(H_PAGE_INIT, H_PAGE_SET_LOANED, | ||
73 | vpa + i - cmo_page_sz, 0); | ||
74 | |||
75 | return rc; | ||
53 | } | 76 | } |
54 | 77 | ||
55 | extern void vpa_init(int cpu); | 78 | extern void vpa_init(int cpu); |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 063a0d2fba30..3ce8a139b85d 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -68,6 +68,9 @@ | |||
68 | #include "plpar_wrappers.h" | 68 | #include "plpar_wrappers.h" |
69 | #include "pseries.h" | 69 | #include "pseries.h" |
70 | 70 | ||
71 | int CMO_PrPSP = -1; | ||
72 | int CMO_SecPSP = -1; | ||
73 | unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT); | ||
71 | 74 | ||
72 | int fwnmi_active; /* TRUE if an FWNMI handler is present */ | 75 | int fwnmi_active; /* TRUE if an FWNMI handler is present */ |
73 | 76 | ||
@@ -325,8 +328,7 @@ void pSeries_cmo_feature_init(void) | |||
325 | { | 328 | { |
326 | char *ptr, *key, *value, *end; | 329 | char *ptr, *key, *value, *end; |
327 | int call_status; | 330 | int call_status; |
328 | int PrPSP = -1; | 331 | int page_order = IOMMU_PAGE_SHIFT; |
329 | int SecPSP = -1; | ||
330 | 332 | ||
331 | pr_debug(" -> fw_cmo_feature_init()\n"); | 333 | pr_debug(" -> fw_cmo_feature_init()\n"); |
332 | spin_lock(&rtas_data_buf_lock); | 334 | spin_lock(&rtas_data_buf_lock); |
@@ -365,21 +367,31 @@ void pSeries_cmo_feature_init(void) | |||
365 | break; | 367 | break; |
366 | } | 368 | } |
367 | 369 | ||
368 | if (0 == strcmp(key, "PrPSP")) | 370 | if (0 == strcmp(key, "CMOPageSize")) |
369 | PrPSP = simple_strtol(value, NULL, 10); | 371 | page_order = simple_strtol(value, NULL, 10); |
372 | else if (0 == strcmp(key, "PrPSP")) | ||
373 | CMO_PrPSP = simple_strtol(value, NULL, 10); | ||
370 | else if (0 == strcmp(key, "SecPSP")) | 374 | else if (0 == strcmp(key, "SecPSP")) |
371 | SecPSP = simple_strtol(value, NULL, 10); | 375 | CMO_SecPSP = simple_strtol(value, NULL, 10); |
372 | value = key = ptr + 1; | 376 | value = key = ptr + 1; |
373 | } | 377 | } |
374 | ptr++; | 378 | ptr++; |
375 | } | 379 | } |
376 | 380 | ||
377 | if (PrPSP != -1 || SecPSP != -1) { | 381 | /* Page size is returned as the power of 2 of the page size, |
382 | * convert to the page size in bytes before returning | ||
383 | */ | ||
384 | CMO_PageSize = 1 << page_order; | ||
385 | pr_debug("CMO_PageSize = %lu\n", CMO_PageSize); | ||
386 | |||
387 | if (CMO_PrPSP != -1 || CMO_SecPSP != -1) { | ||
378 | pr_info("CMO enabled\n"); | 388 | pr_info("CMO enabled\n"); |
379 | pr_debug("CMO enabled, PrPSP=%d, SecPSP=%d\n", PrPSP, SecPSP); | 389 | pr_debug("CMO enabled, PrPSP=%d, SecPSP=%d\n", CMO_PrPSP, |
390 | CMO_SecPSP); | ||
380 | powerpc_firmware_features |= FW_FEATURE_CMO; | 391 | powerpc_firmware_features |= FW_FEATURE_CMO; |
381 | } else | 392 | } else |
382 | pr_debug("CMO not enabled, PrPSP=%d, SecPSP=%d\n", PrPSP, SecPSP); | 393 | pr_debug("CMO not enabled, PrPSP=%d, SecPSP=%d\n", CMO_PrPSP, |
394 | CMO_SecPSP); | ||
383 | spin_unlock(&rtas_data_buf_lock); | 395 | spin_unlock(&rtas_data_buf_lock); |
384 | pr_debug(" <- fw_cmo_feature_init()\n"); | 396 | pr_debug(" <- fw_cmo_feature_init()\n"); |
385 | } | 397 | } |
diff --git a/arch/powerpc/sysdev/bestcomm/gen_bd.c b/arch/powerpc/sysdev/bestcomm/gen_bd.c index a3a134c35b0a..e0a53e3147b2 100644 --- a/arch/powerpc/sysdev/bestcomm/gen_bd.c +++ b/arch/powerpc/sysdev/bestcomm/gen_bd.c | |||
@@ -11,7 +11,6 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/version.h> | ||
15 | #include <linux/module.h> | 14 | #include <linux/module.h> |
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/string.h> | 16 | #include <linux/string.h> |
diff --git a/arch/s390/defconfig b/arch/s390/defconfig index c5cdb975d590..9b0bc2c9fba0 100644 --- a/arch/s390/defconfig +++ b/arch/s390/defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.26-rc4 | 3 | # Linux kernel version: 2.6.27-rc4 |
4 | # Fri May 30 09:49:33 2008 | 4 | # Thu Aug 21 19:43:29 2008 |
5 | # | 5 | # |
6 | CONFIG_SCHED_MC=y | 6 | CONFIG_SCHED_MC=y |
7 | CONFIG_MMU=y | 7 | CONFIG_MMU=y |
@@ -68,7 +68,6 @@ CONFIG_INITRAMFS_SOURCE="" | |||
68 | CONFIG_SYSCTL=y | 68 | CONFIG_SYSCTL=y |
69 | # CONFIG_EMBEDDED is not set | 69 | # CONFIG_EMBEDDED is not set |
70 | CONFIG_SYSCTL_SYSCALL=y | 70 | CONFIG_SYSCTL_SYSCALL=y |
71 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
72 | CONFIG_KALLSYMS=y | 71 | CONFIG_KALLSYMS=y |
73 | # CONFIG_KALLSYMS_ALL is not set | 72 | # CONFIG_KALLSYMS_ALL is not set |
74 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 73 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
@@ -93,11 +92,17 @@ CONFIG_SLAB=y | |||
93 | # CONFIG_MARKERS is not set | 92 | # CONFIG_MARKERS is not set |
94 | CONFIG_HAVE_OPROFILE=y | 93 | CONFIG_HAVE_OPROFILE=y |
95 | CONFIG_KPROBES=y | 94 | CONFIG_KPROBES=y |
95 | # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||
96 | CONFIG_KRETPROBES=y | 96 | CONFIG_KRETPROBES=y |
97 | # CONFIG_HAVE_IOREMAP_PROT is not set | ||
97 | CONFIG_HAVE_KPROBES=y | 98 | CONFIG_HAVE_KPROBES=y |
98 | CONFIG_HAVE_KRETPROBES=y | 99 | CONFIG_HAVE_KRETPROBES=y |
100 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | ||
99 | # CONFIG_HAVE_DMA_ATTRS is not set | 101 | # CONFIG_HAVE_DMA_ATTRS is not set |
102 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
103 | # CONFIG_HAVE_CLK is not set | ||
100 | CONFIG_PROC_PAGE_MONITOR=y | 104 | CONFIG_PROC_PAGE_MONITOR=y |
105 | # CONFIG_HAVE_GENERIC_DMA_COHERENT is not set | ||
101 | CONFIG_SLABINFO=y | 106 | CONFIG_SLABINFO=y |
102 | CONFIG_RT_MUTEXES=y | 107 | CONFIG_RT_MUTEXES=y |
103 | # CONFIG_TINY_SHMEM is not set | 108 | # CONFIG_TINY_SHMEM is not set |
@@ -113,6 +118,7 @@ CONFIG_STOP_MACHINE=y | |||
113 | CONFIG_BLOCK=y | 118 | CONFIG_BLOCK=y |
114 | # CONFIG_BLK_DEV_IO_TRACE is not set | 119 | # CONFIG_BLK_DEV_IO_TRACE is not set |
115 | CONFIG_BLK_DEV_BSG=y | 120 | CONFIG_BLK_DEV_BSG=y |
121 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
116 | CONFIG_BLOCK_COMPAT=y | 122 | CONFIG_BLOCK_COMPAT=y |
117 | 123 | ||
118 | # | 124 | # |
@@ -175,6 +181,8 @@ CONFIG_PREEMPT=y | |||
175 | CONFIG_ARCH_SPARSEMEM_ENABLE=y | 181 | CONFIG_ARCH_SPARSEMEM_ENABLE=y |
176 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y | 182 | CONFIG_ARCH_SPARSEMEM_DEFAULT=y |
177 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y | 183 | CONFIG_ARCH_SELECT_MEMORY_MODEL=y |
184 | CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y | ||
185 | CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y | ||
178 | CONFIG_SELECT_MEMORY_MODEL=y | 186 | CONFIG_SELECT_MEMORY_MODEL=y |
179 | # CONFIG_FLATMEM_MANUAL is not set | 187 | # CONFIG_FLATMEM_MANUAL is not set |
180 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 188 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
@@ -185,8 +193,12 @@ CONFIG_HAVE_MEMORY_PRESENT=y | |||
185 | CONFIG_SPARSEMEM_EXTREME=y | 193 | CONFIG_SPARSEMEM_EXTREME=y |
186 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y | 194 | CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y |
187 | CONFIG_SPARSEMEM_VMEMMAP=y | 195 | CONFIG_SPARSEMEM_VMEMMAP=y |
196 | CONFIG_MEMORY_HOTPLUG=y | ||
197 | CONFIG_MEMORY_HOTPLUG_SPARSE=y | ||
198 | CONFIG_MEMORY_HOTREMOVE=y | ||
188 | CONFIG_PAGEFLAGS_EXTENDED=y | 199 | CONFIG_PAGEFLAGS_EXTENDED=y |
189 | CONFIG_SPLIT_PTLOCK_CPUS=4 | 200 | CONFIG_SPLIT_PTLOCK_CPUS=4 |
201 | CONFIG_MIGRATION=y | ||
190 | CONFIG_RESOURCES_64BIT=y | 202 | CONFIG_RESOURCES_64BIT=y |
191 | CONFIG_ZONE_DMA_FLAG=1 | 203 | CONFIG_ZONE_DMA_FLAG=1 |
192 | CONFIG_BOUNCE=y | 204 | CONFIG_BOUNCE=y |
@@ -198,6 +210,7 @@ CONFIG_VIRT_TO_BUS=y | |||
198 | CONFIG_MACHCHK_WARNING=y | 210 | CONFIG_MACHCHK_WARNING=y |
199 | CONFIG_QDIO=y | 211 | CONFIG_QDIO=y |
200 | # CONFIG_QDIO_DEBUG is not set | 212 | # CONFIG_QDIO_DEBUG is not set |
213 | CONFIG_CHSC_SCH=m | ||
201 | 214 | ||
202 | # | 215 | # |
203 | # Misc | 216 | # Misc |
@@ -206,6 +219,7 @@ CONFIG_IPL=y | |||
206 | # CONFIG_IPL_TAPE is not set | 219 | # CONFIG_IPL_TAPE is not set |
207 | CONFIG_IPL_VM=y | 220 | CONFIG_IPL_VM=y |
208 | CONFIG_BINFMT_ELF=y | 221 | CONFIG_BINFMT_ELF=y |
222 | CONFIG_COMPAT_BINFMT_ELF=y | ||
209 | CONFIG_BINFMT_MISC=m | 223 | CONFIG_BINFMT_MISC=m |
210 | CONFIG_FORCE_MAX_ZONEORDER=9 | 224 | CONFIG_FORCE_MAX_ZONEORDER=9 |
211 | # CONFIG_PROCESS_DEBUG is not set | 225 | # CONFIG_PROCESS_DEBUG is not set |
@@ -226,10 +240,6 @@ CONFIG_S390_HYPFS_FS=y | |||
226 | CONFIG_KEXEC=y | 240 | CONFIG_KEXEC=y |
227 | # CONFIG_ZFCPDUMP is not set | 241 | # CONFIG_ZFCPDUMP is not set |
228 | CONFIG_S390_GUEST=y | 242 | CONFIG_S390_GUEST=y |
229 | |||
230 | # | ||
231 | # Networking | ||
232 | # | ||
233 | CONFIG_NET=y | 243 | CONFIG_NET=y |
234 | 244 | ||
235 | # | 245 | # |
@@ -364,7 +374,6 @@ CONFIG_NET_SCH_CBQ=m | |||
364 | # CONFIG_NET_SCH_HTB is not set | 374 | # CONFIG_NET_SCH_HTB is not set |
365 | # CONFIG_NET_SCH_HFSC is not set | 375 | # CONFIG_NET_SCH_HFSC is not set |
366 | CONFIG_NET_SCH_PRIO=m | 376 | CONFIG_NET_SCH_PRIO=m |
367 | CONFIG_NET_SCH_RR=m | ||
368 | CONFIG_NET_SCH_RED=m | 377 | CONFIG_NET_SCH_RED=m |
369 | CONFIG_NET_SCH_SFQ=m | 378 | CONFIG_NET_SCH_SFQ=m |
370 | CONFIG_NET_SCH_TEQL=m | 379 | CONFIG_NET_SCH_TEQL=m |
@@ -430,7 +439,9 @@ CONFIG_CCW=y | |||
430 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 439 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
431 | CONFIG_STANDALONE=y | 440 | CONFIG_STANDALONE=y |
432 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 441 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
433 | # CONFIG_FW_LOADER is not set | 442 | CONFIG_FW_LOADER=y |
443 | # CONFIG_FIRMWARE_IN_KERNEL is not set | ||
444 | CONFIG_EXTRA_FIRMWARE="" | ||
434 | # CONFIG_DEBUG_DRIVER is not set | 445 | # CONFIG_DEBUG_DRIVER is not set |
435 | # CONFIG_DEBUG_DEVRES is not set | 446 | # CONFIG_DEBUG_DEVRES is not set |
436 | CONFIG_SYS_HYPERVISOR=y | 447 | CONFIG_SYS_HYPERVISOR=y |
@@ -507,6 +518,11 @@ CONFIG_SCSI_LOWLEVEL=y | |||
507 | # CONFIG_ISCSI_TCP is not set | 518 | # CONFIG_ISCSI_TCP is not set |
508 | # CONFIG_SCSI_DEBUG is not set | 519 | # CONFIG_SCSI_DEBUG is not set |
509 | CONFIG_ZFCP=y | 520 | CONFIG_ZFCP=y |
521 | CONFIG_SCSI_DH=m | ||
522 | CONFIG_SCSI_DH_RDAC=m | ||
523 | CONFIG_SCSI_DH_HP_SW=m | ||
524 | CONFIG_SCSI_DH_EMC=m | ||
525 | CONFIG_SCSI_DH_ALUA=m | ||
510 | CONFIG_MD=y | 526 | CONFIG_MD=y |
511 | CONFIG_BLK_DEV_MD=y | 527 | CONFIG_BLK_DEV_MD=y |
512 | CONFIG_MD_LINEAR=m | 528 | CONFIG_MD_LINEAR=m |
@@ -522,14 +538,10 @@ CONFIG_DM_CRYPT=y | |||
522 | CONFIG_DM_SNAPSHOT=y | 538 | CONFIG_DM_SNAPSHOT=y |
523 | CONFIG_DM_MIRROR=y | 539 | CONFIG_DM_MIRROR=y |
524 | CONFIG_DM_ZERO=y | 540 | CONFIG_DM_ZERO=y |
525 | CONFIG_DM_MULTIPATH=y | 541 | CONFIG_DM_MULTIPATH=m |
526 | # CONFIG_DM_MULTIPATH_EMC is not set | ||
527 | # CONFIG_DM_MULTIPATH_RDAC is not set | ||
528 | # CONFIG_DM_MULTIPATH_HP is not set | ||
529 | # CONFIG_DM_DELAY is not set | 542 | # CONFIG_DM_DELAY is not set |
530 | # CONFIG_DM_UEVENT is not set | 543 | # CONFIG_DM_UEVENT is not set |
531 | CONFIG_NETDEVICES=y | 544 | CONFIG_NETDEVICES=y |
532 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
533 | # CONFIG_IFB is not set | 545 | # CONFIG_IFB is not set |
534 | CONFIG_DUMMY=m | 546 | CONFIG_DUMMY=m |
535 | CONFIG_BONDING=m | 547 | CONFIG_BONDING=m |
@@ -544,7 +556,6 @@ CONFIG_NET_ETHERNET=y | |||
544 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 556 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
545 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set | 557 | # CONFIG_IBM_NEW_EMAC_EMAC4 is not set |
546 | CONFIG_NETDEV_1000=y | 558 | CONFIG_NETDEV_1000=y |
547 | # CONFIG_E1000E_ENABLED is not set | ||
548 | CONFIG_NETDEV_10000=y | 559 | CONFIG_NETDEV_10000=y |
549 | # CONFIG_TR is not set | 560 | # CONFIG_TR is not set |
550 | # CONFIG_WAN is not set | 561 | # CONFIG_WAN is not set |
@@ -576,7 +587,10 @@ CONFIG_DEVKMEM=y | |||
576 | CONFIG_UNIX98_PTYS=y | 587 | CONFIG_UNIX98_PTYS=y |
577 | CONFIG_LEGACY_PTYS=y | 588 | CONFIG_LEGACY_PTYS=y |
578 | CONFIG_LEGACY_PTY_COUNT=256 | 589 | CONFIG_LEGACY_PTY_COUNT=256 |
590 | CONFIG_HVC_DRIVER=y | ||
591 | CONFIG_VIRTIO_CONSOLE=y | ||
579 | CONFIG_HW_RANDOM=m | 592 | CONFIG_HW_RANDOM=m |
593 | CONFIG_HW_RANDOM_VIRTIO=m | ||
580 | # CONFIG_R3964 is not set | 594 | # CONFIG_R3964 is not set |
581 | CONFIG_RAW_DRIVER=m | 595 | CONFIG_RAW_DRIVER=m |
582 | CONFIG_MAX_RAW_DEVS=256 | 596 | CONFIG_MAX_RAW_DEVS=256 |
@@ -616,6 +630,7 @@ CONFIG_MONWRITER=m | |||
616 | CONFIG_S390_VMUR=m | 630 | CONFIG_S390_VMUR=m |
617 | # CONFIG_POWER_SUPPLY is not set | 631 | # CONFIG_POWER_SUPPLY is not set |
618 | # CONFIG_THERMAL is not set | 632 | # CONFIG_THERMAL is not set |
633 | # CONFIG_THERMAL_HWMON is not set | ||
619 | # CONFIG_WATCHDOG is not set | 634 | # CONFIG_WATCHDOG is not set |
620 | 635 | ||
621 | # | 636 | # |
@@ -693,6 +708,7 @@ CONFIG_CONFIGFS_FS=m | |||
693 | # CONFIG_CRAMFS is not set | 708 | # CONFIG_CRAMFS is not set |
694 | # CONFIG_VXFS_FS is not set | 709 | # CONFIG_VXFS_FS is not set |
695 | # CONFIG_MINIX_FS is not set | 710 | # CONFIG_MINIX_FS is not set |
711 | # CONFIG_OMFS_FS is not set | ||
696 | # CONFIG_HPFS_FS is not set | 712 | # CONFIG_HPFS_FS is not set |
697 | # CONFIG_QNX4FS_FS is not set | 713 | # CONFIG_QNX4FS_FS is not set |
698 | # CONFIG_ROMFS_FS is not set | 714 | # CONFIG_ROMFS_FS is not set |
@@ -712,7 +728,6 @@ CONFIG_LOCKD_V4=y | |||
712 | CONFIG_EXPORTFS=y | 728 | CONFIG_EXPORTFS=y |
713 | CONFIG_NFS_COMMON=y | 729 | CONFIG_NFS_COMMON=y |
714 | CONFIG_SUNRPC=y | 730 | CONFIG_SUNRPC=y |
715 | # CONFIG_SUNRPC_BIND34 is not set | ||
716 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 731 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
717 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 732 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
718 | # CONFIG_SMB_FS is not set | 733 | # CONFIG_SMB_FS is not set |
@@ -780,6 +795,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
780 | # CONFIG_DEBUG_INFO is not set | 795 | # CONFIG_DEBUG_INFO is not set |
781 | # CONFIG_DEBUG_VM is not set | 796 | # CONFIG_DEBUG_VM is not set |
782 | # CONFIG_DEBUG_WRITECOUNT is not set | 797 | # CONFIG_DEBUG_WRITECOUNT is not set |
798 | CONFIG_DEBUG_MEMORY_INIT=y | ||
783 | # CONFIG_DEBUG_LIST is not set | 799 | # CONFIG_DEBUG_LIST is not set |
784 | # CONFIG_DEBUG_SG is not set | 800 | # CONFIG_DEBUG_SG is not set |
785 | # CONFIG_FRAME_POINTER is not set | 801 | # CONFIG_FRAME_POINTER is not set |
@@ -789,6 +805,7 @@ CONFIG_DEBUG_BUGVERBOSE=y | |||
789 | # CONFIG_LKDTM is not set | 805 | # CONFIG_LKDTM is not set |
790 | # CONFIG_FAULT_INJECTION is not set | 806 | # CONFIG_FAULT_INJECTION is not set |
791 | # CONFIG_LATENCYTOP is not set | 807 | # CONFIG_LATENCYTOP is not set |
808 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
792 | CONFIG_SAMPLES=y | 809 | CONFIG_SAMPLES=y |
793 | # CONFIG_SAMPLE_KOBJECT is not set | 810 | # CONFIG_SAMPLE_KOBJECT is not set |
794 | # CONFIG_SAMPLE_KPROBES is not set | 811 | # CONFIG_SAMPLE_KPROBES is not set |
@@ -847,6 +864,10 @@ CONFIG_CRYPTO_HMAC=m | |||
847 | # CONFIG_CRYPTO_MD4 is not set | 864 | # CONFIG_CRYPTO_MD4 is not set |
848 | CONFIG_CRYPTO_MD5=m | 865 | CONFIG_CRYPTO_MD5=m |
849 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 866 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
867 | CONFIG_CRYPTO_RMD128=m | ||
868 | CONFIG_CRYPTO_RMD160=m | ||
869 | CONFIG_CRYPTO_RMD256=m | ||
870 | CONFIG_CRYPTO_RMD320=m | ||
850 | CONFIG_CRYPTO_SHA1=m | 871 | CONFIG_CRYPTO_SHA1=m |
851 | # CONFIG_CRYPTO_SHA256 is not set | 872 | # CONFIG_CRYPTO_SHA256 is not set |
852 | # CONFIG_CRYPTO_SHA512 is not set | 873 | # CONFIG_CRYPTO_SHA512 is not set |
@@ -895,6 +916,7 @@ CONFIG_BITREVERSE=m | |||
895 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set | 916 | # CONFIG_GENERIC_FIND_NEXT_BIT is not set |
896 | # CONFIG_CRC_CCITT is not set | 917 | # CONFIG_CRC_CCITT is not set |
897 | # CONFIG_CRC16 is not set | 918 | # CONFIG_CRC16 is not set |
919 | CONFIG_CRC_T10DIF=y | ||
898 | # CONFIG_CRC_ITU_T is not set | 920 | # CONFIG_CRC_ITU_T is not set |
899 | CONFIG_CRC32=m | 921 | CONFIG_CRC32=m |
900 | CONFIG_CRC7=m | 922 | CONFIG_CRC7=m |
diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h index b4eb24ab5af9..8e9243ae0c19 100644 --- a/arch/s390/include/asm/bitops.h +++ b/arch/s390/include/asm/bitops.h | |||
@@ -709,7 +709,7 @@ static inline int find_next_zero_bit (const unsigned long * addr, | |||
709 | * __ffz_word returns __BITOPS_WORDSIZE | 709 | * __ffz_word returns __BITOPS_WORDSIZE |
710 | * if no zero bit is present in the word. | 710 | * if no zero bit is present in the word. |
711 | */ | 711 | */ |
712 | set = __ffz_word(0, *p >> bit) + bit; | 712 | set = __ffz_word(bit, *p >> bit); |
713 | if (set >= size) | 713 | if (set >= size) |
714 | return size + offset; | 714 | return size + offset; |
715 | if (set < __BITOPS_WORDSIZE) | 715 | if (set < __BITOPS_WORDSIZE) |
@@ -824,7 +824,7 @@ static inline int ext2_find_next_zero_bit(void *vaddr, unsigned long size, | |||
824 | * s390 version of ffz returns __BITOPS_WORDSIZE | 824 | * s390 version of ffz returns __BITOPS_WORDSIZE |
825 | * if no zero bit is present in the word. | 825 | * if no zero bit is present in the word. |
826 | */ | 826 | */ |
827 | set = ffz(__load_ulong_le(p, 0) >> bit) + bit; | 827 | set = __ffz_word(bit, __load_ulong_le(p, 0) >> bit); |
828 | if (set >= size) | 828 | if (set >= size) |
829 | return size + offset; | 829 | return size + offset; |
830 | if (set < __BITOPS_WORDSIZE) | 830 | if (set < __BITOPS_WORDSIZE) |
@@ -865,7 +865,7 @@ static inline int ext2_find_next_bit(void *vaddr, unsigned long size, | |||
865 | * s390 version of ffz returns __BITOPS_WORDSIZE | 865 | * s390 version of ffz returns __BITOPS_WORDSIZE |
866 | * if no zero bit is present in the word. | 866 | * if no zero bit is present in the word. |
867 | */ | 867 | */ |
868 | set = ffs(__load_ulong_le(p, 0) >> bit) + bit; | 868 | set = __ffs_word(0, __load_ulong_le(p, 0) & (~0UL << bit)); |
869 | if (set >= size) | 869 | if (set >= size) |
870 | return size + offset; | 870 | return size + offset; |
871 | if (set < __BITOPS_WORDSIZE) | 871 | if (set < __BITOPS_WORDSIZE) |
diff --git a/arch/s390/include/asm/kexec.h b/arch/s390/include/asm/kexec.h index f219c6411e0b..bb729b84a21e 100644 --- a/arch/s390/include/asm/kexec.h +++ b/arch/s390/include/asm/kexec.h | |||
@@ -31,7 +31,7 @@ | |||
31 | #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) | 31 | #define KEXEC_CONTROL_MEMORY_LIMIT (1UL<<31) |
32 | 32 | ||
33 | /* Allocate one page for the pdp and the second for the code */ | 33 | /* Allocate one page for the pdp and the second for the code */ |
34 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 34 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
35 | 35 | ||
36 | /* The native architecture */ | 36 | /* The native architecture */ |
37 | #define KEXEC_ARCH KEXEC_ARCH_S390 | 37 | #define KEXEC_ARCH KEXEC_ARCH_S390 |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 9839767d0842..3e2c05cb6a87 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -75,7 +75,9 @@ unsigned long thread_saved_pc(struct task_struct *tsk) | |||
75 | return sf->gprs[8]; | 75 | return sf->gprs[8]; |
76 | } | 76 | } |
77 | 77 | ||
78 | DEFINE_PER_CPU(struct s390_idle_data, s390_idle); | 78 | DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = { |
79 | .lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock) | ||
80 | }; | ||
79 | 81 | ||
80 | static int s390_idle_enter(void) | 82 | static int s390_idle_enter(void) |
81 | { | 83 | { |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index b795b3e24afd..00b9b4dec5eb 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -610,7 +610,6 @@ static void __init smp_create_idle(unsigned int cpu) | |||
610 | if (IS_ERR(p)) | 610 | if (IS_ERR(p)) |
611 | panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); | 611 | panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p)); |
612 | current_set[cpu] = p; | 612 | current_set[cpu] = p; |
613 | spin_lock_init(&(&per_cpu(s390_idle, cpu))->lock); | ||
614 | } | 613 | } |
615 | 614 | ||
616 | static int __cpuinit smp_alloc_lowcore(int cpu) | 615 | static int __cpuinit smp_alloc_lowcore(int cpu) |
@@ -845,7 +844,6 @@ void __init smp_prepare_boot_cpu(void) | |||
845 | current_set[0] = current; | 844 | current_set[0] = current; |
846 | smp_cpu_state[0] = CPU_STATE_CONFIGURED; | 845 | smp_cpu_state[0] = CPU_STATE_CONFIGURED; |
847 | smp_cpu_polarization[0] = POLARIZATION_UNKNWN; | 846 | smp_cpu_polarization[0] = POLARIZATION_UNKNWN; |
848 | spin_lock_init(&(&__get_cpu_var(s390_idle))->lock); | ||
849 | } | 847 | } |
850 | 848 | ||
851 | void __init smp_cpus_done(unsigned int max_cpus) | 849 | void __init smp_cpus_done(unsigned int max_cpus) |
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 025d4fe55a58..fd1612590bf4 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -140,6 +140,10 @@ static struct sh_mobile_lcdc_info lcdc_info = { | |||
140 | .vsync_len = 1, | 140 | .vsync_len = 1, |
141 | .sync = 0, /* hsync and vsync are active low */ | 141 | .sync = 0, /* hsync and vsync are active low */ |
142 | }, | 142 | }, |
143 | .lcd_size_cfg = { /* 7.0 inch */ | ||
144 | .width = 152, | ||
145 | .height = 91, | ||
146 | }, | ||
143 | .board_cfg = { | 147 | .board_cfg = { |
144 | .display_on = ap320_wvga_power_on, | 148 | .display_on = ap320_wvga_power_on, |
145 | }, | 149 | }, |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index e499ee384d58..714dce91cc9b 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
@@ -224,6 +224,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = { | |||
224 | .vsync_len = 2, | 224 | .vsync_len = 2, |
225 | .sync = 0, | 225 | .sync = 0, |
226 | }, | 226 | }, |
227 | .lcd_size_cfg = { /* 7.0 inch */ | ||
228 | .width = 152, | ||
229 | .height = 91, | ||
230 | }, | ||
227 | } | 231 | } |
228 | #endif | 232 | #endif |
229 | #ifdef CONFIG_SH_MIGOR_QVGA | 233 | #ifdef CONFIG_SH_MIGOR_QVGA |
@@ -245,6 +249,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = { | |||
245 | .vsync_len = 2, | 249 | .vsync_len = 2, |
246 | .sync = FB_SYNC_HOR_HIGH_ACT, | 250 | .sync = FB_SYNC_HOR_HIGH_ACT, |
247 | }, | 251 | }, |
252 | .lcd_size_cfg = { /* 2.4 inch */ | ||
253 | .width = 49, | ||
254 | .height = 37, | ||
255 | }, | ||
248 | .board_cfg = { | 256 | .board_cfg = { |
249 | .setup_sys = migor_lcd_qvga_setup, | 257 | .setup_sys = migor_lcd_qvga_setup, |
250 | }, | 258 | }, |
diff --git a/arch/sh/boards/mach-sh7763rdp/setup.c b/arch/sh/boards/mach-sh7763rdp/setup.c index 925f16af7121..23850da05e3c 100644 --- a/arch/sh/boards/mach-sh7763rdp/setup.c +++ b/arch/sh/boards/mach-sh7763rdp/setup.c | |||
@@ -15,8 +15,11 @@ | |||
15 | #include <linux/interrupt.h> | 15 | #include <linux/interrupt.h> |
16 | #include <linux/input.h> | 16 | #include <linux/input.h> |
17 | #include <linux/mtd/physmap.h> | 17 | #include <linux/mtd/physmap.h> |
18 | #include <asm/io.h> | 18 | #include <linux/fb.h> |
19 | #include <linux/io.h> | ||
19 | #include <asm/sh7763rdp.h> | 20 | #include <asm/sh7763rdp.h> |
21 | #include <asm/sh_eth.h> | ||
22 | #include <asm/sh7760fb.h> | ||
20 | 23 | ||
21 | /* NOR Flash */ | 24 | /* NOR Flash */ |
22 | static struct mtd_partition sh7763rdp_nor_flash_partitions[] = { | 25 | static struct mtd_partition sh7763rdp_nor_flash_partitions[] = { |
@@ -60,8 +63,85 @@ static struct platform_device sh7763rdp_nor_flash_device = { | |||
60 | }, | 63 | }, |
61 | }; | 64 | }; |
62 | 65 | ||
66 | /* SH-Ether */ | ||
67 | static struct resource sh_eth_resources[] = { | ||
68 | { | ||
69 | .start = 0xFEE00800, /* use eth1 */ | ||
70 | .end = 0xFEE00F7C - 1, | ||
71 | .flags = IORESOURCE_MEM, | ||
72 | }, { | ||
73 | .start = 58, /* irq number */ | ||
74 | .end = 58, | ||
75 | .flags = IORESOURCE_IRQ, | ||
76 | }, | ||
77 | }; | ||
78 | |||
79 | static struct sh_eth_plat_data sh7763_eth_pdata = { | ||
80 | .phy = 1, | ||
81 | .edmac_endian = EDMAC_LITTLE_ENDIAN, | ||
82 | }; | ||
83 | |||
84 | static struct platform_device sh7763rdp_eth_device = { | ||
85 | .name = "sh-eth", | ||
86 | .resource = sh_eth_resources, | ||
87 | .num_resources = ARRAY_SIZE(sh_eth_resources), | ||
88 | .dev = { | ||
89 | .platform_data = &sh7763_eth_pdata, | ||
90 | }, | ||
91 | }; | ||
92 | |||
93 | /* SH7763 LCDC */ | ||
94 | static struct resource sh7763rdp_fb_resources[] = { | ||
95 | { | ||
96 | .start = 0xFFE80000, | ||
97 | .end = 0xFFE80442 - 1, | ||
98 | .flags = IORESOURCE_MEM, | ||
99 | }, | ||
100 | }; | ||
101 | |||
102 | static struct fb_videomode sh7763fb_videomode = { | ||
103 | .refresh = 60, | ||
104 | .name = "VGA Monitor", | ||
105 | .xres = 640, | ||
106 | .yres = 480, | ||
107 | .pixclock = 10000, | ||
108 | .left_margin = 80, | ||
109 | .right_margin = 24, | ||
110 | .upper_margin = 30, | ||
111 | .lower_margin = 1, | ||
112 | .hsync_len = 96, | ||
113 | .vsync_len = 1, | ||
114 | .sync = 0, | ||
115 | .vmode = FB_VMODE_NONINTERLACED, | ||
116 | .flag = FBINFO_FLAG_DEFAULT, | ||
117 | }; | ||
118 | |||
119 | static struct sh7760fb_platdata sh7763fb_def_pdata = { | ||
120 | .def_mode = &sh7763fb_videomode, | ||
121 | .ldmtr = (LDMTR_TFT_COLOR_16|LDMTR_MCNT), | ||
122 | .lddfr = LDDFR_16BPP_RGB565, | ||
123 | .ldpmmr = 0x0000, | ||
124 | .ldpspr = 0xFFFF, | ||
125 | .ldaclnr = 0x0001, | ||
126 | .ldickr = 0x1102, | ||
127 | .rotate = 0, | ||
128 | .novsync = 0, | ||
129 | .blank = NULL, | ||
130 | }; | ||
131 | |||
132 | static struct platform_device sh7763rdp_fb_device = { | ||
133 | .name = "sh7760-lcdc", | ||
134 | .resource = sh7763rdp_fb_resources, | ||
135 | .num_resources = ARRAY_SIZE(sh7763rdp_fb_resources), | ||
136 | .dev = { | ||
137 | .platform_data = &sh7763fb_def_pdata, | ||
138 | }, | ||
139 | }; | ||
140 | |||
63 | static struct platform_device *sh7763rdp_devices[] __initdata = { | 141 | static struct platform_device *sh7763rdp_devices[] __initdata = { |
64 | &sh7763rdp_nor_flash_device, | 142 | &sh7763rdp_nor_flash_device, |
143 | &sh7763rdp_eth_device, | ||
144 | &sh7763rdp_fb_device, | ||
65 | }; | 145 | }; |
66 | 146 | ||
67 | static int __init sh7763rdp_devices_setup(void) | 147 | static int __init sh7763rdp_devices_setup(void) |
@@ -69,7 +149,7 @@ static int __init sh7763rdp_devices_setup(void) | |||
69 | return platform_add_devices(sh7763rdp_devices, | 149 | return platform_add_devices(sh7763rdp_devices, |
70 | ARRAY_SIZE(sh7763rdp_devices)); | 150 | ARRAY_SIZE(sh7763rdp_devices)); |
71 | } | 151 | } |
72 | __initcall(sh7763rdp_devices_setup); | 152 | device_initcall(sh7763rdp_devices_setup); |
73 | 153 | ||
74 | static void __init sh7763rdp_setup(char **cmdline_p) | 154 | static void __init sh7763rdp_setup(char **cmdline_p) |
75 | { | 155 | { |
diff --git a/arch/sh/boards/mach-x3proto/setup.c b/arch/sh/boards/mach-x3proto/setup.c index abc5b6d418fe..a70d23b21788 100644 --- a/arch/sh/boards/mach-x3proto/setup.c +++ b/arch/sh/boards/mach-x3proto/setup.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Renesas SH-X3 Prototype Board Support. | 4 | * Renesas SH-X3 Prototype Board Support. |
5 | * | 5 | * |
6 | * Copyright (C) 2007 Paul Mundt | 6 | * Copyright (C) 2007 - 2008 Paul Mundt |
7 | * | 7 | * |
8 | * This file is subject to the terms and conditions of the GNU General Public | 8 | * This file is subject to the terms and conditions of the GNU General Public |
9 | * License. See the file "COPYING" in the main directory of this archive | 9 | * License. See the file "COPYING" in the main directory of this archive |
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/smc91x.h> | ||
16 | #include <asm/ilsel.h> | 17 | #include <asm/ilsel.h> |
17 | 18 | ||
18 | static struct resource heartbeat_resources[] = { | 19 | static struct resource heartbeat_resources[] = { |
@@ -30,6 +31,10 @@ static struct platform_device heartbeat_device = { | |||
30 | .resource = heartbeat_resources, | 31 | .resource = heartbeat_resources, |
31 | }; | 32 | }; |
32 | 33 | ||
34 | static struct smc91x_platdata smc91x_info = { | ||
35 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
36 | }; | ||
37 | |||
33 | static struct resource smc91x_resources[] = { | 38 | static struct resource smc91x_resources[] = { |
34 | [0] = { | 39 | [0] = { |
35 | .start = 0x18000300, | 40 | .start = 0x18000300, |
@@ -47,6 +52,9 @@ static struct platform_device smc91x_device = { | |||
47 | .id = -1, | 52 | .id = -1, |
48 | .resource = smc91x_resources, | 53 | .resource = smc91x_resources, |
49 | .num_resources = ARRAY_SIZE(smc91x_resources), | 54 | .num_resources = ARRAY_SIZE(smc91x_resources), |
55 | .dev = { | ||
56 | .platform_data = &smc91x_info, | ||
57 | }, | ||
50 | }; | 58 | }; |
51 | 59 | ||
52 | static struct resource r8a66597_usb_host_resources[] = { | 60 | static struct resource r8a66597_usb_host_resources[] = { |
diff --git a/arch/sh/configs/sh7763rdp_defconfig b/arch/sh/configs/sh7763rdp_defconfig index 83f3fe5db3e5..baf830c4a7e4 100644 --- a/arch/sh/configs/sh7763rdp_defconfig +++ b/arch/sh/configs/sh7763rdp_defconfig | |||
@@ -1,15 +1,17 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.26-rc4 | 3 | # Linux kernel version: 2.6.27-rc2 |
4 | # Fri Jun 6 12:20:17 2008 | 4 | # Fri Aug 8 13:44:20 2008 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_SUPERH32=y | 7 | CONFIG_SUPERH32=y |
8 | CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig" | ||
8 | CONFIG_RWSEM_GENERIC_SPINLOCK=y | 9 | CONFIG_RWSEM_GENERIC_SPINLOCK=y |
9 | CONFIG_GENERIC_BUG=y | 10 | CONFIG_GENERIC_BUG=y |
10 | CONFIG_GENERIC_FIND_NEXT_BIT=y | 11 | CONFIG_GENERIC_FIND_NEXT_BIT=y |
11 | CONFIG_GENERIC_HWEIGHT=y | 12 | CONFIG_GENERIC_HWEIGHT=y |
12 | CONFIG_GENERIC_HARDIRQS=y | 13 | CONFIG_GENERIC_HARDIRQS=y |
14 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||
13 | CONFIG_GENERIC_IRQ_PROBE=y | 15 | CONFIG_GENERIC_IRQ_PROBE=y |
14 | CONFIG_GENERIC_CALIBRATE_DELAY=y | 16 | CONFIG_GENERIC_CALIBRATE_DELAY=y |
15 | CONFIG_GENERIC_TIME=y | 17 | CONFIG_GENERIC_TIME=y |
@@ -19,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y | |||
19 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | 21 | # CONFIG_ARCH_HAS_ILOG2_U32 is not set |
20 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | 22 | # CONFIG_ARCH_HAS_ILOG2_U64 is not set |
21 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 23 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
22 | CONFIG_ARCH_SUPPORTS_AOUT=y | ||
23 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" | 24 | CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config" |
24 | 25 | ||
25 | # | 26 | # |
@@ -83,10 +84,16 @@ CONFIG_PROFILING=y | |||
83 | # CONFIG_MARKERS is not set | 84 | # CONFIG_MARKERS is not set |
84 | CONFIG_OPROFILE=y | 85 | CONFIG_OPROFILE=y |
85 | CONFIG_HAVE_OPROFILE=y | 86 | CONFIG_HAVE_OPROFILE=y |
87 | # CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set | ||
88 | # CONFIG_HAVE_IOREMAP_PROT is not set | ||
86 | # CONFIG_HAVE_KPROBES is not set | 89 | # CONFIG_HAVE_KPROBES is not set |
87 | # CONFIG_HAVE_KRETPROBES is not set | 90 | # CONFIG_HAVE_KRETPROBES is not set |
91 | # CONFIG_HAVE_ARCH_TRACEHOOK is not set | ||
88 | # CONFIG_HAVE_DMA_ATTRS is not set | 92 | # CONFIG_HAVE_DMA_ATTRS is not set |
93 | # CONFIG_USE_GENERIC_SMP_HELPERS is not set | ||
94 | CONFIG_HAVE_CLK=y | ||
89 | CONFIG_PROC_PAGE_MONITOR=y | 95 | CONFIG_PROC_PAGE_MONITOR=y |
96 | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||
90 | CONFIG_SLABINFO=y | 97 | CONFIG_SLABINFO=y |
91 | CONFIG_RT_MUTEXES=y | 98 | CONFIG_RT_MUTEXES=y |
92 | # CONFIG_TINY_SHMEM is not set | 99 | # CONFIG_TINY_SHMEM is not set |
@@ -96,12 +103,13 @@ CONFIG_MODULES=y | |||
96 | # CONFIG_MODULE_UNLOAD is not set | 103 | # CONFIG_MODULE_UNLOAD is not set |
97 | # CONFIG_MODVERSIONS is not set | 104 | # CONFIG_MODVERSIONS is not set |
98 | # CONFIG_MODULE_SRCVERSION_ALL is not set | 105 | # CONFIG_MODULE_SRCVERSION_ALL is not set |
99 | # CONFIG_KMOD is not set | 106 | CONFIG_KMOD=y |
100 | CONFIG_BLOCK=y | 107 | CONFIG_BLOCK=y |
101 | # CONFIG_LBD is not set | 108 | # CONFIG_LBD is not set |
102 | # CONFIG_BLK_DEV_IO_TRACE is not set | 109 | # CONFIG_BLK_DEV_IO_TRACE is not set |
103 | # CONFIG_LSF is not set | 110 | # CONFIG_LSF is not set |
104 | # CONFIG_BLK_DEV_BSG is not set | 111 | # CONFIG_BLK_DEV_BSG is not set |
112 | # CONFIG_BLK_DEV_INTEGRITY is not set | ||
105 | 113 | ||
106 | # | 114 | # |
107 | # IO Schedulers | 115 | # IO Schedulers |
@@ -177,6 +185,7 @@ CONFIG_PAGE_SIZE_4KB=y | |||
177 | # CONFIG_PAGE_SIZE_8KB is not set | 185 | # CONFIG_PAGE_SIZE_8KB is not set |
178 | # CONFIG_PAGE_SIZE_16KB is not set | 186 | # CONFIG_PAGE_SIZE_16KB is not set |
179 | # CONFIG_PAGE_SIZE_64KB is not set | 187 | # CONFIG_PAGE_SIZE_64KB is not set |
188 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
180 | CONFIG_SELECT_MEMORY_MODEL=y | 189 | CONFIG_SELECT_MEMORY_MODEL=y |
181 | # CONFIG_FLATMEM_MANUAL is not set | 190 | # CONFIG_FLATMEM_MANUAL is not set |
182 | # CONFIG_DISCONTIGMEM_MANUAL is not set | 191 | # CONFIG_DISCONTIGMEM_MANUAL is not set |
@@ -258,6 +267,7 @@ CONFIG_HZ=250 | |||
258 | # CONFIG_SCHED_HRTICK is not set | 267 | # CONFIG_SCHED_HRTICK is not set |
259 | # CONFIG_KEXEC is not set | 268 | # CONFIG_KEXEC is not set |
260 | # CONFIG_CRASH_DUMP is not set | 269 | # CONFIG_CRASH_DUMP is not set |
270 | CONFIG_SECCOMP=y | ||
261 | CONFIG_PREEMPT_NONE=y | 271 | CONFIG_PREEMPT_NONE=y |
262 | # CONFIG_PREEMPT_VOLUNTARY is not set | 272 | # CONFIG_PREEMPT_VOLUNTARY is not set |
263 | # CONFIG_PREEMPT is not set | 273 | # CONFIG_PREEMPT is not set |
@@ -282,10 +292,6 @@ CONFIG_CMDLINE="console=ttySC2,115200 root=/dev/sda1 rootdelay=10" | |||
282 | # | 292 | # |
283 | CONFIG_BINFMT_ELF=y | 293 | CONFIG_BINFMT_ELF=y |
284 | # CONFIG_BINFMT_MISC is not set | 294 | # CONFIG_BINFMT_MISC is not set |
285 | |||
286 | # | ||
287 | # Networking | ||
288 | # | ||
289 | CONFIG_NET=y | 295 | CONFIG_NET=y |
290 | 296 | ||
291 | # | 297 | # |
@@ -361,6 +367,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic" | |||
361 | # | 367 | # |
362 | # CONFIG_CFG80211 is not set | 368 | # CONFIG_CFG80211 is not set |
363 | CONFIG_WIRELESS_EXT=y | 369 | CONFIG_WIRELESS_EXT=y |
370 | CONFIG_WIRELESS_EXT_SYSFS=y | ||
364 | # CONFIG_MAC80211 is not set | 371 | # CONFIG_MAC80211 is not set |
365 | # CONFIG_IEEE80211 is not set | 372 | # CONFIG_IEEE80211 is not set |
366 | # CONFIG_RFKILL is not set | 373 | # CONFIG_RFKILL is not set |
@@ -377,6 +384,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
377 | CONFIG_STANDALONE=y | 384 | CONFIG_STANDALONE=y |
378 | CONFIG_PREVENT_FIRMWARE_BUILD=y | 385 | CONFIG_PREVENT_FIRMWARE_BUILD=y |
379 | CONFIG_FW_LOADER=y | 386 | CONFIG_FW_LOADER=y |
387 | CONFIG_FIRMWARE_IN_KERNEL=y | ||
388 | CONFIG_EXTRA_FIRMWARE="" | ||
380 | # CONFIG_SYS_HYPERVISOR is not set | 389 | # CONFIG_SYS_HYPERVISOR is not set |
381 | # CONFIG_CONNECTOR is not set | 390 | # CONFIG_CONNECTOR is not set |
382 | CONFIG_MTD=y | 391 | CONFIG_MTD=y |
@@ -471,6 +480,7 @@ CONFIG_BLK_DEV=y | |||
471 | # CONFIG_BLK_DEV_RAM is not set | 480 | # CONFIG_BLK_DEV_RAM is not set |
472 | # CONFIG_CDROM_PKTCDVD is not set | 481 | # CONFIG_CDROM_PKTCDVD is not set |
473 | # CONFIG_ATA_OVER_ETH is not set | 482 | # CONFIG_ATA_OVER_ETH is not set |
483 | # CONFIG_BLK_DEV_HD is not set | ||
474 | # CONFIG_MISC_DEVICES is not set | 484 | # CONFIG_MISC_DEVICES is not set |
475 | CONFIG_HAVE_IDE=y | 485 | CONFIG_HAVE_IDE=y |
476 | # CONFIG_IDE is not set | 486 | # CONFIG_IDE is not set |
@@ -515,10 +525,10 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
515 | CONFIG_SCSI_LOWLEVEL=y | 525 | CONFIG_SCSI_LOWLEVEL=y |
516 | # CONFIG_ISCSI_TCP is not set | 526 | # CONFIG_ISCSI_TCP is not set |
517 | # CONFIG_SCSI_DEBUG is not set | 527 | # CONFIG_SCSI_DEBUG is not set |
528 | # CONFIG_SCSI_DH is not set | ||
518 | # CONFIG_ATA is not set | 529 | # CONFIG_ATA is not set |
519 | # CONFIG_MD is not set | 530 | # CONFIG_MD is not set |
520 | CONFIG_NETDEVICES=y | 531 | CONFIG_NETDEVICES=y |
521 | # CONFIG_NETDEVICES_MULTIQUEUE is not set | ||
522 | # CONFIG_DUMMY is not set | 532 | # CONFIG_DUMMY is not set |
523 | # CONFIG_BONDING is not set | 533 | # CONFIG_BONDING is not set |
524 | # CONFIG_MACVLAN is not set | 534 | # CONFIG_MACVLAN is not set |
@@ -546,7 +556,9 @@ CONFIG_NET_ETHERNET=y | |||
546 | CONFIG_MII=y | 556 | CONFIG_MII=y |
547 | # CONFIG_AX88796 is not set | 557 | # CONFIG_AX88796 is not set |
548 | # CONFIG_STNIC is not set | 558 | # CONFIG_STNIC is not set |
559 | CONFIG_SH_ETH=y | ||
549 | # CONFIG_SMC91X is not set | 560 | # CONFIG_SMC91X is not set |
561 | # CONFIG_SMC911X is not set | ||
550 | # CONFIG_IBM_NEW_EMAC_ZMII is not set | 562 | # CONFIG_IBM_NEW_EMAC_ZMII is not set |
551 | # CONFIG_IBM_NEW_EMAC_RGMII is not set | 563 | # CONFIG_IBM_NEW_EMAC_RGMII is not set |
552 | # CONFIG_IBM_NEW_EMAC_TAH is not set | 564 | # CONFIG_IBM_NEW_EMAC_TAH is not set |
@@ -613,7 +625,11 @@ CONFIG_INPUT=y | |||
613 | # | 625 | # |
614 | # Character devices | 626 | # Character devices |
615 | # | 627 | # |
616 | # CONFIG_VT is not set | 628 | CONFIG_VT=y |
629 | CONFIG_CONSOLE_TRANSLATIONS=y | ||
630 | CONFIG_VT_CONSOLE=y | ||
631 | CONFIG_HW_CONSOLE=y | ||
632 | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||
617 | CONFIG_DEVKMEM=y | 633 | CONFIG_DEVKMEM=y |
618 | # CONFIG_SERIAL_NONSTANDARD is not set | 634 | # CONFIG_SERIAL_NONSTANDARD is not set |
619 | 635 | ||
@@ -644,6 +660,7 @@ CONFIG_HW_RANDOM=y | |||
644 | # CONFIG_POWER_SUPPLY is not set | 660 | # CONFIG_POWER_SUPPLY is not set |
645 | # CONFIG_HWMON is not set | 661 | # CONFIG_HWMON is not set |
646 | # CONFIG_THERMAL is not set | 662 | # CONFIG_THERMAL is not set |
663 | # CONFIG_THERMAL_HWMON is not set | ||
647 | # CONFIG_WATCHDOG is not set | 664 | # CONFIG_WATCHDOG is not set |
648 | 665 | ||
649 | # | 666 | # |
@@ -655,6 +672,7 @@ CONFIG_SSB_POSSIBLE=y | |||
655 | # | 672 | # |
656 | # Multifunction device drivers | 673 | # Multifunction device drivers |
657 | # | 674 | # |
675 | # CONFIG_MFD_CORE is not set | ||
658 | # CONFIG_MFD_SM501 is not set | 676 | # CONFIG_MFD_SM501 is not set |
659 | # CONFIG_HTC_PASIC3 is not set | 677 | # CONFIG_HTC_PASIC3 is not set |
660 | 678 | ||
@@ -679,7 +697,34 @@ CONFIG_SSB_POSSIBLE=y | |||
679 | # | 697 | # |
680 | # CONFIG_VGASTATE is not set | 698 | # CONFIG_VGASTATE is not set |
681 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set | 699 | # CONFIG_VIDEO_OUTPUT_CONTROL is not set |
682 | # CONFIG_FB is not set | 700 | CONFIG_FB=y |
701 | # CONFIG_FIRMWARE_EDID is not set | ||
702 | # CONFIG_FB_DDC is not set | ||
703 | CONFIG_FB_CFB_FILLRECT=y | ||
704 | CONFIG_FB_CFB_COPYAREA=y | ||
705 | CONFIG_FB_CFB_IMAGEBLIT=y | ||
706 | # CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set | ||
707 | # CONFIG_FB_SYS_FILLRECT is not set | ||
708 | # CONFIG_FB_SYS_COPYAREA is not set | ||
709 | # CONFIG_FB_SYS_IMAGEBLIT is not set | ||
710 | CONFIG_FB_FOREIGN_ENDIAN=y | ||
711 | CONFIG_FB_BOTH_ENDIAN=y | ||
712 | # CONFIG_FB_BIG_ENDIAN is not set | ||
713 | # CONFIG_FB_LITTLE_ENDIAN is not set | ||
714 | # CONFIG_FB_SYS_FOPS is not set | ||
715 | # CONFIG_FB_SVGALIB is not set | ||
716 | # CONFIG_FB_MACMODES is not set | ||
717 | # CONFIG_FB_BACKLIGHT is not set | ||
718 | # CONFIG_FB_MODE_HELPERS is not set | ||
719 | # CONFIG_FB_TILEBLITTING is not set | ||
720 | |||
721 | # | ||
722 | # Frame buffer hardware drivers | ||
723 | # | ||
724 | # CONFIG_FB_S1D13XXX is not set | ||
725 | # CONFIG_FB_SH_MOBILE_LCDC is not set | ||
726 | CONFIG_FB_SH7760=y | ||
727 | # CONFIG_FB_VIRTUAL is not set | ||
683 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set | 728 | # CONFIG_BACKLIGHT_LCD_SUPPORT is not set |
684 | 729 | ||
685 | # | 730 | # |
@@ -688,8 +733,22 @@ CONFIG_SSB_POSSIBLE=y | |||
688 | # CONFIG_DISPLAY_SUPPORT is not set | 733 | # CONFIG_DISPLAY_SUPPORT is not set |
689 | 734 | ||
690 | # | 735 | # |
691 | # Sound | 736 | # Console display driver support |
692 | # | 737 | # |
738 | CONFIG_DUMMY_CONSOLE=y | ||
739 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
740 | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||
741 | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||
742 | # CONFIG_FONTS is not set | ||
743 | CONFIG_FONT_8x8=y | ||
744 | CONFIG_FONT_8x16=y | ||
745 | CONFIG_LOGO=y | ||
746 | CONFIG_LOGO_LINUX_MONO=y | ||
747 | CONFIG_LOGO_LINUX_VGA16=y | ||
748 | CONFIG_LOGO_LINUX_CLUT224=y | ||
749 | CONFIG_LOGO_SUPERH_MONO=y | ||
750 | CONFIG_LOGO_SUPERH_VGA16=y | ||
751 | CONFIG_LOGO_SUPERH_CLUT224=y | ||
693 | # CONFIG_SOUND is not set | 752 | # CONFIG_SOUND is not set |
694 | # CONFIG_HID_SUPPORT is not set | 753 | # CONFIG_HID_SUPPORT is not set |
695 | CONFIG_USB_SUPPORT=y | 754 | CONFIG_USB_SUPPORT=y |
@@ -788,11 +847,27 @@ CONFIG_USB_MON=y | |||
788 | # CONFIG_USB_IOWARRIOR is not set | 847 | # CONFIG_USB_IOWARRIOR is not set |
789 | # CONFIG_USB_ISIGHTFW is not set | 848 | # CONFIG_USB_ISIGHTFW is not set |
790 | # CONFIG_USB_GADGET is not set | 849 | # CONFIG_USB_GADGET is not set |
791 | # CONFIG_MMC is not set | 850 | CONFIG_MMC=y |
851 | # CONFIG_MMC_DEBUG is not set | ||
852 | # CONFIG_MMC_UNSAFE_RESUME is not set | ||
853 | |||
854 | # | ||
855 | # MMC/SD Card Drivers | ||
856 | # | ||
857 | CONFIG_MMC_BLOCK=y | ||
858 | CONFIG_MMC_BLOCK_BOUNCE=y | ||
859 | # CONFIG_SDIO_UART is not set | ||
860 | # CONFIG_MMC_TEST is not set | ||
861 | |||
862 | # | ||
863 | # MMC/SD Host Controller Drivers | ||
864 | # | ||
865 | # CONFIG_MMC_SDHCI is not set | ||
792 | # CONFIG_MEMSTICK is not set | 866 | # CONFIG_MEMSTICK is not set |
793 | # CONFIG_NEW_LEDS is not set | 867 | # CONFIG_NEW_LEDS is not set |
794 | # CONFIG_ACCESSIBILITY is not set | 868 | # CONFIG_ACCESSIBILITY is not set |
795 | # CONFIG_RTC_CLASS is not set | 869 | # CONFIG_RTC_CLASS is not set |
870 | # CONFIG_DMADEVICES is not set | ||
796 | # CONFIG_UIO is not set | 871 | # CONFIG_UIO is not set |
797 | 872 | ||
798 | # | 873 | # |
@@ -865,6 +940,7 @@ CONFIG_TMPFS_POSIX_ACL=y | |||
865 | # CONFIG_CRAMFS is not set | 940 | # CONFIG_CRAMFS is not set |
866 | # CONFIG_VXFS_FS is not set | 941 | # CONFIG_VXFS_FS is not set |
867 | # CONFIG_MINIX_FS is not set | 942 | # CONFIG_MINIX_FS is not set |
943 | # CONFIG_OMFS_FS is not set | ||
868 | # CONFIG_HPFS_FS is not set | 944 | # CONFIG_HPFS_FS is not set |
869 | # CONFIG_QNX4FS_FS is not set | 945 | # CONFIG_QNX4FS_FS is not set |
870 | # CONFIG_ROMFS_FS is not set | 946 | # CONFIG_ROMFS_FS is not set |
@@ -874,12 +950,11 @@ CONFIG_NETWORK_FILESYSTEMS=y | |||
874 | CONFIG_NFS_FS=y | 950 | CONFIG_NFS_FS=y |
875 | # CONFIG_NFS_V3 is not set | 951 | # CONFIG_NFS_V3 is not set |
876 | # CONFIG_NFS_V4 is not set | 952 | # CONFIG_NFS_V4 is not set |
877 | # CONFIG_NFSD is not set | ||
878 | CONFIG_ROOT_NFS=y | 953 | CONFIG_ROOT_NFS=y |
954 | # CONFIG_NFSD is not set | ||
879 | CONFIG_LOCKD=y | 955 | CONFIG_LOCKD=y |
880 | CONFIG_NFS_COMMON=y | 956 | CONFIG_NFS_COMMON=y |
881 | CONFIG_SUNRPC=y | 957 | CONFIG_SUNRPC=y |
882 | # CONFIG_SUNRPC_BIND34 is not set | ||
883 | # CONFIG_RPCSEC_GSS_KRB5 is not set | 958 | # CONFIG_RPCSEC_GSS_KRB5 is not set |
884 | # CONFIG_RPCSEC_GSS_SPKM3 is not set | 959 | # CONFIG_RPCSEC_GSS_SPKM3 is not set |
885 | # CONFIG_SMB_FS is not set | 960 | # CONFIG_SMB_FS is not set |
@@ -949,6 +1024,7 @@ CONFIG_FRAME_WARN=1024 | |||
949 | # CONFIG_HEADERS_CHECK is not set | 1024 | # CONFIG_HEADERS_CHECK is not set |
950 | # CONFIG_DEBUG_KERNEL is not set | 1025 | # CONFIG_DEBUG_KERNEL is not set |
951 | # CONFIG_DEBUG_BUGVERBOSE is not set | 1026 | # CONFIG_DEBUG_BUGVERBOSE is not set |
1027 | # CONFIG_DEBUG_MEMORY_INIT is not set | ||
952 | # CONFIG_SAMPLES is not set | 1028 | # CONFIG_SAMPLES is not set |
953 | # CONFIG_SH_STANDARD_BIOS is not set | 1029 | # CONFIG_SH_STANDARD_BIOS is not set |
954 | # CONFIG_EARLY_SCIF_CONSOLE is not set | 1030 | # CONFIG_EARLY_SCIF_CONSOLE is not set |
@@ -1003,6 +1079,10 @@ CONFIG_CRYPTO=y | |||
1003 | # CONFIG_CRYPTO_MD4 is not set | 1079 | # CONFIG_CRYPTO_MD4 is not set |
1004 | # CONFIG_CRYPTO_MD5 is not set | 1080 | # CONFIG_CRYPTO_MD5 is not set |
1005 | # CONFIG_CRYPTO_MICHAEL_MIC is not set | 1081 | # CONFIG_CRYPTO_MICHAEL_MIC is not set |
1082 | # CONFIG_CRYPTO_RMD128 is not set | ||
1083 | # CONFIG_CRYPTO_RMD160 is not set | ||
1084 | # CONFIG_CRYPTO_RMD256 is not set | ||
1085 | # CONFIG_CRYPTO_RMD320 is not set | ||
1006 | # CONFIG_CRYPTO_SHA1 is not set | 1086 | # CONFIG_CRYPTO_SHA1 is not set |
1007 | # CONFIG_CRYPTO_SHA256 is not set | 1087 | # CONFIG_CRYPTO_SHA256 is not set |
1008 | # CONFIG_CRYPTO_SHA512 is not set | 1088 | # CONFIG_CRYPTO_SHA512 is not set |
@@ -1042,6 +1122,7 @@ CONFIG_BITREVERSE=y | |||
1042 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set | 1122 | # CONFIG_GENERIC_FIND_FIRST_BIT is not set |
1043 | # CONFIG_CRC_CCITT is not set | 1123 | # CONFIG_CRC_CCITT is not set |
1044 | # CONFIG_CRC16 is not set | 1124 | # CONFIG_CRC16 is not set |
1125 | CONFIG_CRC_T10DIF=y | ||
1045 | # CONFIG_CRC_ITU_T is not set | 1126 | # CONFIG_CRC_ITU_T is not set |
1046 | CONFIG_CRC32=y | 1127 | CONFIG_CRC32=y |
1047 | # CONFIG_CRC7 is not set | 1128 | # CONFIG_CRC7 is not set |
diff --git a/arch/sh/include/asm/flat.h b/arch/sh/include/asm/flat.h index 0cc800299e06..d3b2b4f109e3 100644 --- a/arch/sh/include/asm/flat.h +++ b/arch/sh/include/asm/flat.h | |||
@@ -21,4 +21,11 @@ | |||
21 | #define flat_get_relocate_addr(rel) (rel) | 21 | #define flat_get_relocate_addr(rel) (rel) |
22 | #define flat_set_persistent(relval, p) ({ (void)p; 0; }) | 22 | #define flat_set_persistent(relval, p) ({ (void)p; 0; }) |
23 | 23 | ||
24 | #define FLAT_PLAT_INIT(_r) \ | ||
25 | do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \ | ||
26 | _r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \ | ||
27 | _r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \ | ||
28 | _r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \ | ||
29 | _r->sr = SR_FD; } while (0) | ||
30 | |||
24 | #endif /* __ASM_SH_FLAT_H */ | 31 | #endif /* __ASM_SH_FLAT_H */ |
diff --git a/arch/sh/include/asm/kexec.h b/arch/sh/include/asm/kexec.h index 00f4260ef09b..765a5e1660fc 100644 --- a/arch/sh/include/asm/kexec.h +++ b/arch/sh/include/asm/kexec.h | |||
@@ -21,7 +21,7 @@ | |||
21 | /* Maximum address we can use for the control code buffer */ | 21 | /* Maximum address we can use for the control code buffer */ |
22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 22 | #define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
23 | 23 | ||
24 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 24 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
25 | 25 | ||
26 | /* The native architecture */ | 26 | /* The native architecture */ |
27 | #define KEXEC_ARCH KEXEC_ARCH_SH | 27 | #define KEXEC_ARCH KEXEC_ARCH_SH |
diff --git a/arch/sh/include/asm/migor.h b/arch/sh/include/asm/migor.h index 10016e0f4a4e..c12b632c540b 100644 --- a/arch/sh/include/asm/migor.h +++ b/arch/sh/include/asm/migor.h | |||
@@ -42,9 +42,6 @@ | |||
42 | 42 | ||
43 | #define PORT_MSELCRB 0xa4050182 | 43 | #define PORT_MSELCRB 0xa4050182 |
44 | 44 | ||
45 | #define MSTPCR1 0xa4150034 | ||
46 | #define MSTPCR2 0xa4150038 | ||
47 | |||
48 | #define PORT_PSELA 0xa405014e | 45 | #define PORT_PSELA 0xa405014e |
49 | #define PORT_PSELB 0xa4050150 | 46 | #define PORT_PSELB 0xa4050150 |
50 | #define PORT_PSELC 0xa4050152 | 47 | #define PORT_PSELC 0xa4050152 |
diff --git a/arch/sh/include/asm/sh_mobile_lcdc.h b/arch/sh/include/asm/sh_mobile_lcdc.h index 27677727df4d..130102f663f5 100644 --- a/arch/sh/include/asm/sh_mobile_lcdc.h +++ b/arch/sh/include/asm/sh_mobile_lcdc.h | |||
@@ -47,12 +47,18 @@ struct sh_mobile_lcdc_board_cfg { | |||
47 | void (*display_off)(void *board_data); | 47 | void (*display_off)(void *board_data); |
48 | }; | 48 | }; |
49 | 49 | ||
50 | struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */ | ||
51 | unsigned long width; | ||
52 | unsigned long height; | ||
53 | }; | ||
54 | |||
50 | struct sh_mobile_lcdc_chan_cfg { | 55 | struct sh_mobile_lcdc_chan_cfg { |
51 | int chan; | 56 | int chan; |
52 | int bpp; | 57 | int bpp; |
53 | int interface_type; /* selects RGBn or SYSn I/F, see above */ | 58 | int interface_type; /* selects RGBn or SYSn I/F, see above */ |
54 | int clock_divider; | 59 | int clock_divider; |
55 | struct fb_videomode lcd_cfg; | 60 | struct fb_videomode lcd_cfg; |
61 | struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg; | ||
56 | struct sh_mobile_lcdc_board_cfg board_cfg; | 62 | struct sh_mobile_lcdc_board_cfg board_cfg; |
57 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ | 63 | struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */ |
58 | }; | 64 | }; |
diff --git a/arch/sh/include/cpu-sh3/cpu/cacheflush.h b/arch/sh/include/cpu-sh3/cpu/cacheflush.h index abc909880807..1ac27aae6700 100644 --- a/arch/sh/include/cpu-sh3/cpu/cacheflush.h +++ b/arch/sh/include/cpu-sh3/cpu/cacheflush.h | |||
@@ -29,6 +29,16 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned l | |||
29 | void flush_dcache_page(struct page *pg); | 29 | void flush_dcache_page(struct page *pg); |
30 | void flush_icache_range(unsigned long start, unsigned long end); | 30 | void flush_icache_range(unsigned long start, unsigned long end); |
31 | void flush_icache_page(struct vm_area_struct *vma, struct page *page); | 31 | void flush_icache_page(struct vm_area_struct *vma, struct page *page); |
32 | |||
33 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | ||
34 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | ||
35 | |||
36 | /* SH3 has unified cache so no special action needed here */ | ||
37 | #define flush_cache_sigtramp(vaddr) do { } while (0) | ||
38 | #define flush_icache_user_range(vma,pg,adr,len) do { } while (0) | ||
39 | |||
40 | #define p3_cache_init() do { } while (0) | ||
41 | |||
32 | #else | 42 | #else |
33 | #include <cpu-common/cpu/cacheflush.h> | 43 | #include <cpu-common/cpu/cacheflush.h> |
34 | #endif | 44 | #endif |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index cd6baffdc896..a7412cede534 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
@@ -45,7 +45,7 @@ static struct platform_device vpu_device = { | |||
45 | }; | 45 | }; |
46 | 46 | ||
47 | static struct uio_info veu0_platform_data = { | 47 | static struct uio_info veu0_platform_data = { |
48 | .name = "VEU", | 48 | .name = "VEU2H", |
49 | .version = "0", | 49 | .version = "0", |
50 | .irq = 54, | 50 | .irq = 54, |
51 | }; | 51 | }; |
@@ -73,7 +73,7 @@ static struct platform_device veu0_device = { | |||
73 | }; | 73 | }; |
74 | 74 | ||
75 | static struct uio_info veu1_platform_data = { | 75 | static struct uio_info veu1_platform_data = { |
76 | .name = "VEU", | 76 | .name = "VEU2H", |
77 | .version = "0", | 77 | .version = "0", |
78 | .irq = 27, | 78 | .irq = 27, |
79 | }; | 79 | }; |
diff --git a/arch/sh/kernel/sh_ksyms_32.c b/arch/sh/kernel/sh_ksyms_32.c index 8f916536719c..6e1b1c271658 100644 --- a/arch/sh/kernel/sh_ksyms_32.c +++ b/arch/sh/kernel/sh_ksyms_32.c | |||
@@ -107,10 +107,12 @@ DECLARE_EXPORT(__movmemSI12_i4); | |||
107 | * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST | 107 | * GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST |
108 | * compiler which include backported patches. | 108 | * compiler which include backported patches. |
109 | */ | 109 | */ |
110 | DECLARE_EXPORT(__sdivsi3_i4i); | ||
111 | DECLARE_EXPORT(__udiv_qrnnd_16); | 110 | DECLARE_EXPORT(__udiv_qrnnd_16); |
111 | #if !defined(CONFIG_CPU_SH2) | ||
112 | DECLARE_EXPORT(__sdivsi3_i4i); | ||
112 | DECLARE_EXPORT(__udivsi3_i4i); | 113 | DECLARE_EXPORT(__udivsi3_i4i); |
113 | #endif | 114 | #endif |
115 | #endif | ||
114 | #else /* GCC 3.x */ | 116 | #else /* GCC 3.x */ |
115 | DECLARE_EXPORT(__movstr_i4_even); | 117 | DECLARE_EXPORT(__movstr_i4_even); |
116 | DECLARE_EXPORT(__movstr_i4_odd); | 118 | DECLARE_EXPORT(__movstr_i4_odd); |
diff --git a/arch/sh/mm/Kconfig b/arch/sh/mm/Kconfig index 9c131cac91a4..8a03926ea84f 100644 --- a/arch/sh/mm/Kconfig +++ b/arch/sh/mm/Kconfig | |||
@@ -181,10 +181,12 @@ config ENTRY_OFFSET | |||
181 | choice | 181 | choice |
182 | prompt "HugeTLB page size" | 182 | prompt "HugeTLB page size" |
183 | depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU | 183 | depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU |
184 | default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB | ||
184 | default HUGETLB_PAGE_SIZE_64K | 185 | default HUGETLB_PAGE_SIZE_64K |
185 | 186 | ||
186 | config HUGETLB_PAGE_SIZE_64K | 187 | config HUGETLB_PAGE_SIZE_64K |
187 | bool "64kB" | 188 | bool "64kB" |
189 | depends on !PAGE_SIZE_64KB | ||
188 | 190 | ||
189 | config HUGETLB_PAGE_SIZE_256K | 191 | config HUGETLB_PAGE_SIZE_256K |
190 | bool "256kB" | 192 | bool "256kB" |
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c index b2ce014401b5..895bb3f335c7 100644 --- a/arch/sh/mm/consistent.c +++ b/arch/sh/mm/consistent.c | |||
@@ -95,6 +95,29 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size, | |||
95 | } | 95 | } |
96 | EXPORT_SYMBOL(dma_cache_sync); | 96 | EXPORT_SYMBOL(dma_cache_sync); |
97 | 97 | ||
98 | static int __init memchunk_setup(char *str) | ||
99 | { | ||
100 | return 1; /* accept anything that begins with "memchunk." */ | ||
101 | } | ||
102 | __setup("memchunk.", memchunk_setup); | ||
103 | |||
104 | static void memchunk_cmdline_override(char *name, unsigned long *sizep) | ||
105 | { | ||
106 | char *p = boot_command_line; | ||
107 | int k = strlen(name); | ||
108 | |||
109 | while ((p = strstr(p, "memchunk."))) { | ||
110 | p += 9; /* strlen("memchunk.") */ | ||
111 | if (!strncmp(name, p, k) && p[k] == '=') { | ||
112 | p += k + 1; | ||
113 | *sizep = memparse(p, NULL); | ||
114 | pr_info("%s: forcing memory chunk size to 0x%08lx\n", | ||
115 | name, *sizep); | ||
116 | break; | ||
117 | } | ||
118 | } | ||
119 | } | ||
120 | |||
98 | int platform_resource_setup_memory(struct platform_device *pdev, | 121 | int platform_resource_setup_memory(struct platform_device *pdev, |
99 | char *name, unsigned long memsize) | 122 | char *name, unsigned long memsize) |
100 | { | 123 | { |
@@ -109,6 +132,10 @@ int platform_resource_setup_memory(struct platform_device *pdev, | |||
109 | return -EINVAL; | 132 | return -EINVAL; |
110 | } | 133 | } |
111 | 134 | ||
135 | memchunk_cmdline_override(name, &memsize); | ||
136 | if (!memsize) | ||
137 | return 0; | ||
138 | |||
112 | buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL); | 139 | buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL); |
113 | if (!buf) { | 140 | if (!buf) { |
114 | pr_warning("%s: unable to allocate memory\n", name); | 141 | pr_warning("%s: unable to allocate memory\n", name); |
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c index 217de3ea29e8..b4aeb0f696dc 100644 --- a/arch/sparc64/mm/init.c +++ b/arch/sparc64/mm/init.c | |||
@@ -796,6 +796,9 @@ static unsigned long nid_range(unsigned long start, unsigned long end, | |||
796 | start += PAGE_SIZE; | 796 | start += PAGE_SIZE; |
797 | } | 797 | } |
798 | 798 | ||
799 | if (start > end) | ||
800 | start = end; | ||
801 | |||
799 | return start; | 802 | return start; |
800 | } | 803 | } |
801 | #else | 804 | #else |
@@ -1723,8 +1726,7 @@ void __init paging_init(void) | |||
1723 | 1726 | ||
1724 | find_ramdisk(phys_base); | 1727 | find_ramdisk(phys_base); |
1725 | 1728 | ||
1726 | if (cmdline_memory_size) | 1729 | lmb_enforce_memory_limit(cmdline_memory_size); |
1727 | lmb_enforce_memory_limit(phys_base + cmdline_memory_size); | ||
1728 | 1730 | ||
1729 | lmb_analyze(); | 1731 | lmb_analyze(); |
1730 | lmb_dump_all(); | 1732 | lmb_dump_all(); |
@@ -1961,6 +1963,15 @@ void __init mem_init(void) | |||
1961 | void free_initmem(void) | 1963 | void free_initmem(void) |
1962 | { | 1964 | { |
1963 | unsigned long addr, initend; | 1965 | unsigned long addr, initend; |
1966 | int do_free = 1; | ||
1967 | |||
1968 | /* If the physical memory maps were trimmed by kernel command | ||
1969 | * line options, don't even try freeing this initmem stuff up. | ||
1970 | * The kernel image could have been in the trimmed out region | ||
1971 | * and if so the freeing below will free invalid page structs. | ||
1972 | */ | ||
1973 | if (cmdline_memory_size) | ||
1974 | do_free = 0; | ||
1964 | 1975 | ||
1965 | /* | 1976 | /* |
1966 | * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes. | 1977 | * The init section is aligned to 8k in vmlinux.lds. Page align for >8k pagesizes. |
@@ -1975,13 +1986,16 @@ void free_initmem(void) | |||
1975 | ((unsigned long) __va(kern_base)) - | 1986 | ((unsigned long) __va(kern_base)) - |
1976 | ((unsigned long) KERNBASE)); | 1987 | ((unsigned long) KERNBASE)); |
1977 | memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); | 1988 | memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE); |
1978 | p = virt_to_page(page); | ||
1979 | 1989 | ||
1980 | ClearPageReserved(p); | 1990 | if (do_free) { |
1981 | init_page_count(p); | 1991 | p = virt_to_page(page); |
1982 | __free_page(p); | 1992 | |
1983 | num_physpages++; | 1993 | ClearPageReserved(p); |
1984 | totalram_pages++; | 1994 | init_page_count(p); |
1995 | __free_page(p); | ||
1996 | num_physpages++; | ||
1997 | totalram_pages++; | ||
1998 | } | ||
1985 | } | 1999 | } |
1986 | } | 2000 | } |
1987 | 2001 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index ac2fb0641a04..68d91c8233f4 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -951,9 +951,9 @@ config NUMA | |||
951 | local memory controller of the CPU and add some more | 951 | local memory controller of the CPU and add some more |
952 | NUMA awareness to the kernel. | 952 | NUMA awareness to the kernel. |
953 | 953 | ||
954 | For i386 this is currently highly experimental and should be only | 954 | For 32-bit this is currently highly experimental and should be only |
955 | used for kernel development. It might also cause boot failures. | 955 | used for kernel development. It might also cause boot failures. |
956 | For x86_64 this is recommended on all multiprocessor Opteron systems. | 956 | For 64-bit this is recommended on all multiprocessor Opteron systems. |
957 | If the system is EM64T, you should say N unless your system is | 957 | If the system is EM64T, you should say N unless your system is |
958 | EM64T NUMA. | 958 | EM64T NUMA. |
959 | 959 | ||
@@ -1263,7 +1263,7 @@ config KEXEC | |||
1263 | strongly in flux, so no good recommendation can be made. | 1263 | strongly in flux, so no good recommendation can be made. |
1264 | 1264 | ||
1265 | config CRASH_DUMP | 1265 | config CRASH_DUMP |
1266 | bool "kernel crash dumps (EXPERIMENTAL)" | 1266 | bool "kernel crash dumps" |
1267 | depends on X86_64 || (X86_32 && HIGHMEM) | 1267 | depends on X86_64 || (X86_32 && HIGHMEM) |
1268 | help | 1268 | help |
1269 | Generate crash dump after being started by kexec. | 1269 | Generate crash dump after being started by kexec. |
diff --git a/arch/x86/boot/boot.h b/arch/x86/boot/boot.h index a34b9982c7cb..cc0ef13fba7a 100644 --- a/arch/x86/boot/boot.h +++ b/arch/x86/boot/boot.h | |||
@@ -24,10 +24,14 @@ | |||
24 | #include <linux/edd.h> | 24 | #include <linux/edd.h> |
25 | #include <asm/boot.h> | 25 | #include <asm/boot.h> |
26 | #include <asm/setup.h> | 26 | #include <asm/setup.h> |
27 | #include "bitops.h" | ||
28 | #include <asm/cpufeature.h> | ||
27 | 29 | ||
28 | /* Useful macros */ | 30 | /* Useful macros */ |
29 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) | 31 | #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) |
30 | 32 | ||
33 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x))) | ||
34 | |||
31 | extern struct setup_header hdr; | 35 | extern struct setup_header hdr; |
32 | extern struct boot_params boot_params; | 36 | extern struct boot_params boot_params; |
33 | 37 | ||
@@ -242,6 +246,12 @@ int cmdline_find_option(const char *option, char *buffer, int bufsize); | |||
242 | int cmdline_find_option_bool(const char *option); | 246 | int cmdline_find_option_bool(const char *option); |
243 | 247 | ||
244 | /* cpu.c, cpucheck.c */ | 248 | /* cpu.c, cpucheck.c */ |
249 | struct cpu_features { | ||
250 | int level; /* Family, or 64 for x86-64 */ | ||
251 | int model; | ||
252 | u32 flags[NCAPINTS]; | ||
253 | }; | ||
254 | extern struct cpu_features cpu; | ||
245 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); | 255 | int check_cpu(int *cpu_level_ptr, int *req_level_ptr, u32 **err_flags_ptr); |
246 | int validate_cpu(void); | 256 | int validate_cpu(void); |
247 | 257 | ||
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c index 92d6fd73dc7d..75298fe2edca 100644 --- a/arch/x86/boot/cpu.c +++ b/arch/x86/boot/cpu.c | |||
@@ -16,9 +16,6 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | #include "boot.h" | 18 | #include "boot.h" |
19 | #include "bitops.h" | ||
20 | #include <asm/cpufeature.h> | ||
21 | |||
22 | #include "cpustr.h" | 19 | #include "cpustr.h" |
23 | 20 | ||
24 | static char *cpu_name(int level) | 21 | static char *cpu_name(int level) |
diff --git a/arch/x86/boot/cpucheck.c b/arch/x86/boot/cpucheck.c index 7804389ee005..4b9ae7c56748 100644 --- a/arch/x86/boot/cpucheck.c +++ b/arch/x86/boot/cpucheck.c | |||
@@ -22,21 +22,13 @@ | |||
22 | 22 | ||
23 | #ifdef _SETUP | 23 | #ifdef _SETUP |
24 | # include "boot.h" | 24 | # include "boot.h" |
25 | # include "bitops.h" | ||
26 | #endif | 25 | #endif |
27 | #include <linux/types.h> | 26 | #include <linux/types.h> |
28 | #include <asm/cpufeature.h> | ||
29 | #include <asm/processor-flags.h> | 27 | #include <asm/processor-flags.h> |
30 | #include <asm/required-features.h> | 28 | #include <asm/required-features.h> |
31 | #include <asm/msr-index.h> | 29 | #include <asm/msr-index.h> |
32 | 30 | ||
33 | struct cpu_features { | 31 | struct cpu_features cpu; |
34 | int level; /* Family, or 64 for x86-64 */ | ||
35 | int model; | ||
36 | u32 flags[NCAPINTS]; | ||
37 | }; | ||
38 | |||
39 | static struct cpu_features cpu; | ||
40 | static u32 cpu_vendor[3]; | 32 | static u32 cpu_vendor[3]; |
41 | static u32 err_flags[NCAPINTS]; | 33 | static u32 err_flags[NCAPINTS]; |
42 | 34 | ||
diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c index 2296164b54d2..197421db1af1 100644 --- a/arch/x86/boot/main.c +++ b/arch/x86/boot/main.c | |||
@@ -73,6 +73,11 @@ static void keyboard_set_repeat(void) | |||
73 | */ | 73 | */ |
74 | static void query_ist(void) | 74 | static void query_ist(void) |
75 | { | 75 | { |
76 | /* Some older BIOSes apparently crash on this call, so filter | ||
77 | it from machines too old to have SpeedStep at all. */ | ||
78 | if (cpu.level < 6) | ||
79 | return; | ||
80 | |||
76 | asm("int $0x15" | 81 | asm("int $0x15" |
77 | : "=a" (boot_params.ist_info.signature), | 82 | : "=a" (boot_params.ist_info.signature), |
78 | "=b" (boot_params.ist_info.command), | 83 | "=b" (boot_params.ist_info.command), |
diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c index 53165c97336b..8c3c25f35578 100644 --- a/arch/x86/boot/memory.c +++ b/arch/x86/boot/memory.c | |||
@@ -13,7 +13,6 @@ | |||
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include "boot.h" | 15 | #include "boot.h" |
16 | #include <linux/kernel.h> | ||
17 | 16 | ||
18 | #define SMAP 0x534d4150 /* ASCII "SMAP" */ | 17 | #define SMAP 0x534d4150 /* ASCII "SMAP" */ |
19 | 18 | ||
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index fa88a1d71290..bfd10fd211cd 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -97,6 +97,8 @@ static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; | |||
97 | #warning ACPI uses CMPXCHG, i486 and later hardware | 97 | #warning ACPI uses CMPXCHG, i486 and later hardware |
98 | #endif | 98 | #endif |
99 | 99 | ||
100 | static int acpi_mcfg_64bit_base_addr __initdata = FALSE; | ||
101 | |||
100 | /* -------------------------------------------------------------------------- | 102 | /* -------------------------------------------------------------------------- |
101 | Boot-time Configuration | 103 | Boot-time Configuration |
102 | -------------------------------------------------------------------------- */ | 104 | -------------------------------------------------------------------------- */ |
@@ -158,6 +160,14 @@ char *__init __acpi_map_table(unsigned long phys, unsigned long size) | |||
158 | struct acpi_mcfg_allocation *pci_mmcfg_config; | 160 | struct acpi_mcfg_allocation *pci_mmcfg_config; |
159 | int pci_mmcfg_config_num; | 161 | int pci_mmcfg_config_num; |
160 | 162 | ||
163 | static int __init acpi_mcfg_oem_check(struct acpi_table_mcfg *mcfg) | ||
164 | { | ||
165 | if (!strcmp(mcfg->header.oem_id, "SGI")) | ||
166 | acpi_mcfg_64bit_base_addr = TRUE; | ||
167 | |||
168 | return 0; | ||
169 | } | ||
170 | |||
161 | int __init acpi_parse_mcfg(struct acpi_table_header *header) | 171 | int __init acpi_parse_mcfg(struct acpi_table_header *header) |
162 | { | 172 | { |
163 | struct acpi_table_mcfg *mcfg; | 173 | struct acpi_table_mcfg *mcfg; |
@@ -190,8 +200,12 @@ int __init acpi_parse_mcfg(struct acpi_table_header *header) | |||
190 | } | 200 | } |
191 | 201 | ||
192 | memcpy(pci_mmcfg_config, &mcfg[1], config_size); | 202 | memcpy(pci_mmcfg_config, &mcfg[1], config_size); |
203 | |||
204 | acpi_mcfg_oem_check(mcfg); | ||
205 | |||
193 | for (i = 0; i < pci_mmcfg_config_num; ++i) { | 206 | for (i = 0; i < pci_mmcfg_config_num; ++i) { |
194 | if (pci_mmcfg_config[i].address > 0xFFFFFFFF) { | 207 | if ((pci_mmcfg_config[i].address > 0xFFFFFFFF) && |
208 | !acpi_mcfg_64bit_base_addr) { | ||
195 | printk(KERN_ERR PREFIX | 209 | printk(KERN_ERR PREFIX |
196 | "MMCONFIG not in low 4GB of memory\n"); | 210 | "MMCONFIG not in low 4GB of memory\n"); |
197 | kfree(pci_mmcfg_config); | 211 | kfree(pci_mmcfg_config); |
diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c index fa2161d5003b..426e5d91b63a 100644 --- a/arch/x86/kernel/acpi/sleep.c +++ b/arch/x86/kernel/acpi/sleep.c | |||
@@ -20,7 +20,7 @@ unsigned long acpi_realmode_flags; | |||
20 | /* address in low memory of the wakeup routine. */ | 20 | /* address in low memory of the wakeup routine. */ |
21 | static unsigned long acpi_realmode; | 21 | static unsigned long acpi_realmode; |
22 | 22 | ||
23 | #ifdef CONFIG_64BIT | 23 | #if defined(CONFIG_SMP) && defined(CONFIG_64BIT) |
24 | static char temp_stack[10240]; | 24 | static char temp_stack[10240]; |
25 | #endif | 25 | #endif |
26 | 26 | ||
@@ -86,7 +86,7 @@ int acpi_save_state_mem(void) | |||
86 | #endif /* !CONFIG_64BIT */ | 86 | #endif /* !CONFIG_64BIT */ |
87 | 87 | ||
88 | header->pmode_cr0 = read_cr0(); | 88 | header->pmode_cr0 = read_cr0(); |
89 | header->pmode_cr4 = read_cr4(); | 89 | header->pmode_cr4 = read_cr4_safe(); |
90 | header->realmode_flags = acpi_realmode_flags; | 90 | header->realmode_flags = acpi_realmode_flags; |
91 | header->real_magic = 0x12345678; | 91 | header->real_magic = 0x12345678; |
92 | 92 | ||
diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 22d7d050905d..69b4d060b21c 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c | |||
@@ -65,7 +65,7 @@ static int __iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd) | |||
65 | u8 *target; | 65 | u8 *target; |
66 | 66 | ||
67 | tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); | 67 | tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET); |
68 | target = (iommu->cmd_buf + tail); | 68 | target = iommu->cmd_buf + tail; |
69 | memcpy_toio(target, cmd, sizeof(*cmd)); | 69 | memcpy_toio(target, cmd, sizeof(*cmd)); |
70 | tail = (tail + sizeof(*cmd)) % iommu->cmd_buf_size; | 70 | tail = (tail + sizeof(*cmd)) % iommu->cmd_buf_size; |
71 | head = readl(iommu->mmio_base + MMIO_CMD_HEAD_OFFSET); | 71 | head = readl(iommu->mmio_base + MMIO_CMD_HEAD_OFFSET); |
@@ -101,16 +101,13 @@ static int iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd) | |||
101 | */ | 101 | */ |
102 | static int iommu_completion_wait(struct amd_iommu *iommu) | 102 | static int iommu_completion_wait(struct amd_iommu *iommu) |
103 | { | 103 | { |
104 | int ret; | 104 | int ret, ready = 0; |
105 | unsigned status = 0; | ||
105 | struct iommu_cmd cmd; | 106 | struct iommu_cmd cmd; |
106 | volatile u64 ready = 0; | ||
107 | unsigned long ready_phys = virt_to_phys(&ready); | ||
108 | unsigned long i = 0; | 107 | unsigned long i = 0; |
109 | 108 | ||
110 | memset(&cmd, 0, sizeof(cmd)); | 109 | memset(&cmd, 0, sizeof(cmd)); |
111 | cmd.data[0] = LOW_U32(ready_phys) | CMD_COMPL_WAIT_STORE_MASK; | 110 | cmd.data[0] = CMD_COMPL_WAIT_INT_MASK; |
112 | cmd.data[1] = upper_32_bits(ready_phys); | ||
113 | cmd.data[2] = 1; /* value written to 'ready' */ | ||
114 | CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT); | 111 | CMD_SET_TYPE(&cmd, CMD_COMPL_WAIT); |
115 | 112 | ||
116 | iommu->need_sync = 0; | 113 | iommu->need_sync = 0; |
@@ -122,9 +119,15 @@ static int iommu_completion_wait(struct amd_iommu *iommu) | |||
122 | 119 | ||
123 | while (!ready && (i < EXIT_LOOP_COUNT)) { | 120 | while (!ready && (i < EXIT_LOOP_COUNT)) { |
124 | ++i; | 121 | ++i; |
125 | cpu_relax(); | 122 | /* wait for the bit to become one */ |
123 | status = readl(iommu->mmio_base + MMIO_STATUS_OFFSET); | ||
124 | ready = status & MMIO_STATUS_COM_WAIT_INT_MASK; | ||
126 | } | 125 | } |
127 | 126 | ||
127 | /* set bit back to zero */ | ||
128 | status &= ~MMIO_STATUS_COM_WAIT_INT_MASK; | ||
129 | writel(status, iommu->mmio_base + MMIO_STATUS_OFFSET); | ||
130 | |||
128 | if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) | 131 | if (unlikely((i == EXIT_LOOP_COUNT) && printk_ratelimit())) |
129 | printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); | 132 | printk(KERN_WARNING "AMD IOMMU: Completion wait loop failed\n"); |
130 | 133 | ||
@@ -161,7 +164,7 @@ static int iommu_queue_inv_iommu_pages(struct amd_iommu *iommu, | |||
161 | address &= PAGE_MASK; | 164 | address &= PAGE_MASK; |
162 | CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES); | 165 | CMD_SET_TYPE(&cmd, CMD_INV_IOMMU_PAGES); |
163 | cmd.data[1] |= domid; | 166 | cmd.data[1] |= domid; |
164 | cmd.data[2] = LOW_U32(address); | 167 | cmd.data[2] = lower_32_bits(address); |
165 | cmd.data[3] = upper_32_bits(address); | 168 | cmd.data[3] = upper_32_bits(address); |
166 | if (s) /* size bit - we flush more than one 4kb page */ | 169 | if (s) /* size bit - we flush more than one 4kb page */ |
167 | cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK; | 170 | cmd.data[2] |= CMD_INV_IOMMU_PAGES_SIZE_MASK; |
diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index d9a9da597e79..a69cc0f52042 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c | |||
@@ -801,6 +801,21 @@ static int __init init_memory_definitions(struct acpi_table_header *table) | |||
801 | } | 801 | } |
802 | 802 | ||
803 | /* | 803 | /* |
804 | * Init the device table to not allow DMA access for devices and | ||
805 | * suppress all page faults | ||
806 | */ | ||
807 | static void init_device_table(void) | ||
808 | { | ||
809 | u16 devid; | ||
810 | |||
811 | for (devid = 0; devid <= amd_iommu_last_bdf; ++devid) { | ||
812 | set_dev_entry_bit(devid, DEV_ENTRY_VALID); | ||
813 | set_dev_entry_bit(devid, DEV_ENTRY_TRANSLATION); | ||
814 | set_dev_entry_bit(devid, DEV_ENTRY_NO_PAGE_FAULT); | ||
815 | } | ||
816 | } | ||
817 | |||
818 | /* | ||
804 | * This function finally enables all IOMMUs found in the system after | 819 | * This function finally enables all IOMMUs found in the system after |
805 | * they have been initialized | 820 | * they have been initialized |
806 | */ | 821 | */ |
@@ -931,6 +946,9 @@ int __init amd_iommu_init(void) | |||
931 | if (amd_iommu_pd_alloc_bitmap == NULL) | 946 | if (amd_iommu_pd_alloc_bitmap == NULL) |
932 | goto free; | 947 | goto free; |
933 | 948 | ||
949 | /* init the device table */ | ||
950 | init_device_table(); | ||
951 | |||
934 | /* | 952 | /* |
935 | * let all alias entries point to itself | 953 | * let all alias entries point to itself |
936 | */ | 954 | */ |
@@ -954,15 +972,15 @@ int __init amd_iommu_init(void) | |||
954 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) | 972 | if (acpi_table_parse("IVRS", init_memory_definitions) != 0) |
955 | goto free; | 973 | goto free; |
956 | 974 | ||
957 | ret = amd_iommu_init_dma_ops(); | 975 | ret = sysdev_class_register(&amd_iommu_sysdev_class); |
958 | if (ret) | 976 | if (ret) |
959 | goto free; | 977 | goto free; |
960 | 978 | ||
961 | ret = sysdev_class_register(&amd_iommu_sysdev_class); | 979 | ret = sysdev_register(&device_amd_iommu); |
962 | if (ret) | 980 | if (ret) |
963 | goto free; | 981 | goto free; |
964 | 982 | ||
965 | ret = sysdev_register(&device_amd_iommu); | 983 | ret = amd_iommu_init_dma_ops(); |
966 | if (ret) | 984 | if (ret) |
967 | goto free; | 985 | goto free; |
968 | 986 | ||
diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c index 039a8d4aaf62..f88bd0d982b0 100644 --- a/arch/x86/kernel/apic_32.c +++ b/arch/x86/kernel/apic_32.c | |||
@@ -1454,8 +1454,6 @@ void disconnect_bsp_APIC(int virt_wire_setup) | |||
1454 | } | 1454 | } |
1455 | } | 1455 | } |
1456 | 1456 | ||
1457 | unsigned int __cpuinitdata maxcpus = NR_CPUS; | ||
1458 | |||
1459 | void __cpuinit generic_processor_info(int apicid, int version) | 1457 | void __cpuinit generic_processor_info(int apicid, int version) |
1460 | { | 1458 | { |
1461 | int cpu; | 1459 | int cpu; |
@@ -1482,12 +1480,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
1482 | return; | 1480 | return; |
1483 | } | 1481 | } |
1484 | 1482 | ||
1485 | if (num_processors >= maxcpus) { | ||
1486 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | ||
1487 | " Processor ignored.\n", maxcpus); | ||
1488 | return; | ||
1489 | } | ||
1490 | |||
1491 | num_processors++; | 1483 | num_processors++; |
1492 | cpus_complement(tmp_map, cpu_present_map); | 1484 | cpus_complement(tmp_map, cpu_present_map); |
1493 | cpu = first_cpu(tmp_map); | 1485 | cpu = first_cpu(tmp_map); |
diff --git a/arch/x86/kernel/apic_64.c b/arch/x86/kernel/apic_64.c index 7f1f030da7ee..446c062e831c 100644 --- a/arch/x86/kernel/apic_64.c +++ b/arch/x86/kernel/apic_64.c | |||
@@ -90,7 +90,6 @@ static unsigned long apic_phys; | |||
90 | 90 | ||
91 | unsigned long mp_lapic_addr; | 91 | unsigned long mp_lapic_addr; |
92 | 92 | ||
93 | unsigned int __cpuinitdata maxcpus = NR_CPUS; | ||
94 | /* | 93 | /* |
95 | * Get the LAPIC version | 94 | * Get the LAPIC version |
96 | */ | 95 | */ |
@@ -1062,12 +1061,6 @@ void __cpuinit generic_processor_info(int apicid, int version) | |||
1062 | return; | 1061 | return; |
1063 | } | 1062 | } |
1064 | 1063 | ||
1065 | if (num_processors >= maxcpus) { | ||
1066 | printk(KERN_WARNING "WARNING: maxcpus limit of %i reached." | ||
1067 | " Processor ignored.\n", maxcpus); | ||
1068 | return; | ||
1069 | } | ||
1070 | |||
1071 | num_processors++; | 1064 | num_processors++; |
1072 | cpus_complement(tmp_map, cpu_present_map); | 1065 | cpus_complement(tmp_map, cpu_present_map); |
1073 | cpu = first_cpu(tmp_map); | 1066 | cpu = first_cpu(tmp_map); |
diff --git a/arch/x86/kernel/cpu/addon_cpuid_features.c b/arch/x86/kernel/cpu/addon_cpuid_features.c index 84a8220a6072..a6ef672adbba 100644 --- a/arch/x86/kernel/cpu/addon_cpuid_features.c +++ b/arch/x86/kernel/cpu/addon_cpuid_features.c | |||
@@ -56,9 +56,22 @@ void __cpuinit validate_pat_support(struct cpuinfo_x86 *c) | |||
56 | 56 | ||
57 | switch (c->x86_vendor) { | 57 | switch (c->x86_vendor) { |
58 | case X86_VENDOR_INTEL: | 58 | case X86_VENDOR_INTEL: |
59 | if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15)) | 59 | /* |
60 | * There is a known erratum on Pentium III and Core Solo | ||
61 | * and Core Duo CPUs. | ||
62 | * " Page with PAT set to WC while associated MTRR is UC | ||
63 | * may consolidate to UC " | ||
64 | * Because of this erratum, it is better to stick with | ||
65 | * setting WC in MTRR rather than using PAT on these CPUs. | ||
66 | * | ||
67 | * Enable PAT WC only on P4, Core 2 or later CPUs. | ||
68 | */ | ||
69 | if (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 15)) | ||
60 | return; | 70 | return; |
61 | break; | 71 | |
72 | pat_disable("PAT WC disabled due to known CPU erratum."); | ||
73 | return; | ||
74 | |||
62 | case X86_VENDOR_AMD: | 75 | case X86_VENDOR_AMD: |
63 | case X86_VENDOR_CENTAUR: | 76 | case X86_VENDOR_CENTAUR: |
64 | case X86_VENDOR_TRANSMETA: | 77 | case X86_VENDOR_TRANSMETA: |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 4e7271999a74..84bb395038d8 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c | |||
@@ -737,63 +737,44 @@ static int find_psb_table(struct powernow_k8_data *data) | |||
737 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | 737 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI |
738 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) | 738 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) |
739 | { | 739 | { |
740 | if (!data->acpi_data->state_count || (cpu_family == CPU_HW_PSTATE)) | 740 | if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE)) |
741 | return; | 741 | return; |
742 | 742 | ||
743 | data->irt = (data->acpi_data->states[index].control >> IRT_SHIFT) & IRT_MASK; | 743 | data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK; |
744 | data->rvo = (data->acpi_data->states[index].control >> RVO_SHIFT) & RVO_MASK; | 744 | data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK; |
745 | data->exttype = (data->acpi_data->states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; | 745 | data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK; |
746 | data->plllock = (data->acpi_data->states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; | 746 | data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK; |
747 | data->vidmvs = 1 << ((data->acpi_data->states[index].control >> MVS_SHIFT) & MVS_MASK); | 747 | data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK); |
748 | data->vstable = (data->acpi_data->states[index].control >> VST_SHIFT) & VST_MASK; | 748 | data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK; |
749 | } | ||
750 | |||
751 | |||
752 | static struct acpi_processor_performance *acpi_perf_data; | ||
753 | static int preregister_valid; | ||
754 | |||
755 | static int powernow_k8_cpu_preinit_acpi(void) | ||
756 | { | ||
757 | acpi_perf_data = alloc_percpu(struct acpi_processor_performance); | ||
758 | if (!acpi_perf_data) | ||
759 | return -ENODEV; | ||
760 | |||
761 | if (acpi_processor_preregister_performance(acpi_perf_data)) | ||
762 | return -ENODEV; | ||
763 | else | ||
764 | preregister_valid = 1; | ||
765 | return 0; | ||
766 | } | 749 | } |
767 | 750 | ||
768 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | 751 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) |
769 | { | 752 | { |
770 | struct cpufreq_frequency_table *powernow_table; | 753 | struct cpufreq_frequency_table *powernow_table; |
771 | int ret_val; | 754 | int ret_val; |
772 | int cpu = 0; | ||
773 | 755 | ||
774 | data->acpi_data = percpu_ptr(acpi_perf_data, cpu); | 756 | if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) { |
775 | if (acpi_processor_register_performance(data->acpi_data, data->cpu)) { | ||
776 | dprintk("register performance failed: bad ACPI data\n"); | 757 | dprintk("register performance failed: bad ACPI data\n"); |
777 | return -EIO; | 758 | return -EIO; |
778 | } | 759 | } |
779 | 760 | ||
780 | /* verify the data contained in the ACPI structures */ | 761 | /* verify the data contained in the ACPI structures */ |
781 | if (data->acpi_data->state_count <= 1) { | 762 | if (data->acpi_data.state_count <= 1) { |
782 | dprintk("No ACPI P-States\n"); | 763 | dprintk("No ACPI P-States\n"); |
783 | goto err_out; | 764 | goto err_out; |
784 | } | 765 | } |
785 | 766 | ||
786 | if ((data->acpi_data->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || | 767 | if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) || |
787 | (data->acpi_data->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { | 768 | (data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) { |
788 | dprintk("Invalid control/status registers (%x - %x)\n", | 769 | dprintk("Invalid control/status registers (%x - %x)\n", |
789 | data->acpi_data->control_register.space_id, | 770 | data->acpi_data.control_register.space_id, |
790 | data->acpi_data->status_register.space_id); | 771 | data->acpi_data.status_register.space_id); |
791 | goto err_out; | 772 | goto err_out; |
792 | } | 773 | } |
793 | 774 | ||
794 | /* fill in data->powernow_table */ | 775 | /* fill in data->powernow_table */ |
795 | powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) | 776 | powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table) |
796 | * (data->acpi_data->state_count + 1)), GFP_KERNEL); | 777 | * (data->acpi_data.state_count + 1)), GFP_KERNEL); |
797 | if (!powernow_table) { | 778 | if (!powernow_table) { |
798 | dprintk("powernow_table memory alloc failure\n"); | 779 | dprintk("powernow_table memory alloc failure\n"); |
799 | goto err_out; | 780 | goto err_out; |
@@ -806,12 +787,12 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
806 | if (ret_val) | 787 | if (ret_val) |
807 | goto err_out_mem; | 788 | goto err_out_mem; |
808 | 789 | ||
809 | powernow_table[data->acpi_data->state_count].frequency = CPUFREQ_TABLE_END; | 790 | powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END; |
810 | powernow_table[data->acpi_data->state_count].index = 0; | 791 | powernow_table[data->acpi_data.state_count].index = 0; |
811 | data->powernow_table = powernow_table; | 792 | data->powernow_table = powernow_table; |
812 | 793 | ||
813 | /* fill in data */ | 794 | /* fill in data */ |
814 | data->numps = data->acpi_data->state_count; | 795 | data->numps = data->acpi_data.state_count; |
815 | if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu) | 796 | if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu) |
816 | print_basics(data); | 797 | print_basics(data); |
817 | powernow_k8_acpi_pst_values(data, 0); | 798 | powernow_k8_acpi_pst_values(data, 0); |
@@ -819,31 +800,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) | |||
819 | /* notify BIOS that we exist */ | 800 | /* notify BIOS that we exist */ |
820 | acpi_processor_notify_smm(THIS_MODULE); | 801 | acpi_processor_notify_smm(THIS_MODULE); |
821 | 802 | ||
822 | /* determine affinity, from ACPI if available */ | ||
823 | if (preregister_valid) { | ||
824 | if ((data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ALL) || | ||
825 | (data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ANY)) | ||
826 | data->starting_core_affinity = data->acpi_data->shared_cpu_map; | ||
827 | else | ||
828 | data->starting_core_affinity = cpumask_of_cpu(data->cpu); | ||
829 | } else { | ||
830 | /* best guess from family if not */ | ||
831 | if (cpu_family == CPU_HW_PSTATE) | ||
832 | data->starting_core_affinity = cpumask_of_cpu(data->cpu); | ||
833 | else | ||
834 | data->starting_core_affinity = per_cpu(cpu_core_map, data->cpu); | ||
835 | } | ||
836 | |||
837 | return 0; | 803 | return 0; |
838 | 804 | ||
839 | err_out_mem: | 805 | err_out_mem: |
840 | kfree(powernow_table); | 806 | kfree(powernow_table); |
841 | 807 | ||
842 | err_out: | 808 | err_out: |
843 | acpi_processor_unregister_performance(data->acpi_data, data->cpu); | 809 | acpi_processor_unregister_performance(&data->acpi_data, data->cpu); |
844 | 810 | ||
845 | /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ | 811 | /* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */ |
846 | data->acpi_data->state_count = 0; | 812 | data->acpi_data.state_count = 0; |
847 | 813 | ||
848 | return -ENODEV; | 814 | return -ENODEV; |
849 | } | 815 | } |
@@ -855,10 +821,10 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf | |||
855 | rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo); | 821 | rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo); |
856 | data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT; | 822 | data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT; |
857 | 823 | ||
858 | for (i = 0; i < data->acpi_data->state_count; i++) { | 824 | for (i = 0; i < data->acpi_data.state_count; i++) { |
859 | u32 index; | 825 | u32 index; |
860 | 826 | ||
861 | index = data->acpi_data->states[i].control & HW_PSTATE_MASK; | 827 | index = data->acpi_data.states[i].control & HW_PSTATE_MASK; |
862 | if (index > data->max_hw_pstate) { | 828 | if (index > data->max_hw_pstate) { |
863 | printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index); | 829 | printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index); |
864 | printk(KERN_ERR PFX "Please report to BIOS manufacturer\n"); | 830 | printk(KERN_ERR PFX "Please report to BIOS manufacturer\n"); |
@@ -874,7 +840,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf | |||
874 | 840 | ||
875 | powernow_table[i].index = index; | 841 | powernow_table[i].index = index; |
876 | 842 | ||
877 | powernow_table[i].frequency = data->acpi_data->states[i].core_frequency * 1000; | 843 | powernow_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000; |
878 | } | 844 | } |
879 | return 0; | 845 | return 0; |
880 | } | 846 | } |
@@ -883,16 +849,16 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | |||
883 | { | 849 | { |
884 | int i; | 850 | int i; |
885 | int cntlofreq = 0; | 851 | int cntlofreq = 0; |
886 | for (i = 0; i < data->acpi_data->state_count; i++) { | 852 | for (i = 0; i < data->acpi_data.state_count; i++) { |
887 | u32 fid; | 853 | u32 fid; |
888 | u32 vid; | 854 | u32 vid; |
889 | 855 | ||
890 | if (data->exttype) { | 856 | if (data->exttype) { |
891 | fid = data->acpi_data->states[i].status & EXT_FID_MASK; | 857 | fid = data->acpi_data.states[i].status & EXT_FID_MASK; |
892 | vid = (data->acpi_data->states[i].status >> VID_SHIFT) & EXT_VID_MASK; | 858 | vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK; |
893 | } else { | 859 | } else { |
894 | fid = data->acpi_data->states[i].control & FID_MASK; | 860 | fid = data->acpi_data.states[i].control & FID_MASK; |
895 | vid = (data->acpi_data->states[i].control >> VID_SHIFT) & VID_MASK; | 861 | vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK; |
896 | } | 862 | } |
897 | 863 | ||
898 | dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); | 864 | dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid); |
@@ -933,10 +899,10 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | |||
933 | cntlofreq = i; | 899 | cntlofreq = i; |
934 | } | 900 | } |
935 | 901 | ||
936 | if (powernow_table[i].frequency != (data->acpi_data->states[i].core_frequency * 1000)) { | 902 | if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) { |
937 | printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", | 903 | printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n", |
938 | powernow_table[i].frequency, | 904 | powernow_table[i].frequency, |
939 | (unsigned int) (data->acpi_data->states[i].core_frequency * 1000)); | 905 | (unsigned int) (data->acpi_data.states[i].core_frequency * 1000)); |
940 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; | 906 | powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID; |
941 | continue; | 907 | continue; |
942 | } | 908 | } |
@@ -946,12 +912,11 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf | |||
946 | 912 | ||
947 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) | 913 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) |
948 | { | 914 | { |
949 | if (data->acpi_data->state_count) | 915 | if (data->acpi_data.state_count) |
950 | acpi_processor_unregister_performance(data->acpi_data, data->cpu); | 916 | acpi_processor_unregister_performance(&data->acpi_data, data->cpu); |
951 | } | 917 | } |
952 | 918 | ||
953 | #else | 919 | #else |
954 | static int powernow_k8_cpu_preinit_acpi(void) { return -ENODEV; } | ||
955 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } | 920 | static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; } |
956 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } | 921 | static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; } |
957 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } | 922 | static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; } |
@@ -1136,7 +1101,7 @@ static int powernowk8_verify(struct cpufreq_policy *pol) | |||
1136 | static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | 1101 | static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) |
1137 | { | 1102 | { |
1138 | struct powernow_k8_data *data; | 1103 | struct powernow_k8_data *data; |
1139 | cpumask_t oldmask = CPU_MASK_ALL; | 1104 | cpumask_t oldmask; |
1140 | int rc; | 1105 | int rc; |
1141 | 1106 | ||
1142 | if (!cpu_online(pol->cpu)) | 1107 | if (!cpu_online(pol->cpu)) |
@@ -1209,7 +1174,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol) | |||
1209 | /* run on any CPU again */ | 1174 | /* run on any CPU again */ |
1210 | set_cpus_allowed_ptr(current, &oldmask); | 1175 | set_cpus_allowed_ptr(current, &oldmask); |
1211 | 1176 | ||
1212 | pol->cpus = data->starting_core_affinity; | 1177 | if (cpu_family == CPU_HW_PSTATE) |
1178 | pol->cpus = cpumask_of_cpu(pol->cpu); | ||
1179 | else | ||
1180 | pol->cpus = per_cpu(cpu_core_map, pol->cpu); | ||
1213 | data->available_cores = &(pol->cpus); | 1181 | data->available_cores = &(pol->cpus); |
1214 | 1182 | ||
1215 | /* Take a crude guess here. | 1183 | /* Take a crude guess here. |
@@ -1332,7 +1300,6 @@ static int __cpuinit powernowk8_init(void) | |||
1332 | } | 1300 | } |
1333 | 1301 | ||
1334 | if (supported_cpus == num_online_cpus()) { | 1302 | if (supported_cpus == num_online_cpus()) { |
1335 | powernow_k8_cpu_preinit_acpi(); | ||
1336 | printk(KERN_INFO PFX "Found %d %s " | 1303 | printk(KERN_INFO PFX "Found %d %s " |
1337 | "processors (%d cpu cores) (" VERSION ")\n", | 1304 | "processors (%d cpu cores) (" VERSION ")\n", |
1338 | num_online_nodes(), | 1305 | num_online_nodes(), |
@@ -1349,10 +1316,6 @@ static void __exit powernowk8_exit(void) | |||
1349 | dprintk("exit\n"); | 1316 | dprintk("exit\n"); |
1350 | 1317 | ||
1351 | cpufreq_unregister_driver(&cpufreq_amd64_driver); | 1318 | cpufreq_unregister_driver(&cpufreq_amd64_driver); |
1352 | |||
1353 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | ||
1354 | free_percpu(acpi_perf_data); | ||
1355 | #endif | ||
1356 | } | 1319 | } |
1357 | 1320 | ||
1358 | MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>"); | 1321 | MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>"); |
diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h index a62612cd4be8..ab48cfed4d96 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h | |||
@@ -33,13 +33,12 @@ struct powernow_k8_data { | |||
33 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI | 33 | #ifdef CONFIG_X86_POWERNOW_K8_ACPI |
34 | /* the acpi table needs to be kept. it's only available if ACPI was | 34 | /* the acpi table needs to be kept. it's only available if ACPI was |
35 | * used to determine valid frequency/vid/fid states */ | 35 | * used to determine valid frequency/vid/fid states */ |
36 | struct acpi_processor_performance *acpi_data; | 36 | struct acpi_processor_performance acpi_data; |
37 | #endif | 37 | #endif |
38 | /* we need to keep track of associated cores, but let cpufreq | 38 | /* we need to keep track of associated cores, but let cpufreq |
39 | * handle hotplug events - so just point at cpufreq pol->cpus | 39 | * handle hotplug events - so just point at cpufreq pol->cpus |
40 | * structure */ | 40 | * structure */ |
41 | cpumask_t *available_cores; | 41 | cpumask_t *available_cores; |
42 | cpumask_t starting_core_affinity; | ||
43 | }; | 42 | }; |
44 | 43 | ||
45 | 44 | ||
diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c index 3fd7a67bb06a..e710a21bb6e8 100644 --- a/arch/x86/kernel/cpu/cyrix.c +++ b/arch/x86/kernel/cpu/cyrix.c | |||
@@ -134,23 +134,6 @@ static void __cpuinit set_cx86_memwb(void) | |||
134 | setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14); | 134 | setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14); |
135 | } | 135 | } |
136 | 136 | ||
137 | static void __cpuinit set_cx86_inc(void) | ||
138 | { | ||
139 | unsigned char ccr3; | ||
140 | |||
141 | printk(KERN_INFO "Enable Incrementor on Cyrix/NSC processor.\n"); | ||
142 | |||
143 | ccr3 = getCx86(CX86_CCR3); | ||
144 | setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */ | ||
145 | /* PCR1 -- Performance Control */ | ||
146 | /* Incrementor on, whatever that is */ | ||
147 | setCx86(CX86_PCR1, getCx86(CX86_PCR1) | 0x02); | ||
148 | /* PCR0 -- Performance Control */ | ||
149 | /* Incrementor Margin 10 */ | ||
150 | setCx86(CX86_PCR0, getCx86(CX86_PCR0) | 0x04); | ||
151 | setCx86(CX86_CCR3, ccr3); /* disable MAPEN */ | ||
152 | } | ||
153 | |||
154 | /* | 137 | /* |
155 | * Configure later MediaGX and/or Geode processor. | 138 | * Configure later MediaGX and/or Geode processor. |
156 | */ | 139 | */ |
@@ -174,7 +157,6 @@ static void __cpuinit geode_configure(void) | |||
174 | 157 | ||
175 | set_cx86_memwb(); | 158 | set_cx86_memwb(); |
176 | set_cx86_reorder(); | 159 | set_cx86_reorder(); |
177 | set_cx86_inc(); | ||
178 | 160 | ||
179 | local_irq_restore(flags); | 161 | local_irq_restore(flags); |
180 | } | 162 | } |
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index 509bd3d9eacd..cb7d3b6a80eb 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c | |||
@@ -379,6 +379,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, | |||
379 | unsigned long *size, mtrr_type *type) | 379 | unsigned long *size, mtrr_type *type) |
380 | { | 380 | { |
381 | unsigned int mask_lo, mask_hi, base_lo, base_hi; | 381 | unsigned int mask_lo, mask_hi, base_lo, base_hi; |
382 | unsigned int tmp, hi; | ||
382 | 383 | ||
383 | rdmsr(MTRRphysMask_MSR(reg), mask_lo, mask_hi); | 384 | rdmsr(MTRRphysMask_MSR(reg), mask_lo, mask_hi); |
384 | if ((mask_lo & 0x800) == 0) { | 385 | if ((mask_lo & 0x800) == 0) { |
@@ -392,8 +393,23 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base, | |||
392 | rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi); | 393 | rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi); |
393 | 394 | ||
394 | /* Work out the shifted address mask. */ | 395 | /* Work out the shifted address mask. */ |
395 | mask_lo = size_or_mask | mask_hi << (32 - PAGE_SHIFT) | 396 | tmp = mask_hi << (32 - PAGE_SHIFT) | mask_lo >> PAGE_SHIFT; |
396 | | mask_lo >> PAGE_SHIFT; | 397 | mask_lo = size_or_mask | tmp; |
398 | /* Expand tmp with high bits to all 1s*/ | ||
399 | hi = fls(tmp); | ||
400 | if (hi > 0) { | ||
401 | tmp |= ~((1<<(hi - 1)) - 1); | ||
402 | |||
403 | if (tmp != mask_lo) { | ||
404 | static int once = 1; | ||
405 | |||
406 | if (once) { | ||
407 | printk(KERN_INFO "mtrr: your BIOS has set up an incorrect mask, fixing it up.\n"); | ||
408 | once = 0; | ||
409 | } | ||
410 | mask_lo = tmp; | ||
411 | } | ||
412 | } | ||
397 | 413 | ||
398 | /* This works correctly if size is a power of two, i.e. a | 414 | /* This works correctly if size is a power of two, i.e. a |
399 | contiguous range. */ | 415 | contiguous range. */ |
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index 6f23969c8faf..b117d7f8a564 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
@@ -1496,11 +1496,8 @@ int __init mtrr_trim_uncached_memory(unsigned long end_pfn) | |||
1496 | 1496 | ||
1497 | /* kvm/qemu doesn't have mtrr set right, don't trim them all */ | 1497 | /* kvm/qemu doesn't have mtrr set right, don't trim them all */ |
1498 | if (!highest_pfn) { | 1498 | if (!highest_pfn) { |
1499 | if (!kvm_para_available()) { | 1499 | WARN(!kvm_para_available(), KERN_WARNING |
1500 | printk(KERN_WARNING | ||
1501 | "WARNING: strange, CPU MTRRs all blank?\n"); | 1500 | "WARNING: strange, CPU MTRRs all blank?\n"); |
1502 | WARN_ON(1); | ||
1503 | } | ||
1504 | return 0; | 1501 | return 0; |
1505 | } | 1502 | } |
1506 | 1503 | ||
diff --git a/arch/x86/kernel/cpu/perfctr-watchdog.c b/arch/x86/kernel/cpu/perfctr-watchdog.c index de7439f82b92..05cc22dbd4ff 100644 --- a/arch/x86/kernel/cpu/perfctr-watchdog.c +++ b/arch/x86/kernel/cpu/perfctr-watchdog.c | |||
@@ -478,7 +478,13 @@ static int setup_p4_watchdog(unsigned nmi_hz) | |||
478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; | 478 | perfctr_msr = MSR_P4_IQ_PERFCTR1; |
479 | evntsel_msr = MSR_P4_CRU_ESCR0; | 479 | evntsel_msr = MSR_P4_CRU_ESCR0; |
480 | cccr_msr = MSR_P4_IQ_CCCR1; | 480 | cccr_msr = MSR_P4_IQ_CCCR1; |
481 | cccr_val = P4_CCCR_OVF_PMI1 | P4_CCCR_ESCR_SELECT(4); | 481 | |
482 | /* Pentium 4 D processors don't support P4_CCCR_OVF_PMI1 */ | ||
483 | if (boot_cpu_data.x86_model == 4 && boot_cpu_data.x86_mask == 4) | ||
484 | cccr_val = P4_CCCR_OVF_PMI0; | ||
485 | else | ||
486 | cccr_val = P4_CCCR_OVF_PMI1; | ||
487 | cccr_val |= P4_CCCR_ESCR_SELECT(4); | ||
482 | } | 488 | } |
483 | 489 | ||
484 | evntsel = P4_ESCR_EVENT_SELECT(0x3F) | 490 | evntsel = P4_ESCR_EVENT_SELECT(0x3F) |
diff --git a/arch/x86/kernel/efi_32.c b/arch/x86/kernel/efi_32.c index 4b63c8e1f13b..5cab48ee61a4 100644 --- a/arch/x86/kernel/efi_32.c +++ b/arch/x86/kernel/efi_32.c | |||
@@ -53,7 +53,7 @@ void efi_call_phys_prelog(void) | |||
53 | * directory. If I have PAE, I just need to duplicate one entry in | 53 | * directory. If I have PAE, I just need to duplicate one entry in |
54 | * page directory. | 54 | * page directory. |
55 | */ | 55 | */ |
56 | cr4 = read_cr4(); | 56 | cr4 = read_cr4_safe(); |
57 | 57 | ||
58 | if (cr4 & X86_CR4_PAE) { | 58 | if (cr4 & X86_CR4_PAE) { |
59 | efi_bak_pg_dir_pointer[0].pgd = | 59 | efi_bak_pg_dir_pointer[0].pgd = |
@@ -91,7 +91,7 @@ void efi_call_phys_epilog(void) | |||
91 | gdt_descr.size = GDT_SIZE - 1; | 91 | gdt_descr.size = GDT_SIZE - 1; |
92 | load_gdt(&gdt_descr); | 92 | load_gdt(&gdt_descr); |
93 | 93 | ||
94 | cr4 = read_cr4(); | 94 | cr4 = read_cr4_safe(); |
95 | 95 | ||
96 | if (cr4 & X86_CR4_PAE) { | 96 | if (cr4 & X86_CR4_PAE) { |
97 | swapper_pg_dir[pgd_index(0)].pgd = | 97 | swapper_pg_dir[pgd_index(0)].pgd = |
diff --git a/arch/x86/kernel/genx2apic_uv_x.c b/arch/x86/kernel/genx2apic_uv_x.c index 2cfcbded888a..bfa837cb16be 100644 --- a/arch/x86/kernel/genx2apic_uv_x.c +++ b/arch/x86/kernel/genx2apic_uv_x.c | |||
@@ -222,7 +222,7 @@ static __init void map_low_mmrs(void) | |||
222 | 222 | ||
223 | enum map_type {map_wb, map_uc}; | 223 | enum map_type {map_wb, map_uc}; |
224 | 224 | ||
225 | static void map_high(char *id, unsigned long base, int shift, enum map_type map_type) | 225 | static __init void map_high(char *id, unsigned long base, int shift, enum map_type map_type) |
226 | { | 226 | { |
227 | unsigned long bytes, paddr; | 227 | unsigned long bytes, paddr; |
228 | 228 | ||
@@ -293,7 +293,9 @@ static __init void uv_rtc_init(void) | |||
293 | sn_rtc_cycles_per_second = ticks_per_sec; | 293 | sn_rtc_cycles_per_second = ticks_per_sec; |
294 | } | 294 | } |
295 | 295 | ||
296 | static __init void uv_system_init(void) | 296 | static bool uv_system_inited; |
297 | |||
298 | void __init uv_system_init(void) | ||
297 | { | 299 | { |
298 | union uvh_si_addr_map_config_u m_n_config; | 300 | union uvh_si_addr_map_config_u m_n_config; |
299 | union uvh_node_id_u node_id; | 301 | union uvh_node_id_u node_id; |
@@ -383,6 +385,7 @@ static __init void uv_system_init(void) | |||
383 | map_mmr_high(max_pnode); | 385 | map_mmr_high(max_pnode); |
384 | map_config_high(max_pnode); | 386 | map_config_high(max_pnode); |
385 | map_mmioh_high(max_pnode); | 387 | map_mmioh_high(max_pnode); |
388 | uv_system_inited = true; | ||
386 | } | 389 | } |
387 | 390 | ||
388 | /* | 391 | /* |
@@ -391,8 +394,7 @@ static __init void uv_system_init(void) | |||
391 | */ | 394 | */ |
392 | void __cpuinit uv_cpu_init(void) | 395 | void __cpuinit uv_cpu_init(void) |
393 | { | 396 | { |
394 | if (!uv_node_to_blade) | 397 | BUG_ON(!uv_system_inited); |
395 | uv_system_init(); | ||
396 | 398 | ||
397 | uv_blade_info[uv_numa_blade_id()].nr_online_cpus++; | 399 | uv_blade_info[uv_numa_blade_id()].nr_online_cpus++; |
398 | 400 | ||
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c index 1b318e903bf6..9bfc4d72fb2e 100644 --- a/arch/x86/kernel/head64.c +++ b/arch/x86/kernel/head64.c | |||
@@ -88,6 +88,7 @@ void __init x86_64_start_kernel(char * real_mode_data) | |||
88 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); | 88 | BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL)); |
89 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == | 89 | BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == |
90 | (__START_KERNEL & PGDIR_MASK))); | 90 | (__START_KERNEL & PGDIR_MASK))); |
91 | BUILD_BUG_ON(__fix_to_virt(__end_of_fixed_addresses) <= MODULES_END); | ||
91 | 92 | ||
92 | /* clear bss before set_intr_gate with early_idt_handler */ | 93 | /* clear bss before set_intr_gate with early_idt_handler */ |
93 | clear_bss(); | 94 | clear_bss(); |
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c index ad2b15a1334d..59fd3b6b1303 100644 --- a/arch/x86/kernel/hpet.c +++ b/arch/x86/kernel/hpet.c | |||
@@ -359,6 +359,7 @@ static int hpet_clocksource_register(void) | |||
359 | int __init hpet_enable(void) | 359 | int __init hpet_enable(void) |
360 | { | 360 | { |
361 | unsigned long id; | 361 | unsigned long id; |
362 | int i; | ||
362 | 363 | ||
363 | if (!is_hpet_capable()) | 364 | if (!is_hpet_capable()) |
364 | return 0; | 365 | return 0; |
@@ -369,6 +370,29 @@ int __init hpet_enable(void) | |||
369 | * Read the period and check for a sane value: | 370 | * Read the period and check for a sane value: |
370 | */ | 371 | */ |
371 | hpet_period = hpet_readl(HPET_PERIOD); | 372 | hpet_period = hpet_readl(HPET_PERIOD); |
373 | |||
374 | /* | ||
375 | * AMD SB700 based systems with spread spectrum enabled use a | ||
376 | * SMM based HPET emulation to provide proper frequency | ||
377 | * setting. The SMM code is initialized with the first HPET | ||
378 | * register access and takes some time to complete. During | ||
379 | * this time the config register reads 0xffffffff. We check | ||
380 | * for max. 1000 loops whether the config register reads a non | ||
381 | * 0xffffffff value to make sure that HPET is up and running | ||
382 | * before we go further. A counting loop is safe, as the HPET | ||
383 | * access takes thousands of CPU cycles. On non SB700 based | ||
384 | * machines this check is only done once and has no side | ||
385 | * effects. | ||
386 | */ | ||
387 | for (i = 0; hpet_readl(HPET_CFG) == 0xFFFFFFFF; i++) { | ||
388 | if (i == 1000) { | ||
389 | printk(KERN_WARNING | ||
390 | "HPET config register value = 0xFFFFFFFF. " | ||
391 | "Disabling HPET\n"); | ||
392 | goto out_nohpet; | ||
393 | } | ||
394 | } | ||
395 | |||
372 | if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD) | 396 | if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD) |
373 | goto out_nohpet; | 397 | goto out_nohpet; |
374 | 398 | ||
diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c index 9fe478d98406..0732adba05ca 100644 --- a/arch/x86/kernel/machine_kexec_32.c +++ b/arch/x86/kernel/machine_kexec_32.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/numa.h> | 13 | #include <linux/numa.h> |
14 | #include <linux/ftrace.h> | 14 | #include <linux/ftrace.h> |
15 | #include <linux/suspend.h> | ||
15 | 16 | ||
16 | #include <asm/pgtable.h> | 17 | #include <asm/pgtable.h> |
17 | #include <asm/pgalloc.h> | 18 | #include <asm/pgalloc.h> |
@@ -78,7 +79,7 @@ static void load_segments(void) | |||
78 | /* | 79 | /* |
79 | * A architecture hook called to validate the | 80 | * A architecture hook called to validate the |
80 | * proposed image and prepare the control pages | 81 | * proposed image and prepare the control pages |
81 | * as needed. The pages for KEXEC_CONTROL_CODE_SIZE | 82 | * as needed. The pages for KEXEC_CONTROL_PAGE_SIZE |
82 | * have been allocated, but the segments have yet | 83 | * have been allocated, but the segments have yet |
83 | * been copied into the kernel. | 84 | * been copied into the kernel. |
84 | * | 85 | * |
@@ -113,6 +114,7 @@ void machine_kexec(struct kimage *image) | |||
113 | { | 114 | { |
114 | unsigned long page_list[PAGES_NR]; | 115 | unsigned long page_list[PAGES_NR]; |
115 | void *control_page; | 116 | void *control_page; |
117 | int save_ftrace_enabled; | ||
116 | asmlinkage unsigned long | 118 | asmlinkage unsigned long |
117 | (*relocate_kernel_ptr)(unsigned long indirection_page, | 119 | (*relocate_kernel_ptr)(unsigned long indirection_page, |
118 | unsigned long control_page, | 120 | unsigned long control_page, |
@@ -120,7 +122,12 @@ void machine_kexec(struct kimage *image) | |||
120 | unsigned int has_pae, | 122 | unsigned int has_pae, |
121 | unsigned int preserve_context); | 123 | unsigned int preserve_context); |
122 | 124 | ||
123 | tracer_disable(); | 125 | #ifdef CONFIG_KEXEC_JUMP |
126 | if (kexec_image->preserve_context) | ||
127 | save_processor_state(); | ||
128 | #endif | ||
129 | |||
130 | save_ftrace_enabled = __ftrace_enabled_save(); | ||
124 | 131 | ||
125 | /* Interrupts aren't acceptable while we reboot */ | 132 | /* Interrupts aren't acceptable while we reboot */ |
126 | local_irq_disable(); | 133 | local_irq_disable(); |
@@ -138,7 +145,7 @@ void machine_kexec(struct kimage *image) | |||
138 | } | 145 | } |
139 | 146 | ||
140 | control_page = page_address(image->control_code_page); | 147 | control_page = page_address(image->control_code_page); |
141 | memcpy(control_page, relocate_kernel, PAGE_SIZE/2); | 148 | memcpy(control_page, relocate_kernel, KEXEC_CONTROL_CODE_MAX_SIZE); |
142 | 149 | ||
143 | relocate_kernel_ptr = control_page; | 150 | relocate_kernel_ptr = control_page; |
144 | page_list[PA_CONTROL_PAGE] = __pa(control_page); | 151 | page_list[PA_CONTROL_PAGE] = __pa(control_page); |
@@ -178,6 +185,13 @@ void machine_kexec(struct kimage *image) | |||
178 | (unsigned long)page_list, | 185 | (unsigned long)page_list, |
179 | image->start, cpu_has_pae, | 186 | image->start, cpu_has_pae, |
180 | image->preserve_context); | 187 | image->preserve_context); |
188 | |||
189 | #ifdef CONFIG_KEXEC_JUMP | ||
190 | if (kexec_image->preserve_context) | ||
191 | restore_processor_state(); | ||
192 | #endif | ||
193 | |||
194 | __ftrace_enabled_restore(save_ftrace_enabled); | ||
181 | } | 195 | } |
182 | 196 | ||
183 | void arch_crash_save_vmcoreinfo(void) | 197 | void arch_crash_save_vmcoreinfo(void) |
diff --git a/arch/x86/kernel/mfgpt_32.c b/arch/x86/kernel/mfgpt_32.c index 07c0f828f488..3b599518c322 100644 --- a/arch/x86/kernel/mfgpt_32.c +++ b/arch/x86/kernel/mfgpt_32.c | |||
@@ -33,6 +33,8 @@ | |||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <asm/geode.h> | 34 | #include <asm/geode.h> |
35 | 35 | ||
36 | #define MFGPT_DEFAULT_IRQ 7 | ||
37 | |||
36 | static struct mfgpt_timer_t { | 38 | static struct mfgpt_timer_t { |
37 | unsigned int avail:1; | 39 | unsigned int avail:1; |
38 | } mfgpt_timers[MFGPT_MAX_TIMERS]; | 40 | } mfgpt_timers[MFGPT_MAX_TIMERS]; |
@@ -157,29 +159,48 @@ int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable) | |||
157 | } | 159 | } |
158 | EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event); | 160 | EXPORT_SYMBOL_GPL(geode_mfgpt_toggle_event); |
159 | 161 | ||
160 | int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable) | 162 | int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable) |
161 | { | 163 | { |
162 | u32 val, dummy; | 164 | u32 zsel, lpc, dummy; |
163 | int offset; | 165 | int shift; |
164 | 166 | ||
165 | if (timer < 0 || timer >= MFGPT_MAX_TIMERS) | 167 | if (timer < 0 || timer >= MFGPT_MAX_TIMERS) |
166 | return -EIO; | 168 | return -EIO; |
167 | 169 | ||
168 | if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable)) | 170 | /* |
171 | * Unfortunately, MFGPTs come in pairs sharing their IRQ lines. If VSA | ||
172 | * is using the same CMP of the timer's Siamese twin, the IRQ is set to | ||
173 | * 2, and we mustn't use nor change it. | ||
174 | * XXX: Likewise, 2 Linux drivers might clash if the 2nd overwrites the | ||
175 | * IRQ of the 1st. This can only happen if forcing an IRQ, calling this | ||
176 | * with *irq==0 is safe. Currently there _are_ no 2 drivers. | ||
177 | */ | ||
178 | rdmsr(MSR_PIC_ZSEL_LOW, zsel, dummy); | ||
179 | shift = ((cmp == MFGPT_CMP1 ? 0 : 4) + timer % 4) * 4; | ||
180 | if (((zsel >> shift) & 0xF) == 2) | ||
169 | return -EIO; | 181 | return -EIO; |
170 | 182 | ||
171 | rdmsr(MSR_PIC_ZSEL_LOW, val, dummy); | 183 | /* Choose IRQ: if none supplied, keep IRQ already set or use default */ |
184 | if (!*irq) | ||
185 | *irq = (zsel >> shift) & 0xF; | ||
186 | if (!*irq) | ||
187 | *irq = MFGPT_DEFAULT_IRQ; | ||
172 | 188 | ||
173 | offset = (timer % 4) * 4; | 189 | /* Can't use IRQ if it's 0 (=disabled), 2, or routed to LPC */ |
174 | 190 | if (*irq < 1 || *irq == 2 || *irq > 15) | |
175 | val &= ~((0xF << offset) | (0xF << (offset + 16))); | 191 | return -EIO; |
192 | rdmsr(MSR_PIC_IRQM_LPC, lpc, dummy); | ||
193 | if (lpc & (1 << *irq)) | ||
194 | return -EIO; | ||
176 | 195 | ||
196 | /* All chosen and checked - go for it */ | ||
197 | if (geode_mfgpt_toggle_event(timer, cmp, MFGPT_EVENT_IRQ, enable)) | ||
198 | return -EIO; | ||
177 | if (enable) { | 199 | if (enable) { |
178 | val |= (irq & 0x0F) << (offset); | 200 | zsel = (zsel & ~(0xF << shift)) | (*irq << shift); |
179 | val |= (irq & 0x0F) << (offset + 16); | 201 | wrmsr(MSR_PIC_ZSEL_LOW, zsel, dummy); |
180 | } | 202 | } |
181 | 203 | ||
182 | wrmsr(MSR_PIC_ZSEL_LOW, val, dummy); | ||
183 | return 0; | 204 | return 0; |
184 | } | 205 | } |
185 | 206 | ||
@@ -242,7 +263,7 @@ EXPORT_SYMBOL_GPL(geode_mfgpt_alloc_timer); | |||
242 | static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN; | 263 | static unsigned int mfgpt_tick_mode = CLOCK_EVT_MODE_SHUTDOWN; |
243 | static u16 mfgpt_event_clock; | 264 | static u16 mfgpt_event_clock; |
244 | 265 | ||
245 | static int irq = 7; | 266 | static int irq; |
246 | static int __init mfgpt_setup(char *str) | 267 | static int __init mfgpt_setup(char *str) |
247 | { | 268 | { |
248 | get_option(&str, &irq); | 269 | get_option(&str, &irq); |
@@ -346,7 +367,7 @@ int __init mfgpt_timer_setup(void) | |||
346 | mfgpt_event_clock = timer; | 367 | mfgpt_event_clock = timer; |
347 | 368 | ||
348 | /* Set up the IRQ on the MFGPT side */ | 369 | /* Set up the IRQ on the MFGPT side */ |
349 | if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, irq)) { | 370 | if (geode_mfgpt_setup_irq(mfgpt_event_clock, MFGPT_CMP2, &irq)) { |
350 | printk(KERN_ERR "mfgpt-timer: Could not set up IRQ %d\n", irq); | 371 | printk(KERN_ERR "mfgpt-timer: Could not set up IRQ %d\n", irq); |
351 | return -EIO; | 372 | return -EIO; |
352 | } | 373 | } |
@@ -374,13 +395,14 @@ int __init mfgpt_timer_setup(void) | |||
374 | &mfgpt_clockevent); | 395 | &mfgpt_clockevent); |
375 | 396 | ||
376 | printk(KERN_INFO | 397 | printk(KERN_INFO |
377 | "mfgpt-timer: registering the MFGPT timer as a clock event.\n"); | 398 | "mfgpt-timer: Registering MFGPT timer %d as a clock event, using IRQ %d\n", |
399 | timer, irq); | ||
378 | clockevents_register_device(&mfgpt_clockevent); | 400 | clockevents_register_device(&mfgpt_clockevent); |
379 | 401 | ||
380 | return 0; | 402 | return 0; |
381 | 403 | ||
382 | err: | 404 | err: |
383 | geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, irq); | 405 | geode_mfgpt_release_irq(mfgpt_event_clock, MFGPT_CMP2, &irq); |
384 | printk(KERN_ERR | 406 | printk(KERN_ERR |
385 | "mfgpt-timer: Unable to set up the MFGPT clock source\n"); | 407 | "mfgpt-timer: Unable to set up the MFGPT clock source\n"); |
386 | return -EIO; | 408 | return -EIO; |
diff --git a/arch/x86/kernel/mmconf-fam10h_64.c b/arch/x86/kernel/mmconf-fam10h_64.c index fdfdc550b366..efc2f361fe85 100644 --- a/arch/x86/kernel/mmconf-fam10h_64.c +++ b/arch/x86/kernel/mmconf-fam10h_64.c | |||
@@ -238,7 +238,7 @@ static struct dmi_system_id __devinitdata mmconf_dmi_table[] = { | |||
238 | {} | 238 | {} |
239 | }; | 239 | }; |
240 | 240 | ||
241 | void __init check_enable_amd_mmconf_dmi(void) | 241 | void __cpuinit check_enable_amd_mmconf_dmi(void) |
242 | { | 242 | { |
243 | dmi_check_system(mmconf_dmi_table); | 243 | dmi_check_system(mmconf_dmi_table); |
244 | } | 244 | } |
diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c index 678090508a62..b3fb430725cb 100644 --- a/arch/x86/kernel/mpparse.c +++ b/arch/x86/kernel/mpparse.c | |||
@@ -49,7 +49,7 @@ static int __init mpf_checksum(unsigned char *mp, int len) | |||
49 | return sum & 0xFF; | 49 | return sum & 0xFF; |
50 | } | 50 | } |
51 | 51 | ||
52 | static void __cpuinit MP_processor_info(struct mpc_config_processor *m) | 52 | static void __init MP_processor_info(struct mpc_config_processor *m) |
53 | { | 53 | { |
54 | int apicid; | 54 | int apicid; |
55 | char *bootup_cpu = ""; | 55 | char *bootup_cpu = ""; |
@@ -484,7 +484,7 @@ static void __init construct_default_ioirq_mptable(int mpc_default_type) | |||
484 | } | 484 | } |
485 | 485 | ||
486 | 486 | ||
487 | static void construct_ioapic_table(int mpc_default_type) | 487 | static void __init construct_ioapic_table(int mpc_default_type) |
488 | { | 488 | { |
489 | struct mpc_config_ioapic ioapic; | 489 | struct mpc_config_ioapic ioapic; |
490 | struct mpc_config_bus bus; | 490 | struct mpc_config_bus bus; |
@@ -529,7 +529,7 @@ static void construct_ioapic_table(int mpc_default_type) | |||
529 | construct_default_ioirq_mptable(mpc_default_type); | 529 | construct_default_ioirq_mptable(mpc_default_type); |
530 | } | 530 | } |
531 | #else | 531 | #else |
532 | static inline void construct_ioapic_table(int mpc_default_type) { } | 532 | static inline void __init construct_ioapic_table(int mpc_default_type) { } |
533 | #endif | 533 | #endif |
534 | 534 | ||
535 | static inline void __init construct_default_ISA_mptable(int mpc_default_type) | 535 | static inline void __init construct_default_ISA_mptable(int mpc_default_type) |
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 9fd809552447..e43938086885 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -131,7 +131,7 @@ static int msr_open(struct inode *inode, struct file *file) | |||
131 | ret = -EIO; /* MSR not supported */ | 131 | ret = -EIO; /* MSR not supported */ |
132 | out: | 132 | out: |
133 | unlock_kernel(); | 133 | unlock_kernel(); |
134 | return 0; | 134 | return ret; |
135 | } | 135 | } |
136 | 136 | ||
137 | /* | 137 | /* |
diff --git a/arch/x86/kernel/nmi.c b/arch/x86/kernel/nmi.c index ac6d51222e7d..abb78a2cc4ad 100644 --- a/arch/x86/kernel/nmi.c +++ b/arch/x86/kernel/nmi.c | |||
@@ -114,6 +114,23 @@ static __init void nmi_cpu_busy(void *data) | |||
114 | } | 114 | } |
115 | #endif | 115 | #endif |
116 | 116 | ||
117 | static void report_broken_nmi(int cpu, int *prev_nmi_count) | ||
118 | { | ||
119 | printk(KERN_CONT "\n"); | ||
120 | |||
121 | printk(KERN_WARNING | ||
122 | "WARNING: CPU#%d: NMI appears to be stuck (%d->%d)!\n", | ||
123 | cpu, prev_nmi_count[cpu], get_nmi_count(cpu)); | ||
124 | |||
125 | printk(KERN_WARNING | ||
126 | "Please report this to bugzilla.kernel.org,\n"); | ||
127 | printk(KERN_WARNING | ||
128 | "and attach the output of the 'dmesg' command.\n"); | ||
129 | |||
130 | per_cpu(wd_enabled, cpu) = 0; | ||
131 | atomic_dec(&nmi_active); | ||
132 | } | ||
133 | |||
117 | int __init check_nmi_watchdog(void) | 134 | int __init check_nmi_watchdog(void) |
118 | { | 135 | { |
119 | unsigned int *prev_nmi_count; | 136 | unsigned int *prev_nmi_count; |
@@ -141,15 +158,8 @@ int __init check_nmi_watchdog(void) | |||
141 | for_each_online_cpu(cpu) { | 158 | for_each_online_cpu(cpu) { |
142 | if (!per_cpu(wd_enabled, cpu)) | 159 | if (!per_cpu(wd_enabled, cpu)) |
143 | continue; | 160 | continue; |
144 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) { | 161 | if (get_nmi_count(cpu) - prev_nmi_count[cpu] <= 5) |
145 | printk(KERN_WARNING "WARNING: CPU#%d: NMI " | 162 | report_broken_nmi(cpu, prev_nmi_count); |
146 | "appears to be stuck (%d->%d)!\n", | ||
147 | cpu, | ||
148 | prev_nmi_count[cpu], | ||
149 | get_nmi_count(cpu)); | ||
150 | per_cpu(wd_enabled, cpu) = 0; | ||
151 | atomic_dec(&nmi_active); | ||
152 | } | ||
153 | } | 163 | } |
154 | endflag = 1; | 164 | endflag = 1; |
155 | if (!atomic_read(&nmi_active)) { | 165 | if (!atomic_read(&nmi_active)) { |
diff --git a/arch/x86/kernel/numaq_32.c b/arch/x86/kernel/numaq_32.c index b8c45610b20a..eecc8c18f010 100644 --- a/arch/x86/kernel/numaq_32.c +++ b/arch/x86/kernel/numaq_32.c | |||
@@ -73,7 +73,7 @@ static void __init smp_dump_qct(void) | |||
73 | } | 73 | } |
74 | 74 | ||
75 | 75 | ||
76 | void __init numaq_tsc_disable(void) | 76 | void __cpuinit numaq_tsc_disable(void) |
77 | { | 77 | { |
78 | if (!found_numaq) | 78 | if (!found_numaq) |
79 | return; | 79 | return; |
diff --git a/arch/x86/kernel/paravirt.c b/arch/x86/kernel/paravirt.c index 94da4d52d798..300da17e61cb 100644 --- a/arch/x86/kernel/paravirt.c +++ b/arch/x86/kernel/paravirt.c | |||
@@ -471,7 +471,7 @@ struct pv_lock_ops pv_lock_ops = { | |||
471 | .spin_unlock = __ticket_spin_unlock, | 471 | .spin_unlock = __ticket_spin_unlock, |
472 | #endif | 472 | #endif |
473 | }; | 473 | }; |
474 | EXPORT_SYMBOL_GPL(pv_lock_ops); | 474 | EXPORT_SYMBOL(pv_lock_ops); |
475 | 475 | ||
476 | EXPORT_SYMBOL_GPL(pv_time_ops); | 476 | EXPORT_SYMBOL_GPL(pv_time_ops); |
477 | EXPORT_SYMBOL (pv_cpu_ops); | 477 | EXPORT_SYMBOL (pv_cpu_ops); |
diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 02d19328525d..dcdac6c826e9 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c | |||
@@ -343,9 +343,8 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr, | |||
343 | /* were we called with bad_dma_address? */ | 343 | /* were we called with bad_dma_address? */ |
344 | badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE); | 344 | badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE); |
345 | if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) { | 345 | if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) { |
346 | printk(KERN_ERR "Calgary: driver tried unmapping bad DMA " | 346 | WARN(1, KERN_ERR "Calgary: driver tried unmapping bad DMA " |
347 | "address 0x%Lx\n", dma_addr); | 347 | "address 0x%Lx\n", dma_addr); |
348 | WARN_ON(1); | ||
349 | return; | 348 | return; |
350 | } | 349 | } |
351 | 350 | ||
@@ -1269,13 +1268,15 @@ static inline int __init determine_tce_table_size(u64 ram) | |||
1269 | static int __init build_detail_arrays(void) | 1268 | static int __init build_detail_arrays(void) |
1270 | { | 1269 | { |
1271 | unsigned long ptr; | 1270 | unsigned long ptr; |
1272 | int i, scal_detail_size, rio_detail_size; | 1271 | unsigned numnodes, i; |
1272 | int scal_detail_size, rio_detail_size; | ||
1273 | 1273 | ||
1274 | if (rio_table_hdr->num_scal_dev > MAX_NUMNODES){ | 1274 | numnodes = rio_table_hdr->num_scal_dev; |
1275 | if (numnodes > MAX_NUMNODES){ | ||
1275 | printk(KERN_WARNING | 1276 | printk(KERN_WARNING |
1276 | "Calgary: MAX_NUMNODES too low! Defined as %d, " | 1277 | "Calgary: MAX_NUMNODES too low! Defined as %d, " |
1277 | "but system has %d nodes.\n", | 1278 | "but system has %d nodes.\n", |
1278 | MAX_NUMNODES, rio_table_hdr->num_scal_dev); | 1279 | MAX_NUMNODES, numnodes); |
1279 | return -ENODEV; | 1280 | return -ENODEV; |
1280 | } | 1281 | } |
1281 | 1282 | ||
@@ -1296,8 +1297,7 @@ static int __init build_detail_arrays(void) | |||
1296 | } | 1297 | } |
1297 | 1298 | ||
1298 | ptr = ((unsigned long)rio_table_hdr) + 3; | 1299 | ptr = ((unsigned long)rio_table_hdr) + 3; |
1299 | for (i = 0; i < rio_table_hdr->num_scal_dev; | 1300 | for (i = 0; i < numnodes; i++, ptr += scal_detail_size) |
1300 | i++, ptr += scal_detail_size) | ||
1301 | scal_devs[i] = (struct scal_detail *)ptr; | 1301 | scal_devs[i] = (struct scal_detail *)ptr; |
1302 | 1302 | ||
1303 | for (i = 0; i < rio_table_hdr->num_rio_dev; | 1303 | for (i = 0; i < rio_table_hdr->num_rio_dev; |
@@ -1350,7 +1350,7 @@ static void calgary_init_bitmap_from_tce_table(struct iommu_table *tbl) | |||
1350 | * Function for kdump case. Get the tce tables from first kernel | 1350 | * Function for kdump case. Get the tce tables from first kernel |
1351 | * by reading the contents of the base adress register of calgary iommu | 1351 | * by reading the contents of the base adress register of calgary iommu |
1352 | */ | 1352 | */ |
1353 | static void get_tce_space_from_tar(void) | 1353 | static void __init get_tce_space_from_tar(void) |
1354 | { | 1354 | { |
1355 | int bus; | 1355 | int bus; |
1356 | void __iomem *target; | 1356 | void __iomem *target; |
diff --git a/arch/x86/kernel/process_32.c b/arch/x86/kernel/process_32.c index 53bc653ed5ca..3b7a1ddcc0bc 100644 --- a/arch/x86/kernel/process_32.c +++ b/arch/x86/kernel/process_32.c | |||
@@ -95,7 +95,6 @@ static inline void play_dead(void) | |||
95 | { | 95 | { |
96 | /* This must be done before dead CPU ack */ | 96 | /* This must be done before dead CPU ack */ |
97 | cpu_exit_clear(); | 97 | cpu_exit_clear(); |
98 | wbinvd(); | ||
99 | mb(); | 98 | mb(); |
100 | /* Ack it */ | 99 | /* Ack it */ |
101 | __get_cpu_var(cpu_state) = CPU_DEAD; | 100 | __get_cpu_var(cpu_state) = CPU_DEAD; |
@@ -104,8 +103,8 @@ static inline void play_dead(void) | |||
104 | * With physical CPU hotplug, we should halt the cpu | 103 | * With physical CPU hotplug, we should halt the cpu |
105 | */ | 104 | */ |
106 | local_irq_disable(); | 105 | local_irq_disable(); |
107 | while (1) | 106 | /* mask all interrupts, flush any and all caches, and halt */ |
108 | halt(); | 107 | wbinvd_halt(); |
109 | } | 108 | } |
110 | #else | 109 | #else |
111 | static inline void play_dead(void) | 110 | static inline void play_dead(void) |
diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index 3fb62a7d9a16..71553b664e2a 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c | |||
@@ -93,14 +93,13 @@ DECLARE_PER_CPU(int, cpu_state); | |||
93 | static inline void play_dead(void) | 93 | static inline void play_dead(void) |
94 | { | 94 | { |
95 | idle_task_exit(); | 95 | idle_task_exit(); |
96 | wbinvd(); | ||
97 | mb(); | 96 | mb(); |
98 | /* Ack it */ | 97 | /* Ack it */ |
99 | __get_cpu_var(cpu_state) = CPU_DEAD; | 98 | __get_cpu_var(cpu_state) = CPU_DEAD; |
100 | 99 | ||
101 | local_irq_disable(); | 100 | local_irq_disable(); |
102 | while (1) | 101 | /* mask all interrupts, flush any and all caches, and halt */ |
103 | halt(); | 102 | wbinvd_halt(); |
104 | } | 103 | } |
105 | #else | 104 | #else |
106 | static inline void play_dead(void) | 105 | static inline void play_dead(void) |
diff --git a/arch/x86/kernel/relocate_kernel_32.S b/arch/x86/kernel/relocate_kernel_32.S index 703310a99023..6f50664b2ba5 100644 --- a/arch/x86/kernel/relocate_kernel_32.S +++ b/arch/x86/kernel/relocate_kernel_32.S | |||
@@ -20,10 +20,11 @@ | |||
20 | #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) | 20 | #define PAGE_ATTR (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) |
21 | #define PAE_PGD_ATTR (_PAGE_PRESENT) | 21 | #define PAE_PGD_ATTR (_PAGE_PRESENT) |
22 | 22 | ||
23 | /* control_page + PAGE_SIZE/2 ~ control_page + PAGE_SIZE * 3/4 are | 23 | /* control_page + KEXEC_CONTROL_CODE_MAX_SIZE |
24 | * used to save some data for jumping back | 24 | * ~ control_page + PAGE_SIZE are used as data storage and stack for |
25 | * jumping back | ||
25 | */ | 26 | */ |
26 | #define DATA(offset) (PAGE_SIZE/2+(offset)) | 27 | #define DATA(offset) (KEXEC_CONTROL_CODE_MAX_SIZE+(offset)) |
27 | 28 | ||
28 | /* Minimal CPU state */ | 29 | /* Minimal CPU state */ |
29 | #define ESP DATA(0x0) | 30 | #define ESP DATA(0x0) |
@@ -376,3 +377,6 @@ swap_pages: | |||
376 | popl %ebx | 377 | popl %ebx |
377 | popl %ebp | 378 | popl %ebp |
378 | ret | 379 | ret |
380 | |||
381 | .globl kexec_control_code_size | ||
382 | .set kexec_control_code_size, . - relocate_kernel | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index 68b48e3fbcbd..362d4e7f2d38 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -445,7 +445,7 @@ static void __init reserve_early_setup_data(void) | |||
445 | * @size: Size of the crashkernel memory to reserve. | 445 | * @size: Size of the crashkernel memory to reserve. |
446 | * Returns the base address on success, and -1ULL on failure. | 446 | * Returns the base address on success, and -1ULL on failure. |
447 | */ | 447 | */ |
448 | unsigned long long find_and_reserve_crashkernel(unsigned long long size) | 448 | unsigned long long __init find_and_reserve_crashkernel(unsigned long long size) |
449 | { | 449 | { |
450 | const unsigned long long alignment = 16<<20; /* 16M */ | 450 | const unsigned long long alignment = 16<<20; /* 16M */ |
451 | unsigned long long start = 0LL; | 451 | unsigned long long start = 0LL; |
@@ -604,14 +604,6 @@ void __init setup_arch(char **cmdline_p) | |||
604 | early_cpu_init(); | 604 | early_cpu_init(); |
605 | early_ioremap_init(); | 605 | early_ioremap_init(); |
606 | 606 | ||
607 | #if defined(CONFIG_VMI) && defined(CONFIG_X86_32) | ||
608 | /* | ||
609 | * Must be before kernel pagetables are setup | ||
610 | * or fixmap area is touched. | ||
611 | */ | ||
612 | vmi_init(); | ||
613 | #endif | ||
614 | |||
615 | ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev); | 607 | ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev); |
616 | screen_info = boot_params.screen_info; | 608 | screen_info = boot_params.screen_info; |
617 | edid_info = boot_params.edid_info; | 609 | edid_info = boot_params.edid_info; |
@@ -678,6 +670,14 @@ void __init setup_arch(char **cmdline_p) | |||
678 | 670 | ||
679 | parse_early_param(); | 671 | parse_early_param(); |
680 | 672 | ||
673 | #if defined(CONFIG_VMI) && defined(CONFIG_X86_32) | ||
674 | /* | ||
675 | * Must be before kernel pagetables are setup | ||
676 | * or fixmap area is touched. | ||
677 | */ | ||
678 | vmi_init(); | ||
679 | #endif | ||
680 | |||
681 | /* after early param, so could get panic from serial */ | 681 | /* after early param, so could get panic from serial */ |
682 | reserve_early_setup_data(); | 682 | reserve_early_setup_data(); |
683 | 683 | ||
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index b45ef8ddd651..ca316b5b742c 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
@@ -104,7 +104,16 @@ static inline int restore_i387(struct _fpstate __user *buf) | |||
104 | clts(); | 104 | clts(); |
105 | task_thread_info(current)->status |= TS_USEDFPU; | 105 | task_thread_info(current)->status |= TS_USEDFPU; |
106 | } | 106 | } |
107 | return restore_fpu_checking((__force struct i387_fxsave_struct *)buf); | 107 | err = restore_fpu_checking((__force struct i387_fxsave_struct *)buf); |
108 | if (unlikely(err)) { | ||
109 | /* | ||
110 | * Encountered an error while doing the restore from the | ||
111 | * user buffer, clear the fpu state. | ||
112 | */ | ||
113 | clear_fpu(tsk); | ||
114 | clear_used_math(); | ||
115 | } | ||
116 | return err; | ||
108 | } | 117 | } |
109 | 118 | ||
110 | /* | 119 | /* |
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c index 91055d7fc1b0..7985c5b3f916 100644 --- a/arch/x86/kernel/smpboot.c +++ b/arch/x86/kernel/smpboot.c | |||
@@ -756,6 +756,14 @@ static void __cpuinit do_fork_idle(struct work_struct *work) | |||
756 | } | 756 | } |
757 | 757 | ||
758 | #ifdef CONFIG_X86_64 | 758 | #ifdef CONFIG_X86_64 |
759 | |||
760 | /* __ref because it's safe to call free_bootmem when after_bootmem == 0. */ | ||
761 | static void __ref free_bootmem_pda(struct x8664_pda *oldpda) | ||
762 | { | ||
763 | if (!after_bootmem) | ||
764 | free_bootmem((unsigned long)oldpda, sizeof(*oldpda)); | ||
765 | } | ||
766 | |||
759 | /* | 767 | /* |
760 | * Allocate node local memory for the AP pda. | 768 | * Allocate node local memory for the AP pda. |
761 | * | 769 | * |
@@ -784,8 +792,7 @@ int __cpuinit get_local_pda(int cpu) | |||
784 | 792 | ||
785 | if (oldpda) { | 793 | if (oldpda) { |
786 | memcpy(newpda, oldpda, size); | 794 | memcpy(newpda, oldpda, size); |
787 | if (!after_bootmem) | 795 | free_bootmem_pda(oldpda); |
788 | free_bootmem((unsigned long)oldpda, size); | ||
789 | } | 796 | } |
790 | 797 | ||
791 | newpda->in_bootmem = 0; | 798 | newpda->in_bootmem = 0; |
@@ -994,17 +1001,7 @@ int __cpuinit native_cpu_up(unsigned int cpu) | |||
994 | flush_tlb_all(); | 1001 | flush_tlb_all(); |
995 | low_mappings = 1; | 1002 | low_mappings = 1; |
996 | 1003 | ||
997 | #ifdef CONFIG_X86_PC | ||
998 | if (def_to_bigsmp && apicid > 8) { | ||
999 | printk(KERN_WARNING | ||
1000 | "More than 8 CPUs detected - skipping them.\n" | ||
1001 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
1002 | err = -1; | ||
1003 | } else | ||
1004 | err = do_boot_cpu(apicid, cpu); | ||
1005 | #else | ||
1006 | err = do_boot_cpu(apicid, cpu); | 1004 | err = do_boot_cpu(apicid, cpu); |
1007 | #endif | ||
1008 | 1005 | ||
1009 | zap_low_mappings(); | 1006 | zap_low_mappings(); |
1010 | low_mappings = 0; | 1007 | low_mappings = 0; |
@@ -1058,6 +1055,34 @@ static __init void disable_smp(void) | |||
1058 | static int __init smp_sanity_check(unsigned max_cpus) | 1055 | static int __init smp_sanity_check(unsigned max_cpus) |
1059 | { | 1056 | { |
1060 | preempt_disable(); | 1057 | preempt_disable(); |
1058 | |||
1059 | #if defined(CONFIG_X86_PC) && defined(CONFIG_X86_32) | ||
1060 | if (def_to_bigsmp && nr_cpu_ids > 8) { | ||
1061 | unsigned int cpu; | ||
1062 | unsigned nr; | ||
1063 | |||
1064 | printk(KERN_WARNING | ||
1065 | "More than 8 CPUs detected - skipping them.\n" | ||
1066 | "Use CONFIG_X86_GENERICARCH and CONFIG_X86_BIGSMP.\n"); | ||
1067 | |||
1068 | nr = 0; | ||
1069 | for_each_present_cpu(cpu) { | ||
1070 | if (nr >= 8) | ||
1071 | cpu_clear(cpu, cpu_present_map); | ||
1072 | nr++; | ||
1073 | } | ||
1074 | |||
1075 | nr = 0; | ||
1076 | for_each_possible_cpu(cpu) { | ||
1077 | if (nr >= 8) | ||
1078 | cpu_clear(cpu, cpu_possible_map); | ||
1079 | nr++; | ||
1080 | } | ||
1081 | |||
1082 | nr_cpu_ids = 8; | ||
1083 | } | ||
1084 | #endif | ||
1085 | |||
1061 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { | 1086 | if (!physid_isset(hard_smp_processor_id(), phys_cpu_present_map)) { |
1062 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" | 1087 | printk(KERN_WARNING "weird, boot CPU (#%d) not listed" |
1063 | "by the BIOS.\n", hard_smp_processor_id()); | 1088 | "by the BIOS.\n", hard_smp_processor_id()); |
@@ -1196,6 +1221,9 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) | |||
1196 | printk(KERN_INFO "CPU%d: ", 0); | 1221 | printk(KERN_INFO "CPU%d: ", 0); |
1197 | print_cpu_info(&cpu_data(0)); | 1222 | print_cpu_info(&cpu_data(0)); |
1198 | setup_boot_clock(); | 1223 | setup_boot_clock(); |
1224 | |||
1225 | if (is_uv_system()) | ||
1226 | uv_system_init(); | ||
1199 | out: | 1227 | out: |
1200 | preempt_enable(); | 1228 | preempt_enable(); |
1201 | } | 1229 | } |
@@ -1386,17 +1414,3 @@ void __cpu_die(unsigned int cpu) | |||
1386 | BUG(); | 1414 | BUG(); |
1387 | } | 1415 | } |
1388 | #endif | 1416 | #endif |
1389 | |||
1390 | /* | ||
1391 | * If the BIOS enumerates physical processors before logical, | ||
1392 | * maxcpus=N at enumeration-time can be used to disable HT. | ||
1393 | */ | ||
1394 | static int __init parse_maxcpus(char *arg) | ||
1395 | { | ||
1396 | extern unsigned int maxcpus; | ||
1397 | |||
1398 | if (arg) | ||
1399 | maxcpus = simple_strtoul(arg, NULL, 0); | ||
1400 | return 0; | ||
1401 | } | ||
1402 | early_param("maxcpus", parse_maxcpus); | ||
diff --git a/arch/x86/kernel/smpcommon.c b/arch/x86/kernel/smpcommon.c index 99941b37eca0..397e309839dd 100644 --- a/arch/x86/kernel/smpcommon.c +++ b/arch/x86/kernel/smpcommon.c | |||
@@ -8,18 +8,21 @@ | |||
8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); | 8 | DEFINE_PER_CPU(unsigned long, this_cpu_off); |
9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); | 9 | EXPORT_PER_CPU_SYMBOL(this_cpu_off); |
10 | 10 | ||
11 | /* Initialize the CPU's GDT. This is either the boot CPU doing itself | 11 | /* |
12 | (still using the master per-cpu area), or a CPU doing it for a | 12 | * Initialize the CPU's GDT. This is either the boot CPU doing itself |
13 | secondary which will soon come up. */ | 13 | * (still using the master per-cpu area), or a CPU doing it for a |
14 | * secondary which will soon come up. | ||
15 | */ | ||
14 | __cpuinit void init_gdt(int cpu) | 16 | __cpuinit void init_gdt(int cpu) |
15 | { | 17 | { |
16 | struct desc_struct *gdt = get_cpu_gdt_table(cpu); | 18 | struct desc_struct gdt; |
17 | 19 | ||
18 | pack_descriptor(&gdt[GDT_ENTRY_PERCPU], | 20 | pack_descriptor(&gdt, __per_cpu_offset[cpu], 0xFFFFF, |
19 | __per_cpu_offset[cpu], 0xFFFFF, | ||
20 | 0x2 | DESCTYPE_S, 0x8); | 21 | 0x2 | DESCTYPE_S, 0x8); |
22 | gdt.s = 1; | ||
21 | 23 | ||
22 | gdt[GDT_ENTRY_PERCPU].s = 1; | 24 | write_gdt_entry(get_cpu_gdt_table(cpu), |
25 | GDT_ENTRY_PERCPU, &gdt, DESCTYPE_S); | ||
23 | 26 | ||
24 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; | 27 | per_cpu(this_cpu_off, cpu) = __per_cpu_offset[cpu]; |
25 | per_cpu(cpu_number, cpu) = cpu; | 28 | per_cpu(cpu_number, cpu) = cpu; |
diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c index d0fbb7712ab0..8b8c0d6640fa 100644 --- a/arch/x86/kernel/tlb_uv.c +++ b/arch/x86/kernel/tlb_uv.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <asm/genapic.h> | 17 | #include <asm/genapic.h> |
18 | #include <asm/idle.h> | 18 | #include <asm/idle.h> |
19 | #include <asm/tsc.h> | 19 | #include <asm/tsc.h> |
20 | #include <asm/irq_vectors.h> | ||
20 | 21 | ||
21 | #include <mach_apic.h> | 22 | #include <mach_apic.h> |
22 | 23 | ||
@@ -783,7 +784,7 @@ static int __init uv_bau_init(void) | |||
783 | uv_init_blade(blade, node, cur_cpu); | 784 | uv_init_blade(blade, node, cur_cpu); |
784 | cur_cpu += uv_blade_nr_possible_cpus(blade); | 785 | cur_cpu += uv_blade_nr_possible_cpus(blade); |
785 | } | 786 | } |
786 | set_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1); | 787 | alloc_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1); |
787 | uv_enable_timeouts(); | 788 | uv_enable_timeouts(); |
788 | 789 | ||
789 | return 0; | 790 | return 0; |
diff --git a/arch/x86/kernel/traps_64.c b/arch/x86/kernel/traps_64.c index 3f18d73f420c..513caaca7115 100644 --- a/arch/x86/kernel/traps_64.c +++ b/arch/x86/kernel/traps_64.c | |||
@@ -1131,7 +1131,14 @@ asmlinkage void math_state_restore(void) | |||
1131 | } | 1131 | } |
1132 | 1132 | ||
1133 | clts(); /* Allow maths ops (or we recurse) */ | 1133 | clts(); /* Allow maths ops (or we recurse) */ |
1134 | restore_fpu_checking(&me->thread.xstate->fxsave); | 1134 | /* |
1135 | * Paranoid restore. send a SIGSEGV if we fail to restore the state. | ||
1136 | */ | ||
1137 | if (unlikely(restore_fpu_checking(&me->thread.xstate->fxsave))) { | ||
1138 | stts(); | ||
1139 | force_sig(SIGSEGV, me); | ||
1140 | return; | ||
1141 | } | ||
1135 | task_thread_info(me)->status |= TS_USEDFPU; | 1142 | task_thread_info(me)->status |= TS_USEDFPU; |
1136 | me->fpu_counter++; | 1143 | me->fpu_counter++; |
1137 | } | 1144 | } |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 7603c0553909..46af71676738 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -104,7 +104,7 @@ __setup("notsc", notsc_setup); | |||
104 | /* | 104 | /* |
105 | * Read TSC and the reference counters. Take care of SMI disturbance | 105 | * Read TSC and the reference counters. Take care of SMI disturbance |
106 | */ | 106 | */ |
107 | static u64 __init tsc_read_refs(u64 *pm, u64 *hpet) | 107 | static u64 tsc_read_refs(u64 *pm, u64 *hpet) |
108 | { | 108 | { |
109 | u64 t1, t2; | 109 | u64 t1, t2; |
110 | int i; | 110 | int i; |
diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c index 0577825cf89b..9ffb01c31c40 100644 --- a/arch/x86/kernel/tsc_sync.c +++ b/arch/x86/kernel/tsc_sync.c | |||
@@ -88,11 +88,9 @@ static __cpuinit void check_tsc_warp(void) | |||
88 | __raw_spin_unlock(&sync_lock); | 88 | __raw_spin_unlock(&sync_lock); |
89 | } | 89 | } |
90 | } | 90 | } |
91 | if (!(now-start)) { | 91 | WARN(!(now-start), |
92 | printk("Warning: zero tsc calibration delta: %Ld [max: %Ld]\n", | 92 | "Warning: zero tsc calibration delta: %Ld [max: %Ld]\n", |
93 | now-start, end-start); | 93 | now-start, end-start); |
94 | WARN_ON(1); | ||
95 | } | ||
96 | } | 94 | } |
97 | 95 | ||
98 | /* | 96 | /* |
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c index 41e01b145c48..594ef47f0a63 100644 --- a/arch/x86/kernel/visws_quirks.c +++ b/arch/x86/kernel/visws_quirks.c | |||
@@ -184,8 +184,6 @@ static int __init visws_get_smp_config(unsigned int early) | |||
184 | return 1; | 184 | return 1; |
185 | } | 185 | } |
186 | 186 | ||
187 | extern unsigned int __cpuinitdata maxcpus; | ||
188 | |||
189 | /* | 187 | /* |
190 | * The Visual Workstation is Intel MP compliant in the hardware | 188 | * The Visual Workstation is Intel MP compliant in the hardware |
191 | * sense, but it doesn't have a BIOS(-configuration table). | 189 | * sense, but it doesn't have a BIOS(-configuration table). |
@@ -244,8 +242,8 @@ static int __init visws_find_smp_config(unsigned int reserve) | |||
244 | ncpus = CO_CPU_MAX; | 242 | ncpus = CO_CPU_MAX; |
245 | } | 243 | } |
246 | 244 | ||
247 | if (ncpus > maxcpus) | 245 | if (ncpus > setup_max_cpus) |
248 | ncpus = maxcpus; | 246 | ncpus = setup_max_cpus; |
249 | 247 | ||
250 | #ifdef CONFIG_X86_LOCAL_APIC | 248 | #ifdef CONFIG_X86_LOCAL_APIC |
251 | smp_found_config = 1; | 249 | smp_found_config = 1; |
diff --git a/arch/x86/kernel/vmlinux_32.lds.S b/arch/x86/kernel/vmlinux_32.lds.S index cdb2363697d2..af5bdad84604 100644 --- a/arch/x86/kernel/vmlinux_32.lds.S +++ b/arch/x86/kernel/vmlinux_32.lds.S | |||
@@ -209,3 +209,11 @@ SECTIONS | |||
209 | 209 | ||
210 | DWARF_DEBUG | 210 | DWARF_DEBUG |
211 | } | 211 | } |
212 | |||
213 | #ifdef CONFIG_KEXEC | ||
214 | /* Link time checks */ | ||
215 | #include <asm/kexec.h> | ||
216 | |||
217 | ASSERT(kexec_control_code_size <= KEXEC_CONTROL_CODE_MAX_SIZE, | ||
218 | "kexec control code size is too big") | ||
219 | #endif | ||
diff --git a/arch/x86/mach-rdc321x/platform.c b/arch/x86/mach-rdc321x/platform.c index a037041817c7..4f4e50c3ad3b 100644 --- a/arch/x86/mach-rdc321x/platform.c +++ b/arch/x86/mach-rdc321x/platform.c | |||
@@ -25,7 +25,6 @@ | |||
25 | #include <linux/list.h> | 25 | #include <linux/list.h> |
26 | #include <linux/device.h> | 26 | #include <linux/device.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/version.h> | ||
29 | #include <linux/leds.h> | 28 | #include <linux/leds.h> |
30 | 29 | ||
31 | #include <asm/gpio.h> | 30 | #include <asm/gpio.h> |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 129618ca0ea2..d3746efb060d 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -60,7 +60,7 @@ static unsigned long dma_reserve __initdata; | |||
60 | 60 | ||
61 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 61 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
62 | 62 | ||
63 | int direct_gbpages __meminitdata | 63 | int direct_gbpages |
64 | #ifdef CONFIG_DIRECT_GBPAGES | 64 | #ifdef CONFIG_DIRECT_GBPAGES |
65 | = 1 | 65 | = 1 |
66 | #endif | 66 | #endif |
@@ -88,7 +88,11 @@ early_param("gbpages", parse_direct_gbpages_on); | |||
88 | 88 | ||
89 | int after_bootmem; | 89 | int after_bootmem; |
90 | 90 | ||
91 | static __init void *spp_getpage(void) | 91 | /* |
92 | * NOTE: This function is marked __ref because it calls __init function | ||
93 | * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0. | ||
94 | */ | ||
95 | static __ref void *spp_getpage(void) | ||
92 | { | 96 | { |
93 | void *ptr; | 97 | void *ptr; |
94 | 98 | ||
@@ -237,7 +241,7 @@ static unsigned long __initdata table_start; | |||
237 | static unsigned long __meminitdata table_end; | 241 | static unsigned long __meminitdata table_end; |
238 | static unsigned long __meminitdata table_top; | 242 | static unsigned long __meminitdata table_top; |
239 | 243 | ||
240 | static __meminit void *alloc_low_page(unsigned long *phys) | 244 | static __ref void *alloc_low_page(unsigned long *phys) |
241 | { | 245 | { |
242 | unsigned long pfn = table_end++; | 246 | unsigned long pfn = table_end++; |
243 | void *adr; | 247 | void *adr; |
@@ -258,7 +262,7 @@ static __meminit void *alloc_low_page(unsigned long *phys) | |||
258 | return adr; | 262 | return adr; |
259 | } | 263 | } |
260 | 264 | ||
261 | static __meminit void unmap_low_page(void *adr) | 265 | static __ref void unmap_low_page(void *adr) |
262 | { | 266 | { |
263 | if (after_bootmem) | 267 | if (after_bootmem) |
264 | return; | 268 | return; |
@@ -314,6 +318,7 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
314 | { | 318 | { |
315 | unsigned long pages = 0; | 319 | unsigned long pages = 0; |
316 | unsigned long last_map_addr = end; | 320 | unsigned long last_map_addr = end; |
321 | unsigned long start = address; | ||
317 | 322 | ||
318 | int i = pmd_index(address); | 323 | int i = pmd_index(address); |
319 | 324 | ||
@@ -331,16 +336,24 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
331 | } | 336 | } |
332 | 337 | ||
333 | if (pmd_val(*pmd)) { | 338 | if (pmd_val(*pmd)) { |
334 | if (!pmd_large(*pmd)) | 339 | if (!pmd_large(*pmd)) { |
340 | spin_lock(&init_mm.page_table_lock); | ||
335 | last_map_addr = phys_pte_update(pmd, address, | 341 | last_map_addr = phys_pte_update(pmd, address, |
336 | end); | 342 | end); |
343 | spin_unlock(&init_mm.page_table_lock); | ||
344 | } | ||
345 | /* Count entries we're using from level2_ident_pgt */ | ||
346 | if (start == 0) | ||
347 | pages++; | ||
337 | continue; | 348 | continue; |
338 | } | 349 | } |
339 | 350 | ||
340 | if (page_size_mask & (1<<PG_LEVEL_2M)) { | 351 | if (page_size_mask & (1<<PG_LEVEL_2M)) { |
341 | pages++; | 352 | pages++; |
353 | spin_lock(&init_mm.page_table_lock); | ||
342 | set_pte((pte_t *)pmd, | 354 | set_pte((pte_t *)pmd, |
343 | pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); | 355 | pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); |
356 | spin_unlock(&init_mm.page_table_lock); | ||
344 | last_map_addr = (address & PMD_MASK) + PMD_SIZE; | 357 | last_map_addr = (address & PMD_MASK) + PMD_SIZE; |
345 | continue; | 358 | continue; |
346 | } | 359 | } |
@@ -349,7 +362,9 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end, | |||
349 | last_map_addr = phys_pte_init(pte, address, end); | 362 | last_map_addr = phys_pte_init(pte, address, end); |
350 | unmap_low_page(pte); | 363 | unmap_low_page(pte); |
351 | 364 | ||
365 | spin_lock(&init_mm.page_table_lock); | ||
352 | pmd_populate_kernel(&init_mm, pmd, __va(pte_phys)); | 366 | pmd_populate_kernel(&init_mm, pmd, __va(pte_phys)); |
367 | spin_unlock(&init_mm.page_table_lock); | ||
353 | } | 368 | } |
354 | update_page_count(PG_LEVEL_2M, pages); | 369 | update_page_count(PG_LEVEL_2M, pages); |
355 | return last_map_addr; | 370 | return last_map_addr; |
@@ -362,9 +377,7 @@ phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end, | |||
362 | pmd_t *pmd = pmd_offset(pud, 0); | 377 | pmd_t *pmd = pmd_offset(pud, 0); |
363 | unsigned long last_map_addr; | 378 | unsigned long last_map_addr; |
364 | 379 | ||
365 | spin_lock(&init_mm.page_table_lock); | ||
366 | last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask); | 380 | last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask); |
367 | spin_unlock(&init_mm.page_table_lock); | ||
368 | __flush_tlb_all(); | 381 | __flush_tlb_all(); |
369 | return last_map_addr; | 382 | return last_map_addr; |
370 | } | 383 | } |
@@ -400,20 +413,21 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end, | |||
400 | 413 | ||
401 | if (page_size_mask & (1<<PG_LEVEL_1G)) { | 414 | if (page_size_mask & (1<<PG_LEVEL_1G)) { |
402 | pages++; | 415 | pages++; |
416 | spin_lock(&init_mm.page_table_lock); | ||
403 | set_pte((pte_t *)pud, | 417 | set_pte((pte_t *)pud, |
404 | pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); | 418 | pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL_LARGE)); |
419 | spin_unlock(&init_mm.page_table_lock); | ||
405 | last_map_addr = (addr & PUD_MASK) + PUD_SIZE; | 420 | last_map_addr = (addr & PUD_MASK) + PUD_SIZE; |
406 | continue; | 421 | continue; |
407 | } | 422 | } |
408 | 423 | ||
409 | pmd = alloc_low_page(&pmd_phys); | 424 | pmd = alloc_low_page(&pmd_phys); |
410 | |||
411 | spin_lock(&init_mm.page_table_lock); | ||
412 | last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask); | 425 | last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask); |
413 | unmap_low_page(pmd); | 426 | unmap_low_page(pmd); |
427 | |||
428 | spin_lock(&init_mm.page_table_lock); | ||
414 | pud_populate(&init_mm, pud, __va(pmd_phys)); | 429 | pud_populate(&init_mm, pud, __va(pmd_phys)); |
415 | spin_unlock(&init_mm.page_table_lock); | 430 | spin_unlock(&init_mm.page_table_lock); |
416 | |||
417 | } | 431 | } |
418 | __flush_tlb_all(); | 432 | __flush_tlb_all(); |
419 | update_page_count(PG_LEVEL_1G, pages); | 433 | update_page_count(PG_LEVEL_1G, pages); |
@@ -505,16 +519,14 @@ static unsigned long __init kernel_physical_mapping_init(unsigned long start, | |||
505 | continue; | 519 | continue; |
506 | } | 520 | } |
507 | 521 | ||
508 | if (after_bootmem) | 522 | pud = alloc_low_page(&pud_phys); |
509 | pud = pud_offset(pgd, start & PGDIR_MASK); | ||
510 | else | ||
511 | pud = alloc_low_page(&pud_phys); | ||
512 | |||
513 | last_map_addr = phys_pud_init(pud, __pa(start), __pa(next), | 523 | last_map_addr = phys_pud_init(pud, __pa(start), __pa(next), |
514 | page_size_mask); | 524 | page_size_mask); |
515 | unmap_low_page(pud); | 525 | unmap_low_page(pud); |
516 | pgd_populate(&init_mm, pgd_offset_k(start), | 526 | |
517 | __va(pud_phys)); | 527 | spin_lock(&init_mm.page_table_lock); |
528 | pgd_populate(&init_mm, pgd, __va(pud_phys)); | ||
529 | spin_unlock(&init_mm.page_table_lock); | ||
518 | } | 530 | } |
519 | 531 | ||
520 | return last_map_addr; | 532 | return last_map_addr; |
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 016f335bbeea..d4b6e6a29ae3 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
@@ -170,7 +170,7 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
170 | phys_addr &= PAGE_MASK; | 170 | phys_addr &= PAGE_MASK; |
171 | size = PAGE_ALIGN(last_addr+1) - phys_addr; | 171 | size = PAGE_ALIGN(last_addr+1) - phys_addr; |
172 | 172 | ||
173 | retval = reserve_memtype(phys_addr, phys_addr + size, | 173 | retval = reserve_memtype(phys_addr, (u64)phys_addr + size, |
174 | prot_val, &new_prot_val); | 174 | prot_val, &new_prot_val); |
175 | if (retval) { | 175 | if (retval) { |
176 | pr_debug("Warning: reserve_memtype returned %d\n", retval); | 176 | pr_debug("Warning: reserve_memtype returned %d\n", retval); |
@@ -553,13 +553,11 @@ static int __init check_early_ioremap_leak(void) | |||
553 | { | 553 | { |
554 | if (!early_ioremap_nested) | 554 | if (!early_ioremap_nested) |
555 | return 0; | 555 | return 0; |
556 | 556 | WARN(1, KERN_WARNING | |
557 | printk(KERN_WARNING | ||
558 | "Debug warning: early ioremap leak of %d areas detected.\n", | 557 | "Debug warning: early ioremap leak of %d areas detected.\n", |
559 | early_ioremap_nested); | 558 | early_ioremap_nested); |
560 | printk(KERN_WARNING | 559 | printk(KERN_WARNING |
561 | "please boot with early_ioremap_debug and report the dmesg.\n"); | 560 | "please boot with early_ioremap_debug and report the dmesg.\n"); |
562 | WARN_ON(1); | ||
563 | 561 | ||
564 | return 1; | 562 | return 1; |
565 | } | 563 | } |
diff --git a/arch/x86/mm/mmio-mod.c b/arch/x86/mm/mmio-mod.c index e7397e108beb..635b50e85581 100644 --- a/arch/x86/mm/mmio-mod.c +++ b/arch/x86/mm/mmio-mod.c | |||
@@ -430,7 +430,9 @@ static void enter_uniprocessor(void) | |||
430 | "may miss events.\n"); | 430 | "may miss events.\n"); |
431 | } | 431 | } |
432 | 432 | ||
433 | static void leave_uniprocessor(void) | 433 | /* __ref because leave_uniprocessor calls cpu_up which is __cpuinit, |
434 | but this whole function is ifdefed CONFIG_HOTPLUG_CPU */ | ||
435 | static void __ref leave_uniprocessor(void) | ||
434 | { | 436 | { |
435 | int cpu; | 437 | int cpu; |
436 | int err; | 438 | int err; |
diff --git a/arch/x86/mm/pageattr-test.c b/arch/x86/mm/pageattr-test.c index 0dcd42eb94e6..d4aa503caaa2 100644 --- a/arch/x86/mm/pageattr-test.c +++ b/arch/x86/mm/pageattr-test.c | |||
@@ -221,8 +221,7 @@ static int pageattr_test(void) | |||
221 | failed += print_split(&sc); | 221 | failed += print_split(&sc); |
222 | 222 | ||
223 | if (failed) { | 223 | if (failed) { |
224 | printk(KERN_ERR "NOT PASSED. Please report.\n"); | 224 | WARN(1, KERN_ERR "NOT PASSED. Please report.\n"); |
225 | WARN_ON(1); | ||
226 | return -EINVAL; | 225 | return -EINVAL; |
227 | } else { | 226 | } else { |
228 | if (print) | 227 | if (print) |
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 65c6e46bf059..43e2f8483e4f 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -55,13 +55,19 @@ static void split_page_count(int level) | |||
55 | 55 | ||
56 | int arch_report_meminfo(char *page) | 56 | int arch_report_meminfo(char *page) |
57 | { | 57 | { |
58 | int n = sprintf(page, "DirectMap4k: %8lu\n" | 58 | int n = sprintf(page, "DirectMap4k: %8lu kB\n", |
59 | "DirectMap2M: %8lu\n", | 59 | direct_pages_count[PG_LEVEL_4K] << 2); |
60 | direct_pages_count[PG_LEVEL_4K], | 60 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) |
61 | direct_pages_count[PG_LEVEL_2M]); | 61 | n += sprintf(page + n, "DirectMap2M: %8lu kB\n", |
62 | direct_pages_count[PG_LEVEL_2M] << 11); | ||
63 | #else | ||
64 | n += sprintf(page + n, "DirectMap4M: %8lu kB\n", | ||
65 | direct_pages_count[PG_LEVEL_2M] << 12); | ||
66 | #endif | ||
62 | #ifdef CONFIG_X86_64 | 67 | #ifdef CONFIG_X86_64 |
63 | n += sprintf(page + n, "DirectMap1G: %8lu\n", | 68 | if (direct_gbpages) |
64 | direct_pages_count[PG_LEVEL_1G]); | 69 | n += sprintf(page + n, "DirectMap1G: %8lu kB\n", |
70 | direct_pages_count[PG_LEVEL_1G] << 20); | ||
65 | #endif | 71 | #endif |
66 | return n; | 72 | return n; |
67 | } | 73 | } |
@@ -592,10 +598,9 @@ repeat: | |||
592 | if (!pte_val(old_pte)) { | 598 | if (!pte_val(old_pte)) { |
593 | if (!primary) | 599 | if (!primary) |
594 | return 0; | 600 | return 0; |
595 | printk(KERN_WARNING "CPA: called for zero pte. " | 601 | WARN(1, KERN_WARNING "CPA: called for zero pte. " |
596 | "vaddr = %lx cpa->vaddr = %lx\n", address, | 602 | "vaddr = %lx cpa->vaddr = %lx\n", address, |
597 | cpa->vaddr); | 603 | cpa->vaddr); |
598 | WARN_ON(1); | ||
599 | return -EINVAL; | 604 | return -EINVAL; |
600 | } | 605 | } |
601 | 606 | ||
@@ -844,7 +849,7 @@ int set_memory_uc(unsigned long addr, int numpages) | |||
844 | /* | 849 | /* |
845 | * for now UC MINUS. see comments in ioremap_nocache() | 850 | * for now UC MINUS. see comments in ioremap_nocache() |
846 | */ | 851 | */ |
847 | if (reserve_memtype(addr, addr + numpages * PAGE_SIZE, | 852 | if (reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE, |
848 | _PAGE_CACHE_UC_MINUS, NULL)) | 853 | _PAGE_CACHE_UC_MINUS, NULL)) |
849 | return -EINVAL; | 854 | return -EINVAL; |
850 | 855 | ||
@@ -863,7 +868,7 @@ int set_memory_wc(unsigned long addr, int numpages) | |||
863 | if (!pat_enabled) | 868 | if (!pat_enabled) |
864 | return set_memory_uc(addr, numpages); | 869 | return set_memory_uc(addr, numpages); |
865 | 870 | ||
866 | if (reserve_memtype(addr, addr + numpages * PAGE_SIZE, | 871 | if (reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE, |
867 | _PAGE_CACHE_WC, NULL)) | 872 | _PAGE_CACHE_WC, NULL)) |
868 | return -EINVAL; | 873 | return -EINVAL; |
869 | 874 | ||
@@ -879,7 +884,7 @@ int _set_memory_wb(unsigned long addr, int numpages) | |||
879 | 884 | ||
880 | int set_memory_wb(unsigned long addr, int numpages) | 885 | int set_memory_wb(unsigned long addr, int numpages) |
881 | { | 886 | { |
882 | free_memtype(addr, addr + numpages * PAGE_SIZE); | 887 | free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE); |
883 | 888 | ||
884 | return _set_memory_wb(addr, numpages); | 889 | return _set_memory_wb(addr, numpages); |
885 | } | 890 | } |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index 2fe30916d4b6..2a50e0fa64a5 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
@@ -207,6 +207,9 @@ static int chk_conflict(struct memtype *new, struct memtype *entry, | |||
207 | return -EBUSY; | 207 | return -EBUSY; |
208 | } | 208 | } |
209 | 209 | ||
210 | static struct memtype *cached_entry; | ||
211 | static u64 cached_start; | ||
212 | |||
210 | /* | 213 | /* |
211 | * req_type typically has one of the: | 214 | * req_type typically has one of the: |
212 | * - _PAGE_CACHE_WB | 215 | * - _PAGE_CACHE_WB |
@@ -280,11 +283,17 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
280 | 283 | ||
281 | spin_lock(&memtype_lock); | 284 | spin_lock(&memtype_lock); |
282 | 285 | ||
286 | if (cached_entry && start >= cached_start) | ||
287 | entry = cached_entry; | ||
288 | else | ||
289 | entry = list_entry(&memtype_list, struct memtype, nd); | ||
290 | |||
283 | /* Search for existing mapping that overlaps the current range */ | 291 | /* Search for existing mapping that overlaps the current range */ |
284 | where = NULL; | 292 | where = NULL; |
285 | list_for_each_entry(entry, &memtype_list, nd) { | 293 | list_for_each_entry_continue(entry, &memtype_list, nd) { |
286 | if (end <= entry->start) { | 294 | if (end <= entry->start) { |
287 | where = entry->nd.prev; | 295 | where = entry->nd.prev; |
296 | cached_entry = list_entry(where, struct memtype, nd); | ||
288 | break; | 297 | break; |
289 | } else if (start <= entry->start) { /* end > entry->start */ | 298 | } else if (start <= entry->start) { /* end > entry->start */ |
290 | err = chk_conflict(new, entry, new_type); | 299 | err = chk_conflict(new, entry, new_type); |
@@ -292,6 +301,8 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
292 | dprintk("Overlap at 0x%Lx-0x%Lx\n", | 301 | dprintk("Overlap at 0x%Lx-0x%Lx\n", |
293 | entry->start, entry->end); | 302 | entry->start, entry->end); |
294 | where = entry->nd.prev; | 303 | where = entry->nd.prev; |
304 | cached_entry = list_entry(where, | ||
305 | struct memtype, nd); | ||
295 | } | 306 | } |
296 | break; | 307 | break; |
297 | } else if (start < entry->end) { /* start > entry->start */ | 308 | } else if (start < entry->end) { /* start > entry->start */ |
@@ -299,7 +310,20 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
299 | if (!err) { | 310 | if (!err) { |
300 | dprintk("Overlap at 0x%Lx-0x%Lx\n", | 311 | dprintk("Overlap at 0x%Lx-0x%Lx\n", |
301 | entry->start, entry->end); | 312 | entry->start, entry->end); |
302 | where = &entry->nd; | 313 | cached_entry = list_entry(entry->nd.prev, |
314 | struct memtype, nd); | ||
315 | |||
316 | /* | ||
317 | * Move to right position in the linked | ||
318 | * list to add this new entry | ||
319 | */ | ||
320 | list_for_each_entry_continue(entry, | ||
321 | &memtype_list, nd) { | ||
322 | if (start <= entry->start) { | ||
323 | where = entry->nd.prev; | ||
324 | break; | ||
325 | } | ||
326 | } | ||
303 | } | 327 | } |
304 | break; | 328 | break; |
305 | } | 329 | } |
@@ -314,6 +338,8 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type, | |||
314 | return err; | 338 | return err; |
315 | } | 339 | } |
316 | 340 | ||
341 | cached_start = start; | ||
342 | |||
317 | if (where) | 343 | if (where) |
318 | list_add(&new->nd, where); | 344 | list_add(&new->nd, where); |
319 | else | 345 | else |
@@ -343,6 +369,9 @@ int free_memtype(u64 start, u64 end) | |||
343 | spin_lock(&memtype_lock); | 369 | spin_lock(&memtype_lock); |
344 | list_for_each_entry(entry, &memtype_list, nd) { | 370 | list_for_each_entry(entry, &memtype_list, nd) { |
345 | if (entry->start == start && entry->end == end) { | 371 | if (entry->start == start && entry->end == end) { |
372 | if (cached_entry == entry || cached_start == start) | ||
373 | cached_entry = NULL; | ||
374 | |||
346 | list_del(&entry->nd); | 375 | list_del(&entry->nd); |
347 | kfree(entry); | 376 | kfree(entry); |
348 | err = 0; | 377 | err = 0; |
@@ -361,14 +390,6 @@ int free_memtype(u64 start, u64 end) | |||
361 | } | 390 | } |
362 | 391 | ||
363 | 392 | ||
364 | /* | ||
365 | * /dev/mem mmap interface. The memtype used for mapping varies: | ||
366 | * - Use UC for mappings with O_SYNC flag | ||
367 | * - Without O_SYNC flag, if there is any conflict in reserve_memtype, | ||
368 | * inherit the memtype from existing mapping. | ||
369 | * - Else use UC_MINUS memtype (for backward compatibility with existing | ||
370 | * X drivers. | ||
371 | */ | ||
372 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, | 393 | pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, |
373 | unsigned long size, pgprot_t vma_prot) | 394 | unsigned long size, pgprot_t vma_prot) |
374 | { | 395 | { |
@@ -406,14 +427,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | |||
406 | unsigned long size, pgprot_t *vma_prot) | 427 | unsigned long size, pgprot_t *vma_prot) |
407 | { | 428 | { |
408 | u64 offset = ((u64) pfn) << PAGE_SHIFT; | 429 | u64 offset = ((u64) pfn) << PAGE_SHIFT; |
409 | unsigned long flags = _PAGE_CACHE_UC_MINUS; | 430 | unsigned long flags = -1; |
410 | int retval; | 431 | int retval; |
411 | 432 | ||
412 | if (!range_is_allowed(pfn, size)) | 433 | if (!range_is_allowed(pfn, size)) |
413 | return 0; | 434 | return 0; |
414 | 435 | ||
415 | if (file->f_flags & O_SYNC) { | 436 | if (file->f_flags & O_SYNC) { |
416 | flags = _PAGE_CACHE_UC; | 437 | flags = _PAGE_CACHE_UC_MINUS; |
417 | } | 438 | } |
418 | 439 | ||
419 | #ifdef CONFIG_X86_32 | 440 | #ifdef CONFIG_X86_32 |
@@ -436,13 +457,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn, | |||
436 | #endif | 457 | #endif |
437 | 458 | ||
438 | /* | 459 | /* |
439 | * With O_SYNC, we can only take UC mapping. Fail if we cannot. | 460 | * With O_SYNC, we can only take UC_MINUS mapping. Fail if we cannot. |
461 | * | ||
440 | * Without O_SYNC, we want to get | 462 | * Without O_SYNC, we want to get |
441 | * - WB for WB-able memory and no other conflicting mappings | 463 | * - WB for WB-able memory and no other conflicting mappings |
442 | * - UC_MINUS for non-WB-able memory with no other conflicting mappings | 464 | * - UC_MINUS for non-WB-able memory with no other conflicting mappings |
443 | * - Inherit from confliting mappings otherwise | 465 | * - Inherit from confliting mappings otherwise |
444 | */ | 466 | */ |
445 | if (flags != _PAGE_CACHE_UC_MINUS) { | 467 | if (flags != -1) { |
446 | retval = reserve_memtype(offset, offset + size, flags, NULL); | 468 | retval = reserve_memtype(offset, offset + size, flags, NULL); |
447 | } else { | 469 | } else { |
448 | retval = reserve_memtype(offset, offset + size, -1, &flags); | 470 | retval = reserve_memtype(offset, offset + size, -1, &flags); |
diff --git a/arch/x86/mm/srat_32.c b/arch/x86/mm/srat_32.c index 1eb2973a301c..16ae70fc57e7 100644 --- a/arch/x86/mm/srat_32.c +++ b/arch/x86/mm/srat_32.c | |||
@@ -178,7 +178,7 @@ void acpi_numa_arch_fixup(void) | |||
178 | * start of the node, and that the current "end" address is after | 178 | * start of the node, and that the current "end" address is after |
179 | * the previous one. | 179 | * the previous one. |
180 | */ | 180 | */ |
181 | static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk) | 181 | static __init int node_read_chunk(int nid, struct node_memory_chunk_s *memory_chunk) |
182 | { | 182 | { |
183 | /* | 183 | /* |
184 | * Only add present memory as told by the e820. | 184 | * Only add present memory as told by the e820. |
@@ -189,10 +189,10 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c | |||
189 | if (memory_chunk->start_pfn >= max_pfn) { | 189 | if (memory_chunk->start_pfn >= max_pfn) { |
190 | printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n", | 190 | printk(KERN_INFO "Ignoring SRAT pfns: %08lx - %08lx\n", |
191 | memory_chunk->start_pfn, memory_chunk->end_pfn); | 191 | memory_chunk->start_pfn, memory_chunk->end_pfn); |
192 | return; | 192 | return -1; |
193 | } | 193 | } |
194 | if (memory_chunk->nid != nid) | 194 | if (memory_chunk->nid != nid) |
195 | return; | 195 | return -1; |
196 | 196 | ||
197 | if (!node_has_online_mem(nid)) | 197 | if (!node_has_online_mem(nid)) |
198 | node_start_pfn[nid] = memory_chunk->start_pfn; | 198 | node_start_pfn[nid] = memory_chunk->start_pfn; |
@@ -202,6 +202,8 @@ static __init void node_read_chunk(int nid, struct node_memory_chunk_s *memory_c | |||
202 | 202 | ||
203 | if (node_end_pfn[nid] < memory_chunk->end_pfn) | 203 | if (node_end_pfn[nid] < memory_chunk->end_pfn) |
204 | node_end_pfn[nid] = memory_chunk->end_pfn; | 204 | node_end_pfn[nid] = memory_chunk->end_pfn; |
205 | |||
206 | return 0; | ||
205 | } | 207 | } |
206 | 208 | ||
207 | int __init get_memcfg_from_srat(void) | 209 | int __init get_memcfg_from_srat(void) |
@@ -259,7 +261,9 @@ int __init get_memcfg_from_srat(void) | |||
259 | printk(KERN_DEBUG | 261 | printk(KERN_DEBUG |
260 | "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n", | 262 | "chunk %d nid %d start_pfn %08lx end_pfn %08lx\n", |
261 | j, chunk->nid, chunk->start_pfn, chunk->end_pfn); | 263 | j, chunk->nid, chunk->start_pfn, chunk->end_pfn); |
262 | node_read_chunk(chunk->nid, chunk); | 264 | if (node_read_chunk(chunk->nid, chunk)) |
265 | continue; | ||
266 | |||
263 | e820_register_active_regions(chunk->nid, chunk->start_pfn, | 267 | e820_register_active_regions(chunk->nid, chunk->start_pfn, |
264 | min(chunk->end_pfn, max_pfn)); | 268 | min(chunk->end_pfn, max_pfn)); |
265 | } | 269 | } |
diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c index 3f90289410e6..0227694f7dab 100644 --- a/arch/x86/oprofile/nmi_int.c +++ b/arch/x86/oprofile/nmi_int.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/moduleparam.h> | 16 | #include <linux/moduleparam.h> |
17 | #include <linux/kdebug.h> | 17 | #include <linux/kdebug.h> |
18 | #include <linux/cpu.h> | ||
18 | #include <asm/nmi.h> | 19 | #include <asm/nmi.h> |
19 | #include <asm/msr.h> | 20 | #include <asm/msr.h> |
20 | #include <asm/apic.h> | 21 | #include <asm/apic.h> |
@@ -28,23 +29,48 @@ static DEFINE_PER_CPU(unsigned long, saved_lvtpc); | |||
28 | 29 | ||
29 | static int nmi_start(void); | 30 | static int nmi_start(void); |
30 | static void nmi_stop(void); | 31 | static void nmi_stop(void); |
32 | static void nmi_cpu_start(void *dummy); | ||
33 | static void nmi_cpu_stop(void *dummy); | ||
31 | 34 | ||
32 | /* 0 == registered but off, 1 == registered and on */ | 35 | /* 0 == registered but off, 1 == registered and on */ |
33 | static int nmi_enabled = 0; | 36 | static int nmi_enabled = 0; |
34 | 37 | ||
38 | #ifdef CONFIG_SMP | ||
39 | static int oprofile_cpu_notifier(struct notifier_block *b, unsigned long action, | ||
40 | void *data) | ||
41 | { | ||
42 | int cpu = (unsigned long)data; | ||
43 | switch (action) { | ||
44 | case CPU_DOWN_FAILED: | ||
45 | case CPU_ONLINE: | ||
46 | smp_call_function_single(cpu, nmi_cpu_start, NULL, 0); | ||
47 | break; | ||
48 | case CPU_DOWN_PREPARE: | ||
49 | smp_call_function_single(cpu, nmi_cpu_stop, NULL, 1); | ||
50 | break; | ||
51 | } | ||
52 | return NOTIFY_DONE; | ||
53 | } | ||
54 | |||
55 | static struct notifier_block oprofile_cpu_nb = { | ||
56 | .notifier_call = oprofile_cpu_notifier | ||
57 | }; | ||
58 | #endif | ||
59 | |||
35 | #ifdef CONFIG_PM | 60 | #ifdef CONFIG_PM |
36 | 61 | ||
37 | static int nmi_suspend(struct sys_device *dev, pm_message_t state) | 62 | static int nmi_suspend(struct sys_device *dev, pm_message_t state) |
38 | { | 63 | { |
64 | /* Only one CPU left, just stop that one */ | ||
39 | if (nmi_enabled == 1) | 65 | if (nmi_enabled == 1) |
40 | nmi_stop(); | 66 | nmi_cpu_stop(NULL); |
41 | return 0; | 67 | return 0; |
42 | } | 68 | } |
43 | 69 | ||
44 | static int nmi_resume(struct sys_device *dev) | 70 | static int nmi_resume(struct sys_device *dev) |
45 | { | 71 | { |
46 | if (nmi_enabled == 1) | 72 | if (nmi_enabled == 1) |
47 | nmi_start(); | 73 | nmi_cpu_start(NULL); |
48 | return 0; | 74 | return 0; |
49 | } | 75 | } |
50 | 76 | ||
@@ -463,6 +489,9 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
463 | } | 489 | } |
464 | 490 | ||
465 | init_sysfs(); | 491 | init_sysfs(); |
492 | #ifdef CONFIG_SMP | ||
493 | register_cpu_notifier(&oprofile_cpu_nb); | ||
494 | #endif | ||
466 | using_nmi = 1; | 495 | using_nmi = 1; |
467 | ops->create_files = nmi_create_files; | 496 | ops->create_files = nmi_create_files; |
468 | ops->setup = nmi_setup; | 497 | ops->setup = nmi_setup; |
@@ -476,6 +505,10 @@ int __init op_nmi_init(struct oprofile_operations *ops) | |||
476 | 505 | ||
477 | void op_nmi_exit(void) | 506 | void op_nmi_exit(void) |
478 | { | 507 | { |
479 | if (using_nmi) | 508 | if (using_nmi) { |
480 | exit_sysfs(); | 509 | exit_sysfs(); |
510 | #ifdef CONFIG_SMP | ||
511 | unregister_cpu_notifier(&oprofile_cpu_nb); | ||
512 | #endif | ||
513 | } | ||
481 | } | 514 | } |
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index fec0123b33a9..8e077185e185 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -590,6 +590,8 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route | |||
590 | case PCI_DEVICE_ID_INTEL_ICH10_1: | 590 | case PCI_DEVICE_ID_INTEL_ICH10_1: |
591 | case PCI_DEVICE_ID_INTEL_ICH10_2: | 591 | case PCI_DEVICE_ID_INTEL_ICH10_2: |
592 | case PCI_DEVICE_ID_INTEL_ICH10_3: | 592 | case PCI_DEVICE_ID_INTEL_ICH10_3: |
593 | case PCI_DEVICE_ID_INTEL_PCH_0: | ||
594 | case PCI_DEVICE_ID_INTEL_PCH_1: | ||
593 | r->name = "PIIX/ICH"; | 595 | r->name = "PIIX/ICH"; |
594 | r->get = pirq_piix_get; | 596 | r->get = pirq_piix_get; |
595 | r->set = pirq_piix_set; | 597 | r->set = pirq_piix_set; |
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c index ec9ce35e44d6..b722dd481b39 100644 --- a/arch/x86/pci/legacy.c +++ b/arch/x86/pci/legacy.c | |||
@@ -14,7 +14,7 @@ static void __devinit pcibios_fixup_peer_bridges(void) | |||
14 | int n, devfn; | 14 | int n, devfn; |
15 | long node; | 15 | long node; |
16 | 16 | ||
17 | if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff) | 17 | if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff) |
18 | return; | 18 | return; |
19 | DBG("PCI: Peer bridge fixup\n"); | 19 | DBG("PCI: Peer bridge fixup\n"); |
20 | 20 | ||
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index 23faaa890ffc..d9635764ce3d 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c | |||
@@ -293,7 +293,7 @@ static acpi_status __init find_mboard_resource(acpi_handle handle, u32 lvl, | |||
293 | return AE_OK; | 293 | return AE_OK; |
294 | } | 294 | } |
295 | 295 | ||
296 | static int __init is_acpi_reserved(unsigned long start, unsigned long end) | 296 | static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used) |
297 | { | 297 | { |
298 | struct resource mcfg_res; | 298 | struct resource mcfg_res; |
299 | 299 | ||
@@ -310,6 +310,41 @@ static int __init is_acpi_reserved(unsigned long start, unsigned long end) | |||
310 | return mcfg_res.flags; | 310 | return mcfg_res.flags; |
311 | } | 311 | } |
312 | 312 | ||
313 | typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type); | ||
314 | |||
315 | static int __init is_mmconf_reserved(check_reserved_t is_reserved, | ||
316 | u64 addr, u64 size, int i, | ||
317 | typeof(pci_mmcfg_config[0]) *cfg, int with_e820) | ||
318 | { | ||
319 | u64 old_size = size; | ||
320 | int valid = 0; | ||
321 | |||
322 | while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) { | ||
323 | size >>= 1; | ||
324 | if (size < (16UL<<20)) | ||
325 | break; | ||
326 | } | ||
327 | |||
328 | if (size >= (16UL<<20) || size == old_size) { | ||
329 | printk(KERN_NOTICE | ||
330 | "PCI: MCFG area at %Lx reserved in %s\n", | ||
331 | addr, with_e820?"E820":"ACPI motherboard resources"); | ||
332 | valid = 1; | ||
333 | |||
334 | if (old_size != size) { | ||
335 | /* update end_bus_number */ | ||
336 | cfg->end_bus_number = cfg->start_bus_number + ((size>>20) - 1); | ||
337 | printk(KERN_NOTICE "PCI: updated MCFG configuration %d: base %lx " | ||
338 | "segment %hu buses %u - %u\n", | ||
339 | i, (unsigned long)cfg->address, cfg->pci_segment, | ||
340 | (unsigned int)cfg->start_bus_number, | ||
341 | (unsigned int)cfg->end_bus_number); | ||
342 | } | ||
343 | } | ||
344 | |||
345 | return valid; | ||
346 | } | ||
347 | |||
313 | static void __init pci_mmcfg_reject_broken(int early) | 348 | static void __init pci_mmcfg_reject_broken(int early) |
314 | { | 349 | { |
315 | typeof(pci_mmcfg_config[0]) *cfg; | 350 | typeof(pci_mmcfg_config[0]) *cfg; |
@@ -324,21 +359,22 @@ static void __init pci_mmcfg_reject_broken(int early) | |||
324 | 359 | ||
325 | for (i = 0; i < pci_mmcfg_config_num; i++) { | 360 | for (i = 0; i < pci_mmcfg_config_num; i++) { |
326 | int valid = 0; | 361 | int valid = 0; |
327 | u32 size = (cfg->end_bus_number + 1) << 20; | 362 | u64 addr, size; |
363 | |||
328 | cfg = &pci_mmcfg_config[i]; | 364 | cfg = &pci_mmcfg_config[i]; |
365 | addr = cfg->start_bus_number; | ||
366 | addr <<= 20; | ||
367 | addr += cfg->address; | ||
368 | size = cfg->end_bus_number + 1 - cfg->start_bus_number; | ||
369 | size <<= 20; | ||
329 | printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx " | 370 | printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx " |
330 | "segment %hu buses %u - %u\n", | 371 | "segment %hu buses %u - %u\n", |
331 | i, (unsigned long)cfg->address, cfg->pci_segment, | 372 | i, (unsigned long)cfg->address, cfg->pci_segment, |
332 | (unsigned int)cfg->start_bus_number, | 373 | (unsigned int)cfg->start_bus_number, |
333 | (unsigned int)cfg->end_bus_number); | 374 | (unsigned int)cfg->end_bus_number); |
334 | 375 | ||
335 | if (!early && | 376 | if (!early) |
336 | is_acpi_reserved(cfg->address, cfg->address + size - 1)) { | 377 | valid = is_mmconf_reserved(is_acpi_reserved, addr, size, i, cfg, 0); |
337 | printk(KERN_NOTICE "PCI: MCFG area at %Lx reserved " | ||
338 | "in ACPI motherboard resources\n", | ||
339 | cfg->address); | ||
340 | valid = 1; | ||
341 | } | ||
342 | 378 | ||
343 | if (valid) | 379 | if (valid) |
344 | continue; | 380 | continue; |
@@ -347,16 +383,11 @@ static void __init pci_mmcfg_reject_broken(int early) | |||
347 | printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not" | 383 | printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not" |
348 | " reserved in ACPI motherboard resources\n", | 384 | " reserved in ACPI motherboard resources\n", |
349 | cfg->address); | 385 | cfg->address); |
386 | |||
350 | /* Don't try to do this check unless configuration | 387 | /* Don't try to do this check unless configuration |
351 | type 1 is available. how about type 2 ?*/ | 388 | type 1 is available. how about type 2 ?*/ |
352 | if (raw_pci_ops && e820_all_mapped(cfg->address, | 389 | if (raw_pci_ops) |
353 | cfg->address + size - 1, | 390 | valid = is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1); |
354 | E820_RESERVED)) { | ||
355 | printk(KERN_NOTICE | ||
356 | "PCI: MCFG area at %Lx reserved in E820\n", | ||
357 | cfg->address); | ||
358 | valid = 1; | ||
359 | } | ||
360 | 391 | ||
361 | if (!valid) | 392 | if (!valid) |
362 | goto reject; | 393 | goto reject; |
@@ -365,7 +396,7 @@ static void __init pci_mmcfg_reject_broken(int early) | |||
365 | return; | 396 | return; |
366 | 397 | ||
367 | reject: | 398 | reject: |
368 | printk(KERN_ERR "PCI: Not using MMCONFIG.\n"); | 399 | printk(KERN_INFO "PCI: Not using MMCONFIG.\n"); |
369 | pci_mmcfg_arch_free(); | 400 | pci_mmcfg_arch_free(); |
370 | kfree(pci_mmcfg_config); | 401 | kfree(pci_mmcfg_config); |
371 | pci_mmcfg_config = NULL; | 402 | pci_mmcfg_config = NULL; |
diff --git a/arch/x86/power/cpu_32.c b/arch/x86/power/cpu_32.c index 7dc5d5cf50a2..d3e083dea720 100644 --- a/arch/x86/power/cpu_32.c +++ b/arch/x86/power/cpu_32.c | |||
@@ -45,7 +45,7 @@ static void __save_processor_state(struct saved_context *ctxt) | |||
45 | ctxt->cr0 = read_cr0(); | 45 | ctxt->cr0 = read_cr0(); |
46 | ctxt->cr2 = read_cr2(); | 46 | ctxt->cr2 = read_cr2(); |
47 | ctxt->cr3 = read_cr3(); | 47 | ctxt->cr3 = read_cr3(); |
48 | ctxt->cr4 = read_cr4(); | 48 | ctxt->cr4 = read_cr4_safe(); |
49 | } | 49 | } |
50 | 50 | ||
51 | /* Needed by apm.c */ | 51 | /* Needed by apm.c */ |
@@ -98,7 +98,9 @@ static void __restore_processor_state(struct saved_context *ctxt) | |||
98 | /* | 98 | /* |
99 | * control registers | 99 | * control registers |
100 | */ | 100 | */ |
101 | write_cr4(ctxt->cr4); | 101 | /* cr4 was introduced in the Pentium CPU */ |
102 | if (ctxt->cr4) | ||
103 | write_cr4(ctxt->cr4); | ||
102 | write_cr3(ctxt->cr3); | 104 | write_cr3(ctxt->cr3); |
103 | write_cr2(ctxt->cr2); | 105 | write_cr2(ctxt->cr2); |
104 | write_cr0(ctxt->cr0); | 106 | write_cr0(ctxt->cr0); |
diff --git a/arch/x86/power/hibernate_asm_32.S b/arch/x86/power/hibernate_asm_32.S index b95aa6cfe3cb..4fc7e872c85e 100644 --- a/arch/x86/power/hibernate_asm_32.S +++ b/arch/x86/power/hibernate_asm_32.S | |||
@@ -28,9 +28,9 @@ ENTRY(swsusp_arch_suspend) | |||
28 | ret | 28 | ret |
29 | 29 | ||
30 | ENTRY(restore_image) | 30 | ENTRY(restore_image) |
31 | movl resume_pg_dir, %ecx | 31 | movl resume_pg_dir, %eax |
32 | subl $__PAGE_OFFSET, %ecx | 32 | subl $__PAGE_OFFSET, %eax |
33 | movl %ecx, %cr3 | 33 | movl %eax, %cr3 |
34 | 34 | ||
35 | movl restore_pblist, %edx | 35 | movl restore_pblist, %edx |
36 | .p2align 4,,7 | 36 | .p2align 4,,7 |
@@ -52,17 +52,21 @@ copy_loop: | |||
52 | 52 | ||
53 | done: | 53 | done: |
54 | /* go back to the original page tables */ | 54 | /* go back to the original page tables */ |
55 | movl $swapper_pg_dir, %ecx | 55 | movl $swapper_pg_dir, %eax |
56 | subl $__PAGE_OFFSET, %ecx | 56 | subl $__PAGE_OFFSET, %eax |
57 | movl %ecx, %cr3 | 57 | movl %eax, %cr3 |
58 | /* Flush TLB, including "global" things (vmalloc) */ | 58 | /* Flush TLB, including "global" things (vmalloc) */ |
59 | movl mmu_cr4_features, %eax | 59 | movl mmu_cr4_features, %ecx |
60 | movl %eax, %edx | 60 | jecxz 1f # cr4 Pentium and higher, skip if zero |
61 | movl %ecx, %edx | ||
61 | andl $~(1<<7), %edx; # PGE | 62 | andl $~(1<<7), %edx; # PGE |
62 | movl %edx, %cr4; # turn off PGE | 63 | movl %edx, %cr4; # turn off PGE |
63 | movl %cr3, %ecx; # flush TLB | 64 | 1: |
64 | movl %ecx, %cr3 | 65 | movl %cr3, %eax; # flush TLB |
65 | movl %eax, %cr4; # turn PGE back on | 66 | movl %eax, %cr3 |
67 | jecxz 1f # cr4 Pentium and higher, skip if zero | ||
68 | movl %ecx, %cr4; # turn PGE back on | ||
69 | 1: | ||
66 | 70 | ||
67 | movl saved_context_esp, %esp | 71 | movl saved_context_esp, %esp |
68 | movl saved_context_ebp, %ebp | 72 | movl saved_context_ebp, %ebp |
diff --git a/block/genhd.c b/block/genhd.c index c13cc77291af..656c2c7abf99 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
@@ -293,27 +293,30 @@ void __init printk_all_partitions(void) | |||
293 | /* iterator */ | 293 | /* iterator */ |
294 | static int find_start(struct device *dev, void *data) | 294 | static int find_start(struct device *dev, void *data) |
295 | { | 295 | { |
296 | loff_t k = *(loff_t *)data; | 296 | loff_t *k = data; |
297 | 297 | ||
298 | if (dev->type != &disk_type) | 298 | if (dev->type != &disk_type) |
299 | return 0; | 299 | return 0; |
300 | if (!k--) | 300 | if (!*k) |
301 | return 1; | 301 | return 1; |
302 | (*k)--; | ||
302 | return 0; | 303 | return 0; |
303 | } | 304 | } |
304 | 305 | ||
305 | static void *part_start(struct seq_file *part, loff_t *pos) | 306 | static void *part_start(struct seq_file *part, loff_t *pos) |
306 | { | 307 | { |
307 | struct device *dev; | 308 | struct device *dev; |
308 | loff_t n = *pos; | 309 | loff_t k = *pos; |
309 | 310 | ||
310 | if (!n) | 311 | if (!k) |
311 | seq_puts(part, "major minor #blocks name\n\n"); | 312 | seq_puts(part, "major minor #blocks name\n\n"); |
312 | 313 | ||
313 | mutex_lock(&block_class_lock); | 314 | mutex_lock(&block_class_lock); |
314 | dev = class_find_device(&block_class, NULL, (void *)pos, find_start); | 315 | dev = class_find_device(&block_class, NULL, &k, find_start); |
315 | if (dev) | 316 | if (dev) { |
317 | put_device(dev); | ||
316 | return dev_to_disk(dev); | 318 | return dev_to_disk(dev); |
319 | } | ||
317 | return NULL; | 320 | return NULL; |
318 | } | 321 | } |
319 | 322 | ||
@@ -330,8 +333,10 @@ static void *part_next(struct seq_file *part, void *v, loff_t *pos) | |||
330 | struct device *dev; | 333 | struct device *dev; |
331 | ++*pos; | 334 | ++*pos; |
332 | dev = class_find_device(&block_class, &gp->dev, NULL, find_next); | 335 | dev = class_find_device(&block_class, &gp->dev, NULL, find_next); |
333 | if (dev) | 336 | if (dev) { |
337 | put_device(dev); | ||
334 | return dev_to_disk(dev); | 338 | return dev_to_disk(dev); |
339 | } | ||
335 | return NULL; | 340 | return NULL; |
336 | } | 341 | } |
337 | 342 | ||
@@ -568,11 +573,14 @@ static struct device_type disk_type = { | |||
568 | static void *diskstats_start(struct seq_file *part, loff_t *pos) | 573 | static void *diskstats_start(struct seq_file *part, loff_t *pos) |
569 | { | 574 | { |
570 | struct device *dev; | 575 | struct device *dev; |
576 | loff_t k = *pos; | ||
571 | 577 | ||
572 | mutex_lock(&block_class_lock); | 578 | mutex_lock(&block_class_lock); |
573 | dev = class_find_device(&block_class, NULL, (void *)pos, find_start); | 579 | dev = class_find_device(&block_class, NULL, &k, find_start); |
574 | if (dev) | 580 | if (dev) { |
581 | put_device(dev); | ||
575 | return dev_to_disk(dev); | 582 | return dev_to_disk(dev); |
583 | } | ||
576 | return NULL; | 584 | return NULL; |
577 | } | 585 | } |
578 | 586 | ||
@@ -583,8 +591,10 @@ static void *diskstats_next(struct seq_file *part, void *v, loff_t *pos) | |||
583 | 591 | ||
584 | ++*pos; | 592 | ++*pos; |
585 | dev = class_find_device(&block_class, &gp->dev, NULL, find_next); | 593 | dev = class_find_device(&block_class, &gp->dev, NULL, find_next); |
586 | if (dev) | 594 | if (dev) { |
595 | put_device(dev); | ||
587 | return dev_to_disk(dev); | 596 | return dev_to_disk(dev); |
597 | } | ||
588 | return NULL; | 598 | return NULL; |
589 | } | 599 | } |
590 | 600 | ||
@@ -712,10 +722,12 @@ dev_t blk_lookup_devt(const char *name, int part) | |||
712 | mutex_lock(&block_class_lock); | 722 | mutex_lock(&block_class_lock); |
713 | find.name = name; | 723 | find.name = name; |
714 | find.part = part; | 724 | find.part = part; |
715 | dev = class_find_device(&block_class, NULL, (void *)&find, match_id); | 725 | dev = class_find_device(&block_class, NULL, &find, match_id); |
716 | if (dev) | 726 | if (dev) { |
727 | put_device(dev); | ||
717 | devt = MKDEV(MAJOR(dev->devt), | 728 | devt = MKDEV(MAJOR(dev->devt), |
718 | MINOR(dev->devt) + part); | 729 | MINOR(dev->devt) + part); |
730 | } | ||
719 | mutex_unlock(&block_class_lock); | 731 | mutex_unlock(&block_class_lock); |
720 | 732 | ||
721 | return devt; | 733 | return devt; |
diff --git a/crypto/authenc.c b/crypto/authenc.c index 4b226768752a..fd9f06c63d76 100644 --- a/crypto/authenc.c +++ b/crypto/authenc.c | |||
@@ -174,8 +174,9 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv, | |||
174 | static void crypto_authenc_encrypt_done(struct crypto_async_request *req, | 174 | static void crypto_authenc_encrypt_done(struct crypto_async_request *req, |
175 | int err) | 175 | int err) |
176 | { | 176 | { |
177 | struct aead_request *areq = req->data; | ||
178 | |||
177 | if (!err) { | 179 | if (!err) { |
178 | struct aead_request *areq = req->data; | ||
179 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); | 180 | struct crypto_aead *authenc = crypto_aead_reqtfm(areq); |
180 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); | 181 | struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc); |
181 | struct ablkcipher_request *abreq = aead_request_ctx(areq); | 182 | struct ablkcipher_request *abreq = aead_request_ctx(areq); |
@@ -185,7 +186,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req, | |||
185 | err = crypto_authenc_genicv(areq, iv, 0); | 186 | err = crypto_authenc_genicv(areq, iv, 0); |
186 | } | 187 | } |
187 | 188 | ||
188 | aead_request_complete(req->data, err); | 189 | aead_request_complete(areq, err); |
189 | } | 190 | } |
190 | 191 | ||
191 | static int crypto_authenc_encrypt(struct aead_request *req) | 192 | static int crypto_authenc_encrypt(struct aead_request *req) |
@@ -216,14 +217,15 @@ static int crypto_authenc_encrypt(struct aead_request *req) | |||
216 | static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, | 217 | static void crypto_authenc_givencrypt_done(struct crypto_async_request *req, |
217 | int err) | 218 | int err) |
218 | { | 219 | { |
220 | struct aead_request *areq = req->data; | ||
221 | |||
219 | if (!err) { | 222 | if (!err) { |
220 | struct aead_request *areq = req->data; | ||
221 | struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); | 223 | struct skcipher_givcrypt_request *greq = aead_request_ctx(areq); |
222 | 224 | ||
223 | err = crypto_authenc_genicv(areq, greq->giv, 0); | 225 | err = crypto_authenc_genicv(areq, greq->giv, 0); |
224 | } | 226 | } |
225 | 227 | ||
226 | aead_request_complete(req->data, err); | 228 | aead_request_complete(areq, err); |
227 | } | 229 | } |
228 | 230 | ||
229 | static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) | 231 | static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req) |
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index bb7c51f712bd..7d2edf143f16 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
@@ -563,9 +563,6 @@ EXPORT_SYMBOL_GPL(unregister_hotplug_dock_device); | |||
563 | */ | 563 | */ |
564 | static int handle_eject_request(struct dock_station *ds, u32 event) | 564 | static int handle_eject_request(struct dock_station *ds, u32 event) |
565 | { | 565 | { |
566 | if (!dock_present(ds)) | ||
567 | return -ENODEV; | ||
568 | |||
569 | if (dock_in_progress(ds)) | 566 | if (dock_in_progress(ds)) |
570 | return -EBUSY; | 567 | return -EBUSY; |
571 | 568 | ||
@@ -573,8 +570,16 @@ static int handle_eject_request(struct dock_station *ds, u32 event) | |||
573 | * here we need to generate the undock | 570 | * here we need to generate the undock |
574 | * event prior to actually doing the undock | 571 | * event prior to actually doing the undock |
575 | * so that the device struct still exists. | 572 | * so that the device struct still exists. |
573 | * Also, even send the dock event if the | ||
574 | * device is not present anymore | ||
576 | */ | 575 | */ |
577 | dock_event(ds, event, UNDOCK_EVENT); | 576 | dock_event(ds, event, UNDOCK_EVENT); |
577 | |||
578 | if (!dock_present(ds)) { | ||
579 | complete_undock(ds); | ||
580 | return -ENODEV; | ||
581 | } | ||
582 | |||
578 | hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST); | 583 | hotplug_dock_devices(ds, ACPI_NOTIFY_EJECT_REQUEST); |
579 | undock(ds); | 584 | undock(ds); |
580 | eject_dock(ds); | 585 | eject_dock(ds); |
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index 5622aee996b2..13593f9f2197 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c | |||
@@ -110,6 +110,31 @@ static struct acpi_ec { | |||
110 | u8 handlers_installed; | 110 | u8 handlers_installed; |
111 | } *boot_ec, *first_ec; | 111 | } *boot_ec, *first_ec; |
112 | 112 | ||
113 | /* | ||
114 | * Some Asus system have exchanged ECDT data/command IO addresses. | ||
115 | */ | ||
116 | static int print_ecdt_error(const struct dmi_system_id *id) | ||
117 | { | ||
118 | printk(KERN_NOTICE PREFIX "%s detected - " | ||
119 | "ECDT has exchanged control/data I/O address\n", | ||
120 | id->ident); | ||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | static struct dmi_system_id __cpuinitdata ec_dmi_table[] = { | ||
125 | { | ||
126 | print_ecdt_error, "Asus L4R", { | ||
127 | DMI_MATCH(DMI_BIOS_VERSION, "1008.006"), | ||
128 | DMI_MATCH(DMI_PRODUCT_NAME, "L4R"), | ||
129 | DMI_MATCH(DMI_BOARD_NAME, "L4R") }, NULL}, | ||
130 | { | ||
131 | print_ecdt_error, "Asus M6R", { | ||
132 | DMI_MATCH(DMI_BIOS_VERSION, "0207"), | ||
133 | DMI_MATCH(DMI_PRODUCT_NAME, "M6R"), | ||
134 | DMI_MATCH(DMI_BOARD_NAME, "M6R") }, NULL}, | ||
135 | {}, | ||
136 | }; | ||
137 | |||
113 | /* -------------------------------------------------------------------------- | 138 | /* -------------------------------------------------------------------------- |
114 | Transaction Management | 139 | Transaction Management |
115 | -------------------------------------------------------------------------- */ | 140 | -------------------------------------------------------------------------- */ |
@@ -196,6 +221,8 @@ static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll) | |||
196 | return 0; | 221 | return 0; |
197 | msleep(1); | 222 | msleep(1); |
198 | } | 223 | } |
224 | if (acpi_ec_check_status(ec,event)) | ||
225 | return 0; | ||
199 | } | 226 | } |
200 | pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", | 227 | pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n", |
201 | acpi_ec_read_status(ec), | 228 | acpi_ec_read_status(ec), |
@@ -911,6 +938,15 @@ int __init acpi_ec_ecdt_probe(void) | |||
911 | pr_info(PREFIX "EC description table is found, configuring boot EC\n"); | 938 | pr_info(PREFIX "EC description table is found, configuring boot EC\n"); |
912 | boot_ec->command_addr = ecdt_ptr->control.address; | 939 | boot_ec->command_addr = ecdt_ptr->control.address; |
913 | boot_ec->data_addr = ecdt_ptr->data.address; | 940 | boot_ec->data_addr = ecdt_ptr->data.address; |
941 | if (dmi_check_system(ec_dmi_table)) { | ||
942 | /* | ||
943 | * If the board falls into ec_dmi_table, it means | ||
944 | * that ECDT table gives the incorrect command/status | ||
945 | * & data I/O address. Just fix it. | ||
946 | */ | ||
947 | boot_ec->data_addr = ecdt_ptr->control.address; | ||
948 | boot_ec->command_addr = ecdt_ptr->data.address; | ||
949 | } | ||
914 | boot_ec->gpe = ecdt_ptr->gpe; | 950 | boot_ec->gpe = ecdt_ptr->gpe; |
915 | boot_ec->handle = ACPI_ROOT_OBJECT; | 951 | boot_ec->handle = ACPI_ROOT_OBJECT; |
916 | acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle); | 952 | acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle); |
diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c index 2a32c843cb4a..8892b9824fae 100644 --- a/drivers/acpi/executer/exconfig.c +++ b/drivers/acpi/executer/exconfig.c | |||
@@ -479,5 +479,8 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle) | |||
479 | 479 | ||
480 | acpi_tb_set_table_loaded_flag(table_index, FALSE); | 480 | acpi_tb_set_table_loaded_flag(table_index, FALSE); |
481 | 481 | ||
482 | /* Table unloaded, remove a reference to the ddb_handle object */ | ||
483 | |||
484 | acpi_ut_remove_reference(ddb_handle); | ||
482 | return_ACPI_STATUS(AE_OK); | 485 | return_ACPI_STATUS(AE_OK); |
483 | } | 486 | } |
diff --git a/drivers/acpi/namespace/nsnames.c b/drivers/acpi/namespace/nsnames.c index 549db42f16cf..bd5773878009 100644 --- a/drivers/acpi/namespace/nsnames.c +++ b/drivers/acpi/namespace/nsnames.c | |||
@@ -56,13 +56,14 @@ ACPI_MODULE_NAME("nsnames") | |||
56 | * Size - Size of the pathname | 56 | * Size - Size of the pathname |
57 | * *name_buffer - Where to return the pathname | 57 | * *name_buffer - Where to return the pathname |
58 | * | 58 | * |
59 | * RETURN: Places the pathname into the name_buffer, in external format | 59 | * RETURN: Status |
60 | * Places the pathname into the name_buffer, in external format | ||
60 | * (name segments separated by path separators) | 61 | * (name segments separated by path separators) |
61 | * | 62 | * |
62 | * DESCRIPTION: Generate a full pathaname | 63 | * DESCRIPTION: Generate a full pathaname |
63 | * | 64 | * |
64 | ******************************************************************************/ | 65 | ******************************************************************************/ |
65 | void | 66 | acpi_status |
66 | acpi_ns_build_external_path(struct acpi_namespace_node *node, | 67 | acpi_ns_build_external_path(struct acpi_namespace_node *node, |
67 | acpi_size size, char *name_buffer) | 68 | acpi_size size, char *name_buffer) |
68 | { | 69 | { |
@@ -77,7 +78,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
77 | if (index < ACPI_NAME_SIZE) { | 78 | if (index < ACPI_NAME_SIZE) { |
78 | name_buffer[0] = AML_ROOT_PREFIX; | 79 | name_buffer[0] = AML_ROOT_PREFIX; |
79 | name_buffer[1] = 0; | 80 | name_buffer[1] = 0; |
80 | return; | 81 | return (AE_OK); |
81 | } | 82 | } |
82 | 83 | ||
83 | /* Store terminator byte, then build name backwards */ | 84 | /* Store terminator byte, then build name backwards */ |
@@ -105,11 +106,13 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
105 | 106 | ||
106 | if (index != 0) { | 107 | if (index != 0) { |
107 | ACPI_ERROR((AE_INFO, | 108 | ACPI_ERROR((AE_INFO, |
108 | "Could not construct pathname; index=%X, size=%X, Path=%s", | 109 | "Could not construct external pathname; index=%X, size=%X, Path=%s", |
109 | (u32) index, (u32) size, &name_buffer[size])); | 110 | (u32) index, (u32) size, &name_buffer[size])); |
111 | |||
112 | return (AE_BAD_PARAMETER); | ||
110 | } | 113 | } |
111 | 114 | ||
112 | return; | 115 | return (AE_OK); |
113 | } | 116 | } |
114 | 117 | ||
115 | #ifdef ACPI_DEBUG_OUTPUT | 118 | #ifdef ACPI_DEBUG_OUTPUT |
@@ -129,6 +132,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
129 | 132 | ||
130 | char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) | 133 | char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) |
131 | { | 134 | { |
135 | acpi_status status; | ||
132 | char *name_buffer; | 136 | char *name_buffer; |
133 | acpi_size size; | 137 | acpi_size size; |
134 | 138 | ||
@@ -138,8 +142,7 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) | |||
138 | 142 | ||
139 | size = acpi_ns_get_pathname_length(node); | 143 | size = acpi_ns_get_pathname_length(node); |
140 | if (!size) { | 144 | if (!size) { |
141 | ACPI_ERROR((AE_INFO, "Invalid node failure")); | 145 | return (NULL); |
142 | return_PTR(NULL); | ||
143 | } | 146 | } |
144 | 147 | ||
145 | /* Allocate a buffer to be returned to caller */ | 148 | /* Allocate a buffer to be returned to caller */ |
@@ -152,7 +155,11 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node) | |||
152 | 155 | ||
153 | /* Build the path in the allocated buffer */ | 156 | /* Build the path in the allocated buffer */ |
154 | 157 | ||
155 | acpi_ns_build_external_path(node, size, name_buffer); | 158 | status = acpi_ns_build_external_path(node, size, name_buffer); |
159 | if (ACPI_FAILURE(status)) { | ||
160 | return (NULL); | ||
161 | } | ||
162 | |||
156 | return_PTR(name_buffer); | 163 | return_PTR(name_buffer); |
157 | } | 164 | } |
158 | #endif | 165 | #endif |
@@ -186,7 +193,7 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node) | |||
186 | while (next_node && (next_node != acpi_gbl_root_node)) { | 193 | while (next_node && (next_node != acpi_gbl_root_node)) { |
187 | if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) { | 194 | if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) { |
188 | ACPI_ERROR((AE_INFO, | 195 | ACPI_ERROR((AE_INFO, |
189 | "Invalid NS Node (%p) while traversing path", | 196 | "Invalid Namespace Node (%p) while traversing namespace", |
190 | next_node)); | 197 | next_node)); |
191 | return 0; | 198 | return 0; |
192 | } | 199 | } |
@@ -234,8 +241,7 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle, | |||
234 | 241 | ||
235 | required_size = acpi_ns_get_pathname_length(node); | 242 | required_size = acpi_ns_get_pathname_length(node); |
236 | if (!required_size) { | 243 | if (!required_size) { |
237 | ACPI_ERROR((AE_INFO, "Invalid node failure")); | 244 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
238 | return_ACPI_STATUS(AE_ERROR); | ||
239 | } | 245 | } |
240 | 246 | ||
241 | /* Validate/Allocate/Clear caller buffer */ | 247 | /* Validate/Allocate/Clear caller buffer */ |
@@ -247,7 +253,11 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle, | |||
247 | 253 | ||
248 | /* Build the path in the caller buffer */ | 254 | /* Build the path in the caller buffer */ |
249 | 255 | ||
250 | acpi_ns_build_external_path(node, required_size, buffer->pointer); | 256 | status = |
257 | acpi_ns_build_external_path(node, required_size, buffer->pointer); | ||
258 | if (ACPI_FAILURE(status)) { | ||
259 | return_ACPI_STATUS(status); | ||
260 | } | ||
251 | 261 | ||
252 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n", | 262 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n", |
253 | (char *)buffer->pointer, (u32) required_size)); | 263 | (char *)buffer->pointer, (u32) required_size)); |
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c index 89f3b2abfdc7..cf47805a7448 100644 --- a/drivers/acpi/pci_link.c +++ b/drivers/acpi/pci_link.c | |||
@@ -849,7 +849,7 @@ static int __init acpi_irq_penalty_update(char *str, int used) | |||
849 | if (irq < 0) | 849 | if (irq < 0) |
850 | continue; | 850 | continue; |
851 | 851 | ||
852 | if (irq >= ACPI_MAX_IRQS) | 852 | if (irq >= ARRAY_SIZE(acpi_irq_penalty)) |
853 | continue; | 853 | continue; |
854 | 854 | ||
855 | if (used) | 855 | if (used) |
@@ -872,10 +872,12 @@ static int __init acpi_irq_penalty_update(char *str, int used) | |||
872 | */ | 872 | */ |
873 | void acpi_penalize_isa_irq(int irq, int active) | 873 | void acpi_penalize_isa_irq(int irq, int active) |
874 | { | 874 | { |
875 | if (active) | 875 | if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) { |
876 | acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; | 876 | if (active) |
877 | else | 877 | acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED; |
878 | acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING; | 878 | else |
879 | acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING; | ||
880 | } | ||
879 | } | 881 | } |
880 | 882 | ||
881 | /* | 883 | /* |
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index e36422a7122c..d3f0a62efcc1 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c | |||
@@ -123,7 +123,7 @@ struct acpi_processor_errata errata __read_mostly; | |||
123 | static int set_no_mwait(const struct dmi_system_id *id) | 123 | static int set_no_mwait(const struct dmi_system_id *id) |
124 | { | 124 | { |
125 | printk(KERN_NOTICE PREFIX "%s detected - " | 125 | printk(KERN_NOTICE PREFIX "%s detected - " |
126 | "disable mwait for CPU C-stetes\n", id->ident); | 126 | "disabling mwait for CPU C-states\n", id->ident); |
127 | idle_nomwait = 1; | 127 | idle_nomwait = 1; |
128 | return 0; | 128 | return 0; |
129 | } | 129 | } |
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c index 283c08f5f4d4..cf5b1b7b684f 100644 --- a/drivers/acpi/processor_idle.c +++ b/drivers/acpi/processor_idle.c | |||
@@ -41,7 +41,6 @@ | |||
41 | #include <linux/pm_qos_params.h> | 41 | #include <linux/pm_qos_params.h> |
42 | #include <linux/clockchips.h> | 42 | #include <linux/clockchips.h> |
43 | #include <linux/cpuidle.h> | 43 | #include <linux/cpuidle.h> |
44 | #include <linux/cpuidle.h> | ||
45 | 44 | ||
46 | /* | 45 | /* |
47 | * Include the apic definitions for x86 to have the APIC timer related defines | 46 | * Include the apic definitions for x86 to have the APIC timer related defines |
diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c index 0133af49cf06..80e32093e977 100644 --- a/drivers/acpi/processor_perflib.c +++ b/drivers/acpi/processor_perflib.c | |||
@@ -70,7 +70,7 @@ static DEFINE_MUTEX(performance_mutex); | |||
70 | * 0 -> cpufreq low level drivers initialized -> consider _PPC values | 70 | * 0 -> cpufreq low level drivers initialized -> consider _PPC values |
71 | * 1 -> ignore _PPC totally -> forced by user through boot param | 71 | * 1 -> ignore _PPC totally -> forced by user through boot param |
72 | */ | 72 | */ |
73 | static unsigned int ignore_ppc = -1; | 73 | static int ignore_ppc = -1; |
74 | module_param(ignore_ppc, uint, 0644); | 74 | module_param(ignore_ppc, uint, 0644); |
75 | MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ | 75 | MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \ |
76 | "limited by BIOS, this should help"); | 76 | "limited by BIOS, this should help"); |
diff --git a/drivers/acpi/resources/rscalc.c b/drivers/acpi/resources/rscalc.c index f61ebc679e66..d9063ea414e3 100644 --- a/drivers/acpi/resources/rscalc.c +++ b/drivers/acpi/resources/rscalc.c | |||
@@ -587,6 +587,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object, | |||
587 | } else { | 587 | } else { |
588 | temp_size_needed += | 588 | temp_size_needed += |
589 | acpi_ns_get_pathname_length((*sub_object_list)->reference.node); | 589 | acpi_ns_get_pathname_length((*sub_object_list)->reference.node); |
590 | if (!temp_size_needed) { | ||
591 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
592 | } | ||
590 | } | 593 | } |
591 | } else { | 594 | } else { |
592 | /* | 595 | /* |
diff --git a/drivers/acpi/utilities/utalloc.c b/drivers/acpi/utilities/utalloc.c index e7bf34a7b1d2..7dcb67e0b215 100644 --- a/drivers/acpi/utilities/utalloc.c +++ b/drivers/acpi/utilities/utalloc.c | |||
@@ -242,10 +242,12 @@ acpi_ut_initialize_buffer(struct acpi_buffer * buffer, | |||
242 | { | 242 | { |
243 | acpi_status status = AE_OK; | 243 | acpi_status status = AE_OK; |
244 | 244 | ||
245 | if (!required_length) { | 245 | /* Parameter validation */ |
246 | WARN_ON(1); | 246 | |
247 | return AE_ERROR; | 247 | if (!buffer || !required_length) { |
248 | return (AE_BAD_PARAMETER); | ||
248 | } | 249 | } |
250 | |||
249 | switch (buffer->length) { | 251 | switch (buffer->length) { |
250 | case ACPI_NO_BUFFER: | 252 | case ACPI_NO_BUFFER: |
251 | 253 | ||
diff --git a/drivers/acpi/utilities/utdelete.c b/drivers/acpi/utilities/utdelete.c index c5c791a575c9..42609d3a8aa9 100644 --- a/drivers/acpi/utilities/utdelete.c +++ b/drivers/acpi/utilities/utdelete.c | |||
@@ -135,6 +135,10 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object) | |||
135 | obj_pointer = object->package.elements; | 135 | obj_pointer = object->package.elements; |
136 | break; | 136 | break; |
137 | 137 | ||
138 | /* | ||
139 | * These objects have a possible list of notify handlers. | ||
140 | * Device object also may have a GPE block. | ||
141 | */ | ||
138 | case ACPI_TYPE_DEVICE: | 142 | case ACPI_TYPE_DEVICE: |
139 | 143 | ||
140 | if (object->device.gpe_block) { | 144 | if (object->device.gpe_block) { |
@@ -142,9 +146,14 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object) | |||
142 | gpe_block); | 146 | gpe_block); |
143 | } | 147 | } |
144 | 148 | ||
145 | /* Walk the handler list for this device */ | 149 | /*lint -fallthrough */ |
150 | |||
151 | case ACPI_TYPE_PROCESSOR: | ||
152 | case ACPI_TYPE_THERMAL: | ||
153 | |||
154 | /* Walk the notify handler list for this object */ | ||
146 | 155 | ||
147 | handler_desc = object->device.handler; | 156 | handler_desc = object->common_notify.handler; |
148 | while (handler_desc) { | 157 | while (handler_desc) { |
149 | next_desc = handler_desc->address_space.next; | 158 | next_desc = handler_desc->address_space.next; |
150 | acpi_ut_remove_reference(handler_desc); | 159 | acpi_ut_remove_reference(handler_desc); |
diff --git a/drivers/acpi/utilities/utobject.c b/drivers/acpi/utilities/utobject.c index e25484495e65..916eff399eb3 100644 --- a/drivers/acpi/utilities/utobject.c +++ b/drivers/acpi/utilities/utobject.c | |||
@@ -425,6 +425,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
425 | acpi_size * obj_length) | 425 | acpi_size * obj_length) |
426 | { | 426 | { |
427 | acpi_size length; | 427 | acpi_size length; |
428 | acpi_size size; | ||
428 | acpi_status status = AE_OK; | 429 | acpi_status status = AE_OK; |
429 | 430 | ||
430 | ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); | 431 | ACPI_FUNCTION_TRACE_PTR(ut_get_simple_object_size, internal_object); |
@@ -484,10 +485,14 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
484 | * Get the actual length of the full pathname to this object. | 485 | * Get the actual length of the full pathname to this object. |
485 | * The reference will be converted to the pathname to the object | 486 | * The reference will be converted to the pathname to the object |
486 | */ | 487 | */ |
487 | length += | 488 | size = |
488 | ACPI_ROUND_UP_TO_NATIVE_WORD | 489 | acpi_ns_get_pathname_length(internal_object-> |
489 | (acpi_ns_get_pathname_length | 490 | reference.node); |
490 | (internal_object->reference.node)); | 491 | if (!size) { |
492 | return_ACPI_STATUS(AE_BAD_PARAMETER); | ||
493 | } | ||
494 | |||
495 | length += ACPI_ROUND_UP_TO_NATIVE_WORD(size); | ||
491 | break; | 496 | break; |
492 | 497 | ||
493 | default: | 498 | default: |
diff --git a/drivers/acpi/wmi.c b/drivers/acpi/wmi.c index c33b1c6e93b1..cfe2c833474d 100644 --- a/drivers/acpi/wmi.c +++ b/drivers/acpi/wmi.c | |||
@@ -347,7 +347,7 @@ struct acpi_buffer *out) | |||
347 | strcpy(method, "WQ"); | 347 | strcpy(method, "WQ"); |
348 | strncat(method, block->object_id, 2); | 348 | strncat(method, block->object_id, 2); |
349 | 349 | ||
350 | status = acpi_evaluate_object(handle, method, NULL, out); | 350 | status = acpi_evaluate_object(handle, method, &input, out); |
351 | 351 | ||
352 | /* | 352 | /* |
353 | * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if | 353 | * If ACPI_WMI_EXPENSIVE, call the relevant WCxx method, even if |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index ef3e5522e1a4..c729e6988bbb 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -486,6 +486,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
486 | { PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */ | 486 | { PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */ |
487 | { PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */ | 487 | { PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */ |
488 | { PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */ | 488 | { PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */ |
489 | { PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */ | ||
490 | { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */ | ||
489 | 491 | ||
490 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ | 492 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ |
491 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 493 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
@@ -575,9 +577,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
575 | { PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */ | 577 | { PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */ |
576 | 578 | ||
577 | /* SiS */ | 579 | /* SiS */ |
578 | { PCI_VDEVICE(SI, 0x1184), board_ahci_nopmp }, /* SiS 966 */ | 580 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ |
579 | { PCI_VDEVICE(SI, 0x1185), board_ahci_nopmp }, /* SiS 968 */ | 581 | { PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 968 */ |
580 | { PCI_VDEVICE(SI, 0x0186), board_ahci_nopmp }, /* SiS 968 */ | 582 | { PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */ |
581 | 583 | ||
582 | /* Marvell */ | 584 | /* Marvell */ |
583 | { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ | 585 | { PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */ |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index c294121fd69e..b1d08a8f5003 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -275,6 +275,14 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
275 | { 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 275 | { 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, |
276 | /* SATA Controller IDE (ICH10) */ | 276 | /* SATA Controller IDE (ICH10) */ |
277 | { 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 277 | { 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
278 | /* SATA Controller IDE (PCH) */ | ||
279 | { 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
280 | /* SATA Controller IDE (PCH) */ | ||
281 | { 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
282 | /* SATA Controller IDE (PCH) */ | ||
283 | { 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
284 | /* SATA Controller IDE (PCH) */ | ||
285 | { 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
278 | 286 | ||
279 | { } /* terminate list */ | 287 | { } /* terminate list */ |
280 | }; | 288 | }; |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 5ba96c5052c8..79e3a8e7a84a 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -104,6 +104,7 @@ struct ata_force_param { | |||
104 | unsigned long xfer_mask; | 104 | unsigned long xfer_mask; |
105 | unsigned int horkage_on; | 105 | unsigned int horkage_on; |
106 | unsigned int horkage_off; | 106 | unsigned int horkage_off; |
107 | unsigned int lflags; | ||
107 | }; | 108 | }; |
108 | 109 | ||
109 | struct ata_force_ent { | 110 | struct ata_force_ent { |
@@ -196,22 +197,23 @@ void ata_force_cbl(struct ata_port *ap) | |||
196 | } | 197 | } |
197 | 198 | ||
198 | /** | 199 | /** |
199 | * ata_force_spd_limit - force SATA spd limit according to libata.force | 200 | * ata_force_link_limits - force link limits according to libata.force |
200 | * @link: ATA link of interest | 201 | * @link: ATA link of interest |
201 | * | 202 | * |
202 | * Force SATA spd limit according to libata.force and whine about | 203 | * Force link flags and SATA spd limit according to libata.force |
203 | * it. When only the port part is specified (e.g. 1:), the limit | 204 | * and whine about it. When only the port part is specified |
204 | * applies to all links connected to both the host link and all | 205 | * (e.g. 1:), the limit applies to all links connected to both |
205 | * fan-out ports connected via PMP. If the device part is | 206 | * the host link and all fan-out ports connected via PMP. If the |
206 | * specified as 0 (e.g. 1.00:), it specifies the first fan-out | 207 | * device part is specified as 0 (e.g. 1.00:), it specifies the |
207 | * link not the host link. Device number 15 always points to the | 208 | * first fan-out link not the host link. Device number 15 always |
208 | * host link whether PMP is attached or not. | 209 | * points to the host link whether PMP is attached or not. |
209 | * | 210 | * |
210 | * LOCKING: | 211 | * LOCKING: |
211 | * EH context. | 212 | * EH context. |
212 | */ | 213 | */ |
213 | static void ata_force_spd_limit(struct ata_link *link) | 214 | static void ata_force_link_limits(struct ata_link *link) |
214 | { | 215 | { |
216 | bool did_spd = false; | ||
215 | int linkno, i; | 217 | int linkno, i; |
216 | 218 | ||
217 | if (ata_is_host_link(link)) | 219 | if (ata_is_host_link(link)) |
@@ -228,13 +230,22 @@ static void ata_force_spd_limit(struct ata_link *link) | |||
228 | if (fe->device != -1 && fe->device != linkno) | 230 | if (fe->device != -1 && fe->device != linkno) |
229 | continue; | 231 | continue; |
230 | 232 | ||
231 | if (!fe->param.spd_limit) | 233 | /* only honor the first spd limit */ |
232 | continue; | 234 | if (!did_spd && fe->param.spd_limit) { |
235 | link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1; | ||
236 | ata_link_printk(link, KERN_NOTICE, | ||
237 | "FORCE: PHY spd limit set to %s\n", | ||
238 | fe->param.name); | ||
239 | did_spd = true; | ||
240 | } | ||
233 | 241 | ||
234 | link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1; | 242 | /* let lflags stack */ |
235 | ata_link_printk(link, KERN_NOTICE, | 243 | if (fe->param.lflags) { |
236 | "FORCE: PHY spd limit set to %s\n", fe->param.name); | 244 | link->flags |= fe->param.lflags; |
237 | return; | 245 | ata_link_printk(link, KERN_NOTICE, |
246 | "FORCE: link flag 0x%x forced -> 0x%x\n", | ||
247 | fe->param.lflags, link->flags); | ||
248 | } | ||
238 | } | 249 | } |
239 | } | 250 | } |
240 | 251 | ||
@@ -3277,7 +3288,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
3277 | dev->dma_mode = ata_xfer_mask2mode(dma_mask); | 3288 | dev->dma_mode = ata_xfer_mask2mode(dma_mask); |
3278 | 3289 | ||
3279 | found = 1; | 3290 | found = 1; |
3280 | if (dev->dma_mode != 0xff) | 3291 | if (ata_dma_enabled(dev)) |
3281 | used_dma = 1; | 3292 | used_dma = 1; |
3282 | } | 3293 | } |
3283 | if (!found) | 3294 | if (!found) |
@@ -3302,7 +3313,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev) | |||
3302 | 3313 | ||
3303 | /* step 3: set host DMA timings */ | 3314 | /* step 3: set host DMA timings */ |
3304 | ata_link_for_each_dev(dev, link) { | 3315 | ata_link_for_each_dev(dev, link) { |
3305 | if (!ata_dev_enabled(dev) || dev->dma_mode == 0xff) | 3316 | if (!ata_dev_enabled(dev) || !ata_dma_enabled(dev)) |
3306 | continue; | 3317 | continue; |
3307 | 3318 | ||
3308 | dev->xfer_mode = dev->dma_mode; | 3319 | dev->xfer_mode = dev->dma_mode; |
@@ -5188,19 +5199,18 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp) | |||
5188 | */ | 5199 | */ |
5189 | int sata_link_init_spd(struct ata_link *link) | 5200 | int sata_link_init_spd(struct ata_link *link) |
5190 | { | 5201 | { |
5191 | u32 scontrol; | ||
5192 | u8 spd; | 5202 | u8 spd; |
5193 | int rc; | 5203 | int rc; |
5194 | 5204 | ||
5195 | rc = sata_scr_read(link, SCR_CONTROL, &scontrol); | 5205 | rc = sata_scr_read(link, SCR_CONTROL, &link->saved_scontrol); |
5196 | if (rc) | 5206 | if (rc) |
5197 | return rc; | 5207 | return rc; |
5198 | 5208 | ||
5199 | spd = (scontrol >> 4) & 0xf; | 5209 | spd = (link->saved_scontrol >> 4) & 0xf; |
5200 | if (spd) | 5210 | if (spd) |
5201 | link->hw_sata_spd_limit &= (1 << spd) - 1; | 5211 | link->hw_sata_spd_limit &= (1 << spd) - 1; |
5202 | 5212 | ||
5203 | ata_force_spd_limit(link); | 5213 | ata_force_link_limits(link); |
5204 | 5214 | ||
5205 | link->sata_spd_limit = link->hw_sata_spd_limit; | 5215 | link->sata_spd_limit = link->hw_sata_spd_limit; |
5206 | 5216 | ||
@@ -5783,9 +5793,10 @@ static void ata_port_detach(struct ata_port *ap) | |||
5783 | ata_port_wait_eh(ap); | 5793 | ata_port_wait_eh(ap); |
5784 | 5794 | ||
5785 | /* EH is now guaranteed to see UNLOADING - EH context belongs | 5795 | /* EH is now guaranteed to see UNLOADING - EH context belongs |
5786 | * to us. Disable all existing devices. | 5796 | * to us. Restore SControl and disable all existing devices. |
5787 | */ | 5797 | */ |
5788 | ata_port_for_each_link(link, ap) { | 5798 | __ata_port_for_each_link(link, ap) { |
5799 | sata_scr_write(link, SCR_CONTROL, link->saved_scontrol); | ||
5789 | ata_link_for_each_dev(dev, link) | 5800 | ata_link_for_each_dev(dev, link) |
5790 | ata_dev_disable(dev); | 5801 | ata_dev_disable(dev); |
5791 | } | 5802 | } |
@@ -5991,6 +6002,9 @@ static int __init ata_parse_force_one(char **cur, | |||
5991 | { "udma133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) }, | 6002 | { "udma133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) }, |
5992 | { "udma/133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) }, | 6003 | { "udma/133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) }, |
5993 | { "udma7", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 7) }, | 6004 | { "udma7", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 7) }, |
6005 | { "nohrst", .lflags = ATA_LFLAG_NO_HRST }, | ||
6006 | { "nosrst", .lflags = ATA_LFLAG_NO_SRST }, | ||
6007 | { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, | ||
5994 | }; | 6008 | }; |
5995 | char *start = *cur, *p = *cur; | 6009 | char *start = *cur, *p = *cur; |
5996 | char *id, *val, *endp; | 6010 | char *id, *val, *endp; |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 58bdc538d229..c1db2f234d2e 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2040,7 +2040,7 @@ static void ata_eh_link_report(struct ata_link *link) | |||
2040 | } | 2040 | } |
2041 | 2041 | ||
2042 | if (ehc->i.serror) | 2042 | if (ehc->i.serror) |
2043 | ata_port_printk(ap, KERN_ERR, | 2043 | ata_link_printk(link, KERN_ERR, |
2044 | "SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n", | 2044 | "SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n", |
2045 | ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "", | 2045 | ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "", |
2046 | ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "", | 2046 | ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "", |
@@ -2171,18 +2171,12 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset, | |||
2171 | } | 2171 | } |
2172 | 2172 | ||
2173 | static int ata_eh_followup_srst_needed(struct ata_link *link, | 2173 | static int ata_eh_followup_srst_needed(struct ata_link *link, |
2174 | int rc, int classify, | 2174 | int rc, const unsigned int *classes) |
2175 | const unsigned int *classes) | ||
2176 | { | 2175 | { |
2177 | if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link)) | 2176 | if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link)) |
2178 | return 0; | 2177 | return 0; |
2179 | if (rc == -EAGAIN) { | 2178 | if (rc == -EAGAIN) |
2180 | if (classify) | 2179 | return 1; |
2181 | return 1; | ||
2182 | rc = 0; | ||
2183 | } | ||
2184 | if (rc != 0) | ||
2185 | return 0; | ||
2186 | if (sata_pmp_supported(link->ap) && ata_is_host_link(link)) | 2180 | if (sata_pmp_supported(link->ap) && ata_is_host_link(link)) |
2187 | return 1; | 2181 | return 1; |
2188 | return 0; | 2182 | return 0; |
@@ -2210,6 +2204,10 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2210 | */ | 2204 | */ |
2211 | while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX) | 2205 | while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX) |
2212 | max_tries++; | 2206 | max_tries++; |
2207 | if (link->flags & ATA_LFLAG_NO_HRST) | ||
2208 | hardreset = NULL; | ||
2209 | if (link->flags & ATA_LFLAG_NO_SRST) | ||
2210 | softreset = NULL; | ||
2213 | 2211 | ||
2214 | now = jiffies; | 2212 | now = jiffies; |
2215 | deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN); | 2213 | deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN); |
@@ -2247,10 +2245,10 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2247 | ehc->i.action &= ~ATA_EH_RESET; | 2245 | ehc->i.action &= ~ATA_EH_RESET; |
2248 | if (hardreset) { | 2246 | if (hardreset) { |
2249 | reset = hardreset; | 2247 | reset = hardreset; |
2250 | ehc->i.action = ATA_EH_HARDRESET; | 2248 | ehc->i.action |= ATA_EH_HARDRESET; |
2251 | } else if (softreset) { | 2249 | } else if (softreset) { |
2252 | reset = softreset; | 2250 | reset = softreset; |
2253 | ehc->i.action = ATA_EH_SOFTRESET; | 2251 | ehc->i.action |= ATA_EH_SOFTRESET; |
2254 | } | 2252 | } |
2255 | 2253 | ||
2256 | if (prereset) { | 2254 | if (prereset) { |
@@ -2305,9 +2303,11 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2305 | ehc->i.flags |= ATA_EHI_DID_SOFTRESET; | 2303 | ehc->i.flags |= ATA_EHI_DID_SOFTRESET; |
2306 | 2304 | ||
2307 | rc = ata_do_reset(link, reset, classes, deadline); | 2305 | rc = ata_do_reset(link, reset, classes, deadline); |
2306 | if (rc && rc != -EAGAIN) | ||
2307 | goto fail; | ||
2308 | 2308 | ||
2309 | if (reset == hardreset && | 2309 | if (reset == hardreset && |
2310 | ata_eh_followup_srst_needed(link, rc, classify, classes)) { | 2310 | ata_eh_followup_srst_needed(link, rc, classes)) { |
2311 | /* okay, let's do follow-up softreset */ | 2311 | /* okay, let's do follow-up softreset */ |
2312 | reset = softreset; | 2312 | reset = softreset; |
2313 | 2313 | ||
@@ -2322,10 +2322,6 @@ int ata_eh_reset(struct ata_link *link, int classify, | |||
2322 | ata_eh_about_to_do(link, NULL, ATA_EH_RESET); | 2322 | ata_eh_about_to_do(link, NULL, ATA_EH_RESET); |
2323 | rc = ata_do_reset(link, reset, classes, deadline); | 2323 | rc = ata_do_reset(link, reset, classes, deadline); |
2324 | } | 2324 | } |
2325 | |||
2326 | /* -EAGAIN can happen if we skipped followup SRST */ | ||
2327 | if (rc && rc != -EAGAIN) | ||
2328 | goto fail; | ||
2329 | } else { | 2325 | } else { |
2330 | if (verbose) | 2326 | if (verbose) |
2331 | ata_link_printk(link, KERN_INFO, "no reset method " | 2327 | ata_link_printk(link, KERN_INFO, "no reset method " |
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c index fbe605711554..eb919c16a03e 100644 --- a/drivers/ata/pata_acpi.c +++ b/drivers/ata/pata_acpi.c | |||
@@ -181,7 +181,7 @@ static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc) | |||
181 | 181 | ||
182 | if (adev != acpi->last) { | 182 | if (adev != acpi->last) { |
183 | pacpi_set_piomode(ap, adev); | 183 | pacpi_set_piomode(ap, adev); |
184 | if (adev->dma_mode) | 184 | if (ata_dma_enabled(adev)) |
185 | pacpi_set_dmamode(ap, adev); | 185 | pacpi_set_dmamode(ap, adev); |
186 | acpi->last = adev; | 186 | acpi->last = adev; |
187 | } | 187 | } |
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index d7de7baf58a8..e8a0d99d7356 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
@@ -183,7 +183,7 @@ static void atiixp_bmdma_start(struct ata_queued_cmd *qc) | |||
183 | u16 tmp16; | 183 | u16 tmp16; |
184 | 184 | ||
185 | pci_read_config_word(pdev, ATIIXP_IDE_UDMA_CONTROL, &tmp16); | 185 | pci_read_config_word(pdev, ATIIXP_IDE_UDMA_CONTROL, &tmp16); |
186 | if (adev->dma_mode >= XFER_UDMA_0) | 186 | if (ata_using_udma(adev)) |
187 | tmp16 |= (1 << dn); | 187 | tmp16 |= (1 << dn); |
188 | else | 188 | else |
189 | tmp16 &= ~(1 << dn); | 189 | tmp16 &= ~(1 << dn); |
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c index 744beebaaf49..0c4b271a9d5a 100644 --- a/drivers/ata/pata_cs5530.c +++ b/drivers/ata/pata_cs5530.c | |||
@@ -149,10 +149,10 @@ static unsigned int cs5530_qc_issue(struct ata_queued_cmd *qc) | |||
149 | struct ata_device *prev = ap->private_data; | 149 | struct ata_device *prev = ap->private_data; |
150 | 150 | ||
151 | /* See if the DMA settings could be wrong */ | 151 | /* See if the DMA settings could be wrong */ |
152 | if (adev->dma_mode != 0 && adev != prev && prev != NULL) { | 152 | if (ata_dma_enabled(adev) && adev != prev && prev != NULL) { |
153 | /* Maybe, but do the channels match MWDMA/UDMA ? */ | 153 | /* Maybe, but do the channels match MWDMA/UDMA ? */ |
154 | if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) || | 154 | if ((ata_using_udma(adev) && !ata_using_udma(prev)) || |
155 | (adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0)) | 155 | (ata_using_udma(prev) && !ata_using_udma(adev))) |
156 | /* Switch the mode bits */ | 156 | /* Switch the mode bits */ |
157 | cs5530_set_dmamode(ap, adev); | 157 | cs5530_set_dmamode(ap, adev); |
158 | } | 158 | } |
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index 27843c70eb9d..0221c9a46769 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
@@ -606,7 +606,7 @@ static void it821x_display_disk(int n, u8 *buf) | |||
606 | { | 606 | { |
607 | unsigned char id[41]; | 607 | unsigned char id[41]; |
608 | int mode = 0; | 608 | int mode = 0; |
609 | char *mtype; | 609 | char *mtype = ""; |
610 | char mbuf[8]; | 610 | char mbuf[8]; |
611 | char *cbl = "(40 wire cable)"; | 611 | char *cbl = "(40 wire cable)"; |
612 | 612 | ||
diff --git a/drivers/ata/pata_oldpiix.c b/drivers/ata/pata_oldpiix.c index e678af383d13..df64f2443001 100644 --- a/drivers/ata/pata_oldpiix.c +++ b/drivers/ata/pata_oldpiix.c | |||
@@ -198,7 +198,7 @@ static unsigned int oldpiix_qc_issue(struct ata_queued_cmd *qc) | |||
198 | 198 | ||
199 | if (adev != ap->private_data) { | 199 | if (adev != ap->private_data) { |
200 | oldpiix_set_piomode(ap, adev); | 200 | oldpiix_set_piomode(ap, adev); |
201 | if (adev->dma_mode) | 201 | if (ata_dma_enabled(adev)) |
202 | oldpiix_set_dmamode(ap, adev); | 202 | oldpiix_set_dmamode(ap, adev); |
203 | } | 203 | } |
204 | return ata_sff_qc_issue(qc); | 204 | return ata_sff_qc_issue(qc); |
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c index cbab397e3db7..0278fd2b8fb1 100644 --- a/drivers/ata/pata_sc1200.c +++ b/drivers/ata/pata_sc1200.c | |||
@@ -167,10 +167,10 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc) | |||
167 | struct ata_device *prev = ap->private_data; | 167 | struct ata_device *prev = ap->private_data; |
168 | 168 | ||
169 | /* See if the DMA settings could be wrong */ | 169 | /* See if the DMA settings could be wrong */ |
170 | if (adev->dma_mode != 0 && adev != prev && prev != NULL) { | 170 | if (ata_dma_enabled(adev) && adev != prev && prev != NULL) { |
171 | /* Maybe, but do the channels match MWDMA/UDMA ? */ | 171 | /* Maybe, but do the channels match MWDMA/UDMA ? */ |
172 | if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) || | 172 | if ((ata_using_udma(adev) && !ata_using_udma(prev)) || |
173 | (adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0)) | 173 | (ata_using_udma(prev) && !ata_using_udma(adev))) |
174 | /* Switch the mode bits */ | 174 | /* Switch the mode bits */ |
175 | sc1200_set_dmamode(ap, adev); | 175 | sc1200_set_dmamode(ap, adev); |
176 | } | 176 | } |
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index 57d951b11f2d..8fdb2ce73210 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
@@ -324,62 +324,26 @@ static void via_set_dmamode(struct ata_port *ap, struct ata_device *adev) | |||
324 | } | 324 | } |
325 | 325 | ||
326 | /** | 326 | /** |
327 | * via_ata_sff_tf_load - send taskfile registers to host controller | 327 | * via_tf_load - send taskfile registers to host controller |
328 | * @ap: Port to which output is sent | 328 | * @ap: Port to which output is sent |
329 | * @tf: ATA taskfile register set | 329 | * @tf: ATA taskfile register set |
330 | * | 330 | * |
331 | * Outputs ATA taskfile to standard ATA host controller. | 331 | * Outputs ATA taskfile to standard ATA host controller. |
332 | * | 332 | * |
333 | * Note: This is to fix the internal bug of via chipsets, which | 333 | * Note: This is to fix the internal bug of via chipsets, which |
334 | * will reset the device register after changing the IEN bit on | 334 | * will reset the device register after changing the IEN bit on |
335 | * ctl register | 335 | * ctl register |
336 | */ | 336 | */ |
337 | static void via_ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) | 337 | static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) |
338 | { | 338 | { |
339 | struct ata_ioports *ioaddr = &ap->ioaddr; | 339 | struct ata_taskfile tmp_tf; |
340 | unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR; | ||
341 | |||
342 | if (tf->ctl != ap->last_ctl) { | ||
343 | iowrite8(tf->ctl, ioaddr->ctl_addr); | ||
344 | iowrite8(tf->device, ioaddr->device_addr); | ||
345 | ap->last_ctl = tf->ctl; | ||
346 | ata_wait_idle(ap); | ||
347 | } | ||
348 | |||
349 | if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { | ||
350 | iowrite8(tf->hob_feature, ioaddr->feature_addr); | ||
351 | iowrite8(tf->hob_nsect, ioaddr->nsect_addr); | ||
352 | iowrite8(tf->hob_lbal, ioaddr->lbal_addr); | ||
353 | iowrite8(tf->hob_lbam, ioaddr->lbam_addr); | ||
354 | iowrite8(tf->hob_lbah, ioaddr->lbah_addr); | ||
355 | VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n", | ||
356 | tf->hob_feature, | ||
357 | tf->hob_nsect, | ||
358 | tf->hob_lbal, | ||
359 | tf->hob_lbam, | ||
360 | tf->hob_lbah); | ||
361 | } | ||
362 | 340 | ||
363 | if (is_addr) { | 341 | if (ap->ctl != ap->last_ctl && !(tf->flags & ATA_TFLAG_DEVICE)) { |
364 | iowrite8(tf->feature, ioaddr->feature_addr); | 342 | tmp_tf = *tf; |
365 | iowrite8(tf->nsect, ioaddr->nsect_addr); | 343 | tmp_tf.flags |= ATA_TFLAG_DEVICE; |
366 | iowrite8(tf->lbal, ioaddr->lbal_addr); | 344 | tf = &tmp_tf; |
367 | iowrite8(tf->lbam, ioaddr->lbam_addr); | ||
368 | iowrite8(tf->lbah, ioaddr->lbah_addr); | ||
369 | VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n", | ||
370 | tf->feature, | ||
371 | tf->nsect, | ||
372 | tf->lbal, | ||
373 | tf->lbam, | ||
374 | tf->lbah); | ||
375 | } | 345 | } |
376 | 346 | ata_sff_tf_load(ap, tf); | |
377 | if (tf->flags & ATA_TFLAG_DEVICE) { | ||
378 | iowrite8(tf->device, ioaddr->device_addr); | ||
379 | VPRINTK("device 0x%X\n", tf->device); | ||
380 | } | ||
381 | |||
382 | ata_wait_idle(ap); | ||
383 | } | 347 | } |
384 | 348 | ||
385 | static struct scsi_host_template via_sht = { | 349 | static struct scsi_host_template via_sht = { |
@@ -392,13 +356,12 @@ static struct ata_port_operations via_port_ops = { | |||
392 | .set_piomode = via_set_piomode, | 356 | .set_piomode = via_set_piomode, |
393 | .set_dmamode = via_set_dmamode, | 357 | .set_dmamode = via_set_dmamode, |
394 | .prereset = via_pre_reset, | 358 | .prereset = via_pre_reset, |
395 | .sff_tf_load = via_ata_tf_load, | 359 | .sff_tf_load = via_tf_load, |
396 | }; | 360 | }; |
397 | 361 | ||
398 | static struct ata_port_operations via_port_ops_noirq = { | 362 | static struct ata_port_operations via_port_ops_noirq = { |
399 | .inherits = &via_port_ops, | 363 | .inherits = &via_port_ops, |
400 | .sff_data_xfer = ata_sff_data_xfer_noirq, | 364 | .sff_data_xfer = ata_sff_data_xfer_noirq, |
401 | .sff_tf_load = via_ata_tf_load, | ||
402 | }; | 365 | }; |
403 | 366 | ||
404 | /** | 367 | /** |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index ad169ffbc4cb..13c1d2af18ac 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc) | |||
1134 | if (ap->nr_active_links == 0) | 1134 | if (ap->nr_active_links == 0) |
1135 | return 0; | 1135 | return 0; |
1136 | 1136 | ||
1137 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { | 1137 | /* |
1138 | /* | 1138 | * The port is operating in host queuing mode (EDMA) with NCQ |
1139 | * The port is operating in host queuing mode (EDMA). | 1139 | * enabled, allow multiple NCQ commands. EDMA also allows |
1140 | * It can accomodate a new qc if the qc protocol | 1140 | * queueing multiple DMA commands but libata core currently |
1141 | * is compatible with the current host queue mode. | 1141 | * doesn't allow it. |
1142 | */ | 1142 | */ |
1143 | if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) { | 1143 | if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) && |
1144 | /* | 1144 | (pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol)) |
1145 | * The host queue (EDMA) is in NCQ mode. | 1145 | return 0; |
1146 | * If the new qc is also an NCQ command, | 1146 | |
1147 | * then allow the new qc. | ||
1148 | */ | ||
1149 | if (qc->tf.protocol == ATA_PROT_NCQ) | ||
1150 | return 0; | ||
1151 | } else { | ||
1152 | /* | ||
1153 | * The host queue (EDMA) is in non-NCQ, DMA mode. | ||
1154 | * If the new qc is also a non-NCQ, DMA command, | ||
1155 | * then allow the new qc. | ||
1156 | */ | ||
1157 | if (qc->tf.protocol == ATA_PROT_DMA) | ||
1158 | return 0; | ||
1159 | } | ||
1160 | } | ||
1161 | return ATA_DEFER_PORT; | 1147 | return ATA_DEFER_PORT; |
1162 | } | 1148 | } |
1163 | 1149 | ||
@@ -3036,7 +3022,8 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | |||
3036 | break; | 3022 | break; |
3037 | case chip_soc: | 3023 | case chip_soc: |
3038 | hpriv->ops = &mv_soc_ops; | 3024 | hpriv->ops = &mv_soc_ops; |
3039 | hp_flags |= MV_HP_FLAG_SOC | MV_HP_ERRATA_60X1C0; | 3025 | hp_flags |= MV_HP_FLAG_SOC | MV_HP_GEN_IIE | |
3026 | MV_HP_ERRATA_60X1C0; | ||
3040 | break; | 3027 | break; |
3041 | 3028 | ||
3042 | default: | 3029 | default: |
diff --git a/drivers/atm/adummy.c b/drivers/atm/adummy.c index 2ebd07f2ef81..5effec6f5458 100644 --- a/drivers/atm/adummy.c +++ b/drivers/atm/adummy.c | |||
@@ -3,7 +3,6 @@ | |||
3 | */ | 3 | */ |
4 | 4 | ||
5 | #include <linux/module.h> | 5 | #include <linux/module.h> |
6 | #include <linux/version.h> | ||
7 | #include <linux/kernel.h> | 6 | #include <linux/kernel.h> |
8 | #include <linux/skbuff.h> | 7 | #include <linux/skbuff.h> |
9 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
diff --git a/drivers/base/class.c b/drivers/base/class.c index 5667c2f02c51..cc5e28c8885c 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
@@ -295,6 +295,12 @@ int class_for_each_device(struct class *class, struct device *start, | |||
295 | 295 | ||
296 | if (!class) | 296 | if (!class) |
297 | return -EINVAL; | 297 | return -EINVAL; |
298 | if (!class->p) { | ||
299 | WARN(1, "%s called for class '%s' before it was initialized", | ||
300 | __func__, class->name); | ||
301 | return -EINVAL; | ||
302 | } | ||
303 | |||
298 | mutex_lock(&class->p->class_mutex); | 304 | mutex_lock(&class->p->class_mutex); |
299 | list_for_each_entry(dev, &class->p->class_devices, node) { | 305 | list_for_each_entry(dev, &class->p->class_devices, node) { |
300 | if (start) { | 306 | if (start) { |
@@ -344,6 +350,11 @@ struct device *class_find_device(struct class *class, struct device *start, | |||
344 | 350 | ||
345 | if (!class) | 351 | if (!class) |
346 | return NULL; | 352 | return NULL; |
353 | if (!class->p) { | ||
354 | WARN(1, "%s called for class '%s' before it was initialized", | ||
355 | __func__, class->name); | ||
356 | return NULL; | ||
357 | } | ||
347 | 358 | ||
348 | mutex_lock(&class->p->class_mutex); | 359 | mutex_lock(&class->p->class_mutex); |
349 | list_for_each_entry(dev, &class->p->class_devices, node) { | 360 | list_for_each_entry(dev, &class->p->class_devices, node) { |
diff --git a/drivers/base/core.c b/drivers/base/core.c index 068aa1c9538c..d021c98605b3 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -53,7 +53,7 @@ static inline int device_is_not_partition(struct device *dev) | |||
53 | * it is attached to. If it is not attached to a bus either, an empty | 53 | * it is attached to. If it is not attached to a bus either, an empty |
54 | * string will be returned. | 54 | * string will be returned. |
55 | */ | 55 | */ |
56 | const char *dev_driver_string(struct device *dev) | 56 | const char *dev_driver_string(const struct device *dev) |
57 | { | 57 | { |
58 | return dev->driver ? dev->driver->name : | 58 | return dev->driver ? dev->driver->name : |
59 | (dev->bus ? dev->bus->name : | 59 | (dev->bus ? dev->bus->name : |
@@ -541,6 +541,7 @@ void device_initialize(struct device *dev) | |||
541 | spin_lock_init(&dev->devres_lock); | 541 | spin_lock_init(&dev->devres_lock); |
542 | INIT_LIST_HEAD(&dev->devres_head); | 542 | INIT_LIST_HEAD(&dev->devres_head); |
543 | device_init_wakeup(dev, 0); | 543 | device_init_wakeup(dev, 0); |
544 | device_pm_init(dev); | ||
544 | set_dev_node(dev, -1); | 545 | set_dev_node(dev, -1); |
545 | } | 546 | } |
546 | 547 | ||
@@ -843,13 +844,19 @@ int device_add(struct device *dev) | |||
843 | { | 844 | { |
844 | struct device *parent = NULL; | 845 | struct device *parent = NULL; |
845 | struct class_interface *class_intf; | 846 | struct class_interface *class_intf; |
846 | int error; | 847 | int error = -EINVAL; |
847 | 848 | ||
848 | dev = get_device(dev); | 849 | dev = get_device(dev); |
849 | if (!dev || !strlen(dev->bus_id)) { | 850 | if (!dev) |
850 | error = -EINVAL; | 851 | goto done; |
851 | goto Done; | 852 | |
852 | } | 853 | /* Temporarily support init_name if it is set. |
854 | * It will override bus_id for now */ | ||
855 | if (dev->init_name) | ||
856 | dev_set_name(dev, "%s", dev->init_name); | ||
857 | |||
858 | if (!strlen(dev->bus_id)) | ||
859 | goto done; | ||
853 | 860 | ||
854 | pr_debug("device: '%s': %s\n", dev->bus_id, __func__); | 861 | pr_debug("device: '%s': %s\n", dev->bus_id, __func__); |
855 | 862 | ||
@@ -897,9 +904,10 @@ int device_add(struct device *dev) | |||
897 | error = bus_add_device(dev); | 904 | error = bus_add_device(dev); |
898 | if (error) | 905 | if (error) |
899 | goto BusError; | 906 | goto BusError; |
900 | error = device_pm_add(dev); | 907 | error = dpm_sysfs_add(dev); |
901 | if (error) | 908 | if (error) |
902 | goto PMError; | 909 | goto DPMError; |
910 | device_pm_add(dev); | ||
903 | kobject_uevent(&dev->kobj, KOBJ_ADD); | 911 | kobject_uevent(&dev->kobj, KOBJ_ADD); |
904 | bus_attach_device(dev); | 912 | bus_attach_device(dev); |
905 | if (parent) | 913 | if (parent) |
@@ -917,10 +925,10 @@ int device_add(struct device *dev) | |||
917 | class_intf->add_dev(dev, class_intf); | 925 | class_intf->add_dev(dev, class_intf); |
918 | mutex_unlock(&dev->class->p->class_mutex); | 926 | mutex_unlock(&dev->class->p->class_mutex); |
919 | } | 927 | } |
920 | Done: | 928 | done: |
921 | put_device(dev); | 929 | put_device(dev); |
922 | return error; | 930 | return error; |
923 | PMError: | 931 | DPMError: |
924 | bus_remove_device(dev); | 932 | bus_remove_device(dev); |
925 | BusError: | 933 | BusError: |
926 | if (dev->bus) | 934 | if (dev->bus) |
@@ -944,7 +952,7 @@ int device_add(struct device *dev) | |||
944 | cleanup_device_parent(dev); | 952 | cleanup_device_parent(dev); |
945 | if (parent) | 953 | if (parent) |
946 | put_device(parent); | 954 | put_device(parent); |
947 | goto Done; | 955 | goto done; |
948 | } | 956 | } |
949 | 957 | ||
950 | /** | 958 | /** |
@@ -1007,6 +1015,7 @@ void device_del(struct device *dev) | |||
1007 | struct class_interface *class_intf; | 1015 | struct class_interface *class_intf; |
1008 | 1016 | ||
1009 | device_pm_remove(dev); | 1017 | device_pm_remove(dev); |
1018 | dpm_sysfs_remove(dev); | ||
1010 | if (parent) | 1019 | if (parent) |
1011 | klist_del(&dev->knode_parent); | 1020 | klist_del(&dev->knode_parent); |
1012 | if (MAJOR(dev->devt)) { | 1021 | if (MAJOR(dev->devt)) { |
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 2ef5acf4368b..1e2bda780e48 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c | |||
@@ -16,9 +16,6 @@ | |||
16 | #include <linux/string.h> | 16 | #include <linux/string.h> |
17 | #include "base.h" | 17 | #include "base.h" |
18 | 18 | ||
19 | #define to_dev(node) container_of(node, struct device, driver_list) | ||
20 | |||
21 | |||
22 | static struct device *next_device(struct klist_iter *i) | 19 | static struct device *next_device(struct klist_iter *i) |
23 | { | 20 | { |
24 | struct klist_node *n = klist_next(i); | 21 | struct klist_node *n = klist_next(i); |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 3250c5257b74..273a944d4040 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -67,20 +67,16 @@ void device_pm_unlock(void) | |||
67 | * device_pm_add - add a device to the list of active devices | 67 | * device_pm_add - add a device to the list of active devices |
68 | * @dev: Device to be added to the list | 68 | * @dev: Device to be added to the list |
69 | */ | 69 | */ |
70 | int device_pm_add(struct device *dev) | 70 | void device_pm_add(struct device *dev) |
71 | { | 71 | { |
72 | int error; | ||
73 | |||
74 | pr_debug("PM: Adding info for %s:%s\n", | 72 | pr_debug("PM: Adding info for %s:%s\n", |
75 | dev->bus ? dev->bus->name : "No Bus", | 73 | dev->bus ? dev->bus->name : "No Bus", |
76 | kobject_name(&dev->kobj)); | 74 | kobject_name(&dev->kobj)); |
77 | mutex_lock(&dpm_list_mtx); | 75 | mutex_lock(&dpm_list_mtx); |
78 | if (dev->parent) { | 76 | if (dev->parent) { |
79 | if (dev->parent->power.status >= DPM_SUSPENDING) { | 77 | if (dev->parent->power.status >= DPM_SUSPENDING) |
80 | dev_warn(dev, "parent %s is sleeping, will not add\n", | 78 | dev_warn(dev, "parent %s should not be sleeping\n", |
81 | dev->parent->bus_id); | 79 | dev->parent->bus_id); |
82 | WARN_ON(true); | ||
83 | } | ||
84 | } else if (transition_started) { | 80 | } else if (transition_started) { |
85 | /* | 81 | /* |
86 | * We refuse to register parentless devices while a PM | 82 | * We refuse to register parentless devices while a PM |
@@ -89,13 +85,9 @@ int device_pm_add(struct device *dev) | |||
89 | */ | 85 | */ |
90 | WARN_ON(true); | 86 | WARN_ON(true); |
91 | } | 87 | } |
92 | error = dpm_sysfs_add(dev); | 88 | |
93 | if (!error) { | 89 | list_add_tail(&dev->power.entry, &dpm_list); |
94 | dev->power.status = DPM_ON; | ||
95 | list_add_tail(&dev->power.entry, &dpm_list); | ||
96 | } | ||
97 | mutex_unlock(&dpm_list_mtx); | 90 | mutex_unlock(&dpm_list_mtx); |
98 | return error; | ||
99 | } | 91 | } |
100 | 92 | ||
101 | /** | 93 | /** |
@@ -110,7 +102,6 @@ void device_pm_remove(struct device *dev) | |||
110 | dev->bus ? dev->bus->name : "No Bus", | 102 | dev->bus ? dev->bus->name : "No Bus", |
111 | kobject_name(&dev->kobj)); | 103 | kobject_name(&dev->kobj)); |
112 | mutex_lock(&dpm_list_mtx); | 104 | mutex_lock(&dpm_list_mtx); |
113 | dpm_sysfs_remove(dev); | ||
114 | list_del_init(&dev->power.entry); | 105 | list_del_init(&dev->power.entry); |
115 | mutex_unlock(&dpm_list_mtx); | 106 | mutex_unlock(&dpm_list_mtx); |
116 | } | 107 | } |
diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h index a3252c0e2887..41f51fae042f 100644 --- a/drivers/base/power/power.h +++ b/drivers/base/power/power.h | |||
@@ -1,3 +1,8 @@ | |||
1 | static inline void device_pm_init(struct device *dev) | ||
2 | { | ||
3 | dev->power.status = DPM_ON; | ||
4 | } | ||
5 | |||
1 | #ifdef CONFIG_PM_SLEEP | 6 | #ifdef CONFIG_PM_SLEEP |
2 | 7 | ||
3 | /* | 8 | /* |
@@ -11,12 +16,12 @@ static inline struct device *to_device(struct list_head *entry) | |||
11 | return container_of(entry, struct device, power.entry); | 16 | return container_of(entry, struct device, power.entry); |
12 | } | 17 | } |
13 | 18 | ||
14 | extern int device_pm_add(struct device *); | 19 | extern void device_pm_add(struct device *); |
15 | extern void device_pm_remove(struct device *); | 20 | extern void device_pm_remove(struct device *); |
16 | 21 | ||
17 | #else /* CONFIG_PM_SLEEP */ | 22 | #else /* CONFIG_PM_SLEEP */ |
18 | 23 | ||
19 | static inline int device_pm_add(struct device *dev) { return 0; } | 24 | static inline void device_pm_add(struct device *dev) {} |
20 | static inline void device_pm_remove(struct device *dev) {} | 25 | static inline void device_pm_remove(struct device *dev) {} |
21 | 26 | ||
22 | #endif | 27 | #endif |
diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 24b97b0bef99..d070d492e385 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c | |||
@@ -571,8 +571,8 @@ out_free: | |||
571 | list_del(&brd->brd_list); | 571 | list_del(&brd->brd_list); |
572 | brd_free(brd); | 572 | brd_free(brd); |
573 | } | 573 | } |
574 | unregister_blkdev(RAMDISK_MAJOR, "ramdisk"); | ||
574 | 575 | ||
575 | unregister_blkdev(RAMDISK_MAJOR, "brd"); | ||
576 | return -ENOMEM; | 576 | return -ENOMEM; |
577 | } | 577 | } |
578 | 578 | ||
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index ad98dda6037d..1778e4a2c672 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
@@ -707,15 +707,15 @@ static int __init nbd_init(void) | |||
707 | 707 | ||
708 | BUILD_BUG_ON(sizeof(struct nbd_request) != 28); | 708 | BUILD_BUG_ON(sizeof(struct nbd_request) != 28); |
709 | 709 | ||
710 | nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL); | ||
711 | if (!nbd_dev) | ||
712 | return -ENOMEM; | ||
713 | |||
714 | if (max_part < 0) { | 710 | if (max_part < 0) { |
715 | printk(KERN_CRIT "nbd: max_part must be >= 0\n"); | 711 | printk(KERN_CRIT "nbd: max_part must be >= 0\n"); |
716 | return -EINVAL; | 712 | return -EINVAL; |
717 | } | 713 | } |
718 | 714 | ||
715 | nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL); | ||
716 | if (!nbd_dev) | ||
717 | return -ENOMEM; | ||
718 | |||
719 | part_shift = 0; | 719 | part_shift = 0; |
720 | if (max_part > 0) | 720 | if (max_part > 0) |
721 | part_shift = fls(max_part); | 721 | part_shift = fls(max_part); |
@@ -779,6 +779,7 @@ out: | |||
779 | blk_cleanup_queue(nbd_dev[i].disk->queue); | 779 | blk_cleanup_queue(nbd_dev[i].disk->queue); |
780 | put_disk(nbd_dev[i].disk); | 780 | put_disk(nbd_dev[i].disk); |
781 | } | 781 | } |
782 | kfree(nbd_dev); | ||
782 | return err; | 783 | return err; |
783 | } | 784 | } |
784 | 785 | ||
@@ -795,6 +796,7 @@ static void __exit nbd_cleanup(void) | |||
795 | } | 796 | } |
796 | } | 797 | } |
797 | unregister_blkdev(NBD_MAJOR, "nbd"); | 798 | unregister_blkdev(NBD_MAJOR, "nbd"); |
799 | kfree(nbd_dev); | ||
798 | printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR); | 800 | printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR); |
799 | } | 801 | } |
800 | 802 | ||
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig index a235ca787465..7cb4029a5375 100644 --- a/drivers/bluetooth/Kconfig +++ b/drivers/bluetooth/Kconfig | |||
@@ -3,8 +3,8 @@ menu "Bluetooth device drivers" | |||
3 | depends on BT | 3 | depends on BT |
4 | 4 | ||
5 | config BT_HCIUSB | 5 | config BT_HCIUSB |
6 | tristate "HCI USB driver" | 6 | tristate "HCI USB driver (old version)" |
7 | depends on USB | 7 | depends on USB && BT_HCIBTUSB=n |
8 | help | 8 | help |
9 | Bluetooth HCI USB driver. | 9 | Bluetooth HCI USB driver. |
10 | This driver is required if you want to use Bluetooth devices with | 10 | This driver is required if you want to use Bluetooth devices with |
@@ -23,15 +23,13 @@ config BT_HCIUSB_SCO | |||
23 | Say Y here to compile support for SCO over HCI USB. | 23 | Say Y here to compile support for SCO over HCI USB. |
24 | 24 | ||
25 | config BT_HCIBTUSB | 25 | config BT_HCIBTUSB |
26 | tristate "HCI USB driver (alternate version)" | 26 | tristate "HCI USB driver" |
27 | depends on USB && EXPERIMENTAL && BT_HCIUSB=n | 27 | depends on USB |
28 | help | 28 | help |
29 | Bluetooth HCI USB driver. | 29 | Bluetooth HCI USB driver. |
30 | This driver is required if you want to use Bluetooth devices with | 30 | This driver is required if you want to use Bluetooth devices with |
31 | USB interface. | 31 | USB interface. |
32 | 32 | ||
33 | This driver is still experimental and has no SCO support. | ||
34 | |||
35 | Say Y here to compile support for Bluetooth USB devices into the | 33 | Say Y here to compile support for Bluetooth USB devices into the |
36 | kernel or say M to compile it as module (btusb). | 34 | kernel or say M to compile it as module (btusb). |
37 | 35 | ||
diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 593b7c595038..27058477cc8b 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c | |||
@@ -60,7 +60,7 @@ | |||
60 | /* ======================== Module parameters ======================== */ | 60 | /* ======================== Module parameters ======================== */ |
61 | 61 | ||
62 | 62 | ||
63 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>"); | 63 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
64 | MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card"); | 64 | MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card"); |
65 | MODULE_LICENSE("GPL"); | 65 | MODULE_LICENSE("GPL"); |
66 | MODULE_FIRMWARE("BT3CPCC.bin"); | 66 | MODULE_FIRMWARE("BT3CPCC.bin"); |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 95ae9ba5661e..6a010681ecf3 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * | 2 | * |
3 | * Generic Bluetooth USB driver | 3 | * Generic Bluetooth USB driver |
4 | * | 4 | * |
5 | * Copyright (C) 2005-2007 Marcel Holtmann <marcel@holtmann.org> | 5 | * Copyright (C) 2005-2008 Marcel Holtmann <marcel@holtmann.org> |
6 | * | 6 | * |
7 | * | 7 | * |
8 | * This program is free software; you can redistribute it and/or modify | 8 | * This program is free software; you can redistribute it and/or modify |
@@ -41,7 +41,7 @@ | |||
41 | #define BT_DBG(D...) | 41 | #define BT_DBG(D...) |
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #define VERSION "0.2" | 44 | #define VERSION "0.3" |
45 | 45 | ||
46 | static int ignore_dga; | 46 | static int ignore_dga; |
47 | static int ignore_csr; | 47 | static int ignore_csr; |
@@ -160,12 +160,16 @@ static struct usb_device_id blacklist_table[] = { | |||
160 | { } /* Terminating entry */ | 160 | { } /* Terminating entry */ |
161 | }; | 161 | }; |
162 | 162 | ||
163 | #define BTUSB_MAX_ISOC_FRAMES 10 | ||
164 | |||
163 | #define BTUSB_INTR_RUNNING 0 | 165 | #define BTUSB_INTR_RUNNING 0 |
164 | #define BTUSB_BULK_RUNNING 1 | 166 | #define BTUSB_BULK_RUNNING 1 |
167 | #define BTUSB_ISOC_RUNNING 2 | ||
165 | 168 | ||
166 | struct btusb_data { | 169 | struct btusb_data { |
167 | struct hci_dev *hdev; | 170 | struct hci_dev *hdev; |
168 | struct usb_device *udev; | 171 | struct usb_device *udev; |
172 | struct usb_interface *isoc; | ||
169 | 173 | ||
170 | spinlock_t lock; | 174 | spinlock_t lock; |
171 | 175 | ||
@@ -176,10 +180,15 @@ struct btusb_data { | |||
176 | struct usb_anchor tx_anchor; | 180 | struct usb_anchor tx_anchor; |
177 | struct usb_anchor intr_anchor; | 181 | struct usb_anchor intr_anchor; |
178 | struct usb_anchor bulk_anchor; | 182 | struct usb_anchor bulk_anchor; |
183 | struct usb_anchor isoc_anchor; | ||
179 | 184 | ||
180 | struct usb_endpoint_descriptor *intr_ep; | 185 | struct usb_endpoint_descriptor *intr_ep; |
181 | struct usb_endpoint_descriptor *bulk_tx_ep; | 186 | struct usb_endpoint_descriptor *bulk_tx_ep; |
182 | struct usb_endpoint_descriptor *bulk_rx_ep; | 187 | struct usb_endpoint_descriptor *bulk_rx_ep; |
188 | struct usb_endpoint_descriptor *isoc_tx_ep; | ||
189 | struct usb_endpoint_descriptor *isoc_rx_ep; | ||
190 | |||
191 | int isoc_altsetting; | ||
183 | }; | 192 | }; |
184 | 193 | ||
185 | static void btusb_intr_complete(struct urb *urb) | 194 | static void btusb_intr_complete(struct urb *urb) |
@@ -195,6 +204,8 @@ static void btusb_intr_complete(struct urb *urb) | |||
195 | return; | 204 | return; |
196 | 205 | ||
197 | if (urb->status == 0) { | 206 | if (urb->status == 0) { |
207 | hdev->stat.byte_rx += urb->actual_length; | ||
208 | |||
198 | if (hci_recv_fragment(hdev, HCI_EVENT_PKT, | 209 | if (hci_recv_fragment(hdev, HCI_EVENT_PKT, |
199 | urb->transfer_buffer, | 210 | urb->transfer_buffer, |
200 | urb->actual_length) < 0) { | 211 | urb->actual_length) < 0) { |
@@ -216,7 +227,7 @@ static void btusb_intr_complete(struct urb *urb) | |||
216 | } | 227 | } |
217 | } | 228 | } |
218 | 229 | ||
219 | static inline int btusb_submit_intr_urb(struct hci_dev *hdev) | 230 | static int btusb_submit_intr_urb(struct hci_dev *hdev) |
220 | { | 231 | { |
221 | struct btusb_data *data = hdev->driver_data; | 232 | struct btusb_data *data = hdev->driver_data; |
222 | struct urb *urb; | 233 | struct urb *urb; |
@@ -226,6 +237,9 @@ static inline int btusb_submit_intr_urb(struct hci_dev *hdev) | |||
226 | 237 | ||
227 | BT_DBG("%s", hdev->name); | 238 | BT_DBG("%s", hdev->name); |
228 | 239 | ||
240 | if (!data->intr_ep) | ||
241 | return -ENODEV; | ||
242 | |||
229 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 243 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
230 | if (!urb) | 244 | if (!urb) |
231 | return -ENOMEM; | 245 | return -ENOMEM; |
@@ -274,6 +288,8 @@ static void btusb_bulk_complete(struct urb *urb) | |||
274 | return; | 288 | return; |
275 | 289 | ||
276 | if (urb->status == 0) { | 290 | if (urb->status == 0) { |
291 | hdev->stat.byte_rx += urb->actual_length; | ||
292 | |||
277 | if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT, | 293 | if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT, |
278 | urb->transfer_buffer, | 294 | urb->transfer_buffer, |
279 | urb->actual_length) < 0) { | 295 | urb->actual_length) < 0) { |
@@ -295,7 +311,7 @@ static void btusb_bulk_complete(struct urb *urb) | |||
295 | } | 311 | } |
296 | } | 312 | } |
297 | 313 | ||
298 | static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) | 314 | static int btusb_submit_bulk_urb(struct hci_dev *hdev) |
299 | { | 315 | { |
300 | struct btusb_data *data = hdev->driver_data; | 316 | struct btusb_data *data = hdev->driver_data; |
301 | struct urb *urb; | 317 | struct urb *urb; |
@@ -305,6 +321,9 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) | |||
305 | 321 | ||
306 | BT_DBG("%s", hdev->name); | 322 | BT_DBG("%s", hdev->name); |
307 | 323 | ||
324 | if (!data->bulk_rx_ep) | ||
325 | return -ENODEV; | ||
326 | |||
308 | urb = usb_alloc_urb(0, GFP_KERNEL); | 327 | urb = usb_alloc_urb(0, GFP_KERNEL); |
309 | if (!urb) | 328 | if (!urb) |
310 | return -ENOMEM; | 329 | return -ENOMEM; |
@@ -339,6 +358,127 @@ static inline int btusb_submit_bulk_urb(struct hci_dev *hdev) | |||
339 | return err; | 358 | return err; |
340 | } | 359 | } |
341 | 360 | ||
361 | static void btusb_isoc_complete(struct urb *urb) | ||
362 | { | ||
363 | struct hci_dev *hdev = urb->context; | ||
364 | struct btusb_data *data = hdev->driver_data; | ||
365 | int i, err; | ||
366 | |||
367 | BT_DBG("%s urb %p status %d count %d", hdev->name, | ||
368 | urb, urb->status, urb->actual_length); | ||
369 | |||
370 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | ||
371 | return; | ||
372 | |||
373 | if (urb->status == 0) { | ||
374 | for (i = 0; i < urb->number_of_packets; i++) { | ||
375 | unsigned int offset = urb->iso_frame_desc[i].offset; | ||
376 | unsigned int length = urb->iso_frame_desc[i].actual_length; | ||
377 | |||
378 | if (urb->iso_frame_desc[i].status) | ||
379 | continue; | ||
380 | |||
381 | hdev->stat.byte_rx += length; | ||
382 | |||
383 | if (hci_recv_fragment(hdev, HCI_SCODATA_PKT, | ||
384 | urb->transfer_buffer + offset, | ||
385 | length) < 0) { | ||
386 | BT_ERR("%s corrupted SCO packet", hdev->name); | ||
387 | hdev->stat.err_rx++; | ||
388 | } | ||
389 | } | ||
390 | } | ||
391 | |||
392 | if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags)) | ||
393 | return; | ||
394 | |||
395 | usb_anchor_urb(urb, &data->isoc_anchor); | ||
396 | |||
397 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
398 | if (err < 0) { | ||
399 | BT_ERR("%s urb %p failed to resubmit (%d)", | ||
400 | hdev->name, urb, -err); | ||
401 | usb_unanchor_urb(urb); | ||
402 | } | ||
403 | } | ||
404 | |||
405 | static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu) | ||
406 | { | ||
407 | int i, offset = 0; | ||
408 | |||
409 | BT_DBG("len %d mtu %d", len, mtu); | ||
410 | |||
411 | for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu; | ||
412 | i++, offset += mtu, len -= mtu) { | ||
413 | urb->iso_frame_desc[i].offset = offset; | ||
414 | urb->iso_frame_desc[i].length = mtu; | ||
415 | } | ||
416 | |||
417 | if (len && i < BTUSB_MAX_ISOC_FRAMES) { | ||
418 | urb->iso_frame_desc[i].offset = offset; | ||
419 | urb->iso_frame_desc[i].length = len; | ||
420 | i++; | ||
421 | } | ||
422 | |||
423 | urb->number_of_packets = i; | ||
424 | } | ||
425 | |||
426 | static int btusb_submit_isoc_urb(struct hci_dev *hdev) | ||
427 | { | ||
428 | struct btusb_data *data = hdev->driver_data; | ||
429 | struct urb *urb; | ||
430 | unsigned char *buf; | ||
431 | unsigned int pipe; | ||
432 | int err, size; | ||
433 | |||
434 | BT_DBG("%s", hdev->name); | ||
435 | |||
436 | if (!data->isoc_rx_ep) | ||
437 | return -ENODEV; | ||
438 | |||
439 | urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); | ||
440 | if (!urb) | ||
441 | return -ENOMEM; | ||
442 | |||
443 | size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * | ||
444 | BTUSB_MAX_ISOC_FRAMES; | ||
445 | |||
446 | buf = kmalloc(size, GFP_KERNEL); | ||
447 | if (!buf) { | ||
448 | usb_free_urb(urb); | ||
449 | return -ENOMEM; | ||
450 | } | ||
451 | |||
452 | pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); | ||
453 | |||
454 | urb->dev = data->udev; | ||
455 | urb->pipe = pipe; | ||
456 | urb->context = hdev; | ||
457 | urb->complete = btusb_isoc_complete; | ||
458 | urb->interval = data->isoc_rx_ep->bInterval; | ||
459 | |||
460 | urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; | ||
461 | urb->transfer_buffer = buf; | ||
462 | urb->transfer_buffer_length = size; | ||
463 | |||
464 | __fill_isoc_descriptor(urb, size, | ||
465 | le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); | ||
466 | |||
467 | usb_anchor_urb(urb, &data->isoc_anchor); | ||
468 | |||
469 | err = usb_submit_urb(urb, GFP_KERNEL); | ||
470 | if (err < 0) { | ||
471 | BT_ERR("%s urb %p submission failed (%d)", | ||
472 | hdev->name, urb, -err); | ||
473 | usb_unanchor_urb(urb); | ||
474 | kfree(buf); | ||
475 | } | ||
476 | |||
477 | usb_free_urb(urb); | ||
478 | |||
479 | return err; | ||
480 | } | ||
481 | |||
342 | static void btusb_tx_complete(struct urb *urb) | 482 | static void btusb_tx_complete(struct urb *urb) |
343 | { | 483 | { |
344 | struct sk_buff *skb = urb->context; | 484 | struct sk_buff *skb = urb->context; |
@@ -392,6 +532,9 @@ static int btusb_close(struct hci_dev *hdev) | |||
392 | if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) | 532 | if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) |
393 | return 0; | 533 | return 0; |
394 | 534 | ||
535 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||
536 | usb_kill_anchored_urbs(&data->intr_anchor); | ||
537 | |||
395 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); | 538 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); |
396 | usb_kill_anchored_urbs(&data->bulk_anchor); | 539 | usb_kill_anchored_urbs(&data->bulk_anchor); |
397 | 540 | ||
@@ -453,6 +596,9 @@ static int btusb_send_frame(struct sk_buff *skb) | |||
453 | break; | 596 | break; |
454 | 597 | ||
455 | case HCI_ACLDATA_PKT: | 598 | case HCI_ACLDATA_PKT: |
599 | if (!data->bulk_tx_ep || hdev->conn_hash.acl_num < 1) | ||
600 | return -ENODEV; | ||
601 | |||
456 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 602 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
457 | if (!urb) | 603 | if (!urb) |
458 | return -ENOMEM; | 604 | return -ENOMEM; |
@@ -467,9 +613,31 @@ static int btusb_send_frame(struct sk_buff *skb) | |||
467 | break; | 613 | break; |
468 | 614 | ||
469 | case HCI_SCODATA_PKT: | 615 | case HCI_SCODATA_PKT: |
616 | if (!data->isoc_tx_ep || hdev->conn_hash.sco_num < 1) | ||
617 | return -ENODEV; | ||
618 | |||
619 | urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_ATOMIC); | ||
620 | if (!urb) | ||
621 | return -ENOMEM; | ||
622 | |||
623 | pipe = usb_sndisocpipe(data->udev, | ||
624 | data->isoc_tx_ep->bEndpointAddress); | ||
625 | |||
626 | urb->dev = data->udev; | ||
627 | urb->pipe = pipe; | ||
628 | urb->context = skb; | ||
629 | urb->complete = btusb_tx_complete; | ||
630 | urb->interval = data->isoc_tx_ep->bInterval; | ||
631 | |||
632 | urb->transfer_flags = URB_ISO_ASAP; | ||
633 | urb->transfer_buffer = skb->data; | ||
634 | urb->transfer_buffer_length = skb->len; | ||
635 | |||
636 | __fill_isoc_descriptor(urb, skb->len, | ||
637 | le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); | ||
638 | |||
470 | hdev->stat.sco_tx++; | 639 | hdev->stat.sco_tx++; |
471 | kfree_skb(skb); | 640 | break; |
472 | return 0; | ||
473 | 641 | ||
474 | default: | 642 | default: |
475 | return -EILSEQ; | 643 | return -EILSEQ; |
@@ -508,22 +676,86 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt) | |||
508 | schedule_work(&data->work); | 676 | schedule_work(&data->work); |
509 | } | 677 | } |
510 | 678 | ||
679 | static int inline __set_isoc_interface(struct hci_dev *hdev, int altsetting) | ||
680 | { | ||
681 | struct btusb_data *data = hdev->driver_data; | ||
682 | struct usb_interface *intf = data->isoc; | ||
683 | struct usb_endpoint_descriptor *ep_desc; | ||
684 | int i, err; | ||
685 | |||
686 | if (!data->isoc) | ||
687 | return -ENODEV; | ||
688 | |||
689 | err = usb_set_interface(data->udev, 1, altsetting); | ||
690 | if (err < 0) { | ||
691 | BT_ERR("%s setting interface failed (%d)", hdev->name, -err); | ||
692 | return err; | ||
693 | } | ||
694 | |||
695 | data->isoc_altsetting = altsetting; | ||
696 | |||
697 | data->isoc_tx_ep = NULL; | ||
698 | data->isoc_rx_ep = NULL; | ||
699 | |||
700 | for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { | ||
701 | ep_desc = &intf->cur_altsetting->endpoint[i].desc; | ||
702 | |||
703 | if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { | ||
704 | data->isoc_tx_ep = ep_desc; | ||
705 | continue; | ||
706 | } | ||
707 | |||
708 | if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { | ||
709 | data->isoc_rx_ep = ep_desc; | ||
710 | continue; | ||
711 | } | ||
712 | } | ||
713 | |||
714 | if (!data->isoc_tx_ep || !data->isoc_rx_ep) { | ||
715 | BT_ERR("%s invalid SCO descriptors", hdev->name); | ||
716 | return -ENODEV; | ||
717 | } | ||
718 | |||
719 | return 0; | ||
720 | } | ||
721 | |||
511 | static void btusb_work(struct work_struct *work) | 722 | static void btusb_work(struct work_struct *work) |
512 | { | 723 | { |
513 | struct btusb_data *data = container_of(work, struct btusb_data, work); | 724 | struct btusb_data *data = container_of(work, struct btusb_data, work); |
514 | struct hci_dev *hdev = data->hdev; | 725 | struct hci_dev *hdev = data->hdev; |
515 | 726 | ||
516 | if (hdev->conn_hash.acl_num == 0) { | 727 | if (hdev->conn_hash.acl_num > 0) { |
728 | if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) { | ||
729 | if (btusb_submit_bulk_urb(hdev) < 0) | ||
730 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); | ||
731 | else | ||
732 | btusb_submit_bulk_urb(hdev); | ||
733 | } | ||
734 | } else { | ||
517 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); | 735 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); |
518 | usb_kill_anchored_urbs(&data->bulk_anchor); | 736 | usb_kill_anchored_urbs(&data->bulk_anchor); |
519 | return; | ||
520 | } | 737 | } |
521 | 738 | ||
522 | if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) { | 739 | if (hdev->conn_hash.sco_num > 0) { |
523 | if (btusb_submit_bulk_urb(hdev) < 0) | 740 | if (data->isoc_altsetting != 2) { |
524 | clear_bit(BTUSB_BULK_RUNNING, &data->flags); | 741 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); |
525 | else | 742 | usb_kill_anchored_urbs(&data->isoc_anchor); |
526 | btusb_submit_bulk_urb(hdev); | 743 | |
744 | if (__set_isoc_interface(hdev, 2) < 0) | ||
745 | return; | ||
746 | } | ||
747 | |||
748 | if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { | ||
749 | if (btusb_submit_isoc_urb(hdev) < 0) | ||
750 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||
751 | else | ||
752 | btusb_submit_isoc_urb(hdev); | ||
753 | } | ||
754 | } else { | ||
755 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | ||
756 | usb_kill_anchored_urbs(&data->isoc_anchor); | ||
757 | |||
758 | __set_isoc_interface(hdev, 0); | ||
527 | } | 759 | } |
528 | } | 760 | } |
529 | 761 | ||
@@ -597,6 +829,7 @@ static int btusb_probe(struct usb_interface *intf, | |||
597 | init_usb_anchor(&data->tx_anchor); | 829 | init_usb_anchor(&data->tx_anchor); |
598 | init_usb_anchor(&data->intr_anchor); | 830 | init_usb_anchor(&data->intr_anchor); |
599 | init_usb_anchor(&data->bulk_anchor); | 831 | init_usb_anchor(&data->bulk_anchor); |
832 | init_usb_anchor(&data->isoc_anchor); | ||
600 | 833 | ||
601 | hdev = hci_alloc_dev(); | 834 | hdev = hci_alloc_dev(); |
602 | if (!hdev) { | 835 | if (!hdev) { |
@@ -620,6 +853,9 @@ static int btusb_probe(struct usb_interface *intf, | |||
620 | 853 | ||
621 | hdev->owner = THIS_MODULE; | 854 | hdev->owner = THIS_MODULE; |
622 | 855 | ||
856 | /* interface numbers are hardcoded in the spec */ | ||
857 | data->isoc = usb_ifnum_to_if(data->udev, 1); | ||
858 | |||
623 | if (reset || id->driver_info & BTUSB_RESET) | 859 | if (reset || id->driver_info & BTUSB_RESET) |
624 | set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks); | 860 | set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks); |
625 | 861 | ||
@@ -628,11 +864,16 @@ static int btusb_probe(struct usb_interface *intf, | |||
628 | set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks); | 864 | set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks); |
629 | } | 865 | } |
630 | 866 | ||
867 | if (id->driver_info & BTUSB_BROKEN_ISOC) | ||
868 | data->isoc = NULL; | ||
869 | |||
631 | if (id->driver_info & BTUSB_SNIFFER) { | 870 | if (id->driver_info & BTUSB_SNIFFER) { |
632 | struct usb_device *udev = interface_to_usbdev(intf); | 871 | struct usb_device *udev = data->udev; |
633 | 872 | ||
634 | if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) | 873 | if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) |
635 | set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); | 874 | set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); |
875 | |||
876 | data->isoc = NULL; | ||
636 | } | 877 | } |
637 | 878 | ||
638 | if (id->driver_info & BTUSB_BCM92035) { | 879 | if (id->driver_info & BTUSB_BCM92035) { |
@@ -646,6 +887,16 @@ static int btusb_probe(struct usb_interface *intf, | |||
646 | } | 887 | } |
647 | } | 888 | } |
648 | 889 | ||
890 | if (data->isoc) { | ||
891 | err = usb_driver_claim_interface(&btusb_driver, | ||
892 | data->isoc, NULL); | ||
893 | if (err < 0) { | ||
894 | hci_free_dev(hdev); | ||
895 | kfree(data); | ||
896 | return err; | ||
897 | } | ||
898 | } | ||
899 | |||
649 | err = hci_register_dev(hdev); | 900 | err = hci_register_dev(hdev); |
650 | if (err < 0) { | 901 | if (err < 0) { |
651 | hci_free_dev(hdev); | 902 | hci_free_dev(hdev); |
@@ -670,6 +921,9 @@ static void btusb_disconnect(struct usb_interface *intf) | |||
670 | 921 | ||
671 | hdev = data->hdev; | 922 | hdev = data->hdev; |
672 | 923 | ||
924 | if (data->isoc) | ||
925 | usb_driver_release_interface(&btusb_driver, data->isoc); | ||
926 | |||
673 | usb_set_intfdata(intf, NULL); | 927 | usb_set_intfdata(intf, NULL); |
674 | 928 | ||
675 | hci_unregister_dev(hdev); | 929 | hci_unregister_dev(hdev); |
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 69df187d74ce..8dfcf77cb717 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c | |||
@@ -577,7 +577,7 @@ module_exit(hci_uart_exit); | |||
577 | module_param(reset, bool, 0644); | 577 | module_param(reset, bool, 0644); |
578 | MODULE_PARM_DESC(reset, "Send HCI reset command on initialization"); | 578 | MODULE_PARM_DESC(reset, "Send HCI reset command on initialization"); |
579 | 579 | ||
580 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 580 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
581 | MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION); | 581 | MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION); |
582 | MODULE_VERSION(VERSION); | 582 | MODULE_VERSION(VERSION); |
583 | MODULE_LICENSE("GPL"); | 583 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/bluetooth/hci_usb.c b/drivers/bluetooth/hci_usb.c index e397572bf574..3c453924f838 100644 --- a/drivers/bluetooth/hci_usb.c +++ b/drivers/bluetooth/hci_usb.c | |||
@@ -1130,7 +1130,7 @@ module_param(isoc, int, 0644); | |||
1130 | MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support"); | 1130 | MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support"); |
1131 | #endif | 1131 | #endif |
1132 | 1132 | ||
1133 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 1133 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
1134 | MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION); | 1134 | MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION); |
1135 | MODULE_VERSION(VERSION); | 1135 | MODULE_VERSION(VERSION); |
1136 | MODULE_LICENSE("GPL"); | 1136 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index d97700aa54a9..7320a71b6368 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c | |||
@@ -377,7 +377,7 @@ module_exit(vhci_exit); | |||
377 | module_param(minor, int, 0444); | 377 | module_param(minor, int, 0444); |
378 | MODULE_PARM_DESC(minor, "Miscellaneous minor device number"); | 378 | MODULE_PARM_DESC(minor, "Miscellaneous minor device number"); |
379 | 379 | ||
380 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 380 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
381 | MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION); | 381 | MODULE_DESCRIPTION("Bluetooth virtual HCI driver ver " VERSION); |
382 | MODULE_VERSION(VERSION); | 382 | MODULE_VERSION(VERSION); |
383 | MODULE_LICENSE("GPL"); | 383 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index d9d1b65d206c..74031de517e6 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -408,7 +408,6 @@ int register_cdrom(struct cdrom_device_info *cdi) | |||
408 | ENSURE(get_last_session, CDC_MULTI_SESSION); | 408 | ENSURE(get_last_session, CDC_MULTI_SESSION); |
409 | ENSURE(get_mcn, CDC_MCN); | 409 | ENSURE(get_mcn, CDC_MCN); |
410 | ENSURE(reset, CDC_RESET); | 410 | ENSURE(reset, CDC_RESET); |
411 | ENSURE(audio_ioctl, CDC_PLAY_AUDIO); | ||
412 | ENSURE(generic_packet, CDC_GENERIC_PACKET); | 411 | ENSURE(generic_packet, CDC_GENERIC_PACKET); |
413 | cdi->mc_flags = 0; | 412 | cdi->mc_flags = 0; |
414 | cdo->n_minors = 0; | 413 | cdo->n_minors = 0; |
@@ -2506,8 +2505,6 @@ static int cdrom_ioctl_get_subchnl(struct cdrom_device_info *cdi, | |||
2506 | 2505 | ||
2507 | /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ | 2506 | /* cdinfo(CD_DO_IOCTL,"entering CDROMSUBCHNL\n");*/ |
2508 | 2507 | ||
2509 | if (!CDROM_CAN(CDC_PLAY_AUDIO)) | ||
2510 | return -ENOSYS; | ||
2511 | if (copy_from_user(&q, argp, sizeof(q))) | 2508 | if (copy_from_user(&q, argp, sizeof(q))) |
2512 | return -EFAULT; | 2509 | return -EFAULT; |
2513 | 2510 | ||
@@ -2538,8 +2535,6 @@ static int cdrom_ioctl_read_tochdr(struct cdrom_device_info *cdi, | |||
2538 | 2535 | ||
2539 | /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ | 2536 | /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCHDR\n"); */ |
2540 | 2537 | ||
2541 | if (!CDROM_CAN(CDC_PLAY_AUDIO)) | ||
2542 | return -ENOSYS; | ||
2543 | if (copy_from_user(&header, argp, sizeof(header))) | 2538 | if (copy_from_user(&header, argp, sizeof(header))) |
2544 | return -EFAULT; | 2539 | return -EFAULT; |
2545 | 2540 | ||
@@ -2562,8 +2557,6 @@ static int cdrom_ioctl_read_tocentry(struct cdrom_device_info *cdi, | |||
2562 | 2557 | ||
2563 | /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ | 2558 | /* cdinfo(CD_DO_IOCTL, "entering CDROMREADTOCENTRY\n"); */ |
2564 | 2559 | ||
2565 | if (!CDROM_CAN(CDC_PLAY_AUDIO)) | ||
2566 | return -ENOSYS; | ||
2567 | if (copy_from_user(&entry, argp, sizeof(entry))) | 2560 | if (copy_from_user(&entry, argp, sizeof(entry))) |
2568 | return -EFAULT; | 2561 | return -EFAULT; |
2569 | 2562 | ||
diff --git a/drivers/cdrom/gdrom.c b/drivers/cdrom/gdrom.c index 1e0455bd6df9..1231d95aa695 100644 --- a/drivers/cdrom/gdrom.c +++ b/drivers/cdrom/gdrom.c | |||
@@ -471,6 +471,12 @@ cleanup_sense_final: | |||
471 | return err; | 471 | return err; |
472 | } | 472 | } |
473 | 473 | ||
474 | static int gdrom_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, | ||
475 | void *arg) | ||
476 | { | ||
477 | return -EINVAL; | ||
478 | } | ||
479 | |||
474 | static struct cdrom_device_ops gdrom_ops = { | 480 | static struct cdrom_device_ops gdrom_ops = { |
475 | .open = gdrom_open, | 481 | .open = gdrom_open, |
476 | .release = gdrom_release, | 482 | .release = gdrom_release, |
@@ -478,6 +484,7 @@ static struct cdrom_device_ops gdrom_ops = { | |||
478 | .media_changed = gdrom_mediachanged, | 484 | .media_changed = gdrom_mediachanged, |
479 | .get_last_session = gdrom_get_last_session, | 485 | .get_last_session = gdrom_get_last_session, |
480 | .reset = gdrom_hardreset, | 486 | .reset = gdrom_hardreset, |
487 | .audio_ioctl = gdrom_audio_ioctl, | ||
481 | .capability = CDC_MULTI_SESSION | CDC_MEDIA_CHANGED | | 488 | .capability = CDC_MULTI_SESSION | CDC_MEDIA_CHANGED | |
482 | CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R, | 489 | CDC_RESET | CDC_DRIVE_STATUS | CDC_CD_R, |
483 | .n_minors = 1, | 490 | .n_minors = 1, |
diff --git a/drivers/cdrom/viocd.c b/drivers/cdrom/viocd.c index 9d0dfe6e0d63..031e0e1a1a3b 100644 --- a/drivers/cdrom/viocd.c +++ b/drivers/cdrom/viocd.c | |||
@@ -550,12 +550,19 @@ return_complete: | |||
550 | } | 550 | } |
551 | } | 551 | } |
552 | 552 | ||
553 | static int viocd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, | ||
554 | void *arg) | ||
555 | { | ||
556 | return -EINVAL; | ||
557 | } | ||
558 | |||
553 | static struct cdrom_device_ops viocd_dops = { | 559 | static struct cdrom_device_ops viocd_dops = { |
554 | .open = viocd_open, | 560 | .open = viocd_open, |
555 | .release = viocd_release, | 561 | .release = viocd_release, |
556 | .media_changed = viocd_media_changed, | 562 | .media_changed = viocd_media_changed, |
557 | .lock_door = viocd_lock_door, | 563 | .lock_door = viocd_lock_door, |
558 | .generic_packet = viocd_packet, | 564 | .generic_packet = viocd_packet, |
565 | .audio_ioctl = viocd_audio_ioctl, | ||
559 | .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM | 566 | .capability = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_SELECT_DISC | CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO | CDC_RESET | CDC_DRIVE_STATUS | CDC_GENERIC_PACKET | CDC_CD_R | CDC_CD_RW | CDC_DVD | CDC_DVD_R | CDC_DVD_RAM | CDC_RAM |
560 | }; | 567 | }; |
561 | 568 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index f52931e1c16e..8e8afb6141f9 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -2695,15 +2695,13 @@ static __devinit void default_find_bmc(void) | |||
2695 | for (i = 0; ; i++) { | 2695 | for (i = 0; ; i++) { |
2696 | if (!ipmi_defaults[i].port) | 2696 | if (!ipmi_defaults[i].port) |
2697 | break; | 2697 | break; |
2698 | |||
2699 | info = kzalloc(sizeof(*info), GFP_KERNEL); | ||
2700 | if (!info) | ||
2701 | return; | ||
2702 | |||
2703 | #ifdef CONFIG_PPC_MERGE | 2698 | #ifdef CONFIG_PPC_MERGE |
2704 | if (check_legacy_ioport(ipmi_defaults[i].port)) | 2699 | if (check_legacy_ioport(ipmi_defaults[i].port)) |
2705 | continue; | 2700 | continue; |
2706 | #endif | 2701 | #endif |
2702 | info = kzalloc(sizeof(*info), GFP_KERNEL); | ||
2703 | if (!info) | ||
2704 | return; | ||
2707 | 2705 | ||
2708 | info->addr_source = NULL; | 2706 | info->addr_source = NULL; |
2709 | 2707 | ||
diff --git a/drivers/char/pcmcia/ipwireless/tty.c b/drivers/char/pcmcia/ipwireless/tty.c index b1414507997c..3a23e7694d55 100644 --- a/drivers/char/pcmcia/ipwireless/tty.c +++ b/drivers/char/pcmcia/ipwireless/tty.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/tty_driver.h> | 29 | #include <linux/tty_driver.h> |
30 | #include <linux/tty_flip.h> | 30 | #include <linux/tty_flip.h> |
31 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
32 | #include <linux/version.h> | ||
33 | 32 | ||
34 | #include "tty.h" | 33 | #include "tty.h" |
35 | #include "network.h" | 34 | #include "network.h" |
diff --git a/drivers/char/random.c b/drivers/char/random.c index e0d0e371909c..1838aa3d24fe 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c | |||
@@ -1571,6 +1571,7 @@ u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport) | |||
1571 | 1571 | ||
1572 | return half_md4_transform(hash, keyptr->secret); | 1572 | return half_md4_transform(hash, keyptr->secret); |
1573 | } | 1573 | } |
1574 | EXPORT_SYMBOL_GPL(secure_ipv4_port_ephemeral); | ||
1574 | 1575 | ||
1575 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 1576 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
1576 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, | 1577 | u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr, |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index 509c89ac5bd3..08911ed66494 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
@@ -47,7 +47,6 @@ | |||
47 | 47 | ||
48 | 48 | ||
49 | #include <linux/module.h> | 49 | #include <linux/module.h> |
50 | #include <linux/version.h> | ||
51 | #include <linux/errno.h> | 50 | #include <linux/errno.h> |
52 | #include <linux/signal.h> | 51 | #include <linux/signal.h> |
53 | #include <linux/sched.h> | 52 | #include <linux/sched.h> |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 0e6866fe0f96..a27160ba21d7 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -2496,45 +2496,25 @@ static int tiocgwinsz(struct tty_struct *tty, struct winsize __user *arg) | |||
2496 | } | 2496 | } |
2497 | 2497 | ||
2498 | /** | 2498 | /** |
2499 | * tiocswinsz - implement window size set ioctl | 2499 | * tty_do_resize - resize event |
2500 | * @tty; tty | 2500 | * @tty: tty being resized |
2501 | * @arg: user buffer for result | 2501 | * @real_tty: real tty (if using a pty/tty pair) |
2502 | * @rows: rows (character) | ||
2503 | * @cols: cols (character) | ||
2502 | * | 2504 | * |
2503 | * Copies the user idea of the window size to the kernel. Traditionally | 2505 | * Update the termios variables and send the neccessary signals to |
2504 | * this is just advisory information but for the Linux console it | 2506 | * peform a terminal resize correctly |
2505 | * actually has driver level meaning and triggers a VC resize. | ||
2506 | * | ||
2507 | * Locking: | ||
2508 | * Called function use the console_sem is used to ensure we do | ||
2509 | * not try and resize the console twice at once. | ||
2510 | * The tty->termios_mutex is used to ensure we don't double | ||
2511 | * resize and get confused. Lock order - tty->termios_mutex before | ||
2512 | * console sem | ||
2513 | */ | 2507 | */ |
2514 | 2508 | ||
2515 | static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, | 2509 | int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, |
2516 | struct winsize __user *arg) | 2510 | struct winsize *ws) |
2517 | { | 2511 | { |
2518 | struct winsize tmp_ws; | ||
2519 | struct pid *pgrp, *rpgrp; | 2512 | struct pid *pgrp, *rpgrp; |
2520 | unsigned long flags; | 2513 | unsigned long flags; |
2521 | 2514 | ||
2522 | if (copy_from_user(&tmp_ws, arg, sizeof(*arg))) | ||
2523 | return -EFAULT; | ||
2524 | |||
2525 | mutex_lock(&tty->termios_mutex); | 2515 | mutex_lock(&tty->termios_mutex); |
2526 | if (!memcmp(&tmp_ws, &tty->winsize, sizeof(*arg))) | 2516 | if (!memcmp(ws, &tty->winsize, sizeof(*ws))) |
2527 | goto done; | 2517 | goto done; |
2528 | |||
2529 | #ifdef CONFIG_VT | ||
2530 | if (tty->driver->type == TTY_DRIVER_TYPE_CONSOLE) { | ||
2531 | if (vc_lock_resize(tty->driver_data, tmp_ws.ws_col, | ||
2532 | tmp_ws.ws_row)) { | ||
2533 | mutex_unlock(&tty->termios_mutex); | ||
2534 | return -ENXIO; | ||
2535 | } | ||
2536 | } | ||
2537 | #endif | ||
2538 | /* Get the PID values and reference them so we can | 2518 | /* Get the PID values and reference them so we can |
2539 | avoid holding the tty ctrl lock while sending signals */ | 2519 | avoid holding the tty ctrl lock while sending signals */ |
2540 | spin_lock_irqsave(&tty->ctrl_lock, flags); | 2520 | spin_lock_irqsave(&tty->ctrl_lock, flags); |
@@ -2550,14 +2530,42 @@ static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, | |||
2550 | put_pid(pgrp); | 2530 | put_pid(pgrp); |
2551 | put_pid(rpgrp); | 2531 | put_pid(rpgrp); |
2552 | 2532 | ||
2553 | tty->winsize = tmp_ws; | 2533 | tty->winsize = *ws; |
2554 | real_tty->winsize = tmp_ws; | 2534 | real_tty->winsize = *ws; |
2555 | done: | 2535 | done: |
2556 | mutex_unlock(&tty->termios_mutex); | 2536 | mutex_unlock(&tty->termios_mutex); |
2557 | return 0; | 2537 | return 0; |
2558 | } | 2538 | } |
2559 | 2539 | ||
2560 | /** | 2540 | /** |
2541 | * tiocswinsz - implement window size set ioctl | ||
2542 | * @tty; tty | ||
2543 | * @arg: user buffer for result | ||
2544 | * | ||
2545 | * Copies the user idea of the window size to the kernel. Traditionally | ||
2546 | * this is just advisory information but for the Linux console it | ||
2547 | * actually has driver level meaning and triggers a VC resize. | ||
2548 | * | ||
2549 | * Locking: | ||
2550 | * Driver dependant. The default do_resize method takes the | ||
2551 | * tty termios mutex and ctrl_lock. The console takes its own lock | ||
2552 | * then calls into the default method. | ||
2553 | */ | ||
2554 | |||
2555 | static int tiocswinsz(struct tty_struct *tty, struct tty_struct *real_tty, | ||
2556 | struct winsize __user *arg) | ||
2557 | { | ||
2558 | struct winsize tmp_ws; | ||
2559 | if (copy_from_user(&tmp_ws, arg, sizeof(*arg))) | ||
2560 | return -EFAULT; | ||
2561 | |||
2562 | if (tty->ops->resize) | ||
2563 | return tty->ops->resize(tty, real_tty, &tmp_ws); | ||
2564 | else | ||
2565 | return tty_do_resize(tty, real_tty, &tmp_ws); | ||
2566 | } | ||
2567 | |||
2568 | /** | ||
2561 | * tioccons - allow admin to move logical console | 2569 | * tioccons - allow admin to move logical console |
2562 | * @file: the file to become console | 2570 | * @file: the file to become console |
2563 | * | 2571 | * |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index 1bc00c9d860d..60359c360912 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -803,7 +803,25 @@ static inline int resize_screen(struct vc_data *vc, int width, int height, | |||
803 | */ | 803 | */ |
804 | #define VC_RESIZE_MAXCOL (32767) | 804 | #define VC_RESIZE_MAXCOL (32767) |
805 | #define VC_RESIZE_MAXROW (32767) | 805 | #define VC_RESIZE_MAXROW (32767) |
806 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | 806 | |
807 | /** | ||
808 | * vc_do_resize - resizing method for the tty | ||
809 | * @tty: tty being resized | ||
810 | * @real_tty: real tty (different to tty if a pty/tty pair) | ||
811 | * @vc: virtual console private data | ||
812 | * @cols: columns | ||
813 | * @lines: lines | ||
814 | * | ||
815 | * Resize a virtual console, clipping according to the actual constraints. | ||
816 | * If the caller passes a tty structure then update the termios winsize | ||
817 | * information and perform any neccessary signal handling. | ||
818 | * | ||
819 | * Caller must hold the console semaphore. Takes the termios mutex and | ||
820 | * ctrl_lock of the tty IFF a tty is passed. | ||
821 | */ | ||
822 | |||
823 | static int vc_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, | ||
824 | struct vc_data *vc, unsigned int cols, unsigned int lines) | ||
807 | { | 825 | { |
808 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; | 826 | unsigned long old_origin, new_origin, new_scr_end, rlth, rrem, err = 0; |
809 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; | 827 | unsigned int old_cols, old_rows, old_row_size, old_screen_size; |
@@ -907,24 +925,15 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
907 | gotoxy(vc, vc->vc_x, vc->vc_y); | 925 | gotoxy(vc, vc->vc_x, vc->vc_y); |
908 | save_cur(vc); | 926 | save_cur(vc); |
909 | 927 | ||
910 | if (vc->vc_tty) { | 928 | if (tty) { |
911 | struct winsize ws, *cws = &vc->vc_tty->winsize; | 929 | /* Rewrite the requested winsize data with the actual |
912 | struct pid *pgrp = NULL; | 930 | resulting sizes */ |
913 | 931 | struct winsize ws; | |
914 | memset(&ws, 0, sizeof(ws)); | 932 | memset(&ws, 0, sizeof(ws)); |
915 | ws.ws_row = vc->vc_rows; | 933 | ws.ws_row = vc->vc_rows; |
916 | ws.ws_col = vc->vc_cols; | 934 | ws.ws_col = vc->vc_cols; |
917 | ws.ws_ypixel = vc->vc_scan_lines; | 935 | ws.ws_ypixel = vc->vc_scan_lines; |
918 | 936 | tty_do_resize(tty, real_tty, &ws); | |
919 | spin_lock_irq(&vc->vc_tty->ctrl_lock); | ||
920 | if ((ws.ws_row != cws->ws_row || ws.ws_col != cws->ws_col)) | ||
921 | pgrp = get_pid(vc->vc_tty->pgrp); | ||
922 | spin_unlock_irq(&vc->vc_tty->ctrl_lock); | ||
923 | if (pgrp) { | ||
924 | kill_pgrp(vc->vc_tty->pgrp, SIGWINCH, 1); | ||
925 | put_pid(pgrp); | ||
926 | } | ||
927 | *cws = ws; | ||
928 | } | 937 | } |
929 | 938 | ||
930 | if (CON_IS_VISIBLE(vc)) | 939 | if (CON_IS_VISIBLE(vc)) |
@@ -932,14 +941,47 @@ int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | |||
932 | return err; | 941 | return err; |
933 | } | 942 | } |
934 | 943 | ||
935 | int vc_lock_resize(struct vc_data *vc, unsigned int cols, unsigned int lines) | 944 | /** |
945 | * vc_resize - resize a VT | ||
946 | * @vc: virtual console | ||
947 | * @cols: columns | ||
948 | * @rows: rows | ||
949 | * | ||
950 | * Resize a virtual console as seen from the console end of things. We | ||
951 | * use the common vc_do_resize methods to update the structures. The | ||
952 | * caller must hold the console sem to protect console internals and | ||
953 | * vc->vc_tty | ||
954 | */ | ||
955 | |||
956 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int rows) | ||
957 | { | ||
958 | return vc_do_resize(vc->vc_tty, vc->vc_tty, vc, cols, rows); | ||
959 | } | ||
960 | |||
961 | /** | ||
962 | * vt_resize - resize a VT | ||
963 | * @tty: tty to resize | ||
964 | * @real_tty: tty if a pty/tty pair | ||
965 | * @ws: winsize attributes | ||
966 | * | ||
967 | * Resize a virtual terminal. This is called by the tty layer as we | ||
968 | * register our own handler for resizing. The mutual helper does all | ||
969 | * the actual work. | ||
970 | * | ||
971 | * Takes the console sem and the called methods then take the tty | ||
972 | * termios_mutex and the tty ctrl_lock in that order. | ||
973 | */ | ||
974 | |||
975 | int vt_resize(struct tty_struct *tty, struct tty_struct *real_tty, | ||
976 | struct winsize *ws) | ||
936 | { | 977 | { |
937 | int rc; | 978 | struct vc_data *vc = tty->driver_data; |
979 | int ret; | ||
938 | 980 | ||
939 | acquire_console_sem(); | 981 | acquire_console_sem(); |
940 | rc = vc_resize(vc, cols, lines); | 982 | ret = vc_do_resize(tty, real_tty, vc, ws->ws_col, ws->ws_row); |
941 | release_console_sem(); | 983 | release_console_sem(); |
942 | return rc; | 984 | return ret; |
943 | } | 985 | } |
944 | 986 | ||
945 | void vc_deallocate(unsigned int currcons) | 987 | void vc_deallocate(unsigned int currcons) |
@@ -2907,6 +2949,7 @@ static const struct tty_operations con_ops = { | |||
2907 | .start = con_start, | 2949 | .start = con_start, |
2908 | .throttle = con_throttle, | 2950 | .throttle = con_throttle, |
2909 | .unthrottle = con_unthrottle, | 2951 | .unthrottle = con_unthrottle, |
2952 | .resize = vt_resize, | ||
2910 | }; | 2953 | }; |
2911 | 2954 | ||
2912 | int __init vty_init(void) | 2955 | int __init vty_init(void) |
@@ -4061,7 +4104,6 @@ EXPORT_SYMBOL(default_blu); | |||
4061 | EXPORT_SYMBOL(update_region); | 4104 | EXPORT_SYMBOL(update_region); |
4062 | EXPORT_SYMBOL(redraw_screen); | 4105 | EXPORT_SYMBOL(redraw_screen); |
4063 | EXPORT_SYMBOL(vc_resize); | 4106 | EXPORT_SYMBOL(vc_resize); |
4064 | EXPORT_SYMBOL(vc_lock_resize); | ||
4065 | EXPORT_SYMBOL(fg_console); | 4107 | EXPORT_SYMBOL(fg_console); |
4066 | EXPORT_SYMBOL(console_blank_hook); | 4108 | EXPORT_SYMBOL(console_blank_hook); |
4067 | EXPORT_SYMBOL(console_blanked); | 4109 | EXPORT_SYMBOL(console_blanked); |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 3211afd9d57e..c904e9ad4a71 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
@@ -947,14 +947,16 @@ int vt_ioctl(struct tty_struct *tty, struct file * file, | |||
947 | get_user(cc, &vtsizes->v_cols)) | 947 | get_user(cc, &vtsizes->v_cols)) |
948 | ret = -EFAULT; | 948 | ret = -EFAULT; |
949 | else { | 949 | else { |
950 | acquire_console_sem(); | ||
950 | for (i = 0; i < MAX_NR_CONSOLES; i++) { | 951 | for (i = 0; i < MAX_NR_CONSOLES; i++) { |
951 | vc = vc_cons[i].d; | 952 | vc = vc_cons[i].d; |
952 | 953 | ||
953 | if (vc) { | 954 | if (vc) { |
954 | vc->vc_resize_user = 1; | 955 | vc->vc_resize_user = 1; |
955 | vc_lock_resize(vc_cons[i].d, cc, ll); | 956 | vc_resize(vc_cons[i].d, cc, ll); |
956 | } | 957 | } |
957 | } | 958 | } |
959 | release_console_sem(); | ||
958 | } | 960 | } |
959 | break; | 961 | break; |
960 | } | 962 | } |
diff --git a/drivers/char/xilinx_hwicap/buffer_icap.h b/drivers/char/xilinx_hwicap/buffer_icap.h index c5b1840906b2..8b0252bf06e2 100644 --- a/drivers/char/xilinx_hwicap/buffer_icap.h +++ b/drivers/char/xilinx_hwicap/buffer_icap.h | |||
@@ -38,7 +38,6 @@ | |||
38 | 38 | ||
39 | #include <linux/types.h> | 39 | #include <linux/types.h> |
40 | #include <linux/cdev.h> | 40 | #include <linux/cdev.h> |
41 | #include <linux/version.h> | ||
42 | #include <linux/platform_device.h> | 41 | #include <linux/platform_device.h> |
43 | 42 | ||
44 | #include <asm/io.h> | 43 | #include <asm/io.h> |
diff --git a/drivers/char/xilinx_hwicap/fifo_icap.h b/drivers/char/xilinx_hwicap/fifo_icap.h index ffabd3ba2bd8..62bda453c90b 100644 --- a/drivers/char/xilinx_hwicap/fifo_icap.h +++ b/drivers/char/xilinx_hwicap/fifo_icap.h | |||
@@ -38,7 +38,6 @@ | |||
38 | 38 | ||
39 | #include <linux/types.h> | 39 | #include <linux/types.h> |
40 | #include <linux/cdev.h> | 40 | #include <linux/cdev.h> |
41 | #include <linux/version.h> | ||
42 | #include <linux/platform_device.h> | 41 | #include <linux/platform_device.h> |
43 | 42 | ||
44 | #include <asm/io.h> | 43 | #include <asm/io.h> |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c index 8bfee5fb7223..278c9857bcf5 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c | |||
@@ -74,7 +74,6 @@ | |||
74 | * currently programmed in the FPGA. | 74 | * currently programmed in the FPGA. |
75 | */ | 75 | */ |
76 | 76 | ||
77 | #include <linux/version.h> | ||
78 | #include <linux/module.h> | 77 | #include <linux/module.h> |
79 | #include <linux/kernel.h> | 78 | #include <linux/kernel.h> |
80 | #include <linux/types.h> | 79 | #include <linux/types.h> |
diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.h b/drivers/char/xilinx_hwicap/xilinx_hwicap.h index 1f9c8b082dbe..24d0d9b938fb 100644 --- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h +++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h | |||
@@ -38,7 +38,6 @@ | |||
38 | 38 | ||
39 | #include <linux/types.h> | 39 | #include <linux/types.h> |
40 | #include <linux/cdev.h> | 40 | #include <linux/cdev.h> |
41 | #include <linux/version.h> | ||
42 | #include <linux/platform_device.h> | 41 | #include <linux/platform_device.h> |
43 | 42 | ||
44 | #include <asm/io.h> | 43 | #include <asm/io.h> |
diff --git a/drivers/cpuidle/governors/ladder.c b/drivers/cpuidle/governors/ladder.c index ba7b9a6b17a1..a4bec3f919aa 100644 --- a/drivers/cpuidle/governors/ladder.c +++ b/drivers/cpuidle/governors/ladder.c | |||
@@ -67,10 +67,17 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
67 | struct ladder_device *ldev = &__get_cpu_var(ladder_devices); | 67 | struct ladder_device *ldev = &__get_cpu_var(ladder_devices); |
68 | struct ladder_device_state *last_state; | 68 | struct ladder_device_state *last_state; |
69 | int last_residency, last_idx = ldev->last_state_idx; | 69 | int last_residency, last_idx = ldev->last_state_idx; |
70 | int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); | ||
70 | 71 | ||
71 | if (unlikely(!ldev)) | 72 | if (unlikely(!ldev)) |
72 | return 0; | 73 | return 0; |
73 | 74 | ||
75 | /* Special case when user has set very strict latency requirement */ | ||
76 | if (unlikely(latency_req == 0)) { | ||
77 | ladder_do_selection(ldev, last_idx, 0); | ||
78 | return 0; | ||
79 | } | ||
80 | |||
74 | last_state = &ldev->states[last_idx]; | 81 | last_state = &ldev->states[last_idx]; |
75 | 82 | ||
76 | if (dev->states[last_idx].flags & CPUIDLE_FLAG_TIME_VALID) | 83 | if (dev->states[last_idx].flags & CPUIDLE_FLAG_TIME_VALID) |
@@ -81,8 +88,7 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
81 | /* consider promotion */ | 88 | /* consider promotion */ |
82 | if (last_idx < dev->state_count - 1 && | 89 | if (last_idx < dev->state_count - 1 && |
83 | last_residency > last_state->threshold.promotion_time && | 90 | last_residency > last_state->threshold.promotion_time && |
84 | dev->states[last_idx + 1].exit_latency <= | 91 | dev->states[last_idx + 1].exit_latency <= latency_req) { |
85 | pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) { | ||
86 | last_state->stats.promotion_count++; | 92 | last_state->stats.promotion_count++; |
87 | last_state->stats.demotion_count = 0; | 93 | last_state->stats.demotion_count = 0; |
88 | if (last_state->stats.promotion_count >= last_state->threshold.promotion_count) { | 94 | if (last_state->stats.promotion_count >= last_state->threshold.promotion_count) { |
@@ -92,7 +98,19 @@ static int ladder_select_state(struct cpuidle_device *dev) | |||
92 | } | 98 | } |
93 | 99 | ||
94 | /* consider demotion */ | 100 | /* consider demotion */ |
95 | if (last_idx > 0 && | 101 | if (last_idx > CPUIDLE_DRIVER_STATE_START && |
102 | dev->states[last_idx].exit_latency > latency_req) { | ||
103 | int i; | ||
104 | |||
105 | for (i = last_idx - 1; i > CPUIDLE_DRIVER_STATE_START; i--) { | ||
106 | if (dev->states[i].exit_latency <= latency_req) | ||
107 | break; | ||
108 | } | ||
109 | ladder_do_selection(ldev, last_idx, i); | ||
110 | return i; | ||
111 | } | ||
112 | |||
113 | if (last_idx > CPUIDLE_DRIVER_STATE_START && | ||
96 | last_residency < last_state->threshold.demotion_time) { | 114 | last_residency < last_state->threshold.demotion_time) { |
97 | last_state->stats.demotion_count++; | 115 | last_state->stats.demotion_count++; |
98 | last_state->stats.promotion_count = 0; | 116 | last_state->stats.promotion_count = 0; |
@@ -117,7 +135,7 @@ static int ladder_enable_device(struct cpuidle_device *dev) | |||
117 | struct ladder_device_state *lstate; | 135 | struct ladder_device_state *lstate; |
118 | struct cpuidle_state *state; | 136 | struct cpuidle_state *state; |
119 | 137 | ||
120 | ldev->last_state_idx = 0; | 138 | ldev->last_state_idx = CPUIDLE_DRIVER_STATE_START; |
121 | 139 | ||
122 | for (i = 0; i < dev->state_count; i++) { | 140 | for (i = 0; i < dev->state_count; i++) { |
123 | state = &dev->states[i]; | 141 | state = &dev->states[i]; |
diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c index 78d77c5dc35c..8d7cf3f31450 100644 --- a/drivers/cpuidle/governors/menu.c +++ b/drivers/cpuidle/governors/menu.c | |||
@@ -34,21 +34,28 @@ static DEFINE_PER_CPU(struct menu_device, menu_devices); | |||
34 | static int menu_select(struct cpuidle_device *dev) | 34 | static int menu_select(struct cpuidle_device *dev) |
35 | { | 35 | { |
36 | struct menu_device *data = &__get_cpu_var(menu_devices); | 36 | struct menu_device *data = &__get_cpu_var(menu_devices); |
37 | int latency_req = pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY); | ||
37 | int i; | 38 | int i; |
38 | 39 | ||
40 | /* Special case when user has set very strict latency requirement */ | ||
41 | if (unlikely(latency_req == 0)) { | ||
42 | data->last_state_idx = 0; | ||
43 | return 0; | ||
44 | } | ||
45 | |||
39 | /* determine the expected residency time */ | 46 | /* determine the expected residency time */ |
40 | data->expected_us = | 47 | data->expected_us = |
41 | (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000; | 48 | (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000; |
42 | 49 | ||
43 | /* find the deepest idle state that satisfies our constraints */ | 50 | /* find the deepest idle state that satisfies our constraints */ |
44 | for (i = 1; i < dev->state_count; i++) { | 51 | for (i = CPUIDLE_DRIVER_STATE_START + 1; i < dev->state_count; i++) { |
45 | struct cpuidle_state *s = &dev->states[i]; | 52 | struct cpuidle_state *s = &dev->states[i]; |
46 | 53 | ||
47 | if (s->target_residency > data->expected_us) | 54 | if (s->target_residency > data->expected_us) |
48 | break; | 55 | break; |
49 | if (s->target_residency > data->predicted_us) | 56 | if (s->target_residency > data->predicted_us) |
50 | break; | 57 | break; |
51 | if (s->exit_latency > pm_qos_requirement(PM_QOS_CPU_DMA_LATENCY)) | 58 | if (s->exit_latency > latency_req) |
52 | break; | 59 | break; |
53 | } | 60 | } |
54 | 61 | ||
@@ -67,9 +74,9 @@ static void menu_reflect(struct cpuidle_device *dev) | |||
67 | { | 74 | { |
68 | struct menu_device *data = &__get_cpu_var(menu_devices); | 75 | struct menu_device *data = &__get_cpu_var(menu_devices); |
69 | int last_idx = data->last_state_idx; | 76 | int last_idx = data->last_state_idx; |
70 | unsigned int measured_us = | 77 | unsigned int last_idle_us = cpuidle_get_last_residency(dev); |
71 | cpuidle_get_last_residency(dev) + data->elapsed_us; | ||
72 | struct cpuidle_state *target = &dev->states[last_idx]; | 78 | struct cpuidle_state *target = &dev->states[last_idx]; |
79 | unsigned int measured_us; | ||
73 | 80 | ||
74 | /* | 81 | /* |
75 | * Ugh, this idle state doesn't support residency measurements, so we | 82 | * Ugh, this idle state doesn't support residency measurements, so we |
@@ -77,20 +84,27 @@ static void menu_reflect(struct cpuidle_device *dev) | |||
77 | * for one full standard timer tick. However, be aware that this | 84 | * for one full standard timer tick. However, be aware that this |
78 | * could potentially result in a suboptimal state transition. | 85 | * could potentially result in a suboptimal state transition. |
79 | */ | 86 | */ |
80 | if (!(target->flags & CPUIDLE_FLAG_TIME_VALID)) | 87 | if (unlikely(!(target->flags & CPUIDLE_FLAG_TIME_VALID))) |
81 | measured_us = USEC_PER_SEC / HZ; | 88 | last_idle_us = USEC_PER_SEC / HZ; |
89 | |||
90 | /* | ||
91 | * measured_us and elapsed_us are the cumulative idle time, since the | ||
92 | * last time we were woken out of idle by an interrupt. | ||
93 | */ | ||
94 | if (data->elapsed_us <= data->elapsed_us + last_idle_us) | ||
95 | measured_us = data->elapsed_us + last_idle_us; | ||
96 | else | ||
97 | measured_us = -1; | ||
98 | |||
99 | /* Predict time until next break event */ | ||
100 | data->predicted_us = max(measured_us, data->last_measured_us); | ||
82 | 101 | ||
83 | /* Predict time remaining until next break event */ | 102 | if (last_idle_us + BREAK_FUZZ < |
84 | if (measured_us + BREAK_FUZZ < data->expected_us - target->exit_latency) { | 103 | data->expected_us - target->exit_latency) { |
85 | data->predicted_us = max(measured_us, data->last_measured_us); | ||
86 | data->last_measured_us = measured_us; | 104 | data->last_measured_us = measured_us; |
87 | data->elapsed_us = 0; | 105 | data->elapsed_us = 0; |
88 | } else { | 106 | } else { |
89 | if (data->elapsed_us < data->elapsed_us + measured_us) | 107 | data->elapsed_us = measured_us; |
90 | data->elapsed_us = measured_us; | ||
91 | else | ||
92 | data->elapsed_us = -1; | ||
93 | data->predicted_us = max(measured_us, data->last_measured_us); | ||
94 | } | 108 | } |
95 | } | 109 | } |
96 | 110 | ||
diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c index a4e4494663bf..0328da020a10 100644 --- a/drivers/dma/mv_xor.c +++ b/drivers/dma/mv_xor.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/interrupt.h> | 25 | #include <linux/interrupt.h> |
26 | #include <linux/platform_device.h> | 26 | #include <linux/platform_device.h> |
27 | #include <linux/memory.h> | 27 | #include <linux/memory.h> |
28 | #include <asm/plat-orion/mv_xor.h> | 28 | #include <plat/mv_xor.h> |
29 | #include "mv_xor.h" | 29 | #include "mv_xor.h" |
30 | 30 | ||
31 | static void mv_xor_issue_pending(struct dma_chan *chan); | 31 | static void mv_xor_issue_pending(struct dma_chan *chan); |
diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h index b27b13c5eb5a..4b55ec607a88 100644 --- a/drivers/edac/edac_core.h +++ b/drivers/edac/edac_core.h | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/platform_device.h> | 34 | #include <linux/platform_device.h> |
35 | #include <linux/sysdev.h> | 35 | #include <linux/sysdev.h> |
36 | #include <linux/workqueue.h> | 36 | #include <linux/workqueue.h> |
37 | #include <linux/version.h> | ||
38 | 37 | ||
39 | #define EDAC_MC_LABEL_LEN 31 | 38 | #define EDAC_MC_LABEL_LEN 31 |
40 | #define EDAC_DEVICE_NAME_LEN 31 | 39 | #define EDAC_DEVICE_NAME_LEN 31 |
diff --git a/drivers/firewire/Kconfig b/drivers/firewire/Kconfig index fa6d6abefd4d..450902438208 100644 --- a/drivers/firewire/Kconfig +++ b/drivers/firewire/Kconfig | |||
@@ -12,8 +12,8 @@ config FIREWIRE | |||
12 | This is the "Juju" FireWire stack, a new alternative implementation | 12 | This is the "Juju" FireWire stack, a new alternative implementation |
13 | designed for robustness and simplicity. You can build either this | 13 | designed for robustness and simplicity. You can build either this |
14 | stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both. | 14 | stack, or the old stack (the ieee1394 driver, ohci1394 etc.) or both. |
15 | Please read http://wiki.linux1394.org/JujuMigration before you | 15 | Please read http://ieee1394.wiki.kernel.org/index.php/Juju_Migration |
16 | enable the new stack. | 16 | before you enable the new stack. |
17 | 17 | ||
18 | To compile this driver as a module, say M here: the module will be | 18 | To compile this driver as a module, say M here: the module will be |
19 | called firewire-core. | 19 | called firewire-core. |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 61e78a4369b9..b15f88249639 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -654,12 +654,12 @@ static const struct hid_blacklist { | |||
654 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | 654 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, |
655 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | 655 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, |
656 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, | 656 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN }, |
657 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN }, | 657 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
658 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | 658 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE}, |
659 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN }, | 659 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE}, |
660 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN }, | 660 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE}, |
661 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD }, | 661 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD | HID_QUIRK_IGNORE_MOUSE }, |
662 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN }, | 662 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
663 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | 663 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
664 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, | 664 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, |
665 | 665 | ||
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index bf4ebfb86fa5..d402e8d813ce 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -77,6 +77,22 @@ config SENSORS_AD7418 | |||
77 | This driver can also be built as a module. If so, the module | 77 | This driver can also be built as a module. If so, the module |
78 | will be called ad7418. | 78 | will be called ad7418. |
79 | 79 | ||
80 | config SENSORS_ADCXX | ||
81 | tristate "National Semiconductor ADCxxxSxxx" | ||
82 | depends on SPI_MASTER && EXPERIMENTAL | ||
83 | help | ||
84 | If you say yes here you get support for the National Semiconductor | ||
85 | ADC<bb><c>S<sss> chip family, where | ||
86 | * bb is the resolution in number of bits (8, 10, 12) | ||
87 | * c is the number of channels (1, 2, 4, 8) | ||
88 | * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 | ||
89 | kSPS and 101 for 1 MSPS) | ||
90 | |||
91 | Examples : ADC081S101, ADC124S501, ... | ||
92 | |||
93 | This driver can also be built as a module. If so, the module | ||
94 | will be called adcxx. | ||
95 | |||
80 | config SENSORS_ADM1021 | 96 | config SENSORS_ADM1021 |
81 | tristate "Analog Devices ADM1021 and compatibles" | 97 | tristate "Analog Devices ADM1021 and compatibles" |
82 | depends on I2C | 98 | depends on I2C |
diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile index 7943e5cefb06..950134ab8426 100644 --- a/drivers/hwmon/Makefile +++ b/drivers/hwmon/Makefile | |||
@@ -17,6 +17,7 @@ obj-$(CONFIG_SENSORS_ABITUGURU) += abituguru.o | |||
17 | obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o | 17 | obj-$(CONFIG_SENSORS_ABITUGURU3)+= abituguru3.o |
18 | obj-$(CONFIG_SENSORS_AD7414) += ad7414.o | 18 | obj-$(CONFIG_SENSORS_AD7414) += ad7414.o |
19 | obj-$(CONFIG_SENSORS_AD7418) += ad7418.o | 19 | obj-$(CONFIG_SENSORS_AD7418) += ad7418.o |
20 | obj-$(CONFIG_SENSORS_ADCXX) += adcxx.o | ||
20 | obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o | 21 | obj-$(CONFIG_SENSORS_ADM1021) += adm1021.o |
21 | obj-$(CONFIG_SENSORS_ADM1025) += adm1025.o | 22 | obj-$(CONFIG_SENSORS_ADM1025) += adm1025.o |
22 | obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o | 23 | obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o |
diff --git a/drivers/hwmon/abituguru3.c b/drivers/hwmon/abituguru3.c index f00f497b9ca9..d568c65c1370 100644 --- a/drivers/hwmon/abituguru3.c +++ b/drivers/hwmon/abituguru3.c | |||
@@ -1,5 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | abituguru3.c Copyright (c) 2006 Hans de Goede <j.w.r.degoede@hhs.nl> | 2 | abituguru3.c |
3 | |||
4 | Copyright (c) 2006-2008 Hans de Goede <j.w.r.degoede@hhs.nl> | ||
5 | Copyright (c) 2008 Alistair John Strachan <alistair@devzero.co.uk> | ||
3 | 6 | ||
4 | This program is free software; you can redistribute it and/or modify | 7 | This program is free software; you can redistribute it and/or modify |
5 | it under the terms of the GNU General Public License as published by | 8 | it under the terms of the GNU General Public License as published by |
@@ -116,7 +119,7 @@ struct abituguru3_sensor_info { | |||
116 | 119 | ||
117 | struct abituguru3_motherboard_info { | 120 | struct abituguru3_motherboard_info { |
118 | u16 id; | 121 | u16 id; |
119 | const char *name; | 122 | const char *dmi_name; |
120 | /* + 1 -> end of sensors indicated by a sensor with name == NULL */ | 123 | /* + 1 -> end of sensors indicated by a sensor with name == NULL */ |
121 | struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1]; | 124 | struct abituguru3_sensor_info sensors[ABIT_UGURU3_MAX_NO_SENSORS + 1]; |
122 | }; | 125 | }; |
@@ -161,7 +164,7 @@ struct abituguru3_data { | |||
161 | 164 | ||
162 | /* Constants */ | 165 | /* Constants */ |
163 | static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | 166 | static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { |
164 | { 0x000C, "unknown", { | 167 | { 0x000C, NULL /* Unknown, need DMI string */, { |
165 | { "CPU Core", 0, 0, 10, 1, 0 }, | 168 | { "CPU Core", 0, 0, 10, 1, 0 }, |
166 | { "DDR", 1, 0, 10, 1, 0 }, | 169 | { "DDR", 1, 0, 10, 1, 0 }, |
167 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 170 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -183,7 +186,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
183 | { "AUX1 Fan", 35, 2, 60, 1, 0 }, | 186 | { "AUX1 Fan", 35, 2, 60, 1, 0 }, |
184 | { NULL, 0, 0, 0, 0, 0 } } | 187 | { NULL, 0, 0, 0, 0, 0 } } |
185 | }, | 188 | }, |
186 | { 0x000D, "Abit AW8", { | 189 | { 0x000D, NULL /* Abit AW8, need DMI string */, { |
187 | { "CPU Core", 0, 0, 10, 1, 0 }, | 190 | { "CPU Core", 0, 0, 10, 1, 0 }, |
188 | { "DDR", 1, 0, 10, 1, 0 }, | 191 | { "DDR", 1, 0, 10, 1, 0 }, |
189 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 192 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -212,7 +215,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
212 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, | 215 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, |
213 | { NULL, 0, 0, 0, 0, 0 } } | 216 | { NULL, 0, 0, 0, 0, 0 } } |
214 | }, | 217 | }, |
215 | { 0x000E, "AL-8", { | 218 | { 0x000E, NULL /* AL-8, need DMI string */, { |
216 | { "CPU Core", 0, 0, 10, 1, 0 }, | 219 | { "CPU Core", 0, 0, 10, 1, 0 }, |
217 | { "DDR", 1, 0, 10, 1, 0 }, | 220 | { "DDR", 1, 0, 10, 1, 0 }, |
218 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 221 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -233,7 +236,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
233 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 236 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
234 | { NULL, 0, 0, 0, 0, 0 } } | 237 | { NULL, 0, 0, 0, 0, 0 } } |
235 | }, | 238 | }, |
236 | { 0x000F, "unknown", { | 239 | { 0x000F, NULL /* Unknown, need DMI string */, { |
237 | { "CPU Core", 0, 0, 10, 1, 0 }, | 240 | { "CPU Core", 0, 0, 10, 1, 0 }, |
238 | { "DDR", 1, 0, 10, 1, 0 }, | 241 | { "DDR", 1, 0, 10, 1, 0 }, |
239 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 242 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -254,7 +257,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
254 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 257 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
255 | { NULL, 0, 0, 0, 0, 0 } } | 258 | { NULL, 0, 0, 0, 0, 0 } } |
256 | }, | 259 | }, |
257 | { 0x0010, "Abit NI8 SLI GR", { | 260 | { 0x0010, NULL /* Abit NI8 SLI GR, need DMI string */, { |
258 | { "CPU Core", 0, 0, 10, 1, 0 }, | 261 | { "CPU Core", 0, 0, 10, 1, 0 }, |
259 | { "DDR", 1, 0, 10, 1, 0 }, | 262 | { "DDR", 1, 0, 10, 1, 0 }, |
260 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 263 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -276,7 +279,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
276 | { "OTES1 Fan", 36, 2, 60, 1, 0 }, | 279 | { "OTES1 Fan", 36, 2, 60, 1, 0 }, |
277 | { NULL, 0, 0, 0, 0, 0 } } | 280 | { NULL, 0, 0, 0, 0, 0 } } |
278 | }, | 281 | }, |
279 | { 0x0011, "Abit AT8 32X", { | 282 | { 0x0011, NULL /* Abit AT8 32X, need DMI string */, { |
280 | { "CPU Core", 0, 0, 10, 1, 0 }, | 283 | { "CPU Core", 0, 0, 10, 1, 0 }, |
281 | { "DDR", 1, 0, 20, 1, 0 }, | 284 | { "DDR", 1, 0, 20, 1, 0 }, |
282 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 285 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -302,7 +305,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
302 | { "AUX2 Fan", 36, 2, 60, 1, 0 }, | 305 | { "AUX2 Fan", 36, 2, 60, 1, 0 }, |
303 | { NULL, 0, 0, 0, 0, 0 } } | 306 | { NULL, 0, 0, 0, 0, 0 } } |
304 | }, | 307 | }, |
305 | { 0x0012, "Abit AN8 32X", { | 308 | { 0x0012, NULL /* Abit AN8 32X, need DMI string */, { |
306 | { "CPU Core", 0, 0, 10, 1, 0 }, | 309 | { "CPU Core", 0, 0, 10, 1, 0 }, |
307 | { "DDR", 1, 0, 20, 1, 0 }, | 310 | { "DDR", 1, 0, 20, 1, 0 }, |
308 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 311 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -324,7 +327,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
324 | { "AUX1 Fan", 36, 2, 60, 1, 0 }, | 327 | { "AUX1 Fan", 36, 2, 60, 1, 0 }, |
325 | { NULL, 0, 0, 0, 0, 0 } } | 328 | { NULL, 0, 0, 0, 0, 0 } } |
326 | }, | 329 | }, |
327 | { 0x0013, "Abit AW8D", { | 330 | { 0x0013, NULL /* Abit AW8D, need DMI string */, { |
328 | { "CPU Core", 0, 0, 10, 1, 0 }, | 331 | { "CPU Core", 0, 0, 10, 1, 0 }, |
329 | { "DDR", 1, 0, 10, 1, 0 }, | 332 | { "DDR", 1, 0, 10, 1, 0 }, |
330 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 333 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -353,7 +356,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
353 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, | 356 | { "AUX5 Fan", 39, 2, 60, 1, 0 }, |
354 | { NULL, 0, 0, 0, 0, 0 } } | 357 | { NULL, 0, 0, 0, 0, 0 } } |
355 | }, | 358 | }, |
356 | { 0x0014, "Abit AB9 Pro", { | 359 | { 0x0014, NULL /* Abit AB9 Pro, need DMI string */, { |
357 | { "CPU Core", 0, 0, 10, 1, 0 }, | 360 | { "CPU Core", 0, 0, 10, 1, 0 }, |
358 | { "DDR", 1, 0, 10, 1, 0 }, | 361 | { "DDR", 1, 0, 10, 1, 0 }, |
359 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 362 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -374,7 +377,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
374 | { "SYS Fan", 34, 2, 60, 1, 0 }, | 377 | { "SYS Fan", 34, 2, 60, 1, 0 }, |
375 | { NULL, 0, 0, 0, 0, 0 } } | 378 | { NULL, 0, 0, 0, 0, 0 } } |
376 | }, | 379 | }, |
377 | { 0x0015, "unknown", { | 380 | { 0x0015, NULL /* Unknown, need DMI string */, { |
378 | { "CPU Core", 0, 0, 10, 1, 0 }, | 381 | { "CPU Core", 0, 0, 10, 1, 0 }, |
379 | { "DDR", 1, 0, 20, 1, 0 }, | 382 | { "DDR", 1, 0, 20, 1, 0 }, |
380 | { "DDR VTT", 2, 0, 10, 1, 0 }, | 383 | { "DDR VTT", 2, 0, 10, 1, 0 }, |
@@ -398,7 +401,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
398 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 401 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
399 | { NULL, 0, 0, 0, 0, 0 } } | 402 | { NULL, 0, 0, 0, 0, 0 } } |
400 | }, | 403 | }, |
401 | { 0x0016, "AW9D-MAX", { | 404 | { 0x0016, NULL /* AW9D-MAX, need DMI string */, { |
402 | { "CPU Core", 0, 0, 10, 1, 0 }, | 405 | { "CPU Core", 0, 0, 10, 1, 0 }, |
403 | { "DDR2", 1, 0, 20, 1, 0 }, | 406 | { "DDR2", 1, 0, 20, 1, 0 }, |
404 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 407 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
@@ -426,7 +429,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
426 | { "OTES1 Fan", 38, 2, 60, 1, 0 }, | 429 | { "OTES1 Fan", 38, 2, 60, 1, 0 }, |
427 | { NULL, 0, 0, 0, 0, 0 } } | 430 | { NULL, 0, 0, 0, 0, 0 } } |
428 | }, | 431 | }, |
429 | { 0x0017, "unknown", { | 432 | { 0x0017, NULL /* Unknown, need DMI string */, { |
430 | { "CPU Core", 0, 0, 10, 1, 0 }, | 433 | { "CPU Core", 0, 0, 10, 1, 0 }, |
431 | { "DDR2", 1, 0, 20, 1, 0 }, | 434 | { "DDR2", 1, 0, 20, 1, 0 }, |
432 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 435 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
@@ -451,7 +454,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
451 | { "AUX3 FAN", 37, 2, 60, 1, 0 }, | 454 | { "AUX3 FAN", 37, 2, 60, 1, 0 }, |
452 | { NULL, 0, 0, 0, 0, 0 } } | 455 | { NULL, 0, 0, 0, 0, 0 } } |
453 | }, | 456 | }, |
454 | { 0x0018, "unknown", { | 457 | { 0x0018, NULL /* Unknown, need DMI string */, { |
455 | { "CPU Core", 0, 0, 10, 1, 0 }, | 458 | { "CPU Core", 0, 0, 10, 1, 0 }, |
456 | { "DDR2", 1, 0, 20, 1, 0 }, | 459 | { "DDR2", 1, 0, 20, 1, 0 }, |
457 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 460 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
@@ -478,7 +481,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
478 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 481 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
479 | { NULL, 0, 0, 0, 0, 0 } } | 482 | { NULL, 0, 0, 0, 0, 0 } } |
480 | }, | 483 | }, |
481 | { 0x0019, "unknown", { | 484 | { 0x0019, NULL /* Unknown, need DMI string */, { |
482 | { "CPU Core", 7, 0, 10, 1, 0 }, | 485 | { "CPU Core", 7, 0, 10, 1, 0 }, |
483 | { "DDR2", 13, 0, 20, 1, 0 }, | 486 | { "DDR2", 13, 0, 20, 1, 0 }, |
484 | { "DDR2 VTT", 14, 0, 10, 1, 0 }, | 487 | { "DDR2 VTT", 14, 0, 10, 1, 0 }, |
@@ -505,7 +508,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
505 | { "AUX3 FAN", 36, 2, 60, 1, 0 }, | 508 | { "AUX3 FAN", 36, 2, 60, 1, 0 }, |
506 | { NULL, 0, 0, 0, 0, 0 } } | 509 | { NULL, 0, 0, 0, 0, 0 } } |
507 | }, | 510 | }, |
508 | { 0x001A, "Abit IP35 Pro", { | 511 | { 0x001A, "IP35 Pro(Intel P35-ICH9R)", { |
509 | { "CPU Core", 0, 0, 10, 1, 0 }, | 512 | { "CPU Core", 0, 0, 10, 1, 0 }, |
510 | { "DDR2", 1, 0, 20, 1, 0 }, | 513 | { "DDR2", 1, 0, 20, 1, 0 }, |
511 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 514 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
@@ -533,7 +536,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
533 | { "AUX4 Fan", 37, 2, 60, 1, 0 }, | 536 | { "AUX4 Fan", 37, 2, 60, 1, 0 }, |
534 | { NULL, 0, 0, 0, 0, 0 } } | 537 | { NULL, 0, 0, 0, 0, 0 } } |
535 | }, | 538 | }, |
536 | { 0x001B, "unknown", { | 539 | { 0x001B, NULL /* Unknown, need DMI string */, { |
537 | { "CPU Core", 0, 0, 10, 1, 0 }, | 540 | { "CPU Core", 0, 0, 10, 1, 0 }, |
538 | { "DDR3", 1, 0, 20, 1, 0 }, | 541 | { "DDR3", 1, 0, 20, 1, 0 }, |
539 | { "DDR3 VTT", 2, 0, 10, 1, 0 }, | 542 | { "DDR3 VTT", 2, 0, 10, 1, 0 }, |
@@ -560,7 +563,7 @@ static const struct abituguru3_motherboard_info abituguru3_motherboards[] = { | |||
560 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, | 563 | { "AUX3 Fan", 36, 2, 60, 1, 0 }, |
561 | { NULL, 0, 0, 0, 0, 0 } } | 564 | { NULL, 0, 0, 0, 0, 0 } } |
562 | }, | 565 | }, |
563 | { 0x001C, "unknown", { | 566 | { 0x001C, NULL /* Unknown, need DMI string */, { |
564 | { "CPU Core", 0, 0, 10, 1, 0 }, | 567 | { "CPU Core", 0, 0, 10, 1, 0 }, |
565 | { "DDR2", 1, 0, 20, 1, 0 }, | 568 | { "DDR2", 1, 0, 20, 1, 0 }, |
566 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, | 569 | { "DDR2 VTT", 2, 0, 10, 1, 0 }, |
@@ -935,9 +938,18 @@ static int __devinit abituguru3_probe(struct platform_device *pdev) | |||
935 | goto abituguru3_probe_error; | 938 | goto abituguru3_probe_error; |
936 | } | 939 | } |
937 | data->sensors = abituguru3_motherboards[i].sensors; | 940 | data->sensors = abituguru3_motherboards[i].sensors; |
941 | |||
938 | printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard " | 942 | printk(KERN_INFO ABIT_UGURU3_NAME ": found Abit uGuru3, motherboard " |
939 | "ID: %04X (%s)\n", (unsigned int)id, | 943 | "ID: %04X\n", (unsigned int)id); |
940 | abituguru3_motherboards[i].name); | 944 | |
945 | #ifdef CONFIG_DMI | ||
946 | if (!abituguru3_motherboards[i].dmi_name) { | ||
947 | printk(KERN_WARNING ABIT_UGURU3_NAME ": this motherboard was " | ||
948 | "not detected using DMI. Please send the output of " | ||
949 | "\"dmidecode\" to the abituguru3 maintainer" | ||
950 | "(see MAINTAINERS)\n"); | ||
951 | } | ||
952 | #endif | ||
941 | 953 | ||
942 | /* Fill the sysfs attr array */ | 954 | /* Fill the sysfs attr array */ |
943 | sysfs_attr_i = 0; | 955 | sysfs_attr_i = 0; |
@@ -1109,6 +1121,46 @@ static struct platform_driver abituguru3_driver = { | |||
1109 | .resume = abituguru3_resume | 1121 | .resume = abituguru3_resume |
1110 | }; | 1122 | }; |
1111 | 1123 | ||
1124 | #ifdef CONFIG_DMI | ||
1125 | |||
1126 | static int __init abituguru3_dmi_detect(void) | ||
1127 | { | ||
1128 | const char *board_vendor, *board_name; | ||
1129 | int i, err = (force) ? 1 : -ENODEV; | ||
1130 | |||
1131 | board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | ||
1132 | if (!board_vendor || strcmp(board_vendor, "http://www.abit.com.tw/")) | ||
1133 | return err; | ||
1134 | |||
1135 | board_name = dmi_get_system_info(DMI_BOARD_NAME); | ||
1136 | if (!board_name) | ||
1137 | return err; | ||
1138 | |||
1139 | for (i = 0; abituguru3_motherboards[i].id; i++) { | ||
1140 | const char *dmi_name = abituguru3_motherboards[i].dmi_name; | ||
1141 | if (dmi_name && !strcmp(dmi_name, board_name)) | ||
1142 | break; | ||
1143 | } | ||
1144 | |||
1145 | if (!abituguru3_motherboards[i].id) | ||
1146 | return 1; | ||
1147 | |||
1148 | return 0; | ||
1149 | } | ||
1150 | |||
1151 | #else /* !CONFIG_DMI */ | ||
1152 | |||
1153 | static inline int abituguru3_dmi_detect(void) | ||
1154 | { | ||
1155 | return -ENODEV; | ||
1156 | } | ||
1157 | |||
1158 | #endif /* CONFIG_DMI */ | ||
1159 | |||
1160 | /* FIXME: Manual detection should die eventually; we need to collect stable | ||
1161 | * DMI model names first before we can rely entirely on CONFIG_DMI. | ||
1162 | */ | ||
1163 | |||
1112 | static int __init abituguru3_detect(void) | 1164 | static int __init abituguru3_detect(void) |
1113 | { | 1165 | { |
1114 | /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or | 1166 | /* See if there is an uguru3 there. An idle uGuru3 will hold 0x00 or |
@@ -1119,7 +1171,7 @@ static int __init abituguru3_detect(void) | |||
1119 | if (((data_val == 0x00) || (data_val == 0x08)) && | 1171 | if (((data_val == 0x00) || (data_val == 0x08)) && |
1120 | ((cmd_val == 0xAC) || (cmd_val == 0x05) || | 1172 | ((cmd_val == 0xAC) || (cmd_val == 0x05) || |
1121 | (cmd_val == 0x55))) | 1173 | (cmd_val == 0x55))) |
1122 | return ABIT_UGURU3_BASE; | 1174 | return 0; |
1123 | 1175 | ||
1124 | ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = " | 1176 | ABIT_UGURU3_DEBUG("no Abit uGuru3 found, data = 0x%02X, cmd = " |
1125 | "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val); | 1177 | "0x%02X\n", (unsigned int)data_val, (unsigned int)cmd_val); |
@@ -1127,7 +1179,7 @@ static int __init abituguru3_detect(void) | |||
1127 | if (force) { | 1179 | if (force) { |
1128 | printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is " | 1180 | printk(KERN_INFO ABIT_UGURU3_NAME ": Assuming Abit uGuru3 is " |
1129 | "present because of \"force\" parameter\n"); | 1181 | "present because of \"force\" parameter\n"); |
1130 | return ABIT_UGURU3_BASE; | 1182 | return 0; |
1131 | } | 1183 | } |
1132 | 1184 | ||
1133 | /* No uGuru3 found */ | 1185 | /* No uGuru3 found */ |
@@ -1138,27 +1190,29 @@ static struct platform_device *abituguru3_pdev; | |||
1138 | 1190 | ||
1139 | static int __init abituguru3_init(void) | 1191 | static int __init abituguru3_init(void) |
1140 | { | 1192 | { |
1141 | int address, err; | ||
1142 | struct resource res = { .flags = IORESOURCE_IO }; | 1193 | struct resource res = { .flags = IORESOURCE_IO }; |
1143 | 1194 | int err; | |
1144 | #ifdef CONFIG_DMI | 1195 | |
1145 | const char *board_vendor = dmi_get_system_info(DMI_BOARD_VENDOR); | 1196 | /* Attempt DMI detection first */ |
1146 | 1197 | err = abituguru3_dmi_detect(); | |
1147 | /* safety check, refuse to load on non Abit motherboards */ | 1198 | if (err < 0) |
1148 | if (!force && (!board_vendor || | 1199 | return err; |
1149 | strcmp(board_vendor, "http://www.abit.com.tw/"))) | 1200 | |
1150 | return -ENODEV; | 1201 | /* Fall back to manual detection if there was no exact |
1151 | #endif | 1202 | * board name match, or force was specified. |
1152 | 1203 | */ | |
1153 | address = abituguru3_detect(); | 1204 | if (err > 0) { |
1154 | if (address < 0) | 1205 | err = abituguru3_detect(); |
1155 | return address; | 1206 | if (err) |
1207 | return err; | ||
1208 | } | ||
1156 | 1209 | ||
1157 | err = platform_driver_register(&abituguru3_driver); | 1210 | err = platform_driver_register(&abituguru3_driver); |
1158 | if (err) | 1211 | if (err) |
1159 | goto exit; | 1212 | goto exit; |
1160 | 1213 | ||
1161 | abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, address); | 1214 | abituguru3_pdev = platform_device_alloc(ABIT_UGURU3_NAME, |
1215 | ABIT_UGURU3_BASE); | ||
1162 | if (!abituguru3_pdev) { | 1216 | if (!abituguru3_pdev) { |
1163 | printk(KERN_ERR ABIT_UGURU3_NAME | 1217 | printk(KERN_ERR ABIT_UGURU3_NAME |
1164 | ": Device allocation failed\n"); | 1218 | ": Device allocation failed\n"); |
@@ -1166,8 +1220,8 @@ static int __init abituguru3_init(void) | |||
1166 | goto exit_driver_unregister; | 1220 | goto exit_driver_unregister; |
1167 | } | 1221 | } |
1168 | 1222 | ||
1169 | res.start = address; | 1223 | res.start = ABIT_UGURU3_BASE; |
1170 | res.end = address + ABIT_UGURU3_REGION_LENGTH - 1; | 1224 | res.end = ABIT_UGURU3_BASE + ABIT_UGURU3_REGION_LENGTH - 1; |
1171 | res.name = ABIT_UGURU3_NAME; | 1225 | res.name = ABIT_UGURU3_NAME; |
1172 | 1226 | ||
1173 | err = platform_device_add_resources(abituguru3_pdev, &res, 1); | 1227 | err = platform_device_add_resources(abituguru3_pdev, &res, 1); |
diff --git a/drivers/hwmon/adcxx.c b/drivers/hwmon/adcxx.c new file mode 100644 index 000000000000..242294db3db6 --- /dev/null +++ b/drivers/hwmon/adcxx.c | |||
@@ -0,0 +1,329 @@ | |||
1 | /* | ||
2 | * adcxx.c | ||
3 | * | ||
4 | * The adcxx4s is an AD converter family from National Semiconductor (NS). | ||
5 | * | ||
6 | * Copyright (c) 2008 Marc Pignat <marc.pignat@hevs.ch> | ||
7 | * | ||
8 | * The adcxx4s communicates with a host processor via an SPI/Microwire Bus | ||
9 | * interface. This driver supports the whole family of devices with name | ||
10 | * ADC<bb><c>S<sss>, where | ||
11 | * * bb is the resolution in number of bits (8, 10, 12) | ||
12 | * * c is the number of channels (1, 2, 4, 8) | ||
13 | * * sss is the maximum conversion speed (021 for 200 kSPS, 051 for 500 kSPS | ||
14 | * and 101 for 1 MSPS) | ||
15 | * | ||
16 | * Complete datasheets are available at National's website here: | ||
17 | * http://www.national.com/ds/DC/ADC<bb><c>S<sss>.pdf | ||
18 | * | ||
19 | * Handling of 8, 10 and 12 bits converters are the same, the | ||
20 | * unavailable bits are 0 :) | ||
21 | * | ||
22 | * This program is free software; you can redistribute it and/or modify | ||
23 | * it under the terms of the GNU General Public License as published by | ||
24 | * the Free Software Foundation; either version 2 of the License, or | ||
25 | * (at your option) any later version. | ||
26 | * | ||
27 | * This program is distributed in the hope that it will be useful, | ||
28 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
29 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
30 | * GNU General Public License for more details. | ||
31 | * | ||
32 | * You should have received a copy of the GNU General Public License | ||
33 | * along with this program; if not, write to the Free Software | ||
34 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
35 | */ | ||
36 | |||
37 | #include <linux/init.h> | ||
38 | #include <linux/module.h> | ||
39 | #include <linux/kernel.h> | ||
40 | #include <linux/device.h> | ||
41 | #include <linux/err.h> | ||
42 | #include <linux/sysfs.h> | ||
43 | #include <linux/hwmon.h> | ||
44 | #include <linux/hwmon-sysfs.h> | ||
45 | #include <linux/mutex.h> | ||
46 | #include <linux/spi/spi.h> | ||
47 | |||
48 | #define DRVNAME "adcxx" | ||
49 | |||
50 | struct adcxx { | ||
51 | struct device *hwmon_dev; | ||
52 | struct mutex lock; | ||
53 | u32 channels; | ||
54 | u32 reference; /* in millivolts */ | ||
55 | }; | ||
56 | |||
57 | /* sysfs hook function */ | ||
58 | static ssize_t adcxx_read(struct device *dev, | ||
59 | struct device_attribute *devattr, char *buf) | ||
60 | { | ||
61 | struct spi_device *spi = to_spi_device(dev); | ||
62 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
63 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
64 | u8 tx_buf[2] = { attr->index << 3 }; /* other bits are don't care */ | ||
65 | u8 rx_buf[2]; | ||
66 | int status; | ||
67 | int value; | ||
68 | |||
69 | if (mutex_lock_interruptible(&adc->lock)) | ||
70 | return -ERESTARTSYS; | ||
71 | |||
72 | status = spi_write_then_read(spi, tx_buf, sizeof(tx_buf), | ||
73 | rx_buf, sizeof(rx_buf)); | ||
74 | if (status < 0) { | ||
75 | dev_warn(dev, "spi_write_then_read failed with status %d\n", | ||
76 | status); | ||
77 | goto out; | ||
78 | } | ||
79 | |||
80 | value = (rx_buf[0] << 8) + rx_buf[1]; | ||
81 | dev_dbg(dev, "raw value = 0x%x\n", value); | ||
82 | |||
83 | value = value * adc->reference >> 12; | ||
84 | status = sprintf(buf, "%d\n", value); | ||
85 | out: | ||
86 | mutex_unlock(&adc->lock); | ||
87 | return status; | ||
88 | } | ||
89 | |||
90 | static ssize_t adcxx_show_min(struct device *dev, | ||
91 | struct device_attribute *devattr, char *buf) | ||
92 | { | ||
93 | /* The minimum reference is 0 for this chip family */ | ||
94 | return sprintf(buf, "0\n"); | ||
95 | } | ||
96 | |||
97 | static ssize_t adcxx_show_max(struct device *dev, | ||
98 | struct device_attribute *devattr, char *buf) | ||
99 | { | ||
100 | struct spi_device *spi = to_spi_device(dev); | ||
101 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
102 | u32 reference; | ||
103 | |||
104 | if (mutex_lock_interruptible(&adc->lock)) | ||
105 | return -ERESTARTSYS; | ||
106 | |||
107 | reference = adc->reference; | ||
108 | |||
109 | mutex_unlock(&adc->lock); | ||
110 | |||
111 | return sprintf(buf, "%d\n", reference); | ||
112 | } | ||
113 | |||
114 | static ssize_t adcxx_set_max(struct device *dev, | ||
115 | struct device_attribute *devattr, const char *buf, size_t count) | ||
116 | { | ||
117 | struct spi_device *spi = to_spi_device(dev); | ||
118 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
119 | unsigned long value; | ||
120 | |||
121 | if (strict_strtoul(buf, 10, &value)) | ||
122 | return -EINVAL; | ||
123 | |||
124 | if (mutex_lock_interruptible(&adc->lock)) | ||
125 | return -ERESTARTSYS; | ||
126 | |||
127 | adc->reference = value; | ||
128 | |||
129 | mutex_unlock(&adc->lock); | ||
130 | |||
131 | return count; | ||
132 | } | ||
133 | |||
134 | static ssize_t adcxx_show_name(struct device *dev, struct device_attribute | ||
135 | *devattr, char *buf) | ||
136 | { | ||
137 | struct spi_device *spi = to_spi_device(dev); | ||
138 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
139 | |||
140 | return sprintf(buf, "adcxx%ds\n", adc->channels); | ||
141 | } | ||
142 | |||
143 | static struct sensor_device_attribute ad_input[] = { | ||
144 | SENSOR_ATTR(name, S_IRUGO, adcxx_show_name, NULL, 0), | ||
145 | SENSOR_ATTR(in_min, S_IRUGO, adcxx_show_min, NULL, 0), | ||
146 | SENSOR_ATTR(in_max, S_IWUSR | S_IRUGO, adcxx_show_max, | ||
147 | adcxx_set_max, 0), | ||
148 | SENSOR_ATTR(in0_input, S_IRUGO, adcxx_read, NULL, 0), | ||
149 | SENSOR_ATTR(in1_input, S_IRUGO, adcxx_read, NULL, 1), | ||
150 | SENSOR_ATTR(in2_input, S_IRUGO, adcxx_read, NULL, 2), | ||
151 | SENSOR_ATTR(in3_input, S_IRUGO, adcxx_read, NULL, 3), | ||
152 | SENSOR_ATTR(in4_input, S_IRUGO, adcxx_read, NULL, 4), | ||
153 | SENSOR_ATTR(in5_input, S_IRUGO, adcxx_read, NULL, 5), | ||
154 | SENSOR_ATTR(in6_input, S_IRUGO, adcxx_read, NULL, 6), | ||
155 | SENSOR_ATTR(in7_input, S_IRUGO, adcxx_read, NULL, 7), | ||
156 | }; | ||
157 | |||
158 | /*----------------------------------------------------------------------*/ | ||
159 | |||
160 | static int __devinit adcxx_probe(struct spi_device *spi, int channels) | ||
161 | { | ||
162 | struct adcxx *adc; | ||
163 | int status; | ||
164 | int i; | ||
165 | |||
166 | adc = kzalloc(sizeof *adc, GFP_KERNEL); | ||
167 | if (!adc) | ||
168 | return -ENOMEM; | ||
169 | |||
170 | /* set a default value for the reference */ | ||
171 | adc->reference = 3300; | ||
172 | adc->channels = channels; | ||
173 | mutex_init(&adc->lock); | ||
174 | |||
175 | mutex_lock(&adc->lock); | ||
176 | |||
177 | dev_set_drvdata(&spi->dev, adc); | ||
178 | |||
179 | for (i = 0; i < 3 + adc->channels; i++) { | ||
180 | status = device_create_file(&spi->dev, &ad_input[i].dev_attr); | ||
181 | if (status) { | ||
182 | dev_err(&spi->dev, "device_create_file failed.\n"); | ||
183 | goto out_err; | ||
184 | } | ||
185 | } | ||
186 | |||
187 | adc->hwmon_dev = hwmon_device_register(&spi->dev); | ||
188 | if (IS_ERR(adc->hwmon_dev)) { | ||
189 | dev_err(&spi->dev, "hwmon_device_register failed.\n"); | ||
190 | status = PTR_ERR(adc->hwmon_dev); | ||
191 | goto out_err; | ||
192 | } | ||
193 | |||
194 | mutex_unlock(&adc->lock); | ||
195 | return 0; | ||
196 | |||
197 | out_err: | ||
198 | for (i--; i >= 0; i--) | ||
199 | device_remove_file(&spi->dev, &ad_input[i].dev_attr); | ||
200 | |||
201 | dev_set_drvdata(&spi->dev, NULL); | ||
202 | mutex_unlock(&adc->lock); | ||
203 | kfree(adc); | ||
204 | return status; | ||
205 | } | ||
206 | |||
207 | static int __devinit adcxx1s_probe(struct spi_device *spi) | ||
208 | { | ||
209 | return adcxx_probe(spi, 1); | ||
210 | } | ||
211 | |||
212 | static int __devinit adcxx2s_probe(struct spi_device *spi) | ||
213 | { | ||
214 | return adcxx_probe(spi, 2); | ||
215 | } | ||
216 | |||
217 | static int __devinit adcxx4s_probe(struct spi_device *spi) | ||
218 | { | ||
219 | return adcxx_probe(spi, 4); | ||
220 | } | ||
221 | |||
222 | static int __devinit adcxx8s_probe(struct spi_device *spi) | ||
223 | { | ||
224 | return adcxx_probe(spi, 8); | ||
225 | } | ||
226 | |||
227 | static int __devexit adcxx_remove(struct spi_device *spi) | ||
228 | { | ||
229 | struct adcxx *adc = dev_get_drvdata(&spi->dev); | ||
230 | int i; | ||
231 | |||
232 | mutex_lock(&adc->lock); | ||
233 | hwmon_device_unregister(adc->hwmon_dev); | ||
234 | for (i = 0; i < 3 + adc->channels; i++) | ||
235 | device_remove_file(&spi->dev, &ad_input[i].dev_attr); | ||
236 | |||
237 | dev_set_drvdata(&spi->dev, NULL); | ||
238 | mutex_unlock(&adc->lock); | ||
239 | kfree(adc); | ||
240 | |||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static struct spi_driver adcxx1s_driver = { | ||
245 | .driver = { | ||
246 | .name = "adcxx1s", | ||
247 | .owner = THIS_MODULE, | ||
248 | }, | ||
249 | .probe = adcxx1s_probe, | ||
250 | .remove = __devexit_p(adcxx_remove), | ||
251 | }; | ||
252 | |||
253 | static struct spi_driver adcxx2s_driver = { | ||
254 | .driver = { | ||
255 | .name = "adcxx2s", | ||
256 | .owner = THIS_MODULE, | ||
257 | }, | ||
258 | .probe = adcxx2s_probe, | ||
259 | .remove = __devexit_p(adcxx_remove), | ||
260 | }; | ||
261 | |||
262 | static struct spi_driver adcxx4s_driver = { | ||
263 | .driver = { | ||
264 | .name = "adcxx4s", | ||
265 | .owner = THIS_MODULE, | ||
266 | }, | ||
267 | .probe = adcxx4s_probe, | ||
268 | .remove = __devexit_p(adcxx_remove), | ||
269 | }; | ||
270 | |||
271 | static struct spi_driver adcxx8s_driver = { | ||
272 | .driver = { | ||
273 | .name = "adcxx8s", | ||
274 | .owner = THIS_MODULE, | ||
275 | }, | ||
276 | .probe = adcxx8s_probe, | ||
277 | .remove = __devexit_p(adcxx_remove), | ||
278 | }; | ||
279 | |||
280 | static int __init init_adcxx(void) | ||
281 | { | ||
282 | int status; | ||
283 | status = spi_register_driver(&adcxx1s_driver); | ||
284 | if (status) | ||
285 | goto reg_1_failed; | ||
286 | |||
287 | status = spi_register_driver(&adcxx2s_driver); | ||
288 | if (status) | ||
289 | goto reg_2_failed; | ||
290 | |||
291 | status = spi_register_driver(&adcxx4s_driver); | ||
292 | if (status) | ||
293 | goto reg_4_failed; | ||
294 | |||
295 | status = spi_register_driver(&adcxx8s_driver); | ||
296 | if (status) | ||
297 | goto reg_8_failed; | ||
298 | |||
299 | return status; | ||
300 | |||
301 | reg_8_failed: | ||
302 | spi_unregister_driver(&adcxx4s_driver); | ||
303 | reg_4_failed: | ||
304 | spi_unregister_driver(&adcxx2s_driver); | ||
305 | reg_2_failed: | ||
306 | spi_unregister_driver(&adcxx1s_driver); | ||
307 | reg_1_failed: | ||
308 | return status; | ||
309 | } | ||
310 | |||
311 | static void __exit exit_adcxx(void) | ||
312 | { | ||
313 | spi_unregister_driver(&adcxx1s_driver); | ||
314 | spi_unregister_driver(&adcxx2s_driver); | ||
315 | spi_unregister_driver(&adcxx4s_driver); | ||
316 | spi_unregister_driver(&adcxx8s_driver); | ||
317 | } | ||
318 | |||
319 | module_init(init_adcxx); | ||
320 | module_exit(exit_adcxx); | ||
321 | |||
322 | MODULE_AUTHOR("Marc Pignat"); | ||
323 | MODULE_DESCRIPTION("National Semiconductor adcxx8sxxx Linux driver"); | ||
324 | MODULE_LICENSE("GPL"); | ||
325 | |||
326 | MODULE_ALIAS("adcxx1s"); | ||
327 | MODULE_ALIAS("adcxx2s"); | ||
328 | MODULE_ALIAS("adcxx4s"); | ||
329 | MODULE_ALIAS("adcxx8s"); | ||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index aacc0c4b809c..b06b8e090a27 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -98,6 +98,12 @@ static const char* temperature_sensors_sets[][36] = { | |||
98 | "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", | 98 | "TH1P", "TH2P", "TH3P", "TMAP", "TMAS", "TMBS", "TM0P", "TM0S", |
99 | "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", | 99 | "TM1P", "TM1S", "TM2P", "TM2S", "TM3S", "TM8P", "TM8S", "TM9P", |
100 | "TM9S", "TN0H", "TS0C", NULL }, | 100 | "TM9S", "TN0H", "TS0C", NULL }, |
101 | /* Set 5: iMac */ | ||
102 | { "TC0D", "TA0P", "TG0P", "TG0D", "TG0H", "TH0P", "Tm0P", "TO0P", | ||
103 | "Tp0C", NULL }, | ||
104 | /* Set 6: Macbook3 set */ | ||
105 | { "TB0T", "TC0D", "TC0P", "TM0P", "TN0P", "TTF0", "TW0P", "Th0H", | ||
106 | "Th0S", "Th1H", NULL }, | ||
101 | }; | 107 | }; |
102 | 108 | ||
103 | /* List of keys used to read/write fan speeds */ | 109 | /* List of keys used to read/write fan speeds */ |
@@ -1223,6 +1229,10 @@ static __initdata struct dmi_match_data applesmc_dmi_data[] = { | |||
1223 | { .accelerometer = 0, .light = 0, .temperature_set = 3 }, | 1229 | { .accelerometer = 0, .light = 0, .temperature_set = 3 }, |
1224 | /* MacPro: temperature set 4 */ | 1230 | /* MacPro: temperature set 4 */ |
1225 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, | 1231 | { .accelerometer = 0, .light = 0, .temperature_set = 4 }, |
1232 | /* iMac: temperature set 5 */ | ||
1233 | { .accelerometer = 0, .light = 0, .temperature_set = 5 }, | ||
1234 | /* MacBook3: accelerometer and temperature set 6 */ | ||
1235 | { .accelerometer = 1, .light = 0, .temperature_set = 6 }, | ||
1226 | }; | 1236 | }; |
1227 | 1237 | ||
1228 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". | 1238 | /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1". |
@@ -1232,10 +1242,14 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
1232 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1242 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
1233 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, | 1243 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") }, |
1234 | (void*)&applesmc_dmi_data[0]}, | 1244 | (void*)&applesmc_dmi_data[0]}, |
1235 | { applesmc_dmi_match, "Apple MacBook", { | 1245 | { applesmc_dmi_match, "Apple MacBook (v2)", { |
1236 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1246 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
1237 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") }, | 1247 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook2") }, |
1238 | (void*)&applesmc_dmi_data[1]}, | 1248 | (void*)&applesmc_dmi_data[1]}, |
1249 | { applesmc_dmi_match, "Apple MacBook (v3)", { | ||
1250 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | ||
1251 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook3") }, | ||
1252 | (void*)&applesmc_dmi_data[6]}, | ||
1239 | { applesmc_dmi_match, "Apple MacBook", { | 1253 | { applesmc_dmi_match, "Apple MacBook", { |
1240 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1254 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
1241 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, | 1255 | DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") }, |
@@ -1248,6 +1262,10 @@ static __initdata struct dmi_system_id applesmc_whitelist[] = { | |||
1248 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | 1262 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), |
1249 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, | 1263 | DMI_MATCH(DMI_PRODUCT_NAME,"MacPro2") }, |
1250 | (void*)&applesmc_dmi_data[4]}, | 1264 | (void*)&applesmc_dmi_data[4]}, |
1265 | { applesmc_dmi_match, "Apple iMac", { | ||
1266 | DMI_MATCH(DMI_BOARD_VENDOR,"Apple"), | ||
1267 | DMI_MATCH(DMI_PRODUCT_NAME,"iMac") }, | ||
1268 | (void*)&applesmc_dmi_data[5]}, | ||
1251 | { .ident = NULL } | 1269 | { .ident = NULL } |
1252 | }; | 1270 | }; |
1253 | 1271 | ||
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c index 70239acecc8e..93c17223b527 100644 --- a/drivers/hwmon/coretemp.c +++ b/drivers/hwmon/coretemp.c | |||
@@ -413,10 +413,11 @@ static int __init coretemp_init(void) | |||
413 | for_each_online_cpu(i) { | 413 | for_each_online_cpu(i) { |
414 | struct cpuinfo_x86 *c = &cpu_data(i); | 414 | struct cpuinfo_x86 *c = &cpu_data(i); |
415 | 415 | ||
416 | /* check if family 6, models 0xe, 0xf, 0x16, 0x17 */ | 416 | /* check if family 6, models 0xe, 0xf, 0x16, 0x17, 0x1A */ |
417 | if ((c->cpuid_level < 0) || (c->x86 != 0x6) || | 417 | if ((c->cpuid_level < 0) || (c->x86 != 0x6) || |
418 | !((c->x86_model == 0xe) || (c->x86_model == 0xf) || | 418 | !((c->x86_model == 0xe) || (c->x86_model == 0xf) || |
419 | (c->x86_model == 0x16) || (c->x86_model == 0x17))) { | 419 | (c->x86_model == 0x16) || (c->x86_model == 0x17) || |
420 | (c->x86_model == 0x1A))) { | ||
420 | 421 | ||
421 | /* supported CPU not found, but report the unknown | 422 | /* supported CPU not found, but report the unknown |
422 | family 6 CPU */ | 423 | family 6 CPU */ |
diff --git a/drivers/hwmon/hwmon-vid.c b/drivers/hwmon/hwmon-vid.c index 7b0a32c4dcfb..c54eff92be4a 100644 --- a/drivers/hwmon/hwmon-vid.c +++ b/drivers/hwmon/hwmon-vid.c | |||
@@ -37,13 +37,21 @@ | |||
37 | * For VRD 10.0 and up, "VRD x.y Design Guide", | 37 | * For VRD 10.0 and up, "VRD x.y Design Guide", |
38 | * available at http://developer.intel.com/. | 38 | * available at http://developer.intel.com/. |
39 | * | 39 | * |
40 | * AMD NPT 0Fh (Athlon64 & Opteron), AMD Publication 32559, | 40 | * AMD Athlon 64 and AMD Opteron Processors, AMD Publication 26094, |
41 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26094.PDF | ||
42 | * Table 74. VID Code Voltages | ||
43 | * This corresponds to an arbitrary VRM code of 24 in the functions below. | ||
44 | * These CPU models (K8 revision <= E) have 5 VID pins. See also: | ||
45 | * Revision Guide for AMD Athlon 64 and AMD Opteron Processors, AMD Publication 25759, | ||
46 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25759.pdf | ||
47 | * | ||
48 | * AMD NPT Family 0Fh Processors, AMD Publication 32559, | ||
41 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf | 49 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32559.pdf |
42 | * Table 71. VID Code Voltages | 50 | * Table 71. VID Code Voltages |
43 | * AMD Opteron processors don't follow the Intel specifications. | 51 | * This corresponds to an arbitrary VRM code of 25 in the functions below. |
44 | * I'm going to "make up" 2.4 as the spec number for the Opterons. | 52 | * These CPU models (K8 revision >= F) have 6 VID pins. See also: |
45 | * No good reason just a mnemonic for the 24x Opteron processor | 53 | * Revision Guide for AMD NPT Family 0Fh Processors, AMD Publication 33610, |
46 | * series. | 54 | * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/33610.pdf |
47 | * | 55 | * |
48 | * The 17 specification is in fact Intel Mobile Voltage Positioning - | 56 | * The 17 specification is in fact Intel Mobile Voltage Positioning - |
49 | * (IMVP-II). You can find more information in the datasheet of Max1718 | 57 | * (IMVP-II). You can find more information in the datasheet of Max1718 |
@@ -95,7 +103,12 @@ int vid_from_reg(int val, u8 vrm) | |||
95 | return 0; | 103 | return 0; |
96 | return((1600000 - (val - 2) * 6250 + 500) / 1000); | 104 | return((1600000 - (val - 2) * 6250 + 500) / 1000); |
97 | 105 | ||
98 | case 24: /* AMD NPT 0Fh (Athlon64 & Opteron) */ | 106 | case 24: /* Athlon64 & Opteron */ |
107 | val &= 0x1f; | ||
108 | if (val == 0x1f) | ||
109 | return 0; | ||
110 | /* fall through */ | ||
111 | case 25: /* AMD NPT 0Fh */ | ||
99 | val &= 0x3f; | 112 | val &= 0x3f; |
100 | return (val < 32) ? 1550 - 25 * val | 113 | return (val < 32) ? 1550 - 25 * val |
101 | : 775 - (25 * (val - 31)) / 2; | 114 | : 775 - (25 * (val - 31)) / 2; |
@@ -157,11 +170,16 @@ struct vrm_model { | |||
157 | 170 | ||
158 | #ifdef CONFIG_X86 | 171 | #ifdef CONFIG_X86 |
159 | 172 | ||
160 | /* the stepping parameter is highest acceptable stepping for current line */ | 173 | /* |
174 | * The stepping parameter is highest acceptable stepping for current line. | ||
175 | * The model match must be exact for 4-bit values. For model values 0x10 | ||
176 | * and above (extended model), all models below the parameter will match. | ||
177 | */ | ||
161 | 178 | ||
162 | static struct vrm_model vrm_models[] = { | 179 | static struct vrm_model vrm_models[] = { |
163 | {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */ | 180 | {X86_VENDOR_AMD, 0x6, ANY, ANY, 90}, /* Athlon Duron etc */ |
164 | {X86_VENDOR_AMD, 0xF, ANY, ANY, 24}, /* Athlon 64, Opteron and above VRM 24 */ | 181 | {X86_VENDOR_AMD, 0xF, 0x3F, ANY, 24}, /* Athlon 64, Opteron */ |
182 | {X86_VENDOR_AMD, 0xF, ANY, ANY, 25}, /* NPT family 0Fh */ | ||
165 | {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */ | 183 | {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13}, /* Pentium M (130 nm) */ |
166 | {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */ | 184 | {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85}, /* Tualatin */ |
167 | {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */ | 185 | {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13}, /* Pentium M (90 nm) */ |
@@ -189,6 +207,8 @@ static u8 find_vrm(u8 eff_family, u8 eff_model, u8 eff_stepping, u8 vendor) | |||
189 | if (vrm_models[i].vendor==vendor) | 207 | if (vrm_models[i].vendor==vendor) |
190 | if ((vrm_models[i].eff_family==eff_family) | 208 | if ((vrm_models[i].eff_family==eff_family) |
191 | && ((vrm_models[i].eff_model==eff_model) || | 209 | && ((vrm_models[i].eff_model==eff_model) || |
210 | (vrm_models[i].eff_model >= 0x10 && | ||
211 | eff_model <= vrm_models[i].eff_model) || | ||
192 | (vrm_models[i].eff_model==ANY)) && | 212 | (vrm_models[i].eff_model==ANY)) && |
193 | (eff_stepping <= vrm_models[i].eff_stepping)) | 213 | (eff_stepping <= vrm_models[i].eff_stepping)) |
194 | return vrm_models[i].vrm_type; | 214 | return vrm_models[i].vrm_type; |
diff --git a/drivers/hwmon/i5k_amb.c b/drivers/hwmon/i5k_amb.c index f9e2ed621f7b..2ede9388096b 100644 --- a/drivers/hwmon/i5k_amb.c +++ b/drivers/hwmon/i5k_amb.c | |||
@@ -81,6 +81,8 @@ static unsigned long amb_reg_temp(unsigned int amb) | |||
81 | #define MAX_AMBS_PER_CHANNEL 16 | 81 | #define MAX_AMBS_PER_CHANNEL 16 |
82 | #define MAX_AMBS (MAX_MEM_CHANNELS * \ | 82 | #define MAX_AMBS (MAX_MEM_CHANNELS * \ |
83 | MAX_AMBS_PER_CHANNEL) | 83 | MAX_AMBS_PER_CHANNEL) |
84 | #define CHANNEL_SHIFT 4 | ||
85 | #define DIMM_MASK 0xF | ||
84 | /* | 86 | /* |
85 | * Ugly hack: For some reason the highest bit is set if there | 87 | * Ugly hack: For some reason the highest bit is set if there |
86 | * are _any_ DIMMs in the channel. Attempting to read from | 88 | * are _any_ DIMMs in the channel. Attempting to read from |
@@ -89,7 +91,7 @@ static unsigned long amb_reg_temp(unsigned int amb) | |||
89 | * might prevent us from seeing the 16th DIMM in the channel. | 91 | * might prevent us from seeing the 16th DIMM in the channel. |
90 | */ | 92 | */ |
91 | #define REAL_MAX_AMBS_PER_CHANNEL 15 | 93 | #define REAL_MAX_AMBS_PER_CHANNEL 15 |
92 | #define KNOBS_PER_AMB 5 | 94 | #define KNOBS_PER_AMB 6 |
93 | 95 | ||
94 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) | 96 | static unsigned long amb_num_from_reg(unsigned int byte_num, unsigned int bit) |
95 | { | 97 | { |
@@ -238,6 +240,16 @@ static ssize_t show_amb_temp(struct device *dev, | |||
238 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); | 240 | 500 * amb_read_byte(data, amb_reg_temp(attr->index))); |
239 | } | 241 | } |
240 | 242 | ||
243 | static ssize_t show_label(struct device *dev, | ||
244 | struct device_attribute *devattr, | ||
245 | char *buf) | ||
246 | { | ||
247 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | ||
248 | |||
249 | return sprintf(buf, "Ch. %d DIMM %d\n", attr->index >> CHANNEL_SHIFT, | ||
250 | attr->index & DIMM_MASK); | ||
251 | } | ||
252 | |||
241 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | 253 | static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) |
242 | { | 254 | { |
243 | int i, j, k, d = 0; | 255 | int i, j, k, d = 0; |
@@ -268,6 +280,20 @@ static int __devinit i5k_amb_hwmon_init(struct platform_device *pdev) | |||
268 | continue; | 280 | continue; |
269 | d++; | 281 | d++; |
270 | 282 | ||
283 | /* sysfs label */ | ||
284 | iattr = data->attrs + data->num_attrs; | ||
285 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, | ||
286 | "temp%d_label", d); | ||
287 | iattr->s_attr.dev_attr.attr.name = iattr->name; | ||
288 | iattr->s_attr.dev_attr.attr.mode = S_IRUGO; | ||
289 | iattr->s_attr.dev_attr.show = show_label; | ||
290 | iattr->s_attr.index = k; | ||
291 | res = device_create_file(&pdev->dev, | ||
292 | &iattr->s_attr.dev_attr); | ||
293 | if (res) | ||
294 | goto exit_remove; | ||
295 | data->num_attrs++; | ||
296 | |||
271 | /* Temperature sysfs knob */ | 297 | /* Temperature sysfs knob */ |
272 | iattr = data->attrs + data->num_attrs; | 298 | iattr = data->attrs + data->num_attrs; |
273 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, | 299 | snprintf(iattr->name, AMB_SYSFS_NAME_LEN, |
diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c index c9416e657487..0f70dc204105 100644 --- a/drivers/hwmon/ibmaem.c +++ b/drivers/hwmon/ibmaem.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * A hwmon driver for the IBM Active Energy Manager temperature/power sensors | 2 | * A hwmon driver for the IBM System Director Active Energy Manager (AEM) |
3 | * and capping functionality. | 3 | * temperature/power/energy sensors and capping functionality. |
4 | * Copyright (C) 2008 IBM | 4 | * Copyright (C) 2008 IBM |
5 | * | 5 | * |
6 | * Author: Darrick J. Wong <djwong@us.ibm.com> | 6 | * Author: Darrick J. Wong <djwong@us.ibm.com> |
@@ -463,12 +463,18 @@ static int aem_read_sensor(struct aem_data *data, u8 elt, u8 reg, | |||
463 | } | 463 | } |
464 | 464 | ||
465 | /* Update AEM energy registers */ | 465 | /* Update AEM energy registers */ |
466 | static void update_aem_energy_one(struct aem_data *data, int which) | ||
467 | { | ||
468 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, which, | ||
469 | &data->energy[which], 8); | ||
470 | } | ||
471 | |||
466 | static void update_aem_energy(struct aem_data *data) | 472 | static void update_aem_energy(struct aem_data *data) |
467 | { | 473 | { |
468 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, 0, &data->energy[0], 8); | 474 | update_aem_energy_one(data, 0); |
469 | if (data->ver_major < 2) | 475 | if (data->ver_major < 2) |
470 | return; | 476 | return; |
471 | aem_read_sensor(data, AEM_ENERGY_ELEMENT, 1, &data->energy[1], 8); | 477 | update_aem_energy_one(data, 1); |
472 | } | 478 | } |
473 | 479 | ||
474 | /* Update all AEM1 sensors */ | 480 | /* Update all AEM1 sensors */ |
@@ -676,7 +682,8 @@ static int aem_find_aem2(struct aem_ipmi_data *data, | |||
676 | return -ETIMEDOUT; | 682 | return -ETIMEDOUT; |
677 | 683 | ||
678 | if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || | 684 | if (data->rx_result || data->rx_msg_len != sizeof(*fi_resp) || |
679 | memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id))) | 685 | memcmp(&fi_resp->id, &system_x_id, sizeof(system_x_id)) || |
686 | fi_resp->num_instances <= instance_num) | ||
680 | return -ENOENT; | 687 | return -ENOENT; |
681 | 688 | ||
682 | return 0; | 689 | return 0; |
@@ -849,7 +856,7 @@ static ssize_t aem_show_power(struct device *dev, | |||
849 | struct timespec b, a; | 856 | struct timespec b, a; |
850 | 857 | ||
851 | mutex_lock(&data->lock); | 858 | mutex_lock(&data->lock); |
852 | update_aem_energy(data); | 859 | update_aem_energy_one(data, attr->index); |
853 | getnstimeofday(&b); | 860 | getnstimeofday(&b); |
854 | before = data->energy[attr->index]; | 861 | before = data->energy[attr->index]; |
855 | 862 | ||
@@ -861,7 +868,7 @@ static ssize_t aem_show_power(struct device *dev, | |||
861 | return 0; | 868 | return 0; |
862 | } | 869 | } |
863 | 870 | ||
864 | update_aem_energy(data); | 871 | update_aem_energy_one(data, attr->index); |
865 | getnstimeofday(&a); | 872 | getnstimeofday(&a); |
866 | after = data->energy[attr->index]; | 873 | after = data->energy[attr->index]; |
867 | mutex_unlock(&data->lock); | 874 | mutex_unlock(&data->lock); |
@@ -880,7 +887,9 @@ static ssize_t aem_show_energy(struct device *dev, | |||
880 | { | 887 | { |
881 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 888 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
882 | struct aem_data *a = dev_get_drvdata(dev); | 889 | struct aem_data *a = dev_get_drvdata(dev); |
883 | a->update(a); | 890 | mutex_lock(&a->lock); |
891 | update_aem_energy_one(a, attr->index); | ||
892 | mutex_unlock(&a->lock); | ||
884 | 893 | ||
885 | return sprintf(buf, "%llu\n", | 894 | return sprintf(buf, "%llu\n", |
886 | (unsigned long long)a->energy[attr->index] * 1000); | 895 | (unsigned long long)a->energy[attr->index] * 1000); |
@@ -1104,7 +1113,7 @@ static void __exit aem_exit(void) | |||
1104 | } | 1113 | } |
1105 | 1114 | ||
1106 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); | 1115 | MODULE_AUTHOR("Darrick J. Wong <djwong@us.ibm.com>"); |
1107 | MODULE_DESCRIPTION("IBM Active Energy Manager power/temp sensor driver"); | 1116 | MODULE_DESCRIPTION("IBM AEM power/temp/energy sensor driver"); |
1108 | MODULE_LICENSE("GPL"); | 1117 | MODULE_LICENSE("GPL"); |
1109 | 1118 | ||
1110 | module_init(aem_init); | 1119 | module_init(aem_init); |
diff --git a/drivers/hwmon/w83791d.c b/drivers/hwmon/w83791d.c index daa7d121483b..de21142d106c 100644 --- a/drivers/hwmon/w83791d.c +++ b/drivers/hwmon/w83791d.c | |||
@@ -1055,9 +1055,10 @@ static int w83791d_probe(struct i2c_client *client, | |||
1055 | { | 1055 | { |
1056 | struct w83791d_data *data; | 1056 | struct w83791d_data *data; |
1057 | struct device *dev = &client->dev; | 1057 | struct device *dev = &client->dev; |
1058 | int i, val1, err; | 1058 | int i, err; |
1059 | 1059 | ||
1060 | #ifdef DEBUG | 1060 | #ifdef DEBUG |
1061 | int val1; | ||
1061 | val1 = w83791d_read(client, W83791D_REG_DID_VID4); | 1062 | val1 = w83791d_read(client, W83791D_REG_DID_VID4); |
1062 | dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n", | 1063 | dev_dbg(dev, "Device ID version: %d.%d (0x%02x)\n", |
1063 | (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1); | 1064 | (val1 >> 5) & 0x07, (val1 >> 1) & 0x0f, val1); |
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index c1adcdbf7979..9efb02137254 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c | |||
@@ -14,7 +14,6 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/version.h> | ||
18 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
19 | #include <linux/err.h> | 18 | #include <linux/err.h> |
20 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 89a112d513ad..49a8c589e346 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -1272,9 +1272,9 @@ static ide_startstop_t ide_cd_do_request(ide_drive_t *drive, struct request *rq, | |||
1272 | */ | 1272 | */ |
1273 | static void msf_from_bcd(struct atapi_msf *msf) | 1273 | static void msf_from_bcd(struct atapi_msf *msf) |
1274 | { | 1274 | { |
1275 | msf->minute = BCD2BIN(msf->minute); | 1275 | msf->minute = bcd2bin(msf->minute); |
1276 | msf->second = BCD2BIN(msf->second); | 1276 | msf->second = bcd2bin(msf->second); |
1277 | msf->frame = BCD2BIN(msf->frame); | 1277 | msf->frame = bcd2bin(msf->frame); |
1278 | } | 1278 | } |
1279 | 1279 | ||
1280 | int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) | 1280 | int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) |
@@ -1415,8 +1415,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) | |||
1415 | return stat; | 1415 | return stat; |
1416 | 1416 | ||
1417 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { | 1417 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { |
1418 | toc->hdr.first_track = BCD2BIN(toc->hdr.first_track); | 1418 | toc->hdr.first_track = bcd2bin(toc->hdr.first_track); |
1419 | toc->hdr.last_track = BCD2BIN(toc->hdr.last_track); | 1419 | toc->hdr.last_track = bcd2bin(toc->hdr.last_track); |
1420 | } | 1420 | } |
1421 | 1421 | ||
1422 | ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; | 1422 | ntracks = toc->hdr.last_track - toc->hdr.first_track + 1; |
@@ -1456,8 +1456,8 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) | |||
1456 | return stat; | 1456 | return stat; |
1457 | 1457 | ||
1458 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { | 1458 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { |
1459 | toc->hdr.first_track = (u8)BIN2BCD(CDROM_LEADOUT); | 1459 | toc->hdr.first_track = (u8)bin2bcd(CDROM_LEADOUT); |
1460 | toc->hdr.last_track = (u8)BIN2BCD(CDROM_LEADOUT); | 1460 | toc->hdr.last_track = (u8)bin2bcd(CDROM_LEADOUT); |
1461 | } else { | 1461 | } else { |
1462 | toc->hdr.first_track = CDROM_LEADOUT; | 1462 | toc->hdr.first_track = CDROM_LEADOUT; |
1463 | toc->hdr.last_track = CDROM_LEADOUT; | 1463 | toc->hdr.last_track = CDROM_LEADOUT; |
@@ -1470,14 +1470,14 @@ int ide_cd_read_toc(ide_drive_t *drive, struct request_sense *sense) | |||
1470 | toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length); | 1470 | toc->hdr.toc_length = be16_to_cpu(toc->hdr.toc_length); |
1471 | 1471 | ||
1472 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { | 1472 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) { |
1473 | toc->hdr.first_track = BCD2BIN(toc->hdr.first_track); | 1473 | toc->hdr.first_track = bcd2bin(toc->hdr.first_track); |
1474 | toc->hdr.last_track = BCD2BIN(toc->hdr.last_track); | 1474 | toc->hdr.last_track = bcd2bin(toc->hdr.last_track); |
1475 | } | 1475 | } |
1476 | 1476 | ||
1477 | for (i = 0; i <= ntracks; i++) { | 1477 | for (i = 0; i <= ntracks; i++) { |
1478 | if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) { | 1478 | if (drive->atapi_flags & IDE_AFLAG_TOCADDR_AS_BCD) { |
1479 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) | 1479 | if (drive->atapi_flags & IDE_AFLAG_TOCTRACKS_AS_BCD) |
1480 | toc->ent[i].track = BCD2BIN(toc->ent[i].track); | 1480 | toc->ent[i].track = bcd2bin(toc->ent[i].track); |
1481 | msf_from_bcd(&toc->ent[i].addr.msf); | 1481 | msf_from_bcd(&toc->ent[i].addr.msf); |
1482 | } | 1482 | } |
1483 | toc->ent[i].addr.lba = msf_to_lba(toc->ent[i].addr.msf.minute, | 1483 | toc->ent[i].addr.lba = msf_to_lba(toc->ent[i].addr.msf.minute, |
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index 40644b6f1c00..3187215e8f89 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -307,7 +307,7 @@ static struct pci_driver driver = { | |||
307 | .name = "AEC62xx_IDE", | 307 | .name = "AEC62xx_IDE", |
308 | .id_table = aec62xx_pci_tbl, | 308 | .id_table = aec62xx_pci_tbl, |
309 | .probe = aec62xx_init_one, | 309 | .probe = aec62xx_init_one, |
310 | .remove = aec62xx_remove, | 310 | .remove = __devexit_p(aec62xx_remove), |
311 | }; | 311 | }; |
312 | 312 | ||
313 | static int __init aec62xx_ide_init(void) | 313 | static int __init aec62xx_ide_init(void) |
diff --git a/drivers/ide/pci/cy82c693.c b/drivers/ide/pci/cy82c693.c index bfae2f882f48..e6d8ee88d56d 100644 --- a/drivers/ide/pci/cy82c693.c +++ b/drivers/ide/pci/cy82c693.c | |||
@@ -447,7 +447,7 @@ static struct pci_driver driver = { | |||
447 | .name = "Cypress_IDE", | 447 | .name = "Cypress_IDE", |
448 | .id_table = cy82c693_pci_tbl, | 448 | .id_table = cy82c693_pci_tbl, |
449 | .probe = cy82c693_init_one, | 449 | .probe = cy82c693_init_one, |
450 | .remove = cy82c693_remove, | 450 | .remove = __devexit_p(cy82c693_remove), |
451 | }; | 451 | }; |
452 | 452 | ||
453 | static int __init cy82c693_ide_init(void) | 453 | static int __init cy82c693_ide_init(void) |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 748793a413ab..eb107eef0dbc 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1620,7 +1620,7 @@ static struct pci_driver driver = { | |||
1620 | .name = "HPT366_IDE", | 1620 | .name = "HPT366_IDE", |
1621 | .id_table = hpt366_pci_tbl, | 1621 | .id_table = hpt366_pci_tbl, |
1622 | .probe = hpt366_init_one, | 1622 | .probe = hpt366_init_one, |
1623 | .remove = hpt366_remove, | 1623 | .remove = __devexit_p(hpt366_remove), |
1624 | }; | 1624 | }; |
1625 | 1625 | ||
1626 | static int __init hpt366_ide_init(void) | 1626 | static int __init hpt366_ide_init(void) |
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index b6dc723de702..4a1508a707cc 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
@@ -686,7 +686,7 @@ static struct pci_driver driver = { | |||
686 | .name = "ITE821x IDE", | 686 | .name = "ITE821x IDE", |
687 | .id_table = it821x_pci_tbl, | 687 | .id_table = it821x_pci_tbl, |
688 | .probe = it821x_init_one, | 688 | .probe = it821x_init_one, |
689 | .remove = it821x_remove, | 689 | .remove = __devexit_p(it821x_remove), |
690 | }; | 690 | }; |
691 | 691 | ||
692 | static int __init it821x_ide_init(void) | 692 | static int __init it821x_ide_init(void) |
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 0f609b72f470..d477da6b5858 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -566,7 +566,7 @@ static struct pci_driver driver = { | |||
566 | .name = "Promise_IDE", | 566 | .name = "Promise_IDE", |
567 | .id_table = pdc202new_pci_tbl, | 567 | .id_table = pdc202new_pci_tbl, |
568 | .probe = pdc202new_init_one, | 568 | .probe = pdc202new_init_one, |
569 | .remove = pdc202new_remove, | 569 | .remove = __devexit_p(pdc202new_remove), |
570 | }; | 570 | }; |
571 | 571 | ||
572 | static int __init pdc202new_ide_init(void) | 572 | static int __init pdc202new_ide_init(void) |
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c index 6cde48bba6f8..44cccd1e086a 100644 --- a/drivers/ide/pci/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
@@ -954,7 +954,7 @@ static struct pci_driver driver = { | |||
954 | .name = "SCC IDE", | 954 | .name = "SCC IDE", |
955 | .id_table = scc_pci_tbl, | 955 | .id_table = scc_pci_tbl, |
956 | .probe = scc_init_one, | 956 | .probe = scc_init_one, |
957 | .remove = scc_remove, | 957 | .remove = __devexit_p(scc_remove), |
958 | }; | 958 | }; |
959 | 959 | ||
960 | static int scc_ide_init(void) | 960 | static int scc_ide_init(void) |
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 42eef19a18f1..681306c9d79b 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -621,9 +621,9 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev) | |||
621 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, | 621 | if (!request_mem_region(cmd_phys_base, IOC4_CMD_CTL_BLK_SIZE, |
622 | DRV_NAME)) { | 622 | DRV_NAME)) { |
623 | printk(KERN_ERR | 623 | printk(KERN_ERR |
624 | "%s : %s -- ERROR, Addresses " | 624 | "%s %s: -- ERROR, Addresses " |
625 | "0x%p to 0x%p ALREADY in use\n", | 625 | "0x%p to 0x%p ALREADY in use\n", |
626 | __func__, DRV_NAME, (void *) cmd_phys_base, | 626 | DRV_NAME, pci_name(dev), (void *)cmd_phys_base, |
627 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); | 627 | (void *) cmd_phys_base + IOC4_CMD_CTL_BLK_SIZE); |
628 | return -ENOMEM; | 628 | return -ENOMEM; |
629 | } | 629 | } |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 445ce6fbea33..db2b88a369ab 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -832,7 +832,7 @@ static struct pci_driver driver = { | |||
832 | .name = "SiI_IDE", | 832 | .name = "SiI_IDE", |
833 | .id_table = siimage_pci_tbl, | 833 | .id_table = siimage_pci_tbl, |
834 | .probe = siimage_init_one, | 834 | .probe = siimage_init_one, |
835 | .remove = siimage_remove, | 835 | .remove = __devexit_p(siimage_remove), |
836 | }; | 836 | }; |
837 | 837 | ||
838 | static int __init siimage_ide_init(void) | 838 | static int __init siimage_ide_init(void) |
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index e5a4b42b4e33..5efe21d6ef97 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
@@ -610,7 +610,7 @@ static struct pci_driver driver = { | |||
610 | .name = "SIS_IDE", | 610 | .name = "SIS_IDE", |
611 | .id_table = sis5513_pci_tbl, | 611 | .id_table = sis5513_pci_tbl, |
612 | .probe = sis5513_init_one, | 612 | .probe = sis5513_init_one, |
613 | .remove = sis5513_remove, | 613 | .remove = __devexit_p(sis5513_remove), |
614 | }; | 614 | }; |
615 | 615 | ||
616 | static int __init sis5513_ide_init(void) | 616 | static int __init sis5513_ide_init(void) |
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c index 7fc88c375e5d..927277c54ec9 100644 --- a/drivers/ide/pci/tc86c001.c +++ b/drivers/ide/pci/tc86c001.c | |||
@@ -249,7 +249,7 @@ static struct pci_driver driver = { | |||
249 | .name = "TC86C001", | 249 | .name = "TC86C001", |
250 | .id_table = tc86c001_pci_tbl, | 250 | .id_table = tc86c001_pci_tbl, |
251 | .probe = tc86c001_init_one, | 251 | .probe = tc86c001_init_one, |
252 | .remove = tc86c001_remove, | 252 | .remove = __devexit_p(tc86c001_remove), |
253 | }; | 253 | }; |
254 | 254 | ||
255 | static int __init tc86c001_ide_init(void) | 255 | static int __init tc86c001_ide_init(void) |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index a6b2cc83f293..94fb9ab3223f 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
@@ -491,7 +491,7 @@ static struct pci_driver driver = { | |||
491 | .name = "VIA_IDE", | 491 | .name = "VIA_IDE", |
492 | .id_table = via_pci_tbl, | 492 | .id_table = via_pci_tbl, |
493 | .probe = via_init_one, | 493 | .probe = via_init_one, |
494 | .remove = via_remove, | 494 | .remove = __devexit_p(via_remove), |
495 | }; | 495 | }; |
496 | 496 | ||
497 | static int __init via_ide_init(void) | 497 | static int __init via_ide_init(void) |
diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 994a21e5a0aa..16240a789650 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c | |||
@@ -844,7 +844,7 @@ static struct node_entry *nodemgr_create_node(octlet_t guid, struct csr1212_csr | |||
844 | ne->host = host; | 844 | ne->host = host; |
845 | ne->nodeid = nodeid; | 845 | ne->nodeid = nodeid; |
846 | ne->generation = generation; | 846 | ne->generation = generation; |
847 | ne->needs_probe = 1; | 847 | ne->needs_probe = true; |
848 | 848 | ||
849 | ne->guid = guid; | 849 | ne->guid = guid; |
850 | ne->guid_vendor_id = (guid >> 40) & 0xffffff; | 850 | ne->guid_vendor_id = (guid >> 40) & 0xffffff; |
@@ -1144,7 +1144,7 @@ static void nodemgr_process_root_directory(struct host_info *hi, struct node_ent | |||
1144 | struct csr1212_keyval *kv, *vendor_name_kv = NULL; | 1144 | struct csr1212_keyval *kv, *vendor_name_kv = NULL; |
1145 | u8 last_key_id = 0; | 1145 | u8 last_key_id = 0; |
1146 | 1146 | ||
1147 | ne->needs_probe = 0; | 1147 | ne->needs_probe = false; |
1148 | 1148 | ||
1149 | csr1212_for_each_dir_entry(ne->csr, kv, ne->csr->root_kv, dentry) { | 1149 | csr1212_for_each_dir_entry(ne->csr, kv, ne->csr->root_kv, dentry) { |
1150 | switch (kv->key.id) { | 1150 | switch (kv->key.id) { |
@@ -1295,7 +1295,7 @@ static void nodemgr_update_node(struct node_entry *ne, struct csr1212_csr *csr, | |||
1295 | nodemgr_update_bus_options(ne); | 1295 | nodemgr_update_bus_options(ne); |
1296 | 1296 | ||
1297 | /* Mark the node as new, so it gets re-probed */ | 1297 | /* Mark the node as new, so it gets re-probed */ |
1298 | ne->needs_probe = 1; | 1298 | ne->needs_probe = true; |
1299 | } else { | 1299 | } else { |
1300 | /* old cache is valid, so update its generation */ | 1300 | /* old cache is valid, so update its generation */ |
1301 | struct nodemgr_csr_info *ci = ne->csr->private; | 1301 | struct nodemgr_csr_info *ci = ne->csr->private; |
@@ -1566,57 +1566,60 @@ static void nodemgr_probe_ne(struct host_info *hi, struct node_entry *ne, int ge | |||
1566 | struct probe_param { | 1566 | struct probe_param { |
1567 | struct host_info *hi; | 1567 | struct host_info *hi; |
1568 | int generation; | 1568 | int generation; |
1569 | bool probe_now; | ||
1569 | }; | 1570 | }; |
1570 | 1571 | ||
1571 | static int __nodemgr_node_probe(struct device *dev, void *data) | 1572 | static int node_probe(struct device *dev, void *data) |
1572 | { | 1573 | { |
1573 | struct probe_param *param = (struct probe_param *)data; | 1574 | struct probe_param *p = data; |
1574 | struct node_entry *ne; | 1575 | struct node_entry *ne; |
1575 | 1576 | ||
1577 | if (p->generation != get_hpsb_generation(p->hi->host)) | ||
1578 | return -EAGAIN; | ||
1579 | |||
1576 | ne = container_of(dev, struct node_entry, node_dev); | 1580 | ne = container_of(dev, struct node_entry, node_dev); |
1577 | if (!ne->needs_probe) | 1581 | if (ne->needs_probe == p->probe_now) |
1578 | nodemgr_probe_ne(param->hi, ne, param->generation); | 1582 | nodemgr_probe_ne(p->hi, ne, p->generation); |
1579 | if (ne->needs_probe) | ||
1580 | nodemgr_probe_ne(param->hi, ne, param->generation); | ||
1581 | return 0; | 1583 | return 0; |
1582 | } | 1584 | } |
1583 | 1585 | ||
1584 | static void nodemgr_node_probe(struct host_info *hi, int generation) | 1586 | static void nodemgr_node_probe(struct host_info *hi, int generation) |
1585 | { | 1587 | { |
1586 | struct hpsb_host *host = hi->host; | 1588 | struct probe_param p; |
1587 | struct probe_param param; | ||
1588 | 1589 | ||
1589 | param.hi = hi; | 1590 | p.hi = hi; |
1590 | param.generation = generation; | 1591 | p.generation = generation; |
1591 | /* Do some processing of the nodes we've probed. This pulls them | 1592 | /* |
1593 | * Do some processing of the nodes we've probed. This pulls them | ||
1592 | * into the sysfs layer if needed, and can result in processing of | 1594 | * into the sysfs layer if needed, and can result in processing of |
1593 | * unit-directories, or just updating the node and it's | 1595 | * unit-directories, or just updating the node and it's |
1594 | * unit-directories. | 1596 | * unit-directories. |
1595 | * | 1597 | * |
1596 | * Run updates before probes. Usually, updates are time-critical | 1598 | * Run updates before probes. Usually, updates are time-critical |
1597 | * while probes are time-consuming. (Well, those probes need some | 1599 | * while probes are time-consuming. |
1598 | * improvement...) */ | ||
1599 | |||
1600 | class_for_each_device(&nodemgr_ne_class, NULL, ¶m, | ||
1601 | __nodemgr_node_probe); | ||
1602 | |||
1603 | /* If we had a bus reset while we were scanning the bus, it is | ||
1604 | * possible that we did not probe all nodes. In that case, we | ||
1605 | * skip the clean up for now, since we could remove nodes that | ||
1606 | * were still on the bus. Another bus scan is pending which will | ||
1607 | * do the clean up eventually. | ||
1608 | * | 1600 | * |
1601 | * Meanwhile, another bus reset may have happened. In this case we | ||
1602 | * skip everything here and let the next bus scan handle it. | ||
1603 | * Otherwise we may prematurely remove nodes which are still there. | ||
1604 | */ | ||
1605 | p.probe_now = false; | ||
1606 | if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0) | ||
1607 | return; | ||
1608 | |||
1609 | p.probe_now = true; | ||
1610 | if (class_for_each_device(&nodemgr_ne_class, NULL, &p, node_probe) != 0) | ||
1611 | return; | ||
1612 | /* | ||
1609 | * Now let's tell the bus to rescan our devices. This may seem | 1613 | * Now let's tell the bus to rescan our devices. This may seem |
1610 | * like overhead, but the driver-model core will only scan a | 1614 | * like overhead, but the driver-model core will only scan a |
1611 | * device for a driver when either the device is added, or when a | 1615 | * device for a driver when either the device is added, or when a |
1612 | * new driver is added. A bus reset is a good reason to rescan | 1616 | * new driver is added. A bus reset is a good reason to rescan |
1613 | * devices that were there before. For example, an sbp2 device | 1617 | * devices that were there before. For example, an sbp2 device |
1614 | * may become available for login, if the host that held it was | 1618 | * may become available for login, if the host that held it was |
1615 | * just removed. */ | 1619 | * just removed. |
1616 | 1620 | */ | |
1617 | if (generation == get_hpsb_generation(host)) | 1621 | if (bus_rescan_devices(&ieee1394_bus_type) != 0) |
1618 | if (bus_rescan_devices(&ieee1394_bus_type)) | 1622 | HPSB_DEBUG("bus_rescan_devices had an error"); |
1619 | HPSB_DEBUG("bus_rescan_devices had an error"); | ||
1620 | } | 1623 | } |
1621 | 1624 | ||
1622 | static int nodemgr_send_resume_packet(struct hpsb_host *host) | 1625 | static int nodemgr_send_resume_packet(struct hpsb_host *host) |
diff --git a/drivers/ieee1394/nodemgr.h b/drivers/ieee1394/nodemgr.h index 919e92e2a955..6eb26465a84c 100644 --- a/drivers/ieee1394/nodemgr.h +++ b/drivers/ieee1394/nodemgr.h | |||
@@ -97,7 +97,7 @@ struct node_entry { | |||
97 | struct hpsb_host *host; /* Host this node is attached to */ | 97 | struct hpsb_host *host; /* Host this node is attached to */ |
98 | nodeid_t nodeid; /* NodeID */ | 98 | nodeid_t nodeid; /* NodeID */ |
99 | struct bus_options busopt; /* Bus Options */ | 99 | struct bus_options busopt; /* Bus Options */ |
100 | int needs_probe; | 100 | bool needs_probe; |
101 | unsigned int generation; /* Synced with hpsb generation */ | 101 | unsigned int generation; /* Synced with hpsb generation */ |
102 | 102 | ||
103 | /* The following is read from the config rom */ | 103 | /* The following is read from the config rom */ |
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index 9cbf3154d243..1d6ad3435537 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -731,15 +731,26 @@ static int sbp2_update(struct unit_directory *ud) | |||
731 | { | 731 | { |
732 | struct sbp2_lu *lu = ud->device.driver_data; | 732 | struct sbp2_lu *lu = ud->device.driver_data; |
733 | 733 | ||
734 | if (sbp2_reconnect_device(lu)) { | 734 | if (sbp2_reconnect_device(lu) != 0) { |
735 | /* Reconnect has failed. Perhaps we didn't reconnect fast | 735 | /* |
736 | * enough. Try a regular login, but first log out just in | 736 | * Reconnect failed. If another bus reset happened, |
737 | * case of any weirdness. */ | 737 | * let nodemgr proceed and call sbp2_update again later |
738 | * (or sbp2_remove if this node went away). | ||
739 | */ | ||
740 | if (!hpsb_node_entry_valid(lu->ne)) | ||
741 | return 0; | ||
742 | /* | ||
743 | * Or the target rejected the reconnect because we weren't | ||
744 | * fast enough. Try a regular login, but first log out | ||
745 | * just in case of any weirdness. | ||
746 | */ | ||
738 | sbp2_logout_device(lu); | 747 | sbp2_logout_device(lu); |
739 | 748 | ||
740 | if (sbp2_login_device(lu)) { | 749 | if (sbp2_login_device(lu) != 0) { |
741 | /* Login failed too, just fail, and the backend | 750 | if (!hpsb_node_entry_valid(lu->ne)) |
742 | * will call our sbp2_remove for us */ | 751 | return 0; |
752 | |||
753 | /* Maybe another initiator won the login. */ | ||
743 | SBP2_ERR("Failed to reconnect to sbp2 device!"); | 754 | SBP2_ERR("Failed to reconnect to sbp2 device!"); |
744 | return -EBUSY; | 755 | return -EBUSY; |
745 | } | 756 | } |
diff --git a/drivers/infiniband/hw/ehca/ehca_tools.h b/drivers/infiniband/hw/ehca/ehca_tools.h index ec950bf8c479..21f7d06f14ad 100644 --- a/drivers/infiniband/hw/ehca/ehca_tools.h +++ b/drivers/infiniband/hw/ehca/ehca_tools.h | |||
@@ -54,7 +54,6 @@ | |||
54 | #include <linux/module.h> | 54 | #include <linux/module.h> |
55 | #include <linux/moduleparam.h> | 55 | #include <linux/moduleparam.h> |
56 | #include <linux/vmalloc.h> | 56 | #include <linux/vmalloc.h> |
57 | #include <linux/version.h> | ||
58 | #include <linux/notifier.h> | 57 | #include <linux/notifier.h> |
59 | #include <linux/cpu.h> | 58 | #include <linux/cpu.h> |
60 | #include <linux/device.h> | 59 | #include <linux/device.h> |
diff --git a/drivers/infiniband/hw/ipath/ipath_fs.c b/drivers/infiniband/hw/ipath/ipath_fs.c index 23faba9d21eb..8bb5170b4e41 100644 --- a/drivers/infiniband/hw/ipath/ipath_fs.c +++ b/drivers/infiniband/hw/ipath/ipath_fs.c | |||
@@ -31,7 +31,6 @@ | |||
31 | * SOFTWARE. | 31 | * SOFTWARE. |
32 | */ | 32 | */ |
33 | 33 | ||
34 | #include <linux/version.h> | ||
35 | #include <linux/module.h> | 34 | #include <linux/module.h> |
36 | #include <linux/fs.h> | 35 | #include <linux/fs.h> |
37 | #include <linux/mount.h> | 36 | #include <linux/mount.h> |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba7220.c b/drivers/infiniband/hw/ipath/ipath_iba7220.c index d90f5e9a54fa..9839e20119bc 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba7220.c +++ b/drivers/infiniband/hw/ipath/ipath_iba7220.c | |||
@@ -1720,7 +1720,7 @@ static void ipath_7220_put_tid(struct ipath_devdata *dd, u64 __iomem *tidptr, | |||
1720 | "not 2KB aligned!\n", pa); | 1720 | "not 2KB aligned!\n", pa); |
1721 | return; | 1721 | return; |
1722 | } | 1722 | } |
1723 | if (pa >= (1UL << IBA7220_TID_SZ_SHIFT)) { | 1723 | if (chippa >= (1UL << IBA7220_TID_SZ_SHIFT)) { |
1724 | ipath_dev_err(dd, | 1724 | ipath_dev_err(dd, |
1725 | "BUG: Physical page address 0x%lx " | 1725 | "BUG: Physical page address 0x%lx " |
1726 | "larger than supported\n", pa); | 1726 | "larger than supported\n", pa); |
diff --git a/drivers/infiniband/hw/ipath/ipath_ud.c b/drivers/infiniband/hw/ipath/ipath_ud.c index 36aa242c487c..729446f56aab 100644 --- a/drivers/infiniband/hw/ipath/ipath_ud.c +++ b/drivers/infiniband/hw/ipath/ipath_ud.c | |||
@@ -267,6 +267,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
267 | u16 lrh0; | 267 | u16 lrh0; |
268 | u16 lid; | 268 | u16 lid; |
269 | int ret = 0; | 269 | int ret = 0; |
270 | int next_cur; | ||
270 | 271 | ||
271 | spin_lock_irqsave(&qp->s_lock, flags); | 272 | spin_lock_irqsave(&qp->s_lock, flags); |
272 | 273 | ||
@@ -290,8 +291,9 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
290 | goto bail; | 291 | goto bail; |
291 | 292 | ||
292 | wqe = get_swqe_ptr(qp, qp->s_cur); | 293 | wqe = get_swqe_ptr(qp, qp->s_cur); |
293 | if (++qp->s_cur >= qp->s_size) | 294 | next_cur = qp->s_cur + 1; |
294 | qp->s_cur = 0; | 295 | if (next_cur >= qp->s_size) |
296 | next_cur = 0; | ||
295 | 297 | ||
296 | /* Construct the header. */ | 298 | /* Construct the header. */ |
297 | ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; | 299 | ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; |
@@ -315,6 +317,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
315 | qp->s_flags |= IPATH_S_WAIT_DMA; | 317 | qp->s_flags |= IPATH_S_WAIT_DMA; |
316 | goto bail; | 318 | goto bail; |
317 | } | 319 | } |
320 | qp->s_cur = next_cur; | ||
318 | spin_unlock_irqrestore(&qp->s_lock, flags); | 321 | spin_unlock_irqrestore(&qp->s_lock, flags); |
319 | ipath_ud_loopback(qp, wqe); | 322 | ipath_ud_loopback(qp, wqe); |
320 | spin_lock_irqsave(&qp->s_lock, flags); | 323 | spin_lock_irqsave(&qp->s_lock, flags); |
@@ -323,6 +326,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
323 | } | 326 | } |
324 | } | 327 | } |
325 | 328 | ||
329 | qp->s_cur = next_cur; | ||
326 | extra_bytes = -wqe->length & 3; | 330 | extra_bytes = -wqe->length & 3; |
327 | nwords = (wqe->length + extra_bytes) >> 2; | 331 | nwords = (wqe->length + extra_bytes) >> 2; |
328 | 332 | ||
diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index 39bd897b40c6..8eb7ae96974d 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h | |||
@@ -43,7 +43,6 @@ | |||
43 | #include <linux/dma-mapping.h> | 43 | #include <linux/dma-mapping.h> |
44 | #include <linux/workqueue.h> | 44 | #include <linux/workqueue.h> |
45 | #include <linux/slab.h> | 45 | #include <linux/slab.h> |
46 | #include <linux/version.h> | ||
47 | #include <asm/io.h> | 46 | #include <asm/io.h> |
48 | #include <linux/crc32c.h> | 47 | #include <linux/crc32c.h> |
49 | 48 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index f51201b17bfd..7e9e218738fa 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -156,14 +156,8 @@ static int ipoib_stop(struct net_device *dev) | |||
156 | 156 | ||
157 | netif_stop_queue(dev); | 157 | netif_stop_queue(dev); |
158 | 158 | ||
159 | /* | 159 | ipoib_ib_dev_down(dev, 0); |
160 | * Now flush workqueue to make sure a scheduled task doesn't | 160 | ipoib_ib_dev_stop(dev, 0); |
161 | * bring our internal state back up. | ||
162 | */ | ||
163 | flush_workqueue(ipoib_workqueue); | ||
164 | |||
165 | ipoib_ib_dev_down(dev, 1); | ||
166 | ipoib_ib_dev_stop(dev, 1); | ||
167 | 161 | ||
168 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { | 162 | if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { |
169 | struct ipoib_dev_priv *cpriv; | 163 | struct ipoib_dev_priv *cpriv; |
@@ -1314,7 +1308,7 @@ sysfs_failed: | |||
1314 | 1308 | ||
1315 | register_failed: | 1309 | register_failed: |
1316 | ib_unregister_event_handler(&priv->event_handler); | 1310 | ib_unregister_event_handler(&priv->event_handler); |
1317 | flush_scheduled_work(); | 1311 | flush_workqueue(ipoib_workqueue); |
1318 | 1312 | ||
1319 | event_failed: | 1313 | event_failed: |
1320 | ipoib_dev_cleanup(priv->dev); | 1314 | ipoib_dev_cleanup(priv->dev); |
@@ -1373,7 +1367,12 @@ static void ipoib_remove_one(struct ib_device *device) | |||
1373 | 1367 | ||
1374 | list_for_each_entry_safe(priv, tmp, dev_list, list) { | 1368 | list_for_each_entry_safe(priv, tmp, dev_list, list) { |
1375 | ib_unregister_event_handler(&priv->event_handler); | 1369 | ib_unregister_event_handler(&priv->event_handler); |
1376 | flush_scheduled_work(); | 1370 | |
1371 | rtnl_lock(); | ||
1372 | dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP); | ||
1373 | rtnl_unlock(); | ||
1374 | |||
1375 | flush_workqueue(ipoib_workqueue); | ||
1377 | 1376 | ||
1378 | unregister_netdev(priv->dev); | 1377 | unregister_netdev(priv->dev); |
1379 | ipoib_dev_cleanup(priv->dev); | 1378 | ipoib_dev_cleanup(priv->dev); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 8950e9546f4e..ac33c8f3ea85 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
@@ -392,8 +392,16 @@ static int ipoib_mcast_join_complete(int status, | |||
392 | &priv->mcast_task, 0); | 392 | &priv->mcast_task, 0); |
393 | mutex_unlock(&mcast_mutex); | 393 | mutex_unlock(&mcast_mutex); |
394 | 394 | ||
395 | if (mcast == priv->broadcast) | 395 | if (mcast == priv->broadcast) { |
396 | /* | ||
397 | * Take RTNL lock here to avoid racing with | ||
398 | * ipoib_stop() and turning the carrier back | ||
399 | * on while a device is being removed. | ||
400 | */ | ||
401 | rtnl_lock(); | ||
396 | netif_carrier_on(dev); | 402 | netif_carrier_on(dev); |
403 | rtnl_unlock(); | ||
404 | } | ||
397 | 405 | ||
398 | return 0; | 406 | return 0; |
399 | } | 407 | } |
diff --git a/drivers/infiniband/ulp/iser/iser_verbs.c b/drivers/infiniband/ulp/iser/iser_verbs.c index 63462ecca147..26ff6214a81f 100644 --- a/drivers/infiniband/ulp/iser/iser_verbs.c +++ b/drivers/infiniband/ulp/iser/iser_verbs.c | |||
@@ -33,7 +33,6 @@ | |||
33 | #include <linux/kernel.h> | 33 | #include <linux/kernel.h> |
34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
35 | #include <linux/delay.h> | 35 | #include <linux/delay.h> |
36 | #include <linux/version.h> | ||
37 | 36 | ||
38 | #include "iscsi_iser.h" | 37 | #include "iscsi_iser.h" |
39 | 38 | ||
diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c index 2d65411f6763..3524bef62be6 100644 --- a/drivers/input/evdev.c +++ b/drivers/input/evdev.c | |||
@@ -647,6 +647,47 @@ static int str_to_user(const char *str, unsigned int maxlen, void __user *p) | |||
647 | return copy_to_user(p, str, len) ? -EFAULT : len; | 647 | return copy_to_user(p, str, len) ? -EFAULT : len; |
648 | } | 648 | } |
649 | 649 | ||
650 | #define OLD_KEY_MAX 0x1ff | ||
651 | static int handle_eviocgbit(struct input_dev *dev, unsigned int cmd, void __user *p, int compat_mode) | ||
652 | { | ||
653 | static unsigned long keymax_warn_time; | ||
654 | unsigned long *bits; | ||
655 | int len; | ||
656 | |||
657 | switch (_IOC_NR(cmd) & EV_MAX) { | ||
658 | |||
659 | case 0: bits = dev->evbit; len = EV_MAX; break; | ||
660 | case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; | ||
661 | case EV_REL: bits = dev->relbit; len = REL_MAX; break; | ||
662 | case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; | ||
663 | case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; | ||
664 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | ||
665 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | ||
666 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | ||
667 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
668 | default: return -EINVAL; | ||
669 | } | ||
670 | |||
671 | /* | ||
672 | * Work around bugs in userspace programs that like to do | ||
673 | * EVIOCGBIT(EV_KEY, KEY_MAX) and not realize that 'len' | ||
674 | * should be in bytes, not in bits. | ||
675 | */ | ||
676 | if ((_IOC_NR(cmd) & EV_MAX) == EV_KEY && _IOC_SIZE(cmd) == OLD_KEY_MAX) { | ||
677 | len = OLD_KEY_MAX; | ||
678 | if (printk_timed_ratelimit(&keymax_warn_time, 10 * 1000)) | ||
679 | printk(KERN_WARNING | ||
680 | "evdev.c(EVIOCGBIT): Suspicious buffer size %u, " | ||
681 | "limiting output to %zu bytes. See " | ||
682 | "http://userweb.kernel.org/~dtor/eviocgbit-bug.html\n", | ||
683 | OLD_KEY_MAX, | ||
684 | BITS_TO_LONGS(OLD_KEY_MAX) * sizeof(long)); | ||
685 | } | ||
686 | |||
687 | return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode); | ||
688 | } | ||
689 | #undef OLD_KEY_MAX | ||
690 | |||
650 | static long evdev_do_ioctl(struct file *file, unsigned int cmd, | 691 | static long evdev_do_ioctl(struct file *file, unsigned int cmd, |
651 | void __user *p, int compat_mode) | 692 | void __user *p, int compat_mode) |
652 | { | 693 | { |
@@ -733,26 +774,8 @@ static long evdev_do_ioctl(struct file *file, unsigned int cmd, | |||
733 | 774 | ||
734 | if (_IOC_DIR(cmd) == _IOC_READ) { | 775 | if (_IOC_DIR(cmd) == _IOC_READ) { |
735 | 776 | ||
736 | if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) { | 777 | if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) |
737 | 778 | return handle_eviocgbit(dev, cmd, p, compat_mode); | |
738 | unsigned long *bits; | ||
739 | int len; | ||
740 | |||
741 | switch (_IOC_NR(cmd) & EV_MAX) { | ||
742 | |||
743 | case 0: bits = dev->evbit; len = EV_MAX; break; | ||
744 | case EV_KEY: bits = dev->keybit; len = KEY_MAX; break; | ||
745 | case EV_REL: bits = dev->relbit; len = REL_MAX; break; | ||
746 | case EV_ABS: bits = dev->absbit; len = ABS_MAX; break; | ||
747 | case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break; | ||
748 | case EV_LED: bits = dev->ledbit; len = LED_MAX; break; | ||
749 | case EV_SND: bits = dev->sndbit; len = SND_MAX; break; | ||
750 | case EV_FF: bits = dev->ffbit; len = FF_MAX; break; | ||
751 | case EV_SW: bits = dev->swbit; len = SW_MAX; break; | ||
752 | default: return -EINVAL; | ||
753 | } | ||
754 | return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode); | ||
755 | } | ||
756 | 779 | ||
757 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) | 780 | if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0))) |
758 | return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd), | 781 | return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd), |
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c index 87d3e7eabffd..6791be81eb29 100644 --- a/drivers/input/joystick/xpad.c +++ b/drivers/input/joystick/xpad.c | |||
@@ -127,6 +127,7 @@ static const struct xpad_device { | |||
127 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, | 127 | { 0x0738, 0x4716, "Mad Catz Wired Xbox 360 Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX360 }, |
128 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, | 128 | { 0x0738, 0x6040, "Mad Catz Beat Pad Pro", MAP_DPAD_TO_BUTTONS, XTYPE_XBOX }, |
129 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 129 | { 0x0c12, 0x8802, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
130 | { 0x0c12, 0x880a, "Pelican Eclipse PL-2023", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | ||
130 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 131 | { 0x0c12, 0x8810, "Zeroplus Xbox Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
131 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 132 | { 0x0c12, 0x9902, "HAMA VibraX - *FAULTY HARDWARE*", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
132 | { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, | 133 | { 0x0e4c, 0x1097, "Radica Gamester Controller", MAP_DPAD_TO_AXES, XTYPE_XBOX }, |
diff --git a/drivers/input/keyboard/bf54x-keys.c b/drivers/input/keyboard/bf54x-keys.c index 54ed8e2e1c02..6f227d3dbda1 100644 --- a/drivers/input/keyboard/bf54x-keys.c +++ b/drivers/input/keyboard/bf54x-keys.c | |||
@@ -29,7 +29,6 @@ | |||
29 | */ | 29 | */ |
30 | 30 | ||
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/version.h> | ||
33 | 32 | ||
34 | #include <linux/init.h> | 33 | #include <linux/init.h> |
35 | #include <linux/fs.h> | 34 | #include <linux/fs.h> |
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index be58730e636a..ec96b369dd7a 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c | |||
@@ -9,7 +9,6 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/module.h> | 11 | #include <linux/module.h> |
12 | #include <linux/version.h> | ||
13 | 12 | ||
14 | #include <linux/init.h> | 13 | #include <linux/init.h> |
15 | #include <linux/fs.h> | 14 | #include <linux/fs.h> |
@@ -118,6 +117,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
118 | unsigned int type = button->type ?: EV_KEY; | 117 | unsigned int type = button->type ?: EV_KEY; |
119 | 118 | ||
120 | bdata->input = input; | 119 | bdata->input = input; |
120 | bdata->button = button; | ||
121 | setup_timer(&bdata->timer, | 121 | setup_timer(&bdata->timer, |
122 | gpio_check_button, (unsigned long)bdata); | 122 | gpio_check_button, (unsigned long)bdata); |
123 | 123 | ||
@@ -256,7 +256,7 @@ static int gpio_keys_resume(struct platform_device *pdev) | |||
256 | #define gpio_keys_resume NULL | 256 | #define gpio_keys_resume NULL |
257 | #endif | 257 | #endif |
258 | 258 | ||
259 | struct platform_driver gpio_keys_device_driver = { | 259 | static struct platform_driver gpio_keys_device_driver = { |
260 | .probe = gpio_keys_probe, | 260 | .probe = gpio_keys_probe, |
261 | .remove = __devexit_p(gpio_keys_remove), | 261 | .remove = __devexit_p(gpio_keys_remove), |
262 | .suspend = gpio_keys_suspend, | 262 | .suspend = gpio_keys_suspend, |
diff --git a/drivers/input/misc/cobalt_btns.c b/drivers/input/misc/cobalt_btns.c index 6a1f48b76e32..2adf9cb265da 100644 --- a/drivers/input/misc/cobalt_btns.c +++ b/drivers/input/misc/cobalt_btns.c | |||
@@ -148,6 +148,9 @@ static int __devexit cobalt_buttons_remove(struct platform_device *pdev) | |||
148 | return 0; | 148 | return 0; |
149 | } | 149 | } |
150 | 150 | ||
151 | MODULE_AUTHOR("Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>"); | ||
152 | MODULE_DESCRIPTION("Cobalt button interface driver"); | ||
153 | MODULE_LICENSE("GPL"); | ||
151 | /* work with hotplug and coldplug */ | 154 | /* work with hotplug and coldplug */ |
152 | MODULE_ALIAS("platform:Cobalt buttons"); | 155 | MODULE_ALIAS("platform:Cobalt buttons"); |
153 | 156 | ||
diff --git a/drivers/input/mouse/Kconfig b/drivers/input/mouse/Kconfig index 7bbea097cda2..f996546fc443 100644 --- a/drivers/input/mouse/Kconfig +++ b/drivers/input/mouse/Kconfig | |||
@@ -130,6 +130,29 @@ config MOUSE_APPLETOUCH | |||
130 | To compile this driver as a module, choose M here: the | 130 | To compile this driver as a module, choose M here: the |
131 | module will be called appletouch. | 131 | module will be called appletouch. |
132 | 132 | ||
133 | config MOUSE_BCM5974 | ||
134 | tristate "Apple USB BCM5974 Multitouch trackpad support" | ||
135 | depends on USB_ARCH_HAS_HCD | ||
136 | select USB | ||
137 | help | ||
138 | Say Y here if you have an Apple USB BCM5974 Multitouch | ||
139 | trackpad. | ||
140 | |||
141 | The BCM5974 is the multitouch trackpad found in the Macbook | ||
142 | Air (JAN2008) and Macbook Pro Penryn (FEB2008) laptops. | ||
143 | |||
144 | It is also found in the IPhone (2007) and Ipod Touch (2008). | ||
145 | |||
146 | This driver provides multitouch functionality together with | ||
147 | the synaptics X11 driver. | ||
148 | |||
149 | The interface is currently identical to the appletouch interface, | ||
150 | for further information, see | ||
151 | <file:Documentation/input/appletouch.txt>. | ||
152 | |||
153 | To compile this driver as a module, choose M here: the | ||
154 | module will be called bcm5974. | ||
155 | |||
133 | config MOUSE_INPORT | 156 | config MOUSE_INPORT |
134 | tristate "InPort/MS/ATIXL busmouse" | 157 | tristate "InPort/MS/ATIXL busmouse" |
135 | depends on ISA | 158 | depends on ISA |
diff --git a/drivers/input/mouse/Makefile b/drivers/input/mouse/Makefile index 9e6e36330820..d4d202516090 100644 --- a/drivers/input/mouse/Makefile +++ b/drivers/input/mouse/Makefile | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o | 7 | obj-$(CONFIG_MOUSE_AMIGA) += amimouse.o |
8 | obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o | 8 | obj-$(CONFIG_MOUSE_APPLETOUCH) += appletouch.o |
9 | obj-$(CONFIG_MOUSE_BCM5974) += bcm5974.o | ||
9 | obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o | 10 | obj-$(CONFIG_MOUSE_ATARI) += atarimouse.o |
10 | obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o | 11 | obj-$(CONFIG_MOUSE_RISCPC) += rpcmouse.o |
11 | obj-$(CONFIG_MOUSE_INPORT) += inport.o | 12 | obj-$(CONFIG_MOUSE_INPORT) += inport.o |
diff --git a/drivers/input/mouse/bcm5974.c b/drivers/input/mouse/bcm5974.c new file mode 100644 index 000000000000..2ec921bf3c60 --- /dev/null +++ b/drivers/input/mouse/bcm5974.c | |||
@@ -0,0 +1,681 @@ | |||
1 | /* | ||
2 | * Apple USB BCM5974 (Macbook Air and Penryn Macbook Pro) multitouch driver | ||
3 | * | ||
4 | * Copyright (C) 2008 Henrik Rydberg (rydberg@euromail.se) | ||
5 | * | ||
6 | * The USB initialization and package decoding was made by | ||
7 | * Scott Shawcroft as part of the touchd user-space driver project: | ||
8 | * Copyright (C) 2008 Scott Shawcroft (scott.shawcroft@gmail.com) | ||
9 | * | ||
10 | * The BCM5974 driver is based on the appletouch driver: | ||
11 | * Copyright (C) 2001-2004 Greg Kroah-Hartman (greg@kroah.com) | ||
12 | * Copyright (C) 2005 Johannes Berg (johannes@sipsolutions.net) | ||
13 | * Copyright (C) 2005 Stelian Pop (stelian@popies.net) | ||
14 | * Copyright (C) 2005 Frank Arnold (frank@scirocco-5v-turbo.de) | ||
15 | * Copyright (C) 2005 Peter Osterlund (petero2@telia.com) | ||
16 | * Copyright (C) 2005 Michael Hanselmann (linux-kernel@hansmi.ch) | ||
17 | * Copyright (C) 2006 Nicolas Boichat (nicolas@boichat.ch) | ||
18 | * | ||
19 | * This program is free software; you can redistribute it and/or modify | ||
20 | * it under the terms of the GNU General Public License as published by | ||
21 | * the Free Software Foundation; either version 2 of the License, or | ||
22 | * (at your option) any later version. | ||
23 | * | ||
24 | * This program is distributed in the hope that it will be useful, | ||
25 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
26 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
27 | * GNU General Public License for more details. | ||
28 | * | ||
29 | * You should have received a copy of the GNU General Public License | ||
30 | * along with this program; if not, write to the Free Software | ||
31 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
32 | * | ||
33 | */ | ||
34 | |||
35 | #include <linux/kernel.h> | ||
36 | #include <linux/errno.h> | ||
37 | #include <linux/init.h> | ||
38 | #include <linux/slab.h> | ||
39 | #include <linux/module.h> | ||
40 | #include <linux/usb/input.h> | ||
41 | #include <linux/hid.h> | ||
42 | #include <linux/mutex.h> | ||
43 | |||
44 | #define USB_VENDOR_ID_APPLE 0x05ac | ||
45 | |||
46 | /* MacbookAir, aka wellspring */ | ||
47 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223 | ||
48 | #define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224 | ||
49 | #define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225 | ||
50 | /* MacbookProPenryn, aka wellspring2 */ | ||
51 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230 | ||
52 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231 | ||
53 | #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232 | ||
54 | |||
55 | #define BCM5974_DEVICE(prod) { \ | ||
56 | .match_flags = (USB_DEVICE_ID_MATCH_DEVICE | \ | ||
57 | USB_DEVICE_ID_MATCH_INT_CLASS | \ | ||
58 | USB_DEVICE_ID_MATCH_INT_PROTOCOL), \ | ||
59 | .idVendor = USB_VENDOR_ID_APPLE, \ | ||
60 | .idProduct = (prod), \ | ||
61 | .bInterfaceClass = USB_INTERFACE_CLASS_HID, \ | ||
62 | .bInterfaceProtocol = USB_INTERFACE_PROTOCOL_MOUSE \ | ||
63 | } | ||
64 | |||
65 | /* table of devices that work with this driver */ | ||
66 | static const struct usb_device_id bcm5974_table [] = { | ||
67 | /* MacbookAir1.1 */ | ||
68 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ANSI), | ||
69 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_ISO), | ||
70 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING_JIS), | ||
71 | /* MacbookProPenryn */ | ||
72 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI), | ||
73 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_ISO), | ||
74 | BCM5974_DEVICE(USB_DEVICE_ID_APPLE_WELLSPRING2_JIS), | ||
75 | /* Terminating entry */ | ||
76 | {} | ||
77 | }; | ||
78 | MODULE_DEVICE_TABLE(usb, bcm5974_table); | ||
79 | |||
80 | MODULE_AUTHOR("Henrik Rydberg"); | ||
81 | MODULE_DESCRIPTION("Apple USB BCM5974 multitouch driver"); | ||
82 | MODULE_LICENSE("GPL"); | ||
83 | |||
84 | #define dprintk(level, format, a...)\ | ||
85 | { if (debug >= level) printk(KERN_DEBUG format, ##a); } | ||
86 | |||
87 | static int debug = 1; | ||
88 | module_param(debug, int, 0644); | ||
89 | MODULE_PARM_DESC(debug, "Activate debugging output"); | ||
90 | |||
91 | /* button data structure */ | ||
92 | struct bt_data { | ||
93 | u8 unknown1; /* constant */ | ||
94 | u8 button; /* left button */ | ||
95 | u8 rel_x; /* relative x coordinate */ | ||
96 | u8 rel_y; /* relative y coordinate */ | ||
97 | }; | ||
98 | |||
99 | /* trackpad header structure */ | ||
100 | struct tp_header { | ||
101 | u8 unknown1[16]; /* constants, timers, etc */ | ||
102 | u8 fingers; /* number of fingers on trackpad */ | ||
103 | u8 unknown2[9]; /* constants, timers, etc */ | ||
104 | }; | ||
105 | |||
106 | /* trackpad finger structure */ | ||
107 | struct tp_finger { | ||
108 | __le16 origin; /* left/right origin? */ | ||
109 | __le16 abs_x; /* absolute x coodinate */ | ||
110 | __le16 abs_y; /* absolute y coodinate */ | ||
111 | __le16 rel_x; /* relative x coodinate */ | ||
112 | __le16 rel_y; /* relative y coodinate */ | ||
113 | __le16 size_major; /* finger size, major axis? */ | ||
114 | __le16 size_minor; /* finger size, minor axis? */ | ||
115 | __le16 orientation; /* 16384 when point, else 15 bit angle */ | ||
116 | __le16 force_major; /* trackpad force, major axis? */ | ||
117 | __le16 force_minor; /* trackpad force, minor axis? */ | ||
118 | __le16 unused[3]; /* zeros */ | ||
119 | __le16 multi; /* one finger: varies, more fingers: constant */ | ||
120 | }; | ||
121 | |||
122 | /* trackpad data structure, empirically at least ten fingers */ | ||
123 | struct tp_data { | ||
124 | struct tp_header header; | ||
125 | struct tp_finger finger[16]; | ||
126 | }; | ||
127 | |||
128 | /* device-specific parameters */ | ||
129 | struct bcm5974_param { | ||
130 | int dim; /* logical dimension */ | ||
131 | int fuzz; /* logical noise value */ | ||
132 | int devmin; /* device minimum reading */ | ||
133 | int devmax; /* device maximum reading */ | ||
134 | }; | ||
135 | |||
136 | /* device-specific configuration */ | ||
137 | struct bcm5974_config { | ||
138 | int ansi, iso, jis; /* the product id of this device */ | ||
139 | int bt_ep; /* the endpoint of the button interface */ | ||
140 | int bt_datalen; /* data length of the button interface */ | ||
141 | int tp_ep; /* the endpoint of the trackpad interface */ | ||
142 | int tp_datalen; /* data length of the trackpad interface */ | ||
143 | struct bcm5974_param p; /* finger pressure limits */ | ||
144 | struct bcm5974_param w; /* finger width limits */ | ||
145 | struct bcm5974_param x; /* horizontal limits */ | ||
146 | struct bcm5974_param y; /* vertical limits */ | ||
147 | }; | ||
148 | |||
149 | /* logical device structure */ | ||
150 | struct bcm5974 { | ||
151 | char phys[64]; | ||
152 | struct usb_device *udev; /* usb device */ | ||
153 | struct usb_interface *intf; /* our interface */ | ||
154 | struct input_dev *input; /* input dev */ | ||
155 | struct bcm5974_config cfg; /* device configuration */ | ||
156 | struct mutex pm_mutex; /* serialize access to open/suspend */ | ||
157 | int opened; /* 1: opened, 0: closed */ | ||
158 | struct urb *bt_urb; /* button usb request block */ | ||
159 | struct bt_data *bt_data; /* button transferred data */ | ||
160 | struct urb *tp_urb; /* trackpad usb request block */ | ||
161 | struct tp_data *tp_data; /* trackpad transferred data */ | ||
162 | }; | ||
163 | |||
164 | /* logical dimensions */ | ||
165 | #define DIM_PRESSURE 256 /* maximum finger pressure */ | ||
166 | #define DIM_WIDTH 16 /* maximum finger width */ | ||
167 | #define DIM_X 1280 /* maximum trackpad x value */ | ||
168 | #define DIM_Y 800 /* maximum trackpad y value */ | ||
169 | |||
170 | /* logical signal quality */ | ||
171 | #define SN_PRESSURE 45 /* pressure signal-to-noise ratio */ | ||
172 | #define SN_WIDTH 100 /* width signal-to-noise ratio */ | ||
173 | #define SN_COORD 250 /* coordinate signal-to-noise ratio */ | ||
174 | |||
175 | /* device constants */ | ||
176 | static const struct bcm5974_config bcm5974_config_table[] = { | ||
177 | { | ||
178 | USB_DEVICE_ID_APPLE_WELLSPRING_ANSI, | ||
179 | USB_DEVICE_ID_APPLE_WELLSPRING_ISO, | ||
180 | USB_DEVICE_ID_APPLE_WELLSPRING_JIS, | ||
181 | 0x84, sizeof(struct bt_data), | ||
182 | 0x81, sizeof(struct tp_data), | ||
183 | { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 }, | ||
184 | { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, | ||
185 | { DIM_X, DIM_X / SN_COORD, -4824, 5342 }, | ||
186 | { DIM_Y, DIM_Y / SN_COORD, -172, 5820 } | ||
187 | }, | ||
188 | { | ||
189 | USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI, | ||
190 | USB_DEVICE_ID_APPLE_WELLSPRING2_ISO, | ||
191 | USB_DEVICE_ID_APPLE_WELLSPRING2_JIS, | ||
192 | 0x84, sizeof(struct bt_data), | ||
193 | 0x81, sizeof(struct tp_data), | ||
194 | { DIM_PRESSURE, DIM_PRESSURE / SN_PRESSURE, 0, 256 }, | ||
195 | { DIM_WIDTH, DIM_WIDTH / SN_WIDTH, 0, 2048 }, | ||
196 | { DIM_X, DIM_X / SN_COORD, -4824, 4824 }, | ||
197 | { DIM_Y, DIM_Y / SN_COORD, -172, 4290 } | ||
198 | }, | ||
199 | {} | ||
200 | }; | ||
201 | |||
202 | /* return the device-specific configuration by device */ | ||
203 | static const struct bcm5974_config *bcm5974_get_config(struct usb_device *udev) | ||
204 | { | ||
205 | u16 id = le16_to_cpu(udev->descriptor.idProduct); | ||
206 | const struct bcm5974_config *cfg; | ||
207 | |||
208 | for (cfg = bcm5974_config_table; cfg->ansi; ++cfg) | ||
209 | if (cfg->ansi == id || cfg->iso == id || cfg->jis == id) | ||
210 | return cfg; | ||
211 | |||
212 | return bcm5974_config_table; | ||
213 | } | ||
214 | |||
215 | /* convert 16-bit little endian to signed integer */ | ||
216 | static inline int raw2int(__le16 x) | ||
217 | { | ||
218 | return (signed short)le16_to_cpu(x); | ||
219 | } | ||
220 | |||
221 | /* scale device data to logical dimensions (asserts devmin < devmax) */ | ||
222 | static inline int int2scale(const struct bcm5974_param *p, int x) | ||
223 | { | ||
224 | return x * p->dim / (p->devmax - p->devmin); | ||
225 | } | ||
226 | |||
227 | /* all logical value ranges are [0,dim). */ | ||
228 | static inline int int2bound(const struct bcm5974_param *p, int x) | ||
229 | { | ||
230 | int s = int2scale(p, x); | ||
231 | |||
232 | return clamp_val(s, 0, p->dim - 1); | ||
233 | } | ||
234 | |||
235 | /* setup which logical events to report */ | ||
236 | static void setup_events_to_report(struct input_dev *input_dev, | ||
237 | const struct bcm5974_config *cfg) | ||
238 | { | ||
239 | __set_bit(EV_ABS, input_dev->evbit); | ||
240 | |||
241 | input_set_abs_params(input_dev, ABS_PRESSURE, | ||
242 | 0, cfg->p.dim, cfg->p.fuzz, 0); | ||
243 | input_set_abs_params(input_dev, ABS_TOOL_WIDTH, | ||
244 | 0, cfg->w.dim, cfg->w.fuzz, 0); | ||
245 | input_set_abs_params(input_dev, ABS_X, | ||
246 | 0, cfg->x.dim, cfg->x.fuzz, 0); | ||
247 | input_set_abs_params(input_dev, ABS_Y, | ||
248 | 0, cfg->y.dim, cfg->y.fuzz, 0); | ||
249 | |||
250 | __set_bit(EV_KEY, input_dev->evbit); | ||
251 | __set_bit(BTN_TOOL_FINGER, input_dev->keybit); | ||
252 | __set_bit(BTN_TOOL_DOUBLETAP, input_dev->keybit); | ||
253 | __set_bit(BTN_TOOL_TRIPLETAP, input_dev->keybit); | ||
254 | __set_bit(BTN_LEFT, input_dev->keybit); | ||
255 | } | ||
256 | |||
257 | /* report button data as logical button state */ | ||
258 | static int report_bt_state(struct bcm5974 *dev, int size) | ||
259 | { | ||
260 | if (size != sizeof(struct bt_data)) | ||
261 | return -EIO; | ||
262 | |||
263 | input_report_key(dev->input, BTN_LEFT, dev->bt_data->button); | ||
264 | input_sync(dev->input); | ||
265 | |||
266 | return 0; | ||
267 | } | ||
268 | |||
269 | /* report trackpad data as logical trackpad state */ | ||
270 | static int report_tp_state(struct bcm5974 *dev, int size) | ||
271 | { | ||
272 | const struct bcm5974_config *c = &dev->cfg; | ||
273 | const struct tp_finger *f = dev->tp_data->finger; | ||
274 | struct input_dev *input = dev->input; | ||
275 | const int fingers = (size - 26) / 28; | ||
276 | int p = 0, w, x, y, n = 0; | ||
277 | |||
278 | if (size < 26 || (size - 26) % 28 != 0) | ||
279 | return -EIO; | ||
280 | |||
281 | if (fingers) { | ||
282 | p = raw2int(f->force_major); | ||
283 | w = raw2int(f->size_major); | ||
284 | x = raw2int(f->abs_x); | ||
285 | y = raw2int(f->abs_y); | ||
286 | n = p > 0 ? fingers : 0; | ||
287 | |||
288 | dprintk(9, | ||
289 | "bcm5974: p: %+05d w: %+05d x: %+05d y: %+05d n: %d\n", | ||
290 | p, w, x, y, n); | ||
291 | |||
292 | input_report_abs(input, ABS_TOOL_WIDTH, int2bound(&c->w, w)); | ||
293 | input_report_abs(input, ABS_X, int2bound(&c->x, x - c->x.devmin)); | ||
294 | input_report_abs(input, ABS_Y, int2bound(&c->y, c->y.devmax - y)); | ||
295 | } | ||
296 | |||
297 | input_report_abs(input, ABS_PRESSURE, int2bound(&c->p, p)); | ||
298 | |||
299 | input_report_key(input, BTN_TOOL_FINGER, n == 1); | ||
300 | input_report_key(input, BTN_TOOL_DOUBLETAP, n == 2); | ||
301 | input_report_key(input, BTN_TOOL_TRIPLETAP, n > 2); | ||
302 | |||
303 | input_sync(input); | ||
304 | |||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | /* Wellspring initialization constants */ | ||
309 | #define BCM5974_WELLSPRING_MODE_READ_REQUEST_ID 1 | ||
310 | #define BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID 9 | ||
311 | #define BCM5974_WELLSPRING_MODE_REQUEST_VALUE 0x300 | ||
312 | #define BCM5974_WELLSPRING_MODE_REQUEST_INDEX 0 | ||
313 | #define BCM5974_WELLSPRING_MODE_VENDOR_VALUE 0x01 | ||
314 | |||
315 | static int bcm5974_wellspring_mode(struct bcm5974 *dev) | ||
316 | { | ||
317 | char *data = kmalloc(8, GFP_KERNEL); | ||
318 | int retval = 0, size; | ||
319 | |||
320 | if (!data) { | ||
321 | err("bcm5974: out of memory"); | ||
322 | retval = -ENOMEM; | ||
323 | goto out; | ||
324 | } | ||
325 | |||
326 | /* read configuration */ | ||
327 | size = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | ||
328 | BCM5974_WELLSPRING_MODE_READ_REQUEST_ID, | ||
329 | USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
330 | BCM5974_WELLSPRING_MODE_REQUEST_VALUE, | ||
331 | BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000); | ||
332 | |||
333 | if (size != 8) { | ||
334 | err("bcm5974: could not read from device"); | ||
335 | retval = -EIO; | ||
336 | goto out; | ||
337 | } | ||
338 | |||
339 | /* apply the mode switch */ | ||
340 | data[0] = BCM5974_WELLSPRING_MODE_VENDOR_VALUE; | ||
341 | |||
342 | /* write configuration */ | ||
343 | size = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | ||
344 | BCM5974_WELLSPRING_MODE_WRITE_REQUEST_ID, | ||
345 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, | ||
346 | BCM5974_WELLSPRING_MODE_REQUEST_VALUE, | ||
347 | BCM5974_WELLSPRING_MODE_REQUEST_INDEX, data, 8, 5000); | ||
348 | |||
349 | if (size != 8) { | ||
350 | err("bcm5974: could not write to device"); | ||
351 | retval = -EIO; | ||
352 | goto out; | ||
353 | } | ||
354 | |||
355 | dprintk(2, "bcm5974: switched to wellspring mode.\n"); | ||
356 | |||
357 | out: | ||
358 | kfree(data); | ||
359 | return retval; | ||
360 | } | ||
361 | |||
362 | static void bcm5974_irq_button(struct urb *urb) | ||
363 | { | ||
364 | struct bcm5974 *dev = urb->context; | ||
365 | int error; | ||
366 | |||
367 | switch (urb->status) { | ||
368 | case 0: | ||
369 | break; | ||
370 | case -EOVERFLOW: | ||
371 | case -ECONNRESET: | ||
372 | case -ENOENT: | ||
373 | case -ESHUTDOWN: | ||
374 | dbg("bcm5974: button urb shutting down: %d", urb->status); | ||
375 | return; | ||
376 | default: | ||
377 | dbg("bcm5974: button urb status: %d", urb->status); | ||
378 | goto exit; | ||
379 | } | ||
380 | |||
381 | if (report_bt_state(dev, dev->bt_urb->actual_length)) | ||
382 | dprintk(1, "bcm5974: bad button package, length: %d\n", | ||
383 | dev->bt_urb->actual_length); | ||
384 | |||
385 | exit: | ||
386 | error = usb_submit_urb(dev->bt_urb, GFP_ATOMIC); | ||
387 | if (error) | ||
388 | err("bcm5974: button urb failed: %d", error); | ||
389 | } | ||
390 | |||
391 | static void bcm5974_irq_trackpad(struct urb *urb) | ||
392 | { | ||
393 | struct bcm5974 *dev = urb->context; | ||
394 | int error; | ||
395 | |||
396 | switch (urb->status) { | ||
397 | case 0: | ||
398 | break; | ||
399 | case -EOVERFLOW: | ||
400 | case -ECONNRESET: | ||
401 | case -ENOENT: | ||
402 | case -ESHUTDOWN: | ||
403 | dbg("bcm5974: trackpad urb shutting down: %d", urb->status); | ||
404 | return; | ||
405 | default: | ||
406 | dbg("bcm5974: trackpad urb status: %d", urb->status); | ||
407 | goto exit; | ||
408 | } | ||
409 | |||
410 | /* control response ignored */ | ||
411 | if (dev->tp_urb->actual_length == 2) | ||
412 | goto exit; | ||
413 | |||
414 | if (report_tp_state(dev, dev->tp_urb->actual_length)) | ||
415 | dprintk(1, "bcm5974: bad trackpad package, length: %d\n", | ||
416 | dev->tp_urb->actual_length); | ||
417 | |||
418 | exit: | ||
419 | error = usb_submit_urb(dev->tp_urb, GFP_ATOMIC); | ||
420 | if (error) | ||
421 | err("bcm5974: trackpad urb failed: %d", error); | ||
422 | } | ||
423 | |||
424 | /* | ||
425 | * The Wellspring trackpad, like many recent Apple trackpads, share | ||
426 | * the usb device with the keyboard. Since keyboards are usually | ||
427 | * handled by the HID system, the device ends up being handled by two | ||
428 | * modules. Setting up the device therefore becomes slightly | ||
429 | * complicated. To enable multitouch features, a mode switch is | ||
430 | * required, which is usually applied via the control interface of the | ||
431 | * device. It can be argued where this switch should take place. In | ||
432 | * some drivers, like appletouch, the switch is made during | ||
433 | * probe. However, the hid module may also alter the state of the | ||
434 | * device, resulting in trackpad malfunction under certain | ||
435 | * circumstances. To get around this problem, there is at least one | ||
436 | * example that utilizes the USB_QUIRK_RESET_RESUME quirk in order to | ||
437 | * recieve a reset_resume request rather than the normal resume. | ||
438 | * Since the implementation of reset_resume is equal to mode switch | ||
439 | * plus start_traffic, it seems easier to always do the switch when | ||
440 | * starting traffic on the device. | ||
441 | */ | ||
442 | static int bcm5974_start_traffic(struct bcm5974 *dev) | ||
443 | { | ||
444 | if (bcm5974_wellspring_mode(dev)) { | ||
445 | dprintk(1, "bcm5974: mode switch failed\n"); | ||
446 | goto error; | ||
447 | } | ||
448 | |||
449 | if (usb_submit_urb(dev->bt_urb, GFP_KERNEL)) | ||
450 | goto error; | ||
451 | |||
452 | if (usb_submit_urb(dev->tp_urb, GFP_KERNEL)) | ||
453 | goto err_kill_bt; | ||
454 | |||
455 | return 0; | ||
456 | |||
457 | err_kill_bt: | ||
458 | usb_kill_urb(dev->bt_urb); | ||
459 | error: | ||
460 | return -EIO; | ||
461 | } | ||
462 | |||
463 | static void bcm5974_pause_traffic(struct bcm5974 *dev) | ||
464 | { | ||
465 | usb_kill_urb(dev->tp_urb); | ||
466 | usb_kill_urb(dev->bt_urb); | ||
467 | } | ||
468 | |||
469 | /* | ||
470 | * The code below implements open/close and manual suspend/resume. | ||
471 | * All functions may be called in random order. | ||
472 | * | ||
473 | * Opening a suspended device fails with EACCES - permission denied. | ||
474 | * | ||
475 | * Failing a resume leaves the device resumed but closed. | ||
476 | */ | ||
477 | static int bcm5974_open(struct input_dev *input) | ||
478 | { | ||
479 | struct bcm5974 *dev = input_get_drvdata(input); | ||
480 | int error; | ||
481 | |||
482 | error = usb_autopm_get_interface(dev->intf); | ||
483 | if (error) | ||
484 | return error; | ||
485 | |||
486 | mutex_lock(&dev->pm_mutex); | ||
487 | |||
488 | error = bcm5974_start_traffic(dev); | ||
489 | if (!error) | ||
490 | dev->opened = 1; | ||
491 | |||
492 | mutex_unlock(&dev->pm_mutex); | ||
493 | |||
494 | if (error) | ||
495 | usb_autopm_put_interface(dev->intf); | ||
496 | |||
497 | return error; | ||
498 | } | ||
499 | |||
500 | static void bcm5974_close(struct input_dev *input) | ||
501 | { | ||
502 | struct bcm5974 *dev = input_get_drvdata(input); | ||
503 | |||
504 | mutex_lock(&dev->pm_mutex); | ||
505 | |||
506 | bcm5974_pause_traffic(dev); | ||
507 | dev->opened = 0; | ||
508 | |||
509 | mutex_unlock(&dev->pm_mutex); | ||
510 | |||
511 | usb_autopm_put_interface(dev->intf); | ||
512 | } | ||
513 | |||
514 | static int bcm5974_suspend(struct usb_interface *iface, pm_message_t message) | ||
515 | { | ||
516 | struct bcm5974 *dev = usb_get_intfdata(iface); | ||
517 | |||
518 | mutex_lock(&dev->pm_mutex); | ||
519 | |||
520 | if (dev->opened) | ||
521 | bcm5974_pause_traffic(dev); | ||
522 | |||
523 | mutex_unlock(&dev->pm_mutex); | ||
524 | |||
525 | return 0; | ||
526 | } | ||
527 | |||
528 | static int bcm5974_resume(struct usb_interface *iface) | ||
529 | { | ||
530 | struct bcm5974 *dev = usb_get_intfdata(iface); | ||
531 | int error = 0; | ||
532 | |||
533 | mutex_lock(&dev->pm_mutex); | ||
534 | |||
535 | if (dev->opened) | ||
536 | error = bcm5974_start_traffic(dev); | ||
537 | |||
538 | mutex_unlock(&dev->pm_mutex); | ||
539 | |||
540 | return error; | ||
541 | } | ||
542 | |||
543 | static int bcm5974_probe(struct usb_interface *iface, | ||
544 | const struct usb_device_id *id) | ||
545 | { | ||
546 | struct usb_device *udev = interface_to_usbdev(iface); | ||
547 | const struct bcm5974_config *cfg; | ||
548 | struct bcm5974 *dev; | ||
549 | struct input_dev *input_dev; | ||
550 | int error = -ENOMEM; | ||
551 | |||
552 | /* find the product index */ | ||
553 | cfg = bcm5974_get_config(udev); | ||
554 | |||
555 | /* allocate memory for our device state and initialize it */ | ||
556 | dev = kzalloc(sizeof(struct bcm5974), GFP_KERNEL); | ||
557 | input_dev = input_allocate_device(); | ||
558 | if (!dev || !input_dev) { | ||
559 | err("bcm5974: out of memory"); | ||
560 | goto err_free_devs; | ||
561 | } | ||
562 | |||
563 | dev->udev = udev; | ||
564 | dev->intf = iface; | ||
565 | dev->input = input_dev; | ||
566 | dev->cfg = *cfg; | ||
567 | mutex_init(&dev->pm_mutex); | ||
568 | |||
569 | /* setup urbs */ | ||
570 | dev->bt_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
571 | if (!dev->bt_urb) | ||
572 | goto err_free_devs; | ||
573 | |||
574 | dev->tp_urb = usb_alloc_urb(0, GFP_KERNEL); | ||
575 | if (!dev->tp_urb) | ||
576 | goto err_free_bt_urb; | ||
577 | |||
578 | dev->bt_data = usb_buffer_alloc(dev->udev, | ||
579 | dev->cfg.bt_datalen, GFP_KERNEL, | ||
580 | &dev->bt_urb->transfer_dma); | ||
581 | if (!dev->bt_data) | ||
582 | goto err_free_urb; | ||
583 | |||
584 | dev->tp_data = usb_buffer_alloc(dev->udev, | ||
585 | dev->cfg.tp_datalen, GFP_KERNEL, | ||
586 | &dev->tp_urb->transfer_dma); | ||
587 | if (!dev->tp_data) | ||
588 | goto err_free_bt_buffer; | ||
589 | |||
590 | usb_fill_int_urb(dev->bt_urb, udev, | ||
591 | usb_rcvintpipe(udev, cfg->bt_ep), | ||
592 | dev->bt_data, dev->cfg.bt_datalen, | ||
593 | bcm5974_irq_button, dev, 1); | ||
594 | |||
595 | usb_fill_int_urb(dev->tp_urb, udev, | ||
596 | usb_rcvintpipe(udev, cfg->tp_ep), | ||
597 | dev->tp_data, dev->cfg.tp_datalen, | ||
598 | bcm5974_irq_trackpad, dev, 1); | ||
599 | |||
600 | /* create bcm5974 device */ | ||
601 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); | ||
602 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); | ||
603 | |||
604 | input_dev->name = "bcm5974"; | ||
605 | input_dev->phys = dev->phys; | ||
606 | usb_to_input_id(dev->udev, &input_dev->id); | ||
607 | input_dev->dev.parent = &iface->dev; | ||
608 | |||
609 | input_set_drvdata(input_dev, dev); | ||
610 | |||
611 | input_dev->open = bcm5974_open; | ||
612 | input_dev->close = bcm5974_close; | ||
613 | |||
614 | setup_events_to_report(input_dev, cfg); | ||
615 | |||
616 | error = input_register_device(dev->input); | ||
617 | if (error) | ||
618 | goto err_free_buffer; | ||
619 | |||
620 | /* save our data pointer in this interface device */ | ||
621 | usb_set_intfdata(iface, dev); | ||
622 | |||
623 | return 0; | ||
624 | |||
625 | err_free_buffer: | ||
626 | usb_buffer_free(dev->udev, dev->cfg.tp_datalen, | ||
627 | dev->tp_data, dev->tp_urb->transfer_dma); | ||
628 | err_free_bt_buffer: | ||
629 | usb_buffer_free(dev->udev, dev->cfg.bt_datalen, | ||
630 | dev->bt_data, dev->bt_urb->transfer_dma); | ||
631 | err_free_urb: | ||
632 | usb_free_urb(dev->tp_urb); | ||
633 | err_free_bt_urb: | ||
634 | usb_free_urb(dev->bt_urb); | ||
635 | err_free_devs: | ||
636 | usb_set_intfdata(iface, NULL); | ||
637 | input_free_device(input_dev); | ||
638 | kfree(dev); | ||
639 | return error; | ||
640 | } | ||
641 | |||
642 | static void bcm5974_disconnect(struct usb_interface *iface) | ||
643 | { | ||
644 | struct bcm5974 *dev = usb_get_intfdata(iface); | ||
645 | |||
646 | usb_set_intfdata(iface, NULL); | ||
647 | |||
648 | input_unregister_device(dev->input); | ||
649 | usb_buffer_free(dev->udev, dev->cfg.tp_datalen, | ||
650 | dev->tp_data, dev->tp_urb->transfer_dma); | ||
651 | usb_buffer_free(dev->udev, dev->cfg.bt_datalen, | ||
652 | dev->bt_data, dev->bt_urb->transfer_dma); | ||
653 | usb_free_urb(dev->tp_urb); | ||
654 | usb_free_urb(dev->bt_urb); | ||
655 | kfree(dev); | ||
656 | } | ||
657 | |||
658 | static struct usb_driver bcm5974_driver = { | ||
659 | .name = "bcm5974", | ||
660 | .probe = bcm5974_probe, | ||
661 | .disconnect = bcm5974_disconnect, | ||
662 | .suspend = bcm5974_suspend, | ||
663 | .resume = bcm5974_resume, | ||
664 | .reset_resume = bcm5974_resume, | ||
665 | .id_table = bcm5974_table, | ||
666 | .supports_autosuspend = 1, | ||
667 | }; | ||
668 | |||
669 | static int __init bcm5974_init(void) | ||
670 | { | ||
671 | return usb_register(&bcm5974_driver); | ||
672 | } | ||
673 | |||
674 | static void __exit bcm5974_exit(void) | ||
675 | { | ||
676 | usb_deregister(&bcm5974_driver); | ||
677 | } | ||
678 | |||
679 | module_init(bcm5974_init); | ||
680 | module_exit(bcm5974_exit); | ||
681 | |||
diff --git a/drivers/input/mouse/gpio_mouse.c b/drivers/input/mouse/gpio_mouse.c index 339290184871..72cf5e33790e 100644 --- a/drivers/input/mouse/gpio_mouse.c +++ b/drivers/input/mouse/gpio_mouse.c | |||
@@ -9,7 +9,6 @@ | |||
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/version.h> | ||
13 | #include <linux/module.h> | 12 | #include <linux/module.h> |
14 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
15 | #include <linux/input-polldev.h> | 14 | #include <linux/input-polldev.h> |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index fe732a574ec2..3282b741e246 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -394,6 +394,13 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { | |||
394 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), | 394 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 2490"), |
395 | }, | 395 | }, |
396 | }, | 396 | }, |
397 | { | ||
398 | .ident = "Acer TravelMate 4280", | ||
399 | .matches = { | ||
400 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
401 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 4280"), | ||
402 | }, | ||
403 | }, | ||
397 | { } | 404 | { } |
398 | }; | 405 | }; |
399 | 406 | ||
diff --git a/drivers/input/serio/xilinx_ps2.c b/drivers/input/serio/xilinx_ps2.c index 0ed044d5e685..765007899d9a 100644 --- a/drivers/input/serio/xilinx_ps2.c +++ b/drivers/input/serio/xilinx_ps2.c | |||
@@ -269,8 +269,8 @@ static int xps2_setup(struct device *dev, struct resource *regs_res, | |||
269 | * we have the PS2 in a good state */ | 269 | * we have the PS2 in a good state */ |
270 | out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET); | 270 | out_be32(drvdata->base_address + XPS2_SRST_OFFSET, XPS2_SRST_RESET); |
271 | 271 | ||
272 | dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%08X, irq=%d\n", | 272 | dev_info(dev, "Xilinx PS2 at 0x%08X mapped to 0x%p, irq=%d\n", |
273 | drvdata->phys_addr, (u32)drvdata->base_address, drvdata->irq); | 273 | drvdata->phys_addr, drvdata->base_address, drvdata->irq); |
274 | 274 | ||
275 | serio = &drvdata->serio; | 275 | serio = &drvdata->serio; |
276 | serio->id.type = SERIO_8042; | 276 | serio->id.type = SERIO_8042; |
diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c index b9b7a98bc5a5..7df0228e836e 100644 --- a/drivers/input/tablet/gtco.c +++ b/drivers/input/tablet/gtco.c | |||
@@ -64,7 +64,6 @@ Scott Hill shill@gtcocalcomp.com | |||
64 | #include <asm/byteorder.h> | 64 | #include <asm/byteorder.h> |
65 | 65 | ||
66 | 66 | ||
67 | #include <linux/version.h> | ||
68 | #include <linux/usb/input.h> | 67 | #include <linux/usb/input.h> |
69 | 68 | ||
70 | /* Version with a Major number of 2 is for kernel inclusion only. */ | 69 | /* Version with a Major number of 2 is for kernel inclusion only. */ |
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 6e60a97a234c..25287e80e236 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig | |||
@@ -249,29 +249,26 @@ config TOUCHSCREEN_WM97XX | |||
249 | config TOUCHSCREEN_WM9705 | 249 | config TOUCHSCREEN_WM9705 |
250 | bool "WM9705 Touchscreen interface support" | 250 | bool "WM9705 Touchscreen interface support" |
251 | depends on TOUCHSCREEN_WM97XX | 251 | depends on TOUCHSCREEN_WM97XX |
252 | default y | ||
252 | help | 253 | help |
253 | Say Y here if you have a Wolfson Microelectronics WM9705 | 254 | Say Y here to enable support for the Wolfson Microelectronics |
254 | touchscreen controller connected to your system. | 255 | WM9705 touchscreen controller. |
255 | |||
256 | If unsure, say N. | ||
257 | 256 | ||
258 | config TOUCHSCREEN_WM9712 | 257 | config TOUCHSCREEN_WM9712 |
259 | bool "WM9712 Touchscreen interface support" | 258 | bool "WM9712 Touchscreen interface support" |
260 | depends on TOUCHSCREEN_WM97XX | 259 | depends on TOUCHSCREEN_WM97XX |
260 | default y | ||
261 | help | 261 | help |
262 | Say Y here if you have a Wolfson Microelectronics WM9712 | 262 | Say Y here to enable support for the Wolfson Microelectronics |
263 | touchscreen controller connected to your system. | 263 | WM9712 touchscreen controller. |
264 | |||
265 | If unsure, say N. | ||
266 | 264 | ||
267 | config TOUCHSCREEN_WM9713 | 265 | config TOUCHSCREEN_WM9713 |
268 | bool "WM9713 Touchscreen interface support" | 266 | bool "WM9713 Touchscreen interface support" |
269 | depends on TOUCHSCREEN_WM97XX | 267 | depends on TOUCHSCREEN_WM97XX |
268 | default y | ||
270 | help | 269 | help |
271 | Say Y here if you have a Wolfson Microelectronics WM9713 touchscreen | 270 | Say Y here to enable support for the Wolfson Microelectronics |
272 | controller connected to your system. | 271 | WM9713 touchscreen controller. |
273 | |||
274 | If unsure, say N. | ||
275 | 272 | ||
276 | config TOUCHSCREEN_WM97XX_MAINSTONE | 273 | config TOUCHSCREEN_WM97XX_MAINSTONE |
277 | tristate "WM97xx Mainstone accelerated touch" | 274 | tristate "WM97xx Mainstone accelerated touch" |
diff --git a/drivers/input/touchscreen/mainstone-wm97xx.c b/drivers/input/touchscreen/mainstone-wm97xx.c index 283f93a0cee2..37a555f37306 100644 --- a/drivers/input/touchscreen/mainstone-wm97xx.c +++ b/drivers/input/touchscreen/mainstone-wm97xx.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
28 | #include <linux/version.h> | ||
29 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
30 | #include <linux/init.h> | 29 | #include <linux/init.h> |
31 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
diff --git a/drivers/input/touchscreen/migor_ts.c b/drivers/input/touchscreen/migor_ts.c index c1cd99d58981..504ca11749a1 100644 --- a/drivers/input/touchscreen/migor_ts.c +++ b/drivers/input/touchscreen/migor_ts.c | |||
@@ -173,7 +173,7 @@ static int migor_ts_probe(struct i2c_client *client, | |||
173 | input_set_abs_params(input, ABS_X, 95, 955, 0, 0); | 173 | input_set_abs_params(input, ABS_X, 95, 955, 0, 0); |
174 | input_set_abs_params(input, ABS_Y, 85, 935, 0, 0); | 174 | input_set_abs_params(input, ABS_Y, 85, 935, 0, 0); |
175 | 175 | ||
176 | input->name = client->driver_name; | 176 | input->name = client->name; |
177 | input->id.bustype = BUS_I2C; | 177 | input->id.bustype = BUS_I2C; |
178 | input->dev.parent = &client->dev; | 178 | input->dev.parent = &client->dev; |
179 | 179 | ||
@@ -192,7 +192,7 @@ static int migor_ts_probe(struct i2c_client *client, | |||
192 | goto err1; | 192 | goto err1; |
193 | 193 | ||
194 | error = request_irq(priv->irq, migor_ts_isr, IRQF_TRIGGER_LOW, | 194 | error = request_irq(priv->irq, migor_ts_isr, IRQF_TRIGGER_LOW, |
195 | client->driver_name, priv); | 195 | client->name, priv); |
196 | if (error) { | 196 | if (error) { |
197 | dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); | 197 | dev_err(&client->dev, "Unable to request touchscreen IRQ.\n"); |
198 | goto err2; | 198 | goto err2; |
@@ -224,12 +224,19 @@ static int migor_ts_remove(struct i2c_client *client) | |||
224 | return 0; | 224 | return 0; |
225 | } | 225 | } |
226 | 226 | ||
227 | static const struct i2c_device_id migor_ts_id[] = { | ||
228 | { "migor_ts", 0 }, | ||
229 | { } | ||
230 | }; | ||
231 | MODULE_DEVICE_TABLE(i2c, migor_ts); | ||
232 | |||
227 | static struct i2c_driver migor_ts_driver = { | 233 | static struct i2c_driver migor_ts_driver = { |
228 | .driver = { | 234 | .driver = { |
229 | .name = "migor_ts", | 235 | .name = "migor_ts", |
230 | }, | 236 | }, |
231 | .probe = migor_ts_probe, | 237 | .probe = migor_ts_probe, |
232 | .remove = migor_ts_remove, | 238 | .remove = migor_ts_remove, |
239 | .id_table = migor_ts_id, | ||
233 | }; | 240 | }; |
234 | 241 | ||
235 | static int __init migor_ts_init(void) | 242 | static int __init migor_ts_init(void) |
diff --git a/drivers/input/touchscreen/wm9705.c b/drivers/input/touchscreen/wm9705.c index 978e1a13ffc7..372efbc694ff 100644 --- a/drivers/input/touchscreen/wm9705.c +++ b/drivers/input/touchscreen/wm9705.c | |||
@@ -17,7 +17,6 @@ | |||
17 | 17 | ||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/moduleparam.h> | 19 | #include <linux/moduleparam.h> |
20 | #include <linux/version.h> | ||
21 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
22 | #include <linux/input.h> | 21 | #include <linux/input.h> |
23 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
diff --git a/drivers/input/touchscreen/wm9712.c b/drivers/input/touchscreen/wm9712.c index 4c5d85a249ae..c8bb1e7335fc 100644 --- a/drivers/input/touchscreen/wm9712.c +++ b/drivers/input/touchscreen/wm9712.c | |||
@@ -17,7 +17,6 @@ | |||
17 | 17 | ||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/moduleparam.h> | 19 | #include <linux/moduleparam.h> |
20 | #include <linux/version.h> | ||
21 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
22 | #include <linux/input.h> | 21 | #include <linux/input.h> |
23 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c index 838458792ea0..781ee83547e6 100644 --- a/drivers/input/touchscreen/wm9713.c +++ b/drivers/input/touchscreen/wm9713.c | |||
@@ -17,7 +17,6 @@ | |||
17 | 17 | ||
18 | #include <linux/module.h> | 18 | #include <linux/module.h> |
19 | #include <linux/moduleparam.h> | 19 | #include <linux/moduleparam.h> |
20 | #include <linux/version.h> | ||
21 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
22 | #include <linux/input.h> | 21 | #include <linux/input.h> |
23 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index cdc24ad314e0..d589ab0e3adc 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c | |||
@@ -37,7 +37,6 @@ | |||
37 | 37 | ||
38 | #include <linux/module.h> | 38 | #include <linux/module.h> |
39 | #include <linux/moduleparam.h> | 39 | #include <linux/moduleparam.h> |
40 | #include <linux/version.h> | ||
41 | #include <linux/kernel.h> | 40 | #include <linux/kernel.h> |
42 | #include <linux/init.h> | 41 | #include <linux/init.h> |
43 | #include <linux/delay.h> | 42 | #include <linux/delay.h> |
diff --git a/drivers/md/md.c b/drivers/md/md.c index c7aae66c6f9b..8cfadc5bd2ba 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2393,6 +2393,8 @@ static void analyze_sbs(mddev_t * mddev) | |||
2393 | 2393 | ||
2394 | } | 2394 | } |
2395 | 2395 | ||
2396 | static void md_safemode_timeout(unsigned long data); | ||
2397 | |||
2396 | static ssize_t | 2398 | static ssize_t |
2397 | safe_delay_show(mddev_t *mddev, char *page) | 2399 | safe_delay_show(mddev_t *mddev, char *page) |
2398 | { | 2400 | { |
@@ -2432,9 +2434,12 @@ safe_delay_store(mddev_t *mddev, const char *cbuf, size_t len) | |||
2432 | if (msec == 0) | 2434 | if (msec == 0) |
2433 | mddev->safemode_delay = 0; | 2435 | mddev->safemode_delay = 0; |
2434 | else { | 2436 | else { |
2437 | unsigned long old_delay = mddev->safemode_delay; | ||
2435 | mddev->safemode_delay = (msec*HZ)/1000; | 2438 | mddev->safemode_delay = (msec*HZ)/1000; |
2436 | if (mddev->safemode_delay == 0) | 2439 | if (mddev->safemode_delay == 0) |
2437 | mddev->safemode_delay = 1; | 2440 | mddev->safemode_delay = 1; |
2441 | if (mddev->safemode_delay < old_delay) | ||
2442 | md_safemode_timeout((unsigned long)mddev); | ||
2438 | } | 2443 | } |
2439 | return len; | 2444 | return len; |
2440 | } | 2445 | } |
@@ -4634,6 +4639,11 @@ static int update_size(mddev_t *mddev, sector_t num_sectors) | |||
4634 | */ | 4639 | */ |
4635 | if (mddev->sync_thread) | 4640 | if (mddev->sync_thread) |
4636 | return -EBUSY; | 4641 | return -EBUSY; |
4642 | if (mddev->bitmap) | ||
4643 | /* Sorry, cannot grow a bitmap yet, just remove it, | ||
4644 | * grow, and re-add. | ||
4645 | */ | ||
4646 | return -EBUSY; | ||
4637 | rdev_for_each(rdev, tmp, mddev) { | 4647 | rdev_for_each(rdev, tmp, mddev) { |
4638 | sector_t avail; | 4648 | sector_t avail; |
4639 | avail = rdev->size * 2; | 4649 | avail = rdev->size * 2; |
@@ -5993,7 +6003,7 @@ static int remove_and_add_spares(mddev_t *mddev) | |||
5993 | } | 6003 | } |
5994 | } | 6004 | } |
5995 | 6005 | ||
5996 | if (mddev->degraded) { | 6006 | if (mddev->degraded && ! mddev->ro) { |
5997 | rdev_for_each(rdev, rtmp, mddev) { | 6007 | rdev_for_each(rdev, rtmp, mddev) { |
5998 | if (rdev->raid_disk >= 0 && | 6008 | if (rdev->raid_disk >= 0 && |
5999 | !test_bit(In_sync, &rdev->flags) && | 6009 | !test_bit(In_sync, &rdev->flags) && |
@@ -6067,6 +6077,8 @@ void md_check_recovery(mddev_t *mddev) | |||
6067 | flush_signals(current); | 6077 | flush_signals(current); |
6068 | } | 6078 | } |
6069 | 6079 | ||
6080 | if (mddev->ro && !test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) | ||
6081 | return; | ||
6070 | if ( ! ( | 6082 | if ( ! ( |
6071 | (mddev->flags && !mddev->external) || | 6083 | (mddev->flags && !mddev->external) || |
6072 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || | 6084 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || |
@@ -6080,6 +6092,15 @@ void md_check_recovery(mddev_t *mddev) | |||
6080 | if (mddev_trylock(mddev)) { | 6092 | if (mddev_trylock(mddev)) { |
6081 | int spares = 0; | 6093 | int spares = 0; |
6082 | 6094 | ||
6095 | if (mddev->ro) { | ||
6096 | /* Only thing we do on a ro array is remove | ||
6097 | * failed devices. | ||
6098 | */ | ||
6099 | remove_and_add_spares(mddev); | ||
6100 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
6101 | goto unlock; | ||
6102 | } | ||
6103 | |||
6083 | if (!mddev->external) { | 6104 | if (!mddev->external) { |
6084 | int did_change = 0; | 6105 | int did_change = 0; |
6085 | spin_lock_irq(&mddev->write_lock); | 6106 | spin_lock_irq(&mddev->write_lock); |
@@ -6117,7 +6138,8 @@ void md_check_recovery(mddev_t *mddev) | |||
6117 | /* resync has finished, collect result */ | 6138 | /* resync has finished, collect result */ |
6118 | md_unregister_thread(mddev->sync_thread); | 6139 | md_unregister_thread(mddev->sync_thread); |
6119 | mddev->sync_thread = NULL; | 6140 | mddev->sync_thread = NULL; |
6120 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) { | 6141 | if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery) && |
6142 | !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { | ||
6121 | /* success...*/ | 6143 | /* success...*/ |
6122 | /* activate any spares */ | 6144 | /* activate any spares */ |
6123 | if (mddev->pers->spare_active(mddev)) | 6145 | if (mddev->pers->spare_active(mddev)) |
@@ -6169,6 +6191,7 @@ void md_check_recovery(mddev_t *mddev) | |||
6169 | } else if ((spares = remove_and_add_spares(mddev))) { | 6191 | } else if ((spares = remove_and_add_spares(mddev))) { |
6170 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 6192 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
6171 | clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); | 6193 | clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); |
6194 | clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); | ||
6172 | set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); | 6195 | set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); |
6173 | } else if (mddev->recovery_cp < MaxSector) { | 6196 | } else if (mddev->recovery_cp < MaxSector) { |
6174 | set_bit(MD_RECOVERY_SYNC, &mddev->recovery); | 6197 | set_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
@@ -6232,7 +6255,11 @@ static int md_notify_reboot(struct notifier_block *this, | |||
6232 | 6255 | ||
6233 | for_each_mddev(mddev, tmp) | 6256 | for_each_mddev(mddev, tmp) |
6234 | if (mddev_trylock(mddev)) { | 6257 | if (mddev_trylock(mddev)) { |
6235 | do_md_stop (mddev, 1, 0); | 6258 | /* Force a switch to readonly even array |
6259 | * appears to still be in use. Hence | ||
6260 | * the '100'. | ||
6261 | */ | ||
6262 | do_md_stop (mddev, 1, 100); | ||
6236 | mddev_unlock(mddev); | 6263 | mddev_unlock(mddev); |
6237 | } | 6264 | } |
6238 | /* | 6265 | /* |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index d41bebb6da0f..e34cd0e62473 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -76,11 +76,13 @@ static void r10bio_pool_free(void *r10_bio, void *data) | |||
76 | kfree(r10_bio); | 76 | kfree(r10_bio); |
77 | } | 77 | } |
78 | 78 | ||
79 | /* Maximum size of each resync request */ | ||
79 | #define RESYNC_BLOCK_SIZE (64*1024) | 80 | #define RESYNC_BLOCK_SIZE (64*1024) |
80 | //#define RESYNC_BLOCK_SIZE PAGE_SIZE | ||
81 | #define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9) | ||
82 | #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE) | 81 | #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE) |
83 | #define RESYNC_WINDOW (2048*1024) | 82 | /* amount of memory to reserve for resync requests */ |
83 | #define RESYNC_WINDOW (1024*1024) | ||
84 | /* maximum number of concurrent requests, memory permitting */ | ||
85 | #define RESYNC_DEPTH (32*1024*1024/RESYNC_BLOCK_SIZE) | ||
84 | 86 | ||
85 | /* | 87 | /* |
86 | * When performing a resync, we need to read and compare, so | 88 | * When performing a resync, we need to read and compare, so |
@@ -690,7 +692,6 @@ static int flush_pending_writes(conf_t *conf) | |||
690 | * there is no normal IO happeing. It must arrange to call | 692 | * there is no normal IO happeing. It must arrange to call |
691 | * lower_barrier when the particular background IO completes. | 693 | * lower_barrier when the particular background IO completes. |
692 | */ | 694 | */ |
693 | #define RESYNC_DEPTH 32 | ||
694 | 695 | ||
695 | static void raise_barrier(conf_t *conf, int force) | 696 | static void raise_barrier(conf_t *conf, int force) |
696 | { | 697 | { |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 40e939675657..224de022e7c5 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2568,10 +2568,10 @@ static bool handle_stripe5(struct stripe_head *sh) | |||
2568 | if (dev->written) | 2568 | if (dev->written) |
2569 | s.written++; | 2569 | s.written++; |
2570 | rdev = rcu_dereference(conf->disks[i].rdev); | 2570 | rdev = rcu_dereference(conf->disks[i].rdev); |
2571 | if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | 2571 | if (blocked_rdev == NULL && |
2572 | rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | ||
2572 | blocked_rdev = rdev; | 2573 | blocked_rdev = rdev; |
2573 | atomic_inc(&rdev->nr_pending); | 2574 | atomic_inc(&rdev->nr_pending); |
2574 | break; | ||
2575 | } | 2575 | } |
2576 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { | 2576 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { |
2577 | /* The ReadError flag will just be confusing now */ | 2577 | /* The ReadError flag will just be confusing now */ |
@@ -2588,8 +2588,14 @@ static bool handle_stripe5(struct stripe_head *sh) | |||
2588 | rcu_read_unlock(); | 2588 | rcu_read_unlock(); |
2589 | 2589 | ||
2590 | if (unlikely(blocked_rdev)) { | 2590 | if (unlikely(blocked_rdev)) { |
2591 | set_bit(STRIPE_HANDLE, &sh->state); | 2591 | if (s.syncing || s.expanding || s.expanded || |
2592 | goto unlock; | 2592 | s.to_write || s.written) { |
2593 | set_bit(STRIPE_HANDLE, &sh->state); | ||
2594 | goto unlock; | ||
2595 | } | ||
2596 | /* There is nothing for the blocked_rdev to block */ | ||
2597 | rdev_dec_pending(blocked_rdev, conf->mddev); | ||
2598 | blocked_rdev = NULL; | ||
2593 | } | 2599 | } |
2594 | 2600 | ||
2595 | if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) { | 2601 | if (s.to_fill && !test_bit(STRIPE_BIOFILL_RUN, &sh->state)) { |
@@ -2832,10 +2838,10 @@ static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page) | |||
2832 | if (dev->written) | 2838 | if (dev->written) |
2833 | s.written++; | 2839 | s.written++; |
2834 | rdev = rcu_dereference(conf->disks[i].rdev); | 2840 | rdev = rcu_dereference(conf->disks[i].rdev); |
2835 | if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | 2841 | if (blocked_rdev == NULL && |
2842 | rdev && unlikely(test_bit(Blocked, &rdev->flags))) { | ||
2836 | blocked_rdev = rdev; | 2843 | blocked_rdev = rdev; |
2837 | atomic_inc(&rdev->nr_pending); | 2844 | atomic_inc(&rdev->nr_pending); |
2838 | break; | ||
2839 | } | 2845 | } |
2840 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { | 2846 | if (!rdev || !test_bit(In_sync, &rdev->flags)) { |
2841 | /* The ReadError flag will just be confusing now */ | 2847 | /* The ReadError flag will just be confusing now */ |
@@ -2853,9 +2859,16 @@ static bool handle_stripe6(struct stripe_head *sh, struct page *tmp_page) | |||
2853 | rcu_read_unlock(); | 2859 | rcu_read_unlock(); |
2854 | 2860 | ||
2855 | if (unlikely(blocked_rdev)) { | 2861 | if (unlikely(blocked_rdev)) { |
2856 | set_bit(STRIPE_HANDLE, &sh->state); | 2862 | if (s.syncing || s.expanding || s.expanded || |
2857 | goto unlock; | 2863 | s.to_write || s.written) { |
2864 | set_bit(STRIPE_HANDLE, &sh->state); | ||
2865 | goto unlock; | ||
2866 | } | ||
2867 | /* There is nothing for the blocked_rdev to block */ | ||
2868 | rdev_dec_pending(blocked_rdev, conf->mddev); | ||
2869 | blocked_rdev = NULL; | ||
2858 | } | 2870 | } |
2871 | |||
2859 | pr_debug("locked=%d uptodate=%d to_read=%d" | 2872 | pr_debug("locked=%d uptodate=%d to_read=%d" |
2860 | " to_write=%d failed=%d failed_num=%d,%d\n", | 2873 | " to_write=%d failed=%d failed_num=%d,%d\n", |
2861 | s.locked, s.uptodate, s.to_read, s.to_write, s.failed, | 2874 | s.locked, s.uptodate, s.to_read, s.to_write, s.failed, |
@@ -4446,6 +4459,9 @@ static int raid5_check_reshape(mddev_t *mddev) | |||
4446 | return -EINVAL; /* Cannot shrink array or change level yet */ | 4459 | return -EINVAL; /* Cannot shrink array or change level yet */ |
4447 | if (mddev->delta_disks == 0) | 4460 | if (mddev->delta_disks == 0) |
4448 | return 0; /* nothing to do */ | 4461 | return 0; /* nothing to do */ |
4462 | if (mddev->bitmap) | ||
4463 | /* Cannot grow a bitmap yet */ | ||
4464 | return -EBUSY; | ||
4449 | 4465 | ||
4450 | /* Can only proceed if there are plenty of stripe_heads. | 4466 | /* Can only proceed if there are plenty of stripe_heads. |
4451 | * We need a minimum of one full stripe,, and for sensible progress | 4467 | * We need a minimum of one full stripe,, and for sensible progress |
diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index c6408a62d95e..bc2a807f210d 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c | |||
@@ -16,7 +16,6 @@ | |||
16 | * | 16 | * |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/version.h> | ||
20 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
21 | #include <linux/irq.h> | 20 | #include <linux/irq.h> |
22 | #include <linux/gpio.h> | 21 | #include <linux/gpio.h> |
diff --git a/drivers/misc/acer-wmi.c b/drivers/misc/acer-wmi.c index e7a3fe508dff..c6c77a505ec1 100644 --- a/drivers/misc/acer-wmi.c +++ b/drivers/misc/acer-wmi.c | |||
@@ -192,6 +192,9 @@ static struct quirk_entry *quirks; | |||
192 | 192 | ||
193 | static void set_quirks(void) | 193 | static void set_quirks(void) |
194 | { | 194 | { |
195 | if (!interface) | ||
196 | return; | ||
197 | |||
195 | if (quirks->mailled) | 198 | if (quirks->mailled) |
196 | interface->capability |= ACER_CAP_MAILLED; | 199 | interface->capability |= ACER_CAP_MAILLED; |
197 | 200 | ||
@@ -803,11 +806,30 @@ static acpi_status get_u32(u32 *value, u32 cap) | |||
803 | 806 | ||
804 | static acpi_status set_u32(u32 value, u32 cap) | 807 | static acpi_status set_u32(u32 value, u32 cap) |
805 | { | 808 | { |
809 | acpi_status status; | ||
810 | |||
806 | if (interface->capability & cap) { | 811 | if (interface->capability & cap) { |
807 | switch (interface->type) { | 812 | switch (interface->type) { |
808 | case ACER_AMW0: | 813 | case ACER_AMW0: |
809 | return AMW0_set_u32(value, cap, interface); | 814 | return AMW0_set_u32(value, cap, interface); |
810 | case ACER_AMW0_V2: | 815 | case ACER_AMW0_V2: |
816 | if (cap == ACER_CAP_MAILLED) | ||
817 | return AMW0_set_u32(value, cap, interface); | ||
818 | |||
819 | /* | ||
820 | * On some models, some WMID methods don't toggle | ||
821 | * properly. For those cases, we want to run the AMW0 | ||
822 | * method afterwards to be certain we've really toggled | ||
823 | * the device state. | ||
824 | */ | ||
825 | if (cap == ACER_CAP_WIRELESS || | ||
826 | cap == ACER_CAP_BLUETOOTH) { | ||
827 | status = WMID_set_u32(value, cap, interface); | ||
828 | if (ACPI_FAILURE(status)) | ||
829 | return status; | ||
830 | |||
831 | return AMW0_set_u32(value, cap, interface); | ||
832 | } | ||
811 | case ACER_WMID: | 833 | case ACER_WMID: |
812 | return WMID_set_u32(value, cap, interface); | 834 | return WMID_set_u32(value, cap, interface); |
813 | default: | 835 | default: |
@@ -1218,6 +1240,8 @@ static int __init acer_wmi_init(void) | |||
1218 | return -ENODEV; | 1240 | return -ENODEV; |
1219 | } | 1241 | } |
1220 | 1242 | ||
1243 | set_quirks(); | ||
1244 | |||
1221 | if (platform_driver_register(&acer_platform_driver)) { | 1245 | if (platform_driver_register(&acer_platform_driver)) { |
1222 | printk(ACER_ERR "Unable to register platform driver.\n"); | 1246 | printk(ACER_ERR "Unable to register platform driver.\n"); |
1223 | goto error_platform_register; | 1247 | goto error_platform_register; |
diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c index 9e8d79e7e9f4..facdb9893c84 100644 --- a/drivers/misc/eeepc-laptop.c +++ b/drivers/misc/eeepc-laptop.c | |||
@@ -553,9 +553,9 @@ static void eeepc_hwmon_exit(void) | |||
553 | hwmon = eeepc_hwmon_device; | 553 | hwmon = eeepc_hwmon_device; |
554 | if (!hwmon) | 554 | if (!hwmon) |
555 | return ; | 555 | return ; |
556 | hwmon_device_unregister(hwmon); | ||
557 | sysfs_remove_group(&hwmon->kobj, | 556 | sysfs_remove_group(&hwmon->kobj, |
558 | &hwmon_attribute_group); | 557 | &hwmon_attribute_group); |
558 | hwmon_device_unregister(hwmon); | ||
559 | eeepc_hwmon_device = NULL; | 559 | eeepc_hwmon_device = NULL; |
560 | } | 560 | } |
561 | 561 | ||
diff --git a/drivers/misc/eeprom_93cx6.c b/drivers/misc/eeprom_93cx6.c index ea55654e5948..15b1780025c8 100644 --- a/drivers/misc/eeprom_93cx6.c +++ b/drivers/misc/eeprom_93cx6.c | |||
@@ -26,7 +26,6 @@ | |||
26 | 26 | ||
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/version.h> | ||
30 | #include <linux/delay.h> | 29 | #include <linux/delay.h> |
31 | #include <linux/eeprom_93cx6.h> | 30 | #include <linux/eeprom_93cx6.h> |
32 | 31 | ||
diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c index 7c994e1ae276..ae16d845d746 100644 --- a/drivers/mmc/host/s3cmci.c +++ b/drivers/mmc/host/s3cmci.c | |||
@@ -595,8 +595,9 @@ static irqreturn_t s3cmci_irq_cd(int irq, void *dev_id) | |||
595 | return IRQ_HANDLED; | 595 | return IRQ_HANDLED; |
596 | } | 596 | } |
597 | 597 | ||
598 | void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, void *buf_id, | 598 | static void s3cmci_dma_done_callback(struct s3c2410_dma_chan *dma_ch, |
599 | int size, enum s3c2410_dma_buffresult result) | 599 | void *buf_id, int size, |
600 | enum s3c2410_dma_buffresult result) | ||
600 | { | 601 | { |
601 | struct s3cmci_host *host = buf_id; | 602 | struct s3cmci_host *host = buf_id; |
602 | unsigned long iflags; | 603 | unsigned long iflags; |
@@ -740,8 +741,8 @@ request_done: | |||
740 | mmc_request_done(host->mmc, mrq); | 741 | mmc_request_done(host->mmc, mrq); |
741 | } | 742 | } |
742 | 743 | ||
743 | 744 | static void s3cmci_dma_setup(struct s3cmci_host *host, | |
744 | void s3cmci_dma_setup(struct s3cmci_host *host, enum s3c2410_dmasrc source) | 745 | enum s3c2410_dmasrc source) |
745 | { | 746 | { |
746 | static enum s3c2410_dmasrc last_source = -1; | 747 | static enum s3c2410_dmasrc last_source = -1; |
747 | static int setup_ok; | 748 | static int setup_ok; |
@@ -1003,8 +1004,9 @@ static void s3cmci_send_request(struct mmc_host *mmc) | |||
1003 | enable_irq(host->irq); | 1004 | enable_irq(host->irq); |
1004 | } | 1005 | } |
1005 | 1006 | ||
1006 | static int s3cmci_card_present(struct s3cmci_host *host) | 1007 | static int s3cmci_card_present(struct mmc_host *mmc) |
1007 | { | 1008 | { |
1009 | struct s3cmci_host *host = mmc_priv(mmc); | ||
1008 | struct s3c24xx_mci_pdata *pdata = host->pdata; | 1010 | struct s3c24xx_mci_pdata *pdata = host->pdata; |
1009 | int ret; | 1011 | int ret; |
1010 | 1012 | ||
@@ -1023,7 +1025,7 @@ static void s3cmci_request(struct mmc_host *mmc, struct mmc_request *mrq) | |||
1023 | host->cmd_is_stop = 0; | 1025 | host->cmd_is_stop = 0; |
1024 | host->mrq = mrq; | 1026 | host->mrq = mrq; |
1025 | 1027 | ||
1026 | if (s3cmci_card_present(host) == 0) { | 1028 | if (s3cmci_card_present(mmc) == 0) { |
1027 | dbg(host, dbg_err, "%s: no medium present\n", __func__); | 1029 | dbg(host, dbg_err, "%s: no medium present\n", __func__); |
1028 | host->mrq->cmd->error = -ENOMEDIUM; | 1030 | host->mrq->cmd->error = -ENOMEDIUM; |
1029 | mmc_request_done(mmc, mrq); | 1031 | mmc_request_done(mmc, mrq); |
@@ -1138,6 +1140,7 @@ static struct mmc_host_ops s3cmci_ops = { | |||
1138 | .request = s3cmci_request, | 1140 | .request = s3cmci_request, |
1139 | .set_ios = s3cmci_set_ios, | 1141 | .set_ios = s3cmci_set_ios, |
1140 | .get_ro = s3cmci_get_ro, | 1142 | .get_ro = s3cmci_get_ro, |
1143 | .get_cd = s3cmci_card_present, | ||
1141 | }; | 1144 | }; |
1142 | 1145 | ||
1143 | static struct s3c24xx_mci_pdata s3cmci_def_pdata = { | 1146 | static struct s3c24xx_mci_pdata s3cmci_def_pdata = { |
@@ -1206,7 +1209,7 @@ static int __devinit s3cmci_probe(struct platform_device *pdev, int is2440) | |||
1206 | } | 1209 | } |
1207 | 1210 | ||
1208 | host->base = ioremap(host->mem->start, RESSIZE(host->mem)); | 1211 | host->base = ioremap(host->mem->start, RESSIZE(host->mem)); |
1209 | if (host->base == 0) { | 1212 | if (!host->base) { |
1210 | dev_err(&pdev->dev, "failed to ioremap() io memory region.\n"); | 1213 | dev_err(&pdev->dev, "failed to ioremap() io memory region.\n"); |
1211 | ret = -EINVAL; | 1214 | ret = -EINVAL; |
1212 | goto probe_free_mem_region; | 1215 | goto probe_free_mem_region; |
diff --git a/drivers/mmc/host/sdricoh_cs.c b/drivers/mmc/host/sdricoh_cs.c index f99e9f721629..1df44d966bdb 100644 --- a/drivers/mmc/host/sdricoh_cs.c +++ b/drivers/mmc/host/sdricoh_cs.c | |||
@@ -29,7 +29,6 @@ | |||
29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
30 | #include <linux/ioport.h> | 30 | #include <linux/ioport.h> |
31 | #include <linux/scatterlist.h> | 31 | #include <linux/scatterlist.h> |
32 | #include <linux/version.h> | ||
33 | 32 | ||
34 | #include <pcmcia/cs_types.h> | 33 | #include <pcmcia/cs_types.h> |
35 | #include <pcmcia/cs.h> | 34 | #include <pcmcia/cs.h> |
diff --git a/drivers/mtd/maps/amd76xrom.c b/drivers/mtd/maps/amd76xrom.c index 948b86f35ef4..d1eec7d3243f 100644 --- a/drivers/mtd/maps/amd76xrom.c +++ b/drivers/mtd/maps/amd76xrom.c | |||
@@ -6,7 +6,6 @@ | |||
6 | 6 | ||
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/types.h> | 8 | #include <linux/types.h> |
9 | #include <linux/version.h> | ||
10 | #include <linux/kernel.h> | 9 | #include <linux/kernel.h> |
11 | #include <linux/init.h> | 10 | #include <linux/init.h> |
12 | #include <asm/io.h> | 11 | #include <asm/io.h> |
diff --git a/drivers/mtd/maps/ck804xrom.c b/drivers/mtd/maps/ck804xrom.c index effaf7cdefab..1a6feb4474de 100644 --- a/drivers/mtd/maps/ck804xrom.c +++ b/drivers/mtd/maps/ck804xrom.c | |||
@@ -9,7 +9,6 @@ | |||
9 | 9 | ||
10 | #include <linux/module.h> | 10 | #include <linux/module.h> |
11 | #include <linux/types.h> | 11 | #include <linux/types.h> |
12 | #include <linux/version.h> | ||
13 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 13 | #include <linux/init.h> |
15 | #include <asm/io.h> | 14 | #include <asm/io.h> |
diff --git a/drivers/mtd/maps/esb2rom.c b/drivers/mtd/maps/esb2rom.c index aa64a4752781..bbbcdd4c8d13 100644 --- a/drivers/mtd/maps/esb2rom.c +++ b/drivers/mtd/maps/esb2rom.c | |||
@@ -12,7 +12,6 @@ | |||
12 | 12 | ||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
15 | #include <linux/version.h> | ||
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/init.h> | 16 | #include <linux/init.h> |
18 | #include <asm/io.h> | 17 | #include <asm/io.h> |
diff --git a/drivers/mtd/nand/au1550nd.c b/drivers/mtd/nand/au1550nd.c index 761946ea45b1..92c334ff4508 100644 --- a/drivers/mtd/nand/au1550nd.c +++ b/drivers/mtd/nand/au1550nd.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/mtd/mtd.h> | 16 | #include <linux/mtd/mtd.h> |
17 | #include <linux/mtd/nand.h> | 17 | #include <linux/mtd/nand.h> |
18 | #include <linux/mtd/partitions.h> | 18 | #include <linux/mtd/partitions.h> |
19 | #include <linux/version.h> | ||
20 | #include <asm/io.h> | 19 | #include <asm/io.h> |
21 | 20 | ||
22 | #include <asm/mach-au1x00/au1xxx.h> | 21 | #include <asm/mach-au1x00/au1xxx.h> |
diff --git a/drivers/mtd/nand/orion_nand.c b/drivers/mtd/nand/orion_nand.c index 64002488c6ee..917cf8d3ae95 100644 --- a/drivers/mtd/nand/orion_nand.c +++ b/drivers/mtd/nand/orion_nand.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | #include <asm/sizes.h> | 20 | #include <asm/sizes.h> |
21 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
22 | #include <asm/plat-orion/orion_nand.h> | 22 | #include <plat/orion_nand.h> |
23 | 23 | ||
24 | #ifdef CONFIG_MTD_CMDLINE_PARTS | 24 | #ifdef CONFIG_MTD_CMDLINE_PARTS |
25 | static const char *part_probes[] = { "cmdlinepart", NULL }; | 25 | static const char *part_probes[] = { "cmdlinepart", NULL }; |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 4b4cb2bf4f11..a5c141cecd4e 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -1172,7 +1172,7 @@ config ETH16I | |||
1172 | 1172 | ||
1173 | config NE2000 | 1173 | config NE2000 |
1174 | tristate "NE2000/NE1000 support" | 1174 | tristate "NE2000/NE1000 support" |
1175 | depends on NET_ISA || (Q40 && m) || M32R || TOSHIBA_RBTX4927 || TOSHIBA_RBTX4938 | 1175 | depends on NET_ISA || (Q40 && m) || M32R || MACH_TX49XX |
1176 | select CRC32 | 1176 | select CRC32 |
1177 | ---help--- | 1177 | ---help--- |
1178 | If you have a network (Ethernet) card of this type, say Y and read | 1178 | If you have a network (Ethernet) card of this type, say Y and read |
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c index e4483de84e7f..66de80b64b92 100644 --- a/drivers/net/acenic.c +++ b/drivers/net/acenic.c | |||
@@ -52,7 +52,6 @@ | |||
52 | 52 | ||
53 | #include <linux/module.h> | 53 | #include <linux/module.h> |
54 | #include <linux/moduleparam.h> | 54 | #include <linux/moduleparam.h> |
55 | #include <linux/version.h> | ||
56 | #include <linux/types.h> | 55 | #include <linux/types.h> |
57 | #include <linux/errno.h> | 56 | #include <linux/errno.h> |
58 | #include <linux/ioport.h> | 57 | #include <linux/ioport.h> |
diff --git a/drivers/net/arm/ixp4xx_eth.c b/drivers/net/arm/ixp4xx_eth.c index 020771bfb603..e2d702b8b2e4 100644 --- a/drivers/net/arm/ixp4xx_eth.c +++ b/drivers/net/arm/ixp4xx_eth.c | |||
@@ -551,7 +551,7 @@ static int eth_poll(struct napi_struct *napi, int budget) | |||
551 | if ((skb = netdev_alloc_skb(dev, RX_BUFF_SIZE))) { | 551 | if ((skb = netdev_alloc_skb(dev, RX_BUFF_SIZE))) { |
552 | phys = dma_map_single(&dev->dev, skb->data, | 552 | phys = dma_map_single(&dev->dev, skb->data, |
553 | RX_BUFF_SIZE, DMA_FROM_DEVICE); | 553 | RX_BUFF_SIZE, DMA_FROM_DEVICE); |
554 | if (dma_mapping_error(phys)) { | 554 | if (dma_mapping_error(&dev->dev, phys)) { |
555 | dev_kfree_skb(skb); | 555 | dev_kfree_skb(skb); |
556 | skb = NULL; | 556 | skb = NULL; |
557 | } | 557 | } |
@@ -698,7 +698,7 @@ static int eth_xmit(struct sk_buff *skb, struct net_device *dev) | |||
698 | #endif | 698 | #endif |
699 | 699 | ||
700 | phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); | 700 | phys = dma_map_single(&dev->dev, mem, bytes, DMA_TO_DEVICE); |
701 | if (dma_mapping_error(phys)) { | 701 | if (dma_mapping_error(&dev->dev, phys)) { |
702 | #ifdef __ARMEB__ | 702 | #ifdef __ARMEB__ |
703 | dev_kfree_skb(skb); | 703 | dev_kfree_skb(skb); |
704 | #else | 704 | #else |
@@ -883,7 +883,7 @@ static int init_queues(struct port *port) | |||
883 | desc->buf_len = MAX_MRU; | 883 | desc->buf_len = MAX_MRU; |
884 | desc->data = dma_map_single(&port->netdev->dev, data, | 884 | desc->data = dma_map_single(&port->netdev->dev, data, |
885 | RX_BUFF_SIZE, DMA_FROM_DEVICE); | 885 | RX_BUFF_SIZE, DMA_FROM_DEVICE); |
886 | if (dma_mapping_error(desc->data)) { | 886 | if (dma_mapping_error(&port->netdev->dev, desc->data)) { |
887 | free_buffer(buff); | 887 | free_buffer(buff); |
888 | return -EIO; | 888 | return -EIO; |
889 | } | 889 | } |
diff --git a/drivers/net/atl1e/atl1e_ethtool.c b/drivers/net/atl1e/atl1e_ethtool.c index cdc3b85b10b9..619c6583e1aa 100644 --- a/drivers/net/atl1e/atl1e_ethtool.c +++ b/drivers/net/atl1e/atl1e_ethtool.c | |||
@@ -355,7 +355,7 @@ static int atl1e_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol) | |||
355 | struct atl1e_adapter *adapter = netdev_priv(netdev); | 355 | struct atl1e_adapter *adapter = netdev_priv(netdev); |
356 | 356 | ||
357 | if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE | | 357 | if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE | |
358 | WAKE_MCAST | WAKE_BCAST | WAKE_MCAST)) | 358 | WAKE_UCAST | WAKE_MCAST | WAKE_BCAST)) |
359 | return -EOPNOTSUPP; | 359 | return -EOPNOTSUPP; |
360 | /* these settings will always override what we currently have */ | 360 | /* these settings will always override what we currently have */ |
361 | adapter->wol = 0; | 361 | adapter->wol = 0; |
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index cb8be490e5ae..5ee1b0557a02 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
@@ -807,7 +807,7 @@ err_out: | |||
807 | static int au1000_init(struct net_device *dev) | 807 | static int au1000_init(struct net_device *dev) |
808 | { | 808 | { |
809 | struct au1000_private *aup = (struct au1000_private *) dev->priv; | 809 | struct au1000_private *aup = (struct au1000_private *) dev->priv; |
810 | u32 flags; | 810 | unsigned long flags; |
811 | int i; | 811 | int i; |
812 | u32 control; | 812 | u32 control; |
813 | 813 | ||
diff --git a/drivers/net/ax88796.c b/drivers/net/ax88796.c index 0b4adf4a0f7d..a886a4b9f7e5 100644 --- a/drivers/net/ax88796.c +++ b/drivers/net/ax88796.c | |||
@@ -554,7 +554,7 @@ static int ax_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
554 | 554 | ||
555 | spin_lock_irqsave(&ax->mii_lock, flags); | 555 | spin_lock_irqsave(&ax->mii_lock, flags); |
556 | mii_ethtool_gset(&ax->mii, cmd); | 556 | mii_ethtool_gset(&ax->mii, cmd); |
557 | spin_lock_irqsave(&ax->mii_lock, flags); | 557 | spin_unlock_irqrestore(&ax->mii_lock, flags); |
558 | 558 | ||
559 | return 0; | 559 | return 0; |
560 | } | 560 | } |
@@ -567,7 +567,7 @@ static int ax_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
567 | 567 | ||
568 | spin_lock_irqsave(&ax->mii_lock, flags); | 568 | spin_lock_irqsave(&ax->mii_lock, flags); |
569 | rc = mii_ethtool_sset(&ax->mii, cmd); | 569 | rc = mii_ethtool_sset(&ax->mii, cmd); |
570 | spin_lock_irqsave(&ax->mii_lock, flags); | 570 | spin_unlock_irqrestore(&ax->mii_lock, flags); |
571 | 571 | ||
572 | return rc; | 572 | return rc; |
573 | } | 573 | } |
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 5ebde67d4297..2486a656f12d 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -35,8 +35,8 @@ | |||
35 | #include <linux/time.h> | 35 | #include <linux/time.h> |
36 | #include <linux/ethtool.h> | 36 | #include <linux/ethtool.h> |
37 | #include <linux/mii.h> | 37 | #include <linux/mii.h> |
38 | #ifdef NETIF_F_HW_VLAN_TX | ||
39 | #include <linux/if_vlan.h> | 38 | #include <linux/if_vlan.h> |
39 | #if defined(CONFIG_VLAN_8021Q) || defined(CONFIG_VLAN_8021Q_MODULE) | ||
40 | #define BCM_VLAN 1 | 40 | #define BCM_VLAN 1 |
41 | #endif | 41 | #endif |
42 | #include <net/ip.h> | 42 | #include <net/ip.h> |
@@ -57,8 +57,8 @@ | |||
57 | 57 | ||
58 | #define DRV_MODULE_NAME "bnx2" | 58 | #define DRV_MODULE_NAME "bnx2" |
59 | #define PFX DRV_MODULE_NAME ": " | 59 | #define PFX DRV_MODULE_NAME ": " |
60 | #define DRV_MODULE_VERSION "1.7.9" | 60 | #define DRV_MODULE_VERSION "1.8.0" |
61 | #define DRV_MODULE_RELDATE "July 18, 2008" | 61 | #define DRV_MODULE_RELDATE "Aug 14, 2008" |
62 | 62 | ||
63 | #define RUN_AT(x) (jiffies + (x)) | 63 | #define RUN_AT(x) (jiffies + (x)) |
64 | 64 | ||
@@ -2876,6 +2876,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2876 | struct sw_bd *rx_buf; | 2876 | struct sw_bd *rx_buf; |
2877 | struct sk_buff *skb; | 2877 | struct sk_buff *skb; |
2878 | dma_addr_t dma_addr; | 2878 | dma_addr_t dma_addr; |
2879 | u16 vtag = 0; | ||
2880 | int hw_vlan __maybe_unused = 0; | ||
2879 | 2881 | ||
2880 | sw_ring_cons = RX_RING_IDX(sw_cons); | 2882 | sw_ring_cons = RX_RING_IDX(sw_cons); |
2881 | sw_ring_prod = RX_RING_IDX(sw_prod); | 2883 | sw_ring_prod = RX_RING_IDX(sw_prod); |
@@ -2919,7 +2921,7 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2919 | if (len <= bp->rx_copy_thresh) { | 2921 | if (len <= bp->rx_copy_thresh) { |
2920 | struct sk_buff *new_skb; | 2922 | struct sk_buff *new_skb; |
2921 | 2923 | ||
2922 | new_skb = netdev_alloc_skb(bp->dev, len + 2); | 2924 | new_skb = netdev_alloc_skb(bp->dev, len + 6); |
2923 | if (new_skb == NULL) { | 2925 | if (new_skb == NULL) { |
2924 | bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, | 2926 | bnx2_reuse_rx_skb(bp, rxr, skb, sw_ring_cons, |
2925 | sw_ring_prod); | 2927 | sw_ring_prod); |
@@ -2928,9 +2930,9 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2928 | 2930 | ||
2929 | /* aligned copy */ | 2931 | /* aligned copy */ |
2930 | skb_copy_from_linear_data_offset(skb, | 2932 | skb_copy_from_linear_data_offset(skb, |
2931 | BNX2_RX_OFFSET - 2, | 2933 | BNX2_RX_OFFSET - 6, |
2932 | new_skb->data, len + 2); | 2934 | new_skb->data, len + 6); |
2933 | skb_reserve(new_skb, 2); | 2935 | skb_reserve(new_skb, 6); |
2934 | skb_put(new_skb, len); | 2936 | skb_put(new_skb, len); |
2935 | 2937 | ||
2936 | bnx2_reuse_rx_skb(bp, rxr, skb, | 2938 | bnx2_reuse_rx_skb(bp, rxr, skb, |
@@ -2941,6 +2943,25 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2941 | dma_addr, (sw_ring_cons << 16) | sw_ring_prod))) | 2943 | dma_addr, (sw_ring_cons << 16) | sw_ring_prod))) |
2942 | goto next_rx; | 2944 | goto next_rx; |
2943 | 2945 | ||
2946 | if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && | ||
2947 | !(bp->rx_mode & BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG)) { | ||
2948 | vtag = rx_hdr->l2_fhdr_vlan_tag; | ||
2949 | #ifdef BCM_VLAN | ||
2950 | if (bp->vlgrp) | ||
2951 | hw_vlan = 1; | ||
2952 | else | ||
2953 | #endif | ||
2954 | { | ||
2955 | struct vlan_ethhdr *ve = (struct vlan_ethhdr *) | ||
2956 | __skb_push(skb, 4); | ||
2957 | |||
2958 | memmove(ve, skb->data + 4, ETH_ALEN * 2); | ||
2959 | ve->h_vlan_proto = htons(ETH_P_8021Q); | ||
2960 | ve->h_vlan_TCI = htons(vtag); | ||
2961 | len += 4; | ||
2962 | } | ||
2963 | } | ||
2964 | |||
2944 | skb->protocol = eth_type_trans(skb, bp->dev); | 2965 | skb->protocol = eth_type_trans(skb, bp->dev); |
2945 | 2966 | ||
2946 | if ((len > (bp->dev->mtu + ETH_HLEN)) && | 2967 | if ((len > (bp->dev->mtu + ETH_HLEN)) && |
@@ -2962,10 +2983,8 @@ bnx2_rx_int(struct bnx2 *bp, struct bnx2_napi *bnapi, int budget) | |||
2962 | } | 2983 | } |
2963 | 2984 | ||
2964 | #ifdef BCM_VLAN | 2985 | #ifdef BCM_VLAN |
2965 | if ((status & L2_FHDR_STATUS_L2_VLAN_TAG) && bp->vlgrp) { | 2986 | if (hw_vlan) |
2966 | vlan_hwaccel_receive_skb(skb, bp->vlgrp, | 2987 | vlan_hwaccel_receive_skb(skb, bp->vlgrp, vtag); |
2967 | rx_hdr->l2_fhdr_vlan_tag); | ||
2968 | } | ||
2969 | else | 2988 | else |
2970 | #endif | 2989 | #endif |
2971 | netif_receive_skb(skb); | 2990 | netif_receive_skb(skb); |
@@ -3237,10 +3256,10 @@ bnx2_set_rx_mode(struct net_device *dev) | |||
3237 | BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG); | 3256 | BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG); |
3238 | sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN; | 3257 | sort_mode = 1 | BNX2_RPM_SORT_USER0_BC_EN; |
3239 | #ifdef BCM_VLAN | 3258 | #ifdef BCM_VLAN |
3240 | if (!bp->vlgrp && !(bp->flags & BNX2_FLAG_ASF_ENABLE)) | 3259 | if (!bp->vlgrp && (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN)) |
3241 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; | 3260 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; |
3242 | #else | 3261 | #else |
3243 | if (!(bp->flags & BNX2_FLAG_ASF_ENABLE)) | 3262 | if (bp->flags & BNX2_FLAG_CAN_KEEP_VLAN) |
3244 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; | 3263 | rx_mode |= BNX2_EMAC_RX_MODE_KEEP_VLAN_TAG; |
3245 | #endif | 3264 | #endif |
3246 | if (dev->flags & IFF_PROMISC) { | 3265 | if (dev->flags & IFF_PROMISC) { |
@@ -5963,10 +5982,12 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
5963 | vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; | 5982 | vlan_tag_flags |= TX_BD_FLAGS_TCP_UDP_CKSUM; |
5964 | } | 5983 | } |
5965 | 5984 | ||
5985 | #ifdef BCM_VLAN | ||
5966 | if (bp->vlgrp && vlan_tx_tag_present(skb)) { | 5986 | if (bp->vlgrp && vlan_tx_tag_present(skb)) { |
5967 | vlan_tag_flags |= | 5987 | vlan_tag_flags |= |
5968 | (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); | 5988 | (TX_BD_FLAGS_VLAN_TAG | (vlan_tx_tag_get(skb) << 16)); |
5969 | } | 5989 | } |
5990 | #endif | ||
5970 | if ((mss = skb_shinfo(skb)->gso_size)) { | 5991 | if ((mss = skb_shinfo(skb)->gso_size)) { |
5971 | u32 tcp_opt_len, ip_tcp_len; | 5992 | u32 tcp_opt_len, ip_tcp_len; |
5972 | struct iphdr *iph; | 5993 | struct iphdr *iph; |
diff --git a/drivers/net/bnx2x_link.c b/drivers/net/bnx2x_link.c index 8b92c6ad0759..4ce7fe9c5251 100644 --- a/drivers/net/bnx2x_link.c +++ b/drivers/net/bnx2x_link.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/delay.h> | 21 | #include <linux/delay.h> |
22 | #include <linux/ethtool.h> | 22 | #include <linux/ethtool.h> |
23 | #include <linux/mutex.h> | 23 | #include <linux/mutex.h> |
24 | #include <linux/version.h> | ||
25 | 24 | ||
26 | #include "bnx2x_reg.h" | 25 | #include "bnx2x_reg.h" |
27 | #include "bnx2x_fw_defs.h" | 26 | #include "bnx2x_fw_defs.h" |
diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c index 3e7dc171cdf1..971576b43687 100644 --- a/drivers/net/bnx2x_main.c +++ b/drivers/net/bnx2x_main.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include <net/ip.h> | 44 | #include <net/ip.h> |
45 | #include <net/tcp.h> | 45 | #include <net/tcp.h> |
46 | #include <net/checksum.h> | 46 | #include <net/checksum.h> |
47 | #include <linux/version.h> | ||
48 | #include <net/ip6_checksum.h> | 47 | #include <net/ip6_checksum.h> |
49 | #include <linux/workqueue.h> | 48 | #include <linux/workqueue.h> |
50 | #include <linux/crc32.h> | 49 | #include <linux/crc32.h> |
diff --git a/drivers/net/cpmac.c b/drivers/net/cpmac.c index a7800e559090..ec6b0af3d46b 100644 --- a/drivers/net/cpmac.c +++ b/drivers/net/cpmac.c | |||
@@ -26,7 +26,6 @@ | |||
26 | #include <linux/errno.h> | 26 | #include <linux/errno.h> |
27 | #include <linux/types.h> | 27 | #include <linux/types.h> |
28 | #include <linux/delay.h> | 28 | #include <linux/delay.h> |
29 | #include <linux/version.h> | ||
30 | 29 | ||
31 | #include <linux/netdevice.h> | 30 | #include <linux/netdevice.h> |
32 | #include <linux/etherdevice.h> | 31 | #include <linux/etherdevice.h> |
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h index f823b8ba5785..14b0e6cd3b8d 100644 --- a/drivers/net/e1000e/defines.h +++ b/drivers/net/e1000e/defines.h | |||
@@ -389,7 +389,7 @@ | |||
389 | 389 | ||
390 | /* Interrupt Cause Set */ | 390 | /* Interrupt Cause Set */ |
391 | #define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ | 391 | #define E1000_ICS_LSC E1000_ICR_LSC /* Link Status Change */ |
392 | #define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* rx desc min. threshold */ | 392 | #define E1000_ICS_RXSEQ E1000_ICR_RXSEQ /* Rx sequence error */ |
393 | #define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* Rx desc min. threshold */ | 393 | #define E1000_ICS_RXDMT0 E1000_ICR_RXDMT0 /* Rx desc min. threshold */ |
394 | 394 | ||
395 | /* Transmit Descriptor Control */ | 395 | /* Transmit Descriptor Control */ |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index cf57050d99d8..ac4e506b4f88 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -326,6 +326,7 @@ struct e1000_info { | |||
326 | #define FLAG_RX_CSUM_ENABLED (1 << 28) | 326 | #define FLAG_RX_CSUM_ENABLED (1 << 28) |
327 | #define FLAG_TSO_FORCE (1 << 29) | 327 | #define FLAG_TSO_FORCE (1 << 29) |
328 | #define FLAG_RX_RESTART_NOW (1 << 30) | 328 | #define FLAG_RX_RESTART_NOW (1 << 30) |
329 | #define FLAG_MSI_TEST_FAILED (1 << 31) | ||
329 | 330 | ||
330 | #define E1000_RX_DESC_PS(R, i) \ | 331 | #define E1000_RX_DESC_PS(R, i) \ |
331 | (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) | 332 | (&(((union e1000_rx_desc_packet_split *)((R).desc))[i])) |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index cf9679f2b7c4..e21c9e0f3738 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -177,7 +177,7 @@ static u32 e1000_get_link(struct net_device *netdev) | |||
177 | u32 status; | 177 | u32 status; |
178 | 178 | ||
179 | status = er32(STATUS); | 179 | status = er32(STATUS); |
180 | return (status & E1000_STATUS_LU); | 180 | return (status & E1000_STATUS_LU) ? 1 : 0; |
181 | } | 181 | } |
182 | 182 | ||
183 | static int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx) | 183 | static int e1000_set_spd_dplx(struct e1000_adapter *adapter, u16 spddplx) |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 05b0b2f9c54b..d266510c8a94 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -510,9 +510,12 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | |||
510 | netdev_alloc_skb(netdev, length + NET_IP_ALIGN); | 510 | netdev_alloc_skb(netdev, length + NET_IP_ALIGN); |
511 | if (new_skb) { | 511 | if (new_skb) { |
512 | skb_reserve(new_skb, NET_IP_ALIGN); | 512 | skb_reserve(new_skb, NET_IP_ALIGN); |
513 | memcpy(new_skb->data - NET_IP_ALIGN, | 513 | skb_copy_to_linear_data_offset(new_skb, |
514 | skb->data - NET_IP_ALIGN, | 514 | -NET_IP_ALIGN, |
515 | length + NET_IP_ALIGN); | 515 | (skb->data - |
516 | NET_IP_ALIGN), | ||
517 | (length + | ||
518 | NET_IP_ALIGN)); | ||
516 | /* save the skb in buffer_info as good */ | 519 | /* save the skb in buffer_info as good */ |
517 | buffer_info->skb = skb; | 520 | buffer_info->skb = skb; |
518 | skb = new_skb; | 521 | skb = new_skb; |
@@ -1233,26 +1236,36 @@ static irqreturn_t e1000_intr(int irq, void *data) | |||
1233 | return IRQ_HANDLED; | 1236 | return IRQ_HANDLED; |
1234 | } | 1237 | } |
1235 | 1238 | ||
1239 | /** | ||
1240 | * e1000_request_irq - initialize interrupts | ||
1241 | * | ||
1242 | * Attempts to configure interrupts using the best available | ||
1243 | * capabilities of the hardware and kernel. | ||
1244 | **/ | ||
1236 | static int e1000_request_irq(struct e1000_adapter *adapter) | 1245 | static int e1000_request_irq(struct e1000_adapter *adapter) |
1237 | { | 1246 | { |
1238 | struct net_device *netdev = adapter->netdev; | 1247 | struct net_device *netdev = adapter->netdev; |
1239 | irq_handler_t handler = e1000_intr; | ||
1240 | int irq_flags = IRQF_SHARED; | 1248 | int irq_flags = IRQF_SHARED; |
1241 | int err; | 1249 | int err; |
1242 | 1250 | ||
1243 | if (!pci_enable_msi(adapter->pdev)) { | 1251 | if (!(adapter->flags & FLAG_MSI_TEST_FAILED)) { |
1244 | adapter->flags |= FLAG_MSI_ENABLED; | 1252 | err = pci_enable_msi(adapter->pdev); |
1245 | handler = e1000_intr_msi; | 1253 | if (!err) { |
1246 | irq_flags = 0; | 1254 | adapter->flags |= FLAG_MSI_ENABLED; |
1255 | irq_flags = 0; | ||
1256 | } | ||
1247 | } | 1257 | } |
1248 | 1258 | ||
1249 | err = request_irq(adapter->pdev->irq, handler, irq_flags, netdev->name, | 1259 | err = request_irq(adapter->pdev->irq, |
1250 | netdev); | 1260 | ((adapter->flags & FLAG_MSI_ENABLED) ? |
1261 | &e1000_intr_msi : &e1000_intr), | ||
1262 | irq_flags, netdev->name, netdev); | ||
1251 | if (err) { | 1263 | if (err) { |
1252 | e_err("Unable to allocate %s interrupt (return: %d)\n", | 1264 | if (adapter->flags & FLAG_MSI_ENABLED) { |
1253 | adapter->flags & FLAG_MSI_ENABLED ? "MSI":"INTx", err); | ||
1254 | if (adapter->flags & FLAG_MSI_ENABLED) | ||
1255 | pci_disable_msi(adapter->pdev); | 1265 | pci_disable_msi(adapter->pdev); |
1266 | adapter->flags &= ~FLAG_MSI_ENABLED; | ||
1267 | } | ||
1268 | e_err("Unable to allocate interrupt, Error: %d\n", err); | ||
1256 | } | 1269 | } |
1257 | 1270 | ||
1258 | return err; | 1271 | return err; |
@@ -2592,6 +2605,135 @@ err: | |||
2592 | } | 2605 | } |
2593 | 2606 | ||
2594 | /** | 2607 | /** |
2608 | * e1000_intr_msi_test - Interrupt Handler | ||
2609 | * @irq: interrupt number | ||
2610 | * @data: pointer to a network interface device structure | ||
2611 | **/ | ||
2612 | static irqreturn_t e1000_intr_msi_test(int irq, void *data) | ||
2613 | { | ||
2614 | struct net_device *netdev = data; | ||
2615 | struct e1000_adapter *adapter = netdev_priv(netdev); | ||
2616 | struct e1000_hw *hw = &adapter->hw; | ||
2617 | u32 icr = er32(ICR); | ||
2618 | |||
2619 | e_dbg("%s: icr is %08X\n", netdev->name, icr); | ||
2620 | if (icr & E1000_ICR_RXSEQ) { | ||
2621 | adapter->flags &= ~FLAG_MSI_TEST_FAILED; | ||
2622 | wmb(); | ||
2623 | } | ||
2624 | |||
2625 | return IRQ_HANDLED; | ||
2626 | } | ||
2627 | |||
2628 | /** | ||
2629 | * e1000_test_msi_interrupt - Returns 0 for successful test | ||
2630 | * @adapter: board private struct | ||
2631 | * | ||
2632 | * code flow taken from tg3.c | ||
2633 | **/ | ||
2634 | static int e1000_test_msi_interrupt(struct e1000_adapter *adapter) | ||
2635 | { | ||
2636 | struct net_device *netdev = adapter->netdev; | ||
2637 | struct e1000_hw *hw = &adapter->hw; | ||
2638 | int err; | ||
2639 | |||
2640 | /* poll_enable hasn't been called yet, so don't need disable */ | ||
2641 | /* clear any pending events */ | ||
2642 | er32(ICR); | ||
2643 | |||
2644 | /* free the real vector and request a test handler */ | ||
2645 | e1000_free_irq(adapter); | ||
2646 | |||
2647 | /* Assume that the test fails, if it succeeds then the test | ||
2648 | * MSI irq handler will unset this flag */ | ||
2649 | adapter->flags |= FLAG_MSI_TEST_FAILED; | ||
2650 | |||
2651 | err = pci_enable_msi(adapter->pdev); | ||
2652 | if (err) | ||
2653 | goto msi_test_failed; | ||
2654 | |||
2655 | err = request_irq(adapter->pdev->irq, &e1000_intr_msi_test, 0, | ||
2656 | netdev->name, netdev); | ||
2657 | if (err) { | ||
2658 | pci_disable_msi(adapter->pdev); | ||
2659 | goto msi_test_failed; | ||
2660 | } | ||
2661 | |||
2662 | wmb(); | ||
2663 | |||
2664 | e1000_irq_enable(adapter); | ||
2665 | |||
2666 | /* fire an unusual interrupt on the test handler */ | ||
2667 | ew32(ICS, E1000_ICS_RXSEQ); | ||
2668 | e1e_flush(); | ||
2669 | msleep(50); | ||
2670 | |||
2671 | e1000_irq_disable(adapter); | ||
2672 | |||
2673 | rmb(); | ||
2674 | |||
2675 | if (adapter->flags & FLAG_MSI_TEST_FAILED) { | ||
2676 | err = -EIO; | ||
2677 | e_info("MSI interrupt test failed!\n"); | ||
2678 | } | ||
2679 | |||
2680 | free_irq(adapter->pdev->irq, netdev); | ||
2681 | pci_disable_msi(adapter->pdev); | ||
2682 | |||
2683 | if (err == -EIO) | ||
2684 | goto msi_test_failed; | ||
2685 | |||
2686 | /* okay so the test worked, restore settings */ | ||
2687 | e_dbg("%s: MSI interrupt test succeeded!\n", netdev->name); | ||
2688 | msi_test_failed: | ||
2689 | /* restore the original vector, even if it failed */ | ||
2690 | e1000_request_irq(adapter); | ||
2691 | return err; | ||
2692 | } | ||
2693 | |||
2694 | /** | ||
2695 | * e1000_test_msi - Returns 0 if MSI test succeeds or INTx mode is restored | ||
2696 | * @adapter: board private struct | ||
2697 | * | ||
2698 | * code flow taken from tg3.c, called with e1000 interrupts disabled. | ||
2699 | **/ | ||
2700 | static int e1000_test_msi(struct e1000_adapter *adapter) | ||
2701 | { | ||
2702 | int err; | ||
2703 | u16 pci_cmd; | ||
2704 | |||
2705 | if (!(adapter->flags & FLAG_MSI_ENABLED)) | ||
2706 | return 0; | ||
2707 | |||
2708 | /* disable SERR in case the MSI write causes a master abort */ | ||
2709 | pci_read_config_word(adapter->pdev, PCI_COMMAND, &pci_cmd); | ||
2710 | pci_write_config_word(adapter->pdev, PCI_COMMAND, | ||
2711 | pci_cmd & ~PCI_COMMAND_SERR); | ||
2712 | |||
2713 | err = e1000_test_msi_interrupt(adapter); | ||
2714 | |||
2715 | /* restore previous setting of command word */ | ||
2716 | pci_write_config_word(adapter->pdev, PCI_COMMAND, pci_cmd); | ||
2717 | |||
2718 | /* success ! */ | ||
2719 | if (!err) | ||
2720 | return 0; | ||
2721 | |||
2722 | /* EIO means MSI test failed */ | ||
2723 | if (err != -EIO) | ||
2724 | return err; | ||
2725 | |||
2726 | /* back to INTx mode */ | ||
2727 | e_warn("MSI interrupt test failed, using legacy interrupt.\n"); | ||
2728 | |||
2729 | e1000_free_irq(adapter); | ||
2730 | |||
2731 | err = e1000_request_irq(adapter); | ||
2732 | |||
2733 | return err; | ||
2734 | } | ||
2735 | |||
2736 | /** | ||
2595 | * e1000_open - Called when a network interface is made active | 2737 | * e1000_open - Called when a network interface is made active |
2596 | * @netdev: network interface device structure | 2738 | * @netdev: network interface device structure |
2597 | * | 2739 | * |
@@ -2649,6 +2791,19 @@ static int e1000_open(struct net_device *netdev) | |||
2649 | if (err) | 2791 | if (err) |
2650 | goto err_req_irq; | 2792 | goto err_req_irq; |
2651 | 2793 | ||
2794 | /* | ||
2795 | * Work around PCIe errata with MSI interrupts causing some chipsets to | ||
2796 | * ignore e1000e MSI messages, which means we need to test our MSI | ||
2797 | * interrupt now | ||
2798 | */ | ||
2799 | { | ||
2800 | err = e1000_test_msi(adapter); | ||
2801 | if (err) { | ||
2802 | e_err("Interrupt allocation failed\n"); | ||
2803 | goto err_req_irq; | ||
2804 | } | ||
2805 | } | ||
2806 | |||
2652 | /* From here on the code is the same as e1000e_up() */ | 2807 | /* From here on the code is the same as e1000e_up() */ |
2653 | clear_bit(__E1000_DOWN, &adapter->state); | 2808 | clear_bit(__E1000_DOWN, &adapter->state); |
2654 | 2809 | ||
@@ -3055,7 +3210,7 @@ static void e1000_watchdog_task(struct work_struct *work) | |||
3055 | case SPEED_10: | 3210 | case SPEED_10: |
3056 | txb2b = 0; | 3211 | txb2b = 0; |
3057 | netdev->tx_queue_len = 10; | 3212 | netdev->tx_queue_len = 10; |
3058 | adapter->tx_timeout_factor = 14; | 3213 | adapter->tx_timeout_factor = 16; |
3059 | break; | 3214 | break; |
3060 | case SPEED_100: | 3215 | case SPEED_100: |
3061 | txb2b = 0; | 3216 | txb2b = 0; |
@@ -3721,7 +3876,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
3721 | struct e1000_adapter *adapter = netdev_priv(netdev); | 3876 | struct e1000_adapter *adapter = netdev_priv(netdev); |
3722 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; | 3877 | int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN; |
3723 | 3878 | ||
3724 | if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) || | 3879 | if ((new_mtu < ETH_ZLEN + ETH_FCS_LEN + VLAN_HLEN) || |
3725 | (max_frame > MAX_JUMBO_FRAME_SIZE)) { | 3880 | (max_frame > MAX_JUMBO_FRAME_SIZE)) { |
3726 | e_err("Invalid MTU setting\n"); | 3881 | e_err("Invalid MTU setting\n"); |
3727 | return -EINVAL; | 3882 | return -EINVAL; |
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c index 8effc3107f9a..ed912e023a72 100644 --- a/drivers/net/e1000e/param.c +++ b/drivers/net/e1000e/param.c | |||
@@ -324,14 +324,27 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter) | |||
324 | adapter->itr = 20000; | 324 | adapter->itr = 20000; |
325 | break; | 325 | break; |
326 | default: | 326 | default: |
327 | e1000_validate_option(&adapter->itr, &opt, | ||
328 | adapter); | ||
329 | /* | 327 | /* |
330 | * save the setting, because the dynamic bits | 328 | * Save the setting, because the dynamic bits |
331 | * change itr. clear the lower two bits | 329 | * change itr. |
332 | * because they are used as control | ||
333 | */ | 330 | */ |
334 | adapter->itr_setting = adapter->itr & ~3; | 331 | if (e1000_validate_option(&adapter->itr, &opt, |
332 | adapter) && | ||
333 | (adapter->itr == 3)) { | ||
334 | /* | ||
335 | * In case of invalid user value, | ||
336 | * default to conservative mode. | ||
337 | */ | ||
338 | adapter->itr_setting = adapter->itr; | ||
339 | adapter->itr = 20000; | ||
340 | } else { | ||
341 | /* | ||
342 | * Clear the lower two bits because | ||
343 | * they are used as control. | ||
344 | */ | ||
345 | adapter->itr_setting = | ||
346 | adapter->itr & ~3; | ||
347 | } | ||
335 | break; | 348 | break; |
336 | } | 349 | } |
337 | } else { | 350 | } else { |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index ca6cf6ecb37b..999d69168277 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -134,9 +134,7 @@ static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int l | |||
134 | static void gfar_vlan_rx_register(struct net_device *netdev, | 134 | static void gfar_vlan_rx_register(struct net_device *netdev, |
135 | struct vlan_group *grp); | 135 | struct vlan_group *grp); |
136 | void gfar_halt(struct net_device *dev); | 136 | void gfar_halt(struct net_device *dev); |
137 | #ifdef CONFIG_PM | ||
138 | static void gfar_halt_nodisable(struct net_device *dev); | 137 | static void gfar_halt_nodisable(struct net_device *dev); |
139 | #endif | ||
140 | void gfar_start(struct net_device *dev); | 138 | void gfar_start(struct net_device *dev); |
141 | static void gfar_clear_exact_match(struct net_device *dev); | 139 | static void gfar_clear_exact_match(struct net_device *dev); |
142 | static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr); | 140 | static void gfar_set_mac_for_addr(struct net_device *dev, int num, u8 *addr); |
@@ -631,7 +629,6 @@ static void init_registers(struct net_device *dev) | |||
631 | } | 629 | } |
632 | 630 | ||
633 | 631 | ||
634 | #ifdef CONFIG_PM | ||
635 | /* Halt the receive and transmit queues */ | 632 | /* Halt the receive and transmit queues */ |
636 | static void gfar_halt_nodisable(struct net_device *dev) | 633 | static void gfar_halt_nodisable(struct net_device *dev) |
637 | { | 634 | { |
@@ -657,7 +654,6 @@ static void gfar_halt_nodisable(struct net_device *dev) | |||
657 | cpu_relax(); | 654 | cpu_relax(); |
658 | } | 655 | } |
659 | } | 656 | } |
660 | #endif | ||
661 | 657 | ||
662 | /* Halt the receive and transmit queues */ | 658 | /* Halt the receive and transmit queues */ |
663 | void gfar_halt(struct net_device *dev) | 659 | void gfar_halt(struct net_device *dev) |
@@ -666,6 +662,8 @@ void gfar_halt(struct net_device *dev) | |||
666 | struct gfar __iomem *regs = priv->regs; | 662 | struct gfar __iomem *regs = priv->regs; |
667 | u32 tempval; | 663 | u32 tempval; |
668 | 664 | ||
665 | gfar_halt_nodisable(dev); | ||
666 | |||
669 | /* Disable Rx and Tx */ | 667 | /* Disable Rx and Tx */ |
670 | tempval = gfar_read(®s->maccfg1); | 668 | tempval = gfar_read(®s->maccfg1); |
671 | tempval &= ~(MACCFG1_RX_EN | MACCFG1_TX_EN); | 669 | tempval &= ~(MACCFG1_RX_EN | MACCFG1_TX_EN); |
diff --git a/drivers/net/gianfar_sysfs.c b/drivers/net/gianfar_sysfs.c index 5116f68e01b9..782c20170082 100644 --- a/drivers/net/gianfar_sysfs.c +++ b/drivers/net/gianfar_sysfs.c | |||
@@ -33,7 +33,6 @@ | |||
33 | 33 | ||
34 | #include <asm/uaccess.h> | 34 | #include <asm/uaccess.h> |
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/version.h> | ||
37 | 36 | ||
38 | #include "gianfar.h" | 37 | #include "gianfar.h" |
39 | 38 | ||
diff --git a/drivers/net/ipg.h b/drivers/net/ipg.h index e0e718ab4c2e..dd9318f19497 100644 --- a/drivers/net/ipg.h +++ b/drivers/net/ipg.h | |||
@@ -7,7 +7,6 @@ | |||
7 | #ifndef __LINUX_IPG_H | 7 | #ifndef __LINUX_IPG_H |
8 | #define __LINUX_IPG_H | 8 | #define __LINUX_IPG_H |
9 | 9 | ||
10 | #include <linux/version.h> | ||
11 | #include <linux/module.h> | 10 | #include <linux/module.h> |
12 | 11 | ||
13 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
@@ -21,7 +20,6 @@ | |||
21 | #include <linux/etherdevice.h> | 20 | #include <linux/etherdevice.h> |
22 | #include <linux/init.h> | 21 | #include <linux/init.h> |
23 | #include <linux/skbuff.h> | 22 | #include <linux/skbuff.h> |
24 | #include <linux/version.h> | ||
25 | #include <asm/bitops.h> | 23 | #include <asm/bitops.h> |
26 | 24 | ||
27 | /* | 25 | /* |
diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c index 2f38e847e2cd..f96358b641af 100644 --- a/drivers/net/ixgbe/ixgbe_82598.c +++ b/drivers/net/ixgbe/ixgbe_82598.c | |||
@@ -190,6 +190,7 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw) | |||
190 | case IXGBE_DEV_ID_82598AF_DUAL_PORT: | 190 | case IXGBE_DEV_ID_82598AF_DUAL_PORT: |
191 | case IXGBE_DEV_ID_82598AF_SINGLE_PORT: | 191 | case IXGBE_DEV_ID_82598AF_SINGLE_PORT: |
192 | case IXGBE_DEV_ID_82598EB_CX4: | 192 | case IXGBE_DEV_ID_82598EB_CX4: |
193 | case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: | ||
193 | media_type = ixgbe_media_type_fiber; | 194 | media_type = ixgbe_media_type_fiber; |
194 | break; | 195 | break; |
195 | case IXGBE_DEV_ID_82598AT_DUAL_PORT: | 196 | case IXGBE_DEV_ID_82598AT_DUAL_PORT: |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index e5f3da8468cc..34bca16d48a6 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -48,7 +48,7 @@ char ixgbe_driver_name[] = "ixgbe"; | |||
48 | static const char ixgbe_driver_string[] = | 48 | static const char ixgbe_driver_string[] = |
49 | "Intel(R) 10 Gigabit PCI Express Network Driver"; | 49 | "Intel(R) 10 Gigabit PCI Express Network Driver"; |
50 | 50 | ||
51 | #define DRV_VERSION "1.3.18-k2" | 51 | #define DRV_VERSION "1.3.18-k4" |
52 | const char ixgbe_driver_version[] = DRV_VERSION; | 52 | const char ixgbe_driver_version[] = DRV_VERSION; |
53 | static const char ixgbe_copyright[] = | 53 | static const char ixgbe_copyright[] = |
54 | "Copyright (c) 1999-2007 Intel Corporation."; | 54 | "Copyright (c) 1999-2007 Intel Corporation."; |
@@ -72,6 +72,8 @@ static struct pci_device_id ixgbe_pci_tbl[] = { | |||
72 | board_82598 }, | 72 | board_82598 }, |
73 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4), | 73 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4), |
74 | board_82598 }, | 74 | board_82598 }, |
75 | {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_CX4_DUAL_PORT), | ||
76 | board_82598 }, | ||
75 | 77 | ||
76 | /* required last entry */ | 78 | /* required last entry */ |
77 | {0, } | 79 | {0, } |
diff --git a/drivers/net/ixgbe/ixgbe_type.h b/drivers/net/ixgbe/ixgbe_type.h index 1ad7cb9c25a8..c0282a223df3 100644 --- a/drivers/net/ixgbe/ixgbe_type.h +++ b/drivers/net/ixgbe/ixgbe_type.h | |||
@@ -39,6 +39,7 @@ | |||
39 | #define IXGBE_DEV_ID_82598AF_SINGLE_PORT 0x10C7 | 39 | #define IXGBE_DEV_ID_82598AF_SINGLE_PORT 0x10C7 |
40 | #define IXGBE_DEV_ID_82598AT_DUAL_PORT 0x10C8 | 40 | #define IXGBE_DEV_ID_82598AT_DUAL_PORT 0x10C8 |
41 | #define IXGBE_DEV_ID_82598EB_CX4 0x10DD | 41 | #define IXGBE_DEV_ID_82598EB_CX4 0x10DD |
42 | #define IXGBE_DEV_ID_82598_CX4_DUAL_PORT 0x10EC | ||
42 | 43 | ||
43 | /* General Registers */ | 44 | /* General Registers */ |
44 | #define IXGBE_CTRL 0x00000 | 45 | #define IXGBE_CTRL 0x00000 |
diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c index 49f6bc036a92..3b43bfd85a0f 100644 --- a/drivers/net/loopback.c +++ b/drivers/net/loopback.c | |||
@@ -64,68 +64,6 @@ struct pcpu_lstats { | |||
64 | unsigned long bytes; | 64 | unsigned long bytes; |
65 | }; | 65 | }; |
66 | 66 | ||
67 | /* KISS: just allocate small chunks and copy bits. | ||
68 | * | ||
69 | * So, in fact, this is documentation, explaining what we expect | ||
70 | * of largesending device modulo TCP checksum, which is ignored for loopback. | ||
71 | */ | ||
72 | |||
73 | #ifdef LOOPBACK_TSO | ||
74 | static void emulate_large_send_offload(struct sk_buff *skb) | ||
75 | { | ||
76 | struct iphdr *iph = ip_hdr(skb); | ||
77 | struct tcphdr *th = (struct tcphdr *)(skb_network_header(skb) + | ||
78 | (iph->ihl * 4)); | ||
79 | unsigned int doffset = (iph->ihl + th->doff) * 4; | ||
80 | unsigned int mtu = skb_shinfo(skb)->gso_size + doffset; | ||
81 | unsigned int offset = 0; | ||
82 | u32 seq = ntohl(th->seq); | ||
83 | u16 id = ntohs(iph->id); | ||
84 | |||
85 | while (offset + doffset < skb->len) { | ||
86 | unsigned int frag_size = min(mtu, skb->len - offset) - doffset; | ||
87 | struct sk_buff *nskb = alloc_skb(mtu + 32, GFP_ATOMIC); | ||
88 | |||
89 | if (!nskb) | ||
90 | break; | ||
91 | skb_reserve(nskb, 32); | ||
92 | skb_set_mac_header(nskb, -ETH_HLEN); | ||
93 | skb_reset_network_header(nskb); | ||
94 | iph = ip_hdr(nskb); | ||
95 | skb_copy_to_linear_data(nskb, skb_network_header(skb), | ||
96 | doffset); | ||
97 | if (skb_copy_bits(skb, | ||
98 | doffset + offset, | ||
99 | nskb->data + doffset, | ||
100 | frag_size)) | ||
101 | BUG(); | ||
102 | skb_put(nskb, doffset + frag_size); | ||
103 | nskb->ip_summed = CHECKSUM_UNNECESSARY; | ||
104 | nskb->dev = skb->dev; | ||
105 | nskb->priority = skb->priority; | ||
106 | nskb->protocol = skb->protocol; | ||
107 | nskb->dst = dst_clone(skb->dst); | ||
108 | memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); | ||
109 | nskb->pkt_type = skb->pkt_type; | ||
110 | |||
111 | th = (struct tcphdr *)(skb_network_header(nskb) + iph->ihl * 4); | ||
112 | iph->tot_len = htons(frag_size + doffset); | ||
113 | iph->id = htons(id); | ||
114 | iph->check = 0; | ||
115 | iph->check = ip_fast_csum((unsigned char *) iph, iph->ihl); | ||
116 | th->seq = htonl(seq); | ||
117 | if (offset + doffset + frag_size < skb->len) | ||
118 | th->fin = th->psh = 0; | ||
119 | netif_rx(nskb); | ||
120 | offset += frag_size; | ||
121 | seq += frag_size; | ||
122 | id++; | ||
123 | } | ||
124 | |||
125 | dev_kfree_skb(skb); | ||
126 | } | ||
127 | #endif /* LOOPBACK_TSO */ | ||
128 | |||
129 | /* | 67 | /* |
130 | * The higher levels take care of making this non-reentrant (it's | 68 | * The higher levels take care of making this non-reentrant (it's |
131 | * called with bh's disabled). | 69 | * called with bh's disabled). |
@@ -137,9 +75,6 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) | |||
137 | skb_orphan(skb); | 75 | skb_orphan(skb); |
138 | 76 | ||
139 | skb->protocol = eth_type_trans(skb,dev); | 77 | skb->protocol = eth_type_trans(skb,dev); |
140 | #ifndef LOOPBACK_MUST_CHECKSUM | ||
141 | skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
142 | #endif | ||
143 | 78 | ||
144 | #ifdef LOOPBACK_TSO | 79 | #ifdef LOOPBACK_TSO |
145 | if (skb_is_gso(skb)) { | 80 | if (skb_is_gso(skb)) { |
@@ -234,9 +169,7 @@ static void loopback_setup(struct net_device *dev) | |||
234 | dev->type = ARPHRD_LOOPBACK; /* 0x0001*/ | 169 | dev->type = ARPHRD_LOOPBACK; /* 0x0001*/ |
235 | dev->flags = IFF_LOOPBACK; | 170 | dev->flags = IFF_LOOPBACK; |
236 | dev->features = NETIF_F_SG | NETIF_F_FRAGLIST | 171 | dev->features = NETIF_F_SG | NETIF_F_FRAGLIST |
237 | #ifdef LOOPBACK_TSO | ||
238 | | NETIF_F_TSO | 172 | | NETIF_F_TSO |
239 | #endif | ||
240 | | NETIF_F_NO_CSUM | 173 | | NETIF_F_NO_CSUM |
241 | | NETIF_F_HIGHDMA | 174 | | NETIF_F_HIGHDMA |
242 | | NETIF_F_LLTX | 175 | | NETIF_F_LLTX |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index f1de38f8b742..54cd89cb0838 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -56,7 +56,6 @@ | |||
56 | #include <linux/ethtool.h> | 56 | #include <linux/ethtool.h> |
57 | #include <linux/firmware.h> | 57 | #include <linux/firmware.h> |
58 | #include <linux/delay.h> | 58 | #include <linux/delay.h> |
59 | #include <linux/version.h> | ||
60 | #include <linux/timer.h> | 59 | #include <linux/timer.h> |
61 | #include <linux/vmalloc.h> | 60 | #include <linux/vmalloc.h> |
62 | #include <linux/crc32.h> | 61 | #include <linux/crc32.h> |
@@ -3548,7 +3547,11 @@ static void myri10ge_probe_slices(struct myri10ge_priv *mgp) | |||
3548 | 3547 | ||
3549 | /* try to load the slice aware rss firmware */ | 3548 | /* try to load the slice aware rss firmware */ |
3550 | old_fw = mgp->fw_name; | 3549 | old_fw = mgp->fw_name; |
3551 | if (old_fw == myri10ge_fw_aligned) | 3550 | if (myri10ge_fw_name != NULL) { |
3551 | dev_info(&mgp->pdev->dev, "overriding rss firmware to %s\n", | ||
3552 | myri10ge_fw_name); | ||
3553 | mgp->fw_name = myri10ge_fw_name; | ||
3554 | } else if (old_fw == myri10ge_fw_aligned) | ||
3552 | mgp->fw_name = myri10ge_fw_rss_aligned; | 3555 | mgp->fw_name = myri10ge_fw_rss_aligned; |
3553 | else | 3556 | else |
3554 | mgp->fw_name = myri10ge_fw_rss_unaligned; | 3557 | mgp->fw_name = myri10ge_fw_rss_unaligned; |
diff --git a/drivers/net/ne.c b/drivers/net/ne.c index 42443d697423..fa3ceca4e15c 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c | |||
@@ -118,7 +118,7 @@ bad_clone_list[] __initdata = { | |||
118 | {"E-LAN100", "E-LAN200", {0x00, 0x00, 0x5d}}, /* Broken ne1000 clones */ | 118 | {"E-LAN100", "E-LAN200", {0x00, 0x00, 0x5d}}, /* Broken ne1000 clones */ |
119 | {"PCM-4823", "PCM-4823", {0x00, 0xc0, 0x6c}}, /* Broken Advantech MoBo */ | 119 | {"PCM-4823", "PCM-4823", {0x00, 0xc0, 0x6c}}, /* Broken Advantech MoBo */ |
120 | {"REALTEK", "RTL8019", {0x00, 0x00, 0xe8}}, /* no-name with Realtek chip */ | 120 | {"REALTEK", "RTL8019", {0x00, 0x00, 0xe8}}, /* no-name with Realtek chip */ |
121 | #if defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938) | 121 | #ifdef CONFIG_MACH_TX49XX |
122 | {"RBHMA4X00-RTL8019", "RBHMA4X00/RTL8019", {0x00, 0x60, 0x0a}}, /* Toshiba built-in */ | 122 | {"RBHMA4X00-RTL8019", "RBHMA4X00/RTL8019", {0x00, 0x60, 0x0a}}, /* Toshiba built-in */ |
123 | #endif | 123 | #endif |
124 | {"LCS-8834", "LCS-8836", {0x04, 0x04, 0x37}}, /* ShinyNet (SET) */ | 124 | {"LCS-8834", "LCS-8836", {0x04, 0x04, 0x37}}, /* ShinyNet (SET) */ |
@@ -142,7 +142,7 @@ bad_clone_list[] __initdata = { | |||
142 | #if defined(CONFIG_PLAT_MAPPI) | 142 | #if defined(CONFIG_PLAT_MAPPI) |
143 | # define DCR_VAL 0x4b | 143 | # define DCR_VAL 0x4b |
144 | #elif defined(CONFIG_PLAT_OAKS32R) || \ | 144 | #elif defined(CONFIG_PLAT_OAKS32R) || \ |
145 | defined(CONFIG_TOSHIBA_RBTX4927) || defined(CONFIG_TOSHIBA_RBTX4938) | 145 | defined(CONFIG_MACH_TX49XX) |
146 | # define DCR_VAL 0x48 /* 8-bit mode */ | 146 | # define DCR_VAL 0x48 /* 8-bit mode */ |
147 | #else | 147 | #else |
148 | # define DCR_VAL 0x49 | 148 | # define DCR_VAL 0x49 |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 93a7b9b668d5..244ab49c4337 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -45,7 +45,6 @@ | |||
45 | #include <linux/in.h> | 45 | #include <linux/in.h> |
46 | #include <linux/tcp.h> | 46 | #include <linux/tcp.h> |
47 | #include <linux/skbuff.h> | 47 | #include <linux/skbuff.h> |
48 | #include <linux/version.h> | ||
49 | 48 | ||
50 | #include <linux/ethtool.h> | 49 | #include <linux/ethtool.h> |
51 | #include <linux/mii.h> | 50 | #include <linux/mii.h> |
@@ -66,8 +65,8 @@ | |||
66 | 65 | ||
67 | #define _NETXEN_NIC_LINUX_MAJOR 4 | 66 | #define _NETXEN_NIC_LINUX_MAJOR 4 |
68 | #define _NETXEN_NIC_LINUX_MINOR 0 | 67 | #define _NETXEN_NIC_LINUX_MINOR 0 |
69 | #define _NETXEN_NIC_LINUX_SUBVERSION 0 | 68 | #define _NETXEN_NIC_LINUX_SUBVERSION 11 |
70 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.0" | 69 | #define NETXEN_NIC_LINUX_VERSIONID "4.0.11" |
71 | 70 | ||
72 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 16) + ((b) << 8) + (c)) | 71 | #define NETXEN_VERSION_CODE(a, b, c) (((a) << 16) + ((b) << 8) + (c)) |
73 | 72 | ||
@@ -1615,7 +1614,8 @@ dma_watchdog_wakeup(struct netxen_adapter *adapter) | |||
1615 | 1614 | ||
1616 | 1615 | ||
1617 | int netxen_is_flash_supported(struct netxen_adapter *adapter); | 1616 | int netxen_is_flash_supported(struct netxen_adapter *adapter); |
1618 | int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 mac[]); | 1617 | int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac); |
1618 | int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac); | ||
1619 | extern void netxen_change_ringparam(struct netxen_adapter *adapter); | 1619 | extern void netxen_change_ringparam(struct netxen_adapter *adapter); |
1620 | extern int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, | 1620 | extern int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, |
1621 | int *valp); | 1621 | int *valp); |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 4ad3e0844b99..b974ca0fc530 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #include <asm/io.h> | 38 | #include <asm/io.h> |
39 | #include <linux/netdevice.h> | 39 | #include <linux/netdevice.h> |
40 | #include <linux/ethtool.h> | 40 | #include <linux/ethtool.h> |
41 | #include <linux/version.h> | ||
42 | 41 | ||
43 | #include "netxen_nic.h" | 42 | #include "netxen_nic.h" |
44 | #include "netxen_nic_hw.h" | 43 | #include "netxen_nic_hw.h" |
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index e8e8d73f6ed7..e80f9e3e5973 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
@@ -32,8 +32,6 @@ | |||
32 | 32 | ||
33 | #include <linux/module.h> | 33 | #include <linux/module.h> |
34 | #include <linux/kernel.h> | 34 | #include <linux/kernel.h> |
35 | #include <linux/version.h> | ||
36 | |||
37 | #include <linux/spinlock.h> | 35 | #include <linux/spinlock.h> |
38 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
39 | #include <linux/init.h> | 37 | #include <linux/init.h> |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 9aa20f961618..84978f80f396 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -733,31 +733,56 @@ static int netxen_get_flash_block(struct netxen_adapter *adapter, int base, | |||
733 | return 0; | 733 | return 0; |
734 | } | 734 | } |
735 | 735 | ||
736 | int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 mac[]) | 736 | int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac) |
737 | { | 737 | { |
738 | __le32 *pmac = (__le32 *) & mac[0]; | 738 | __le32 *pmac = (__le32 *) mac; |
739 | u32 offset; | ||
739 | 740 | ||
740 | if (netxen_get_flash_block(adapter, | 741 | offset = NETXEN_USER_START + |
741 | NETXEN_USER_START + | 742 | offsetof(struct netxen_new_user_info, mac_addr) + |
742 | offsetof(struct netxen_new_user_info, | 743 | adapter->portnum * sizeof(u64); |
743 | mac_addr), | 744 | |
744 | FLASH_NUM_PORTS * sizeof(u64), pmac) == -1) { | 745 | if (netxen_get_flash_block(adapter, offset, sizeof(u64), pmac) == -1) |
745 | return -1; | 746 | return -1; |
746 | } | 747 | |
747 | if (*mac == cpu_to_le64(~0ULL)) { | 748 | if (*mac == cpu_to_le64(~0ULL)) { |
749 | |||
750 | offset = NETXEN_USER_START_OLD + | ||
751 | offsetof(struct netxen_user_old_info, mac_addr) + | ||
752 | adapter->portnum * sizeof(u64); | ||
753 | |||
748 | if (netxen_get_flash_block(adapter, | 754 | if (netxen_get_flash_block(adapter, |
749 | NETXEN_USER_START_OLD + | 755 | offset, sizeof(u64), pmac) == -1) |
750 | offsetof(struct netxen_user_old_info, | ||
751 | mac_addr), | ||
752 | FLASH_NUM_PORTS * sizeof(u64), | ||
753 | pmac) == -1) | ||
754 | return -1; | 756 | return -1; |
757 | |||
755 | if (*mac == cpu_to_le64(~0ULL)) | 758 | if (*mac == cpu_to_le64(~0ULL)) |
756 | return -1; | 759 | return -1; |
757 | } | 760 | } |
758 | return 0; | 761 | return 0; |
759 | } | 762 | } |
760 | 763 | ||
764 | int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac) | ||
765 | { | ||
766 | uint32_t crbaddr, mac_hi, mac_lo; | ||
767 | int pci_func = adapter->ahw.pci_func; | ||
768 | |||
769 | crbaddr = CRB_MAC_BLOCK_START + | ||
770 | (4 * ((pci_func/2) * 3)) + (4 * (pci_func & 1)); | ||
771 | |||
772 | adapter->hw_read_wx(adapter, crbaddr, &mac_lo, 4); | ||
773 | adapter->hw_read_wx(adapter, crbaddr+4, &mac_hi, 4); | ||
774 | |||
775 | mac_hi = cpu_to_le32(mac_hi); | ||
776 | mac_lo = cpu_to_le32(mac_lo); | ||
777 | |||
778 | if (pci_func & 1) | ||
779 | *mac = ((mac_lo >> 16) | ((u64)mac_hi << 16)); | ||
780 | else | ||
781 | *mac = ((mac_lo) | ((u64)mac_hi << 32)); | ||
782 | |||
783 | return 0; | ||
784 | } | ||
785 | |||
761 | #define CRB_WIN_LOCK_TIMEOUT 100000000 | 786 | #define CRB_WIN_LOCK_TIMEOUT 100000000 |
762 | 787 | ||
763 | static int crb_win_lock(struct netxen_adapter *adapter) | 788 | static int crb_win_lock(struct netxen_adapter *adapter) |
@@ -2183,10 +2208,10 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter) | |||
2183 | if (adapter->portnum == 0) { | 2208 | if (adapter->portnum == 0) { |
2184 | get_brd_name_by_type(board_info->board_type, brd_name); | 2209 | get_brd_name_by_type(board_info->board_type, brd_name); |
2185 | 2210 | ||
2186 | printk("NetXen %s Board S/N %s Chip id 0x%x\n", | 2211 | printk(KERN_INFO "NetXen %s Board S/N %s Chip rev 0x%x\n", |
2187 | brd_name, serial_num, board_info->chip_id); | 2212 | brd_name, serial_num, adapter->ahw.revision_id); |
2188 | printk("NetXen Firmware version %d.%d.%d\n", fw_major, | 2213 | printk(KERN_INFO "NetXen Firmware version %d.%d.%d\n", |
2189 | fw_minor, fw_build); | 2214 | fw_major, fw_minor, fw_build); |
2190 | } | 2215 | } |
2191 | 2216 | ||
2192 | if (NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build) < | 2217 | if (NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build) < |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 519fc860e17e..5bba675d0504 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -1079,10 +1079,12 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter) | |||
1079 | 1079 | ||
1080 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) | 1080 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) |
1081 | { | 1081 | { |
1082 | int i; | 1082 | int i = 100; |
1083 | |||
1084 | if (!adapter->dummy_dma.addr) | ||
1085 | return; | ||
1083 | 1086 | ||
1084 | if (adapter->dummy_dma.addr) { | 1087 | if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { |
1085 | i = 100; | ||
1086 | do { | 1088 | do { |
1087 | if (dma_watchdog_shutdown_request(adapter) == 1) | 1089 | if (dma_watchdog_shutdown_request(adapter) == 1) |
1088 | break; | 1090 | break; |
@@ -1090,17 +1092,17 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter) | |||
1090 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) | 1092 | if (dma_watchdog_shutdown_poll_result(adapter) == 1) |
1091 | break; | 1093 | break; |
1092 | } while (--i); | 1094 | } while (--i); |
1095 | } | ||
1093 | 1096 | ||
1094 | if (i) { | 1097 | if (i) { |
1095 | pci_free_consistent(adapter->pdev, | 1098 | pci_free_consistent(adapter->pdev, |
1096 | NETXEN_HOST_DUMMY_DMA_SIZE, | 1099 | NETXEN_HOST_DUMMY_DMA_SIZE, |
1097 | adapter->dummy_dma.addr, | 1100 | adapter->dummy_dma.addr, |
1098 | adapter->dummy_dma.phys_addr); | 1101 | adapter->dummy_dma.phys_addr); |
1099 | adapter->dummy_dma.addr = NULL; | 1102 | adapter->dummy_dma.addr = NULL; |
1100 | } else { | 1103 | } else { |
1101 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", | 1104 | printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", |
1102 | adapter->netdev->name); | 1105 | adapter->netdev->name); |
1103 | } | ||
1104 | } | 1106 | } |
1105 | } | 1107 | } |
1106 | 1108 | ||
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 7615c715e66e..32bb47adbe39 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -149,76 +149,18 @@ static uint32_t msi_tgt_status[8] = { | |||
149 | 149 | ||
150 | static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG; | 150 | static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG; |
151 | 151 | ||
152 | static void netxen_nic_disable_int(struct netxen_adapter *adapter) | 152 | static inline void netxen_nic_disable_int(struct netxen_adapter *adapter) |
153 | { | 153 | { |
154 | u32 mask = 0x7ff; | 154 | adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0); |
155 | int retries = 32; | ||
156 | int pci_fn = adapter->ahw.pci_func; | ||
157 | |||
158 | if (adapter->msi_mode != MSI_MODE_MULTIFUNC) | ||
159 | adapter->pci_write_normalize(adapter, | ||
160 | adapter->crb_intr_mask, 0); | ||
161 | |||
162 | if (adapter->intr_scheme != -1 && | ||
163 | adapter->intr_scheme != INTR_SCHEME_PERPORT) | ||
164 | adapter->pci_write_immediate(adapter, ISR_INT_MASK, mask); | ||
165 | |||
166 | if (!NETXEN_IS_MSI_FAMILY(adapter)) { | ||
167 | do { | ||
168 | adapter->pci_write_immediate(adapter, | ||
169 | adapter->legacy_intr.tgt_status_reg, | ||
170 | 0xffffffff); | ||
171 | mask = adapter->pci_read_immediate(adapter, | ||
172 | ISR_INT_VECTOR); | ||
173 | if (!(mask & 0x80)) | ||
174 | break; | ||
175 | udelay(10); | ||
176 | } while (--retries); | ||
177 | |||
178 | if (!retries) { | ||
179 | printk(KERN_NOTICE "%s: Failed to disable interrupt\n", | ||
180 | netxen_nic_driver_name); | ||
181 | } | ||
182 | } else { | ||
183 | if (adapter->msi_mode == MSI_MODE_MULTIFUNC) { | ||
184 | adapter->pci_write_immediate(adapter, | ||
185 | msi_tgt_status[pci_fn], 0xffffffff); | ||
186 | } | ||
187 | } | ||
188 | } | 155 | } |
189 | 156 | ||
190 | static void netxen_nic_enable_int(struct netxen_adapter *adapter) | 157 | static inline void netxen_nic_enable_int(struct netxen_adapter *adapter) |
191 | { | 158 | { |
192 | u32 mask; | ||
193 | |||
194 | if (adapter->intr_scheme != -1 && | ||
195 | adapter->intr_scheme != INTR_SCHEME_PERPORT) { | ||
196 | switch (adapter->ahw.board_type) { | ||
197 | case NETXEN_NIC_GBE: | ||
198 | mask = 0x77b; | ||
199 | break; | ||
200 | case NETXEN_NIC_XGBE: | ||
201 | mask = 0x77f; | ||
202 | break; | ||
203 | default: | ||
204 | mask = 0x7ff; | ||
205 | break; | ||
206 | } | ||
207 | |||
208 | adapter->pci_write_immediate(adapter, ISR_INT_MASK, mask); | ||
209 | } | ||
210 | |||
211 | adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0x1); | 159 | adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0x1); |
212 | 160 | ||
213 | if (!NETXEN_IS_MSI_FAMILY(adapter)) { | 161 | if (!NETXEN_IS_MSI_FAMILY(adapter)) |
214 | mask = 0xbff; | 162 | adapter->pci_write_immediate(adapter, |
215 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) | 163 | adapter->legacy_intr.tgt_mask_reg, 0xfbff); |
216 | adapter->pci_write_immediate(adapter, | ||
217 | adapter->legacy_intr.tgt_mask_reg, mask); | ||
218 | else | ||
219 | adapter->pci_write_normalize(adapter, | ||
220 | CRB_INT_VECTOR, 0); | ||
221 | } | ||
222 | } | 164 | } |
223 | 165 | ||
224 | static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) | 166 | static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) |
@@ -501,6 +443,44 @@ static void netxen_init_msix_entries(struct netxen_adapter *adapter) | |||
501 | adapter->msix_entries[i].entry = i; | 443 | adapter->msix_entries[i].entry = i; |
502 | } | 444 | } |
503 | 445 | ||
446 | static int | ||
447 | netxen_read_mac_addr(struct netxen_adapter *adapter) | ||
448 | { | ||
449 | int i; | ||
450 | unsigned char *p; | ||
451 | __le64 mac_addr; | ||
452 | DECLARE_MAC_BUF(mac); | ||
453 | struct net_device *netdev = adapter->netdev; | ||
454 | struct pci_dev *pdev = adapter->pdev; | ||
455 | |||
456 | if (netxen_is_flash_supported(adapter) != 0) | ||
457 | return -EIO; | ||
458 | |||
459 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | ||
460 | if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0) | ||
461 | return -EIO; | ||
462 | } else { | ||
463 | if (netxen_get_flash_mac_addr(adapter, &mac_addr) != 0) | ||
464 | return -EIO; | ||
465 | } | ||
466 | |||
467 | p = (unsigned char *)&mac_addr; | ||
468 | for (i = 0; i < 6; i++) | ||
469 | netdev->dev_addr[i] = *(p + 5 - i); | ||
470 | |||
471 | memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len); | ||
472 | |||
473 | /* set station address */ | ||
474 | |||
475 | if (!is_valid_ether_addr(netdev->perm_addr)) { | ||
476 | dev_warn(&pdev->dev, "Bad MAC address %s.\n", | ||
477 | print_mac(mac, netdev->dev_addr)); | ||
478 | } else | ||
479 | adapter->macaddr_set(adapter, netdev->dev_addr); | ||
480 | |||
481 | return 0; | ||
482 | } | ||
483 | |||
504 | /* | 484 | /* |
505 | * netxen_nic_probe() | 485 | * netxen_nic_probe() |
506 | * | 486 | * |
@@ -529,10 +509,8 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
529 | unsigned long mem_base, mem_len, db_base, db_len, pci_len0 = 0; | 509 | unsigned long mem_base, mem_len, db_base, db_len, pci_len0 = 0; |
530 | int i = 0, err; | 510 | int i = 0, err; |
531 | int first_driver, first_boot; | 511 | int first_driver, first_boot; |
532 | __le64 mac_addr[FLASH_NUM_PORTS + 1]; | ||
533 | u32 val; | 512 | u32 val; |
534 | int pci_func_id = PCI_FUNC(pdev->devfn); | 513 | int pci_func_id = PCI_FUNC(pdev->devfn); |
535 | DECLARE_MAC_BUF(mac); | ||
536 | struct netxen_legacy_intr_set *legacy_intrp; | 514 | struct netxen_legacy_intr_set *legacy_intrp; |
537 | uint8_t revision_id; | 515 | uint8_t revision_id; |
538 | 516 | ||
@@ -545,6 +523,13 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
545 | return -ENODEV; | 523 | return -ENODEV; |
546 | } | 524 | } |
547 | 525 | ||
526 | if (pdev->revision >= NX_P3_A0 && pdev->revision < NX_P3_B1) { | ||
527 | printk(KERN_WARNING "NetXen chip revisions between 0x%x-0x%x" | ||
528 | "will not be enabled.\n", | ||
529 | NX_P3_A0, NX_P3_B1); | ||
530 | return -ENODEV; | ||
531 | } | ||
532 | |||
548 | if ((err = pci_enable_device(pdev))) | 533 | if ((err = pci_enable_device(pdev))) |
549 | return err; | 534 | return err; |
550 | 535 | ||
@@ -898,34 +883,14 @@ request_msi: | |||
898 | goto err_out_disable_msi; | 883 | goto err_out_disable_msi; |
899 | 884 | ||
900 | init_timer(&adapter->watchdog_timer); | 885 | init_timer(&adapter->watchdog_timer); |
901 | adapter->ahw.linkup = 0; | ||
902 | adapter->watchdog_timer.function = &netxen_watchdog; | 886 | adapter->watchdog_timer.function = &netxen_watchdog; |
903 | adapter->watchdog_timer.data = (unsigned long)adapter; | 887 | adapter->watchdog_timer.data = (unsigned long)adapter; |
904 | INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task); | 888 | INIT_WORK(&adapter->watchdog_task, netxen_watchdog_task); |
905 | INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task); | 889 | INIT_WORK(&adapter->tx_timeout_task, netxen_tx_timeout_task); |
906 | 890 | ||
907 | if (netxen_is_flash_supported(adapter) == 0 && | 891 | err = netxen_read_mac_addr(adapter); |
908 | netxen_get_flash_mac_addr(adapter, mac_addr) == 0) { | 892 | if (err) |
909 | unsigned char *p; | 893 | dev_warn(&pdev->dev, "failed to read mac addr\n"); |
910 | |||
911 | p = (unsigned char *)&mac_addr[adapter->portnum]; | ||
912 | netdev->dev_addr[0] = *(p + 5); | ||
913 | netdev->dev_addr[1] = *(p + 4); | ||
914 | netdev->dev_addr[2] = *(p + 3); | ||
915 | netdev->dev_addr[3] = *(p + 2); | ||
916 | netdev->dev_addr[4] = *(p + 1); | ||
917 | netdev->dev_addr[5] = *(p + 0); | ||
918 | |||
919 | memcpy(netdev->perm_addr, netdev->dev_addr, | ||
920 | netdev->addr_len); | ||
921 | if (!is_valid_ether_addr(netdev->perm_addr)) { | ||
922 | printk(KERN_ERR "%s: Bad MAC address %s.\n", | ||
923 | netxen_nic_driver_name, | ||
924 | print_mac(mac, netdev->dev_addr)); | ||
925 | } else { | ||
926 | adapter->macaddr_set(adapter, netdev->dev_addr); | ||
927 | } | ||
928 | } | ||
929 | 894 | ||
930 | netif_carrier_off(netdev); | 895 | netif_carrier_off(netdev); |
931 | netif_stop_queue(netdev); | 896 | netif_stop_queue(netdev); |
@@ -1000,6 +965,7 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
1000 | 965 | ||
1001 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { | 966 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { |
1002 | netxen_free_hw_resources(adapter); | 967 | netxen_free_hw_resources(adapter); |
968 | netxen_release_rx_buffers(adapter); | ||
1003 | netxen_free_sw_resources(adapter); | 969 | netxen_free_sw_resources(adapter); |
1004 | } | 970 | } |
1005 | 971 | ||
@@ -1069,6 +1035,15 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1069 | goto err_out_free_sw; | 1035 | goto err_out_free_sw; |
1070 | } | 1036 | } |
1071 | 1037 | ||
1038 | if ((adapter->msi_mode != MSI_MODE_MULTIFUNC) || | ||
1039 | (adapter->intr_scheme != INTR_SCHEME_PERPORT)) { | ||
1040 | printk(KERN_ERR "%s: Firmware interrupt scheme is " | ||
1041 | "incompatible with driver\n", | ||
1042 | netdev->name); | ||
1043 | adapter->driver_mismatch = 1; | ||
1044 | goto err_out_free_hw; | ||
1045 | } | ||
1046 | |||
1072 | if (adapter->fw_major < 4) { | 1047 | if (adapter->fw_major < 4) { |
1073 | adapter->crb_addr_cmd_producer = | 1048 | adapter->crb_addr_cmd_producer = |
1074 | crb_cmd_producer[adapter->portnum]; | 1049 | crb_cmd_producer[adapter->portnum]; |
@@ -1094,7 +1069,7 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1094 | flags, netdev->name, adapter); | 1069 | flags, netdev->name, adapter); |
1095 | if (err) { | 1070 | if (err) { |
1096 | printk(KERN_ERR "request_irq failed with: %d\n", err); | 1071 | printk(KERN_ERR "request_irq failed with: %d\n", err); |
1097 | goto err_out_free_hw; | 1072 | goto err_out_free_rxbuf; |
1098 | } | 1073 | } |
1099 | 1074 | ||
1100 | adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; | 1075 | adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; |
@@ -1116,6 +1091,7 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1116 | if (adapter->set_mtu) | 1091 | if (adapter->set_mtu) |
1117 | adapter->set_mtu(adapter, netdev->mtu); | 1092 | adapter->set_mtu(adapter, netdev->mtu); |
1118 | 1093 | ||
1094 | adapter->ahw.linkup = 0; | ||
1119 | mod_timer(&adapter->watchdog_timer, jiffies); | 1095 | mod_timer(&adapter->watchdog_timer, jiffies); |
1120 | 1096 | ||
1121 | napi_enable(&adapter->napi); | 1097 | napi_enable(&adapter->napi); |
@@ -1127,6 +1103,8 @@ static int netxen_nic_open(struct net_device *netdev) | |||
1127 | 1103 | ||
1128 | err_out_free_irq: | 1104 | err_out_free_irq: |
1129 | free_irq(adapter->irq, adapter); | 1105 | free_irq(adapter->irq, adapter); |
1106 | err_out_free_rxbuf: | ||
1107 | netxen_release_rx_buffers(adapter); | ||
1130 | err_out_free_hw: | 1108 | err_out_free_hw: |
1131 | netxen_free_hw_resources(adapter); | 1109 | netxen_free_hw_resources(adapter); |
1132 | err_out_free_sw: | 1110 | err_out_free_sw: |
@@ -1152,10 +1130,8 @@ static int netxen_nic_close(struct net_device *netdev) | |||
1152 | 1130 | ||
1153 | netxen_release_tx_buffers(adapter); | 1131 | netxen_release_tx_buffers(adapter); |
1154 | 1132 | ||
1155 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { | 1133 | FLUSH_SCHEDULED_WORK(); |
1156 | FLUSH_SCHEDULED_WORK(); | 1134 | del_timer_sync(&adapter->watchdog_timer); |
1157 | del_timer_sync(&adapter->watchdog_timer); | ||
1158 | } | ||
1159 | 1135 | ||
1160 | return 0; | 1136 | return 0; |
1161 | } | 1137 | } |
@@ -1458,7 +1434,8 @@ void netxen_watchdog_task(struct work_struct *work) | |||
1458 | 1434 | ||
1459 | netxen_nic_handle_phy_intr(adapter); | 1435 | netxen_nic_handle_phy_intr(adapter); |
1460 | 1436 | ||
1461 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | 1437 | if (netif_running(adapter->netdev)) |
1438 | mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); | ||
1462 | } | 1439 | } |
1463 | 1440 | ||
1464 | static void netxen_tx_timeout(struct net_device *netdev) | 1441 | static void netxen_tx_timeout(struct net_device *netdev) |
@@ -1518,18 +1495,9 @@ struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) | |||
1518 | return stats; | 1495 | return stats; |
1519 | } | 1496 | } |
1520 | 1497 | ||
1521 | static inline void | ||
1522 | netxen_handle_int(struct netxen_adapter *adapter) | ||
1523 | { | ||
1524 | netxen_nic_disable_int(adapter); | ||
1525 | napi_schedule(&adapter->napi); | ||
1526 | } | ||
1527 | |||
1528 | static irqreturn_t netxen_intr(int irq, void *data) | 1498 | static irqreturn_t netxen_intr(int irq, void *data) |
1529 | { | 1499 | { |
1530 | struct netxen_adapter *adapter = data; | 1500 | struct netxen_adapter *adapter = data; |
1531 | u32 our_int = 0; | ||
1532 | |||
1533 | u32 status = 0; | 1501 | u32 status = 0; |
1534 | 1502 | ||
1535 | status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); | 1503 | status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); |
@@ -1544,22 +1512,32 @@ static irqreturn_t netxen_intr(int irq, void *data) | |||
1544 | if (!ISR_LEGACY_INT_TRIGGERED(status)) | 1512 | if (!ISR_LEGACY_INT_TRIGGERED(status)) |
1545 | return IRQ_NONE; | 1513 | return IRQ_NONE; |
1546 | 1514 | ||
1547 | } else if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { | 1515 | } else { |
1516 | unsigned long our_int = 0; | ||
1548 | 1517 | ||
1549 | our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR); | 1518 | our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR); |
1519 | |||
1550 | /* not our interrupt */ | 1520 | /* not our interrupt */ |
1551 | if ((our_int & (0x80 << adapter->portnum)) == 0) | 1521 | if (!test_and_clear_bit((7 + adapter->portnum), &our_int)) |
1552 | return IRQ_NONE; | 1522 | return IRQ_NONE; |
1553 | 1523 | ||
1554 | if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { | 1524 | /* claim interrupt */ |
1555 | /* claim interrupt */ | 1525 | adapter->pci_write_normalize(adapter, |
1556 | adapter->pci_write_normalize(adapter, | 1526 | CRB_INT_VECTOR, (our_int & 0xffffffff)); |
1557 | CRB_INT_VECTOR, | ||
1558 | our_int & ~((u32)(0x80 << adapter->portnum))); | ||
1559 | } | ||
1560 | } | 1527 | } |
1561 | 1528 | ||
1562 | netxen_handle_int(adapter); | 1529 | /* clear interrupt */ |
1530 | if (adapter->fw_major < 4) | ||
1531 | netxen_nic_disable_int(adapter); | ||
1532 | |||
1533 | adapter->pci_write_immediate(adapter, | ||
1534 | adapter->legacy_intr.tgt_status_reg, | ||
1535 | 0xffffffff); | ||
1536 | /* read twice to ensure write is flushed */ | ||
1537 | adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); | ||
1538 | adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); | ||
1539 | |||
1540 | napi_schedule(&adapter->napi); | ||
1563 | 1541 | ||
1564 | return IRQ_HANDLED; | 1542 | return IRQ_HANDLED; |
1565 | } | 1543 | } |
@@ -1568,7 +1546,11 @@ static irqreturn_t netxen_msi_intr(int irq, void *data) | |||
1568 | { | 1546 | { |
1569 | struct netxen_adapter *adapter = data; | 1547 | struct netxen_adapter *adapter = data; |
1570 | 1548 | ||
1571 | netxen_handle_int(adapter); | 1549 | /* clear interrupt */ |
1550 | adapter->pci_write_immediate(adapter, | ||
1551 | msi_tgt_status[adapter->ahw.pci_func], 0xffffffff); | ||
1552 | |||
1553 | napi_schedule(&adapter->napi); | ||
1572 | return IRQ_HANDLED; | 1554 | return IRQ_HANDLED; |
1573 | } | 1555 | } |
1574 | 1556 | ||
diff --git a/drivers/net/netxen/netxen_nic_phan_reg.h b/drivers/net/netxen/netxen_nic_phan_reg.h index 83e5ee57bfef..b293adcc95ab 100644 --- a/drivers/net/netxen/netxen_nic_phan_reg.h +++ b/drivers/net/netxen/netxen_nic_phan_reg.h | |||
@@ -125,6 +125,8 @@ | |||
125 | #define CRB_SW_INT_MASK_2 NETXEN_NIC_REG(0x1e4) | 125 | #define CRB_SW_INT_MASK_2 NETXEN_NIC_REG(0x1e4) |
126 | #define CRB_SW_INT_MASK_3 NETXEN_NIC_REG(0x1e8) | 126 | #define CRB_SW_INT_MASK_3 NETXEN_NIC_REG(0x1e8) |
127 | 127 | ||
128 | #define CRB_MAC_BLOCK_START NETXEN_CAM_RAM(0x1c0) | ||
129 | |||
128 | /* | 130 | /* |
129 | * capabilities register, can be used to selectively enable/disable features | 131 | * capabilities register, can be used to selectively enable/disable features |
130 | * for backward compability | 132 | * for backward compability |
diff --git a/drivers/net/ppp_mppe.c b/drivers/net/ppp_mppe.c index b35d79449500..88f03c9e9403 100644 --- a/drivers/net/ppp_mppe.c +++ b/drivers/net/ppp_mppe.c | |||
@@ -46,7 +46,6 @@ | |||
46 | #include <linux/err.h> | 46 | #include <linux/err.h> |
47 | #include <linux/module.h> | 47 | #include <linux/module.h> |
48 | #include <linux/kernel.h> | 48 | #include <linux/kernel.h> |
49 | #include <linux/version.h> | ||
50 | #include <linux/init.h> | 49 | #include <linux/init.h> |
51 | #include <linux/types.h> | 50 | #include <linux/types.h> |
52 | #include <linux/slab.h> | 51 | #include <linux/slab.h> |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index f9298827a76c..ff175e8f36b2 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
@@ -61,7 +61,6 @@ | |||
61 | */ | 61 | */ |
62 | 62 | ||
63 | #include <linux/module.h> | 63 | #include <linux/module.h> |
64 | #include <linux/version.h> | ||
65 | #include <linux/string.h> | 64 | #include <linux/string.h> |
66 | #include <linux/list.h> | 65 | #include <linux/list.h> |
67 | #include <asm/uaccess.h> | 66 | #include <asm/uaccess.h> |
diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c index 6531ff565c54..5d86281d9363 100644 --- a/drivers/net/r6040.c +++ b/drivers/net/r6040.c | |||
@@ -24,7 +24,6 @@ | |||
24 | 24 | ||
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <linux/version.h> | ||
28 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
29 | #include <linux/string.h> | 28 | #include <linux/string.h> |
30 | #include <linux/timer.h> | 29 | #include <linux/timer.h> |
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index 25e62cf58d3a..1c370e6aa641 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c | |||
@@ -20,7 +20,6 @@ | |||
20 | * the file called "COPYING". | 20 | * the file called "COPYING". |
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/version.h> | ||
24 | #include <linux/init.h> | 23 | #include <linux/init.h> |
25 | #include <linux/dma-mapping.h> | 24 | #include <linux/dma-mapping.h> |
26 | #include <linux/etherdevice.h> | 25 | #include <linux/etherdevice.h> |
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 7d29edcd40b4..e24b25ca1c69 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -24,7 +24,6 @@ | |||
24 | 24 | ||
25 | #include <linux/crc32.h> | 25 | #include <linux/crc32.h> |
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/version.h> | ||
28 | #include <linux/module.h> | 27 | #include <linux/module.h> |
29 | #include <linux/netdevice.h> | 28 | #include <linux/netdevice.h> |
30 | #include <linux/dma-mapping.h> | 29 | #include <linux/dma-mapping.h> |
@@ -666,11 +665,16 @@ static void sky2_phy_power_down(struct sky2_hw *hw, unsigned port) | |||
666 | 665 | ||
667 | if (hw->chip_id != CHIP_ID_YUKON_EC) { | 666 | if (hw->chip_id != CHIP_ID_YUKON_EC) { |
668 | if (hw->chip_id == CHIP_ID_YUKON_EC_U) { | 667 | if (hw->chip_id == CHIP_ID_YUKON_EC_U) { |
669 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); | 668 | /* select page 2 to access MAC control register */ |
669 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2); | ||
670 | 670 | ||
671 | ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); | ||
671 | /* enable Power Down */ | 672 | /* enable Power Down */ |
672 | ctrl |= PHY_M_PC_POW_D_ENA; | 673 | ctrl |= PHY_M_PC_POW_D_ENA; |
673 | gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); | 674 | gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); |
675 | |||
676 | /* set page register back to 0 */ | ||
677 | gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 0); | ||
674 | } | 678 | } |
675 | 679 | ||
676 | /* set IEEE compatible Power Down Mode (dev. #4.99) */ | 680 | /* set IEEE compatible Power Down Mode (dev. #4.99) */ |
diff --git a/drivers/net/tehuti.h b/drivers/net/tehuti.h index c66dfc9ec1ec..7db48f1cd949 100644 --- a/drivers/net/tehuti.h +++ b/drivers/net/tehuti.h | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/sched.h> | 27 | #include <linux/sched.h> |
28 | #include <linux/tty.h> | 28 | #include <linux/tty.h> |
29 | #include <linux/if_vlan.h> | 29 | #include <linux/if_vlan.h> |
30 | #include <linux/version.h> | ||
31 | #include <linux/interrupt.h> | 30 | #include <linux/interrupt.h> |
32 | #include <linux/vmalloc.h> | 31 | #include <linux/vmalloc.h> |
33 | #include <asm/byteorder.h> | 32 | #include <asm/byteorder.h> |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index d2439b85a790..71d2c5cfdad9 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -66,8 +66,8 @@ | |||
66 | 66 | ||
67 | #define DRV_MODULE_NAME "tg3" | 67 | #define DRV_MODULE_NAME "tg3" |
68 | #define PFX DRV_MODULE_NAME ": " | 68 | #define PFX DRV_MODULE_NAME ": " |
69 | #define DRV_MODULE_VERSION "3.93" | 69 | #define DRV_MODULE_VERSION "3.94" |
70 | #define DRV_MODULE_RELDATE "May 22, 2008" | 70 | #define DRV_MODULE_RELDATE "August 14, 2008" |
71 | 71 | ||
72 | #define TG3_DEF_MAC_MODE 0 | 72 | #define TG3_DEF_MAC_MODE 0 |
73 | #define TG3_DEF_RX_MODE 0 | 73 | #define TG3_DEF_RX_MODE 0 |
@@ -536,6 +536,7 @@ static int tg3_ape_lock(struct tg3 *tp, int locknum) | |||
536 | return 0; | 536 | return 0; |
537 | 537 | ||
538 | switch (locknum) { | 538 | switch (locknum) { |
539 | case TG3_APE_LOCK_GRC: | ||
539 | case TG3_APE_LOCK_MEM: | 540 | case TG3_APE_LOCK_MEM: |
540 | break; | 541 | break; |
541 | default: | 542 | default: |
@@ -573,6 +574,7 @@ static void tg3_ape_unlock(struct tg3 *tp, int locknum) | |||
573 | return; | 574 | return; |
574 | 575 | ||
575 | switch (locknum) { | 576 | switch (locknum) { |
577 | case TG3_APE_LOCK_GRC: | ||
576 | case TG3_APE_LOCK_MEM: | 578 | case TG3_APE_LOCK_MEM: |
577 | break; | 579 | break; |
578 | default: | 580 | default: |
@@ -1018,15 +1020,43 @@ static void tg3_mdio_fini(struct tg3 *tp) | |||
1018 | } | 1020 | } |
1019 | 1021 | ||
1020 | /* tp->lock is held. */ | 1022 | /* tp->lock is held. */ |
1023 | static inline void tg3_generate_fw_event(struct tg3 *tp) | ||
1024 | { | ||
1025 | u32 val; | ||
1026 | |||
1027 | val = tr32(GRC_RX_CPU_EVENT); | ||
1028 | val |= GRC_RX_CPU_DRIVER_EVENT; | ||
1029 | tw32_f(GRC_RX_CPU_EVENT, val); | ||
1030 | |||
1031 | tp->last_event_jiffies = jiffies; | ||
1032 | } | ||
1033 | |||
1034 | #define TG3_FW_EVENT_TIMEOUT_USEC 2500 | ||
1035 | |||
1036 | /* tp->lock is held. */ | ||
1021 | static void tg3_wait_for_event_ack(struct tg3 *tp) | 1037 | static void tg3_wait_for_event_ack(struct tg3 *tp) |
1022 | { | 1038 | { |
1023 | int i; | 1039 | int i; |
1040 | unsigned int delay_cnt; | ||
1041 | long time_remain; | ||
1042 | |||
1043 | /* If enough time has passed, no wait is necessary. */ | ||
1044 | time_remain = (long)(tp->last_event_jiffies + 1 + | ||
1045 | usecs_to_jiffies(TG3_FW_EVENT_TIMEOUT_USEC)) - | ||
1046 | (long)jiffies; | ||
1047 | if (time_remain < 0) | ||
1048 | return; | ||
1024 | 1049 | ||
1025 | /* Wait for up to 2.5 milliseconds */ | 1050 | /* Check if we can shorten the wait time. */ |
1026 | for (i = 0; i < 250000; i++) { | 1051 | delay_cnt = jiffies_to_usecs(time_remain); |
1052 | if (delay_cnt > TG3_FW_EVENT_TIMEOUT_USEC) | ||
1053 | delay_cnt = TG3_FW_EVENT_TIMEOUT_USEC; | ||
1054 | delay_cnt = (delay_cnt >> 3) + 1; | ||
1055 | |||
1056 | for (i = 0; i < delay_cnt; i++) { | ||
1027 | if (!(tr32(GRC_RX_CPU_EVENT) & GRC_RX_CPU_DRIVER_EVENT)) | 1057 | if (!(tr32(GRC_RX_CPU_EVENT) & GRC_RX_CPU_DRIVER_EVENT)) |
1028 | break; | 1058 | break; |
1029 | udelay(10); | 1059 | udelay(8); |
1030 | } | 1060 | } |
1031 | } | 1061 | } |
1032 | 1062 | ||
@@ -1075,9 +1105,7 @@ static void tg3_ump_link_report(struct tg3 *tp) | |||
1075 | val = 0; | 1105 | val = 0; |
1076 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val); | 1106 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX + 12, val); |
1077 | 1107 | ||
1078 | val = tr32(GRC_RX_CPU_EVENT); | 1108 | tg3_generate_fw_event(tp); |
1079 | val |= GRC_RX_CPU_DRIVER_EVENT; | ||
1080 | tw32_f(GRC_RX_CPU_EVENT, val); | ||
1081 | } | 1109 | } |
1082 | 1110 | ||
1083 | static void tg3_link_report(struct tg3 *tp) | 1111 | static void tg3_link_report(struct tg3 *tp) |
@@ -2124,6 +2152,13 @@ static int tg3_set_power_state(struct tg3 *tp, pci_power_t state) | |||
2124 | (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) | 2152 | (tp->tg3_flags & TG3_FLAG_WOL_ENABLE)) |
2125 | mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE; | 2153 | mac_mode |= MAC_MODE_MAGIC_PKT_ENABLE; |
2126 | 2154 | ||
2155 | if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) { | ||
2156 | mac_mode |= tp->mac_mode & | ||
2157 | (MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN); | ||
2158 | if (mac_mode & MAC_MODE_APE_TX_EN) | ||
2159 | mac_mode |= MAC_MODE_TDE_ENABLE; | ||
2160 | } | ||
2161 | |||
2127 | tw32_f(MAC_MODE, mac_mode); | 2162 | tw32_f(MAC_MODE, mac_mode); |
2128 | udelay(100); | 2163 | udelay(100); |
2129 | 2164 | ||
@@ -5493,7 +5528,7 @@ static void tg3_ape_send_event(struct tg3 *tp, u32 event) | |||
5493 | return; | 5528 | return; |
5494 | 5529 | ||
5495 | apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); | 5530 | apedata = tg3_ape_read32(tp, TG3_APE_FW_STATUS); |
5496 | if (apedata != APE_FW_STATUS_READY) | 5531 | if (!(apedata & APE_FW_STATUS_READY)) |
5497 | return; | 5532 | return; |
5498 | 5533 | ||
5499 | /* Wait for up to 1 millisecond for APE to service previous event. */ | 5534 | /* Wait for up to 1 millisecond for APE to service previous event. */ |
@@ -5760,6 +5795,8 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
5760 | 5795 | ||
5761 | tg3_mdio_stop(tp); | 5796 | tg3_mdio_stop(tp); |
5762 | 5797 | ||
5798 | tg3_ape_lock(tp, TG3_APE_LOCK_GRC); | ||
5799 | |||
5763 | /* No matching tg3_nvram_unlock() after this because | 5800 | /* No matching tg3_nvram_unlock() after this because |
5764 | * chip reset below will undo the nvram lock. | 5801 | * chip reset below will undo the nvram lock. |
5765 | */ | 5802 | */ |
@@ -5908,12 +5945,19 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
5908 | } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | 5945 | } else if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { |
5909 | tp->mac_mode = MAC_MODE_PORT_MODE_GMII; | 5946 | tp->mac_mode = MAC_MODE_PORT_MODE_GMII; |
5910 | tw32_f(MAC_MODE, tp->mac_mode); | 5947 | tw32_f(MAC_MODE, tp->mac_mode); |
5948 | } else if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) { | ||
5949 | tp->mac_mode &= (MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN); | ||
5950 | if (tp->mac_mode & MAC_MODE_APE_TX_EN) | ||
5951 | tp->mac_mode |= MAC_MODE_TDE_ENABLE; | ||
5952 | tw32_f(MAC_MODE, tp->mac_mode); | ||
5911 | } else | 5953 | } else |
5912 | tw32_f(MAC_MODE, 0); | 5954 | tw32_f(MAC_MODE, 0); |
5913 | udelay(40); | 5955 | udelay(40); |
5914 | 5956 | ||
5915 | tg3_mdio_start(tp); | 5957 | tg3_mdio_start(tp); |
5916 | 5958 | ||
5959 | tg3_ape_unlock(tp, TG3_APE_LOCK_GRC); | ||
5960 | |||
5917 | err = tg3_poll_fw(tp); | 5961 | err = tg3_poll_fw(tp); |
5918 | if (err) | 5962 | if (err) |
5919 | return err; | 5963 | return err; |
@@ -5935,6 +5979,7 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
5935 | tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); | 5979 | tg3_read_mem(tp, NIC_SRAM_DATA_CFG, &nic_cfg); |
5936 | if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { | 5980 | if (nic_cfg & NIC_SRAM_DATA_CFG_ASF_ENABLE) { |
5937 | tp->tg3_flags |= TG3_FLAG_ENABLE_ASF; | 5981 | tp->tg3_flags |= TG3_FLAG_ENABLE_ASF; |
5982 | tp->last_event_jiffies = jiffies; | ||
5938 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) | 5983 | if (tp->tg3_flags2 & TG3_FLG2_5750_PLUS) |
5939 | tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE; | 5984 | tp->tg3_flags2 |= TG3_FLG2_ASF_NEW_HANDSHAKE; |
5940 | } | 5985 | } |
@@ -5948,15 +5993,12 @@ static void tg3_stop_fw(struct tg3 *tp) | |||
5948 | { | 5993 | { |
5949 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && | 5994 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && |
5950 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { | 5995 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { |
5951 | u32 val; | ||
5952 | |||
5953 | /* Wait for RX cpu to ACK the previous event. */ | 5996 | /* Wait for RX cpu to ACK the previous event. */ |
5954 | tg3_wait_for_event_ack(tp); | 5997 | tg3_wait_for_event_ack(tp); |
5955 | 5998 | ||
5956 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); | 5999 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, FWCMD_NICDRV_PAUSE_FW); |
5957 | val = tr32(GRC_RX_CPU_EVENT); | 6000 | |
5958 | val |= GRC_RX_CPU_DRIVER_EVENT; | 6001 | tg3_generate_fw_event(tp); |
5959 | tw32(GRC_RX_CPU_EVENT, val); | ||
5960 | 6002 | ||
5961 | /* Wait for RX cpu to ACK this event. */ | 6003 | /* Wait for RX cpu to ACK this event. */ |
5962 | tg3_wait_for_event_ack(tp); | 6004 | tg3_wait_for_event_ack(tp); |
@@ -7406,7 +7448,11 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
7406 | udelay(10); | 7448 | udelay(10); |
7407 | } | 7449 | } |
7408 | 7450 | ||
7409 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | | 7451 | if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) |
7452 | tp->mac_mode &= MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN; | ||
7453 | else | ||
7454 | tp->mac_mode = 0; | ||
7455 | tp->mac_mode |= MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | | ||
7410 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; | 7456 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; |
7411 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && | 7457 | if (!(tp->tg3_flags2 & TG3_FLG2_5705_PLUS) && |
7412 | !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) && | 7458 | !(tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) && |
@@ -7840,9 +7886,8 @@ static void tg3_timer(unsigned long __opaque) | |||
7840 | * resets. | 7886 | * resets. |
7841 | */ | 7887 | */ |
7842 | if (!--tp->asf_counter) { | 7888 | if (!--tp->asf_counter) { |
7843 | if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) { | 7889 | if ((tp->tg3_flags & TG3_FLAG_ENABLE_ASF) && |
7844 | u32 val; | 7890 | !(tp->tg3_flags3 & TG3_FLG3_ENABLE_APE)) { |
7845 | |||
7846 | tg3_wait_for_event_ack(tp); | 7891 | tg3_wait_for_event_ack(tp); |
7847 | 7892 | ||
7848 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, | 7893 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_MBOX, |
@@ -7850,9 +7895,8 @@ static void tg3_timer(unsigned long __opaque) | |||
7850 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); | 7895 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_LEN_MBOX, 4); |
7851 | /* 5 seconds timeout */ | 7896 | /* 5 seconds timeout */ |
7852 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); | 7897 | tg3_write_mem(tp, NIC_SRAM_FW_CMD_DATA_MBOX, 5); |
7853 | val = tr32(GRC_RX_CPU_EVENT); | 7898 | |
7854 | val |= GRC_RX_CPU_DRIVER_EVENT; | 7899 | tg3_generate_fw_event(tp); |
7855 | tw32_f(GRC_RX_CPU_EVENT, val); | ||
7856 | } | 7900 | } |
7857 | tp->asf_counter = tp->asf_multiplier; | 7901 | tp->asf_counter = tp->asf_multiplier; |
7858 | } | 7902 | } |
@@ -8422,6 +8466,11 @@ static inline unsigned long get_stat64(tg3_stat64_t *val) | |||
8422 | return ret; | 8466 | return ret; |
8423 | } | 8467 | } |
8424 | 8468 | ||
8469 | static inline u64 get_estat64(tg3_stat64_t *val) | ||
8470 | { | ||
8471 | return ((u64)val->high << 32) | ((u64)val->low); | ||
8472 | } | ||
8473 | |||
8425 | static unsigned long calc_crc_errors(struct tg3 *tp) | 8474 | static unsigned long calc_crc_errors(struct tg3 *tp) |
8426 | { | 8475 | { |
8427 | struct tg3_hw_stats *hw_stats = tp->hw_stats; | 8476 | struct tg3_hw_stats *hw_stats = tp->hw_stats; |
@@ -8450,7 +8499,7 @@ static unsigned long calc_crc_errors(struct tg3 *tp) | |||
8450 | 8499 | ||
8451 | #define ESTAT_ADD(member) \ | 8500 | #define ESTAT_ADD(member) \ |
8452 | estats->member = old_estats->member + \ | 8501 | estats->member = old_estats->member + \ |
8453 | get_stat64(&hw_stats->member) | 8502 | get_estat64(&hw_stats->member) |
8454 | 8503 | ||
8455 | static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp) | 8504 | static struct tg3_ethtool_stats *tg3_get_estats(struct tg3 *tp) |
8456 | { | 8505 | { |
@@ -12416,6 +12465,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
12416 | tp->misc_host_ctrl); | 12465 | tp->misc_host_ctrl); |
12417 | } | 12466 | } |
12418 | 12467 | ||
12468 | /* Preserve the APE MAC_MODE bits */ | ||
12469 | if (tp->tg3_flags3 & TG3_FLG3_ENABLE_APE) | ||
12470 | tp->mac_mode = tr32(MAC_MODE) | | ||
12471 | MAC_MODE_APE_TX_EN | MAC_MODE_APE_RX_EN; | ||
12472 | else | ||
12473 | tp->mac_mode = TG3_DEF_MAC_MODE; | ||
12474 | |||
12419 | /* these are limited to 10/100 only */ | 12475 | /* these are limited to 10/100 only */ |
12420 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && | 12476 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 && |
12421 | (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) || | 12477 | (grc_misc_cfg == 0x8000 || grc_misc_cfg == 0x4000)) || |
@@ -13275,7 +13331,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
13275 | tp->pdev = pdev; | 13331 | tp->pdev = pdev; |
13276 | tp->dev = dev; | 13332 | tp->dev = dev; |
13277 | tp->pm_cap = pm_cap; | 13333 | tp->pm_cap = pm_cap; |
13278 | tp->mac_mode = TG3_DEF_MAC_MODE; | ||
13279 | tp->rx_mode = TG3_DEF_RX_MODE; | 13334 | tp->rx_mode = TG3_DEF_RX_MODE; |
13280 | tp->tx_mode = TG3_DEF_TX_MODE; | 13335 | tp->tx_mode = TG3_DEF_TX_MODE; |
13281 | 13336 | ||
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index df07842172b7..f5b8cab8d4b5 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -325,6 +325,8 @@ | |||
325 | #define MAC_MODE_TDE_ENABLE 0x00200000 | 325 | #define MAC_MODE_TDE_ENABLE 0x00200000 |
326 | #define MAC_MODE_RDE_ENABLE 0x00400000 | 326 | #define MAC_MODE_RDE_ENABLE 0x00400000 |
327 | #define MAC_MODE_FHDE_ENABLE 0x00800000 | 327 | #define MAC_MODE_FHDE_ENABLE 0x00800000 |
328 | #define MAC_MODE_APE_RX_EN 0x08000000 | ||
329 | #define MAC_MODE_APE_TX_EN 0x10000000 | ||
328 | #define MAC_STATUS 0x00000404 | 330 | #define MAC_STATUS 0x00000404 |
329 | #define MAC_STATUS_PCS_SYNCED 0x00000001 | 331 | #define MAC_STATUS_PCS_SYNCED 0x00000001 |
330 | #define MAC_STATUS_SIGNAL_DET 0x00000002 | 332 | #define MAC_STATUS_SIGNAL_DET 0x00000002 |
@@ -1889,6 +1891,7 @@ | |||
1889 | #define APE_EVENT_STATUS_EVENT_PENDING 0x80000000 | 1891 | #define APE_EVENT_STATUS_EVENT_PENDING 0x80000000 |
1890 | 1892 | ||
1891 | /* APE convenience enumerations. */ | 1893 | /* APE convenience enumerations. */ |
1894 | #define TG3_APE_LOCK_GRC 1 | ||
1892 | #define TG3_APE_LOCK_MEM 4 | 1895 | #define TG3_APE_LOCK_MEM 4 |
1893 | 1896 | ||
1894 | #define TG3_EEPROM_SB_F1R2_MBA_OFF 0x10 | 1897 | #define TG3_EEPROM_SB_F1R2_MBA_OFF 0x10 |
@@ -2429,7 +2432,10 @@ struct tg3 { | |||
2429 | struct tg3_ethtool_stats estats; | 2432 | struct tg3_ethtool_stats estats; |
2430 | struct tg3_ethtool_stats estats_prev; | 2433 | struct tg3_ethtool_stats estats_prev; |
2431 | 2434 | ||
2435 | union { | ||
2432 | unsigned long phy_crc_errors; | 2436 | unsigned long phy_crc_errors; |
2437 | unsigned long last_event_jiffies; | ||
2438 | }; | ||
2433 | 2439 | ||
2434 | u32 rx_offset; | 2440 | u32 rx_offset; |
2435 | u32 tg3_flags; | 2441 | u32 tg3_flags; |
diff --git a/drivers/net/tlan.c b/drivers/net/tlan.c index 85246ed7cb9c..ec871f646766 100644 --- a/drivers/net/tlan.c +++ b/drivers/net/tlan.c | |||
@@ -360,8 +360,8 @@ TLan_GetSKB( const struct tlan_list_tag *tag) | |||
360 | { | 360 | { |
361 | unsigned long addr; | 361 | unsigned long addr; |
362 | 362 | ||
363 | addr = tag->buffer[8].address; | 363 | addr = tag->buffer[9].address; |
364 | addr |= (tag->buffer[9].address << 16) << 16; | 364 | addr |= (tag->buffer[8].address << 16) << 16; |
365 | return (struct sk_buff *) addr; | 365 | return (struct sk_buff *) addr; |
366 | } | 366 | } |
367 | 367 | ||
@@ -1984,7 +1984,6 @@ static void TLan_ResetLists( struct net_device *dev ) | |||
1984 | TLanList *list; | 1984 | TLanList *list; |
1985 | dma_addr_t list_phys; | 1985 | dma_addr_t list_phys; |
1986 | struct sk_buff *skb; | 1986 | struct sk_buff *skb; |
1987 | void *t = NULL; | ||
1988 | 1987 | ||
1989 | priv->txHead = 0; | 1988 | priv->txHead = 0; |
1990 | priv->txTail = 0; | 1989 | priv->txTail = 0; |
@@ -2022,7 +2021,8 @@ static void TLan_ResetLists( struct net_device *dev ) | |||
2022 | } | 2021 | } |
2023 | 2022 | ||
2024 | skb_reserve( skb, NET_IP_ALIGN ); | 2023 | skb_reserve( skb, NET_IP_ALIGN ); |
2025 | list->buffer[0].address = pci_map_single(priv->pciDev, t, | 2024 | list->buffer[0].address = pci_map_single(priv->pciDev, |
2025 | skb->data, | ||
2026 | TLAN_MAX_FRAME_SIZE, | 2026 | TLAN_MAX_FRAME_SIZE, |
2027 | PCI_DMA_FROMDEVICE); | 2027 | PCI_DMA_FROMDEVICE); |
2028 | TLan_StoreSKB(list, skb); | 2028 | TLan_StoreSKB(list, skb); |
diff --git a/drivers/net/tokenring/lanstreamer.c b/drivers/net/tokenring/lanstreamer.c index 47d84cd28097..59d1673f9387 100644 --- a/drivers/net/tokenring/lanstreamer.c +++ b/drivers/net/tokenring/lanstreamer.c | |||
@@ -119,7 +119,6 @@ | |||
119 | #include <linux/pci.h> | 119 | #include <linux/pci.h> |
120 | #include <linux/dma-mapping.h> | 120 | #include <linux/dma-mapping.h> |
121 | #include <linux/spinlock.h> | 121 | #include <linux/spinlock.h> |
122 | #include <linux/version.h> | ||
123 | #include <linux/bitops.h> | 122 | #include <linux/bitops.h> |
124 | #include <linux/jiffies.h> | 123 | #include <linux/jiffies.h> |
125 | 124 | ||
diff --git a/drivers/net/tokenring/lanstreamer.h b/drivers/net/tokenring/lanstreamer.h index e7bb3494afc7..13ccee6449c1 100644 --- a/drivers/net/tokenring/lanstreamer.h +++ b/drivers/net/tokenring/lanstreamer.h | |||
@@ -60,8 +60,6 @@ | |||
60 | * | 60 | * |
61 | */ | 61 | */ |
62 | 62 | ||
63 | #include <linux/version.h> | ||
64 | |||
65 | /* MAX_INTR - the maximum number of times we can loop | 63 | /* MAX_INTR - the maximum number of times we can loop |
66 | * inside the interrupt function before returning | 64 | * inside the interrupt function before returning |
67 | * control to the OS (maximum value is 256) | 65 | * control to the OS (maximum value is 256) |
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index e6bbc639c2d0..6daea0c91862 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -358,6 +358,66 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait) | |||
358 | return mask; | 358 | return mask; |
359 | } | 359 | } |
360 | 360 | ||
361 | /* prepad is the amount to reserve at front. len is length after that. | ||
362 | * linear is a hint as to how much to copy (usually headers). */ | ||
363 | static struct sk_buff *tun_alloc_skb(size_t prepad, size_t len, size_t linear, | ||
364 | gfp_t gfp) | ||
365 | { | ||
366 | struct sk_buff *skb; | ||
367 | unsigned int i; | ||
368 | |||
369 | skb = alloc_skb(prepad + len, gfp|__GFP_NOWARN); | ||
370 | if (skb) { | ||
371 | skb_reserve(skb, prepad); | ||
372 | skb_put(skb, len); | ||
373 | return skb; | ||
374 | } | ||
375 | |||
376 | /* Under a page? Don't bother with paged skb. */ | ||
377 | if (prepad + len < PAGE_SIZE) | ||
378 | return NULL; | ||
379 | |||
380 | /* Start with a normal skb, and add pages. */ | ||
381 | skb = alloc_skb(prepad + linear, gfp); | ||
382 | if (!skb) | ||
383 | return NULL; | ||
384 | |||
385 | skb_reserve(skb, prepad); | ||
386 | skb_put(skb, linear); | ||
387 | |||
388 | len -= linear; | ||
389 | |||
390 | for (i = 0; i < MAX_SKB_FRAGS; i++) { | ||
391 | skb_frag_t *f = &skb_shinfo(skb)->frags[i]; | ||
392 | |||
393 | f->page = alloc_page(gfp|__GFP_ZERO); | ||
394 | if (!f->page) | ||
395 | break; | ||
396 | |||
397 | f->page_offset = 0; | ||
398 | f->size = PAGE_SIZE; | ||
399 | |||
400 | skb->data_len += PAGE_SIZE; | ||
401 | skb->len += PAGE_SIZE; | ||
402 | skb->truesize += PAGE_SIZE; | ||
403 | skb_shinfo(skb)->nr_frags++; | ||
404 | |||
405 | if (len < PAGE_SIZE) { | ||
406 | len = 0; | ||
407 | break; | ||
408 | } | ||
409 | len -= PAGE_SIZE; | ||
410 | } | ||
411 | |||
412 | /* Too large, or alloc fail? */ | ||
413 | if (unlikely(len)) { | ||
414 | kfree_skb(skb); | ||
415 | skb = NULL; | ||
416 | } | ||
417 | |||
418 | return skb; | ||
419 | } | ||
420 | |||
361 | /* Get packet from user space buffer */ | 421 | /* Get packet from user space buffer */ |
362 | static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, size_t count) | 422 | static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, size_t count) |
363 | { | 423 | { |
@@ -391,14 +451,12 @@ static __inline__ ssize_t tun_get_user(struct tun_struct *tun, struct iovec *iv, | |||
391 | return -EINVAL; | 451 | return -EINVAL; |
392 | } | 452 | } |
393 | 453 | ||
394 | if (!(skb = alloc_skb(len + align, GFP_KERNEL))) { | 454 | if (!(skb = tun_alloc_skb(align, len, gso.hdr_len, GFP_KERNEL))) { |
395 | tun->dev->stats.rx_dropped++; | 455 | tun->dev->stats.rx_dropped++; |
396 | return -ENOMEM; | 456 | return -ENOMEM; |
397 | } | 457 | } |
398 | 458 | ||
399 | if (align) | 459 | if (skb_copy_datagram_from_iovec(skb, 0, iv, len)) { |
400 | skb_reserve(skb, align); | ||
401 | if (memcpy_fromiovec(skb_put(skb, len), iv, len)) { | ||
402 | tun->dev->stats.rx_dropped++; | 460 | tun->dev->stats.rx_dropped++; |
403 | kfree_skb(skb); | 461 | kfree_skb(skb); |
404 | return -EFAULT; | 462 | return -EFAULT; |
@@ -748,6 +806,36 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
748 | return err; | 806 | return err; |
749 | } | 807 | } |
750 | 808 | ||
809 | static int tun_get_iff(struct net *net, struct file *file, struct ifreq *ifr) | ||
810 | { | ||
811 | struct tun_struct *tun = file->private_data; | ||
812 | |||
813 | if (!tun) | ||
814 | return -EBADFD; | ||
815 | |||
816 | DBG(KERN_INFO "%s: tun_get_iff\n", tun->dev->name); | ||
817 | |||
818 | strcpy(ifr->ifr_name, tun->dev->name); | ||
819 | |||
820 | ifr->ifr_flags = 0; | ||
821 | |||
822 | if (ifr->ifr_flags & TUN_TUN_DEV) | ||
823 | ifr->ifr_flags |= IFF_TUN; | ||
824 | else | ||
825 | ifr->ifr_flags |= IFF_TAP; | ||
826 | |||
827 | if (tun->flags & TUN_NO_PI) | ||
828 | ifr->ifr_flags |= IFF_NO_PI; | ||
829 | |||
830 | if (tun->flags & TUN_ONE_QUEUE) | ||
831 | ifr->ifr_flags |= IFF_ONE_QUEUE; | ||
832 | |||
833 | if (tun->flags & TUN_VNET_HDR) | ||
834 | ifr->ifr_flags |= IFF_VNET_HDR; | ||
835 | |||
836 | return 0; | ||
837 | } | ||
838 | |||
751 | /* This is like a cut-down ethtool ops, except done via tun fd so no | 839 | /* This is like a cut-down ethtool ops, except done via tun fd so no |
752 | * privs required. */ | 840 | * privs required. */ |
753 | static int set_offload(struct net_device *dev, unsigned long arg) | 841 | static int set_offload(struct net_device *dev, unsigned long arg) |
@@ -833,6 +921,15 @@ static int tun_chr_ioctl(struct inode *inode, struct file *file, | |||
833 | DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd); | 921 | DBG(KERN_INFO "%s: tun_chr_ioctl cmd %d\n", tun->dev->name, cmd); |
834 | 922 | ||
835 | switch (cmd) { | 923 | switch (cmd) { |
924 | case TUNGETIFF: | ||
925 | ret = tun_get_iff(current->nsproxy->net_ns, file, &ifr); | ||
926 | if (ret) | ||
927 | return ret; | ||
928 | |||
929 | if (copy_to_user(argp, &ifr, sizeof(ifr))) | ||
930 | return -EFAULT; | ||
931 | break; | ||
932 | |||
836 | case TUNSETNOCSUM: | 933 | case TUNSETNOCSUM: |
837 | /* Disable/Enable checksum */ | 934 | /* Disable/Enable checksum */ |
838 | if (arg) | 935 | if (arg) |
diff --git a/drivers/net/typhoon.c b/drivers/net/typhoon.c index 8549f1159a30..734ce0977f02 100644 --- a/drivers/net/typhoon.c +++ b/drivers/net/typhoon.c | |||
@@ -128,7 +128,6 @@ static const int multicast_filter_limit = 32; | |||
128 | #include <asm/io.h> | 128 | #include <asm/io.h> |
129 | #include <asm/uaccess.h> | 129 | #include <asm/uaccess.h> |
130 | #include <linux/in6.h> | 130 | #include <linux/in6.h> |
131 | #include <linux/version.h> | ||
132 | #include <linux/dma-mapping.h> | 131 | #include <linux/dma-mapping.h> |
133 | 132 | ||
134 | #include "typhoon.h" | 133 | #include "typhoon.h" |
diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig index 68e198bd538b..0973b6e37024 100644 --- a/drivers/net/usb/Kconfig +++ b/drivers/net/usb/Kconfig | |||
@@ -154,17 +154,6 @@ config USB_NET_AX8817X | |||
154 | This driver creates an interface named "ethX", where X depends on | 154 | This driver creates an interface named "ethX", where X depends on |
155 | what other networking devices you have in use. | 155 | what other networking devices you have in use. |
156 | 156 | ||
157 | config USB_HSO | ||
158 | tristate "Option USB High Speed Mobile Devices" | ||
159 | depends on USB && RFKILL | ||
160 | default n | ||
161 | help | ||
162 | Choose this option if you have an Option HSDPA/HSUPA card. | ||
163 | These cards support downlink speeds of 7.2Mbps or greater. | ||
164 | |||
165 | To compile this driver as a module, choose M here: the | ||
166 | module will be called hso. | ||
167 | |||
168 | config USB_NET_CDCETHER | 157 | config USB_NET_CDCETHER |
169 | tristate "CDC Ethernet support (smart devices such as cable modems)" | 158 | tristate "CDC Ethernet support (smart devices such as cable modems)" |
170 | depends on USB_USBNET | 159 | depends on USB_USBNET |
@@ -337,5 +326,15 @@ config USB_NET_ZAURUS | |||
337 | really need this non-conformant variant of CDC Ethernet (or in | 326 | really need this non-conformant variant of CDC Ethernet (or in |
338 | some cases CDC MDLM) protocol, not "g_ether". | 327 | some cases CDC MDLM) protocol, not "g_ether". |
339 | 328 | ||
329 | config USB_HSO | ||
330 | tristate "Option USB High Speed Mobile Devices" | ||
331 | depends on USB && RFKILL | ||
332 | default n | ||
333 | help | ||
334 | Choose this option if you have an Option HSDPA/HSUPA card. | ||
335 | These cards support downlink speeds of 7.2Mbps or greater. | ||
336 | |||
337 | To compile this driver as a module, choose M here: the | ||
338 | module will be called hso. | ||
340 | 339 | ||
341 | endmenu | 340 | endmenu |
diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c index 031d07b105af..1b7cac77159e 100644 --- a/drivers/net/usb/hso.c +++ b/drivers/net/usb/hso.c | |||
@@ -102,8 +102,12 @@ | |||
102 | 102 | ||
103 | #define MAX_RX_URBS 2 | 103 | #define MAX_RX_URBS 2 |
104 | 104 | ||
105 | #define get_serial_by_tty(x) \ | 105 | static inline struct hso_serial *get_serial_by_tty(struct tty_struct *tty) |
106 | (x ? (struct hso_serial *)x->driver_data : NULL) | 106 | { |
107 | if (tty) | ||
108 | return tty->driver_data; | ||
109 | return NULL; | ||
110 | } | ||
107 | 111 | ||
108 | /*****************************************************************************/ | 112 | /*****************************************************************************/ |
109 | /* Debugging functions */ | 113 | /* Debugging functions */ |
@@ -294,24 +298,25 @@ static int hso_get_activity(struct hso_device *hso_dev); | |||
294 | 298 | ||
295 | /* #define DEBUG */ | 299 | /* #define DEBUG */ |
296 | 300 | ||
297 | #define dev2net(x) (x->port_data.dev_net) | 301 | static inline struct hso_net *dev2net(struct hso_device *hso_dev) |
298 | #define dev2ser(x) (x->port_data.dev_serial) | 302 | { |
303 | return hso_dev->port_data.dev_net; | ||
304 | } | ||
305 | |||
306 | static inline struct hso_serial *dev2ser(struct hso_device *hso_dev) | ||
307 | { | ||
308 | return hso_dev->port_data.dev_serial; | ||
309 | } | ||
299 | 310 | ||
300 | /* Debugging functions */ | 311 | /* Debugging functions */ |
301 | #ifdef DEBUG | 312 | #ifdef DEBUG |
302 | static void dbg_dump(int line_count, const char *func_name, unsigned char *buf, | 313 | static void dbg_dump(int line_count, const char *func_name, unsigned char *buf, |
303 | unsigned int len) | 314 | unsigned int len) |
304 | { | 315 | { |
305 | u8 i = 0; | 316 | static char name[255]; |
306 | 317 | ||
307 | printk(KERN_DEBUG "[%d:%s]: len %d", line_count, func_name, len); | 318 | sprintf(name, "hso[%d:%s]", line_count, func_name); |
308 | 319 | print_hex_dump_bytes(name, DUMP_PREFIX_NONE, buf, len); | |
309 | for (i = 0; i < len; i++) { | ||
310 | if (!(i % 16)) | ||
311 | printk("\n 0x%03x: ", i); | ||
312 | printk("%02x ", (unsigned char)buf[i]); | ||
313 | } | ||
314 | printk("\n"); | ||
315 | } | 320 | } |
316 | 321 | ||
317 | #define DUMP(buf_, len_) \ | 322 | #define DUMP(buf_, len_) \ |
@@ -528,13 +533,12 @@ static struct hso_serial *get_serial_by_shared_int_and_type( | |||
528 | 533 | ||
529 | static struct hso_serial *get_serial_by_index(unsigned index) | 534 | static struct hso_serial *get_serial_by_index(unsigned index) |
530 | { | 535 | { |
531 | struct hso_serial *serial; | 536 | struct hso_serial *serial = NULL; |
532 | unsigned long flags; | 537 | unsigned long flags; |
533 | 538 | ||
534 | if (!serial_table[index]) | ||
535 | return NULL; | ||
536 | spin_lock_irqsave(&serial_table_lock, flags); | 539 | spin_lock_irqsave(&serial_table_lock, flags); |
537 | serial = dev2ser(serial_table[index]); | 540 | if (serial_table[index]) |
541 | serial = dev2ser(serial_table[index]); | ||
538 | spin_unlock_irqrestore(&serial_table_lock, flags); | 542 | spin_unlock_irqrestore(&serial_table_lock, flags); |
539 | 543 | ||
540 | return serial; | 544 | return serial; |
@@ -561,6 +565,7 @@ static int get_free_serial_index(void) | |||
561 | static void set_serial_by_index(unsigned index, struct hso_serial *serial) | 565 | static void set_serial_by_index(unsigned index, struct hso_serial *serial) |
562 | { | 566 | { |
563 | unsigned long flags; | 567 | unsigned long flags; |
568 | |||
564 | spin_lock_irqsave(&serial_table_lock, flags); | 569 | spin_lock_irqsave(&serial_table_lock, flags); |
565 | if (serial) | 570 | if (serial) |
566 | serial_table[index] = serial->parent; | 571 | serial_table[index] = serial->parent; |
@@ -569,7 +574,7 @@ static void set_serial_by_index(unsigned index, struct hso_serial *serial) | |||
569 | spin_unlock_irqrestore(&serial_table_lock, flags); | 574 | spin_unlock_irqrestore(&serial_table_lock, flags); |
570 | } | 575 | } |
571 | 576 | ||
572 | /* log a meaningfull explanation of an USB status */ | 577 | /* log a meaningful explanation of an USB status */ |
573 | static void log_usb_status(int status, const char *function) | 578 | static void log_usb_status(int status, const char *function) |
574 | { | 579 | { |
575 | char *explanation; | 580 | char *explanation; |
@@ -1103,8 +1108,8 @@ static void hso_serial_close(struct tty_struct *tty, struct file *filp) | |||
1103 | /* reset the rts and dtr */ | 1108 | /* reset the rts and dtr */ |
1104 | /* do the actual close */ | 1109 | /* do the actual close */ |
1105 | serial->open_count--; | 1110 | serial->open_count--; |
1111 | kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
1106 | if (serial->open_count <= 0) { | 1112 | if (serial->open_count <= 0) { |
1107 | kref_put(&serial->parent->ref, hso_serial_ref_free); | ||
1108 | serial->open_count = 0; | 1113 | serial->open_count = 0; |
1109 | if (serial->tty) { | 1114 | if (serial->tty) { |
1110 | serial->tty->driver_data = NULL; | 1115 | serial->tty->driver_data = NULL; |
@@ -1467,7 +1472,8 @@ static void hso_std_serial_write_bulk_callback(struct urb *urb) | |||
1467 | return; | 1472 | return; |
1468 | } | 1473 | } |
1469 | hso_put_activity(serial->parent); | 1474 | hso_put_activity(serial->parent); |
1470 | tty_wakeup(serial->tty); | 1475 | if (serial->tty) |
1476 | tty_wakeup(serial->tty); | ||
1471 | hso_kick_transmit(serial); | 1477 | hso_kick_transmit(serial); |
1472 | 1478 | ||
1473 | D1(" "); | 1479 | D1(" "); |
@@ -1538,7 +1544,8 @@ static void ctrl_callback(struct urb *urb) | |||
1538 | clear_bit(HSO_SERIAL_FLAG_RX_SENT, &serial->flags); | 1544 | clear_bit(HSO_SERIAL_FLAG_RX_SENT, &serial->flags); |
1539 | } else { | 1545 | } else { |
1540 | hso_put_activity(serial->parent); | 1546 | hso_put_activity(serial->parent); |
1541 | tty_wakeup(serial->tty); | 1547 | if (serial->tty) |
1548 | tty_wakeup(serial->tty); | ||
1542 | /* response to a write command */ | 1549 | /* response to a write command */ |
1543 | hso_kick_transmit(serial); | 1550 | hso_kick_transmit(serial); |
1544 | } | 1551 | } |
@@ -2652,7 +2659,7 @@ static void hso_free_interface(struct usb_interface *interface) | |||
2652 | hso_stop_net_device(network_table[i]); | 2659 | hso_stop_net_device(network_table[i]); |
2653 | cancel_work_sync(&network_table[i]->async_put_intf); | 2660 | cancel_work_sync(&network_table[i]->async_put_intf); |
2654 | cancel_work_sync(&network_table[i]->async_get_intf); | 2661 | cancel_work_sync(&network_table[i]->async_get_intf); |
2655 | if(rfk) | 2662 | if (rfk) |
2656 | rfkill_unregister(rfk); | 2663 | rfkill_unregister(rfk); |
2657 | hso_free_net_device(network_table[i]); | 2664 | hso_free_net_device(network_table[i]); |
2658 | } | 2665 | } |
@@ -2723,7 +2730,7 @@ static int hso_mux_submit_intr_urb(struct hso_shared_int *shared_int, | |||
2723 | } | 2730 | } |
2724 | 2731 | ||
2725 | /* operations setup of the serial interface */ | 2732 | /* operations setup of the serial interface */ |
2726 | static struct tty_operations hso_serial_ops = { | 2733 | static const struct tty_operations hso_serial_ops = { |
2727 | .open = hso_serial_open, | 2734 | .open = hso_serial_open, |
2728 | .close = hso_serial_close, | 2735 | .close = hso_serial_close, |
2729 | .write = hso_serial_write, | 2736 | .write = hso_serial_write, |
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 2028866f5995..b20a45aa8680 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -40,7 +40,6 @@ | |||
40 | * | 40 | * |
41 | */ | 41 | */ |
42 | 42 | ||
43 | #include <linux/version.h> | ||
44 | #include <linux/module.h> | 43 | #include <linux/module.h> |
45 | #include <linux/delay.h> | 44 | #include <linux/delay.h> |
46 | #include <linux/hardirq.h> | 45 | #include <linux/hardirq.h> |
@@ -587,7 +586,6 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state) | |||
587 | ath5k_stop_hw(sc); | 586 | ath5k_stop_hw(sc); |
588 | 587 | ||
589 | free_irq(pdev->irq, sc); | 588 | free_irq(pdev->irq, sc); |
590 | pci_disable_msi(pdev); | ||
591 | pci_save_state(pdev); | 589 | pci_save_state(pdev); |
592 | pci_disable_device(pdev); | 590 | pci_disable_device(pdev); |
593 | pci_set_power_state(pdev, PCI_D3hot); | 591 | pci_set_power_state(pdev, PCI_D3hot); |
@@ -616,12 +614,10 @@ ath5k_pci_resume(struct pci_dev *pdev) | |||
616 | */ | 614 | */ |
617 | pci_write_config_byte(pdev, 0x41, 0); | 615 | pci_write_config_byte(pdev, 0x41, 0); |
618 | 616 | ||
619 | pci_enable_msi(pdev); | ||
620 | |||
621 | err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); | 617 | err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); |
622 | if (err) { | 618 | if (err) { |
623 | ATH5K_ERR(sc, "request_irq failed\n"); | 619 | ATH5K_ERR(sc, "request_irq failed\n"); |
624 | goto err_msi; | 620 | goto err_no_irq; |
625 | } | 621 | } |
626 | 622 | ||
627 | err = ath5k_init(sc); | 623 | err = ath5k_init(sc); |
@@ -642,8 +638,7 @@ ath5k_pci_resume(struct pci_dev *pdev) | |||
642 | return 0; | 638 | return 0; |
643 | err_irq: | 639 | err_irq: |
644 | free_irq(pdev->irq, sc); | 640 | free_irq(pdev->irq, sc); |
645 | err_msi: | 641 | err_no_irq: |
646 | pci_disable_msi(pdev); | ||
647 | pci_disable_device(pdev); | 642 | pci_disable_device(pdev); |
648 | return err; | 643 | return err; |
649 | } | 644 | } |
diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c index bde162f128ab..a17eb130f574 100644 --- a/drivers/net/wireless/ath9k/hw.c +++ b/drivers/net/wireless/ath9k/hw.c | |||
@@ -5017,7 +5017,11 @@ static void ath9k_hw_spur_mitigate(struct ath_hal *ah, | |||
5017 | 5017 | ||
5018 | for (i = 0; i < 123; i++) { | 5018 | for (i = 0; i < 123; i++) { |
5019 | if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) { | 5019 | if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) { |
5020 | if ((abs(cur_vit_mask - bin)) < 75) | 5020 | |
5021 | /* workaround for gcc bug #37014 */ | ||
5022 | volatile int tmp = abs(cur_vit_mask - bin); | ||
5023 | |||
5024 | if (tmp < 75) | ||
5021 | mask_amt = 1; | 5025 | mask_amt = 1; |
5022 | else | 5026 | else |
5023 | mask_amt = 0; | 5027 | mask_amt = 0; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 3bf3a869361f..7205a936ec74 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -33,7 +33,6 @@ | |||
33 | #include <linux/moduleparam.h> | 33 | #include <linux/moduleparam.h> |
34 | #include <linux/if_arp.h> | 34 | #include <linux/if_arp.h> |
35 | #include <linux/etherdevice.h> | 35 | #include <linux/etherdevice.h> |
36 | #include <linux/version.h> | ||
37 | #include <linux/firmware.h> | 36 | #include <linux/firmware.h> |
38 | #include <linux/wireless.h> | 37 | #include <linux/wireless.h> |
39 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
@@ -4615,7 +4614,9 @@ static void b43_sprom_fixup(struct ssb_bus *bus) | |||
4615 | if (bus->bustype == SSB_BUSTYPE_PCI) { | 4614 | if (bus->bustype == SSB_BUSTYPE_PCI) { |
4616 | pdev = bus->host_pci; | 4615 | pdev = bus->host_pci; |
4617 | if (IS_PDEV(pdev, BROADCOM, 0x4318, ASUSTEK, 0x100F) || | 4616 | if (IS_PDEV(pdev, BROADCOM, 0x4318, ASUSTEK, 0x100F) || |
4617 | IS_PDEV(pdev, BROADCOM, 0x4320, DELL, 0x0003) || | ||
4618 | IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0015) || | 4618 | IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0015) || |
4619 | IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0014) || | ||
4619 | IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0013)) | 4620 | IS_PDEV(pdev, BROADCOM, 0x4320, LINKSYS, 0x0013)) |
4620 | bus->sprom.boardflags_lo &= ~B43_BFL_BTCOEXIST; | 4621 | bus->sprom.boardflags_lo &= ~B43_BFL_BTCOEXIST; |
4621 | } | 4622 | } |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 2541c81932f0..1cb77db5c292 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -34,7 +34,6 @@ | |||
34 | #include <linux/moduleparam.h> | 34 | #include <linux/moduleparam.h> |
35 | #include <linux/if_arp.h> | 35 | #include <linux/if_arp.h> |
36 | #include <linux/etherdevice.h> | 36 | #include <linux/etherdevice.h> |
37 | #include <linux/version.h> | ||
38 | #include <linux/firmware.h> | 37 | #include <linux/firmware.h> |
39 | #include <linux/wireless.h> | 38 | #include <linux/wireless.h> |
40 | #include <linux/workqueue.h> | 39 | #include <linux/workqueue.h> |
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index c6f886ec08a3..19a401c4a0dc 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c | |||
@@ -157,7 +157,6 @@ that only one external action is invoked at a time. | |||
157 | #include <linux/stringify.h> | 157 | #include <linux/stringify.h> |
158 | #include <linux/tcp.h> | 158 | #include <linux/tcp.h> |
159 | #include <linux/types.h> | 159 | #include <linux/types.h> |
160 | #include <linux/version.h> | ||
161 | #include <linux/time.h> | 160 | #include <linux/time.h> |
162 | #include <linux/firmware.h> | 161 | #include <linux/firmware.h> |
163 | #include <linux/acpi.h> | 162 | #include <linux/acpi.h> |
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c index 36e8d2f6e7b4..dcce3542d5a7 100644 --- a/drivers/net/wireless/ipw2200.c +++ b/drivers/net/wireless/ipw2200.c | |||
@@ -31,7 +31,6 @@ | |||
31 | ******************************************************************************/ | 31 | ******************************************************************************/ |
32 | 32 | ||
33 | #include "ipw2200.h" | 33 | #include "ipw2200.h" |
34 | #include <linux/version.h> | ||
35 | 34 | ||
36 | 35 | ||
37 | #ifndef KBUILD_EXTMOD | 36 | #ifndef KBUILD_EXTMOD |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.c b/drivers/net/wireless/iwlwifi/iwl-3945-led.c index d3336966b6b5..705c65bed9fd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.c | |||
@@ -27,7 +27,6 @@ | |||
27 | 27 | ||
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/version.h> | ||
31 | #include <linux/init.h> | 30 | #include <linux/init.h> |
32 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
33 | #include <linux/dma-mapping.h> | 32 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index b3931f6135a4..3f51f3635344 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -26,7 +26,6 @@ | |||
26 | 26 | ||
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/version.h> | ||
30 | #include <linux/init.h> | 29 | #include <linux/init.h> |
31 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
32 | #include <linux/dma-mapping.h> | 31 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 22bb26985c2e..e2581229d8b2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -26,7 +26,6 @@ | |||
26 | 26 | ||
27 | #include <linux/kernel.h> | 27 | #include <linux/kernel.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/version.h> | ||
30 | #include <linux/init.h> | 29 | #include <linux/init.h> |
31 | #include <linux/pci.h> | 30 | #include <linux/pci.h> |
32 | #include <linux/dma-mapping.h> | 31 | #include <linux/dma-mapping.h> |
@@ -967,7 +966,7 @@ static int iwl4965_interpolate_chan(struct iwl_priv *priv, u32 channel, | |||
967 | 966 | ||
968 | s = iwl4965_get_sub_band(priv, channel); | 967 | s = iwl4965_get_sub_band(priv, channel); |
969 | if (s >= EEPROM_TX_POWER_BANDS) { | 968 | if (s >= EEPROM_TX_POWER_BANDS) { |
970 | IWL_ERROR("Tx Power can not find channel %d ", channel); | 969 | IWL_ERROR("Tx Power can not find channel %d\n", channel); |
971 | return -1; | 970 | return -1; |
972 | } | 971 | } |
973 | 972 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index f3d139b663e6..cbc01a00eaf4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <linux/version.h> | ||
29 | #include <linux/init.h> | 28 | #include <linux/init.h> |
30 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
31 | #include <linux/dma-mapping.h> | 30 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index ed09e48b1b61..061ffba9c884 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -29,7 +29,6 @@ | |||
29 | 29 | ||
30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/version.h> | ||
33 | #include <linux/init.h> | 32 | #include <linux/init.h> |
34 | #include <linux/pci.h> | 33 | #include <linux/pci.h> |
35 | #include <linux/dma-mapping.h> | 34 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index 9bd61809129f..c72f72579bea 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -28,7 +28,6 @@ | |||
28 | 28 | ||
29 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/version.h> | ||
32 | #include <net/mac80211.h> | 31 | #include <net/mac80211.h> |
33 | 32 | ||
34 | struct iwl_priv; /* FIXME: remove */ | 33 | struct iwl_priv; /* FIXME: remove */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.c b/drivers/net/wireless/iwlwifi/iwl-eeprom.c index bce53830b301..37155755efc5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.c +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.c | |||
@@ -63,7 +63,6 @@ | |||
63 | 63 | ||
64 | #include <linux/kernel.h> | 64 | #include <linux/kernel.h> |
65 | #include <linux/module.h> | 65 | #include <linux/module.h> |
66 | #include <linux/version.h> | ||
67 | #include <linux/init.h> | 66 | #include <linux/init.h> |
68 | 67 | ||
69 | #include <net/mac80211.h> | 68 | #include <net/mac80211.h> |
@@ -146,7 +145,7 @@ int iwlcore_eeprom_verify_signature(struct iwl_priv *priv) | |||
146 | { | 145 | { |
147 | u32 gp = iwl_read32(priv, CSR_EEPROM_GP); | 146 | u32 gp = iwl_read32(priv, CSR_EEPROM_GP); |
148 | if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) { | 147 | if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) { |
149 | IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x", gp); | 148 | IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x\n", gp); |
150 | return -ENOENT; | 149 | return -ENOENT; |
151 | } | 150 | } |
152 | return 0; | 151 | return 0; |
@@ -227,7 +226,7 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
227 | 226 | ||
228 | ret = priv->cfg->ops->lib->eeprom_ops.verify_signature(priv); | 227 | ret = priv->cfg->ops->lib->eeprom_ops.verify_signature(priv); |
229 | if (ret < 0) { | 228 | if (ret < 0) { |
230 | IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x", gp); | 229 | IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x\n", gp); |
231 | ret = -ENOENT; | 230 | ret = -ENOENT; |
232 | goto err; | 231 | goto err; |
233 | } | 232 | } |
@@ -254,7 +253,7 @@ int iwl_eeprom_init(struct iwl_priv *priv) | |||
254 | } | 253 | } |
255 | 254 | ||
256 | if (!(r & CSR_EEPROM_REG_READ_VALID_MSK)) { | 255 | if (!(r & CSR_EEPROM_REG_READ_VALID_MSK)) { |
257 | IWL_ERROR("Time out reading EEPROM[%d]", addr); | 256 | IWL_ERROR("Time out reading EEPROM[%d]\n", addr); |
258 | ret = -ETIMEDOUT; | 257 | ret = -ETIMEDOUT; |
259 | goto done; | 258 | goto done; |
260 | } | 259 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-hcmd.c index 6512834bb916..2eb03eea1908 100644 --- a/drivers/net/wireless/iwlwifi/iwl-hcmd.c +++ b/drivers/net/wireless/iwlwifi/iwl-hcmd.c | |||
@@ -28,7 +28,6 @@ | |||
28 | 28 | ||
29 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
30 | #include <linux/module.h> | 30 | #include <linux/module.h> |
31 | #include <linux/version.h> | ||
32 | #include <net/mac80211.h> | 31 | #include <net/mac80211.h> |
33 | 32 | ||
34 | #include "iwl-dev.h" /* FIXME: remove */ | 33 | #include "iwl-dev.h" /* FIXME: remove */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-led.c b/drivers/net/wireless/iwlwifi/iwl-led.c index cb11c4a4d691..4eee1b163cd2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-led.c +++ b/drivers/net/wireless/iwlwifi/iwl-led.c | |||
@@ -27,7 +27,6 @@ | |||
27 | 27 | ||
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/version.h> | ||
31 | #include <linux/init.h> | 30 | #include <linux/init.h> |
32 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
33 | #include <linux/dma-mapping.h> | 32 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c index 028e3053c0ca..a099c9e30e55 100644 --- a/drivers/net/wireless/iwlwifi/iwl-power.c +++ b/drivers/net/wireless/iwlwifi/iwl-power.c | |||
@@ -29,7 +29,6 @@ | |||
29 | 29 | ||
30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/version.h> | ||
33 | #include <linux/init.h> | 32 | #include <linux/init.h> |
34 | 33 | ||
35 | #include <net/mac80211.h> | 34 | #include <net/mac80211.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rfkill.c b/drivers/net/wireless/iwlwifi/iwl-rfkill.c index e5e5846e9f25..5d642298f04c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rfkill.c +++ b/drivers/net/wireless/iwlwifi/iwl-rfkill.c | |||
@@ -27,7 +27,6 @@ | |||
27 | *****************************************************************************/ | 27 | *****************************************************************************/ |
28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/version.h> | ||
31 | #include <linux/init.h> | 30 | #include <linux/init.h> |
32 | 31 | ||
33 | #include <net/mac80211.h> | 32 | #include <net/mac80211.h> |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index 60a6e0106036..6283a3a707f5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
@@ -207,7 +207,7 @@ static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index, | |||
207 | case WLAN_HT_CAP_MIMO_PS_DISABLED: | 207 | case WLAN_HT_CAP_MIMO_PS_DISABLED: |
208 | break; | 208 | break; |
209 | default: | 209 | default: |
210 | IWL_WARNING("Invalid MIMO PS mode %d", mimo_ps_mode); | 210 | IWL_WARNING("Invalid MIMO PS mode %d\n", mimo_ps_mode); |
211 | break; | 211 | break; |
212 | } | 212 | } |
213 | 213 | ||
@@ -969,7 +969,7 @@ int iwl_get_sta_id(struct iwl_priv *priv, struct ieee80211_hdr *hdr) | |||
969 | return priv->hw_params.bcast_sta_id; | 969 | return priv->hw_params.bcast_sta_id; |
970 | 970 | ||
971 | default: | 971 | default: |
972 | IWL_WARNING("Unknown mode of operation: %d", priv->iw_mode); | 972 | IWL_WARNING("Unknown mode of operation: %d\n", priv->iw_mode); |
973 | return priv->hw_params.bcast_sta_id; | 973 | return priv->hw_params.bcast_sta_id; |
974 | } | 974 | } |
975 | } | 975 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 4108c7c8f00f..d82823b5c8ab 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -493,7 +493,7 @@ int iwl_txq_ctx_reset(struct iwl_priv *priv) | |||
493 | /* Alloc keep-warm buffer */ | 493 | /* Alloc keep-warm buffer */ |
494 | ret = iwl_kw_alloc(priv); | 494 | ret = iwl_kw_alloc(priv); |
495 | if (ret) { | 495 | if (ret) { |
496 | IWL_ERROR("Keep Warm allocation failed"); | 496 | IWL_ERROR("Keep Warm allocation failed\n"); |
497 | goto error_kw; | 497 | goto error_kw; |
498 | } | 498 | } |
499 | spin_lock_irqsave(&priv->lock, flags); | 499 | spin_lock_irqsave(&priv->lock, flags); |
@@ -1463,7 +1463,7 @@ void iwl_rx_reply_compressed_ba(struct iwl_priv *priv, | |||
1463 | u16 ba_resp_scd_ssn = le16_to_cpu(ba_resp->scd_ssn); | 1463 | u16 ba_resp_scd_ssn = le16_to_cpu(ba_resp->scd_ssn); |
1464 | 1464 | ||
1465 | if (scd_flow >= priv->hw_params.max_txq_num) { | 1465 | if (scd_flow >= priv->hw_params.max_txq_num) { |
1466 | IWL_ERROR("BUG_ON scd_flow is bigger than number of queues"); | 1466 | IWL_ERROR("BUG_ON scd_flow is bigger than number of queues\n"); |
1467 | return; | 1467 | return; |
1468 | } | 1468 | } |
1469 | 1469 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 444847ab1b5a..b775d5bab668 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -29,7 +29,6 @@ | |||
29 | 29 | ||
30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/version.h> | ||
33 | #include <linux/init.h> | 32 | #include <linux/init.h> |
34 | #include <linux/pci.h> | 33 | #include <linux/pci.h> |
35 | #include <linux/dma-mapping.h> | 34 | #include <linux/dma-mapping.h> |
@@ -1558,7 +1557,7 @@ int iwl3945_eeprom_init(struct iwl3945_priv *priv) | |||
1558 | BUILD_BUG_ON(sizeof(priv->eeprom) != IWL_EEPROM_IMAGE_SIZE); | 1557 | BUILD_BUG_ON(sizeof(priv->eeprom) != IWL_EEPROM_IMAGE_SIZE); |
1559 | 1558 | ||
1560 | if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) { | 1559 | if ((gp & CSR_EEPROM_GP_VALID_MSK) == CSR_EEPROM_GP_BAD_SIGNATURE) { |
1561 | IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x", gp); | 1560 | IWL_ERROR("EEPROM not found, EEPROM_GP=0x%08x\n", gp); |
1562 | return -ENOENT; | 1561 | return -ENOENT; |
1563 | } | 1562 | } |
1564 | 1563 | ||
@@ -1583,7 +1582,7 @@ int iwl3945_eeprom_init(struct iwl3945_priv *priv) | |||
1583 | } | 1582 | } |
1584 | 1583 | ||
1585 | if (!(r & CSR_EEPROM_REG_READ_VALID_MSK)) { | 1584 | if (!(r & CSR_EEPROM_REG_READ_VALID_MSK)) { |
1586 | IWL_ERROR("Time out reading EEPROM[%d]", addr); | 1585 | IWL_ERROR("Time out reading EEPROM[%d]\n", addr); |
1587 | return -ETIMEDOUT; | 1586 | return -ETIMEDOUT; |
1588 | } | 1587 | } |
1589 | e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); | 1588 | e[addr / 2] = le16_to_cpu((__force __le16)(r >> 16)); |
@@ -2507,7 +2506,7 @@ static int iwl3945_get_sta_id(struct iwl3945_priv *priv, struct ieee80211_hdr *h | |||
2507 | return priv->hw_setting.bcast_sta_id; | 2506 | return priv->hw_setting.bcast_sta_id; |
2508 | 2507 | ||
2509 | default: | 2508 | default: |
2510 | IWL_WARNING("Unknown mode of operation: %d", priv->iw_mode); | 2509 | IWL_WARNING("Unknown mode of operation: %d\n", priv->iw_mode); |
2511 | return priv->hw_setting.bcast_sta_id; | 2510 | return priv->hw_setting.bcast_sta_id; |
2512 | } | 2511 | } |
2513 | } | 2512 | } |
diff --git a/drivers/net/wireless/p54/p54common.c b/drivers/net/wireless/p54/p54common.c index 83cd85e1f847..29be3dc8ee09 100644 --- a/drivers/net/wireless/p54/p54common.c +++ b/drivers/net/wireless/p54/p54common.c | |||
@@ -413,12 +413,12 @@ static void p54_rx_frame_sent(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
413 | last_addr = range->end_addr; | 413 | last_addr = range->end_addr; |
414 | __skb_unlink(entry, &priv->tx_queue); | 414 | __skb_unlink(entry, &priv->tx_queue); |
415 | memset(&info->status, 0, sizeof(info->status)); | 415 | memset(&info->status, 0, sizeof(info->status)); |
416 | priv->tx_stats[skb_get_queue_mapping(skb)].len--; | ||
417 | entry_hdr = (struct p54_control_hdr *) entry->data; | 416 | entry_hdr = (struct p54_control_hdr *) entry->data; |
418 | entry_data = (struct p54_tx_control_allocdata *) entry_hdr->data; | 417 | entry_data = (struct p54_tx_control_allocdata *) entry_hdr->data; |
419 | if ((entry_hdr->magic1 & cpu_to_le16(0x4000)) != 0) | 418 | if ((entry_hdr->magic1 & cpu_to_le16(0x4000)) != 0) |
420 | pad = entry_data->align[0]; | 419 | pad = entry_data->align[0]; |
421 | 420 | ||
421 | priv->tx_stats[entry_data->hw_queue - 4].len--; | ||
422 | if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) { | 422 | if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) { |
423 | if (!(payload->status & 0x01)) | 423 | if (!(payload->status & 0x01)) |
424 | info->flags |= IEEE80211_TX_STAT_ACK; | 424 | info->flags |= IEEE80211_TX_STAT_ACK; |
@@ -557,6 +557,7 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
557 | struct p54_tx_control_allocdata *txhdr; | 557 | struct p54_tx_control_allocdata *txhdr; |
558 | size_t padding, len; | 558 | size_t padding, len; |
559 | u8 rate; | 559 | u8 rate; |
560 | u8 cts_rate = 0x20; | ||
560 | 561 | ||
561 | current_queue = &priv->tx_stats[skb_get_queue_mapping(skb)]; | 562 | current_queue = &priv->tx_stats[skb_get_queue_mapping(skb)]; |
562 | if (unlikely(current_queue->len > current_queue->limit)) | 563 | if (unlikely(current_queue->len > current_queue->limit)) |
@@ -581,28 +582,28 @@ static int p54_tx(struct ieee80211_hw *dev, struct sk_buff *skb) | |||
581 | hdr->type = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 0 : cpu_to_le16(1); | 582 | hdr->type = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? 0 : cpu_to_le16(1); |
582 | hdr->retry1 = hdr->retry2 = info->control.retry_limit; | 583 | hdr->retry1 = hdr->retry2 = info->control.retry_limit; |
583 | 584 | ||
584 | memset(txhdr->wep_key, 0x0, 16); | ||
585 | txhdr->padding = 0; | ||
586 | txhdr->padding2 = 0; | ||
587 | |||
588 | /* TODO: add support for alternate retry TX rates */ | 585 | /* TODO: add support for alternate retry TX rates */ |
589 | rate = ieee80211_get_tx_rate(dev, info)->hw_value; | 586 | rate = ieee80211_get_tx_rate(dev, info)->hw_value; |
590 | if (info->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE) | 587 | if (info->flags & IEEE80211_TX_CTL_SHORT_PREAMBLE) { |
591 | rate |= 0x10; | 588 | rate |= 0x10; |
592 | if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) | 589 | cts_rate |= 0x10; |
590 | } | ||
591 | if (info->flags & IEEE80211_TX_CTL_USE_RTS_CTS) { | ||
593 | rate |= 0x40; | 592 | rate |= 0x40; |
594 | else if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) | 593 | cts_rate |= ieee80211_get_rts_cts_rate(dev, info)->hw_value; |
594 | } else if (info->flags & IEEE80211_TX_CTL_USE_CTS_PROTECT) { | ||
595 | rate |= 0x20; | 595 | rate |= 0x20; |
596 | cts_rate |= ieee80211_get_rts_cts_rate(dev, info)->hw_value; | ||
597 | } | ||
596 | memset(txhdr->rateset, rate, 8); | 598 | memset(txhdr->rateset, rate, 8); |
597 | txhdr->wep_key_present = 0; | 599 | txhdr->key_type = 0; |
598 | txhdr->wep_key_len = 0; | 600 | txhdr->key_len = 0; |
599 | txhdr->frame_type = cpu_to_le32(skb_get_queue_mapping(skb) + 4); | 601 | txhdr->hw_queue = skb_get_queue_mapping(skb) + 4; |
600 | txhdr->magic4 = 0; | 602 | txhdr->tx_antenna = (info->antenna_sel_tx == 0) ? |
601 | txhdr->antenna = (info->antenna_sel_tx == 0) ? | ||
602 | 2 : info->antenna_sel_tx - 1; | 603 | 2 : info->antenna_sel_tx - 1; |
603 | txhdr->output_power = 0x7f; // HW Maximum | 604 | txhdr->output_power = 0x7f; // HW Maximum |
604 | txhdr->magic5 = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? | 605 | txhdr->cts_rate = (info->flags & IEEE80211_TX_CTL_NO_ACK) ? |
605 | 0 : ((rate > 0x3) ? cpu_to_le32(0x33) : cpu_to_le32(0x23)); | 606 | 0 : cts_rate; |
606 | if (padding) | 607 | if (padding) |
607 | txhdr->align[0] = padding; | 608 | txhdr->align[0] = padding; |
608 | 609 | ||
@@ -836,10 +837,21 @@ static int p54_start(struct ieee80211_hw *dev) | |||
836 | struct p54_common *priv = dev->priv; | 837 | struct p54_common *priv = dev->priv; |
837 | int err; | 838 | int err; |
838 | 839 | ||
840 | if (!priv->cached_vdcf) { | ||
841 | priv->cached_vdcf = kzalloc(sizeof(struct p54_tx_control_vdcf)+ | ||
842 | priv->tx_hdr_len + sizeof(struct p54_control_hdr), | ||
843 | GFP_KERNEL); | ||
844 | |||
845 | if (!priv->cached_vdcf) | ||
846 | return -ENOMEM; | ||
847 | } | ||
848 | |||
839 | err = priv->open(dev); | 849 | err = priv->open(dev); |
840 | if (!err) | 850 | if (!err) |
841 | priv->mode = IEEE80211_IF_TYPE_MNTR; | 851 | priv->mode = IEEE80211_IF_TYPE_MNTR; |
842 | 852 | ||
853 | p54_init_vdcf(dev); | ||
854 | |||
843 | return err; | 855 | return err; |
844 | } | 856 | } |
845 | 857 | ||
@@ -1019,15 +1031,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len) | |||
1019 | dev->extra_tx_headroom = sizeof(struct p54_control_hdr) + 4 + | 1031 | dev->extra_tx_headroom = sizeof(struct p54_control_hdr) + 4 + |
1020 | sizeof(struct p54_tx_control_allocdata); | 1032 | sizeof(struct p54_tx_control_allocdata); |
1021 | 1033 | ||
1022 | priv->cached_vdcf = kzalloc(sizeof(struct p54_tx_control_vdcf) + | ||
1023 | priv->tx_hdr_len + sizeof(struct p54_control_hdr), GFP_KERNEL); | ||
1024 | |||
1025 | if (!priv->cached_vdcf) { | ||
1026 | ieee80211_free_hw(dev); | ||
1027 | return NULL; | ||
1028 | } | ||
1029 | |||
1030 | p54_init_vdcf(dev); | ||
1031 | mutex_init(&priv->conf_mutex); | 1034 | mutex_init(&priv->conf_mutex); |
1032 | 1035 | ||
1033 | return dev; | 1036 | return dev; |
diff --git a/drivers/net/wireless/p54/p54common.h b/drivers/net/wireless/p54/p54common.h index 2245fcce92dc..8db6c0e8e540 100644 --- a/drivers/net/wireless/p54/p54common.h +++ b/drivers/net/wireless/p54/p54common.h | |||
@@ -183,16 +183,16 @@ struct p54_frame_sent_hdr { | |||
183 | 183 | ||
184 | struct p54_tx_control_allocdata { | 184 | struct p54_tx_control_allocdata { |
185 | u8 rateset[8]; | 185 | u8 rateset[8]; |
186 | u16 padding; | 186 | u8 unalloc0[2]; |
187 | u8 wep_key_present; | 187 | u8 key_type; |
188 | u8 wep_key_len; | 188 | u8 key_len; |
189 | u8 wep_key[16]; | 189 | u8 key[16]; |
190 | __le32 frame_type; | 190 | u8 hw_queue; |
191 | u32 padding2; | 191 | u8 unalloc1[9]; |
192 | __le16 magic4; | 192 | u8 tx_antenna; |
193 | u8 antenna; | ||
194 | u8 output_power; | 193 | u8 output_power; |
195 | __le32 magic5; | 194 | u8 cts_rate; |
195 | u8 unalloc2[3]; | ||
196 | u8 align[0]; | 196 | u8 align[0]; |
197 | } __attribute__ ((packed)); | 197 | } __attribute__ ((packed)); |
198 | 198 | ||
diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c index 815c095ef797..cbaca23a9453 100644 --- a/drivers/net/wireless/p54/p54usb.c +++ b/drivers/net/wireless/p54/p54usb.c | |||
@@ -109,7 +109,17 @@ static void p54u_rx_cb(struct urb *urb) | |||
109 | urb->context = skb; | 109 | urb->context = skb; |
110 | skb_queue_tail(&priv->rx_queue, skb); | 110 | skb_queue_tail(&priv->rx_queue, skb); |
111 | } else { | 111 | } else { |
112 | if (!priv->hw_type) | ||
113 | skb_push(skb, sizeof(struct net2280_tx_hdr)); | ||
114 | |||
115 | skb_reset_tail_pointer(skb); | ||
112 | skb_trim(skb, 0); | 116 | skb_trim(skb, 0); |
117 | if (urb->transfer_buffer != skb_tail_pointer(skb)) { | ||
118 | /* this should not happen */ | ||
119 | WARN_ON(1); | ||
120 | urb->transfer_buffer = skb_tail_pointer(skb); | ||
121 | } | ||
122 | |||
113 | skb_queue_tail(&priv->rx_queue, skb); | 123 | skb_queue_tail(&priv->rx_queue, skb); |
114 | } | 124 | } |
115 | 125 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h index a4a8c57004db..ff78e52ce43c 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h | |||
@@ -173,10 +173,10 @@ struct rxdone_entry_desc { | |||
173 | * frame transmission failed due to excessive retries. | 173 | * frame transmission failed due to excessive retries. |
174 | */ | 174 | */ |
175 | enum txdone_entry_desc_flags { | 175 | enum txdone_entry_desc_flags { |
176 | TXDONE_UNKNOWN = 1 << 0, | 176 | TXDONE_UNKNOWN, |
177 | TXDONE_SUCCESS = 1 << 1, | 177 | TXDONE_SUCCESS, |
178 | TXDONE_FAILURE = 1 << 2, | 178 | TXDONE_FAILURE, |
179 | TXDONE_EXCESSIVE_RETRY = 1 << 3, | 179 | TXDONE_EXCESSIVE_RETRY, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | /** | 182 | /** |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 8d76bb2e0312..2050227ea530 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -181,6 +181,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb) | |||
181 | * (Only indirectly by looking at the failed TX counters | 181 | * (Only indirectly by looking at the failed TX counters |
182 | * in the register). | 182 | * in the register). |
183 | */ | 183 | */ |
184 | txdesc.flags = 0; | ||
184 | if (!urb->status) | 185 | if (!urb->status) |
185 | __set_bit(TXDONE_UNKNOWN, &txdesc.flags); | 186 | __set_bit(TXDONE_UNKNOWN, &txdesc.flags); |
186 | else | 187 | else |
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index 57376fb993ed..ca5deb6244e6 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -40,6 +40,7 @@ static struct usb_device_id rtl8187_table[] __devinitdata = { | |||
40 | /* Netgear */ | 40 | /* Netgear */ |
41 | {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187}, | 41 | {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187}, |
42 | {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187}, | 42 | {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187}, |
43 | {USB_DEVICE(0x0846, 0x4260), .driver_info = DEVICE_RTL8187B}, | ||
43 | /* HP */ | 44 | /* HP */ |
44 | {USB_DEVICE(0x03f0, 0xca02), .driver_info = DEVICE_RTL8187}, | 45 | {USB_DEVICE(0x03f0, 0xca02), .driver_info = DEVICE_RTL8187}, |
45 | /* Sitecom */ | 46 | /* Sitecom */ |
diff --git a/drivers/of/device.c b/drivers/of/device.c index 8a1d93a2bb81..51e5214071da 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c | |||
@@ -57,6 +57,15 @@ static ssize_t devspec_show(struct device *dev, | |||
57 | return sprintf(buf, "%s\n", ofdev->node->full_name); | 57 | return sprintf(buf, "%s\n", ofdev->node->full_name); |
58 | } | 58 | } |
59 | 59 | ||
60 | static ssize_t name_show(struct device *dev, | ||
61 | struct device_attribute *attr, char *buf) | ||
62 | { | ||
63 | struct of_device *ofdev; | ||
64 | |||
65 | ofdev = to_of_device(dev); | ||
66 | return sprintf(buf, "%s\n", ofdev->node->name); | ||
67 | } | ||
68 | |||
60 | static ssize_t modalias_show(struct device *dev, | 69 | static ssize_t modalias_show(struct device *dev, |
61 | struct device_attribute *attr, char *buf) | 70 | struct device_attribute *attr, char *buf) |
62 | { | 71 | { |
@@ -71,6 +80,7 @@ static ssize_t modalias_show(struct device *dev, | |||
71 | 80 | ||
72 | struct device_attribute of_platform_device_attrs[] = { | 81 | struct device_attribute of_platform_device_attrs[] = { |
73 | __ATTR_RO(devspec), | 82 | __ATTR_RO(devspec), |
83 | __ATTR_RO(name), | ||
74 | __ATTR_RO(modalias), | 84 | __ATTR_RO(modalias), |
75 | __ATTR_NULL | 85 | __ATTR_NULL |
76 | }; | 86 | }; |
diff --git a/drivers/pci/hotplug/acpi_pcihp.c b/drivers/pci/hotplug/acpi_pcihp.c index 93e37f0666ab..e17ef54f0efc 100644 --- a/drivers/pci/hotplug/acpi_pcihp.c +++ b/drivers/pci/hotplug/acpi_pcihp.c | |||
@@ -382,7 +382,7 @@ EXPORT_SYMBOL_GPL(acpi_get_hp_params_from_firmware); | |||
382 | int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags) | 382 | int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags) |
383 | { | 383 | { |
384 | acpi_status status; | 384 | acpi_status status; |
385 | acpi_handle chandle, handle = DEVICE_ACPI_HANDLE(&(dev->dev)); | 385 | acpi_handle chandle, handle; |
386 | struct pci_dev *pdev = dev; | 386 | struct pci_dev *pdev = dev; |
387 | struct pci_bus *parent; | 387 | struct pci_bus *parent; |
388 | struct acpi_buffer string = { ACPI_ALLOCATE_BUFFER, NULL }; | 388 | struct acpi_buffer string = { ACPI_ALLOCATE_BUFFER, NULL }; |
@@ -399,10 +399,25 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags) | |||
399 | * Per PCI firmware specification, we should run the ACPI _OSC | 399 | * Per PCI firmware specification, we should run the ACPI _OSC |
400 | * method to get control of hotplug hardware before using it. If | 400 | * method to get control of hotplug hardware before using it. If |
401 | * an _OSC is missing, we look for an OSHP to do the same thing. | 401 | * an _OSC is missing, we look for an OSHP to do the same thing. |
402 | * To handle different BIOS behavior, we look for _OSC and OSHP | 402 | * To handle different BIOS behavior, we look for _OSC on a root |
403 | * within the scope of the hotplug controller and its parents, | 403 | * bridge preferentially (according to PCI fw spec). Later for |
404 | * OSHP within the scope of the hotplug controller and its parents, | ||
404 | * upto the host bridge under which this controller exists. | 405 | * upto the host bridge under which this controller exists. |
405 | */ | 406 | */ |
407 | handle = acpi_find_root_bridge_handle(pdev); | ||
408 | if (handle) { | ||
409 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &string); | ||
410 | dbg("Trying to get hotplug control for %s\n", | ||
411 | (char *)string.pointer); | ||
412 | status = pci_osc_control_set(handle, flags); | ||
413 | if (ACPI_SUCCESS(status)) | ||
414 | goto got_one; | ||
415 | kfree(string.pointer); | ||
416 | string = (struct acpi_buffer){ ACPI_ALLOCATE_BUFFER, NULL }; | ||
417 | } | ||
418 | |||
419 | pdev = dev; | ||
420 | handle = DEVICE_ACPI_HANDLE(&dev->dev); | ||
406 | while (!handle) { | 421 | while (!handle) { |
407 | /* | 422 | /* |
408 | * This hotplug controller was not listed in the ACPI name | 423 | * This hotplug controller was not listed in the ACPI name |
@@ -427,15 +442,9 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags) | |||
427 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &string); | 442 | acpi_get_name(handle, ACPI_FULL_PATHNAME, &string); |
428 | dbg("Trying to get hotplug control for %s \n", | 443 | dbg("Trying to get hotplug control for %s \n", |
429 | (char *)string.pointer); | 444 | (char *)string.pointer); |
430 | status = pci_osc_control_set(handle, flags); | 445 | status = acpi_run_oshp(handle); |
431 | if (status == AE_NOT_FOUND) | 446 | if (ACPI_SUCCESS(status)) |
432 | status = acpi_run_oshp(handle); | 447 | goto got_one; |
433 | if (ACPI_SUCCESS(status)) { | ||
434 | dbg("Gained control for hotplug HW for pci %s (%s)\n", | ||
435 | pci_name(dev), (char *)string.pointer); | ||
436 | kfree(string.pointer); | ||
437 | return 0; | ||
438 | } | ||
439 | if (acpi_root_bridge(handle)) | 448 | if (acpi_root_bridge(handle)) |
440 | break; | 449 | break; |
441 | chandle = handle; | 450 | chandle = handle; |
@@ -449,6 +458,11 @@ int acpi_get_hp_hw_control_from_firmware(struct pci_dev *dev, u32 flags) | |||
449 | 458 | ||
450 | kfree(string.pointer); | 459 | kfree(string.pointer); |
451 | return -ENODEV; | 460 | return -ENODEV; |
461 | got_one: | ||
462 | dbg("Gained control for hotplug HW for pci %s (%s)\n", pci_name(dev), | ||
463 | (char *)string.pointer); | ||
464 | kfree(string.pointer); | ||
465 | return 0; | ||
452 | } | 466 | } |
453 | EXPORT_SYMBOL(acpi_get_hp_hw_control_from_firmware); | 467 | EXPORT_SYMBOL(acpi_get_hp_hw_control_from_firmware); |
454 | 468 | ||
diff --git a/drivers/pci/pcie/aer/aerdrv_acpi.c b/drivers/pci/pcie/aer/aerdrv_acpi.c index 30f581b8791f..6dd7b13e9808 100644 --- a/drivers/pci/pcie/aer/aerdrv_acpi.c +++ b/drivers/pci/pcie/aer/aerdrv_acpi.c | |||
@@ -36,12 +36,7 @@ int aer_osc_setup(struct pcie_device *pciedev) | |||
36 | if (acpi_pci_disabled) | 36 | if (acpi_pci_disabled) |
37 | return -1; | 37 | return -1; |
38 | 38 | ||
39 | /* Find root host bridge */ | 39 | handle = acpi_find_root_bridge_handle(pdev); |
40 | while (pdev->bus->self) | ||
41 | pdev = pdev->bus->self; | ||
42 | handle = acpi_get_pci_rootbridge_handle( | ||
43 | pci_domain_nr(pdev->bus), pdev->bus->number); | ||
44 | |||
45 | if (handle) { | 40 | if (handle) { |
46 | pcie_osc_support_set(OSC_EXT_PCI_CONFIG_SUPPORT); | 41 | pcie_osc_support_set(OSC_EXT_PCI_CONFIG_SUPPORT); |
47 | status = pci_osc_control_set(handle, | 42 | status = pci_osc_control_set(handle, |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index a04498d390c8..cce2f4cb1fbf 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -383,6 +383,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
383 | res->start = base; | 383 | res->start = base; |
384 | if (!res->end) | 384 | if (!res->end) |
385 | res->end = limit + 0xfff; | 385 | res->end = limit + 0xfff; |
386 | printk(KERN_INFO "PCI: bridge %s io port: [%llx, %llx]\n", pci_name(dev), res->start, res->end); | ||
386 | } | 387 | } |
387 | 388 | ||
388 | res = child->resource[1]; | 389 | res = child->resource[1]; |
@@ -394,6 +395,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
394 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; | 395 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM; |
395 | res->start = base; | 396 | res->start = base; |
396 | res->end = limit + 0xfffff; | 397 | res->end = limit + 0xfffff; |
398 | printk(KERN_INFO "PCI: bridge %s 32bit mmio: [%llx, %llx]\n", pci_name(dev), res->start, res->end); | ||
397 | } | 399 | } |
398 | 400 | ||
399 | res = child->resource[2]; | 401 | res = child->resource[2]; |
@@ -429,6 +431,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child) | |||
429 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; | 431 | res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH; |
430 | res->start = base; | 432 | res->start = base; |
431 | res->end = limit + 0xfffff; | 433 | res->end = limit + 0xfffff; |
434 | printk(KERN_INFO "PCI: bridge %s %sbit mmio pref: [%llx, %llx]\n", pci_name(dev), (res->flags & PCI_PREF_RANGE_TYPE_64)?"64":"32",res->start, res->end); | ||
432 | } | 435 | } |
433 | } | 436 | } |
434 | 437 | ||
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 827c0a520e2b..82634a2f1b1d 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -530,6 +530,36 @@ void __ref pci_bus_assign_resources(struct pci_bus *bus) | |||
530 | } | 530 | } |
531 | EXPORT_SYMBOL(pci_bus_assign_resources); | 531 | EXPORT_SYMBOL(pci_bus_assign_resources); |
532 | 532 | ||
533 | static void pci_bus_dump_res(struct pci_bus *bus) | ||
534 | { | ||
535 | int i; | ||
536 | |||
537 | for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) { | ||
538 | struct resource *res = bus->resource[i]; | ||
539 | if (!res) | ||
540 | continue; | ||
541 | |||
542 | printk(KERN_INFO "bus: %02x index %x %s: [%llx, %llx]\n", bus->number, i, (res->flags & IORESOURCE_IO)? "io port":"mmio", res->start, res->end); | ||
543 | } | ||
544 | } | ||
545 | |||
546 | static void pci_bus_dump_resources(struct pci_bus *bus) | ||
547 | { | ||
548 | struct pci_bus *b; | ||
549 | struct pci_dev *dev; | ||
550 | |||
551 | |||
552 | pci_bus_dump_res(bus); | ||
553 | |||
554 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
555 | b = dev->subordinate; | ||
556 | if (!b) | ||
557 | continue; | ||
558 | |||
559 | pci_bus_dump_resources(b); | ||
560 | } | ||
561 | } | ||
562 | |||
533 | void __init | 563 | void __init |
534 | pci_assign_unassigned_resources(void) | 564 | pci_assign_unassigned_resources(void) |
535 | { | 565 | { |
@@ -545,4 +575,9 @@ pci_assign_unassigned_resources(void) | |||
545 | pci_bus_assign_resources(bus); | 575 | pci_bus_assign_resources(bus); |
546 | pci_enable_bridges(bus); | 576 | pci_enable_bridges(bus); |
547 | } | 577 | } |
578 | |||
579 | /* dump the resource on buses */ | ||
580 | list_for_each_entry(bus, &pci_root_buses, node) { | ||
581 | pci_bus_dump_resources(bus); | ||
582 | } | ||
548 | } | 583 | } |
diff --git a/drivers/pcmcia/pxa2xx_palmtx.c b/drivers/pcmcia/pxa2xx_palmtx.c index a8771ffc61e8..e07b5c51ec5b 100644 --- a/drivers/pcmcia/pxa2xx_palmtx.c +++ b/drivers/pcmcia/pxa2xx_palmtx.c | |||
@@ -23,12 +23,57 @@ | |||
23 | 23 | ||
24 | static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | 24 | static int palmtx_pcmcia_hw_init(struct soc_pcmcia_socket *skt) |
25 | { | 25 | { |
26 | skt->irq = IRQ_GPIO(GPIO_NR_PALMTX_PCMCIA_READY); | 26 | int ret; |
27 | |||
28 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER1, "PCMCIA PWR1"); | ||
29 | if (ret) | ||
30 | goto err1; | ||
31 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER1, 0); | ||
32 | if (ret) | ||
33 | goto err2; | ||
34 | |||
35 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_POWER2, "PCMCIA PWR2"); | ||
36 | if (ret) | ||
37 | goto err2; | ||
38 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_POWER2, 0); | ||
39 | if (ret) | ||
40 | goto err3; | ||
41 | |||
42 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_RESET, "PCMCIA RST"); | ||
43 | if (ret) | ||
44 | goto err3; | ||
45 | ret = gpio_direction_output(GPIO_NR_PALMTX_PCMCIA_RESET, 1); | ||
46 | if (ret) | ||
47 | goto err4; | ||
48 | |||
49 | ret = gpio_request(GPIO_NR_PALMTX_PCMCIA_READY, "PCMCIA RDY"); | ||
50 | if (ret) | ||
51 | goto err4; | ||
52 | ret = gpio_direction_input(GPIO_NR_PALMTX_PCMCIA_READY); | ||
53 | if (ret) | ||
54 | goto err5; | ||
55 | |||
56 | skt->irq = gpio_to_irq(GPIO_NR_PALMTX_PCMCIA_READY); | ||
27 | return 0; | 57 | return 0; |
58 | |||
59 | err5: | ||
60 | gpio_free(GPIO_NR_PALMTX_PCMCIA_READY); | ||
61 | err4: | ||
62 | gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET); | ||
63 | err3: | ||
64 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2); | ||
65 | err2: | ||
66 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1); | ||
67 | err1: | ||
68 | return ret; | ||
28 | } | 69 | } |
29 | 70 | ||
30 | static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | 71 | static void palmtx_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) |
31 | { | 72 | { |
73 | gpio_free(GPIO_NR_PALMTX_PCMCIA_READY); | ||
74 | gpio_free(GPIO_NR_PALMTX_PCMCIA_RESET); | ||
75 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER2); | ||
76 | gpio_free(GPIO_NR_PALMTX_PCMCIA_POWER1); | ||
32 | } | 77 | } |
33 | 78 | ||
34 | static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | 79 | static void palmtx_pcmcia_socket_state(struct soc_pcmcia_socket *skt, |
@@ -109,7 +154,7 @@ static void __exit palmtx_pcmcia_exit(void) | |||
109 | platform_device_unregister(palmtx_pcmcia_device); | 154 | platform_device_unregister(palmtx_pcmcia_device); |
110 | } | 155 | } |
111 | 156 | ||
112 | fs_initcall(palmtx_pcmcia_init); | 157 | module_init(palmtx_pcmcia_init); |
113 | module_exit(palmtx_pcmcia_exit); | 158 | module_exit(palmtx_pcmcia_exit); |
114 | 159 | ||
115 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); | 160 | MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>"); |
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 90ab73825401..9a9755c92fad 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig | |||
@@ -561,7 +561,7 @@ config RTC_DRV_AT91SAM9_GPBR | |||
561 | 561 | ||
562 | config RTC_DRV_BFIN | 562 | config RTC_DRV_BFIN |
563 | tristate "Blackfin On-Chip RTC" | 563 | tristate "Blackfin On-Chip RTC" |
564 | depends on BLACKFIN | 564 | depends on BLACKFIN && !BF561 |
565 | help | 565 | help |
566 | If you say yes here you will get support for the | 566 | If you say yes here you will get support for the |
567 | Blackfin On-Chip Real Time Clock. | 567 | Blackfin On-Chip Real Time Clock. |
diff --git a/drivers/rtc/rtc-bfin.c b/drivers/rtc/rtc-bfin.c index a1af4c27939b..34439ce3967e 100644 --- a/drivers/rtc/rtc-bfin.c +++ b/drivers/rtc/rtc-bfin.c | |||
@@ -218,26 +218,6 @@ static irqreturn_t bfin_rtc_interrupt(int irq, void *dev_id) | |||
218 | return IRQ_NONE; | 218 | return IRQ_NONE; |
219 | } | 219 | } |
220 | 220 | ||
221 | static int bfin_rtc_open(struct device *dev) | ||
222 | { | ||
223 | int ret; | ||
224 | |||
225 | dev_dbg_stamp(dev); | ||
226 | |||
227 | ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, to_platform_device(dev)->name, dev); | ||
228 | if (!ret) | ||
229 | bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE); | ||
230 | |||
231 | return ret; | ||
232 | } | ||
233 | |||
234 | static void bfin_rtc_release(struct device *dev) | ||
235 | { | ||
236 | dev_dbg_stamp(dev); | ||
237 | bfin_rtc_reset(dev, 0); | ||
238 | free_irq(IRQ_RTC, dev); | ||
239 | } | ||
240 | |||
241 | static void bfin_rtc_int_set(u16 rtc_int) | 221 | static void bfin_rtc_int_set(u16 rtc_int) |
242 | { | 222 | { |
243 | bfin_write_RTC_ISTAT(rtc_int); | 223 | bfin_write_RTC_ISTAT(rtc_int); |
@@ -370,8 +350,6 @@ static int bfin_rtc_proc(struct device *dev, struct seq_file *seq) | |||
370 | } | 350 | } |
371 | 351 | ||
372 | static struct rtc_class_ops bfin_rtc_ops = { | 352 | static struct rtc_class_ops bfin_rtc_ops = { |
373 | .open = bfin_rtc_open, | ||
374 | .release = bfin_rtc_release, | ||
375 | .ioctl = bfin_rtc_ioctl, | 353 | .ioctl = bfin_rtc_ioctl, |
376 | .read_time = bfin_rtc_read_time, | 354 | .read_time = bfin_rtc_read_time, |
377 | .set_time = bfin_rtc_set_time, | 355 | .set_time = bfin_rtc_set_time, |
@@ -383,29 +361,44 @@ static struct rtc_class_ops bfin_rtc_ops = { | |||
383 | static int __devinit bfin_rtc_probe(struct platform_device *pdev) | 361 | static int __devinit bfin_rtc_probe(struct platform_device *pdev) |
384 | { | 362 | { |
385 | struct bfin_rtc *rtc; | 363 | struct bfin_rtc *rtc; |
364 | struct device *dev = &pdev->dev; | ||
386 | int ret = 0; | 365 | int ret = 0; |
366 | unsigned long timeout; | ||
387 | 367 | ||
388 | dev_dbg_stamp(&pdev->dev); | 368 | dev_dbg_stamp(dev); |
389 | 369 | ||
370 | /* Allocate memory for our RTC struct */ | ||
390 | rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); | 371 | rtc = kzalloc(sizeof(*rtc), GFP_KERNEL); |
391 | if (unlikely(!rtc)) | 372 | if (unlikely(!rtc)) |
392 | return -ENOMEM; | 373 | return -ENOMEM; |
374 | platform_set_drvdata(pdev, rtc); | ||
375 | device_init_wakeup(dev, 1); | ||
393 | 376 | ||
394 | rtc->rtc_dev = rtc_device_register(pdev->name, &pdev->dev, &bfin_rtc_ops, THIS_MODULE); | 377 | /* Grab the IRQ and init the hardware */ |
395 | if (IS_ERR(rtc)) { | 378 | ret = request_irq(IRQ_RTC, bfin_rtc_interrupt, IRQF_SHARED, pdev->name, dev); |
396 | ret = PTR_ERR(rtc->rtc_dev); | 379 | if (unlikely(ret)) |
397 | goto err; | 380 | goto err; |
398 | } | 381 | /* sometimes the bootloader touched things, but the write complete was not |
399 | 382 | * enabled, so let's just do a quick timeout here since the IRQ will not fire ... | |
400 | /* see comment at top of file about stopwatch/PIE */ | 383 | */ |
384 | timeout = jiffies + HZ; | ||
385 | while (bfin_read_RTC_ISTAT() & RTC_ISTAT_WRITE_PENDING) | ||
386 | if (time_after(jiffies, timeout)) | ||
387 | break; | ||
388 | bfin_rtc_reset(dev, RTC_ISTAT_WRITE_COMPLETE); | ||
401 | bfin_write_RTC_SWCNT(0); | 389 | bfin_write_RTC_SWCNT(0); |
402 | 390 | ||
403 | platform_set_drvdata(pdev, rtc); | 391 | /* Register our RTC with the RTC framework */ |
404 | 392 | rtc->rtc_dev = rtc_device_register(pdev->name, dev, &bfin_rtc_ops, THIS_MODULE); | |
405 | device_init_wakeup(&pdev->dev, 1); | 393 | if (unlikely(IS_ERR(rtc))) { |
394 | ret = PTR_ERR(rtc->rtc_dev); | ||
395 | goto err_irq; | ||
396 | } | ||
406 | 397 | ||
407 | return 0; | 398 | return 0; |
408 | 399 | ||
400 | err_irq: | ||
401 | free_irq(IRQ_RTC, dev); | ||
409 | err: | 402 | err: |
410 | kfree(rtc); | 403 | kfree(rtc); |
411 | return ret; | 404 | return ret; |
@@ -414,7 +407,10 @@ static int __devinit bfin_rtc_probe(struct platform_device *pdev) | |||
414 | static int __devexit bfin_rtc_remove(struct platform_device *pdev) | 407 | static int __devexit bfin_rtc_remove(struct platform_device *pdev) |
415 | { | 408 | { |
416 | struct bfin_rtc *rtc = platform_get_drvdata(pdev); | 409 | struct bfin_rtc *rtc = platform_get_drvdata(pdev); |
410 | struct device *dev = &pdev->dev; | ||
417 | 411 | ||
412 | bfin_rtc_reset(dev, 0); | ||
413 | free_irq(IRQ_RTC, dev); | ||
418 | rtc_device_unregister(rtc->rtc_dev); | 414 | rtc_device_unregister(rtc->rtc_dev); |
419 | platform_set_drvdata(pdev, NULL); | 415 | platform_set_drvdata(pdev, NULL); |
420 | kfree(rtc); | 416 | kfree(rtc); |
diff --git a/drivers/rtc/rtc-dev.c b/drivers/rtc/rtc-dev.c index 35dcc06eb3e2..f118252f3a9f 100644 --- a/drivers/rtc/rtc-dev.c +++ b/drivers/rtc/rtc-dev.c | |||
@@ -403,11 +403,14 @@ static long rtc_dev_ioctl(struct file *file, | |||
403 | 403 | ||
404 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL | 404 | #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL |
405 | case RTC_UIE_OFF: | 405 | case RTC_UIE_OFF: |
406 | mutex_unlock(&rtc->ops_lock); | ||
406 | clear_uie(rtc); | 407 | clear_uie(rtc); |
407 | break; | 408 | return 0; |
408 | 409 | ||
409 | case RTC_UIE_ON: | 410 | case RTC_UIE_ON: |
411 | mutex_unlock(&rtc->ops_lock); | ||
410 | err = set_uie(rtc); | 412 | err = set_uie(rtc); |
413 | return err; | ||
411 | #endif | 414 | #endif |
412 | default: | 415 | default: |
413 | err = -ENOTTY; | 416 | err = -ENOTTY; |
diff --git a/drivers/rtc/rtc-ds1374.c b/drivers/rtc/rtc-ds1374.c index 640acd20fdde..a150418fba76 100644 --- a/drivers/rtc/rtc-ds1374.c +++ b/drivers/rtc/rtc-ds1374.c | |||
@@ -173,7 +173,7 @@ static int ds1374_read_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
173 | int cr, sr; | 173 | int cr, sr; |
174 | int ret = 0; | 174 | int ret = 0; |
175 | 175 | ||
176 | if (client->irq < 0) | 176 | if (client->irq <= 0) |
177 | return -EINVAL; | 177 | return -EINVAL; |
178 | 178 | ||
179 | mutex_lock(&ds1374->mutex); | 179 | mutex_lock(&ds1374->mutex); |
@@ -212,7 +212,7 @@ static int ds1374_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) | |||
212 | int cr; | 212 | int cr; |
213 | int ret = 0; | 213 | int ret = 0; |
214 | 214 | ||
215 | if (client->irq < 0) | 215 | if (client->irq <= 0) |
216 | return -EINVAL; | 216 | return -EINVAL; |
217 | 217 | ||
218 | ret = ds1374_read_time(dev, &now); | 218 | ret = ds1374_read_time(dev, &now); |
@@ -381,7 +381,7 @@ static int ds1374_probe(struct i2c_client *client, | |||
381 | if (ret) | 381 | if (ret) |
382 | goto out_free; | 382 | goto out_free; |
383 | 383 | ||
384 | if (client->irq >= 0) { | 384 | if (client->irq > 0) { |
385 | ret = request_irq(client->irq, ds1374_irq, 0, | 385 | ret = request_irq(client->irq, ds1374_irq, 0, |
386 | "ds1374", client); | 386 | "ds1374", client); |
387 | if (ret) { | 387 | if (ret) { |
@@ -401,7 +401,7 @@ static int ds1374_probe(struct i2c_client *client, | |||
401 | return 0; | 401 | return 0; |
402 | 402 | ||
403 | out_irq: | 403 | out_irq: |
404 | if (client->irq >= 0) | 404 | if (client->irq > 0) |
405 | free_irq(client->irq, client); | 405 | free_irq(client->irq, client); |
406 | 406 | ||
407 | out_free: | 407 | out_free: |
@@ -414,7 +414,7 @@ static int __devexit ds1374_remove(struct i2c_client *client) | |||
414 | { | 414 | { |
415 | struct ds1374 *ds1374 = i2c_get_clientdata(client); | 415 | struct ds1374 *ds1374 = i2c_get_clientdata(client); |
416 | 416 | ||
417 | if (client->irq >= 0) { | 417 | if (client->irq > 0) { |
418 | mutex_lock(&ds1374->mutex); | 418 | mutex_lock(&ds1374->mutex); |
419 | ds1374->exiting = 1; | 419 | ds1374->exiting = 1; |
420 | mutex_unlock(&ds1374->mutex); | 420 | mutex_unlock(&ds1374->mutex); |
diff --git a/drivers/rtc/rtc-max6902.c b/drivers/rtc/rtc-max6902.c index 12f0310ae89c..78b2551fb19d 100644 --- a/drivers/rtc/rtc-max6902.c +++ b/drivers/rtc/rtc-max6902.c | |||
@@ -20,8 +20,6 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/version.h> | ||
24 | |||
25 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
26 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
27 | #include <linux/init.h> | 25 | #include <linux/init.h> |
diff --git a/drivers/rtc/rtc-r9701.c b/drivers/rtc/rtc-r9701.c index b35f9bfa2af4..395985b339c9 100644 --- a/drivers/rtc/rtc-r9701.c +++ b/drivers/rtc/rtc-r9701.c | |||
@@ -14,7 +14,6 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/version.h> | ||
18 | #include <linux/kernel.h> | 17 | #include <linux/kernel.h> |
19 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
20 | #include <linux/device.h> | 19 | #include <linux/device.h> |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 1b6c52ef7339..acb78017e7d0 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
@@ -2333,13 +2333,11 @@ int dasd_generic_notify(struct ccw_device *cdev, int event) | |||
2333 | { | 2333 | { |
2334 | struct dasd_device *device; | 2334 | struct dasd_device *device; |
2335 | struct dasd_ccw_req *cqr; | 2335 | struct dasd_ccw_req *cqr; |
2336 | unsigned long flags; | ||
2337 | int ret; | 2336 | int ret; |
2338 | 2337 | ||
2339 | device = dasd_device_from_cdev(cdev); | 2338 | device = dasd_device_from_cdev_locked(cdev); |
2340 | if (IS_ERR(device)) | 2339 | if (IS_ERR(device)) |
2341 | return 0; | 2340 | return 0; |
2342 | spin_lock_irqsave(get_ccwdev_lock(cdev), flags); | ||
2343 | ret = 0; | 2341 | ret = 0; |
2344 | switch (event) { | 2342 | switch (event) { |
2345 | case CIO_GONE: | 2343 | case CIO_GONE: |
@@ -2369,7 +2367,6 @@ int dasd_generic_notify(struct ccw_device *cdev, int event) | |||
2369 | ret = 1; | 2367 | ret = 1; |
2370 | break; | 2368 | break; |
2371 | } | 2369 | } |
2372 | spin_unlock_irqrestore(get_ccwdev_lock(cdev), flags); | ||
2373 | dasd_put_device(device); | 2370 | dasd_put_device(device); |
2374 | return ret; | 2371 | return ret; |
2375 | } | 2372 | } |
diff --git a/drivers/s390/block/dasd_eckd.h b/drivers/s390/block/dasd_eckd.h index 4bf0aa5112c1..2476f87d21d0 100644 --- a/drivers/s390/block/dasd_eckd.h +++ b/drivers/s390/block/dasd_eckd.h | |||
@@ -308,7 +308,7 @@ struct dasd_psf_prssd_data { | |||
308 | unsigned char flags; | 308 | unsigned char flags; |
309 | unsigned char reserved[4]; | 309 | unsigned char reserved[4]; |
310 | unsigned char suborder; | 310 | unsigned char suborder; |
311 | unsigned char varies[9]; | 311 | unsigned char varies[5]; |
312 | } __attribute__ ((packed)); | 312 | } __attribute__ ((packed)); |
313 | 313 | ||
314 | /* | 314 | /* |
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index 29da4413ad43..bf512ac75b9e 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/poll.h> | 16 | #include <linux/poll.h> |
17 | #include <linux/mutex.h> | 17 | #include <linux/mutex.h> |
18 | #include <linux/smp_lock.h> | 18 | #include <linux/smp_lock.h> |
19 | #include <linux/err.h> | ||
19 | 20 | ||
20 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
21 | #include <asm/atomic.h> | 22 | #include <asm/atomic.h> |
@@ -457,7 +458,7 @@ int dasd_eer_enable(struct dasd_device *device) | |||
457 | 458 | ||
458 | cqr = dasd_kmalloc_request("ECKD", 1 /* SNSS */, | 459 | cqr = dasd_kmalloc_request("ECKD", 1 /* SNSS */, |
459 | SNSS_DATA_SIZE, device); | 460 | SNSS_DATA_SIZE, device); |
460 | if (!cqr) | 461 | if (IS_ERR(cqr)) |
461 | return -ENOMEM; | 462 | return -ENOMEM; |
462 | 463 | ||
463 | cqr->startdev = device; | 464 | cqr->startdev = device; |
diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index 01fcdd91b846..db85f1fb131e 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c | |||
@@ -384,6 +384,10 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char | |||
384 | * get minor, add to list | 384 | * get minor, add to list |
385 | */ | 385 | */ |
386 | down_write(&dcssblk_devices_sem); | 386 | down_write(&dcssblk_devices_sem); |
387 | if (dcssblk_get_segment_by_name(local_buf)) { | ||
388 | rc = -EEXIST; | ||
389 | goto release_gd; | ||
390 | } | ||
387 | rc = dcssblk_assign_free_minor(dev_info); | 391 | rc = dcssblk_assign_free_minor(dev_info); |
388 | if (rc) { | 392 | if (rc) { |
389 | up_write(&dcssblk_devices_sem); | 393 | up_write(&dcssblk_devices_sem); |
diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c index 687720b552d1..be0ce2215c8d 100644 --- a/drivers/s390/char/tape_char.c +++ b/drivers/s390/char/tape_char.c | |||
@@ -109,7 +109,7 @@ tapechar_check_idalbuffer(struct tape_device *device, size_t block_size) | |||
109 | 109 | ||
110 | /* The current idal buffer is not correct. Allocate a new one. */ | 110 | /* The current idal buffer is not correct. Allocate a new one. */ |
111 | new = idal_buffer_alloc(block_size, 0); | 111 | new = idal_buffer_alloc(block_size, 0); |
112 | if (new == NULL) | 112 | if (IS_ERR(new)) |
113 | return -ENOMEM; | 113 | return -ENOMEM; |
114 | 114 | ||
115 | if (device->char_data.idal_buf != NULL) | 115 | if (device->char_data.idal_buf != NULL) |
diff --git a/drivers/s390/char/tape_std.c b/drivers/s390/char/tape_std.c index 2a1af4e60be0..cc8fd781ee22 100644 --- a/drivers/s390/char/tape_std.c +++ b/drivers/s390/char/tape_std.c | |||
@@ -248,7 +248,7 @@ tape_std_mtsetblk(struct tape_device *device, int count) | |||
248 | 248 | ||
249 | /* Allocate a new idal buffer. */ | 249 | /* Allocate a new idal buffer. */ |
250 | new = idal_buffer_alloc(count, 0); | 250 | new = idal_buffer_alloc(count, 0); |
251 | if (new == NULL) | 251 | if (IS_ERR(new)) |
252 | return -ENOMEM; | 252 | return -ENOMEM; |
253 | if (device->char_data.idal_buf != NULL) | 253 | if (device->char_data.idal_buf != NULL) |
254 | idal_buffer_free(device->char_data.idal_buf); | 254 | idal_buffer_free(device->char_data.idal_buf); |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index 26a930e832bd..e0ce65fca4e7 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -112,8 +112,10 @@ ccwgroup_release (struct device *dev) | |||
112 | gdev = to_ccwgroupdev(dev); | 112 | gdev = to_ccwgroupdev(dev); |
113 | 113 | ||
114 | for (i = 0; i < gdev->count; i++) { | 114 | for (i = 0; i < gdev->count; i++) { |
115 | dev_set_drvdata(&gdev->cdev[i]->dev, NULL); | 115 | if (gdev->cdev[i]) { |
116 | put_device(&gdev->cdev[i]->dev); | 116 | dev_set_drvdata(&gdev->cdev[i]->dev, NULL); |
117 | put_device(&gdev->cdev[i]->dev); | ||
118 | } | ||
117 | } | 119 | } |
118 | kfree(gdev); | 120 | kfree(gdev); |
119 | } | 121 | } |
@@ -221,6 +223,13 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id, | |||
221 | atomic_set(&gdev->onoff, 0); | 223 | atomic_set(&gdev->onoff, 0); |
222 | mutex_init(&gdev->reg_mutex); | 224 | mutex_init(&gdev->reg_mutex); |
223 | mutex_lock(&gdev->reg_mutex); | 225 | mutex_lock(&gdev->reg_mutex); |
226 | gdev->creator_id = creator_id; | ||
227 | gdev->count = num_devices; | ||
228 | gdev->dev.bus = &ccwgroup_bus_type; | ||
229 | gdev->dev.parent = root; | ||
230 | gdev->dev.release = ccwgroup_release; | ||
231 | device_initialize(&gdev->dev); | ||
232 | |||
224 | curr_buf = buf; | 233 | curr_buf = buf; |
225 | for (i = 0; i < num_devices && curr_buf; i++) { | 234 | for (i = 0; i < num_devices && curr_buf; i++) { |
226 | rc = __get_next_bus_id(&curr_buf, tmp_bus_id); | 235 | rc = __get_next_bus_id(&curr_buf, tmp_bus_id); |
@@ -258,16 +267,11 @@ int ccwgroup_create_from_string(struct device *root, unsigned int creator_id, | |||
258 | rc = -EINVAL; | 267 | rc = -EINVAL; |
259 | goto error; | 268 | goto error; |
260 | } | 269 | } |
261 | gdev->creator_id = creator_id; | ||
262 | gdev->count = num_devices; | ||
263 | gdev->dev.bus = &ccwgroup_bus_type; | ||
264 | gdev->dev.parent = root; | ||
265 | gdev->dev.release = ccwgroup_release; | ||
266 | 270 | ||
267 | snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s", | 271 | snprintf (gdev->dev.bus_id, BUS_ID_SIZE, "%s", |
268 | gdev->cdev[0]->dev.bus_id); | 272 | gdev->cdev[0]->dev.bus_id); |
269 | 273 | ||
270 | rc = device_register(&gdev->dev); | 274 | rc = device_add(&gdev->dev); |
271 | if (rc) | 275 | if (rc) |
272 | goto error; | 276 | goto error; |
273 | get_device(&gdev->dev); | 277 | get_device(&gdev->dev); |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 46c021d880dc..51489eff6b0b 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -477,7 +477,6 @@ void css_schedule_eval_all(void) | |||
477 | 477 | ||
478 | void css_wait_for_slow_path(void) | 478 | void css_wait_for_slow_path(void) |
479 | { | 479 | { |
480 | flush_workqueue(ccw_device_notify_work); | ||
481 | flush_workqueue(slow_path_wq); | 480 | flush_workqueue(slow_path_wq); |
482 | } | 481 | } |
483 | 482 | ||
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index e818d0c54c09..28221030b886 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -150,7 +150,6 @@ static struct css_driver io_subchannel_driver = { | |||
150 | }; | 150 | }; |
151 | 151 | ||
152 | struct workqueue_struct *ccw_device_work; | 152 | struct workqueue_struct *ccw_device_work; |
153 | struct workqueue_struct *ccw_device_notify_work; | ||
154 | wait_queue_head_t ccw_device_init_wq; | 153 | wait_queue_head_t ccw_device_init_wq; |
155 | atomic_t ccw_device_init_count; | 154 | atomic_t ccw_device_init_count; |
156 | 155 | ||
@@ -168,11 +167,6 @@ init_ccw_bus_type (void) | |||
168 | ccw_device_work = create_singlethread_workqueue("cio"); | 167 | ccw_device_work = create_singlethread_workqueue("cio"); |
169 | if (!ccw_device_work) | 168 | if (!ccw_device_work) |
170 | return -ENOMEM; /* FIXME: better errno ? */ | 169 | return -ENOMEM; /* FIXME: better errno ? */ |
171 | ccw_device_notify_work = create_singlethread_workqueue("cio_notify"); | ||
172 | if (!ccw_device_notify_work) { | ||
173 | ret = -ENOMEM; /* FIXME: better errno ? */ | ||
174 | goto out_err; | ||
175 | } | ||
176 | slow_path_wq = create_singlethread_workqueue("kslowcrw"); | 170 | slow_path_wq = create_singlethread_workqueue("kslowcrw"); |
177 | if (!slow_path_wq) { | 171 | if (!slow_path_wq) { |
178 | ret = -ENOMEM; /* FIXME: better errno ? */ | 172 | ret = -ENOMEM; /* FIXME: better errno ? */ |
@@ -192,8 +186,6 @@ init_ccw_bus_type (void) | |||
192 | out_err: | 186 | out_err: |
193 | if (ccw_device_work) | 187 | if (ccw_device_work) |
194 | destroy_workqueue(ccw_device_work); | 188 | destroy_workqueue(ccw_device_work); |
195 | if (ccw_device_notify_work) | ||
196 | destroy_workqueue(ccw_device_notify_work); | ||
197 | if (slow_path_wq) | 189 | if (slow_path_wq) |
198 | destroy_workqueue(slow_path_wq); | 190 | destroy_workqueue(slow_path_wq); |
199 | return ret; | 191 | return ret; |
@@ -204,7 +196,6 @@ cleanup_ccw_bus_type (void) | |||
204 | { | 196 | { |
205 | css_driver_unregister(&io_subchannel_driver); | 197 | css_driver_unregister(&io_subchannel_driver); |
206 | bus_unregister(&ccw_bus_type); | 198 | bus_unregister(&ccw_bus_type); |
207 | destroy_workqueue(ccw_device_notify_work); | ||
208 | destroy_workqueue(ccw_device_work); | 199 | destroy_workqueue(ccw_device_work); |
209 | } | 200 | } |
210 | 201 | ||
@@ -1496,11 +1487,22 @@ static void device_set_disconnected(struct ccw_device *cdev) | |||
1496 | ccw_device_schedule_recovery(); | 1487 | ccw_device_schedule_recovery(); |
1497 | } | 1488 | } |
1498 | 1489 | ||
1490 | void ccw_device_set_notoper(struct ccw_device *cdev) | ||
1491 | { | ||
1492 | struct subchannel *sch = to_subchannel(cdev->dev.parent); | ||
1493 | |||
1494 | CIO_TRACE_EVENT(2, "notoper"); | ||
1495 | CIO_TRACE_EVENT(2, sch->dev.bus_id); | ||
1496 | ccw_device_set_timeout(cdev, 0); | ||
1497 | cio_disable_subchannel(sch); | ||
1498 | cdev->private->state = DEV_STATE_NOT_OPER; | ||
1499 | } | ||
1500 | |||
1499 | static int io_subchannel_sch_event(struct subchannel *sch, int slow) | 1501 | static int io_subchannel_sch_event(struct subchannel *sch, int slow) |
1500 | { | 1502 | { |
1501 | int event, ret, disc; | 1503 | int event, ret, disc; |
1502 | unsigned long flags; | 1504 | unsigned long flags; |
1503 | enum { NONE, UNREGISTER, UNREGISTER_PROBE, REPROBE } action; | 1505 | enum { NONE, UNREGISTER, UNREGISTER_PROBE, REPROBE, DISC } action; |
1504 | struct ccw_device *cdev; | 1506 | struct ccw_device *cdev; |
1505 | 1507 | ||
1506 | spin_lock_irqsave(sch->lock, flags); | 1508 | spin_lock_irqsave(sch->lock, flags); |
@@ -1535,16 +1537,11 @@ static int io_subchannel_sch_event(struct subchannel *sch, int slow) | |||
1535 | } | 1537 | } |
1536 | /* fall through */ | 1538 | /* fall through */ |
1537 | case CIO_GONE: | 1539 | case CIO_GONE: |
1538 | /* Prevent unwanted effects when opening lock. */ | ||
1539 | cio_disable_subchannel(sch); | ||
1540 | device_set_disconnected(cdev); | ||
1541 | /* Ask driver what to do with device. */ | 1540 | /* Ask driver what to do with device. */ |
1542 | action = UNREGISTER; | 1541 | if (io_subchannel_notify(sch, event)) |
1543 | spin_unlock_irqrestore(sch->lock, flags); | 1542 | action = DISC; |
1544 | ret = io_subchannel_notify(sch, event); | 1543 | else |
1545 | spin_lock_irqsave(sch->lock, flags); | 1544 | action = UNREGISTER; |
1546 | if (ret) | ||
1547 | action = NONE; | ||
1548 | break; | 1545 | break; |
1549 | case CIO_REVALIDATE: | 1546 | case CIO_REVALIDATE: |
1550 | /* Device will be removed, so no notify necessary. */ | 1547 | /* Device will be removed, so no notify necessary. */ |
@@ -1565,6 +1562,7 @@ static int io_subchannel_sch_event(struct subchannel *sch, int slow) | |||
1565 | switch (action) { | 1562 | switch (action) { |
1566 | case UNREGISTER: | 1563 | case UNREGISTER: |
1567 | case UNREGISTER_PROBE: | 1564 | case UNREGISTER_PROBE: |
1565 | ccw_device_set_notoper(cdev); | ||
1568 | /* Unregister device (will use subchannel lock). */ | 1566 | /* Unregister device (will use subchannel lock). */ |
1569 | spin_unlock_irqrestore(sch->lock, flags); | 1567 | spin_unlock_irqrestore(sch->lock, flags); |
1570 | css_sch_device_unregister(sch); | 1568 | css_sch_device_unregister(sch); |
@@ -1577,6 +1575,9 @@ static int io_subchannel_sch_event(struct subchannel *sch, int slow) | |||
1577 | case REPROBE: | 1575 | case REPROBE: |
1578 | ccw_device_trigger_reprobe(cdev); | 1576 | ccw_device_trigger_reprobe(cdev); |
1579 | break; | 1577 | break; |
1578 | case DISC: | ||
1579 | device_set_disconnected(cdev); | ||
1580 | break; | ||
1580 | default: | 1581 | default: |
1581 | break; | 1582 | break; |
1582 | } | 1583 | } |
@@ -1828,5 +1829,4 @@ EXPORT_SYMBOL(ccw_driver_unregister); | |||
1828 | EXPORT_SYMBOL(get_ccwdev_by_busid); | 1829 | EXPORT_SYMBOL(get_ccwdev_by_busid); |
1829 | EXPORT_SYMBOL(ccw_bus_type); | 1830 | EXPORT_SYMBOL(ccw_bus_type); |
1830 | EXPORT_SYMBOL(ccw_device_work); | 1831 | EXPORT_SYMBOL(ccw_device_work); |
1831 | EXPORT_SYMBOL(ccw_device_notify_work); | ||
1832 | EXPORT_SYMBOL_GPL(ccw_device_get_subchannel_id); | 1832 | EXPORT_SYMBOL_GPL(ccw_device_get_subchannel_id); |
diff --git a/drivers/s390/cio/device.h b/drivers/s390/cio/device.h index 9800a8335a3f..6f5c3f2b3587 100644 --- a/drivers/s390/cio/device.h +++ b/drivers/s390/cio/device.h | |||
@@ -72,7 +72,6 @@ dev_fsm_final_state(struct ccw_device *cdev) | |||
72 | } | 72 | } |
73 | 73 | ||
74 | extern struct workqueue_struct *ccw_device_work; | 74 | extern struct workqueue_struct *ccw_device_work; |
75 | extern struct workqueue_struct *ccw_device_notify_work; | ||
76 | extern wait_queue_head_t ccw_device_init_wq; | 75 | extern wait_queue_head_t ccw_device_init_wq; |
77 | extern atomic_t ccw_device_init_count; | 76 | extern atomic_t ccw_device_init_count; |
78 | 77 | ||
@@ -120,6 +119,7 @@ int ccw_device_stlck(struct ccw_device *); | |||
120 | void ccw_device_trigger_reprobe(struct ccw_device *); | 119 | void ccw_device_trigger_reprobe(struct ccw_device *); |
121 | void ccw_device_kill_io(struct ccw_device *); | 120 | void ccw_device_kill_io(struct ccw_device *); |
122 | int ccw_device_notify(struct ccw_device *, int); | 121 | int ccw_device_notify(struct ccw_device *, int); |
122 | void ccw_device_set_notoper(struct ccw_device *cdev); | ||
123 | 123 | ||
124 | /* qdio needs this. */ | 124 | /* qdio needs this. */ |
125 | void ccw_device_set_timeout(struct ccw_device *, int); | 125 | void ccw_device_set_timeout(struct ccw_device *, int); |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 8b5fe57fb2f3..550508df952b 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -337,26 +337,34 @@ int ccw_device_notify(struct ccw_device *cdev, int event) | |||
337 | return 0; | 337 | return 0; |
338 | if (!cdev->online) | 338 | if (!cdev->online) |
339 | return 0; | 339 | return 0; |
340 | CIO_MSG_EVENT(2, "notify called for 0.%x.%04x, event=%d\n", | ||
341 | cdev->private->dev_id.ssid, cdev->private->dev_id.devno, | ||
342 | event); | ||
340 | return cdev->drv->notify ? cdev->drv->notify(cdev, event) : 0; | 343 | return cdev->drv->notify ? cdev->drv->notify(cdev, event) : 0; |
341 | } | 344 | } |
342 | 345 | ||
343 | static void | 346 | static void cmf_reenable_delayed(struct work_struct *work) |
344 | ccw_device_oper_notify(struct work_struct *work) | ||
345 | { | 347 | { |
346 | struct ccw_device_private *priv; | 348 | struct ccw_device_private *priv; |
347 | struct ccw_device *cdev; | 349 | struct ccw_device *cdev; |
348 | int ret; | ||
349 | 350 | ||
350 | priv = container_of(work, struct ccw_device_private, kick_work); | 351 | priv = container_of(work, struct ccw_device_private, kick_work); |
351 | cdev = priv->cdev; | 352 | cdev = priv->cdev; |
352 | ret = ccw_device_notify(cdev, CIO_OPER); | 353 | cmf_reenable(cdev); |
353 | if (ret) { | 354 | } |
355 | |||
356 | static void ccw_device_oper_notify(struct ccw_device *cdev) | ||
357 | { | ||
358 | if (ccw_device_notify(cdev, CIO_OPER)) { | ||
354 | /* Reenable channel measurements, if needed. */ | 359 | /* Reenable channel measurements, if needed. */ |
355 | cmf_reenable(cdev); | 360 | PREPARE_WORK(&cdev->private->kick_work, cmf_reenable_delayed); |
356 | wake_up(&cdev->private->wait_q); | 361 | queue_work(ccw_device_work, &cdev->private->kick_work); |
357 | } else | 362 | return; |
358 | /* Driver doesn't want device back. */ | 363 | } |
359 | ccw_device_do_unreg_rereg(work); | 364 | /* Driver doesn't want device back. */ |
365 | ccw_device_set_notoper(cdev); | ||
366 | PREPARE_WORK(&cdev->private->kick_work, ccw_device_do_unreg_rereg); | ||
367 | queue_work(ccw_device_work, &cdev->private->kick_work); | ||
360 | } | 368 | } |
361 | 369 | ||
362 | /* | 370 | /* |
@@ -386,8 +394,7 @@ ccw_device_done(struct ccw_device *cdev, int state) | |||
386 | 394 | ||
387 | if (cdev->private->flags.donotify) { | 395 | if (cdev->private->flags.donotify) { |
388 | cdev->private->flags.donotify = 0; | 396 | cdev->private->flags.donotify = 0; |
389 | PREPARE_WORK(&cdev->private->kick_work, ccw_device_oper_notify); | 397 | ccw_device_oper_notify(cdev); |
390 | queue_work(ccw_device_notify_work, &cdev->private->kick_work); | ||
391 | } | 398 | } |
392 | wake_up(&cdev->private->wait_q); | 399 | wake_up(&cdev->private->wait_q); |
393 | 400 | ||
diff --git a/drivers/s390/cio/qdio_debug.h b/drivers/s390/cio/qdio_debug.h index 8484b83698e1..5a4d85b829ad 100644 --- a/drivers/s390/cio/qdio_debug.h +++ b/drivers/s390/cio/qdio_debug.h | |||
@@ -61,18 +61,18 @@ | |||
61 | 61 | ||
62 | /* s390dbf views */ | 62 | /* s390dbf views */ |
63 | #define QDIO_DBF_SETUP_LEN 8 | 63 | #define QDIO_DBF_SETUP_LEN 8 |
64 | #define QDIO_DBF_SETUP_PAGES 4 | 64 | #define QDIO_DBF_SETUP_PAGES 8 |
65 | #define QDIO_DBF_SETUP_NR_AREAS 1 | 65 | #define QDIO_DBF_SETUP_NR_AREAS 1 |
66 | 66 | ||
67 | #define QDIO_DBF_TRACE_LEN 8 | 67 | #define QDIO_DBF_TRACE_LEN 8 |
68 | #define QDIO_DBF_TRACE_NR_AREAS 2 | 68 | #define QDIO_DBF_TRACE_NR_AREAS 2 |
69 | 69 | ||
70 | #ifdef CONFIG_QDIO_DEBUG | 70 | #ifdef CONFIG_QDIO_DEBUG |
71 | #define QDIO_DBF_TRACE_PAGES 16 | 71 | #define QDIO_DBF_TRACE_PAGES 32 |
72 | #define QDIO_DBF_SETUP_LEVEL 6 | 72 | #define QDIO_DBF_SETUP_LEVEL 6 |
73 | #define QDIO_DBF_TRACE_LEVEL 4 | 73 | #define QDIO_DBF_TRACE_LEVEL 4 |
74 | #else /* !CONFIG_QDIO_DEBUG */ | 74 | #else /* !CONFIG_QDIO_DEBUG */ |
75 | #define QDIO_DBF_TRACE_PAGES 4 | 75 | #define QDIO_DBF_TRACE_PAGES 8 |
76 | #define QDIO_DBF_SETUP_LEVEL 2 | 76 | #define QDIO_DBF_SETUP_LEVEL 2 |
77 | #define QDIO_DBF_TRACE_LEVEL 2 | 77 | #define QDIO_DBF_TRACE_LEVEL 2 |
78 | #endif /* CONFIG_QDIO_DEBUG */ | 78 | #endif /* CONFIG_QDIO_DEBUG */ |
diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c index d15648514a0f..e6eabc853422 100644 --- a/drivers/s390/cio/qdio_main.c +++ b/drivers/s390/cio/qdio_main.c | |||
@@ -330,6 +330,7 @@ static int qdio_siga_output(struct qdio_q *q) | |||
330 | int cc; | 330 | int cc; |
331 | u32 busy_bit; | 331 | u32 busy_bit; |
332 | u64 start_time = 0; | 332 | u64 start_time = 0; |
333 | char dbf_text[15]; | ||
333 | 334 | ||
334 | QDIO_DBF_TEXT5(0, trace, "sigaout"); | 335 | QDIO_DBF_TEXT5(0, trace, "sigaout"); |
335 | QDIO_DBF_HEX5(0, trace, &q, sizeof(void *)); | 336 | QDIO_DBF_HEX5(0, trace, &q, sizeof(void *)); |
@@ -338,6 +339,9 @@ static int qdio_siga_output(struct qdio_q *q) | |||
338 | again: | 339 | again: |
339 | cc = qdio_do_siga_output(q, &busy_bit); | 340 | cc = qdio_do_siga_output(q, &busy_bit); |
340 | if (queue_type(q) == QDIO_IQDIO_QFMT && cc == 2 && busy_bit) { | 341 | if (queue_type(q) == QDIO_IQDIO_QFMT && cc == 2 && busy_bit) { |
342 | sprintf(dbf_text, "bb%4x%2x", q->irq_ptr->schid.sch_no, q->nr); | ||
343 | QDIO_DBF_TEXT3(0, trace, dbf_text); | ||
344 | |||
341 | if (!start_time) | 345 | if (!start_time) |
342 | start_time = get_usecs(); | 346 | start_time = get_usecs(); |
343 | else if ((get_usecs() - start_time) < QDIO_BUSY_BIT_PATIENCE) | 347 | else if ((get_usecs() - start_time) < QDIO_BUSY_BIT_PATIENCE) |
@@ -748,16 +752,18 @@ static void qdio_kick_outbound_q(struct qdio_q *q) | |||
748 | rc = qdio_siga_output(q); | 752 | rc = qdio_siga_output(q); |
749 | switch (rc) { | 753 | switch (rc) { |
750 | case 0: | 754 | case 0: |
751 | /* went smooth this time, reset timestamp */ | ||
752 | q->u.out.timestamp = 0; | ||
753 | |||
754 | /* TODO: improve error handling for CC=0 case */ | 755 | /* TODO: improve error handling for CC=0 case */ |
755 | #ifdef CONFIG_QDIO_DEBUG | 756 | #ifdef CONFIG_QDIO_DEBUG |
756 | QDIO_DBF_TEXT3(0, trace, "cc2reslv"); | 757 | if (q->u.out.timestamp) { |
757 | sprintf(dbf_text, "%4x%2x%2x", q->irq_ptr->schid.sch_no, q->nr, | 758 | QDIO_DBF_TEXT3(0, trace, "cc2reslv"); |
758 | atomic_read(&q->u.out.busy_siga_counter)); | 759 | sprintf(dbf_text, "%4x%2x%2x", q->irq_ptr->schid.sch_no, |
759 | QDIO_DBF_TEXT3(0, trace, dbf_text); | 760 | q->nr, |
761 | atomic_read(&q->u.out.busy_siga_counter)); | ||
762 | QDIO_DBF_TEXT3(0, trace, dbf_text); | ||
763 | } | ||
760 | #endif /* CONFIG_QDIO_DEBUG */ | 764 | #endif /* CONFIG_QDIO_DEBUG */ |
765 | /* went smooth this time, reset timestamp */ | ||
766 | q->u.out.timestamp = 0; | ||
761 | break; | 767 | break; |
762 | /* cc=2 and busy bit */ | 768 | /* cc=2 and busy bit */ |
763 | case (2 | QDIO_ERROR_SIGA_BUSY): | 769 | case (2 | QDIO_ERROR_SIGA_BUSY): |
@@ -1066,14 +1072,12 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
1066 | if (IS_ERR(irb)) { | 1072 | if (IS_ERR(irb)) { |
1067 | switch (PTR_ERR(irb)) { | 1073 | switch (PTR_ERR(irb)) { |
1068 | case -EIO: | 1074 | case -EIO: |
1069 | sprintf(dbf_text, "ierr%4x", | 1075 | sprintf(dbf_text, "ierr%4x", irq_ptr->schid.sch_no); |
1070 | cdev->private->schid.sch_no); | ||
1071 | QDIO_DBF_TEXT2(1, setup, dbf_text); | 1076 | QDIO_DBF_TEXT2(1, setup, dbf_text); |
1072 | qdio_int_error(cdev); | 1077 | qdio_int_error(cdev); |
1073 | return; | 1078 | return; |
1074 | case -ETIMEDOUT: | 1079 | case -ETIMEDOUT: |
1075 | sprintf(dbf_text, "qtoh%4x", | 1080 | sprintf(dbf_text, "qtoh%4x", irq_ptr->schid.sch_no); |
1076 | cdev->private->schid.sch_no); | ||
1077 | QDIO_DBF_TEXT2(1, setup, dbf_text); | 1081 | QDIO_DBF_TEXT2(1, setup, dbf_text); |
1078 | qdio_int_error(cdev); | 1082 | qdio_int_error(cdev); |
1079 | return; | 1083 | return; |
@@ -1124,8 +1128,10 @@ void qdio_int_handler(struct ccw_device *cdev, unsigned long intparm, | |||
1124 | struct qdio_ssqd_desc *qdio_get_ssqd_desc(struct ccw_device *cdev) | 1128 | struct qdio_ssqd_desc *qdio_get_ssqd_desc(struct ccw_device *cdev) |
1125 | { | 1129 | { |
1126 | struct qdio_irq *irq_ptr; | 1130 | struct qdio_irq *irq_ptr; |
1131 | char dbf_text[15]; | ||
1127 | 1132 | ||
1128 | QDIO_DBF_TEXT0(0, setup, "getssqd"); | 1133 | sprintf(dbf_text, "qssq%4x", cdev->private->schid.sch_no); |
1134 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1129 | 1135 | ||
1130 | irq_ptr = cdev->private->qdio_data; | 1136 | irq_ptr = cdev->private->qdio_data; |
1131 | if (!irq_ptr) | 1137 | if (!irq_ptr) |
@@ -1149,14 +1155,13 @@ int qdio_cleanup(struct ccw_device *cdev, int how) | |||
1149 | char dbf_text[15]; | 1155 | char dbf_text[15]; |
1150 | int rc; | 1156 | int rc; |
1151 | 1157 | ||
1158 | sprintf(dbf_text, "qcln%4x", cdev->private->schid.sch_no); | ||
1159 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1160 | |||
1152 | irq_ptr = cdev->private->qdio_data; | 1161 | irq_ptr = cdev->private->qdio_data; |
1153 | if (!irq_ptr) | 1162 | if (!irq_ptr) |
1154 | return -ENODEV; | 1163 | return -ENODEV; |
1155 | 1164 | ||
1156 | sprintf(dbf_text, "qcln%4x", irq_ptr->schid.sch_no); | ||
1157 | QDIO_DBF_TEXT1(0, trace, dbf_text); | ||
1158 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1159 | |||
1160 | rc = qdio_shutdown(cdev, how); | 1165 | rc = qdio_shutdown(cdev, how); |
1161 | if (rc == 0) | 1166 | if (rc == 0) |
1162 | rc = qdio_free(cdev); | 1167 | rc = qdio_free(cdev); |
@@ -1191,6 +1196,9 @@ int qdio_shutdown(struct ccw_device *cdev, int how) | |||
1191 | unsigned long flags; | 1196 | unsigned long flags; |
1192 | char dbf_text[15]; | 1197 | char dbf_text[15]; |
1193 | 1198 | ||
1199 | sprintf(dbf_text, "qshu%4x", cdev->private->schid.sch_no); | ||
1200 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1201 | |||
1194 | irq_ptr = cdev->private->qdio_data; | 1202 | irq_ptr = cdev->private->qdio_data; |
1195 | if (!irq_ptr) | 1203 | if (!irq_ptr) |
1196 | return -ENODEV; | 1204 | return -ENODEV; |
@@ -1205,10 +1213,6 @@ int qdio_shutdown(struct ccw_device *cdev, int how) | |||
1205 | return 0; | 1213 | return 0; |
1206 | } | 1214 | } |
1207 | 1215 | ||
1208 | sprintf(dbf_text, "qsqs%4x", irq_ptr->schid.sch_no); | ||
1209 | QDIO_DBF_TEXT1(0, trace, dbf_text); | ||
1210 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1211 | |||
1212 | tiqdio_remove_input_queues(irq_ptr); | 1216 | tiqdio_remove_input_queues(irq_ptr); |
1213 | qdio_shutdown_queues(cdev); | 1217 | qdio_shutdown_queues(cdev); |
1214 | qdio_shutdown_debug_entries(irq_ptr, cdev); | 1218 | qdio_shutdown_debug_entries(irq_ptr, cdev); |
@@ -1247,7 +1251,6 @@ no_cleanup: | |||
1247 | 1251 | ||
1248 | qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE); | 1252 | qdio_set_state(irq_ptr, QDIO_IRQ_STATE_INACTIVE); |
1249 | mutex_unlock(&irq_ptr->setup_mutex); | 1253 | mutex_unlock(&irq_ptr->setup_mutex); |
1250 | module_put(THIS_MODULE); | ||
1251 | if (rc) | 1254 | if (rc) |
1252 | return rc; | 1255 | return rc; |
1253 | return 0; | 1256 | return 0; |
@@ -1263,16 +1266,14 @@ int qdio_free(struct ccw_device *cdev) | |||
1263 | struct qdio_irq *irq_ptr; | 1266 | struct qdio_irq *irq_ptr; |
1264 | char dbf_text[15]; | 1267 | char dbf_text[15]; |
1265 | 1268 | ||
1269 | sprintf(dbf_text, "qfre%4x", cdev->private->schid.sch_no); | ||
1270 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1271 | |||
1266 | irq_ptr = cdev->private->qdio_data; | 1272 | irq_ptr = cdev->private->qdio_data; |
1267 | if (!irq_ptr) | 1273 | if (!irq_ptr) |
1268 | return -ENODEV; | 1274 | return -ENODEV; |
1269 | 1275 | ||
1270 | mutex_lock(&irq_ptr->setup_mutex); | 1276 | mutex_lock(&irq_ptr->setup_mutex); |
1271 | |||
1272 | sprintf(dbf_text, "qfqs%4x", irq_ptr->schid.sch_no); | ||
1273 | QDIO_DBF_TEXT1(0, trace, dbf_text); | ||
1274 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1275 | |||
1276 | cdev->private->qdio_data = NULL; | 1277 | cdev->private->qdio_data = NULL; |
1277 | mutex_unlock(&irq_ptr->setup_mutex); | 1278 | mutex_unlock(&irq_ptr->setup_mutex); |
1278 | 1279 | ||
@@ -1295,7 +1296,6 @@ int qdio_initialize(struct qdio_initialize *init_data) | |||
1295 | 1296 | ||
1296 | sprintf(dbf_text, "qini%4x", init_data->cdev->private->schid.sch_no); | 1297 | sprintf(dbf_text, "qini%4x", init_data->cdev->private->schid.sch_no); |
1297 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 1298 | QDIO_DBF_TEXT0(0, setup, dbf_text); |
1298 | QDIO_DBF_TEXT0(0, trace, dbf_text); | ||
1299 | 1299 | ||
1300 | rc = qdio_allocate(init_data); | 1300 | rc = qdio_allocate(init_data); |
1301 | if (rc) | 1301 | if (rc) |
@@ -1319,7 +1319,6 @@ int qdio_allocate(struct qdio_initialize *init_data) | |||
1319 | 1319 | ||
1320 | sprintf(dbf_text, "qalc%4x", init_data->cdev->private->schid.sch_no); | 1320 | sprintf(dbf_text, "qalc%4x", init_data->cdev->private->schid.sch_no); |
1321 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 1321 | QDIO_DBF_TEXT0(0, setup, dbf_text); |
1322 | QDIO_DBF_TEXT0(0, trace, dbf_text); | ||
1323 | 1322 | ||
1324 | if ((init_data->no_input_qs && !init_data->input_handler) || | 1323 | if ((init_data->no_input_qs && !init_data->input_handler) || |
1325 | (init_data->no_output_qs && !init_data->output_handler)) | 1324 | (init_data->no_output_qs && !init_data->output_handler)) |
@@ -1389,6 +1388,9 @@ int qdio_establish(struct qdio_initialize *init_data) | |||
1389 | unsigned long saveflags; | 1388 | unsigned long saveflags; |
1390 | int rc; | 1389 | int rc; |
1391 | 1390 | ||
1391 | sprintf(dbf_text, "qest%4x", cdev->private->schid.sch_no); | ||
1392 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1393 | |||
1392 | irq_ptr = cdev->private->qdio_data; | 1394 | irq_ptr = cdev->private->qdio_data; |
1393 | if (!irq_ptr) | 1395 | if (!irq_ptr) |
1394 | return -ENODEV; | 1396 | return -ENODEV; |
@@ -1396,13 +1398,6 @@ int qdio_establish(struct qdio_initialize *init_data) | |||
1396 | if (cdev->private->state != DEV_STATE_ONLINE) | 1398 | if (cdev->private->state != DEV_STATE_ONLINE) |
1397 | return -EINVAL; | 1399 | return -EINVAL; |
1398 | 1400 | ||
1399 | if (!try_module_get(THIS_MODULE)) | ||
1400 | return -EINVAL; | ||
1401 | |||
1402 | sprintf(dbf_text, "qest%4x", cdev->private->schid.sch_no); | ||
1403 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1404 | QDIO_DBF_TEXT0(0, trace, dbf_text); | ||
1405 | |||
1406 | mutex_lock(&irq_ptr->setup_mutex); | 1401 | mutex_lock(&irq_ptr->setup_mutex); |
1407 | qdio_setup_irq(init_data); | 1402 | qdio_setup_irq(init_data); |
1408 | 1403 | ||
@@ -1472,6 +1467,9 @@ int qdio_activate(struct ccw_device *cdev) | |||
1472 | unsigned long saveflags; | 1467 | unsigned long saveflags; |
1473 | char dbf_text[20]; | 1468 | char dbf_text[20]; |
1474 | 1469 | ||
1470 | sprintf(dbf_text, "qact%4x", cdev->private->schid.sch_no); | ||
1471 | QDIO_DBF_TEXT0(0, setup, dbf_text); | ||
1472 | |||
1475 | irq_ptr = cdev->private->qdio_data; | 1473 | irq_ptr = cdev->private->qdio_data; |
1476 | if (!irq_ptr) | 1474 | if (!irq_ptr) |
1477 | return -ENODEV; | 1475 | return -ENODEV; |
@@ -1485,10 +1483,6 @@ int qdio_activate(struct ccw_device *cdev) | |||
1485 | goto out; | 1483 | goto out; |
1486 | } | 1484 | } |
1487 | 1485 | ||
1488 | sprintf(dbf_text, "qact%4x", irq_ptr->schid.sch_no); | ||
1489 | QDIO_DBF_TEXT2(0, setup, dbf_text); | ||
1490 | QDIO_DBF_TEXT2(0, trace, dbf_text); | ||
1491 | |||
1492 | irq_ptr->ccw.cmd_code = irq_ptr->aqueue.cmd; | 1486 | irq_ptr->ccw.cmd_code = irq_ptr->aqueue.cmd; |
1493 | irq_ptr->ccw.flags = CCW_FLAG_SLI; | 1487 | irq_ptr->ccw.flags = CCW_FLAG_SLI; |
1494 | irq_ptr->ccw.count = irq_ptr->aqueue.count; | 1488 | irq_ptr->ccw.count = irq_ptr->aqueue.count; |
@@ -1663,7 +1657,7 @@ int do_QDIO(struct ccw_device *cdev, unsigned int callflags, | |||
1663 | #ifdef CONFIG_QDIO_DEBUG | 1657 | #ifdef CONFIG_QDIO_DEBUG |
1664 | char dbf_text[20]; | 1658 | char dbf_text[20]; |
1665 | 1659 | ||
1666 | sprintf(dbf_text, "doQD%04x", cdev->private->schid.sch_no); | 1660 | sprintf(dbf_text, "doQD%4x", cdev->private->schid.sch_no); |
1667 | QDIO_DBF_TEXT3(0, trace, dbf_text); | 1661 | QDIO_DBF_TEXT3(0, trace, dbf_text); |
1668 | #endif /* CONFIG_QDIO_DEBUG */ | 1662 | #endif /* CONFIG_QDIO_DEBUG */ |
1669 | 1663 | ||
diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c index 1bd2a208db28..1679e2f91c94 100644 --- a/drivers/s390/cio/qdio_setup.c +++ b/drivers/s390/cio/qdio_setup.c | |||
@@ -165,7 +165,7 @@ static void setup_queues(struct qdio_irq *irq_ptr, | |||
165 | void **output_sbal_array = qdio_init->output_sbal_addr_array; | 165 | void **output_sbal_array = qdio_init->output_sbal_addr_array; |
166 | int i; | 166 | int i; |
167 | 167 | ||
168 | sprintf(dbf_text, "qfqs%4x", qdio_init->cdev->private->schid.sch_no); | 168 | sprintf(dbf_text, "qset%4x", qdio_init->cdev->private->schid.sch_no); |
169 | QDIO_DBF_TEXT0(0, setup, dbf_text); | 169 | QDIO_DBF_TEXT0(0, setup, dbf_text); |
170 | 170 | ||
171 | for_each_input_queue(irq_ptr, q, i) { | 171 | for_each_input_queue(irq_ptr, q, i) { |
@@ -285,7 +285,7 @@ void qdio_setup_ssqd_info(struct qdio_irq *irq_ptr) | |||
285 | rc = __get_ssqd_info(irq_ptr); | 285 | rc = __get_ssqd_info(irq_ptr); |
286 | if (rc) { | 286 | if (rc) { |
287 | QDIO_DBF_TEXT2(0, setup, "ssqdasig"); | 287 | QDIO_DBF_TEXT2(0, setup, "ssqdasig"); |
288 | sprintf(dbf_text, "schno%x", irq_ptr->schid.sch_no); | 288 | sprintf(dbf_text, "schn%4x", irq_ptr->schid.sch_no); |
289 | QDIO_DBF_TEXT2(0, setup, dbf_text); | 289 | QDIO_DBF_TEXT2(0, setup, dbf_text); |
290 | sprintf(dbf_text, "rc:%d", rc); | 290 | sprintf(dbf_text, "rc:%d", rc); |
291 | QDIO_DBF_TEXT2(0, setup, dbf_text); | 291 | QDIO_DBF_TEXT2(0, setup, dbf_text); |
@@ -447,7 +447,7 @@ void qdio_print_subchannel_info(struct qdio_irq *irq_ptr, | |||
447 | { | 447 | { |
448 | char s[80]; | 448 | char s[80]; |
449 | 449 | ||
450 | sprintf(s, "%s ", cdev->dev.bus_id); | 450 | sprintf(s, "%s sc:%x ", cdev->dev.bus_id, irq_ptr->schid.sch_no); |
451 | 451 | ||
452 | switch (irq_ptr->qib.qfmt) { | 452 | switch (irq_ptr->qib.qfmt) { |
453 | case QDIO_QETH_QFMT: | 453 | case QDIO_QETH_QFMT: |
diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c index 9291a771d812..ea7f61400267 100644 --- a/drivers/s390/cio/qdio_thinint.c +++ b/drivers/s390/cio/qdio_thinint.c | |||
@@ -113,7 +113,11 @@ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) | |||
113 | struct qdio_q *q; | 113 | struct qdio_q *q; |
114 | int i; | 114 | int i; |
115 | 115 | ||
116 | for_each_input_queue(irq_ptr, q, i) { | 116 | for (i = 0; i < irq_ptr->nr_input_qs; i++) { |
117 | q = irq_ptr->input_qs[i]; | ||
118 | /* if establish triggered an error */ | ||
119 | if (!q || !q->entry.prev || !q->entry.next) | ||
120 | continue; | ||
117 | list_del_rcu(&q->entry); | 121 | list_del_rcu(&q->entry); |
118 | synchronize_rcu(); | 122 | synchronize_rcu(); |
119 | } | 123 | } |
diff --git a/drivers/s390/net/ctcm_mpc.c b/drivers/s390/net/ctcm_mpc.c index 49ae1cd25caa..2de1e2fccbf9 100644 --- a/drivers/s390/net/ctcm_mpc.c +++ b/drivers/s390/net/ctcm_mpc.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #undef DEBUGDATA | 19 | #undef DEBUGDATA |
20 | #undef DEBUGCCW | 20 | #undef DEBUGCCW |
21 | 21 | ||
22 | #include <linux/version.h> | ||
23 | #include <linux/module.h> | 22 | #include <linux/module.h> |
24 | #include <linux/init.h> | 23 | #include <linux/init.h> |
25 | #include <linux/kernel.h> | 24 | #include <linux/kernel.h> |
diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c index e7c7b4ebc1fe..2dee69da35cf 100644 --- a/drivers/scsi/device_handler/scsi_dh_rdac.c +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c | |||
@@ -376,7 +376,7 @@ static int get_lun(struct scsi_device *sdev, struct rdac_dh_data *h) | |||
376 | if (inqp->page_id[0] != 'e' || inqp->page_id[1] != 'd' || | 376 | if (inqp->page_id[0] != 'e' || inqp->page_id[1] != 'd' || |
377 | inqp->page_id[2] != 'i' || inqp->page_id[3] != 'd') | 377 | inqp->page_id[2] != 'i' || inqp->page_id[3] != 'd') |
378 | return SCSI_DH_NOSYS; | 378 | return SCSI_DH_NOSYS; |
379 | h->lun = scsilun_to_int((struct scsi_lun *)inqp->lun); | 379 | h->lun = inqp->lun[7]; /* Uses only the last byte */ |
380 | } | 380 | } |
381 | return err; | 381 | return err; |
382 | } | 382 | } |
@@ -386,6 +386,7 @@ static int check_ownership(struct scsi_device *sdev, struct rdac_dh_data *h) | |||
386 | int err; | 386 | int err; |
387 | struct c9_inquiry *inqp; | 387 | struct c9_inquiry *inqp; |
388 | 388 | ||
389 | h->lun_state = RDAC_LUN_UNOWNED; | ||
389 | err = submit_inquiry(sdev, 0xC9, sizeof(struct c9_inquiry), h); | 390 | err = submit_inquiry(sdev, 0xC9, sizeof(struct c9_inquiry), h); |
390 | if (err == SCSI_DH_OK) { | 391 | if (err == SCSI_DH_OK) { |
391 | inqp = &h->inq.c9; | 392 | inqp = &h->inq.c9; |
diff --git a/drivers/scsi/dpt/dpti_i2o.h b/drivers/scsi/dpt/dpti_i2o.h index 19406cea6d6a..179ad77f6cc9 100644 --- a/drivers/scsi/dpt/dpti_i2o.h +++ b/drivers/scsi/dpt/dpti_i2o.h | |||
@@ -21,7 +21,6 @@ | |||
21 | 21 | ||
22 | #include <linux/i2o-dev.h> | 22 | #include <linux/i2o-dev.h> |
23 | 23 | ||
24 | #include <linux/version.h> | ||
25 | #include <linux/notifier.h> | 24 | #include <linux/notifier.h> |
26 | #include <asm/atomic.h> | 25 | #include <asm/atomic.h> |
27 | 26 | ||
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index ae560bc04f9d..4e0b7c8eb32e 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
@@ -556,11 +556,12 @@ static void ibmvfc_link_down(struct ibmvfc_host *vhost, | |||
556 | /** | 556 | /** |
557 | * ibmvfc_init_host - Start host initialization | 557 | * ibmvfc_init_host - Start host initialization |
558 | * @vhost: ibmvfc host struct | 558 | * @vhost: ibmvfc host struct |
559 | * @relogin: is this a re-login? | ||
559 | * | 560 | * |
560 | * Return value: | 561 | * Return value: |
561 | * nothing | 562 | * nothing |
562 | **/ | 563 | **/ |
563 | static void ibmvfc_init_host(struct ibmvfc_host *vhost) | 564 | static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin) |
564 | { | 565 | { |
565 | struct ibmvfc_target *tgt; | 566 | struct ibmvfc_target *tgt; |
566 | 567 | ||
@@ -574,6 +575,11 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost) | |||
574 | } | 575 | } |
575 | 576 | ||
576 | if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { | 577 | if (!ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { |
578 | if (!relogin) { | ||
579 | memset(vhost->async_crq.msgs, 0, PAGE_SIZE); | ||
580 | vhost->async_crq.cur = 0; | ||
581 | } | ||
582 | |||
577 | list_for_each_entry(tgt, &vhost->targets, queue) | 583 | list_for_each_entry(tgt, &vhost->targets, queue) |
578 | tgt->need_login = 1; | 584 | tgt->need_login = 1; |
579 | scsi_block_requests(vhost->host); | 585 | scsi_block_requests(vhost->host); |
@@ -1059,9 +1065,10 @@ static void ibmvfc_get_starget_port_id(struct scsi_target *starget) | |||
1059 | static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) | 1065 | static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) |
1060 | { | 1066 | { |
1061 | long timeout = wait_event_timeout(vhost->init_wait_q, | 1067 | long timeout = wait_event_timeout(vhost->init_wait_q, |
1062 | (vhost->state == IBMVFC_ACTIVE || | 1068 | ((vhost->state == IBMVFC_ACTIVE || |
1063 | vhost->state == IBMVFC_HOST_OFFLINE || | 1069 | vhost->state == IBMVFC_HOST_OFFLINE || |
1064 | vhost->state == IBMVFC_LINK_DEAD), | 1070 | vhost->state == IBMVFC_LINK_DEAD) && |
1071 | vhost->action == IBMVFC_HOST_ACTION_NONE), | ||
1065 | (init_timeout * HZ)); | 1072 | (init_timeout * HZ)); |
1066 | 1073 | ||
1067 | return timeout ? 0 : -EIO; | 1074 | return timeout ? 0 : -EIO; |
@@ -1450,8 +1457,8 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt) | |||
1450 | struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd; | 1457 | struct ibmvfc_cmd *vfc_cmd = &evt->xfer_iu->cmd; |
1451 | struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp; | 1458 | struct ibmvfc_fcp_rsp *rsp = &vfc_cmd->rsp; |
1452 | struct scsi_cmnd *cmnd = evt->cmnd; | 1459 | struct scsi_cmnd *cmnd = evt->cmnd; |
1453 | int rsp_len = 0; | 1460 | u32 rsp_len = 0; |
1454 | int sense_len = rsp->fcp_sense_len; | 1461 | u32 sense_len = rsp->fcp_sense_len; |
1455 | 1462 | ||
1456 | if (cmnd) { | 1463 | if (cmnd) { |
1457 | if (vfc_cmd->response_flags & IBMVFC_ADAPTER_RESID_VALID) | 1464 | if (vfc_cmd->response_flags & IBMVFC_ADAPTER_RESID_VALID) |
@@ -1468,7 +1475,7 @@ static void ibmvfc_scsi_done(struct ibmvfc_event *evt) | |||
1468 | rsp_len = rsp->fcp_rsp_len; | 1475 | rsp_len = rsp->fcp_rsp_len; |
1469 | if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE) | 1476 | if ((sense_len + rsp_len) > SCSI_SENSE_BUFFERSIZE) |
1470 | sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len; | 1477 | sense_len = SCSI_SENSE_BUFFERSIZE - rsp_len; |
1471 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len) | 1478 | if ((rsp->flags & FCP_SNS_LEN_VALID) && rsp->fcp_sense_len && rsp_len <= 8) |
1472 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); | 1479 | memcpy(cmnd->sense_buffer, rsp->data.sense + rsp_len, sense_len); |
1473 | 1480 | ||
1474 | ibmvfc_log_error(evt); | 1481 | ibmvfc_log_error(evt); |
@@ -2077,17 +2084,18 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq, | |||
2077 | { | 2084 | { |
2078 | const char *desc = ibmvfc_get_ae_desc(crq->event); | 2085 | const char *desc = ibmvfc_get_ae_desc(crq->event); |
2079 | 2086 | ||
2080 | ibmvfc_log(vhost, 3, "%s event received\n", desc); | 2087 | ibmvfc_log(vhost, 3, "%s event received. scsi_id: %lx, wwpn: %lx," |
2088 | " node_name: %lx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name); | ||
2081 | 2089 | ||
2082 | switch (crq->event) { | 2090 | switch (crq->event) { |
2083 | case IBMVFC_AE_LINK_UP: | 2091 | case IBMVFC_AE_LINK_UP: |
2084 | case IBMVFC_AE_RESUME: | 2092 | case IBMVFC_AE_RESUME: |
2085 | vhost->events_to_log |= IBMVFC_AE_LINKUP; | 2093 | vhost->events_to_log |= IBMVFC_AE_LINKUP; |
2086 | ibmvfc_init_host(vhost); | 2094 | ibmvfc_init_host(vhost, 1); |
2087 | break; | 2095 | break; |
2088 | case IBMVFC_AE_SCN_FABRIC: | 2096 | case IBMVFC_AE_SCN_FABRIC: |
2089 | vhost->events_to_log |= IBMVFC_AE_RSCN; | 2097 | vhost->events_to_log |= IBMVFC_AE_RSCN; |
2090 | ibmvfc_init_host(vhost); | 2098 | ibmvfc_init_host(vhost, 1); |
2091 | break; | 2099 | break; |
2092 | case IBMVFC_AE_SCN_NPORT: | 2100 | case IBMVFC_AE_SCN_NPORT: |
2093 | case IBMVFC_AE_SCN_GROUP: | 2101 | case IBMVFC_AE_SCN_GROUP: |
@@ -2133,13 +2141,13 @@ static void ibmvfc_handle_crq(struct ibmvfc_crq *crq, struct ibmvfc_host *vhost) | |||
2133 | /* Send back a response */ | 2141 | /* Send back a response */ |
2134 | rc = ibmvfc_send_crq_init_complete(vhost); | 2142 | rc = ibmvfc_send_crq_init_complete(vhost); |
2135 | if (rc == 0) | 2143 | if (rc == 0) |
2136 | ibmvfc_init_host(vhost); | 2144 | ibmvfc_init_host(vhost, 0); |
2137 | else | 2145 | else |
2138 | dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); | 2146 | dev_err(vhost->dev, "Unable to send init rsp. rc=%ld\n", rc); |
2139 | break; | 2147 | break; |
2140 | case IBMVFC_CRQ_INIT_COMPLETE: | 2148 | case IBMVFC_CRQ_INIT_COMPLETE: |
2141 | dev_info(vhost->dev, "Partner initialization complete\n"); | 2149 | dev_info(vhost->dev, "Partner initialization complete\n"); |
2142 | ibmvfc_init_host(vhost); | 2150 | ibmvfc_init_host(vhost, 0); |
2143 | break; | 2151 | break; |
2144 | default: | 2152 | default: |
2145 | dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); | 2153 | dev_err(vhost->dev, "Unknown crq message type: %d\n", crq->format); |
@@ -3357,8 +3365,6 @@ static void ibmvfc_npiv_login(struct ibmvfc_host *vhost) | |||
3357 | mad->buffer.va = vhost->login_buf_dma; | 3365 | mad->buffer.va = vhost->login_buf_dma; |
3358 | mad->buffer.len = sizeof(*vhost->login_buf); | 3366 | mad->buffer.len = sizeof(*vhost->login_buf); |
3359 | 3367 | ||
3360 | memset(vhost->async_crq.msgs, 0, PAGE_SIZE); | ||
3361 | vhost->async_crq.cur = 0; | ||
3362 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); | 3368 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT_WAIT); |
3363 | 3369 | ||
3364 | if (!ibmvfc_send_event(evt, vhost, default_timeout)) | 3370 | if (!ibmvfc_send_event(evt, vhost, default_timeout)) |
@@ -3601,8 +3607,9 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost) | |||
3601 | } | 3607 | } |
3602 | } | 3608 | } |
3603 | 3609 | ||
3604 | if (vhost->reinit) { | 3610 | if (vhost->reinit && !ibmvfc_set_host_state(vhost, IBMVFC_INITIALIZING)) { |
3605 | vhost->reinit = 0; | 3611 | vhost->reinit = 0; |
3612 | scsi_block_requests(vhost->host); | ||
3606 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); | 3613 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_QUERY); |
3607 | } else { | 3614 | } else { |
3608 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); | 3615 | ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_NONE); |
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h index 4bf6e374f076..fb3177ab6691 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.h +++ b/drivers/scsi/ibmvscsi/ibmvfc.h | |||
@@ -29,8 +29,8 @@ | |||
29 | #include "viosrp.h" | 29 | #include "viosrp.h" |
30 | 30 | ||
31 | #define IBMVFC_NAME "ibmvfc" | 31 | #define IBMVFC_NAME "ibmvfc" |
32 | #define IBMVFC_DRIVER_VERSION "1.0.1" | 32 | #define IBMVFC_DRIVER_VERSION "1.0.2" |
33 | #define IBMVFC_DRIVER_DATE "(July 11, 2008)" | 33 | #define IBMVFC_DRIVER_DATE "(August 14, 2008)" |
34 | 34 | ||
35 | #define IBMVFC_DEFAULT_TIMEOUT 15 | 35 | #define IBMVFC_DEFAULT_TIMEOUT 15 |
36 | #define IBMVFC_INIT_TIMEOUT 30 | 36 | #define IBMVFC_INIT_TIMEOUT 30 |
diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c index 6b24b9cdb04c..7b1502c0ab6e 100644 --- a/drivers/scsi/ibmvscsi/ibmvscsi.c +++ b/drivers/scsi/ibmvscsi/ibmvscsi.c | |||
@@ -1636,7 +1636,7 @@ static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev) | |||
1636 | unsigned long desired_io = max_requests * sizeof(union viosrp_iu); | 1636 | unsigned long desired_io = max_requests * sizeof(union viosrp_iu); |
1637 | 1637 | ||
1638 | /* add io space for sg data */ | 1638 | /* add io space for sg data */ |
1639 | desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * | 1639 | desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * 512 * |
1640 | IBMVSCSI_CMDS_PER_LUN_DEFAULT); | 1640 | IBMVSCSI_CMDS_PER_LUN_DEFAULT); |
1641 | 1641 | ||
1642 | return desired_io; | 1642 | return desired_io; |
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c index 7c615c70ec5c..bc9e6ddf41df 100644 --- a/drivers/scsi/ips.c +++ b/drivers/scsi/ips.c | |||
@@ -165,7 +165,6 @@ | |||
165 | #include <asm/byteorder.h> | 165 | #include <asm/byteorder.h> |
166 | #include <asm/page.h> | 166 | #include <asm/page.h> |
167 | #include <linux/stddef.h> | 167 | #include <linux/stddef.h> |
168 | #include <linux/version.h> | ||
169 | #include <linux/string.h> | 168 | #include <linux/string.h> |
170 | #include <linux/errno.h> | 169 | #include <linux/errno.h> |
171 | #include <linux/kernel.h> | 170 | #include <linux/kernel.h> |
diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h index e0657b6f009c..4e49fbcfe8af 100644 --- a/drivers/scsi/ips.h +++ b/drivers/scsi/ips.h | |||
@@ -50,7 +50,6 @@ | |||
50 | #ifndef _IPS_H_ | 50 | #ifndef _IPS_H_ |
51 | #define _IPS_H_ | 51 | #define _IPS_H_ |
52 | 52 | ||
53 | #include <linux/version.h> | ||
54 | #include <linux/nmi.h> | 53 | #include <linux/nmi.h> |
55 | #include <asm/uaccess.h> | 54 | #include <asm/uaccess.h> |
56 | #include <asm/io.h> | 55 | #include <asm/io.h> |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 90272e65957a..094b47e94b29 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/pci.h> | 27 | #include <linux/pci.h> |
28 | #include <linux/spinlock.h> | 28 | #include <linux/spinlock.h> |
29 | #include <linux/ctype.h> | 29 | #include <linux/ctype.h> |
30 | #include <linux/version.h> | ||
31 | 30 | ||
32 | #include <scsi/scsi.h> | 31 | #include <scsi/scsi.h> |
33 | #include <scsi/scsi_device.h> | 32 | #include <scsi/scsi_device.h> |
diff --git a/drivers/scsi/megaraid/megaraid_sas.c b/drivers/scsi/megaraid/megaraid_sas.c index fc7ac158476c..97b763378e7d 100644 --- a/drivers/scsi/megaraid/megaraid_sas.c +++ b/drivers/scsi/megaraid/megaraid_sas.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 10 | * 2 of the License, or (at your option) any later version. |
11 | * | 11 | * |
12 | * FILE : megaraid_sas.c | 12 | * FILE : megaraid_sas.c |
13 | * Version : v00.00.03.20-rc1 | 13 | * Version : v00.00.04.01-rc1 |
14 | * | 14 | * |
15 | * Authors: | 15 | * Authors: |
16 | * (email-id : megaraidlinux@lsi.com) | 16 | * (email-id : megaraidlinux@lsi.com) |
@@ -71,6 +71,10 @@ static struct pci_device_id megasas_pci_table[] = { | |||
71 | /* ppc IOP */ | 71 | /* ppc IOP */ |
72 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)}, | 72 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078DE)}, |
73 | /* ppc IOP */ | 73 | /* ppc IOP */ |
74 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS1078GEN2)}, | ||
75 | /* gen2*/ | ||
76 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_SAS0079GEN2)}, | ||
77 | /* gen2*/ | ||
74 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)}, | 78 | {PCI_DEVICE(PCI_VENDOR_ID_LSI_LOGIC, PCI_DEVICE_ID_LSI_VERDE_ZCR)}, |
75 | /* xscale IOP, vega */ | 79 | /* xscale IOP, vega */ |
76 | {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)}, | 80 | {PCI_DEVICE(PCI_VENDOR_ID_DELL, PCI_DEVICE_ID_DELL_PERC5)}, |
@@ -198,6 +202,9 @@ megasas_clear_intr_xscale(struct megasas_register_set __iomem * regs) | |||
198 | */ | 202 | */ |
199 | writel(status, ®s->outbound_intr_status); | 203 | writel(status, ®s->outbound_intr_status); |
200 | 204 | ||
205 | /* Dummy readl to force pci flush */ | ||
206 | readl(®s->outbound_intr_status); | ||
207 | |||
201 | return 0; | 208 | return 0; |
202 | } | 209 | } |
203 | 210 | ||
@@ -293,6 +300,9 @@ megasas_clear_intr_ppc(struct megasas_register_set __iomem * regs) | |||
293 | */ | 300 | */ |
294 | writel(status, ®s->outbound_doorbell_clear); | 301 | writel(status, ®s->outbound_doorbell_clear); |
295 | 302 | ||
303 | /* Dummy readl to force pci flush */ | ||
304 | readl(®s->outbound_doorbell_clear); | ||
305 | |||
296 | return 0; | 306 | return 0; |
297 | } | 307 | } |
298 | /** | 308 | /** |
@@ -318,6 +328,99 @@ static struct megasas_instance_template megasas_instance_template_ppc = { | |||
318 | }; | 328 | }; |
319 | 329 | ||
320 | /** | 330 | /** |
331 | * The following functions are defined for gen2 (deviceid : 0x78 0x79) | ||
332 | * controllers | ||
333 | */ | ||
334 | |||
335 | /** | ||
336 | * megasas_enable_intr_gen2 - Enables interrupts | ||
337 | * @regs: MFI register set | ||
338 | */ | ||
339 | static inline void | ||
340 | megasas_enable_intr_gen2(struct megasas_register_set __iomem *regs) | ||
341 | { | ||
342 | writel(0xFFFFFFFF, &(regs)->outbound_doorbell_clear); | ||
343 | |||
344 | /* write ~0x00000005 (4 & 1) to the intr mask*/ | ||
345 | writel(~MFI_GEN2_ENABLE_INTERRUPT_MASK, &(regs)->outbound_intr_mask); | ||
346 | |||
347 | /* Dummy readl to force pci flush */ | ||
348 | readl(®s->outbound_intr_mask); | ||
349 | } | ||
350 | |||
351 | /** | ||
352 | * megasas_disable_intr_gen2 - Disables interrupt | ||
353 | * @regs: MFI register set | ||
354 | */ | ||
355 | static inline void | ||
356 | megasas_disable_intr_gen2(struct megasas_register_set __iomem *regs) | ||
357 | { | ||
358 | u32 mask = 0xFFFFFFFF; | ||
359 | writel(mask, ®s->outbound_intr_mask); | ||
360 | /* Dummy readl to force pci flush */ | ||
361 | readl(®s->outbound_intr_mask); | ||
362 | } | ||
363 | |||
364 | /** | ||
365 | * megasas_read_fw_status_reg_gen2 - returns the current FW status value | ||
366 | * @regs: MFI register set | ||
367 | */ | ||
368 | static u32 | ||
369 | megasas_read_fw_status_reg_gen2(struct megasas_register_set __iomem *regs) | ||
370 | { | ||
371 | return readl(&(regs)->outbound_scratch_pad); | ||
372 | } | ||
373 | |||
374 | /** | ||
375 | * megasas_clear_interrupt_gen2 - Check & clear interrupt | ||
376 | * @regs: MFI register set | ||
377 | */ | ||
378 | static int | ||
379 | megasas_clear_intr_gen2(struct megasas_register_set __iomem *regs) | ||
380 | { | ||
381 | u32 status; | ||
382 | /* | ||
383 | * Check if it is our interrupt | ||
384 | */ | ||
385 | status = readl(®s->outbound_intr_status); | ||
386 | |||
387 | if (!(status & MFI_GEN2_ENABLE_INTERRUPT_MASK)) | ||
388 | return 1; | ||
389 | |||
390 | /* | ||
391 | * Clear the interrupt by writing back the same value | ||
392 | */ | ||
393 | writel(status, ®s->outbound_doorbell_clear); | ||
394 | |||
395 | /* Dummy readl to force pci flush */ | ||
396 | readl(®s->outbound_intr_status); | ||
397 | |||
398 | return 0; | ||
399 | } | ||
400 | /** | ||
401 | * megasas_fire_cmd_gen2 - Sends command to the FW | ||
402 | * @frame_phys_addr : Physical address of cmd | ||
403 | * @frame_count : Number of frames for the command | ||
404 | * @regs : MFI register set | ||
405 | */ | ||
406 | static inline void | ||
407 | megasas_fire_cmd_gen2(dma_addr_t frame_phys_addr, u32 frame_count, | ||
408 | struct megasas_register_set __iomem *regs) | ||
409 | { | ||
410 | writel((frame_phys_addr | (frame_count<<1))|1, | ||
411 | &(regs)->inbound_queue_port); | ||
412 | } | ||
413 | |||
414 | static struct megasas_instance_template megasas_instance_template_gen2 = { | ||
415 | |||
416 | .fire_cmd = megasas_fire_cmd_gen2, | ||
417 | .enable_intr = megasas_enable_intr_gen2, | ||
418 | .disable_intr = megasas_disable_intr_gen2, | ||
419 | .clear_intr = megasas_clear_intr_gen2, | ||
420 | .read_fw_status_reg = megasas_read_fw_status_reg_gen2, | ||
421 | }; | ||
422 | |||
423 | /** | ||
321 | * This is the end of set of functions & definitions | 424 | * This is the end of set of functions & definitions |
322 | * specific to ppc (deviceid : 0x60) controllers | 425 | * specific to ppc (deviceid : 0x60) controllers |
323 | */ | 426 | */ |
@@ -1976,7 +2079,12 @@ static int megasas_init_mfi(struct megasas_instance *instance) | |||
1976 | /* | 2079 | /* |
1977 | * Map the message registers | 2080 | * Map the message registers |
1978 | */ | 2081 | */ |
1979 | instance->base_addr = pci_resource_start(instance->pdev, 0); | 2082 | if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078GEN2) || |
2083 | (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0079GEN2)) { | ||
2084 | instance->base_addr = pci_resource_start(instance->pdev, 1); | ||
2085 | } else { | ||
2086 | instance->base_addr = pci_resource_start(instance->pdev, 0); | ||
2087 | } | ||
1980 | 2088 | ||
1981 | if (pci_request_regions(instance->pdev, "megasas: LSI")) { | 2089 | if (pci_request_regions(instance->pdev, "megasas: LSI")) { |
1982 | printk(KERN_DEBUG "megasas: IO memory region busy!\n"); | 2090 | printk(KERN_DEBUG "megasas: IO memory region busy!\n"); |
@@ -1998,6 +2106,10 @@ static int megasas_init_mfi(struct megasas_instance *instance) | |||
1998 | case PCI_DEVICE_ID_LSI_SAS1078DE: | 2106 | case PCI_DEVICE_ID_LSI_SAS1078DE: |
1999 | instance->instancet = &megasas_instance_template_ppc; | 2107 | instance->instancet = &megasas_instance_template_ppc; |
2000 | break; | 2108 | break; |
2109 | case PCI_DEVICE_ID_LSI_SAS1078GEN2: | ||
2110 | case PCI_DEVICE_ID_LSI_SAS0079GEN2: | ||
2111 | instance->instancet = &megasas_instance_template_gen2; | ||
2112 | break; | ||
2001 | case PCI_DEVICE_ID_LSI_SAS1064R: | 2113 | case PCI_DEVICE_ID_LSI_SAS1064R: |
2002 | case PCI_DEVICE_ID_DELL_PERC5: | 2114 | case PCI_DEVICE_ID_DELL_PERC5: |
2003 | default: | 2115 | default: |
@@ -2857,6 +2969,7 @@ static void megasas_shutdown(struct pci_dev *pdev) | |||
2857 | { | 2969 | { |
2858 | struct megasas_instance *instance = pci_get_drvdata(pdev); | 2970 | struct megasas_instance *instance = pci_get_drvdata(pdev); |
2859 | megasas_flush_cache(instance); | 2971 | megasas_flush_cache(instance); |
2972 | megasas_shutdown_controller(instance, MR_DCMD_CTRL_SHUTDOWN); | ||
2860 | } | 2973 | } |
2861 | 2974 | ||
2862 | /** | 2975 | /** |
@@ -3292,7 +3405,7 @@ megasas_sysfs_set_dbg_lvl(struct device_driver *dd, const char *buf, size_t coun | |||
3292 | return retval; | 3405 | return retval; |
3293 | } | 3406 | } |
3294 | 3407 | ||
3295 | static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUGO, megasas_sysfs_show_dbg_lvl, | 3408 | static DRIVER_ATTR(dbg_lvl, S_IRUGO|S_IWUSR, megasas_sysfs_show_dbg_lvl, |
3296 | megasas_sysfs_set_dbg_lvl); | 3409 | megasas_sysfs_set_dbg_lvl); |
3297 | 3410 | ||
3298 | static ssize_t | 3411 | static ssize_t |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index b0c41e671702..0d033248fdf1 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
@@ -18,9 +18,9 @@ | |||
18 | /* | 18 | /* |
19 | * MegaRAID SAS Driver meta data | 19 | * MegaRAID SAS Driver meta data |
20 | */ | 20 | */ |
21 | #define MEGASAS_VERSION "00.00.03.20-rc1" | 21 | #define MEGASAS_VERSION "00.00.04.01" |
22 | #define MEGASAS_RELDATE "March 10, 2008" | 22 | #define MEGASAS_RELDATE "July 24, 2008" |
23 | #define MEGASAS_EXT_VERSION "Mon. March 10 11:02:31 PDT 2008" | 23 | #define MEGASAS_EXT_VERSION "Thu July 24 11:41:51 PST 2008" |
24 | 24 | ||
25 | /* | 25 | /* |
26 | * Device IDs | 26 | * Device IDs |
@@ -28,6 +28,8 @@ | |||
28 | #define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 | 28 | #define PCI_DEVICE_ID_LSI_SAS1078R 0x0060 |
29 | #define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C | 29 | #define PCI_DEVICE_ID_LSI_SAS1078DE 0x007C |
30 | #define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 | 30 | #define PCI_DEVICE_ID_LSI_VERDE_ZCR 0x0413 |
31 | #define PCI_DEVICE_ID_LSI_SAS1078GEN2 0x0078 | ||
32 | #define PCI_DEVICE_ID_LSI_SAS0079GEN2 0x0079 | ||
31 | 33 | ||
32 | /* | 34 | /* |
33 | * ===================================== | 35 | * ===================================== |
@@ -580,6 +582,8 @@ struct megasas_ctrl_info { | |||
580 | #define MEGASAS_COMPLETION_TIMER_INTERVAL (HZ/10) | 582 | #define MEGASAS_COMPLETION_TIMER_INTERVAL (HZ/10) |
581 | 583 | ||
582 | #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 | 584 | #define MFI_REPLY_1078_MESSAGE_INTERRUPT 0x80000000 |
585 | #define MFI_REPLY_GEN2_MESSAGE_INTERRUPT 0x00000001 | ||
586 | #define MFI_GEN2_ENABLE_INTERRUPT_MASK (0x00000001 | 0x00000004) | ||
583 | 587 | ||
584 | /* | 588 | /* |
585 | * register set for both 1068 and 1078 controllers | 589 | * register set for both 1068 and 1078 controllers |
diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c index edf9fdb3cb3c..22052bb7becb 100644 --- a/drivers/scsi/nsp32.c +++ b/drivers/scsi/nsp32.c | |||
@@ -23,7 +23,6 @@ | |||
23 | * 1.2: PowerPC (big endian) support. | 23 | * 1.2: PowerPC (big endian) support. |
24 | */ | 24 | */ |
25 | 25 | ||
26 | #include <linux/version.h> | ||
27 | #include <linux/module.h> | 26 | #include <linux/module.h> |
28 | #include <linux/init.h> | 27 | #include <linux/init.h> |
29 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
diff --git a/drivers/scsi/nsp32.h b/drivers/scsi/nsp32.h index 6715ecb3bfca..9565acf1aa72 100644 --- a/drivers/scsi/nsp32.h +++ b/drivers/scsi/nsp32.h | |||
@@ -16,7 +16,6 @@ | |||
16 | #ifndef _NSP32_H | 16 | #ifndef _NSP32_H |
17 | #define _NSP32_H | 17 | #define _NSP32_H |
18 | 18 | ||
19 | #include <linux/version.h> | ||
20 | //#define NSP32_DEBUG 9 | 19 | //#define NSP32_DEBUG 9 |
21 | 20 | ||
22 | /* | 21 | /* |
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c index a221b6ef9fa9..24e6cb8396e3 100644 --- a/drivers/scsi/pcmcia/nsp_cs.c +++ b/drivers/scsi/pcmcia/nsp_cs.c | |||
@@ -25,7 +25,6 @@ | |||
25 | 25 | ||
26 | ***********************************************************************/ | 26 | ***********************************************************************/ |
27 | 27 | ||
28 | #include <linux/version.h> | ||
29 | #include <linux/module.h> | 28 | #include <linux/module.h> |
30 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
31 | #include <linux/init.h> | 30 | #include <linux/init.h> |
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index a319a20ed440..45e7dcb4b34d 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -993,6 +993,17 @@ qla2x00_terminate_rport_io(struct fc_rport *rport) | |||
993 | { | 993 | { |
994 | fc_port_t *fcport = *(fc_port_t **)rport->dd_data; | 994 | fc_port_t *fcport = *(fc_port_t **)rport->dd_data; |
995 | 995 | ||
996 | /* | ||
997 | * At this point all fcport's software-states are cleared. Perform any | ||
998 | * final cleanup of firmware resources (PCBs and XCBs). | ||
999 | */ | ||
1000 | if (fcport->loop_id != FC_NO_LOOP_ID) { | ||
1001 | fcport->ha->isp_ops->fabric_logout(fcport->ha, fcport->loop_id, | ||
1002 | fcport->d_id.b.domain, fcport->d_id.b.area, | ||
1003 | fcport->d_id.b.al_pa); | ||
1004 | fcport->loop_id = FC_NO_LOOP_ID; | ||
1005 | } | ||
1006 | |||
996 | qla2x00_abort_fcport_cmds(fcport); | 1007 | qla2x00_abort_fcport_cmds(fcport); |
997 | scsi_target_unblock(&rport->dev); | 1008 | scsi_target_unblock(&rport->dev); |
998 | } | 1009 | } |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 6da31ba94404..94a720eabfd8 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2237,6 +2237,7 @@ typedef struct scsi_qla_host { | |||
2237 | #define REGISTER_FDMI_NEEDED 26 | 2237 | #define REGISTER_FDMI_NEEDED 26 |
2238 | #define FCPORT_UPDATE_NEEDED 27 | 2238 | #define FCPORT_UPDATE_NEEDED 27 |
2239 | #define VP_DPC_NEEDED 28 /* wake up for VP dpc handling */ | 2239 | #define VP_DPC_NEEDED 28 /* wake up for VP dpc handling */ |
2240 | #define UNLOADING 29 | ||
2240 | 2241 | ||
2241 | uint32_t device_flags; | 2242 | uint32_t device_flags; |
2242 | #define DFLG_LOCAL_DEVICES BIT_0 | 2243 | #define DFLG_LOCAL_DEVICES BIT_0 |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 601a6b29750c..ee89ddd64aae 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -976,8 +976,9 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) | |||
976 | &ha->fw_attributes, &ha->fw_memory_size); | 976 | &ha->fw_attributes, &ha->fw_memory_size); |
977 | qla2x00_resize_request_q(ha); | 977 | qla2x00_resize_request_q(ha); |
978 | ha->flags.npiv_supported = 0; | 978 | ha->flags.npiv_supported = 0; |
979 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha)) && | 979 | if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) || |
980 | (ha->fw_attributes & BIT_2)) { | 980 | IS_QLA84XX(ha)) && |
981 | (ha->fw_attributes & BIT_2)) { | ||
981 | ha->flags.npiv_supported = 1; | 982 | ha->flags.npiv_supported = 1; |
982 | if ((!ha->max_npiv_vports) || | 983 | if ((!ha->max_npiv_vports) || |
983 | ((ha->max_npiv_vports + 1) % | 984 | ((ha->max_npiv_vports + 1) % |
@@ -3251,6 +3252,7 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) | |||
3251 | { | 3252 | { |
3252 | int rval; | 3253 | int rval; |
3253 | uint8_t status = 0; | 3254 | uint8_t status = 0; |
3255 | scsi_qla_host_t *vha; | ||
3254 | 3256 | ||
3255 | if (ha->flags.online) { | 3257 | if (ha->flags.online) { |
3256 | ha->flags.online = 0; | 3258 | ha->flags.online = 0; |
@@ -3265,6 +3267,8 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) | |||
3265 | if (atomic_read(&ha->loop_state) != LOOP_DOWN) { | 3267 | if (atomic_read(&ha->loop_state) != LOOP_DOWN) { |
3266 | atomic_set(&ha->loop_state, LOOP_DOWN); | 3268 | atomic_set(&ha->loop_state, LOOP_DOWN); |
3267 | qla2x00_mark_all_devices_lost(ha, 0); | 3269 | qla2x00_mark_all_devices_lost(ha, 0); |
3270 | list_for_each_entry(vha, &ha->vp_list, vp_list) | ||
3271 | qla2x00_mark_all_devices_lost(vha, 0); | ||
3268 | } else { | 3272 | } else { |
3269 | if (!atomic_read(&ha->loop_down_timer)) | 3273 | if (!atomic_read(&ha->loop_down_timer)) |
3270 | atomic_set(&ha->loop_down_timer, | 3274 | atomic_set(&ha->loop_down_timer, |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 874d802edb7d..45a3b93eed57 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -879,11 +879,12 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t sense_len) | |||
879 | sp->request_sense_ptr += sense_len; | 879 | sp->request_sense_ptr += sense_len; |
880 | sp->request_sense_length -= sense_len; | 880 | sp->request_sense_length -= sense_len; |
881 | if (sp->request_sense_length != 0) | 881 | if (sp->request_sense_length != 0) |
882 | sp->ha->status_srb = sp; | 882 | sp->fcport->ha->status_srb = sp; |
883 | 883 | ||
884 | DEBUG5(printk("%s(): Check condition Sense data, scsi(%ld:%d:%d:%d) " | 884 | DEBUG5(printk("%s(): Check condition Sense data, scsi(%ld:%d:%d:%d) " |
885 | "cmd=%p pid=%ld\n", __func__, sp->ha->host_no, cp->device->channel, | 885 | "cmd=%p pid=%ld\n", __func__, sp->fcport->ha->host_no, |
886 | cp->device->id, cp->device->lun, cp, cp->serial_number)); | 886 | cp->device->channel, cp->device->id, cp->device->lun, cp, |
887 | cp->serial_number)); | ||
887 | if (sense_len) | 888 | if (sense_len) |
888 | DEBUG5(qla2x00_dump_buffer(cp->sense_buffer, | 889 | DEBUG5(qla2x00_dump_buffer(cp->sense_buffer, |
889 | CMD_ACTUAL_SNSLEN(cp))); | 890 | CMD_ACTUAL_SNSLEN(cp))); |
@@ -1184,9 +1185,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
1184 | atomic_read(&fcport->state))); | 1185 | atomic_read(&fcport->state))); |
1185 | 1186 | ||
1186 | cp->result = DID_BUS_BUSY << 16; | 1187 | cp->result = DID_BUS_BUSY << 16; |
1187 | if (atomic_read(&fcport->state) == FCS_ONLINE) { | 1188 | if (atomic_read(&fcport->state) == FCS_ONLINE) |
1188 | qla2x00_mark_device_lost(ha, fcport, 1, 1); | 1189 | qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1); |
1189 | } | ||
1190 | break; | 1190 | break; |
1191 | 1191 | ||
1192 | case CS_RESET: | 1192 | case CS_RESET: |
@@ -1229,7 +1229,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt) | |||
1229 | 1229 | ||
1230 | /* Check to see if logout occurred. */ | 1230 | /* Check to see if logout occurred. */ |
1231 | if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT)) | 1231 | if ((le16_to_cpu(sts->status_flags) & SF_LOGOUT_SENT)) |
1232 | qla2x00_mark_device_lost(ha, fcport, 1, 1); | 1232 | qla2x00_mark_device_lost(fcport->ha, fcport, 1, 1); |
1233 | break; | 1233 | break; |
1234 | 1234 | ||
1235 | default: | 1235 | default: |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index bc90d6b8d0a0..813bc7784c0a 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -2686,7 +2686,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *ha, | |||
2686 | set_bit(VP_IDX_ACQUIRED, &vha->vp_flags); | 2686 | set_bit(VP_IDX_ACQUIRED, &vha->vp_flags); |
2687 | set_bit(VP_DPC_NEEDED, &ha->dpc_flags); | 2687 | set_bit(VP_DPC_NEEDED, &ha->dpc_flags); |
2688 | 2688 | ||
2689 | wake_up_process(ha->dpc_thread); | 2689 | qla2xxx_wake_dpc(ha); |
2690 | } | 2690 | } |
2691 | } | 2691 | } |
2692 | 2692 | ||
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c index 50baf6a1d67c..93560cd72784 100644 --- a/drivers/scsi/qla2xxx/qla_mid.c +++ b/drivers/scsi/qla2xxx/qla_mid.c | |||
@@ -6,7 +6,6 @@ | |||
6 | */ | 6 | */ |
7 | #include "qla_def.h" | 7 | #include "qla_def.h" |
8 | 8 | ||
9 | #include <linux/version.h> | ||
10 | #include <linux/moduleparam.h> | 9 | #include <linux/moduleparam.h> |
11 | #include <linux/vmalloc.h> | 10 | #include <linux/vmalloc.h> |
12 | #include <linux/smp_lock.h> | 11 | #include <linux/smp_lock.h> |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index 7c8af7ed2a5d..26afe44265c7 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -780,7 +780,8 @@ qla2x00_eh_wait_for_pending_commands(scsi_qla_host_t *ha, unsigned int t, | |||
780 | sp = pha->outstanding_cmds[cnt]; | 780 | sp = pha->outstanding_cmds[cnt]; |
781 | if (!sp) | 781 | if (!sp) |
782 | continue; | 782 | continue; |
783 | if (ha->vp_idx != sp->ha->vp_idx) | 783 | |
784 | if (ha->vp_idx != sp->fcport->ha->vp_idx) | ||
784 | continue; | 785 | continue; |
785 | match = 0; | 786 | match = 0; |
786 | switch (type) { | 787 | switch (type) { |
@@ -1080,9 +1081,7 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *ha, int res) | |||
1080 | sp = ha->outstanding_cmds[cnt]; | 1081 | sp = ha->outstanding_cmds[cnt]; |
1081 | if (sp) { | 1082 | if (sp) { |
1082 | ha->outstanding_cmds[cnt] = NULL; | 1083 | ha->outstanding_cmds[cnt] = NULL; |
1083 | sp->flags = 0; | ||
1084 | sp->cmd->result = res; | 1084 | sp->cmd->result = res; |
1085 | sp->cmd->host_scribble = (unsigned char *)NULL; | ||
1086 | qla2x00_sp_compl(ha, sp); | 1085 | qla2x00_sp_compl(ha, sp); |
1087 | } | 1086 | } |
1088 | } | 1087 | } |
@@ -1776,10 +1775,15 @@ probe_out: | |||
1776 | static void | 1775 | static void |
1777 | qla2x00_remove_one(struct pci_dev *pdev) | 1776 | qla2x00_remove_one(struct pci_dev *pdev) |
1778 | { | 1777 | { |
1779 | scsi_qla_host_t *ha; | 1778 | scsi_qla_host_t *ha, *vha, *temp; |
1780 | 1779 | ||
1781 | ha = pci_get_drvdata(pdev); | 1780 | ha = pci_get_drvdata(pdev); |
1782 | 1781 | ||
1782 | list_for_each_entry_safe(vha, temp, &ha->vp_list, vp_list) | ||
1783 | fc_vport_terminate(vha->fc_vport); | ||
1784 | |||
1785 | set_bit(UNLOADING, &ha->dpc_flags); | ||
1786 | |||
1783 | qla2x00_dfs_remove(ha); | 1787 | qla2x00_dfs_remove(ha); |
1784 | 1788 | ||
1785 | qla84xx_put_chip(ha); | 1789 | qla84xx_put_chip(ha); |
@@ -2451,8 +2455,10 @@ qla2x00_do_dpc(void *data) | |||
2451 | void | 2455 | void |
2452 | qla2xxx_wake_dpc(scsi_qla_host_t *ha) | 2456 | qla2xxx_wake_dpc(scsi_qla_host_t *ha) |
2453 | { | 2457 | { |
2454 | if (ha->dpc_thread) | 2458 | struct task_struct *t = ha->dpc_thread; |
2455 | wake_up_process(ha->dpc_thread); | 2459 | |
2460 | if (!test_bit(UNLOADING, &ha->dpc_flags) && t) | ||
2461 | wake_up_process(t); | ||
2456 | } | 2462 | } |
2457 | 2463 | ||
2458 | /* | 2464 | /* |
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index 676c390db354..4160e4caa7b9 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,7 +7,7 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.02.01-k6" | 10 | #define QLA2XXX_VERSION "8.02.01-k7" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 2 | 13 | #define QLA_DRIVER_MINOR_VER 2 |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 3b4a14e355c1..77cb34270fc1 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -449,6 +449,7 @@ config SERIAL_CLPS711X_CONSOLE | |||
449 | config SERIAL_SAMSUNG | 449 | config SERIAL_SAMSUNG |
450 | tristate "Samsung SoC serial support" | 450 | tristate "Samsung SoC serial support" |
451 | depends on ARM && PLAT_S3C24XX | 451 | depends on ARM && PLAT_S3C24XX |
452 | select SERIAL_CORE | ||
452 | help | 453 | help |
453 | Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, | 454 | Support for the on-chip UARTs on the Samsung S3C24XX series CPUs, |
454 | providing /dev/ttySAC0, 1 and 2 (note, some machines may not | 455 | providing /dev/ttySAC0, 1 and 2 (note, some machines may not |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 964124b60db2..75e86865234c 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -226,10 +226,11 @@ EXPORT_SYMBOL_GPL(spi_alloc_device); | |||
226 | * Companion function to spi_alloc_device. Devices allocated with | 226 | * Companion function to spi_alloc_device. Devices allocated with |
227 | * spi_alloc_device can be added onto the spi bus with this function. | 227 | * spi_alloc_device can be added onto the spi bus with this function. |
228 | * | 228 | * |
229 | * Returns 0 on success; non-zero on failure | 229 | * Returns 0 on success; negative errno on failure |
230 | */ | 230 | */ |
231 | int spi_add_device(struct spi_device *spi) | 231 | int spi_add_device(struct spi_device *spi) |
232 | { | 232 | { |
233 | static DEFINE_MUTEX(spi_add_lock); | ||
233 | struct device *dev = spi->master->dev.parent; | 234 | struct device *dev = spi->master->dev.parent; |
234 | int status; | 235 | int status; |
235 | 236 | ||
@@ -246,26 +247,43 @@ int spi_add_device(struct spi_device *spi) | |||
246 | "%s.%u", spi->master->dev.bus_id, | 247 | "%s.%u", spi->master->dev.bus_id, |
247 | spi->chip_select); | 248 | spi->chip_select); |
248 | 249 | ||
249 | /* drivers may modify this initial i/o setup */ | 250 | |
251 | /* We need to make sure there's no other device with this | ||
252 | * chipselect **BEFORE** we call setup(), else we'll trash | ||
253 | * its configuration. Lock against concurrent add() calls. | ||
254 | */ | ||
255 | mutex_lock(&spi_add_lock); | ||
256 | |||
257 | if (bus_find_device_by_name(&spi_bus_type, NULL, spi->dev.bus_id) | ||
258 | != NULL) { | ||
259 | dev_err(dev, "chipselect %d already in use\n", | ||
260 | spi->chip_select); | ||
261 | status = -EBUSY; | ||
262 | goto done; | ||
263 | } | ||
264 | |||
265 | /* Drivers may modify this initial i/o setup, but will | ||
266 | * normally rely on the device being setup. Devices | ||
267 | * using SPI_CS_HIGH can't coexist well otherwise... | ||
268 | */ | ||
250 | status = spi->master->setup(spi); | 269 | status = spi->master->setup(spi); |
251 | if (status < 0) { | 270 | if (status < 0) { |
252 | dev_err(dev, "can't %s %s, status %d\n", | 271 | dev_err(dev, "can't %s %s, status %d\n", |
253 | "setup", spi->dev.bus_id, status); | 272 | "setup", spi->dev.bus_id, status); |
254 | return status; | 273 | goto done; |
255 | } | 274 | } |
256 | 275 | ||
257 | /* driver core catches callers that misbehave by defining | 276 | /* Device may be bound to an active driver when this returns */ |
258 | * devices that already exist. | ||
259 | */ | ||
260 | status = device_add(&spi->dev); | 277 | status = device_add(&spi->dev); |
261 | if (status < 0) { | 278 | if (status < 0) |
262 | dev_err(dev, "can't %s %s, status %d\n", | 279 | dev_err(dev, "can't %s %s, status %d\n", |
263 | "add", spi->dev.bus_id, status); | 280 | "add", spi->dev.bus_id, status); |
264 | return status; | 281 | else |
265 | } | 282 | dev_dbg(dev, "registered child %s\n", spi->dev.bus_id); |
266 | 283 | ||
267 | dev_dbg(dev, "registered child %s\n", spi->dev.bus_id); | 284 | done: |
268 | return 0; | 285 | mutex_unlock(&spi_add_lock); |
286 | return status; | ||
269 | } | 287 | } |
270 | EXPORT_SYMBOL_GPL(spi_add_device); | 288 | EXPORT_SYMBOL_GPL(spi_add_device); |
271 | 289 | ||
diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index d831a2beff39..87ab2443e66d 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c | |||
@@ -1165,15 +1165,19 @@ EXPORT_SYMBOL(ssb_dma_translation); | |||
1165 | 1165 | ||
1166 | int ssb_dma_set_mask(struct ssb_device *dev, u64 mask) | 1166 | int ssb_dma_set_mask(struct ssb_device *dev, u64 mask) |
1167 | { | 1167 | { |
1168 | #ifdef CONFIG_SSB_PCIHOST | ||
1168 | int err; | 1169 | int err; |
1170 | #endif | ||
1169 | 1171 | ||
1170 | switch (dev->bus->bustype) { | 1172 | switch (dev->bus->bustype) { |
1171 | case SSB_BUSTYPE_PCI: | 1173 | case SSB_BUSTYPE_PCI: |
1174 | #ifdef CONFIG_SSB_PCIHOST | ||
1172 | err = pci_set_dma_mask(dev->bus->host_pci, mask); | 1175 | err = pci_set_dma_mask(dev->bus->host_pci, mask); |
1173 | if (err) | 1176 | if (err) |
1174 | return err; | 1177 | return err; |
1175 | err = pci_set_consistent_dma_mask(dev->bus->host_pci, mask); | 1178 | err = pci_set_consistent_dma_mask(dev->bus->host_pci, mask); |
1176 | return err; | 1179 | return err; |
1180 | #endif | ||
1177 | case SSB_BUSTYPE_SSB: | 1181 | case SSB_BUSTYPE_SSB: |
1178 | return dma_set_mask(dev->dev, mask); | 1182 | return dma_set_mask(dev->dev, mask); |
1179 | default: | 1183 | default: |
@@ -1188,6 +1192,7 @@ void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size, | |||
1188 | { | 1192 | { |
1189 | switch (dev->bus->bustype) { | 1193 | switch (dev->bus->bustype) { |
1190 | case SSB_BUSTYPE_PCI: | 1194 | case SSB_BUSTYPE_PCI: |
1195 | #ifdef CONFIG_SSB_PCIHOST | ||
1191 | if (gfp_flags & GFP_DMA) { | 1196 | if (gfp_flags & GFP_DMA) { |
1192 | /* Workaround: The PCI API does not support passing | 1197 | /* Workaround: The PCI API does not support passing |
1193 | * a GFP flag. */ | 1198 | * a GFP flag. */ |
@@ -1195,6 +1200,7 @@ void * ssb_dma_alloc_consistent(struct ssb_device *dev, size_t size, | |||
1195 | size, dma_handle, gfp_flags); | 1200 | size, dma_handle, gfp_flags); |
1196 | } | 1201 | } |
1197 | return pci_alloc_consistent(dev->bus->host_pci, size, dma_handle); | 1202 | return pci_alloc_consistent(dev->bus->host_pci, size, dma_handle); |
1203 | #endif | ||
1198 | case SSB_BUSTYPE_SSB: | 1204 | case SSB_BUSTYPE_SSB: |
1199 | return dma_alloc_coherent(dev->dev, size, dma_handle, gfp_flags); | 1205 | return dma_alloc_coherent(dev->dev, size, dma_handle, gfp_flags); |
1200 | default: | 1206 | default: |
@@ -1210,6 +1216,7 @@ void ssb_dma_free_consistent(struct ssb_device *dev, size_t size, | |||
1210 | { | 1216 | { |
1211 | switch (dev->bus->bustype) { | 1217 | switch (dev->bus->bustype) { |
1212 | case SSB_BUSTYPE_PCI: | 1218 | case SSB_BUSTYPE_PCI: |
1219 | #ifdef CONFIG_SSB_PCIHOST | ||
1213 | if (gfp_flags & GFP_DMA) { | 1220 | if (gfp_flags & GFP_DMA) { |
1214 | /* Workaround: The PCI API does not support passing | 1221 | /* Workaround: The PCI API does not support passing |
1215 | * a GFP flag. */ | 1222 | * a GFP flag. */ |
@@ -1220,6 +1227,7 @@ void ssb_dma_free_consistent(struct ssb_device *dev, size_t size, | |||
1220 | pci_free_consistent(dev->bus->host_pci, size, | 1227 | pci_free_consistent(dev->bus->host_pci, size, |
1221 | vaddr, dma_handle); | 1228 | vaddr, dma_handle); |
1222 | return; | 1229 | return; |
1230 | #endif | ||
1223 | case SSB_BUSTYPE_SSB: | 1231 | case SSB_BUSTYPE_SSB: |
1224 | dma_free_coherent(dev->dev, size, vaddr, dma_handle); | 1232 | dma_free_coherent(dev->dev, size, vaddr, dma_handle); |
1225 | return; | 1233 | return; |
diff --git a/drivers/uio/Kconfig b/drivers/uio/Kconfig index 2e9079df26b3..4190be64917f 100644 --- a/drivers/uio/Kconfig +++ b/drivers/uio/Kconfig | |||
@@ -33,6 +33,19 @@ config UIO_PDRV | |||
33 | 33 | ||
34 | If you don't know what to do here, say N. | 34 | If you don't know what to do here, say N. |
35 | 35 | ||
36 | config UIO_PDRV_GENIRQ | ||
37 | tristate "Userspace I/O platform driver with generic IRQ handling" | ||
38 | help | ||
39 | Platform driver for Userspace I/O devices, including generic | ||
40 | interrupt handling code. Shared interrupts are not supported. | ||
41 | |||
42 | This kernel driver requires that the matching userspace driver | ||
43 | handles interrupts in a special way. Userspace is responsible | ||
44 | for acknowledging the hardware device if needed, and re-enabling | ||
45 | interrupts in the interrupt controller using the write() syscall. | ||
46 | |||
47 | If you don't know what to do here, say N. | ||
48 | |||
36 | config UIO_SMX | 49 | config UIO_SMX |
37 | tristate "SMX cryptengine UIO interface" | 50 | tristate "SMX cryptengine UIO interface" |
38 | default n | 51 | default n |
diff --git a/drivers/uio/Makefile b/drivers/uio/Makefile index e00ce0def1a0..8667bbdef904 100644 --- a/drivers/uio/Makefile +++ b/drivers/uio/Makefile | |||
@@ -1,4 +1,5 @@ | |||
1 | obj-$(CONFIG_UIO) += uio.o | 1 | obj-$(CONFIG_UIO) += uio.o |
2 | obj-$(CONFIG_UIO_CIF) += uio_cif.o | 2 | obj-$(CONFIG_UIO_CIF) += uio_cif.o |
3 | obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o | 3 | obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o |
4 | obj-$(CONFIG_UIO_PDRV_GENIRQ) += uio_pdrv_genirq.o | ||
4 | obj-$(CONFIG_UIO_SMX) += uio_smx.o | 5 | obj-$(CONFIG_UIO_SMX) += uio_smx.o |
diff --git a/drivers/uio/uio_pdrv.c b/drivers/uio/uio_pdrv.c index 5d0d2e85d982..0b4ef39cd85d 100644 --- a/drivers/uio/uio_pdrv.c +++ b/drivers/uio/uio_pdrv.c | |||
@@ -88,6 +88,8 @@ static int uio_pdrv_remove(struct platform_device *pdev) | |||
88 | 88 | ||
89 | uio_unregister_device(pdata->uioinfo); | 89 | uio_unregister_device(pdata->uioinfo); |
90 | 90 | ||
91 | kfree(pdata); | ||
92 | |||
91 | return 0; | 93 | return 0; |
92 | } | 94 | } |
93 | 95 | ||
@@ -114,5 +116,5 @@ module_exit(uio_pdrv_exit); | |||
114 | 116 | ||
115 | MODULE_AUTHOR("Uwe Kleine-Koenig"); | 117 | MODULE_AUTHOR("Uwe Kleine-Koenig"); |
116 | MODULE_DESCRIPTION("Userspace I/O platform driver"); | 118 | MODULE_DESCRIPTION("Userspace I/O platform driver"); |
117 | MODULE_LICENSE("GPL"); | 119 | MODULE_LICENSE("GPL v2"); |
118 | MODULE_ALIAS("platform:" DRIVER_NAME); | 120 | MODULE_ALIAS("platform:" DRIVER_NAME); |
diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c new file mode 100644 index 000000000000..1f82c83a92ae --- /dev/null +++ b/drivers/uio/uio_pdrv_genirq.c | |||
@@ -0,0 +1,188 @@ | |||
1 | /* | ||
2 | * drivers/uio/uio_pdrv_genirq.c | ||
3 | * | ||
4 | * Userspace I/O platform driver with generic IRQ handling code. | ||
5 | * | ||
6 | * Copyright (C) 2008 Magnus Damm | ||
7 | * | ||
8 | * Based on uio_pdrv.c by Uwe Kleine-Koenig, | ||
9 | * Copyright (C) 2008 by Digi International Inc. | ||
10 | * All rights reserved. | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or modify it | ||
13 | * under the terms of the GNU General Public License version 2 as published by | ||
14 | * the Free Software Foundation. | ||
15 | */ | ||
16 | |||
17 | #include <linux/platform_device.h> | ||
18 | #include <linux/uio_driver.h> | ||
19 | #include <linux/spinlock.h> | ||
20 | #include <linux/bitops.h> | ||
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/stringify.h> | ||
23 | |||
24 | #define DRIVER_NAME "uio_pdrv_genirq" | ||
25 | |||
26 | struct uio_pdrv_genirq_platdata { | ||
27 | struct uio_info *uioinfo; | ||
28 | spinlock_t lock; | ||
29 | unsigned long flags; | ||
30 | }; | ||
31 | |||
32 | static irqreturn_t uio_pdrv_genirq_handler(int irq, struct uio_info *dev_info) | ||
33 | { | ||
34 | struct uio_pdrv_genirq_platdata *priv = dev_info->priv; | ||
35 | |||
36 | /* Just disable the interrupt in the interrupt controller, and | ||
37 | * remember the state so we can allow user space to enable it later. | ||
38 | */ | ||
39 | |||
40 | if (!test_and_set_bit(0, &priv->flags)) | ||
41 | disable_irq_nosync(irq); | ||
42 | |||
43 | return IRQ_HANDLED; | ||
44 | } | ||
45 | |||
46 | static int uio_pdrv_genirq_irqcontrol(struct uio_info *dev_info, s32 irq_on) | ||
47 | { | ||
48 | struct uio_pdrv_genirq_platdata *priv = dev_info->priv; | ||
49 | unsigned long flags; | ||
50 | |||
51 | /* Allow user space to enable and disable the interrupt | ||
52 | * in the interrupt controller, but keep track of the | ||
53 | * state to prevent per-irq depth damage. | ||
54 | * | ||
55 | * Serialize this operation to support multiple tasks. | ||
56 | */ | ||
57 | |||
58 | spin_lock_irqsave(&priv->lock, flags); | ||
59 | if (irq_on) { | ||
60 | if (test_and_clear_bit(0, &priv->flags)) | ||
61 | enable_irq(dev_info->irq); | ||
62 | } else { | ||
63 | if (!test_and_set_bit(0, &priv->flags)) | ||
64 | disable_irq(dev_info->irq); | ||
65 | } | ||
66 | spin_unlock_irqrestore(&priv->lock, flags); | ||
67 | |||
68 | return 0; | ||
69 | } | ||
70 | |||
71 | static int uio_pdrv_genirq_probe(struct platform_device *pdev) | ||
72 | { | ||
73 | struct uio_info *uioinfo = pdev->dev.platform_data; | ||
74 | struct uio_pdrv_genirq_platdata *priv; | ||
75 | struct uio_mem *uiomem; | ||
76 | int ret = -EINVAL; | ||
77 | int i; | ||
78 | |||
79 | if (!uioinfo || !uioinfo->name || !uioinfo->version) { | ||
80 | dev_err(&pdev->dev, "missing platform_data\n"); | ||
81 | goto bad0; | ||
82 | } | ||
83 | |||
84 | if (uioinfo->handler || uioinfo->irqcontrol || uioinfo->irq_flags) { | ||
85 | dev_err(&pdev->dev, "interrupt configuration error\n"); | ||
86 | goto bad0; | ||
87 | } | ||
88 | |||
89 | priv = kzalloc(sizeof(*priv), GFP_KERNEL); | ||
90 | if (!priv) { | ||
91 | ret = -ENOMEM; | ||
92 | dev_err(&pdev->dev, "unable to kmalloc\n"); | ||
93 | goto bad0; | ||
94 | } | ||
95 | |||
96 | priv->uioinfo = uioinfo; | ||
97 | spin_lock_init(&priv->lock); | ||
98 | priv->flags = 0; /* interrupt is enabled to begin with */ | ||
99 | |||
100 | uiomem = &uioinfo->mem[0]; | ||
101 | |||
102 | for (i = 0; i < pdev->num_resources; ++i) { | ||
103 | struct resource *r = &pdev->resource[i]; | ||
104 | |||
105 | if (r->flags != IORESOURCE_MEM) | ||
106 | continue; | ||
107 | |||
108 | if (uiomem >= &uioinfo->mem[MAX_UIO_MAPS]) { | ||
109 | dev_warn(&pdev->dev, "device has more than " | ||
110 | __stringify(MAX_UIO_MAPS) | ||
111 | " I/O memory resources.\n"); | ||
112 | break; | ||
113 | } | ||
114 | |||
115 | uiomem->memtype = UIO_MEM_PHYS; | ||
116 | uiomem->addr = r->start; | ||
117 | uiomem->size = r->end - r->start + 1; | ||
118 | ++uiomem; | ||
119 | } | ||
120 | |||
121 | while (uiomem < &uioinfo->mem[MAX_UIO_MAPS]) { | ||
122 | uiomem->size = 0; | ||
123 | ++uiomem; | ||
124 | } | ||
125 | |||
126 | /* This driver requires no hardware specific kernel code to handle | ||
127 | * interrupts. Instead, the interrupt handler simply disables the | ||
128 | * interrupt in the interrupt controller. User space is responsible | ||
129 | * for performing hardware specific acknowledge and re-enabling of | ||
130 | * the interrupt in the interrupt controller. | ||
131 | * | ||
132 | * Interrupt sharing is not supported. | ||
133 | */ | ||
134 | |||
135 | uioinfo->irq_flags = IRQF_DISABLED; | ||
136 | uioinfo->handler = uio_pdrv_genirq_handler; | ||
137 | uioinfo->irqcontrol = uio_pdrv_genirq_irqcontrol; | ||
138 | uioinfo->priv = priv; | ||
139 | |||
140 | ret = uio_register_device(&pdev->dev, priv->uioinfo); | ||
141 | if (ret) { | ||
142 | dev_err(&pdev->dev, "unable to register uio device\n"); | ||
143 | goto bad1; | ||
144 | } | ||
145 | |||
146 | platform_set_drvdata(pdev, priv); | ||
147 | return 0; | ||
148 | bad1: | ||
149 | kfree(priv); | ||
150 | bad0: | ||
151 | return ret; | ||
152 | } | ||
153 | |||
154 | static int uio_pdrv_genirq_remove(struct platform_device *pdev) | ||
155 | { | ||
156 | struct uio_pdrv_genirq_platdata *priv = platform_get_drvdata(pdev); | ||
157 | |||
158 | uio_unregister_device(priv->uioinfo); | ||
159 | kfree(priv); | ||
160 | return 0; | ||
161 | } | ||
162 | |||
163 | static struct platform_driver uio_pdrv_genirq = { | ||
164 | .probe = uio_pdrv_genirq_probe, | ||
165 | .remove = uio_pdrv_genirq_remove, | ||
166 | .driver = { | ||
167 | .name = DRIVER_NAME, | ||
168 | .owner = THIS_MODULE, | ||
169 | }, | ||
170 | }; | ||
171 | |||
172 | static int __init uio_pdrv_genirq_init(void) | ||
173 | { | ||
174 | return platform_driver_register(&uio_pdrv_genirq); | ||
175 | } | ||
176 | |||
177 | static void __exit uio_pdrv_genirq_exit(void) | ||
178 | { | ||
179 | platform_driver_unregister(&uio_pdrv_genirq); | ||
180 | } | ||
181 | |||
182 | module_init(uio_pdrv_genirq_init); | ||
183 | module_exit(uio_pdrv_genirq_exit); | ||
184 | |||
185 | MODULE_AUTHOR("Magnus Damm"); | ||
186 | MODULE_DESCRIPTION("Userspace I/O platform driver with generic IRQ handling"); | ||
187 | MODULE_LICENSE("GPL v2"); | ||
188 | MODULE_ALIAS("platform:" DRIVER_NAME); | ||
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index cb01b5106efd..b6483dd98acc 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c | |||
@@ -64,7 +64,6 @@ | |||
64 | #include <linux/ctype.h> | 64 | #include <linux/ctype.h> |
65 | #include <linux/sched.h> | 65 | #include <linux/sched.h> |
66 | #include <linux/kthread.h> | 66 | #include <linux/kthread.h> |
67 | #include <linux/version.h> | ||
68 | #include <linux/mutex.h> | 67 | #include <linux/mutex.h> |
69 | #include <linux/freezer.h> | 68 | #include <linux/freezer.h> |
70 | 69 | ||
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index efc4373ededb..c257453fa9de 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -589,8 +589,8 @@ static int acm_tty_open(struct tty_struct *tty, struct file *filp) | |||
589 | tasklet_schedule(&acm->urb_task); | 589 | tasklet_schedule(&acm->urb_task); |
590 | 590 | ||
591 | done: | 591 | done: |
592 | err_out: | ||
593 | mutex_unlock(&acm->mutex); | 592 | mutex_unlock(&acm->mutex); |
593 | err_out: | ||
594 | mutex_unlock(&open_mutex); | 594 | mutex_unlock(&open_mutex); |
595 | return rv; | 595 | return rv; |
596 | 596 | ||
@@ -1362,6 +1362,9 @@ static struct usb_device_id acm_ids[] = { | |||
1362 | { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */ | 1362 | { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */ |
1363 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | 1363 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
1364 | }, | 1364 | }, |
1365 | { USB_DEVICE(0x0572, 0x1321), /* Conexant USB MODEM CX93010 */ | ||
1366 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
1367 | }, | ||
1365 | 1368 | ||
1366 | /* control interfaces with various AT-command sets */ | 1369 | /* control interfaces with various AT-command sets */ |
1367 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | 1370 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 2be37fe466f2..5a7fa6f09958 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -230,6 +230,13 @@ static int usb_probe_interface(struct device *dev) | |||
230 | */ | 230 | */ |
231 | intf->pm_usage_cnt = !(driver->supports_autosuspend); | 231 | intf->pm_usage_cnt = !(driver->supports_autosuspend); |
232 | 232 | ||
233 | /* Carry out a deferred switch to altsetting 0 */ | ||
234 | if (intf->needs_altsetting0) { | ||
235 | usb_set_interface(udev, intf->altsetting[0]. | ||
236 | desc.bInterfaceNumber, 0); | ||
237 | intf->needs_altsetting0 = 0; | ||
238 | } | ||
239 | |||
233 | error = driver->probe(intf, id); | 240 | error = driver->probe(intf, id); |
234 | if (error) { | 241 | if (error) { |
235 | mark_quiesced(intf); | 242 | mark_quiesced(intf); |
@@ -266,8 +273,17 @@ static int usb_unbind_interface(struct device *dev) | |||
266 | 273 | ||
267 | driver->disconnect(intf); | 274 | driver->disconnect(intf); |
268 | 275 | ||
269 | /* reset other interface state */ | 276 | /* Reset other interface state. |
270 | usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0); | 277 | * We cannot do a Set-Interface if the device is suspended or |
278 | * if it is prepared for a system sleep (since installing a new | ||
279 | * altsetting means creating new endpoint device entries). | ||
280 | * When either of these happens, defer the Set-Interface. | ||
281 | */ | ||
282 | if (!error && intf->dev.power.status == DPM_ON) | ||
283 | usb_set_interface(udev, intf->altsetting[0]. | ||
284 | desc.bInterfaceNumber, 0); | ||
285 | else | ||
286 | intf->needs_altsetting0 = 1; | ||
271 | usb_set_intfdata(intf, NULL); | 287 | usb_set_intfdata(intf, NULL); |
272 | 288 | ||
273 | intf->condition = USB_INTERFACE_UNBOUND; | 289 | intf->condition = USB_INTERFACE_UNBOUND; |
@@ -798,7 +814,8 @@ void usb_forced_unbind_intf(struct usb_interface *intf) | |||
798 | * The caller must hold @intf's device's lock, but not its pm_mutex | 814 | * The caller must hold @intf's device's lock, but not its pm_mutex |
799 | * and not @intf->dev.sem. | 815 | * and not @intf->dev.sem. |
800 | * | 816 | * |
801 | * FIXME: The caller must block system sleep transitions. | 817 | * Note: Rebinds will be skipped if a system sleep transition is in |
818 | * progress and the PM "complete" callback hasn't occurred yet. | ||
802 | */ | 819 | */ |
803 | void usb_rebind_intf(struct usb_interface *intf) | 820 | void usb_rebind_intf(struct usb_interface *intf) |
804 | { | 821 | { |
@@ -814,10 +831,12 @@ void usb_rebind_intf(struct usb_interface *intf) | |||
814 | } | 831 | } |
815 | 832 | ||
816 | /* Try to rebind the interface */ | 833 | /* Try to rebind the interface */ |
817 | intf->needs_binding = 0; | 834 | if (intf->dev.power.status == DPM_ON) { |
818 | rc = device_attach(&intf->dev); | 835 | intf->needs_binding = 0; |
819 | if (rc < 0) | 836 | rc = device_attach(&intf->dev); |
820 | dev_warn(&intf->dev, "rebind failed: %d\n", rc); | 837 | if (rc < 0) |
838 | dev_warn(&intf->dev, "rebind failed: %d\n", rc); | ||
839 | } | ||
821 | } | 840 | } |
822 | 841 | ||
823 | #ifdef CONFIG_PM | 842 | #ifdef CONFIG_PM |
@@ -829,7 +848,6 @@ void usb_rebind_intf(struct usb_interface *intf) | |||
829 | * or rebind interfaces that have been unbound, according to @action. | 848 | * or rebind interfaces that have been unbound, according to @action. |
830 | * | 849 | * |
831 | * The caller must hold @udev's device lock. | 850 | * The caller must hold @udev's device lock. |
832 | * FIXME: For rebinds, the caller must block system sleep transitions. | ||
833 | */ | 851 | */ |
834 | static void do_unbind_rebind(struct usb_device *udev, int action) | 852 | static void do_unbind_rebind(struct usb_device *udev, int action) |
835 | { | 853 | { |
@@ -851,22 +869,8 @@ static void do_unbind_rebind(struct usb_device *udev, int action) | |||
851 | } | 869 | } |
852 | break; | 870 | break; |
853 | case DO_REBIND: | 871 | case DO_REBIND: |
854 | if (intf->needs_binding) { | 872 | if (intf->needs_binding) |
855 | |||
856 | /* FIXME: The next line is needed because we are going to probe | ||
857 | * the interface, but as far as the PM core is concerned the | ||
858 | * interface is still suspended. The problem wouldn't exist | ||
859 | * if we could rebind the interface during the interface's own | ||
860 | * resume() call, but at the time the usb_device isn't locked! | ||
861 | * | ||
862 | * The real solution will be to carry this out during the device's | ||
863 | * complete() callback. Until that is implemented, we have to | ||
864 | * use this hack. | ||
865 | */ | ||
866 | // intf->dev.power.sleeping = 0; | ||
867 | |||
868 | usb_rebind_intf(intf); | 873 | usb_rebind_intf(intf); |
869 | } | ||
870 | break; | 874 | break; |
871 | } | 875 | } |
872 | } | 876 | } |
@@ -926,14 +930,14 @@ static int usb_resume_device(struct usb_device *udev) | |||
926 | } | 930 | } |
927 | 931 | ||
928 | /* Caller has locked intf's usb_device's pm mutex */ | 932 | /* Caller has locked intf's usb_device's pm mutex */ |
929 | static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg) | 933 | static int usb_suspend_interface(struct usb_device *udev, |
934 | struct usb_interface *intf, pm_message_t msg) | ||
930 | { | 935 | { |
931 | struct usb_driver *driver; | 936 | struct usb_driver *driver; |
932 | int status = 0; | 937 | int status = 0; |
933 | 938 | ||
934 | /* with no hardware, USB interfaces only use FREEZE and ON states */ | 939 | /* with no hardware, USB interfaces only use FREEZE and ON states */ |
935 | if (interface_to_usbdev(intf)->state == USB_STATE_NOTATTACHED || | 940 | if (udev->state == USB_STATE_NOTATTACHED || !is_active(intf)) |
936 | !is_active(intf)) | ||
937 | goto done; | 941 | goto done; |
938 | 942 | ||
939 | if (intf->condition == USB_INTERFACE_UNBOUND) /* This can't happen */ | 943 | if (intf->condition == USB_INTERFACE_UNBOUND) /* This can't happen */ |
@@ -944,7 +948,7 @@ static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg) | |||
944 | status = driver->suspend(intf, msg); | 948 | status = driver->suspend(intf, msg); |
945 | if (status == 0) | 949 | if (status == 0) |
946 | mark_quiesced(intf); | 950 | mark_quiesced(intf); |
947 | else if (!interface_to_usbdev(intf)->auto_pm) | 951 | else if (!udev->auto_pm) |
948 | dev_err(&intf->dev, "%s error %d\n", | 952 | dev_err(&intf->dev, "%s error %d\n", |
949 | "suspend", status); | 953 | "suspend", status); |
950 | } else { | 954 | } else { |
@@ -961,13 +965,13 @@ static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg) | |||
961 | } | 965 | } |
962 | 966 | ||
963 | /* Caller has locked intf's usb_device's pm_mutex */ | 967 | /* Caller has locked intf's usb_device's pm_mutex */ |
964 | static int usb_resume_interface(struct usb_interface *intf, int reset_resume) | 968 | static int usb_resume_interface(struct usb_device *udev, |
969 | struct usb_interface *intf, int reset_resume) | ||
965 | { | 970 | { |
966 | struct usb_driver *driver; | 971 | struct usb_driver *driver; |
967 | int status = 0; | 972 | int status = 0; |
968 | 973 | ||
969 | if (interface_to_usbdev(intf)->state == USB_STATE_NOTATTACHED || | 974 | if (udev->state == USB_STATE_NOTATTACHED || is_active(intf)) |
970 | is_active(intf)) | ||
971 | goto done; | 975 | goto done; |
972 | 976 | ||
973 | /* Don't let autoresume interfere with unbinding */ | 977 | /* Don't let autoresume interfere with unbinding */ |
@@ -975,8 +979,17 @@ static int usb_resume_interface(struct usb_interface *intf, int reset_resume) | |||
975 | goto done; | 979 | goto done; |
976 | 980 | ||
977 | /* Can't resume it if it doesn't have a driver. */ | 981 | /* Can't resume it if it doesn't have a driver. */ |
978 | if (intf->condition == USB_INTERFACE_UNBOUND) | 982 | if (intf->condition == USB_INTERFACE_UNBOUND) { |
983 | |||
984 | /* Carry out a deferred switch to altsetting 0 */ | ||
985 | if (intf->needs_altsetting0 && | ||
986 | intf->dev.power.status == DPM_ON) { | ||
987 | usb_set_interface(udev, intf->altsetting[0]. | ||
988 | desc.bInterfaceNumber, 0); | ||
989 | intf->needs_altsetting0 = 0; | ||
990 | } | ||
979 | goto done; | 991 | goto done; |
992 | } | ||
980 | 993 | ||
981 | /* Don't resume if the interface is marked for rebinding */ | 994 | /* Don't resume if the interface is marked for rebinding */ |
982 | if (intf->needs_binding) | 995 | if (intf->needs_binding) |
@@ -1151,7 +1164,7 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
1151 | if (udev->actconfig) { | 1164 | if (udev->actconfig) { |
1152 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { | 1165 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { |
1153 | intf = udev->actconfig->interface[i]; | 1166 | intf = udev->actconfig->interface[i]; |
1154 | status = usb_suspend_interface(intf, msg); | 1167 | status = usb_suspend_interface(udev, intf, msg); |
1155 | if (status != 0) | 1168 | if (status != 0) |
1156 | break; | 1169 | break; |
1157 | } | 1170 | } |
@@ -1163,7 +1176,7 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
1163 | if (status != 0) { | 1176 | if (status != 0) { |
1164 | while (--i >= 0) { | 1177 | while (--i >= 0) { |
1165 | intf = udev->actconfig->interface[i]; | 1178 | intf = udev->actconfig->interface[i]; |
1166 | usb_resume_interface(intf, 0); | 1179 | usb_resume_interface(udev, intf, 0); |
1167 | } | 1180 | } |
1168 | 1181 | ||
1169 | /* Try another autosuspend when the interfaces aren't busy */ | 1182 | /* Try another autosuspend when the interfaces aren't busy */ |
@@ -1276,7 +1289,7 @@ static int usb_resume_both(struct usb_device *udev) | |||
1276 | if (status == 0 && udev->actconfig) { | 1289 | if (status == 0 && udev->actconfig) { |
1277 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | 1290 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { |
1278 | intf = udev->actconfig->interface[i]; | 1291 | intf = udev->actconfig->interface[i]; |
1279 | usb_resume_interface(intf, udev->reset_resume); | 1292 | usb_resume_interface(udev, intf, udev->reset_resume); |
1280 | } | 1293 | } |
1281 | } | 1294 | } |
1282 | 1295 | ||
@@ -1605,12 +1618,10 @@ int usb_external_resume_device(struct usb_device *udev) | |||
1605 | return status; | 1618 | return status; |
1606 | } | 1619 | } |
1607 | 1620 | ||
1608 | static int usb_suspend(struct device *dev, pm_message_t message) | 1621 | int usb_suspend(struct device *dev, pm_message_t message) |
1609 | { | 1622 | { |
1610 | struct usb_device *udev; | 1623 | struct usb_device *udev; |
1611 | 1624 | ||
1612 | if (!is_usb_device(dev)) /* Ignore PM for interfaces */ | ||
1613 | return 0; | ||
1614 | udev = to_usb_device(dev); | 1625 | udev = to_usb_device(dev); |
1615 | 1626 | ||
1616 | /* If udev is already suspended, we can skip this suspend and | 1627 | /* If udev is already suspended, we can skip this suspend and |
@@ -1629,12 +1640,10 @@ static int usb_suspend(struct device *dev, pm_message_t message) | |||
1629 | return usb_external_suspend_device(udev, message); | 1640 | return usb_external_suspend_device(udev, message); |
1630 | } | 1641 | } |
1631 | 1642 | ||
1632 | static int usb_resume(struct device *dev) | 1643 | int usb_resume(struct device *dev) |
1633 | { | 1644 | { |
1634 | struct usb_device *udev; | 1645 | struct usb_device *udev; |
1635 | 1646 | ||
1636 | if (!is_usb_device(dev)) /* Ignore PM for interfaces */ | ||
1637 | return 0; | ||
1638 | udev = to_usb_device(dev); | 1647 | udev = to_usb_device(dev); |
1639 | 1648 | ||
1640 | /* If udev->skip_sys_resume is set then udev was already suspended | 1649 | /* If udev->skip_sys_resume is set then udev was already suspended |
@@ -1646,17 +1655,10 @@ static int usb_resume(struct device *dev) | |||
1646 | return usb_external_resume_device(udev); | 1655 | return usb_external_resume_device(udev); |
1647 | } | 1656 | } |
1648 | 1657 | ||
1649 | #else | ||
1650 | |||
1651 | #define usb_suspend NULL | ||
1652 | #define usb_resume NULL | ||
1653 | |||
1654 | #endif /* CONFIG_PM */ | 1658 | #endif /* CONFIG_PM */ |
1655 | 1659 | ||
1656 | struct bus_type usb_bus_type = { | 1660 | struct bus_type usb_bus_type = { |
1657 | .name = "usb", | 1661 | .name = "usb", |
1658 | .match = usb_device_match, | 1662 | .match = usb_device_match, |
1659 | .uevent = usb_uevent, | 1663 | .uevent = usb_uevent, |
1660 | .suspend = usb_suspend, | ||
1661 | .resume = usb_resume, | ||
1662 | }; | 1664 | }; |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index f7bfd72ef115..8abd4e59bf4a 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -924,15 +924,6 @@ static int register_root_hub(struct usb_hcd *hcd) | |||
924 | return retval; | 924 | return retval; |
925 | } | 925 | } |
926 | 926 | ||
927 | void usb_enable_root_hub_irq (struct usb_bus *bus) | ||
928 | { | ||
929 | struct usb_hcd *hcd; | ||
930 | |||
931 | hcd = container_of (bus, struct usb_hcd, self); | ||
932 | if (hcd->driver->hub_irq_enable && hcd->state != HC_STATE_HALT) | ||
933 | hcd->driver->hub_irq_enable (hcd); | ||
934 | } | ||
935 | |||
936 | 927 | ||
937 | /*-------------------------------------------------------------------------*/ | 928 | /*-------------------------------------------------------------------------*/ |
938 | 929 | ||
diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h index 5b0b59b0d89b..e710ce04e228 100644 --- a/drivers/usb/core/hcd.h +++ b/drivers/usb/core/hcd.h | |||
@@ -212,8 +212,6 @@ struct hc_driver { | |||
212 | int (*bus_suspend)(struct usb_hcd *); | 212 | int (*bus_suspend)(struct usb_hcd *); |
213 | int (*bus_resume)(struct usb_hcd *); | 213 | int (*bus_resume)(struct usb_hcd *); |
214 | int (*start_port_reset)(struct usb_hcd *, unsigned port_num); | 214 | int (*start_port_reset)(struct usb_hcd *, unsigned port_num); |
215 | void (*hub_irq_enable)(struct usb_hcd *); | ||
216 | /* Needed only if port-change IRQs are level-triggered */ | ||
217 | 215 | ||
218 | /* force handover of high-speed port to full-speed companion */ | 216 | /* force handover of high-speed port to full-speed companion */ |
219 | void (*relinquish_port)(struct usb_hcd *, int); | 217 | void (*relinquish_port)(struct usb_hcd *, int); |
@@ -379,8 +377,6 @@ extern struct list_head usb_bus_list; | |||
379 | extern struct mutex usb_bus_list_lock; | 377 | extern struct mutex usb_bus_list_lock; |
380 | extern wait_queue_head_t usb_kill_urb_queue; | 378 | extern wait_queue_head_t usb_kill_urb_queue; |
381 | 379 | ||
382 | extern void usb_enable_root_hub_irq(struct usb_bus *bus); | ||
383 | |||
384 | extern int usb_find_interface_driver(struct usb_device *dev, | 380 | extern int usb_find_interface_driver(struct usb_device *dev, |
385 | struct usb_interface *interface); | 381 | struct usb_interface *interface); |
386 | 382 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 107e1d25ddec..6a5cb018383d 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -2102,8 +2102,6 @@ int usb_port_resume(struct usb_device *udev) | |||
2102 | } | 2102 | } |
2103 | 2103 | ||
2104 | clear_bit(port1, hub->busy_bits); | 2104 | clear_bit(port1, hub->busy_bits); |
2105 | if (!hub->hdev->parent && !hub->busy_bits[0]) | ||
2106 | usb_enable_root_hub_irq(hub->hdev->bus); | ||
2107 | 2105 | ||
2108 | status = check_port_resume_type(udev, | 2106 | status = check_port_resume_type(udev, |
2109 | hub, port1, status, portchange, portstatus); | 2107 | hub, port1, status, portchange, portstatus); |
@@ -3081,11 +3079,6 @@ static void hub_events(void) | |||
3081 | } | 3079 | } |
3082 | } | 3080 | } |
3083 | 3081 | ||
3084 | /* If this is a root hub, tell the HCD it's okay to | ||
3085 | * re-enable port-change interrupts now. */ | ||
3086 | if (!hdev->parent && !hub->busy_bits[0]) | ||
3087 | usb_enable_root_hub_irq(hdev->bus); | ||
3088 | |||
3089 | loop_autopm: | 3082 | loop_autopm: |
3090 | /* Allow autosuspend if we're not going to run again */ | 3083 | /* Allow autosuspend if we're not going to run again */ |
3091 | if (list_empty(&hub->event_list)) | 3084 | if (list_empty(&hub->event_list)) |
@@ -3311,8 +3304,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | |||
3311 | break; | 3304 | break; |
3312 | } | 3305 | } |
3313 | clear_bit(port1, parent_hub->busy_bits); | 3306 | clear_bit(port1, parent_hub->busy_bits); |
3314 | if (!parent_hdev->parent && !parent_hub->busy_bits[0]) | ||
3315 | usb_enable_root_hub_irq(parent_hdev->bus); | ||
3316 | 3307 | ||
3317 | if (ret < 0) | 3308 | if (ret < 0) |
3318 | goto re_enumerate; | 3309 | goto re_enumerate; |
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index c0b1ae25ae2a..47111e88f791 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c | |||
@@ -601,15 +601,20 @@ EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs); | |||
601 | void usb_unlink_anchored_urbs(struct usb_anchor *anchor) | 601 | void usb_unlink_anchored_urbs(struct usb_anchor *anchor) |
602 | { | 602 | { |
603 | struct urb *victim; | 603 | struct urb *victim; |
604 | unsigned long flags; | ||
604 | 605 | ||
605 | spin_lock_irq(&anchor->lock); | 606 | spin_lock_irqsave(&anchor->lock, flags); |
606 | while (!list_empty(&anchor->urb_list)) { | 607 | while (!list_empty(&anchor->urb_list)) { |
607 | victim = list_entry(anchor->urb_list.prev, struct urb, | 608 | victim = list_entry(anchor->urb_list.prev, struct urb, |
608 | anchor_list); | 609 | anchor_list); |
610 | usb_get_urb(victim); | ||
611 | spin_unlock_irqrestore(&anchor->lock, flags); | ||
609 | /* this will unanchor the URB */ | 612 | /* this will unanchor the URB */ |
610 | usb_unlink_urb(victim); | 613 | usb_unlink_urb(victim); |
614 | usb_put_urb(victim); | ||
615 | spin_lock_irqsave(&anchor->lock, flags); | ||
611 | } | 616 | } |
612 | spin_unlock_irq(&anchor->lock); | 617 | spin_unlock_irqrestore(&anchor->lock, flags); |
613 | } | 618 | } |
614 | EXPORT_SYMBOL_GPL(usb_unlink_anchored_urbs); | 619 | EXPORT_SYMBOL_GPL(usb_unlink_anchored_urbs); |
615 | 620 | ||
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 84fcaa6a21ec..be1fa0723f2c 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -219,12 +219,6 @@ static int usb_dev_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
219 | } | 219 | } |
220 | #endif /* CONFIG_HOTPLUG */ | 220 | #endif /* CONFIG_HOTPLUG */ |
221 | 221 | ||
222 | struct device_type usb_device_type = { | ||
223 | .name = "usb_device", | ||
224 | .release = usb_release_dev, | ||
225 | .uevent = usb_dev_uevent, | ||
226 | }; | ||
227 | |||
228 | #ifdef CONFIG_PM | 222 | #ifdef CONFIG_PM |
229 | 223 | ||
230 | static int ksuspend_usb_init(void) | 224 | static int ksuspend_usb_init(void) |
@@ -244,13 +238,80 @@ static void ksuspend_usb_cleanup(void) | |||
244 | destroy_workqueue(ksuspend_usb_wq); | 238 | destroy_workqueue(ksuspend_usb_wq); |
245 | } | 239 | } |
246 | 240 | ||
241 | /* USB device Power-Management thunks. | ||
242 | * There's no need to distinguish here between quiescing a USB device | ||
243 | * and powering it down; the generic_suspend() routine takes care of | ||
244 | * it by skipping the usb_port_suspend() call for a quiesce. And for | ||
245 | * USB interfaces there's no difference at all. | ||
246 | */ | ||
247 | |||
248 | static int usb_dev_prepare(struct device *dev) | ||
249 | { | ||
250 | return 0; /* Implement eventually? */ | ||
251 | } | ||
252 | |||
253 | static void usb_dev_complete(struct device *dev) | ||
254 | { | ||
255 | /* Currently used only for rebinding interfaces */ | ||
256 | usb_resume(dev); /* Implement eventually? */ | ||
257 | } | ||
258 | |||
259 | static int usb_dev_suspend(struct device *dev) | ||
260 | { | ||
261 | return usb_suspend(dev, PMSG_SUSPEND); | ||
262 | } | ||
263 | |||
264 | static int usb_dev_resume(struct device *dev) | ||
265 | { | ||
266 | return usb_resume(dev); | ||
267 | } | ||
268 | |||
269 | static int usb_dev_freeze(struct device *dev) | ||
270 | { | ||
271 | return usb_suspend(dev, PMSG_FREEZE); | ||
272 | } | ||
273 | |||
274 | static int usb_dev_thaw(struct device *dev) | ||
275 | { | ||
276 | return usb_resume(dev); | ||
277 | } | ||
278 | |||
279 | static int usb_dev_poweroff(struct device *dev) | ||
280 | { | ||
281 | return usb_suspend(dev, PMSG_HIBERNATE); | ||
282 | } | ||
283 | |||
284 | static int usb_dev_restore(struct device *dev) | ||
285 | { | ||
286 | return usb_resume(dev); | ||
287 | } | ||
288 | |||
289 | static struct pm_ops usb_device_pm_ops = { | ||
290 | .prepare = usb_dev_prepare, | ||
291 | .complete = usb_dev_complete, | ||
292 | .suspend = usb_dev_suspend, | ||
293 | .resume = usb_dev_resume, | ||
294 | .freeze = usb_dev_freeze, | ||
295 | .thaw = usb_dev_thaw, | ||
296 | .poweroff = usb_dev_poweroff, | ||
297 | .restore = usb_dev_restore, | ||
298 | }; | ||
299 | |||
247 | #else | 300 | #else |
248 | 301 | ||
249 | #define ksuspend_usb_init() 0 | 302 | #define ksuspend_usb_init() 0 |
250 | #define ksuspend_usb_cleanup() do {} while (0) | 303 | #define ksuspend_usb_cleanup() do {} while (0) |
304 | #define usb_device_pm_ops (*(struct pm_ops *)0) | ||
251 | 305 | ||
252 | #endif /* CONFIG_PM */ | 306 | #endif /* CONFIG_PM */ |
253 | 307 | ||
308 | struct device_type usb_device_type = { | ||
309 | .name = "usb_device", | ||
310 | .release = usb_release_dev, | ||
311 | .uevent = usb_dev_uevent, | ||
312 | .pm = &usb_device_pm_ops, | ||
313 | }; | ||
314 | |||
254 | 315 | ||
255 | /* Returns 1 if @usb_bus is WUSB, 0 otherwise */ | 316 | /* Returns 1 if @usb_bus is WUSB, 0 otherwise */ |
256 | static unsigned usb_bus_is_wusb(struct usb_bus *bus) | 317 | static unsigned usb_bus_is_wusb(struct usb_bus *bus) |
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index d9a6e16dbf84..9a1a45ac3add 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
@@ -41,6 +41,9 @@ extern void usb_host_cleanup(void); | |||
41 | 41 | ||
42 | #ifdef CONFIG_PM | 42 | #ifdef CONFIG_PM |
43 | 43 | ||
44 | extern int usb_suspend(struct device *dev, pm_message_t msg); | ||
45 | extern int usb_resume(struct device *dev); | ||
46 | |||
44 | extern void usb_autosuspend_work(struct work_struct *work); | 47 | extern void usb_autosuspend_work(struct work_struct *work); |
45 | extern int usb_port_suspend(struct usb_device *dev); | 48 | extern int usb_port_suspend(struct usb_device *dev); |
46 | extern int usb_port_resume(struct usb_device *dev); | 49 | extern int usb_port_resume(struct usb_device *dev); |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 1500e1b3c302..abf8192f89e8 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
@@ -44,7 +44,6 @@ | |||
44 | #include <linux/module.h> | 44 | #include <linux/module.h> |
45 | #include <linux/pci.h> | 45 | #include <linux/pci.h> |
46 | #include <linux/kernel.h> | 46 | #include <linux/kernel.h> |
47 | #include <linux/version.h> | ||
48 | #include <linux/delay.h> | 47 | #include <linux/delay.h> |
49 | #include <linux/ioport.h> | 48 | #include <linux/ioport.h> |
50 | #include <linux/sched.h> | 49 | #include <linux/sched.h> |
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index a28513ecbe5b..7cbc78a6853d 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c | |||
@@ -1622,7 +1622,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver) | |||
1622 | struct pxa_udc *udc = the_controller; | 1622 | struct pxa_udc *udc = the_controller; |
1623 | int retval; | 1623 | int retval; |
1624 | 1624 | ||
1625 | if (!driver || driver->speed != USB_SPEED_FULL || !driver->bind | 1625 | if (!driver || driver->speed < USB_SPEED_FULL || !driver->bind |
1626 | || !driver->disconnect || !driver->setup) | 1626 | || !driver->disconnect || !driver->setup) |
1627 | return -EINVAL; | 1627 | return -EINVAL; |
1628 | if (!udc) | 1628 | if (!udc) |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index 538807384592..29d13ebe7500 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/list.h> | 35 | #include <linux/list.h> |
36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
37 | #include <linux/platform_device.h> | 37 | #include <linux/platform_device.h> |
38 | #include <linux/version.h> | ||
39 | #include <linux/clk.h> | 38 | #include <linux/clk.h> |
40 | 39 | ||
41 | #include <linux/debugfs.h> | 40 | #include <linux/debugfs.h> |
diff --git a/drivers/usb/host/ehci-orion.c b/drivers/usb/host/ehci-orion.c index 5fbdc14e63b3..5416cf969005 100644 --- a/drivers/usb/host/ehci-orion.c +++ b/drivers/usb/host/ehci-orion.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/platform_device.h> | 13 | #include <linux/platform_device.h> |
14 | #include <linux/mbus.h> | 14 | #include <linux/mbus.h> |
15 | #include <asm/plat-orion/ehci-orion.h> | 15 | #include <plat/ehci-orion.h> |
16 | 16 | ||
17 | #define rdl(off) __raw_readl(hcd->regs + (off)) | 17 | #define rdl(off) __raw_readl(hcd->regs + (off)) |
18 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) | 18 | #define wrl(off, val) __raw_writel((val), hcd->regs + (off)) |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index d22a84f86a33..8017f1cf78e2 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -988,7 +988,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd) | |||
988 | /* | 988 | /* |
989 | * write bank1 address twice to ensure the 90ns delay (time | 989 | * write bank1 address twice to ensure the 90ns delay (time |
990 | * between BANK0 write and the priv_read_copy() call is at | 990 | * between BANK0 write and the priv_read_copy() call is at |
991 | * least 3*t_WHWL + 2*t_w11 = 3*25ns + 2*17ns = 92ns) | 991 | * least 3*t_WHWL + 2*t_w11 = 3*25ns + 2*17ns = 109ns) |
992 | */ | 992 | */ |
993 | isp1760_writel(payload + ISP_BANK(1), usb_hcd->regs + | 993 | isp1760_writel(payload + ISP_BANK(1), usb_hcd->regs + |
994 | HC_MEMORY_REG); | 994 | HC_MEMORY_REG); |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index 6db7a2889e66..4ed228a89943 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
@@ -260,7 +260,6 @@ static const struct hc_driver ohci_at91_hc_driver = { | |||
260 | */ | 260 | */ |
261 | .hub_status_data = ohci_hub_status_data, | 261 | .hub_status_data = ohci_hub_status_data, |
262 | .hub_control = ohci_hub_control, | 262 | .hub_control = ohci_hub_control, |
263 | .hub_irq_enable = ohci_rhsc_enable, | ||
264 | #ifdef CONFIG_PM | 263 | #ifdef CONFIG_PM |
265 | .bus_suspend = ohci_bus_suspend, | 264 | .bus_suspend = ohci_bus_suspend, |
266 | .bus_resume = ohci_bus_resume, | 265 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-au1xxx.c b/drivers/usb/host/ohci-au1xxx.c index c0948008fe3d..2ac4e022a13f 100644 --- a/drivers/usb/host/ohci-au1xxx.c +++ b/drivers/usb/host/ohci-au1xxx.c | |||
@@ -163,7 +163,6 @@ static const struct hc_driver ohci_au1xxx_hc_driver = { | |||
163 | */ | 163 | */ |
164 | .hub_status_data = ohci_hub_status_data, | 164 | .hub_status_data = ohci_hub_status_data, |
165 | .hub_control = ohci_hub_control, | 165 | .hub_control = ohci_hub_control, |
166 | .hub_irq_enable = ohci_rhsc_enable, | ||
167 | #ifdef CONFIG_PM | 166 | #ifdef CONFIG_PM |
168 | .bus_suspend = ohci_bus_suspend, | 167 | .bus_suspend = ohci_bus_suspend, |
169 | .bus_resume = ohci_bus_resume, | 168 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ep93xx.c b/drivers/usb/host/ohci-ep93xx.c index cb0b506f8259..fb3055f084b5 100644 --- a/drivers/usb/host/ohci-ep93xx.c +++ b/drivers/usb/host/ohci-ep93xx.c | |||
@@ -134,7 +134,6 @@ static struct hc_driver ohci_ep93xx_hc_driver = { | |||
134 | .get_frame_number = ohci_get_frame, | 134 | .get_frame_number = ohci_get_frame, |
135 | .hub_status_data = ohci_hub_status_data, | 135 | .hub_status_data = ohci_hub_status_data, |
136 | .hub_control = ohci_hub_control, | 136 | .hub_control = ohci_hub_control, |
137 | .hub_irq_enable = ohci_rhsc_enable, | ||
138 | #ifdef CONFIG_PM | 137 | #ifdef CONFIG_PM |
139 | .bus_suspend = ohci_bus_suspend, | 138 | .bus_suspend = ohci_bus_suspend, |
140 | .bus_resume = ohci_bus_resume, | 139 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 439beb784f3e..7ea9a7b31155 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -36,18 +36,6 @@ | |||
36 | 36 | ||
37 | /*-------------------------------------------------------------------------*/ | 37 | /*-------------------------------------------------------------------------*/ |
38 | 38 | ||
39 | /* hcd->hub_irq_enable() */ | ||
40 | static void ohci_rhsc_enable (struct usb_hcd *hcd) | ||
41 | { | ||
42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | ||
43 | |||
44 | spin_lock_irq(&ohci->lock); | ||
45 | if (!ohci->autostop) | ||
46 | del_timer(&hcd->rh_timer); /* Prevent next poll */ | ||
47 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
48 | spin_unlock_irq(&ohci->lock); | ||
49 | } | ||
50 | |||
51 | #define OHCI_SCHED_ENABLES \ | 39 | #define OHCI_SCHED_ENABLES \ |
52 | (OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_PLE|OHCI_CTRL_IE) | 40 | (OHCI_CTRL_CLE|OHCI_CTRL_BLE|OHCI_CTRL_PLE|OHCI_CTRL_IE) |
53 | 41 | ||
@@ -374,18 +362,28 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | |||
374 | int any_connected) | 362 | int any_connected) |
375 | { | 363 | { |
376 | int poll_rh = 1; | 364 | int poll_rh = 1; |
365 | int rhsc; | ||
377 | 366 | ||
367 | rhsc = ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC; | ||
378 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | 368 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { |
379 | 369 | ||
380 | case OHCI_USB_OPER: | 370 | case OHCI_USB_OPER: |
381 | /* keep on polling until we know a device is connected | 371 | /* If no status changes are pending, enable status-change |
382 | * and RHSC is enabled */ | 372 | * interrupts. |
373 | */ | ||
374 | if (!rhsc && !changed) { | ||
375 | rhsc = OHCI_INTR_RHSC; | ||
376 | ohci_writel(ohci, rhsc, &ohci->regs->intrenable); | ||
377 | } | ||
378 | |||
379 | /* Keep on polling until we know a device is connected | ||
380 | * and RHSC is enabled, or until we autostop. | ||
381 | */ | ||
383 | if (!ohci->autostop) { | 382 | if (!ohci->autostop) { |
384 | if (any_connected || | 383 | if (any_connected || |
385 | !device_may_wakeup(&ohci_to_hcd(ohci) | 384 | !device_may_wakeup(&ohci_to_hcd(ohci) |
386 | ->self.root_hub->dev)) { | 385 | ->self.root_hub->dev)) { |
387 | if (ohci_readl(ohci, &ohci->regs->intrenable) & | 386 | if (rhsc) |
388 | OHCI_INTR_RHSC) | ||
389 | poll_rh = 0; | 387 | poll_rh = 0; |
390 | } else { | 388 | } else { |
391 | ohci->autostop = 1; | 389 | ohci->autostop = 1; |
@@ -398,12 +396,13 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | |||
398 | ohci->autostop = 0; | 396 | ohci->autostop = 0; |
399 | ohci->next_statechange = jiffies + | 397 | ohci->next_statechange = jiffies + |
400 | STATECHANGE_DELAY; | 398 | STATECHANGE_DELAY; |
401 | } else if (time_after_eq(jiffies, | 399 | } else if (rhsc && time_after_eq(jiffies, |
402 | ohci->next_statechange) | 400 | ohci->next_statechange) |
403 | && !ohci->ed_rm_list | 401 | && !ohci->ed_rm_list |
404 | && !(ohci->hc_control & | 402 | && !(ohci->hc_control & |
405 | OHCI_SCHED_ENABLES)) { | 403 | OHCI_SCHED_ENABLES)) { |
406 | ohci_rh_suspend(ohci, 1); | 404 | ohci_rh_suspend(ohci, 1); |
405 | poll_rh = 0; | ||
407 | } | 406 | } |
408 | } | 407 | } |
409 | break; | 408 | break; |
@@ -417,6 +416,12 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | |||
417 | else | 416 | else |
418 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); | 417 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); |
419 | } else { | 418 | } else { |
419 | if (!rhsc && (ohci->autostop || | ||
420 | ohci_to_hcd(ohci)->self.root_hub-> | ||
421 | do_remote_wakeup)) | ||
422 | ohci_writel(ohci, OHCI_INTR_RHSC, | ||
423 | &ohci->regs->intrenable); | ||
424 | |||
420 | /* everything is idle, no need for polling */ | 425 | /* everything is idle, no need for polling */ |
421 | poll_rh = 0; | 426 | poll_rh = 0; |
422 | } | 427 | } |
@@ -438,12 +443,16 @@ static inline int ohci_rh_resume(struct ohci_hcd *ohci) | |||
438 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | 443 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, |
439 | int any_connected) | 444 | int any_connected) |
440 | { | 445 | { |
441 | int poll_rh = 1; | 446 | /* If RHSC is enabled, don't poll */ |
442 | |||
443 | /* keep on polling until RHSC is enabled */ | ||
444 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) | 447 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) |
445 | poll_rh = 0; | 448 | return 0; |
446 | return poll_rh; | 449 | |
450 | /* If no status changes are pending, enable status-change interrupts */ | ||
451 | if (!changed) { | ||
452 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
453 | return 0; | ||
454 | } | ||
455 | return 1; | ||
447 | } | 456 | } |
448 | 457 | ||
449 | #endif /* CONFIG_PM */ | 458 | #endif /* CONFIG_PM */ |
diff --git a/drivers/usb/host/ohci-lh7a404.c b/drivers/usb/host/ohci-lh7a404.c index 9e31d440d115..de42283149c7 100644 --- a/drivers/usb/host/ohci-lh7a404.c +++ b/drivers/usb/host/ohci-lh7a404.c | |||
@@ -193,7 +193,6 @@ static const struct hc_driver ohci_lh7a404_hc_driver = { | |||
193 | */ | 193 | */ |
194 | .hub_status_data = ohci_hub_status_data, | 194 | .hub_status_data = ohci_hub_status_data, |
195 | .hub_control = ohci_hub_control, | 195 | .hub_control = ohci_hub_control, |
196 | .hub_irq_enable = ohci_rhsc_enable, | ||
197 | #ifdef CONFIG_PM | 196 | #ifdef CONFIG_PM |
198 | .bus_suspend = ohci_bus_suspend, | 197 | .bus_suspend = ohci_bus_suspend, |
199 | .bus_resume = ohci_bus_resume, | 198 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index 3d532b709670..1eb64d08b60a 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c | |||
@@ -470,7 +470,6 @@ static const struct hc_driver ohci_omap_hc_driver = { | |||
470 | */ | 470 | */ |
471 | .hub_status_data = ohci_hub_status_data, | 471 | .hub_status_data = ohci_hub_status_data, |
472 | .hub_control = ohci_hub_control, | 472 | .hub_control = ohci_hub_control, |
473 | .hub_irq_enable = ohci_rhsc_enable, | ||
474 | #ifdef CONFIG_PM | 473 | #ifdef CONFIG_PM |
475 | .bus_suspend = ohci_bus_suspend, | 474 | .bus_suspend = ohci_bus_suspend, |
476 | .bus_resume = ohci_bus_resume, | 475 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c index 083e8df0a817..a9c2ae36c7ad 100644 --- a/drivers/usb/host/ohci-pci.c +++ b/drivers/usb/host/ohci-pci.c | |||
@@ -459,7 +459,6 @@ static const struct hc_driver ohci_pci_hc_driver = { | |||
459 | */ | 459 | */ |
460 | .hub_status_data = ohci_hub_status_data, | 460 | .hub_status_data = ohci_hub_status_data, |
461 | .hub_control = ohci_hub_control, | 461 | .hub_control = ohci_hub_control, |
462 | .hub_irq_enable = ohci_rhsc_enable, | ||
463 | #ifdef CONFIG_PM | 462 | #ifdef CONFIG_PM |
464 | .bus_suspend = ohci_bus_suspend, | 463 | .bus_suspend = ohci_bus_suspend, |
465 | .bus_resume = ohci_bus_resume, | 464 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-pnx4008.c index b02cd0761977..658a2a978c32 100644 --- a/drivers/usb/host/ohci-pnx4008.c +++ b/drivers/usb/host/ohci-pnx4008.c | |||
@@ -277,7 +277,6 @@ static const struct hc_driver ohci_pnx4008_hc_driver = { | |||
277 | */ | 277 | */ |
278 | .hub_status_data = ohci_hub_status_data, | 278 | .hub_status_data = ohci_hub_status_data, |
279 | .hub_control = ohci_hub_control, | 279 | .hub_control = ohci_hub_control, |
280 | .hub_irq_enable = ohci_rhsc_enable, | ||
281 | #ifdef CONFIG_PM | 280 | #ifdef CONFIG_PM |
282 | .bus_suspend = ohci_bus_suspend, | 281 | .bus_suspend = ohci_bus_suspend, |
283 | .bus_resume = ohci_bus_resume, | 282 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-pnx8550.c b/drivers/usb/host/ohci-pnx8550.c index 605d59cba28e..28467e288a93 100644 --- a/drivers/usb/host/ohci-pnx8550.c +++ b/drivers/usb/host/ohci-pnx8550.c | |||
@@ -201,7 +201,6 @@ static const struct hc_driver ohci_pnx8550_hc_driver = { | |||
201 | */ | 201 | */ |
202 | .hub_status_data = ohci_hub_status_data, | 202 | .hub_status_data = ohci_hub_status_data, |
203 | .hub_control = ohci_hub_control, | 203 | .hub_control = ohci_hub_control, |
204 | .hub_irq_enable = ohci_rhsc_enable, | ||
205 | #ifdef CONFIG_PM | 204 | #ifdef CONFIG_PM |
206 | .bus_suspend = ohci_bus_suspend, | 205 | .bus_suspend = ohci_bus_suspend, |
207 | .bus_resume = ohci_bus_resume, | 206 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ppc-of.c b/drivers/usb/host/ohci-ppc-of.c index 91e6e101a4cc..7ac53264ead3 100644 --- a/drivers/usb/host/ohci-ppc-of.c +++ b/drivers/usb/host/ohci-ppc-of.c | |||
@@ -72,7 +72,6 @@ static const struct hc_driver ohci_ppc_of_hc_driver = { | |||
72 | */ | 72 | */ |
73 | .hub_status_data = ohci_hub_status_data, | 73 | .hub_status_data = ohci_hub_status_data, |
74 | .hub_control = ohci_hub_control, | 74 | .hub_control = ohci_hub_control, |
75 | .hub_irq_enable = ohci_rhsc_enable, | ||
76 | #ifdef CONFIG_PM | 75 | #ifdef CONFIG_PM |
77 | .bus_suspend = ohci_bus_suspend, | 76 | .bus_suspend = ohci_bus_suspend, |
78 | .bus_resume = ohci_bus_resume, | 77 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ppc-soc.c b/drivers/usb/host/ohci-ppc-soc.c index 523c30125577..cd3398b675b2 100644 --- a/drivers/usb/host/ohci-ppc-soc.c +++ b/drivers/usb/host/ohci-ppc-soc.c | |||
@@ -172,7 +172,6 @@ static const struct hc_driver ohci_ppc_soc_hc_driver = { | |||
172 | */ | 172 | */ |
173 | .hub_status_data = ohci_hub_status_data, | 173 | .hub_status_data = ohci_hub_status_data, |
174 | .hub_control = ohci_hub_control, | 174 | .hub_control = ohci_hub_control, |
175 | .hub_irq_enable = ohci_rhsc_enable, | ||
176 | #ifdef CONFIG_PM | 175 | #ifdef CONFIG_PM |
177 | .bus_suspend = ohci_bus_suspend, | 176 | .bus_suspend = ohci_bus_suspend, |
178 | .bus_resume = ohci_bus_resume, | 177 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c index 55c95647f008..2089d8a46c4b 100644 --- a/drivers/usb/host/ohci-ps3.c +++ b/drivers/usb/host/ohci-ps3.c | |||
@@ -68,7 +68,6 @@ static const struct hc_driver ps3_ohci_hc_driver = { | |||
68 | .get_frame_number = ohci_get_frame, | 68 | .get_frame_number = ohci_get_frame, |
69 | .hub_status_data = ohci_hub_status_data, | 69 | .hub_status_data = ohci_hub_status_data, |
70 | .hub_control = ohci_hub_control, | 70 | .hub_control = ohci_hub_control, |
71 | .hub_irq_enable = ohci_rhsc_enable, | ||
72 | .start_port_reset = ohci_start_port_reset, | 71 | .start_port_reset = ohci_start_port_reset, |
73 | #if defined(CONFIG_PM) | 72 | #if defined(CONFIG_PM) |
74 | .bus_suspend = ohci_bus_suspend, | 73 | .bus_suspend = ohci_bus_suspend, |
diff --git a/drivers/usb/host/ohci-pxa27x.c b/drivers/usb/host/ohci-pxa27x.c index 8c9c4849db6e..7f0f35c78185 100644 --- a/drivers/usb/host/ohci-pxa27x.c +++ b/drivers/usb/host/ohci-pxa27x.c | |||
@@ -298,7 +298,6 @@ static const struct hc_driver ohci_pxa27x_hc_driver = { | |||
298 | */ | 298 | */ |
299 | .hub_status_data = ohci_hub_status_data, | 299 | .hub_status_data = ohci_hub_status_data, |
300 | .hub_control = ohci_hub_control, | 300 | .hub_control = ohci_hub_control, |
301 | .hub_irq_enable = ohci_rhsc_enable, | ||
302 | #ifdef CONFIG_PM | 301 | #ifdef CONFIG_PM |
303 | .bus_suspend = ohci_bus_suspend, | 302 | .bus_suspend = ohci_bus_suspend, |
304 | .bus_resume = ohci_bus_resume, | 303 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-s3c2410.c b/drivers/usb/host/ohci-s3c2410.c index 9e3dc4069e8b..f46af7a718d4 100644 --- a/drivers/usb/host/ohci-s3c2410.c +++ b/drivers/usb/host/ohci-s3c2410.c | |||
@@ -466,7 +466,6 @@ static const struct hc_driver ohci_s3c2410_hc_driver = { | |||
466 | */ | 466 | */ |
467 | .hub_status_data = ohci_s3c2410_hub_status_data, | 467 | .hub_status_data = ohci_s3c2410_hub_status_data, |
468 | .hub_control = ohci_s3c2410_hub_control, | 468 | .hub_control = ohci_s3c2410_hub_control, |
469 | .hub_irq_enable = ohci_rhsc_enable, | ||
470 | #ifdef CONFIG_PM | 469 | #ifdef CONFIG_PM |
471 | .bus_suspend = ohci_bus_suspend, | 470 | .bus_suspend = ohci_bus_suspend, |
472 | .bus_resume = ohci_bus_resume, | 471 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sa1111.c b/drivers/usb/host/ohci-sa1111.c index 4626b002e670..e4bbe8e188e4 100644 --- a/drivers/usb/host/ohci-sa1111.c +++ b/drivers/usb/host/ohci-sa1111.c | |||
@@ -231,7 +231,6 @@ static const struct hc_driver ohci_sa1111_hc_driver = { | |||
231 | */ | 231 | */ |
232 | .hub_status_data = ohci_hub_status_data, | 232 | .hub_status_data = ohci_hub_status_data, |
233 | .hub_control = ohci_hub_control, | 233 | .hub_control = ohci_hub_control, |
234 | .hub_irq_enable = ohci_rhsc_enable, | ||
235 | #ifdef CONFIG_PM | 234 | #ifdef CONFIG_PM |
236 | .bus_suspend = ohci_bus_suspend, | 235 | .bus_suspend = ohci_bus_suspend, |
237 | .bus_resume = ohci_bus_resume, | 236 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sh.c b/drivers/usb/host/ohci-sh.c index e7ee607278fe..60f03cc7ec4f 100644 --- a/drivers/usb/host/ohci-sh.c +++ b/drivers/usb/host/ohci-sh.c | |||
@@ -68,7 +68,6 @@ static const struct hc_driver ohci_sh_hc_driver = { | |||
68 | */ | 68 | */ |
69 | .hub_status_data = ohci_hub_status_data, | 69 | .hub_status_data = ohci_hub_status_data, |
70 | .hub_control = ohci_hub_control, | 70 | .hub_control = ohci_hub_control, |
71 | .hub_irq_enable = ohci_rhsc_enable, | ||
72 | #ifdef CONFIG_PM | 71 | #ifdef CONFIG_PM |
73 | .bus_suspend = ohci_bus_suspend, | 72 | .bus_suspend = ohci_bus_suspend, |
74 | .bus_resume = ohci_bus_resume, | 73 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c index 21b164e4abeb..cff23637cfcc 100644 --- a/drivers/usb/host/ohci-sm501.c +++ b/drivers/usb/host/ohci-sm501.c | |||
@@ -75,7 +75,6 @@ static const struct hc_driver ohci_sm501_hc_driver = { | |||
75 | */ | 75 | */ |
76 | .hub_status_data = ohci_hub_status_data, | 76 | .hub_status_data = ohci_hub_status_data, |
77 | .hub_control = ohci_hub_control, | 77 | .hub_control = ohci_hub_control, |
78 | .hub_irq_enable = ohci_rhsc_enable, | ||
79 | #ifdef CONFIG_PM | 78 | #ifdef CONFIG_PM |
80 | .bus_suspend = ohci_bus_suspend, | 79 | .bus_suspend = ohci_bus_suspend, |
81 | .bus_resume = ohci_bus_resume, | 80 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/ohci-ssb.c b/drivers/usb/host/ohci-ssb.c index 3660c83d80af..23fd6a886bdd 100644 --- a/drivers/usb/host/ohci-ssb.c +++ b/drivers/usb/host/ohci-ssb.c | |||
@@ -81,7 +81,6 @@ static const struct hc_driver ssb_ohci_hc_driver = { | |||
81 | 81 | ||
82 | .hub_status_data = ohci_hub_status_data, | 82 | .hub_status_data = ohci_hub_status_data, |
83 | .hub_control = ohci_hub_control, | 83 | .hub_control = ohci_hub_control, |
84 | .hub_irq_enable = ohci_rhsc_enable, | ||
85 | #ifdef CONFIG_PM | 84 | #ifdef CONFIG_PM |
86 | .bus_suspend = ohci_bus_suspend, | 85 | .bus_suspend = ohci_bus_suspend, |
87 | .bus_resume = ohci_bus_resume, | 86 | .bus_resume = ohci_bus_resume, |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index 20ad3c48fcb2..228f2b070f2b 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -2934,16 +2934,6 @@ static int u132_start_port_reset(struct usb_hcd *hcd, unsigned port_num) | |||
2934 | return 0; | 2934 | return 0; |
2935 | } | 2935 | } |
2936 | 2936 | ||
2937 | static void u132_hub_irq_enable(struct usb_hcd *hcd) | ||
2938 | { | ||
2939 | struct u132 *u132 = hcd_to_u132(hcd); | ||
2940 | if (u132->going > 1) { | ||
2941 | dev_err(&u132->platform_dev->dev, "device has been removed %d\n" | ||
2942 | , u132->going); | ||
2943 | } else if (u132->going > 0) | ||
2944 | dev_err(&u132->platform_dev->dev, "device is being removed\n"); | ||
2945 | } | ||
2946 | |||
2947 | 2937 | ||
2948 | #ifdef CONFIG_PM | 2938 | #ifdef CONFIG_PM |
2949 | static int u132_bus_suspend(struct usb_hcd *hcd) | 2939 | static int u132_bus_suspend(struct usb_hcd *hcd) |
@@ -2995,7 +2985,6 @@ static struct hc_driver u132_hc_driver = { | |||
2995 | .bus_suspend = u132_bus_suspend, | 2985 | .bus_suspend = u132_bus_suspend, |
2996 | .bus_resume = u132_bus_resume, | 2986 | .bus_resume = u132_bus_resume, |
2997 | .start_port_reset = u132_start_port_reset, | 2987 | .start_port_reset = u132_start_port_reset, |
2998 | .hub_irq_enable = u132_hub_irq_enable, | ||
2999 | }; | 2988 | }; |
3000 | 2989 | ||
3001 | /* | 2990 | /* |
diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c index e6ca9979e3ae..a4ef77ef917d 100644 --- a/drivers/usb/misc/iowarrior.c +++ b/drivers/usb/misc/iowarrior.c | |||
@@ -19,7 +19,6 @@ | |||
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
21 | #include <linux/poll.h> | 21 | #include <linux/poll.h> |
22 | #include <linux/version.h> | ||
23 | #include <linux/usb/iowarrior.h> | 22 | #include <linux/usb/iowarrior.h> |
24 | 23 | ||
25 | /* Version Information */ | 24 | /* Version Information */ |
diff --git a/drivers/usb/misc/sisusbvga/sisusb.c b/drivers/usb/misc/sisusbvga/sisusb.c index fbace41a7cba..69c34a58e205 100644 --- a/drivers/usb/misc/sisusbvga/sisusb.c +++ b/drivers/usb/misc/sisusbvga/sisusb.c | |||
@@ -3270,6 +3270,7 @@ static struct usb_device_id sisusb_table [] = { | |||
3270 | { USB_DEVICE(0x0711, 0x0900) }, | 3270 | { USB_DEVICE(0x0711, 0x0900) }, |
3271 | { USB_DEVICE(0x0711, 0x0901) }, | 3271 | { USB_DEVICE(0x0711, 0x0901) }, |
3272 | { USB_DEVICE(0x0711, 0x0902) }, | 3272 | { USB_DEVICE(0x0711, 0x0902) }, |
3273 | { USB_DEVICE(0x0711, 0x0918) }, | ||
3273 | { USB_DEVICE(0x182d, 0x021c) }, | 3274 | { USB_DEVICE(0x182d, 0x021c) }, |
3274 | { USB_DEVICE(0x182d, 0x0269) }, | 3275 | { USB_DEVICE(0x182d, 0x0269) }, |
3275 | { } | 3276 | { } |
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index faca4333f27a..a0017486ad4e 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
@@ -165,12 +165,11 @@ config USB_TUSB_OMAP_DMA | |||
165 | help | 165 | help |
166 | Enable DMA transfers on TUSB 6010 when OMAP DMA is available. | 166 | Enable DMA transfers on TUSB 6010 when OMAP DMA is available. |
167 | 167 | ||
168 | config USB_MUSB_LOGLEVEL | 168 | config USB_MUSB_DEBUG |
169 | depends on USB_MUSB_HDRC | 169 | depends on USB_MUSB_HDRC |
170 | int 'Logging Level (0 - none / 3 - annoying / ... )' | 170 | bool "Enable debugging messages" |
171 | default 0 | 171 | default n |
172 | help | 172 | help |
173 | Set the logging level. 0 disables the debugging altogether, | 173 | This enables musb debugging. To set the logging level use the debug |
174 | although when USB_DEBUG is set the value is at least 1. | 174 | module parameter. Starting at level 3, per-transfer (urb, usb_request, |
175 | Starting at level 3, per-transfer (urb, usb_request, packet, | 175 | packet, or dma transfer) tracing may kick in. |
176 | or dma transfer) tracing may kick in. | ||
diff --git a/drivers/usb/musb/Makefile b/drivers/usb/musb/Makefile index 88eb67de08ae..b6af0d687a73 100644 --- a/drivers/usb/musb/Makefile +++ b/drivers/usb/musb/Makefile | |||
@@ -64,23 +64,6 @@ endif | |||
64 | 64 | ||
65 | # Debugging | 65 | # Debugging |
66 | 66 | ||
67 | MUSB_DEBUG:=$(CONFIG_USB_MUSB_LOGLEVEL) | 67 | ifeq ($(CONFIG_USB_MUSB_DEBUG),y) |
68 | 68 | EXTRA_CFLAGS += -DDEBUG | |
69 | ifeq ("$(strip $(MUSB_DEBUG))","") | ||
70 | ifdef CONFIG_USB_DEBUG | ||
71 | MUSB_DEBUG:=1 | ||
72 | else | ||
73 | MUSB_DEBUG:=0 | ||
74 | endif | ||
75 | endif | 69 | endif |
76 | |||
77 | ifneq ($(MUSB_DEBUG),0) | ||
78 | EXTRA_CFLAGS += -DDEBUG | ||
79 | |||
80 | ifeq ($(CONFIG_PROC_FS),y) | ||
81 | musb_hdrc-objs += musb_procfs.o | ||
82 | endif | ||
83 | |||
84 | endif | ||
85 | |||
86 | EXTRA_CFLAGS += -DMUSB_DEBUG=$(MUSB_DEBUG) | ||
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index d68ec6daf335..c5b8f0296fcf 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -114,23 +114,14 @@ | |||
114 | 114 | ||
115 | 115 | ||
116 | 116 | ||
117 | #if MUSB_DEBUG > 0 | 117 | unsigned debug; |
118 | unsigned debug = MUSB_DEBUG; | 118 | module_param(debug, uint, S_IRUGO | S_IWUSR); |
119 | module_param(debug, uint, 0); | 119 | MODULE_PARM_DESC(debug, "Debug message level. Default = 0"); |
120 | MODULE_PARM_DESC(debug, "initial debug message level"); | ||
121 | |||
122 | #define MUSB_VERSION_SUFFIX "/dbg" | ||
123 | #endif | ||
124 | 120 | ||
125 | #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" | 121 | #define DRIVER_AUTHOR "Mentor Graphics, Texas Instruments, Nokia" |
126 | #define DRIVER_DESC "Inventra Dual-Role USB Controller Driver" | 122 | #define DRIVER_DESC "Inventra Dual-Role USB Controller Driver" |
127 | 123 | ||
128 | #define MUSB_VERSION_BASE "6.0" | 124 | #define MUSB_VERSION "6.0" |
129 | |||
130 | #ifndef MUSB_VERSION_SUFFIX | ||
131 | #define MUSB_VERSION_SUFFIX "" | ||
132 | #endif | ||
133 | #define MUSB_VERSION MUSB_VERSION_BASE MUSB_VERSION_SUFFIX | ||
134 | 125 | ||
135 | #define DRIVER_INFO DRIVER_DESC ", v" MUSB_VERSION | 126 | #define DRIVER_INFO DRIVER_DESC ", v" MUSB_VERSION |
136 | 127 | ||
@@ -2037,6 +2028,8 @@ bad_config: | |||
2037 | musb->xceiv.state = OTG_STATE_A_IDLE; | 2028 | musb->xceiv.state = OTG_STATE_A_IDLE; |
2038 | 2029 | ||
2039 | status = usb_add_hcd(musb_to_hcd(musb), -1, 0); | 2030 | status = usb_add_hcd(musb_to_hcd(musb), -1, 0); |
2031 | if (status) | ||
2032 | goto fail; | ||
2040 | 2033 | ||
2041 | DBG(1, "%s mode, status %d, devctl %02x %c\n", | 2034 | DBG(1, "%s mode, status %d, devctl %02x %c\n", |
2042 | "HOST", status, | 2035 | "HOST", status, |
@@ -2051,6 +2044,8 @@ bad_config: | |||
2051 | musb->xceiv.state = OTG_STATE_B_IDLE; | 2044 | musb->xceiv.state = OTG_STATE_B_IDLE; |
2052 | 2045 | ||
2053 | status = musb_gadget_setup(musb); | 2046 | status = musb_gadget_setup(musb); |
2047 | if (status) | ||
2048 | goto fail; | ||
2054 | 2049 | ||
2055 | DBG(1, "%s mode, status %d, dev%02x\n", | 2050 | DBG(1, "%s mode, status %d, dev%02x\n", |
2056 | is_otg_enabled(musb) ? "OTG" : "PERIPHERAL", | 2051 | is_otg_enabled(musb) ? "OTG" : "PERIPHERAL", |
@@ -2059,16 +2054,14 @@ bad_config: | |||
2059 | 2054 | ||
2060 | } | 2055 | } |
2061 | 2056 | ||
2062 | if (status == 0) | 2057 | return 0; |
2063 | musb_debug_create("driver/musb_hdrc", musb); | 2058 | |
2064 | else { | ||
2065 | fail: | 2059 | fail: |
2066 | if (musb->clock) | 2060 | if (musb->clock) |
2067 | clk_put(musb->clock); | 2061 | clk_put(musb->clock); |
2068 | device_init_wakeup(dev, 0); | 2062 | device_init_wakeup(dev, 0); |
2069 | musb_free(musb); | 2063 | musb_free(musb); |
2070 | return status; | 2064 | return status; |
2071 | } | ||
2072 | 2065 | ||
2073 | #ifdef CONFIG_SYSFS | 2066 | #ifdef CONFIG_SYSFS |
2074 | status = device_create_file(dev, &dev_attr_mode); | 2067 | status = device_create_file(dev, &dev_attr_mode); |
@@ -2131,7 +2124,6 @@ static int __devexit musb_remove(struct platform_device *pdev) | |||
2131 | * - OTG mode: both roles are deactivated (or never-activated) | 2124 | * - OTG mode: both roles are deactivated (or never-activated) |
2132 | */ | 2125 | */ |
2133 | musb_shutdown(pdev); | 2126 | musb_shutdown(pdev); |
2134 | musb_debug_delete("driver/musb_hdrc", musb); | ||
2135 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | 2127 | #ifdef CONFIG_USB_MUSB_HDRC_HCD |
2136 | if (musb->board_mode == MUSB_HOST) | 2128 | if (musb->board_mode == MUSB_HOST) |
2137 | usb_remove_hcd(musb_to_hcd(musb)); | 2129 | usb_remove_hcd(musb_to_hcd(musb)); |
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index eade46d81708..82227251931b 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -485,23 +485,4 @@ extern int musb_platform_get_vbus_status(struct musb *musb); | |||
485 | extern int __init musb_platform_init(struct musb *musb); | 485 | extern int __init musb_platform_init(struct musb *musb); |
486 | extern int musb_platform_exit(struct musb *musb); | 486 | extern int musb_platform_exit(struct musb *musb); |
487 | 487 | ||
488 | /*-------------------------- ProcFS definitions ---------------------*/ | ||
489 | |||
490 | struct proc_dir_entry; | ||
491 | |||
492 | #if (MUSB_DEBUG > 0) && defined(MUSB_CONFIG_PROC_FS) | ||
493 | extern struct proc_dir_entry *musb_debug_create(char *name, struct musb *data); | ||
494 | extern void musb_debug_delete(char *name, struct musb *data); | ||
495 | |||
496 | #else | ||
497 | static inline struct proc_dir_entry * | ||
498 | musb_debug_create(char *name, struct musb *data) | ||
499 | { | ||
500 | return NULL; | ||
501 | } | ||
502 | static inline void musb_debug_delete(char *name, struct musb *data) | ||
503 | { | ||
504 | } | ||
505 | #endif | ||
506 | |||
507 | #endif /* __MUSB_CORE_H__ */ | 488 | #endif /* __MUSB_CORE_H__ */ |
diff --git a/drivers/usb/musb/musb_debug.h b/drivers/usb/musb/musb_debug.h index 3bdb311e820d..4d2794441b15 100644 --- a/drivers/usb/musb/musb_debug.h +++ b/drivers/usb/musb/musb_debug.h | |||
@@ -48,11 +48,7 @@ | |||
48 | __func__, __LINE__ , ## args); \ | 48 | __func__, __LINE__ , ## args); \ |
49 | } } while (0) | 49 | } } while (0) |
50 | 50 | ||
51 | #if MUSB_DEBUG > 0 | ||
52 | extern unsigned debug; | 51 | extern unsigned debug; |
53 | #else | ||
54 | #define debug 0 | ||
55 | #endif | ||
56 | 52 | ||
57 | static inline int _dbg_level(unsigned l) | 53 | static inline int _dbg_level(unsigned l) |
58 | { | 54 | { |
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 48d7d3ccb243..a57652fff39c 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
@@ -476,6 +476,7 @@ static void ep0_rxstate(struct musb *musb) | |||
476 | return; | 476 | return; |
477 | musb->ackpend = 0; | 477 | musb->ackpend = 0; |
478 | } | 478 | } |
479 | musb_ep_select(musb->mregs, 0); | ||
479 | musb_writew(regs, MUSB_CSR0, tmp); | 480 | musb_writew(regs, MUSB_CSR0, tmp); |
480 | } | 481 | } |
481 | 482 | ||
@@ -528,6 +529,7 @@ static void ep0_txstate(struct musb *musb) | |||
528 | } | 529 | } |
529 | 530 | ||
530 | /* send it out, triggering a "txpktrdy cleared" irq */ | 531 | /* send it out, triggering a "txpktrdy cleared" irq */ |
532 | musb_ep_select(musb->mregs, 0); | ||
531 | musb_writew(regs, MUSB_CSR0, csr); | 533 | musb_writew(regs, MUSB_CSR0, csr); |
532 | } | 534 | } |
533 | 535 | ||
diff --git a/drivers/usb/musb/musb_procfs.c b/drivers/usb/musb/musb_procfs.c deleted file mode 100644 index 55e6b78bdccc..000000000000 --- a/drivers/usb/musb/musb_procfs.c +++ /dev/null | |||
@@ -1,830 +0,0 @@ | |||
1 | /* | ||
2 | * MUSB OTG driver debug support | ||
3 | * | ||
4 | * Copyright 2005 Mentor Graphics Corporation | ||
5 | * Copyright (C) 2005-2006 by Texas Instruments | ||
6 | * Copyright (C) 2006-2007 Nokia Corporation | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * version 2 as published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
20 | * 02110-1301 USA | ||
21 | * | ||
22 | * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED | ||
23 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
24 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | ||
25 | * NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, | ||
26 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
27 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | ||
28 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | ||
29 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||
31 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
32 | * | ||
33 | */ | ||
34 | |||
35 | #include <linux/kernel.h> | ||
36 | #include <linux/proc_fs.h> | ||
37 | #include <linux/seq_file.h> | ||
38 | #include <linux/uaccess.h> /* FIXME remove procfs writes */ | ||
39 | #include <asm/arch/hardware.h> | ||
40 | |||
41 | #include "musb_core.h" | ||
42 | |||
43 | #include "davinci.h" | ||
44 | |||
45 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | ||
46 | |||
47 | static int dump_qh(struct musb_qh *qh, char *buf, unsigned max) | ||
48 | { | ||
49 | int count; | ||
50 | int tmp; | ||
51 | struct usb_host_endpoint *hep = qh->hep; | ||
52 | struct urb *urb; | ||
53 | |||
54 | count = snprintf(buf, max, " qh %p dev%d ep%d%s max%d\n", | ||
55 | qh, qh->dev->devnum, qh->epnum, | ||
56 | ({ char *s; switch (qh->type) { | ||
57 | case USB_ENDPOINT_XFER_BULK: | ||
58 | s = "-bulk"; break; | ||
59 | case USB_ENDPOINT_XFER_INT: | ||
60 | s = "-int"; break; | ||
61 | case USB_ENDPOINT_XFER_CONTROL: | ||
62 | s = ""; break; | ||
63 | default: | ||
64 | s = "iso"; break; | ||
65 | }; s; }), | ||
66 | qh->maxpacket); | ||
67 | if (count <= 0) | ||
68 | return 0; | ||
69 | buf += count; | ||
70 | max -= count; | ||
71 | |||
72 | list_for_each_entry(urb, &hep->urb_list, urb_list) { | ||
73 | tmp = snprintf(buf, max, "\t%s urb %p %d/%d\n", | ||
74 | usb_pipein(urb->pipe) ? "in" : "out", | ||
75 | urb, urb->actual_length, | ||
76 | urb->transfer_buffer_length); | ||
77 | if (tmp <= 0) | ||
78 | break; | ||
79 | tmp = min(tmp, (int)max); | ||
80 | count += tmp; | ||
81 | buf += tmp; | ||
82 | max -= tmp; | ||
83 | } | ||
84 | return count; | ||
85 | } | ||
86 | |||
87 | static int | ||
88 | dump_queue(struct list_head *q, char *buf, unsigned max) | ||
89 | { | ||
90 | int count = 0; | ||
91 | struct musb_qh *qh; | ||
92 | |||
93 | list_for_each_entry(qh, q, ring) { | ||
94 | int tmp; | ||
95 | |||
96 | tmp = dump_qh(qh, buf, max); | ||
97 | if (tmp <= 0) | ||
98 | break; | ||
99 | tmp = min(tmp, (int)max); | ||
100 | count += tmp; | ||
101 | buf += tmp; | ||
102 | max -= tmp; | ||
103 | } | ||
104 | return count; | ||
105 | } | ||
106 | |||
107 | #endif /* HCD */ | ||
108 | |||
109 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | ||
110 | static int dump_ep(struct musb_ep *ep, char *buffer, unsigned max) | ||
111 | { | ||
112 | char *buf = buffer; | ||
113 | int code = 0; | ||
114 | void __iomem *regs = ep->hw_ep->regs; | ||
115 | char *mode = "1buf"; | ||
116 | |||
117 | if (ep->is_in) { | ||
118 | if (ep->hw_ep->tx_double_buffered) | ||
119 | mode = "2buf"; | ||
120 | } else { | ||
121 | if (ep->hw_ep->rx_double_buffered) | ||
122 | mode = "2buf"; | ||
123 | } | ||
124 | |||
125 | do { | ||
126 | struct usb_request *req; | ||
127 | |||
128 | code = snprintf(buf, max, | ||
129 | "\n%s (hw%d): %s%s, csr %04x maxp %04x\n", | ||
130 | ep->name, ep->current_epnum, | ||
131 | mode, ep->dma ? " dma" : "", | ||
132 | musb_readw(regs, | ||
133 | (ep->is_in || !ep->current_epnum) | ||
134 | ? MUSB_TXCSR | ||
135 | : MUSB_RXCSR), | ||
136 | musb_readw(regs, ep->is_in | ||
137 | ? MUSB_TXMAXP | ||
138 | : MUSB_RXMAXP) | ||
139 | ); | ||
140 | if (code <= 0) | ||
141 | break; | ||
142 | code = min(code, (int) max); | ||
143 | buf += code; | ||
144 | max -= code; | ||
145 | |||
146 | if (is_cppi_enabled() && ep->current_epnum) { | ||
147 | unsigned cppi = ep->current_epnum - 1; | ||
148 | void __iomem *base = ep->musb->ctrl_base; | ||
149 | unsigned off1 = cppi << 2; | ||
150 | void __iomem *ram = base; | ||
151 | char tmp[16]; | ||
152 | |||
153 | if (ep->is_in) { | ||
154 | ram += DAVINCI_TXCPPI_STATERAM_OFFSET(cppi); | ||
155 | tmp[0] = 0; | ||
156 | } else { | ||
157 | ram += DAVINCI_RXCPPI_STATERAM_OFFSET(cppi); | ||
158 | snprintf(tmp, sizeof tmp, "%d left, ", | ||
159 | musb_readl(base, | ||
160 | DAVINCI_RXCPPI_BUFCNT0_REG + off1)); | ||
161 | } | ||
162 | |||
163 | code = snprintf(buf, max, "%cX DMA%d: %s" | ||
164 | "%08x %08x, %08x %08x; " | ||
165 | "%08x %08x %08x .. %08x\n", | ||
166 | ep->is_in ? 'T' : 'R', | ||
167 | ep->current_epnum - 1, tmp, | ||
168 | musb_readl(ram, 0 * 4), | ||
169 | musb_readl(ram, 1 * 4), | ||
170 | musb_readl(ram, 2 * 4), | ||
171 | musb_readl(ram, 3 * 4), | ||
172 | musb_readl(ram, 4 * 4), | ||
173 | musb_readl(ram, 5 * 4), | ||
174 | musb_readl(ram, 6 * 4), | ||
175 | musb_readl(ram, 7 * 4)); | ||
176 | if (code <= 0) | ||
177 | break; | ||
178 | code = min(code, (int) max); | ||
179 | buf += code; | ||
180 | max -= code; | ||
181 | } | ||
182 | |||
183 | if (list_empty(&ep->req_list)) { | ||
184 | code = snprintf(buf, max, "\t(queue empty)\n"); | ||
185 | if (code <= 0) | ||
186 | break; | ||
187 | code = min(code, (int) max); | ||
188 | buf += code; | ||
189 | max -= code; | ||
190 | break; | ||
191 | } | ||
192 | list_for_each_entry(req, &ep->req_list, list) { | ||
193 | code = snprintf(buf, max, "\treq %p, %s%s%d/%d\n", | ||
194 | req, | ||
195 | req->zero ? "zero, " : "", | ||
196 | req->short_not_ok ? "!short, " : "", | ||
197 | req->actual, req->length); | ||
198 | if (code <= 0) | ||
199 | break; | ||
200 | code = min(code, (int) max); | ||
201 | buf += code; | ||
202 | max -= code; | ||
203 | } | ||
204 | } while (0); | ||
205 | return buf - buffer; | ||
206 | } | ||
207 | #endif | ||
208 | |||
209 | static int | ||
210 | dump_end_info(struct musb *musb, u8 epnum, char *aBuffer, unsigned max) | ||
211 | { | ||
212 | int code = 0; | ||
213 | char *buf = aBuffer; | ||
214 | struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; | ||
215 | |||
216 | do { | ||
217 | musb_ep_select(musb->mregs, epnum); | ||
218 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | ||
219 | if (is_host_active(musb)) { | ||
220 | int dump_rx, dump_tx; | ||
221 | void __iomem *regs = hw_ep->regs; | ||
222 | |||
223 | /* TEMPORARY (!) until we have a real periodic | ||
224 | * schedule tree ... | ||
225 | */ | ||
226 | if (!epnum) { | ||
227 | /* control is shared, uses RX queue | ||
228 | * but (mostly) shadowed tx registers | ||
229 | */ | ||
230 | dump_tx = !list_empty(&musb->control); | ||
231 | dump_rx = 0; | ||
232 | } else if (hw_ep == musb->bulk_ep) { | ||
233 | dump_tx = !list_empty(&musb->out_bulk); | ||
234 | dump_rx = !list_empty(&musb->in_bulk); | ||
235 | } else if (musb->periodic[epnum]) { | ||
236 | struct usb_host_endpoint *hep; | ||
237 | |||
238 | hep = musb->periodic[epnum]->hep; | ||
239 | dump_rx = hep->desc.bEndpointAddress | ||
240 | & USB_ENDPOINT_DIR_MASK; | ||
241 | dump_tx = !dump_rx; | ||
242 | } else | ||
243 | break; | ||
244 | /* END TEMPORARY */ | ||
245 | |||
246 | |||
247 | if (dump_rx) { | ||
248 | code = snprintf(buf, max, | ||
249 | "\nRX%d: %s rxcsr %04x interval %02x " | ||
250 | "max %04x type %02x; " | ||
251 | "dev %d hub %d port %d" | ||
252 | "\n", | ||
253 | epnum, | ||
254 | hw_ep->rx_double_buffered | ||
255 | ? "2buf" : "1buf", | ||
256 | musb_readw(regs, MUSB_RXCSR), | ||
257 | musb_readb(regs, MUSB_RXINTERVAL), | ||
258 | musb_readw(regs, MUSB_RXMAXP), | ||
259 | musb_readb(regs, MUSB_RXTYPE), | ||
260 | /* FIXME: assumes multipoint */ | ||
261 | musb_readb(musb->mregs, | ||
262 | MUSB_BUSCTL_OFFSET(epnum, | ||
263 | MUSB_RXFUNCADDR)), | ||
264 | musb_readb(musb->mregs, | ||
265 | MUSB_BUSCTL_OFFSET(epnum, | ||
266 | MUSB_RXHUBADDR)), | ||
267 | musb_readb(musb->mregs, | ||
268 | MUSB_BUSCTL_OFFSET(epnum, | ||
269 | MUSB_RXHUBPORT)) | ||
270 | ); | ||
271 | if (code <= 0) | ||
272 | break; | ||
273 | code = min(code, (int) max); | ||
274 | buf += code; | ||
275 | max -= code; | ||
276 | |||
277 | if (is_cppi_enabled() | ||
278 | && epnum | ||
279 | && hw_ep->rx_channel) { | ||
280 | unsigned cppi = epnum - 1; | ||
281 | unsigned off1 = cppi << 2; | ||
282 | void __iomem *base; | ||
283 | void __iomem *ram; | ||
284 | char tmp[16]; | ||
285 | |||
286 | base = musb->ctrl_base; | ||
287 | ram = DAVINCI_RXCPPI_STATERAM_OFFSET( | ||
288 | cppi) + base; | ||
289 | snprintf(tmp, sizeof tmp, "%d left, ", | ||
290 | musb_readl(base, | ||
291 | DAVINCI_RXCPPI_BUFCNT0_REG | ||
292 | + off1)); | ||
293 | |||
294 | code = snprintf(buf, max, | ||
295 | " rx dma%d: %s" | ||
296 | "%08x %08x, %08x %08x; " | ||
297 | "%08x %08x %08x .. %08x\n", | ||
298 | cppi, tmp, | ||
299 | musb_readl(ram, 0 * 4), | ||
300 | musb_readl(ram, 1 * 4), | ||
301 | musb_readl(ram, 2 * 4), | ||
302 | musb_readl(ram, 3 * 4), | ||
303 | musb_readl(ram, 4 * 4), | ||
304 | musb_readl(ram, 5 * 4), | ||
305 | musb_readl(ram, 6 * 4), | ||
306 | musb_readl(ram, 7 * 4)); | ||
307 | if (code <= 0) | ||
308 | break; | ||
309 | code = min(code, (int) max); | ||
310 | buf += code; | ||
311 | max -= code; | ||
312 | } | ||
313 | |||
314 | if (hw_ep == musb->bulk_ep | ||
315 | && !list_empty( | ||
316 | &musb->in_bulk)) { | ||
317 | code = dump_queue(&musb->in_bulk, | ||
318 | buf, max); | ||
319 | if (code <= 0) | ||
320 | break; | ||
321 | code = min(code, (int) max); | ||
322 | buf += code; | ||
323 | max -= code; | ||
324 | } else if (musb->periodic[epnum]) { | ||
325 | code = dump_qh(musb->periodic[epnum], | ||
326 | buf, max); | ||
327 | if (code <= 0) | ||
328 | break; | ||
329 | code = min(code, (int) max); | ||
330 | buf += code; | ||
331 | max -= code; | ||
332 | } | ||
333 | } | ||
334 | |||
335 | if (dump_tx) { | ||
336 | code = snprintf(buf, max, | ||
337 | "\nTX%d: %s txcsr %04x interval %02x " | ||
338 | "max %04x type %02x; " | ||
339 | "dev %d hub %d port %d" | ||
340 | "\n", | ||
341 | epnum, | ||
342 | hw_ep->tx_double_buffered | ||
343 | ? "2buf" : "1buf", | ||
344 | musb_readw(regs, MUSB_TXCSR), | ||
345 | musb_readb(regs, MUSB_TXINTERVAL), | ||
346 | musb_readw(regs, MUSB_TXMAXP), | ||
347 | musb_readb(regs, MUSB_TXTYPE), | ||
348 | /* FIXME: assumes multipoint */ | ||
349 | musb_readb(musb->mregs, | ||
350 | MUSB_BUSCTL_OFFSET(epnum, | ||
351 | MUSB_TXFUNCADDR)), | ||
352 | musb_readb(musb->mregs, | ||
353 | MUSB_BUSCTL_OFFSET(epnum, | ||
354 | MUSB_TXHUBADDR)), | ||
355 | musb_readb(musb->mregs, | ||
356 | MUSB_BUSCTL_OFFSET(epnum, | ||
357 | MUSB_TXHUBPORT)) | ||
358 | ); | ||
359 | if (code <= 0) | ||
360 | break; | ||
361 | code = min(code, (int) max); | ||
362 | buf += code; | ||
363 | max -= code; | ||
364 | |||
365 | if (is_cppi_enabled() | ||
366 | && epnum | ||
367 | && hw_ep->tx_channel) { | ||
368 | unsigned cppi = epnum - 1; | ||
369 | void __iomem *base; | ||
370 | void __iomem *ram; | ||
371 | |||
372 | base = musb->ctrl_base; | ||
373 | ram = DAVINCI_RXCPPI_STATERAM_OFFSET( | ||
374 | cppi) + base; | ||
375 | code = snprintf(buf, max, | ||
376 | " tx dma%d: " | ||
377 | "%08x %08x, %08x %08x; " | ||
378 | "%08x %08x %08x .. %08x\n", | ||
379 | cppi, | ||
380 | musb_readl(ram, 0 * 4), | ||
381 | musb_readl(ram, 1 * 4), | ||
382 | musb_readl(ram, 2 * 4), | ||
383 | musb_readl(ram, 3 * 4), | ||
384 | musb_readl(ram, 4 * 4), | ||
385 | musb_readl(ram, 5 * 4), | ||
386 | musb_readl(ram, 6 * 4), | ||
387 | musb_readl(ram, 7 * 4)); | ||
388 | if (code <= 0) | ||
389 | break; | ||
390 | code = min(code, (int) max); | ||
391 | buf += code; | ||
392 | max -= code; | ||
393 | } | ||
394 | |||
395 | if (hw_ep == musb->control_ep | ||
396 | && !list_empty( | ||
397 | &musb->control)) { | ||
398 | code = dump_queue(&musb->control, | ||
399 | buf, max); | ||
400 | if (code <= 0) | ||
401 | break; | ||
402 | code = min(code, (int) max); | ||
403 | buf += code; | ||
404 | max -= code; | ||
405 | } else if (hw_ep == musb->bulk_ep | ||
406 | && !list_empty( | ||
407 | &musb->out_bulk)) { | ||
408 | code = dump_queue(&musb->out_bulk, | ||
409 | buf, max); | ||
410 | if (code <= 0) | ||
411 | break; | ||
412 | code = min(code, (int) max); | ||
413 | buf += code; | ||
414 | max -= code; | ||
415 | } else if (musb->periodic[epnum]) { | ||
416 | code = dump_qh(musb->periodic[epnum], | ||
417 | buf, max); | ||
418 | if (code <= 0) | ||
419 | break; | ||
420 | code = min(code, (int) max); | ||
421 | buf += code; | ||
422 | max -= code; | ||
423 | } | ||
424 | } | ||
425 | } | ||
426 | #endif | ||
427 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | ||
428 | if (is_peripheral_active(musb)) { | ||
429 | code = 0; | ||
430 | |||
431 | if (hw_ep->ep_in.desc || !epnum) { | ||
432 | code = dump_ep(&hw_ep->ep_in, buf, max); | ||
433 | if (code <= 0) | ||
434 | break; | ||
435 | code = min(code, (int) max); | ||
436 | buf += code; | ||
437 | max -= code; | ||
438 | } | ||
439 | if (hw_ep->ep_out.desc) { | ||
440 | code = dump_ep(&hw_ep->ep_out, buf, max); | ||
441 | if (code <= 0) | ||
442 | break; | ||
443 | code = min(code, (int) max); | ||
444 | buf += code; | ||
445 | max -= code; | ||
446 | } | ||
447 | } | ||
448 | #endif | ||
449 | } while (0); | ||
450 | |||
451 | return buf - aBuffer; | ||
452 | } | ||
453 | |||
454 | /* Dump the current status and compile options. | ||
455 | * @param musb the device driver instance | ||
456 | * @param buffer where to dump the status; it must be big enough to hold the | ||
457 | * result otherwise "BAD THINGS HAPPENS(TM)". | ||
458 | */ | ||
459 | static int dump_header_stats(struct musb *musb, char *buffer) | ||
460 | { | ||
461 | int code, count = 0; | ||
462 | const void __iomem *mbase = musb->mregs; | ||
463 | |||
464 | *buffer = 0; | ||
465 | count = sprintf(buffer, "Status: %sHDRC, Mode=%s " | ||
466 | "(Power=%02x, DevCtl=%02x)\n", | ||
467 | (musb->is_multipoint ? "M" : ""), MUSB_MODE(musb), | ||
468 | musb_readb(mbase, MUSB_POWER), | ||
469 | musb_readb(mbase, MUSB_DEVCTL)); | ||
470 | if (count <= 0) | ||
471 | return 0; | ||
472 | buffer += count; | ||
473 | |||
474 | code = sprintf(buffer, "OTG state: %s; %sactive\n", | ||
475 | otg_state_string(musb), | ||
476 | musb->is_active ? "" : "in"); | ||
477 | if (code <= 0) | ||
478 | goto done; | ||
479 | buffer += code; | ||
480 | count += code; | ||
481 | |||
482 | code = sprintf(buffer, | ||
483 | "Options: " | ||
484 | #ifdef CONFIG_MUSB_PIO_ONLY | ||
485 | "pio" | ||
486 | #elif defined(CONFIG_USB_TI_CPPI_DMA) | ||
487 | "cppi-dma" | ||
488 | #elif defined(CONFIG_USB_INVENTRA_DMA) | ||
489 | "musb-dma" | ||
490 | #elif defined(CONFIG_USB_TUSB_OMAP_DMA) | ||
491 | "tusb-omap-dma" | ||
492 | #else | ||
493 | "?dma?" | ||
494 | #endif | ||
495 | ", " | ||
496 | #ifdef CONFIG_USB_MUSB_OTG | ||
497 | "otg (peripheral+host)" | ||
498 | #elif defined(CONFIG_USB_GADGET_MUSB_HDRC) | ||
499 | "peripheral" | ||
500 | #elif defined(CONFIG_USB_MUSB_HDRC_HCD) | ||
501 | "host" | ||
502 | #endif | ||
503 | ", debug=%d [eps=%d]\n", | ||
504 | debug, | ||
505 | musb->nr_endpoints); | ||
506 | if (code <= 0) | ||
507 | goto done; | ||
508 | count += code; | ||
509 | buffer += code; | ||
510 | |||
511 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | ||
512 | code = sprintf(buffer, "Peripheral address: %02x\n", | ||
513 | musb_readb(musb->ctrl_base, MUSB_FADDR)); | ||
514 | if (code <= 0) | ||
515 | goto done; | ||
516 | buffer += code; | ||
517 | count += code; | ||
518 | #endif | ||
519 | |||
520 | #ifdef CONFIG_USB_MUSB_HDRC_HCD | ||
521 | code = sprintf(buffer, "Root port status: %08x\n", | ||
522 | musb->port1_status); | ||
523 | if (code <= 0) | ||
524 | goto done; | ||
525 | buffer += code; | ||
526 | count += code; | ||
527 | #endif | ||
528 | |||
529 | #ifdef CONFIG_ARCH_DAVINCI | ||
530 | code = sprintf(buffer, | ||
531 | "DaVinci: ctrl=%02x stat=%1x phy=%03x\n" | ||
532 | "\trndis=%05x auto=%04x intsrc=%08x intmsk=%08x" | ||
533 | "\n", | ||
534 | musb_readl(musb->ctrl_base, DAVINCI_USB_CTRL_REG), | ||
535 | musb_readl(musb->ctrl_base, DAVINCI_USB_STAT_REG), | ||
536 | __raw_readl((void __force __iomem *) | ||
537 | IO_ADDRESS(USBPHY_CTL_PADDR)), | ||
538 | musb_readl(musb->ctrl_base, DAVINCI_RNDIS_REG), | ||
539 | musb_readl(musb->ctrl_base, DAVINCI_AUTOREQ_REG), | ||
540 | musb_readl(musb->ctrl_base, | ||
541 | DAVINCI_USB_INT_SOURCE_REG), | ||
542 | musb_readl(musb->ctrl_base, | ||
543 | DAVINCI_USB_INT_MASK_REG)); | ||
544 | if (code <= 0) | ||
545 | goto done; | ||
546 | count += code; | ||
547 | buffer += code; | ||
548 | #endif /* DAVINCI */ | ||
549 | |||
550 | #ifdef CONFIG_USB_TUSB6010 | ||
551 | code = sprintf(buffer, | ||
552 | "TUSB6010: devconf %08x, phy enable %08x drive %08x" | ||
553 | "\n\totg %03x timer %08x" | ||
554 | "\n\tprcm conf %08x mgmt %08x; int src %08x mask %08x" | ||
555 | "\n", | ||
556 | musb_readl(musb->ctrl_base, TUSB_DEV_CONF), | ||
557 | musb_readl(musb->ctrl_base, TUSB_PHY_OTG_CTRL_ENABLE), | ||
558 | musb_readl(musb->ctrl_base, TUSB_PHY_OTG_CTRL), | ||
559 | musb_readl(musb->ctrl_base, TUSB_DEV_OTG_STAT), | ||
560 | musb_readl(musb->ctrl_base, TUSB_DEV_OTG_TIMER), | ||
561 | musb_readl(musb->ctrl_base, TUSB_PRCM_CONF), | ||
562 | musb_readl(musb->ctrl_base, TUSB_PRCM_MNGMT), | ||
563 | musb_readl(musb->ctrl_base, TUSB_INT_SRC), | ||
564 | musb_readl(musb->ctrl_base, TUSB_INT_MASK)); | ||
565 | if (code <= 0) | ||
566 | goto done; | ||
567 | count += code; | ||
568 | buffer += code; | ||
569 | #endif /* DAVINCI */ | ||
570 | |||
571 | if (is_cppi_enabled() && musb->dma_controller) { | ||
572 | code = sprintf(buffer, | ||
573 | "CPPI: txcr=%d txsrc=%01x txena=%01x; " | ||
574 | "rxcr=%d rxsrc=%01x rxena=%01x " | ||
575 | "\n", | ||
576 | musb_readl(musb->ctrl_base, | ||
577 | DAVINCI_TXCPPI_CTRL_REG), | ||
578 | musb_readl(musb->ctrl_base, | ||
579 | DAVINCI_TXCPPI_RAW_REG), | ||
580 | musb_readl(musb->ctrl_base, | ||
581 | DAVINCI_TXCPPI_INTENAB_REG), | ||
582 | musb_readl(musb->ctrl_base, | ||
583 | DAVINCI_RXCPPI_CTRL_REG), | ||
584 | musb_readl(musb->ctrl_base, | ||
585 | DAVINCI_RXCPPI_RAW_REG), | ||
586 | musb_readl(musb->ctrl_base, | ||
587 | DAVINCI_RXCPPI_INTENAB_REG)); | ||
588 | if (code <= 0) | ||
589 | goto done; | ||
590 | count += code; | ||
591 | buffer += code; | ||
592 | } | ||
593 | |||
594 | #ifdef CONFIG_USB_GADGET_MUSB_HDRC | ||
595 | if (is_peripheral_enabled(musb)) { | ||
596 | code = sprintf(buffer, "Gadget driver: %s\n", | ||
597 | musb->gadget_driver | ||
598 | ? musb->gadget_driver->driver.name | ||
599 | : "(none)"); | ||
600 | if (code <= 0) | ||
601 | goto done; | ||
602 | count += code; | ||
603 | buffer += code; | ||
604 | } | ||
605 | #endif | ||
606 | |||
607 | done: | ||
608 | return count; | ||
609 | } | ||
610 | |||
611 | /* Write to ProcFS | ||
612 | * | ||
613 | * C soft-connect | ||
614 | * c soft-disconnect | ||
615 | * I enable HS | ||
616 | * i disable HS | ||
617 | * s stop session | ||
618 | * F force session (OTG-unfriendly) | ||
619 | * E rElinquish bus (OTG) | ||
620 | * H request host mode | ||
621 | * h cancel host request | ||
622 | * T start sending TEST_PACKET | ||
623 | * D<num> set/query the debug level | ||
624 | */ | ||
625 | static int musb_proc_write(struct file *file, const char __user *buffer, | ||
626 | unsigned long count, void *data) | ||
627 | { | ||
628 | char cmd; | ||
629 | u8 reg; | ||
630 | struct musb *musb = (struct musb *)data; | ||
631 | void __iomem *mbase = musb->mregs; | ||
632 | |||
633 | /* MOD_INC_USE_COUNT; */ | ||
634 | |||
635 | if (unlikely(copy_from_user(&cmd, buffer, 1))) | ||
636 | return -EFAULT; | ||
637 | |||
638 | switch (cmd) { | ||
639 | case 'C': | ||
640 | if (mbase) { | ||
641 | reg = musb_readb(mbase, MUSB_POWER) | ||
642 | | MUSB_POWER_SOFTCONN; | ||
643 | musb_writeb(mbase, MUSB_POWER, reg); | ||
644 | } | ||
645 | break; | ||
646 | |||
647 | case 'c': | ||
648 | if (mbase) { | ||
649 | reg = musb_readb(mbase, MUSB_POWER) | ||
650 | & ~MUSB_POWER_SOFTCONN; | ||
651 | musb_writeb(mbase, MUSB_POWER, reg); | ||
652 | } | ||
653 | break; | ||
654 | |||
655 | case 'I': | ||
656 | if (mbase) { | ||
657 | reg = musb_readb(mbase, MUSB_POWER) | ||
658 | | MUSB_POWER_HSENAB; | ||
659 | musb_writeb(mbase, MUSB_POWER, reg); | ||
660 | } | ||
661 | break; | ||
662 | |||
663 | case 'i': | ||
664 | if (mbase) { | ||
665 | reg = musb_readb(mbase, MUSB_POWER) | ||
666 | & ~MUSB_POWER_HSENAB; | ||
667 | musb_writeb(mbase, MUSB_POWER, reg); | ||
668 | } | ||
669 | break; | ||
670 | |||
671 | case 'F': | ||
672 | reg = musb_readb(mbase, MUSB_DEVCTL); | ||
673 | reg |= MUSB_DEVCTL_SESSION; | ||
674 | musb_writeb(mbase, MUSB_DEVCTL, reg); | ||
675 | break; | ||
676 | |||
677 | case 'H': | ||
678 | if (mbase) { | ||
679 | reg = musb_readb(mbase, MUSB_DEVCTL); | ||
680 | reg |= MUSB_DEVCTL_HR; | ||
681 | musb_writeb(mbase, MUSB_DEVCTL, reg); | ||
682 | /* MUSB_HST_MODE( ((struct musb*)data) ); */ | ||
683 | /* WARNING("Host Mode\n"); */ | ||
684 | } | ||
685 | break; | ||
686 | |||
687 | case 'h': | ||
688 | if (mbase) { | ||
689 | reg = musb_readb(mbase, MUSB_DEVCTL); | ||
690 | reg &= ~MUSB_DEVCTL_HR; | ||
691 | musb_writeb(mbase, MUSB_DEVCTL, reg); | ||
692 | } | ||
693 | break; | ||
694 | |||
695 | case 'T': | ||
696 | if (mbase) { | ||
697 | musb_load_testpacket(musb); | ||
698 | musb_writeb(mbase, MUSB_TESTMODE, | ||
699 | MUSB_TEST_PACKET); | ||
700 | } | ||
701 | break; | ||
702 | |||
703 | #if (MUSB_DEBUG > 0) | ||
704 | /* set/read debug level */ | ||
705 | case 'D':{ | ||
706 | if (count > 1) { | ||
707 | char digits[8], *p = digits; | ||
708 | int i = 0, level = 0, sign = 1; | ||
709 | int len = min(count - 1, (unsigned long)8); | ||
710 | |||
711 | if (copy_from_user(&digits, &buffer[1], len)) | ||
712 | return -EFAULT; | ||
713 | |||
714 | /* optional sign */ | ||
715 | if (*p == '-') { | ||
716 | len -= 1; | ||
717 | sign = -sign; | ||
718 | p++; | ||
719 | } | ||
720 | |||
721 | /* read it */ | ||
722 | while (i++ < len && *p > '0' && *p < '9') { | ||
723 | level = level * 10 + (*p - '0'); | ||
724 | p++; | ||
725 | } | ||
726 | |||
727 | level *= sign; | ||
728 | DBG(1, "debug level %d\n", level); | ||
729 | debug = level; | ||
730 | } | ||
731 | } | ||
732 | break; | ||
733 | |||
734 | |||
735 | case '?': | ||
736 | INFO("?: you are seeing it\n"); | ||
737 | INFO("C/c: soft connect enable/disable\n"); | ||
738 | INFO("I/i: hispeed enable/disable\n"); | ||
739 | INFO("F: force session start\n"); | ||
740 | INFO("H: host mode\n"); | ||
741 | INFO("T: start sending TEST_PACKET\n"); | ||
742 | INFO("D: set/read dbug level\n"); | ||
743 | break; | ||
744 | #endif | ||
745 | |||
746 | default: | ||
747 | ERR("Command %c not implemented\n", cmd); | ||
748 | break; | ||
749 | } | ||
750 | |||
751 | musb_platform_try_idle(musb, 0); | ||
752 | |||
753 | return count; | ||
754 | } | ||
755 | |||
756 | static int musb_proc_read(char *page, char **start, | ||
757 | off_t off, int count, int *eof, void *data) | ||
758 | { | ||
759 | char *buffer = page; | ||
760 | int code = 0; | ||
761 | unsigned long flags; | ||
762 | struct musb *musb = data; | ||
763 | unsigned epnum; | ||
764 | |||
765 | count -= off; | ||
766 | count -= 1; /* for NUL at end */ | ||
767 | if (count <= 0) | ||
768 | return -EINVAL; | ||
769 | |||
770 | spin_lock_irqsave(&musb->lock, flags); | ||
771 | |||
772 | code = dump_header_stats(musb, buffer); | ||
773 | if (code > 0) { | ||
774 | buffer += code; | ||
775 | count -= code; | ||
776 | } | ||
777 | |||
778 | /* generate the report for the end points */ | ||
779 | /* REVISIT ... not unless something's connected! */ | ||
780 | for (epnum = 0; count >= 0 && epnum < musb->nr_endpoints; | ||
781 | epnum++) { | ||
782 | code = dump_end_info(musb, epnum, buffer, count); | ||
783 | if (code > 0) { | ||
784 | buffer += code; | ||
785 | count -= code; | ||
786 | } | ||
787 | } | ||
788 | |||
789 | musb_platform_try_idle(musb, 0); | ||
790 | |||
791 | spin_unlock_irqrestore(&musb->lock, flags); | ||
792 | *eof = 1; | ||
793 | |||
794 | return buffer - page; | ||
795 | } | ||
796 | |||
797 | void __devexit musb_debug_delete(char *name, struct musb *musb) | ||
798 | { | ||
799 | if (musb->proc_entry) | ||
800 | remove_proc_entry(name, NULL); | ||
801 | } | ||
802 | |||
803 | struct proc_dir_entry *__init | ||
804 | musb_debug_create(char *name, struct musb *data) | ||
805 | { | ||
806 | struct proc_dir_entry *pde; | ||
807 | |||
808 | /* FIXME convert everything to seq_file; then later, debugfs */ | ||
809 | |||
810 | if (!name) | ||
811 | return NULL; | ||
812 | |||
813 | pde = create_proc_entry(name, S_IFREG | S_IRUGO | S_IWUSR, NULL); | ||
814 | data->proc_entry = pde; | ||
815 | if (pde) { | ||
816 | pde->data = data; | ||
817 | /* pde->owner = THIS_MODULE; */ | ||
818 | |||
819 | pde->read_proc = musb_proc_read; | ||
820 | pde->write_proc = musb_proc_write; | ||
821 | |||
822 | pde->size = 0; | ||
823 | |||
824 | pr_debug("Registered /proc/%s\n", name); | ||
825 | } else { | ||
826 | pr_debug("Cannot create a valid proc file entry"); | ||
827 | } | ||
828 | |||
829 | return pde; | ||
830 | } | ||
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 2e663f1afd5e..d95382088075 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -38,8 +38,6 @@ | |||
38 | #include <linux/usb.h> | 38 | #include <linux/usb.h> |
39 | #include <linux/usb/serial.h> | 39 | #include <linux/usb/serial.h> |
40 | 40 | ||
41 | #include <linux/version.h> | ||
42 | |||
43 | /* the mode to be set when the port ist opened */ | 41 | /* the mode to be set when the port ist opened */ |
44 | static int initial_mode = 1; | 42 | static int initial_mode = 1; |
45 | 43 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index e143198aeb02..9f9cd36455f4 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -173,6 +173,7 @@ static int option_send_setup(struct tty_struct *tty, struct usb_serial_port *po | |||
173 | #define KYOCERA_PRODUCT_KPC680 0x180a | 173 | #define KYOCERA_PRODUCT_KPC680 0x180a |
174 | 174 | ||
175 | #define ANYDATA_VENDOR_ID 0x16d5 | 175 | #define ANYDATA_VENDOR_ID 0x16d5 |
176 | #define ANYDATA_PRODUCT_ADU_620UW 0x6202 | ||
176 | #define ANYDATA_PRODUCT_ADU_E100A 0x6501 | 177 | #define ANYDATA_PRODUCT_ADU_E100A 0x6501 |
177 | #define ANYDATA_PRODUCT_ADU_500A 0x6502 | 178 | #define ANYDATA_PRODUCT_ADU_500A 0x6502 |
178 | 179 | ||
@@ -318,6 +319,7 @@ static struct usb_device_id option_ids[] = { | |||
318 | { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ | 319 | { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ |
319 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, | 320 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, |
320 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | 321 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, |
322 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) }, | ||
321 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | 323 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, |
322 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, | 324 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) }, |
323 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, | 325 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, |
diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c index 4bd569e479a7..314d18694b6a 100644 --- a/drivers/video/arkfb.c +++ b/drivers/video/arkfb.c | |||
@@ -11,7 +11,6 @@ | |||
11 | * Code is based on s3fb | 11 | * Code is based on s3fb |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/version.h> | ||
15 | #include <linux/module.h> | 14 | #include <linux/module.h> |
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
diff --git a/drivers/video/bf54x-lq043fb.c b/drivers/video/bf54x-lq043fb.c index 940467aed13f..6d5aa806777e 100644 --- a/drivers/video/bf54x-lq043fb.c +++ b/drivers/video/bf54x-lq043fb.c | |||
@@ -733,7 +733,6 @@ static int bfin_bf54x_remove(struct platform_device *pdev) | |||
733 | static int bfin_bf54x_suspend(struct platform_device *pdev, pm_message_t state) | 733 | static int bfin_bf54x_suspend(struct platform_device *pdev, pm_message_t state) |
734 | { | 734 | { |
735 | struct fb_info *fbinfo = platform_get_drvdata(pdev); | 735 | struct fb_info *fbinfo = platform_get_drvdata(pdev); |
736 | struct bfin_bf54xfb_info *info = fbinfo->par; | ||
737 | 736 | ||
738 | bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() & ~EPPI_EN); | 737 | bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() & ~EPPI_EN); |
739 | disable_dma(CH_EPPI0); | 738 | disable_dma(CH_EPPI0); |
@@ -747,8 +746,18 @@ static int bfin_bf54x_resume(struct platform_device *pdev) | |||
747 | struct fb_info *fbinfo = platform_get_drvdata(pdev); | 746 | struct fb_info *fbinfo = platform_get_drvdata(pdev); |
748 | struct bfin_bf54xfb_info *info = fbinfo->par; | 747 | struct bfin_bf54xfb_info *info = fbinfo->par; |
749 | 748 | ||
750 | enable_dma(CH_EPPI0); | 749 | if (info->lq043_open_cnt) { |
751 | bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() | EPPI_EN); | 750 | |
751 | bfin_write_EPPI0_CONTROL(0); | ||
752 | SSYNC(); | ||
753 | |||
754 | config_dma(info); | ||
755 | config_ppi(info); | ||
756 | |||
757 | /* start dma */ | ||
758 | enable_dma(CH_EPPI0); | ||
759 | bfin_write_EPPI0_CONTROL(bfin_read_EPPI0_CONTROL() | EPPI_EN); | ||
760 | } | ||
752 | 761 | ||
753 | return 0; | 762 | return 0; |
754 | } | 763 | } |
diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c index 59df132cc375..4835bdc4e9f1 100644 --- a/drivers/video/fb_defio.c +++ b/drivers/video/fb_defio.c | |||
@@ -114,6 +114,17 @@ static struct vm_operations_struct fb_deferred_io_vm_ops = { | |||
114 | .page_mkwrite = fb_deferred_io_mkwrite, | 114 | .page_mkwrite = fb_deferred_io_mkwrite, |
115 | }; | 115 | }; |
116 | 116 | ||
117 | static int fb_deferred_io_set_page_dirty(struct page *page) | ||
118 | { | ||
119 | if (!PageDirty(page)) | ||
120 | SetPageDirty(page); | ||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | static const struct address_space_operations fb_deferred_io_aops = { | ||
125 | .set_page_dirty = fb_deferred_io_set_page_dirty, | ||
126 | }; | ||
127 | |||
117 | static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma) | 128 | static int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma) |
118 | { | 129 | { |
119 | vma->vm_ops = &fb_deferred_io_vm_ops; | 130 | vma->vm_ops = &fb_deferred_io_vm_ops; |
@@ -163,6 +174,14 @@ void fb_deferred_io_init(struct fb_info *info) | |||
163 | } | 174 | } |
164 | EXPORT_SYMBOL_GPL(fb_deferred_io_init); | 175 | EXPORT_SYMBOL_GPL(fb_deferred_io_init); |
165 | 176 | ||
177 | void fb_deferred_io_open(struct fb_info *info, | ||
178 | struct inode *inode, | ||
179 | struct file *file) | ||
180 | { | ||
181 | file->f_mapping->a_ops = &fb_deferred_io_aops; | ||
182 | } | ||
183 | EXPORT_SYMBOL_GPL(fb_deferred_io_open); | ||
184 | |||
166 | void fb_deferred_io_cleanup(struct fb_info *info) | 185 | void fb_deferred_io_cleanup(struct fb_info *info) |
167 | { | 186 | { |
168 | void *screen_base = (void __force *) info->screen_base; | 187 | void *screen_base = (void __force *) info->screen_base; |
diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 6b487801eeae..98843c2ecf73 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c | |||
@@ -1344,6 +1344,10 @@ fb_open(struct inode *inode, struct file *file) | |||
1344 | if (res) | 1344 | if (res) |
1345 | module_put(info->fbops->owner); | 1345 | module_put(info->fbops->owner); |
1346 | } | 1346 | } |
1347 | #ifdef CONFIG_FB_DEFERRED_IO | ||
1348 | if (info->fbdefio) | ||
1349 | fb_deferred_io_open(info, inode, file); | ||
1350 | #endif | ||
1347 | out: | 1351 | out: |
1348 | unlock_kernel(); | 1352 | unlock_kernel(); |
1349 | return res; | 1353 | return res; |
diff --git a/drivers/video/fsl-diu-fb.c b/drivers/video/fsl-diu-fb.c index bd320a2bfb7c..fb51197d1c98 100644 --- a/drivers/video/fsl-diu-fb.c +++ b/drivers/video/fsl-diu-fb.c | |||
@@ -479,6 +479,10 @@ static void adjust_aoi_size_position(struct fb_var_screeninfo *var, | |||
479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; | 479 | base_plane_width = machine_data->fsl_diu_info[0]->var.xres; |
480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; | 480 | base_plane_height = machine_data->fsl_diu_info[0]->var.yres; |
481 | 481 | ||
482 | if (mfbi->x_aoi_d < 0) | ||
483 | mfbi->x_aoi_d = 0; | ||
484 | if (mfbi->y_aoi_d < 0) | ||
485 | mfbi->y_aoi_d = 0; | ||
482 | switch (index) { | 486 | switch (index) { |
483 | case 0: | 487 | case 0: |
484 | if (mfbi->x_aoi_d != 0) | 488 | if (mfbi->x_aoi_d != 0) |
@@ -778,6 +782,22 @@ static void unmap_video_memory(struct fb_info *info) | |||
778 | } | 782 | } |
779 | 783 | ||
780 | /* | 784 | /* |
785 | * Using the fb_var_screeninfo in fb_info we set the aoi of this | ||
786 | * particular framebuffer. It is a light version of fsl_diu_set_par. | ||
787 | */ | ||
788 | static int fsl_diu_set_aoi(struct fb_info *info) | ||
789 | { | ||
790 | struct fb_var_screeninfo *var = &info->var; | ||
791 | struct mfb_info *mfbi = info->par; | ||
792 | struct diu_ad *ad = mfbi->ad; | ||
793 | |||
794 | /* AOI should not be greater than display size */ | ||
795 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); | ||
796 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | ||
797 | return 0; | ||
798 | } | ||
799 | |||
800 | /* | ||
781 | * Using the fb_var_screeninfo in fb_info we set the resolution of this | 801 | * Using the fb_var_screeninfo in fb_info we set the resolution of this |
782 | * particular framebuffer. This function alters the fb_fix_screeninfo stored | 802 | * particular framebuffer. This function alters the fb_fix_screeninfo stored |
783 | * in fb_info. It does not alter var in fb_info since we are using that | 803 | * in fb_info. It does not alter var in fb_info since we are using that |
@@ -817,11 +837,11 @@ static int fsl_diu_set_par(struct fb_info *info) | |||
817 | diu_ops.get_pixel_format(var->bits_per_pixel, | 837 | diu_ops.get_pixel_format(var->bits_per_pixel, |
818 | machine_data->monitor_port); | 838 | machine_data->monitor_port); |
819 | ad->addr = cpu_to_le32(info->fix.smem_start); | 839 | ad->addr = cpu_to_le32(info->fix.smem_start); |
820 | ad->src_size_g_alpha = cpu_to_le32((var->yres << 12) | | 840 | ad->src_size_g_alpha = cpu_to_le32((var->yres_virtual << 12) | |
821 | var->xres) | mfbi->g_alpha; | 841 | var->xres_virtual) | mfbi->g_alpha; |
822 | /* fix me. AOI should not be greater than display size */ | 842 | /* AOI should not be greater than display size */ |
823 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); | 843 | ad->aoi_size = cpu_to_le32((var->yres << 16) | var->xres); |
824 | ad->offset_xyi = 0; | 844 | ad->offset_xyi = cpu_to_le32((var->yoffset << 16) | var->xoffset); |
825 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); | 845 | ad->offset_xyd = cpu_to_le32((mfbi->y_aoi_d << 16) | mfbi->x_aoi_d); |
826 | 846 | ||
827 | /* Disable chroma keying function */ | 847 | /* Disable chroma keying function */ |
@@ -921,6 +941,8 @@ static int fsl_diu_pan_display(struct fb_var_screeninfo *var, | |||
921 | else | 941 | else |
922 | info->var.vmode &= ~FB_VMODE_YWRAP; | 942 | info->var.vmode &= ~FB_VMODE_YWRAP; |
923 | 943 | ||
944 | fsl_diu_set_aoi(info); | ||
945 | |||
924 | return 0; | 946 | return 0; |
925 | } | 947 | } |
926 | 948 | ||
@@ -989,7 +1011,7 @@ static int fsl_diu_ioctl(struct fb_info *info, unsigned int cmd, | |||
989 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", | 1011 | pr_debug("set AOI display offset of index %d to (%d,%d)\n", |
990 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); | 1012 | mfbi->index, aoi_d.x_aoi_d, aoi_d.y_aoi_d); |
991 | fsl_diu_check_var(&info->var, info); | 1013 | fsl_diu_check_var(&info->var, info); |
992 | fsl_diu_set_par(info); | 1014 | fsl_diu_set_aoi(info); |
993 | break; | 1015 | break; |
994 | case MFB_GET_AOID: | 1016 | case MFB_GET_AOID: |
995 | aoi_d.x_aoi_d = mfbi->x_aoi_d; | 1017 | aoi_d.x_aoi_d = mfbi->x_aoi_d; |
diff --git a/drivers/video/pm2fb.c b/drivers/video/pm2fb.c index 3f1ca2adda3d..c6dd924976a4 100644 --- a/drivers/video/pm2fb.c +++ b/drivers/video/pm2fb.c | |||
@@ -1746,6 +1746,7 @@ static void __devexit pm2fb_remove(struct pci_dev *pdev) | |||
1746 | release_mem_region(fix->mmio_start, fix->mmio_len); | 1746 | release_mem_region(fix->mmio_start, fix->mmio_len); |
1747 | 1747 | ||
1748 | pci_set_drvdata(pdev, NULL); | 1748 | pci_set_drvdata(pdev, NULL); |
1749 | fb_dealloc_cmap(&info->cmap); | ||
1749 | kfree(info->pixmap.addr); | 1750 | kfree(info->pixmap.addr); |
1750 | kfree(info); | 1751 | kfree(info); |
1751 | } | 1752 | } |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index e7aa7ae8fca8..97204497d9f7 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
@@ -1031,7 +1031,9 @@ static void pxafb_setup_gpio(struct pxafb_info *fbi) | |||
1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); | 1031 | pxa_gpio_mode(GPIO74_LCD_FCLK_MD); |
1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); | 1032 | pxa_gpio_mode(GPIO75_LCD_LCLK_MD); |
1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); | 1033 | pxa_gpio_mode(GPIO76_LCD_PCLK_MD); |
1034 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | 1034 | |
1035 | if ((lccr0 & LCCR0_PAS) == 0) | ||
1036 | pxa_gpio_mode(GPIO77_LCD_ACBIAS_MD); | ||
1035 | } | 1037 | } |
1036 | 1038 | ||
1037 | static void pxafb_enable_controller(struct pxafb_info *fbi) | 1039 | static void pxafb_enable_controller(struct pxafb_info *fbi) |
@@ -1400,6 +1402,8 @@ static void pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
1400 | if (lcd_conn == LCD_MONO_STN_8BPP) | 1402 | if (lcd_conn == LCD_MONO_STN_8BPP) |
1401 | fbi->lccr0 |= LCCR0_DPD; | 1403 | fbi->lccr0 |= LCCR0_DPD; |
1402 | 1404 | ||
1405 | fbi->lccr0 |= (lcd_conn & LCD_ALTERNATE_MAPPING) ? LCCR0_LDDALT : 0; | ||
1406 | |||
1403 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); | 1407 | fbi->lccr3 = LCCR3_Acb((inf->lcd_conn >> 10) & 0xff); |
1404 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; | 1408 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; |
1405 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; | 1409 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; |
@@ -1673,53 +1677,63 @@ MODULE_PARM_DESC(options, "LCD parameters (see Documentation/fb/pxafb.txt)"); | |||
1673 | #define pxafb_setup_options() (0) | 1677 | #define pxafb_setup_options() (0) |
1674 | #endif | 1678 | #endif |
1675 | 1679 | ||
1676 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
1677 | { | ||
1678 | struct pxafb_info *fbi; | ||
1679 | struct pxafb_mach_info *inf; | ||
1680 | struct resource *r; | ||
1681 | int irq, ret; | ||
1682 | |||
1683 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
1684 | |||
1685 | inf = dev->dev.platform_data; | ||
1686 | ret = -ENOMEM; | ||
1687 | fbi = NULL; | ||
1688 | if (!inf) | ||
1689 | goto failed; | ||
1690 | |||
1691 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
1692 | if (ret < 0) | ||
1693 | goto failed; | ||
1694 | |||
1695 | #ifdef DEBUG_VAR | 1680 | #ifdef DEBUG_VAR |
1696 | /* Check for various illegal bit-combinations. Currently only | 1681 | /* Check for various illegal bit-combinations. Currently only |
1697 | * a warning is given. */ | 1682 | * a warning is given. */ |
1683 | static void __devinit pxafb_check_options(struct device *dev, | ||
1684 | struct pxafb_mach_info *inf) | ||
1685 | { | ||
1686 | if (inf->lcd_conn) | ||
1687 | return; | ||
1698 | 1688 | ||
1699 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) | 1689 | if (inf->lccr0 & LCCR0_INVALID_CONFIG_MASK) |
1700 | dev_warn(&dev->dev, "machine LCCR0 setting contains " | 1690 | dev_warn(dev, "machine LCCR0 setting contains " |
1701 | "illegal bits: %08x\n", | 1691 | "illegal bits: %08x\n", |
1702 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); | 1692 | inf->lccr0 & LCCR0_INVALID_CONFIG_MASK); |
1703 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) | 1693 | if (inf->lccr3 & LCCR3_INVALID_CONFIG_MASK) |
1704 | dev_warn(&dev->dev, "machine LCCR3 setting contains " | 1694 | dev_warn(dev, "machine LCCR3 setting contains " |
1705 | "illegal bits: %08x\n", | 1695 | "illegal bits: %08x\n", |
1706 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); | 1696 | inf->lccr3 & LCCR3_INVALID_CONFIG_MASK); |
1707 | if (inf->lccr0 & LCCR0_DPD && | 1697 | if (inf->lccr0 & LCCR0_DPD && |
1708 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || | 1698 | ((inf->lccr0 & LCCR0_PAS) != LCCR0_Pas || |
1709 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || | 1699 | (inf->lccr0 & LCCR0_SDS) != LCCR0_Sngl || |
1710 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) | 1700 | (inf->lccr0 & LCCR0_CMS) != LCCR0_Mono)) |
1711 | dev_warn(&dev->dev, "Double Pixel Data (DPD) mode is " | 1701 | dev_warn(dev, "Double Pixel Data (DPD) mode is " |
1712 | "only valid in passive mono" | 1702 | "only valid in passive mono" |
1713 | " single panel mode\n"); | 1703 | " single panel mode\n"); |
1714 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && | 1704 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Act && |
1715 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) | 1705 | (inf->lccr0 & LCCR0_SDS) == LCCR0_Dual) |
1716 | dev_warn(&dev->dev, "Dual panel only valid in passive mode\n"); | 1706 | dev_warn(dev, "Dual panel only valid in passive mode\n"); |
1717 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && | 1707 | if ((inf->lccr0 & LCCR0_PAS) == LCCR0_Pas && |
1718 | (inf->modes->upper_margin || inf->modes->lower_margin)) | 1708 | (inf->modes->upper_margin || inf->modes->lower_margin)) |
1719 | dev_warn(&dev->dev, "Upper and lower margins must be 0 in " | 1709 | dev_warn(dev, "Upper and lower margins must be 0 in " |
1720 | "passive mode\n"); | 1710 | "passive mode\n"); |
1711 | } | ||
1712 | #else | ||
1713 | #define pxafb_check_options(...) do {} while (0) | ||
1721 | #endif | 1714 | #endif |
1722 | 1715 | ||
1716 | static int __devinit pxafb_probe(struct platform_device *dev) | ||
1717 | { | ||
1718 | struct pxafb_info *fbi; | ||
1719 | struct pxafb_mach_info *inf; | ||
1720 | struct resource *r; | ||
1721 | int irq, ret; | ||
1722 | |||
1723 | dev_dbg(&dev->dev, "pxafb_probe\n"); | ||
1724 | |||
1725 | inf = dev->dev.platform_data; | ||
1726 | ret = -ENOMEM; | ||
1727 | fbi = NULL; | ||
1728 | if (!inf) | ||
1729 | goto failed; | ||
1730 | |||
1731 | ret = pxafb_parse_options(&dev->dev, g_options); | ||
1732 | if (ret < 0) | ||
1733 | goto failed; | ||
1734 | |||
1735 | pxafb_check_options(&dev->dev, inf); | ||
1736 | |||
1723 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", | 1737 | dev_dbg(&dev->dev, "got a %dx%dx%d LCD\n", |
1724 | inf->modes->xres, | 1738 | inf->modes->xres, |
1725 | inf->modes->yres, | 1739 | inf->modes->yres, |
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c index 8361bd0e3df1..4dcec48a1d78 100644 --- a/drivers/video/s3fb.c +++ b/drivers/video/s3fb.c | |||
@@ -11,7 +11,6 @@ | |||
11 | * which is based on the code of neofb. | 11 | * which is based on the code of neofb. |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/version.h> | ||
15 | #include <linux/module.h> | 14 | #include <linux/module.h> |
16 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
17 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index f6ef6cca73cd..4c32c06579a0 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
@@ -595,6 +595,8 @@ static int __init sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
595 | info->fbops = &sh_mobile_lcdc_ops; | 595 | info->fbops = &sh_mobile_lcdc_ops; |
596 | info->var.xres = info->var.xres_virtual = cfg->lcd_cfg.xres; | 596 | info->var.xres = info->var.xres_virtual = cfg->lcd_cfg.xres; |
597 | info->var.yres = info->var.yres_virtual = cfg->lcd_cfg.yres; | 597 | info->var.yres = info->var.yres_virtual = cfg->lcd_cfg.yres; |
598 | info->var.width = cfg->lcd_size_cfg.width; | ||
599 | info->var.height = cfg->lcd_size_cfg.height; | ||
598 | info->var.activate = FB_ACTIVATE_NOW; | 600 | info->var.activate = FB_ACTIVATE_NOW; |
599 | error = sh_mobile_lcdc_set_bpp(&info->var, cfg->bpp); | 601 | error = sh_mobile_lcdc_set_bpp(&info->var, cfg->bpp); |
600 | if (error) | 602 | if (error) |
diff --git a/drivers/video/vermilion/vermilion.h b/drivers/video/vermilion/vermilion.h index c4aba59d4809..7491abfcf1fc 100644 --- a/drivers/video/vermilion/vermilion.h +++ b/drivers/video/vermilion/vermilion.h | |||
@@ -30,7 +30,6 @@ | |||
30 | #define _VERMILION_H_ | 30 | #define _VERMILION_H_ |
31 | 31 | ||
32 | #include <linux/kernel.h> | 32 | #include <linux/kernel.h> |
33 | #include <linux/version.h> | ||
34 | #include <linux/pci.h> | 33 | #include <linux/pci.h> |
35 | #include <asm/atomic.h> | 34 | #include <asm/atomic.h> |
36 | #include <linux/mutex.h> | 35 | #include <linux/mutex.h> |
diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c index 34aae7a2a62b..3df17dc8c3d7 100644 --- a/drivers/video/vt8623fb.c +++ b/drivers/video/vt8623fb.c | |||
@@ -12,7 +12,6 @@ | |||
12 | * (http://davesdomain.org.uk/viafb/) | 12 | * (http://davesdomain.org.uk/viafb/) |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/version.h> | ||
16 | #include <linux/module.h> | 15 | #include <linux/module.h> |
17 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
18 | #include <linux/errno.h> | 17 | #include <linux/errno.h> |
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c index 7b3a8423f485..5da3d2423cc0 100644 --- a/drivers/video/xilinxfb.c +++ b/drivers/video/xilinxfb.c | |||
@@ -24,7 +24,6 @@ | |||
24 | #include <linux/device.h> | 24 | #include <linux/device.h> |
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
27 | #include <linux/version.h> | ||
28 | #include <linux/errno.h> | 27 | #include <linux/errno.h> |
29 | #include <linux/string.h> | 28 | #include <linux/string.h> |
30 | #include <linux/mm.h> | 29 | #include <linux/mm.h> |
diff --git a/drivers/watchdog/s3c2410_wdt.c b/drivers/watchdog/s3c2410_wdt.c index 3da2b90d2fe6..22715e3be5e7 100644 --- a/drivers/watchdog/s3c2410_wdt.c +++ b/drivers/watchdog/s3c2410_wdt.c | |||
@@ -157,8 +157,6 @@ static void s3c2410wdt_start(void) | |||
157 | writel(wdt_count, wdt_base + S3C2410_WTCNT); | 157 | writel(wdt_count, wdt_base + S3C2410_WTCNT); |
158 | writel(wtcon, wdt_base + S3C2410_WTCON); | 158 | writel(wtcon, wdt_base + S3C2410_WTCON); |
159 | spin_unlock(&wdt_lock); | 159 | spin_unlock(&wdt_lock); |
160 | |||
161 | return 0; | ||
162 | } | 160 | } |
163 | 161 | ||
164 | static int s3c2410wdt_set_heartbeat(int timeout) | 162 | static int s3c2410wdt_set_heartbeat(int timeout) |
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c index 56372ecf1690..dfc0197905ca 100644 --- a/fs/binfmt_flat.c +++ b/fs/binfmt_flat.c | |||
@@ -914,7 +914,9 @@ static int load_flat_binary(struct linux_binprm * bprm, struct pt_regs * regs) | |||
914 | /* Stash our initial stack pointer into the mm structure */ | 914 | /* Stash our initial stack pointer into the mm structure */ |
915 | current->mm->start_stack = (unsigned long )sp; | 915 | current->mm->start_stack = (unsigned long )sp; |
916 | 916 | ||
917 | 917 | #ifdef FLAT_PLAT_INIT | |
918 | FLAT_PLAT_INIT(regs); | ||
919 | #endif | ||
918 | DBG_FLT("start_thread(regs=0x%x, entry=0x%x, start_stack=0x%x)\n", | 920 | DBG_FLT("start_thread(regs=0x%x, entry=0x%x, start_stack=0x%x)\n", |
919 | (int)regs, (int)start_addr, (int)current->mm->start_stack); | 921 | (int)regs, (int)start_addr, (int)current->mm->start_stack); |
920 | 922 | ||
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c index 756205314c24..8d7e88e02e0f 100644 --- a/fs/binfmt_misc.c +++ b/fs/binfmt_misc.c | |||
@@ -120,8 +120,6 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
120 | if (bprm->misc_bang) | 120 | if (bprm->misc_bang) |
121 | goto _ret; | 121 | goto _ret; |
122 | 122 | ||
123 | bprm->misc_bang = 1; | ||
124 | |||
125 | /* to keep locking time low, we copy the interpreter string */ | 123 | /* to keep locking time low, we copy the interpreter string */ |
126 | read_lock(&entries_lock); | 124 | read_lock(&entries_lock); |
127 | fmt = check_file(bprm); | 125 | fmt = check_file(bprm); |
@@ -199,6 +197,8 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs) | |||
199 | if (retval < 0) | 197 | if (retval < 0) |
200 | goto _error; | 198 | goto _error; |
201 | 199 | ||
200 | bprm->misc_bang = 1; | ||
201 | |||
202 | retval = search_binary_handler (bprm, regs); | 202 | retval = search_binary_handler (bprm, regs); |
203 | if (retval < 0) | 203 | if (retval < 0) |
204 | goto _error; | 204 | goto _error; |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index e8da4ee761b5..25ecbd5b0404 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -175,6 +175,8 @@ out_no_root: | |||
175 | if (inode) | 175 | if (inode) |
176 | iput(inode); | 176 | iput(inode); |
177 | 177 | ||
178 | cifs_umount(sb, cifs_sb); | ||
179 | |||
178 | out_mount_failed: | 180 | out_mount_failed: |
179 | if (cifs_sb) { | 181 | if (cifs_sb) { |
180 | #ifdef CONFIG_CIFS_DFS_UPCALL | 182 | #ifdef CONFIG_CIFS_DFS_UPCALL |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 28a22092d450..848286861c31 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -649,6 +649,7 @@ struct inode *cifs_iget(struct super_block *sb, unsigned long ino) | |||
649 | inode->i_fop = &simple_dir_operations; | 649 | inode->i_fop = &simple_dir_operations; |
650 | inode->i_uid = cifs_sb->mnt_uid; | 650 | inode->i_uid = cifs_sb->mnt_uid; |
651 | inode->i_gid = cifs_sb->mnt_gid; | 651 | inode->i_gid = cifs_sb->mnt_gid; |
652 | } else if (rc) { | ||
652 | _FreeXid(xid); | 653 | _FreeXid(xid); |
653 | iget_failed(inode); | 654 | iget_failed(inode); |
654 | return ERR_PTR(rc); | 655 | return ERR_PTR(rc); |
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c index 0c3b618c15b3..f40423eb1a14 100644 --- a/fs/cramfs/inode.c +++ b/fs/cramfs/inode.c | |||
@@ -43,58 +43,13 @@ static DEFINE_MUTEX(read_mutex); | |||
43 | static int cramfs_iget5_test(struct inode *inode, void *opaque) | 43 | static int cramfs_iget5_test(struct inode *inode, void *opaque) |
44 | { | 44 | { |
45 | struct cramfs_inode *cramfs_inode = opaque; | 45 | struct cramfs_inode *cramfs_inode = opaque; |
46 | 46 | return inode->i_ino == CRAMINO(cramfs_inode) && inode->i_ino != 1; | |
47 | if (inode->i_ino != CRAMINO(cramfs_inode)) | ||
48 | return 0; /* does not match */ | ||
49 | |||
50 | if (inode->i_ino != 1) | ||
51 | return 1; | ||
52 | |||
53 | /* all empty directories, char, block, pipe, and sock, share inode #1 */ | ||
54 | |||
55 | if ((inode->i_mode != cramfs_inode->mode) || | ||
56 | (inode->i_gid != cramfs_inode->gid) || | ||
57 | (inode->i_uid != cramfs_inode->uid)) | ||
58 | return 0; /* does not match */ | ||
59 | |||
60 | if ((S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) && | ||
61 | (inode->i_rdev != old_decode_dev(cramfs_inode->size))) | ||
62 | return 0; /* does not match */ | ||
63 | |||
64 | return 1; /* matches */ | ||
65 | } | 47 | } |
66 | 48 | ||
67 | static int cramfs_iget5_set(struct inode *inode, void *opaque) | 49 | static int cramfs_iget5_set(struct inode *inode, void *opaque) |
68 | { | 50 | { |
69 | static struct timespec zerotime; | ||
70 | struct cramfs_inode *cramfs_inode = opaque; | 51 | struct cramfs_inode *cramfs_inode = opaque; |
71 | inode->i_mode = cramfs_inode->mode; | ||
72 | inode->i_uid = cramfs_inode->uid; | ||
73 | inode->i_size = cramfs_inode->size; | ||
74 | inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1; | ||
75 | inode->i_gid = cramfs_inode->gid; | ||
76 | /* Struct copy intentional */ | ||
77 | inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime; | ||
78 | inode->i_ino = CRAMINO(cramfs_inode); | 52 | inode->i_ino = CRAMINO(cramfs_inode); |
79 | /* inode->i_nlink is left 1 - arguably wrong for directories, | ||
80 | but it's the best we can do without reading the directory | ||
81 | contents. 1 yields the right result in GNU find, even | ||
82 | without -noleaf option. */ | ||
83 | if (S_ISREG(inode->i_mode)) { | ||
84 | inode->i_fop = &generic_ro_fops; | ||
85 | inode->i_data.a_ops = &cramfs_aops; | ||
86 | } else if (S_ISDIR(inode->i_mode)) { | ||
87 | inode->i_op = &cramfs_dir_inode_operations; | ||
88 | inode->i_fop = &cramfs_directory_operations; | ||
89 | } else if (S_ISLNK(inode->i_mode)) { | ||
90 | inode->i_op = &page_symlink_inode_operations; | ||
91 | inode->i_data.a_ops = &cramfs_aops; | ||
92 | } else { | ||
93 | inode->i_size = 0; | ||
94 | inode->i_blocks = 0; | ||
95 | init_special_inode(inode, inode->i_mode, | ||
96 | old_decode_dev(cramfs_inode->size)); | ||
97 | } | ||
98 | return 0; | 53 | return 0; |
99 | } | 54 | } |
100 | 55 | ||
@@ -104,12 +59,48 @@ static struct inode *get_cramfs_inode(struct super_block *sb, | |||
104 | struct inode *inode = iget5_locked(sb, CRAMINO(cramfs_inode), | 59 | struct inode *inode = iget5_locked(sb, CRAMINO(cramfs_inode), |
105 | cramfs_iget5_test, cramfs_iget5_set, | 60 | cramfs_iget5_test, cramfs_iget5_set, |
106 | cramfs_inode); | 61 | cramfs_inode); |
62 | static struct timespec zerotime; | ||
63 | |||
107 | if (inode && (inode->i_state & I_NEW)) { | 64 | if (inode && (inode->i_state & I_NEW)) { |
65 | inode->i_mode = cramfs_inode->mode; | ||
66 | inode->i_uid = cramfs_inode->uid; | ||
67 | inode->i_size = cramfs_inode->size; | ||
68 | inode->i_blocks = (cramfs_inode->size - 1) / 512 + 1; | ||
69 | inode->i_gid = cramfs_inode->gid; | ||
70 | /* Struct copy intentional */ | ||
71 | inode->i_mtime = inode->i_atime = inode->i_ctime = zerotime; | ||
72 | /* inode->i_nlink is left 1 - arguably wrong for directories, | ||
73 | but it's the best we can do without reading the directory | ||
74 | contents. 1 yields the right result in GNU find, even | ||
75 | without -noleaf option. */ | ||
76 | if (S_ISREG(inode->i_mode)) { | ||
77 | inode->i_fop = &generic_ro_fops; | ||
78 | inode->i_data.a_ops = &cramfs_aops; | ||
79 | } else if (S_ISDIR(inode->i_mode)) { | ||
80 | inode->i_op = &cramfs_dir_inode_operations; | ||
81 | inode->i_fop = &cramfs_directory_operations; | ||
82 | } else if (S_ISLNK(inode->i_mode)) { | ||
83 | inode->i_op = &page_symlink_inode_operations; | ||
84 | inode->i_data.a_ops = &cramfs_aops; | ||
85 | } else { | ||
86 | inode->i_size = 0; | ||
87 | inode->i_blocks = 0; | ||
88 | init_special_inode(inode, inode->i_mode, | ||
89 | old_decode_dev(cramfs_inode->size)); | ||
90 | } | ||
108 | unlock_new_inode(inode); | 91 | unlock_new_inode(inode); |
109 | } | 92 | } |
110 | return inode; | 93 | return inode; |
111 | } | 94 | } |
112 | 95 | ||
96 | static void cramfs_drop_inode(struct inode *inode) | ||
97 | { | ||
98 | if (inode->i_ino == 1) | ||
99 | generic_delete_inode(inode); | ||
100 | else | ||
101 | generic_drop_inode(inode); | ||
102 | } | ||
103 | |||
113 | /* | 104 | /* |
114 | * We have our own block cache: don't fill up the buffer cache | 105 | * We have our own block cache: don't fill up the buffer cache |
115 | * with the rom-image, because the way the filesystem is set | 106 | * with the rom-image, because the way the filesystem is set |
@@ -534,6 +525,7 @@ static const struct super_operations cramfs_ops = { | |||
534 | .put_super = cramfs_put_super, | 525 | .put_super = cramfs_put_super, |
535 | .remount_fs = cramfs_remount, | 526 | .remount_fs = cramfs_remount, |
536 | .statfs = cramfs_statfs, | 527 | .statfs = cramfs_statfs, |
528 | .drop_inode = cramfs_drop_inode, | ||
537 | }; | 529 | }; |
538 | 530 | ||
539 | static int cramfs_get_sb(struct file_system_type *fs_type, | 531 | static int cramfs_get_sb(struct file_system_type *fs_type, |
diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c index 1ae5004e93fc..e9fa960ba6da 100644 --- a/fs/ext4/balloc.c +++ b/fs/ext4/balloc.c | |||
@@ -1626,6 +1626,9 @@ ext4_fsblk_t ext4_has_free_blocks(struct ext4_sb_info *sbi, | |||
1626 | free_blocks = | 1626 | free_blocks = |
1627 | percpu_counter_sum_and_set(&sbi->s_freeblocks_counter); | 1627 | percpu_counter_sum_and_set(&sbi->s_freeblocks_counter); |
1628 | #endif | 1628 | #endif |
1629 | if (free_blocks <= root_blocks) | ||
1630 | /* we don't have free space */ | ||
1631 | return 0; | ||
1629 | if (free_blocks - root_blocks < nblocks) | 1632 | if (free_blocks - root_blocks < nblocks) |
1630 | return free_blocks - root_blocks; | 1633 | return free_blocks - root_blocks; |
1631 | return nblocks; | 1634 | return nblocks; |
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index d3d23d73c08b..ec8e33b45219 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c | |||
@@ -411,7 +411,7 @@ static int call_filldir(struct file * filp, void * dirent, | |||
411 | get_dtype(sb, fname->file_type)); | 411 | get_dtype(sb, fname->file_type)); |
412 | if (error) { | 412 | if (error) { |
413 | filp->f_pos = curr_pos; | 413 | filp->f_pos = curr_pos; |
414 | info->extra_fname = fname->next; | 414 | info->extra_fname = fname; |
415 | return error; | 415 | return error; |
416 | } | 416 | } |
417 | fname = fname->next; | 417 | fname = fname->next; |
@@ -450,11 +450,21 @@ static int ext4_dx_readdir(struct file * filp, | |||
450 | * If there are any leftover names on the hash collision | 450 | * If there are any leftover names on the hash collision |
451 | * chain, return them first. | 451 | * chain, return them first. |
452 | */ | 452 | */ |
453 | if (info->extra_fname && | 453 | if (info->extra_fname) { |
454 | call_filldir(filp, dirent, filldir, info->extra_fname)) | 454 | if (call_filldir(filp, dirent, filldir, info->extra_fname)) |
455 | goto finished; | 455 | goto finished; |
456 | 456 | ||
457 | if (!info->curr_node) | 457 | info->extra_fname = NULL; |
458 | info->curr_node = rb_next(info->curr_node); | ||
459 | if (!info->curr_node) { | ||
460 | if (info->next_hash == ~0) { | ||
461 | filp->f_pos = EXT4_HTREE_EOF; | ||
462 | goto finished; | ||
463 | } | ||
464 | info->curr_hash = info->next_hash; | ||
465 | info->curr_minor_hash = 0; | ||
466 | } | ||
467 | } else if (!info->curr_node) | ||
458 | info->curr_node = rb_first(&info->root); | 468 | info->curr_node = rb_first(&info->root); |
459 | 469 | ||
460 | while (1) { | 470 | while (1) { |
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index 6c7924d9e358..295003241d3d 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1072,6 +1072,8 @@ extern void ext4_set_inode_flags(struct inode *); | |||
1072 | extern void ext4_get_inode_flags(struct ext4_inode_info *); | 1072 | extern void ext4_get_inode_flags(struct ext4_inode_info *); |
1073 | extern void ext4_set_aops(struct inode *inode); | 1073 | extern void ext4_set_aops(struct inode *inode); |
1074 | extern int ext4_writepage_trans_blocks(struct inode *); | 1074 | extern int ext4_writepage_trans_blocks(struct inode *); |
1075 | extern int ext4_meta_trans_blocks(struct inode *, int nrblocks, int idxblocks); | ||
1076 | extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks); | ||
1075 | extern int ext4_block_truncate_page(handle_t *handle, | 1077 | extern int ext4_block_truncate_page(handle_t *handle, |
1076 | struct address_space *mapping, loff_t from); | 1078 | struct address_space *mapping, loff_t from); |
1077 | extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct page *page); | 1079 | extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct page *page); |
@@ -1227,6 +1229,8 @@ extern const struct inode_operations ext4_fast_symlink_inode_operations; | |||
1227 | /* extents.c */ | 1229 | /* extents.c */ |
1228 | extern int ext4_ext_tree_init(handle_t *handle, struct inode *); | 1230 | extern int ext4_ext_tree_init(handle_t *handle, struct inode *); |
1229 | extern int ext4_ext_writepage_trans_blocks(struct inode *, int); | 1231 | extern int ext4_ext_writepage_trans_blocks(struct inode *, int); |
1232 | extern int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, | ||
1233 | int chunk); | ||
1230 | extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, | 1234 | extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, |
1231 | ext4_lblk_t iblock, | 1235 | ext4_lblk_t iblock, |
1232 | unsigned long max_blocks, struct buffer_head *bh_result, | 1236 | unsigned long max_blocks, struct buffer_head *bh_result, |
diff --git a/fs/ext4/ext4_extents.h b/fs/ext4/ext4_extents.h index 6c166c0a54b7..d33dc56d6986 100644 --- a/fs/ext4/ext4_extents.h +++ b/fs/ext4/ext4_extents.h | |||
@@ -216,7 +216,9 @@ extern int ext4_ext_calc_metadata_amount(struct inode *inode, int blocks); | |||
216 | extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *); | 216 | extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *); |
217 | extern void ext4_ext_store_pblock(struct ext4_extent *, ext4_fsblk_t); | 217 | extern void ext4_ext_store_pblock(struct ext4_extent *, ext4_fsblk_t); |
218 | extern int ext4_extent_tree_init(handle_t *, struct inode *); | 218 | extern int ext4_extent_tree_init(handle_t *, struct inode *); |
219 | extern int ext4_ext_calc_credits_for_insert(struct inode *, struct ext4_ext_path *); | 219 | extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, |
220 | int num, | ||
221 | struct ext4_ext_path *path); | ||
220 | extern int ext4_ext_try_to_merge(struct inode *inode, | 222 | extern int ext4_ext_try_to_merge(struct inode *inode, |
221 | struct ext4_ext_path *path, | 223 | struct ext4_ext_path *path, |
222 | struct ext4_extent *); | 224 | struct ext4_extent *); |
diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h index eb8bc3afe6e9..b455c685a98b 100644 --- a/fs/ext4/ext4_jbd2.h +++ b/fs/ext4/ext4_jbd2.h | |||
@@ -51,6 +51,14 @@ | |||
51 | EXT4_XATTR_TRANS_BLOCKS - 2 + \ | 51 | EXT4_XATTR_TRANS_BLOCKS - 2 + \ |
52 | 2*EXT4_QUOTA_TRANS_BLOCKS(sb)) | 52 | 2*EXT4_QUOTA_TRANS_BLOCKS(sb)) |
53 | 53 | ||
54 | /* | ||
55 | * Define the number of metadata blocks we need to account to modify data. | ||
56 | * | ||
57 | * This include super block, inode block, quota blocks and xattr blocks | ||
58 | */ | ||
59 | #define EXT4_META_TRANS_BLOCKS(sb) (EXT4_XATTR_TRANS_BLOCKS + \ | ||
60 | 2*EXT4_QUOTA_TRANS_BLOCKS(sb)) | ||
61 | |||
54 | /* Delete operations potentially hit one directory's namespace plus an | 62 | /* Delete operations potentially hit one directory's namespace plus an |
55 | * entire inode, plus arbitrary amounts of bitmap/indirection data. Be | 63 | * entire inode, plus arbitrary amounts of bitmap/indirection data. Be |
56 | * generous. We can grow the delete transaction later if necessary. */ | 64 | * generous. We can grow the delete transaction later if necessary. */ |
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 612c3d2c3824..b24d3c53f20c 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c | |||
@@ -1747,54 +1747,61 @@ static int ext4_ext_rm_idx(handle_t *handle, struct inode *inode, | |||
1747 | } | 1747 | } |
1748 | 1748 | ||
1749 | /* | 1749 | /* |
1750 | * ext4_ext_calc_credits_for_insert: | 1750 | * ext4_ext_calc_credits_for_single_extent: |
1751 | * This routine returns max. credits that the extent tree can consume. | 1751 | * This routine returns max. credits that needed to insert an extent |
1752 | * It should be OK for low-performance paths like ->writepage() | 1752 | * to the extent tree. |
1753 | * To allow many writing processes to fit into a single transaction, | 1753 | * When pass the actual path, the caller should calculate credits |
1754 | * the caller should calculate credits under i_data_sem and | 1754 | * under i_data_sem. |
1755 | * pass the actual path. | ||
1756 | */ | 1755 | */ |
1757 | int ext4_ext_calc_credits_for_insert(struct inode *inode, | 1756 | int ext4_ext_calc_credits_for_single_extent(struct inode *inode, int nrblocks, |
1758 | struct ext4_ext_path *path) | 1757 | struct ext4_ext_path *path) |
1759 | { | 1758 | { |
1760 | int depth, needed; | ||
1761 | |||
1762 | if (path) { | 1759 | if (path) { |
1760 | int depth = ext_depth(inode); | ||
1761 | int ret = 0; | ||
1762 | |||
1763 | /* probably there is space in leaf? */ | 1763 | /* probably there is space in leaf? */ |
1764 | depth = ext_depth(inode); | ||
1765 | if (le16_to_cpu(path[depth].p_hdr->eh_entries) | 1764 | if (le16_to_cpu(path[depth].p_hdr->eh_entries) |
1766 | < le16_to_cpu(path[depth].p_hdr->eh_max)) | 1765 | < le16_to_cpu(path[depth].p_hdr->eh_max)) { |
1767 | return 1; | ||
1768 | } | ||
1769 | 1766 | ||
1770 | /* | 1767 | /* |
1771 | * given 32-bit logical block (4294967296 blocks), max. tree | 1768 | * There are some space in the leaf tree, no |
1772 | * can be 4 levels in depth -- 4 * 340^4 == 53453440000. | 1769 | * need to account for leaf block credit |
1773 | * Let's also add one more level for imbalance. | 1770 | * |
1774 | */ | 1771 | * bitmaps and block group descriptor blocks |
1775 | depth = 5; | 1772 | * and other metadat blocks still need to be |
1776 | 1773 | * accounted. | |
1777 | /* allocation of new data block(s) */ | 1774 | */ |
1778 | needed = 2; | 1775 | /* 1 bitmap, 1 block group descriptor */ |
1776 | ret = 2 + EXT4_META_TRANS_BLOCKS(inode->i_sb); | ||
1777 | } | ||
1778 | } | ||
1779 | 1779 | ||
1780 | /* | 1780 | return ext4_chunk_trans_blocks(inode, nrblocks); |
1781 | * tree can be full, so it would need to grow in depth: | 1781 | } |
1782 | * we need one credit to modify old root, credits for | ||
1783 | * new root will be added in split accounting | ||
1784 | */ | ||
1785 | needed += 1; | ||
1786 | 1782 | ||
1787 | /* | 1783 | /* |
1788 | * Index split can happen, we would need: | 1784 | * How many index/leaf blocks need to change/allocate to modify nrblocks? |
1789 | * allocate intermediate indexes (bitmap + group) | 1785 | * |
1790 | * + change two blocks at each level, but root (already included) | 1786 | * if nrblocks are fit in a single extent (chunk flag is 1), then |
1791 | */ | 1787 | * in the worse case, each tree level index/leaf need to be changed |
1792 | needed += (depth * 2) + (depth * 2); | 1788 | * if the tree split due to insert a new extent, then the old tree |
1789 | * index/leaf need to be updated too | ||
1790 | * | ||
1791 | * If the nrblocks are discontiguous, they could cause | ||
1792 | * the whole tree split more than once, but this is really rare. | ||
1793 | */ | ||
1794 | int ext4_ext_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) | ||
1795 | { | ||
1796 | int index; | ||
1797 | int depth = ext_depth(inode); | ||
1793 | 1798 | ||
1794 | /* any allocation modifies superblock */ | 1799 | if (chunk) |
1795 | needed += 1; | 1800 | index = depth * 2; |
1801 | else | ||
1802 | index = depth * 3; | ||
1796 | 1803 | ||
1797 | return needed; | 1804 | return index; |
1798 | } | 1805 | } |
1799 | 1806 | ||
1800 | static int ext4_remove_blocks(handle_t *handle, struct inode *inode, | 1807 | static int ext4_remove_blocks(handle_t *handle, struct inode *inode, |
@@ -1921,9 +1928,7 @@ ext4_ext_rm_leaf(handle_t *handle, struct inode *inode, | |||
1921 | correct_index = 1; | 1928 | correct_index = 1; |
1922 | credits += (ext_depth(inode)) + 1; | 1929 | credits += (ext_depth(inode)) + 1; |
1923 | } | 1930 | } |
1924 | #ifdef CONFIG_QUOTA | ||
1925 | credits += 2 * EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb); | 1931 | credits += 2 * EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb); |
1926 | #endif | ||
1927 | 1932 | ||
1928 | err = ext4_ext_journal_restart(handle, credits); | 1933 | err = ext4_ext_journal_restart(handle, credits); |
1929 | if (err) | 1934 | if (err) |
@@ -2805,7 +2810,7 @@ void ext4_ext_truncate(struct inode *inode) | |||
2805 | /* | 2810 | /* |
2806 | * probably first extent we're gonna free will be last in block | 2811 | * probably first extent we're gonna free will be last in block |
2807 | */ | 2812 | */ |
2808 | err = ext4_writepage_trans_blocks(inode) + 3; | 2813 | err = ext4_writepage_trans_blocks(inode); |
2809 | handle = ext4_journal_start(inode, err); | 2814 | handle = ext4_journal_start(inode, err); |
2810 | if (IS_ERR(handle)) | 2815 | if (IS_ERR(handle)) |
2811 | return; | 2816 | return; |
@@ -2819,7 +2824,7 @@ void ext4_ext_truncate(struct inode *inode) | |||
2819 | down_write(&EXT4_I(inode)->i_data_sem); | 2824 | down_write(&EXT4_I(inode)->i_data_sem); |
2820 | ext4_ext_invalidate_cache(inode); | 2825 | ext4_ext_invalidate_cache(inode); |
2821 | 2826 | ||
2822 | ext4_mb_discard_inode_preallocations(inode); | 2827 | ext4_discard_reservation(inode); |
2823 | 2828 | ||
2824 | /* | 2829 | /* |
2825 | * TODO: optimization is possible here. | 2830 | * TODO: optimization is possible here. |
@@ -2858,27 +2863,6 @@ out_stop: | |||
2858 | ext4_journal_stop(handle); | 2863 | ext4_journal_stop(handle); |
2859 | } | 2864 | } |
2860 | 2865 | ||
2861 | /* | ||
2862 | * ext4_ext_writepage_trans_blocks: | ||
2863 | * calculate max number of blocks we could modify | ||
2864 | * in order to allocate new block for an inode | ||
2865 | */ | ||
2866 | int ext4_ext_writepage_trans_blocks(struct inode *inode, int num) | ||
2867 | { | ||
2868 | int needed; | ||
2869 | |||
2870 | needed = ext4_ext_calc_credits_for_insert(inode, NULL); | ||
2871 | |||
2872 | /* caller wants to allocate num blocks, but note it includes sb */ | ||
2873 | needed = needed * num - (num - 1); | ||
2874 | |||
2875 | #ifdef CONFIG_QUOTA | ||
2876 | needed += 2 * EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb); | ||
2877 | #endif | ||
2878 | |||
2879 | return needed; | ||
2880 | } | ||
2881 | |||
2882 | static void ext4_falloc_update_inode(struct inode *inode, | 2866 | static void ext4_falloc_update_inode(struct inode *inode, |
2883 | int mode, loff_t new_size, int update_ctime) | 2867 | int mode, loff_t new_size, int update_ctime) |
2884 | { | 2868 | { |
@@ -2939,10 +2923,9 @@ long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len) | |||
2939 | max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) | 2923 | max_blocks = (EXT4_BLOCK_ALIGN(len + offset, blkbits) >> blkbits) |
2940 | - block; | 2924 | - block; |
2941 | /* | 2925 | /* |
2942 | * credits to insert 1 extent into extent tree + buffers to be able to | 2926 | * credits to insert 1 extent into extent tree |
2943 | * modify 1 super block, 1 block bitmap and 1 group descriptor. | ||
2944 | */ | 2927 | */ |
2945 | credits = EXT4_DATA_TRANS_BLOCKS(inode->i_sb) + 3; | 2928 | credits = ext4_chunk_trans_blocks(inode, max_blocks); |
2946 | mutex_lock(&inode->i_mutex); | 2929 | mutex_lock(&inode->i_mutex); |
2947 | retry: | 2930 | retry: |
2948 | while (ret >= 0 && ret < max_blocks) { | 2931 | while (ret >= 0 && ret < max_blocks) { |
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c index 655e760212b8..f344834bbf58 100644 --- a/fs/ext4/ialloc.c +++ b/fs/ext4/ialloc.c | |||
@@ -351,7 +351,7 @@ find_close_to_parent: | |||
351 | goto found_flexbg; | 351 | goto found_flexbg; |
352 | } | 352 | } |
353 | 353 | ||
354 | if (best_flex < 0 || | 354 | if (flex_group[best_flex].free_inodes == 0 || |
355 | (flex_group[i].free_blocks > | 355 | (flex_group[i].free_blocks > |
356 | flex_group[best_flex].free_blocks && | 356 | flex_group[best_flex].free_blocks && |
357 | flex_group[i].free_inodes)) | 357 | flex_group[i].free_inodes)) |
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 59fbbe899acc..7e91913e325b 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -41,6 +41,8 @@ | |||
41 | #include "acl.h" | 41 | #include "acl.h" |
42 | #include "ext4_extents.h" | 42 | #include "ext4_extents.h" |
43 | 43 | ||
44 | #define MPAGE_DA_EXTENT_TAIL 0x01 | ||
45 | |||
44 | static inline int ext4_begin_ordered_truncate(struct inode *inode, | 46 | static inline int ext4_begin_ordered_truncate(struct inode *inode, |
45 | loff_t new_size) | 47 | loff_t new_size) |
46 | { | 48 | { |
@@ -1005,6 +1007,9 @@ static int ext4_indirect_calc_metadata_amount(struct inode *inode, int blocks) | |||
1005 | */ | 1007 | */ |
1006 | static int ext4_calc_metadata_amount(struct inode *inode, int blocks) | 1008 | static int ext4_calc_metadata_amount(struct inode *inode, int blocks) |
1007 | { | 1009 | { |
1010 | if (!blocks) | ||
1011 | return 0; | ||
1012 | |||
1008 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) | 1013 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) |
1009 | return ext4_ext_calc_metadata_amount(inode, blocks); | 1014 | return ext4_ext_calc_metadata_amount(inode, blocks); |
1010 | 1015 | ||
@@ -1041,18 +1046,6 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used) | |||
1041 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | 1046 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); |
1042 | } | 1047 | } |
1043 | 1048 | ||
1044 | /* Maximum number of blocks we map for direct IO at once. */ | ||
1045 | #define DIO_MAX_BLOCKS 4096 | ||
1046 | /* | ||
1047 | * Number of credits we need for writing DIO_MAX_BLOCKS: | ||
1048 | * We need sb + group descriptor + bitmap + inode -> 4 | ||
1049 | * For B blocks with A block pointers per block we need: | ||
1050 | * 1 (triple ind.) + (B/A/A + 2) (doubly ind.) + (B/A + 2) (indirect). | ||
1051 | * If we plug in 4096 for B and 256 for A (for 1KB block size), we get 25. | ||
1052 | */ | ||
1053 | #define DIO_CREDITS 25 | ||
1054 | |||
1055 | |||
1056 | /* | 1049 | /* |
1057 | * The ext4_get_blocks_wrap() function try to look up the requested blocks, | 1050 | * The ext4_get_blocks_wrap() function try to look up the requested blocks, |
1058 | * and returns if the blocks are already mapped. | 1051 | * and returns if the blocks are already mapped. |
@@ -1164,19 +1157,23 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, | |||
1164 | return retval; | 1157 | return retval; |
1165 | } | 1158 | } |
1166 | 1159 | ||
1160 | /* Maximum number of blocks we map for direct IO at once. */ | ||
1161 | #define DIO_MAX_BLOCKS 4096 | ||
1162 | |||
1167 | static int ext4_get_block(struct inode *inode, sector_t iblock, | 1163 | static int ext4_get_block(struct inode *inode, sector_t iblock, |
1168 | struct buffer_head *bh_result, int create) | 1164 | struct buffer_head *bh_result, int create) |
1169 | { | 1165 | { |
1170 | handle_t *handle = ext4_journal_current_handle(); | 1166 | handle_t *handle = ext4_journal_current_handle(); |
1171 | int ret = 0, started = 0; | 1167 | int ret = 0, started = 0; |
1172 | unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; | 1168 | unsigned max_blocks = bh_result->b_size >> inode->i_blkbits; |
1169 | int dio_credits; | ||
1173 | 1170 | ||
1174 | if (create && !handle) { | 1171 | if (create && !handle) { |
1175 | /* Direct IO write... */ | 1172 | /* Direct IO write... */ |
1176 | if (max_blocks > DIO_MAX_BLOCKS) | 1173 | if (max_blocks > DIO_MAX_BLOCKS) |
1177 | max_blocks = DIO_MAX_BLOCKS; | 1174 | max_blocks = DIO_MAX_BLOCKS; |
1178 | handle = ext4_journal_start(inode, DIO_CREDITS + | 1175 | dio_credits = ext4_chunk_trans_blocks(inode, max_blocks); |
1179 | 2 * EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb)); | 1176 | handle = ext4_journal_start(inode, dio_credits); |
1180 | if (IS_ERR(handle)) { | 1177 | if (IS_ERR(handle)) { |
1181 | ret = PTR_ERR(handle); | 1178 | ret = PTR_ERR(handle); |
1182 | goto out; | 1179 | goto out; |
@@ -1559,7 +1556,25 @@ static void ext4_da_release_space(struct inode *inode, int to_free) | |||
1559 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | 1556 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); |
1560 | int total, mdb, mdb_free, release; | 1557 | int total, mdb, mdb_free, release; |
1561 | 1558 | ||
1559 | if (!to_free) | ||
1560 | return; /* Nothing to release, exit */ | ||
1561 | |||
1562 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); | 1562 | spin_lock(&EXT4_I(inode)->i_block_reservation_lock); |
1563 | |||
1564 | if (!EXT4_I(inode)->i_reserved_data_blocks) { | ||
1565 | /* | ||
1566 | * if there is no reserved blocks, but we try to free some | ||
1567 | * then the counter is messed up somewhere. | ||
1568 | * but since this function is called from invalidate | ||
1569 | * page, it's harmless to return without any action | ||
1570 | */ | ||
1571 | printk(KERN_INFO "ext4 delalloc try to release %d reserved " | ||
1572 | "blocks for inode %lu, but there is no reserved " | ||
1573 | "data blocks\n", to_free, inode->i_ino); | ||
1574 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | ||
1575 | return; | ||
1576 | } | ||
1577 | |||
1563 | /* recalculate the number of metablocks still need to be reserved */ | 1578 | /* recalculate the number of metablocks still need to be reserved */ |
1564 | total = EXT4_I(inode)->i_reserved_data_blocks - to_free; | 1579 | total = EXT4_I(inode)->i_reserved_data_blocks - to_free; |
1565 | mdb = ext4_calc_metadata_amount(inode, total); | 1580 | mdb = ext4_calc_metadata_amount(inode, total); |
@@ -1613,11 +1628,13 @@ struct mpage_da_data { | |||
1613 | unsigned long first_page, next_page; /* extent of pages */ | 1628 | unsigned long first_page, next_page; /* extent of pages */ |
1614 | get_block_t *get_block; | 1629 | get_block_t *get_block; |
1615 | struct writeback_control *wbc; | 1630 | struct writeback_control *wbc; |
1631 | int io_done; | ||
1632 | long pages_written; | ||
1616 | }; | 1633 | }; |
1617 | 1634 | ||
1618 | /* | 1635 | /* |
1619 | * mpage_da_submit_io - walks through extent of pages and try to write | 1636 | * mpage_da_submit_io - walks through extent of pages and try to write |
1620 | * them with __mpage_writepage() | 1637 | * them with writepage() call back |
1621 | * | 1638 | * |
1622 | * @mpd->inode: inode | 1639 | * @mpd->inode: inode |
1623 | * @mpd->first_page: first page of the extent | 1640 | * @mpd->first_page: first page of the extent |
@@ -1632,18 +1649,11 @@ struct mpage_da_data { | |||
1632 | static int mpage_da_submit_io(struct mpage_da_data *mpd) | 1649 | static int mpage_da_submit_io(struct mpage_da_data *mpd) |
1633 | { | 1650 | { |
1634 | struct address_space *mapping = mpd->inode->i_mapping; | 1651 | struct address_space *mapping = mpd->inode->i_mapping; |
1635 | struct mpage_data mpd_pp = { | ||
1636 | .bio = NULL, | ||
1637 | .last_block_in_bio = 0, | ||
1638 | .get_block = mpd->get_block, | ||
1639 | .use_writepage = 1, | ||
1640 | }; | ||
1641 | int ret = 0, err, nr_pages, i; | 1652 | int ret = 0, err, nr_pages, i; |
1642 | unsigned long index, end; | 1653 | unsigned long index, end; |
1643 | struct pagevec pvec; | 1654 | struct pagevec pvec; |
1644 | 1655 | ||
1645 | BUG_ON(mpd->next_page <= mpd->first_page); | 1656 | BUG_ON(mpd->next_page <= mpd->first_page); |
1646 | |||
1647 | pagevec_init(&pvec, 0); | 1657 | pagevec_init(&pvec, 0); |
1648 | index = mpd->first_page; | 1658 | index = mpd->first_page; |
1649 | end = mpd->next_page - 1; | 1659 | end = mpd->next_page - 1; |
@@ -1661,8 +1671,9 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd) | |||
1661 | break; | 1671 | break; |
1662 | index++; | 1672 | index++; |
1663 | 1673 | ||
1664 | err = __mpage_writepage(page, mpd->wbc, &mpd_pp); | 1674 | err = mapping->a_ops->writepage(page, mpd->wbc); |
1665 | 1675 | if (!err) | |
1676 | mpd->pages_written++; | ||
1666 | /* | 1677 | /* |
1667 | * In error case, we have to continue because | 1678 | * In error case, we have to continue because |
1668 | * remaining pages are still locked | 1679 | * remaining pages are still locked |
@@ -1673,9 +1684,6 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd) | |||
1673 | } | 1684 | } |
1674 | pagevec_release(&pvec); | 1685 | pagevec_release(&pvec); |
1675 | } | 1686 | } |
1676 | if (mpd_pp.bio) | ||
1677 | mpage_bio_submit(WRITE, mpd_pp.bio); | ||
1678 | |||
1679 | return ret; | 1687 | return ret; |
1680 | } | 1688 | } |
1681 | 1689 | ||
@@ -1698,7 +1706,7 @@ static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | |||
1698 | int blocks = exbh->b_size >> inode->i_blkbits; | 1706 | int blocks = exbh->b_size >> inode->i_blkbits; |
1699 | sector_t pblock = exbh->b_blocknr, cur_logical; | 1707 | sector_t pblock = exbh->b_blocknr, cur_logical; |
1700 | struct buffer_head *head, *bh; | 1708 | struct buffer_head *head, *bh; |
1701 | unsigned long index, end; | 1709 | pgoff_t index, end; |
1702 | struct pagevec pvec; | 1710 | struct pagevec pvec; |
1703 | int nr_pages, i; | 1711 | int nr_pages, i; |
1704 | 1712 | ||
@@ -1741,6 +1749,13 @@ static void mpage_put_bnr_to_bhs(struct mpage_da_data *mpd, sector_t logical, | |||
1741 | if (buffer_delay(bh)) { | 1749 | if (buffer_delay(bh)) { |
1742 | bh->b_blocknr = pblock; | 1750 | bh->b_blocknr = pblock; |
1743 | clear_buffer_delay(bh); | 1751 | clear_buffer_delay(bh); |
1752 | bh->b_bdev = inode->i_sb->s_bdev; | ||
1753 | } else if (buffer_unwritten(bh)) { | ||
1754 | bh->b_blocknr = pblock; | ||
1755 | clear_buffer_unwritten(bh); | ||
1756 | set_buffer_mapped(bh); | ||
1757 | set_buffer_new(bh); | ||
1758 | bh->b_bdev = inode->i_sb->s_bdev; | ||
1744 | } else if (buffer_mapped(bh)) | 1759 | } else if (buffer_mapped(bh)) |
1745 | BUG_ON(bh->b_blocknr != pblock); | 1760 | BUG_ON(bh->b_blocknr != pblock); |
1746 | 1761 | ||
@@ -1776,13 +1791,11 @@ static inline void __unmap_underlying_blocks(struct inode *inode, | |||
1776 | * | 1791 | * |
1777 | * The function skips space we know is already mapped to disk blocks. | 1792 | * The function skips space we know is already mapped to disk blocks. |
1778 | * | 1793 | * |
1779 | * The function ignores errors ->get_block() returns, thus real | ||
1780 | * error handling is postponed to __mpage_writepage() | ||
1781 | */ | 1794 | */ |
1782 | static void mpage_da_map_blocks(struct mpage_da_data *mpd) | 1795 | static void mpage_da_map_blocks(struct mpage_da_data *mpd) |
1783 | { | 1796 | { |
1797 | int err = 0; | ||
1784 | struct buffer_head *lbh = &mpd->lbh; | 1798 | struct buffer_head *lbh = &mpd->lbh; |
1785 | int err = 0, remain = lbh->b_size; | ||
1786 | sector_t next = lbh->b_blocknr; | 1799 | sector_t next = lbh->b_blocknr; |
1787 | struct buffer_head new; | 1800 | struct buffer_head new; |
1788 | 1801 | ||
@@ -1792,38 +1805,36 @@ static void mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
1792 | if (buffer_mapped(lbh) && !buffer_delay(lbh)) | 1805 | if (buffer_mapped(lbh) && !buffer_delay(lbh)) |
1793 | return; | 1806 | return; |
1794 | 1807 | ||
1795 | while (remain) { | 1808 | new.b_state = lbh->b_state; |
1796 | new.b_state = lbh->b_state; | 1809 | new.b_blocknr = 0; |
1797 | new.b_blocknr = 0; | 1810 | new.b_size = lbh->b_size; |
1798 | new.b_size = remain; | ||
1799 | err = mpd->get_block(mpd->inode, next, &new, 1); | ||
1800 | if (err) { | ||
1801 | /* | ||
1802 | * Rather than implement own error handling | ||
1803 | * here, we just leave remaining blocks | ||
1804 | * unallocated and try again with ->writepage() | ||
1805 | */ | ||
1806 | break; | ||
1807 | } | ||
1808 | BUG_ON(new.b_size == 0); | ||
1809 | 1811 | ||
1810 | if (buffer_new(&new)) | 1812 | /* |
1811 | __unmap_underlying_blocks(mpd->inode, &new); | 1813 | * If we didn't accumulate anything |
1814 | * to write simply return | ||
1815 | */ | ||
1816 | if (!new.b_size) | ||
1817 | return; | ||
1818 | err = mpd->get_block(mpd->inode, next, &new, 1); | ||
1819 | if (err) | ||
1820 | return; | ||
1821 | BUG_ON(new.b_size == 0); | ||
1812 | 1822 | ||
1813 | /* | 1823 | if (buffer_new(&new)) |
1814 | * If blocks are delayed marked, we need to | 1824 | __unmap_underlying_blocks(mpd->inode, &new); |
1815 | * put actual blocknr and drop delayed bit | ||
1816 | */ | ||
1817 | if (buffer_delay(lbh)) | ||
1818 | mpage_put_bnr_to_bhs(mpd, next, &new); | ||
1819 | 1825 | ||
1820 | /* go for the remaining blocks */ | 1826 | /* |
1821 | next += new.b_size >> mpd->inode->i_blkbits; | 1827 | * If blocks are delayed marked, we need to |
1822 | remain -= new.b_size; | 1828 | * put actual blocknr and drop delayed bit |
1823 | } | 1829 | */ |
1830 | if (buffer_delay(lbh) || buffer_unwritten(lbh)) | ||
1831 | mpage_put_bnr_to_bhs(mpd, next, &new); | ||
1832 | |||
1833 | return; | ||
1824 | } | 1834 | } |
1825 | 1835 | ||
1826 | #define BH_FLAGS ((1 << BH_Uptodate) | (1 << BH_Mapped) | (1 << BH_Delay)) | 1836 | #define BH_FLAGS ((1 << BH_Uptodate) | (1 << BH_Mapped) | \ |
1837 | (1 << BH_Delay) | (1 << BH_Unwritten)) | ||
1827 | 1838 | ||
1828 | /* | 1839 | /* |
1829 | * mpage_add_bh_to_extent - try to add one more block to extent of blocks | 1840 | * mpage_add_bh_to_extent - try to add one more block to extent of blocks |
@@ -1837,41 +1848,61 @@ static void mpage_da_map_blocks(struct mpage_da_data *mpd) | |||
1837 | static void mpage_add_bh_to_extent(struct mpage_da_data *mpd, | 1848 | static void mpage_add_bh_to_extent(struct mpage_da_data *mpd, |
1838 | sector_t logical, struct buffer_head *bh) | 1849 | sector_t logical, struct buffer_head *bh) |
1839 | { | 1850 | { |
1840 | struct buffer_head *lbh = &mpd->lbh; | ||
1841 | sector_t next; | 1851 | sector_t next; |
1852 | size_t b_size = bh->b_size; | ||
1853 | struct buffer_head *lbh = &mpd->lbh; | ||
1854 | int nrblocks = lbh->b_size >> mpd->inode->i_blkbits; | ||
1842 | 1855 | ||
1843 | next = lbh->b_blocknr + (lbh->b_size >> mpd->inode->i_blkbits); | 1856 | /* check if thereserved journal credits might overflow */ |
1844 | 1857 | if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL)) { | |
1858 | if (nrblocks >= EXT4_MAX_TRANS_DATA) { | ||
1859 | /* | ||
1860 | * With non-extent format we are limited by the journal | ||
1861 | * credit available. Total credit needed to insert | ||
1862 | * nrblocks contiguous blocks is dependent on the | ||
1863 | * nrblocks. So limit nrblocks. | ||
1864 | */ | ||
1865 | goto flush_it; | ||
1866 | } else if ((nrblocks + (b_size >> mpd->inode->i_blkbits)) > | ||
1867 | EXT4_MAX_TRANS_DATA) { | ||
1868 | /* | ||
1869 | * Adding the new buffer_head would make it cross the | ||
1870 | * allowed limit for which we have journal credit | ||
1871 | * reserved. So limit the new bh->b_size | ||
1872 | */ | ||
1873 | b_size = (EXT4_MAX_TRANS_DATA - nrblocks) << | ||
1874 | mpd->inode->i_blkbits; | ||
1875 | /* we will do mpage_da_submit_io in the next loop */ | ||
1876 | } | ||
1877 | } | ||
1845 | /* | 1878 | /* |
1846 | * First block in the extent | 1879 | * First block in the extent |
1847 | */ | 1880 | */ |
1848 | if (lbh->b_size == 0) { | 1881 | if (lbh->b_size == 0) { |
1849 | lbh->b_blocknr = logical; | 1882 | lbh->b_blocknr = logical; |
1850 | lbh->b_size = bh->b_size; | 1883 | lbh->b_size = b_size; |
1851 | lbh->b_state = bh->b_state & BH_FLAGS; | 1884 | lbh->b_state = bh->b_state & BH_FLAGS; |
1852 | return; | 1885 | return; |
1853 | } | 1886 | } |
1854 | 1887 | ||
1888 | next = lbh->b_blocknr + nrblocks; | ||
1855 | /* | 1889 | /* |
1856 | * Can we merge the block to our big extent? | 1890 | * Can we merge the block to our big extent? |
1857 | */ | 1891 | */ |
1858 | if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) { | 1892 | if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) { |
1859 | lbh->b_size += bh->b_size; | 1893 | lbh->b_size += b_size; |
1860 | return; | 1894 | return; |
1861 | } | 1895 | } |
1862 | 1896 | ||
1897 | flush_it: | ||
1863 | /* | 1898 | /* |
1864 | * We couldn't merge the block to our extent, so we | 1899 | * We couldn't merge the block to our extent, so we |
1865 | * need to flush current extent and start new one | 1900 | * need to flush current extent and start new one |
1866 | */ | 1901 | */ |
1867 | mpage_da_map_blocks(mpd); | 1902 | mpage_da_map_blocks(mpd); |
1868 | 1903 | mpage_da_submit_io(mpd); | |
1869 | /* | 1904 | mpd->io_done = 1; |
1870 | * Now start a new extent | 1905 | return; |
1871 | */ | ||
1872 | lbh->b_size = bh->b_size; | ||
1873 | lbh->b_state = bh->b_state & BH_FLAGS; | ||
1874 | lbh->b_blocknr = logical; | ||
1875 | } | 1906 | } |
1876 | 1907 | ||
1877 | /* | 1908 | /* |
@@ -1891,17 +1922,35 @@ static int __mpage_da_writepage(struct page *page, | |||
1891 | struct buffer_head *bh, *head, fake; | 1922 | struct buffer_head *bh, *head, fake; |
1892 | sector_t logical; | 1923 | sector_t logical; |
1893 | 1924 | ||
1925 | if (mpd->io_done) { | ||
1926 | /* | ||
1927 | * Rest of the page in the page_vec | ||
1928 | * redirty then and skip then. We will | ||
1929 | * try to to write them again after | ||
1930 | * starting a new transaction | ||
1931 | */ | ||
1932 | redirty_page_for_writepage(wbc, page); | ||
1933 | unlock_page(page); | ||
1934 | return MPAGE_DA_EXTENT_TAIL; | ||
1935 | } | ||
1894 | /* | 1936 | /* |
1895 | * Can we merge this page to current extent? | 1937 | * Can we merge this page to current extent? |
1896 | */ | 1938 | */ |
1897 | if (mpd->next_page != page->index) { | 1939 | if (mpd->next_page != page->index) { |
1898 | /* | 1940 | /* |
1899 | * Nope, we can't. So, we map non-allocated blocks | 1941 | * Nope, we can't. So, we map non-allocated blocks |
1900 | * and start IO on them using __mpage_writepage() | 1942 | * and start IO on them using writepage() |
1901 | */ | 1943 | */ |
1902 | if (mpd->next_page != mpd->first_page) { | 1944 | if (mpd->next_page != mpd->first_page) { |
1903 | mpage_da_map_blocks(mpd); | 1945 | mpage_da_map_blocks(mpd); |
1904 | mpage_da_submit_io(mpd); | 1946 | mpage_da_submit_io(mpd); |
1947 | /* | ||
1948 | * skip rest of the page in the page_vec | ||
1949 | */ | ||
1950 | mpd->io_done = 1; | ||
1951 | redirty_page_for_writepage(wbc, page); | ||
1952 | unlock_page(page); | ||
1953 | return MPAGE_DA_EXTENT_TAIL; | ||
1905 | } | 1954 | } |
1906 | 1955 | ||
1907 | /* | 1956 | /* |
@@ -1932,6 +1981,8 @@ static int __mpage_da_writepage(struct page *page, | |||
1932 | set_buffer_dirty(bh); | 1981 | set_buffer_dirty(bh); |
1933 | set_buffer_uptodate(bh); | 1982 | set_buffer_uptodate(bh); |
1934 | mpage_add_bh_to_extent(mpd, logical, bh); | 1983 | mpage_add_bh_to_extent(mpd, logical, bh); |
1984 | if (mpd->io_done) | ||
1985 | return MPAGE_DA_EXTENT_TAIL; | ||
1935 | } else { | 1986 | } else { |
1936 | /* | 1987 | /* |
1937 | * Page with regular buffer heads, just add all dirty ones | 1988 | * Page with regular buffer heads, just add all dirty ones |
@@ -1940,8 +1991,12 @@ static int __mpage_da_writepage(struct page *page, | |||
1940 | bh = head; | 1991 | bh = head; |
1941 | do { | 1992 | do { |
1942 | BUG_ON(buffer_locked(bh)); | 1993 | BUG_ON(buffer_locked(bh)); |
1943 | if (buffer_dirty(bh)) | 1994 | if (buffer_dirty(bh) && |
1995 | (!buffer_mapped(bh) || buffer_delay(bh))) { | ||
1944 | mpage_add_bh_to_extent(mpd, logical, bh); | 1996 | mpage_add_bh_to_extent(mpd, logical, bh); |
1997 | if (mpd->io_done) | ||
1998 | return MPAGE_DA_EXTENT_TAIL; | ||
1999 | } | ||
1945 | logical++; | 2000 | logical++; |
1946 | } while ((bh = bh->b_this_page) != head); | 2001 | } while ((bh = bh->b_this_page) != head); |
1947 | } | 2002 | } |
@@ -1960,22 +2015,13 @@ static int __mpage_da_writepage(struct page *page, | |||
1960 | * | 2015 | * |
1961 | * This is a library function, which implements the writepages() | 2016 | * This is a library function, which implements the writepages() |
1962 | * address_space_operation. | 2017 | * address_space_operation. |
1963 | * | ||
1964 | * In order to avoid duplication of logic that deals with partial pages, | ||
1965 | * multiple bio per page, etc, we find non-allocated blocks, allocate | ||
1966 | * them with minimal calls to ->get_block() and re-use __mpage_writepage() | ||
1967 | * | ||
1968 | * It's important that we call __mpage_writepage() only once for each | ||
1969 | * involved page, otherwise we'd have to implement more complicated logic | ||
1970 | * to deal with pages w/o PG_lock or w/ PG_writeback and so on. | ||
1971 | * | ||
1972 | * See comments to mpage_writepages() | ||
1973 | */ | 2018 | */ |
1974 | static int mpage_da_writepages(struct address_space *mapping, | 2019 | static int mpage_da_writepages(struct address_space *mapping, |
1975 | struct writeback_control *wbc, | 2020 | struct writeback_control *wbc, |
1976 | get_block_t get_block) | 2021 | get_block_t get_block) |
1977 | { | 2022 | { |
1978 | struct mpage_da_data mpd; | 2023 | struct mpage_da_data mpd; |
2024 | long to_write; | ||
1979 | int ret; | 2025 | int ret; |
1980 | 2026 | ||
1981 | if (!get_block) | 2027 | if (!get_block) |
@@ -1989,17 +2035,22 @@ static int mpage_da_writepages(struct address_space *mapping, | |||
1989 | mpd.first_page = 0; | 2035 | mpd.first_page = 0; |
1990 | mpd.next_page = 0; | 2036 | mpd.next_page = 0; |
1991 | mpd.get_block = get_block; | 2037 | mpd.get_block = get_block; |
2038 | mpd.io_done = 0; | ||
2039 | mpd.pages_written = 0; | ||
2040 | |||
2041 | to_write = wbc->nr_to_write; | ||
1992 | 2042 | ||
1993 | ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, &mpd); | 2043 | ret = write_cache_pages(mapping, wbc, __mpage_da_writepage, &mpd); |
1994 | 2044 | ||
1995 | /* | 2045 | /* |
1996 | * Handle last extent of pages | 2046 | * Handle last extent of pages |
1997 | */ | 2047 | */ |
1998 | if (mpd.next_page != mpd.first_page) { | 2048 | if (!mpd.io_done && mpd.next_page != mpd.first_page) { |
1999 | mpage_da_map_blocks(&mpd); | 2049 | mpage_da_map_blocks(&mpd); |
2000 | mpage_da_submit_io(&mpd); | 2050 | mpage_da_submit_io(&mpd); |
2001 | } | 2051 | } |
2002 | 2052 | ||
2053 | wbc->nr_to_write = to_write - mpd.pages_written; | ||
2003 | return ret; | 2054 | return ret; |
2004 | } | 2055 | } |
2005 | 2056 | ||
@@ -2204,63 +2255,95 @@ static int ext4_da_writepage(struct page *page, | |||
2204 | } | 2255 | } |
2205 | 2256 | ||
2206 | /* | 2257 | /* |
2207 | * For now just follow the DIO way to estimate the max credits | 2258 | * This is called via ext4_da_writepages() to |
2208 | * needed to write out EXT4_MAX_WRITEBACK_PAGES. | 2259 | * calulate the total number of credits to reserve to fit |
2209 | * todo: need to calculate the max credits need for | 2260 | * a single extent allocation into a single transaction, |
2210 | * extent based files, currently the DIO credits is based on | 2261 | * ext4_da_writpeages() will loop calling this before |
2211 | * indirect-blocks mapping way. | 2262 | * the block allocation. |
2212 | * | ||
2213 | * Probably should have a generic way to calculate credits | ||
2214 | * for DIO, writepages, and truncate | ||
2215 | */ | 2263 | */ |
2216 | #define EXT4_MAX_WRITEBACK_PAGES DIO_MAX_BLOCKS | 2264 | |
2217 | #define EXT4_MAX_WRITEBACK_CREDITS DIO_CREDITS | 2265 | static int ext4_da_writepages_trans_blocks(struct inode *inode) |
2266 | { | ||
2267 | int max_blocks = EXT4_I(inode)->i_reserved_data_blocks; | ||
2268 | |||
2269 | /* | ||
2270 | * With non-extent format the journal credit needed to | ||
2271 | * insert nrblocks contiguous block is dependent on | ||
2272 | * number of contiguous block. So we will limit | ||
2273 | * number of contiguous block to a sane value | ||
2274 | */ | ||
2275 | if (!(inode->i_flags & EXT4_EXTENTS_FL) && | ||
2276 | (max_blocks > EXT4_MAX_TRANS_DATA)) | ||
2277 | max_blocks = EXT4_MAX_TRANS_DATA; | ||
2278 | |||
2279 | return ext4_chunk_trans_blocks(inode, max_blocks); | ||
2280 | } | ||
2218 | 2281 | ||
2219 | static int ext4_da_writepages(struct address_space *mapping, | 2282 | static int ext4_da_writepages(struct address_space *mapping, |
2220 | struct writeback_control *wbc) | 2283 | struct writeback_control *wbc) |
2221 | { | 2284 | { |
2222 | struct inode *inode = mapping->host; | ||
2223 | handle_t *handle = NULL; | 2285 | handle_t *handle = NULL; |
2224 | int needed_blocks; | ||
2225 | int ret = 0; | ||
2226 | long to_write; | ||
2227 | loff_t range_start = 0; | 2286 | loff_t range_start = 0; |
2287 | struct inode *inode = mapping->host; | ||
2288 | int needed_blocks, ret = 0, nr_to_writebump = 0; | ||
2289 | long to_write, pages_skipped = 0; | ||
2290 | struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb); | ||
2228 | 2291 | ||
2229 | /* | 2292 | /* |
2230 | * No pages to write? This is mainly a kludge to avoid starting | 2293 | * No pages to write? This is mainly a kludge to avoid starting |
2231 | * a transaction for special inodes like journal inode on last iput() | 2294 | * a transaction for special inodes like journal inode on last iput() |
2232 | * because that could violate lock ordering on umount | 2295 | * because that could violate lock ordering on umount |
2233 | */ | 2296 | */ |
2234 | if (!mapping->nrpages) | 2297 | if (!mapping->nrpages || !mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) |
2235 | return 0; | 2298 | return 0; |
2236 | |||
2237 | /* | 2299 | /* |
2238 | * Estimate the worse case needed credits to write out | 2300 | * Make sure nr_to_write is >= sbi->s_mb_stream_request |
2239 | * EXT4_MAX_BUF_BLOCKS pages | 2301 | * This make sure small files blocks are allocated in |
2302 | * single attempt. This ensure that small files | ||
2303 | * get less fragmented. | ||
2240 | */ | 2304 | */ |
2241 | needed_blocks = EXT4_MAX_WRITEBACK_CREDITS; | 2305 | if (wbc->nr_to_write < sbi->s_mb_stream_request) { |
2306 | nr_to_writebump = sbi->s_mb_stream_request - wbc->nr_to_write; | ||
2307 | wbc->nr_to_write = sbi->s_mb_stream_request; | ||
2308 | } | ||
2242 | 2309 | ||
2243 | to_write = wbc->nr_to_write; | 2310 | if (!wbc->range_cyclic) |
2244 | if (!wbc->range_cyclic) { | ||
2245 | /* | 2311 | /* |
2246 | * If range_cyclic is not set force range_cont | 2312 | * If range_cyclic is not set force range_cont |
2247 | * and save the old writeback_index | 2313 | * and save the old writeback_index |
2248 | */ | 2314 | */ |
2249 | wbc->range_cont = 1; | 2315 | wbc->range_cont = 1; |
2250 | range_start = wbc->range_start; | ||
2251 | } | ||
2252 | 2316 | ||
2253 | while (!ret && to_write) { | 2317 | range_start = wbc->range_start; |
2318 | pages_skipped = wbc->pages_skipped; | ||
2319 | |||
2320 | restart_loop: | ||
2321 | to_write = wbc->nr_to_write; | ||
2322 | while (!ret && to_write > 0) { | ||
2323 | |||
2324 | /* | ||
2325 | * we insert one extent at a time. So we need | ||
2326 | * credit needed for single extent allocation. | ||
2327 | * journalled mode is currently not supported | ||
2328 | * by delalloc | ||
2329 | */ | ||
2330 | BUG_ON(ext4_should_journal_data(inode)); | ||
2331 | needed_blocks = ext4_da_writepages_trans_blocks(inode); | ||
2332 | |||
2254 | /* start a new transaction*/ | 2333 | /* start a new transaction*/ |
2255 | handle = ext4_journal_start(inode, needed_blocks); | 2334 | handle = ext4_journal_start(inode, needed_blocks); |
2256 | if (IS_ERR(handle)) { | 2335 | if (IS_ERR(handle)) { |
2257 | ret = PTR_ERR(handle); | 2336 | ret = PTR_ERR(handle); |
2337 | printk(KERN_EMERG "%s: jbd2_start: " | ||
2338 | "%ld pages, ino %lu; err %d\n", __func__, | ||
2339 | wbc->nr_to_write, inode->i_ino, ret); | ||
2340 | dump_stack(); | ||
2258 | goto out_writepages; | 2341 | goto out_writepages; |
2259 | } | 2342 | } |
2260 | if (ext4_should_order_data(inode)) { | 2343 | if (ext4_should_order_data(inode)) { |
2261 | /* | 2344 | /* |
2262 | * With ordered mode we need to add | 2345 | * With ordered mode we need to add |
2263 | * the inode to the journal handle | 2346 | * the inode to the journal handl |
2264 | * when we do block allocation. | 2347 | * when we do block allocation. |
2265 | */ | 2348 | */ |
2266 | ret = ext4_jbd2_file_inode(handle, inode); | 2349 | ret = ext4_jbd2_file_inode(handle, inode); |
@@ -2268,20 +2351,20 @@ static int ext4_da_writepages(struct address_space *mapping, | |||
2268 | ext4_journal_stop(handle); | 2351 | ext4_journal_stop(handle); |
2269 | goto out_writepages; | 2352 | goto out_writepages; |
2270 | } | 2353 | } |
2271 | |||
2272 | } | 2354 | } |
2273 | /* | ||
2274 | * set the max dirty pages could be write at a time | ||
2275 | * to fit into the reserved transaction credits | ||
2276 | */ | ||
2277 | if (wbc->nr_to_write > EXT4_MAX_WRITEBACK_PAGES) | ||
2278 | wbc->nr_to_write = EXT4_MAX_WRITEBACK_PAGES; | ||
2279 | 2355 | ||
2280 | to_write -= wbc->nr_to_write; | 2356 | to_write -= wbc->nr_to_write; |
2281 | ret = mpage_da_writepages(mapping, wbc, | 2357 | ret = mpage_da_writepages(mapping, wbc, |
2282 | ext4_da_get_block_write); | 2358 | ext4_da_get_block_write); |
2283 | ext4_journal_stop(handle); | 2359 | ext4_journal_stop(handle); |
2284 | if (wbc->nr_to_write) { | 2360 | if (ret == MPAGE_DA_EXTENT_TAIL) { |
2361 | /* | ||
2362 | * got one extent now try with | ||
2363 | * rest of the pages | ||
2364 | */ | ||
2365 | to_write += wbc->nr_to_write; | ||
2366 | ret = 0; | ||
2367 | } else if (wbc->nr_to_write) { | ||
2285 | /* | 2368 | /* |
2286 | * There is no more writeout needed | 2369 | * There is no more writeout needed |
2287 | * or we requested for a noblocking writeout | 2370 | * or we requested for a noblocking writeout |
@@ -2293,10 +2376,18 @@ static int ext4_da_writepages(struct address_space *mapping, | |||
2293 | wbc->nr_to_write = to_write; | 2376 | wbc->nr_to_write = to_write; |
2294 | } | 2377 | } |
2295 | 2378 | ||
2296 | out_writepages: | 2379 | if (wbc->range_cont && (pages_skipped != wbc->pages_skipped)) { |
2297 | wbc->nr_to_write = to_write; | 2380 | /* We skipped pages in this loop */ |
2298 | if (range_start) | ||
2299 | wbc->range_start = range_start; | 2381 | wbc->range_start = range_start; |
2382 | wbc->nr_to_write = to_write + | ||
2383 | wbc->pages_skipped - pages_skipped; | ||
2384 | wbc->pages_skipped = pages_skipped; | ||
2385 | goto restart_loop; | ||
2386 | } | ||
2387 | |||
2388 | out_writepages: | ||
2389 | wbc->nr_to_write = to_write - nr_to_writebump; | ||
2390 | wbc->range_start = range_start; | ||
2300 | return ret; | 2391 | return ret; |
2301 | } | 2392 | } |
2302 | 2393 | ||
@@ -3486,6 +3577,9 @@ void ext4_truncate(struct inode *inode) | |||
3486 | * modify the block allocation tree. | 3577 | * modify the block allocation tree. |
3487 | */ | 3578 | */ |
3488 | down_write(&ei->i_data_sem); | 3579 | down_write(&ei->i_data_sem); |
3580 | |||
3581 | ext4_discard_reservation(inode); | ||
3582 | |||
3489 | /* | 3583 | /* |
3490 | * The orphan list entry will now protect us from any crash which | 3584 | * The orphan list entry will now protect us from any crash which |
3491 | * occurs before the truncate completes, so it is now safe to propagate | 3585 | * occurs before the truncate completes, so it is now safe to propagate |
@@ -3555,8 +3649,6 @@ do_indirects: | |||
3555 | ; | 3649 | ; |
3556 | } | 3650 | } |
3557 | 3651 | ||
3558 | ext4_discard_reservation(inode); | ||
3559 | |||
3560 | up_write(&ei->i_data_sem); | 3652 | up_write(&ei->i_data_sem); |
3561 | inode->i_mtime = inode->i_ctime = ext4_current_time(inode); | 3653 | inode->i_mtime = inode->i_ctime = ext4_current_time(inode); |
3562 | ext4_mark_inode_dirty(handle, inode); | 3654 | ext4_mark_inode_dirty(handle, inode); |
@@ -4324,57 +4416,129 @@ int ext4_getattr(struct vfsmount *mnt, struct dentry *dentry, | |||
4324 | return 0; | 4416 | return 0; |
4325 | } | 4417 | } |
4326 | 4418 | ||
4419 | static int ext4_indirect_trans_blocks(struct inode *inode, int nrblocks, | ||
4420 | int chunk) | ||
4421 | { | ||
4422 | int indirects; | ||
4423 | |||
4424 | /* if nrblocks are contiguous */ | ||
4425 | if (chunk) { | ||
4426 | /* | ||
4427 | * With N contiguous data blocks, it need at most | ||
4428 | * N/EXT4_ADDR_PER_BLOCK(inode->i_sb) indirect blocks | ||
4429 | * 2 dindirect blocks | ||
4430 | * 1 tindirect block | ||
4431 | */ | ||
4432 | indirects = nrblocks / EXT4_ADDR_PER_BLOCK(inode->i_sb); | ||
4433 | return indirects + 3; | ||
4434 | } | ||
4435 | /* | ||
4436 | * if nrblocks are not contiguous, worse case, each block touch | ||
4437 | * a indirect block, and each indirect block touch a double indirect | ||
4438 | * block, plus a triple indirect block | ||
4439 | */ | ||
4440 | indirects = nrblocks * 2 + 1; | ||
4441 | return indirects; | ||
4442 | } | ||
4443 | |||
4444 | static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk) | ||
4445 | { | ||
4446 | if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)) | ||
4447 | return ext4_indirect_trans_blocks(inode, nrblocks, 0); | ||
4448 | return ext4_ext_index_trans_blocks(inode, nrblocks, 0); | ||
4449 | } | ||
4327 | /* | 4450 | /* |
4328 | * How many blocks doth make a writepage()? | 4451 | * Account for index blocks, block groups bitmaps and block group |
4329 | * | 4452 | * descriptor blocks if modify datablocks and index blocks |
4330 | * With N blocks per page, it may be: | 4453 | * worse case, the indexs blocks spread over different block groups |
4331 | * N data blocks | ||
4332 | * 2 indirect block | ||
4333 | * 2 dindirect | ||
4334 | * 1 tindirect | ||
4335 | * N+5 bitmap blocks (from the above) | ||
4336 | * N+5 group descriptor summary blocks | ||
4337 | * 1 inode block | ||
4338 | * 1 superblock. | ||
4339 | * 2 * EXT4_SINGLEDATA_TRANS_BLOCKS for the quote files | ||
4340 | * | 4454 | * |
4341 | * 3 * (N + 5) + 2 + 2 * EXT4_SINGLEDATA_TRANS_BLOCKS | 4455 | * If datablocks are discontiguous, they are possible to spread over |
4456 | * different block groups too. If they are contiugous, with flexbg, | ||
4457 | * they could still across block group boundary. | ||
4342 | * | 4458 | * |
4343 | * With ordered or writeback data it's the same, less the N data blocks. | 4459 | * Also account for superblock, inode, quota and xattr blocks |
4460 | */ | ||
4461 | int ext4_meta_trans_blocks(struct inode *inode, int nrblocks, int chunk) | ||
4462 | { | ||
4463 | int groups, gdpblocks; | ||
4464 | int idxblocks; | ||
4465 | int ret = 0; | ||
4466 | |||
4467 | /* | ||
4468 | * How many index blocks need to touch to modify nrblocks? | ||
4469 | * The "Chunk" flag indicating whether the nrblocks is | ||
4470 | * physically contiguous on disk | ||
4471 | * | ||
4472 | * For Direct IO and fallocate, they calls get_block to allocate | ||
4473 | * one single extent at a time, so they could set the "Chunk" flag | ||
4474 | */ | ||
4475 | idxblocks = ext4_index_trans_blocks(inode, nrblocks, chunk); | ||
4476 | |||
4477 | ret = idxblocks; | ||
4478 | |||
4479 | /* | ||
4480 | * Now let's see how many group bitmaps and group descriptors need | ||
4481 | * to account | ||
4482 | */ | ||
4483 | groups = idxblocks; | ||
4484 | if (chunk) | ||
4485 | groups += 1; | ||
4486 | else | ||
4487 | groups += nrblocks; | ||
4488 | |||
4489 | gdpblocks = groups; | ||
4490 | if (groups > EXT4_SB(inode->i_sb)->s_groups_count) | ||
4491 | groups = EXT4_SB(inode->i_sb)->s_groups_count; | ||
4492 | if (groups > EXT4_SB(inode->i_sb)->s_gdb_count) | ||
4493 | gdpblocks = EXT4_SB(inode->i_sb)->s_gdb_count; | ||
4494 | |||
4495 | /* bitmaps and block group descriptor blocks */ | ||
4496 | ret += groups + gdpblocks; | ||
4497 | |||
4498 | /* Blocks for super block, inode, quota and xattr blocks */ | ||
4499 | ret += EXT4_META_TRANS_BLOCKS(inode->i_sb); | ||
4500 | |||
4501 | return ret; | ||
4502 | } | ||
4503 | |||
4504 | /* | ||
4505 | * Calulate the total number of credits to reserve to fit | ||
4506 | * the modification of a single pages into a single transaction, | ||
4507 | * which may include multiple chunks of block allocations. | ||
4344 | * | 4508 | * |
4345 | * If the inode's direct blocks can hold an integral number of pages then a | 4509 | * This could be called via ext4_write_begin() |
4346 | * page cannot straddle two indirect blocks, and we can only touch one indirect | ||
4347 | * and dindirect block, and the "5" above becomes "3". | ||
4348 | * | 4510 | * |
4349 | * This still overestimates under most circumstances. If we were to pass the | 4511 | * We need to consider the worse case, when |
4350 | * start and end offsets in here as well we could do block_to_path() on each | 4512 | * one new block per extent. |
4351 | * block and work out the exact number of indirects which are touched. Pah. | ||
4352 | */ | 4513 | */ |
4353 | |||
4354 | int ext4_writepage_trans_blocks(struct inode *inode) | 4514 | int ext4_writepage_trans_blocks(struct inode *inode) |
4355 | { | 4515 | { |
4356 | int bpp = ext4_journal_blocks_per_page(inode); | 4516 | int bpp = ext4_journal_blocks_per_page(inode); |
4357 | int indirects = (EXT4_NDIR_BLOCKS % bpp) ? 5 : 3; | ||
4358 | int ret; | 4517 | int ret; |
4359 | 4518 | ||
4360 | if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) | 4519 | ret = ext4_meta_trans_blocks(inode, bpp, 0); |
4361 | return ext4_ext_writepage_trans_blocks(inode, bpp); | ||
4362 | 4520 | ||
4521 | /* Account for data blocks for journalled mode */ | ||
4363 | if (ext4_should_journal_data(inode)) | 4522 | if (ext4_should_journal_data(inode)) |
4364 | ret = 3 * (bpp + indirects) + 2; | 4523 | ret += bpp; |
4365 | else | ||
4366 | ret = 2 * (bpp + indirects) + 2; | ||
4367 | |||
4368 | #ifdef CONFIG_QUOTA | ||
4369 | /* We know that structure was already allocated during DQUOT_INIT so | ||
4370 | * we will be updating only the data blocks + inodes */ | ||
4371 | ret += 2*EXT4_QUOTA_TRANS_BLOCKS(inode->i_sb); | ||
4372 | #endif | ||
4373 | |||
4374 | return ret; | 4524 | return ret; |
4375 | } | 4525 | } |
4376 | 4526 | ||
4377 | /* | 4527 | /* |
4528 | * Calculate the journal credits for a chunk of data modification. | ||
4529 | * | ||
4530 | * This is called from DIO, fallocate or whoever calling | ||
4531 | * ext4_get_blocks_wrap() to map/allocate a chunk of contigous disk blocks. | ||
4532 | * | ||
4533 | * journal buffers for data blocks are not included here, as DIO | ||
4534 | * and fallocate do no need to journal data buffers. | ||
4535 | */ | ||
4536 | int ext4_chunk_trans_blocks(struct inode *inode, int nrblocks) | ||
4537 | { | ||
4538 | return ext4_meta_trans_blocks(inode, nrblocks, 1); | ||
4539 | } | ||
4540 | |||
4541 | /* | ||
4378 | * The caller must have previously called ext4_reserve_inode_write(). | 4542 | * The caller must have previously called ext4_reserve_inode_write(). |
4379 | * Give this, we know that the caller already has write access to iloc->bh. | 4543 | * Give this, we know that the caller already has write access to iloc->bh. |
4380 | */ | 4544 | */ |
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 865e9ddb44d4..e0e3a5eb1ddb 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c | |||
@@ -3282,6 +3282,35 @@ static void ext4_mb_use_group_pa(struct ext4_allocation_context *ac, | |||
3282 | } | 3282 | } |
3283 | 3283 | ||
3284 | /* | 3284 | /* |
3285 | * Return the prealloc space that have minimal distance | ||
3286 | * from the goal block. @cpa is the prealloc | ||
3287 | * space that is having currently known minimal distance | ||
3288 | * from the goal block. | ||
3289 | */ | ||
3290 | static struct ext4_prealloc_space * | ||
3291 | ext4_mb_check_group_pa(ext4_fsblk_t goal_block, | ||
3292 | struct ext4_prealloc_space *pa, | ||
3293 | struct ext4_prealloc_space *cpa) | ||
3294 | { | ||
3295 | ext4_fsblk_t cur_distance, new_distance; | ||
3296 | |||
3297 | if (cpa == NULL) { | ||
3298 | atomic_inc(&pa->pa_count); | ||
3299 | return pa; | ||
3300 | } | ||
3301 | cur_distance = abs(goal_block - cpa->pa_pstart); | ||
3302 | new_distance = abs(goal_block - pa->pa_pstart); | ||
3303 | |||
3304 | if (cur_distance < new_distance) | ||
3305 | return cpa; | ||
3306 | |||
3307 | /* drop the previous reference */ | ||
3308 | atomic_dec(&cpa->pa_count); | ||
3309 | atomic_inc(&pa->pa_count); | ||
3310 | return pa; | ||
3311 | } | ||
3312 | |||
3313 | /* | ||
3285 | * search goal blocks in preallocated space | 3314 | * search goal blocks in preallocated space |
3286 | */ | 3315 | */ |
3287 | static noinline_for_stack int | 3316 | static noinline_for_stack int |
@@ -3290,7 +3319,8 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac) | |||
3290 | int order, i; | 3319 | int order, i; |
3291 | struct ext4_inode_info *ei = EXT4_I(ac->ac_inode); | 3320 | struct ext4_inode_info *ei = EXT4_I(ac->ac_inode); |
3292 | struct ext4_locality_group *lg; | 3321 | struct ext4_locality_group *lg; |
3293 | struct ext4_prealloc_space *pa; | 3322 | struct ext4_prealloc_space *pa, *cpa = NULL; |
3323 | ext4_fsblk_t goal_block; | ||
3294 | 3324 | ||
3295 | /* only data can be preallocated */ | 3325 | /* only data can be preallocated */ |
3296 | if (!(ac->ac_flags & EXT4_MB_HINT_DATA)) | 3326 | if (!(ac->ac_flags & EXT4_MB_HINT_DATA)) |
@@ -3333,6 +3363,13 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac) | |||
3333 | /* The max size of hash table is PREALLOC_TB_SIZE */ | 3363 | /* The max size of hash table is PREALLOC_TB_SIZE */ |
3334 | order = PREALLOC_TB_SIZE - 1; | 3364 | order = PREALLOC_TB_SIZE - 1; |
3335 | 3365 | ||
3366 | goal_block = ac->ac_g_ex.fe_group * EXT4_BLOCKS_PER_GROUP(ac->ac_sb) + | ||
3367 | ac->ac_g_ex.fe_start + | ||
3368 | le32_to_cpu(EXT4_SB(ac->ac_sb)->s_es->s_first_data_block); | ||
3369 | /* | ||
3370 | * search for the prealloc space that is having | ||
3371 | * minimal distance from the goal block. | ||
3372 | */ | ||
3336 | for (i = order; i < PREALLOC_TB_SIZE; i++) { | 3373 | for (i = order; i < PREALLOC_TB_SIZE; i++) { |
3337 | rcu_read_lock(); | 3374 | rcu_read_lock(); |
3338 | list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i], | 3375 | list_for_each_entry_rcu(pa, &lg->lg_prealloc_list[i], |
@@ -3340,17 +3377,19 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac) | |||
3340 | spin_lock(&pa->pa_lock); | 3377 | spin_lock(&pa->pa_lock); |
3341 | if (pa->pa_deleted == 0 && | 3378 | if (pa->pa_deleted == 0 && |
3342 | pa->pa_free >= ac->ac_o_ex.fe_len) { | 3379 | pa->pa_free >= ac->ac_o_ex.fe_len) { |
3343 | atomic_inc(&pa->pa_count); | 3380 | |
3344 | ext4_mb_use_group_pa(ac, pa); | 3381 | cpa = ext4_mb_check_group_pa(goal_block, |
3345 | spin_unlock(&pa->pa_lock); | 3382 | pa, cpa); |
3346 | ac->ac_criteria = 20; | ||
3347 | rcu_read_unlock(); | ||
3348 | return 1; | ||
3349 | } | 3383 | } |
3350 | spin_unlock(&pa->pa_lock); | 3384 | spin_unlock(&pa->pa_lock); |
3351 | } | 3385 | } |
3352 | rcu_read_unlock(); | 3386 | rcu_read_unlock(); |
3353 | } | 3387 | } |
3388 | if (cpa) { | ||
3389 | ext4_mb_use_group_pa(ac, cpa); | ||
3390 | ac->ac_criteria = 20; | ||
3391 | return 1; | ||
3392 | } | ||
3354 | return 0; | 3393 | return 0; |
3355 | } | 3394 | } |
3356 | 3395 | ||
diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c index b9e077ba07e9..46fc0b5b12ba 100644 --- a/fs/ext4/migrate.c +++ b/fs/ext4/migrate.c | |||
@@ -53,7 +53,8 @@ static int finish_range(handle_t *handle, struct inode *inode, | |||
53 | * credit. But below we try to not accumalate too much | 53 | * credit. But below we try to not accumalate too much |
54 | * of them by restarting the journal. | 54 | * of them by restarting the journal. |
55 | */ | 55 | */ |
56 | needed = ext4_ext_calc_credits_for_insert(inode, path); | 56 | needed = ext4_ext_calc_credits_for_single_extent(inode, |
57 | lb->last_block - lb->first_block + 1, path); | ||
57 | 58 | ||
58 | /* | 59 | /* |
59 | * Make sure the credit we accumalated is not really high | 60 | * Make sure the credit we accumalated is not really high |
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 0a9265164265..b3d35604ea18 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c | |||
@@ -773,7 +773,8 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input) | |||
773 | 773 | ||
774 | if (reserved_gdb || gdb_off == 0) { | 774 | if (reserved_gdb || gdb_off == 0) { |
775 | if (!EXT4_HAS_COMPAT_FEATURE(sb, | 775 | if (!EXT4_HAS_COMPAT_FEATURE(sb, |
776 | EXT4_FEATURE_COMPAT_RESIZE_INODE)){ | 776 | EXT4_FEATURE_COMPAT_RESIZE_INODE) |
777 | || !le16_to_cpu(es->s_reserved_gdt_blocks)) { | ||
777 | ext4_warning(sb, __func__, | 778 | ext4_warning(sb, __func__, |
778 | "No reserved GDT blocks, can't resize"); | 779 | "No reserved GDT blocks, can't resize"); |
779 | return -EPERM; | 780 | return -EPERM; |
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index d5d77958b861..566344b926b7 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -568,6 +568,7 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
568 | #endif | 568 | #endif |
569 | ei->i_block_alloc_info = NULL; | 569 | ei->i_block_alloc_info = NULL; |
570 | ei->vfs_inode.i_version = 1; | 570 | ei->vfs_inode.i_version = 1; |
571 | ei->vfs_inode.i_data.writeback_index = 0; | ||
571 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); | 572 | memset(&ei->i_cached_extent, 0, sizeof(struct ext4_ext_cache)); |
572 | INIT_LIST_HEAD(&ei->i_prealloc_list); | 573 | INIT_LIST_HEAD(&ei->i_prealloc_list); |
573 | spin_lock_init(&ei->i_prealloc_lock); | 574 | spin_lock_init(&ei->i_prealloc_lock); |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 6d266d793e2c..80ff3381fa21 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -562,26 +562,23 @@ static int fat_write_inode(struct inode *inode, int wait) | |||
562 | struct buffer_head *bh; | 562 | struct buffer_head *bh; |
563 | struct msdos_dir_entry *raw_entry; | 563 | struct msdos_dir_entry *raw_entry; |
564 | loff_t i_pos; | 564 | loff_t i_pos; |
565 | int err = 0; | 565 | int err; |
566 | 566 | ||
567 | retry: | 567 | retry: |
568 | i_pos = MSDOS_I(inode)->i_pos; | 568 | i_pos = MSDOS_I(inode)->i_pos; |
569 | if (inode->i_ino == MSDOS_ROOT_INO || !i_pos) | 569 | if (inode->i_ino == MSDOS_ROOT_INO || !i_pos) |
570 | return 0; | 570 | return 0; |
571 | 571 | ||
572 | lock_super(sb); | ||
573 | bh = sb_bread(sb, i_pos >> sbi->dir_per_block_bits); | 572 | bh = sb_bread(sb, i_pos >> sbi->dir_per_block_bits); |
574 | if (!bh) { | 573 | if (!bh) { |
575 | printk(KERN_ERR "FAT: unable to read inode block " | 574 | printk(KERN_ERR "FAT: unable to read inode block " |
576 | "for updating (i_pos %lld)\n", i_pos); | 575 | "for updating (i_pos %lld)\n", i_pos); |
577 | err = -EIO; | 576 | return -EIO; |
578 | goto out; | ||
579 | } | 577 | } |
580 | spin_lock(&sbi->inode_hash_lock); | 578 | spin_lock(&sbi->inode_hash_lock); |
581 | if (i_pos != MSDOS_I(inode)->i_pos) { | 579 | if (i_pos != MSDOS_I(inode)->i_pos) { |
582 | spin_unlock(&sbi->inode_hash_lock); | 580 | spin_unlock(&sbi->inode_hash_lock); |
583 | brelse(bh); | 581 | brelse(bh); |
584 | unlock_super(sb); | ||
585 | goto retry; | 582 | goto retry; |
586 | } | 583 | } |
587 | 584 | ||
@@ -607,11 +604,10 @@ retry: | |||
607 | } | 604 | } |
608 | spin_unlock(&sbi->inode_hash_lock); | 605 | spin_unlock(&sbi->inode_hash_lock); |
609 | mark_buffer_dirty(bh); | 606 | mark_buffer_dirty(bh); |
607 | err = 0; | ||
610 | if (wait) | 608 | if (wait) |
611 | err = sync_dirty_buffer(bh); | 609 | err = sync_dirty_buffer(bh); |
612 | brelse(bh); | 610 | brelse(bh); |
613 | out: | ||
614 | unlock_super(sb); | ||
615 | return err; | 611 | return err; |
616 | } | 612 | } |
617 | 613 | ||
diff --git a/fs/inode.c b/fs/inode.c index b6726f644530..0487ddba1397 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -166,6 +166,7 @@ static struct inode *alloc_inode(struct super_block *sb) | |||
166 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE); | 166 | mapping_set_gfp_mask(mapping, GFP_HIGHUSER_PAGECACHE); |
167 | mapping->assoc_mapping = NULL; | 167 | mapping->assoc_mapping = NULL; |
168 | mapping->backing_dev_info = &default_backing_dev_info; | 168 | mapping->backing_dev_info = &default_backing_dev_info; |
169 | mapping->writeback_index = 0; | ||
169 | 170 | ||
170 | /* | 171 | /* |
171 | * If the block_device provides a backing_dev_info for client | 172 | * If the block_device provides a backing_dev_info for client |
diff --git a/fs/ioprio.c b/fs/ioprio.c index c4a1c3c65aac..da3cc460d4df 100644 --- a/fs/ioprio.c +++ b/fs/ioprio.c | |||
@@ -115,11 +115,11 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio) | |||
115 | pgrp = task_pgrp(current); | 115 | pgrp = task_pgrp(current); |
116 | else | 116 | else |
117 | pgrp = find_vpid(who); | 117 | pgrp = find_vpid(who); |
118 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 118 | do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { |
119 | ret = set_task_ioprio(p, ioprio); | 119 | ret = set_task_ioprio(p, ioprio); |
120 | if (ret) | 120 | if (ret) |
121 | break; | 121 | break; |
122 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); | 122 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); |
123 | break; | 123 | break; |
124 | case IOPRIO_WHO_USER: | 124 | case IOPRIO_WHO_USER: |
125 | if (!who) | 125 | if (!who) |
@@ -204,7 +204,7 @@ asmlinkage long sys_ioprio_get(int which, int who) | |||
204 | pgrp = task_pgrp(current); | 204 | pgrp = task_pgrp(current); |
205 | else | 205 | else |
206 | pgrp = find_vpid(who); | 206 | pgrp = find_vpid(who); |
207 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 207 | do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { |
208 | tmpio = get_task_ioprio(p); | 208 | tmpio = get_task_ioprio(p); |
209 | if (tmpio < 0) | 209 | if (tmpio < 0) |
210 | continue; | 210 | continue; |
@@ -212,7 +212,7 @@ asmlinkage long sys_ioprio_get(int which, int who) | |||
212 | ret = tmpio; | 212 | ret = tmpio; |
213 | else | 213 | else |
214 | ret = ioprio_best(ret, tmpio); | 214 | ret = ioprio_best(ret, tmpio); |
215 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); | 215 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); |
216 | break; | 216 | break; |
217 | case IOPRIO_WHO_USER: | 217 | case IOPRIO_WHO_USER: |
218 | if (!who) | 218 | if (!who) |
diff --git a/fs/jffs2/jffs2_fs_i.h b/fs/jffs2/jffs2_fs_i.h index 31559f45fdde..4c41db91eaa4 100644 --- a/fs/jffs2/jffs2_fs_i.h +++ b/fs/jffs2/jffs2_fs_i.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #ifndef _JFFS2_FS_I | 12 | #ifndef _JFFS2_FS_I |
13 | #define _JFFS2_FS_I | 13 | #define _JFFS2_FS_I |
14 | 14 | ||
15 | #include <linux/version.h> | ||
16 | #include <linux/rbtree.h> | 15 | #include <linux/rbtree.h> |
17 | #include <linux/posix_acl.h> | 16 | #include <linux/posix_acl.h> |
18 | #include <linux/mutex.h> | 17 | #include <linux/mutex.h> |
diff --git a/fs/omfs/bitmap.c b/fs/omfs/bitmap.c index 697663b01bae..e1c0ec0ae989 100644 --- a/fs/omfs/bitmap.c +++ b/fs/omfs/bitmap.c | |||
@@ -92,7 +92,7 @@ int omfs_allocate_block(struct super_block *sb, u64 block) | |||
92 | struct buffer_head *bh; | 92 | struct buffer_head *bh; |
93 | struct omfs_sb_info *sbi = OMFS_SB(sb); | 93 | struct omfs_sb_info *sbi = OMFS_SB(sb); |
94 | int bits_per_entry = 8 * sb->s_blocksize; | 94 | int bits_per_entry = 8 * sb->s_blocksize; |
95 | int map, bit; | 95 | unsigned int map, bit; |
96 | int ret = 0; | 96 | int ret = 0; |
97 | u64 tmp; | 97 | u64 tmp; |
98 | 98 | ||
@@ -176,7 +176,8 @@ int omfs_clear_range(struct super_block *sb, u64 block, int count) | |||
176 | struct omfs_sb_info *sbi = OMFS_SB(sb); | 176 | struct omfs_sb_info *sbi = OMFS_SB(sb); |
177 | int bits_per_entry = 8 * sb->s_blocksize; | 177 | int bits_per_entry = 8 * sb->s_blocksize; |
178 | u64 tmp; | 178 | u64 tmp; |
179 | int map, bit, ret; | 179 | unsigned int map, bit; |
180 | int ret; | ||
180 | 181 | ||
181 | tmp = block; | 182 | tmp = block; |
182 | bit = do_div(tmp, bits_per_entry); | 183 | bit = do_div(tmp, bits_per_entry); |
diff --git a/fs/omfs/file.c b/fs/omfs/file.c index 7e2499053e4d..834b2331f6b3 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c | |||
@@ -26,6 +26,13 @@ static int omfs_sync_file(struct file *file, struct dentry *dentry, | |||
26 | return err ? -EIO : 0; | 26 | return err ? -EIO : 0; |
27 | } | 27 | } |
28 | 28 | ||
29 | static u32 omfs_max_extents(struct omfs_sb_info *sbi, int offset) | ||
30 | { | ||
31 | return (sbi->s_sys_blocksize - offset - | ||
32 | sizeof(struct omfs_extent)) / | ||
33 | sizeof(struct omfs_extent_entry) + 1; | ||
34 | } | ||
35 | |||
29 | void omfs_make_empty_table(struct buffer_head *bh, int offset) | 36 | void omfs_make_empty_table(struct buffer_head *bh, int offset) |
30 | { | 37 | { |
31 | struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; | 38 | struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; |
@@ -45,6 +52,7 @@ int omfs_shrink_inode(struct inode *inode) | |||
45 | struct buffer_head *bh; | 52 | struct buffer_head *bh; |
46 | u64 next, last; | 53 | u64 next, last; |
47 | u32 extent_count; | 54 | u32 extent_count; |
55 | u32 max_extents; | ||
48 | int ret; | 56 | int ret; |
49 | 57 | ||
50 | /* traverse extent table, freeing each entry that is greater | 58 | /* traverse extent table, freeing each entry that is greater |
@@ -62,15 +70,18 @@ int omfs_shrink_inode(struct inode *inode) | |||
62 | goto out; | 70 | goto out; |
63 | 71 | ||
64 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); | 72 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); |
73 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); | ||
65 | 74 | ||
66 | for (;;) { | 75 | for (;;) { |
67 | 76 | ||
68 | if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) { | 77 | if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) |
69 | brelse(bh); | 78 | goto out_brelse; |
70 | goto out; | ||
71 | } | ||
72 | 79 | ||
73 | extent_count = be32_to_cpu(oe->e_extent_count); | 80 | extent_count = be32_to_cpu(oe->e_extent_count); |
81 | |||
82 | if (extent_count > max_extents) | ||
83 | goto out_brelse; | ||
84 | |||
74 | last = next; | 85 | last = next; |
75 | next = be64_to_cpu(oe->e_next); | 86 | next = be64_to_cpu(oe->e_next); |
76 | entry = &oe->e_entry; | 87 | entry = &oe->e_entry; |
@@ -98,10 +109,14 @@ int omfs_shrink_inode(struct inode *inode) | |||
98 | if (!bh) | 109 | if (!bh) |
99 | goto out; | 110 | goto out; |
100 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 111 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
112 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); | ||
101 | } | 113 | } |
102 | ret = 0; | 114 | ret = 0; |
103 | out: | 115 | out: |
104 | return ret; | 116 | return ret; |
117 | out_brelse: | ||
118 | brelse(bh); | ||
119 | return ret; | ||
105 | } | 120 | } |
106 | 121 | ||
107 | static void omfs_truncate(struct inode *inode) | 122 | static void omfs_truncate(struct inode *inode) |
@@ -154,9 +169,7 @@ static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe, | |||
154 | goto out; | 169 | goto out; |
155 | } | 170 | } |
156 | } | 171 | } |
157 | max_count = (sbi->s_sys_blocksize - OMFS_EXTENT_START - | 172 | max_count = omfs_max_extents(sbi, OMFS_EXTENT_START); |
158 | sizeof(struct omfs_extent)) / | ||
159 | sizeof(struct omfs_extent_entry) + 1; | ||
160 | 173 | ||
161 | /* TODO: add a continuation block here */ | 174 | /* TODO: add a continuation block here */ |
162 | if (be32_to_cpu(oe->e_extent_count) > max_count-1) | 175 | if (be32_to_cpu(oe->e_extent_count) > max_count-1) |
@@ -225,6 +238,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
225 | sector_t next, offset; | 238 | sector_t next, offset; |
226 | int ret; | 239 | int ret; |
227 | u64 new_block; | 240 | u64 new_block; |
241 | u32 max_extents; | ||
228 | int extent_count; | 242 | int extent_count; |
229 | struct omfs_extent *oe; | 243 | struct omfs_extent *oe; |
230 | struct omfs_extent_entry *entry; | 244 | struct omfs_extent_entry *entry; |
@@ -238,6 +252,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
238 | goto out; | 252 | goto out; |
239 | 253 | ||
240 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); | 254 | oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); |
255 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); | ||
241 | next = inode->i_ino; | 256 | next = inode->i_ino; |
242 | 257 | ||
243 | for (;;) { | 258 | for (;;) { |
@@ -249,6 +264,9 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
249 | next = be64_to_cpu(oe->e_next); | 264 | next = be64_to_cpu(oe->e_next); |
250 | entry = &oe->e_entry; | 265 | entry = &oe->e_entry; |
251 | 266 | ||
267 | if (extent_count > max_extents) | ||
268 | goto out_brelse; | ||
269 | |||
252 | offset = find_block(inode, entry, block, extent_count, &remain); | 270 | offset = find_block(inode, entry, block, extent_count, &remain); |
253 | if (offset > 0) { | 271 | if (offset > 0) { |
254 | ret = 0; | 272 | ret = 0; |
@@ -266,6 +284,7 @@ static int omfs_get_block(struct inode *inode, sector_t block, | |||
266 | if (!bh) | 284 | if (!bh) |
267 | goto out; | 285 | goto out; |
268 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); | 286 | oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); |
287 | max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); | ||
269 | } | 288 | } |
270 | if (create) { | 289 | if (create) { |
271 | ret = omfs_grow_extent(inode, oe, &new_block); | 290 | ret = omfs_grow_extent(inode, oe, &new_block); |
diff --git a/fs/omfs/inode.c b/fs/omfs/inode.c index a95fe5984f4b..d29047b1b9b0 100644 --- a/fs/omfs/inode.c +++ b/fs/omfs/inode.c | |||
@@ -232,8 +232,7 @@ struct inode *omfs_iget(struct super_block *sb, ino_t ino) | |||
232 | inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); | 232 | inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); |
233 | inode->i_op = &omfs_dir_inops; | 233 | inode->i_op = &omfs_dir_inops; |
234 | inode->i_fop = &omfs_dir_operations; | 234 | inode->i_fop = &omfs_dir_operations; |
235 | inode->i_size = be32_to_cpu(oi->i_head.h_body_size) + | 235 | inode->i_size = sbi->s_sys_blocksize; |
236 | sizeof(struct omfs_header); | ||
237 | inc_nlink(inode); | 236 | inc_nlink(inode); |
238 | break; | 237 | break; |
239 | case OMFS_FILE: | 238 | case OMFS_FILE: |
diff --git a/fs/proc/nommu.c b/fs/proc/nommu.c index 79ecd281d2cb..3f87d2632947 100644 --- a/fs/proc/nommu.c +++ b/fs/proc/nommu.c | |||
@@ -52,14 +52,14 @@ int nommu_vma_show(struct seq_file *m, struct vm_area_struct *vma) | |||
52 | } | 52 | } |
53 | 53 | ||
54 | seq_printf(m, | 54 | seq_printf(m, |
55 | "%08lx-%08lx %c%c%c%c %08lx %02x:%02x %lu %n", | 55 | "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", |
56 | vma->vm_start, | 56 | vma->vm_start, |
57 | vma->vm_end, | 57 | vma->vm_end, |
58 | flags & VM_READ ? 'r' : '-', | 58 | flags & VM_READ ? 'r' : '-', |
59 | flags & VM_WRITE ? 'w' : '-', | 59 | flags & VM_WRITE ? 'w' : '-', |
60 | flags & VM_EXEC ? 'x' : '-', | 60 | flags & VM_EXEC ? 'x' : '-', |
61 | flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p', | 61 | flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p', |
62 | vma->vm_pgoff << PAGE_SHIFT, | 62 | ((loff_t)vma->vm_pgoff) << PAGE_SHIFT, |
63 | MAJOR(dev), MINOR(dev), ino, &len); | 63 | MAJOR(dev), MINOR(dev), ino, &len); |
64 | 64 | ||
65 | if (file) { | 65 | if (file) { |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 7546a918f790..73d1891ee625 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -219,14 +219,14 @@ static int show_map(struct seq_file *m, void *v) | |||
219 | ino = inode->i_ino; | 219 | ino = inode->i_ino; |
220 | } | 220 | } |
221 | 221 | ||
222 | seq_printf(m, "%08lx-%08lx %c%c%c%c %08lx %02x:%02x %lu %n", | 222 | seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", |
223 | vma->vm_start, | 223 | vma->vm_start, |
224 | vma->vm_end, | 224 | vma->vm_end, |
225 | flags & VM_READ ? 'r' : '-', | 225 | flags & VM_READ ? 'r' : '-', |
226 | flags & VM_WRITE ? 'w' : '-', | 226 | flags & VM_WRITE ? 'w' : '-', |
227 | flags & VM_EXEC ? 'x' : '-', | 227 | flags & VM_EXEC ? 'x' : '-', |
228 | flags & VM_MAYSHARE ? 's' : 'p', | 228 | flags & VM_MAYSHARE ? 's' : 'p', |
229 | vma->vm_pgoff << PAGE_SHIFT, | 229 | ((loff_t)vma->vm_pgoff) << PAGE_SHIFT, |
230 | MAJOR(dev), MINOR(dev), ino, &len); | 230 | MAJOR(dev), MINOR(dev), ino, &len); |
231 | 231 | ||
232 | /* | 232 | /* |
diff --git a/fs/ubifs/budget.c b/fs/ubifs/budget.c index d81fb9ed2b8e..154098157473 100644 --- a/fs/ubifs/budget.c +++ b/fs/ubifs/budget.c | |||
@@ -263,8 +263,8 @@ int ubifs_calc_min_idx_lebs(struct ubifs_info *c) | |||
263 | 263 | ||
264 | idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx; | 264 | idx_size = c->old_idx_sz + c->budg_idx_growth + c->budg_uncommitted_idx; |
265 | 265 | ||
266 | /* And make sure we have twice the index size of space reserved */ | 266 | /* And make sure we have thrice the index size of space reserved */ |
267 | idx_size <<= 1; | 267 | idx_size = idx_size + (idx_size << 1); |
268 | 268 | ||
269 | /* | 269 | /* |
270 | * We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes' | 270 | * We do not maintain 'old_idx_size' as 'old_idx_lebs'/'old_idx_bytes' |
@@ -388,11 +388,11 @@ static int can_use_rp(struct ubifs_info *c) | |||
388 | * This function makes sure UBIFS has enough free eraseblocks for index growth | 388 | * This function makes sure UBIFS has enough free eraseblocks for index growth |
389 | * and data. | 389 | * and data. |
390 | * | 390 | * |
391 | * When budgeting index space, UBIFS reserves twice as more LEBs as the index | 391 | * When budgeting index space, UBIFS reserves thrice as many LEBs as the index |
392 | * would take if it was consolidated and written to the flash. This guarantees | 392 | * would take if it was consolidated and written to the flash. This guarantees |
393 | * that the "in-the-gaps" commit method always succeeds and UBIFS will always | 393 | * that the "in-the-gaps" commit method always succeeds and UBIFS will always |
394 | * be able to commit dirty index. So this function basically adds amount of | 394 | * be able to commit dirty index. So this function basically adds amount of |
395 | * budgeted index space to the size of the current index, multiplies this by 2, | 395 | * budgeted index space to the size of the current index, multiplies this by 3, |
396 | * and makes sure this does not exceed the amount of free eraseblocks. | 396 | * and makes sure this does not exceed the amount of free eraseblocks. |
397 | * | 397 | * |
398 | * Notes about @c->min_idx_lebs and @c->lst.idx_lebs variables: | 398 | * Notes about @c->min_idx_lebs and @c->lst.idx_lebs variables: |
@@ -543,8 +543,16 @@ int ubifs_budget_space(struct ubifs_info *c, struct ubifs_budget_req *req) | |||
543 | int err, idx_growth, data_growth, dd_growth; | 543 | int err, idx_growth, data_growth, dd_growth; |
544 | struct retries_info ri; | 544 | struct retries_info ri; |
545 | 545 | ||
546 | ubifs_assert(req->new_page <= 1); | ||
547 | ubifs_assert(req->dirtied_page <= 1); | ||
548 | ubifs_assert(req->new_dent <= 1); | ||
549 | ubifs_assert(req->mod_dent <= 1); | ||
550 | ubifs_assert(req->new_ino <= 1); | ||
551 | ubifs_assert(req->new_ino_d <= UBIFS_MAX_INO_DATA); | ||
546 | ubifs_assert(req->dirtied_ino <= 4); | 552 | ubifs_assert(req->dirtied_ino <= 4); |
547 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); | 553 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); |
554 | ubifs_assert(!(req->new_ino_d & 7)); | ||
555 | ubifs_assert(!(req->dirtied_ino_d & 7)); | ||
548 | 556 | ||
549 | data_growth = calc_data_growth(c, req); | 557 | data_growth = calc_data_growth(c, req); |
550 | dd_growth = calc_dd_growth(c, req); | 558 | dd_growth = calc_dd_growth(c, req); |
@@ -618,8 +626,16 @@ again: | |||
618 | */ | 626 | */ |
619 | void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req) | 627 | void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req) |
620 | { | 628 | { |
629 | ubifs_assert(req->new_page <= 1); | ||
630 | ubifs_assert(req->dirtied_page <= 1); | ||
631 | ubifs_assert(req->new_dent <= 1); | ||
632 | ubifs_assert(req->mod_dent <= 1); | ||
633 | ubifs_assert(req->new_ino <= 1); | ||
634 | ubifs_assert(req->new_ino_d <= UBIFS_MAX_INO_DATA); | ||
621 | ubifs_assert(req->dirtied_ino <= 4); | 635 | ubifs_assert(req->dirtied_ino <= 4); |
622 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); | 636 | ubifs_assert(req->dirtied_ino_d <= UBIFS_MAX_INO_DATA * 4); |
637 | ubifs_assert(!(req->new_ino_d & 7)); | ||
638 | ubifs_assert(!(req->dirtied_ino_d & 7)); | ||
623 | if (!req->recalculate) { | 639 | if (!req->recalculate) { |
624 | ubifs_assert(req->idx_growth >= 0); | 640 | ubifs_assert(req->idx_growth >= 0); |
625 | ubifs_assert(req->data_growth >= 0); | 641 | ubifs_assert(req->data_growth >= 0); |
@@ -647,7 +663,11 @@ void ubifs_release_budget(struct ubifs_info *c, struct ubifs_budget_req *req) | |||
647 | 663 | ||
648 | ubifs_assert(c->budg_idx_growth >= 0); | 664 | ubifs_assert(c->budg_idx_growth >= 0); |
649 | ubifs_assert(c->budg_data_growth >= 0); | 665 | ubifs_assert(c->budg_data_growth >= 0); |
666 | ubifs_assert(c->budg_dd_growth >= 0); | ||
650 | ubifs_assert(c->min_idx_lebs < c->main_lebs); | 667 | ubifs_assert(c->min_idx_lebs < c->main_lebs); |
668 | ubifs_assert(!(c->budg_idx_growth & 7)); | ||
669 | ubifs_assert(!(c->budg_data_growth & 7)); | ||
670 | ubifs_assert(!(c->budg_dd_growth & 7)); | ||
651 | spin_unlock(&c->space_lock); | 671 | spin_unlock(&c->space_lock); |
652 | } | 672 | } |
653 | 673 | ||
@@ -686,9 +706,10 @@ void ubifs_convert_page_budget(struct ubifs_info *c) | |||
686 | void ubifs_release_dirty_inode_budget(struct ubifs_info *c, | 706 | void ubifs_release_dirty_inode_budget(struct ubifs_info *c, |
687 | struct ubifs_inode *ui) | 707 | struct ubifs_inode *ui) |
688 | { | 708 | { |
689 | struct ubifs_budget_req req = {.dd_growth = c->inode_budget, | 709 | struct ubifs_budget_req req; |
690 | .dirtied_ino_d = ui->data_len}; | ||
691 | 710 | ||
711 | memset(&req, 0, sizeof(struct ubifs_budget_req)); | ||
712 | req.dd_growth = c->inode_budget + ALIGN(ui->data_len, 8); | ||
692 | ubifs_release_budget(c, &req); | 713 | ubifs_release_budget(c, &req); |
693 | } | 714 | } |
694 | 715 | ||
diff --git a/fs/ubifs/commit.c b/fs/ubifs/commit.c index 3b516316c9b3..0a6aa2cc78f0 100644 --- a/fs/ubifs/commit.c +++ b/fs/ubifs/commit.c | |||
@@ -74,6 +74,7 @@ static int do_commit(struct ubifs_info *c) | |||
74 | goto out_up; | 74 | goto out_up; |
75 | } | 75 | } |
76 | 76 | ||
77 | c->cmt_no += 1; | ||
77 | err = ubifs_gc_start_commit(c); | 78 | err = ubifs_gc_start_commit(c); |
78 | if (err) | 79 | if (err) |
79 | goto out_up; | 80 | goto out_up; |
@@ -115,7 +116,7 @@ static int do_commit(struct ubifs_info *c) | |||
115 | goto out; | 116 | goto out; |
116 | 117 | ||
117 | mutex_lock(&c->mst_mutex); | 118 | mutex_lock(&c->mst_mutex); |
118 | c->mst_node->cmt_no = cpu_to_le64(++c->cmt_no); | 119 | c->mst_node->cmt_no = cpu_to_le64(c->cmt_no); |
119 | c->mst_node->log_lnum = cpu_to_le32(new_ltail_lnum); | 120 | c->mst_node->log_lnum = cpu_to_le32(new_ltail_lnum); |
120 | c->mst_node->root_lnum = cpu_to_le32(zroot.lnum); | 121 | c->mst_node->root_lnum = cpu_to_le32(zroot.lnum); |
121 | c->mst_node->root_offs = cpu_to_le32(zroot.offs); | 122 | c->mst_node->root_offs = cpu_to_le32(zroot.offs); |
diff --git a/fs/ubifs/debug.c b/fs/ubifs/debug.c index 4e3aaeba4eca..b9cb77473758 100644 --- a/fs/ubifs/debug.c +++ b/fs/ubifs/debug.c | |||
@@ -568,8 +568,8 @@ void dbg_dump_budget_req(const struct ubifs_budget_req *req) | |||
568 | void dbg_dump_lstats(const struct ubifs_lp_stats *lst) | 568 | void dbg_dump_lstats(const struct ubifs_lp_stats *lst) |
569 | { | 569 | { |
570 | spin_lock(&dbg_lock); | 570 | spin_lock(&dbg_lock); |
571 | printk(KERN_DEBUG "Lprops statistics: empty_lebs %d, idx_lebs %d\n", | 571 | printk(KERN_DEBUG "(pid %d) Lprops statistics: empty_lebs %d, " |
572 | lst->empty_lebs, lst->idx_lebs); | 572 | "idx_lebs %d\n", current->pid, lst->empty_lebs, lst->idx_lebs); |
573 | printk(KERN_DEBUG "\ttaken_empty_lebs %d, total_free %lld, " | 573 | printk(KERN_DEBUG "\ttaken_empty_lebs %d, total_free %lld, " |
574 | "total_dirty %lld\n", lst->taken_empty_lebs, lst->total_free, | 574 | "total_dirty %lld\n", lst->taken_empty_lebs, lst->total_free, |
575 | lst->total_dirty); | 575 | lst->total_dirty); |
@@ -587,8 +587,8 @@ void dbg_dump_budg(struct ubifs_info *c) | |||
587 | struct ubifs_gced_idx_leb *idx_gc; | 587 | struct ubifs_gced_idx_leb *idx_gc; |
588 | 588 | ||
589 | spin_lock(&dbg_lock); | 589 | spin_lock(&dbg_lock); |
590 | printk(KERN_DEBUG "Budgeting info: budg_data_growth %lld, " | 590 | printk(KERN_DEBUG "(pid %d) Budgeting info: budg_data_growth %lld, " |
591 | "budg_dd_growth %lld, budg_idx_growth %lld\n", | 591 | "budg_dd_growth %lld, budg_idx_growth %lld\n", current->pid, |
592 | c->budg_data_growth, c->budg_dd_growth, c->budg_idx_growth); | 592 | c->budg_data_growth, c->budg_dd_growth, c->budg_idx_growth); |
593 | printk(KERN_DEBUG "\tdata budget sum %lld, total budget sum %lld, " | 593 | printk(KERN_DEBUG "\tdata budget sum %lld, total budget sum %lld, " |
594 | "freeable_cnt %d\n", c->budg_data_growth + c->budg_dd_growth, | 594 | "freeable_cnt %d\n", c->budg_data_growth + c->budg_dd_growth, |
@@ -634,7 +634,7 @@ void dbg_dump_lprops(struct ubifs_info *c) | |||
634 | struct ubifs_lprops lp; | 634 | struct ubifs_lprops lp; |
635 | struct ubifs_lp_stats lst; | 635 | struct ubifs_lp_stats lst; |
636 | 636 | ||
637 | printk(KERN_DEBUG "Dumping LEB properties\n"); | 637 | printk(KERN_DEBUG "(pid %d) Dumping LEB properties\n", current->pid); |
638 | ubifs_get_lp_stats(c, &lst); | 638 | ubifs_get_lp_stats(c, &lst); |
639 | dbg_dump_lstats(&lst); | 639 | dbg_dump_lstats(&lst); |
640 | 640 | ||
@@ -655,7 +655,7 @@ void dbg_dump_leb(const struct ubifs_info *c, int lnum) | |||
655 | if (dbg_failure_mode) | 655 | if (dbg_failure_mode) |
656 | return; | 656 | return; |
657 | 657 | ||
658 | printk(KERN_DEBUG "Dumping LEB %d\n", lnum); | 658 | printk(KERN_DEBUG "(pid %d) Dumping LEB %d\n", current->pid, lnum); |
659 | 659 | ||
660 | sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); | 660 | sleb = ubifs_scan(c, lnum, 0, c->dbg_buf); |
661 | if (IS_ERR(sleb)) { | 661 | if (IS_ERR(sleb)) { |
@@ -720,8 +720,8 @@ void dbg_dump_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat) | |||
720 | { | 720 | { |
721 | int i; | 721 | int i; |
722 | 722 | ||
723 | printk(KERN_DEBUG "Dumping heap cat %d (%d elements)\n", | 723 | printk(KERN_DEBUG "(pid %d) Dumping heap cat %d (%d elements)\n", |
724 | cat, heap->cnt); | 724 | current->pid, cat, heap->cnt); |
725 | for (i = 0; i < heap->cnt; i++) { | 725 | for (i = 0; i < heap->cnt; i++) { |
726 | struct ubifs_lprops *lprops = heap->arr[i]; | 726 | struct ubifs_lprops *lprops = heap->arr[i]; |
727 | 727 | ||
@@ -736,7 +736,7 @@ void dbg_dump_pnode(struct ubifs_info *c, struct ubifs_pnode *pnode, | |||
736 | { | 736 | { |
737 | int i; | 737 | int i; |
738 | 738 | ||
739 | printk(KERN_DEBUG "Dumping pnode:\n"); | 739 | printk(KERN_DEBUG "(pid %d) Dumping pnode:\n", current->pid); |
740 | printk(KERN_DEBUG "\taddress %zx parent %zx cnext %zx\n", | 740 | printk(KERN_DEBUG "\taddress %zx parent %zx cnext %zx\n", |
741 | (size_t)pnode, (size_t)parent, (size_t)pnode->cnext); | 741 | (size_t)pnode, (size_t)parent, (size_t)pnode->cnext); |
742 | printk(KERN_DEBUG "\tflags %lu iip %d level %d num %d\n", | 742 | printk(KERN_DEBUG "\tflags %lu iip %d level %d num %d\n", |
@@ -755,7 +755,7 @@ void dbg_dump_tnc(struct ubifs_info *c) | |||
755 | int level; | 755 | int level; |
756 | 756 | ||
757 | printk(KERN_DEBUG "\n"); | 757 | printk(KERN_DEBUG "\n"); |
758 | printk(KERN_DEBUG "Dumping the TNC tree\n"); | 758 | printk(KERN_DEBUG "(pid %d) Dumping the TNC tree\n", current->pid); |
759 | znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); | 759 | znode = ubifs_tnc_levelorder_next(c->zroot.znode, NULL); |
760 | level = znode->level; | 760 | level = znode->level; |
761 | printk(KERN_DEBUG "== Level %d ==\n", level); | 761 | printk(KERN_DEBUG "== Level %d ==\n", level); |
@@ -2208,16 +2208,17 @@ int dbg_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset, | |||
2208 | int dbg_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf, | 2208 | int dbg_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf, |
2209 | int offset, int len, int dtype) | 2209 | int offset, int len, int dtype) |
2210 | { | 2210 | { |
2211 | int err; | 2211 | int err, failing; |
2212 | 2212 | ||
2213 | if (in_failure_mode(desc)) | 2213 | if (in_failure_mode(desc)) |
2214 | return -EIO; | 2214 | return -EIO; |
2215 | if (do_fail(desc, lnum, 1)) | 2215 | failing = do_fail(desc, lnum, 1); |
2216 | if (failing) | ||
2216 | cut_data(buf, len); | 2217 | cut_data(buf, len); |
2217 | err = ubi_leb_write(desc, lnum, buf, offset, len, dtype); | 2218 | err = ubi_leb_write(desc, lnum, buf, offset, len, dtype); |
2218 | if (err) | 2219 | if (err) |
2219 | return err; | 2220 | return err; |
2220 | if (in_failure_mode(desc)) | 2221 | if (failing) |
2221 | return -EIO; | 2222 | return -EIO; |
2222 | return 0; | 2223 | return 0; |
2223 | } | 2224 | } |
diff --git a/fs/ubifs/debug.h b/fs/ubifs/debug.h index 3c4f1e93c9e0..50315fc57185 100644 --- a/fs/ubifs/debug.h +++ b/fs/ubifs/debug.h | |||
@@ -27,7 +27,7 @@ | |||
27 | 27 | ||
28 | #define UBIFS_DBG(op) op | 28 | #define UBIFS_DBG(op) op |
29 | 29 | ||
30 | #define ubifs_assert(expr) do { \ | 30 | #define ubifs_assert(expr) do { \ |
31 | if (unlikely(!(expr))) { \ | 31 | if (unlikely(!(expr))) { \ |
32 | printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \ | 32 | printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \ |
33 | __func__, __LINE__, current->pid); \ | 33 | __func__, __LINE__, current->pid); \ |
@@ -73,50 +73,50 @@ const char *dbg_key_str1(const struct ubifs_info *c, | |||
73 | const union ubifs_key *key); | 73 | const union ubifs_key *key); |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * DBGKEY macros require dbg_lock to be held, which it is in the dbg message | 76 | * DBGKEY macros require @dbg_lock to be held, which it is in the dbg message |
77 | * macros. | 77 | * macros. |
78 | */ | 78 | */ |
79 | #define DBGKEY(key) dbg_key_str0(c, (key)) | 79 | #define DBGKEY(key) dbg_key_str0(c, (key)) |
80 | #define DBGKEY1(key) dbg_key_str1(c, (key)) | 80 | #define DBGKEY1(key) dbg_key_str1(c, (key)) |
81 | 81 | ||
82 | /* General messages */ | 82 | /* General messages */ |
83 | #define dbg_gen(fmt, ...) dbg_do_msg(UBIFS_MSG_GEN, fmt, ##__VA_ARGS__) | 83 | #define dbg_gen(fmt, ...) dbg_do_msg(UBIFS_MSG_GEN, fmt, ##__VA_ARGS__) |
84 | 84 | ||
85 | /* Additional journal messages */ | 85 | /* Additional journal messages */ |
86 | #define dbg_jnl(fmt, ...) dbg_do_msg(UBIFS_MSG_JNL, fmt, ##__VA_ARGS__) | 86 | #define dbg_jnl(fmt, ...) dbg_do_msg(UBIFS_MSG_JNL, fmt, ##__VA_ARGS__) |
87 | 87 | ||
88 | /* Additional TNC messages */ | 88 | /* Additional TNC messages */ |
89 | #define dbg_tnc(fmt, ...) dbg_do_msg(UBIFS_MSG_TNC, fmt, ##__VA_ARGS__) | 89 | #define dbg_tnc(fmt, ...) dbg_do_msg(UBIFS_MSG_TNC, fmt, ##__VA_ARGS__) |
90 | 90 | ||
91 | /* Additional lprops messages */ | 91 | /* Additional lprops messages */ |
92 | #define dbg_lp(fmt, ...) dbg_do_msg(UBIFS_MSG_LP, fmt, ##__VA_ARGS__) | 92 | #define dbg_lp(fmt, ...) dbg_do_msg(UBIFS_MSG_LP, fmt, ##__VA_ARGS__) |
93 | 93 | ||
94 | /* Additional LEB find messages */ | 94 | /* Additional LEB find messages */ |
95 | #define dbg_find(fmt, ...) dbg_do_msg(UBIFS_MSG_FIND, fmt, ##__VA_ARGS__) | 95 | #define dbg_find(fmt, ...) dbg_do_msg(UBIFS_MSG_FIND, fmt, ##__VA_ARGS__) |
96 | 96 | ||
97 | /* Additional mount messages */ | 97 | /* Additional mount messages */ |
98 | #define dbg_mnt(fmt, ...) dbg_do_msg(UBIFS_MSG_MNT, fmt, ##__VA_ARGS__) | 98 | #define dbg_mnt(fmt, ...) dbg_do_msg(UBIFS_MSG_MNT, fmt, ##__VA_ARGS__) |
99 | 99 | ||
100 | /* Additional I/O messages */ | 100 | /* Additional I/O messages */ |
101 | #define dbg_io(fmt, ...) dbg_do_msg(UBIFS_MSG_IO, fmt, ##__VA_ARGS__) | 101 | #define dbg_io(fmt, ...) dbg_do_msg(UBIFS_MSG_IO, fmt, ##__VA_ARGS__) |
102 | 102 | ||
103 | /* Additional commit messages */ | 103 | /* Additional commit messages */ |
104 | #define dbg_cmt(fmt, ...) dbg_do_msg(UBIFS_MSG_CMT, fmt, ##__VA_ARGS__) | 104 | #define dbg_cmt(fmt, ...) dbg_do_msg(UBIFS_MSG_CMT, fmt, ##__VA_ARGS__) |
105 | 105 | ||
106 | /* Additional budgeting messages */ | 106 | /* Additional budgeting messages */ |
107 | #define dbg_budg(fmt, ...) dbg_do_msg(UBIFS_MSG_BUDG, fmt, ##__VA_ARGS__) | 107 | #define dbg_budg(fmt, ...) dbg_do_msg(UBIFS_MSG_BUDG, fmt, ##__VA_ARGS__) |
108 | 108 | ||
109 | /* Additional log messages */ | 109 | /* Additional log messages */ |
110 | #define dbg_log(fmt, ...) dbg_do_msg(UBIFS_MSG_LOG, fmt, ##__VA_ARGS__) | 110 | #define dbg_log(fmt, ...) dbg_do_msg(UBIFS_MSG_LOG, fmt, ##__VA_ARGS__) |
111 | 111 | ||
112 | /* Additional gc messages */ | 112 | /* Additional gc messages */ |
113 | #define dbg_gc(fmt, ...) dbg_do_msg(UBIFS_MSG_GC, fmt, ##__VA_ARGS__) | 113 | #define dbg_gc(fmt, ...) dbg_do_msg(UBIFS_MSG_GC, fmt, ##__VA_ARGS__) |
114 | 114 | ||
115 | /* Additional scan messages */ | 115 | /* Additional scan messages */ |
116 | #define dbg_scan(fmt, ...) dbg_do_msg(UBIFS_MSG_SCAN, fmt, ##__VA_ARGS__) | 116 | #define dbg_scan(fmt, ...) dbg_do_msg(UBIFS_MSG_SCAN, fmt, ##__VA_ARGS__) |
117 | 117 | ||
118 | /* Additional recovery messages */ | 118 | /* Additional recovery messages */ |
119 | #define dbg_rcvry(fmt, ...) dbg_do_msg(UBIFS_MSG_RCVRY, fmt, ##__VA_ARGS__) | 119 | #define dbg_rcvry(fmt, ...) dbg_do_msg(UBIFS_MSG_RCVRY, fmt, ##__VA_ARGS__) |
120 | 120 | ||
121 | /* | 121 | /* |
122 | * Debugging message type flags (must match msg_type_names in debug.c). | 122 | * Debugging message type flags (must match msg_type_names in debug.c). |
@@ -239,34 +239,23 @@ typedef int (*dbg_leaf_callback)(struct ubifs_info *c, | |||
239 | struct ubifs_zbranch *zbr, void *priv); | 239 | struct ubifs_zbranch *zbr, void *priv); |
240 | typedef int (*dbg_znode_callback)(struct ubifs_info *c, | 240 | typedef int (*dbg_znode_callback)(struct ubifs_info *c, |
241 | struct ubifs_znode *znode, void *priv); | 241 | struct ubifs_znode *znode, void *priv); |
242 | |||
243 | int dbg_walk_index(struct ubifs_info *c, dbg_leaf_callback leaf_cb, | 242 | int dbg_walk_index(struct ubifs_info *c, dbg_leaf_callback leaf_cb, |
244 | dbg_znode_callback znode_cb, void *priv); | 243 | dbg_znode_callback znode_cb, void *priv); |
245 | 244 | ||
246 | /* Checking functions */ | 245 | /* Checking functions */ |
247 | 246 | ||
248 | int dbg_check_lprops(struct ubifs_info *c); | 247 | int dbg_check_lprops(struct ubifs_info *c); |
249 | |||
250 | int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot); | 248 | int dbg_old_index_check_init(struct ubifs_info *c, struct ubifs_zbranch *zroot); |
251 | int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot); | 249 | int dbg_check_old_index(struct ubifs_info *c, struct ubifs_zbranch *zroot); |
252 | |||
253 | int dbg_check_cats(struct ubifs_info *c); | 250 | int dbg_check_cats(struct ubifs_info *c); |
254 | |||
255 | int dbg_check_ltab(struct ubifs_info *c); | 251 | int dbg_check_ltab(struct ubifs_info *c); |
256 | |||
257 | int dbg_check_synced_i_size(struct inode *inode); | 252 | int dbg_check_synced_i_size(struct inode *inode); |
258 | |||
259 | int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir); | 253 | int dbg_check_dir_size(struct ubifs_info *c, const struct inode *dir); |
260 | |||
261 | int dbg_check_tnc(struct ubifs_info *c, int extra); | 254 | int dbg_check_tnc(struct ubifs_info *c, int extra); |
262 | |||
263 | int dbg_check_idx_size(struct ubifs_info *c, long long idx_size); | 255 | int dbg_check_idx_size(struct ubifs_info *c, long long idx_size); |
264 | |||
265 | int dbg_check_filesystem(struct ubifs_info *c); | 256 | int dbg_check_filesystem(struct ubifs_info *c); |
266 | |||
267 | void dbg_check_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat, | 257 | void dbg_check_heap(struct ubifs_info *c, struct ubifs_lpt_heap *heap, int cat, |
268 | int add_pos); | 258 | int add_pos); |
269 | |||
270 | int dbg_check_lprops(struct ubifs_info *c); | 259 | int dbg_check_lprops(struct ubifs_info *c); |
271 | int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode, | 260 | int dbg_check_lpt_nodes(struct ubifs_info *c, struct ubifs_cnode *cnode, |
272 | int row, int col); | 261 | int row, int col); |
@@ -329,71 +318,77 @@ static inline int dbg_change(struct ubi_volume_desc *desc, int lnum, | |||
329 | #else /* !CONFIG_UBIFS_FS_DEBUG */ | 318 | #else /* !CONFIG_UBIFS_FS_DEBUG */ |
330 | 319 | ||
331 | #define UBIFS_DBG(op) | 320 | #define UBIFS_DBG(op) |
332 | #define ubifs_assert(expr) ({}) | 321 | |
333 | #define ubifs_assert_cmt_locked(c) | 322 | /* Use "if (0)" to make compiler check arguments even if debugging is off */ |
323 | #define ubifs_assert(expr) do { \ | ||
324 | if (0 && (expr)) \ | ||
325 | printk(KERN_CRIT "UBIFS assert failed in %s at %u (pid %d)\n", \ | ||
326 | __func__, __LINE__, current->pid); \ | ||
327 | } while (0) | ||
328 | |||
329 | #define dbg_err(fmt, ...) do { \ | ||
330 | if (0) \ | ||
331 | ubifs_err(fmt, ##__VA_ARGS__); \ | ||
332 | } while (0) | ||
333 | |||
334 | #define dbg_msg(fmt, ...) do { \ | ||
335 | if (0) \ | ||
336 | printk(KERN_DEBUG "UBIFS DBG (pid %d): %s: " fmt "\n", \ | ||
337 | current->pid, __func__, ##__VA_ARGS__); \ | ||
338 | } while (0) | ||
339 | |||
334 | #define dbg_dump_stack() | 340 | #define dbg_dump_stack() |
335 | #define dbg_err(fmt, ...) ({}) | 341 | #define ubifs_assert_cmt_locked(c) |
336 | #define dbg_msg(fmt, ...) ({}) | ||
337 | #define dbg_key(c, key, fmt, ...) ({}) | ||
338 | |||
339 | #define dbg_gen(fmt, ...) ({}) | ||
340 | #define dbg_jnl(fmt, ...) ({}) | ||
341 | #define dbg_tnc(fmt, ...) ({}) | ||
342 | #define dbg_lp(fmt, ...) ({}) | ||
343 | #define dbg_find(fmt, ...) ({}) | ||
344 | #define dbg_mnt(fmt, ...) ({}) | ||
345 | #define dbg_io(fmt, ...) ({}) | ||
346 | #define dbg_cmt(fmt, ...) ({}) | ||
347 | #define dbg_budg(fmt, ...) ({}) | ||
348 | #define dbg_log(fmt, ...) ({}) | ||
349 | #define dbg_gc(fmt, ...) ({}) | ||
350 | #define dbg_scan(fmt, ...) ({}) | ||
351 | #define dbg_rcvry(fmt, ...) ({}) | ||
352 | |||
353 | #define dbg_ntype(type) "" | ||
354 | #define dbg_cstate(cmt_state) "" | ||
355 | #define dbg_get_key_dump(c, key) ({}) | ||
356 | #define dbg_dump_inode(c, inode) ({}) | ||
357 | #define dbg_dump_node(c, node) ({}) | ||
358 | #define dbg_dump_budget_req(req) ({}) | ||
359 | #define dbg_dump_lstats(lst) ({}) | ||
360 | #define dbg_dump_budg(c) ({}) | ||
361 | #define dbg_dump_lprop(c, lp) ({}) | ||
362 | #define dbg_dump_lprops(c) ({}) | ||
363 | #define dbg_dump_leb(c, lnum) ({}) | ||
364 | #define dbg_dump_znode(c, znode) ({}) | ||
365 | #define dbg_dump_heap(c, heap, cat) ({}) | ||
366 | #define dbg_dump_pnode(c, pnode, parent, iip) ({}) | ||
367 | #define dbg_dump_tnc(c) ({}) | ||
368 | #define dbg_dump_index(c) ({}) | ||
369 | 342 | ||
370 | #define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0 | 343 | #define dbg_gen(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) |
344 | #define dbg_jnl(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
345 | #define dbg_tnc(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
346 | #define dbg_lp(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
347 | #define dbg_find(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
348 | #define dbg_mnt(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
349 | #define dbg_io(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
350 | #define dbg_cmt(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
351 | #define dbg_budg(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
352 | #define dbg_log(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
353 | #define dbg_gc(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
354 | #define dbg_scan(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
355 | #define dbg_rcvry(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) | ||
356 | |||
357 | #define DBGKEY(key) ((char *)(key)) | ||
358 | #define DBGKEY1(key) ((char *)(key)) | ||
359 | |||
360 | #define dbg_ntype(type) "" | ||
361 | #define dbg_cstate(cmt_state) "" | ||
362 | #define dbg_get_key_dump(c, key) ({}) | ||
363 | #define dbg_dump_inode(c, inode) ({}) | ||
364 | #define dbg_dump_node(c, node) ({}) | ||
365 | #define dbg_dump_budget_req(req) ({}) | ||
366 | #define dbg_dump_lstats(lst) ({}) | ||
367 | #define dbg_dump_budg(c) ({}) | ||
368 | #define dbg_dump_lprop(c, lp) ({}) | ||
369 | #define dbg_dump_lprops(c) ({}) | ||
370 | #define dbg_dump_leb(c, lnum) ({}) | ||
371 | #define dbg_dump_znode(c, znode) ({}) | ||
372 | #define dbg_dump_heap(c, heap, cat) ({}) | ||
373 | #define dbg_dump_pnode(c, pnode, parent, iip) ({}) | ||
374 | #define dbg_dump_tnc(c) ({}) | ||
375 | #define dbg_dump_index(c) ({}) | ||
371 | 376 | ||
377 | #define dbg_walk_index(c, leaf_cb, znode_cb, priv) 0 | ||
372 | #define dbg_old_index_check_init(c, zroot) 0 | 378 | #define dbg_old_index_check_init(c, zroot) 0 |
373 | #define dbg_check_old_index(c, zroot) 0 | 379 | #define dbg_check_old_index(c, zroot) 0 |
374 | |||
375 | #define dbg_check_cats(c) 0 | 380 | #define dbg_check_cats(c) 0 |
376 | |||
377 | #define dbg_check_ltab(c) 0 | 381 | #define dbg_check_ltab(c) 0 |
378 | |||
379 | #define dbg_check_synced_i_size(inode) 0 | 382 | #define dbg_check_synced_i_size(inode) 0 |
380 | |||
381 | #define dbg_check_dir_size(c, dir) 0 | 383 | #define dbg_check_dir_size(c, dir) 0 |
382 | |||
383 | #define dbg_check_tnc(c, x) 0 | 384 | #define dbg_check_tnc(c, x) 0 |
384 | |||
385 | #define dbg_check_idx_size(c, idx_size) 0 | 385 | #define dbg_check_idx_size(c, idx_size) 0 |
386 | |||
387 | #define dbg_check_filesystem(c) 0 | 386 | #define dbg_check_filesystem(c) 0 |
388 | |||
389 | #define dbg_check_heap(c, heap, cat, add_pos) ({}) | 387 | #define dbg_check_heap(c, heap, cat, add_pos) ({}) |
390 | |||
391 | #define dbg_check_lprops(c) 0 | 388 | #define dbg_check_lprops(c) 0 |
392 | #define dbg_check_lpt_nodes(c, cnode, row, col) 0 | 389 | #define dbg_check_lpt_nodes(c, cnode, row, col) 0 |
393 | |||
394 | #define dbg_force_in_the_gaps_enabled 0 | 390 | #define dbg_force_in_the_gaps_enabled 0 |
395 | #define dbg_force_in_the_gaps() 0 | 391 | #define dbg_force_in_the_gaps() 0 |
396 | |||
397 | #define dbg_failure_mode 0 | 392 | #define dbg_failure_mode 0 |
398 | #define dbg_failure_mode_registration(c) ({}) | 393 | #define dbg_failure_mode_registration(c) ({}) |
399 | #define dbg_failure_mode_deregistration(c) ({}) | 394 | #define dbg_failure_mode_deregistration(c) ({}) |
diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c index e90374be7d3b..5c96f1fb7016 100644 --- a/fs/ubifs/dir.c +++ b/fs/ubifs/dir.c | |||
@@ -165,7 +165,6 @@ struct inode *ubifs_new_inode(struct ubifs_info *c, const struct inode *dir, | |||
165 | } | 165 | } |
166 | 166 | ||
167 | inode->i_ino = ++c->highest_inum; | 167 | inode->i_ino = ++c->highest_inum; |
168 | inode->i_generation = ++c->vfs_gen; | ||
169 | /* | 168 | /* |
170 | * The creation sequence number remains with this inode for its | 169 | * The creation sequence number remains with this inode for its |
171 | * lifetime. All nodes for this inode have a greater sequence number, | 170 | * lifetime. All nodes for this inode have a greater sequence number, |
@@ -220,15 +219,7 @@ static struct dentry *ubifs_lookup(struct inode *dir, struct dentry *dentry, | |||
220 | 219 | ||
221 | err = ubifs_tnc_lookup_nm(c, &key, dent, &dentry->d_name); | 220 | err = ubifs_tnc_lookup_nm(c, &key, dent, &dentry->d_name); |
222 | if (err) { | 221 | if (err) { |
223 | /* | 222 | if (err == -ENOENT) { |
224 | * Do not hash the direntry if parent 'i_nlink' is zero, because | ||
225 | * this has side-effects - '->delete_inode()' call will not be | ||
226 | * called for the parent orphan inode, because 'd_count' of its | ||
227 | * direntry will stay 1 (it'll be negative direntry I guess) | ||
228 | * and prevent 'iput_final()' until the dentry is destroyed due | ||
229 | * to unmount or memory pressure. | ||
230 | */ | ||
231 | if (err == -ENOENT && dir->i_nlink != 0) { | ||
232 | dbg_gen("not found"); | 223 | dbg_gen("not found"); |
233 | goto done; | 224 | goto done; |
234 | } | 225 | } |
@@ -525,7 +516,7 @@ static int ubifs_link(struct dentry *old_dentry, struct inode *dir, | |||
525 | struct ubifs_inode *dir_ui = ubifs_inode(dir); | 516 | struct ubifs_inode *dir_ui = ubifs_inode(dir); |
526 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 517 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
527 | struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2, | 518 | struct ubifs_budget_req req = { .new_dent = 1, .dirtied_ino = 2, |
528 | .dirtied_ino_d = ui->data_len }; | 519 | .dirtied_ino_d = ALIGN(ui->data_len, 8) }; |
529 | 520 | ||
530 | /* | 521 | /* |
531 | * Budget request settings: new direntry, changing the target inode, | 522 | * Budget request settings: new direntry, changing the target inode, |
@@ -727,8 +718,7 @@ static int ubifs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
727 | struct ubifs_inode *dir_ui = ubifs_inode(dir); | 718 | struct ubifs_inode *dir_ui = ubifs_inode(dir); |
728 | struct ubifs_info *c = dir->i_sb->s_fs_info; | 719 | struct ubifs_info *c = dir->i_sb->s_fs_info; |
729 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 720 | int err, sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
730 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 721 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1 }; |
731 | .dirtied_ino_d = 1 }; | ||
732 | 722 | ||
733 | /* | 723 | /* |
734 | * Budget request settings: new inode, new direntry and changing parent | 724 | * Budget request settings: new inode, new direntry and changing parent |
@@ -789,7 +779,8 @@ static int ubifs_mknod(struct inode *dir, struct dentry *dentry, | |||
789 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 779 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
790 | int err, devlen = 0; | 780 | int err, devlen = 0; |
791 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 781 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, |
792 | .new_ino_d = devlen, .dirtied_ino = 1 }; | 782 | .new_ino_d = ALIGN(devlen, 8), |
783 | .dirtied_ino = 1 }; | ||
793 | 784 | ||
794 | /* | 785 | /* |
795 | * Budget request settings: new inode, new direntry and changing parent | 786 | * Budget request settings: new inode, new direntry and changing parent |
@@ -863,7 +854,8 @@ static int ubifs_symlink(struct inode *dir, struct dentry *dentry, | |||
863 | int err, len = strlen(symname); | 854 | int err, len = strlen(symname); |
864 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); | 855 | int sz_change = CALC_DENT_SIZE(dentry->d_name.len); |
865 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 856 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, |
866 | .new_ino_d = len, .dirtied_ino = 1 }; | 857 | .new_ino_d = ALIGN(len, 8), |
858 | .dirtied_ino = 1 }; | ||
867 | 859 | ||
868 | /* | 860 | /* |
869 | * Budget request settings: new inode, new direntry and changing parent | 861 | * Budget request settings: new inode, new direntry and changing parent |
@@ -1012,7 +1004,7 @@ static int ubifs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
1012 | struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1, | 1004 | struct ubifs_budget_req req = { .new_dent = 1, .mod_dent = 1, |
1013 | .dirtied_ino = 3 }; | 1005 | .dirtied_ino = 3 }; |
1014 | struct ubifs_budget_req ino_req = { .dirtied_ino = 1, | 1006 | struct ubifs_budget_req ino_req = { .dirtied_ino = 1, |
1015 | .dirtied_ino_d = old_inode_ui->data_len }; | 1007 | .dirtied_ino_d = ALIGN(old_inode_ui->data_len, 8) }; |
1016 | struct timespec time; | 1008 | struct timespec time; |
1017 | 1009 | ||
1018 | /* | 1010 | /* |
diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 8565e586e533..4071d1cae29f 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c | |||
@@ -890,7 +890,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode, | |||
890 | loff_t new_size = attr->ia_size; | 890 | loff_t new_size = attr->ia_size; |
891 | struct ubifs_inode *ui = ubifs_inode(inode); | 891 | struct ubifs_inode *ui = ubifs_inode(inode); |
892 | struct ubifs_budget_req req = { .dirtied_ino = 1, | 892 | struct ubifs_budget_req req = { .dirtied_ino = 1, |
893 | .dirtied_ino_d = ui->data_len }; | 893 | .dirtied_ino_d = ALIGN(ui->data_len, 8) }; |
894 | 894 | ||
895 | err = ubifs_budget_space(c, &req); | 895 | err = ubifs_budget_space(c, &req); |
896 | if (err) | 896 | if (err) |
@@ -941,7 +941,8 @@ int ubifs_setattr(struct dentry *dentry, struct iattr *attr) | |||
941 | struct inode *inode = dentry->d_inode; | 941 | struct inode *inode = dentry->d_inode; |
942 | struct ubifs_info *c = inode->i_sb->s_fs_info; | 942 | struct ubifs_info *c = inode->i_sb->s_fs_info; |
943 | 943 | ||
944 | dbg_gen("ino %lu, ia_valid %#x", inode->i_ino, attr->ia_valid); | 944 | dbg_gen("ino %lu, mode %#x, ia_valid %#x", |
945 | inode->i_ino, inode->i_mode, attr->ia_valid); | ||
945 | err = inode_change_ok(inode, attr); | 946 | err = inode_change_ok(inode, attr); |
946 | if (err) | 947 | if (err) |
947 | return err; | 948 | return err; |
@@ -1051,7 +1052,7 @@ static int update_mctime(struct ubifs_info *c, struct inode *inode) | |||
1051 | if (mctime_update_needed(inode, &now)) { | 1052 | if (mctime_update_needed(inode, &now)) { |
1052 | int err, release; | 1053 | int err, release; |
1053 | struct ubifs_budget_req req = { .dirtied_ino = 1, | 1054 | struct ubifs_budget_req req = { .dirtied_ino = 1, |
1054 | .dirtied_ino_d = ui->data_len }; | 1055 | .dirtied_ino_d = ALIGN(ui->data_len, 8) }; |
1055 | 1056 | ||
1056 | err = ubifs_budget_space(c, &req); | 1057 | err = ubifs_budget_space(c, &req); |
1057 | if (err) | 1058 | if (err) |
@@ -1270,6 +1271,7 @@ struct file_operations ubifs_file_operations = { | |||
1270 | .fsync = ubifs_fsync, | 1271 | .fsync = ubifs_fsync, |
1271 | .unlocked_ioctl = ubifs_ioctl, | 1272 | .unlocked_ioctl = ubifs_ioctl, |
1272 | .splice_read = generic_file_splice_read, | 1273 | .splice_read = generic_file_splice_read, |
1274 | .splice_write = generic_file_splice_write, | ||
1273 | #ifdef CONFIG_COMPAT | 1275 | #ifdef CONFIG_COMPAT |
1274 | .compat_ioctl = ubifs_compat_ioctl, | 1276 | .compat_ioctl = ubifs_compat_ioctl, |
1275 | #endif | 1277 | #endif |
diff --git a/fs/ubifs/find.c b/fs/ubifs/find.c index 10394c548367..adee7b5ddeab 100644 --- a/fs/ubifs/find.c +++ b/fs/ubifs/find.c | |||
@@ -290,9 +290,14 @@ int ubifs_find_dirty_leb(struct ubifs_info *c, struct ubifs_lprops *ret_lp, | |||
290 | idx_lp = idx_heap->arr[0]; | 290 | idx_lp = idx_heap->arr[0]; |
291 | sum = idx_lp->free + idx_lp->dirty; | 291 | sum = idx_lp->free + idx_lp->dirty; |
292 | /* | 292 | /* |
293 | * Since we reserve twice as more space for the index than it | 293 | * Since we reserve thrice as much space for the index than it |
294 | * actually takes, it does not make sense to pick indexing LEBs | 294 | * actually takes, it does not make sense to pick indexing LEBs |
295 | * with less than half LEB of dirty space. | 295 | * with less than, say, half LEB of dirty space. May be half is |
296 | * not the optimal boundary - this should be tested and | ||
297 | * checked. This boundary should determine how much we use | ||
298 | * in-the-gaps to consolidate the index comparing to how much | ||
299 | * we use garbage collector to consolidate it. The "half" | ||
300 | * criteria just feels to be fine. | ||
296 | */ | 301 | */ |
297 | if (sum < min_space || sum < c->half_leb_size) | 302 | if (sum < min_space || sum < c->half_leb_size) |
298 | idx_lp = NULL; | 303 | idx_lp = NULL; |
diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c index 3374f91b6709..054363f2b207 100644 --- a/fs/ubifs/io.c +++ b/fs/ubifs/io.c | |||
@@ -54,6 +54,20 @@ | |||
54 | #include "ubifs.h" | 54 | #include "ubifs.h" |
55 | 55 | ||
56 | /** | 56 | /** |
57 | * ubifs_ro_mode - switch UBIFS to read read-only mode. | ||
58 | * @c: UBIFS file-system description object | ||
59 | * @err: error code which is the reason of switching to R/O mode | ||
60 | */ | ||
61 | void ubifs_ro_mode(struct ubifs_info *c, int err) | ||
62 | { | ||
63 | if (!c->ro_media) { | ||
64 | c->ro_media = 1; | ||
65 | ubifs_warn("switched to read-only mode, error %d", err); | ||
66 | dbg_dump_stack(); | ||
67 | } | ||
68 | } | ||
69 | |||
70 | /** | ||
57 | * ubifs_check_node - check node. | 71 | * ubifs_check_node - check node. |
58 | * @c: UBIFS file-system description object | 72 | * @c: UBIFS file-system description object |
59 | * @buf: node to check | 73 | * @buf: node to check |
diff --git a/fs/ubifs/journal.c b/fs/ubifs/journal.c index 283155abe5f5..22993f867d19 100644 --- a/fs/ubifs/journal.c +++ b/fs/ubifs/journal.c | |||
@@ -447,13 +447,11 @@ static int get_dent_type(int mode) | |||
447 | * @ino: buffer in which to pack inode node | 447 | * @ino: buffer in which to pack inode node |
448 | * @inode: inode to pack | 448 | * @inode: inode to pack |
449 | * @last: indicates the last node of the group | 449 | * @last: indicates the last node of the group |
450 | * @last_reference: non-zero if this is a deletion inode | ||
451 | */ | 450 | */ |
452 | static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino, | 451 | static void pack_inode(struct ubifs_info *c, struct ubifs_ino_node *ino, |
453 | const struct inode *inode, int last, | 452 | const struct inode *inode, int last) |
454 | int last_reference) | ||
455 | { | 453 | { |
456 | int data_len = 0; | 454 | int data_len = 0, last_reference = !inode->i_nlink; |
457 | struct ubifs_inode *ui = ubifs_inode(inode); | 455 | struct ubifs_inode *ui = ubifs_inode(inode); |
458 | 456 | ||
459 | ino->ch.node_type = UBIFS_INO_NODE; | 457 | ino->ch.node_type = UBIFS_INO_NODE; |
@@ -596,9 +594,9 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, | |||
596 | ubifs_prep_grp_node(c, dent, dlen, 0); | 594 | ubifs_prep_grp_node(c, dent, dlen, 0); |
597 | 595 | ||
598 | ino = (void *)dent + aligned_dlen; | 596 | ino = (void *)dent + aligned_dlen; |
599 | pack_inode(c, ino, inode, 0, last_reference); | 597 | pack_inode(c, ino, inode, 0); |
600 | ino = (void *)ino + aligned_ilen; | 598 | ino = (void *)ino + aligned_ilen; |
601 | pack_inode(c, ino, dir, 1, 0); | 599 | pack_inode(c, ino, dir, 1); |
602 | 600 | ||
603 | if (last_reference) { | 601 | if (last_reference) { |
604 | err = ubifs_add_orphan(c, inode->i_ino); | 602 | err = ubifs_add_orphan(c, inode->i_ino); |
@@ -606,6 +604,7 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, | |||
606 | release_head(c, BASEHD); | 604 | release_head(c, BASEHD); |
607 | goto out_finish; | 605 | goto out_finish; |
608 | } | 606 | } |
607 | ui->del_cmtno = c->cmt_no; | ||
609 | } | 608 | } |
610 | 609 | ||
611 | err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync); | 610 | err = write_head(c, BASEHD, dent, len, &lnum, &dent_offs, sync); |
@@ -750,30 +749,25 @@ out_free: | |||
750 | * ubifs_jnl_write_inode - flush inode to the journal. | 749 | * ubifs_jnl_write_inode - flush inode to the journal. |
751 | * @c: UBIFS file-system description object | 750 | * @c: UBIFS file-system description object |
752 | * @inode: inode to flush | 751 | * @inode: inode to flush |
753 | * @deletion: inode has been deleted | ||
754 | * | 752 | * |
755 | * This function writes inode @inode to the journal. If the inode is | 753 | * This function writes inode @inode to the journal. If the inode is |
756 | * synchronous, it also synchronizes the write-buffer. Returns zero in case of | 754 | * synchronous, it also synchronizes the write-buffer. Returns zero in case of |
757 | * success and a negative error code in case of failure. | 755 | * success and a negative error code in case of failure. |
758 | */ | 756 | */ |
759 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | 757 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode) |
760 | int deletion) | ||
761 | { | 758 | { |
762 | int err, len, lnum, offs, sync = 0; | 759 | int err, lnum, offs; |
763 | struct ubifs_ino_node *ino; | 760 | struct ubifs_ino_node *ino; |
764 | struct ubifs_inode *ui = ubifs_inode(inode); | 761 | struct ubifs_inode *ui = ubifs_inode(inode); |
762 | int sync = 0, len = UBIFS_INO_NODE_SZ, last_reference = !inode->i_nlink; | ||
765 | 763 | ||
766 | dbg_jnl("ino %lu%s", inode->i_ino, | 764 | dbg_jnl("ino %lu, nlink %u", inode->i_ino, inode->i_nlink); |
767 | deletion ? " (last reference)" : ""); | ||
768 | if (deletion) | ||
769 | ubifs_assert(inode->i_nlink == 0); | ||
770 | 765 | ||
771 | len = UBIFS_INO_NODE_SZ; | ||
772 | /* | 766 | /* |
773 | * If the inode is being deleted, do not write the attached data. No | 767 | * If the inode is being deleted, do not write the attached data. No |
774 | * need to synchronize the write-buffer either. | 768 | * need to synchronize the write-buffer either. |
775 | */ | 769 | */ |
776 | if (!deletion) { | 770 | if (!last_reference) { |
777 | len += ui->data_len; | 771 | len += ui->data_len; |
778 | sync = IS_SYNC(inode); | 772 | sync = IS_SYNC(inode); |
779 | } | 773 | } |
@@ -786,7 +780,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | |||
786 | if (err) | 780 | if (err) |
787 | goto out_free; | 781 | goto out_free; |
788 | 782 | ||
789 | pack_inode(c, ino, inode, 1, deletion); | 783 | pack_inode(c, ino, inode, 1); |
790 | err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync); | 784 | err = write_head(c, BASEHD, ino, len, &lnum, &offs, sync); |
791 | if (err) | 785 | if (err) |
792 | goto out_release; | 786 | goto out_release; |
@@ -795,7 +789,7 @@ int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | |||
795 | inode->i_ino); | 789 | inode->i_ino); |
796 | release_head(c, BASEHD); | 790 | release_head(c, BASEHD); |
797 | 791 | ||
798 | if (deletion) { | 792 | if (last_reference) { |
799 | err = ubifs_tnc_remove_ino(c, inode->i_ino); | 793 | err = ubifs_tnc_remove_ino(c, inode->i_ino); |
800 | if (err) | 794 | if (err) |
801 | goto out_ro; | 795 | goto out_ro; |
@@ -828,6 +822,65 @@ out_free: | |||
828 | } | 822 | } |
829 | 823 | ||
830 | /** | 824 | /** |
825 | * ubifs_jnl_delete_inode - delete an inode. | ||
826 | * @c: UBIFS file-system description object | ||
827 | * @inode: inode to delete | ||
828 | * | ||
829 | * This function deletes inode @inode which includes removing it from orphans, | ||
830 | * deleting it from TNC and, in some cases, writing a deletion inode to the | ||
831 | * journal. | ||
832 | * | ||
833 | * When regular file inodes are unlinked or a directory inode is removed, the | ||
834 | * 'ubifs_jnl_update()' function writes a corresponding deletion inode and | ||
835 | * direntry to the media, and adds the inode to orphans. After this, when the | ||
836 | * last reference to this inode has been dropped, this function is called. In | ||
837 | * general, it has to write one more deletion inode to the media, because if | ||
838 | * a commit happened between 'ubifs_jnl_update()' and | ||
839 | * 'ubifs_jnl_delete_inode()', the deletion inode is not in the journal | ||
840 | * anymore, and in fact it might not be on the flash anymore, because it might | ||
841 | * have been garbage-collected already. And for optimization reasons UBIFS does | ||
842 | * not read the orphan area if it has been unmounted cleanly, so it would have | ||
843 | * no indication in the journal that there is a deleted inode which has to be | ||
844 | * removed from TNC. | ||
845 | * | ||
846 | * However, if there was no commit between 'ubifs_jnl_update()' and | ||
847 | * 'ubifs_jnl_delete_inode()', then there is no need to write the deletion | ||
848 | * inode to the media for the second time. And this is quite a typical case. | ||
849 | * | ||
850 | * This function returns zero in case of success and a negative error code in | ||
851 | * case of failure. | ||
852 | */ | ||
853 | int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode) | ||
854 | { | ||
855 | int err; | ||
856 | struct ubifs_inode *ui = ubifs_inode(inode); | ||
857 | |||
858 | ubifs_assert(inode->i_nlink == 0); | ||
859 | |||
860 | if (ui->del_cmtno != c->cmt_no) | ||
861 | /* A commit happened for sure */ | ||
862 | return ubifs_jnl_write_inode(c, inode); | ||
863 | |||
864 | down_read(&c->commit_sem); | ||
865 | /* | ||
866 | * Check commit number again, because the first test has been done | ||
867 | * without @c->commit_sem, so a commit might have happened. | ||
868 | */ | ||
869 | if (ui->del_cmtno != c->cmt_no) { | ||
870 | up_read(&c->commit_sem); | ||
871 | return ubifs_jnl_write_inode(c, inode); | ||
872 | } | ||
873 | |||
874 | err = ubifs_tnc_remove_ino(c, inode->i_ino); | ||
875 | if (err) | ||
876 | ubifs_ro_mode(c, err); | ||
877 | else | ||
878 | ubifs_delete_orphan(c, inode->i_ino); | ||
879 | up_read(&c->commit_sem); | ||
880 | return err; | ||
881 | } | ||
882 | |||
883 | /** | ||
831 | * ubifs_jnl_rename - rename a directory entry. | 884 | * ubifs_jnl_rename - rename a directory entry. |
832 | * @c: UBIFS file-system description object | 885 | * @c: UBIFS file-system description object |
833 | * @old_dir: parent inode of directory entry to rename | 886 | * @old_dir: parent inode of directory entry to rename |
@@ -917,16 +970,16 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, | |||
917 | 970 | ||
918 | p = (void *)dent2 + aligned_dlen2; | 971 | p = (void *)dent2 + aligned_dlen2; |
919 | if (new_inode) { | 972 | if (new_inode) { |
920 | pack_inode(c, p, new_inode, 0, last_reference); | 973 | pack_inode(c, p, new_inode, 0); |
921 | p += ALIGN(ilen, 8); | 974 | p += ALIGN(ilen, 8); |
922 | } | 975 | } |
923 | 976 | ||
924 | if (!move) | 977 | if (!move) |
925 | pack_inode(c, p, old_dir, 1, 0); | 978 | pack_inode(c, p, old_dir, 1); |
926 | else { | 979 | else { |
927 | pack_inode(c, p, old_dir, 0, 0); | 980 | pack_inode(c, p, old_dir, 0); |
928 | p += ALIGN(plen, 8); | 981 | p += ALIGN(plen, 8); |
929 | pack_inode(c, p, new_dir, 1, 0); | 982 | pack_inode(c, p, new_dir, 1); |
930 | } | 983 | } |
931 | 984 | ||
932 | if (last_reference) { | 985 | if (last_reference) { |
@@ -935,6 +988,7 @@ int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, | |||
935 | release_head(c, BASEHD); | 988 | release_head(c, BASEHD); |
936 | goto out_finish; | 989 | goto out_finish; |
937 | } | 990 | } |
991 | new_ui->del_cmtno = c->cmt_no; | ||
938 | } | 992 | } |
939 | 993 | ||
940 | err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync); | 994 | err = write_head(c, BASEHD, dent, len, &lnum, &offs, sync); |
@@ -1131,7 +1185,7 @@ int ubifs_jnl_truncate(struct ubifs_info *c, const struct inode *inode, | |||
1131 | if (err) | 1185 | if (err) |
1132 | goto out_free; | 1186 | goto out_free; |
1133 | 1187 | ||
1134 | pack_inode(c, ino, inode, 0, 0); | 1188 | pack_inode(c, ino, inode, 0); |
1135 | ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1); | 1189 | ubifs_prep_grp_node(c, trun, UBIFS_TRUN_NODE_SZ, dlen ? 0 : 1); |
1136 | if (dlen) | 1190 | if (dlen) |
1137 | ubifs_prep_grp_node(c, dn, dlen, 1); | 1191 | ubifs_prep_grp_node(c, dn, dlen, 1); |
@@ -1251,9 +1305,9 @@ int ubifs_jnl_delete_xattr(struct ubifs_info *c, const struct inode *host, | |||
1251 | ubifs_prep_grp_node(c, xent, xlen, 0); | 1305 | ubifs_prep_grp_node(c, xent, xlen, 0); |
1252 | 1306 | ||
1253 | ino = (void *)xent + aligned_xlen; | 1307 | ino = (void *)xent + aligned_xlen; |
1254 | pack_inode(c, ino, inode, 0, 1); | 1308 | pack_inode(c, ino, inode, 0); |
1255 | ino = (void *)ino + UBIFS_INO_NODE_SZ; | 1309 | ino = (void *)ino + UBIFS_INO_NODE_SZ; |
1256 | pack_inode(c, ino, host, 1, 0); | 1310 | pack_inode(c, ino, host, 1); |
1257 | 1311 | ||
1258 | err = write_head(c, BASEHD, xent, len, &lnum, &xent_offs, sync); | 1312 | err = write_head(c, BASEHD, xent, len, &lnum, &xent_offs, sync); |
1259 | if (!sync && !err) | 1313 | if (!sync && !err) |
@@ -1320,7 +1374,7 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode, | |||
1320 | const struct inode *host) | 1374 | const struct inode *host) |
1321 | { | 1375 | { |
1322 | int err, len1, len2, aligned_len, aligned_len1, lnum, offs; | 1376 | int err, len1, len2, aligned_len, aligned_len1, lnum, offs; |
1323 | struct ubifs_inode *host_ui = ubifs_inode(inode); | 1377 | struct ubifs_inode *host_ui = ubifs_inode(host); |
1324 | struct ubifs_ino_node *ino; | 1378 | struct ubifs_ino_node *ino; |
1325 | union ubifs_key key; | 1379 | union ubifs_key key; |
1326 | int sync = IS_DIRSYNC(host); | 1380 | int sync = IS_DIRSYNC(host); |
@@ -1344,8 +1398,8 @@ int ubifs_jnl_change_xattr(struct ubifs_info *c, const struct inode *inode, | |||
1344 | if (err) | 1398 | if (err) |
1345 | goto out_free; | 1399 | goto out_free; |
1346 | 1400 | ||
1347 | pack_inode(c, ino, host, 0, 0); | 1401 | pack_inode(c, ino, host, 0); |
1348 | pack_inode(c, (void *)ino + aligned_len1, inode, 1, 0); | 1402 | pack_inode(c, (void *)ino + aligned_len1, inode, 1); |
1349 | 1403 | ||
1350 | err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0); | 1404 | err = write_head(c, BASEHD, ino, aligned_len, &lnum, &offs, 0); |
1351 | if (!sync && !err) { | 1405 | if (!sync && !err) { |
diff --git a/fs/ubifs/log.c b/fs/ubifs/log.c index 36857b9ed59e..3e0aa7367556 100644 --- a/fs/ubifs/log.c +++ b/fs/ubifs/log.c | |||
@@ -317,6 +317,8 @@ int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs) | |||
317 | return 0; | 317 | return 0; |
318 | 318 | ||
319 | out_unlock: | 319 | out_unlock: |
320 | if (err != -EAGAIN) | ||
321 | ubifs_ro_mode(c, err); | ||
320 | mutex_unlock(&c->log_mutex); | 322 | mutex_unlock(&c->log_mutex); |
321 | kfree(ref); | 323 | kfree(ref); |
322 | kfree(bud); | 324 | kfree(bud); |
@@ -410,7 +412,7 @@ int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum) | |||
410 | return -ENOMEM; | 412 | return -ENOMEM; |
411 | 413 | ||
412 | cs->ch.node_type = UBIFS_CS_NODE; | 414 | cs->ch.node_type = UBIFS_CS_NODE; |
413 | cs->cmt_no = cpu_to_le64(c->cmt_no + 1); | 415 | cs->cmt_no = cpu_to_le64(c->cmt_no); |
414 | ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0); | 416 | ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0); |
415 | 417 | ||
416 | /* | 418 | /* |
diff --git a/fs/ubifs/misc.h b/fs/ubifs/misc.h index 4beccfc256d2..87dabf9fe742 100644 --- a/fs/ubifs/misc.h +++ b/fs/ubifs/misc.h | |||
@@ -80,20 +80,6 @@ static inline struct ubifs_inode *ubifs_inode(const struct inode *inode) | |||
80 | } | 80 | } |
81 | 81 | ||
82 | /** | 82 | /** |
83 | * ubifs_ro_mode - switch UBIFS to read read-only mode. | ||
84 | * @c: UBIFS file-system description object | ||
85 | * @err: error code which is the reason of switching to R/O mode | ||
86 | */ | ||
87 | static inline void ubifs_ro_mode(struct ubifs_info *c, int err) | ||
88 | { | ||
89 | if (!c->ro_media) { | ||
90 | c->ro_media = 1; | ||
91 | ubifs_warn("switched to read-only mode, error %d", err); | ||
92 | dbg_dump_stack(); | ||
93 | } | ||
94 | } | ||
95 | |||
96 | /** | ||
97 | * ubifs_compr_present - check if compressor was compiled in. | 83 | * ubifs_compr_present - check if compressor was compiled in. |
98 | * @compr_type: compressor type to check | 84 | * @compr_type: compressor type to check |
99 | * | 85 | * |
@@ -322,7 +308,7 @@ static inline long long ubifs_reported_space(const struct ubifs_info *c, | |||
322 | { | 308 | { |
323 | int divisor, factor; | 309 | int divisor, factor; |
324 | 310 | ||
325 | divisor = UBIFS_MAX_DATA_NODE_SZ + (c->max_idx_node_sz << 1); | 311 | divisor = UBIFS_MAX_DATA_NODE_SZ + (c->max_idx_node_sz * 3); |
326 | factor = UBIFS_MAX_DATA_NODE_SZ - UBIFS_DATA_NODE_SZ; | 312 | factor = UBIFS_MAX_DATA_NODE_SZ - UBIFS_DATA_NODE_SZ; |
327 | do_div(free, divisor); | 313 | do_div(free, divisor); |
328 | 314 | ||
diff --git a/fs/ubifs/orphan.c b/fs/ubifs/orphan.c index 3afeb9242c6a..02d3462f4d3e 100644 --- a/fs/ubifs/orphan.c +++ b/fs/ubifs/orphan.c | |||
@@ -310,10 +310,10 @@ static int write_orph_node(struct ubifs_info *c, int atomic) | |||
310 | c->cmt_orphans -= cnt; | 310 | c->cmt_orphans -= cnt; |
311 | spin_unlock(&c->orphan_lock); | 311 | spin_unlock(&c->orphan_lock); |
312 | if (c->cmt_orphans) | 312 | if (c->cmt_orphans) |
313 | orph->cmt_no = cpu_to_le64(c->cmt_no + 1); | 313 | orph->cmt_no = cpu_to_le64(c->cmt_no); |
314 | else | 314 | else |
315 | /* Mark the last node of the commit */ | 315 | /* Mark the last node of the commit */ |
316 | orph->cmt_no = cpu_to_le64((c->cmt_no + 1) | (1ULL << 63)); | 316 | orph->cmt_no = cpu_to_le64((c->cmt_no) | (1ULL << 63)); |
317 | ubifs_assert(c->ohead_offs + len <= c->leb_size); | 317 | ubifs_assert(c->ohead_offs + len <= c->leb_size); |
318 | ubifs_assert(c->ohead_lnum >= c->orph_first); | 318 | ubifs_assert(c->ohead_lnum >= c->orph_first); |
319 | ubifs_assert(c->ohead_lnum <= c->orph_last); | 319 | ubifs_assert(c->ohead_lnum <= c->orph_last); |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index ca1e2d4e03cc..f71e6b8822c4 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/ctype.h> | 32 | #include <linux/ctype.h> |
33 | #include <linux/random.h> | ||
34 | #include <linux/kthread.h> | 33 | #include <linux/kthread.h> |
35 | #include <linux/parser.h> | 34 | #include <linux/parser.h> |
36 | #include <linux/seq_file.h> | 35 | #include <linux/seq_file.h> |
@@ -149,7 +148,7 @@ struct inode *ubifs_iget(struct super_block *sb, unsigned long inum) | |||
149 | if (err) | 148 | if (err) |
150 | goto out_invalid; | 149 | goto out_invalid; |
151 | 150 | ||
152 | /* Disable readahead */ | 151 | /* Disable read-ahead */ |
153 | inode->i_mapping->backing_dev_info = &c->bdi; | 152 | inode->i_mapping->backing_dev_info = &c->bdi; |
154 | 153 | ||
155 | switch (inode->i_mode & S_IFMT) { | 154 | switch (inode->i_mode & S_IFMT) { |
@@ -278,7 +277,7 @@ static void ubifs_destroy_inode(struct inode *inode) | |||
278 | */ | 277 | */ |
279 | static int ubifs_write_inode(struct inode *inode, int wait) | 278 | static int ubifs_write_inode(struct inode *inode, int wait) |
280 | { | 279 | { |
281 | int err; | 280 | int err = 0; |
282 | struct ubifs_info *c = inode->i_sb->s_fs_info; | 281 | struct ubifs_info *c = inode->i_sb->s_fs_info; |
283 | struct ubifs_inode *ui = ubifs_inode(inode); | 282 | struct ubifs_inode *ui = ubifs_inode(inode); |
284 | 283 | ||
@@ -299,10 +298,18 @@ static int ubifs_write_inode(struct inode *inode, int wait) | |||
299 | return 0; | 298 | return 0; |
300 | } | 299 | } |
301 | 300 | ||
302 | dbg_gen("inode %lu", inode->i_ino); | 301 | /* |
303 | err = ubifs_jnl_write_inode(c, inode, 0); | 302 | * As an optimization, do not write orphan inodes to the media just |
304 | if (err) | 303 | * because this is not needed. |
305 | ubifs_err("can't write inode %lu, error %d", inode->i_ino, err); | 304 | */ |
305 | dbg_gen("inode %lu, mode %#x, nlink %u", | ||
306 | inode->i_ino, (int)inode->i_mode, inode->i_nlink); | ||
307 | if (inode->i_nlink) { | ||
308 | err = ubifs_jnl_write_inode(c, inode); | ||
309 | if (err) | ||
310 | ubifs_err("can't write inode %lu, error %d", | ||
311 | inode->i_ino, err); | ||
312 | } | ||
306 | 313 | ||
307 | ui->dirty = 0; | 314 | ui->dirty = 0; |
308 | mutex_unlock(&ui->ui_mutex); | 315 | mutex_unlock(&ui->ui_mutex); |
@@ -314,8 +321,9 @@ static void ubifs_delete_inode(struct inode *inode) | |||
314 | { | 321 | { |
315 | int err; | 322 | int err; |
316 | struct ubifs_info *c = inode->i_sb->s_fs_info; | 323 | struct ubifs_info *c = inode->i_sb->s_fs_info; |
324 | struct ubifs_inode *ui = ubifs_inode(inode); | ||
317 | 325 | ||
318 | if (ubifs_inode(inode)->xattr) | 326 | if (ui->xattr) |
319 | /* | 327 | /* |
320 | * Extended attribute inode deletions are fully handled in | 328 | * Extended attribute inode deletions are fully handled in |
321 | * 'ubifs_removexattr()'. These inodes are special and have | 329 | * 'ubifs_removexattr()'. These inodes are special and have |
@@ -323,7 +331,7 @@ static void ubifs_delete_inode(struct inode *inode) | |||
323 | */ | 331 | */ |
324 | goto out; | 332 | goto out; |
325 | 333 | ||
326 | dbg_gen("inode %lu", inode->i_ino); | 334 | dbg_gen("inode %lu, mode %#x", inode->i_ino, (int)inode->i_mode); |
327 | ubifs_assert(!atomic_read(&inode->i_count)); | 335 | ubifs_assert(!atomic_read(&inode->i_count)); |
328 | ubifs_assert(inode->i_nlink == 0); | 336 | ubifs_assert(inode->i_nlink == 0); |
329 | 337 | ||
@@ -331,15 +339,19 @@ static void ubifs_delete_inode(struct inode *inode) | |||
331 | if (is_bad_inode(inode)) | 339 | if (is_bad_inode(inode)) |
332 | goto out; | 340 | goto out; |
333 | 341 | ||
334 | ubifs_inode(inode)->ui_size = inode->i_size = 0; | 342 | ui->ui_size = inode->i_size = 0; |
335 | err = ubifs_jnl_write_inode(c, inode, 1); | 343 | err = ubifs_jnl_delete_inode(c, inode); |
336 | if (err) | 344 | if (err) |
337 | /* | 345 | /* |
338 | * Worst case we have a lost orphan inode wasting space, so a | 346 | * Worst case we have a lost orphan inode wasting space, so a |
339 | * simple error message is ok here. | 347 | * simple error message is OK here. |
340 | */ | 348 | */ |
341 | ubifs_err("can't write inode %lu, error %d", inode->i_ino, err); | 349 | ubifs_err("can't delete inode %lu, error %d", |
350 | inode->i_ino, err); | ||
351 | |||
342 | out: | 352 | out: |
353 | if (ui->dirty) | ||
354 | ubifs_release_dirty_inode_budget(c, ui); | ||
343 | clear_inode(inode); | 355 | clear_inode(inode); |
344 | } | 356 | } |
345 | 357 | ||
@@ -1122,8 +1134,8 @@ static int mount_ubifs(struct ubifs_info *c) | |||
1122 | if (err) | 1134 | if (err) |
1123 | goto out_infos; | 1135 | goto out_infos; |
1124 | 1136 | ||
1125 | ubifs_msg("mounted UBI device %d, volume %d", c->vi.ubi_num, | 1137 | ubifs_msg("mounted UBI device %d, volume %d, name \"%s\"", |
1126 | c->vi.vol_id); | 1138 | c->vi.ubi_num, c->vi.vol_id, c->vi.name); |
1127 | if (mounted_read_only) | 1139 | if (mounted_read_only) |
1128 | ubifs_msg("mounted read-only"); | 1140 | ubifs_msg("mounted read-only"); |
1129 | x = (long long)c->main_lebs * c->leb_size; | 1141 | x = (long long)c->main_lebs * c->leb_size; |
@@ -1469,6 +1481,7 @@ static void ubifs_put_super(struct super_block *sb) | |||
1469 | */ | 1481 | */ |
1470 | ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0); | 1482 | ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0); |
1471 | ubifs_assert(c->budg_idx_growth == 0); | 1483 | ubifs_assert(c->budg_idx_growth == 0); |
1484 | ubifs_assert(c->budg_dd_growth == 0); | ||
1472 | ubifs_assert(c->budg_data_growth == 0); | 1485 | ubifs_assert(c->budg_data_growth == 0); |
1473 | 1486 | ||
1474 | /* | 1487 | /* |
@@ -1657,7 +1670,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) | |||
1657 | INIT_LIST_HEAD(&c->orph_new); | 1670 | INIT_LIST_HEAD(&c->orph_new); |
1658 | 1671 | ||
1659 | c->highest_inum = UBIFS_FIRST_INO; | 1672 | c->highest_inum = UBIFS_FIRST_INO; |
1660 | get_random_bytes(&c->vfs_gen, sizeof(int)); | ||
1661 | c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM; | 1673 | c->lhead_lnum = c->ltail_lnum = UBIFS_LOG_LNUM; |
1662 | 1674 | ||
1663 | ubi_get_volume_info(ubi, &c->vi); | 1675 | ubi_get_volume_info(ubi, &c->vi); |
@@ -1671,10 +1683,10 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) | |||
1671 | } | 1683 | } |
1672 | 1684 | ||
1673 | /* | 1685 | /* |
1674 | * UBIFS provids 'backing_dev_info' in order to disable readahead. For | 1686 | * UBIFS provides 'backing_dev_info' in order to disable read-ahead. For |
1675 | * UBIFS, I/O is not deferred, it is done immediately in readpage, | 1687 | * UBIFS, I/O is not deferred, it is done immediately in readpage, |
1676 | * which means the user would have to wait not just for their own I/O | 1688 | * which means the user would have to wait not just for their own I/O |
1677 | * but the readahead I/O as well i.e. completely pointless. | 1689 | * but the read-ahead I/O as well i.e. completely pointless. |
1678 | * | 1690 | * |
1679 | * Read-ahead will be disabled because @c->bdi.ra_pages is 0. | 1691 | * Read-ahead will be disabled because @c->bdi.ra_pages is 0. |
1680 | */ | 1692 | */ |
diff --git a/fs/ubifs/tnc_commit.c b/fs/ubifs/tnc_commit.c index 8117e65ba2e9..8ac76b1c2d55 100644 --- a/fs/ubifs/tnc_commit.c +++ b/fs/ubifs/tnc_commit.c | |||
@@ -372,26 +372,25 @@ static int layout_in_gaps(struct ubifs_info *c, int cnt) | |||
372 | written = layout_leb_in_gaps(c, p); | 372 | written = layout_leb_in_gaps(c, p); |
373 | if (written < 0) { | 373 | if (written < 0) { |
374 | err = written; | 374 | err = written; |
375 | if (err == -ENOSPC) { | 375 | if (err != -ENOSPC) { |
376 | if (!dbg_force_in_the_gaps_enabled) { | 376 | kfree(c->gap_lebs); |
377 | /* | 377 | c->gap_lebs = NULL; |
378 | * Do not print scary warnings if the | 378 | return err; |
379 | * debugging option which forces | ||
380 | * in-the-gaps is enabled. | ||
381 | */ | ||
382 | ubifs_err("out of space"); | ||
383 | spin_lock(&c->space_lock); | ||
384 | dbg_dump_budg(c); | ||
385 | spin_unlock(&c->space_lock); | ||
386 | dbg_dump_lprops(c); | ||
387 | } | ||
388 | /* Try to commit anyway */ | ||
389 | err = 0; | ||
390 | break; | ||
391 | } | 379 | } |
392 | kfree(c->gap_lebs); | 380 | if (!dbg_force_in_the_gaps_enabled) { |
393 | c->gap_lebs = NULL; | 381 | /* |
394 | return err; | 382 | * Do not print scary warnings if the debugging |
383 | * option which forces in-the-gaps is enabled. | ||
384 | */ | ||
385 | ubifs_err("out of space"); | ||
386 | spin_lock(&c->space_lock); | ||
387 | dbg_dump_budg(c); | ||
388 | spin_unlock(&c->space_lock); | ||
389 | dbg_dump_lprops(c); | ||
390 | } | ||
391 | /* Try to commit anyway */ | ||
392 | err = 0; | ||
393 | break; | ||
395 | } | 394 | } |
396 | p++; | 395 | p++; |
397 | cnt -= written; | 396 | cnt -= written; |
diff --git a/fs/ubifs/ubifs-media.h b/fs/ubifs/ubifs-media.h index 0cc7da9bed47..bd2121f3426e 100644 --- a/fs/ubifs/ubifs-media.h +++ b/fs/ubifs/ubifs-media.h | |||
@@ -228,10 +228,10 @@ enum { | |||
228 | /* Minimum number of orphan area logical eraseblocks */ | 228 | /* Minimum number of orphan area logical eraseblocks */ |
229 | #define UBIFS_MIN_ORPH_LEBS 1 | 229 | #define UBIFS_MIN_ORPH_LEBS 1 |
230 | /* | 230 | /* |
231 | * Minimum number of main area logical eraseblocks (buds, 2 for the index, 1 | 231 | * Minimum number of main area logical eraseblocks (buds, 3 for the index, 1 |
232 | * for GC, 1 for deletions, and at least 1 for committed data). | 232 | * for GC, 1 for deletions, and at least 1 for committed data). |
233 | */ | 233 | */ |
234 | #define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 5) | 234 | #define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 6) |
235 | 235 | ||
236 | /* Minimum number of logical eraseblocks */ | 236 | /* Minimum number of logical eraseblocks */ |
237 | #define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \ | 237 | #define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \ |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index e4f89f271827..d7f706f7a302 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
@@ -20,8 +20,6 @@ | |||
20 | * Adrian Hunter | 20 | * Adrian Hunter |
21 | */ | 21 | */ |
22 | 22 | ||
23 | /* Implementation version 0.7 */ | ||
24 | |||
25 | #ifndef __UBIFS_H__ | 23 | #ifndef __UBIFS_H__ |
26 | #define __UBIFS_H__ | 24 | #define __UBIFS_H__ |
27 | 25 | ||
@@ -322,6 +320,8 @@ struct ubifs_gced_idx_leb { | |||
322 | * struct ubifs_inode - UBIFS in-memory inode description. | 320 | * struct ubifs_inode - UBIFS in-memory inode description. |
323 | * @vfs_inode: VFS inode description object | 321 | * @vfs_inode: VFS inode description object |
324 | * @creat_sqnum: sequence number at time of creation | 322 | * @creat_sqnum: sequence number at time of creation |
323 | * @del_cmtno: commit number corresponding to the time the inode was deleted, | ||
324 | * protected by @c->commit_sem; | ||
325 | * @xattr_size: summarized size of all extended attributes in bytes | 325 | * @xattr_size: summarized size of all extended attributes in bytes |
326 | * @xattr_cnt: count of extended attributes this inode has | 326 | * @xattr_cnt: count of extended attributes this inode has |
327 | * @xattr_names: sum of lengths of all extended attribute names belonging to | 327 | * @xattr_names: sum of lengths of all extended attribute names belonging to |
@@ -373,6 +373,7 @@ struct ubifs_gced_idx_leb { | |||
373 | struct ubifs_inode { | 373 | struct ubifs_inode { |
374 | struct inode vfs_inode; | 374 | struct inode vfs_inode; |
375 | unsigned long long creat_sqnum; | 375 | unsigned long long creat_sqnum; |
376 | unsigned long long del_cmtno; | ||
376 | unsigned int xattr_size; | 377 | unsigned int xattr_size; |
377 | unsigned int xattr_cnt; | 378 | unsigned int xattr_cnt; |
378 | unsigned int xattr_names; | 379 | unsigned int xattr_names; |
@@ -779,7 +780,7 @@ struct ubifs_compressor { | |||
779 | /** | 780 | /** |
780 | * struct ubifs_budget_req - budget requirements of an operation. | 781 | * struct ubifs_budget_req - budget requirements of an operation. |
781 | * | 782 | * |
782 | * @fast: non-zero if the budgeting should try to aquire budget quickly and | 783 | * @fast: non-zero if the budgeting should try to acquire budget quickly and |
783 | * should not try to call write-back | 784 | * should not try to call write-back |
784 | * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields | 785 | * @recalculate: non-zero if @idx_growth, @data_growth, and @dd_growth fields |
785 | * have to be re-calculated | 786 | * have to be re-calculated |
@@ -805,21 +806,31 @@ struct ubifs_compressor { | |||
805 | * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d | 806 | * An inode may contain 4KiB of data at max., thus the widths of @new_ino_d |
806 | * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made | 807 | * is 13 bits, and @dirtied_ino_d - 15, because up to 4 inodes may be made |
807 | * dirty by the re-name operation. | 808 | * dirty by the re-name operation. |
809 | * | ||
810 | * Note, UBIFS aligns node lengths to 8-bytes boundary, so the requester has to | ||
811 | * make sure the amount of inode data which contribute to @new_ino_d and | ||
812 | * @dirtied_ino_d fields are aligned. | ||
808 | */ | 813 | */ |
809 | struct ubifs_budget_req { | 814 | struct ubifs_budget_req { |
810 | unsigned int fast:1; | 815 | unsigned int fast:1; |
811 | unsigned int recalculate:1; | 816 | unsigned int recalculate:1; |
817 | #ifndef UBIFS_DEBUG | ||
812 | unsigned int new_page:1; | 818 | unsigned int new_page:1; |
813 | unsigned int dirtied_page:1; | 819 | unsigned int dirtied_page:1; |
814 | unsigned int new_dent:1; | 820 | unsigned int new_dent:1; |
815 | unsigned int mod_dent:1; | 821 | unsigned int mod_dent:1; |
816 | unsigned int new_ino:1; | 822 | unsigned int new_ino:1; |
817 | unsigned int new_ino_d:13; | 823 | unsigned int new_ino_d:13; |
818 | #ifndef UBIFS_DEBUG | ||
819 | unsigned int dirtied_ino:4; | 824 | unsigned int dirtied_ino:4; |
820 | unsigned int dirtied_ino_d:15; | 825 | unsigned int dirtied_ino_d:15; |
821 | #else | 826 | #else |
822 | /* Not bit-fields to check for overflows */ | 827 | /* Not bit-fields to check for overflows */ |
828 | unsigned int new_page; | ||
829 | unsigned int dirtied_page; | ||
830 | unsigned int new_dent; | ||
831 | unsigned int mod_dent; | ||
832 | unsigned int new_ino; | ||
833 | unsigned int new_ino_d; | ||
823 | unsigned int dirtied_ino; | 834 | unsigned int dirtied_ino; |
824 | unsigned int dirtied_ino_d; | 835 | unsigned int dirtied_ino_d; |
825 | #endif | 836 | #endif |
@@ -860,13 +871,13 @@ struct ubifs_mount_opts { | |||
860 | * struct ubifs_info - UBIFS file-system description data structure | 871 | * struct ubifs_info - UBIFS file-system description data structure |
861 | * (per-superblock). | 872 | * (per-superblock). |
862 | * @vfs_sb: VFS @struct super_block object | 873 | * @vfs_sb: VFS @struct super_block object |
863 | * @bdi: backing device info object to make VFS happy and disable readahead | 874 | * @bdi: backing device info object to make VFS happy and disable read-ahead |
864 | * | 875 | * |
865 | * @highest_inum: highest used inode number | 876 | * @highest_inum: highest used inode number |
866 | * @vfs_gen: VFS inode generation counter | ||
867 | * @max_sqnum: current global sequence number | 877 | * @max_sqnum: current global sequence number |
868 | * @cmt_no: commit number (last successfully completed commit) | 878 | * @cmt_no: commit number of the last successfully completed commit, protected |
869 | * @cnt_lock: protects @highest_inum, @vfs_gen, and @max_sqnum counters | 879 | * by @commit_sem |
880 | * @cnt_lock: protects @highest_inum and @max_sqnum counters | ||
870 | * @fmt_version: UBIFS on-flash format version | 881 | * @fmt_version: UBIFS on-flash format version |
871 | * @uuid: UUID from super block | 882 | * @uuid: UUID from super block |
872 | * | 883 | * |
@@ -1103,7 +1114,6 @@ struct ubifs_info { | |||
1103 | struct backing_dev_info bdi; | 1114 | struct backing_dev_info bdi; |
1104 | 1115 | ||
1105 | ino_t highest_inum; | 1116 | ino_t highest_inum; |
1106 | unsigned int vfs_gen; | ||
1107 | unsigned long long max_sqnum; | 1117 | unsigned long long max_sqnum; |
1108 | unsigned long long cmt_no; | 1118 | unsigned long long cmt_no; |
1109 | spinlock_t cnt_lock; | 1119 | spinlock_t cnt_lock; |
@@ -1346,6 +1356,7 @@ extern struct backing_dev_info ubifs_backing_dev_info; | |||
1346 | extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT]; | 1356 | extern struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT]; |
1347 | 1357 | ||
1348 | /* io.c */ | 1358 | /* io.c */ |
1359 | void ubifs_ro_mode(struct ubifs_info *c, int err); | ||
1349 | int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len); | 1360 | int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len); |
1350 | int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs, | 1361 | int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs, |
1351 | int dtype); | 1362 | int dtype); |
@@ -1399,8 +1410,8 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir, | |||
1399 | int deletion, int xent); | 1410 | int deletion, int xent); |
1400 | int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode, | 1411 | int ubifs_jnl_write_data(struct ubifs_info *c, const struct inode *inode, |
1401 | const union ubifs_key *key, const void *buf, int len); | 1412 | const union ubifs_key *key, const void *buf, int len); |
1402 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode, | 1413 | int ubifs_jnl_write_inode(struct ubifs_info *c, const struct inode *inode); |
1403 | int last_reference); | 1414 | int ubifs_jnl_delete_inode(struct ubifs_info *c, const struct inode *inode); |
1404 | int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, | 1415 | int ubifs_jnl_rename(struct ubifs_info *c, const struct inode *old_dir, |
1405 | const struct dentry *old_dentry, | 1416 | const struct dentry *old_dentry, |
1406 | const struct inode *new_dir, | 1417 | const struct inode *new_dir, |
diff --git a/fs/ubifs/xattr.c b/fs/ubifs/xattr.c index 1388a078e1a9..649bec78b645 100644 --- a/fs/ubifs/xattr.c +++ b/fs/ubifs/xattr.c | |||
@@ -61,7 +61,7 @@ | |||
61 | 61 | ||
62 | /* | 62 | /* |
63 | * Limit the number of extended attributes per inode so that the total size | 63 | * Limit the number of extended attributes per inode so that the total size |
64 | * (xattr_size) is guaranteeded to fit in an 'unsigned int'. | 64 | * (@xattr_size) is guaranteeded to fit in an 'unsigned int'. |
65 | */ | 65 | */ |
66 | #define MAX_XATTRS_PER_INODE 65535 | 66 | #define MAX_XATTRS_PER_INODE 65535 |
67 | 67 | ||
@@ -103,14 +103,14 @@ static int create_xattr(struct ubifs_info *c, struct inode *host, | |||
103 | struct inode *inode; | 103 | struct inode *inode; |
104 | struct ubifs_inode *ui, *host_ui = ubifs_inode(host); | 104 | struct ubifs_inode *ui, *host_ui = ubifs_inode(host); |
105 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, | 105 | struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1, |
106 | .new_ino_d = size, .dirtied_ino = 1, | 106 | .new_ino_d = ALIGN(size, 8), .dirtied_ino = 1, |
107 | .dirtied_ino_d = host_ui->data_len}; | 107 | .dirtied_ino_d = ALIGN(host_ui->data_len, 8) }; |
108 | 108 | ||
109 | if (host_ui->xattr_cnt >= MAX_XATTRS_PER_INODE) | 109 | if (host_ui->xattr_cnt >= MAX_XATTRS_PER_INODE) |
110 | return -ENOSPC; | 110 | return -ENOSPC; |
111 | /* | 111 | /* |
112 | * Linux limits the maximum size of the extended attribute names list | 112 | * Linux limits the maximum size of the extended attribute names list |
113 | * to %XATTR_LIST_MAX. This means we should not allow creating more* | 113 | * to %XATTR_LIST_MAX. This means we should not allow creating more |
114 | * extended attributes if the name list becomes larger. This limitation | 114 | * extended attributes if the name list becomes larger. This limitation |
115 | * is artificial for UBIFS, though. | 115 | * is artificial for UBIFS, though. |
116 | */ | 116 | */ |
@@ -128,7 +128,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host, | |||
128 | goto out_budg; | 128 | goto out_budg; |
129 | } | 129 | } |
130 | 130 | ||
131 | mutex_lock(&host_ui->ui_mutex); | ||
132 | /* Re-define all operations to be "nothing" */ | 131 | /* Re-define all operations to be "nothing" */ |
133 | inode->i_mapping->a_ops = &none_address_operations; | 132 | inode->i_mapping->a_ops = &none_address_operations; |
134 | inode->i_op = &none_inode_operations; | 133 | inode->i_op = &none_inode_operations; |
@@ -141,23 +140,19 @@ static int create_xattr(struct ubifs_info *c, struct inode *host, | |||
141 | ui->data = kmalloc(size, GFP_NOFS); | 140 | ui->data = kmalloc(size, GFP_NOFS); |
142 | if (!ui->data) { | 141 | if (!ui->data) { |
143 | err = -ENOMEM; | 142 | err = -ENOMEM; |
144 | goto out_unlock; | 143 | goto out_free; |
145 | } | 144 | } |
146 | |||
147 | memcpy(ui->data, value, size); | 145 | memcpy(ui->data, value, size); |
146 | inode->i_size = ui->ui_size = size; | ||
147 | ui->data_len = size; | ||
148 | |||
149 | mutex_lock(&host_ui->ui_mutex); | ||
148 | host->i_ctime = ubifs_current_time(host); | 150 | host->i_ctime = ubifs_current_time(host); |
149 | host_ui->xattr_cnt += 1; | 151 | host_ui->xattr_cnt += 1; |
150 | host_ui->xattr_size += CALC_DENT_SIZE(nm->len); | 152 | host_ui->xattr_size += CALC_DENT_SIZE(nm->len); |
151 | host_ui->xattr_size += CALC_XATTR_BYTES(size); | 153 | host_ui->xattr_size += CALC_XATTR_BYTES(size); |
152 | host_ui->xattr_names += nm->len; | 154 | host_ui->xattr_names += nm->len; |
153 | 155 | ||
154 | /* | ||
155 | * We do not use i_size_write() because nobody can race with us as we | ||
156 | * are holding host @host->i_mutex - every xattr operation for this | ||
157 | * inode is serialized by it. | ||
158 | */ | ||
159 | inode->i_size = ui->ui_size = size; | ||
160 | ui->data_len = size; | ||
161 | err = ubifs_jnl_update(c, host, nm, inode, 0, 1); | 156 | err = ubifs_jnl_update(c, host, nm, inode, 0, 1); |
162 | if (err) | 157 | if (err) |
163 | goto out_cancel; | 158 | goto out_cancel; |
@@ -172,8 +167,8 @@ out_cancel: | |||
172 | host_ui->xattr_cnt -= 1; | 167 | host_ui->xattr_cnt -= 1; |
173 | host_ui->xattr_size -= CALC_DENT_SIZE(nm->len); | 168 | host_ui->xattr_size -= CALC_DENT_SIZE(nm->len); |
174 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); | 169 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); |
175 | out_unlock: | ||
176 | mutex_unlock(&host_ui->ui_mutex); | 170 | mutex_unlock(&host_ui->ui_mutex); |
171 | out_free: | ||
177 | make_bad_inode(inode); | 172 | make_bad_inode(inode); |
178 | iput(inode); | 173 | iput(inode); |
179 | out_budg: | 174 | out_budg: |
@@ -200,29 +195,28 @@ static int change_xattr(struct ubifs_info *c, struct inode *host, | |||
200 | struct ubifs_inode *host_ui = ubifs_inode(host); | 195 | struct ubifs_inode *host_ui = ubifs_inode(host); |
201 | struct ubifs_inode *ui = ubifs_inode(inode); | 196 | struct ubifs_inode *ui = ubifs_inode(inode); |
202 | struct ubifs_budget_req req = { .dirtied_ino = 2, | 197 | struct ubifs_budget_req req = { .dirtied_ino = 2, |
203 | .dirtied_ino_d = size + host_ui->data_len }; | 198 | .dirtied_ino_d = ALIGN(size, 8) + ALIGN(host_ui->data_len, 8) }; |
204 | 199 | ||
205 | ubifs_assert(ui->data_len == inode->i_size); | 200 | ubifs_assert(ui->data_len == inode->i_size); |
206 | err = ubifs_budget_space(c, &req); | 201 | err = ubifs_budget_space(c, &req); |
207 | if (err) | 202 | if (err) |
208 | return err; | 203 | return err; |
209 | 204 | ||
210 | mutex_lock(&host_ui->ui_mutex); | ||
211 | host->i_ctime = ubifs_current_time(host); | ||
212 | host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len); | ||
213 | host_ui->xattr_size += CALC_XATTR_BYTES(size); | ||
214 | |||
215 | kfree(ui->data); | 205 | kfree(ui->data); |
216 | ui->data = kmalloc(size, GFP_NOFS); | 206 | ui->data = kmalloc(size, GFP_NOFS); |
217 | if (!ui->data) { | 207 | if (!ui->data) { |
218 | err = -ENOMEM; | 208 | err = -ENOMEM; |
219 | goto out_unlock; | 209 | goto out_free; |
220 | } | 210 | } |
221 | |||
222 | memcpy(ui->data, value, size); | 211 | memcpy(ui->data, value, size); |
223 | inode->i_size = ui->ui_size = size; | 212 | inode->i_size = ui->ui_size = size; |
224 | ui->data_len = size; | 213 | ui->data_len = size; |
225 | 214 | ||
215 | mutex_lock(&host_ui->ui_mutex); | ||
216 | host->i_ctime = ubifs_current_time(host); | ||
217 | host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len); | ||
218 | host_ui->xattr_size += CALC_XATTR_BYTES(size); | ||
219 | |||
226 | /* | 220 | /* |
227 | * It is important to write the host inode after the xattr inode | 221 | * It is important to write the host inode after the xattr inode |
228 | * because if the host inode gets synchronized (via 'fsync()'), then | 222 | * because if the host inode gets synchronized (via 'fsync()'), then |
@@ -240,9 +234,9 @@ static int change_xattr(struct ubifs_info *c, struct inode *host, | |||
240 | out_cancel: | 234 | out_cancel: |
241 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); | 235 | host_ui->xattr_size -= CALC_XATTR_BYTES(size); |
242 | host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len); | 236 | host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len); |
243 | make_bad_inode(inode); | ||
244 | out_unlock: | ||
245 | mutex_unlock(&host_ui->ui_mutex); | 237 | mutex_unlock(&host_ui->ui_mutex); |
238 | make_bad_inode(inode); | ||
239 | out_free: | ||
246 | ubifs_release_budget(c, &req); | 240 | ubifs_release_budget(c, &req); |
247 | return err; | 241 | return err; |
248 | } | 242 | } |
@@ -312,6 +306,7 @@ int ubifs_setxattr(struct dentry *dentry, const char *name, | |||
312 | 306 | ||
313 | dbg_gen("xattr '%s', host ino %lu ('%.*s'), size %zd", name, | 307 | dbg_gen("xattr '%s', host ino %lu ('%.*s'), size %zd", name, |
314 | host->i_ino, dentry->d_name.len, dentry->d_name.name, size); | 308 | host->i_ino, dentry->d_name.len, dentry->d_name.name, size); |
309 | ubifs_assert(mutex_is_locked(&host->i_mutex)); | ||
315 | 310 | ||
316 | if (size > UBIFS_MAX_INO_DATA) | 311 | if (size > UBIFS_MAX_INO_DATA) |
317 | return -ERANGE; | 312 | return -ERANGE; |
@@ -384,7 +379,6 @@ ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, | |||
384 | if (!xent) | 379 | if (!xent) |
385 | return -ENOMEM; | 380 | return -ENOMEM; |
386 | 381 | ||
387 | mutex_lock(&host->i_mutex); | ||
388 | xent_key_init(c, &key, host->i_ino, &nm); | 382 | xent_key_init(c, &key, host->i_ino, &nm); |
389 | err = ubifs_tnc_lookup_nm(c, &key, xent, &nm); | 383 | err = ubifs_tnc_lookup_nm(c, &key, xent, &nm); |
390 | if (err) { | 384 | if (err) { |
@@ -419,7 +413,6 @@ ssize_t ubifs_getxattr(struct dentry *dentry, const char *name, void *buf, | |||
419 | out_iput: | 413 | out_iput: |
420 | iput(inode); | 414 | iput(inode); |
421 | out_unlock: | 415 | out_unlock: |
422 | mutex_unlock(&host->i_mutex); | ||
423 | kfree(xent); | 416 | kfree(xent); |
424 | return err; | 417 | return err; |
425 | } | 418 | } |
@@ -449,8 +442,6 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
449 | return -ERANGE; | 442 | return -ERANGE; |
450 | 443 | ||
451 | lowest_xent_key(c, &key, host->i_ino); | 444 | lowest_xent_key(c, &key, host->i_ino); |
452 | |||
453 | mutex_lock(&host->i_mutex); | ||
454 | while (1) { | 445 | while (1) { |
455 | int type; | 446 | int type; |
456 | 447 | ||
@@ -479,7 +470,6 @@ ssize_t ubifs_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
479 | pxent = xent; | 470 | pxent = xent; |
480 | key_read(c, &xent->key, &key); | 471 | key_read(c, &xent->key, &key); |
481 | } | 472 | } |
482 | mutex_unlock(&host->i_mutex); | ||
483 | 473 | ||
484 | kfree(pxent); | 474 | kfree(pxent); |
485 | if (err != -ENOENT) { | 475 | if (err != -ENOENT) { |
@@ -497,8 +487,8 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host, | |||
497 | int err; | 487 | int err; |
498 | struct ubifs_inode *host_ui = ubifs_inode(host); | 488 | struct ubifs_inode *host_ui = ubifs_inode(host); |
499 | struct ubifs_inode *ui = ubifs_inode(inode); | 489 | struct ubifs_inode *ui = ubifs_inode(inode); |
500 | struct ubifs_budget_req req = { .dirtied_ino = 1, .mod_dent = 1, | 490 | struct ubifs_budget_req req = { .dirtied_ino = 2, .mod_dent = 1, |
501 | .dirtied_ino_d = host_ui->data_len }; | 491 | .dirtied_ino_d = ALIGN(host_ui->data_len, 8) }; |
502 | 492 | ||
503 | ubifs_assert(ui->data_len == inode->i_size); | 493 | ubifs_assert(ui->data_len == inode->i_size); |
504 | 494 | ||
diff --git a/fs/xfs/xfs_dmapi.h b/fs/xfs/xfs_dmapi.h index cdc2d3464a1a..2813cdd72375 100644 --- a/fs/xfs/xfs_dmapi.h +++ b/fs/xfs/xfs_dmapi.h | |||
@@ -18,7 +18,6 @@ | |||
18 | #ifndef __XFS_DMAPI_H__ | 18 | #ifndef __XFS_DMAPI_H__ |
19 | #define __XFS_DMAPI_H__ | 19 | #define __XFS_DMAPI_H__ |
20 | 20 | ||
21 | #include <linux/version.h> | ||
22 | /* Values used to define the on-disk version of dm_attrname_t. All | 21 | /* Values used to define the on-disk version of dm_attrname_t. All |
23 | * on-disk attribute names start with the 8-byte string "SGI_DMI_". | 22 | * on-disk attribute names start with the 8-byte string "SGI_DMI_". |
24 | * | 23 | * |
diff --git a/include/acpi/acnamesp.h b/include/acpi/acnamesp.h index 9ed70a050580..c34008507b69 100644 --- a/include/acpi/acnamesp.h +++ b/include/acpi/acnamesp.h | |||
@@ -182,7 +182,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info); | |||
182 | */ | 182 | */ |
183 | u32 acpi_ns_opens_scope(acpi_object_type type); | 183 | u32 acpi_ns_opens_scope(acpi_object_type type); |
184 | 184 | ||
185 | void | 185 | acpi_status |
186 | acpi_ns_build_external_path(struct acpi_namespace_node *node, | 186 | acpi_ns_build_external_path(struct acpi_namespace_node *node, |
187 | acpi_size size, char *name_buffer); | 187 | acpi_size size, char *name_buffer); |
188 | 188 | ||
diff --git a/include/asm-arm/plat-s3c/regs-nand.h b/include/asm-arm/plat-s3c/regs-nand.h index 09f0b5503f5b..b2caa4bca270 100644 --- a/include/asm-arm/plat-s3c/regs-nand.h +++ b/include/asm-arm/plat-s3c/regs-nand.h | |||
@@ -11,7 +11,7 @@ | |||
11 | */ | 11 | */ |
12 | 12 | ||
13 | #ifndef __ASM_ARM_REGS_NAND | 13 | #ifndef __ASM_ARM_REGS_NAND |
14 | #define __ASM_ARM_REGS_NAND "$Id: nand.h,v 1.3 2003/12/09 11:36:29 ben Exp $" | 14 | #define __ASM_ARM_REGS_NAND |
15 | 15 | ||
16 | 16 | ||
17 | #define S3C2410_NFREG(x) (x) | 17 | #define S3C2410_NFREG(x) (x) |
diff --git a/include/asm-arm/plat-s3c/regs-timer.h b/include/asm-arm/plat-s3c/regs-timer.h index b4366ea39677..cc0eedd53e38 100644 --- a/include/asm-arm/plat-s3c/regs-timer.h +++ b/include/asm-arm/plat-s3c/regs-timer.h | |||
@@ -12,7 +12,7 @@ | |||
12 | 12 | ||
13 | 13 | ||
14 | #ifndef __ASM_ARCH_REGS_TIMER_H | 14 | #ifndef __ASM_ARCH_REGS_TIMER_H |
15 | #define __ASM_ARCH_REGS_TIMER_H "$Id: timer.h,v 1.4 2003/05/06 19:30:50 ben Exp $" | 15 | #define __ASM_ARCH_REGS_TIMER_H |
16 | 16 | ||
17 | #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x)) | 17 | #define S3C_TIMERREG(x) (S3C_VA_TIMER + (x)) |
18 | #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c)) | 18 | #define S3C_TIMERREG2(tmr,reg) S3C_TIMERREG((reg)+0x0c+((tmr)*0x0c)) |
diff --git a/include/asm-arm/plat-s3c/regs-watchdog.h b/include/asm-arm/plat-s3c/regs-watchdog.h index 1229f076c0a0..4938492470f7 100644 --- a/include/asm-arm/plat-s3c/regs-watchdog.h +++ b/include/asm-arm/plat-s3c/regs-watchdog.h | |||
@@ -12,7 +12,7 @@ | |||
12 | 12 | ||
13 | 13 | ||
14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H | 14 | #ifndef __ASM_ARCH_REGS_WATCHDOG_H |
15 | #define __ASM_ARCH_REGS_WATCHDOG_H "$Id: watchdog.h,v 1.2 2003/04/29 13:31:09 ben Exp $" | 15 | #define __ASM_ARCH_REGS_WATCHDOG_H |
16 | 16 | ||
17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) | 17 | #define S3C_WDOGREG(x) ((x) + S3C_VA_WATCHDOG) |
18 | 18 | ||
diff --git a/include/asm-arm/plat-s3c24xx/s3c2410.h b/include/asm-arm/plat-s3c24xx/s3c2410.h index 36de0b835873..3cd1ec677b3f 100644 --- a/include/asm-arm/plat-s3c24xx/s3c2410.h +++ b/include/asm-arm/plat-s3c24xx/s3c2410.h | |||
@@ -21,11 +21,11 @@ extern void s3c2410_init_uarts(struct s3c2410_uartcfg *cfg, int no); | |||
21 | 21 | ||
22 | extern void s3c2410_init_clocks(int xtal); | 22 | extern void s3c2410_init_clocks(int xtal); |
23 | 23 | ||
24 | extern int s3c2410_baseclk_add(void); | ||
25 | |||
26 | #else | 24 | #else |
27 | #define s3c2410_init_clocks NULL | 25 | #define s3c2410_init_clocks NULL |
28 | #define s3c2410_init_uarts NULL | 26 | #define s3c2410_init_uarts NULL |
29 | #define s3c2410_map_io NULL | 27 | #define s3c2410_map_io NULL |
30 | #define s3c2410_init NULL | 28 | #define s3c2410_init NULL |
31 | #endif | 29 | #endif |
30 | |||
31 | extern int s3c2410_baseclk_add(void); | ||
diff --git a/include/asm-blackfin/Kbuild b/include/asm-blackfin/Kbuild index 71f8fe783258..606ecfdcc962 100644 --- a/include/asm-blackfin/Kbuild +++ b/include/asm-blackfin/Kbuild | |||
@@ -1,3 +1,3 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | header-y += fixed_code.h | 3 | unifdef-y += fixed_code.h |
diff --git a/include/asm-blackfin/bfin-global.h b/include/asm-blackfin/bfin-global.h index 320aa5e167e9..7ba70de66f2b 100644 --- a/include/asm-blackfin/bfin-global.h +++ b/include/asm-blackfin/bfin-global.h | |||
@@ -56,37 +56,20 @@ extern void dump_bfin_process(struct pt_regs *regs); | |||
56 | extern void dump_bfin_mem(struct pt_regs *regs); | 56 | extern void dump_bfin_mem(struct pt_regs *regs); |
57 | extern void dump_bfin_trace_buffer(void); | 57 | extern void dump_bfin_trace_buffer(void); |
58 | 58 | ||
59 | /* init functions only */ | ||
59 | extern int init_arch_irq(void); | 60 | extern int init_arch_irq(void); |
60 | extern void bfin_reset(void); | ||
61 | extern void _cplb_hdr(void); | ||
62 | /* Blackfin cache functions */ | ||
63 | extern void bfin_icache_init(void); | 61 | extern void bfin_icache_init(void); |
64 | extern void bfin_dcache_init(void); | 62 | extern void bfin_dcache_init(void); |
65 | extern int read_iloc(void); | ||
66 | extern int bfin_console_init(void); | ||
67 | extern asmlinkage void lower_to_irq14(void); | ||
68 | extern asmlinkage void bfin_return_from_exception(void); | ||
69 | extern void init_exception_vectors(void); | 63 | extern void init_exception_vectors(void); |
70 | extern void init_dma(void); | ||
71 | extern void program_IAR(void); | 64 | extern void program_IAR(void); |
72 | extern void evt14_softirq(void); | 65 | |
66 | extern void bfin_reset(void); | ||
67 | extern asmlinkage void lower_to_irq14(void); | ||
68 | extern asmlinkage void bfin_return_from_exception(void); | ||
69 | extern asmlinkage void evt14_softirq(void); | ||
73 | extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs); | 70 | extern asmlinkage void asm_do_IRQ(unsigned int irq, struct pt_regs *regs); |
74 | extern void bfin_gpio_interrupt_setup(int irq, int irq_pfx, int type); | ||
75 | extern int bfin_internal_set_wake(unsigned int irq, unsigned int state); | 71 | extern int bfin_internal_set_wake(unsigned int irq, unsigned int state); |
76 | 72 | ||
77 | extern asmlinkage void finish_atomic_sections (struct pt_regs *regs); | ||
78 | extern char fixed_code_start; | ||
79 | extern char fixed_code_end; | ||
80 | extern int atomic_xchg32(void); | ||
81 | extern int atomic_cas32(void); | ||
82 | extern int atomic_add32(void); | ||
83 | extern int atomic_sub32(void); | ||
84 | extern int atomic_ior32(void); | ||
85 | extern int atomic_and32(void); | ||
86 | extern int atomic_xor32(void); | ||
87 | extern void safe_user_instruction(void); | ||
88 | extern void sigreturn_stub(void); | ||
89 | |||
90 | extern void *l1_data_A_sram_alloc(size_t); | 73 | extern void *l1_data_A_sram_alloc(size_t); |
91 | extern void *l1_data_B_sram_alloc(size_t); | 74 | extern void *l1_data_B_sram_alloc(size_t); |
92 | extern void *l1_inst_sram_alloc(size_t); | 75 | extern void *l1_inst_sram_alloc(size_t); |
@@ -110,11 +93,10 @@ extern void *sram_alloc_with_lsl(size_t, unsigned long); | |||
110 | extern int sram_free_with_lsl(const void*); | 93 | extern int sram_free_with_lsl(const void*); |
111 | 94 | ||
112 | extern const char bfin_board_name[]; | 95 | extern const char bfin_board_name[]; |
113 | extern unsigned long wall_jiffies; | ||
114 | 96 | ||
115 | extern unsigned long bfin_sic_iwr[]; | 97 | extern unsigned long bfin_sic_iwr[]; |
98 | extern unsigned vr_wakeup; | ||
116 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ | 99 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ |
117 | extern struct file_operations dpmc_fops; | ||
118 | extern unsigned long _ramstart, _ramend, _rambase; | 100 | extern unsigned long _ramstart, _ramend, _rambase; |
119 | extern unsigned long memory_start, memory_end, physical_mem_end; | 101 | extern unsigned long memory_start, memory_end, physical_mem_end; |
120 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | 102 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], |
@@ -122,8 +104,12 @@ extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | |||
122 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], | 104 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], |
123 | _ebss_l2[], _l2_lma_start[]; | 105 | _ebss_l2[], _l2_lma_start[]; |
124 | 106 | ||
125 | #ifdef CONFIG_MTD_UCLINUX | 107 | /* only used when CONFIG_MTD_UCLINUX */ |
126 | extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; | 108 | extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; |
109 | |||
110 | #ifdef CONFIG_BFIN_ICACHE_LOCK | ||
111 | extern void cache_grab_lock(int way); | ||
112 | extern void cache_lock(int way); | ||
127 | #endif | 113 | #endif |
128 | 114 | ||
129 | #endif | 115 | #endif |
diff --git a/include/asm-blackfin/dpmc.h b/include/asm-blackfin/dpmc.h index de28e6e018b3..96e8208f929a 100644 --- a/include/asm-blackfin/dpmc.h +++ b/include/asm-blackfin/dpmc.h | |||
@@ -11,7 +11,6 @@ | |||
11 | #ifndef __ASSEMBLY__ | 11 | #ifndef __ASSEMBLY__ |
12 | 12 | ||
13 | void sleep_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | 13 | void sleep_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); |
14 | void deep_sleep(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | ||
15 | void hibernate_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | 14 | void hibernate_mode(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); |
16 | void sleep_deeper(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); | 15 | void sleep_deeper(u32 sic_iwr0, u32 sic_iwr1, u32 sic_iwr2); |
17 | void do_hibernate(int wakeup); | 16 | void do_hibernate(int wakeup); |
diff --git a/include/asm-blackfin/fixed_code.h b/include/asm-blackfin/fixed_code.h index 37db66c7030d..32c4d495d847 100644 --- a/include/asm-blackfin/fixed_code.h +++ b/include/asm-blackfin/fixed_code.h | |||
@@ -1,6 +1,28 @@ | |||
1 | /* This file defines the fixed addresses where userspace programs can find | 1 | /* This file defines the fixed addresses where userspace programs can find |
2 | atomic code sequences. */ | 2 | atomic code sequences. */ |
3 | 3 | ||
4 | #ifndef __BFIN_ASM_FIXED_CODE_H__ | ||
5 | #define __BFIN_ASM_FIXED_CODE_H__ | ||
6 | |||
7 | #ifdef __KERNEL__ | ||
8 | #ifndef __ASSEMBLY__ | ||
9 | #include <linux/linkage.h> | ||
10 | #include <linux/ptrace.h> | ||
11 | extern asmlinkage void finish_atomic_sections(struct pt_regs *regs); | ||
12 | extern char fixed_code_start; | ||
13 | extern char fixed_code_end; | ||
14 | extern int atomic_xchg32(void); | ||
15 | extern int atomic_cas32(void); | ||
16 | extern int atomic_add32(void); | ||
17 | extern int atomic_sub32(void); | ||
18 | extern int atomic_ior32(void); | ||
19 | extern int atomic_and32(void); | ||
20 | extern int atomic_xor32(void); | ||
21 | extern void safe_user_instruction(void); | ||
22 | extern void sigreturn_stub(void); | ||
23 | #endif | ||
24 | #endif | ||
25 | |||
4 | #define FIXED_CODE_START 0x400 | 26 | #define FIXED_CODE_START 0x400 |
5 | 27 | ||
6 | #define SIGRETURN_STUB 0x400 | 28 | #define SIGRETURN_STUB 0x400 |
@@ -20,3 +42,5 @@ | |||
20 | #define SAFE_USER_INSTRUCTION 0x480 | 42 | #define SAFE_USER_INSTRUCTION 0x480 |
21 | 43 | ||
22 | #define FIXED_CODE_END 0x490 | 44 | #define FIXED_CODE_END 0x490 |
45 | |||
46 | #endif | ||
diff --git a/include/asm-blackfin/mach-bf527/mem_map.h b/include/asm-blackfin/mach-bf527/mem_map.h index 193082deaa4e..ef46dc991cd4 100644 --- a/include/asm-blackfin/mach-bf527/mem_map.h +++ b/include/asm-blackfin/mach-bf527/mem_map.h | |||
@@ -89,6 +89,11 @@ | |||
89 | #define BFIN_DSUPBANKS 0 | 89 | #define BFIN_DSUPBANKS 0 |
90 | #endif /*CONFIG_BFIN_DCACHE */ | 90 | #endif /*CONFIG_BFIN_DCACHE */ |
91 | 91 | ||
92 | /* Level 2 Memory - none */ | ||
93 | |||
94 | #define L2_START 0 | ||
95 | #define L2_LENGTH 0 | ||
96 | |||
92 | /* Scratch Pad Memory */ | 97 | /* Scratch Pad Memory */ |
93 | 98 | ||
94 | #define L1_SCRATCH_START 0xFFB00000 | 99 | #define L1_SCRATCH_START 0xFFB00000 |
diff --git a/include/asm-blackfin/mach-bf533/mem_init.h b/include/asm-blackfin/mach-bf533/mem_init.h index 995c06b2b1ef..ed2034bf10ec 100644 --- a/include/asm-blackfin/mach-bf533/mem_init.h +++ b/include/asm-blackfin/mach-bf533/mem_init.h | |||
@@ -47,7 +47,7 @@ | |||
47 | #define SDRAM_tRCD TRCD_2 | 47 | #define SDRAM_tRCD TRCD_2 |
48 | #define SDRAM_tWR TWR_2 | 48 | #define SDRAM_tWR TWR_2 |
49 | #endif | 49 | #endif |
50 | #if (CONFIG_SCLK_HZ > 8955223) && (CONFIG_SCLK_HZ <= 104477612) | 50 | #if (CONFIG_SCLK_HZ > 89552239) && (CONFIG_SCLK_HZ <= 104477612) |
51 | #define SDRAM_tRP TRP_2 | 51 | #define SDRAM_tRP TRP_2 |
52 | #define SDRAM_tRP_num 2 | 52 | #define SDRAM_tRP_num 2 |
53 | #define SDRAM_tRAS TRAS_5 | 53 | #define SDRAM_tRAS TRAS_5 |
diff --git a/include/asm-blackfin/mach-bf533/mem_map.h b/include/asm-blackfin/mach-bf533/mem_map.h index bd30b6f3be00..581fc6eea789 100644 --- a/include/asm-blackfin/mach-bf533/mem_map.h +++ b/include/asm-blackfin/mach-bf533/mem_map.h | |||
@@ -158,6 +158,11 @@ | |||
158 | 158 | ||
159 | #endif | 159 | #endif |
160 | 160 | ||
161 | /* Level 2 Memory - none */ | ||
162 | |||
163 | #define L2_START 0 | ||
164 | #define L2_LENGTH 0 | ||
165 | |||
161 | /* Scratch Pad Memory */ | 166 | /* Scratch Pad Memory */ |
162 | 167 | ||
163 | #define L1_SCRATCH_START 0xFFB00000 | 168 | #define L1_SCRATCH_START 0xFFB00000 |
diff --git a/include/asm-blackfin/mach-bf537/mem_map.h b/include/asm-blackfin/mach-bf537/mem_map.h index 5c6726d6f3b1..5078b669431f 100644 --- a/include/asm-blackfin/mach-bf537/mem_map.h +++ b/include/asm-blackfin/mach-bf537/mem_map.h | |||
@@ -166,6 +166,11 @@ | |||
166 | 166 | ||
167 | #endif | 167 | #endif |
168 | 168 | ||
169 | /* Level 2 Memory - none */ | ||
170 | |||
171 | #define L2_START 0 | ||
172 | #define L2_LENGTH 0 | ||
173 | |||
169 | /* Scratch Pad Memory */ | 174 | /* Scratch Pad Memory */ |
170 | 175 | ||
171 | #define L1_SCRATCH_START 0xFFB00000 | 176 | #define L1_SCRATCH_START 0xFFB00000 |
diff --git a/include/asm-blackfin/mach-common/cdef_LPBlackfin.h b/include/asm-blackfin/mach-common/cdef_LPBlackfin.h index ede210eca4ec..d39c396f850d 100644 --- a/include/asm-blackfin/mach-common/cdef_LPBlackfin.h +++ b/include/asm-blackfin/mach-common/cdef_LPBlackfin.h | |||
@@ -39,11 +39,7 @@ | |||
39 | #define bfin_read_SRAM_BASE_ADDRESS() bfin_read32(SRAM_BASE_ADDRESS) | 39 | #define bfin_read_SRAM_BASE_ADDRESS() bfin_read32(SRAM_BASE_ADDRESS) |
40 | #define bfin_write_SRAM_BASE_ADDRESS(val) bfin_write32(SRAM_BASE_ADDRESS,val) | 40 | #define bfin_write_SRAM_BASE_ADDRESS(val) bfin_write32(SRAM_BASE_ADDRESS,val) |
41 | #define bfin_read_DMEM_CONTROL() bfin_read32(DMEM_CONTROL) | 41 | #define bfin_read_DMEM_CONTROL() bfin_read32(DMEM_CONTROL) |
42 | #if ANOMALY_05000125 | ||
43 | extern void bfin_write_DMEM_CONTROL(unsigned int val); | ||
44 | #else | ||
45 | #define bfin_write_DMEM_CONTROL(val) bfin_write32(DMEM_CONTROL,val) | 42 | #define bfin_write_DMEM_CONTROL(val) bfin_write32(DMEM_CONTROL,val) |
46 | #endif | ||
47 | #define bfin_read_DCPLB_STATUS() bfin_read32(DCPLB_STATUS) | 43 | #define bfin_read_DCPLB_STATUS() bfin_read32(DCPLB_STATUS) |
48 | #define bfin_write_DCPLB_STATUS(val) bfin_write32(DCPLB_STATUS,val) | 44 | #define bfin_write_DCPLB_STATUS(val) bfin_write32(DCPLB_STATUS,val) |
49 | #define bfin_read_DCPLB_FAULT_ADDR() bfin_read32(DCPLB_FAULT_ADDR) | 45 | #define bfin_read_DCPLB_FAULT_ADDR() bfin_read32(DCPLB_FAULT_ADDR) |
@@ -129,11 +125,7 @@ extern void bfin_write_DMEM_CONTROL(unsigned int val); | |||
129 | #define DTEST_DATA3 0xFFE0040C | 125 | #define DTEST_DATA3 0xFFE0040C |
130 | */ | 126 | */ |
131 | #define bfin_read_IMEM_CONTROL() bfin_read32(IMEM_CONTROL) | 127 | #define bfin_read_IMEM_CONTROL() bfin_read32(IMEM_CONTROL) |
132 | #if ANOMALY_05000125 | ||
133 | extern void bfin_write_IMEM_CONTROL(unsigned int val); | ||
134 | #else | ||
135 | #define bfin_write_IMEM_CONTROL(val) bfin_write32(IMEM_CONTROL,val) | 128 | #define bfin_write_IMEM_CONTROL(val) bfin_write32(IMEM_CONTROL,val) |
136 | #endif | ||
137 | #define bfin_read_ICPLB_STATUS() bfin_read32(ICPLB_STATUS) | 129 | #define bfin_read_ICPLB_STATUS() bfin_read32(ICPLB_STATUS) |
138 | #define bfin_write_ICPLB_STATUS(val) bfin_write32(ICPLB_STATUS,val) | 130 | #define bfin_write_ICPLB_STATUS(val) bfin_write32(ICPLB_STATUS,val) |
139 | #define bfin_read_ICPLB_FAULT_ADDR() bfin_read32(ICPLB_FAULT_ADDR) | 131 | #define bfin_read_ICPLB_FAULT_ADDR() bfin_read32(ICPLB_FAULT_ADDR) |
diff --git a/include/asm-blackfin/unistd.h b/include/asm-blackfin/unistd.h index 42955d0c439b..1e57b636e0bc 100644 --- a/include/asm-blackfin/unistd.h +++ b/include/asm-blackfin/unistd.h | |||
@@ -372,8 +372,14 @@ | |||
372 | #define __NR_semtimedop 357 | 372 | #define __NR_semtimedop 357 |
373 | #define __NR_timerfd_settime 358 | 373 | #define __NR_timerfd_settime 358 |
374 | #define __NR_timerfd_gettime 359 | 374 | #define __NR_timerfd_gettime 359 |
375 | #define __NR_signalfd4 360 | ||
376 | #define __NR_eventfd2 361 | ||
377 | #define __NR_epoll_create1 362 | ||
378 | #define __NR_dup3 363 | ||
379 | #define __NR_pipe2 364 | ||
380 | #define __NR_inotify_init1 365 | ||
375 | 381 | ||
376 | #define __NR_syscall 360 | 382 | #define __NR_syscall 366 |
377 | #define NR_syscalls __NR_syscall | 383 | #define NR_syscalls __NR_syscall |
378 | 384 | ||
379 | /* Old optional stuff no one actually uses */ | 385 | /* Old optional stuff no one actually uses */ |
diff --git a/include/asm-cris/Kbuild b/include/asm-cris/Kbuild index b7037d80d461..d5b631935ec8 100644 --- a/include/asm-cris/Kbuild +++ b/include/asm-cris/Kbuild | |||
@@ -1,6 +1,5 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | header-y += arch/ | ||
4 | header-y += arch-v10/ | 3 | header-y += arch-v10/ |
5 | header-y += arch-v32/ | 4 | header-y += arch-v32/ |
6 | 5 | ||
diff --git a/include/asm-frv/io.h b/include/asm-frv/io.h index 20e44fe00abf..ca7475e73b5e 100644 --- a/include/asm-frv/io.h +++ b/include/asm-frv/io.h | |||
@@ -271,6 +271,8 @@ static inline void __iomem *ioremap_fullcache(unsigned long physaddr, unsigned l | |||
271 | return __ioremap(physaddr, size, IOMAP_FULL_CACHING); | 271 | return __ioremap(physaddr, size, IOMAP_FULL_CACHING); |
272 | } | 272 | } |
273 | 273 | ||
274 | #define ioremap_wc ioremap_nocache | ||
275 | |||
274 | extern void iounmap(void volatile __iomem *addr); | 276 | extern void iounmap(void volatile __iomem *addr); |
275 | 277 | ||
276 | static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) | 278 | static inline void __iomem *ioport_map(unsigned long port, unsigned int nr) |
diff --git a/include/asm-mips/kexec.h b/include/asm-mips/kexec.h index cdbab43b7d3a..4314892aaebb 100644 --- a/include/asm-mips/kexec.h +++ b/include/asm-mips/kexec.h | |||
@@ -16,7 +16,7 @@ | |||
16 | /* Maximum address we can use for the control code buffer */ | 16 | /* Maximum address we can use for the control code buffer */ |
17 | #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) | 17 | #define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000) |
18 | 18 | ||
19 | #define KEXEC_CONTROL_CODE_SIZE 4096 | 19 | #define KEXEC_CONTROL_PAGE_SIZE 4096 |
20 | 20 | ||
21 | /* The native architecture */ | 21 | /* The native architecture */ |
22 | #define KEXEC_ARCH KEXEC_ARCH_MIPS | 22 | #define KEXEC_ARCH KEXEC_ARCH_MIPS |
diff --git a/include/asm-mn10300/io.h b/include/asm-mn10300/io.h index b8b6dc878250..c1a4119e6497 100644 --- a/include/asm-mn10300/io.h +++ b/include/asm-mn10300/io.h | |||
@@ -259,6 +259,8 @@ static inline void *ioremap_nocache(unsigned long offset, unsigned long size) | |||
259 | return (void *) (offset | 0x20000000); | 259 | return (void *) (offset | 0x20000000); |
260 | } | 260 | } |
261 | 261 | ||
262 | #define ioremap_wc ioremap_nocache | ||
263 | |||
262 | static inline void iounmap(void *addr) | 264 | static inline void iounmap(void *addr) |
263 | { | 265 | { |
264 | } | 266 | } |
diff --git a/include/asm-x86/amd_iommu_types.h b/include/asm-x86/amd_iommu_types.h index 22aa58ca1991..dcc812067394 100644 --- a/include/asm-x86/amd_iommu_types.h +++ b/include/asm-x86/amd_iommu_types.h | |||
@@ -31,9 +31,6 @@ | |||
31 | #define ALIAS_TABLE_ENTRY_SIZE 2 | 31 | #define ALIAS_TABLE_ENTRY_SIZE 2 |
32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) | 32 | #define RLOOKUP_TABLE_ENTRY_SIZE (sizeof(void *)) |
33 | 33 | ||
34 | /* helper macros */ | ||
35 | #define LOW_U32(x) ((x) & ((1ULL << 32)-1)) | ||
36 | |||
37 | /* Length of the MMIO region for the AMD IOMMU */ | 34 | /* Length of the MMIO region for the AMD IOMMU */ |
38 | #define MMIO_REGION_LENGTH 0x4000 | 35 | #define MMIO_REGION_LENGTH 0x4000 |
39 | 36 | ||
@@ -69,6 +66,9 @@ | |||
69 | #define MMIO_EVT_TAIL_OFFSET 0x2018 | 66 | #define MMIO_EVT_TAIL_OFFSET 0x2018 |
70 | #define MMIO_STATUS_OFFSET 0x2020 | 67 | #define MMIO_STATUS_OFFSET 0x2020 |
71 | 68 | ||
69 | /* MMIO status bits */ | ||
70 | #define MMIO_STATUS_COM_WAIT_INT_MASK 0x04 | ||
71 | |||
72 | /* feature control bits */ | 72 | /* feature control bits */ |
73 | #define CONTROL_IOMMU_EN 0x00ULL | 73 | #define CONTROL_IOMMU_EN 0x00ULL |
74 | #define CONTROL_HT_TUN_EN 0x01ULL | 74 | #define CONTROL_HT_TUN_EN 0x01ULL |
@@ -89,6 +89,7 @@ | |||
89 | #define CMD_INV_IOMMU_PAGES 0x03 | 89 | #define CMD_INV_IOMMU_PAGES 0x03 |
90 | 90 | ||
91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 | 91 | #define CMD_COMPL_WAIT_STORE_MASK 0x01 |
92 | #define CMD_COMPL_WAIT_INT_MASK 0x02 | ||
92 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 | 93 | #define CMD_INV_IOMMU_PAGES_SIZE_MASK 0x01 |
93 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 | 94 | #define CMD_INV_IOMMU_PAGES_PDE_MASK 0x02 |
94 | 95 | ||
@@ -99,6 +100,7 @@ | |||
99 | #define DEV_ENTRY_TRANSLATION 0x01 | 100 | #define DEV_ENTRY_TRANSLATION 0x01 |
100 | #define DEV_ENTRY_IR 0x3d | 101 | #define DEV_ENTRY_IR 0x3d |
101 | #define DEV_ENTRY_IW 0x3e | 102 | #define DEV_ENTRY_IW 0x3e |
103 | #define DEV_ENTRY_NO_PAGE_FAULT 0x62 | ||
102 | #define DEV_ENTRY_EX 0x67 | 104 | #define DEV_ENTRY_EX 0x67 |
103 | #define DEV_ENTRY_SYSMGT1 0x68 | 105 | #define DEV_ENTRY_SYSMGT1 0x68 |
104 | #define DEV_ENTRY_SYSMGT2 0x69 | 106 | #define DEV_ENTRY_SYSMGT2 0x69 |
diff --git a/include/asm-x86/atomic_64.h b/include/asm-x86/atomic_64.h index a0095191c02e..91c7d03e65bc 100644 --- a/include/asm-x86/atomic_64.h +++ b/include/asm-x86/atomic_64.h | |||
@@ -228,7 +228,7 @@ static inline void atomic64_add(long i, atomic64_t *v) | |||
228 | { | 228 | { |
229 | asm volatile(LOCK_PREFIX "addq %1,%0" | 229 | asm volatile(LOCK_PREFIX "addq %1,%0" |
230 | : "=m" (v->counter) | 230 | : "=m" (v->counter) |
231 | : "ir" (i), "m" (v->counter)); | 231 | : "er" (i), "m" (v->counter)); |
232 | } | 232 | } |
233 | 233 | ||
234 | /** | 234 | /** |
@@ -242,7 +242,7 @@ static inline void atomic64_sub(long i, atomic64_t *v) | |||
242 | { | 242 | { |
243 | asm volatile(LOCK_PREFIX "subq %1,%0" | 243 | asm volatile(LOCK_PREFIX "subq %1,%0" |
244 | : "=m" (v->counter) | 244 | : "=m" (v->counter) |
245 | : "ir" (i), "m" (v->counter)); | 245 | : "er" (i), "m" (v->counter)); |
246 | } | 246 | } |
247 | 247 | ||
248 | /** | 248 | /** |
@@ -260,7 +260,7 @@ static inline int atomic64_sub_and_test(long i, atomic64_t *v) | |||
260 | 260 | ||
261 | asm volatile(LOCK_PREFIX "subq %2,%0; sete %1" | 261 | asm volatile(LOCK_PREFIX "subq %2,%0; sete %1" |
262 | : "=m" (v->counter), "=qm" (c) | 262 | : "=m" (v->counter), "=qm" (c) |
263 | : "ir" (i), "m" (v->counter) : "memory"); | 263 | : "er" (i), "m" (v->counter) : "memory"); |
264 | return c; | 264 | return c; |
265 | } | 265 | } |
266 | 266 | ||
@@ -341,7 +341,7 @@ static inline int atomic64_add_negative(long i, atomic64_t *v) | |||
341 | 341 | ||
342 | asm volatile(LOCK_PREFIX "addq %2,%0; sets %1" | 342 | asm volatile(LOCK_PREFIX "addq %2,%0; sets %1" |
343 | : "=m" (v->counter), "=qm" (c) | 343 | : "=m" (v->counter), "=qm" (c) |
344 | : "ir" (i), "m" (v->counter) : "memory"); | 344 | : "er" (i), "m" (v->counter) : "memory"); |
345 | return c; | 345 | return c; |
346 | } | 346 | } |
347 | 347 | ||
diff --git a/include/asm-x86/genapic_32.h b/include/asm-x86/genapic_32.h index b02ea6e17de8..754d635f90ff 100644 --- a/include/asm-x86/genapic_32.h +++ b/include/asm-x86/genapic_32.h | |||
@@ -118,6 +118,7 @@ enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC}; | |||
118 | #define get_uv_system_type() UV_NONE | 118 | #define get_uv_system_type() UV_NONE |
119 | #define is_uv_system() 0 | 119 | #define is_uv_system() 0 |
120 | #define uv_wakeup_secondary(a, b) 1 | 120 | #define uv_wakeup_secondary(a, b) 1 |
121 | #define uv_system_init() do {} while (0) | ||
121 | 122 | ||
122 | 123 | ||
123 | #endif | 124 | #endif |
diff --git a/include/asm-x86/genapic_64.h b/include/asm-x86/genapic_64.h index 0f8504627c41..a47d63129135 100644 --- a/include/asm-x86/genapic_64.h +++ b/include/asm-x86/genapic_64.h | |||
@@ -42,6 +42,7 @@ extern int is_uv_system(void); | |||
42 | extern struct genapic apic_x2apic_uv_x; | 42 | extern struct genapic apic_x2apic_uv_x; |
43 | DECLARE_PER_CPU(int, x2apic_extra_bits); | 43 | DECLARE_PER_CPU(int, x2apic_extra_bits); |
44 | extern void uv_cpu_init(void); | 44 | extern void uv_cpu_init(void); |
45 | extern void uv_system_init(void); | ||
45 | extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); | 46 | extern int uv_wakeup_secondary(int phys_apicid, unsigned int start_rip); |
46 | 47 | ||
47 | extern void setup_apic_routing(void); | 48 | extern void setup_apic_routing(void); |
diff --git a/include/asm-x86/geode.h b/include/asm-x86/geode.h index bb06027fc83e..2c1cda0b8a86 100644 --- a/include/asm-x86/geode.h +++ b/include/asm-x86/geode.h | |||
@@ -50,6 +50,7 @@ extern int geode_get_dev_base(unsigned int dev); | |||
50 | #define MSR_PIC_YSEL_HIGH 0x51400021 | 50 | #define MSR_PIC_YSEL_HIGH 0x51400021 |
51 | #define MSR_PIC_ZSEL_LOW 0x51400022 | 51 | #define MSR_PIC_ZSEL_LOW 0x51400022 |
52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 | 52 | #define MSR_PIC_ZSEL_HIGH 0x51400023 |
53 | #define MSR_PIC_IRQM_LPC 0x51400025 | ||
53 | 54 | ||
54 | #define MSR_MFGPT_IRQ 0x51400028 | 55 | #define MSR_MFGPT_IRQ 0x51400028 |
55 | #define MSR_MFGPT_NR 0x51400029 | 56 | #define MSR_MFGPT_NR 0x51400029 |
@@ -237,7 +238,7 @@ static inline u16 geode_mfgpt_read(int timer, u16 reg) | |||
237 | } | 238 | } |
238 | 239 | ||
239 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); | 240 | extern int geode_mfgpt_toggle_event(int timer, int cmp, int event, int enable); |
240 | extern int geode_mfgpt_set_irq(int timer, int cmp, int irq, int enable); | 241 | extern int geode_mfgpt_set_irq(int timer, int cmp, int *irq, int enable); |
241 | extern int geode_mfgpt_alloc_timer(int timer, int domain); | 242 | extern int geode_mfgpt_alloc_timer(int timer, int domain); |
242 | 243 | ||
243 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) | 244 | #define geode_mfgpt_setup_irq(t, c, i) geode_mfgpt_set_irq((t), (c), (i), 1) |
diff --git a/include/asm-x86/i387.h b/include/asm-x86/i387.h index 6d3b21063419..56d00e31aec0 100644 --- a/include/asm-x86/i387.h +++ b/include/asm-x86/i387.h | |||
@@ -63,8 +63,6 @@ static inline int restore_fpu_checking(struct i387_fxsave_struct *fx) | |||
63 | #else | 63 | #else |
64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); | 64 | : [fx] "cdaSDb" (fx), "m" (*fx), "0" (0)); |
65 | #endif | 65 | #endif |
66 | if (unlikely(err)) | ||
67 | init_fpu(current); | ||
68 | return err; | 66 | return err; |
69 | } | 67 | } |
70 | 68 | ||
diff --git a/include/asm-x86/io.h b/include/asm-x86/io.h index bf5d629b3a39..0f954dc89cb3 100644 --- a/include/asm-x86/io.h +++ b/include/asm-x86/io.h | |||
@@ -21,7 +21,7 @@ extern void __iomem *fix_ioremap(unsigned idx, unsigned long phys); | |||
21 | 21 | ||
22 | #define build_mmio_read(name, size, type, reg, barrier) \ | 22 | #define build_mmio_read(name, size, type, reg, barrier) \ |
23 | static inline type name(const volatile void __iomem *addr) \ | 23 | static inline type name(const volatile void __iomem *addr) \ |
24 | { type ret; asm volatile("mov" size " %1,%0":"=" reg (ret) \ | 24 | { type ret; asm volatile("mov" size " %1,%0":reg (ret) \ |
25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } | 25 | :"m" (*(volatile type __force *)addr) barrier); return ret; } |
26 | 26 | ||
27 | #define build_mmio_write(name, size, type, reg, barrier) \ | 27 | #define build_mmio_write(name, size, type, reg, barrier) \ |
@@ -29,13 +29,13 @@ static inline void name(type val, volatile void __iomem *addr) \ | |||
29 | { asm volatile("mov" size " %0,%1": :reg (val), \ | 29 | { asm volatile("mov" size " %0,%1": :reg (val), \ |
30 | "m" (*(volatile type __force *)addr) barrier); } | 30 | "m" (*(volatile type __force *)addr) barrier); } |
31 | 31 | ||
32 | build_mmio_read(readb, "b", unsigned char, "q", :"memory") | 32 | build_mmio_read(readb, "b", unsigned char, "=q", :"memory") |
33 | build_mmio_read(readw, "w", unsigned short, "r", :"memory") | 33 | build_mmio_read(readw, "w", unsigned short, "=r", :"memory") |
34 | build_mmio_read(readl, "l", unsigned int, "r", :"memory") | 34 | build_mmio_read(readl, "l", unsigned int, "=r", :"memory") |
35 | 35 | ||
36 | build_mmio_read(__readb, "b", unsigned char, "q", ) | 36 | build_mmio_read(__readb, "b", unsigned char, "=q", ) |
37 | build_mmio_read(__readw, "w", unsigned short, "r", ) | 37 | build_mmio_read(__readw, "w", unsigned short, "=r", ) |
38 | build_mmio_read(__readl, "l", unsigned int, "r", ) | 38 | build_mmio_read(__readl, "l", unsigned int, "=r", ) |
39 | 39 | ||
40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") | 40 | build_mmio_write(writeb, "b", unsigned char, "q", :"memory") |
41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") | 41 | build_mmio_write(writew, "w", unsigned short, "r", :"memory") |
@@ -59,8 +59,8 @@ build_mmio_write(__writel, "l", unsigned int, "r", ) | |||
59 | #define mmiowb() barrier() | 59 | #define mmiowb() barrier() |
60 | 60 | ||
61 | #ifdef CONFIG_X86_64 | 61 | #ifdef CONFIG_X86_64 |
62 | build_mmio_read(readq, "q", unsigned long, "r", :"memory") | 62 | build_mmio_read(readq, "q", unsigned long, "=r", :"memory") |
63 | build_mmio_read(__readq, "q", unsigned long, "r", ) | 63 | build_mmio_read(__readq, "q", unsigned long, "=r", ) |
64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") | 64 | build_mmio_write(writeq, "q", unsigned long, "r", :"memory") |
65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) | 65 | build_mmio_write(__writeq, "q", unsigned long, "r", ) |
66 | 66 | ||
diff --git a/include/asm-x86/irq_vectors.h b/include/asm-x86/irq_vectors.h index b95d167b7fb2..a48c7f2dbdc0 100644 --- a/include/asm-x86/irq_vectors.h +++ b/include/asm-x86/irq_vectors.h | |||
@@ -76,6 +76,7 @@ | |||
76 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb | 76 | #define CALL_FUNCTION_SINGLE_VECTOR 0xfb |
77 | #define THERMAL_APIC_VECTOR 0xfa | 77 | #define THERMAL_APIC_VECTOR 0xfa |
78 | #define THRESHOLD_APIC_VECTOR 0xf9 | 78 | #define THRESHOLD_APIC_VECTOR 0xf9 |
79 | #define UV_BAU_MESSAGE 0xf8 | ||
79 | #define INVALIDATE_TLB_VECTOR_END 0xf7 | 80 | #define INVALIDATE_TLB_VECTOR_END 0xf7 |
80 | #define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ | 81 | #define INVALIDATE_TLB_VECTOR_START 0xf0 /* f0-f7 used for TLB flush */ |
81 | 82 | ||
diff --git a/include/asm-x86/kexec.h b/include/asm-x86/kexec.h index c0e52a14fd4d..4246ab7dc988 100644 --- a/include/asm-x86/kexec.h +++ b/include/asm-x86/kexec.h | |||
@@ -41,6 +41,10 @@ | |||
41 | # define PAGES_NR 17 | 41 | # define PAGES_NR 17 |
42 | #endif | 42 | #endif |
43 | 43 | ||
44 | #ifdef CONFIG_X86_32 | ||
45 | # define KEXEC_CONTROL_CODE_MAX_SIZE 2048 | ||
46 | #endif | ||
47 | |||
44 | #ifndef __ASSEMBLY__ | 48 | #ifndef __ASSEMBLY__ |
45 | 49 | ||
46 | #include <linux/string.h> | 50 | #include <linux/string.h> |
@@ -63,7 +67,7 @@ | |||
63 | /* Maximum address we can use for the control code buffer */ | 67 | /* Maximum address we can use for the control code buffer */ |
64 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE | 68 | # define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE |
65 | 69 | ||
66 | # define KEXEC_CONTROL_CODE_SIZE 4096 | 70 | # define KEXEC_CONTROL_PAGE_SIZE 4096 |
67 | 71 | ||
68 | /* The native architecture */ | 72 | /* The native architecture */ |
69 | # define KEXEC_ARCH KEXEC_ARCH_386 | 73 | # define KEXEC_ARCH KEXEC_ARCH_386 |
@@ -79,7 +83,7 @@ | |||
79 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) | 83 | # define KEXEC_CONTROL_MEMORY_LIMIT (0xFFFFFFFFFFUL) |
80 | 84 | ||
81 | /* Allocate one page for the pdp and the second for the code */ | 85 | /* Allocate one page for the pdp and the second for the code */ |
82 | # define KEXEC_CONTROL_CODE_SIZE (4096UL + 4096UL) | 86 | # define KEXEC_CONTROL_PAGE_SIZE (4096UL + 4096UL) |
83 | 87 | ||
84 | /* The native architecture */ | 88 | /* The native architecture */ |
85 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 | 89 | # define KEXEC_ARCH KEXEC_ARCH_X86_64 |
diff --git a/include/asm-x86/mman.h b/include/asm-x86/mman.h index c1682b542daf..90bc4108a4fd 100644 --- a/include/asm-x86/mman.h +++ b/include/asm-x86/mman.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ | 12 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ |
13 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ | 13 | #define MAP_POPULATE 0x8000 /* populate (prefault) pagetables */ |
14 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ | 14 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ |
15 | #define MAP_STACK 0x20000 /* give out an address that is best suited for process/thread stacks */ | ||
15 | 16 | ||
16 | #define MCL_CURRENT 1 /* lock all current mappings */ | 17 | #define MCL_CURRENT 1 /* lock all current mappings */ |
17 | #define MCL_FUTURE 2 /* lock all future mappings */ | 18 | #define MCL_FUTURE 2 /* lock all future mappings */ |
diff --git a/include/asm-x86/mmconfig.h b/include/asm-x86/mmconfig.h index 95beda07c6fa..e293ab81e850 100644 --- a/include/asm-x86/mmconfig.h +++ b/include/asm-x86/mmconfig.h | |||
@@ -3,7 +3,7 @@ | |||
3 | 3 | ||
4 | #ifdef CONFIG_PCI_MMCONFIG | 4 | #ifdef CONFIG_PCI_MMCONFIG |
5 | extern void __cpuinit fam10h_check_enable_mmcfg(void); | 5 | extern void __cpuinit fam10h_check_enable_mmcfg(void); |
6 | extern void __init check_enable_amd_mmconf_dmi(void); | 6 | extern void __cpuinit check_enable_amd_mmconf_dmi(void); |
7 | #else | 7 | #else |
8 | static inline void fam10h_check_enable_mmcfg(void) { } | 8 | static inline void fam10h_check_enable_mmcfg(void) { } |
9 | static inline void check_enable_amd_mmconf_dmi(void) { } | 9 | static inline void check_enable_amd_mmconf_dmi(void) { } |
diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h index b2298a227567..5862e6460658 100644 --- a/include/asm-x86/mmzone_32.h +++ b/include/asm-x86/mmzone_32.h | |||
@@ -97,10 +97,16 @@ static inline int pfn_valid(int pfn) | |||
97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) | 97 | reserve_bootmem_node(NODE_DATA(0), (addr), (size), (flags)) |
98 | #define alloc_bootmem(x) \ | 98 | #define alloc_bootmem(x) \ |
99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) | 99 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, __pa(MAX_DMA_ADDRESS)) |
100 | #define alloc_bootmem_nopanic(x) \ | ||
101 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), SMP_CACHE_BYTES, \ | ||
102 | __pa(MAX_DMA_ADDRESS)) | ||
100 | #define alloc_bootmem_low(x) \ | 103 | #define alloc_bootmem_low(x) \ |
101 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) | 104 | __alloc_bootmem_node(NODE_DATA(0), (x), SMP_CACHE_BYTES, 0) |
102 | #define alloc_bootmem_pages(x) \ | 105 | #define alloc_bootmem_pages(x) \ |
103 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) | 106 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, __pa(MAX_DMA_ADDRESS)) |
107 | #define alloc_bootmem_pages_nopanic(x) \ | ||
108 | __alloc_bootmem_node_nopanic(NODE_DATA(0), (x), PAGE_SIZE, \ | ||
109 | __pa(MAX_DMA_ADDRESS)) | ||
104 | #define alloc_bootmem_low_pages(x) \ | 110 | #define alloc_bootmem_low_pages(x) \ |
105 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) | 111 | __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0) |
106 | #define alloc_bootmem_node(pgdat, x) \ | 112 | #define alloc_bootmem_node(pgdat, x) \ |
diff --git a/include/asm-x86/percpu.h b/include/asm-x86/percpu.h index 4e91ee1e37aa..f643a3a92da0 100644 --- a/include/asm-x86/percpu.h +++ b/include/asm-x86/percpu.h | |||
@@ -182,7 +182,7 @@ do { \ | |||
182 | DEFINE_PER_CPU(_type, _name) = _initvalue; \ | 182 | DEFINE_PER_CPU(_type, _name) = _initvalue; \ |
183 | __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \ | 183 | __typeof__(_type) _name##_early_map[NR_CPUS] __initdata = \ |
184 | { [0 ... NR_CPUS-1] = _initvalue }; \ | 184 | { [0 ... NR_CPUS-1] = _initvalue }; \ |
185 | __typeof__(_type) *_name##_early_ptr = _name##_early_map | 185 | __typeof__(_type) *_name##_early_ptr __refdata = _name##_early_map |
186 | 186 | ||
187 | #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ | 187 | #define EXPORT_EARLY_PER_CPU_SYMBOL(_name) \ |
188 | EXPORT_PER_CPU_SYMBOL(_name) | 188 | EXPORT_PER_CPU_SYMBOL(_name) |
diff --git a/include/asm-x86/pgtable_64.h b/include/asm-x86/pgtable_64.h index ac5fff4cc58a..549144d03d99 100644 --- a/include/asm-x86/pgtable_64.h +++ b/include/asm-x86/pgtable_64.h | |||
@@ -151,7 +151,7 @@ static inline void native_pgd_clear(pgd_t *pgd) | |||
151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) | 151 | #define VMALLOC_END _AC(0xffffe1ffffffffff, UL) |
152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) | 152 | #define VMEMMAP_START _AC(0xffffe20000000000, UL) |
153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) | 153 | #define MODULES_VADDR _AC(0xffffffffa0000000, UL) |
154 | #define MODULES_END _AC(0xfffffffffff00000, UL) | 154 | #define MODULES_END _AC(0xffffffffff000000, UL) |
155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 155 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
156 | 156 | ||
157 | #ifndef __ASSEMBLY__ | 157 | #ifndef __ASSEMBLY__ |
diff --git a/include/asm-x86/processor.h b/include/asm-x86/processor.h index 5f58da401b43..4df3e2f6fb56 100644 --- a/include/asm-x86/processor.h +++ b/include/asm-x86/processor.h | |||
@@ -728,6 +728,29 @@ extern unsigned long boot_option_idle_override; | |||
728 | extern unsigned long idle_halt; | 728 | extern unsigned long idle_halt; |
729 | extern unsigned long idle_nomwait; | 729 | extern unsigned long idle_nomwait; |
730 | 730 | ||
731 | /* | ||
732 | * on systems with caches, caches must be flashed as the absolute | ||
733 | * last instruction before going into a suspended halt. Otherwise, | ||
734 | * dirty data can linger in the cache and become stale on resume, | ||
735 | * leading to strange errors. | ||
736 | * | ||
737 | * perform a variety of operations to guarantee that the compiler | ||
738 | * will not reorder instructions. wbinvd itself is serializing | ||
739 | * so the processor will not reorder. | ||
740 | * | ||
741 | * Systems without cache can just go into halt. | ||
742 | */ | ||
743 | static inline void wbinvd_halt(void) | ||
744 | { | ||
745 | mb(); | ||
746 | /* check for clflush to determine if wbinvd is legal */ | ||
747 | if (cpu_has_clflush) | ||
748 | asm volatile("cli; wbinvd; 1: hlt; jmp 1b" : : : "memory"); | ||
749 | else | ||
750 | while (1) | ||
751 | halt(); | ||
752 | } | ||
753 | |||
731 | extern void enable_sep_cpu(void); | 754 | extern void enable_sep_cpu(void); |
732 | extern int sysenter_setup(void); | 755 | extern int sysenter_setup(void); |
733 | 756 | ||
diff --git a/include/asm-x86/spinlock.h b/include/asm-x86/spinlock.h index 4f9a9861799a..e39c790dbfd2 100644 --- a/include/asm-x86/spinlock.h +++ b/include/asm-x86/spinlock.h | |||
@@ -65,7 +65,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
65 | { | 65 | { |
66 | int tmp = ACCESS_ONCE(lock->slock); | 66 | int tmp = ACCESS_ONCE(lock->slock); |
67 | 67 | ||
68 | return (((tmp >> 8) & 0xff) - (tmp & 0xff)) > 1; | 68 | return (((tmp >> 8) - tmp) & 0xff) > 1; |
69 | } | 69 | } |
70 | 70 | ||
71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 71 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
@@ -127,7 +127,7 @@ static inline int __ticket_spin_is_contended(raw_spinlock_t *lock) | |||
127 | { | 127 | { |
128 | int tmp = ACCESS_ONCE(lock->slock); | 128 | int tmp = ACCESS_ONCE(lock->slock); |
129 | 129 | ||
130 | return (((tmp >> 16) & 0xffff) - (tmp & 0xffff)) > 1; | 130 | return (((tmp >> 16) - tmp) & 0xffff) > 1; |
131 | } | 131 | } |
132 | 132 | ||
133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) | 133 | static __always_inline void __ticket_spin_lock(raw_spinlock_t *lock) |
diff --git a/include/asm-x86/uv/uv_bau.h b/include/asm-x86/uv/uv_bau.h index 91ac0dfb7588..610b6b308e93 100644 --- a/include/asm-x86/uv/uv_bau.h +++ b/include/asm-x86/uv/uv_bau.h | |||
@@ -40,11 +40,6 @@ | |||
40 | #define UV_ACTIVATION_DESCRIPTOR_SIZE 32 | 40 | #define UV_ACTIVATION_DESCRIPTOR_SIZE 32 |
41 | #define UV_DISTRIBUTION_SIZE 256 | 41 | #define UV_DISTRIBUTION_SIZE 256 |
42 | #define UV_SW_ACK_NPENDING 8 | 42 | #define UV_SW_ACK_NPENDING 8 |
43 | #define UV_BAU_MESSAGE 200 | ||
44 | /* | ||
45 | * Messaging irq; see irq_64.h and include/asm-x86/hw_irq_64.h | ||
46 | * To be dynamically allocated in the future | ||
47 | */ | ||
48 | #define UV_NET_ENDPOINT_INTD 0x38 | 43 | #define UV_NET_ENDPOINT_INTD 0x38 |
49 | #define UV_DESC_BASE_PNODE_SHIFT 49 | 44 | #define UV_DESC_BASE_PNODE_SHIFT 49 |
50 | #define UV_PAYLOADQ_PNODE_SHIFT 49 | 45 | #define UV_PAYLOADQ_PNODE_SHIFT 49 |
diff --git a/include/asm-x86/xen/hypervisor.h b/include/asm-x86/xen/hypervisor.h index 8e15dd28c91f..04ee0610014a 100644 --- a/include/asm-x86/xen/hypervisor.h +++ b/include/asm-x86/xen/hypervisor.h | |||
@@ -35,7 +35,6 @@ | |||
35 | 35 | ||
36 | #include <linux/types.h> | 36 | #include <linux/types.h> |
37 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
38 | #include <linux/version.h> | ||
39 | 38 | ||
40 | #include <xen/interface/xen.h> | 39 | #include <xen/interface/xen.h> |
41 | #include <xen/interface/version.h> | 40 | #include <xen/interface/version.h> |
diff --git a/include/linux/Kbuild b/include/linux/Kbuild index 327f60658d94..7d970678f940 100644 --- a/include/linux/Kbuild +++ b/include/linux/Kbuild | |||
@@ -250,6 +250,8 @@ unifdef-y += isdn.h | |||
250 | unifdef-y += isdnif.h | 250 | unifdef-y += isdnif.h |
251 | unifdef-y += isdn_divertif.h | 251 | unifdef-y += isdn_divertif.h |
252 | unifdef-y += isdn_ppp.h | 252 | unifdef-y += isdn_ppp.h |
253 | unifdef-y += ivtv.h | ||
254 | unifdef-y += ivtvfb.h | ||
253 | unifdef-y += joystick.h | 255 | unifdef-y += joystick.h |
254 | unifdef-y += kdev_t.h | 256 | unifdef-y += kdev_t.h |
255 | unifdef-y += kd.h | 257 | unifdef-y += kd.h |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 1c622e2b0504..1ce19c1ef0e9 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -46,18 +46,48 @@ enum { | |||
46 | ATA_MAX_SECTORS_TAPE = 65535, | 46 | ATA_MAX_SECTORS_TAPE = 65535, |
47 | 47 | ||
48 | ATA_ID_WORDS = 256, | 48 | ATA_ID_WORDS = 256, |
49 | ATA_ID_CONFIG = 0, | ||
50 | ATA_ID_CYLS = 1, | ||
51 | ATA_ID_HEADS = 3, | ||
52 | ATA_ID_SECTORS = 6, | ||
49 | ATA_ID_SERNO = 10, | 53 | ATA_ID_SERNO = 10, |
54 | ATA_ID_BUF_SIZE = 21, | ||
50 | ATA_ID_FW_REV = 23, | 55 | ATA_ID_FW_REV = 23, |
51 | ATA_ID_PROD = 27, | 56 | ATA_ID_PROD = 27, |
57 | ATA_ID_MAX_MULTSECT = 47, | ||
58 | ATA_ID_DWORD_IO = 48, | ||
59 | ATA_ID_CAPABILITY = 49, | ||
52 | ATA_ID_OLD_PIO_MODES = 51, | 60 | ATA_ID_OLD_PIO_MODES = 51, |
61 | ATA_ID_OLD_DMA_MODES = 52, | ||
53 | ATA_ID_FIELD_VALID = 53, | 62 | ATA_ID_FIELD_VALID = 53, |
63 | ATA_ID_CUR_CYLS = 54, | ||
64 | ATA_ID_CUR_HEADS = 55, | ||
65 | ATA_ID_CUR_SECTORS = 56, | ||
66 | ATA_ID_MULTSECT = 59, | ||
67 | ATA_ID_LBA_CAPACITY = 60, | ||
68 | ATA_ID_SWDMA_MODES = 62, | ||
54 | ATA_ID_MWDMA_MODES = 63, | 69 | ATA_ID_MWDMA_MODES = 63, |
55 | ATA_ID_PIO_MODES = 64, | 70 | ATA_ID_PIO_MODES = 64, |
56 | ATA_ID_EIDE_DMA_MIN = 65, | 71 | ATA_ID_EIDE_DMA_MIN = 65, |
72 | ATA_ID_EIDE_DMA_TIME = 66, | ||
57 | ATA_ID_EIDE_PIO = 67, | 73 | ATA_ID_EIDE_PIO = 67, |
58 | ATA_ID_EIDE_PIO_IORDY = 68, | 74 | ATA_ID_EIDE_PIO_IORDY = 68, |
59 | ATA_ID_UDMA_MODES = 88, | 75 | ATA_ID_QUEUE_DEPTH = 75, |
60 | ATA_ID_MAJOR_VER = 80, | 76 | ATA_ID_MAJOR_VER = 80, |
77 | ATA_ID_COMMAND_SET_1 = 82, | ||
78 | ATA_ID_COMMAND_SET_2 = 83, | ||
79 | ATA_ID_CFSSE = 84, | ||
80 | ATA_ID_CFS_ENABLE_1 = 85, | ||
81 | ATA_ID_CFS_ENABLE_2 = 86, | ||
82 | ATA_ID_CSF_DEFAULT = 87, | ||
83 | ATA_ID_UDMA_MODES = 88, | ||
84 | ATA_ID_HW_CONFIG = 93, | ||
85 | ATA_ID_SPG = 98, | ||
86 | ATA_ID_LBA_CAPACITY_2 = 100, | ||
87 | ATA_ID_LAST_LUN = 126, | ||
88 | ATA_ID_DLF = 128, | ||
89 | ATA_ID_CSFO = 129, | ||
90 | ATA_ID_CFA_POWER = 160, | ||
61 | ATA_ID_PIO4 = (1 << 1), | 91 | ATA_ID_PIO4 = (1 << 1), |
62 | 92 | ||
63 | ATA_ID_SERNO_LEN = 20, | 93 | ATA_ID_SERNO_LEN = 20, |
@@ -123,13 +153,26 @@ enum { | |||
123 | ATA_BUSY = (1 << 7), /* BSY status bit */ | 153 | ATA_BUSY = (1 << 7), /* BSY status bit */ |
124 | ATA_DRDY = (1 << 6), /* device ready */ | 154 | ATA_DRDY = (1 << 6), /* device ready */ |
125 | ATA_DF = (1 << 5), /* device fault */ | 155 | ATA_DF = (1 << 5), /* device fault */ |
156 | ATA_DSC = (1 << 4), /* drive seek complete */ | ||
126 | ATA_DRQ = (1 << 3), /* data request i/o */ | 157 | ATA_DRQ = (1 << 3), /* data request i/o */ |
158 | ATA_CORR = (1 << 2), /* corrected data error */ | ||
159 | ATA_IDX = (1 << 1), /* index */ | ||
127 | ATA_ERR = (1 << 0), /* have an error */ | 160 | ATA_ERR = (1 << 0), /* have an error */ |
128 | ATA_SRST = (1 << 2), /* software reset */ | 161 | ATA_SRST = (1 << 2), /* software reset */ |
129 | ATA_ICRC = (1 << 7), /* interface CRC error */ | 162 | ATA_ICRC = (1 << 7), /* interface CRC error */ |
163 | ATA_BBK = ATA_ICRC, /* pre-EIDE: block marked bad */ | ||
130 | ATA_UNC = (1 << 6), /* uncorrectable media error */ | 164 | ATA_UNC = (1 << 6), /* uncorrectable media error */ |
165 | ATA_MC = (1 << 5), /* media changed */ | ||
131 | ATA_IDNF = (1 << 4), /* ID not found */ | 166 | ATA_IDNF = (1 << 4), /* ID not found */ |
167 | ATA_MCR = (1 << 3), /* media change requested */ | ||
132 | ATA_ABORTED = (1 << 2), /* command aborted */ | 168 | ATA_ABORTED = (1 << 2), /* command aborted */ |
169 | ATA_TRK0NF = (1 << 1), /* track 0 not found */ | ||
170 | ATA_AMNF = (1 << 0), /* address mark not found */ | ||
171 | ATAPI_LFS = 0xF0, /* last failed sense */ | ||
172 | ATAPI_EOM = ATA_TRK0NF, /* end of media */ | ||
173 | ATAPI_ILI = ATA_AMNF, /* illegal length indication */ | ||
174 | ATAPI_IO = (1 << 1), | ||
175 | ATAPI_COD = (1 << 0), | ||
133 | 176 | ||
134 | /* ATA command block registers */ | 177 | /* ATA command block registers */ |
135 | ATA_REG_DATA = 0x00, | 178 | ATA_REG_DATA = 0x00, |
@@ -192,6 +235,13 @@ enum { | |||
192 | ATA_CMD_PMP_WRITE = 0xE8, | 235 | ATA_CMD_PMP_WRITE = 0xE8, |
193 | ATA_CMD_CONF_OVERLAY = 0xB1, | 236 | ATA_CMD_CONF_OVERLAY = 0xB1, |
194 | ATA_CMD_SEC_FREEZE_LOCK = 0xF5, | 237 | ATA_CMD_SEC_FREEZE_LOCK = 0xF5, |
238 | ATA_CMD_SMART = 0xB0, | ||
239 | ATA_CMD_MEDIA_LOCK = 0xDE, | ||
240 | ATA_CMD_MEDIA_UNLOCK = 0xDF, | ||
241 | /* marked obsolete in the ATA/ATAPI-7 spec */ | ||
242 | ATA_CMD_RESTORE = 0x10, | ||
243 | /* EXABYTE specific */ | ||
244 | ATA_EXABYTE_ENABLE_NEST = 0xF0, | ||
195 | 245 | ||
196 | /* READ_LOG_EXT pages */ | 246 | /* READ_LOG_EXT pages */ |
197 | ATA_LOG_SATA_NCQ = 0x10, | 247 | ATA_LOG_SATA_NCQ = 0x10, |
@@ -232,6 +282,10 @@ enum { | |||
232 | SETFEATURES_WC_ON = 0x02, /* Enable write cache */ | 282 | SETFEATURES_WC_ON = 0x02, /* Enable write cache */ |
233 | SETFEATURES_WC_OFF = 0x82, /* Disable write cache */ | 283 | SETFEATURES_WC_OFF = 0x82, /* Disable write cache */ |
234 | 284 | ||
285 | /* Enable/Disable Automatic Acoustic Management */ | ||
286 | SETFEATURES_AAM_ON = 0x42, | ||
287 | SETFEATURES_AAM_OFF = 0xC2, | ||
288 | |||
235 | SETFEATURES_SPINUP = 0x07, /* Spin-up drive */ | 289 | SETFEATURES_SPINUP = 0x07, /* Spin-up drive */ |
236 | 290 | ||
237 | SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */ | 291 | SETFEATURES_SATA_ENABLE = 0x10, /* Enable use of SATA feature */ |
@@ -254,6 +308,15 @@ enum { | |||
254 | ATA_DCO_IDENTIFY = 0xC2, | 308 | ATA_DCO_IDENTIFY = 0xC2, |
255 | ATA_DCO_SET = 0xC3, | 309 | ATA_DCO_SET = 0xC3, |
256 | 310 | ||
311 | /* feature values for SMART */ | ||
312 | ATA_SMART_ENABLE = 0xD8, | ||
313 | ATA_SMART_READ_VALUES = 0xD0, | ||
314 | ATA_SMART_READ_THRESHOLDS = 0xD1, | ||
315 | |||
316 | /* password used in LBA Mid / LBA High for executing SMART commands */ | ||
317 | ATA_SMART_LBAM_PASS = 0x4F, | ||
318 | ATA_SMART_LBAH_PASS = 0xC2, | ||
319 | |||
257 | /* ATAPI stuff */ | 320 | /* ATAPI stuff */ |
258 | ATAPI_PKT_DMA = (1 << 0), | 321 | ATAPI_PKT_DMA = (1 << 0), |
259 | ATAPI_DMADIR = (1 << 2), /* ATAPI data dir: | 322 | ATAPI_DMADIR = (1 << 2), /* ATAPI data dir: |
@@ -438,17 +501,17 @@ static inline int ata_is_data(u8 prot) | |||
438 | /* | 501 | /* |
439 | * id tests | 502 | * id tests |
440 | */ | 503 | */ |
441 | #define ata_id_is_ata(id) (((id)[0] & (1 << 15)) == 0) | 504 | #define ata_id_is_ata(id) (((id)[ATA_ID_CONFIG] & (1 << 15)) == 0) |
442 | #define ata_id_has_lba(id) ((id)[49] & (1 << 9)) | 505 | #define ata_id_has_lba(id) ((id)[ATA_ID_CAPABILITY] & (1 << 9)) |
443 | #define ata_id_has_dma(id) ((id)[49] & (1 << 8)) | 506 | #define ata_id_has_dma(id) ((id)[ATA_ID_CAPABILITY] & (1 << 8)) |
444 | #define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) | 507 | #define ata_id_has_ncq(id) ((id)[76] & (1 << 8)) |
445 | #define ata_id_queue_depth(id) (((id)[75] & 0x1f) + 1) | 508 | #define ata_id_queue_depth(id) (((id)[ATA_ID_QUEUE_DEPTH] & 0x1f) + 1) |
446 | #define ata_id_removeable(id) ((id)[0] & (1 << 7)) | 509 | #define ata_id_removeable(id) ((id)[ATA_ID_CONFIG] & (1 << 7)) |
447 | #define ata_id_has_atapi_AN(id) \ | 510 | #define ata_id_has_atapi_AN(id) \ |
448 | ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ | 511 | ( (((id)[76] != 0x0000) && ((id)[76] != 0xffff)) && \ |
449 | ((id)[78] & (1 << 5)) ) | 512 | ((id)[78] & (1 << 5)) ) |
450 | #define ata_id_iordy_disable(id) ((id)[49] & (1 << 10)) | 513 | #define ata_id_iordy_disable(id) ((id)[ATA_ID_CAPABILITY] & (1 << 10)) |
451 | #define ata_id_has_iordy(id) ((id)[49] & (1 << 11)) | 514 | #define ata_id_has_iordy(id) ((id)[ATA_ID_CAPABILITY] & (1 << 11)) |
452 | #define ata_id_u32(id,n) \ | 515 | #define ata_id_u32(id,n) \ |
453 | (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)])) | 516 | (((u32) (id)[(n) + 1] << 16) | ((u32) (id)[(n)])) |
454 | #define ata_id_u64(id,n) \ | 517 | #define ata_id_u64(id,n) \ |
@@ -457,7 +520,7 @@ static inline int ata_is_data(u8 prot) | |||
457 | ((u64) (id)[(n) + 1] << 16) | \ | 520 | ((u64) (id)[(n) + 1] << 16) | \ |
458 | ((u64) (id)[(n) + 0]) ) | 521 | ((u64) (id)[(n) + 0]) ) |
459 | 522 | ||
460 | #define ata_id_cdb_intr(id) (((id)[0] & 0x60) == 0x20) | 523 | #define ata_id_cdb_intr(id) (((id)[ATA_ID_CONFIG] & 0x60) == 0x20) |
461 | 524 | ||
462 | static inline bool ata_id_has_hipm(const u16 *id) | 525 | static inline bool ata_id_has_hipm(const u16 *id) |
463 | { | 526 | { |
@@ -482,75 +545,75 @@ static inline bool ata_id_has_dipm(const u16 *id) | |||
482 | 545 | ||
483 | static inline int ata_id_has_fua(const u16 *id) | 546 | static inline int ata_id_has_fua(const u16 *id) |
484 | { | 547 | { |
485 | if ((id[84] & 0xC000) != 0x4000) | 548 | if ((id[ATA_ID_CFSSE] & 0xC000) != 0x4000) |
486 | return 0; | 549 | return 0; |
487 | return id[84] & (1 << 6); | 550 | return id[ATA_ID_CFSSE] & (1 << 6); |
488 | } | 551 | } |
489 | 552 | ||
490 | static inline int ata_id_has_flush(const u16 *id) | 553 | static inline int ata_id_has_flush(const u16 *id) |
491 | { | 554 | { |
492 | if ((id[83] & 0xC000) != 0x4000) | 555 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
493 | return 0; | 556 | return 0; |
494 | return id[83] & (1 << 12); | 557 | return id[ATA_ID_COMMAND_SET_2] & (1 << 12); |
495 | } | 558 | } |
496 | 559 | ||
497 | static inline int ata_id_has_flush_ext(const u16 *id) | 560 | static inline int ata_id_has_flush_ext(const u16 *id) |
498 | { | 561 | { |
499 | if ((id[83] & 0xC000) != 0x4000) | 562 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
500 | return 0; | 563 | return 0; |
501 | return id[83] & (1 << 13); | 564 | return id[ATA_ID_COMMAND_SET_2] & (1 << 13); |
502 | } | 565 | } |
503 | 566 | ||
504 | static inline int ata_id_has_lba48(const u16 *id) | 567 | static inline int ata_id_has_lba48(const u16 *id) |
505 | { | 568 | { |
506 | if ((id[83] & 0xC000) != 0x4000) | 569 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
507 | return 0; | 570 | return 0; |
508 | if (!ata_id_u64(id, 100)) | 571 | if (!ata_id_u64(id, ATA_ID_LBA_CAPACITY_2)) |
509 | return 0; | 572 | return 0; |
510 | return id[83] & (1 << 10); | 573 | return id[ATA_ID_COMMAND_SET_2] & (1 << 10); |
511 | } | 574 | } |
512 | 575 | ||
513 | static inline int ata_id_hpa_enabled(const u16 *id) | 576 | static inline int ata_id_hpa_enabled(const u16 *id) |
514 | { | 577 | { |
515 | /* Yes children, word 83 valid bits cover word 82 data */ | 578 | /* Yes children, word 83 valid bits cover word 82 data */ |
516 | if ((id[83] & 0xC000) != 0x4000) | 579 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
517 | return 0; | 580 | return 0; |
518 | /* And 87 covers 85-87 */ | 581 | /* And 87 covers 85-87 */ |
519 | if ((id[87] & 0xC000) != 0x4000) | 582 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
520 | return 0; | 583 | return 0; |
521 | /* Check command sets enabled as well as supported */ | 584 | /* Check command sets enabled as well as supported */ |
522 | if ((id[85] & ( 1 << 10)) == 0) | 585 | if ((id[ATA_ID_CFS_ENABLE_1] & (1 << 10)) == 0) |
523 | return 0; | 586 | return 0; |
524 | return id[82] & (1 << 10); | 587 | return id[ATA_ID_COMMAND_SET_1] & (1 << 10); |
525 | } | 588 | } |
526 | 589 | ||
527 | static inline int ata_id_has_wcache(const u16 *id) | 590 | static inline int ata_id_has_wcache(const u16 *id) |
528 | { | 591 | { |
529 | /* Yes children, word 83 valid bits cover word 82 data */ | 592 | /* Yes children, word 83 valid bits cover word 82 data */ |
530 | if ((id[83] & 0xC000) != 0x4000) | 593 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
531 | return 0; | 594 | return 0; |
532 | return id[82] & (1 << 5); | 595 | return id[ATA_ID_COMMAND_SET_1] & (1 << 5); |
533 | } | 596 | } |
534 | 597 | ||
535 | static inline int ata_id_has_pm(const u16 *id) | 598 | static inline int ata_id_has_pm(const u16 *id) |
536 | { | 599 | { |
537 | if ((id[83] & 0xC000) != 0x4000) | 600 | if ((id[ATA_ID_COMMAND_SET_2] & 0xC000) != 0x4000) |
538 | return 0; | 601 | return 0; |
539 | return id[82] & (1 << 3); | 602 | return id[ATA_ID_COMMAND_SET_1] & (1 << 3); |
540 | } | 603 | } |
541 | 604 | ||
542 | static inline int ata_id_rahead_enabled(const u16 *id) | 605 | static inline int ata_id_rahead_enabled(const u16 *id) |
543 | { | 606 | { |
544 | if ((id[87] & 0xC000) != 0x4000) | 607 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
545 | return 0; | 608 | return 0; |
546 | return id[85] & (1 << 6); | 609 | return id[ATA_ID_CFS_ENABLE_1] & (1 << 6); |
547 | } | 610 | } |
548 | 611 | ||
549 | static inline int ata_id_wcache_enabled(const u16 *id) | 612 | static inline int ata_id_wcache_enabled(const u16 *id) |
550 | { | 613 | { |
551 | if ((id[87] & 0xC000) != 0x4000) | 614 | if ((id[ATA_ID_CSF_DEFAULT] & 0xC000) != 0x4000) |
552 | return 0; | 615 | return 0; |
553 | return id[85] & (1 << 5); | 616 | return id[ATA_ID_CFS_ENABLE_1] & (1 << 5); |
554 | } | 617 | } |
555 | 618 | ||
556 | /** | 619 | /** |
@@ -581,7 +644,7 @@ static inline unsigned int ata_id_major_version(const u16 *id) | |||
581 | 644 | ||
582 | static inline int ata_id_is_sata(const u16 *id) | 645 | static inline int ata_id_is_sata(const u16 *id) |
583 | { | 646 | { |
584 | return ata_id_major_version(id) >= 5 && id[93] == 0; | 647 | return ata_id_major_version(id) >= 5 && id[ATA_ID_HW_CONFIG] == 0; |
585 | } | 648 | } |
586 | 649 | ||
587 | static inline int ata_id_has_tpm(const u16 *id) | 650 | static inline int ata_id_has_tpm(const u16 *id) |
@@ -599,7 +662,7 @@ static inline int ata_id_has_dword_io(const u16 *id) | |||
599 | /* ATA 8 reuses this flag for "trusted" computing */ | 662 | /* ATA 8 reuses this flag for "trusted" computing */ |
600 | if (ata_id_major_version(id) > 7) | 663 | if (ata_id_major_version(id) > 7) |
601 | return 0; | 664 | return 0; |
602 | if (id[48] & (1 << 0)) | 665 | if (id[ATA_ID_DWORD_IO] & (1 << 0)) |
603 | return 1; | 666 | return 1; |
604 | return 0; | 667 | return 0; |
605 | } | 668 | } |
@@ -608,22 +671,22 @@ static inline int ata_id_current_chs_valid(const u16 *id) | |||
608 | { | 671 | { |
609 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command | 672 | /* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command |
610 | has not been issued to the device then the values of | 673 | has not been issued to the device then the values of |
611 | id[54] to id[56] are vendor specific. */ | 674 | id[ATA_ID_CUR_CYLS] to id[ATA_ID_CUR_SECTORS] are vendor specific. */ |
612 | return (id[53] & 0x01) && /* Current translation valid */ | 675 | return (id[ATA_ID_FIELD_VALID] & 1) && /* Current translation valid */ |
613 | id[54] && /* cylinders in current translation */ | 676 | id[ATA_ID_CUR_CYLS] && /* cylinders in current translation */ |
614 | id[55] && /* heads in current translation */ | 677 | id[ATA_ID_CUR_HEADS] && /* heads in current translation */ |
615 | id[55] <= 16 && | 678 | id[ATA_ID_CUR_HEADS] <= 16 && |
616 | id[56]; /* sectors in current translation */ | 679 | id[ATA_ID_CUR_SECTORS]; /* sectors in current translation */ |
617 | } | 680 | } |
618 | 681 | ||
619 | static inline int ata_id_is_cfa(const u16 *id) | 682 | static inline int ata_id_is_cfa(const u16 *id) |
620 | { | 683 | { |
621 | u16 v = id[0]; | 684 | if (id[ATA_ID_CONFIG] == 0x848A) /* Standard CF */ |
622 | if (v == 0x848A) /* Standard CF */ | ||
623 | return 1; | 685 | return 1; |
624 | /* Could be CF hiding as standard ATA */ | 686 | /* Could be CF hiding as standard ATA */ |
625 | if (ata_id_major_version(id) >= 3 && id[82] != 0xFFFF && | 687 | if (ata_id_major_version(id) >= 3 && |
626 | (id[82] & ( 1 << 2))) | 688 | id[ATA_ID_COMMAND_SET_1] != 0xFFFF && |
689 | (id[ATA_ID_COMMAND_SET_1] & (1 << 2))) | ||
627 | return 1; | 690 | return 1; |
628 | return 0; | 691 | return 0; |
629 | } | 692 | } |
@@ -632,21 +695,21 @@ static inline int ata_drive_40wire(const u16 *dev_id) | |||
632 | { | 695 | { |
633 | if (ata_id_is_sata(dev_id)) | 696 | if (ata_id_is_sata(dev_id)) |
634 | return 0; /* SATA */ | 697 | return 0; /* SATA */ |
635 | if ((dev_id[93] & 0xE000) == 0x6000) | 698 | if ((dev_id[ATA_ID_HW_CONFIG] & 0xE000) == 0x6000) |
636 | return 0; /* 80 wire */ | 699 | return 0; /* 80 wire */ |
637 | return 1; | 700 | return 1; |
638 | } | 701 | } |
639 | 702 | ||
640 | static inline int ata_drive_40wire_relaxed(const u16 *dev_id) | 703 | static inline int ata_drive_40wire_relaxed(const u16 *dev_id) |
641 | { | 704 | { |
642 | if ((dev_id[93] & 0x2000) == 0x2000) | 705 | if ((dev_id[ATA_ID_HW_CONFIG] & 0x2000) == 0x2000) |
643 | return 0; /* 80 wire */ | 706 | return 0; /* 80 wire */ |
644 | return 1; | 707 | return 1; |
645 | } | 708 | } |
646 | 709 | ||
647 | static inline int atapi_cdb_len(const u16 *dev_id) | 710 | static inline int atapi_cdb_len(const u16 *dev_id) |
648 | { | 711 | { |
649 | u16 tmp = dev_id[0] & 0x3; | 712 | u16 tmp = dev_id[ATA_ID_CONFIG] & 0x3; |
650 | switch (tmp) { | 713 | switch (tmp) { |
651 | case 0: return 12; | 714 | case 0: return 12; |
652 | case 1: return 16; | 715 | case 1: return 16; |
@@ -656,7 +719,7 @@ static inline int atapi_cdb_len(const u16 *dev_id) | |||
656 | 719 | ||
657 | static inline int atapi_command_packet_set(const u16 *dev_id) | 720 | static inline int atapi_command_packet_set(const u16 *dev_id) |
658 | { | 721 | { |
659 | return (dev_id[0] >> 8) & 0x1f; | 722 | return (dev_id[ATA_ID_CONFIG] >> 8) & 0x1f; |
660 | } | 723 | } |
661 | 724 | ||
662 | static inline int atapi_id_dmadir(const u16 *dev_id) | 725 | static inline int atapi_id_dmadir(const u16 *dev_id) |
diff --git a/include/linux/capability.h b/include/linux/capability.h index 02673846d205..9d1fe30b6f6c 100644 --- a/include/linux/capability.h +++ b/include/linux/capability.h | |||
@@ -503,8 +503,19 @@ extern const kernel_cap_t __cap_init_eff_set; | |||
503 | 503 | ||
504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); | 504 | kernel_cap_t cap_set_effective(const kernel_cap_t pE_new); |
505 | 505 | ||
506 | int capable(int cap); | 506 | /** |
507 | int __capable(struct task_struct *t, int cap); | 507 | * has_capability - Determine if a task has a superior capability available |
508 | * @t: The task in question | ||
509 | * @cap: The capability to be tested for | ||
510 | * | ||
511 | * Return true if the specified task has the given superior capability | ||
512 | * currently in effect, false if not. | ||
513 | * | ||
514 | * Note that this does not set PF_SUPERPRIV on the task. | ||
515 | */ | ||
516 | #define has_capability(t, cap) (security_capable((t), (cap)) == 0) | ||
517 | |||
518 | extern int capable(int cap); | ||
508 | 519 | ||
509 | #endif /* __KERNEL__ */ | 520 | #endif /* __KERNEL__ */ |
510 | 521 | ||
diff --git a/include/linux/completion.h b/include/linux/completion.h index 57faa60de9bd..02ef8835999c 100644 --- a/include/linux/completion.h +++ b/include/linux/completion.h | |||
@@ -49,6 +49,8 @@ extern unsigned long wait_for_completion_timeout(struct completion *x, | |||
49 | unsigned long timeout); | 49 | unsigned long timeout); |
50 | extern unsigned long wait_for_completion_interruptible_timeout( | 50 | extern unsigned long wait_for_completion_interruptible_timeout( |
51 | struct completion *x, unsigned long timeout); | 51 | struct completion *x, unsigned long timeout); |
52 | extern bool try_wait_for_completion(struct completion *x); | ||
53 | extern bool completion_done(struct completion *x); | ||
52 | 54 | ||
53 | extern void complete(struct completion *); | 55 | extern void complete(struct completion *); |
54 | extern void complete_all(struct completion *); | 56 | extern void complete_all(struct completion *); |
@@ -56,48 +58,4 @@ extern void complete_all(struct completion *); | |||
56 | #define INIT_COMPLETION(x) ((x).done = 0) | 58 | #define INIT_COMPLETION(x) ((x).done = 0) |
57 | 59 | ||
58 | 60 | ||
59 | /** | ||
60 | * try_wait_for_completion - try to decrement a completion without blocking | ||
61 | * @x: completion structure | ||
62 | * | ||
63 | * Returns: 0 if a decrement cannot be done without blocking | ||
64 | * 1 if a decrement succeeded. | ||
65 | * | ||
66 | * If a completion is being used as a counting completion, | ||
67 | * attempt to decrement the counter without blocking. This | ||
68 | * enables us to avoid waiting if the resource the completion | ||
69 | * is protecting is not available. | ||
70 | */ | ||
71 | static inline bool try_wait_for_completion(struct completion *x) | ||
72 | { | ||
73 | int ret = 1; | ||
74 | |||
75 | spin_lock_irq(&x->wait.lock); | ||
76 | if (!x->done) | ||
77 | ret = 0; | ||
78 | else | ||
79 | x->done--; | ||
80 | spin_unlock_irq(&x->wait.lock); | ||
81 | return ret; | ||
82 | } | ||
83 | |||
84 | /** | ||
85 | * completion_done - Test to see if a completion has any waiters | ||
86 | * @x: completion structure | ||
87 | * | ||
88 | * Returns: 0 if there are waiters (wait_for_completion() in progress) | ||
89 | * 1 if there are no waiters. | ||
90 | * | ||
91 | */ | ||
92 | static inline bool completion_done(struct completion *x) | ||
93 | { | ||
94 | int ret = 1; | ||
95 | |||
96 | spin_lock_irq(&x->wait.lock); | ||
97 | if (!x->done) | ||
98 | ret = 0; | ||
99 | spin_unlock_irq(&x->wait.lock); | ||
100 | return ret; | ||
101 | } | ||
102 | |||
103 | #endif | 61 | #endif |
diff --git a/include/linux/device.h b/include/linux/device.h index d24a47f80f9c..4d8372d135df 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -358,6 +358,7 @@ struct device { | |||
358 | 358 | ||
359 | struct kobject kobj; | 359 | struct kobject kobj; |
360 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ | 360 | char bus_id[BUS_ID_SIZE]; /* position on parent bus */ |
361 | const char *init_name; /* initial name of the device */ | ||
361 | struct device_type *type; | 362 | struct device_type *type; |
362 | unsigned uevent_suppress:1; | 363 | unsigned uevent_suppress:1; |
363 | 364 | ||
@@ -406,7 +407,7 @@ struct device { | |||
406 | /* Get the wakeup routines, which depend on struct device */ | 407 | /* Get the wakeup routines, which depend on struct device */ |
407 | #include <linux/pm_wakeup.h> | 408 | #include <linux/pm_wakeup.h> |
408 | 409 | ||
409 | static inline const char *dev_name(struct device *dev) | 410 | static inline const char *dev_name(const struct device *dev) |
410 | { | 411 | { |
411 | /* will be changed into kobject_name(&dev->kobj) in the near future */ | 412 | /* will be changed into kobject_name(&dev->kobj) in the near future */ |
412 | return dev->bus_id; | 413 | return dev->bus_id; |
@@ -518,7 +519,7 @@ extern void device_shutdown(void); | |||
518 | extern void sysdev_shutdown(void); | 519 | extern void sysdev_shutdown(void); |
519 | 520 | ||
520 | /* debugging and troubleshooting/diagnostic helpers. */ | 521 | /* debugging and troubleshooting/diagnostic helpers. */ |
521 | extern const char *dev_driver_string(struct device *dev); | 522 | extern const char *dev_driver_string(const struct device *dev); |
522 | #define dev_printk(level, dev, format, arg...) \ | 523 | #define dev_printk(level, dev, format, arg...) \ |
523 | printk(level "%s %s: " format , dev_driver_string(dev) , \ | 524 | printk(level "%s %s: " format , dev_driver_string(dev) , \ |
524 | dev_name(dev) , ## arg) | 525 | dev_name(dev) , ## arg) |
diff --git a/include/linux/exportfs.h b/include/linux/exportfs.h index f5abd1306638..27e772cefb6a 100644 --- a/include/linux/exportfs.h +++ b/include/linux/exportfs.h | |||
@@ -35,6 +35,27 @@ enum fid_type { | |||
35 | FILEID_INO32_GEN_PARENT = 2, | 35 | FILEID_INO32_GEN_PARENT = 2, |
36 | 36 | ||
37 | /* | 37 | /* |
38 | * 64 bit object ID, 64 bit root object ID, | ||
39 | * 32 bit generation number. | ||
40 | */ | ||
41 | FILEID_BTRFS_WITHOUT_PARENT = 0x4d, | ||
42 | |||
43 | /* | ||
44 | * 64 bit object ID, 64 bit root object ID, | ||
45 | * 32 bit generation number, | ||
46 | * 64 bit parent object ID, 32 bit parent generation. | ||
47 | */ | ||
48 | FILEID_BTRFS_WITH_PARENT = 0x4e, | ||
49 | |||
50 | /* | ||
51 | * 64 bit object ID, 64 bit root object ID, | ||
52 | * 32 bit generation number, | ||
53 | * 64 bit parent object ID, 32 bit parent generation, | ||
54 | * 64 bit parent root object ID. | ||
55 | */ | ||
56 | FILEID_BTRFS_WITH_PARENT_ROOT = 0x4f, | ||
57 | |||
58 | /* | ||
38 | * 32 bit block number, 16 bit partition reference, | 59 | * 32 bit block number, 16 bit partition reference, |
39 | * 16 bit unused, 32 bit generation number. | 60 | * 16 bit unused, 32 bit generation number. |
40 | */ | 61 | */ |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 3b8870e32afd..531ccd5f5960 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
@@ -976,6 +976,9 @@ static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, | |||
976 | 976 | ||
977 | /* drivers/video/fb_defio.c */ | 977 | /* drivers/video/fb_defio.c */ |
978 | extern void fb_deferred_io_init(struct fb_info *info); | 978 | extern void fb_deferred_io_init(struct fb_info *info); |
979 | extern void fb_deferred_io_open(struct fb_info *info, | ||
980 | struct inode *inode, | ||
981 | struct file *file); | ||
979 | extern void fb_deferred_io_cleanup(struct fb_info *info); | 982 | extern void fb_deferred_io_cleanup(struct fb_info *info); |
980 | extern int fb_deferred_io_fsync(struct file *file, struct dentry *dentry, | 983 | extern int fb_deferred_io_fsync(struct file *file, struct dentry *dentry, |
981 | int datasync); | 984 | int datasync); |
diff --git a/include/linux/fs_uart_pd.h b/include/linux/fs_uart_pd.h index 809bb9ffc788..36b61ff39277 100644 --- a/include/linux/fs_uart_pd.h +++ b/include/linux/fs_uart_pd.h | |||
@@ -12,7 +12,6 @@ | |||
12 | #ifndef FS_UART_PD_H | 12 | #ifndef FS_UART_PD_H |
13 | #define FS_UART_PD_H | 13 | #define FS_UART_PD_H |
14 | 14 | ||
15 | #include <linux/version.h> | ||
16 | #include <asm/types.h> | 15 | #include <asm/types.h> |
17 | 16 | ||
18 | enum fs_uart_id { | 17 | enum fs_uart_id { |
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index f368d041e02d..bb384068272e 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -98,6 +98,27 @@ static inline void tracer_disable(void) | |||
98 | #endif | 98 | #endif |
99 | } | 99 | } |
100 | 100 | ||
101 | /* Ftrace disable/restore without lock. Some synchronization mechanism | ||
102 | * must be used to prevent ftrace_enabled to be changed between | ||
103 | * disable/restore. */ | ||
104 | static inline int __ftrace_enabled_save(void) | ||
105 | { | ||
106 | #ifdef CONFIG_FTRACE | ||
107 | int saved_ftrace_enabled = ftrace_enabled; | ||
108 | ftrace_enabled = 0; | ||
109 | return saved_ftrace_enabled; | ||
110 | #else | ||
111 | return 0; | ||
112 | #endif | ||
113 | } | ||
114 | |||
115 | static inline void __ftrace_enabled_restore(int enabled) | ||
116 | { | ||
117 | #ifdef CONFIG_FTRACE | ||
118 | ftrace_enabled = enabled; | ||
119 | #endif | ||
120 | } | ||
121 | |||
101 | #ifdef CONFIG_FRAME_POINTER | 122 | #ifdef CONFIG_FRAME_POINTER |
102 | /* TODO: need to fix this for ARM */ | 123 | /* TODO: need to fix this for ARM */ |
103 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) | 124 | # define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0)) |
diff --git a/include/linux/if_tun.h b/include/linux/if_tun.h index 4c6307ad9fdb..8529f57ba263 100644 --- a/include/linux/if_tun.h +++ b/include/linux/if_tun.h | |||
@@ -45,6 +45,7 @@ | |||
45 | #define TUNGETFEATURES _IOR('T', 207, unsigned int) | 45 | #define TUNGETFEATURES _IOR('T', 207, unsigned int) |
46 | #define TUNSETOFFLOAD _IOW('T', 208, unsigned int) | 46 | #define TUNSETOFFLOAD _IOW('T', 208, unsigned int) |
47 | #define TUNSETTXFILTER _IOW('T', 209, unsigned int) | 47 | #define TUNSETTXFILTER _IOW('T', 209, unsigned int) |
48 | #define TUNGETIFF _IOR('T', 210, unsigned int) | ||
48 | 49 | ||
49 | /* TUNSETIFF ifr flags */ | 50 | /* TUNSETIFF ifr flags */ |
50 | #define IFF_TUN 0x0001 | 51 | #define IFF_TUN 0x0001 |
diff --git a/include/linux/ivtv.h b/include/linux/ivtv.h index 794b8daa9378..17ca64b5a66c 100644 --- a/include/linux/ivtv.h +++ b/include/linux/ivtv.h | |||
@@ -21,11 +21,7 @@ | |||
21 | #ifndef __LINUX_IVTV_H__ | 21 | #ifndef __LINUX_IVTV_H__ |
22 | #define __LINUX_IVTV_H__ | 22 | #define __LINUX_IVTV_H__ |
23 | 23 | ||
24 | #ifdef __KERNEL__ | 24 | #include <linux/compiler.h> |
25 | #include <linux/compiler.h> /* need __user */ | ||
26 | #else | ||
27 | #define __user | ||
28 | #endif | ||
29 | #include <linux/types.h> | 25 | #include <linux/types.h> |
30 | 26 | ||
31 | /* ivtv knows several distinct output modes: MPEG streaming, | 27 | /* ivtv knows several distinct output modes: MPEG streaming, |
diff --git a/include/linux/ivtvfb.h b/include/linux/ivtvfb.h index e980ba62ddcc..e20af47b59ad 100644 --- a/include/linux/ivtvfb.h +++ b/include/linux/ivtvfb.h | |||
@@ -21,11 +21,7 @@ | |||
21 | #ifndef __LINUX_IVTVFB_H__ | 21 | #ifndef __LINUX_IVTVFB_H__ |
22 | #define __LINUX_IVTVFB_H__ | 22 | #define __LINUX_IVTVFB_H__ |
23 | 23 | ||
24 | #ifdef __KERNEL__ | 24 | #include <linux/compiler.h> |
25 | #include <linux/compiler.h> /* need __user */ | ||
26 | #else | ||
27 | #define __user | ||
28 | #endif | ||
29 | #include <linux/types.h> | 25 | #include <linux/types.h> |
30 | 26 | ||
31 | /* Framebuffer external API */ | 27 | /* Framebuffer external API */ |
diff --git a/include/linux/kexec.h b/include/linux/kexec.h index 32110cede64f..17f76fc05173 100644 --- a/include/linux/kexec.h +++ b/include/linux/kexec.h | |||
@@ -25,8 +25,8 @@ | |||
25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined | 25 | #error KEXEC_CONTROL_MEMORY_LIMIT not defined |
26 | #endif | 26 | #endif |
27 | 27 | ||
28 | #ifndef KEXEC_CONTROL_CODE_SIZE | 28 | #ifndef KEXEC_CONTROL_PAGE_SIZE |
29 | #error KEXEC_CONTROL_CODE_SIZE not defined | 29 | #error KEXEC_CONTROL_PAGE_SIZE not defined |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | #ifndef KEXEC_ARCH | 32 | #ifndef KEXEC_ARCH |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 06b80337303b..225bfc5bd9ec 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -163,6 +163,7 @@ enum { | |||
163 | ATA_DEV_NONE = 9, /* no device */ | 163 | ATA_DEV_NONE = 9, /* no device */ |
164 | 164 | ||
165 | /* struct ata_link flags */ | 165 | /* struct ata_link flags */ |
166 | ATA_LFLAG_NO_HRST = (1 << 1), /* avoid hardreset */ | ||
166 | ATA_LFLAG_NO_SRST = (1 << 2), /* avoid softreset */ | 167 | ATA_LFLAG_NO_SRST = (1 << 2), /* avoid softreset */ |
167 | ATA_LFLAG_ASSUME_ATA = (1 << 3), /* assume ATA class */ | 168 | ATA_LFLAG_ASSUME_ATA = (1 << 3), /* assume ATA class */ |
168 | ATA_LFLAG_ASSUME_SEMB = (1 << 4), /* assume SEMB class */ | 169 | ATA_LFLAG_ASSUME_SEMB = (1 << 4), /* assume SEMB class */ |
@@ -646,6 +647,7 @@ struct ata_link { | |||
646 | 647 | ||
647 | unsigned int flags; /* ATA_LFLAG_xxx */ | 648 | unsigned int flags; /* ATA_LFLAG_xxx */ |
648 | 649 | ||
650 | u32 saved_scontrol; /* SControl on probe */ | ||
649 | unsigned int hw_sata_spd_limit; | 651 | unsigned int hw_sata_spd_limit; |
650 | unsigned int sata_spd_limit; | 652 | unsigned int sata_spd_limit; |
651 | unsigned int sata_spd; /* current SATA PHY speed */ | 653 | unsigned int sata_spd; /* current SATA PHY speed */ |
@@ -1427,6 +1429,28 @@ static inline unsigned long ata_deadline(unsigned long from_jiffies, | |||
1427 | return from_jiffies + msecs_to_jiffies(timeout_msecs); | 1429 | return from_jiffies + msecs_to_jiffies(timeout_msecs); |
1428 | } | 1430 | } |
1429 | 1431 | ||
1432 | /* Don't open code these in drivers as there are traps. Firstly the range may | ||
1433 | change in future hardware and specs, secondly 0xFF means 'no DMA' but is | ||
1434 | > UDMA_0. Dyma ddreigiau */ | ||
1435 | |||
1436 | static inline int ata_using_mwdma(struct ata_device *adev) | ||
1437 | { | ||
1438 | if (adev->dma_mode >= XFER_MW_DMA_0 && adev->dma_mode <= XFER_MW_DMA_4) | ||
1439 | return 1; | ||
1440 | return 0; | ||
1441 | } | ||
1442 | |||
1443 | static inline int ata_using_udma(struct ata_device *adev) | ||
1444 | { | ||
1445 | if (adev->dma_mode >= XFER_UDMA_0 && adev->dma_mode <= XFER_UDMA_7) | ||
1446 | return 1; | ||
1447 | return 0; | ||
1448 | } | ||
1449 | |||
1450 | static inline int ata_dma_enabled(struct ata_device *adev) | ||
1451 | { | ||
1452 | return (adev->dma_mode == 0xFF ? 0 : 1); | ||
1453 | } | ||
1430 | 1454 | ||
1431 | /************************************************************************** | 1455 | /************************************************************************** |
1432 | * PMP - drivers/ata/libata-pmp.c | 1456 | * PMP - drivers/ata/libata-pmp.c |
diff --git a/include/linux/mm.h b/include/linux/mm.h index fa651609b65d..72a15dc26bbf 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -73,7 +73,7 @@ extern unsigned int kobjsize(const void *objp); | |||
73 | #endif | 73 | #endif |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * vm_flags.. | 76 | * vm_flags in vm_area_struct, see mm_types.h. |
77 | */ | 77 | */ |
78 | #define VM_READ 0x00000001 /* currently active flags */ | 78 | #define VM_READ 0x00000001 /* currently active flags */ |
79 | #define VM_WRITE 0x00000002 | 79 | #define VM_WRITE 0x00000002 |
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 386edbe2cb4e..bf334138c7c1 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h | |||
@@ -113,7 +113,7 @@ struct vm_area_struct { | |||
113 | struct vm_area_struct *vm_next; | 113 | struct vm_area_struct *vm_next; |
114 | 114 | ||
115 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ | 115 | pgprot_t vm_page_prot; /* Access permissions of this VMA. */ |
116 | unsigned long vm_flags; /* Flags, listed below. */ | 116 | unsigned long vm_flags; /* Flags, see mm.h. */ |
117 | 117 | ||
118 | struct rb_node vm_rb; | 118 | struct rb_node vm_rb; |
119 | 119 | ||
diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h index 3ba25065fa96..8837928fbf33 100644 --- a/include/linux/pci-acpi.h +++ b/include/linux/pci-acpi.h | |||
@@ -57,6 +57,15 @@ static inline acpi_status pcie_osc_support_set(u32 flags) | |||
57 | { | 57 | { |
58 | return __pci_osc_support_set(flags, PCI_EXPRESS_ROOT_HID_STRING); | 58 | return __pci_osc_support_set(flags, PCI_EXPRESS_ROOT_HID_STRING); |
59 | } | 59 | } |
60 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) | ||
61 | { | ||
62 | /* Find root host bridge */ | ||
63 | while (pdev->bus->self) | ||
64 | pdev = pdev->bus->self; | ||
65 | |||
66 | return acpi_get_pci_rootbridge_handle(pci_domain_nr(pdev->bus), | ||
67 | pdev->bus->number); | ||
68 | } | ||
60 | #else | 69 | #else |
61 | #if !defined(AE_ERROR) | 70 | #if !defined(AE_ERROR) |
62 | typedef u32 acpi_status; | 71 | typedef u32 acpi_status; |
@@ -66,6 +75,8 @@ static inline acpi_status pci_osc_control_set(acpi_handle handle, u32 flags) | |||
66 | {return AE_ERROR;} | 75 | {return AE_ERROR;} |
67 | static inline acpi_status pci_osc_support_set(u32 flags) {return AE_ERROR;} | 76 | static inline acpi_status pci_osc_support_set(u32 flags) {return AE_ERROR;} |
68 | static inline acpi_status pcie_osc_support_set(u32 flags) {return AE_ERROR;} | 77 | static inline acpi_status pcie_osc_support_set(u32 flags) {return AE_ERROR;} |
78 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) | ||
79 | { return NULL; } | ||
69 | #endif | 80 | #endif |
70 | 81 | ||
71 | #endif /* _PCI_ACPI_H_ */ | 82 | #endif /* _PCI_ACPI_H_ */ |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 9ec2bcce8e83..f1624b396754 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -2428,6 +2428,9 @@ | |||
2428 | #define PCI_DEVICE_ID_INTEL_ICH10_3 0x3a1a | 2428 | #define PCI_DEVICE_ID_INTEL_ICH10_3 0x3a1a |
2429 | #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 | 2429 | #define PCI_DEVICE_ID_INTEL_ICH10_4 0x3a30 |
2430 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 | 2430 | #define PCI_DEVICE_ID_INTEL_ICH10_5 0x3a60 |
2431 | #define PCI_DEVICE_ID_INTEL_PCH_0 0x3b10 | ||
2432 | #define PCI_DEVICE_ID_INTEL_PCH_1 0x3b11 | ||
2433 | #define PCI_DEVICE_ID_INTEL_PCH_2 0x3b30 | ||
2431 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f | 2434 | #define PCI_DEVICE_ID_INTEL_IOAT_SNB 0x402f |
2432 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 | 2435 | #define PCI_DEVICE_ID_INTEL_5100_16 0x65f0 |
2433 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 | 2436 | #define PCI_DEVICE_ID_INTEL_5100_21 0x65f5 |
diff --git a/include/linux/pid.h b/include/linux/pid.h index 22921ac4cfd9..d7e98ff8021e 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h | |||
@@ -161,4 +161,13 @@ pid_t pid_vnr(struct pid *pid); | |||
161 | } \ | 161 | } \ |
162 | } while (0) | 162 | } while (0) |
163 | 163 | ||
164 | #define do_each_pid_thread(pid, type, task) \ | ||
165 | do_each_pid_task(pid, type, task) { \ | ||
166 | struct task_struct *tg___ = task; \ | ||
167 | do { | ||
168 | |||
169 | #define while_each_pid_thread(pid, type, task) \ | ||
170 | } while_each_thread(tg___, task); \ | ||
171 | task = tg___; \ | ||
172 | } while_each_pid_task(pid, type, task) | ||
164 | #endif /* _LINUX_PID_H */ | 173 | #endif /* _LINUX_PID_H */ |
diff --git a/include/linux/reboot.h b/include/linux/reboot.h index b93b541cf111..988e55fe649b 100644 --- a/include/linux/reboot.h +++ b/include/linux/reboot.h | |||
@@ -59,6 +59,7 @@ extern void machine_crash_shutdown(struct pt_regs *); | |||
59 | * Architecture independent implemenations of sys_reboot commands. | 59 | * Architecture independent implemenations of sys_reboot commands. |
60 | */ | 60 | */ |
61 | 61 | ||
62 | extern void kernel_restart_prepare(char *cmd); | ||
62 | extern void kernel_restart(char *cmd); | 63 | extern void kernel_restart(char *cmd); |
63 | extern void kernel_halt(void); | 64 | extern void kernel_halt(void); |
64 | extern void kernel_power_off(void); | 65 | extern void kernel_power_off(void); |
diff --git a/include/linux/rmap.h b/include/linux/rmap.h index 69407f85e10b..fed6f5e0b411 100644 --- a/include/linux/rmap.h +++ b/include/linux/rmap.h | |||
@@ -102,7 +102,7 @@ int try_to_unmap(struct page *, int ignore_refs); | |||
102 | * Called from mm/filemap_xip.c to unmap empty zero page | 102 | * Called from mm/filemap_xip.c to unmap empty zero page |
103 | */ | 103 | */ |
104 | pte_t *page_check_address(struct page *, struct mm_struct *, | 104 | pte_t *page_check_address(struct page *, struct mm_struct *, |
105 | unsigned long, spinlock_t **); | 105 | unsigned long, spinlock_t **, int); |
106 | 106 | ||
107 | /* | 107 | /* |
108 | * Used by swapoff to help locate where page is expected in vma. | 108 | * Used by swapoff to help locate where page is expected in vma. |
diff --git a/include/linux/security.h b/include/linux/security.h index fd96e7f8a6f9..80c4d002864c 100644 --- a/include/linux/security.h +++ b/include/linux/security.h | |||
@@ -46,8 +46,8 @@ struct audit_krule; | |||
46 | */ | 46 | */ |
47 | extern int cap_capable(struct task_struct *tsk, int cap); | 47 | extern int cap_capable(struct task_struct *tsk, int cap); |
48 | extern int cap_settime(struct timespec *ts, struct timezone *tz); | 48 | extern int cap_settime(struct timespec *ts, struct timezone *tz); |
49 | extern int cap_ptrace(struct task_struct *parent, struct task_struct *child, | 49 | extern int cap_ptrace_may_access(struct task_struct *child, unsigned int mode); |
50 | unsigned int mode); | 50 | extern int cap_ptrace_traceme(struct task_struct *parent); |
51 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 51 | extern int cap_capget(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
52 | extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 52 | extern int cap_capset_check(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
53 | extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); | 53 | extern void cap_capset_set(struct task_struct *target, kernel_cap_t *effective, kernel_cap_t *inheritable, kernel_cap_t *permitted); |
@@ -1157,17 +1157,24 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
1157 | * @alter contains the flag indicating whether changes are to be made. | 1157 | * @alter contains the flag indicating whether changes are to be made. |
1158 | * Return 0 if permission is granted. | 1158 | * Return 0 if permission is granted. |
1159 | * | 1159 | * |
1160 | * @ptrace: | 1160 | * @ptrace_may_access: |
1161 | * Check permission before allowing the @parent process to trace the | 1161 | * Check permission before allowing the current process to trace the |
1162 | * @child process. | 1162 | * @child process. |
1163 | * Security modules may also want to perform a process tracing check | 1163 | * Security modules may also want to perform a process tracing check |
1164 | * during an execve in the set_security or apply_creds hooks of | 1164 | * during an execve in the set_security or apply_creds hooks of |
1165 | * binprm_security_ops if the process is being traced and its security | 1165 | * binprm_security_ops if the process is being traced and its security |
1166 | * attributes would be changed by the execve. | 1166 | * attributes would be changed by the execve. |
1167 | * @parent contains the task_struct structure for parent process. | 1167 | * @child contains the task_struct structure for the target process. |
1168 | * @child contains the task_struct structure for child process. | ||
1169 | * @mode contains the PTRACE_MODE flags indicating the form of access. | 1168 | * @mode contains the PTRACE_MODE flags indicating the form of access. |
1170 | * Return 0 if permission is granted. | 1169 | * Return 0 if permission is granted. |
1170 | * @ptrace_traceme: | ||
1171 | * Check that the @parent process has sufficient permission to trace the | ||
1172 | * current process before allowing the current process to present itself | ||
1173 | * to the @parent process for tracing. | ||
1174 | * The parent process will still have to undergo the ptrace_may_access | ||
1175 | * checks before it is allowed to trace this one. | ||
1176 | * @parent contains the task_struct structure for debugger process. | ||
1177 | * Return 0 if permission is granted. | ||
1171 | * @capget: | 1178 | * @capget: |
1172 | * Get the @effective, @inheritable, and @permitted capability sets for | 1179 | * Get the @effective, @inheritable, and @permitted capability sets for |
1173 | * the @target process. The hook may also perform permission checking to | 1180 | * the @target process. The hook may also perform permission checking to |
@@ -1287,8 +1294,8 @@ static inline void security_free_mnt_opts(struct security_mnt_opts *opts) | |||
1287 | struct security_operations { | 1294 | struct security_operations { |
1288 | char name[SECURITY_NAME_MAX + 1]; | 1295 | char name[SECURITY_NAME_MAX + 1]; |
1289 | 1296 | ||
1290 | int (*ptrace) (struct task_struct *parent, struct task_struct *child, | 1297 | int (*ptrace_may_access) (struct task_struct *child, unsigned int mode); |
1291 | unsigned int mode); | 1298 | int (*ptrace_traceme) (struct task_struct *parent); |
1292 | int (*capget) (struct task_struct *target, | 1299 | int (*capget) (struct task_struct *target, |
1293 | kernel_cap_t *effective, | 1300 | kernel_cap_t *effective, |
1294 | kernel_cap_t *inheritable, kernel_cap_t *permitted); | 1301 | kernel_cap_t *inheritable, kernel_cap_t *permitted); |
@@ -1560,8 +1567,8 @@ extern struct dentry *securityfs_create_dir(const char *name, struct dentry *par | |||
1560 | extern void securityfs_remove(struct dentry *dentry); | 1567 | extern void securityfs_remove(struct dentry *dentry); |
1561 | 1568 | ||
1562 | /* Security operations */ | 1569 | /* Security operations */ |
1563 | int security_ptrace(struct task_struct *parent, struct task_struct *child, | 1570 | int security_ptrace_may_access(struct task_struct *child, unsigned int mode); |
1564 | unsigned int mode); | 1571 | int security_ptrace_traceme(struct task_struct *parent); |
1565 | int security_capget(struct task_struct *target, | 1572 | int security_capget(struct task_struct *target, |
1566 | kernel_cap_t *effective, | 1573 | kernel_cap_t *effective, |
1567 | kernel_cap_t *inheritable, | 1574 | kernel_cap_t *inheritable, |
@@ -1742,11 +1749,15 @@ static inline int security_init(void) | |||
1742 | return 0; | 1749 | return 0; |
1743 | } | 1750 | } |
1744 | 1751 | ||
1745 | static inline int security_ptrace(struct task_struct *parent, | 1752 | static inline int security_ptrace_may_access(struct task_struct *child, |
1746 | struct task_struct *child, | 1753 | unsigned int mode) |
1747 | unsigned int mode) | 1754 | { |
1755 | return cap_ptrace_may_access(child, mode); | ||
1756 | } | ||
1757 | |||
1758 | static inline int security_ptrace_traceme(struct task_struct *parent) | ||
1748 | { | 1759 | { |
1749 | return cap_ptrace(parent, child, mode); | 1760 | return cap_ptrace_traceme(parent); |
1750 | } | 1761 | } |
1751 | 1762 | ||
1752 | static inline int security_capget(struct task_struct *target, | 1763 | static inline int security_capget(struct task_struct *target, |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 358661c9990e..909923717830 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -1452,6 +1452,10 @@ extern int skb_copy_datagram_iovec(const struct sk_buff *from, | |||
1452 | extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, | 1452 | extern int skb_copy_and_csum_datagram_iovec(struct sk_buff *skb, |
1453 | int hlen, | 1453 | int hlen, |
1454 | struct iovec *iov); | 1454 | struct iovec *iov); |
1455 | extern int skb_copy_datagram_from_iovec(struct sk_buff *skb, | ||
1456 | int offset, | ||
1457 | struct iovec *from, | ||
1458 | int len); | ||
1455 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); | 1459 | extern void skb_free_datagram(struct sock *sk, struct sk_buff *skb); |
1456 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, | 1460 | extern int skb_kill_datagram(struct sock *sk, struct sk_buff *skb, |
1457 | unsigned int flags); | 1461 | unsigned int flags); |
diff --git a/include/linux/suspend.h b/include/linux/suspend.h index c63435095970..2ce8207686e2 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h | |||
@@ -217,11 +217,11 @@ struct platform_hibernation_ops { | |||
217 | #ifdef CONFIG_HIBERNATION | 217 | #ifdef CONFIG_HIBERNATION |
218 | /* kernel/power/snapshot.c */ | 218 | /* kernel/power/snapshot.c */ |
219 | extern void __register_nosave_region(unsigned long b, unsigned long e, int km); | 219 | extern void __register_nosave_region(unsigned long b, unsigned long e, int km); |
220 | static inline void register_nosave_region(unsigned long b, unsigned long e) | 220 | static inline void __init register_nosave_region(unsigned long b, unsigned long e) |
221 | { | 221 | { |
222 | __register_nosave_region(b, e, 0); | 222 | __register_nosave_region(b, e, 0); |
223 | } | 223 | } |
224 | static inline void register_nosave_region_late(unsigned long b, unsigned long e) | 224 | static inline void __init register_nosave_region_late(unsigned long b, unsigned long e) |
225 | { | 225 | { |
226 | __register_nosave_region(b, e, 1); | 226 | __register_nosave_region(b, e, 1); |
227 | } | 227 | } |
diff --git a/include/linux/tick.h b/include/linux/tick.h index d3c02695dc5d..8cf8cfe2cc97 100644 --- a/include/linux/tick.h +++ b/include/linux/tick.h | |||
@@ -74,10 +74,13 @@ extern struct tick_device *tick_get_device(int cpu); | |||
74 | extern int tick_init_highres(void); | 74 | extern int tick_init_highres(void); |
75 | extern int tick_program_event(ktime_t expires, int force); | 75 | extern int tick_program_event(ktime_t expires, int force); |
76 | extern void tick_setup_sched_timer(void); | 76 | extern void tick_setup_sched_timer(void); |
77 | # endif | ||
78 | |||
79 | # if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS | ||
77 | extern void tick_cancel_sched_timer(int cpu); | 80 | extern void tick_cancel_sched_timer(int cpu); |
78 | # else | 81 | # else |
79 | static inline void tick_cancel_sched_timer(int cpu) { } | 82 | static inline void tick_cancel_sched_timer(int cpu) { } |
80 | # endif /* HIGHRES */ | 83 | # endif |
81 | 84 | ||
82 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST | 85 | # ifdef CONFIG_GENERIC_CLOCKEVENTS_BROADCAST |
83 | extern struct tick_device *tick_get_broadcast_device(void); | 86 | extern struct tick_device *tick_get_broadcast_device(void); |
diff --git a/include/linux/tty.h b/include/linux/tty.h index e3579cb086e0..0cbec74ec086 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h | |||
@@ -331,6 +331,8 @@ extern int tty_write_room(struct tty_struct *tty); | |||
331 | extern void tty_driver_flush_buffer(struct tty_struct *tty); | 331 | extern void tty_driver_flush_buffer(struct tty_struct *tty); |
332 | extern void tty_throttle(struct tty_struct *tty); | 332 | extern void tty_throttle(struct tty_struct *tty); |
333 | extern void tty_unthrottle(struct tty_struct *tty); | 333 | extern void tty_unthrottle(struct tty_struct *tty); |
334 | extern int tty_do_resize(struct tty_struct *tty, struct tty_struct *real_tty, | ||
335 | struct winsize *ws); | ||
334 | 336 | ||
335 | extern int is_current_pgrp_orphaned(void); | 337 | extern int is_current_pgrp_orphaned(void); |
336 | extern struct pid *tty_get_pgrp(struct tty_struct *tty); | 338 | extern struct pid *tty_get_pgrp(struct tty_struct *tty); |
diff --git a/include/linux/tty_driver.h b/include/linux/tty_driver.h index e1065ac0d922..16d27944c321 100644 --- a/include/linux/tty_driver.h +++ b/include/linux/tty_driver.h | |||
@@ -168,6 +168,18 @@ | |||
168 | * | 168 | * |
169 | * Optional: If not provided then the write method is called under | 169 | * Optional: If not provided then the write method is called under |
170 | * the atomic write lock to keep it serialized with the ldisc. | 170 | * the atomic write lock to keep it serialized with the ldisc. |
171 | * | ||
172 | * int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty, | ||
173 | * unsigned int rows, unsigned int cols); | ||
174 | * | ||
175 | * Called when a termios request is issued which changes the | ||
176 | * requested terminal geometry. | ||
177 | * | ||
178 | * Optional: the default action is to update the termios structure | ||
179 | * without error. This is usually the correct behaviour. Drivers should | ||
180 | * not force errors here if they are not resizable objects (eg a serial | ||
181 | * line). See tty_do_resize() if you need to wrap the standard method | ||
182 | * in your own logic - the usual case. | ||
171 | */ | 183 | */ |
172 | 184 | ||
173 | #include <linux/fs.h> | 185 | #include <linux/fs.h> |
@@ -206,6 +218,8 @@ struct tty_operations { | |||
206 | int (*tiocmget)(struct tty_struct *tty, struct file *file); | 218 | int (*tiocmget)(struct tty_struct *tty, struct file *file); |
207 | int (*tiocmset)(struct tty_struct *tty, struct file *file, | 219 | int (*tiocmset)(struct tty_struct *tty, struct file *file, |
208 | unsigned int set, unsigned int clear); | 220 | unsigned int set, unsigned int clear); |
221 | int (*resize)(struct tty_struct *tty, struct tty_struct *real_tty, | ||
222 | struct winsize *ws); | ||
209 | #ifdef CONFIG_CONSOLE_POLL | 223 | #ifdef CONFIG_CONSOLE_POLL |
210 | int (*poll_init)(struct tty_driver *driver, int line, char *options); | 224 | int (*poll_init)(struct tty_driver *driver, int line, char *options); |
211 | int (*poll_get_char)(struct tty_driver *driver, int line); | 225 | int (*poll_get_char)(struct tty_driver *driver, int line); |
diff --git a/include/linux/usb.h b/include/linux/usb.h index 0924cd9c30f6..94ac74aba6b6 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h | |||
@@ -110,6 +110,8 @@ enum usb_interface_condition { | |||
110 | * @sysfs_files_created: sysfs attributes exist | 110 | * @sysfs_files_created: sysfs attributes exist |
111 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup | 111 | * @needs_remote_wakeup: flag set when the driver requires remote-wakeup |
112 | * capability during autosuspend. | 112 | * capability during autosuspend. |
113 | * @needs_altsetting0: flag set when a set-interface request for altsetting 0 | ||
114 | * has been deferred. | ||
113 | * @needs_binding: flag set when the driver should be re-probed or unbound | 115 | * @needs_binding: flag set when the driver should be re-probed or unbound |
114 | * following a reset or suspend operation it doesn't support. | 116 | * following a reset or suspend operation it doesn't support. |
115 | * @dev: driver model's view of this device | 117 | * @dev: driver model's view of this device |
@@ -162,6 +164,7 @@ struct usb_interface { | |||
162 | unsigned is_active:1; /* the interface is not suspended */ | 164 | unsigned is_active:1; /* the interface is not suspended */ |
163 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ | 165 | unsigned sysfs_files_created:1; /* the sysfs attributes exist */ |
164 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ | 166 | unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */ |
167 | unsigned needs_altsetting0:1; /* switch to altsetting 0 is pending */ | ||
165 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ | 168 | unsigned needs_binding:1; /* needs delayed unbind/rebind */ |
166 | 169 | ||
167 | struct device dev; /* interface specific device info */ | 170 | struct device dev; /* interface specific device info */ |
diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h index e466bd54a50e..e65a6bed4e3e 100644 --- a/include/linux/videodev2.h +++ b/include/linux/videodev2.h | |||
@@ -55,13 +55,13 @@ | |||
55 | */ | 55 | */ |
56 | #ifndef __LINUX_VIDEODEV2_H | 56 | #ifndef __LINUX_VIDEODEV2_H |
57 | #define __LINUX_VIDEODEV2_H | 57 | #define __LINUX_VIDEODEV2_H |
58 | |||
58 | #ifdef __KERNEL__ | 59 | #ifdef __KERNEL__ |
59 | #include <linux/time.h> /* need struct timeval */ | 60 | #include <linux/time.h> /* need struct timeval */ |
60 | #include <linux/compiler.h> /* need __user */ | ||
61 | #else | 61 | #else |
62 | #define __user | ||
63 | #include <sys/time.h> | 62 | #include <sys/time.h> |
64 | #endif | 63 | #endif |
64 | #include <linux/compiler.h> | ||
65 | #include <linux/ioctl.h> | 65 | #include <linux/ioctl.h> |
66 | #include <linux/types.h> | 66 | #include <linux/types.h> |
67 | 67 | ||
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 364789aae9f3..328eb4022727 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -4,9 +4,9 @@ | |||
4 | #include <linux/spinlock.h> | 4 | #include <linux/spinlock.h> |
5 | #include <asm/page.h> /* pgprot_t */ | 5 | #include <asm/page.h> /* pgprot_t */ |
6 | 6 | ||
7 | struct vm_area_struct; | 7 | struct vm_area_struct; /* vma defining user mapping in mm_types.h */ |
8 | 8 | ||
9 | /* bits in vm_struct->flags */ | 9 | /* bits in flags of vmalloc's vm_struct below */ |
10 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ | 10 | #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ |
11 | #define VM_ALLOC 0x00000002 /* vmalloc() */ | 11 | #define VM_ALLOC 0x00000002 /* vmalloc() */ |
12 | #define VM_MAP 0x00000004 /* vmap()ed pages */ | 12 | #define VM_MAP 0x00000004 /* vmap()ed pages */ |
diff --git a/include/linux/vt_kern.h b/include/linux/vt_kern.h index 1c78d56c57e5..1cbd0a7db4e6 100644 --- a/include/linux/vt_kern.h +++ b/include/linux/vt_kern.h | |||
@@ -35,7 +35,6 @@ extern int fg_console, last_console, want_console; | |||
35 | int vc_allocate(unsigned int console); | 35 | int vc_allocate(unsigned int console); |
36 | int vc_cons_allocated(unsigned int console); | 36 | int vc_cons_allocated(unsigned int console); |
37 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); | 37 | int vc_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); |
38 | int vc_lock_resize(struct vc_data *vc, unsigned int cols, unsigned int lines); | ||
39 | void vc_deallocate(unsigned int console); | 38 | void vc_deallocate(unsigned int console); |
40 | void reset_palette(struct vc_data *vc); | 39 | void reset_palette(struct vc_data *vc); |
41 | void do_blank_screen(int entering_gfx); | 40 | void do_blank_screen(int entering_gfx); |
diff --git a/include/net/addrconf.h b/include/net/addrconf.h index 06b28142b3ab..c216de528b08 100644 --- a/include/net/addrconf.h +++ b/include/net/addrconf.h | |||
@@ -80,7 +80,8 @@ extern struct inet6_ifaddr *ipv6_get_ifaddr(struct net *net, | |||
80 | struct net_device *dev, | 80 | struct net_device *dev, |
81 | int strict); | 81 | int strict); |
82 | 82 | ||
83 | extern int ipv6_dev_get_saddr(struct net_device *dev, | 83 | extern int ipv6_dev_get_saddr(struct net *net, |
84 | struct net_device *dev, | ||
84 | const struct in6_addr *daddr, | 85 | const struct in6_addr *daddr, |
85 | unsigned int srcprefs, | 86 | unsigned int srcprefs, |
86 | struct in6_addr *saddr); | 87 | struct in6_addr *saddr); |
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index bc391ba101e9..5f53db7e4e57 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h | |||
@@ -107,6 +107,7 @@ struct rt6_rtnl_dump_arg | |||
107 | { | 107 | { |
108 | struct sk_buff *skb; | 108 | struct sk_buff *skb; |
109 | struct netlink_callback *cb; | 109 | struct netlink_callback *cb; |
110 | struct net *net; | ||
110 | }; | 111 | }; |
111 | 112 | ||
112 | extern int rt6_dump_route(struct rt6_info *rt, void *p_arg); | 113 | extern int rt6_dump_route(struct rt6_info *rt, void *p_arg); |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index b397e4d984c7..ff137fd7714f 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -708,10 +708,7 @@ enum ieee80211_tkip_key_type { | |||
708 | * rely on the host system for such buffering. This option is used | 708 | * rely on the host system for such buffering. This option is used |
709 | * to configure the IEEE 802.11 upper layer to buffer broadcast and | 709 | * to configure the IEEE 802.11 upper layer to buffer broadcast and |
710 | * multicast frames when there are power saving stations so that | 710 | * multicast frames when there are power saving stations so that |
711 | * the driver can fetch them with ieee80211_get_buffered_bc(). Note | 711 | * the driver can fetch them with ieee80211_get_buffered_bc(). |
712 | * that not setting this flag works properly only when the | ||
713 | * %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is also not set because | ||
714 | * otherwise the stack will not know when the DTIM beacon was sent. | ||
715 | * | 712 | * |
716 | * @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE: | 713 | * @IEEE80211_HW_2GHZ_SHORT_SLOT_INCAPABLE: |
717 | * Hardware is not capable of short slot operation on the 2.4 GHz band. | 714 | * Hardware is not capable of short slot operation on the 2.4 GHz band. |
@@ -1099,10 +1096,8 @@ enum ieee80211_ampdu_mlme_action { | |||
1099 | * See the section "Frame filtering" for more information. | 1096 | * See the section "Frame filtering" for more information. |
1100 | * This callback must be implemented and atomic. | 1097 | * This callback must be implemented and atomic. |
1101 | * | 1098 | * |
1102 | * @set_tim: Set TIM bit. If the hardware/firmware takes care of beacon | 1099 | * @set_tim: Set TIM bit. mac80211 calls this function when a TIM bit |
1103 | * generation (that is, %IEEE80211_HW_HOST_GEN_BEACON_TEMPLATE is set) | 1100 | * must be set or cleared for a given AID. Must be atomic. |
1104 | * mac80211 calls this function when a TIM bit must be set or cleared | ||
1105 | * for a given AID. Must be atomic. | ||
1106 | * | 1101 | * |
1107 | * @set_key: See the section "Hardware crypto acceleration" | 1102 | * @set_key: See the section "Hardware crypto acceleration" |
1108 | * This callback can sleep, and is only called between add_interface | 1103 | * This callback can sleep, and is only called between add_interface |
diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h index 853fe83d9f37..b786a5b09253 100644 --- a/include/net/pkt_sched.h +++ b/include/net/pkt_sched.h | |||
@@ -78,6 +78,7 @@ extern struct Qdisc *fifo_create_dflt(struct Qdisc *sch, struct Qdisc_ops *ops, | |||
78 | 78 | ||
79 | extern int register_qdisc(struct Qdisc_ops *qops); | 79 | extern int register_qdisc(struct Qdisc_ops *qops); |
80 | extern int unregister_qdisc(struct Qdisc_ops *qops); | 80 | extern int unregister_qdisc(struct Qdisc_ops *qops); |
81 | extern void qdisc_list_del(struct Qdisc *q); | ||
81 | extern struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle); | 82 | extern struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle); |
82 | extern struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle); | 83 | extern struct Qdisc *qdisc_lookup_class(struct net_device *dev, u32 handle); |
83 | extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, | 84 | extern struct qdisc_rate_table *qdisc_get_rtab(struct tc_ratespec *r, |
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h index a7abfda3e447..b1d2cfea89c5 100644 --- a/include/net/sch_generic.h +++ b/include/net/sch_generic.h | |||
@@ -27,6 +27,7 @@ enum qdisc_state_t | |||
27 | { | 27 | { |
28 | __QDISC_STATE_RUNNING, | 28 | __QDISC_STATE_RUNNING, |
29 | __QDISC_STATE_SCHED, | 29 | __QDISC_STATE_SCHED, |
30 | __QDISC_STATE_DEACTIVATED, | ||
30 | }; | 31 | }; |
31 | 32 | ||
32 | struct qdisc_size_table { | 33 | struct qdisc_size_table { |
@@ -60,7 +61,6 @@ struct Qdisc | |||
60 | struct gnet_stats_basic bstats; | 61 | struct gnet_stats_basic bstats; |
61 | struct gnet_stats_queue qstats; | 62 | struct gnet_stats_queue qstats; |
62 | struct gnet_stats_rate_est rate_est; | 63 | struct gnet_stats_rate_est rate_est; |
63 | struct rcu_head q_rcu; | ||
64 | int (*reshape_fail)(struct sk_buff *skb, | 64 | int (*reshape_fail)(struct sk_buff *skb, |
65 | struct Qdisc *q); | 65 | struct Qdisc *q); |
66 | 66 | ||
@@ -193,6 +193,11 @@ static inline struct Qdisc *qdisc_root(struct Qdisc *qdisc) | |||
193 | return qdisc->dev_queue->qdisc; | 193 | return qdisc->dev_queue->qdisc; |
194 | } | 194 | } |
195 | 195 | ||
196 | static inline struct Qdisc *qdisc_root_sleeping(struct Qdisc *qdisc) | ||
197 | { | ||
198 | return qdisc->dev_queue->qdisc_sleeping; | ||
199 | } | ||
200 | |||
196 | /* The qdisc root lock is a mechanism by which to top level | 201 | /* The qdisc root lock is a mechanism by which to top level |
197 | * of a qdisc tree can be locked from any qdisc node in the | 202 | * of a qdisc tree can be locked from any qdisc node in the |
198 | * forest. This allows changing the configuration of some | 203 | * forest. This allows changing the configuration of some |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 291d56a19167..80b2e93c2936 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -6,6 +6,7 @@ | |||
6 | #include <linux/spinlock.h> | 6 | #include <linux/spinlock.h> |
7 | #include <linux/workqueue.h> | 7 | #include <linux/workqueue.h> |
8 | #include <linux/blkdev.h> | 8 | #include <linux/blkdev.h> |
9 | #include <scsi/scsi.h> | ||
9 | #include <asm/atomic.h> | 10 | #include <asm/atomic.h> |
10 | 11 | ||
11 | struct request_queue; | 12 | struct request_queue; |
@@ -426,7 +427,7 @@ static inline int scsi_device_enclosure(struct scsi_device *sdev) | |||
426 | 427 | ||
427 | static inline int scsi_device_protection(struct scsi_device *sdev) | 428 | static inline int scsi_device_protection(struct scsi_device *sdev) |
428 | { | 429 | { |
429 | return sdev->inquiry[5] & (1<<0); | 430 | return sdev->scsi_level > SCSI_2 && sdev->inquiry[5] & (1<<0); |
430 | } | 431 | } |
431 | 432 | ||
432 | #define MODULE_ALIAS_SCSI_DEVICE(type) \ | 433 | #define MODULE_ALIAS_SCSI_DEVICE(type) \ |
diff --git a/init/Kconfig b/init/Kconfig index b678803deccf..c11da38837e5 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -558,17 +558,6 @@ config SYSCTL_SYSCALL | |||
558 | 558 | ||
559 | If unsure say Y here. | 559 | If unsure say Y here. |
560 | 560 | ||
561 | config SYSCTL_SYSCALL_CHECK | ||
562 | bool "Sysctl checks" if EMBEDDED | ||
563 | depends on SYSCTL_SYSCALL | ||
564 | default y | ||
565 | ---help--- | ||
566 | sys_sysctl uses binary paths that have been found challenging | ||
567 | to properly maintain and use. This enables checks that help | ||
568 | you to keep things correct. | ||
569 | |||
570 | If unsure say Y here. | ||
571 | |||
572 | config KALLSYMS | 561 | config KALLSYMS |
573 | bool "Load all symbols for debugging/ksymoops" if EMBEDDED | 562 | bool "Load all symbols for debugging/ksymoops" if EMBEDDED |
574 | default y | 563 | default y |
diff --git a/kernel/capability.c b/kernel/capability.c index 0101e847603e..33e51e78c2d8 100644 --- a/kernel/capability.c +++ b/kernel/capability.c | |||
@@ -486,17 +486,22 @@ asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data) | |||
486 | return ret; | 486 | return ret; |
487 | } | 487 | } |
488 | 488 | ||
489 | int __capable(struct task_struct *t, int cap) | 489 | /** |
490 | * capable - Determine if the current task has a superior capability in effect | ||
491 | * @cap: The capability to be tested for | ||
492 | * | ||
493 | * Return true if the current task has the given superior capability currently | ||
494 | * available for use, false if not. | ||
495 | * | ||
496 | * This sets PF_SUPERPRIV on the task if the capability is available on the | ||
497 | * assumption that it's about to be used. | ||
498 | */ | ||
499 | int capable(int cap) | ||
490 | { | 500 | { |
491 | if (security_capable(t, cap) == 0) { | 501 | if (has_capability(current, cap)) { |
492 | t->flags |= PF_SUPERPRIV; | 502 | current->flags |= PF_SUPERPRIV; |
493 | return 1; | 503 | return 1; |
494 | } | 504 | } |
495 | return 0; | 505 | return 0; |
496 | } | 506 | } |
497 | |||
498 | int capable(int cap) | ||
499 | { | ||
500 | return __capable(current, cap); | ||
501 | } | ||
502 | EXPORT_SYMBOL(capable); | 507 | EXPORT_SYMBOL(capable); |
diff --git a/kernel/kexec.c b/kernel/kexec.c index c8a4370e2a34..59f3f0df35d4 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/fs.h> | 13 | #include <linux/fs.h> |
14 | #include <linux/kexec.h> | 14 | #include <linux/kexec.h> |
15 | #include <linux/spinlock.h> | 15 | #include <linux/mutex.h> |
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/highmem.h> | 17 | #include <linux/highmem.h> |
18 | #include <linux/syscalls.h> | 18 | #include <linux/syscalls.h> |
@@ -77,7 +77,7 @@ int kexec_should_crash(struct task_struct *p) | |||
77 | * | 77 | * |
78 | * The code for the transition from the current kernel to the | 78 | * The code for the transition from the current kernel to the |
79 | * the new kernel is placed in the control_code_buffer, whose size | 79 | * the new kernel is placed in the control_code_buffer, whose size |
80 | * is given by KEXEC_CONTROL_CODE_SIZE. In the best case only a single | 80 | * is given by KEXEC_CONTROL_PAGE_SIZE. In the best case only a single |
81 | * page of memory is necessary, but some architectures require more. | 81 | * page of memory is necessary, but some architectures require more. |
82 | * Because this memory must be identity mapped in the transition from | 82 | * Because this memory must be identity mapped in the transition from |
83 | * virtual to physical addresses it must live in the range | 83 | * virtual to physical addresses it must live in the range |
@@ -242,7 +242,7 @@ static int kimage_normal_alloc(struct kimage **rimage, unsigned long entry, | |||
242 | */ | 242 | */ |
243 | result = -ENOMEM; | 243 | result = -ENOMEM; |
244 | image->control_code_page = kimage_alloc_control_pages(image, | 244 | image->control_code_page = kimage_alloc_control_pages(image, |
245 | get_order(KEXEC_CONTROL_CODE_SIZE)); | 245 | get_order(KEXEC_CONTROL_PAGE_SIZE)); |
246 | if (!image->control_code_page) { | 246 | if (!image->control_code_page) { |
247 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); | 247 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); |
248 | goto out; | 248 | goto out; |
@@ -317,7 +317,7 @@ static int kimage_crash_alloc(struct kimage **rimage, unsigned long entry, | |||
317 | */ | 317 | */ |
318 | result = -ENOMEM; | 318 | result = -ENOMEM; |
319 | image->control_code_page = kimage_alloc_control_pages(image, | 319 | image->control_code_page = kimage_alloc_control_pages(image, |
320 | get_order(KEXEC_CONTROL_CODE_SIZE)); | 320 | get_order(KEXEC_CONTROL_PAGE_SIZE)); |
321 | if (!image->control_code_page) { | 321 | if (!image->control_code_page) { |
322 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); | 322 | printk(KERN_ERR "Could not allocate control_code_buffer\n"); |
323 | goto out; | 323 | goto out; |
@@ -924,19 +924,14 @@ static int kimage_load_segment(struct kimage *image, | |||
924 | */ | 924 | */ |
925 | struct kimage *kexec_image; | 925 | struct kimage *kexec_image; |
926 | struct kimage *kexec_crash_image; | 926 | struct kimage *kexec_crash_image; |
927 | /* | 927 | |
928 | * A home grown binary mutex. | 928 | static DEFINE_MUTEX(kexec_mutex); |
929 | * Nothing can wait so this mutex is safe to use | ||
930 | * in interrupt context :) | ||
931 | */ | ||
932 | static int kexec_lock; | ||
933 | 929 | ||
934 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | 930 | asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, |
935 | struct kexec_segment __user *segments, | 931 | struct kexec_segment __user *segments, |
936 | unsigned long flags) | 932 | unsigned long flags) |
937 | { | 933 | { |
938 | struct kimage **dest_image, *image; | 934 | struct kimage **dest_image, *image; |
939 | int locked; | ||
940 | int result; | 935 | int result; |
941 | 936 | ||
942 | /* We only trust the superuser with rebooting the system. */ | 937 | /* We only trust the superuser with rebooting the system. */ |
@@ -972,8 +967,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | |||
972 | * | 967 | * |
973 | * KISS: always take the mutex. | 968 | * KISS: always take the mutex. |
974 | */ | 969 | */ |
975 | locked = xchg(&kexec_lock, 1); | 970 | if (!mutex_trylock(&kexec_mutex)) |
976 | if (locked) | ||
977 | return -EBUSY; | 971 | return -EBUSY; |
978 | 972 | ||
979 | dest_image = &kexec_image; | 973 | dest_image = &kexec_image; |
@@ -1015,8 +1009,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments, | |||
1015 | image = xchg(dest_image, image); | 1009 | image = xchg(dest_image, image); |
1016 | 1010 | ||
1017 | out: | 1011 | out: |
1018 | locked = xchg(&kexec_lock, 0); /* Release the mutex */ | 1012 | mutex_unlock(&kexec_mutex); |
1019 | BUG_ON(!locked); | ||
1020 | kimage_free(image); | 1013 | kimage_free(image); |
1021 | 1014 | ||
1022 | return result; | 1015 | return result; |
@@ -1063,10 +1056,7 @@ asmlinkage long compat_sys_kexec_load(unsigned long entry, | |||
1063 | 1056 | ||
1064 | void crash_kexec(struct pt_regs *regs) | 1057 | void crash_kexec(struct pt_regs *regs) |
1065 | { | 1058 | { |
1066 | int locked; | 1059 | /* Take the kexec_mutex here to prevent sys_kexec_load |
1067 | |||
1068 | |||
1069 | /* Take the kexec_lock here to prevent sys_kexec_load | ||
1070 | * running on one cpu from replacing the crash kernel | 1060 | * running on one cpu from replacing the crash kernel |
1071 | * we are using after a panic on a different cpu. | 1061 | * we are using after a panic on a different cpu. |
1072 | * | 1062 | * |
@@ -1074,8 +1064,7 @@ void crash_kexec(struct pt_regs *regs) | |||
1074 | * of memory the xchg(&kexec_crash_image) would be | 1064 | * of memory the xchg(&kexec_crash_image) would be |
1075 | * sufficient. But since I reuse the memory... | 1065 | * sufficient. But since I reuse the memory... |
1076 | */ | 1066 | */ |
1077 | locked = xchg(&kexec_lock, 1); | 1067 | if (mutex_trylock(&kexec_mutex)) { |
1078 | if (!locked) { | ||
1079 | if (kexec_crash_image) { | 1068 | if (kexec_crash_image) { |
1080 | struct pt_regs fixed_regs; | 1069 | struct pt_regs fixed_regs; |
1081 | crash_setup_regs(&fixed_regs, regs); | 1070 | crash_setup_regs(&fixed_regs, regs); |
@@ -1083,8 +1072,7 @@ void crash_kexec(struct pt_regs *regs) | |||
1083 | machine_crash_shutdown(&fixed_regs); | 1072 | machine_crash_shutdown(&fixed_regs); |
1084 | machine_kexec(kexec_crash_image); | 1073 | machine_kexec(kexec_crash_image); |
1085 | } | 1074 | } |
1086 | locked = xchg(&kexec_lock, 0); | 1075 | mutex_unlock(&kexec_mutex); |
1087 | BUG_ON(!locked); | ||
1088 | } | 1076 | } |
1089 | } | 1077 | } |
1090 | 1078 | ||
@@ -1426,25 +1414,23 @@ static int __init crash_save_vmcoreinfo_init(void) | |||
1426 | 1414 | ||
1427 | module_init(crash_save_vmcoreinfo_init) | 1415 | module_init(crash_save_vmcoreinfo_init) |
1428 | 1416 | ||
1429 | /** | 1417 | /* |
1430 | * kernel_kexec - reboot the system | 1418 | * Move into place and start executing a preloaded standalone |
1431 | * | 1419 | * executable. If nothing was preloaded return an error. |
1432 | * Move into place and start executing a preloaded standalone | ||
1433 | * executable. If nothing was preloaded return an error. | ||
1434 | */ | 1420 | */ |
1435 | int kernel_kexec(void) | 1421 | int kernel_kexec(void) |
1436 | { | 1422 | { |
1437 | int error = 0; | 1423 | int error = 0; |
1438 | 1424 | ||
1439 | if (xchg(&kexec_lock, 1)) | 1425 | if (!mutex_trylock(&kexec_mutex)) |
1440 | return -EBUSY; | 1426 | return -EBUSY; |
1441 | if (!kexec_image) { | 1427 | if (!kexec_image) { |
1442 | error = -EINVAL; | 1428 | error = -EINVAL; |
1443 | goto Unlock; | 1429 | goto Unlock; |
1444 | } | 1430 | } |
1445 | 1431 | ||
1446 | if (kexec_image->preserve_context) { | ||
1447 | #ifdef CONFIG_KEXEC_JUMP | 1432 | #ifdef CONFIG_KEXEC_JUMP |
1433 | if (kexec_image->preserve_context) { | ||
1448 | mutex_lock(&pm_mutex); | 1434 | mutex_lock(&pm_mutex); |
1449 | pm_prepare_console(); | 1435 | pm_prepare_console(); |
1450 | error = freeze_processes(); | 1436 | error = freeze_processes(); |
@@ -1459,6 +1445,7 @@ int kernel_kexec(void) | |||
1459 | error = disable_nonboot_cpus(); | 1445 | error = disable_nonboot_cpus(); |
1460 | if (error) | 1446 | if (error) |
1461 | goto Resume_devices; | 1447 | goto Resume_devices; |
1448 | device_pm_lock(); | ||
1462 | local_irq_disable(); | 1449 | local_irq_disable(); |
1463 | /* At this point, device_suspend() has been called, | 1450 | /* At this point, device_suspend() has been called, |
1464 | * but *not* device_power_down(). We *must* | 1451 | * but *not* device_power_down(). We *must* |
@@ -1470,26 +1457,22 @@ int kernel_kexec(void) | |||
1470 | error = device_power_down(PMSG_FREEZE); | 1457 | error = device_power_down(PMSG_FREEZE); |
1471 | if (error) | 1458 | if (error) |
1472 | goto Enable_irqs; | 1459 | goto Enable_irqs; |
1473 | save_processor_state(); | 1460 | } else |
1474 | #endif | 1461 | #endif |
1475 | } else { | 1462 | { |
1476 | blocking_notifier_call_chain(&reboot_notifier_list, | 1463 | kernel_restart_prepare(NULL); |
1477 | SYS_RESTART, NULL); | ||
1478 | system_state = SYSTEM_RESTART; | ||
1479 | device_shutdown(); | ||
1480 | sysdev_shutdown(); | ||
1481 | printk(KERN_EMERG "Starting new kernel\n"); | 1464 | printk(KERN_EMERG "Starting new kernel\n"); |
1482 | machine_shutdown(); | 1465 | machine_shutdown(); |
1483 | } | 1466 | } |
1484 | 1467 | ||
1485 | machine_kexec(kexec_image); | 1468 | machine_kexec(kexec_image); |
1486 | 1469 | ||
1487 | if (kexec_image->preserve_context) { | ||
1488 | #ifdef CONFIG_KEXEC_JUMP | 1470 | #ifdef CONFIG_KEXEC_JUMP |
1489 | restore_processor_state(); | 1471 | if (kexec_image->preserve_context) { |
1490 | device_power_up(PMSG_RESTORE); | 1472 | device_power_up(PMSG_RESTORE); |
1491 | Enable_irqs: | 1473 | Enable_irqs: |
1492 | local_irq_enable(); | 1474 | local_irq_enable(); |
1475 | device_pm_unlock(); | ||
1493 | enable_nonboot_cpus(); | 1476 | enable_nonboot_cpus(); |
1494 | Resume_devices: | 1477 | Resume_devices: |
1495 | device_resume(PMSG_RESTORE); | 1478 | device_resume(PMSG_RESTORE); |
@@ -1499,11 +1482,10 @@ int kernel_kexec(void) | |||
1499 | Restore_console: | 1482 | Restore_console: |
1500 | pm_restore_console(); | 1483 | pm_restore_console(); |
1501 | mutex_unlock(&pm_mutex); | 1484 | mutex_unlock(&pm_mutex); |
1502 | #endif | ||
1503 | } | 1485 | } |
1486 | #endif | ||
1504 | 1487 | ||
1505 | Unlock: | 1488 | Unlock: |
1506 | xchg(&kexec_lock, 0); | 1489 | mutex_unlock(&kexec_mutex); |
1507 | |||
1508 | return error; | 1490 | return error; |
1509 | } | 1491 | } |
diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 1aa91fd6b06e..3bfb1877a003 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
@@ -1759,11 +1759,10 @@ static void check_chain_key(struct task_struct *curr) | |||
1759 | hlock = curr->held_locks + i; | 1759 | hlock = curr->held_locks + i; |
1760 | if (chain_key != hlock->prev_chain_key) { | 1760 | if (chain_key != hlock->prev_chain_key) { |
1761 | debug_locks_off(); | 1761 | debug_locks_off(); |
1762 | printk("hm#1, depth: %u [%u], %016Lx != %016Lx\n", | 1762 | WARN(1, "hm#1, depth: %u [%u], %016Lx != %016Lx\n", |
1763 | curr->lockdep_depth, i, | 1763 | curr->lockdep_depth, i, |
1764 | (unsigned long long)chain_key, | 1764 | (unsigned long long)chain_key, |
1765 | (unsigned long long)hlock->prev_chain_key); | 1765 | (unsigned long long)hlock->prev_chain_key); |
1766 | WARN_ON(1); | ||
1767 | return; | 1766 | return; |
1768 | } | 1767 | } |
1769 | id = hlock->class_idx - 1; | 1768 | id = hlock->class_idx - 1; |
@@ -1778,11 +1777,10 @@ static void check_chain_key(struct task_struct *curr) | |||
1778 | } | 1777 | } |
1779 | if (chain_key != curr->curr_chain_key) { | 1778 | if (chain_key != curr->curr_chain_key) { |
1780 | debug_locks_off(); | 1779 | debug_locks_off(); |
1781 | printk("hm#2, depth: %u [%u], %016Lx != %016Lx\n", | 1780 | WARN(1, "hm#2, depth: %u [%u], %016Lx != %016Lx\n", |
1782 | curr->lockdep_depth, i, | 1781 | curr->lockdep_depth, i, |
1783 | (unsigned long long)chain_key, | 1782 | (unsigned long long)chain_key, |
1784 | (unsigned long long)curr->curr_chain_key); | 1783 | (unsigned long long)curr->curr_chain_key); |
1785 | WARN_ON(1); | ||
1786 | } | 1784 | } |
1787 | #endif | 1785 | #endif |
1788 | } | 1786 | } |
@@ -2584,7 +2582,7 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, | |||
2584 | hlock->trylock = trylock; | 2582 | hlock->trylock = trylock; |
2585 | hlock->read = read; | 2583 | hlock->read = read; |
2586 | hlock->check = check; | 2584 | hlock->check = check; |
2587 | hlock->hardirqs_off = hardirqs_off; | 2585 | hlock->hardirqs_off = !!hardirqs_off; |
2588 | #ifdef CONFIG_LOCK_STAT | 2586 | #ifdef CONFIG_LOCK_STAT |
2589 | hlock->waittime_stamp = 0; | 2587 | hlock->waittime_stamp = 0; |
2590 | hlock->holdtime_stamp = sched_clock(); | 2588 | hlock->holdtime_stamp = sched_clock(); |
diff --git a/kernel/lockdep_internals.h b/kernel/lockdep_internals.h index 55db193d366d..56b196932c08 100644 --- a/kernel/lockdep_internals.h +++ b/kernel/lockdep_internals.h | |||
@@ -50,8 +50,21 @@ extern unsigned int nr_process_chains; | |||
50 | extern unsigned int max_lockdep_depth; | 50 | extern unsigned int max_lockdep_depth; |
51 | extern unsigned int max_recursion_depth; | 51 | extern unsigned int max_recursion_depth; |
52 | 52 | ||
53 | #ifdef CONFIG_PROVE_LOCKING | ||
53 | extern unsigned long lockdep_count_forward_deps(struct lock_class *); | 54 | extern unsigned long lockdep_count_forward_deps(struct lock_class *); |
54 | extern unsigned long lockdep_count_backward_deps(struct lock_class *); | 55 | extern unsigned long lockdep_count_backward_deps(struct lock_class *); |
56 | #else | ||
57 | static inline unsigned long | ||
58 | lockdep_count_forward_deps(struct lock_class *class) | ||
59 | { | ||
60 | return 0; | ||
61 | } | ||
62 | static inline unsigned long | ||
63 | lockdep_count_backward_deps(struct lock_class *class) | ||
64 | { | ||
65 | return 0; | ||
66 | } | ||
67 | #endif | ||
55 | 68 | ||
56 | #ifdef CONFIG_DEBUG_LOCKDEP | 69 | #ifdef CONFIG_DEBUG_LOCKDEP |
57 | /* | 70 | /* |
diff --git a/kernel/lockdep_proc.c b/kernel/lockdep_proc.c index fa19aee604c2..4b194d34d77f 100644 --- a/kernel/lockdep_proc.c +++ b/kernel/lockdep_proc.c | |||
@@ -82,7 +82,6 @@ static void print_name(struct seq_file *m, struct lock_class *class) | |||
82 | 82 | ||
83 | static int l_show(struct seq_file *m, void *v) | 83 | static int l_show(struct seq_file *m, void *v) |
84 | { | 84 | { |
85 | unsigned long nr_forward_deps, nr_backward_deps; | ||
86 | struct lock_class *class = v; | 85 | struct lock_class *class = v; |
87 | struct lock_list *entry; | 86 | struct lock_list *entry; |
88 | char c1, c2, c3, c4; | 87 | char c1, c2, c3, c4; |
@@ -96,11 +95,10 @@ static int l_show(struct seq_file *m, void *v) | |||
96 | #ifdef CONFIG_DEBUG_LOCKDEP | 95 | #ifdef CONFIG_DEBUG_LOCKDEP |
97 | seq_printf(m, " OPS:%8ld", class->ops); | 96 | seq_printf(m, " OPS:%8ld", class->ops); |
98 | #endif | 97 | #endif |
99 | nr_forward_deps = lockdep_count_forward_deps(class); | 98 | #ifdef CONFIG_PROVE_LOCKING |
100 | seq_printf(m, " FD:%5ld", nr_forward_deps); | 99 | seq_printf(m, " FD:%5ld", lockdep_count_forward_deps(class)); |
101 | 100 | seq_printf(m, " BD:%5ld", lockdep_count_backward_deps(class)); | |
102 | nr_backward_deps = lockdep_count_backward_deps(class); | 101 | #endif |
103 | seq_printf(m, " BD:%5ld", nr_backward_deps); | ||
104 | 102 | ||
105 | get_usage_chars(class, &c1, &c2, &c3, &c4); | 103 | get_usage_chars(class, &c1, &c2, &c3, &c4); |
106 | seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); | 104 | seq_printf(m, " %c%c%c%c", c1, c2, c3, c4); |
@@ -325,7 +323,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v) | |||
325 | if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ) | 323 | if (class->usage_mask & LOCKF_ENABLED_HARDIRQS_READ) |
326 | nr_hardirq_read_unsafe++; | 324 | nr_hardirq_read_unsafe++; |
327 | 325 | ||
326 | #ifdef CONFIG_PROVE_LOCKING | ||
328 | sum_forward_deps += lockdep_count_forward_deps(class); | 327 | sum_forward_deps += lockdep_count_forward_deps(class); |
328 | #endif | ||
329 | } | 329 | } |
330 | #ifdef CONFIG_DEBUG_LOCKDEP | 330 | #ifdef CONFIG_DEBUG_LOCKDEP |
331 | DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); | 331 | DEBUG_LOCKS_WARN_ON(debug_atomic_read(&nr_unused_locks) != nr_unused); |
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index 21575fc46d05..1d3ef29a2583 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c | |||
@@ -14,7 +14,6 @@ | |||
14 | */ | 14 | */ |
15 | 15 | ||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/version.h> | ||
18 | #include <linux/nsproxy.h> | 17 | #include <linux/nsproxy.h> |
19 | #include <linux/init_task.h> | 18 | #include <linux/init_task.h> |
20 | #include <linux/mnt_namespace.h> | 19 | #include <linux/mnt_namespace.h> |
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index a0abf9a463f9..80ccac849e46 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <linux/module.h> | 14 | #include <linux/module.h> |
15 | #include <linux/file.h> | 15 | #include <linux/file.h> |
16 | #include <linux/utsname.h> | 16 | #include <linux/utsname.h> |
17 | #include <linux/version.h> | ||
18 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
19 | #include <linux/bitops.h> | 18 | #include <linux/bitops.h> |
20 | #include <linux/genhd.h> | 19 | #include <linux/genhd.h> |
diff --git a/kernel/ptrace.c b/kernel/ptrace.c index 082b3fcb32a0..356699a96d56 100644 --- a/kernel/ptrace.c +++ b/kernel/ptrace.c | |||
@@ -140,7 +140,7 @@ int __ptrace_may_access(struct task_struct *task, unsigned int mode) | |||
140 | if (!dumpable && !capable(CAP_SYS_PTRACE)) | 140 | if (!dumpable && !capable(CAP_SYS_PTRACE)) |
141 | return -EPERM; | 141 | return -EPERM; |
142 | 142 | ||
143 | return security_ptrace(current, task, mode); | 143 | return security_ptrace_may_access(task, mode); |
144 | } | 144 | } |
145 | 145 | ||
146 | bool ptrace_may_access(struct task_struct *task, unsigned int mode) | 146 | bool ptrace_may_access(struct task_struct *task, unsigned int mode) |
@@ -499,8 +499,7 @@ repeat: | |||
499 | goto repeat; | 499 | goto repeat; |
500 | } | 500 | } |
501 | 501 | ||
502 | ret = security_ptrace(current->parent, current, | 502 | ret = security_ptrace_traceme(current->parent); |
503 | PTRACE_MODE_ATTACH); | ||
504 | 503 | ||
505 | /* | 504 | /* |
506 | * Set the ptrace bit in the process ptrace flags. | 505 | * Set the ptrace bit in the process ptrace flags. |
diff --git a/kernel/rcupdate.c b/kernel/rcupdate.c index f14f372cf6f5..467d5940f624 100644 --- a/kernel/rcupdate.c +++ b/kernel/rcupdate.c | |||
@@ -77,6 +77,7 @@ void wakeme_after_rcu(struct rcu_head *head) | |||
77 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), | 77 | * sections are delimited by rcu_read_lock() and rcu_read_unlock(), |
78 | * and may be nested. | 78 | * and may be nested. |
79 | */ | 79 | */ |
80 | void synchronize_rcu(void); /* Makes kernel-doc tools happy */ | ||
80 | synchronize_rcu_xxx(synchronize_rcu, call_rcu) | 81 | synchronize_rcu_xxx(synchronize_rcu, call_rcu) |
81 | EXPORT_SYMBOL_GPL(synchronize_rcu); | 82 | EXPORT_SYMBOL_GPL(synchronize_rcu); |
82 | 83 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index 6a43c8942b05..29e2ec0bd831 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -808,9 +808,9 @@ const_debug unsigned int sysctl_sched_nr_migrate = 32; | |||
808 | 808 | ||
809 | /* | 809 | /* |
810 | * ratelimit for updating the group shares. | 810 | * ratelimit for updating the group shares. |
811 | * default: 0.5ms | 811 | * default: 0.25ms |
812 | */ | 812 | */ |
813 | const_debug unsigned int sysctl_sched_shares_ratelimit = 500000; | 813 | unsigned int sysctl_sched_shares_ratelimit = 250000; |
814 | 814 | ||
815 | /* | 815 | /* |
816 | * period over which we measure -rt task cpu usage in us. | 816 | * period over which we measure -rt task cpu usage in us. |
@@ -4663,6 +4663,52 @@ int __sched wait_for_completion_killable(struct completion *x) | |||
4663 | } | 4663 | } |
4664 | EXPORT_SYMBOL(wait_for_completion_killable); | 4664 | EXPORT_SYMBOL(wait_for_completion_killable); |
4665 | 4665 | ||
4666 | /** | ||
4667 | * try_wait_for_completion - try to decrement a completion without blocking | ||
4668 | * @x: completion structure | ||
4669 | * | ||
4670 | * Returns: 0 if a decrement cannot be done without blocking | ||
4671 | * 1 if a decrement succeeded. | ||
4672 | * | ||
4673 | * If a completion is being used as a counting completion, | ||
4674 | * attempt to decrement the counter without blocking. This | ||
4675 | * enables us to avoid waiting if the resource the completion | ||
4676 | * is protecting is not available. | ||
4677 | */ | ||
4678 | bool try_wait_for_completion(struct completion *x) | ||
4679 | { | ||
4680 | int ret = 1; | ||
4681 | |||
4682 | spin_lock_irq(&x->wait.lock); | ||
4683 | if (!x->done) | ||
4684 | ret = 0; | ||
4685 | else | ||
4686 | x->done--; | ||
4687 | spin_unlock_irq(&x->wait.lock); | ||
4688 | return ret; | ||
4689 | } | ||
4690 | EXPORT_SYMBOL(try_wait_for_completion); | ||
4691 | |||
4692 | /** | ||
4693 | * completion_done - Test to see if a completion has any waiters | ||
4694 | * @x: completion structure | ||
4695 | * | ||
4696 | * Returns: 0 if there are waiters (wait_for_completion() in progress) | ||
4697 | * 1 if there are no waiters. | ||
4698 | * | ||
4699 | */ | ||
4700 | bool completion_done(struct completion *x) | ||
4701 | { | ||
4702 | int ret = 1; | ||
4703 | |||
4704 | spin_lock_irq(&x->wait.lock); | ||
4705 | if (!x->done) | ||
4706 | ret = 0; | ||
4707 | spin_unlock_irq(&x->wait.lock); | ||
4708 | return ret; | ||
4709 | } | ||
4710 | EXPORT_SYMBOL(completion_done); | ||
4711 | |||
4666 | static long __sched | 4712 | static long __sched |
4667 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) | 4713 | sleep_on_common(wait_queue_head_t *q, int state, long timeout) |
4668 | { | 4714 | { |
@@ -5734,6 +5780,8 @@ static inline void sched_init_granularity(void) | |||
5734 | sysctl_sched_latency = limit; | 5780 | sysctl_sched_latency = limit; |
5735 | 5781 | ||
5736 | sysctl_sched_wakeup_granularity *= factor; | 5782 | sysctl_sched_wakeup_granularity *= factor; |
5783 | |||
5784 | sysctl_sched_shares_ratelimit *= factor; | ||
5737 | } | 5785 | } |
5738 | 5786 | ||
5739 | #ifdef CONFIG_SMP | 5787 | #ifdef CONFIG_SMP |
@@ -8456,8 +8504,8 @@ struct task_group *sched_create_group(struct task_group *parent) | |||
8456 | WARN_ON(!parent); /* root should already exist */ | 8504 | WARN_ON(!parent); /* root should already exist */ |
8457 | 8505 | ||
8458 | tg->parent = parent; | 8506 | tg->parent = parent; |
8459 | list_add_rcu(&tg->siblings, &parent->children); | ||
8460 | INIT_LIST_HEAD(&tg->children); | 8507 | INIT_LIST_HEAD(&tg->children); |
8508 | list_add_rcu(&tg->siblings, &parent->children); | ||
8461 | spin_unlock_irqrestore(&task_group_lock, flags); | 8509 | spin_unlock_irqrestore(&task_group_lock, flags); |
8462 | 8510 | ||
8463 | return tg; | 8511 | return tg; |
diff --git a/kernel/sched_features.h b/kernel/sched_features.h index 862b06bd560a..9353ca78154e 100644 --- a/kernel/sched_features.h +++ b/kernel/sched_features.h | |||
@@ -8,6 +8,6 @@ SCHED_FEAT(SYNC_WAKEUPS, 1) | |||
8 | SCHED_FEAT(HRTICK, 1) | 8 | SCHED_FEAT(HRTICK, 1) |
9 | SCHED_FEAT(DOUBLE_TICK, 0) | 9 | SCHED_FEAT(DOUBLE_TICK, 0) |
10 | SCHED_FEAT(ASYM_GRAN, 1) | 10 | SCHED_FEAT(ASYM_GRAN, 1) |
11 | SCHED_FEAT(LB_BIAS, 0) | 11 | SCHED_FEAT(LB_BIAS, 1) |
12 | SCHED_FEAT(LB_WAKEUP_UPDATE, 1) | 12 | SCHED_FEAT(LB_WAKEUP_UPDATE, 1) |
13 | SCHED_FEAT(ASYM_EFF_LOAD, 1) | 13 | SCHED_FEAT(ASYM_EFF_LOAD, 1) |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 6163e4cf885b..998ba54b4543 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
@@ -298,7 +298,7 @@ static void __disable_runtime(struct rq *rq) | |||
298 | struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); | 298 | struct rt_rq *iter = sched_rt_period_rt_rq(rt_b, i); |
299 | s64 diff; | 299 | s64 diff; |
300 | 300 | ||
301 | if (iter == rt_rq) | 301 | if (iter == rt_rq || iter->rt_runtime == RUNTIME_INF) |
302 | continue; | 302 | continue; |
303 | 303 | ||
304 | spin_lock(&iter->rt_runtime_lock); | 304 | spin_lock(&iter->rt_runtime_lock); |
diff --git a/kernel/signal.c b/kernel/signal.c index c539f60c6f41..e661b01d340f 100644 --- a/kernel/signal.c +++ b/kernel/signal.c | |||
@@ -1338,6 +1338,7 @@ int do_notify_parent(struct task_struct *tsk, int sig) | |||
1338 | struct siginfo info; | 1338 | struct siginfo info; |
1339 | unsigned long flags; | 1339 | unsigned long flags; |
1340 | struct sighand_struct *psig; | 1340 | struct sighand_struct *psig; |
1341 | int ret = sig; | ||
1341 | 1342 | ||
1342 | BUG_ON(sig == -1); | 1343 | BUG_ON(sig == -1); |
1343 | 1344 | ||
@@ -1402,7 +1403,7 @@ int do_notify_parent(struct task_struct *tsk, int sig) | |||
1402 | * is implementation-defined: we do (if you don't want | 1403 | * is implementation-defined: we do (if you don't want |
1403 | * it, just use SIG_IGN instead). | 1404 | * it, just use SIG_IGN instead). |
1404 | */ | 1405 | */ |
1405 | tsk->exit_signal = -1; | 1406 | ret = tsk->exit_signal = -1; |
1406 | if (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN) | 1407 | if (psig->action[SIGCHLD-1].sa.sa_handler == SIG_IGN) |
1407 | sig = -1; | 1408 | sig = -1; |
1408 | } | 1409 | } |
@@ -1411,7 +1412,7 @@ int do_notify_parent(struct task_struct *tsk, int sig) | |||
1411 | __wake_up_parent(tsk, tsk->parent); | 1412 | __wake_up_parent(tsk, tsk->parent); |
1412 | spin_unlock_irqrestore(&psig->siglock, flags); | 1413 | spin_unlock_irqrestore(&psig->siglock, flags); |
1413 | 1414 | ||
1414 | return sig; | 1415 | return ret; |
1415 | } | 1416 | } |
1416 | 1417 | ||
1417 | static void do_notify_parent_cldstop(struct task_struct *tsk, int why) | 1418 | static void do_notify_parent_cldstop(struct task_struct *tsk, int why) |
diff --git a/kernel/spinlock.c b/kernel/spinlock.c index 44baeea94ab9..29ab20749dd3 100644 --- a/kernel/spinlock.c +++ b/kernel/spinlock.c | |||
@@ -290,7 +290,6 @@ void __lockfunc _spin_lock_nested(spinlock_t *lock, int subclass) | |||
290 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); | 290 | spin_acquire(&lock->dep_map, subclass, 0, _RET_IP_); |
291 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | 291 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); |
292 | } | 292 | } |
293 | |||
294 | EXPORT_SYMBOL(_spin_lock_nested); | 293 | EXPORT_SYMBOL(_spin_lock_nested); |
295 | 294 | ||
296 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) | 295 | unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclass) |
@@ -312,7 +311,6 @@ unsigned long __lockfunc _spin_lock_irqsave_nested(spinlock_t *lock, int subclas | |||
312 | #endif | 311 | #endif |
313 | return flags; | 312 | return flags; |
314 | } | 313 | } |
315 | |||
316 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); | 314 | EXPORT_SYMBOL(_spin_lock_irqsave_nested); |
317 | 315 | ||
318 | void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, | 316 | void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, |
@@ -322,7 +320,6 @@ void __lockfunc _spin_lock_nest_lock(spinlock_t *lock, | |||
322 | spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); | 320 | spin_acquire_nest(&lock->dep_map, 0, 0, nest_lock, _RET_IP_); |
323 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); | 321 | LOCK_CONTENDED(lock, _raw_spin_trylock, _raw_spin_lock); |
324 | } | 322 | } |
325 | |||
326 | EXPORT_SYMBOL(_spin_lock_nest_lock); | 323 | EXPORT_SYMBOL(_spin_lock_nest_lock); |
327 | 324 | ||
328 | #endif | 325 | #endif |
diff --git a/kernel/sys.c b/kernel/sys.c index c01858090a98..038a7bc0901d 100644 --- a/kernel/sys.c +++ b/kernel/sys.c | |||
@@ -169,9 +169,9 @@ asmlinkage long sys_setpriority(int which, int who, int niceval) | |||
169 | pgrp = find_vpid(who); | 169 | pgrp = find_vpid(who); |
170 | else | 170 | else |
171 | pgrp = task_pgrp(current); | 171 | pgrp = task_pgrp(current); |
172 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 172 | do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { |
173 | error = set_one_prio(p, niceval, error); | 173 | error = set_one_prio(p, niceval, error); |
174 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); | 174 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); |
175 | break; | 175 | break; |
176 | case PRIO_USER: | 176 | case PRIO_USER: |
177 | user = current->user; | 177 | user = current->user; |
@@ -229,11 +229,11 @@ asmlinkage long sys_getpriority(int which, int who) | |||
229 | pgrp = find_vpid(who); | 229 | pgrp = find_vpid(who); |
230 | else | 230 | else |
231 | pgrp = task_pgrp(current); | 231 | pgrp = task_pgrp(current); |
232 | do_each_pid_task(pgrp, PIDTYPE_PGID, p) { | 232 | do_each_pid_thread(pgrp, PIDTYPE_PGID, p) { |
233 | niceval = 20 - task_nice(p); | 233 | niceval = 20 - task_nice(p); |
234 | if (niceval > retval) | 234 | if (niceval > retval) |
235 | retval = niceval; | 235 | retval = niceval; |
236 | } while_each_pid_task(pgrp, PIDTYPE_PGID, p); | 236 | } while_each_pid_thread(pgrp, PIDTYPE_PGID, p); |
237 | break; | 237 | break; |
238 | case PRIO_USER: | 238 | case PRIO_USER: |
239 | user = current->user; | 239 | user = current->user; |
@@ -274,7 +274,7 @@ void emergency_restart(void) | |||
274 | } | 274 | } |
275 | EXPORT_SYMBOL_GPL(emergency_restart); | 275 | EXPORT_SYMBOL_GPL(emergency_restart); |
276 | 276 | ||
277 | static void kernel_restart_prepare(char *cmd) | 277 | void kernel_restart_prepare(char *cmd) |
278 | { | 278 | { |
279 | blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); | 279 | blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); |
280 | system_state = SYSTEM_RESTART; | 280 | system_state = SYSTEM_RESTART; |
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index f5da526424a9..7a46bde78c66 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -643,17 +643,21 @@ void tick_setup_sched_timer(void) | |||
643 | ts->nohz_mode = NOHZ_MODE_HIGHRES; | 643 | ts->nohz_mode = NOHZ_MODE_HIGHRES; |
644 | #endif | 644 | #endif |
645 | } | 645 | } |
646 | #endif /* HIGH_RES_TIMERS */ | ||
646 | 647 | ||
648 | #if defined CONFIG_NO_HZ || defined CONFIG_HIGH_RES_TIMERS | ||
647 | void tick_cancel_sched_timer(int cpu) | 649 | void tick_cancel_sched_timer(int cpu) |
648 | { | 650 | { |
649 | struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); | 651 | struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu); |
650 | 652 | ||
653 | # ifdef CONFIG_HIGH_RES_TIMERS | ||
651 | if (ts->sched_timer.base) | 654 | if (ts->sched_timer.base) |
652 | hrtimer_cancel(&ts->sched_timer); | 655 | hrtimer_cancel(&ts->sched_timer); |
656 | # endif | ||
653 | 657 | ||
654 | ts->nohz_mode = NOHZ_MODE_INACTIVE; | 658 | ts->nohz_mode = NOHZ_MODE_INACTIVE; |
655 | } | 659 | } |
656 | #endif /* HIGH_RES_TIMERS */ | 660 | #endif |
657 | 661 | ||
658 | /** | 662 | /** |
659 | * Async notification about clocksource changes | 663 | * Async notification about clocksource changes |
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index a9ab0596de44..532858fa5b88 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
@@ -6,7 +6,6 @@ | |||
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include <linux/module.h> | 8 | #include <linux/module.h> |
9 | #include <linux/version.h> | ||
10 | #include <linux/nsproxy.h> | 9 | #include <linux/nsproxy.h> |
11 | #include <linux/slab.h> | 10 | #include <linux/slab.h> |
12 | #include <linux/user_namespace.h> | 11 | #include <linux/user_namespace.h> |
diff --git a/kernel/utsname.c b/kernel/utsname.c index 64d398f12444..815237a55af8 100644 --- a/kernel/utsname.c +++ b/kernel/utsname.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/uts.h> | 13 | #include <linux/uts.h> |
14 | #include <linux/utsname.h> | 14 | #include <linux/utsname.h> |
15 | #include <linux/version.h> | ||
16 | #include <linux/err.h> | 15 | #include <linux/err.h> |
17 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
18 | 17 | ||
diff --git a/kernel/utsname_sysctl.c b/kernel/utsname_sysctl.c index fe3a56c2256d..4ab9659d269e 100644 --- a/kernel/utsname_sysctl.c +++ b/kernel/utsname_sysctl.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
13 | #include <linux/uts.h> | 13 | #include <linux/uts.h> |
14 | #include <linux/utsname.h> | 14 | #include <linux/utsname.h> |
15 | #include <linux/version.h> | ||
16 | #include <linux/sysctl.h> | 15 | #include <linux/sysctl.h> |
17 | 16 | ||
18 | static void *get_uts(ctl_table *table, int write) | 17 | static void *get_uts(ctl_table *table, int write) |
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 800ac8485544..8b5a7d304a5f 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug | |||
@@ -693,6 +693,14 @@ config LATENCYTOP | |||
693 | Enable this option if you want to use the LatencyTOP tool | 693 | Enable this option if you want to use the LatencyTOP tool |
694 | to find out which userspace is blocking on what kernel operations. | 694 | to find out which userspace is blocking on what kernel operations. |
695 | 695 | ||
696 | config SYSCTL_SYSCALL_CHECK | ||
697 | bool "Sysctl checks" | ||
698 | depends on SYSCTL_SYSCALL | ||
699 | ---help--- | ||
700 | sys_sysctl uses binary paths that have been found challenging | ||
701 | to properly maintain and use. This enables checks that help | ||
702 | you to keep things correct. | ||
703 | |||
696 | source kernel/trace/Kconfig | 704 | source kernel/trace/Kconfig |
697 | 705 | ||
698 | config PROVIDE_OHCI1394_DMA_INIT | 706 | config PROVIDE_OHCI1394_DMA_INIT |
diff --git a/lib/kobject.c b/lib/kobject.c index bd732ffebc85..fbf0ae282376 100644 --- a/lib/kobject.c +++ b/lib/kobject.c | |||
@@ -223,8 +223,7 @@ static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt, | |||
223 | return -ENOMEM; | 223 | return -ENOMEM; |
224 | 224 | ||
225 | /* ewww... some of these buggers have '/' in the name ... */ | 225 | /* ewww... some of these buggers have '/' in the name ... */ |
226 | s = strchr(kobj->name, '/'); | 226 | while ((s = strchr(kobj->name, '/'))) |
227 | if (s) | ||
228 | s[0] = '!'; | 227 | s[0] = '!'; |
229 | 228 | ||
230 | kfree(old_name); | 229 | kfree(old_name); |
@@ -462,6 +462,8 @@ void __init lmb_enforce_memory_limit(u64 memory_limit) | |||
462 | if (lmb.memory.region[0].size < lmb.rmo_size) | 462 | if (lmb.memory.region[0].size < lmb.rmo_size) |
463 | lmb.rmo_size = lmb.memory.region[0].size; | 463 | lmb.rmo_size = lmb.memory.region[0].size; |
464 | 464 | ||
465 | memory_limit = lmb_end_of_DRAM(); | ||
466 | |||
465 | /* And truncate any reserves above the limit also. */ | 467 | /* And truncate any reserves above the limit also. */ |
466 | for (i = 0; i < lmb.reserved.cnt; i++) { | 468 | for (i = 0; i < lmb.reserved.cnt; i++) { |
467 | p = &lmb.reserved.region[i]; | 469 | p = &lmb.reserved.region[i]; |
diff --git a/mm/bootmem.c b/mm/bootmem.c index 4af15d0340ad..ad8eec6e44a8 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c | |||
@@ -405,6 +405,29 @@ int __init reserve_bootmem(unsigned long addr, unsigned long size, | |||
405 | } | 405 | } |
406 | #endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */ | 406 | #endif /* !CONFIG_HAVE_ARCH_BOOTMEM_NODE */ |
407 | 407 | ||
408 | static unsigned long align_idx(struct bootmem_data *bdata, unsigned long idx, | ||
409 | unsigned long step) | ||
410 | { | ||
411 | unsigned long base = bdata->node_min_pfn; | ||
412 | |||
413 | /* | ||
414 | * Align the index with respect to the node start so that the | ||
415 | * combination of both satisfies the requested alignment. | ||
416 | */ | ||
417 | |||
418 | return ALIGN(base + idx, step) - base; | ||
419 | } | ||
420 | |||
421 | static unsigned long align_off(struct bootmem_data *bdata, unsigned long off, | ||
422 | unsigned long align) | ||
423 | { | ||
424 | unsigned long base = PFN_PHYS(bdata->node_min_pfn); | ||
425 | |||
426 | /* Same as align_idx for byte offsets */ | ||
427 | |||
428 | return ALIGN(base + off, align) - base; | ||
429 | } | ||
430 | |||
408 | static void * __init alloc_bootmem_core(struct bootmem_data *bdata, | 431 | static void * __init alloc_bootmem_core(struct bootmem_data *bdata, |
409 | unsigned long size, unsigned long align, | 432 | unsigned long size, unsigned long align, |
410 | unsigned long goal, unsigned long limit) | 433 | unsigned long goal, unsigned long limit) |
@@ -441,7 +464,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata, | |||
441 | else | 464 | else |
442 | start = ALIGN(min, step); | 465 | start = ALIGN(min, step); |
443 | 466 | ||
444 | sidx = start - bdata->node_min_pfn;; | 467 | sidx = start - bdata->node_min_pfn; |
445 | midx = max - bdata->node_min_pfn; | 468 | midx = max - bdata->node_min_pfn; |
446 | 469 | ||
447 | if (bdata->hint_idx > sidx) { | 470 | if (bdata->hint_idx > sidx) { |
@@ -450,7 +473,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata, | |||
450 | * catch the fallback below. | 473 | * catch the fallback below. |
451 | */ | 474 | */ |
452 | fallback = sidx + 1; | 475 | fallback = sidx + 1; |
453 | sidx = ALIGN(bdata->hint_idx, step); | 476 | sidx = align_idx(bdata, bdata->hint_idx, step); |
454 | } | 477 | } |
455 | 478 | ||
456 | while (1) { | 479 | while (1) { |
@@ -459,7 +482,7 @@ static void * __init alloc_bootmem_core(struct bootmem_data *bdata, | |||
459 | unsigned long eidx, i, start_off, end_off; | 482 | unsigned long eidx, i, start_off, end_off; |
460 | find_block: | 483 | find_block: |
461 | sidx = find_next_zero_bit(bdata->node_bootmem_map, midx, sidx); | 484 | sidx = find_next_zero_bit(bdata->node_bootmem_map, midx, sidx); |
462 | sidx = ALIGN(sidx, step); | 485 | sidx = align_idx(bdata, sidx, step); |
463 | eidx = sidx + PFN_UP(size); | 486 | eidx = sidx + PFN_UP(size); |
464 | 487 | ||
465 | if (sidx >= midx || eidx > midx) | 488 | if (sidx >= midx || eidx > midx) |
@@ -467,15 +490,15 @@ find_block: | |||
467 | 490 | ||
468 | for (i = sidx; i < eidx; i++) | 491 | for (i = sidx; i < eidx; i++) |
469 | if (test_bit(i, bdata->node_bootmem_map)) { | 492 | if (test_bit(i, bdata->node_bootmem_map)) { |
470 | sidx = ALIGN(i, step); | 493 | sidx = align_idx(bdata, i, step); |
471 | if (sidx == i) | 494 | if (sidx == i) |
472 | sidx += step; | 495 | sidx += step; |
473 | goto find_block; | 496 | goto find_block; |
474 | } | 497 | } |
475 | 498 | ||
476 | if (bdata->last_end_off && | 499 | if (bdata->last_end_off & (PAGE_SIZE - 1) && |
477 | PFN_DOWN(bdata->last_end_off) + 1 == sidx) | 500 | PFN_DOWN(bdata->last_end_off) + 1 == sidx) |
478 | start_off = ALIGN(bdata->last_end_off, align); | 501 | start_off = align_off(bdata, bdata->last_end_off, align); |
479 | else | 502 | else |
480 | start_off = PFN_PHYS(sidx); | 503 | start_off = PFN_PHYS(sidx); |
481 | 504 | ||
@@ -499,7 +522,7 @@ find_block: | |||
499 | } | 522 | } |
500 | 523 | ||
501 | if (fallback) { | 524 | if (fallback) { |
502 | sidx = ALIGN(fallback - 1, step); | 525 | sidx = align_idx(bdata, fallback - 1, step); |
503 | fallback = 0; | 526 | fallback = 0; |
504 | goto find_block; | 527 | goto find_block; |
505 | } | 528 | } |
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c index 380ab402d711..b5167dfb2f2d 100644 --- a/mm/filemap_xip.c +++ b/mm/filemap_xip.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/rmap.h> | 15 | #include <linux/rmap.h> |
16 | #include <linux/mmu_notifier.h> | 16 | #include <linux/mmu_notifier.h> |
17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
18 | #include <linux/seqlock.h> | ||
19 | #include <linux/mutex.h> | ||
18 | #include <asm/tlbflush.h> | 20 | #include <asm/tlbflush.h> |
19 | #include <asm/io.h> | 21 | #include <asm/io.h> |
20 | 22 | ||
@@ -22,22 +24,18 @@ | |||
22 | * We do use our own empty page to avoid interference with other users | 24 | * We do use our own empty page to avoid interference with other users |
23 | * of ZERO_PAGE(), such as /dev/zero | 25 | * of ZERO_PAGE(), such as /dev/zero |
24 | */ | 26 | */ |
27 | static DEFINE_MUTEX(xip_sparse_mutex); | ||
28 | static seqcount_t xip_sparse_seq = SEQCNT_ZERO; | ||
25 | static struct page *__xip_sparse_page; | 29 | static struct page *__xip_sparse_page; |
26 | 30 | ||
31 | /* called under xip_sparse_mutex */ | ||
27 | static struct page *xip_sparse_page(void) | 32 | static struct page *xip_sparse_page(void) |
28 | { | 33 | { |
29 | if (!__xip_sparse_page) { | 34 | if (!__xip_sparse_page) { |
30 | struct page *page = alloc_page(GFP_HIGHUSER | __GFP_ZERO); | 35 | struct page *page = alloc_page(GFP_HIGHUSER | __GFP_ZERO); |
31 | 36 | ||
32 | if (page) { | 37 | if (page) |
33 | static DEFINE_SPINLOCK(xip_alloc_lock); | 38 | __xip_sparse_page = page; |
34 | spin_lock(&xip_alloc_lock); | ||
35 | if (!__xip_sparse_page) | ||
36 | __xip_sparse_page = page; | ||
37 | else | ||
38 | __free_page(page); | ||
39 | spin_unlock(&xip_alloc_lock); | ||
40 | } | ||
41 | } | 39 | } |
42 | return __xip_sparse_page; | 40 | return __xip_sparse_page; |
43 | } | 41 | } |
@@ -174,18 +172,23 @@ __xip_unmap (struct address_space * mapping, | |||
174 | pte_t pteval; | 172 | pte_t pteval; |
175 | spinlock_t *ptl; | 173 | spinlock_t *ptl; |
176 | struct page *page; | 174 | struct page *page; |
175 | unsigned count; | ||
176 | int locked = 0; | ||
177 | |||
178 | count = read_seqcount_begin(&xip_sparse_seq); | ||
177 | 179 | ||
178 | page = __xip_sparse_page; | 180 | page = __xip_sparse_page; |
179 | if (!page) | 181 | if (!page) |
180 | return; | 182 | return; |
181 | 183 | ||
184 | retry: | ||
182 | spin_lock(&mapping->i_mmap_lock); | 185 | spin_lock(&mapping->i_mmap_lock); |
183 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { | 186 | vma_prio_tree_foreach(vma, &iter, &mapping->i_mmap, pgoff, pgoff) { |
184 | mm = vma->vm_mm; | 187 | mm = vma->vm_mm; |
185 | address = vma->vm_start + | 188 | address = vma->vm_start + |
186 | ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); | 189 | ((pgoff - vma->vm_pgoff) << PAGE_SHIFT); |
187 | BUG_ON(address < vma->vm_start || address >= vma->vm_end); | 190 | BUG_ON(address < vma->vm_start || address >= vma->vm_end); |
188 | pte = page_check_address(page, mm, address, &ptl); | 191 | pte = page_check_address(page, mm, address, &ptl, 1); |
189 | if (pte) { | 192 | if (pte) { |
190 | /* Nuke the page table entry. */ | 193 | /* Nuke the page table entry. */ |
191 | flush_cache_page(vma, address, pte_pfn(*pte)); | 194 | flush_cache_page(vma, address, pte_pfn(*pte)); |
@@ -198,6 +201,14 @@ __xip_unmap (struct address_space * mapping, | |||
198 | } | 201 | } |
199 | } | 202 | } |
200 | spin_unlock(&mapping->i_mmap_lock); | 203 | spin_unlock(&mapping->i_mmap_lock); |
204 | |||
205 | if (locked) { | ||
206 | mutex_unlock(&xip_sparse_mutex); | ||
207 | } else if (read_seqcount_retry(&xip_sparse_seq, count)) { | ||
208 | mutex_lock(&xip_sparse_mutex); | ||
209 | locked = 1; | ||
210 | goto retry; | ||
211 | } | ||
201 | } | 212 | } |
202 | 213 | ||
203 | /* | 214 | /* |
@@ -218,7 +229,7 @@ static int xip_file_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
218 | int error; | 229 | int error; |
219 | 230 | ||
220 | /* XXX: are VM_FAULT_ codes OK? */ | 231 | /* XXX: are VM_FAULT_ codes OK? */ |
221 | 232 | again: | |
222 | size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 233 | size = (i_size_read(inode) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
223 | if (vmf->pgoff >= size) | 234 | if (vmf->pgoff >= size) |
224 | return VM_FAULT_SIGBUS; | 235 | return VM_FAULT_SIGBUS; |
@@ -237,8 +248,10 @@ static int xip_file_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
237 | int err; | 248 | int err; |
238 | 249 | ||
239 | /* maybe shared writable, allocate new block */ | 250 | /* maybe shared writable, allocate new block */ |
251 | mutex_lock(&xip_sparse_mutex); | ||
240 | error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 1, | 252 | error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 1, |
241 | &xip_mem, &xip_pfn); | 253 | &xip_mem, &xip_pfn); |
254 | mutex_unlock(&xip_sparse_mutex); | ||
242 | if (error) | 255 | if (error) |
243 | return VM_FAULT_SIGBUS; | 256 | return VM_FAULT_SIGBUS; |
244 | /* unmap sparse mappings at pgoff from all other vmas */ | 257 | /* unmap sparse mappings at pgoff from all other vmas */ |
@@ -252,14 +265,34 @@ found: | |||
252 | BUG_ON(err); | 265 | BUG_ON(err); |
253 | return VM_FAULT_NOPAGE; | 266 | return VM_FAULT_NOPAGE; |
254 | } else { | 267 | } else { |
268 | int err, ret = VM_FAULT_OOM; | ||
269 | |||
270 | mutex_lock(&xip_sparse_mutex); | ||
271 | write_seqcount_begin(&xip_sparse_seq); | ||
272 | error = mapping->a_ops->get_xip_mem(mapping, vmf->pgoff, 0, | ||
273 | &xip_mem, &xip_pfn); | ||
274 | if (unlikely(!error)) { | ||
275 | write_seqcount_end(&xip_sparse_seq); | ||
276 | mutex_unlock(&xip_sparse_mutex); | ||
277 | goto again; | ||
278 | } | ||
279 | if (error != -ENODATA) | ||
280 | goto out; | ||
255 | /* not shared and writable, use xip_sparse_page() */ | 281 | /* not shared and writable, use xip_sparse_page() */ |
256 | page = xip_sparse_page(); | 282 | page = xip_sparse_page(); |
257 | if (!page) | 283 | if (!page) |
258 | return VM_FAULT_OOM; | 284 | goto out; |
285 | err = vm_insert_page(vma, (unsigned long)vmf->virtual_address, | ||
286 | page); | ||
287 | if (err == -ENOMEM) | ||
288 | goto out; | ||
259 | 289 | ||
260 | page_cache_get(page); | 290 | ret = VM_FAULT_NOPAGE; |
261 | vmf->page = page; | 291 | out: |
262 | return 0; | 292 | write_seqcount_end(&xip_sparse_seq); |
293 | mutex_unlock(&xip_sparse_mutex); | ||
294 | |||
295 | return ret; | ||
263 | } | 296 | } |
264 | } | 297 | } |
265 | 298 | ||
@@ -308,8 +341,10 @@ __xip_file_write(struct file *filp, const char __user *buf, | |||
308 | &xip_mem, &xip_pfn); | 341 | &xip_mem, &xip_pfn); |
309 | if (status == -ENODATA) { | 342 | if (status == -ENODATA) { |
310 | /* we allocate a new page unmap it */ | 343 | /* we allocate a new page unmap it */ |
344 | mutex_lock(&xip_sparse_mutex); | ||
311 | status = a_ops->get_xip_mem(mapping, index, 1, | 345 | status = a_ops->get_xip_mem(mapping, index, 1, |
312 | &xip_mem, &xip_pfn); | 346 | &xip_mem, &xip_pfn); |
347 | mutex_unlock(&xip_sparse_mutex); | ||
313 | if (!status) | 348 | if (!status) |
314 | /* unmap page at pgoff from all other vmas */ | 349 | /* unmap page at pgoff from all other vmas */ |
315 | __xip_unmap(mapping, index); | 350 | __xip_unmap(mapping, index); |
diff --git a/mm/mm_init.c b/mm/mm_init.c index 936ef2efd892..4e0e26591dfa 100644 --- a/mm/mm_init.c +++ b/mm/mm_init.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include "internal.h" | 12 | #include "internal.h" |
13 | 13 | ||
14 | #ifdef CONFIG_DEBUG_MEMORY_INIT | 14 | #ifdef CONFIG_DEBUG_MEMORY_INIT |
15 | int __meminitdata mminit_loglevel; | 15 | int mminit_loglevel; |
16 | 16 | ||
17 | #ifndef SECTIONS_SHIFT | 17 | #ifndef SECTIONS_SHIFT |
18 | #define SECTIONS_SHIFT 0 | 18 | #define SECTIONS_SHIFT 0 |
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 8a5467ee6265..64e5b4bcd964 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
27 | #include <linux/notifier.h> | 27 | #include <linux/notifier.h> |
28 | #include <linux/memcontrol.h> | 28 | #include <linux/memcontrol.h> |
29 | #include <linux/security.h> | ||
29 | 30 | ||
30 | int sysctl_panic_on_oom; | 31 | int sysctl_panic_on_oom; |
31 | int sysctl_oom_kill_allocating_task; | 32 | int sysctl_oom_kill_allocating_task; |
@@ -128,7 +129,8 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) | |||
128 | * Superuser processes are usually more important, so we make it | 129 | * Superuser processes are usually more important, so we make it |
129 | * less likely that we kill those. | 130 | * less likely that we kill those. |
130 | */ | 131 | */ |
131 | if (__capable(p, CAP_SYS_ADMIN) || __capable(p, CAP_SYS_RESOURCE)) | 132 | if (has_capability(p, CAP_SYS_ADMIN) || |
133 | has_capability(p, CAP_SYS_RESOURCE)) | ||
132 | points /= 4; | 134 | points /= 4; |
133 | 135 | ||
134 | /* | 136 | /* |
@@ -137,7 +139,7 @@ unsigned long badness(struct task_struct *p, unsigned long uptime) | |||
137 | * tend to only have this flag set on applications they think | 139 | * tend to only have this flag set on applications they think |
138 | * of as important. | 140 | * of as important. |
139 | */ | 141 | */ |
140 | if (__capable(p, CAP_SYS_RAWIO)) | 142 | if (has_capability(p, CAP_SYS_RAWIO)) |
141 | points /= 4; | 143 | points /= 4; |
142 | 144 | ||
143 | /* | 145 | /* |
@@ -224,10 +224,14 @@ unsigned long page_address_in_vma(struct page *page, struct vm_area_struct *vma) | |||
224 | /* | 224 | /* |
225 | * Check that @page is mapped at @address into @mm. | 225 | * Check that @page is mapped at @address into @mm. |
226 | * | 226 | * |
227 | * If @sync is false, page_check_address may perform a racy check to avoid | ||
228 | * the page table lock when the pte is not present (helpful when reclaiming | ||
229 | * highly shared pages). | ||
230 | * | ||
227 | * On success returns with pte mapped and locked. | 231 | * On success returns with pte mapped and locked. |
228 | */ | 232 | */ |
229 | pte_t *page_check_address(struct page *page, struct mm_struct *mm, | 233 | pte_t *page_check_address(struct page *page, struct mm_struct *mm, |
230 | unsigned long address, spinlock_t **ptlp) | 234 | unsigned long address, spinlock_t **ptlp, int sync) |
231 | { | 235 | { |
232 | pgd_t *pgd; | 236 | pgd_t *pgd; |
233 | pud_t *pud; | 237 | pud_t *pud; |
@@ -249,7 +253,7 @@ pte_t *page_check_address(struct page *page, struct mm_struct *mm, | |||
249 | 253 | ||
250 | pte = pte_offset_map(pmd, address); | 254 | pte = pte_offset_map(pmd, address); |
251 | /* Make a quick check before getting the lock */ | 255 | /* Make a quick check before getting the lock */ |
252 | if (!pte_present(*pte)) { | 256 | if (!sync && !pte_present(*pte)) { |
253 | pte_unmap(pte); | 257 | pte_unmap(pte); |
254 | return NULL; | 258 | return NULL; |
255 | } | 259 | } |
@@ -281,7 +285,7 @@ static int page_referenced_one(struct page *page, | |||
281 | if (address == -EFAULT) | 285 | if (address == -EFAULT) |
282 | goto out; | 286 | goto out; |
283 | 287 | ||
284 | pte = page_check_address(page, mm, address, &ptl); | 288 | pte = page_check_address(page, mm, address, &ptl, 0); |
285 | if (!pte) | 289 | if (!pte) |
286 | goto out; | 290 | goto out; |
287 | 291 | ||
@@ -450,7 +454,7 @@ static int page_mkclean_one(struct page *page, struct vm_area_struct *vma) | |||
450 | if (address == -EFAULT) | 454 | if (address == -EFAULT) |
451 | goto out; | 455 | goto out; |
452 | 456 | ||
453 | pte = page_check_address(page, mm, address, &ptl); | 457 | pte = page_check_address(page, mm, address, &ptl, 1); |
454 | if (!pte) | 458 | if (!pte) |
455 | goto out; | 459 | goto out; |
456 | 460 | ||
@@ -659,23 +663,30 @@ void page_remove_rmap(struct page *page, struct vm_area_struct *vma) | |||
659 | } | 663 | } |
660 | 664 | ||
661 | /* | 665 | /* |
662 | * It would be tidy to reset the PageAnon mapping here, | 666 | * Now that the last pte has gone, s390 must transfer dirty |
663 | * but that might overwrite a racing page_add_anon_rmap | 667 | * flag from storage key to struct page. We can usually skip |
664 | * which increments mapcount after us but sets mapping | 668 | * this if the page is anon, so about to be freed; but perhaps |
665 | * before us: so leave the reset to free_hot_cold_page, | 669 | * not if it's in swapcache - there might be another pte slot |
666 | * and remember that it's only reliable while mapped. | 670 | * containing the swap entry, but page not yet written to swap. |
667 | * Leaving it set also helps swapoff to reinstate ptes | ||
668 | * faster for those pages still in swapcache. | ||
669 | */ | 671 | */ |
670 | if ((!PageAnon(page) || PageSwapCache(page)) && | 672 | if ((!PageAnon(page) || PageSwapCache(page)) && |
671 | page_test_dirty(page)) { | 673 | page_test_dirty(page)) { |
672 | page_clear_dirty(page); | 674 | page_clear_dirty(page); |
673 | set_page_dirty(page); | 675 | set_page_dirty(page); |
674 | } | 676 | } |
675 | mem_cgroup_uncharge_page(page); | ||
676 | 677 | ||
678 | mem_cgroup_uncharge_page(page); | ||
677 | __dec_zone_page_state(page, | 679 | __dec_zone_page_state(page, |
678 | PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED); | 680 | PageAnon(page) ? NR_ANON_PAGES : NR_FILE_MAPPED); |
681 | /* | ||
682 | * It would be tidy to reset the PageAnon mapping here, | ||
683 | * but that might overwrite a racing page_add_anon_rmap | ||
684 | * which increments mapcount after us but sets mapping | ||
685 | * before us: so leave the reset to free_hot_cold_page, | ||
686 | * and remember that it's only reliable while mapped. | ||
687 | * Leaving it set also helps swapoff to reinstate ptes | ||
688 | * faster for those pages still in swapcache. | ||
689 | */ | ||
679 | } | 690 | } |
680 | } | 691 | } |
681 | 692 | ||
@@ -697,7 +708,7 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma, | |||
697 | if (address == -EFAULT) | 708 | if (address == -EFAULT) |
698 | goto out; | 709 | goto out; |
699 | 710 | ||
700 | pte = page_check_address(page, mm, address, &ptl); | 711 | pte = page_check_address(page, mm, address, &ptl, 0); |
701 | if (!pte) | 712 | if (!pte) |
702 | goto out; | 713 | goto out; |
703 | 714 | ||
diff --git a/mm/swap_state.c b/mm/swap_state.c index 167cf2dc8a03..797c3831cbec 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c | |||
@@ -60,7 +60,7 @@ void show_swap_cache_info(void) | |||
60 | printk("Swap cache stats: add %lu, delete %lu, find %lu/%lu\n", | 60 | printk("Swap cache stats: add %lu, delete %lu, find %lu/%lu\n", |
61 | swap_cache_info.add_total, swap_cache_info.del_total, | 61 | swap_cache_info.add_total, swap_cache_info.del_total, |
62 | swap_cache_info.find_success, swap_cache_info.find_total); | 62 | swap_cache_info.find_success, swap_cache_info.find_total); |
63 | printk("Free swap = %lukB\n", nr_swap_pages << (PAGE_SHIFT - 10)); | 63 | printk("Free swap = %ldkB\n", nr_swap_pages << (PAGE_SHIFT - 10)); |
64 | printk("Total swap = %lukB\n", total_swap_pages << (PAGE_SHIFT - 10)); | 64 | printk("Total swap = %lukB\n", total_swap_pages << (PAGE_SHIFT - 10)); |
65 | } | 65 | } |
66 | 66 | ||
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c index 4e59df5f8e05..1edfdf4c095b 100644 --- a/net/bluetooth/af_bluetooth.c +++ b/net/bluetooth/af_bluetooth.c | |||
@@ -456,7 +456,7 @@ static void __exit bt_exit(void) | |||
456 | subsys_initcall(bt_init); | 456 | subsys_initcall(bt_init); |
457 | module_exit(bt_exit); | 457 | module_exit(bt_exit); |
458 | 458 | ||
459 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 459 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
460 | MODULE_DESCRIPTION("Bluetooth Core ver " VERSION); | 460 | MODULE_DESCRIPTION("Bluetooth Core ver " VERSION); |
461 | MODULE_VERSION(VERSION); | 461 | MODULE_VERSION(VERSION); |
462 | MODULE_LICENSE("GPL"); | 462 | MODULE_LICENSE("GPL"); |
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index 12bba6207a8d..80ba30cf4b68 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c | |||
@@ -736,7 +736,7 @@ MODULE_PARM_DESC(compress_src, "Compress sources headers"); | |||
736 | module_param(compress_dst, bool, 0644); | 736 | module_param(compress_dst, bool, 0644); |
737 | MODULE_PARM_DESC(compress_dst, "Compress destination headers"); | 737 | MODULE_PARM_DESC(compress_dst, "Compress destination headers"); |
738 | 738 | ||
739 | MODULE_AUTHOR("David Libault <david.libault@inventel.fr>, Maxim Krasnyansky <maxk@qualcomm.com>"); | 739 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
740 | MODULE_DESCRIPTION("Bluetooth BNEP ver " VERSION); | 740 | MODULE_DESCRIPTION("Bluetooth BNEP ver " VERSION); |
741 | MODULE_VERSION(VERSION); | 741 | MODULE_VERSION(VERSION); |
742 | MODULE_LICENSE("GPL"); | 742 | MODULE_LICENSE("GPL"); |
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index c85bf8f678dc..f4f6615cad9f 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
@@ -3,8 +3,6 @@ | |||
3 | #include <linux/kernel.h> | 3 | #include <linux/kernel.h> |
4 | #include <linux/init.h> | 4 | #include <linux/init.h> |
5 | 5 | ||
6 | #include <linux/platform_device.h> | ||
7 | |||
8 | #include <net/bluetooth/bluetooth.h> | 6 | #include <net/bluetooth/bluetooth.h> |
9 | #include <net/bluetooth/hci_core.h> | 7 | #include <net/bluetooth/hci_core.h> |
10 | 8 | ||
@@ -12,10 +10,164 @@ | |||
12 | #undef BT_DBG | 10 | #undef BT_DBG |
13 | #define BT_DBG(D...) | 11 | #define BT_DBG(D...) |
14 | #endif | 12 | #endif |
13 | |||
14 | struct class *bt_class = NULL; | ||
15 | EXPORT_SYMBOL_GPL(bt_class); | ||
16 | |||
15 | static struct workqueue_struct *btaddconn; | 17 | static struct workqueue_struct *btaddconn; |
16 | static struct workqueue_struct *btdelconn; | 18 | static struct workqueue_struct *btdelconn; |
17 | 19 | ||
18 | static inline char *typetostr(int type) | 20 | static inline char *link_typetostr(int type) |
21 | { | ||
22 | switch (type) { | ||
23 | case ACL_LINK: | ||
24 | return "ACL"; | ||
25 | case SCO_LINK: | ||
26 | return "SCO"; | ||
27 | case ESCO_LINK: | ||
28 | return "eSCO"; | ||
29 | default: | ||
30 | return "UNKNOWN"; | ||
31 | } | ||
32 | } | ||
33 | |||
34 | static ssize_t show_link_type(struct device *dev, struct device_attribute *attr, char *buf) | ||
35 | { | ||
36 | struct hci_conn *conn = dev_get_drvdata(dev); | ||
37 | return sprintf(buf, "%s\n", link_typetostr(conn->type)); | ||
38 | } | ||
39 | |||
40 | static ssize_t show_link_address(struct device *dev, struct device_attribute *attr, char *buf) | ||
41 | { | ||
42 | struct hci_conn *conn = dev_get_drvdata(dev); | ||
43 | bdaddr_t bdaddr; | ||
44 | baswap(&bdaddr, &conn->dst); | ||
45 | return sprintf(buf, "%s\n", batostr(&bdaddr)); | ||
46 | } | ||
47 | |||
48 | static ssize_t show_link_features(struct device *dev, struct device_attribute *attr, char *buf) | ||
49 | { | ||
50 | struct hci_conn *conn = dev_get_drvdata(dev); | ||
51 | |||
52 | return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", | ||
53 | conn->features[0], conn->features[1], | ||
54 | conn->features[2], conn->features[3], | ||
55 | conn->features[4], conn->features[5], | ||
56 | conn->features[6], conn->features[7]); | ||
57 | } | ||
58 | |||
59 | #define LINK_ATTR(_name,_mode,_show,_store) \ | ||
60 | struct device_attribute link_attr_##_name = __ATTR(_name,_mode,_show,_store) | ||
61 | |||
62 | static LINK_ATTR(type, S_IRUGO, show_link_type, NULL); | ||
63 | static LINK_ATTR(address, S_IRUGO, show_link_address, NULL); | ||
64 | static LINK_ATTR(features, S_IRUGO, show_link_features, NULL); | ||
65 | |||
66 | static struct attribute *bt_link_attrs[] = { | ||
67 | &link_attr_type.attr, | ||
68 | &link_attr_address.attr, | ||
69 | &link_attr_features.attr, | ||
70 | NULL | ||
71 | }; | ||
72 | |||
73 | static struct attribute_group bt_link_group = { | ||
74 | .attrs = bt_link_attrs, | ||
75 | }; | ||
76 | |||
77 | static struct attribute_group *bt_link_groups[] = { | ||
78 | &bt_link_group, | ||
79 | NULL | ||
80 | }; | ||
81 | |||
82 | static void bt_link_release(struct device *dev) | ||
83 | { | ||
84 | void *data = dev_get_drvdata(dev); | ||
85 | kfree(data); | ||
86 | } | ||
87 | |||
88 | static struct device_type bt_link = { | ||
89 | .name = "link", | ||
90 | .groups = bt_link_groups, | ||
91 | .release = bt_link_release, | ||
92 | }; | ||
93 | |||
94 | static void add_conn(struct work_struct *work) | ||
95 | { | ||
96 | struct hci_conn *conn = container_of(work, struct hci_conn, work); | ||
97 | |||
98 | flush_workqueue(btdelconn); | ||
99 | |||
100 | if (device_add(&conn->dev) < 0) { | ||
101 | BT_ERR("Failed to register connection device"); | ||
102 | return; | ||
103 | } | ||
104 | } | ||
105 | |||
106 | void hci_conn_add_sysfs(struct hci_conn *conn) | ||
107 | { | ||
108 | struct hci_dev *hdev = conn->hdev; | ||
109 | |||
110 | BT_DBG("conn %p", conn); | ||
111 | |||
112 | conn->dev.type = &bt_link; | ||
113 | conn->dev.class = bt_class; | ||
114 | conn->dev.parent = &hdev->dev; | ||
115 | |||
116 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "%s:%d", | ||
117 | hdev->name, conn->handle); | ||
118 | |||
119 | dev_set_drvdata(&conn->dev, conn); | ||
120 | |||
121 | device_initialize(&conn->dev); | ||
122 | |||
123 | INIT_WORK(&conn->work, add_conn); | ||
124 | |||
125 | queue_work(btaddconn, &conn->work); | ||
126 | } | ||
127 | |||
128 | /* | ||
129 | * The rfcomm tty device will possibly retain even when conn | ||
130 | * is down, and sysfs doesn't support move zombie device, | ||
131 | * so we should move the device before conn device is destroyed. | ||
132 | */ | ||
133 | static int __match_tty(struct device *dev, void *data) | ||
134 | { | ||
135 | return !strncmp(dev->bus_id, "rfcomm", 6); | ||
136 | } | ||
137 | |||
138 | static void del_conn(struct work_struct *work) | ||
139 | { | ||
140 | struct hci_conn *conn = container_of(work, struct hci_conn, work); | ||
141 | struct hci_dev *hdev = conn->hdev; | ||
142 | |||
143 | while (1) { | ||
144 | struct device *dev; | ||
145 | |||
146 | dev = device_find_child(&conn->dev, NULL, __match_tty); | ||
147 | if (!dev) | ||
148 | break; | ||
149 | device_move(dev, NULL); | ||
150 | put_device(dev); | ||
151 | } | ||
152 | |||
153 | device_del(&conn->dev); | ||
154 | put_device(&conn->dev); | ||
155 | hci_dev_put(hdev); | ||
156 | } | ||
157 | |||
158 | void hci_conn_del_sysfs(struct hci_conn *conn) | ||
159 | { | ||
160 | BT_DBG("conn %p", conn); | ||
161 | |||
162 | if (!device_is_registered(&conn->dev)) | ||
163 | return; | ||
164 | |||
165 | INIT_WORK(&conn->work, del_conn); | ||
166 | |||
167 | queue_work(btdelconn, &conn->work); | ||
168 | } | ||
169 | |||
170 | static inline char *host_typetostr(int type) | ||
19 | { | 171 | { |
20 | switch (type) { | 172 | switch (type) { |
21 | case HCI_VIRTUAL: | 173 | case HCI_VIRTUAL: |
@@ -40,7 +192,7 @@ static inline char *typetostr(int type) | |||
40 | static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf) | 192 | static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf) |
41 | { | 193 | { |
42 | struct hci_dev *hdev = dev_get_drvdata(dev); | 194 | struct hci_dev *hdev = dev_get_drvdata(dev); |
43 | return sprintf(buf, "%s\n", typetostr(hdev->type)); | 195 | return sprintf(buf, "%s\n", host_typetostr(hdev->type)); |
44 | } | 196 | } |
45 | 197 | ||
46 | static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) | 198 | static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) |
@@ -221,183 +373,62 @@ static DEVICE_ATTR(sniff_max_interval, S_IRUGO | S_IWUSR, | |||
221 | static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR, | 373 | static DEVICE_ATTR(sniff_min_interval, S_IRUGO | S_IWUSR, |
222 | show_sniff_min_interval, store_sniff_min_interval); | 374 | show_sniff_min_interval, store_sniff_min_interval); |
223 | 375 | ||
224 | static struct device_attribute *bt_attrs[] = { | 376 | static struct attribute *bt_host_attrs[] = { |
225 | &dev_attr_type, | 377 | &dev_attr_type.attr, |
226 | &dev_attr_name, | 378 | &dev_attr_name.attr, |
227 | &dev_attr_class, | 379 | &dev_attr_class.attr, |
228 | &dev_attr_address, | 380 | &dev_attr_address.attr, |
229 | &dev_attr_features, | 381 | &dev_attr_features.attr, |
230 | &dev_attr_manufacturer, | 382 | &dev_attr_manufacturer.attr, |
231 | &dev_attr_hci_version, | 383 | &dev_attr_hci_version.attr, |
232 | &dev_attr_hci_revision, | 384 | &dev_attr_hci_revision.attr, |
233 | &dev_attr_inquiry_cache, | 385 | &dev_attr_inquiry_cache.attr, |
234 | &dev_attr_idle_timeout, | 386 | &dev_attr_idle_timeout.attr, |
235 | &dev_attr_sniff_max_interval, | 387 | &dev_attr_sniff_max_interval.attr, |
236 | &dev_attr_sniff_min_interval, | 388 | &dev_attr_sniff_min_interval.attr, |
237 | NULL | 389 | NULL |
238 | }; | 390 | }; |
239 | 391 | ||
240 | static ssize_t show_conn_type(struct device *dev, struct device_attribute *attr, char *buf) | 392 | static struct attribute_group bt_host_group = { |
241 | { | 393 | .attrs = bt_host_attrs, |
242 | struct hci_conn *conn = dev_get_drvdata(dev); | ||
243 | return sprintf(buf, "%s\n", conn->type == ACL_LINK ? "ACL" : "SCO"); | ||
244 | } | ||
245 | |||
246 | static ssize_t show_conn_address(struct device *dev, struct device_attribute *attr, char *buf) | ||
247 | { | ||
248 | struct hci_conn *conn = dev_get_drvdata(dev); | ||
249 | bdaddr_t bdaddr; | ||
250 | baswap(&bdaddr, &conn->dst); | ||
251 | return sprintf(buf, "%s\n", batostr(&bdaddr)); | ||
252 | } | ||
253 | |||
254 | static ssize_t show_conn_features(struct device *dev, struct device_attribute *attr, char *buf) | ||
255 | { | ||
256 | struct hci_conn *conn = dev_get_drvdata(dev); | ||
257 | |||
258 | return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", | ||
259 | conn->features[0], conn->features[1], | ||
260 | conn->features[2], conn->features[3], | ||
261 | conn->features[4], conn->features[5], | ||
262 | conn->features[6], conn->features[7]); | ||
263 | } | ||
264 | |||
265 | #define CONN_ATTR(_name,_mode,_show,_store) \ | ||
266 | struct device_attribute conn_attr_##_name = __ATTR(_name,_mode,_show,_store) | ||
267 | |||
268 | static CONN_ATTR(type, S_IRUGO, show_conn_type, NULL); | ||
269 | static CONN_ATTR(address, S_IRUGO, show_conn_address, NULL); | ||
270 | static CONN_ATTR(features, S_IRUGO, show_conn_features, NULL); | ||
271 | |||
272 | static struct device_attribute *conn_attrs[] = { | ||
273 | &conn_attr_type, | ||
274 | &conn_attr_address, | ||
275 | &conn_attr_features, | ||
276 | NULL | ||
277 | }; | 394 | }; |
278 | 395 | ||
279 | struct class *bt_class = NULL; | 396 | static struct attribute_group *bt_host_groups[] = { |
280 | EXPORT_SYMBOL_GPL(bt_class); | 397 | &bt_host_group, |
281 | 398 | NULL | |
282 | static struct bus_type bt_bus = { | ||
283 | .name = "bluetooth", | ||
284 | }; | 399 | }; |
285 | 400 | ||
286 | static struct platform_device *bt_platform; | 401 | static void bt_host_release(struct device *dev) |
287 | |||
288 | static void bt_release(struct device *dev) | ||
289 | { | 402 | { |
290 | void *data = dev_get_drvdata(dev); | 403 | void *data = dev_get_drvdata(dev); |
291 | kfree(data); | 404 | kfree(data); |
292 | } | 405 | } |
293 | 406 | ||
294 | static void add_conn(struct work_struct *work) | 407 | static struct device_type bt_host = { |
295 | { | 408 | .name = "host", |
296 | struct hci_conn *conn = container_of(work, struct hci_conn, work); | 409 | .groups = bt_host_groups, |
297 | int i; | 410 | .release = bt_host_release, |
298 | 411 | }; | |
299 | flush_workqueue(btdelconn); | ||
300 | |||
301 | if (device_add(&conn->dev) < 0) { | ||
302 | BT_ERR("Failed to register connection device"); | ||
303 | return; | ||
304 | } | ||
305 | |||
306 | for (i = 0; conn_attrs[i]; i++) | ||
307 | if (device_create_file(&conn->dev, conn_attrs[i]) < 0) | ||
308 | BT_ERR("Failed to create connection attribute"); | ||
309 | } | ||
310 | |||
311 | void hci_conn_add_sysfs(struct hci_conn *conn) | ||
312 | { | ||
313 | struct hci_dev *hdev = conn->hdev; | ||
314 | |||
315 | BT_DBG("conn %p", conn); | ||
316 | |||
317 | conn->dev.bus = &bt_bus; | ||
318 | conn->dev.parent = &hdev->dev; | ||
319 | |||
320 | conn->dev.release = bt_release; | ||
321 | |||
322 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "%s:%d", | ||
323 | hdev->name, conn->handle); | ||
324 | |||
325 | dev_set_drvdata(&conn->dev, conn); | ||
326 | |||
327 | device_initialize(&conn->dev); | ||
328 | |||
329 | INIT_WORK(&conn->work, add_conn); | ||
330 | |||
331 | queue_work(btaddconn, &conn->work); | ||
332 | } | ||
333 | |||
334 | /* | ||
335 | * The rfcomm tty device will possibly retain even when conn | ||
336 | * is down, and sysfs doesn't support move zombie device, | ||
337 | * so we should move the device before conn device is destroyed. | ||
338 | */ | ||
339 | static int __match_tty(struct device *dev, void *data) | ||
340 | { | ||
341 | return !strncmp(dev->bus_id, "rfcomm", 6); | ||
342 | } | ||
343 | |||
344 | static void del_conn(struct work_struct *work) | ||
345 | { | ||
346 | struct hci_conn *conn = container_of(work, struct hci_conn, work); | ||
347 | struct hci_dev *hdev = conn->hdev; | ||
348 | |||
349 | while (1) { | ||
350 | struct device *dev; | ||
351 | |||
352 | dev = device_find_child(&conn->dev, NULL, __match_tty); | ||
353 | if (!dev) | ||
354 | break; | ||
355 | device_move(dev, NULL); | ||
356 | put_device(dev); | ||
357 | } | ||
358 | |||
359 | device_del(&conn->dev); | ||
360 | put_device(&conn->dev); | ||
361 | hci_dev_put(hdev); | ||
362 | } | ||
363 | |||
364 | void hci_conn_del_sysfs(struct hci_conn *conn) | ||
365 | { | ||
366 | BT_DBG("conn %p", conn); | ||
367 | |||
368 | if (!device_is_registered(&conn->dev)) | ||
369 | return; | ||
370 | |||
371 | INIT_WORK(&conn->work, del_conn); | ||
372 | |||
373 | queue_work(btdelconn, &conn->work); | ||
374 | } | ||
375 | 412 | ||
376 | int hci_register_sysfs(struct hci_dev *hdev) | 413 | int hci_register_sysfs(struct hci_dev *hdev) |
377 | { | 414 | { |
378 | struct device *dev = &hdev->dev; | 415 | struct device *dev = &hdev->dev; |
379 | unsigned int i; | ||
380 | int err; | 416 | int err; |
381 | 417 | ||
382 | BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type); | 418 | BT_DBG("%p name %s type %d", hdev, hdev->name, hdev->type); |
383 | 419 | ||
384 | dev->bus = &bt_bus; | 420 | dev->type = &bt_host; |
421 | dev->class = bt_class; | ||
385 | dev->parent = hdev->parent; | 422 | dev->parent = hdev->parent; |
386 | 423 | ||
387 | strlcpy(dev->bus_id, hdev->name, BUS_ID_SIZE); | 424 | strlcpy(dev->bus_id, hdev->name, BUS_ID_SIZE); |
388 | 425 | ||
389 | dev->release = bt_release; | ||
390 | |||
391 | dev_set_drvdata(dev, hdev); | 426 | dev_set_drvdata(dev, hdev); |
392 | 427 | ||
393 | err = device_register(dev); | 428 | err = device_register(dev); |
394 | if (err < 0) | 429 | if (err < 0) |
395 | return err; | 430 | return err; |
396 | 431 | ||
397 | for (i = 0; bt_attrs[i]; i++) | ||
398 | if (device_create_file(dev, bt_attrs[i]) < 0) | ||
399 | BT_ERR("Failed to create device attribute"); | ||
400 | |||
401 | return 0; | 432 | return 0; |
402 | } | 433 | } |
403 | 434 | ||
@@ -410,59 +441,30 @@ void hci_unregister_sysfs(struct hci_dev *hdev) | |||
410 | 441 | ||
411 | int __init bt_sysfs_init(void) | 442 | int __init bt_sysfs_init(void) |
412 | { | 443 | { |
413 | int err; | ||
414 | |||
415 | btaddconn = create_singlethread_workqueue("btaddconn"); | 444 | btaddconn = create_singlethread_workqueue("btaddconn"); |
416 | if (!btaddconn) { | 445 | if (!btaddconn) |
417 | err = -ENOMEM; | 446 | return -ENOMEM; |
418 | goto out; | ||
419 | } | ||
420 | 447 | ||
421 | btdelconn = create_singlethread_workqueue("btdelconn"); | 448 | btdelconn = create_singlethread_workqueue("btdelconn"); |
422 | if (!btdelconn) { | 449 | if (!btdelconn) { |
423 | err = -ENOMEM; | 450 | destroy_workqueue(btaddconn); |
424 | goto out_del; | 451 | return -ENOMEM; |
425 | } | ||
426 | |||
427 | bt_platform = platform_device_register_simple("bluetooth", -1, NULL, 0); | ||
428 | if (IS_ERR(bt_platform)) { | ||
429 | err = PTR_ERR(bt_platform); | ||
430 | goto out_platform; | ||
431 | } | 452 | } |
432 | 453 | ||
433 | err = bus_register(&bt_bus); | ||
434 | if (err < 0) | ||
435 | goto out_bus; | ||
436 | |||
437 | bt_class = class_create(THIS_MODULE, "bluetooth"); | 454 | bt_class = class_create(THIS_MODULE, "bluetooth"); |
438 | if (IS_ERR(bt_class)) { | 455 | if (IS_ERR(bt_class)) { |
439 | err = PTR_ERR(bt_class); | 456 | destroy_workqueue(btdelconn); |
440 | goto out_class; | 457 | destroy_workqueue(btaddconn); |
458 | return PTR_ERR(bt_class); | ||
441 | } | 459 | } |
442 | 460 | ||
443 | return 0; | 461 | return 0; |
444 | |||
445 | out_class: | ||
446 | bus_unregister(&bt_bus); | ||
447 | out_bus: | ||
448 | platform_device_unregister(bt_platform); | ||
449 | out_platform: | ||
450 | destroy_workqueue(btdelconn); | ||
451 | out_del: | ||
452 | destroy_workqueue(btaddconn); | ||
453 | out: | ||
454 | return err; | ||
455 | } | 462 | } |
456 | 463 | ||
457 | void bt_sysfs_cleanup(void) | 464 | void bt_sysfs_cleanup(void) |
458 | { | 465 | { |
459 | destroy_workqueue(btaddconn); | 466 | destroy_workqueue(btaddconn); |
460 | |||
461 | destroy_workqueue(btdelconn); | 467 | destroy_workqueue(btdelconn); |
462 | 468 | ||
463 | class_destroy(bt_class); | 469 | class_destroy(bt_class); |
464 | |||
465 | bus_unregister(&bt_bus); | ||
466 | |||
467 | platform_device_unregister(bt_platform); | ||
468 | } | 470 | } |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index c1239852834a..3396d5bdef1c 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
@@ -2516,7 +2516,7 @@ EXPORT_SYMBOL(l2cap_load); | |||
2516 | module_init(l2cap_init); | 2516 | module_init(l2cap_init); |
2517 | module_exit(l2cap_exit); | 2517 | module_exit(l2cap_exit); |
2518 | 2518 | ||
2519 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 2519 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
2520 | MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION); | 2520 | MODULE_DESCRIPTION("Bluetooth L2CAP ver " VERSION); |
2521 | MODULE_VERSION(VERSION); | 2521 | MODULE_VERSION(VERSION); |
2522 | MODULE_LICENSE("GPL"); | 2522 | MODULE_LICENSE("GPL"); |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 6cfc7ba611b3..ba537fae0a4c 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -2115,7 +2115,7 @@ MODULE_PARM_DESC(channel_mtu, "Default MTU for the RFCOMM channel"); | |||
2115 | module_param(l2cap_mtu, uint, 0644); | 2115 | module_param(l2cap_mtu, uint, 0644); |
2116 | MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection"); | 2116 | MODULE_PARM_DESC(l2cap_mtu, "Default MTU for the L2CAP connection"); |
2117 | 2117 | ||
2118 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 2118 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
2119 | MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION); | 2119 | MODULE_DESCRIPTION("Bluetooth RFCOMM ver " VERSION); |
2120 | MODULE_VERSION(VERSION); | 2120 | MODULE_VERSION(VERSION); |
2121 | MODULE_LICENSE("GPL"); | 2121 | MODULE_LICENSE("GPL"); |
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c index 8cda49874868..a16011fedc1d 100644 --- a/net/bluetooth/sco.c +++ b/net/bluetooth/sco.c | |||
@@ -1002,7 +1002,7 @@ module_exit(sco_exit); | |||
1002 | module_param(disable_esco, bool, 0644); | 1002 | module_param(disable_esco, bool, 0644); |
1003 | MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation"); | 1003 | MODULE_PARM_DESC(disable_esco, "Disable eSCO connection creation"); |
1004 | 1004 | ||
1005 | MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>"); | 1005 | MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); |
1006 | MODULE_DESCRIPTION("Bluetooth SCO ver " VERSION); | 1006 | MODULE_DESCRIPTION("Bluetooth SCO ver " VERSION); |
1007 | MODULE_VERSION(VERSION); | 1007 | MODULE_VERSION(VERSION); |
1008 | MODULE_LICENSE("GPL"); | 1008 | MODULE_LICENSE("GPL"); |
diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c index 9b58d70b0e7d..4f52c3d50ebe 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c | |||
@@ -148,11 +148,16 @@ static int br_set_tx_csum(struct net_device *dev, u32 data) | |||
148 | } | 148 | } |
149 | 149 | ||
150 | static struct ethtool_ops br_ethtool_ops = { | 150 | static struct ethtool_ops br_ethtool_ops = { |
151 | .get_drvinfo = br_getinfo, | 151 | .get_drvinfo = br_getinfo, |
152 | .get_link = ethtool_op_get_link, | 152 | .get_link = ethtool_op_get_link, |
153 | .set_sg = br_set_sg, | 153 | .get_tx_csum = ethtool_op_get_tx_csum, |
154 | .set_tx_csum = br_set_tx_csum, | 154 | .set_tx_csum = br_set_tx_csum, |
155 | .set_tso = br_set_tso, | 155 | .get_sg = ethtool_op_get_sg, |
156 | .set_sg = br_set_sg, | ||
157 | .get_tso = ethtool_op_get_tso, | ||
158 | .set_tso = br_set_tso, | ||
159 | .get_ufo = ethtool_op_get_ufo, | ||
160 | .get_flags = ethtool_op_get_flags, | ||
156 | }; | 161 | }; |
157 | 162 | ||
158 | void br_dev_setup(struct net_device *dev) | 163 | void br_dev_setup(struct net_device *dev) |
diff --git a/net/core/datagram.c b/net/core/datagram.c index dd61dcad6019..52f577a0f544 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -339,6 +339,93 @@ fault: | |||
339 | return -EFAULT; | 339 | return -EFAULT; |
340 | } | 340 | } |
341 | 341 | ||
342 | /** | ||
343 | * skb_copy_datagram_from_iovec - Copy a datagram from an iovec. | ||
344 | * @skb: buffer to copy | ||
345 | * @offset: offset in the buffer to start copying to | ||
346 | * @from: io vector to copy to | ||
347 | * @len: amount of data to copy to buffer from iovec | ||
348 | * | ||
349 | * Returns 0 or -EFAULT. | ||
350 | * Note: the iovec is modified during the copy. | ||
351 | */ | ||
352 | int skb_copy_datagram_from_iovec(struct sk_buff *skb, int offset, | ||
353 | struct iovec *from, int len) | ||
354 | { | ||
355 | int start = skb_headlen(skb); | ||
356 | int i, copy = start - offset; | ||
357 | |||
358 | /* Copy header. */ | ||
359 | if (copy > 0) { | ||
360 | if (copy > len) | ||
361 | copy = len; | ||
362 | if (memcpy_fromiovec(skb->data + offset, from, copy)) | ||
363 | goto fault; | ||
364 | if ((len -= copy) == 0) | ||
365 | return 0; | ||
366 | offset += copy; | ||
367 | } | ||
368 | |||
369 | /* Copy paged appendix. Hmm... why does this look so complicated? */ | ||
370 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | ||
371 | int end; | ||
372 | |||
373 | WARN_ON(start > offset + len); | ||
374 | |||
375 | end = start + skb_shinfo(skb)->frags[i].size; | ||
376 | if ((copy = end - offset) > 0) { | ||
377 | int err; | ||
378 | u8 *vaddr; | ||
379 | skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; | ||
380 | struct page *page = frag->page; | ||
381 | |||
382 | if (copy > len) | ||
383 | copy = len; | ||
384 | vaddr = kmap(page); | ||
385 | err = memcpy_fromiovec(vaddr + frag->page_offset + | ||
386 | offset - start, from, copy); | ||
387 | kunmap(page); | ||
388 | if (err) | ||
389 | goto fault; | ||
390 | |||
391 | if (!(len -= copy)) | ||
392 | return 0; | ||
393 | offset += copy; | ||
394 | } | ||
395 | start = end; | ||
396 | } | ||
397 | |||
398 | if (skb_shinfo(skb)->frag_list) { | ||
399 | struct sk_buff *list = skb_shinfo(skb)->frag_list; | ||
400 | |||
401 | for (; list; list = list->next) { | ||
402 | int end; | ||
403 | |||
404 | WARN_ON(start > offset + len); | ||
405 | |||
406 | end = start + list->len; | ||
407 | if ((copy = end - offset) > 0) { | ||
408 | if (copy > len) | ||
409 | copy = len; | ||
410 | if (skb_copy_datagram_from_iovec(list, | ||
411 | offset - start, | ||
412 | from, copy)) | ||
413 | goto fault; | ||
414 | if ((len -= copy) == 0) | ||
415 | return 0; | ||
416 | offset += copy; | ||
417 | } | ||
418 | start = end; | ||
419 | } | ||
420 | } | ||
421 | if (!len) | ||
422 | return 0; | ||
423 | |||
424 | fault: | ||
425 | return -EFAULT; | ||
426 | } | ||
427 | EXPORT_SYMBOL(skb_copy_datagram_from_iovec); | ||
428 | |||
342 | static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset, | 429 | static int skb_copy_and_csum_datagram(const struct sk_buff *skb, int offset, |
343 | u8 __user *to, int len, | 430 | u8 __user *to, int len, |
344 | __wsum *csump) | 431 | __wsum *csump) |
diff --git a/net/core/dev.c b/net/core/dev.c index 600bb23c4c2e..60c51f765887 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1339,19 +1339,23 @@ static void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev) | |||
1339 | } | 1339 | } |
1340 | 1340 | ||
1341 | 1341 | ||
1342 | void __netif_schedule(struct Qdisc *q) | 1342 | static inline void __netif_reschedule(struct Qdisc *q) |
1343 | { | 1343 | { |
1344 | if (!test_and_set_bit(__QDISC_STATE_SCHED, &q->state)) { | 1344 | struct softnet_data *sd; |
1345 | struct softnet_data *sd; | 1345 | unsigned long flags; |
1346 | unsigned long flags; | ||
1347 | 1346 | ||
1348 | local_irq_save(flags); | 1347 | local_irq_save(flags); |
1349 | sd = &__get_cpu_var(softnet_data); | 1348 | sd = &__get_cpu_var(softnet_data); |
1350 | q->next_sched = sd->output_queue; | 1349 | q->next_sched = sd->output_queue; |
1351 | sd->output_queue = q; | 1350 | sd->output_queue = q; |
1352 | raise_softirq_irqoff(NET_TX_SOFTIRQ); | 1351 | raise_softirq_irqoff(NET_TX_SOFTIRQ); |
1353 | local_irq_restore(flags); | 1352 | local_irq_restore(flags); |
1354 | } | 1353 | } |
1354 | |||
1355 | void __netif_schedule(struct Qdisc *q) | ||
1356 | { | ||
1357 | if (!test_and_set_bit(__QDISC_STATE_SCHED, &q->state)) | ||
1358 | __netif_reschedule(q); | ||
1355 | } | 1359 | } |
1356 | EXPORT_SYMBOL(__netif_schedule); | 1360 | EXPORT_SYMBOL(__netif_schedule); |
1357 | 1361 | ||
@@ -1800,9 +1804,13 @@ gso: | |||
1800 | 1804 | ||
1801 | spin_lock(root_lock); | 1805 | spin_lock(root_lock); |
1802 | 1806 | ||
1803 | rc = qdisc_enqueue_root(skb, q); | 1807 | if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) { |
1804 | qdisc_run(q); | 1808 | kfree_skb(skb); |
1805 | 1809 | rc = NET_XMIT_DROP; | |
1810 | } else { | ||
1811 | rc = qdisc_enqueue_root(skb, q); | ||
1812 | qdisc_run(q); | ||
1813 | } | ||
1806 | spin_unlock(root_lock); | 1814 | spin_unlock(root_lock); |
1807 | 1815 | ||
1808 | goto out; | 1816 | goto out; |
@@ -1974,15 +1982,17 @@ static void net_tx_action(struct softirq_action *h) | |||
1974 | 1982 | ||
1975 | head = head->next_sched; | 1983 | head = head->next_sched; |
1976 | 1984 | ||
1977 | smp_mb__before_clear_bit(); | ||
1978 | clear_bit(__QDISC_STATE_SCHED, &q->state); | ||
1979 | |||
1980 | root_lock = qdisc_lock(q); | 1985 | root_lock = qdisc_lock(q); |
1981 | if (spin_trylock(root_lock)) { | 1986 | if (spin_trylock(root_lock)) { |
1987 | smp_mb__before_clear_bit(); | ||
1988 | clear_bit(__QDISC_STATE_SCHED, | ||
1989 | &q->state); | ||
1982 | qdisc_run(q); | 1990 | qdisc_run(q); |
1983 | spin_unlock(root_lock); | 1991 | spin_unlock(root_lock); |
1984 | } else { | 1992 | } else { |
1985 | __netif_schedule(q); | 1993 | if (!test_bit(__QDISC_STATE_DEACTIVATED, |
1994 | &q->state)) | ||
1995 | __netif_reschedule(q); | ||
1986 | } | 1996 | } |
1987 | } | 1997 | } |
1988 | } | 1998 | } |
@@ -2084,7 +2094,8 @@ static int ing_filter(struct sk_buff *skb) | |||
2084 | q = rxq->qdisc; | 2094 | q = rxq->qdisc; |
2085 | if (q != &noop_qdisc) { | 2095 | if (q != &noop_qdisc) { |
2086 | spin_lock(qdisc_lock(q)); | 2096 | spin_lock(qdisc_lock(q)); |
2087 | result = qdisc_enqueue_root(skb, q); | 2097 | if (likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) |
2098 | result = qdisc_enqueue_root(skb, q); | ||
2088 | spin_unlock(qdisc_lock(q)); | 2099 | spin_unlock(qdisc_lock(q)); |
2089 | } | 2100 | } |
2090 | 2101 | ||
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c index a89f32fa94f6..57abe8266be1 100644 --- a/net/core/gen_estimator.c +++ b/net/core/gen_estimator.c | |||
@@ -99,7 +99,7 @@ struct gen_estimator_head | |||
99 | 99 | ||
100 | static struct gen_estimator_head elist[EST_MAX_INTERVAL+1]; | 100 | static struct gen_estimator_head elist[EST_MAX_INTERVAL+1]; |
101 | 101 | ||
102 | /* Protects against NULL dereference and RCU write-side */ | 102 | /* Protects against NULL dereference */ |
103 | static DEFINE_RWLOCK(est_lock); | 103 | static DEFINE_RWLOCK(est_lock); |
104 | 104 | ||
105 | static void est_timer(unsigned long arg) | 105 | static void est_timer(unsigned long arg) |
@@ -185,7 +185,6 @@ int gen_new_estimator(struct gnet_stats_basic *bstats, | |||
185 | est->last_packets = bstats->packets; | 185 | est->last_packets = bstats->packets; |
186 | est->avpps = rate_est->pps<<10; | 186 | est->avpps = rate_est->pps<<10; |
187 | 187 | ||
188 | write_lock_bh(&est_lock); | ||
189 | if (!elist[idx].timer.function) { | 188 | if (!elist[idx].timer.function) { |
190 | INIT_LIST_HEAD(&elist[idx].list); | 189 | INIT_LIST_HEAD(&elist[idx].list); |
191 | setup_timer(&elist[idx].timer, est_timer, idx); | 190 | setup_timer(&elist[idx].timer, est_timer, idx); |
@@ -195,7 +194,6 @@ int gen_new_estimator(struct gnet_stats_basic *bstats, | |||
195 | mod_timer(&elist[idx].timer, jiffies + ((HZ/4) << idx)); | 194 | mod_timer(&elist[idx].timer, jiffies + ((HZ/4) << idx)); |
196 | 195 | ||
197 | list_add_rcu(&est->list, &elist[idx].list); | 196 | list_add_rcu(&est->list, &elist[idx].list); |
198 | write_unlock_bh(&est_lock); | ||
199 | return 0; | 197 | return 0; |
200 | } | 198 | } |
201 | 199 | ||
@@ -214,6 +212,7 @@ static void __gen_kill_estimator(struct rcu_head *head) | |||
214 | * Removes the rate estimator specified by &bstats and &rate_est | 212 | * Removes the rate estimator specified by &bstats and &rate_est |
215 | * and deletes the timer. | 213 | * and deletes the timer. |
216 | * | 214 | * |
215 | * NOTE: Called under rtnl_mutex | ||
217 | */ | 216 | */ |
218 | void gen_kill_estimator(struct gnet_stats_basic *bstats, | 217 | void gen_kill_estimator(struct gnet_stats_basic *bstats, |
219 | struct gnet_stats_rate_est *rate_est) | 218 | struct gnet_stats_rate_est *rate_est) |
@@ -227,17 +226,17 @@ void gen_kill_estimator(struct gnet_stats_basic *bstats, | |||
227 | if (!elist[idx].timer.function) | 226 | if (!elist[idx].timer.function) |
228 | continue; | 227 | continue; |
229 | 228 | ||
230 | write_lock_bh(&est_lock); | ||
231 | list_for_each_entry_safe(e, n, &elist[idx].list, list) { | 229 | list_for_each_entry_safe(e, n, &elist[idx].list, list) { |
232 | if (e->rate_est != rate_est || e->bstats != bstats) | 230 | if (e->rate_est != rate_est || e->bstats != bstats) |
233 | continue; | 231 | continue; |
234 | 232 | ||
233 | write_lock_bh(&est_lock); | ||
235 | e->bstats = NULL; | 234 | e->bstats = NULL; |
235 | write_unlock_bh(&est_lock); | ||
236 | 236 | ||
237 | list_del_rcu(&e->list); | 237 | list_del_rcu(&e->list); |
238 | call_rcu(&e->e_rcu, __gen_kill_estimator); | 238 | call_rcu(&e->e_rcu, __gen_kill_estimator); |
239 | } | 239 | } |
240 | write_unlock_bh(&est_lock); | ||
241 | } | 240 | } |
242 | } | 241 | } |
243 | 242 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 84640172d65d..ca1ccdf1ef76 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -2256,14 +2256,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
2256 | segs = nskb; | 2256 | segs = nskb; |
2257 | tail = nskb; | 2257 | tail = nskb; |
2258 | 2258 | ||
2259 | nskb->dev = skb->dev; | 2259 | __copy_skb_header(nskb, skb); |
2260 | skb_copy_queue_mapping(nskb, skb); | ||
2261 | nskb->priority = skb->priority; | ||
2262 | nskb->protocol = skb->protocol; | ||
2263 | nskb->vlan_tci = skb->vlan_tci; | ||
2264 | nskb->dst = dst_clone(skb->dst); | ||
2265 | memcpy(nskb->cb, skb->cb, sizeof(skb->cb)); | ||
2266 | nskb->pkt_type = skb->pkt_type; | ||
2267 | nskb->mac_len = skb->mac_len; | 2260 | nskb->mac_len = skb->mac_len; |
2268 | 2261 | ||
2269 | skb_reserve(nskb, headroom); | 2262 | skb_reserve(nskb, headroom); |
@@ -2274,6 +2267,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
2274 | skb_copy_from_linear_data(skb, skb_put(nskb, doffset), | 2267 | skb_copy_from_linear_data(skb, skb_put(nskb, doffset), |
2275 | doffset); | 2268 | doffset); |
2276 | if (!sg) { | 2269 | if (!sg) { |
2270 | nskb->ip_summed = CHECKSUM_NONE; | ||
2277 | nskb->csum = skb_copy_and_csum_bits(skb, offset, | 2271 | nskb->csum = skb_copy_and_csum_bits(skb, offset, |
2278 | skb_put(nskb, len), | 2272 | skb_put(nskb, len), |
2279 | len, 0); | 2273 | len, 0); |
@@ -2283,8 +2277,6 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
2283 | frag = skb_shinfo(nskb)->frags; | 2277 | frag = skb_shinfo(nskb)->frags; |
2284 | k = 0; | 2278 | k = 0; |
2285 | 2279 | ||
2286 | nskb->ip_summed = CHECKSUM_PARTIAL; | ||
2287 | nskb->csum = skb->csum; | ||
2288 | skb_copy_from_linear_data_offset(skb, offset, | 2280 | skb_copy_from_linear_data_offset(skb, offset, |
2289 | skb_put(nskb, hsize), hsize); | 2281 | skb_put(nskb, hsize), hsize); |
2290 | 2282 | ||
diff --git a/net/dccp/input.c b/net/dccp/input.c index df2f110df94a..803933ab396d 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c | |||
@@ -411,12 +411,6 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, | |||
411 | struct dccp_sock *dp = dccp_sk(sk); | 411 | struct dccp_sock *dp = dccp_sk(sk); |
412 | long tstamp = dccp_timestamp(); | 412 | long tstamp = dccp_timestamp(); |
413 | 413 | ||
414 | /* Stop the REQUEST timer */ | ||
415 | inet_csk_clear_xmit_timer(sk, ICSK_TIME_RETRANS); | ||
416 | WARN_ON(sk->sk_send_head == NULL); | ||
417 | __kfree_skb(sk->sk_send_head); | ||
418 | sk->sk_send_head = NULL; | ||
419 | |||
420 | if (!between48(DCCP_SKB_CB(skb)->dccpd_ack_seq, | 414 | if (!between48(DCCP_SKB_CB(skb)->dccpd_ack_seq, |
421 | dp->dccps_awl, dp->dccps_awh)) { | 415 | dp->dccps_awl, dp->dccps_awh)) { |
422 | dccp_pr_debug("invalid ackno: S.AWL=%llu, " | 416 | dccp_pr_debug("invalid ackno: S.AWL=%llu, " |
@@ -441,6 +435,12 @@ static int dccp_rcv_request_sent_state_process(struct sock *sk, | |||
441 | DCCP_ACKVEC_STATE_RECEIVED)) | 435 | DCCP_ACKVEC_STATE_RECEIVED)) |
442 | goto out_invalid_packet; /* FIXME: change error code */ | 436 | goto out_invalid_packet; /* FIXME: change error code */ |
443 | 437 | ||
438 | /* Stop the REQUEST timer */ | ||
439 | inet_csk_clear_xmit_timer(sk, ICSK_TIME_RETRANS); | ||
440 | WARN_ON(sk->sk_send_head == NULL); | ||
441 | kfree_skb(sk->sk_send_head); | ||
442 | sk->sk_send_head = NULL; | ||
443 | |||
444 | dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq; | 444 | dp->dccps_isr = DCCP_SKB_CB(skb)->dccpd_seq; |
445 | dccp_update_gsr(sk, dp->dccps_isr); | 445 | dccp_update_gsr(sk, dp->dccps_isr); |
446 | /* | 446 | /* |
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c index 860558633b2c..55c355e63234 100644 --- a/net/ipv4/icmp.c +++ b/net/ipv4/icmp.c | |||
@@ -204,18 +204,22 @@ static struct sock *icmp_sk(struct net *net) | |||
204 | return net->ipv4.icmp_sk[smp_processor_id()]; | 204 | return net->ipv4.icmp_sk[smp_processor_id()]; |
205 | } | 205 | } |
206 | 206 | ||
207 | static inline int icmp_xmit_lock(struct sock *sk) | 207 | static inline struct sock *icmp_xmit_lock(struct net *net) |
208 | { | 208 | { |
209 | struct sock *sk; | ||
210 | |||
209 | local_bh_disable(); | 211 | local_bh_disable(); |
210 | 212 | ||
213 | sk = icmp_sk(net); | ||
214 | |||
211 | if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { | 215 | if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { |
212 | /* This can happen if the output path signals a | 216 | /* This can happen if the output path signals a |
213 | * dst_link_failure() for an outgoing ICMP packet. | 217 | * dst_link_failure() for an outgoing ICMP packet. |
214 | */ | 218 | */ |
215 | local_bh_enable(); | 219 | local_bh_enable(); |
216 | return 1; | 220 | return NULL; |
217 | } | 221 | } |
218 | return 0; | 222 | return sk; |
219 | } | 223 | } |
220 | 224 | ||
221 | static inline void icmp_xmit_unlock(struct sock *sk) | 225 | static inline void icmp_xmit_unlock(struct sock *sk) |
@@ -354,15 +358,17 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb) | |||
354 | struct ipcm_cookie ipc; | 358 | struct ipcm_cookie ipc; |
355 | struct rtable *rt = skb->rtable; | 359 | struct rtable *rt = skb->rtable; |
356 | struct net *net = dev_net(rt->u.dst.dev); | 360 | struct net *net = dev_net(rt->u.dst.dev); |
357 | struct sock *sk = icmp_sk(net); | 361 | struct sock *sk; |
358 | struct inet_sock *inet = inet_sk(sk); | 362 | struct inet_sock *inet; |
359 | __be32 daddr; | 363 | __be32 daddr; |
360 | 364 | ||
361 | if (ip_options_echo(&icmp_param->replyopts, skb)) | 365 | if (ip_options_echo(&icmp_param->replyopts, skb)) |
362 | return; | 366 | return; |
363 | 367 | ||
364 | if (icmp_xmit_lock(sk)) | 368 | sk = icmp_xmit_lock(net); |
369 | if (sk == NULL) | ||
365 | return; | 370 | return; |
371 | inet = inet_sk(sk); | ||
366 | 372 | ||
367 | icmp_param->data.icmph.checksum = 0; | 373 | icmp_param->data.icmph.checksum = 0; |
368 | 374 | ||
@@ -419,7 +425,6 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
419 | if (!rt) | 425 | if (!rt) |
420 | goto out; | 426 | goto out; |
421 | net = dev_net(rt->u.dst.dev); | 427 | net = dev_net(rt->u.dst.dev); |
422 | sk = icmp_sk(net); | ||
423 | 428 | ||
424 | /* | 429 | /* |
425 | * Find the original header. It is expected to be valid, of course. | 430 | * Find the original header. It is expected to be valid, of course. |
@@ -483,7 +488,8 @@ void icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info) | |||
483 | } | 488 | } |
484 | } | 489 | } |
485 | 490 | ||
486 | if (icmp_xmit_lock(sk)) | 491 | sk = icmp_xmit_lock(net); |
492 | if (sk == NULL) | ||
487 | return; | 493 | return; |
488 | 494 | ||
489 | /* | 495 | /* |
diff --git a/net/ipv4/netfilter/ipt_addrtype.c b/net/ipv4/netfilter/ipt_addrtype.c index 49587a497229..462a22c97877 100644 --- a/net/ipv4/netfilter/ipt_addrtype.c +++ b/net/ipv4/netfilter/ipt_addrtype.c | |||
@@ -70,7 +70,7 @@ addrtype_mt_v1(const struct sk_buff *skb, const struct net_device *in, | |||
70 | (info->flags & IPT_ADDRTYPE_INVERT_SOURCE); | 70 | (info->flags & IPT_ADDRTYPE_INVERT_SOURCE); |
71 | if (ret && info->dest) | 71 | if (ret && info->dest) |
72 | ret &= match_type(dev, iph->daddr, info->dest) ^ | 72 | ret &= match_type(dev, iph->daddr, info->dest) ^ |
73 | (info->flags & IPT_ADDRTYPE_INVERT_DEST); | 73 | !!(info->flags & IPT_ADDRTYPE_INVERT_DEST); |
74 | return ret; | 74 | return ret; |
75 | } | 75 | } |
76 | 76 | ||
diff --git a/net/ipv4/netfilter/nf_nat_proto_common.c b/net/ipv4/netfilter/nf_nat_proto_common.c index 91537f11273f..6c4f11f51446 100644 --- a/net/ipv4/netfilter/nf_nat_proto_common.c +++ b/net/ipv4/netfilter/nf_nat_proto_common.c | |||
@@ -73,9 +73,13 @@ bool nf_nat_proto_unique_tuple(struct nf_conntrack_tuple *tuple, | |||
73 | range_size = ntohs(range->max.all) - min + 1; | 73 | range_size = ntohs(range->max.all) - min + 1; |
74 | } | 74 | } |
75 | 75 | ||
76 | off = *rover; | ||
77 | if (range->flags & IP_NAT_RANGE_PROTO_RANDOM) | 76 | if (range->flags & IP_NAT_RANGE_PROTO_RANDOM) |
78 | off = net_random(); | 77 | off = secure_ipv4_port_ephemeral(tuple->src.u3.ip, tuple->dst.u3.ip, |
78 | maniptype == IP_NAT_MANIP_SRC | ||
79 | ? tuple->dst.u.all | ||
80 | : tuple->src.u.all); | ||
81 | else | ||
82 | off = *rover; | ||
79 | 83 | ||
80 | for (i = 0; i < range_size; i++, off++) { | 84 | for (i = 0; i < range_size; i++, off++) { |
81 | *portptr = htons(min + off % range_size); | 85 | *portptr = htons(min + off % range_size); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 16fc6f454a31..cca921ea8550 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -2914,6 +2914,68 @@ static int ipv4_sysctl_rtcache_flush_strategy(ctl_table *table, | |||
2914 | return 0; | 2914 | return 0; |
2915 | } | 2915 | } |
2916 | 2916 | ||
2917 | static void rt_secret_reschedule(int old) | ||
2918 | { | ||
2919 | struct net *net; | ||
2920 | int new = ip_rt_secret_interval; | ||
2921 | int diff = new - old; | ||
2922 | |||
2923 | if (!diff) | ||
2924 | return; | ||
2925 | |||
2926 | rtnl_lock(); | ||
2927 | for_each_net(net) { | ||
2928 | int deleted = del_timer_sync(&net->ipv4.rt_secret_timer); | ||
2929 | |||
2930 | if (!new) | ||
2931 | continue; | ||
2932 | |||
2933 | if (deleted) { | ||
2934 | long time = net->ipv4.rt_secret_timer.expires - jiffies; | ||
2935 | |||
2936 | if (time <= 0 || (time += diff) <= 0) | ||
2937 | time = 0; | ||
2938 | |||
2939 | net->ipv4.rt_secret_timer.expires = time; | ||
2940 | } else | ||
2941 | net->ipv4.rt_secret_timer.expires = new; | ||
2942 | |||
2943 | net->ipv4.rt_secret_timer.expires += jiffies; | ||
2944 | add_timer(&net->ipv4.rt_secret_timer); | ||
2945 | } | ||
2946 | rtnl_unlock(); | ||
2947 | } | ||
2948 | |||
2949 | static int ipv4_sysctl_rt_secret_interval(ctl_table *ctl, int write, | ||
2950 | struct file *filp, | ||
2951 | void __user *buffer, size_t *lenp, | ||
2952 | loff_t *ppos) | ||
2953 | { | ||
2954 | int old = ip_rt_secret_interval; | ||
2955 | int ret = proc_dointvec_jiffies(ctl, write, filp, buffer, lenp, ppos); | ||
2956 | |||
2957 | rt_secret_reschedule(old); | ||
2958 | |||
2959 | return ret; | ||
2960 | } | ||
2961 | |||
2962 | static int ipv4_sysctl_rt_secret_interval_strategy(ctl_table *table, | ||
2963 | int __user *name, | ||
2964 | int nlen, | ||
2965 | void __user *oldval, | ||
2966 | size_t __user *oldlenp, | ||
2967 | void __user *newval, | ||
2968 | size_t newlen) | ||
2969 | { | ||
2970 | int old = ip_rt_secret_interval; | ||
2971 | int ret = sysctl_jiffies(table, name, nlen, oldval, oldlenp, newval, | ||
2972 | newlen); | ||
2973 | |||
2974 | rt_secret_reschedule(old); | ||
2975 | |||
2976 | return ret; | ||
2977 | } | ||
2978 | |||
2917 | static ctl_table ipv4_route_table[] = { | 2979 | static ctl_table ipv4_route_table[] = { |
2918 | { | 2980 | { |
2919 | .ctl_name = NET_IPV4_ROUTE_GC_THRESH, | 2981 | .ctl_name = NET_IPV4_ROUTE_GC_THRESH, |
@@ -3048,8 +3110,8 @@ static ctl_table ipv4_route_table[] = { | |||
3048 | .data = &ip_rt_secret_interval, | 3110 | .data = &ip_rt_secret_interval, |
3049 | .maxlen = sizeof(int), | 3111 | .maxlen = sizeof(int), |
3050 | .mode = 0644, | 3112 | .mode = 0644, |
3051 | .proc_handler = &proc_dointvec_jiffies, | 3113 | .proc_handler = &ipv4_sysctl_rt_secret_interval, |
3052 | .strategy = &sysctl_jiffies, | 3114 | .strategy = &ipv4_sysctl_rt_secret_interval_strategy, |
3053 | }, | 3115 | }, |
3054 | { .ctl_name = 0 } | 3116 | { .ctl_name = 0 } |
3055 | }; | 3117 | }; |
@@ -3126,10 +3188,12 @@ static __net_init int rt_secret_timer_init(struct net *net) | |||
3126 | net->ipv4.rt_secret_timer.data = (unsigned long)net; | 3188 | net->ipv4.rt_secret_timer.data = (unsigned long)net; |
3127 | init_timer_deferrable(&net->ipv4.rt_secret_timer); | 3189 | init_timer_deferrable(&net->ipv4.rt_secret_timer); |
3128 | 3190 | ||
3129 | net->ipv4.rt_secret_timer.expires = | 3191 | if (ip_rt_secret_interval) { |
3130 | jiffies + net_random() % ip_rt_secret_interval + | 3192 | net->ipv4.rt_secret_timer.expires = |
3131 | ip_rt_secret_interval; | 3193 | jiffies + net_random() % ip_rt_secret_interval + |
3132 | add_timer(&net->ipv4.rt_secret_timer); | 3194 | ip_rt_secret_interval; |
3195 | add_timer(&net->ipv4.rt_secret_timer); | ||
3196 | } | ||
3133 | return 0; | 3197 | return 0; |
3134 | } | 3198 | } |
3135 | 3199 | ||
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a7842c54f58a..7b6a584b62dd 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -1106,13 +1106,12 @@ out: | |||
1106 | return ret; | 1106 | return ret; |
1107 | } | 1107 | } |
1108 | 1108 | ||
1109 | int ipv6_dev_get_saddr(struct net_device *dst_dev, | 1109 | int ipv6_dev_get_saddr(struct net *net, struct net_device *dst_dev, |
1110 | const struct in6_addr *daddr, unsigned int prefs, | 1110 | const struct in6_addr *daddr, unsigned int prefs, |
1111 | struct in6_addr *saddr) | 1111 | struct in6_addr *saddr) |
1112 | { | 1112 | { |
1113 | struct ipv6_saddr_score scores[2], | 1113 | struct ipv6_saddr_score scores[2], |
1114 | *score = &scores[0], *hiscore = &scores[1]; | 1114 | *score = &scores[0], *hiscore = &scores[1]; |
1115 | struct net *net = dev_net(dst_dev); | ||
1116 | struct ipv6_saddr_dst dst; | 1115 | struct ipv6_saddr_dst dst; |
1117 | struct net_device *dev; | 1116 | struct net_device *dev; |
1118 | int dst_type; | 1117 | int dst_type; |
@@ -1689,6 +1688,7 @@ addrconf_prefix_route(struct in6_addr *pfx, int plen, struct net_device *dev, | |||
1689 | .fc_dst_len = plen, | 1688 | .fc_dst_len = plen, |
1690 | .fc_flags = RTF_UP | flags, | 1689 | .fc_flags = RTF_UP | flags, |
1691 | .fc_nlinfo.nl_net = dev_net(dev), | 1690 | .fc_nlinfo.nl_net = dev_net(dev), |
1691 | .fc_protocol = RTPROT_KERNEL, | ||
1692 | }; | 1692 | }; |
1693 | 1693 | ||
1694 | ipv6_addr_copy(&cfg.fc_dst, pfx); | 1694 | ipv6_addr_copy(&cfg.fc_dst, pfx); |
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 8d05527524e3..f5de3f9dc692 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c | |||
@@ -93,7 +93,8 @@ static int fib6_rule_action(struct fib_rule *rule, struct flowi *flp, | |||
93 | if (flags & RT6_LOOKUP_F_SRCPREF_COA) | 93 | if (flags & RT6_LOOKUP_F_SRCPREF_COA) |
94 | srcprefs |= IPV6_PREFER_SRC_COA; | 94 | srcprefs |= IPV6_PREFER_SRC_COA; |
95 | 95 | ||
96 | if (ipv6_dev_get_saddr(ip6_dst_idev(&rt->u.dst)->dev, | 96 | if (ipv6_dev_get_saddr(net, |
97 | ip6_dst_idev(&rt->u.dst)->dev, | ||
97 | &flp->fl6_dst, srcprefs, | 98 | &flp->fl6_dst, srcprefs, |
98 | &saddr)) | 99 | &saddr)) |
99 | goto again; | 100 | goto again; |
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c index abedf95fdf2d..b3157a0cc15d 100644 --- a/net/ipv6/icmp.c +++ b/net/ipv6/icmp.c | |||
@@ -91,19 +91,22 @@ static struct inet6_protocol icmpv6_protocol = { | |||
91 | .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, | 91 | .flags = INET6_PROTO_NOPOLICY|INET6_PROTO_FINAL, |
92 | }; | 92 | }; |
93 | 93 | ||
94 | static __inline__ int icmpv6_xmit_lock(struct sock *sk) | 94 | static __inline__ struct sock *icmpv6_xmit_lock(struct net *net) |
95 | { | 95 | { |
96 | struct sock *sk; | ||
97 | |||
96 | local_bh_disable(); | 98 | local_bh_disable(); |
97 | 99 | ||
100 | sk = icmpv6_sk(net); | ||
98 | if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { | 101 | if (unlikely(!spin_trylock(&sk->sk_lock.slock))) { |
99 | /* This can happen if the output path (f.e. SIT or | 102 | /* This can happen if the output path (f.e. SIT or |
100 | * ip6ip6 tunnel) signals dst_link_failure() for an | 103 | * ip6ip6 tunnel) signals dst_link_failure() for an |
101 | * outgoing ICMP6 packet. | 104 | * outgoing ICMP6 packet. |
102 | */ | 105 | */ |
103 | local_bh_enable(); | 106 | local_bh_enable(); |
104 | return 1; | 107 | return NULL; |
105 | } | 108 | } |
106 | return 0; | 109 | return sk; |
107 | } | 110 | } |
108 | 111 | ||
109 | static __inline__ void icmpv6_xmit_unlock(struct sock *sk) | 112 | static __inline__ void icmpv6_xmit_unlock(struct sock *sk) |
@@ -392,11 +395,10 @@ void icmpv6_send(struct sk_buff *skb, int type, int code, __u32 info, | |||
392 | fl.fl_icmp_code = code; | 395 | fl.fl_icmp_code = code; |
393 | security_skb_classify_flow(skb, &fl); | 396 | security_skb_classify_flow(skb, &fl); |
394 | 397 | ||
395 | sk = icmpv6_sk(net); | 398 | sk = icmpv6_xmit_lock(net); |
396 | np = inet6_sk(sk); | 399 | if (sk == NULL) |
397 | |||
398 | if (icmpv6_xmit_lock(sk)) | ||
399 | return; | 400 | return; |
401 | np = inet6_sk(sk); | ||
400 | 402 | ||
401 | if (!icmpv6_xrlim_allow(sk, type, &fl)) | 403 | if (!icmpv6_xrlim_allow(sk, type, &fl)) |
402 | goto out; | 404 | goto out; |
@@ -539,11 +541,10 @@ static void icmpv6_echo_reply(struct sk_buff *skb) | |||
539 | fl.fl_icmp_type = ICMPV6_ECHO_REPLY; | 541 | fl.fl_icmp_type = ICMPV6_ECHO_REPLY; |
540 | security_skb_classify_flow(skb, &fl); | 542 | security_skb_classify_flow(skb, &fl); |
541 | 543 | ||
542 | sk = icmpv6_sk(net); | 544 | sk = icmpv6_xmit_lock(net); |
543 | np = inet6_sk(sk); | 545 | if (sk == NULL) |
544 | |||
545 | if (icmpv6_xmit_lock(sk)) | ||
546 | return; | 546 | return; |
547 | np = inet6_sk(sk); | ||
547 | 548 | ||
548 | if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst)) | 549 | if (!fl.oif && ipv6_addr_is_multicast(&fl.fl6_dst)) |
549 | fl.oif = np->mcast_oif; | 550 | fl.oif = np->mcast_oif; |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 52dddc25d3e6..29c7c99e69f7 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
@@ -378,6 +378,7 @@ static int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb) | |||
378 | 378 | ||
379 | arg.skb = skb; | 379 | arg.skb = skb; |
380 | arg.cb = cb; | 380 | arg.cb = cb; |
381 | arg.net = net; | ||
381 | w->args = &arg; | 382 | w->args = &arg; |
382 | 383 | ||
383 | for (h = s_h; h < FIB_TABLE_HASHSZ; h++, s_e = 0) { | 384 | for (h = s_h; h < FIB_TABLE_HASHSZ; h++, s_e = 0) { |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index a4402de425d9..0e844c2736a7 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -934,7 +934,7 @@ static int ip6_dst_lookup_tail(struct sock *sk, | |||
934 | goto out_err_release; | 934 | goto out_err_release; |
935 | 935 | ||
936 | if (ipv6_addr_any(&fl->fl6_src)) { | 936 | if (ipv6_addr_any(&fl->fl6_src)) { |
937 | err = ipv6_dev_get_saddr(ip6_dst_idev(*dst)->dev, | 937 | err = ipv6_dev_get_saddr(net, ip6_dst_idev(*dst)->dev, |
938 | &fl->fl6_dst, | 938 | &fl->fl6_dst, |
939 | sk ? inet6_sk(sk)->srcprefs : 0, | 939 | sk ? inet6_sk(sk)->srcprefs : 0, |
940 | &fl->fl6_src); | 940 | &fl->fl6_src); |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 741cfcd96f88..4e5eac301f91 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
@@ -911,7 +911,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
911 | } else { | 911 | } else { |
912 | if (np->rxopt.bits.rxinfo) { | 912 | if (np->rxopt.bits.rxinfo) { |
913 | struct in6_pktinfo src_info; | 913 | struct in6_pktinfo src_info; |
914 | src_info.ipi6_ifindex = np->mcast_oif; | 914 | src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif : sk->sk_bound_dev_if; |
915 | ipv6_addr_copy(&src_info.ipi6_addr, &np->daddr); | 915 | ipv6_addr_copy(&src_info.ipi6_addr, &np->daddr); |
916 | put_cmsg(&msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info); | 916 | put_cmsg(&msg, SOL_IPV6, IPV6_PKTINFO, sizeof(src_info), &src_info); |
917 | } | 917 | } |
@@ -921,7 +921,7 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname, | |||
921 | } | 921 | } |
922 | if (np->rxopt.bits.rxoinfo) { | 922 | if (np->rxopt.bits.rxoinfo) { |
923 | struct in6_pktinfo src_info; | 923 | struct in6_pktinfo src_info; |
924 | src_info.ipi6_ifindex = np->mcast_oif; | 924 | src_info.ipi6_ifindex = np->mcast_oif ? np->mcast_oif : sk->sk_bound_dev_if; |
925 | ipv6_addr_copy(&src_info.ipi6_addr, &np->daddr); | 925 | ipv6_addr_copy(&src_info.ipi6_addr, &np->daddr); |
926 | put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info); | 926 | put_cmsg(&msg, SOL_IPV6, IPV6_2292PKTINFO, sizeof(src_info), &src_info); |
927 | } | 927 | } |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index beb48e3f038a..f1c62ba0f56b 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -549,7 +549,7 @@ static void ndisc_send_na(struct net_device *dev, struct neighbour *neigh, | |||
549 | override = 0; | 549 | override = 0; |
550 | in6_ifa_put(ifp); | 550 | in6_ifa_put(ifp); |
551 | } else { | 551 | } else { |
552 | if (ipv6_dev_get_saddr(dev, daddr, | 552 | if (ipv6_dev_get_saddr(dev_net(dev), dev, daddr, |
553 | inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, | 553 | inet6_sk(dev_net(dev)->ipv6.ndisc_sk)->srcprefs, |
554 | &tmpaddr)) | 554 | &tmpaddr)) |
555 | return; | 555 | return; |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 41b165ffb369..9af6115f0f50 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -2106,7 +2106,8 @@ static inline size_t rt6_nlmsg_size(void) | |||
2106 | + nla_total_size(sizeof(struct rta_cacheinfo)); | 2106 | + nla_total_size(sizeof(struct rta_cacheinfo)); |
2107 | } | 2107 | } |
2108 | 2108 | ||
2109 | static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | 2109 | static int rt6_fill_node(struct net *net, |
2110 | struct sk_buff *skb, struct rt6_info *rt, | ||
2110 | struct in6_addr *dst, struct in6_addr *src, | 2111 | struct in6_addr *dst, struct in6_addr *src, |
2111 | int iif, int type, u32 pid, u32 seq, | 2112 | int iif, int type, u32 pid, u32 seq, |
2112 | int prefix, int nowait, unsigned int flags) | 2113 | int prefix, int nowait, unsigned int flags) |
@@ -2189,7 +2190,7 @@ static int rt6_fill_node(struct sk_buff *skb, struct rt6_info *rt, | |||
2189 | } else if (dst) { | 2190 | } else if (dst) { |
2190 | struct inet6_dev *idev = ip6_dst_idev(&rt->u.dst); | 2191 | struct inet6_dev *idev = ip6_dst_idev(&rt->u.dst); |
2191 | struct in6_addr saddr_buf; | 2192 | struct in6_addr saddr_buf; |
2192 | if (ipv6_dev_get_saddr(idev ? idev->dev : NULL, | 2193 | if (ipv6_dev_get_saddr(net, idev ? idev->dev : NULL, |
2193 | dst, 0, &saddr_buf) == 0) | 2194 | dst, 0, &saddr_buf) == 0) |
2194 | NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf); | 2195 | NLA_PUT(skb, RTA_PREFSRC, 16, &saddr_buf); |
2195 | } | 2196 | } |
@@ -2234,7 +2235,8 @@ int rt6_dump_route(struct rt6_info *rt, void *p_arg) | |||
2234 | } else | 2235 | } else |
2235 | prefix = 0; | 2236 | prefix = 0; |
2236 | 2237 | ||
2237 | return rt6_fill_node(arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, | 2238 | return rt6_fill_node(arg->net, |
2239 | arg->skb, rt, NULL, NULL, 0, RTM_NEWROUTE, | ||
2238 | NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, | 2240 | NETLINK_CB(arg->cb->skb).pid, arg->cb->nlh->nlmsg_seq, |
2239 | prefix, 0, NLM_F_MULTI); | 2241 | prefix, 0, NLM_F_MULTI); |
2240 | } | 2242 | } |
@@ -2300,7 +2302,7 @@ static int inet6_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr* nlh, void | |||
2300 | rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); | 2302 | rt = (struct rt6_info*) ip6_route_output(net, NULL, &fl); |
2301 | skb->dst = &rt->u.dst; | 2303 | skb->dst = &rt->u.dst; |
2302 | 2304 | ||
2303 | err = rt6_fill_node(skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, | 2305 | err = rt6_fill_node(net, skb, rt, &fl.fl6_dst, &fl.fl6_src, iif, |
2304 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, | 2306 | RTM_NEWROUTE, NETLINK_CB(in_skb).pid, |
2305 | nlh->nlmsg_seq, 0, 0, 0); | 2307 | nlh->nlmsg_seq, 0, 0, 0); |
2306 | if (err < 0) { | 2308 | if (err < 0) { |
@@ -2327,7 +2329,7 @@ void inet6_rt_notify(int event, struct rt6_info *rt, struct nl_info *info) | |||
2327 | if (skb == NULL) | 2329 | if (skb == NULL) |
2328 | goto errout; | 2330 | goto errout; |
2329 | 2331 | ||
2330 | err = rt6_fill_node(skb, rt, NULL, NULL, 0, | 2332 | err = rt6_fill_node(net, skb, rt, NULL, NULL, 0, |
2331 | event, info->pid, seq, 0, 0, 0); | 2333 | event, info->pid, seq, 0, 0, 0); |
2332 | if (err < 0) { | 2334 | if (err < 0) { |
2333 | /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */ | 2335 | /* -EMSGSIZE implies BUG in rt6_nlmsg_size() */ |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 8f1e0543b3c4..08e4cbbe3f04 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -52,12 +52,14 @@ static struct dst_entry *xfrm6_dst_lookup(int tos, xfrm_address_t *saddr, | |||
52 | static int xfrm6_get_saddr(xfrm_address_t *saddr, xfrm_address_t *daddr) | 52 | static int xfrm6_get_saddr(xfrm_address_t *saddr, xfrm_address_t *daddr) |
53 | { | 53 | { |
54 | struct dst_entry *dst; | 54 | struct dst_entry *dst; |
55 | struct net_device *dev; | ||
55 | 56 | ||
56 | dst = xfrm6_dst_lookup(0, NULL, daddr); | 57 | dst = xfrm6_dst_lookup(0, NULL, daddr); |
57 | if (IS_ERR(dst)) | 58 | if (IS_ERR(dst)) |
58 | return -EHOSTUNREACH; | 59 | return -EHOSTUNREACH; |
59 | 60 | ||
60 | ipv6_dev_get_saddr(ip6_dst_idev(dst)->dev, | 61 | dev = ip6_dst_idev(dst)->dev; |
62 | ipv6_dev_get_saddr(dev_net(dev), dev, | ||
61 | (struct in6_addr *)&daddr->a6, 0, | 63 | (struct in6_addr *)&daddr->a6, 0, |
62 | (struct in6_addr *)&saddr->a6); | 64 | (struct in6_addr *)&saddr->a6); |
63 | dst_release(dst); | 65 | dst_release(dst); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index e1d11c9b6729..1e97fb9fb34b 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -2103,6 +2103,8 @@ static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata, | |||
2103 | rcu_read_unlock(); | 2103 | rcu_read_unlock(); |
2104 | return; | 2104 | return; |
2105 | } | 2105 | } |
2106 | /* update new sta with its last rx activity */ | ||
2107 | sta->last_rx = jiffies; | ||
2106 | } | 2108 | } |
2107 | 2109 | ||
2108 | /* | 2110 | /* |
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index 105a616c5c78..a8752031adcb 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
@@ -968,7 +968,7 @@ ctnetlink_change_helper(struct nf_conn *ct, struct nlattr *cda[]) | |||
968 | /* need to zero data of old helper */ | 968 | /* need to zero data of old helper */ |
969 | memset(&help->help, 0, sizeof(help->help)); | 969 | memset(&help->help, 0, sizeof(help->help)); |
970 | } else { | 970 | } else { |
971 | help = nf_ct_helper_ext_add(ct, GFP_KERNEL); | 971 | help = nf_ct_helper_ext_add(ct, GFP_ATOMIC); |
972 | if (help == NULL) | 972 | if (help == NULL) |
973 | return -ENOMEM; | 973 | return -ENOMEM; |
974 | } | 974 | } |
@@ -1136,16 +1136,33 @@ ctnetlink_create_conntrack(struct nlattr *cda[], | |||
1136 | ct->timeout.expires = jiffies + ct->timeout.expires * HZ; | 1136 | ct->timeout.expires = jiffies + ct->timeout.expires * HZ; |
1137 | ct->status |= IPS_CONFIRMED; | 1137 | ct->status |= IPS_CONFIRMED; |
1138 | 1138 | ||
1139 | rcu_read_lock(); | ||
1140 | helper = __nf_ct_helper_find(rtuple); | ||
1141 | if (helper) { | ||
1142 | help = nf_ct_helper_ext_add(ct, GFP_ATOMIC); | ||
1143 | if (help == NULL) { | ||
1144 | rcu_read_unlock(); | ||
1145 | err = -ENOMEM; | ||
1146 | goto err; | ||
1147 | } | ||
1148 | /* not in hash table yet so not strictly necessary */ | ||
1149 | rcu_assign_pointer(help->helper, helper); | ||
1150 | } | ||
1151 | |||
1139 | if (cda[CTA_STATUS]) { | 1152 | if (cda[CTA_STATUS]) { |
1140 | err = ctnetlink_change_status(ct, cda); | 1153 | err = ctnetlink_change_status(ct, cda); |
1141 | if (err < 0) | 1154 | if (err < 0) { |
1155 | rcu_read_unlock(); | ||
1142 | goto err; | 1156 | goto err; |
1157 | } | ||
1143 | } | 1158 | } |
1144 | 1159 | ||
1145 | if (cda[CTA_PROTOINFO]) { | 1160 | if (cda[CTA_PROTOINFO]) { |
1146 | err = ctnetlink_change_protoinfo(ct, cda); | 1161 | err = ctnetlink_change_protoinfo(ct, cda); |
1147 | if (err < 0) | 1162 | if (err < 0) { |
1163 | rcu_read_unlock(); | ||
1148 | goto err; | 1164 | goto err; |
1165 | } | ||
1149 | } | 1166 | } |
1150 | 1167 | ||
1151 | nf_ct_acct_ext_add(ct, GFP_KERNEL); | 1168 | nf_ct_acct_ext_add(ct, GFP_KERNEL); |
@@ -1155,19 +1172,6 @@ ctnetlink_create_conntrack(struct nlattr *cda[], | |||
1155 | ct->mark = ntohl(nla_get_be32(cda[CTA_MARK])); | 1172 | ct->mark = ntohl(nla_get_be32(cda[CTA_MARK])); |
1156 | #endif | 1173 | #endif |
1157 | 1174 | ||
1158 | rcu_read_lock(); | ||
1159 | helper = __nf_ct_helper_find(rtuple); | ||
1160 | if (helper) { | ||
1161 | help = nf_ct_helper_ext_add(ct, GFP_KERNEL); | ||
1162 | if (help == NULL) { | ||
1163 | rcu_read_unlock(); | ||
1164 | err = -ENOMEM; | ||
1165 | goto err; | ||
1166 | } | ||
1167 | /* not in hash table yet so not strictly necessary */ | ||
1168 | rcu_assign_pointer(help->helper, helper); | ||
1169 | } | ||
1170 | |||
1171 | /* setup master conntrack: this is a confirmed expectation */ | 1175 | /* setup master conntrack: this is a confirmed expectation */ |
1172 | if (master_ct) { | 1176 | if (master_ct) { |
1173 | __set_bit(IPS_EXPECTED_BIT, &ct->status); | 1177 | __set_bit(IPS_EXPECTED_BIT, &ct->status); |
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index d2d45655cd1a..35a9994e2339 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
@@ -150,6 +150,8 @@ static void update_rfkill_state(struct rfkill *rfkill) | |||
150 | * calls and handling all the red tape such as issuing notifications | 150 | * calls and handling all the red tape such as issuing notifications |
151 | * if the call is successful. | 151 | * if the call is successful. |
152 | * | 152 | * |
153 | * Suspended devices are not touched at all, and -EAGAIN is returned. | ||
154 | * | ||
153 | * Note that the @force parameter cannot override a (possibly cached) | 155 | * Note that the @force parameter cannot override a (possibly cached) |
154 | * state of RFKILL_STATE_HARD_BLOCKED. Any device making use of | 156 | * state of RFKILL_STATE_HARD_BLOCKED. Any device making use of |
155 | * RFKILL_STATE_HARD_BLOCKED implements either get_state() or | 157 | * RFKILL_STATE_HARD_BLOCKED implements either get_state() or |
@@ -168,6 +170,9 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, | |||
168 | int retval = 0; | 170 | int retval = 0; |
169 | enum rfkill_state oldstate, newstate; | 171 | enum rfkill_state oldstate, newstate; |
170 | 172 | ||
173 | if (unlikely(rfkill->dev.power.power_state.event & PM_EVENT_SLEEP)) | ||
174 | return -EBUSY; | ||
175 | |||
171 | oldstate = rfkill->state; | 176 | oldstate = rfkill->state; |
172 | 177 | ||
173 | if (rfkill->get_state && !force && | 178 | if (rfkill->get_state && !force && |
@@ -214,7 +219,7 @@ static int rfkill_toggle_radio(struct rfkill *rfkill, | |||
214 | * | 219 | * |
215 | * This function toggles the state of all switches of given type, | 220 | * This function toggles the state of all switches of given type, |
216 | * unless a specific switch is claimed by userspace (in which case, | 221 | * unless a specific switch is claimed by userspace (in which case, |
217 | * that switch is left alone). | 222 | * that switch is left alone) or suspended. |
218 | */ | 223 | */ |
219 | void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state) | 224 | void rfkill_switch_all(enum rfkill_type type, enum rfkill_state state) |
220 | { | 225 | { |
@@ -239,8 +244,8 @@ EXPORT_SYMBOL(rfkill_switch_all); | |||
239 | /** | 244 | /** |
240 | * rfkill_epo - emergency power off all transmitters | 245 | * rfkill_epo - emergency power off all transmitters |
241 | * | 246 | * |
242 | * This kicks all rfkill devices to RFKILL_STATE_SOFT_BLOCKED, ignoring | 247 | * This kicks all non-suspended rfkill devices to RFKILL_STATE_SOFT_BLOCKED, |
243 | * everything in its path but rfkill_mutex and rfkill->mutex. | 248 | * ignoring everything in its path but rfkill_mutex and rfkill->mutex. |
244 | */ | 249 | */ |
245 | void rfkill_epo(void) | 250 | void rfkill_epo(void) |
246 | { | 251 | { |
@@ -458,13 +463,14 @@ static int rfkill_resume(struct device *dev) | |||
458 | if (dev->power.power_state.event != PM_EVENT_ON) { | 463 | if (dev->power.power_state.event != PM_EVENT_ON) { |
459 | mutex_lock(&rfkill->mutex); | 464 | mutex_lock(&rfkill->mutex); |
460 | 465 | ||
466 | dev->power.power_state.event = PM_EVENT_ON; | ||
467 | |||
461 | /* restore radio state AND notify everybody */ | 468 | /* restore radio state AND notify everybody */ |
462 | rfkill_toggle_radio(rfkill, rfkill->state, 1); | 469 | rfkill_toggle_radio(rfkill, rfkill->state, 1); |
463 | 470 | ||
464 | mutex_unlock(&rfkill->mutex); | 471 | mutex_unlock(&rfkill->mutex); |
465 | } | 472 | } |
466 | 473 | ||
467 | dev->power.power_state = PMSG_ON; | ||
468 | return 0; | 474 | return 0; |
469 | } | 475 | } |
470 | #else | 476 | #else |
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c index d2b6f54a6261..5cafdd4c8018 100644 --- a/net/sched/cls_api.c +++ b/net/sched/cls_api.c | |||
@@ -280,7 +280,7 @@ replay: | |||
280 | if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) { | 280 | if (n->nlmsg_type == RTM_DELTFILTER && t->tcm_handle == 0) { |
281 | spin_lock_bh(root_lock); | 281 | spin_lock_bh(root_lock); |
282 | *back = tp->next; | 282 | *back = tp->next; |
283 | spin_lock_bh(root_lock); | 283 | spin_unlock_bh(root_lock); |
284 | 284 | ||
285 | tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER); | 285 | tfilter_notify(skb, n, tp, fh, RTM_DELTFILTER); |
286 | tcf_destroy(tp); | 286 | tcf_destroy(tp); |
diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c index c25465e5607a..e7fb9e0d21b4 100644 --- a/net/sched/sch_api.c +++ b/net/sched/sch_api.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/kmod.h> | 27 | #include <linux/kmod.h> |
28 | #include <linux/list.h> | 28 | #include <linux/list.h> |
29 | #include <linux/hrtimer.h> | 29 | #include <linux/hrtimer.h> |
30 | #include <linux/lockdep.h> | ||
30 | 31 | ||
31 | #include <net/net_namespace.h> | 32 | #include <net/net_namespace.h> |
32 | #include <net/sock.h> | 33 | #include <net/sock.h> |
@@ -198,19 +199,53 @@ struct Qdisc *qdisc_match_from_root(struct Qdisc *root, u32 handle) | |||
198 | return NULL; | 199 | return NULL; |
199 | } | 200 | } |
200 | 201 | ||
202 | /* | ||
203 | * This lock is needed until some qdiscs stop calling qdisc_tree_decrease_qlen() | ||
204 | * without rtnl_lock(); currently hfsc_dequeue(), netem_dequeue(), tbf_dequeue() | ||
205 | */ | ||
206 | static DEFINE_SPINLOCK(qdisc_list_lock); | ||
207 | |||
208 | static void qdisc_list_add(struct Qdisc *q) | ||
209 | { | ||
210 | if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) { | ||
211 | spin_lock_bh(&qdisc_list_lock); | ||
212 | list_add_tail(&q->list, &qdisc_root_sleeping(q)->list); | ||
213 | spin_unlock_bh(&qdisc_list_lock); | ||
214 | } | ||
215 | } | ||
216 | |||
217 | void qdisc_list_del(struct Qdisc *q) | ||
218 | { | ||
219 | if ((q->parent != TC_H_ROOT) && !(q->flags & TCQ_F_INGRESS)) { | ||
220 | spin_lock_bh(&qdisc_list_lock); | ||
221 | list_del(&q->list); | ||
222 | spin_unlock_bh(&qdisc_list_lock); | ||
223 | } | ||
224 | } | ||
225 | EXPORT_SYMBOL(qdisc_list_del); | ||
226 | |||
201 | struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle) | 227 | struct Qdisc *qdisc_lookup(struct net_device *dev, u32 handle) |
202 | { | 228 | { |
203 | unsigned int i; | 229 | unsigned int i; |
230 | struct Qdisc *q; | ||
231 | |||
232 | spin_lock_bh(&qdisc_list_lock); | ||
204 | 233 | ||
205 | for (i = 0; i < dev->num_tx_queues; i++) { | 234 | for (i = 0; i < dev->num_tx_queues; i++) { |
206 | struct netdev_queue *txq = netdev_get_tx_queue(dev, i); | 235 | struct netdev_queue *txq = netdev_get_tx_queue(dev, i); |
207 | struct Qdisc *q, *txq_root = txq->qdisc_sleeping; | 236 | struct Qdisc *txq_root = txq->qdisc_sleeping; |
208 | 237 | ||
209 | q = qdisc_match_from_root(txq_root, handle); | 238 | q = qdisc_match_from_root(txq_root, handle); |
210 | if (q) | 239 | if (q) |
211 | return q; | 240 | goto unlock; |
212 | } | 241 | } |
213 | return qdisc_match_from_root(dev->rx_queue.qdisc_sleeping, handle); | 242 | |
243 | q = qdisc_match_from_root(dev->rx_queue.qdisc_sleeping, handle); | ||
244 | |||
245 | unlock: | ||
246 | spin_unlock_bh(&qdisc_list_lock); | ||
247 | |||
248 | return q; | ||
214 | } | 249 | } |
215 | 250 | ||
216 | static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid) | 251 | static struct Qdisc *qdisc_leaf(struct Qdisc *p, u32 classid) |
@@ -331,7 +366,7 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt) | |||
331 | if (!s || tsize != s->tsize || (!tab && tsize > 0)) | 366 | if (!s || tsize != s->tsize || (!tab && tsize > 0)) |
332 | return ERR_PTR(-EINVAL); | 367 | return ERR_PTR(-EINVAL); |
333 | 368 | ||
334 | spin_lock_bh(&qdisc_stab_lock); | 369 | spin_lock(&qdisc_stab_lock); |
335 | 370 | ||
336 | list_for_each_entry(stab, &qdisc_stab_list, list) { | 371 | list_for_each_entry(stab, &qdisc_stab_list, list) { |
337 | if (memcmp(&stab->szopts, s, sizeof(*s))) | 372 | if (memcmp(&stab->szopts, s, sizeof(*s))) |
@@ -339,11 +374,11 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt) | |||
339 | if (tsize > 0 && memcmp(stab->data, tab, tsize * sizeof(u16))) | 374 | if (tsize > 0 && memcmp(stab->data, tab, tsize * sizeof(u16))) |
340 | continue; | 375 | continue; |
341 | stab->refcnt++; | 376 | stab->refcnt++; |
342 | spin_unlock_bh(&qdisc_stab_lock); | 377 | spin_unlock(&qdisc_stab_lock); |
343 | return stab; | 378 | return stab; |
344 | } | 379 | } |
345 | 380 | ||
346 | spin_unlock_bh(&qdisc_stab_lock); | 381 | spin_unlock(&qdisc_stab_lock); |
347 | 382 | ||
348 | stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL); | 383 | stab = kmalloc(sizeof(*stab) + tsize * sizeof(u16), GFP_KERNEL); |
349 | if (!stab) | 384 | if (!stab) |
@@ -354,9 +389,9 @@ static struct qdisc_size_table *qdisc_get_stab(struct nlattr *opt) | |||
354 | if (tsize > 0) | 389 | if (tsize > 0) |
355 | memcpy(stab->data, tab, tsize * sizeof(u16)); | 390 | memcpy(stab->data, tab, tsize * sizeof(u16)); |
356 | 391 | ||
357 | spin_lock_bh(&qdisc_stab_lock); | 392 | spin_lock(&qdisc_stab_lock); |
358 | list_add_tail(&stab->list, &qdisc_stab_list); | 393 | list_add_tail(&stab->list, &qdisc_stab_list); |
359 | spin_unlock_bh(&qdisc_stab_lock); | 394 | spin_unlock(&qdisc_stab_lock); |
360 | 395 | ||
361 | return stab; | 396 | return stab; |
362 | } | 397 | } |
@@ -366,14 +401,14 @@ void qdisc_put_stab(struct qdisc_size_table *tab) | |||
366 | if (!tab) | 401 | if (!tab) |
367 | return; | 402 | return; |
368 | 403 | ||
369 | spin_lock_bh(&qdisc_stab_lock); | 404 | spin_lock(&qdisc_stab_lock); |
370 | 405 | ||
371 | if (--tab->refcnt == 0) { | 406 | if (--tab->refcnt == 0) { |
372 | list_del(&tab->list); | 407 | list_del(&tab->list); |
373 | kfree(tab); | 408 | kfree(tab); |
374 | } | 409 | } |
375 | 410 | ||
376 | spin_unlock_bh(&qdisc_stab_lock); | 411 | spin_unlock(&qdisc_stab_lock); |
377 | } | 412 | } |
378 | EXPORT_SYMBOL(qdisc_put_stab); | 413 | EXPORT_SYMBOL(qdisc_put_stab); |
379 | 414 | ||
@@ -426,7 +461,7 @@ static enum hrtimer_restart qdisc_watchdog(struct hrtimer *timer) | |||
426 | 461 | ||
427 | wd->qdisc->flags &= ~TCQ_F_THROTTLED; | 462 | wd->qdisc->flags &= ~TCQ_F_THROTTLED; |
428 | smp_wmb(); | 463 | smp_wmb(); |
429 | __netif_schedule(wd->qdisc); | 464 | __netif_schedule(qdisc_root(wd->qdisc)); |
430 | 465 | ||
431 | return HRTIMER_NORESTART; | 466 | return HRTIMER_NORESTART; |
432 | } | 467 | } |
@@ -443,6 +478,10 @@ void qdisc_watchdog_schedule(struct qdisc_watchdog *wd, psched_time_t expires) | |||
443 | { | 478 | { |
444 | ktime_t time; | 479 | ktime_t time; |
445 | 480 | ||
481 | if (test_bit(__QDISC_STATE_DEACTIVATED, | ||
482 | &qdisc_root_sleeping(wd->qdisc)->state)) | ||
483 | return; | ||
484 | |||
446 | wd->qdisc->flags |= TCQ_F_THROTTLED; | 485 | wd->qdisc->flags |= TCQ_F_THROTTLED; |
447 | time = ktime_set(0, 0); | 486 | time = ktime_set(0, 0); |
448 | time = ktime_add_ns(time, PSCHED_US2NS(expires)); | 487 | time = ktime_add_ns(time, PSCHED_US2NS(expires)); |
@@ -637,11 +676,8 @@ static void notify_and_destroy(struct sk_buff *skb, struct nlmsghdr *n, u32 clid | |||
637 | if (new || old) | 676 | if (new || old) |
638 | qdisc_notify(skb, n, clid, old, new); | 677 | qdisc_notify(skb, n, clid, old, new); |
639 | 678 | ||
640 | if (old) { | 679 | if (old) |
641 | spin_lock_bh(&old->q.lock); | ||
642 | qdisc_destroy(old); | 680 | qdisc_destroy(old); |
643 | spin_unlock_bh(&old->q.lock); | ||
644 | } | ||
645 | } | 681 | } |
646 | 682 | ||
647 | /* Graft qdisc "new" to class "classid" of qdisc "parent" or | 683 | /* Graft qdisc "new" to class "classid" of qdisc "parent" or |
@@ -707,6 +743,10 @@ static int qdisc_graft(struct net_device *dev, struct Qdisc *parent, | |||
707 | return err; | 743 | return err; |
708 | } | 744 | } |
709 | 745 | ||
746 | /* lockdep annotation is needed for ingress; egress gets it only for name */ | ||
747 | static struct lock_class_key qdisc_tx_lock; | ||
748 | static struct lock_class_key qdisc_rx_lock; | ||
749 | |||
710 | /* | 750 | /* |
711 | Allocate and initialize new qdisc. | 751 | Allocate and initialize new qdisc. |
712 | 752 | ||
@@ -767,6 +807,7 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue, | |||
767 | if (handle == TC_H_INGRESS) { | 807 | if (handle == TC_H_INGRESS) { |
768 | sch->flags |= TCQ_F_INGRESS; | 808 | sch->flags |= TCQ_F_INGRESS; |
769 | handle = TC_H_MAKE(TC_H_INGRESS, 0); | 809 | handle = TC_H_MAKE(TC_H_INGRESS, 0); |
810 | lockdep_set_class(qdisc_lock(sch), &qdisc_rx_lock); | ||
770 | } else { | 811 | } else { |
771 | if (handle == 0) { | 812 | if (handle == 0) { |
772 | handle = qdisc_alloc_handle(dev); | 813 | handle = qdisc_alloc_handle(dev); |
@@ -774,6 +815,7 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue, | |||
774 | if (handle == 0) | 815 | if (handle == 0) |
775 | goto err_out3; | 816 | goto err_out3; |
776 | } | 817 | } |
818 | lockdep_set_class(qdisc_lock(sch), &qdisc_tx_lock); | ||
777 | } | 819 | } |
778 | 820 | ||
779 | sch->handle = handle; | 821 | sch->handle = handle; |
@@ -802,8 +844,8 @@ qdisc_create(struct net_device *dev, struct netdev_queue *dev_queue, | |||
802 | goto err_out3; | 844 | goto err_out3; |
803 | } | 845 | } |
804 | } | 846 | } |
805 | if ((parent != TC_H_ROOT) && !(sch->flags & TCQ_F_INGRESS)) | 847 | |
806 | list_add_tail(&sch->list, &dev_queue->qdisc_sleeping->list); | 848 | qdisc_list_add(sch); |
807 | 849 | ||
808 | return sch; | 850 | return sch; |
809 | } | 851 | } |
@@ -1084,20 +1126,13 @@ create_n_graft: | |||
1084 | } | 1126 | } |
1085 | 1127 | ||
1086 | graft: | 1128 | graft: |
1087 | if (1) { | 1129 | err = qdisc_graft(dev, p, skb, n, clid, q, NULL); |
1088 | spinlock_t *root_lock; | 1130 | if (err) { |
1089 | 1131 | if (q) | |
1090 | err = qdisc_graft(dev, p, skb, n, clid, q, NULL); | 1132 | qdisc_destroy(q); |
1091 | if (err) { | 1133 | return err; |
1092 | if (q) { | ||
1093 | root_lock = qdisc_root_lock(q); | ||
1094 | spin_lock_bh(root_lock); | ||
1095 | qdisc_destroy(q); | ||
1096 | spin_unlock_bh(root_lock); | ||
1097 | } | ||
1098 | return err; | ||
1099 | } | ||
1100 | } | 1134 | } |
1135 | |||
1101 | return 0; | 1136 | return 0; |
1102 | } | 1137 | } |
1103 | 1138 | ||
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 4e261ce62f48..8fa90d68ec6d 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
@@ -521,6 +521,10 @@ static void cbq_ovl_delay(struct cbq_class *cl) | |||
521 | struct cbq_sched_data *q = qdisc_priv(cl->qdisc); | 521 | struct cbq_sched_data *q = qdisc_priv(cl->qdisc); |
522 | psched_tdiff_t delay = cl->undertime - q->now; | 522 | psched_tdiff_t delay = cl->undertime - q->now; |
523 | 523 | ||
524 | if (test_bit(__QDISC_STATE_DEACTIVATED, | ||
525 | &qdisc_root_sleeping(cl->qdisc)->state)) | ||
526 | return; | ||
527 | |||
524 | if (!cl->delayed) { | 528 | if (!cl->delayed) { |
525 | psched_time_t sched = q->now; | 529 | psched_time_t sched = q->now; |
526 | ktime_t expires; | 530 | ktime_t expires; |
@@ -654,7 +658,7 @@ static enum hrtimer_restart cbq_undelay(struct hrtimer *timer) | |||
654 | } | 658 | } |
655 | 659 | ||
656 | sch->flags &= ~TCQ_F_THROTTLED; | 660 | sch->flags &= ~TCQ_F_THROTTLED; |
657 | __netif_schedule(sch); | 661 | __netif_schedule(qdisc_root(sch)); |
658 | return HRTIMER_NORESTART; | 662 | return HRTIMER_NORESTART; |
659 | } | 663 | } |
660 | 664 | ||
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c index 468574682caa..5f0ade7806a7 100644 --- a/net/sched/sch_generic.c +++ b/net/sched/sch_generic.c | |||
@@ -518,15 +518,17 @@ void qdisc_reset(struct Qdisc *qdisc) | |||
518 | } | 518 | } |
519 | EXPORT_SYMBOL(qdisc_reset); | 519 | EXPORT_SYMBOL(qdisc_reset); |
520 | 520 | ||
521 | /* this is the rcu callback function to clean up a qdisc when there | 521 | void qdisc_destroy(struct Qdisc *qdisc) |
522 | * are no further references to it */ | ||
523 | |||
524 | static void __qdisc_destroy(struct rcu_head *head) | ||
525 | { | 522 | { |
526 | struct Qdisc *qdisc = container_of(head, struct Qdisc, q_rcu); | ||
527 | const struct Qdisc_ops *ops = qdisc->ops; | 523 | const struct Qdisc_ops *ops = qdisc->ops; |
528 | 524 | ||
525 | if (qdisc->flags & TCQ_F_BUILTIN || | ||
526 | !atomic_dec_and_test(&qdisc->refcnt)) | ||
527 | return; | ||
528 | |||
529 | #ifdef CONFIG_NET_SCHED | 529 | #ifdef CONFIG_NET_SCHED |
530 | qdisc_list_del(qdisc); | ||
531 | |||
530 | qdisc_put_stab(qdisc->stab); | 532 | qdisc_put_stab(qdisc->stab); |
531 | #endif | 533 | #endif |
532 | gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est); | 534 | gen_kill_estimator(&qdisc->bstats, &qdisc->rate_est); |
@@ -542,20 +544,6 @@ static void __qdisc_destroy(struct rcu_head *head) | |||
542 | 544 | ||
543 | kfree((char *) qdisc - qdisc->padded); | 545 | kfree((char *) qdisc - qdisc->padded); |
544 | } | 546 | } |
545 | |||
546 | /* Under qdisc_lock(qdisc) and BH! */ | ||
547 | |||
548 | void qdisc_destroy(struct Qdisc *qdisc) | ||
549 | { | ||
550 | if (qdisc->flags & TCQ_F_BUILTIN || | ||
551 | !atomic_dec_and_test(&qdisc->refcnt)) | ||
552 | return; | ||
553 | |||
554 | if (qdisc->parent) | ||
555 | list_del(&qdisc->list); | ||
556 | |||
557 | call_rcu(&qdisc->q_rcu, __qdisc_destroy); | ||
558 | } | ||
559 | EXPORT_SYMBOL(qdisc_destroy); | 547 | EXPORT_SYMBOL(qdisc_destroy); |
560 | 548 | ||
561 | static bool dev_all_qdisc_sleeping_noop(struct net_device *dev) | 549 | static bool dev_all_qdisc_sleeping_noop(struct net_device *dev) |
@@ -597,6 +585,9 @@ static void transition_one_qdisc(struct net_device *dev, | |||
597 | struct Qdisc *new_qdisc = dev_queue->qdisc_sleeping; | 585 | struct Qdisc *new_qdisc = dev_queue->qdisc_sleeping; |
598 | int *need_watchdog_p = _need_watchdog; | 586 | int *need_watchdog_p = _need_watchdog; |
599 | 587 | ||
588 | if (!(new_qdisc->flags & TCQ_F_BUILTIN)) | ||
589 | clear_bit(__QDISC_STATE_DEACTIVATED, &new_qdisc->state); | ||
590 | |||
600 | rcu_assign_pointer(dev_queue->qdisc, new_qdisc); | 591 | rcu_assign_pointer(dev_queue->qdisc, new_qdisc); |
601 | if (need_watchdog_p && new_qdisc != &noqueue_qdisc) | 592 | if (need_watchdog_p && new_qdisc != &noqueue_qdisc) |
602 | *need_watchdog_p = 1; | 593 | *need_watchdog_p = 1; |
@@ -640,6 +631,9 @@ static void dev_deactivate_queue(struct net_device *dev, | |||
640 | if (qdisc) { | 631 | if (qdisc) { |
641 | spin_lock_bh(qdisc_lock(qdisc)); | 632 | spin_lock_bh(qdisc_lock(qdisc)); |
642 | 633 | ||
634 | if (!(qdisc->flags & TCQ_F_BUILTIN)) | ||
635 | set_bit(__QDISC_STATE_DEACTIVATED, &qdisc->state); | ||
636 | |||
643 | dev_queue->qdisc = qdisc_default; | 637 | dev_queue->qdisc = qdisc_default; |
644 | qdisc_reset(qdisc); | 638 | qdisc_reset(qdisc); |
645 | 639 | ||
@@ -647,7 +641,7 @@ static void dev_deactivate_queue(struct net_device *dev, | |||
647 | } | 641 | } |
648 | } | 642 | } |
649 | 643 | ||
650 | static bool some_qdisc_is_busy(struct net_device *dev, int lock) | 644 | static bool some_qdisc_is_busy(struct net_device *dev) |
651 | { | 645 | { |
652 | unsigned int i; | 646 | unsigned int i; |
653 | 647 | ||
@@ -661,14 +655,12 @@ static bool some_qdisc_is_busy(struct net_device *dev, int lock) | |||
661 | q = dev_queue->qdisc_sleeping; | 655 | q = dev_queue->qdisc_sleeping; |
662 | root_lock = qdisc_lock(q); | 656 | root_lock = qdisc_lock(q); |
663 | 657 | ||
664 | if (lock) | 658 | spin_lock_bh(root_lock); |
665 | spin_lock_bh(root_lock); | ||
666 | 659 | ||
667 | val = (test_bit(__QDISC_STATE_RUNNING, &q->state) || | 660 | val = (test_bit(__QDISC_STATE_RUNNING, &q->state) || |
668 | test_bit(__QDISC_STATE_SCHED, &q->state)); | 661 | test_bit(__QDISC_STATE_SCHED, &q->state)); |
669 | 662 | ||
670 | if (lock) | 663 | spin_unlock_bh(root_lock); |
671 | spin_unlock_bh(root_lock); | ||
672 | 664 | ||
673 | if (val) | 665 | if (val) |
674 | return true; | 666 | return true; |
@@ -678,8 +670,6 @@ static bool some_qdisc_is_busy(struct net_device *dev, int lock) | |||
678 | 670 | ||
679 | void dev_deactivate(struct net_device *dev) | 671 | void dev_deactivate(struct net_device *dev) |
680 | { | 672 | { |
681 | bool running; | ||
682 | |||
683 | netdev_for_each_tx_queue(dev, dev_deactivate_queue, &noop_qdisc); | 673 | netdev_for_each_tx_queue(dev, dev_deactivate_queue, &noop_qdisc); |
684 | dev_deactivate_queue(dev, &dev->rx_queue, &noop_qdisc); | 674 | dev_deactivate_queue(dev, &dev->rx_queue, &noop_qdisc); |
685 | 675 | ||
@@ -689,25 +679,8 @@ void dev_deactivate(struct net_device *dev) | |||
689 | synchronize_rcu(); | 679 | synchronize_rcu(); |
690 | 680 | ||
691 | /* Wait for outstanding qdisc_run calls. */ | 681 | /* Wait for outstanding qdisc_run calls. */ |
692 | do { | 682 | while (some_qdisc_is_busy(dev)) |
693 | while (some_qdisc_is_busy(dev, 0)) | 683 | yield(); |
694 | yield(); | ||
695 | |||
696 | /* | ||
697 | * Double-check inside queue lock to ensure that all effects | ||
698 | * of the queue run are visible when we return. | ||
699 | */ | ||
700 | running = some_qdisc_is_busy(dev, 1); | ||
701 | |||
702 | /* | ||
703 | * The running flag should never be set at this point because | ||
704 | * we've already set dev->qdisc to noop_qdisc *inside* the same | ||
705 | * pair of spin locks. That is, if any qdisc_run starts after | ||
706 | * our initial test it should see the noop_qdisc and then | ||
707 | * clear the RUNNING bit before dropping the queue lock. So | ||
708 | * if it is set here then we've found a bug. | ||
709 | */ | ||
710 | } while (WARN_ON_ONCE(running)); | ||
711 | } | 684 | } |
712 | 685 | ||
713 | static void dev_init_scheduler_queue(struct net_device *dev, | 686 | static void dev_init_scheduler_queue(struct net_device *dev, |
@@ -736,14 +709,10 @@ static void shutdown_scheduler_queue(struct net_device *dev, | |||
736 | struct Qdisc *qdisc_default = _qdisc_default; | 709 | struct Qdisc *qdisc_default = _qdisc_default; |
737 | 710 | ||
738 | if (qdisc) { | 711 | if (qdisc) { |
739 | spinlock_t *root_lock = qdisc_lock(qdisc); | ||
740 | |||
741 | dev_queue->qdisc = qdisc_default; | 712 | dev_queue->qdisc = qdisc_default; |
742 | dev_queue->qdisc_sleeping = qdisc_default; | 713 | dev_queue->qdisc_sleeping = qdisc_default; |
743 | 714 | ||
744 | spin_lock_bh(root_lock); | ||
745 | qdisc_destroy(qdisc); | 715 | qdisc_destroy(qdisc); |
746 | spin_unlock_bh(root_lock); | ||
747 | } | 716 | } |
748 | } | 717 | } |
749 | 718 | ||
diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 6febd245e62b..0df0df202ed0 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c | |||
@@ -577,7 +577,7 @@ static int htb_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
577 | sch->qstats.drops++; | 577 | sch->qstats.drops++; |
578 | cl->qstats.drops++; | 578 | cl->qstats.drops++; |
579 | } | 579 | } |
580 | return NET_XMIT_DROP; | 580 | return ret; |
581 | } else { | 581 | } else { |
582 | cl->bstats.packets += | 582 | cl->bstats.packets += |
583 | skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1; | 583 | skb_is_gso(skb)?skb_shinfo(skb)->gso_segs:1; |
@@ -623,7 +623,7 @@ static int htb_requeue(struct sk_buff *skb, struct Qdisc *sch) | |||
623 | sch->qstats.drops++; | 623 | sch->qstats.drops++; |
624 | cl->qstats.drops++; | 624 | cl->qstats.drops++; |
625 | } | 625 | } |
626 | return NET_XMIT_DROP; | 626 | return ret; |
627 | } else | 627 | } else |
628 | htb_activate(q, cl); | 628 | htb_activate(q, cl); |
629 | 629 | ||
diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c index eac197610edf..a6697c686c7f 100644 --- a/net/sched/sch_prio.c +++ b/net/sched/sch_prio.c | |||
@@ -113,11 +113,11 @@ prio_requeue(struct sk_buff *skb, struct Qdisc* sch) | |||
113 | if ((ret = qdisc->ops->requeue(skb, qdisc)) == NET_XMIT_SUCCESS) { | 113 | if ((ret = qdisc->ops->requeue(skb, qdisc)) == NET_XMIT_SUCCESS) { |
114 | sch->q.qlen++; | 114 | sch->q.qlen++; |
115 | sch->qstats.requeues++; | 115 | sch->qstats.requeues++; |
116 | return 0; | 116 | return NET_XMIT_SUCCESS; |
117 | } | 117 | } |
118 | if (net_xmit_drop_count(ret)) | 118 | if (net_xmit_drop_count(ret)) |
119 | sch->qstats.drops++; | 119 | sch->qstats.drops++; |
120 | return NET_XMIT_DROP; | 120 | return ret; |
121 | } | 121 | } |
122 | 122 | ||
123 | 123 | ||
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index 7d3b7ff3bf07..94c61598b86a 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c | |||
@@ -123,15 +123,8 @@ static int tbf_enqueue(struct sk_buff *skb, struct Qdisc* sch) | |||
123 | struct tbf_sched_data *q = qdisc_priv(sch); | 123 | struct tbf_sched_data *q = qdisc_priv(sch); |
124 | int ret; | 124 | int ret; |
125 | 125 | ||
126 | if (qdisc_pkt_len(skb) > q->max_size) { | 126 | if (qdisc_pkt_len(skb) > q->max_size) |
127 | sch->qstats.drops++; | 127 | return qdisc_reshape_fail(skb, sch); |
128 | #ifdef CONFIG_NET_CLS_ACT | ||
129 | if (sch->reshape_fail == NULL || sch->reshape_fail(skb, sch)) | ||
130 | #endif | ||
131 | kfree_skb(skb); | ||
132 | |||
133 | return NET_XMIT_DROP; | ||
134 | } | ||
135 | 128 | ||
136 | ret = qdisc_enqueue(skb, q->qdisc); | 129 | ret = qdisc_enqueue(skb, q->qdisc); |
137 | if (ret != 0) { | 130 | if (ret != 0) { |
diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c index e39a0cdef184..4c8d9f45ce09 100644 --- a/net/sctp/endpointola.c +++ b/net/sctp/endpointola.c | |||
@@ -103,6 +103,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | |||
103 | 103 | ||
104 | /* Initialize the CHUNKS parameter */ | 104 | /* Initialize the CHUNKS parameter */ |
105 | auth_chunks->param_hdr.type = SCTP_PARAM_CHUNKS; | 105 | auth_chunks->param_hdr.type = SCTP_PARAM_CHUNKS; |
106 | auth_chunks->param_hdr.length = htons(sizeof(sctp_paramhdr_t)); | ||
106 | 107 | ||
107 | /* If the Add-IP functionality is enabled, we must | 108 | /* If the Add-IP functionality is enabled, we must |
108 | * authenticate, ASCONF and ASCONF-ACK chunks | 109 | * authenticate, ASCONF and ASCONF-ACK chunks |
@@ -110,8 +111,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, | |||
110 | if (sctp_addip_enable) { | 111 | if (sctp_addip_enable) { |
111 | auth_chunks->chunks[0] = SCTP_CID_ASCONF; | 112 | auth_chunks->chunks[0] = SCTP_CID_ASCONF; |
112 | auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK; | 113 | auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK; |
113 | auth_chunks->param_hdr.length = | 114 | auth_chunks->param_hdr.length += htons(2); |
114 | htons(sizeof(sctp_paramhdr_t) + 2); | ||
115 | } | 115 | } |
116 | } | 116 | } |
117 | 117 | ||
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c index 483a01d0740a..47f91afa0211 100644 --- a/net/sctp/ipv6.c +++ b/net/sctp/ipv6.c | |||
@@ -319,7 +319,8 @@ static void sctp_v6_get_saddr(struct sctp_sock *sk, | |||
319 | __func__, asoc, dst, NIP6(daddr->v6.sin6_addr)); | 319 | __func__, asoc, dst, NIP6(daddr->v6.sin6_addr)); |
320 | 320 | ||
321 | if (!asoc) { | 321 | if (!asoc) { |
322 | ipv6_dev_get_saddr(dst ? ip6_dst_idev(dst)->dev : NULL, | 322 | ipv6_dev_get_saddr(sock_net(sctp_opt2sk(sk)), |
323 | dst ? ip6_dst_idev(dst)->dev : NULL, | ||
323 | &daddr->v6.sin6_addr, | 324 | &daddr->v6.sin6_addr, |
324 | inet6_sk(&sk->inet.sk)->srcprefs, | 325 | inet6_sk(&sk->inet.sk)->srcprefs, |
325 | &saddr->v6.sin6_addr); | 326 | &saddr->v6.sin6_addr); |
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index dbb79adf8f3c..bb5c9ef13046 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -3055,6 +3055,9 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk, | |||
3055 | { | 3055 | { |
3056 | struct sctp_authchunk val; | 3056 | struct sctp_authchunk val; |
3057 | 3057 | ||
3058 | if (!sctp_auth_enable) | ||
3059 | return -EACCES; | ||
3060 | |||
3058 | if (optlen != sizeof(struct sctp_authchunk)) | 3061 | if (optlen != sizeof(struct sctp_authchunk)) |
3059 | return -EINVAL; | 3062 | return -EINVAL; |
3060 | if (copy_from_user(&val, optval, optlen)) | 3063 | if (copy_from_user(&val, optval, optlen)) |
@@ -3085,6 +3088,9 @@ static int sctp_setsockopt_hmac_ident(struct sock *sk, | |||
3085 | struct sctp_hmacalgo *hmacs; | 3088 | struct sctp_hmacalgo *hmacs; |
3086 | int err; | 3089 | int err; |
3087 | 3090 | ||
3091 | if (!sctp_auth_enable) | ||
3092 | return -EACCES; | ||
3093 | |||
3088 | if (optlen < sizeof(struct sctp_hmacalgo)) | 3094 | if (optlen < sizeof(struct sctp_hmacalgo)) |
3089 | return -EINVAL; | 3095 | return -EINVAL; |
3090 | 3096 | ||
@@ -3123,6 +3129,9 @@ static int sctp_setsockopt_auth_key(struct sock *sk, | |||
3123 | struct sctp_association *asoc; | 3129 | struct sctp_association *asoc; |
3124 | int ret; | 3130 | int ret; |
3125 | 3131 | ||
3132 | if (!sctp_auth_enable) | ||
3133 | return -EACCES; | ||
3134 | |||
3126 | if (optlen <= sizeof(struct sctp_authkey)) | 3135 | if (optlen <= sizeof(struct sctp_authkey)) |
3127 | return -EINVAL; | 3136 | return -EINVAL; |
3128 | 3137 | ||
@@ -3160,6 +3169,9 @@ static int sctp_setsockopt_active_key(struct sock *sk, | |||
3160 | struct sctp_authkeyid val; | 3169 | struct sctp_authkeyid val; |
3161 | struct sctp_association *asoc; | 3170 | struct sctp_association *asoc; |
3162 | 3171 | ||
3172 | if (!sctp_auth_enable) | ||
3173 | return -EACCES; | ||
3174 | |||
3163 | if (optlen != sizeof(struct sctp_authkeyid)) | 3175 | if (optlen != sizeof(struct sctp_authkeyid)) |
3164 | return -EINVAL; | 3176 | return -EINVAL; |
3165 | if (copy_from_user(&val, optval, optlen)) | 3177 | if (copy_from_user(&val, optval, optlen)) |
@@ -3185,6 +3197,9 @@ static int sctp_setsockopt_del_key(struct sock *sk, | |||
3185 | struct sctp_authkeyid val; | 3197 | struct sctp_authkeyid val; |
3186 | struct sctp_association *asoc; | 3198 | struct sctp_association *asoc; |
3187 | 3199 | ||
3200 | if (!sctp_auth_enable) | ||
3201 | return -EACCES; | ||
3202 | |||
3188 | if (optlen != sizeof(struct sctp_authkeyid)) | 3203 | if (optlen != sizeof(struct sctp_authkeyid)) |
3189 | return -EINVAL; | 3204 | return -EINVAL; |
3190 | if (copy_from_user(&val, optval, optlen)) | 3205 | if (copy_from_user(&val, optval, optlen)) |
@@ -5197,19 +5212,29 @@ static int sctp_getsockopt_maxburst(struct sock *sk, int len, | |||
5197 | static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, | 5212 | static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, |
5198 | char __user *optval, int __user *optlen) | 5213 | char __user *optval, int __user *optlen) |
5199 | { | 5214 | { |
5215 | struct sctp_hmacalgo __user *p = (void __user *)optval; | ||
5200 | struct sctp_hmac_algo_param *hmacs; | 5216 | struct sctp_hmac_algo_param *hmacs; |
5201 | __u16 param_len; | 5217 | __u16 data_len = 0; |
5218 | u32 num_idents; | ||
5219 | |||
5220 | if (!sctp_auth_enable) | ||
5221 | return -EACCES; | ||
5202 | 5222 | ||
5203 | hmacs = sctp_sk(sk)->ep->auth_hmacs_list; | 5223 | hmacs = sctp_sk(sk)->ep->auth_hmacs_list; |
5204 | param_len = ntohs(hmacs->param_hdr.length); | 5224 | data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t); |
5205 | 5225 | ||
5206 | if (len < param_len) | 5226 | if (len < sizeof(struct sctp_hmacalgo) + data_len) |
5207 | return -EINVAL; | 5227 | return -EINVAL; |
5228 | |||
5229 | len = sizeof(struct sctp_hmacalgo) + data_len; | ||
5230 | num_idents = data_len / sizeof(u16); | ||
5231 | |||
5208 | if (put_user(len, optlen)) | 5232 | if (put_user(len, optlen)) |
5209 | return -EFAULT; | 5233 | return -EFAULT; |
5210 | if (copy_to_user(optval, hmacs->hmac_ids, len)) | 5234 | if (put_user(num_idents, &p->shmac_num_idents)) |
5235 | return -EFAULT; | ||
5236 | if (copy_to_user(p->shmac_idents, hmacs->hmac_ids, data_len)) | ||
5211 | return -EFAULT; | 5237 | return -EFAULT; |
5212 | |||
5213 | return 0; | 5238 | return 0; |
5214 | } | 5239 | } |
5215 | 5240 | ||
@@ -5219,6 +5244,9 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len, | |||
5219 | struct sctp_authkeyid val; | 5244 | struct sctp_authkeyid val; |
5220 | struct sctp_association *asoc; | 5245 | struct sctp_association *asoc; |
5221 | 5246 | ||
5247 | if (!sctp_auth_enable) | ||
5248 | return -EACCES; | ||
5249 | |||
5222 | if (len < sizeof(struct sctp_authkeyid)) | 5250 | if (len < sizeof(struct sctp_authkeyid)) |
5223 | return -EINVAL; | 5251 | return -EINVAL; |
5224 | if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid))) | 5252 | if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid))) |
@@ -5233,6 +5261,12 @@ static int sctp_getsockopt_active_key(struct sock *sk, int len, | |||
5233 | else | 5261 | else |
5234 | val.scact_keynumber = sctp_sk(sk)->ep->active_key_id; | 5262 | val.scact_keynumber = sctp_sk(sk)->ep->active_key_id; |
5235 | 5263 | ||
5264 | len = sizeof(struct sctp_authkeyid); | ||
5265 | if (put_user(len, optlen)) | ||
5266 | return -EFAULT; | ||
5267 | if (copy_to_user(optval, &val, len)) | ||
5268 | return -EFAULT; | ||
5269 | |||
5236 | return 0; | 5270 | return 0; |
5237 | } | 5271 | } |
5238 | 5272 | ||
@@ -5243,13 +5277,16 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, | |||
5243 | struct sctp_authchunks val; | 5277 | struct sctp_authchunks val; |
5244 | struct sctp_association *asoc; | 5278 | struct sctp_association *asoc; |
5245 | struct sctp_chunks_param *ch; | 5279 | struct sctp_chunks_param *ch; |
5246 | u32 num_chunks; | 5280 | u32 num_chunks = 0; |
5247 | char __user *to; | 5281 | char __user *to; |
5248 | 5282 | ||
5249 | if (len <= sizeof(struct sctp_authchunks)) | 5283 | if (!sctp_auth_enable) |
5284 | return -EACCES; | ||
5285 | |||
5286 | if (len < sizeof(struct sctp_authchunks)) | ||
5250 | return -EINVAL; | 5287 | return -EINVAL; |
5251 | 5288 | ||
5252 | if (copy_from_user(&val, p, sizeof(struct sctp_authchunks))) | 5289 | if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) |
5253 | return -EFAULT; | 5290 | return -EFAULT; |
5254 | 5291 | ||
5255 | to = p->gauth_chunks; | 5292 | to = p->gauth_chunks; |
@@ -5258,20 +5295,21 @@ static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, | |||
5258 | return -EINVAL; | 5295 | return -EINVAL; |
5259 | 5296 | ||
5260 | ch = asoc->peer.peer_chunks; | 5297 | ch = asoc->peer.peer_chunks; |
5298 | if (!ch) | ||
5299 | goto num; | ||
5261 | 5300 | ||
5262 | /* See if the user provided enough room for all the data */ | 5301 | /* See if the user provided enough room for all the data */ |
5263 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); | 5302 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); |
5264 | if (len < num_chunks) | 5303 | if (len < num_chunks) |
5265 | return -EINVAL; | 5304 | return -EINVAL; |
5266 | 5305 | ||
5267 | len = num_chunks; | 5306 | if (copy_to_user(to, ch->chunks, num_chunks)) |
5268 | if (put_user(len, optlen)) | ||
5269 | return -EFAULT; | 5307 | return -EFAULT; |
5308 | num: | ||
5309 | len = sizeof(struct sctp_authchunks) + num_chunks; | ||
5310 | if (put_user(len, optlen)) return -EFAULT; | ||
5270 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) | 5311 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) |
5271 | return -EFAULT; | 5312 | return -EFAULT; |
5272 | if (copy_to_user(to, ch->chunks, len)) | ||
5273 | return -EFAULT; | ||
5274 | |||
5275 | return 0; | 5313 | return 0; |
5276 | } | 5314 | } |
5277 | 5315 | ||
@@ -5282,13 +5320,16 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, | |||
5282 | struct sctp_authchunks val; | 5320 | struct sctp_authchunks val; |
5283 | struct sctp_association *asoc; | 5321 | struct sctp_association *asoc; |
5284 | struct sctp_chunks_param *ch; | 5322 | struct sctp_chunks_param *ch; |
5285 | u32 num_chunks; | 5323 | u32 num_chunks = 0; |
5286 | char __user *to; | 5324 | char __user *to; |
5287 | 5325 | ||
5288 | if (len <= sizeof(struct sctp_authchunks)) | 5326 | if (!sctp_auth_enable) |
5327 | return -EACCES; | ||
5328 | |||
5329 | if (len < sizeof(struct sctp_authchunks)) | ||
5289 | return -EINVAL; | 5330 | return -EINVAL; |
5290 | 5331 | ||
5291 | if (copy_from_user(&val, p, sizeof(struct sctp_authchunks))) | 5332 | if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) |
5292 | return -EFAULT; | 5333 | return -EFAULT; |
5293 | 5334 | ||
5294 | to = p->gauth_chunks; | 5335 | to = p->gauth_chunks; |
@@ -5301,17 +5342,21 @@ static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, | |||
5301 | else | 5342 | else |
5302 | ch = sctp_sk(sk)->ep->auth_chunk_list; | 5343 | ch = sctp_sk(sk)->ep->auth_chunk_list; |
5303 | 5344 | ||
5345 | if (!ch) | ||
5346 | goto num; | ||
5347 | |||
5304 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); | 5348 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); |
5305 | if (len < num_chunks) | 5349 | if (len < sizeof(struct sctp_authchunks) + num_chunks) |
5306 | return -EINVAL; | 5350 | return -EINVAL; |
5307 | 5351 | ||
5308 | len = num_chunks; | 5352 | if (copy_to_user(to, ch->chunks, num_chunks)) |
5353 | return -EFAULT; | ||
5354 | num: | ||
5355 | len = sizeof(struct sctp_authchunks) + num_chunks; | ||
5309 | if (put_user(len, optlen)) | 5356 | if (put_user(len, optlen)) |
5310 | return -EFAULT; | 5357 | return -EFAULT; |
5311 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) | 5358 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) |
5312 | return -EFAULT; | 5359 | return -EFAULT; |
5313 | if (copy_to_user(to, ch->chunks, len)) | ||
5314 | return -EFAULT; | ||
5315 | 5360 | ||
5316 | return 0; | 5361 | return 0; |
5317 | } | 5362 | } |
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 4fa1f3ad2513..4c9890ec2528 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
@@ -344,14 +344,20 @@ static void do_pnp_device_entry(void *symval, unsigned long size, | |||
344 | struct module *mod) | 344 | struct module *mod) |
345 | { | 345 | { |
346 | const unsigned long id_size = sizeof(struct pnp_device_id); | 346 | const unsigned long id_size = sizeof(struct pnp_device_id); |
347 | const struct pnp_device_id *id = symval; | 347 | const unsigned int count = (size / id_size)-1; |
348 | const struct pnp_device_id *devs = symval; | ||
349 | unsigned int i; | ||
348 | 350 | ||
349 | device_id_check(mod->name, "pnp", size, id_size, symval); | 351 | device_id_check(mod->name, "pnp", size, id_size, symval); |
350 | 352 | ||
351 | buf_printf(&mod->dev_table_buf, | 353 | for (i = 0; i < count; i++) { |
352 | "MODULE_ALIAS(\"pnp:d%s*\");\n", id->id); | 354 | const char *id = (char *)devs[i].id; |
353 | buf_printf(&mod->dev_table_buf, | 355 | |
354 | "MODULE_ALIAS(\"acpi*:%s:*\");\n", id->id); | 356 | buf_printf(&mod->dev_table_buf, |
357 | "MODULE_ALIAS(\"pnp:d%s*\");\n", id); | ||
358 | buf_printf(&mod->dev_table_buf, | ||
359 | "MODULE_ALIAS(\"acpi*:%s:*\");\n", id); | ||
360 | } | ||
355 | } | 361 | } |
356 | 362 | ||
357 | /* looks like: "pnp:dD" for every device of the card */ | 363 | /* looks like: "pnp:dD" for every device of the card */ |
diff --git a/security/capability.c b/security/capability.c index 63d10da515a5..245874819036 100644 --- a/security/capability.c +++ b/security/capability.c | |||
@@ -811,7 +811,8 @@ struct security_operations default_security_ops = { | |||
811 | 811 | ||
812 | void security_fixup_ops(struct security_operations *ops) | 812 | void security_fixup_ops(struct security_operations *ops) |
813 | { | 813 | { |
814 | set_to_cap_if_null(ops, ptrace); | 814 | set_to_cap_if_null(ops, ptrace_may_access); |
815 | set_to_cap_if_null(ops, ptrace_traceme); | ||
815 | set_to_cap_if_null(ops, capget); | 816 | set_to_cap_if_null(ops, capget); |
816 | set_to_cap_if_null(ops, capset_check); | 817 | set_to_cap_if_null(ops, capset_check); |
817 | set_to_cap_if_null(ops, capset_set); | 818 | set_to_cap_if_null(ops, capset_set); |
diff --git a/security/commoncap.c b/security/commoncap.c index 4afbece37a08..e4c4b3fc0c04 100644 --- a/security/commoncap.c +++ b/security/commoncap.c | |||
@@ -63,14 +63,24 @@ int cap_settime(struct timespec *ts, struct timezone *tz) | |||
63 | return 0; | 63 | return 0; |
64 | } | 64 | } |
65 | 65 | ||
66 | int cap_ptrace (struct task_struct *parent, struct task_struct *child, | 66 | int cap_ptrace_may_access(struct task_struct *child, unsigned int mode) |
67 | unsigned int mode) | ||
68 | { | 67 | { |
69 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ | 68 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ |
70 | if (!cap_issubset(child->cap_permitted, parent->cap_permitted) && | 69 | if (cap_issubset(child->cap_permitted, current->cap_permitted)) |
71 | !__capable(parent, CAP_SYS_PTRACE)) | 70 | return 0; |
72 | return -EPERM; | 71 | if (capable(CAP_SYS_PTRACE)) |
73 | return 0; | 72 | return 0; |
73 | return -EPERM; | ||
74 | } | ||
75 | |||
76 | int cap_ptrace_traceme(struct task_struct *parent) | ||
77 | { | ||
78 | /* Derived from arch/i386/kernel/ptrace.c:sys_ptrace. */ | ||
79 | if (cap_issubset(current->cap_permitted, parent->cap_permitted)) | ||
80 | return 0; | ||
81 | if (has_capability(parent, CAP_SYS_PTRACE)) | ||
82 | return 0; | ||
83 | return -EPERM; | ||
74 | } | 84 | } |
75 | 85 | ||
76 | int cap_capget (struct task_struct *target, kernel_cap_t *effective, | 86 | int cap_capget (struct task_struct *target, kernel_cap_t *effective, |
@@ -534,7 +544,7 @@ int cap_task_post_setuid (uid_t old_ruid, uid_t old_euid, uid_t old_suid, | |||
534 | static inline int cap_safe_nice(struct task_struct *p) | 544 | static inline int cap_safe_nice(struct task_struct *p) |
535 | { | 545 | { |
536 | if (!cap_issubset(p->cap_permitted, current->cap_permitted) && | 546 | if (!cap_issubset(p->cap_permitted, current->cap_permitted) && |
537 | !__capable(current, CAP_SYS_NICE)) | 547 | !capable(CAP_SYS_NICE)) |
538 | return -EPERM; | 548 | return -EPERM; |
539 | return 0; | 549 | return 0; |
540 | } | 550 | } |
diff --git a/security/root_plug.c b/security/root_plug.c index be0ebec2580b..c3f68b5b372d 100644 --- a/security/root_plug.c +++ b/security/root_plug.c | |||
@@ -72,7 +72,8 @@ static int rootplug_bprm_check_security (struct linux_binprm *bprm) | |||
72 | 72 | ||
73 | static struct security_operations rootplug_security_ops = { | 73 | static struct security_operations rootplug_security_ops = { |
74 | /* Use the capability functions for some of the hooks */ | 74 | /* Use the capability functions for some of the hooks */ |
75 | .ptrace = cap_ptrace, | 75 | .ptrace_may_access = cap_ptrace_may_access, |
76 | .ptrace_traceme = cap_ptrace_traceme, | ||
76 | .capget = cap_capget, | 77 | .capget = cap_capget, |
77 | .capset_check = cap_capset_check, | 78 | .capset_check = cap_capset_check, |
78 | .capset_set = cap_capset_set, | 79 | .capset_set = cap_capset_set, |
diff --git a/security/security.c b/security/security.c index ff7068727757..3a4b4f55b33f 100644 --- a/security/security.c +++ b/security/security.c | |||
@@ -127,10 +127,14 @@ int register_security(struct security_operations *ops) | |||
127 | 127 | ||
128 | /* Security operations */ | 128 | /* Security operations */ |
129 | 129 | ||
130 | int security_ptrace(struct task_struct *parent, struct task_struct *child, | 130 | int security_ptrace_may_access(struct task_struct *child, unsigned int mode) |
131 | unsigned int mode) | ||
132 | { | 131 | { |
133 | return security_ops->ptrace(parent, child, mode); | 132 | return security_ops->ptrace_may_access(child, mode); |
133 | } | ||
134 | |||
135 | int security_ptrace_traceme(struct task_struct *parent) | ||
136 | { | ||
137 | return security_ops->ptrace_traceme(parent); | ||
134 | } | 138 | } |
135 | 139 | ||
136 | int security_capget(struct task_struct *target, | 140 | int security_capget(struct task_struct *target, |
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 3ae9bec5a508..03fc6a81ae32 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -1738,24 +1738,34 @@ static inline u32 file_to_av(struct file *file) | |||
1738 | 1738 | ||
1739 | /* Hook functions begin here. */ | 1739 | /* Hook functions begin here. */ |
1740 | 1740 | ||
1741 | static int selinux_ptrace(struct task_struct *parent, | 1741 | static int selinux_ptrace_may_access(struct task_struct *child, |
1742 | struct task_struct *child, | 1742 | unsigned int mode) |
1743 | unsigned int mode) | ||
1744 | { | 1743 | { |
1745 | int rc; | 1744 | int rc; |
1746 | 1745 | ||
1747 | rc = secondary_ops->ptrace(parent, child, mode); | 1746 | rc = secondary_ops->ptrace_may_access(child, mode); |
1748 | if (rc) | 1747 | if (rc) |
1749 | return rc; | 1748 | return rc; |
1750 | 1749 | ||
1751 | if (mode == PTRACE_MODE_READ) { | 1750 | if (mode == PTRACE_MODE_READ) { |
1752 | struct task_security_struct *tsec = parent->security; | 1751 | struct task_security_struct *tsec = current->security; |
1753 | struct task_security_struct *csec = child->security; | 1752 | struct task_security_struct *csec = child->security; |
1754 | return avc_has_perm(tsec->sid, csec->sid, | 1753 | return avc_has_perm(tsec->sid, csec->sid, |
1755 | SECCLASS_FILE, FILE__READ, NULL); | 1754 | SECCLASS_FILE, FILE__READ, NULL); |
1756 | } | 1755 | } |
1757 | 1756 | ||
1758 | return task_has_perm(parent, child, PROCESS__PTRACE); | 1757 | return task_has_perm(current, child, PROCESS__PTRACE); |
1758 | } | ||
1759 | |||
1760 | static int selinux_ptrace_traceme(struct task_struct *parent) | ||
1761 | { | ||
1762 | int rc; | ||
1763 | |||
1764 | rc = secondary_ops->ptrace_traceme(parent); | ||
1765 | if (rc) | ||
1766 | return rc; | ||
1767 | |||
1768 | return task_has_perm(parent, current, PROCESS__PTRACE); | ||
1759 | } | 1769 | } |
1760 | 1770 | ||
1761 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, | 1771 | static int selinux_capget(struct task_struct *target, kernel_cap_t *effective, |
@@ -5346,7 +5356,8 @@ static int selinux_key_getsecurity(struct key *key, char **_buffer) | |||
5346 | static struct security_operations selinux_ops = { | 5356 | static struct security_operations selinux_ops = { |
5347 | .name = "selinux", | 5357 | .name = "selinux", |
5348 | 5358 | ||
5349 | .ptrace = selinux_ptrace, | 5359 | .ptrace_may_access = selinux_ptrace_may_access, |
5360 | .ptrace_traceme = selinux_ptrace_traceme, | ||
5350 | .capget = selinux_capget, | 5361 | .capget = selinux_capget, |
5351 | .capset_check = selinux_capset_check, | 5362 | .capset_check = selinux_capset_check, |
5352 | .capset_set = selinux_capset_set, | 5363 | .capset_set = selinux_capset_set, |
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 1b40e558f983..87d75417ea93 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c | |||
@@ -87,27 +87,46 @@ struct inode_smack *new_inode_smack(char *smack) | |||
87 | */ | 87 | */ |
88 | 88 | ||
89 | /** | 89 | /** |
90 | * smack_ptrace - Smack approval on ptrace | 90 | * smack_ptrace_may_access - Smack approval on PTRACE_ATTACH |
91 | * @ptp: parent task pointer | ||
92 | * @ctp: child task pointer | 91 | * @ctp: child task pointer |
93 | * | 92 | * |
94 | * Returns 0 if access is OK, an error code otherwise | 93 | * Returns 0 if access is OK, an error code otherwise |
95 | * | 94 | * |
96 | * Do the capability checks, and require read and write. | 95 | * Do the capability checks, and require read and write. |
97 | */ | 96 | */ |
98 | static int smack_ptrace(struct task_struct *ptp, struct task_struct *ctp, | 97 | static int smack_ptrace_may_access(struct task_struct *ctp, unsigned int mode) |
99 | unsigned int mode) | ||
100 | { | 98 | { |
101 | int rc; | 99 | int rc; |
102 | 100 | ||
103 | rc = cap_ptrace(ptp, ctp, mode); | 101 | rc = cap_ptrace_may_access(ctp, mode); |
104 | if (rc != 0) | 102 | if (rc != 0) |
105 | return rc; | 103 | return rc; |
106 | 104 | ||
107 | rc = smk_access(ptp->security, ctp->security, MAY_READWRITE); | 105 | rc = smk_access(current->security, ctp->security, MAY_READWRITE); |
108 | if (rc != 0 && __capable(ptp, CAP_MAC_OVERRIDE)) | 106 | if (rc != 0 && capable(CAP_MAC_OVERRIDE)) |
109 | return 0; | 107 | return 0; |
108 | return rc; | ||
109 | } | ||
110 | |||
111 | /** | ||
112 | * smack_ptrace_traceme - Smack approval on PTRACE_TRACEME | ||
113 | * @ptp: parent task pointer | ||
114 | * | ||
115 | * Returns 0 if access is OK, an error code otherwise | ||
116 | * | ||
117 | * Do the capability checks, and require read and write. | ||
118 | */ | ||
119 | static int smack_ptrace_traceme(struct task_struct *ptp) | ||
120 | { | ||
121 | int rc; | ||
122 | |||
123 | rc = cap_ptrace_traceme(ptp); | ||
124 | if (rc != 0) | ||
125 | return rc; | ||
110 | 126 | ||
127 | rc = smk_access(ptp->security, current->security, MAY_READWRITE); | ||
128 | if (rc != 0 && has_capability(ptp, CAP_MAC_OVERRIDE)) | ||
129 | return 0; | ||
111 | return rc; | 130 | return rc; |
112 | } | 131 | } |
113 | 132 | ||
@@ -923,7 +942,7 @@ static int smack_file_send_sigiotask(struct task_struct *tsk, | |||
923 | */ | 942 | */ |
924 | file = container_of(fown, struct file, f_owner); | 943 | file = container_of(fown, struct file, f_owner); |
925 | rc = smk_access(file->f_security, tsk->security, MAY_WRITE); | 944 | rc = smk_access(file->f_security, tsk->security, MAY_WRITE); |
926 | if (rc != 0 && __capable(tsk, CAP_MAC_OVERRIDE)) | 945 | if (rc != 0 && has_capability(tsk, CAP_MAC_OVERRIDE)) |
927 | return 0; | 946 | return 0; |
928 | return rc; | 947 | return rc; |
929 | } | 948 | } |
@@ -1164,12 +1183,12 @@ static int smack_task_wait(struct task_struct *p) | |||
1164 | * account for the smack labels having gotten to | 1183 | * account for the smack labels having gotten to |
1165 | * be different in the first place. | 1184 | * be different in the first place. |
1166 | * | 1185 | * |
1167 | * This breaks the strict subjet/object access | 1186 | * This breaks the strict subject/object access |
1168 | * control ideal, taking the object's privilege | 1187 | * control ideal, taking the object's privilege |
1169 | * state into account in the decision as well as | 1188 | * state into account in the decision as well as |
1170 | * the smack value. | 1189 | * the smack value. |
1171 | */ | 1190 | */ |
1172 | if (capable(CAP_MAC_OVERRIDE) || __capable(p, CAP_MAC_OVERRIDE)) | 1191 | if (capable(CAP_MAC_OVERRIDE) || has_capability(p, CAP_MAC_OVERRIDE)) |
1173 | return 0; | 1192 | return 0; |
1174 | 1193 | ||
1175 | return rc; | 1194 | return rc; |
@@ -2016,9 +2035,6 @@ static int smack_setprocattr(struct task_struct *p, char *name, | |||
2016 | { | 2035 | { |
2017 | char *newsmack; | 2036 | char *newsmack; |
2018 | 2037 | ||
2019 | if (!__capable(p, CAP_MAC_ADMIN)) | ||
2020 | return -EPERM; | ||
2021 | |||
2022 | /* | 2038 | /* |
2023 | * Changing another process' Smack value is too dangerous | 2039 | * Changing another process' Smack value is too dangerous |
2024 | * and supports no sane use case. | 2040 | * and supports no sane use case. |
@@ -2026,6 +2042,9 @@ static int smack_setprocattr(struct task_struct *p, char *name, | |||
2026 | if (p != current) | 2042 | if (p != current) |
2027 | return -EPERM; | 2043 | return -EPERM; |
2028 | 2044 | ||
2045 | if (!capable(CAP_MAC_ADMIN)) | ||
2046 | return -EPERM; | ||
2047 | |||
2029 | if (value == NULL || size == 0 || size >= SMK_LABELLEN) | 2048 | if (value == NULL || size == 0 || size >= SMK_LABELLEN) |
2030 | return -EINVAL; | 2049 | return -EINVAL; |
2031 | 2050 | ||
@@ -2552,7 +2571,8 @@ static void smack_release_secctx(char *secdata, u32 seclen) | |||
2552 | struct security_operations smack_ops = { | 2571 | struct security_operations smack_ops = { |
2553 | .name = "smack", | 2572 | .name = "smack", |
2554 | 2573 | ||
2555 | .ptrace = smack_ptrace, | 2574 | .ptrace_may_access = smack_ptrace_may_access, |
2575 | .ptrace_traceme = smack_ptrace_traceme, | ||
2556 | .capget = cap_capget, | 2576 | .capget = cap_capget, |
2557 | .capset_check = cap_capset_check, | 2577 | .capset_check = cap_capset_check, |
2558 | .capset_set = cap_capset_set, | 2578 | .capset_set = cap_capset_set, |
@@ -2729,4 +2749,3 @@ static __init int smack_init(void) | |||
2729 | * all processes and objects when they are created. | 2749 | * all processes and objects when they are created. |
2730 | */ | 2750 | */ |
2731 | security_initcall(smack_init); | 2751 | security_initcall(smack_init); |
2732 | |||
diff --git a/sound/mips/au1x00.c b/sound/mips/au1x00.c index ee0741f9eb53..fbef38a9604a 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #include <linux/interrupt.h> | 38 | #include <linux/interrupt.h> |
39 | #include <linux/init.h> | 39 | #include <linux/init.h> |
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | #include <linux/version.h> | ||
42 | #include <sound/core.h> | 41 | #include <sound/core.h> |
43 | #include <sound/initval.h> | 42 | #include <sound/initval.h> |
44 | #include <sound/pcm.h> | 43 | #include <sound/pcm.h> |
diff --git a/sound/pci/Kconfig b/sound/pci/Kconfig index f7d95b224a98..31f52d3fc21f 100644 --- a/sound/pci/Kconfig +++ b/sound/pci/Kconfig | |||
@@ -845,7 +845,7 @@ config SND_VIRTUOSO | |||
845 | select SND_OXYGEN_LIB | 845 | select SND_OXYGEN_LIB |
846 | help | 846 | help |
847 | Say Y here to include support for sound cards based on the | 847 | Say Y here to include support for sound cards based on the |
848 | Asus AV100/AV200 chips, i.e., Xonar D2, DX and D2X. | 848 | Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2 and D2X. |
849 | 849 | ||
850 | To compile this driver as a module, choose M here: the module | 850 | To compile this driver as a module, choose M here: the module |
851 | will be called snd-virtuoso. | 851 | will be called snd-virtuoso. |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index a73d6ca0a906..1c53e337ecb2 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -278,6 +278,9 @@ enum { | |||
278 | /* Defines for Nvidia HDA support */ | 278 | /* Defines for Nvidia HDA support */ |
279 | #define NVIDIA_HDA_TRANSREG_ADDR 0x4e | 279 | #define NVIDIA_HDA_TRANSREG_ADDR 0x4e |
280 | #define NVIDIA_HDA_ENABLE_COHBITS 0x0f | 280 | #define NVIDIA_HDA_ENABLE_COHBITS 0x0f |
281 | #define NVIDIA_HDA_ISTRM_COH 0x4d | ||
282 | #define NVIDIA_HDA_OSTRM_COH 0x4c | ||
283 | #define NVIDIA_HDA_ENABLE_COHBIT 0x01 | ||
281 | 284 | ||
282 | /* Defines for Intel SCH HDA snoop control */ | 285 | /* Defines for Intel SCH HDA snoop control */ |
283 | #define INTEL_SCH_HDA_DEVC 0x78 | 286 | #define INTEL_SCH_HDA_DEVC 0x78 |
@@ -900,6 +903,12 @@ static void azx_init_pci(struct azx *chip) | |||
900 | update_pci_byte(chip->pci, | 903 | update_pci_byte(chip->pci, |
901 | NVIDIA_HDA_TRANSREG_ADDR, | 904 | NVIDIA_HDA_TRANSREG_ADDR, |
902 | 0x0f, NVIDIA_HDA_ENABLE_COHBITS); | 905 | 0x0f, NVIDIA_HDA_ENABLE_COHBITS); |
906 | update_pci_byte(chip->pci, | ||
907 | NVIDIA_HDA_ISTRM_COH, | ||
908 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); | ||
909 | update_pci_byte(chip->pci, | ||
910 | NVIDIA_HDA_OSTRM_COH, | ||
911 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); | ||
903 | break; | 912 | break; |
904 | case AZX_DRIVER_SCH: | 913 | case AZX_DRIVER_SCH: |
905 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); | 914 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index add4e87e0b20..909f1c101c95 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -952,7 +952,7 @@ do_sku: | |||
952 | tmp | 0x2010); | 952 | tmp | 0x2010); |
953 | break; | 953 | break; |
954 | case 0x10ec0888: | 954 | case 0x10ec0888: |
955 | alc888_coef_init(codec); | 955 | /*alc888_coef_init(codec);*/ /* called in alc_init() */ |
956 | break; | 956 | break; |
957 | case 0x10ec0267: | 957 | case 0x10ec0267: |
958 | case 0x10ec0268: | 958 | case 0x10ec0268: |
@@ -2439,6 +2439,8 @@ static int alc_init(struct hda_codec *codec) | |||
2439 | unsigned int i; | 2439 | unsigned int i; |
2440 | 2440 | ||
2441 | alc_fix_pll(codec); | 2441 | alc_fix_pll(codec); |
2442 | if (codec->vendor_id == 0x10ec0888) | ||
2443 | alc888_coef_init(codec); | ||
2442 | 2444 | ||
2443 | for (i = 0; i < spec->num_init_verbs; i++) | 2445 | for (i = 0; i < spec->num_init_verbs; i++) |
2444 | snd_hda_sequence_write(codec, spec->init_verbs[i]); | 2446 | snd_hda_sequence_write(codec, spec->init_verbs[i]); |
@@ -6437,6 +6439,39 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec) | |||
6437 | } | 6439 | } |
6438 | } | 6440 | } |
6439 | 6441 | ||
6442 | static void alc882_auto_init_input_src(struct hda_codec *codec) | ||
6443 | { | ||
6444 | struct alc_spec *spec = codec->spec; | ||
6445 | const struct hda_input_mux *imux = spec->input_mux; | ||
6446 | int c; | ||
6447 | |||
6448 | for (c = 0; c < spec->num_adc_nids; c++) { | ||
6449 | hda_nid_t conn_list[HDA_MAX_NUM_INPUTS]; | ||
6450 | hda_nid_t nid = spec->capsrc_nids[c]; | ||
6451 | int conns, mute, idx, item; | ||
6452 | |||
6453 | conns = snd_hda_get_connections(codec, nid, conn_list, | ||
6454 | ARRAY_SIZE(conn_list)); | ||
6455 | if (conns < 0) | ||
6456 | continue; | ||
6457 | for (idx = 0; idx < conns; idx++) { | ||
6458 | /* if the current connection is the selected one, | ||
6459 | * unmute it as default - otherwise mute it | ||
6460 | */ | ||
6461 | mute = AMP_IN_MUTE(idx); | ||
6462 | for (item = 0; item < imux->num_items; item++) { | ||
6463 | if (imux->items[item].index == idx) { | ||
6464 | if (spec->cur_mux[c] == item) | ||
6465 | mute = AMP_IN_UNMUTE(idx); | ||
6466 | break; | ||
6467 | } | ||
6468 | } | ||
6469 | snd_hda_codec_write(codec, nid, 0, | ||
6470 | AC_VERB_SET_AMP_GAIN_MUTE, mute); | ||
6471 | } | ||
6472 | } | ||
6473 | } | ||
6474 | |||
6440 | /* add mic boosts if needed */ | 6475 | /* add mic boosts if needed */ |
6441 | static int alc_auto_add_mic_boost(struct hda_codec *codec) | 6476 | static int alc_auto_add_mic_boost(struct hda_codec *codec) |
6442 | { | 6477 | { |
@@ -6491,6 +6526,7 @@ static void alc882_auto_init(struct hda_codec *codec) | |||
6491 | alc882_auto_init_multi_out(codec); | 6526 | alc882_auto_init_multi_out(codec); |
6492 | alc882_auto_init_hp_out(codec); | 6527 | alc882_auto_init_hp_out(codec); |
6493 | alc882_auto_init_analog_input(codec); | 6528 | alc882_auto_init_analog_input(codec); |
6529 | alc882_auto_init_input_src(codec); | ||
6494 | if (spec->unsol_event) | 6530 | if (spec->unsol_event) |
6495 | alc_sku_automute(codec); | 6531 | alc_sku_automute(codec); |
6496 | } | 6532 | } |
@@ -8285,6 +8321,8 @@ static void alc883_auto_init_analog_input(struct hda_codec *codec) | |||
8285 | } | 8321 | } |
8286 | } | 8322 | } |
8287 | 8323 | ||
8324 | #define alc883_auto_init_input_src alc882_auto_init_input_src | ||
8325 | |||
8288 | /* almost identical with ALC880 parser... */ | 8326 | /* almost identical with ALC880 parser... */ |
8289 | static int alc883_parse_auto_config(struct hda_codec *codec) | 8327 | static int alc883_parse_auto_config(struct hda_codec *codec) |
8290 | { | 8328 | { |
@@ -8315,6 +8353,7 @@ static void alc883_auto_init(struct hda_codec *codec) | |||
8315 | alc883_auto_init_multi_out(codec); | 8353 | alc883_auto_init_multi_out(codec); |
8316 | alc883_auto_init_hp_out(codec); | 8354 | alc883_auto_init_hp_out(codec); |
8317 | alc883_auto_init_analog_input(codec); | 8355 | alc883_auto_init_analog_input(codec); |
8356 | alc883_auto_init_input_src(codec); | ||
8318 | if (spec->unsol_event) | 8357 | if (spec->unsol_event) |
8319 | alc_sku_automute(codec); | 8358 | alc_sku_automute(codec); |
8320 | } | 8359 | } |
@@ -8389,8 +8428,6 @@ static int patch_alc883(struct hda_codec *codec) | |||
8389 | codec->patch_ops = alc_patch_ops; | 8428 | codec->patch_ops = alc_patch_ops; |
8390 | if (board_config == ALC883_AUTO) | 8429 | if (board_config == ALC883_AUTO) |
8391 | spec->init_hook = alc883_auto_init; | 8430 | spec->init_hook = alc883_auto_init; |
8392 | else if (codec->vendor_id == 0x10ec0888) | ||
8393 | spec->init_hook = alc888_coef_init; | ||
8394 | 8431 | ||
8395 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 8432 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
8396 | if (!spec->loopback.amplist) | 8433 | if (!spec->loopback.amplist) |
@@ -9663,6 +9700,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec) | |||
9663 | #define alc262_auto_init_multi_out alc882_auto_init_multi_out | 9700 | #define alc262_auto_init_multi_out alc882_auto_init_multi_out |
9664 | #define alc262_auto_init_hp_out alc882_auto_init_hp_out | 9701 | #define alc262_auto_init_hp_out alc882_auto_init_hp_out |
9665 | #define alc262_auto_init_analog_input alc882_auto_init_analog_input | 9702 | #define alc262_auto_init_analog_input alc882_auto_init_analog_input |
9703 | #define alc262_auto_init_input_src alc882_auto_init_input_src | ||
9666 | 9704 | ||
9667 | 9705 | ||
9668 | /* init callback for auto-configuration model -- overriding the default init */ | 9706 | /* init callback for auto-configuration model -- overriding the default init */ |
@@ -9672,6 +9710,7 @@ static void alc262_auto_init(struct hda_codec *codec) | |||
9672 | alc262_auto_init_multi_out(codec); | 9710 | alc262_auto_init_multi_out(codec); |
9673 | alc262_auto_init_hp_out(codec); | 9711 | alc262_auto_init_hp_out(codec); |
9674 | alc262_auto_init_analog_input(codec); | 9712 | alc262_auto_init_analog_input(codec); |
9713 | alc262_auto_init_input_src(codec); | ||
9675 | if (spec->unsol_event) | 9714 | if (spec->unsol_event) |
9676 | alc_sku_automute(codec); | 9715 | alc_sku_automute(codec); |
9677 | } | 9716 | } |
@@ -13330,6 +13369,8 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec) | |||
13330 | } | 13369 | } |
13331 | } | 13370 | } |
13332 | 13371 | ||
13372 | #define alc861vd_auto_init_input_src alc882_auto_init_input_src | ||
13373 | |||
13333 | #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) | 13374 | #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02) |
13334 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) | 13375 | #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c) |
13335 | 13376 | ||
@@ -13512,6 +13553,7 @@ static void alc861vd_auto_init(struct hda_codec *codec) | |||
13512 | alc861vd_auto_init_multi_out(codec); | 13553 | alc861vd_auto_init_multi_out(codec); |
13513 | alc861vd_auto_init_hp_out(codec); | 13554 | alc861vd_auto_init_hp_out(codec); |
13514 | alc861vd_auto_init_analog_input(codec); | 13555 | alc861vd_auto_init_analog_input(codec); |
13556 | alc861vd_auto_init_input_src(codec); | ||
13515 | if (spec->unsol_event) | 13557 | if (spec->unsol_event) |
13516 | alc_sku_automute(codec); | 13558 | alc_sku_automute(codec); |
13517 | } | 13559 | } |
@@ -14677,6 +14719,8 @@ static void alc662_auto_init_analog_input(struct hda_codec *codec) | |||
14677 | } | 14719 | } |
14678 | } | 14720 | } |
14679 | 14721 | ||
14722 | #define alc662_auto_init_input_src alc882_auto_init_input_src | ||
14723 | |||
14680 | static int alc662_parse_auto_config(struct hda_codec *codec) | 14724 | static int alc662_parse_auto_config(struct hda_codec *codec) |
14681 | { | 14725 | { |
14682 | struct alc_spec *spec = codec->spec; | 14726 | struct alc_spec *spec = codec->spec; |
@@ -14733,6 +14777,7 @@ static void alc662_auto_init(struct hda_codec *codec) | |||
14733 | alc662_auto_init_multi_out(codec); | 14777 | alc662_auto_init_multi_out(codec); |
14734 | alc662_auto_init_hp_out(codec); | 14778 | alc662_auto_init_hp_out(codec); |
14735 | alc662_auto_init_analog_input(codec); | 14779 | alc662_auto_init_analog_input(codec); |
14780 | alc662_auto_init_input_src(codec); | ||
14736 | if (spec->unsol_event) | 14781 | if (spec->unsol_event) |
14737 | alc_sku_automute(codec); | 14782 | alc_sku_automute(codec); |
14738 | } | 14783 | } |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 9a2c16bf94e0..01d7b75f9182 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -36,15 +36,15 @@ | |||
36 | */ | 36 | */ |
37 | 37 | ||
38 | /* | 38 | /* |
39 | * Xonar DX | 39 | * Xonar D1/DX |
40 | * -------- | 40 | * ----------- |
41 | * | 41 | * |
42 | * CMI8788: | 42 | * CMI8788: |
43 | * | 43 | * |
44 | * I²C <-> CS4398 (front) | 44 | * I²C <-> CS4398 (front) |
45 | * <-> CS4362A (surround, center/LFE, back) | 45 | * <-> CS4362A (surround, center/LFE, back) |
46 | * | 46 | * |
47 | * GPI 0 <- external power present | 47 | * GPI 0 <- external power present (DX only) |
48 | * | 48 | * |
49 | * GPIO 0 -> enable output to speakers | 49 | * GPIO 0 -> enable output to speakers |
50 | * GPIO 1 -> enable front panel I/O | 50 | * GPIO 1 -> enable front panel I/O |
@@ -96,6 +96,7 @@ MODULE_PARM_DESC(enable, "enable card"); | |||
96 | enum { | 96 | enum { |
97 | MODEL_D2, | 97 | MODEL_D2, |
98 | MODEL_D2X, | 98 | MODEL_D2X, |
99 | MODEL_D1, | ||
99 | MODEL_DX, | 100 | MODEL_DX, |
100 | }; | 101 | }; |
101 | 102 | ||
@@ -103,6 +104,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = { | |||
103 | { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, | 104 | { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, |
104 | { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, | 105 | { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, |
105 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, | 106 | { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, |
107 | { OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 }, | ||
106 | { } | 108 | { } |
107 | }; | 109 | }; |
108 | MODULE_DEVICE_TABLE(pci, xonar_ids); | 110 | MODULE_DEVICE_TABLE(pci, xonar_ids); |
@@ -313,15 +315,12 @@ static void cs43xx_init(struct oxygen *chip) | |||
313 | cs4362a_write(chip, 0x01, CS4362A_CPEN); | 315 | cs4362a_write(chip, 0x01, CS4362A_CPEN); |
314 | } | 316 | } |
315 | 317 | ||
316 | static void xonar_dx_init(struct oxygen *chip) | 318 | static void xonar_d1_init(struct oxygen *chip) |
317 | { | 319 | { |
318 | struct xonar_data *data = chip->model_data; | 320 | struct xonar_data *data = chip->model_data; |
319 | 321 | ||
320 | data->anti_pop_delay = 800; | 322 | data->anti_pop_delay = 800; |
321 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; | 323 | data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; |
322 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
323 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
324 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
325 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; | 324 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; |
326 | data->cs4362a_fm = CS4362A_FM_SINGLE | | 325 | data->cs4362a_fm = CS4362A_FM_SINGLE | |
327 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; | 326 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; |
@@ -345,6 +344,16 @@ static void xonar_dx_init(struct oxygen *chip) | |||
345 | snd_component_add(chip->card, "CS5361"); | 344 | snd_component_add(chip->card, "CS5361"); |
346 | } | 345 | } |
347 | 346 | ||
347 | static void xonar_dx_init(struct oxygen *chip) | ||
348 | { | ||
349 | struct xonar_data *data = chip->model_data; | ||
350 | |||
351 | data->ext_power_reg = OXYGEN_GPI_DATA; | ||
352 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | ||
353 | data->ext_power_bit = GPI_DX_EXT_POWER; | ||
354 | xonar_d1_init(chip); | ||
355 | } | ||
356 | |||
348 | static void xonar_cleanup(struct oxygen *chip) | 357 | static void xonar_cleanup(struct oxygen *chip) |
349 | { | 358 | { |
350 | struct xonar_data *data = chip->model_data; | 359 | struct xonar_data *data = chip->model_data; |
@@ -352,7 +361,7 @@ static void xonar_cleanup(struct oxygen *chip) | |||
352 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); | 361 | oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); |
353 | } | 362 | } |
354 | 363 | ||
355 | static void xonar_dx_cleanup(struct oxygen *chip) | 364 | static void xonar_d1_cleanup(struct oxygen *chip) |
356 | { | 365 | { |
357 | xonar_cleanup(chip); | 366 | xonar_cleanup(chip); |
358 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); | 367 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); |
@@ -365,7 +374,7 @@ static void xonar_d2_resume(struct oxygen *chip) | |||
365 | xonar_enable_output(chip); | 374 | xonar_enable_output(chip); |
366 | } | 375 | } |
367 | 376 | ||
368 | static void xonar_dx_resume(struct oxygen *chip) | 377 | static void xonar_d1_resume(struct oxygen *chip) |
369 | { | 378 | { |
370 | cs43xx_init(chip); | 379 | cs43xx_init(chip); |
371 | xonar_enable_output(chip); | 380 | xonar_enable_output(chip); |
@@ -513,7 +522,7 @@ static const struct snd_kcontrol_new front_panel_switch = { | |||
513 | .put = front_panel_put, | 522 | .put = front_panel_put, |
514 | }; | 523 | }; |
515 | 524 | ||
516 | static void xonar_dx_ac97_switch(struct oxygen *chip, | 525 | static void xonar_d1_ac97_switch(struct oxygen *chip, |
517 | unsigned int reg, unsigned int mute) | 526 | unsigned int reg, unsigned int mute) |
518 | { | 527 | { |
519 | if (reg == AC97_LINE) { | 528 | if (reg == AC97_LINE) { |
@@ -536,7 +545,7 @@ static int xonar_d2_control_filter(struct snd_kcontrol_new *template) | |||
536 | return 0; | 545 | return 0; |
537 | } | 546 | } |
538 | 547 | ||
539 | static int xonar_dx_control_filter(struct snd_kcontrol_new *template) | 548 | static int xonar_d1_control_filter(struct snd_kcontrol_new *template) |
540 | { | 549 | { |
541 | if (!strncmp(template->name, "CD Capture ", 11)) | 550 | if (!strncmp(template->name, "CD Capture ", 11)) |
542 | return 1; /* no CD input */ | 551 | return 1; /* no CD input */ |
@@ -548,7 +557,7 @@ static int xonar_mixer_init(struct oxygen *chip) | |||
548 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); | 557 | return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); |
549 | } | 558 | } |
550 | 559 | ||
551 | static int xonar_dx_mixer_init(struct oxygen *chip) | 560 | static int xonar_d1_mixer_init(struct oxygen *chip) |
552 | { | 561 | { |
553 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); | 562 | return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); |
554 | } | 563 | } |
@@ -615,23 +624,51 @@ static const struct oxygen_model xonar_models[] = { | |||
615 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 624 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
616 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | 625 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, |
617 | }, | 626 | }, |
627 | [MODEL_D1] = { | ||
628 | .shortname = "Xonar D1", | ||
629 | .longname = "Asus Virtuoso 100", | ||
630 | .chip = "AV200", | ||
631 | .owner = THIS_MODULE, | ||
632 | .init = xonar_d1_init, | ||
633 | .control_filter = xonar_d1_control_filter, | ||
634 | .mixer_init = xonar_d1_mixer_init, | ||
635 | .cleanup = xonar_d1_cleanup, | ||
636 | .suspend = xonar_d1_cleanup, | ||
637 | .resume = xonar_d1_resume, | ||
638 | .set_dac_params = set_cs43xx_params, | ||
639 | .set_adc_params = set_cs53x1_params, | ||
640 | .update_dac_volume = update_cs43xx_volume, | ||
641 | .update_dac_mute = update_cs43xx_mute, | ||
642 | .ac97_switch = xonar_d1_ac97_switch, | ||
643 | .dac_tlv = cs4362a_db_scale, | ||
644 | .model_data_size = sizeof(struct xonar_data), | ||
645 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | | ||
646 | PLAYBACK_1_TO_SPDIF | | ||
647 | CAPTURE_0_FROM_I2S_2, | ||
648 | .dac_channels = 8, | ||
649 | .dac_volume_min = 0, | ||
650 | .dac_volume_max = 127, | ||
651 | .function_flags = OXYGEN_FUNCTION_2WIRE, | ||
652 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
653 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
654 | }, | ||
618 | [MODEL_DX] = { | 655 | [MODEL_DX] = { |
619 | .shortname = "Xonar DX", | 656 | .shortname = "Xonar DX", |
620 | .longname = "Asus Virtuoso 100", | 657 | .longname = "Asus Virtuoso 100", |
621 | .chip = "AV200", | 658 | .chip = "AV200", |
622 | .owner = THIS_MODULE, | 659 | .owner = THIS_MODULE, |
623 | .init = xonar_dx_init, | 660 | .init = xonar_dx_init, |
624 | .control_filter = xonar_dx_control_filter, | 661 | .control_filter = xonar_d1_control_filter, |
625 | .mixer_init = xonar_dx_mixer_init, | 662 | .mixer_init = xonar_d1_mixer_init, |
626 | .cleanup = xonar_dx_cleanup, | 663 | .cleanup = xonar_d1_cleanup, |
627 | .suspend = xonar_dx_cleanup, | 664 | .suspend = xonar_d1_cleanup, |
628 | .resume = xonar_dx_resume, | 665 | .resume = xonar_d1_resume, |
629 | .set_dac_params = set_cs43xx_params, | 666 | .set_dac_params = set_cs43xx_params, |
630 | .set_adc_params = set_cs53x1_params, | 667 | .set_adc_params = set_cs53x1_params, |
631 | .update_dac_volume = update_cs43xx_volume, | 668 | .update_dac_volume = update_cs43xx_volume, |
632 | .update_dac_mute = update_cs43xx_mute, | 669 | .update_dac_mute = update_cs43xx_mute, |
633 | .gpio_changed = xonar_gpio_changed, | 670 | .gpio_changed = xonar_gpio_changed, |
634 | .ac97_switch = xonar_dx_ac97_switch, | 671 | .ac97_switch = xonar_d1_ac97_switch, |
635 | .dac_tlv = cs4362a_db_scale, | 672 | .dac_tlv = cs4362a_db_scale, |
636 | .model_data_size = sizeof(struct xonar_data), | 673 | .model_data_size = sizeof(struct xonar_data), |
637 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | | 674 | .pcm_dev_cfg = PLAYBACK_0_TO_I2S | |
diff --git a/sound/soc/at91/eti_b1_wm8731.c b/sound/soc/at91/eti_b1_wm8731.c index b081e83766b7..b81d6b2cfa1d 100644 --- a/sound/soc/at91/eti_b1_wm8731.c +++ b/sound/soc/at91/eti_b1_wm8731.c | |||
@@ -22,7 +22,6 @@ | |||
22 | 22 | ||
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/moduleparam.h> | 24 | #include <linux/moduleparam.h> |
25 | #include <linux/version.h> | ||
26 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
27 | #include <linux/clk.h> | 26 | #include <linux/clk.h> |
28 | #include <linux/timer.h> | 27 | #include <linux/timer.h> |
diff --git a/sound/soc/codecs/wm8753.c b/sound/soc/codecs/wm8753.c index 8604809f0c36..dc7b18fd2782 100644 --- a/sound/soc/codecs/wm8753.c +++ b/sound/soc/codecs/wm8753.c | |||
@@ -34,7 +34,6 @@ | |||
34 | 34 | ||
35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
36 | #include <linux/moduleparam.h> | 36 | #include <linux/moduleparam.h> |
37 | #include <linux/version.h> | ||
38 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
39 | #include <linux/init.h> | 38 | #include <linux/init.h> |
40 | #include <linux/delay.h> | 39 | #include <linux/delay.h> |
diff --git a/sound/soc/codecs/wm8990.c b/sound/soc/codecs/wm8990.c index 3ecce5168e94..e44153fa38de 100644 --- a/sound/soc/codecs/wm8990.c +++ b/sound/soc/codecs/wm8990.c | |||
@@ -82,7 +82,7 @@ static const u16 wm8990_reg[] = { | |||
82 | 0x0003, /* R35 - ClassD1 */ | 82 | 0x0003, /* R35 - ClassD1 */ |
83 | 0x0000, /* R36 */ | 83 | 0x0000, /* R36 */ |
84 | 0x0100, /* R37 - ClassD3 */ | 84 | 0x0100, /* R37 - ClassD3 */ |
85 | 0x0000, /* R38 */ | 85 | 0x0079, /* R38 - ClassD4 */ |
86 | 0x0000, /* R39 - Input Mixer1 */ | 86 | 0x0000, /* R39 - Input Mixer1 */ |
87 | 0x0000, /* R40 - Input Mixer2 */ | 87 | 0x0000, /* R40 - Input Mixer2 */ |
88 | 0x0000, /* R41 - Input Mixer3 */ | 88 | 0x0000, /* R41 - Input Mixer3 */ |
@@ -311,11 +311,15 @@ SOC_SINGLE("Speaker Mode Switch", WM8990_CLASSD1, | |||
311 | WM8990_CDMODE_BIT, 1, 0), | 311 | WM8990_CDMODE_BIT, 1, 0), |
312 | 312 | ||
313 | SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME, | 313 | SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME, |
314 | WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0), | 314 | WM8990_SPKATTN_SHIFT, WM8990_SPKATTN_MASK, 0), |
315 | SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3, | 315 | SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3, |
316 | WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0), | 316 | WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0), |
317 | SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3, | 317 | SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3, |
318 | WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0), | 318 | WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0), |
319 | SOC_SINGLE_TLV("Speaker Volume", WM8990_CLASSD4, | ||
320 | WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0, out_pga_tlv), | ||
321 | SOC_SINGLE("Speaker ZC Switch", WM8990_CLASSD4, | ||
322 | WM8990_SPKZC_SHIFT, WM8990_SPKZC_MASK, 0), | ||
319 | 323 | ||
320 | SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume", | 324 | SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume", |
321 | WM8990_LEFT_DAC_DIGITAL_VOLUME, | 325 | WM8990_LEFT_DAC_DIGITAL_VOLUME, |
@@ -920,7 +924,7 @@ static const struct snd_soc_dapm_route audio_map[] = { | |||
920 | {"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"}, | 924 | {"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"}, |
921 | {"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"}, | 925 | {"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"}, |
922 | {"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"}, | 926 | {"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"}, |
923 | {"SPKMIX", "SPKMIX Left DAC Switch", "Right DAC"}, | 927 | {"SPKMIX", "SPKMIX Left DAC Switch", "Left DAC"}, |
924 | 928 | ||
925 | /* LONMIX */ | 929 | /* LONMIX */ |
926 | {"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"}, | 930 | {"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"}, |
diff --git a/sound/soc/codecs/wm8990.h b/sound/soc/codecs/wm8990.h index 6bea57485283..0a08325d5443 100644 --- a/sound/soc/codecs/wm8990.h +++ b/sound/soc/codecs/wm8990.h | |||
@@ -54,6 +54,7 @@ | |||
54 | #define WM8990_SPEAKER_VOLUME 0x22 | 54 | #define WM8990_SPEAKER_VOLUME 0x22 |
55 | #define WM8990_CLASSD1 0x23 | 55 | #define WM8990_CLASSD1 0x23 |
56 | #define WM8990_CLASSD3 0x25 | 56 | #define WM8990_CLASSD3 0x25 |
57 | #define WM8990_CLASSD4 0x26 | ||
57 | #define WM8990_INPUT_MIXER1 0x27 | 58 | #define WM8990_INPUT_MIXER1 0x27 |
58 | #define WM8990_INPUT_MIXER2 0x28 | 59 | #define WM8990_INPUT_MIXER2 0x28 |
59 | #define WM8990_INPUT_MIXER3 0x29 | 60 | #define WM8990_INPUT_MIXER3 0x29 |
@@ -528,8 +529,8 @@ | |||
528 | /* | 529 | /* |
529 | * R34 (0x22) - Speaker Volume | 530 | * R34 (0x22) - Speaker Volume |
530 | */ | 531 | */ |
531 | #define WM8990_SPKVOL_MASK 0x0003 /* SPKVOL - [1:0] */ | 532 | #define WM8990_SPKATTN_MASK 0x0003 /* SPKATTN - [1:0] */ |
532 | #define WM8990_SPKVOL_SHIFT 0 | 533 | #define WM8990_SPKATTN_SHIFT 0 |
533 | 534 | ||
534 | /* | 535 | /* |
535 | * R35 (0x23) - ClassD1 | 536 | * R35 (0x23) - ClassD1 |
@@ -544,6 +545,15 @@ | |||
544 | #define WM8990_DCGAIN_SHIFT 3 | 545 | #define WM8990_DCGAIN_SHIFT 3 |
545 | #define WM8990_ACGAIN_MASK 0x0007 /* ACGAIN - [2:0] */ | 546 | #define WM8990_ACGAIN_MASK 0x0007 /* ACGAIN - [2:0] */ |
546 | #define WM8990_ACGAIN_SHIFT 0 | 547 | #define WM8990_ACGAIN_SHIFT 0 |
548 | |||
549 | /* | ||
550 | * R38 (0x26) - ClassD4 | ||
551 | */ | ||
552 | #define WM8990_SPKZC_MASK 0x0001 /* SPKZC */ | ||
553 | #define WM8990_SPKZC_SHIFT 7 /* SPKZC */ | ||
554 | #define WM8990_SPKVOL_MASK 0x007F /* SPKVOL - [6:0] */ | ||
555 | #define WM8990_SPKVOL_SHIFT 0 /* SPKVOL - [6:0] */ | ||
556 | |||
547 | /* | 557 | /* |
548 | * R39 (0x27) - Input Mixer1 | 558 | * R39 (0x27) - Input Mixer1 |
549 | */ | 559 | */ |
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c index 1fb7f9a7aecd..2f1c91b1d556 100644 --- a/sound/soc/codecs/wm9712.c +++ b/sound/soc/codecs/wm9712.c | |||
@@ -13,7 +13,6 @@ | |||
13 | 13 | ||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/module.h> | 15 | #include <linux/module.h> |
16 | #include <linux/version.h> | ||
17 | #include <linux/kernel.h> | 16 | #include <linux/kernel.h> |
18 | #include <linux/device.h> | 17 | #include <linux/device.h> |
19 | #include <sound/core.h> | 18 | #include <sound/core.h> |