diff options
859 files changed, 7049 insertions, 4077 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-pci b/Documentation/ABI/testing/sysfs-bus-pci index 34f51100f029..dff1f48d252d 100644 --- a/Documentation/ABI/testing/sysfs-bus-pci +++ b/Documentation/ABI/testing/sysfs-bus-pci | |||
| @@ -210,3 +210,15 @@ Users: | |||
| 210 | firmware assigned instance number of the PCI | 210 | firmware assigned instance number of the PCI |
| 211 | device that can help in understanding the firmware | 211 | device that can help in understanding the firmware |
| 212 | intended order of the PCI device. | 212 | intended order of the PCI device. |
| 213 | |||
| 214 | What: /sys/bus/pci/devices/.../d3cold_allowed | ||
| 215 | Date: July 2012 | ||
| 216 | Contact: Huang Ying <ying.huang@intel.com> | ||
| 217 | Description: | ||
| 218 | d3cold_allowed is bit to control whether the corresponding PCI | ||
| 219 | device can be put into D3Cold state. If it is cleared, the | ||
| 220 | device will never be put into D3Cold state. If it is set, the | ||
| 221 | device may be put into D3Cold state if other requirements are | ||
| 222 | satisfied too. Reading this attribute will show the current | ||
| 223 | value of d3cold_allowed bit. Writing this attribute will set | ||
| 224 | the value of d3cold_allowed bit. | ||
diff --git a/Documentation/block/00-INDEX b/Documentation/block/00-INDEX index d111e3b23db0..d18ecd827c40 100644 --- a/Documentation/block/00-INDEX +++ b/Documentation/block/00-INDEX | |||
| @@ -3,15 +3,21 @@ | |||
| 3 | biodoc.txt | 3 | biodoc.txt |
| 4 | - Notes on the Generic Block Layer Rewrite in Linux 2.5 | 4 | - Notes on the Generic Block Layer Rewrite in Linux 2.5 |
| 5 | capability.txt | 5 | capability.txt |
| 6 | - Generic Block Device Capability (/sys/block/<disk>/capability) | 6 | - Generic Block Device Capability (/sys/block/<device>/capability) |
| 7 | cfq-iosched.txt | ||
| 8 | - CFQ IO scheduler tunables | ||
| 9 | data-integrity.txt | ||
| 10 | - Block data integrity | ||
| 7 | deadline-iosched.txt | 11 | deadline-iosched.txt |
| 8 | - Deadline IO scheduler tunables | 12 | - Deadline IO scheduler tunables |
| 9 | ioprio.txt | 13 | ioprio.txt |
| 10 | - Block io priorities (in CFQ scheduler) | 14 | - Block io priorities (in CFQ scheduler) |
| 15 | queue-sysfs.txt | ||
| 16 | - Queue's sysfs entries | ||
| 11 | request.txt | 17 | request.txt |
| 12 | - The members of struct request (in include/linux/blkdev.h) | 18 | - The members of struct request (in include/linux/blkdev.h) |
| 13 | stat.txt | 19 | stat.txt |
| 14 | - Block layer statistics in /sys/block/<dev>/stat | 20 | - Block layer statistics in /sys/block/<device>/stat |
| 15 | switching-sched.txt | 21 | switching-sched.txt |
| 16 | - Switching I/O schedulers at runtime | 22 | - Switching I/O schedulers at runtime |
| 17 | writeback_cache_control.txt | 23 | writeback_cache_control.txt |
diff --git a/Documentation/block/cfq-iosched.txt b/Documentation/block/cfq-iosched.txt index 6d670f570451..d89b4fe724d7 100644 --- a/Documentation/block/cfq-iosched.txt +++ b/Documentation/block/cfq-iosched.txt | |||
| @@ -1,3 +1,14 @@ | |||
| 1 | CFQ (Complete Fairness Queueing) | ||
| 2 | =============================== | ||
| 3 | |||
| 4 | The main aim of CFQ scheduler is to provide a fair allocation of the disk | ||
| 5 | I/O bandwidth for all the processes which requests an I/O operation. | ||
| 6 | |||
| 7 | CFQ maintains the per process queue for the processes which request I/O | ||
| 8 | operation(syncronous requests). In case of asynchronous requests, all the | ||
| 9 | requests from all the processes are batched together according to their | ||
| 10 | process's I/O priority. | ||
| 11 | |||
| 1 | CFQ ioscheduler tunables | 12 | CFQ ioscheduler tunables |
| 2 | ======================== | 13 | ======================== |
| 3 | 14 | ||
| @@ -25,6 +36,72 @@ there are multiple spindles behind single LUN (Host based hardware RAID | |||
| 25 | controller or for storage arrays), setting slice_idle=0 might end up in better | 36 | controller or for storage arrays), setting slice_idle=0 might end up in better |
| 26 | throughput and acceptable latencies. | 37 | throughput and acceptable latencies. |
| 27 | 38 | ||
| 39 | back_seek_max | ||
| 40 | ------------- | ||
| 41 | This specifies, given in Kbytes, the maximum "distance" for backward seeking. | ||
| 42 | The distance is the amount of space from the current head location to the | ||
| 43 | sectors that are backward in terms of distance. | ||
| 44 | |||
| 45 | This parameter allows the scheduler to anticipate requests in the "backward" | ||
| 46 | direction and consider them as being the "next" if they are within this | ||
| 47 | distance from the current head location. | ||
| 48 | |||
| 49 | back_seek_penalty | ||
| 50 | ----------------- | ||
| 51 | This parameter is used to compute the cost of backward seeking. If the | ||
| 52 | backward distance of request is just 1/back_seek_penalty from a "front" | ||
| 53 | request, then the seeking cost of two requests is considered equivalent. | ||
| 54 | |||
| 55 | So scheduler will not bias toward one or the other request (otherwise scheduler | ||
| 56 | will bias toward front request). Default value of back_seek_penalty is 2. | ||
| 57 | |||
| 58 | fifo_expire_async | ||
| 59 | ----------------- | ||
| 60 | This parameter is used to set the timeout of asynchronous requests. Default | ||
| 61 | value of this is 248ms. | ||
| 62 | |||
| 63 | fifo_expire_sync | ||
| 64 | ---------------- | ||
| 65 | This parameter is used to set the timeout of synchronous requests. Default | ||
| 66 | value of this is 124ms. In case to favor synchronous requests over asynchronous | ||
| 67 | one, this value should be decreased relative to fifo_expire_async. | ||
| 68 | |||
| 69 | slice_async | ||
| 70 | ----------- | ||
| 71 | This parameter is same as of slice_sync but for asynchronous queue. The | ||
| 72 | default value is 40ms. | ||
| 73 | |||
| 74 | slice_async_rq | ||
| 75 | -------------- | ||
| 76 | This parameter is used to limit the dispatching of asynchronous request to | ||
| 77 | device request queue in queue's slice time. The maximum number of request that | ||
| 78 | are allowed to be dispatched also depends upon the io priority. Default value | ||
| 79 | for this is 2. | ||
| 80 | |||
| 81 | slice_sync | ||
| 82 | ---------- | ||
| 83 | When a queue is selected for execution, the queues IO requests are only | ||
| 84 | executed for a certain amount of time(time_slice) before switching to another | ||
| 85 | queue. This parameter is used to calculate the time slice of synchronous | ||
| 86 | queue. | ||
| 87 | |||
| 88 | time_slice is computed using the below equation:- | ||
| 89 | time_slice = slice_sync + (slice_sync/5 * (4 - prio)). To increase the | ||
| 90 | time_slice of synchronous queue, increase the value of slice_sync. Default | ||
| 91 | value is 100ms. | ||
| 92 | |||
| 93 | quantum | ||
| 94 | ------- | ||
| 95 | This specifies the number of request dispatched to the device queue. In a | ||
| 96 | queue's time slice, a request will not be dispatched if the number of request | ||
| 97 | in the device exceeds this parameter. This parameter is used for synchronous | ||
| 98 | request. | ||
| 99 | |||
| 100 | In case of storage with several disk, this setting can limit the parallel | ||
| 101 | processing of request. Therefore, increasing the value can imporve the | ||
| 102 | performace although this can cause the latency of some I/O to increase due | ||
| 103 | to more number of requests. | ||
| 104 | |||
| 28 | CFQ IOPS Mode for group scheduling | 105 | CFQ IOPS Mode for group scheduling |
| 29 | =================================== | 106 | =================================== |
| 30 | Basic CFQ design is to provide priority based time slices. Higher priority | 107 | Basic CFQ design is to provide priority based time slices. Higher priority |
diff --git a/Documentation/block/queue-sysfs.txt b/Documentation/block/queue-sysfs.txt index 6518a55273e7..e54ac1d53403 100644 --- a/Documentation/block/queue-sysfs.txt +++ b/Documentation/block/queue-sysfs.txt | |||
| @@ -9,20 +9,71 @@ These files are the ones found in the /sys/block/xxx/queue/ directory. | |||
| 9 | Files denoted with a RO postfix are readonly and the RW postfix means | 9 | Files denoted with a RO postfix are readonly and the RW postfix means |
| 10 | read-write. | 10 | read-write. |
| 11 | 11 | ||
| 12 | add_random (RW) | ||
| 13 | ---------------- | ||
| 14 | This file allows to trun off the disk entropy contribution. Default | ||
| 15 | value of this file is '1'(on). | ||
| 16 | |||
| 17 | discard_granularity (RO) | ||
| 18 | ----------------------- | ||
| 19 | This shows the size of internal allocation of the device in bytes, if | ||
| 20 | reported by the device. A value of '0' means device does not support | ||
| 21 | the discard functionality. | ||
| 22 | |||
| 23 | discard_max_bytes (RO) | ||
| 24 | ---------------------- | ||
| 25 | Devices that support discard functionality may have internal limits on | ||
| 26 | the number of bytes that can be trimmed or unmapped in a single operation. | ||
| 27 | The discard_max_bytes parameter is set by the device driver to the maximum | ||
| 28 | number of bytes that can be discarded in a single operation. Discard | ||
| 29 | requests issued to the device must not exceed this limit. A discard_max_bytes | ||
| 30 | value of 0 means that the device does not support discard functionality. | ||
| 31 | |||
| 32 | discard_zeroes_data (RO) | ||
| 33 | ------------------------ | ||
| 34 | When read, this file will show if the discarded block are zeroed by the | ||
| 35 | device or not. If its value is '1' the blocks are zeroed otherwise not. | ||
| 36 | |||
| 12 | hw_sector_size (RO) | 37 | hw_sector_size (RO) |
| 13 | ------------------- | 38 | ------------------- |
| 14 | This is the hardware sector size of the device, in bytes. | 39 | This is the hardware sector size of the device, in bytes. |
| 15 | 40 | ||
| 41 | iostats (RW) | ||
| 42 | ------------- | ||
| 43 | This file is used to control (on/off) the iostats accounting of the | ||
| 44 | disk. | ||
| 45 | |||
| 46 | logical_block_size (RO) | ||
| 47 | ----------------------- | ||
| 48 | This is the logcal block size of the device, in bytes. | ||
| 49 | |||
| 16 | max_hw_sectors_kb (RO) | 50 | max_hw_sectors_kb (RO) |
| 17 | ---------------------- | 51 | ---------------------- |
| 18 | This is the maximum number of kilobytes supported in a single data transfer. | 52 | This is the maximum number of kilobytes supported in a single data transfer. |
| 19 | 53 | ||
| 54 | max_integrity_segments (RO) | ||
| 55 | --------------------------- | ||
| 56 | When read, this file shows the max limit of integrity segments as | ||
| 57 | set by block layer which a hardware controller can handle. | ||
| 58 | |||
| 20 | max_sectors_kb (RW) | 59 | max_sectors_kb (RW) |
| 21 | ------------------- | 60 | ------------------- |
| 22 | This is the maximum number of kilobytes that the block layer will allow | 61 | This is the maximum number of kilobytes that the block layer will allow |
| 23 | for a filesystem request. Must be smaller than or equal to the maximum | 62 | for a filesystem request. Must be smaller than or equal to the maximum |
| 24 | size allowed by the hardware. | 63 | size allowed by the hardware. |
| 25 | 64 | ||
| 65 | max_segments (RO) | ||
| 66 | ----------------- | ||
| 67 | Maximum number of segments of the device. | ||
| 68 | |||
| 69 | max_segment_size (RO) | ||
| 70 | --------------------- | ||
| 71 | Maximum segment size of the device. | ||
| 72 | |||
| 73 | minimum_io_size (RO) | ||
| 74 | -------------------- | ||
| 75 | This is the smallest preferred io size reported by the device. | ||
| 76 | |||
| 26 | nomerges (RW) | 77 | nomerges (RW) |
| 27 | ------------- | 78 | ------------- |
| 28 | This enables the user to disable the lookup logic involved with IO | 79 | This enables the user to disable the lookup logic involved with IO |
| @@ -45,11 +96,24 @@ per-block-cgroup request pool. IOW, if there are N block cgroups, | |||
| 45 | each request queue may have upto N request pools, each independently | 96 | each request queue may have upto N request pools, each independently |
| 46 | regulated by nr_requests. | 97 | regulated by nr_requests. |
| 47 | 98 | ||
| 99 | optimal_io_size (RO) | ||
| 100 | -------------------- | ||
| 101 | This is the optimal io size reported by the device. | ||
| 102 | |||
| 103 | physical_block_size (RO) | ||
| 104 | ------------------------ | ||
| 105 | This is the physical block size of device, in bytes. | ||
| 106 | |||
| 48 | read_ahead_kb (RW) | 107 | read_ahead_kb (RW) |
| 49 | ------------------ | 108 | ------------------ |
| 50 | Maximum number of kilobytes to read-ahead for filesystems on this block | 109 | Maximum number of kilobytes to read-ahead for filesystems on this block |
| 51 | device. | 110 | device. |
| 52 | 111 | ||
| 112 | rotational (RW) | ||
| 113 | --------------- | ||
| 114 | This file is used to stat if the device is of rotational type or | ||
| 115 | non-rotational type. | ||
| 116 | |||
| 53 | rq_affinity (RW) | 117 | rq_affinity (RW) |
| 54 | ---------------- | 118 | ---------------- |
| 55 | If this option is '1', the block layer will migrate request completions to the | 119 | If this option is '1', the block layer will migrate request completions to the |
diff --git a/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt b/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt index 70cd49b1caa8..1dd622546d06 100644 --- a/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt +++ b/Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.txt | |||
| @@ -10,8 +10,8 @@ Required properties: | |||
| 10 | - compatible : Should be "fsl,<chip>-esdhc" | 10 | - compatible : Should be "fsl,<chip>-esdhc" |
| 11 | 11 | ||
| 12 | Optional properties: | 12 | Optional properties: |
| 13 | - fsl,cd-internal : Indicate to use controller internal card detection | 13 | - fsl,cd-controller : Indicate to use controller internal card detection |
| 14 | - fsl,wp-internal : Indicate to use controller internal write protection | 14 | - fsl,wp-controller : Indicate to use controller internal write protection |
| 15 | 15 | ||
| 16 | Examples: | 16 | Examples: |
| 17 | 17 | ||
| @@ -19,8 +19,8 @@ esdhc@70004000 { | |||
| 19 | compatible = "fsl,imx51-esdhc"; | 19 | compatible = "fsl,imx51-esdhc"; |
| 20 | reg = <0x70004000 0x4000>; | 20 | reg = <0x70004000 0x4000>; |
| 21 | interrupts = <1>; | 21 | interrupts = <1>; |
| 22 | fsl,cd-internal; | 22 | fsl,cd-controller; |
| 23 | fsl,wp-internal; | 23 | fsl,wp-controller; |
| 24 | }; | 24 | }; |
| 25 | 25 | ||
| 26 | esdhc@70008000 { | 26 | esdhc@70008000 { |
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index afaff312bf41..f4d8c7105fcd 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -579,7 +579,7 @@ Why: KVM tracepoints provide mostly equivalent information in a much more | |||
| 579 | ---------------------------- | 579 | ---------------------------- |
| 580 | 580 | ||
| 581 | What: at91-mci driver ("CONFIG_MMC_AT91") | 581 | What: at91-mci driver ("CONFIG_MMC_AT91") |
| 582 | When: 3.7 | 582 | When: 3.8 |
| 583 | Why: There are two mci drivers: at91-mci and atmel-mci. The PDC support | 583 | Why: There are two mci drivers: at91-mci and atmel-mci. The PDC support |
| 584 | was added to atmel-mci as a first step to support more chips. | 584 | was added to atmel-mci as a first step to support more chips. |
| 585 | Then at91-mci was kept only for old IP versions (on at91rm9200 and | 585 | Then at91-mci was kept only for old IP versions (on at91rm9200 and |
diff --git a/Documentation/i2c/busses/i2c-i801 b/Documentation/i2c/busses/i2c-i801 index 615142da4ef6..157416e78cc4 100644 --- a/Documentation/i2c/busses/i2c-i801 +++ b/Documentation/i2c/busses/i2c-i801 | |||
| @@ -21,6 +21,7 @@ Supported adapters: | |||
| 21 | * Intel DH89xxCC (PCH) | 21 | * Intel DH89xxCC (PCH) |
| 22 | * Intel Panther Point (PCH) | 22 | * Intel Panther Point (PCH) |
| 23 | * Intel Lynx Point (PCH) | 23 | * Intel Lynx Point (PCH) |
| 24 | * Intel Lynx Point-LP (PCH) | ||
| 24 | Datasheets: Publicly available at the Intel website | 25 | Datasheets: Publicly available at the Intel website |
| 25 | 26 | ||
| 26 | On Intel Patsburg and later chipsets, both the normal host SMBus controller | 27 | On Intel Patsburg and later chipsets, both the normal host SMBus controller |
diff --git a/Documentation/watchdog/src/watchdog-test.c b/Documentation/watchdog/src/watchdog-test.c index 73ff5cc93e05..3da822967ee0 100644 --- a/Documentation/watchdog/src/watchdog-test.c +++ b/Documentation/watchdog/src/watchdog-test.c | |||
| @@ -31,7 +31,7 @@ static void keep_alive(void) | |||
| 31 | * or "-e" to enable the card. | 31 | * or "-e" to enable the card. |
| 32 | */ | 32 | */ |
| 33 | 33 | ||
| 34 | void term(int sig) | 34 | static void term(int sig) |
| 35 | { | 35 | { |
| 36 | close(fd); | 36 | close(fd); |
| 37 | fprintf(stderr, "Stopping watchdog ticks...\n"); | 37 | fprintf(stderr, "Stopping watchdog ticks...\n"); |
diff --git a/MAINTAINERS b/MAINTAINERS index fdc0119963e7..b17587d9412f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -3388,7 +3388,7 @@ M: "Wolfram Sang (embedded platforms)" <w.sang@pengutronix.de> | |||
| 3388 | L: linux-i2c@vger.kernel.org | 3388 | L: linux-i2c@vger.kernel.org |
| 3389 | W: http://i2c.wiki.kernel.org/ | 3389 | W: http://i2c.wiki.kernel.org/ |
| 3390 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ | 3390 | T: quilt kernel.org/pub/linux/kernel/people/jdelvare/linux-2.6/jdelvare-i2c/ |
| 3391 | T: git git://git.fluff.org/bjdooks/linux.git | 3391 | T: git git://git.pengutronix.de/git/wsa/linux.git |
| 3392 | S: Maintained | 3392 | S: Maintained |
| 3393 | F: Documentation/i2c/ | 3393 | F: Documentation/i2c/ |
| 3394 | F: drivers/i2c/ | 3394 | F: drivers/i2c/ |
| @@ -3666,11 +3666,12 @@ F: Documentation/networking/README.ipw2200 | |||
| 3666 | F: drivers/net/wireless/ipw2x00/ | 3666 | F: drivers/net/wireless/ipw2x00/ |
| 3667 | 3667 | ||
| 3668 | INTEL(R) TRUSTED EXECUTION TECHNOLOGY (TXT) | 3668 | INTEL(R) TRUSTED EXECUTION TECHNOLOGY (TXT) |
| 3669 | M: Joseph Cihula <joseph.cihula@intel.com> | 3669 | M: Richard L Maliszewski <richard.l.maliszewski@intel.com> |
| 3670 | M: Gang Wei <gang.wei@intel.com> | ||
| 3670 | M: Shane Wang <shane.wang@intel.com> | 3671 | M: Shane Wang <shane.wang@intel.com> |
| 3671 | L: tboot-devel@lists.sourceforge.net | 3672 | L: tboot-devel@lists.sourceforge.net |
| 3672 | W: http://tboot.sourceforge.net | 3673 | W: http://tboot.sourceforge.net |
| 3673 | T: Mercurial http://www.bughost.org/repos.hg/tboot.hg | 3674 | T: hg http://tboot.hg.sourceforge.net:8000/hgroot/tboot/tboot |
| 3674 | S: Supported | 3675 | S: Supported |
| 3675 | F: Documentation/intel_txt.txt | 3676 | F: Documentation/intel_txt.txt |
| 3676 | F: include/linux/tboot.h | 3677 | F: include/linux/tboot.h |
| @@ -1,7 +1,7 @@ | |||
| 1 | VERSION = 3 | 1 | VERSION = 3 |
| 2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
| 3 | SUBLEVEL = 0 | 3 | SUBLEVEL = 0 |
| 4 | EXTRAVERSION = -rc3 | 4 | EXTRAVERSION = -rc6 |
| 5 | NAME = Saber-toothed Squirrel | 5 | NAME = Saber-toothed Squirrel |
| 6 | 6 | ||
| 7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 6d6e18fee9fe..2f88d8d97701 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
| @@ -6,7 +6,7 @@ config ARM | |||
| 6 | select HAVE_DMA_API_DEBUG | 6 | select HAVE_DMA_API_DEBUG |
| 7 | select HAVE_IDE if PCI || ISA || PCMCIA | 7 | select HAVE_IDE if PCI || ISA || PCMCIA |
| 8 | select HAVE_DMA_ATTRS | 8 | select HAVE_DMA_ATTRS |
| 9 | select HAVE_DMA_CONTIGUOUS if (CPU_V6 || CPU_V6K || CPU_V7) | 9 | select HAVE_DMA_CONTIGUOUS if MMU |
| 10 | select HAVE_MEMBLOCK | 10 | select HAVE_MEMBLOCK |
| 11 | select RTC_LIB | 11 | select RTC_LIB |
| 12 | select SYS_SUPPORTS_APM_EMULATION | 12 | select SYS_SUPPORTS_APM_EMULATION |
| @@ -2144,6 +2144,7 @@ source "drivers/cpufreq/Kconfig" | |||
| 2144 | config CPU_FREQ_IMX | 2144 | config CPU_FREQ_IMX |
| 2145 | tristate "CPUfreq driver for i.MX CPUs" | 2145 | tristate "CPUfreq driver for i.MX CPUs" |
| 2146 | depends on ARCH_MXC && CPU_FREQ | 2146 | depends on ARCH_MXC && CPU_FREQ |
| 2147 | select CPU_FREQ_TABLE | ||
| 2147 | help | 2148 | help |
| 2148 | This enables the CPUfreq driver for i.MX CPUs. | 2149 | This enables the CPUfreq driver for i.MX CPUs. |
| 2149 | 2150 | ||
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index f15f82bf3a50..e968a52e4881 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug | |||
| @@ -356,15 +356,15 @@ choice | |||
| 356 | is nothing connected to read from the DCC. | 356 | is nothing connected to read from the DCC. |
| 357 | 357 | ||
| 358 | config DEBUG_SEMIHOSTING | 358 | config DEBUG_SEMIHOSTING |
| 359 | bool "Kernel low-level debug output via semihosting I" | 359 | bool "Kernel low-level debug output via semihosting I/O" |
| 360 | help | 360 | help |
| 361 | Semihosting enables code running on an ARM target to use | 361 | Semihosting enables code running on an ARM target to use |
| 362 | the I/O facilities on a host debugger/emulator through a | 362 | the I/O facilities on a host debugger/emulator through a |
| 363 | simple SVC calls. The host debugger or emulator must have | 363 | simple SVC call. The host debugger or emulator must have |
| 364 | semihosting enabled for the special svc call to be trapped | 364 | semihosting enabled for the special svc call to be trapped |
| 365 | otherwise the kernel will crash. | 365 | otherwise the kernel will crash. |
| 366 | 366 | ||
| 367 | This is known to work with OpenOCD, as wellas | 367 | This is known to work with OpenOCD, as well as |
| 368 | ARM's Fast Models, or any other controlling environment | 368 | ARM's Fast Models, or any other controlling environment |
| 369 | that implements semihosting. | 369 | that implements semihosting. |
| 370 | 370 | ||
diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 30eae87ead6d..a051dfbdd7db 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile | |||
| @@ -284,10 +284,10 @@ zImage Image xipImage bootpImage uImage: vmlinux | |||
| 284 | zinstall uinstall install: vmlinux | 284 | zinstall uinstall install: vmlinux |
| 285 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ | 285 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $@ |
| 286 | 286 | ||
| 287 | %.dtb: | 287 | %.dtb: scripts |
| 288 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ | 288 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ |
| 289 | 289 | ||
| 290 | dtbs: | 290 | dtbs: scripts |
| 291 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ | 291 | $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@ |
| 292 | 292 | ||
| 293 | # We use MRPROPER_FILES and CLEAN_FILES now | 293 | # We use MRPROPER_FILES and CLEAN_FILES now |
diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index b8c64b80bafc..bc67cbff3944 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S | |||
| @@ -653,16 +653,21 @@ __armv7_mmu_cache_on: | |||
| 653 | mcrne p15, 0, r0, c8, c7, 0 @ flush I,D TLBs | 653 | mcrne p15, 0, r0, c8, c7, 0 @ flush I,D TLBs |
| 654 | #endif | 654 | #endif |
| 655 | mrc p15, 0, r0, c1, c0, 0 @ read control reg | 655 | mrc p15, 0, r0, c1, c0, 0 @ read control reg |
| 656 | bic r0, r0, #1 << 28 @ clear SCTLR.TRE | ||
| 656 | orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement | 657 | orr r0, r0, #0x5000 @ I-cache enable, RR cache replacement |
| 657 | orr r0, r0, #0x003c @ write buffer | 658 | orr r0, r0, #0x003c @ write buffer |
| 658 | #ifdef CONFIG_MMU | 659 | #ifdef CONFIG_MMU |
| 659 | #ifdef CONFIG_CPU_ENDIAN_BE8 | 660 | #ifdef CONFIG_CPU_ENDIAN_BE8 |
| 660 | orr r0, r0, #1 << 25 @ big-endian page tables | 661 | orr r0, r0, #1 << 25 @ big-endian page tables |
| 661 | #endif | 662 | #endif |
| 663 | mrcne p15, 0, r6, c2, c0, 2 @ read ttb control reg | ||
| 662 | orrne r0, r0, #1 @ MMU enabled | 664 | orrne r0, r0, #1 @ MMU enabled |
| 663 | movne r1, #0xfffffffd @ domain 0 = client | 665 | movne r1, #0xfffffffd @ domain 0 = client |
| 666 | bic r6, r6, #1 << 31 @ 32-bit translation system | ||
| 667 | bic r6, r6, #3 << 0 @ use only ttbr0 | ||
| 664 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer | 668 | mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer |
| 665 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control | 669 | mcrne p15, 0, r1, c3, c0, 0 @ load domain access control |
| 670 | mcrne p15, 0, r6, c2, c0, 2 @ load ttb control | ||
| 666 | #endif | 671 | #endif |
| 667 | mcr p15, 0, r0, c7, c5, 4 @ ISB | 672 | mcr p15, 0, r0, c7, c5, 4 @ ISB |
| 668 | mcr p15, 0, r0, c1, c0, 0 @ load control register | 673 | mcr p15, 0, r0, c1, c0, 0 @ load control register |
diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi index 59509c48d7e5..bd0cff3f808c 100644 --- a/arch/arm/boot/dts/am33xx.dtsi +++ b/arch/arm/boot/dts/am33xx.dtsi | |||
| @@ -154,5 +154,10 @@ | |||
| 154 | #size-cells = <0>; | 154 | #size-cells = <0>; |
| 155 | ti,hwmods = "i2c3"; | 155 | ti,hwmods = "i2c3"; |
| 156 | }; | 156 | }; |
| 157 | |||
| 158 | wdt2: wdt@44e35000 { | ||
| 159 | compatible = "ti,omap3-wdt"; | ||
| 160 | ti,hwmods = "wd_timer2"; | ||
| 161 | }; | ||
| 157 | }; | 162 | }; |
| 158 | }; | 163 | }; |
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index 66389c1c6f62..7c95f76398de 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi | |||
| @@ -104,6 +104,7 @@ | |||
| 104 | #gpio-cells = <2>; | 104 | #gpio-cells = <2>; |
| 105 | gpio-controller; | 105 | gpio-controller; |
| 106 | interrupt-controller; | 106 | interrupt-controller; |
| 107 | #interrupt-cells = <2>; | ||
| 107 | }; | 108 | }; |
| 108 | 109 | ||
| 109 | pioB: gpio@fffff600 { | 110 | pioB: gpio@fffff600 { |
| @@ -113,6 +114,7 @@ | |||
| 113 | #gpio-cells = <2>; | 114 | #gpio-cells = <2>; |
| 114 | gpio-controller; | 115 | gpio-controller; |
| 115 | interrupt-controller; | 116 | interrupt-controller; |
| 117 | #interrupt-cells = <2>; | ||
| 116 | }; | 118 | }; |
| 117 | 119 | ||
| 118 | pioC: gpio@fffff800 { | 120 | pioC: gpio@fffff800 { |
| @@ -122,6 +124,7 @@ | |||
| 122 | #gpio-cells = <2>; | 124 | #gpio-cells = <2>; |
| 123 | gpio-controller; | 125 | gpio-controller; |
| 124 | interrupt-controller; | 126 | interrupt-controller; |
| 127 | #interrupt-cells = <2>; | ||
| 125 | }; | 128 | }; |
| 126 | 129 | ||
| 127 | dbgu: serial@fffff200 { | 130 | dbgu: serial@fffff200 { |
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index b460d6ce9eb5..195019b7ca0e 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
| @@ -95,6 +95,7 @@ | |||
| 95 | #gpio-cells = <2>; | 95 | #gpio-cells = <2>; |
| 96 | gpio-controller; | 96 | gpio-controller; |
| 97 | interrupt-controller; | 97 | interrupt-controller; |
| 98 | #interrupt-cells = <2>; | ||
| 98 | }; | 99 | }; |
| 99 | 100 | ||
| 100 | pioB: gpio@fffff400 { | 101 | pioB: gpio@fffff400 { |
| @@ -104,6 +105,7 @@ | |||
| 104 | #gpio-cells = <2>; | 105 | #gpio-cells = <2>; |
| 105 | gpio-controller; | 106 | gpio-controller; |
| 106 | interrupt-controller; | 107 | interrupt-controller; |
| 108 | #interrupt-cells = <2>; | ||
| 107 | }; | 109 | }; |
| 108 | 110 | ||
| 109 | pioC: gpio@fffff600 { | 111 | pioC: gpio@fffff600 { |
| @@ -113,6 +115,7 @@ | |||
| 113 | #gpio-cells = <2>; | 115 | #gpio-cells = <2>; |
| 114 | gpio-controller; | 116 | gpio-controller; |
| 115 | interrupt-controller; | 117 | interrupt-controller; |
| 118 | #interrupt-cells = <2>; | ||
| 116 | }; | 119 | }; |
| 117 | 120 | ||
| 118 | pioD: gpio@fffff800 { | 121 | pioD: gpio@fffff800 { |
| @@ -122,6 +125,7 @@ | |||
| 122 | #gpio-cells = <2>; | 125 | #gpio-cells = <2>; |
| 123 | gpio-controller; | 126 | gpio-controller; |
| 124 | interrupt-controller; | 127 | interrupt-controller; |
| 128 | #interrupt-cells = <2>; | ||
| 125 | }; | 129 | }; |
| 126 | 130 | ||
| 127 | pioE: gpio@fffffa00 { | 131 | pioE: gpio@fffffa00 { |
| @@ -131,6 +135,7 @@ | |||
| 131 | #gpio-cells = <2>; | 135 | #gpio-cells = <2>; |
| 132 | gpio-controller; | 136 | gpio-controller; |
| 133 | interrupt-controller; | 137 | interrupt-controller; |
| 138 | #interrupt-cells = <2>; | ||
| 134 | }; | 139 | }; |
| 135 | 140 | ||
| 136 | dbgu: serial@ffffee00 { | 141 | dbgu: serial@ffffee00 { |
diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index 7829a4d0cb22..96514c134e54 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; | 15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
| 16 | 16 | ||
| 17 | chosen { | 17 | chosen { |
| 18 | bootargs = "128M console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; | 18 | bootargs = "console=ttyS0,115200 root=/dev/mtdblock1 rw rootfstype=ubifs ubi.mtd=1 root=ubi0:rootfs"; |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | ahb { | 21 | ahb { |
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index bafa8806fc17..63751b1e744b 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
| @@ -113,6 +113,7 @@ | |||
| 113 | #gpio-cells = <2>; | 113 | #gpio-cells = <2>; |
| 114 | gpio-controller; | 114 | gpio-controller; |
| 115 | interrupt-controller; | 115 | interrupt-controller; |
| 116 | #interrupt-cells = <2>; | ||
| 116 | }; | 117 | }; |
| 117 | 118 | ||
| 118 | pioB: gpio@fffff400 { | 119 | pioB: gpio@fffff400 { |
| @@ -122,6 +123,7 @@ | |||
| 122 | #gpio-cells = <2>; | 123 | #gpio-cells = <2>; |
| 123 | gpio-controller; | 124 | gpio-controller; |
| 124 | interrupt-controller; | 125 | interrupt-controller; |
| 126 | #interrupt-cells = <2>; | ||
| 125 | }; | 127 | }; |
| 126 | 128 | ||
| 127 | pioC: gpio@fffff600 { | 129 | pioC: gpio@fffff600 { |
| @@ -131,6 +133,7 @@ | |||
| 131 | #gpio-cells = <2>; | 133 | #gpio-cells = <2>; |
| 132 | gpio-controller; | 134 | gpio-controller; |
| 133 | interrupt-controller; | 135 | interrupt-controller; |
| 136 | #interrupt-cells = <2>; | ||
| 134 | }; | 137 | }; |
| 135 | 138 | ||
| 136 | pioD: gpio@fffff800 { | 139 | pioD: gpio@fffff800 { |
| @@ -140,6 +143,7 @@ | |||
| 140 | #gpio-cells = <2>; | 143 | #gpio-cells = <2>; |
| 141 | gpio-controller; | 144 | gpio-controller; |
| 142 | interrupt-controller; | 145 | interrupt-controller; |
| 146 | #interrupt-cells = <2>; | ||
| 143 | }; | 147 | }; |
| 144 | 148 | ||
| 145 | pioE: gpio@fffffa00 { | 149 | pioE: gpio@fffffa00 { |
| @@ -149,6 +153,7 @@ | |||
| 149 | #gpio-cells = <2>; | 153 | #gpio-cells = <2>; |
| 150 | gpio-controller; | 154 | gpio-controller; |
| 151 | interrupt-controller; | 155 | interrupt-controller; |
| 156 | #interrupt-cells = <2>; | ||
| 152 | }; | 157 | }; |
| 153 | 158 | ||
| 154 | dbgu: serial@ffffee00 { | 159 | dbgu: serial@ffffee00 { |
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index bfac0dfc332c..ef9336ae9614 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
| @@ -107,6 +107,7 @@ | |||
| 107 | #gpio-cells = <2>; | 107 | #gpio-cells = <2>; |
| 108 | gpio-controller; | 108 | gpio-controller; |
| 109 | interrupt-controller; | 109 | interrupt-controller; |
| 110 | #interrupt-cells = <2>; | ||
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | pioB: gpio@fffff600 { | 113 | pioB: gpio@fffff600 { |
| @@ -116,6 +117,7 @@ | |||
| 116 | #gpio-cells = <2>; | 117 | #gpio-cells = <2>; |
| 117 | gpio-controller; | 118 | gpio-controller; |
| 118 | interrupt-controller; | 119 | interrupt-controller; |
| 120 | #interrupt-cells = <2>; | ||
| 119 | }; | 121 | }; |
| 120 | 122 | ||
| 121 | pioC: gpio@fffff800 { | 123 | pioC: gpio@fffff800 { |
| @@ -125,6 +127,7 @@ | |||
| 125 | #gpio-cells = <2>; | 127 | #gpio-cells = <2>; |
| 126 | gpio-controller; | 128 | gpio-controller; |
| 127 | interrupt-controller; | 129 | interrupt-controller; |
| 130 | #interrupt-cells = <2>; | ||
| 128 | }; | 131 | }; |
| 129 | 132 | ||
| 130 | pioD: gpio@fffffa00 { | 133 | pioD: gpio@fffffa00 { |
| @@ -134,6 +137,7 @@ | |||
| 134 | #gpio-cells = <2>; | 137 | #gpio-cells = <2>; |
| 135 | gpio-controller; | 138 | gpio-controller; |
| 136 | interrupt-controller; | 139 | interrupt-controller; |
| 140 | #interrupt-cells = <2>; | ||
| 137 | }; | 141 | }; |
| 138 | 142 | ||
| 139 | dbgu: serial@fffff200 { | 143 | dbgu: serial@fffff200 { |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 4a18c393b136..8a387a8d61b7 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -115,6 +115,7 @@ | |||
| 115 | #gpio-cells = <2>; | 115 | #gpio-cells = <2>; |
| 116 | gpio-controller; | 116 | gpio-controller; |
| 117 | interrupt-controller; | 117 | interrupt-controller; |
| 118 | #interrupt-cells = <2>; | ||
| 118 | }; | 119 | }; |
| 119 | 120 | ||
| 120 | pioB: gpio@fffff600 { | 121 | pioB: gpio@fffff600 { |
| @@ -124,6 +125,7 @@ | |||
| 124 | #gpio-cells = <2>; | 125 | #gpio-cells = <2>; |
| 125 | gpio-controller; | 126 | gpio-controller; |
| 126 | interrupt-controller; | 127 | interrupt-controller; |
| 128 | #interrupt-cells = <2>; | ||
| 127 | }; | 129 | }; |
| 128 | 130 | ||
| 129 | pioC: gpio@fffff800 { | 131 | pioC: gpio@fffff800 { |
| @@ -133,6 +135,7 @@ | |||
| 133 | #gpio-cells = <2>; | 135 | #gpio-cells = <2>; |
| 134 | gpio-controller; | 136 | gpio-controller; |
| 135 | interrupt-controller; | 137 | interrupt-controller; |
| 138 | #interrupt-cells = <2>; | ||
| 136 | }; | 139 | }; |
| 137 | 140 | ||
| 138 | pioD: gpio@fffffa00 { | 141 | pioD: gpio@fffffa00 { |
| @@ -142,6 +145,7 @@ | |||
| 142 | #gpio-cells = <2>; | 145 | #gpio-cells = <2>; |
| 143 | gpio-controller; | 146 | gpio-controller; |
| 144 | interrupt-controller; | 147 | interrupt-controller; |
| 148 | #interrupt-cells = <2>; | ||
| 145 | }; | 149 | }; |
| 146 | 150 | ||
| 147 | dbgu: serial@fffff200 { | 151 | dbgu: serial@fffff200 { |
diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index cd86177a3ea2..59d9789e5508 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts | |||
| @@ -25,8 +25,8 @@ | |||
| 25 | aips@70000000 { /* aips-1 */ | 25 | aips@70000000 { /* aips-1 */ |
| 26 | spba@70000000 { | 26 | spba@70000000 { |
| 27 | esdhc@70004000 { /* ESDHC1 */ | 27 | esdhc@70004000 { /* ESDHC1 */ |
| 28 | fsl,cd-internal; | 28 | fsl,cd-controller; |
| 29 | fsl,wp-internal; | 29 | fsl,wp-controller; |
| 30 | status = "okay"; | 30 | status = "okay"; |
| 31 | }; | 31 | }; |
| 32 | 32 | ||
diff --git a/arch/arm/boot/dts/kirkwood-iconnect.dts b/arch/arm/boot/dts/kirkwood-iconnect.dts index 52d947045106..f8ca6fa88192 100644 --- a/arch/arm/boot/dts/kirkwood-iconnect.dts +++ b/arch/arm/boot/dts/kirkwood-iconnect.dts | |||
| @@ -41,9 +41,13 @@ | |||
| 41 | }; | 41 | }; |
| 42 | power-blue { | 42 | power-blue { |
| 43 | label = "power:blue"; | 43 | label = "power:blue"; |
| 44 | gpios = <&gpio1 11 0>; | 44 | gpios = <&gpio1 10 0>; |
| 45 | linux,default-trigger = "timer"; | 45 | linux,default-trigger = "timer"; |
| 46 | }; | 46 | }; |
| 47 | power-red { | ||
| 48 | label = "power:red"; | ||
| 49 | gpios = <&gpio1 11 0>; | ||
| 50 | }; | ||
| 47 | usb1 { | 51 | usb1 { |
| 48 | label = "usb1:blue"; | 52 | label = "usb1:blue"; |
| 49 | gpios = <&gpio1 12 0>; | 53 | gpios = <&gpio1 12 0>; |
diff --git a/arch/arm/boot/dts/twl6030.dtsi b/arch/arm/boot/dts/twl6030.dtsi index 3b2f3510d7eb..d351b27d7213 100644 --- a/arch/arm/boot/dts/twl6030.dtsi +++ b/arch/arm/boot/dts/twl6030.dtsi | |||
| @@ -66,6 +66,7 @@ | |||
| 66 | 66 | ||
| 67 | vcxio: regulator@8 { | 67 | vcxio: regulator@8 { |
| 68 | compatible = "ti,twl6030-vcxio"; | 68 | compatible = "ti,twl6030-vcxio"; |
| 69 | regulator-always-on; | ||
| 69 | }; | 70 | }; |
| 70 | 71 | ||
| 71 | vusb: regulator@9 { | 72 | vusb: regulator@9 { |
| @@ -74,10 +75,12 @@ | |||
| 74 | 75 | ||
| 75 | v1v8: regulator@10 { | 76 | v1v8: regulator@10 { |
| 76 | compatible = "ti,twl6030-v1v8"; | 77 | compatible = "ti,twl6030-v1v8"; |
| 78 | regulator-always-on; | ||
| 77 | }; | 79 | }; |
| 78 | 80 | ||
| 79 | v2v1: regulator@11 { | 81 | v2v1: regulator@11 { |
| 80 | compatible = "ti,twl6030-v2v1"; | 82 | compatible = "ti,twl6030-v2v1"; |
| 83 | regulator-always-on; | ||
| 81 | }; | 84 | }; |
| 82 | 85 | ||
| 83 | clk32kg: regulator@12 { | 86 | clk32kg: regulator@12 { |
diff --git a/arch/arm/configs/armadillo800eva_defconfig b/arch/arm/configs/armadillo800eva_defconfig index 7d8718468e0d..90610c7030f7 100644 --- a/arch/arm/configs/armadillo800eva_defconfig +++ b/arch/arm/configs/armadillo800eva_defconfig | |||
| @@ -33,7 +33,7 @@ CONFIG_AEABI=y | |||
| 33 | CONFIG_FORCE_MAX_ZONEORDER=13 | 33 | CONFIG_FORCE_MAX_ZONEORDER=13 |
| 34 | CONFIG_ZBOOT_ROM_TEXT=0x0 | 34 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
| 35 | CONFIG_ZBOOT_ROM_BSS=0x0 | 35 | CONFIG_ZBOOT_ROM_BSS=0x0 |
| 36 | CONFIG_CMDLINE="console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096" | 36 | CONFIG_CMDLINE="console=tty0 console=ttySC1,115200 earlyprintk=sh-sci.1,115200 ignore_loglevel root=/dev/nfs ip=dhcp nfsroot=,rsize=4096,wsize=4096 rw" |
| 37 | CONFIG_CMDLINE_FORCE=y | 37 | CONFIG_CMDLINE_FORCE=y |
| 38 | CONFIG_KEXEC=y | 38 | CONFIG_KEXEC=y |
| 39 | CONFIG_VFP=y | 39 | CONFIG_VFP=y |
diff --git a/arch/arm/configs/u8500_defconfig b/arch/arm/configs/u8500_defconfig index 2d4f661d1cf6..da6845493caa 100644 --- a/arch/arm/configs/u8500_defconfig +++ b/arch/arm/configs/u8500_defconfig | |||
| @@ -86,6 +86,7 @@ CONFIG_NEW_LEDS=y | |||
| 86 | CONFIG_LEDS_CLASS=y | 86 | CONFIG_LEDS_CLASS=y |
| 87 | CONFIG_LEDS_LM3530=y | 87 | CONFIG_LEDS_LM3530=y |
| 88 | CONFIG_LEDS_LP5521=y | 88 | CONFIG_LEDS_LP5521=y |
| 89 | CONFIG_LEDS_GPIO=y | ||
| 89 | CONFIG_RTC_CLASS=y | 90 | CONFIG_RTC_CLASS=y |
| 90 | CONFIG_RTC_DRV_AB8500=y | 91 | CONFIG_RTC_DRV_AB8500=y |
| 91 | CONFIG_RTC_DRV_PL031=y | 92 | CONFIG_RTC_DRV_PL031=y |
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h index 03fb93621d0d..5c8b3bf4d825 100644 --- a/arch/arm/include/asm/assembler.h +++ b/arch/arm/include/asm/assembler.h | |||
| @@ -320,4 +320,12 @@ | |||
| 320 | .size \name , . - \name | 320 | .size \name , . - \name |
| 321 | .endm | 321 | .endm |
| 322 | 322 | ||
| 323 | .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req | ||
| 324 | #ifndef CONFIG_CPU_USE_DOMAINS | ||
| 325 | adds \tmp, \addr, #\size - 1 | ||
| 326 | sbcccs \tmp, \tmp, \limit | ||
| 327 | bcs \bad | ||
| 328 | #endif | ||
| 329 | .endm | ||
| 330 | |||
| 323 | #endif /* __ASM_ASSEMBLER_H__ */ | 331 | #endif /* __ASM_ASSEMBLER_H__ */ |
diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index 2ae842df4551..5c44dcb0987b 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h | |||
| @@ -203,6 +203,13 @@ static inline void dma_free_writecombine(struct device *dev, size_t size, | |||
| 203 | } | 203 | } |
| 204 | 204 | ||
| 205 | /* | 205 | /* |
| 206 | * This can be called during early boot to increase the size of the atomic | ||
| 207 | * coherent DMA pool above the default value of 256KiB. It must be called | ||
| 208 | * before postcore_initcall. | ||
| 209 | */ | ||
| 210 | extern void __init init_dma_coherent_pool_size(unsigned long size); | ||
| 211 | |||
| 212 | /* | ||
| 206 | * This can be called during boot to increase the size of the consistent | 213 | * This can be called during boot to increase the size of the consistent |
| 207 | * DMA region above it's default value of 2MB. It must be called before the | 214 | * DMA region above it's default value of 2MB. It must be called before the |
| 208 | * memory allocator is initialised, i.e. before any core_initcall. | 215 | * memory allocator is initialised, i.e. before any core_initcall. |
diff --git a/arch/arm/include/asm/memory.h b/arch/arm/include/asm/memory.h index e965f1b560f1..5f6ddcc56452 100644 --- a/arch/arm/include/asm/memory.h +++ b/arch/arm/include/asm/memory.h | |||
| @@ -187,6 +187,7 @@ static inline unsigned long __phys_to_virt(unsigned long x) | |||
| 187 | #define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET) | 187 | #define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET) |
| 188 | #endif | 188 | #endif |
| 189 | #endif | 189 | #endif |
| 190 | #endif /* __ASSEMBLY__ */ | ||
| 190 | 191 | ||
| 191 | #ifndef PHYS_OFFSET | 192 | #ifndef PHYS_OFFSET |
| 192 | #ifdef PLAT_PHYS_OFFSET | 193 | #ifdef PLAT_PHYS_OFFSET |
| @@ -196,6 +197,8 @@ static inline unsigned long __phys_to_virt(unsigned long x) | |||
| 196 | #endif | 197 | #endif |
| 197 | #endif | 198 | #endif |
| 198 | 199 | ||
| 200 | #ifndef __ASSEMBLY__ | ||
| 201 | |||
| 199 | /* | 202 | /* |
| 200 | * PFNs are used to describe any physical page; this means | 203 | * PFNs are used to describe any physical page; this means |
| 201 | * PFN 0 == physical address 0. | 204 | * PFN 0 == physical address 0. |
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index 314d4664eae7..99a19512ee26 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
| @@ -199,6 +199,9 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |||
| 199 | { | 199 | { |
| 200 | pgtable_page_dtor(pte); | 200 | pgtable_page_dtor(pte); |
| 201 | 201 | ||
| 202 | #ifdef CONFIG_ARM_LPAE | ||
| 203 | tlb_add_flush(tlb, addr); | ||
| 204 | #else | ||
| 202 | /* | 205 | /* |
| 203 | * With the classic ARM MMU, a pte page has two corresponding pmd | 206 | * With the classic ARM MMU, a pte page has two corresponding pmd |
| 204 | * entries, each covering 1MB. | 207 | * entries, each covering 1MB. |
| @@ -206,6 +209,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | |||
| 206 | addr &= PMD_MASK; | 209 | addr &= PMD_MASK; |
| 207 | tlb_add_flush(tlb, addr + SZ_1M - PAGE_SIZE); | 210 | tlb_add_flush(tlb, addr + SZ_1M - PAGE_SIZE); |
| 208 | tlb_add_flush(tlb, addr + SZ_1M); | 211 | tlb_add_flush(tlb, addr + SZ_1M); |
| 212 | #endif | ||
| 209 | 213 | ||
| 210 | tlb_remove_page(tlb, pte); | 214 | tlb_remove_page(tlb, pte); |
| 211 | } | 215 | } |
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h index 479a6352e0b5..77bd79f2ffdb 100644 --- a/arch/arm/include/asm/uaccess.h +++ b/arch/arm/include/asm/uaccess.h | |||
| @@ -101,28 +101,39 @@ extern int __get_user_1(void *); | |||
| 101 | extern int __get_user_2(void *); | 101 | extern int __get_user_2(void *); |
| 102 | extern int __get_user_4(void *); | 102 | extern int __get_user_4(void *); |
| 103 | 103 | ||
| 104 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ | 104 | #define __GUP_CLOBBER_1 "lr", "cc" |
| 105 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
| 106 | #define __GUP_CLOBBER_2 "ip", "lr", "cc" | ||
| 107 | #else | ||
| 108 | #define __GUP_CLOBBER_2 "lr", "cc" | ||
| 109 | #endif | ||
| 110 | #define __GUP_CLOBBER_4 "lr", "cc" | ||
| 111 | |||
| 112 | #define __get_user_x(__r2,__p,__e,__l,__s) \ | ||
| 105 | __asm__ __volatile__ ( \ | 113 | __asm__ __volatile__ ( \ |
| 106 | __asmeq("%0", "r0") __asmeq("%1", "r2") \ | 114 | __asmeq("%0", "r0") __asmeq("%1", "r2") \ |
| 115 | __asmeq("%3", "r1") \ | ||
| 107 | "bl __get_user_" #__s \ | 116 | "bl __get_user_" #__s \ |
| 108 | : "=&r" (__e), "=r" (__r2) \ | 117 | : "=&r" (__e), "=r" (__r2) \ |
| 109 | : "0" (__p) \ | 118 | : "0" (__p), "r" (__l) \ |
| 110 | : __i, "cc") | 119 | : __GUP_CLOBBER_##__s) |
| 111 | 120 | ||
| 112 | #define get_user(x,p) \ | 121 | #define __get_user_check(x,p) \ |
| 113 | ({ \ | 122 | ({ \ |
| 123 | unsigned long __limit = current_thread_info()->addr_limit - 1; \ | ||
| 114 | register const typeof(*(p)) __user *__p asm("r0") = (p);\ | 124 | register const typeof(*(p)) __user *__p asm("r0") = (p);\ |
| 115 | register unsigned long __r2 asm("r2"); \ | 125 | register unsigned long __r2 asm("r2"); \ |
| 126 | register unsigned long __l asm("r1") = __limit; \ | ||
| 116 | register int __e asm("r0"); \ | 127 | register int __e asm("r0"); \ |
| 117 | switch (sizeof(*(__p))) { \ | 128 | switch (sizeof(*(__p))) { \ |
| 118 | case 1: \ | 129 | case 1: \ |
| 119 | __get_user_x(__r2, __p, __e, 1, "lr"); \ | 130 | __get_user_x(__r2, __p, __e, __l, 1); \ |
| 120 | break; \ | 131 | break; \ |
| 121 | case 2: \ | 132 | case 2: \ |
| 122 | __get_user_x(__r2, __p, __e, 2, "r3", "lr"); \ | 133 | __get_user_x(__r2, __p, __e, __l, 2); \ |
| 123 | break; \ | 134 | break; \ |
| 124 | case 4: \ | 135 | case 4: \ |
| 125 | __get_user_x(__r2, __p, __e, 4, "lr"); \ | 136 | __get_user_x(__r2, __p, __e, __l, 4); \ |
| 126 | break; \ | 137 | break; \ |
| 127 | default: __e = __get_user_bad(); break; \ | 138 | default: __e = __get_user_bad(); break; \ |
| 128 | } \ | 139 | } \ |
| @@ -130,42 +141,57 @@ extern int __get_user_4(void *); | |||
| 130 | __e; \ | 141 | __e; \ |
| 131 | }) | 142 | }) |
| 132 | 143 | ||
| 144 | #define get_user(x,p) \ | ||
| 145 | ({ \ | ||
| 146 | might_fault(); \ | ||
| 147 | __get_user_check(x,p); \ | ||
| 148 | }) | ||
| 149 | |||
| 133 | extern int __put_user_1(void *, unsigned int); | 150 | extern int __put_user_1(void *, unsigned int); |
| 134 | extern int __put_user_2(void *, unsigned int); | 151 | extern int __put_user_2(void *, unsigned int); |
| 135 | extern int __put_user_4(void *, unsigned int); | 152 | extern int __put_user_4(void *, unsigned int); |
| 136 | extern int __put_user_8(void *, unsigned long long); | 153 | extern int __put_user_8(void *, unsigned long long); |
| 137 | 154 | ||
| 138 | #define __put_user_x(__r2,__p,__e,__s) \ | 155 | #define __put_user_x(__r2,__p,__e,__l,__s) \ |
| 139 | __asm__ __volatile__ ( \ | 156 | __asm__ __volatile__ ( \ |
| 140 | __asmeq("%0", "r0") __asmeq("%2", "r2") \ | 157 | __asmeq("%0", "r0") __asmeq("%2", "r2") \ |
| 158 | __asmeq("%3", "r1") \ | ||
| 141 | "bl __put_user_" #__s \ | 159 | "bl __put_user_" #__s \ |
| 142 | : "=&r" (__e) \ | 160 | : "=&r" (__e) \ |
| 143 | : "0" (__p), "r" (__r2) \ | 161 | : "0" (__p), "r" (__r2), "r" (__l) \ |
| 144 | : "ip", "lr", "cc") | 162 | : "ip", "lr", "cc") |
| 145 | 163 | ||
| 146 | #define put_user(x,p) \ | 164 | #define __put_user_check(x,p) \ |
| 147 | ({ \ | 165 | ({ \ |
| 166 | unsigned long __limit = current_thread_info()->addr_limit - 1; \ | ||
| 148 | register const typeof(*(p)) __r2 asm("r2") = (x); \ | 167 | register const typeof(*(p)) __r2 asm("r2") = (x); \ |
| 149 | register const typeof(*(p)) __user *__p asm("r0") = (p);\ | 168 | register const typeof(*(p)) __user *__p asm("r0") = (p);\ |
| 169 | register unsigned long __l asm("r1") = __limit; \ | ||
| 150 | register int __e asm("r0"); \ | 170 | register int __e asm("r0"); \ |
| 151 | switch (sizeof(*(__p))) { \ | 171 | switch (sizeof(*(__p))) { \ |
| 152 | case 1: \ | 172 | case 1: \ |
| 153 | __put_user_x(__r2, __p, __e, 1); \ | 173 | __put_user_x(__r2, __p, __e, __l, 1); \ |
| 154 | break; \ | 174 | break; \ |
| 155 | case 2: \ | 175 | case 2: \ |
| 156 | __put_user_x(__r2, __p, __e, 2); \ | 176 | __put_user_x(__r2, __p, __e, __l, 2); \ |
| 157 | break; \ | 177 | break; \ |
| 158 | case 4: \ | 178 | case 4: \ |
| 159 | __put_user_x(__r2, __p, __e, 4); \ | 179 | __put_user_x(__r2, __p, __e, __l, 4); \ |
| 160 | break; \ | 180 | break; \ |
| 161 | case 8: \ | 181 | case 8: \ |
| 162 | __put_user_x(__r2, __p, __e, 8); \ | 182 | __put_user_x(__r2, __p, __e, __l, 8); \ |
| 163 | break; \ | 183 | break; \ |
| 164 | default: __e = __put_user_bad(); break; \ | 184 | default: __e = __put_user_bad(); break; \ |
| 165 | } \ | 185 | } \ |
| 166 | __e; \ | 186 | __e; \ |
| 167 | }) | 187 | }) |
| 168 | 188 | ||
| 189 | #define put_user(x,p) \ | ||
| 190 | ({ \ | ||
| 191 | might_fault(); \ | ||
| 192 | __put_user_check(x,p); \ | ||
| 193 | }) | ||
| 194 | |||
| 169 | #else /* CONFIG_MMU */ | 195 | #else /* CONFIG_MMU */ |
| 170 | 196 | ||
| 171 | /* | 197 | /* |
| @@ -219,6 +245,7 @@ do { \ | |||
| 219 | unsigned long __gu_addr = (unsigned long)(ptr); \ | 245 | unsigned long __gu_addr = (unsigned long)(ptr); \ |
| 220 | unsigned long __gu_val; \ | 246 | unsigned long __gu_val; \ |
| 221 | __chk_user_ptr(ptr); \ | 247 | __chk_user_ptr(ptr); \ |
| 248 | might_fault(); \ | ||
| 222 | switch (sizeof(*(ptr))) { \ | 249 | switch (sizeof(*(ptr))) { \ |
| 223 | case 1: __get_user_asm_byte(__gu_val,__gu_addr,err); break; \ | 250 | case 1: __get_user_asm_byte(__gu_val,__gu_addr,err); break; \ |
| 224 | case 2: __get_user_asm_half(__gu_val,__gu_addr,err); break; \ | 251 | case 2: __get_user_asm_half(__gu_val,__gu_addr,err); break; \ |
| @@ -300,6 +327,7 @@ do { \ | |||
| 300 | unsigned long __pu_addr = (unsigned long)(ptr); \ | 327 | unsigned long __pu_addr = (unsigned long)(ptr); \ |
| 301 | __typeof__(*(ptr)) __pu_val = (x); \ | 328 | __typeof__(*(ptr)) __pu_val = (x); \ |
| 302 | __chk_user_ptr(ptr); \ | 329 | __chk_user_ptr(ptr); \ |
| 330 | might_fault(); \ | ||
| 303 | switch (sizeof(*(ptr))) { \ | 331 | switch (sizeof(*(ptr))) { \ |
| 304 | case 1: __put_user_asm_byte(__pu_val,__pu_addr,err); break; \ | 332 | case 1: __put_user_asm_byte(__pu_val,__pu_addr,err); break; \ |
| 305 | case 2: __put_user_asm_half(__pu_val,__pu_addr,err); break; \ | 333 | case 2: __put_user_asm_half(__pu_val,__pu_addr,err); break; \ |
diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h index 0cab47d4a83f..2fde5fd1acce 100644 --- a/arch/arm/include/asm/unistd.h +++ b/arch/arm/include/asm/unistd.h | |||
| @@ -404,6 +404,7 @@ | |||
| 404 | #define __NR_setns (__NR_SYSCALL_BASE+375) | 404 | #define __NR_setns (__NR_SYSCALL_BASE+375) |
| 405 | #define __NR_process_vm_readv (__NR_SYSCALL_BASE+376) | 405 | #define __NR_process_vm_readv (__NR_SYSCALL_BASE+376) |
| 406 | #define __NR_process_vm_writev (__NR_SYSCALL_BASE+377) | 406 | #define __NR_process_vm_writev (__NR_SYSCALL_BASE+377) |
| 407 | /* 378 for kcmp */ | ||
| 407 | 408 | ||
| 408 | /* | 409 | /* |
| 409 | * The following SWIs are ARM private. | 410 | * The following SWIs are ARM private. |
| @@ -483,6 +484,7 @@ | |||
| 483 | */ | 484 | */ |
| 484 | #define __IGNORE_fadvise64_64 | 485 | #define __IGNORE_fadvise64_64 |
| 485 | #define __IGNORE_migrate_pages | 486 | #define __IGNORE_migrate_pages |
| 487 | #define __IGNORE_kcmp | ||
| 486 | 488 | ||
| 487 | #endif /* __KERNEL__ */ | 489 | #endif /* __KERNEL__ */ |
| 488 | #endif /* __ASM_ARM_UNISTD_H */ | 490 | #endif /* __ASM_ARM_UNISTD_H */ |
diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 463ff4a0ec8a..e337879595e5 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S | |||
| @@ -387,6 +387,7 @@ | |||
| 387 | /* 375 */ CALL(sys_setns) | 387 | /* 375 */ CALL(sys_setns) |
| 388 | CALL(sys_process_vm_readv) | 388 | CALL(sys_process_vm_readv) |
| 389 | CALL(sys_process_vm_writev) | 389 | CALL(sys_process_vm_writev) |
| 390 | CALL(sys_ni_syscall) /* reserved for sys_kcmp */ | ||
| 390 | #ifndef syscalls_counted | 391 | #ifndef syscalls_counted |
| 391 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls | 392 | .equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls |
| 392 | #define syscalls_counted | 393 | #define syscalls_counted |
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c index ba386bd94107..281bf3301241 100644 --- a/arch/arm/kernel/hw_breakpoint.c +++ b/arch/arm/kernel/hw_breakpoint.c | |||
| @@ -159,6 +159,12 @@ static int debug_arch_supported(void) | |||
| 159 | arch >= ARM_DEBUG_ARCH_V7_1; | 159 | arch >= ARM_DEBUG_ARCH_V7_1; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | /* Can we determine the watchpoint access type from the fsr? */ | ||
| 163 | static int debug_exception_updates_fsr(void) | ||
| 164 | { | ||
| 165 | return 0; | ||
| 166 | } | ||
| 167 | |||
| 162 | /* Determine number of WRP registers available. */ | 168 | /* Determine number of WRP registers available. */ |
| 163 | static int get_num_wrp_resources(void) | 169 | static int get_num_wrp_resources(void) |
| 164 | { | 170 | { |
| @@ -604,13 +610,14 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) | |||
| 604 | /* Aligned */ | 610 | /* Aligned */ |
| 605 | break; | 611 | break; |
| 606 | case 1: | 612 | case 1: |
| 607 | /* Allow single byte watchpoint. */ | ||
| 608 | if (info->ctrl.len == ARM_BREAKPOINT_LEN_1) | ||
| 609 | break; | ||
| 610 | case 2: | 613 | case 2: |
| 611 | /* Allow halfword watchpoints and breakpoints. */ | 614 | /* Allow halfword watchpoints and breakpoints. */ |
| 612 | if (info->ctrl.len == ARM_BREAKPOINT_LEN_2) | 615 | if (info->ctrl.len == ARM_BREAKPOINT_LEN_2) |
| 613 | break; | 616 | break; |
| 617 | case 3: | ||
| 618 | /* Allow single byte watchpoint. */ | ||
| 619 | if (info->ctrl.len == ARM_BREAKPOINT_LEN_1) | ||
| 620 | break; | ||
| 614 | default: | 621 | default: |
| 615 | ret = -EINVAL; | 622 | ret = -EINVAL; |
| 616 | goto out; | 623 | goto out; |
| @@ -619,18 +626,35 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp) | |||
| 619 | info->address &= ~alignment_mask; | 626 | info->address &= ~alignment_mask; |
| 620 | info->ctrl.len <<= offset; | 627 | info->ctrl.len <<= offset; |
| 621 | 628 | ||
| 622 | /* | 629 | if (!bp->overflow_handler) { |
| 623 | * Currently we rely on an overflow handler to take | 630 | /* |
| 624 | * care of single-stepping the breakpoint when it fires. | 631 | * Mismatch breakpoints are required for single-stepping |
| 625 | * In the case of userspace breakpoints on a core with V7 debug, | 632 | * breakpoints. |
| 626 | * we can use the mismatch feature as a poor-man's hardware | 633 | */ |
| 627 | * single-step, but this only works for per-task breakpoints. | 634 | if (!core_has_mismatch_brps()) |
| 628 | */ | 635 | return -EINVAL; |
| 629 | if (!bp->overflow_handler && (arch_check_bp_in_kernelspace(bp) || | 636 | |
| 630 | !core_has_mismatch_brps() || !bp->hw.bp_target)) { | 637 | /* We don't allow mismatch breakpoints in kernel space. */ |
| 631 | pr_warning("overflow handler required but none found\n"); | 638 | if (arch_check_bp_in_kernelspace(bp)) |
| 632 | ret = -EINVAL; | 639 | return -EPERM; |
| 640 | |||
| 641 | /* | ||
| 642 | * Per-cpu breakpoints are not supported by our stepping | ||
| 643 | * mechanism. | ||
| 644 | */ | ||
| 645 | if (!bp->hw.bp_target) | ||
| 646 | return -EINVAL; | ||
| 647 | |||
| 648 | /* | ||
| 649 | * We only support specific access types if the fsr | ||
| 650 | * reports them. | ||
| 651 | */ | ||
| 652 | if (!debug_exception_updates_fsr() && | ||
| 653 | (info->ctrl.type == ARM_BREAKPOINT_LOAD || | ||
| 654 | info->ctrl.type == ARM_BREAKPOINT_STORE)) | ||
| 655 | return -EINVAL; | ||
| 633 | } | 656 | } |
| 657 | |||
| 634 | out: | 658 | out: |
| 635 | return ret; | 659 | return ret; |
| 636 | } | 660 | } |
| @@ -706,10 +730,12 @@ static void watchpoint_handler(unsigned long addr, unsigned int fsr, | |||
| 706 | goto unlock; | 730 | goto unlock; |
| 707 | 731 | ||
| 708 | /* Check that the access type matches. */ | 732 | /* Check that the access type matches. */ |
| 709 | access = (fsr & ARM_FSR_ACCESS_MASK) ? HW_BREAKPOINT_W : | 733 | if (debug_exception_updates_fsr()) { |
| 710 | HW_BREAKPOINT_R; | 734 | access = (fsr & ARM_FSR_ACCESS_MASK) ? |
| 711 | if (!(access & hw_breakpoint_type(wp))) | 735 | HW_BREAKPOINT_W : HW_BREAKPOINT_R; |
| 712 | goto unlock; | 736 | if (!(access & hw_breakpoint_type(wp))) |
| 737 | goto unlock; | ||
| 738 | } | ||
| 713 | 739 | ||
| 714 | /* We have a winner. */ | 740 | /* We have a winner. */ |
| 715 | info->trigger = addr; | 741 | info->trigger = addr; |
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index fef42b21cecb..e1f906989bb8 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c | |||
| @@ -11,7 +11,6 @@ | |||
| 11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
| 12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
| 13 | #include <linux/clk.h> | 13 | #include <linux/clk.h> |
| 14 | #include <linux/cpufreq.h> | ||
| 15 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
| 16 | #include <linux/device.h> | 15 | #include <linux/device.h> |
| 17 | #include <linux/err.h> | 16 | #include <linux/err.h> |
| @@ -96,7 +95,52 @@ static void twd_timer_stop(struct clock_event_device *clk) | |||
| 96 | disable_percpu_irq(clk->irq); | 95 | disable_percpu_irq(clk->irq); |
| 97 | } | 96 | } |
| 98 | 97 | ||
| 99 | #ifdef CONFIG_CPU_FREQ | 98 | #ifdef CONFIG_COMMON_CLK |
| 99 | |||
| 100 | /* | ||
| 101 | * Updates clockevent frequency when the cpu frequency changes. | ||
| 102 | * Called on the cpu that is changing frequency with interrupts disabled. | ||
| 103 | */ | ||
| 104 | static void twd_update_frequency(void *new_rate) | ||
| 105 | { | ||
| 106 | twd_timer_rate = *((unsigned long *) new_rate); | ||
| 107 | |||
| 108 | clockevents_update_freq(*__this_cpu_ptr(twd_evt), twd_timer_rate); | ||
| 109 | } | ||
| 110 | |||
| 111 | static int twd_rate_change(struct notifier_block *nb, | ||
| 112 | unsigned long flags, void *data) | ||
| 113 | { | ||
| 114 | struct clk_notifier_data *cnd = data; | ||
| 115 | |||
| 116 | /* | ||
| 117 | * The twd clock events must be reprogrammed to account for the new | ||
| 118 | * frequency. The timer is local to a cpu, so cross-call to the | ||
| 119 | * changing cpu. | ||
| 120 | */ | ||
| 121 | if (flags == POST_RATE_CHANGE) | ||
| 122 | smp_call_function(twd_update_frequency, | ||
| 123 | (void *)&cnd->new_rate, 1); | ||
| 124 | |||
| 125 | return NOTIFY_OK; | ||
| 126 | } | ||
| 127 | |||
| 128 | static struct notifier_block twd_clk_nb = { | ||
| 129 | .notifier_call = twd_rate_change, | ||
| 130 | }; | ||
| 131 | |||
| 132 | static int twd_clk_init(void) | ||
| 133 | { | ||
| 134 | if (twd_evt && *__this_cpu_ptr(twd_evt) && !IS_ERR(twd_clk)) | ||
| 135 | return clk_notifier_register(twd_clk, &twd_clk_nb); | ||
| 136 | |||
| 137 | return 0; | ||
| 138 | } | ||
| 139 | core_initcall(twd_clk_init); | ||
| 140 | |||
| 141 | #elif defined (CONFIG_CPU_FREQ) | ||
| 142 | |||
| 143 | #include <linux/cpufreq.h> | ||
| 100 | 144 | ||
| 101 | /* | 145 | /* |
| 102 | * Updates clockevent frequency when the cpu frequency changes. | 146 | * Updates clockevent frequency when the cpu frequency changes. |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index f7945218b8c6..b0179b89a04c 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
| @@ -420,20 +420,23 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs) | |||
| 420 | #endif | 420 | #endif |
| 421 | instr = *(u32 *) pc; | 421 | instr = *(u32 *) pc; |
| 422 | } else if (thumb_mode(regs)) { | 422 | } else if (thumb_mode(regs)) { |
| 423 | get_user(instr, (u16 __user *)pc); | 423 | if (get_user(instr, (u16 __user *)pc)) |
| 424 | goto die_sig; | ||
| 424 | if (is_wide_instruction(instr)) { | 425 | if (is_wide_instruction(instr)) { |
| 425 | unsigned int instr2; | 426 | unsigned int instr2; |
| 426 | get_user(instr2, (u16 __user *)pc+1); | 427 | if (get_user(instr2, (u16 __user *)pc+1)) |
| 428 | goto die_sig; | ||
| 427 | instr <<= 16; | 429 | instr <<= 16; |
| 428 | instr |= instr2; | 430 | instr |= instr2; |
| 429 | } | 431 | } |
| 430 | } else { | 432 | } else if (get_user(instr, (u32 __user *)pc)) { |
| 431 | get_user(instr, (u32 __user *)pc); | 433 | goto die_sig; |
| 432 | } | 434 | } |
| 433 | 435 | ||
| 434 | if (call_undef_hook(regs, instr) == 0) | 436 | if (call_undef_hook(regs, instr) == 0) |
| 435 | return; | 437 | return; |
| 436 | 438 | ||
| 439 | die_sig: | ||
| 437 | #ifdef CONFIG_DEBUG_USER | 440 | #ifdef CONFIG_DEBUG_USER |
| 438 | if (user_debug & UDBG_UNDEFINED) { | 441 | if (user_debug & UDBG_UNDEFINED) { |
| 439 | printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n", | 442 | printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n", |
diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c index d6dacc69254e..395d5fbb8fa2 100644 --- a/arch/arm/lib/delay.c +++ b/arch/arm/lib/delay.c | |||
| @@ -59,6 +59,7 @@ void __init init_current_timer_delay(unsigned long freq) | |||
| 59 | { | 59 | { |
| 60 | pr_info("Switching to timer-based delay loop\n"); | 60 | pr_info("Switching to timer-based delay loop\n"); |
| 61 | lpj_fine = freq / HZ; | 61 | lpj_fine = freq / HZ; |
| 62 | loops_per_jiffy = lpj_fine; | ||
| 62 | arm_delay_ops.delay = __timer_delay; | 63 | arm_delay_ops.delay = __timer_delay; |
| 63 | arm_delay_ops.const_udelay = __timer_const_udelay; | 64 | arm_delay_ops.const_udelay = __timer_const_udelay; |
| 64 | arm_delay_ops.udelay = __timer_udelay; | 65 | arm_delay_ops.udelay = __timer_udelay; |
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index 11093a7c3e32..9b06bb41fca6 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S | |||
| @@ -16,8 +16,9 @@ | |||
| 16 | * __get_user_X | 16 | * __get_user_X |
| 17 | * | 17 | * |
| 18 | * Inputs: r0 contains the address | 18 | * Inputs: r0 contains the address |
| 19 | * r1 contains the address limit, which must be preserved | ||
| 19 | * Outputs: r0 is the error code | 20 | * Outputs: r0 is the error code |
| 20 | * r2, r3 contains the zero-extended value | 21 | * r2 contains the zero-extended value |
| 21 | * lr corrupted | 22 | * lr corrupted |
| 22 | * | 23 | * |
| 23 | * No other registers must be altered. (see <asm/uaccess.h> | 24 | * No other registers must be altered. (see <asm/uaccess.h> |
| @@ -27,33 +28,39 @@ | |||
| 27 | * Note also that it is intended that __get_user_bad is not global. | 28 | * Note also that it is intended that __get_user_bad is not global. |
| 28 | */ | 29 | */ |
| 29 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <asm/assembler.h> | ||
| 30 | #include <asm/errno.h> | 32 | #include <asm/errno.h> |
| 31 | #include <asm/domain.h> | 33 | #include <asm/domain.h> |
| 32 | 34 | ||
| 33 | ENTRY(__get_user_1) | 35 | ENTRY(__get_user_1) |
| 36 | check_uaccess r0, 1, r1, r2, __get_user_bad | ||
| 34 | 1: TUSER(ldrb) r2, [r0] | 37 | 1: TUSER(ldrb) r2, [r0] |
| 35 | mov r0, #0 | 38 | mov r0, #0 |
| 36 | mov pc, lr | 39 | mov pc, lr |
| 37 | ENDPROC(__get_user_1) | 40 | ENDPROC(__get_user_1) |
| 38 | 41 | ||
| 39 | ENTRY(__get_user_2) | 42 | ENTRY(__get_user_2) |
| 40 | #ifdef CONFIG_THUMB2_KERNEL | 43 | check_uaccess r0, 2, r1, r2, __get_user_bad |
| 41 | 2: TUSER(ldrb) r2, [r0] | 44 | #ifdef CONFIG_CPU_USE_DOMAINS |
| 42 | 3: TUSER(ldrb) r3, [r0, #1] | 45 | rb .req ip |
| 46 | 2: ldrbt r2, [r0], #1 | ||
| 47 | 3: ldrbt rb, [r0], #0 | ||
| 43 | #else | 48 | #else |
| 44 | 2: TUSER(ldrb) r2, [r0], #1 | 49 | rb .req r0 |
| 45 | 3: TUSER(ldrb) r3, [r0] | 50 | 2: ldrb r2, [r0] |
| 51 | 3: ldrb rb, [r0, #1] | ||
| 46 | #endif | 52 | #endif |
| 47 | #ifndef __ARMEB__ | 53 | #ifndef __ARMEB__ |
| 48 | orr r2, r2, r3, lsl #8 | 54 | orr r2, r2, rb, lsl #8 |
| 49 | #else | 55 | #else |
| 50 | orr r2, r3, r2, lsl #8 | 56 | orr r2, rb, r2, lsl #8 |
| 51 | #endif | 57 | #endif |
| 52 | mov r0, #0 | 58 | mov r0, #0 |
| 53 | mov pc, lr | 59 | mov pc, lr |
| 54 | ENDPROC(__get_user_2) | 60 | ENDPROC(__get_user_2) |
| 55 | 61 | ||
| 56 | ENTRY(__get_user_4) | 62 | ENTRY(__get_user_4) |
| 63 | check_uaccess r0, 4, r1, r2, __get_user_bad | ||
| 57 | 4: TUSER(ldr) r2, [r0] | 64 | 4: TUSER(ldr) r2, [r0] |
| 58 | mov r0, #0 | 65 | mov r0, #0 |
| 59 | mov pc, lr | 66 | mov pc, lr |
diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S index 7db25990c589..3d73dcb959b0 100644 --- a/arch/arm/lib/putuser.S +++ b/arch/arm/lib/putuser.S | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | * __put_user_X | 16 | * __put_user_X |
| 17 | * | 17 | * |
| 18 | * Inputs: r0 contains the address | 18 | * Inputs: r0 contains the address |
| 19 | * r1 contains the address limit, which must be preserved | ||
| 19 | * r2, r3 contains the value | 20 | * r2, r3 contains the value |
| 20 | * Outputs: r0 is the error code | 21 | * Outputs: r0 is the error code |
| 21 | * lr corrupted | 22 | * lr corrupted |
| @@ -27,16 +28,19 @@ | |||
| 27 | * Note also that it is intended that __put_user_bad is not global. | 28 | * Note also that it is intended that __put_user_bad is not global. |
| 28 | */ | 29 | */ |
| 29 | #include <linux/linkage.h> | 30 | #include <linux/linkage.h> |
| 31 | #include <asm/assembler.h> | ||
| 30 | #include <asm/errno.h> | 32 | #include <asm/errno.h> |
| 31 | #include <asm/domain.h> | 33 | #include <asm/domain.h> |
| 32 | 34 | ||
| 33 | ENTRY(__put_user_1) | 35 | ENTRY(__put_user_1) |
| 36 | check_uaccess r0, 1, r1, ip, __put_user_bad | ||
| 34 | 1: TUSER(strb) r2, [r0] | 37 | 1: TUSER(strb) r2, [r0] |
| 35 | mov r0, #0 | 38 | mov r0, #0 |
| 36 | mov pc, lr | 39 | mov pc, lr |
| 37 | ENDPROC(__put_user_1) | 40 | ENDPROC(__put_user_1) |
| 38 | 41 | ||
| 39 | ENTRY(__put_user_2) | 42 | ENTRY(__put_user_2) |
| 43 | check_uaccess r0, 2, r1, ip, __put_user_bad | ||
| 40 | mov ip, r2, lsr #8 | 44 | mov ip, r2, lsr #8 |
| 41 | #ifdef CONFIG_THUMB2_KERNEL | 45 | #ifdef CONFIG_THUMB2_KERNEL |
| 42 | #ifndef __ARMEB__ | 46 | #ifndef __ARMEB__ |
| @@ -60,12 +64,14 @@ ENTRY(__put_user_2) | |||
| 60 | ENDPROC(__put_user_2) | 64 | ENDPROC(__put_user_2) |
| 61 | 65 | ||
| 62 | ENTRY(__put_user_4) | 66 | ENTRY(__put_user_4) |
| 67 | check_uaccess r0, 4, r1, ip, __put_user_bad | ||
| 63 | 4: TUSER(str) r2, [r0] | 68 | 4: TUSER(str) r2, [r0] |
| 64 | mov r0, #0 | 69 | mov r0, #0 |
| 65 | mov pc, lr | 70 | mov pc, lr |
| 66 | ENDPROC(__put_user_4) | 71 | ENDPROC(__put_user_4) |
| 67 | 72 | ||
| 68 | ENTRY(__put_user_8) | 73 | ENTRY(__put_user_8) |
| 74 | check_uaccess r0, 8, r1, ip, __put_user_bad | ||
| 69 | #ifdef CONFIG_THUMB2_KERNEL | 75 | #ifdef CONFIG_THUMB2_KERNEL |
| 70 | 5: TUSER(str) r2, [r0] | 76 | 5: TUSER(str) r2, [r0] |
| 71 | 6: TUSER(str) r3, [r0, #4] | 77 | 6: TUSER(str) r3, [r0, #4] |
diff --git a/arch/arm/mach-at91/at91rm9200_time.c b/arch/arm/mach-at91/at91rm9200_time.c index 104ca40d8d18..aaa443b48c91 100644 --- a/arch/arm/mach-at91/at91rm9200_time.c +++ b/arch/arm/mach-at91/at91rm9200_time.c | |||
| @@ -197,7 +197,7 @@ void __init at91rm9200_timer_init(void) | |||
| 197 | at91_st_read(AT91_ST_SR); | 197 | at91_st_read(AT91_ST_SR); |
| 198 | 198 | ||
| 199 | /* Make IRQs happen for the system timer */ | 199 | /* Make IRQs happen for the system timer */ |
| 200 | setup_irq(AT91_ID_SYS, &at91rm9200_timer_irq); | 200 | setup_irq(NR_IRQS_LEGACY + AT91_ID_SYS, &at91rm9200_timer_irq); |
| 201 | 201 | ||
| 202 | /* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used | 202 | /* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used |
| 203 | * directly for the clocksource and all clockevents, after adjusting | 203 | * directly for the clocksource and all clockevents, after adjusting |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 7b9c2ba396ed..bce572a530ef 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
| @@ -726,6 +726,8 @@ static struct resource rtt_resources[] = { | |||
| 726 | .flags = IORESOURCE_MEM, | 726 | .flags = IORESOURCE_MEM, |
| 727 | }, { | 727 | }, { |
| 728 | .flags = IORESOURCE_MEM, | 728 | .flags = IORESOURCE_MEM, |
| 729 | }, { | ||
| 730 | .flags = IORESOURCE_IRQ, | ||
| 729 | }, | 731 | }, |
| 730 | }; | 732 | }; |
| 731 | 733 | ||
| @@ -744,10 +746,12 @@ static void __init at91_add_device_rtt_rtc(void) | |||
| 744 | * The second resource is needed: | 746 | * The second resource is needed: |
| 745 | * GPBR will serve as the storage for RTC time offset | 747 | * GPBR will serve as the storage for RTC time offset |
| 746 | */ | 748 | */ |
| 747 | at91sam9260_rtt_device.num_resources = 2; | 749 | at91sam9260_rtt_device.num_resources = 3; |
| 748 | rtt_resources[1].start = AT91SAM9260_BASE_GPBR + | 750 | rtt_resources[1].start = AT91SAM9260_BASE_GPBR + |
| 749 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; | 751 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 750 | rtt_resources[1].end = rtt_resources[1].start + 3; | 752 | rtt_resources[1].end = rtt_resources[1].start + 3; |
| 753 | rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 754 | rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 751 | } | 755 | } |
| 752 | #else | 756 | #else |
| 753 | static void __init at91_add_device_rtt_rtc(void) | 757 | static void __init at91_add_device_rtt_rtc(void) |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 8df5c1bdff92..bc2590d712d0 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
| @@ -609,6 +609,8 @@ static struct resource rtt_resources[] = { | |||
| 609 | .flags = IORESOURCE_MEM, | 609 | .flags = IORESOURCE_MEM, |
| 610 | }, { | 610 | }, { |
| 611 | .flags = IORESOURCE_MEM, | 611 | .flags = IORESOURCE_MEM, |
| 612 | }, { | ||
| 613 | .flags = IORESOURCE_IRQ, | ||
| 612 | } | 614 | } |
| 613 | }; | 615 | }; |
| 614 | 616 | ||
| @@ -626,10 +628,12 @@ static void __init at91_add_device_rtt_rtc(void) | |||
| 626 | * The second resource is needed: | 628 | * The second resource is needed: |
| 627 | * GPBR will serve as the storage for RTC time offset | 629 | * GPBR will serve as the storage for RTC time offset |
| 628 | */ | 630 | */ |
| 629 | at91sam9261_rtt_device.num_resources = 2; | 631 | at91sam9261_rtt_device.num_resources = 3; |
| 630 | rtt_resources[1].start = AT91SAM9261_BASE_GPBR + | 632 | rtt_resources[1].start = AT91SAM9261_BASE_GPBR + |
| 631 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; | 633 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 632 | rtt_resources[1].end = rtt_resources[1].start + 3; | 634 | rtt_resources[1].end = rtt_resources[1].start + 3; |
| 635 | rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 636 | rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 633 | } | 637 | } |
| 634 | #else | 638 | #else |
| 635 | static void __init at91_add_device_rtt_rtc(void) | 639 | static void __init at91_add_device_rtt_rtc(void) |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index eb6bbf86fb9f..9b6ca734f1a9 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
| @@ -990,6 +990,8 @@ static struct resource rtt0_resources[] = { | |||
| 990 | .flags = IORESOURCE_MEM, | 990 | .flags = IORESOURCE_MEM, |
| 991 | }, { | 991 | }, { |
| 992 | .flags = IORESOURCE_MEM, | 992 | .flags = IORESOURCE_MEM, |
| 993 | }, { | ||
| 994 | .flags = IORESOURCE_IRQ, | ||
| 993 | } | 995 | } |
| 994 | }; | 996 | }; |
| 995 | 997 | ||
| @@ -1006,6 +1008,8 @@ static struct resource rtt1_resources[] = { | |||
| 1006 | .flags = IORESOURCE_MEM, | 1008 | .flags = IORESOURCE_MEM, |
| 1007 | }, { | 1009 | }, { |
| 1008 | .flags = IORESOURCE_MEM, | 1010 | .flags = IORESOURCE_MEM, |
| 1011 | }, { | ||
| 1012 | .flags = IORESOURCE_IRQ, | ||
| 1009 | } | 1013 | } |
| 1010 | }; | 1014 | }; |
| 1011 | 1015 | ||
| @@ -1027,14 +1031,14 @@ static void __init at91_add_device_rtt_rtc(void) | |||
| 1027 | * The second resource is needed only for the chosen RTT: | 1031 | * The second resource is needed only for the chosen RTT: |
| 1028 | * GPBR will serve as the storage for RTC time offset | 1032 | * GPBR will serve as the storage for RTC time offset |
| 1029 | */ | 1033 | */ |
| 1030 | at91sam9263_rtt0_device.num_resources = 2; | 1034 | at91sam9263_rtt0_device.num_resources = 3; |
| 1031 | at91sam9263_rtt1_device.num_resources = 1; | 1035 | at91sam9263_rtt1_device.num_resources = 1; |
| 1032 | pdev = &at91sam9263_rtt0_device; | 1036 | pdev = &at91sam9263_rtt0_device; |
| 1033 | r = rtt0_resources; | 1037 | r = rtt0_resources; |
| 1034 | break; | 1038 | break; |
| 1035 | case 1: | 1039 | case 1: |
| 1036 | at91sam9263_rtt0_device.num_resources = 1; | 1040 | at91sam9263_rtt0_device.num_resources = 1; |
| 1037 | at91sam9263_rtt1_device.num_resources = 2; | 1041 | at91sam9263_rtt1_device.num_resources = 3; |
| 1038 | pdev = &at91sam9263_rtt1_device; | 1042 | pdev = &at91sam9263_rtt1_device; |
| 1039 | r = rtt1_resources; | 1043 | r = rtt1_resources; |
| 1040 | break; | 1044 | break; |
| @@ -1047,6 +1051,8 @@ static void __init at91_add_device_rtt_rtc(void) | |||
| 1047 | pdev->name = "rtc-at91sam9"; | 1051 | pdev->name = "rtc-at91sam9"; |
| 1048 | r[1].start = AT91SAM9263_BASE_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; | 1052 | r[1].start = AT91SAM9263_BASE_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 1049 | r[1].end = r[1].start + 3; | 1053 | r[1].end = r[1].start + 3; |
| 1054 | r[2].start = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 1055 | r[2].end = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 1050 | } | 1056 | } |
| 1051 | #else | 1057 | #else |
| 1052 | static void __init at91_add_device_rtt_rtc(void) | 1058 | static void __init at91_add_device_rtt_rtc(void) |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 06073996a382..1b47319ca00b 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
| @@ -1293,6 +1293,8 @@ static struct resource rtt_resources[] = { | |||
| 1293 | .flags = IORESOURCE_MEM, | 1293 | .flags = IORESOURCE_MEM, |
| 1294 | }, { | 1294 | }, { |
| 1295 | .flags = IORESOURCE_MEM, | 1295 | .flags = IORESOURCE_MEM, |
| 1296 | }, { | ||
| 1297 | .flags = IORESOURCE_IRQ, | ||
| 1296 | } | 1298 | } |
| 1297 | }; | 1299 | }; |
| 1298 | 1300 | ||
| @@ -1310,10 +1312,12 @@ static void __init at91_add_device_rtt_rtc(void) | |||
| 1310 | * The second resource is needed: | 1312 | * The second resource is needed: |
| 1311 | * GPBR will serve as the storage for RTC time offset | 1313 | * GPBR will serve as the storage for RTC time offset |
| 1312 | */ | 1314 | */ |
| 1313 | at91sam9g45_rtt_device.num_resources = 2; | 1315 | at91sam9g45_rtt_device.num_resources = 3; |
| 1314 | rtt_resources[1].start = AT91SAM9G45_BASE_GPBR + | 1316 | rtt_resources[1].start = AT91SAM9G45_BASE_GPBR + |
| 1315 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; | 1317 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 1316 | rtt_resources[1].end = rtt_resources[1].start + 3; | 1318 | rtt_resources[1].end = rtt_resources[1].start + 3; |
| 1319 | rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 1320 | rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 1317 | } | 1321 | } |
| 1318 | #else | 1322 | #else |
| 1319 | static void __init at91_add_device_rtt_rtc(void) | 1323 | static void __init at91_add_device_rtt_rtc(void) |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index f09fff932172..b3d365dadef5 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
| @@ -688,6 +688,8 @@ static struct resource rtt_resources[] = { | |||
| 688 | .flags = IORESOURCE_MEM, | 688 | .flags = IORESOURCE_MEM, |
| 689 | }, { | 689 | }, { |
| 690 | .flags = IORESOURCE_MEM, | 690 | .flags = IORESOURCE_MEM, |
| 691 | }, { | ||
| 692 | .flags = IORESOURCE_IRQ, | ||
| 691 | } | 693 | } |
| 692 | }; | 694 | }; |
| 693 | 695 | ||
| @@ -705,10 +707,12 @@ static void __init at91_add_device_rtt_rtc(void) | |||
| 705 | * The second resource is needed: | 707 | * The second resource is needed: |
| 706 | * GPBR will serve as the storage for RTC time offset | 708 | * GPBR will serve as the storage for RTC time offset |
| 707 | */ | 709 | */ |
| 708 | at91sam9rl_rtt_device.num_resources = 2; | 710 | at91sam9rl_rtt_device.num_resources = 3; |
| 709 | rtt_resources[1].start = AT91SAM9RL_BASE_GPBR + | 711 | rtt_resources[1].start = AT91SAM9RL_BASE_GPBR + |
| 710 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; | 712 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 711 | rtt_resources[1].end = rtt_resources[1].start + 3; | 713 | rtt_resources[1].end = rtt_resources[1].start + 3; |
| 714 | rtt_resources[2].start = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 715 | rtt_resources[2].end = NR_IRQS_LEGACY + AT91_ID_SYS; | ||
| 712 | } | 716 | } |
| 713 | #else | 717 | #else |
| 714 | static void __init at91_add_device_rtt_rtc(void) | 718 | static void __init at91_add_device_rtt_rtc(void) |
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c index de2ec6b8fea7..188c82971ebd 100644 --- a/arch/arm/mach-at91/clock.c +++ b/arch/arm/mach-at91/clock.c | |||
| @@ -63,6 +63,12 @@ EXPORT_SYMBOL_GPL(at91_pmc_base); | |||
| 63 | 63 | ||
| 64 | #define cpu_has_300M_plla() (cpu_is_at91sam9g10()) | 64 | #define cpu_has_300M_plla() (cpu_is_at91sam9g10()) |
| 65 | 65 | ||
| 66 | #define cpu_has_240M_plla() (cpu_is_at91sam9261() \ | ||
| 67 | || cpu_is_at91sam9263() \ | ||
| 68 | || cpu_is_at91sam9rl()) | ||
| 69 | |||
| 70 | #define cpu_has_210M_plla() (cpu_is_at91sam9260()) | ||
| 71 | |||
| 66 | #define cpu_has_pllb() (!(cpu_is_at91sam9rl() \ | 72 | #define cpu_has_pllb() (!(cpu_is_at91sam9rl() \ |
| 67 | || cpu_is_at91sam9g45() \ | 73 | || cpu_is_at91sam9g45() \ |
| 68 | || cpu_is_at91sam9x5() \ | 74 | || cpu_is_at91sam9x5() \ |
| @@ -706,6 +712,12 @@ static int __init at91_pmc_init(unsigned long main_clock) | |||
| 706 | } else if (cpu_has_800M_plla()) { | 712 | } else if (cpu_has_800M_plla()) { |
| 707 | if (plla.rate_hz > 800000000) | 713 | if (plla.rate_hz > 800000000) |
| 708 | pll_overclock = true; | 714 | pll_overclock = true; |
| 715 | } else if (cpu_has_240M_plla()) { | ||
| 716 | if (plla.rate_hz > 240000000) | ||
| 717 | pll_overclock = true; | ||
| 718 | } else if (cpu_has_210M_plla()) { | ||
| 719 | if (plla.rate_hz > 210000000) | ||
| 720 | pll_overclock = true; | ||
| 709 | } else { | 721 | } else { |
| 710 | if (plla.rate_hz > 209000000) | 722 | if (plla.rate_hz > 209000000) |
| 711 | pll_overclock = true; | 723 | pll_overclock = true; |
diff --git a/arch/arm/mach-dove/common.c b/arch/arm/mach-dove/common.c index 4db5de54b6a7..6321567d8eaa 100644 --- a/arch/arm/mach-dove/common.c +++ b/arch/arm/mach-dove/common.c | |||
| @@ -102,7 +102,8 @@ void __init dove_ehci1_init(void) | |||
| 102 | void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) | 102 | void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
| 103 | { | 103 | { |
| 104 | orion_ge00_init(eth_data, DOVE_GE00_PHYS_BASE, | 104 | orion_ge00_init(eth_data, DOVE_GE00_PHYS_BASE, |
| 105 | IRQ_DOVE_GE00_SUM, IRQ_DOVE_GE00_ERR); | 105 | IRQ_DOVE_GE00_SUM, IRQ_DOVE_GE00_ERR, |
| 106 | 1600); | ||
| 106 | } | 107 | } |
| 107 | 108 | ||
| 108 | /***************************************************************************** | 109 | /***************************************************************************** |
diff --git a/arch/arm/mach-exynos/mach-origen.c b/arch/arm/mach-exynos/mach-origen.c index 5ca80307d6d7..4e574c24581c 100644 --- a/arch/arm/mach-exynos/mach-origen.c +++ b/arch/arm/mach-exynos/mach-origen.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <plat/backlight.h> | 42 | #include <plat/backlight.h> |
| 43 | #include <plat/fb.h> | 43 | #include <plat/fb.h> |
| 44 | #include <plat/mfc.h> | 44 | #include <plat/mfc.h> |
| 45 | #include <plat/hdmi.h> | ||
| 45 | 46 | ||
| 46 | #include <mach/ohci.h> | 47 | #include <mach/ohci.h> |
| 47 | #include <mach/map.h> | 48 | #include <mach/map.h> |
| @@ -734,6 +735,11 @@ static void __init origen_bt_setup(void) | |||
| 734 | s3c_gpio_setpull(EXYNOS4_GPX2(2), S3C_GPIO_PULL_NONE); | 735 | s3c_gpio_setpull(EXYNOS4_GPX2(2), S3C_GPIO_PULL_NONE); |
| 735 | } | 736 | } |
| 736 | 737 | ||
| 738 | /* I2C module and id for HDMIPHY */ | ||
| 739 | static struct i2c_board_info hdmiphy_info = { | ||
| 740 | I2C_BOARD_INFO("hdmiphy-exynos4210", 0x38), | ||
| 741 | }; | ||
| 742 | |||
| 737 | static void s5p_tv_setup(void) | 743 | static void s5p_tv_setup(void) |
| 738 | { | 744 | { |
| 739 | /* Direct HPD to HDMI chip */ | 745 | /* Direct HPD to HDMI chip */ |
| @@ -781,6 +787,7 @@ static void __init origen_machine_init(void) | |||
| 781 | 787 | ||
| 782 | s5p_tv_setup(); | 788 | s5p_tv_setup(); |
| 783 | s5p_i2c_hdmiphy_set_platdata(NULL); | 789 | s5p_i2c_hdmiphy_set_platdata(NULL); |
| 790 | s5p_hdmi_set_platdata(&hdmiphy_info, NULL, 0); | ||
| 784 | 791 | ||
| 785 | #ifdef CONFIG_DRM_EXYNOS | 792 | #ifdef CONFIG_DRM_EXYNOS |
| 786 | s5p_device_fimd0.dev.platform_data = &drm_fimd_pdata; | 793 | s5p_device_fimd0.dev.platform_data = &drm_fimd_pdata; |
diff --git a/arch/arm/mach-exynos/mach-smdkv310.c b/arch/arm/mach-exynos/mach-smdkv310.c index 3cfa688d274a..73f2bce097e1 100644 --- a/arch/arm/mach-exynos/mach-smdkv310.c +++ b/arch/arm/mach-exynos/mach-smdkv310.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <plat/mfc.h> | 40 | #include <plat/mfc.h> |
| 41 | #include <plat/ehci.h> | 41 | #include <plat/ehci.h> |
| 42 | #include <plat/clock.h> | 42 | #include <plat/clock.h> |
| 43 | #include <plat/hdmi.h> | ||
| 43 | 44 | ||
| 44 | #include <mach/map.h> | 45 | #include <mach/map.h> |
| 45 | #include <mach/ohci.h> | 46 | #include <mach/ohci.h> |
| @@ -354,6 +355,11 @@ static struct platform_pwm_backlight_data smdkv310_bl_data = { | |||
| 354 | .pwm_period_ns = 1000, | 355 | .pwm_period_ns = 1000, |
| 355 | }; | 356 | }; |
| 356 | 357 | ||
| 358 | /* I2C module and id for HDMIPHY */ | ||
| 359 | static struct i2c_board_info hdmiphy_info = { | ||
| 360 | I2C_BOARD_INFO("hdmiphy-exynos4210", 0x38), | ||
| 361 | }; | ||
| 362 | |||
| 357 | static void s5p_tv_setup(void) | 363 | static void s5p_tv_setup(void) |
| 358 | { | 364 | { |
| 359 | /* direct HPD to HDMI chip */ | 365 | /* direct HPD to HDMI chip */ |
| @@ -388,6 +394,7 @@ static void __init smdkv310_machine_init(void) | |||
| 388 | 394 | ||
| 389 | s5p_tv_setup(); | 395 | s5p_tv_setup(); |
| 390 | s5p_i2c_hdmiphy_set_platdata(NULL); | 396 | s5p_i2c_hdmiphy_set_platdata(NULL); |
| 397 | s5p_hdmi_set_platdata(&hdmiphy_info, NULL, 0); | ||
| 391 | 398 | ||
| 392 | samsung_keypad_set_platdata(&smdkv310_keypad_data); | 399 | samsung_keypad_set_platdata(&smdkv310_keypad_data); |
| 393 | 400 | ||
diff --git a/arch/arm/mach-gemini/irq.c b/arch/arm/mach-gemini/irq.c index ca70e5fcc7ac..020852d3bdd8 100644 --- a/arch/arm/mach-gemini/irq.c +++ b/arch/arm/mach-gemini/irq.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/sched.h> | 17 | #include <linux/sched.h> |
| 18 | #include <asm/irq.h> | 18 | #include <asm/irq.h> |
| 19 | #include <asm/mach/irq.h> | 19 | #include <asm/mach/irq.h> |
| 20 | #include <asm/system_misc.h> | ||
| 20 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
| 21 | 22 | ||
| 22 | #define IRQ_SOURCE(base_addr) (base_addr + 0x00) | 23 | #define IRQ_SOURCE(base_addr) (base_addr + 0x00) |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 07f7c226e4cf..d004d37ad9d8 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
| @@ -9,7 +9,8 @@ obj-$(CONFIG_SOC_IMX27) += clk-imx27.o mm-imx27.o ehci-imx27.o | |||
| 9 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clk-imx31.o iomux-imx31.o ehci-imx31.o pm-imx3.o | 9 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clk-imx31.o iomux-imx31.o ehci-imx31.o pm-imx3.o |
| 10 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clk-imx35.o ehci-imx35.o pm-imx3.o | 10 | obj-$(CONFIG_SOC_IMX35) += mm-imx3.o cpu-imx35.o clk-imx35.o ehci-imx35.o pm-imx3.o |
| 11 | 11 | ||
| 12 | obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o pm-imx5.o cpu_op-mx51.o | 12 | imx5-pm-$(CONFIG_PM) += pm-imx5.o |
| 13 | obj-$(CONFIG_SOC_IMX5) += cpu-imx5.o mm-imx5.o clk-imx51-imx53.o ehci-imx5.o $(imx5-pm-y) cpu_op-mx51.o | ||
| 13 | 14 | ||
| 14 | obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \ | 15 | obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \ |
| 15 | clk-pfd.o clk-busy.o | 16 | clk-pfd.o clk-busy.o |
| @@ -70,14 +71,13 @@ obj-$(CONFIG_DEBUG_LL) += lluart.o | |||
| 70 | obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o | 71 | obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o |
| 71 | obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o | 72 | obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o |
| 72 | obj-$(CONFIG_HAVE_IMX_SRC) += src.o | 73 | obj-$(CONFIG_HAVE_IMX_SRC) += src.o |
| 73 | obj-$(CONFIG_CPU_V7) += head-v7.o | 74 | AFLAGS_headsmp.o :=-Wa,-march=armv7-a |
| 74 | AFLAGS_head-v7.o :=-Wa,-march=armv7-a | 75 | obj-$(CONFIG_SMP) += headsmp.o platsmp.o |
| 75 | obj-$(CONFIG_SMP) += platsmp.o | ||
| 76 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 76 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
| 77 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o | 77 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o |
| 78 | 78 | ||
| 79 | ifeq ($(CONFIG_PM),y) | 79 | ifeq ($(CONFIG_PM),y) |
| 80 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o | 80 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o |
| 81 | endif | 81 | endif |
| 82 | 82 | ||
| 83 | # i.MX5 based machines | 83 | # i.MX5 based machines |
diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c index fdd8cc87c9fe..d20d4795f4ea 100644 --- a/arch/arm/mach-imx/clk-imx25.c +++ b/arch/arm/mach-imx/clk-imx25.c | |||
| @@ -222,10 +222,8 @@ int __init mx25_clocks_init(void) | |||
| 222 | clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0"); | 222 | clk_register_clkdev(clk[lcdc_ipg], "ipg", "imx-fb.0"); |
| 223 | clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0"); | 223 | clk_register_clkdev(clk[lcdc_ahb], "ahb", "imx-fb.0"); |
| 224 | clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0"); | 224 | clk_register_clkdev(clk[wdt_ipg], NULL, "imx2-wdt.0"); |
| 225 | clk_register_clkdev(clk[ssi1_ipg_per], "per", "imx-ssi.0"); | 225 | clk_register_clkdev(clk[ssi1_ipg], NULL, "imx-ssi.0"); |
| 226 | clk_register_clkdev(clk[ssi1_ipg], "ipg", "imx-ssi.0"); | 226 | clk_register_clkdev(clk[ssi2_ipg], NULL, "imx-ssi.1"); |
| 227 | clk_register_clkdev(clk[ssi2_ipg_per], "per", "imx-ssi.1"); | ||
| 228 | clk_register_clkdev(clk[ssi2_ipg], "ipg", "imx-ssi.1"); | ||
| 229 | clk_register_clkdev(clk[esdhc1_ipg_per], "per", "sdhci-esdhc-imx25.0"); | 227 | clk_register_clkdev(clk[esdhc1_ipg_per], "per", "sdhci-esdhc-imx25.0"); |
| 230 | clk_register_clkdev(clk[esdhc1_ipg], "ipg", "sdhci-esdhc-imx25.0"); | 228 | clk_register_clkdev(clk[esdhc1_ipg], "ipg", "sdhci-esdhc-imx25.0"); |
| 231 | clk_register_clkdev(clk[esdhc1_ahb], "ahb", "sdhci-esdhc-imx25.0"); | 229 | clk_register_clkdev(clk[esdhc1_ahb], "ahb", "sdhci-esdhc-imx25.0"); |
| @@ -243,6 +241,6 @@ int __init mx25_clocks_init(void) | |||
| 243 | clk_register_clkdev(clk[sdma_ahb], "ahb", "imx35-sdma"); | 241 | clk_register_clkdev(clk[sdma_ahb], "ahb", "imx35-sdma"); |
| 244 | clk_register_clkdev(clk[iim_ipg], "iim", NULL); | 242 | clk_register_clkdev(clk[iim_ipg], "iim", NULL); |
| 245 | 243 | ||
| 246 | mxc_timer_init(MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); | 244 | mxc_timer_init(MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), MX25_INT_GPT1); |
| 247 | return 0; | 245 | return 0; |
| 248 | } | 246 | } |
diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c index c6422fb10bae..65fb8bcd86cb 100644 --- a/arch/arm/mach-imx/clk-imx35.c +++ b/arch/arm/mach-imx/clk-imx35.c | |||
| @@ -230,10 +230,8 @@ int __init mx35_clocks_init() | |||
| 230 | clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb"); | 230 | clk_register_clkdev(clk[ipu_gate], NULL, "mx3_sdc_fb"); |
| 231 | clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1"); | 231 | clk_register_clkdev(clk[owire_gate], NULL, "mxc_w1"); |
| 232 | clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma"); | 232 | clk_register_clkdev(clk[sdma_gate], NULL, "imx35-sdma"); |
| 233 | clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.0"); | 233 | clk_register_clkdev(clk[ssi1_gate], NULL, "imx-ssi.0"); |
| 234 | clk_register_clkdev(clk[ssi1_div_post], "per", "imx-ssi.0"); | 234 | clk_register_clkdev(clk[ssi2_gate], NULL, "imx-ssi.1"); |
| 235 | clk_register_clkdev(clk[ipg], "ipg", "imx-ssi.1"); | ||
| 236 | clk_register_clkdev(clk[ssi2_div_post], "per", "imx-ssi.1"); | ||
| 237 | /* i.mx35 has the i.mx21 type uart */ | 235 | /* i.mx35 has the i.mx21 type uart */ |
| 238 | clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); | 236 | clk_register_clkdev(clk[uart1_gate], "per", "imx21-uart.0"); |
| 239 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.0"); | 237 | clk_register_clkdev(clk[ipg], "ipg", "imx21-uart.0"); |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index ea89520b6e22..4233d9e3531d 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
| @@ -152,7 +152,7 @@ enum mx6q_clks { | |||
| 152 | ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3, | 152 | ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3, |
| 153 | usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg, | 153 | usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg, |
| 154 | pll4_audio, pll5_video, pll6_mlb, pll7_usb_host, pll8_enet, ssi1_ipg, | 154 | pll4_audio, pll5_video, pll6_mlb, pll7_usb_host, pll8_enet, ssi1_ipg, |
| 155 | ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, | 155 | ssi2_ipg, ssi3_ipg, rom, usbphy1, usbphy2, ldb_di0_div_3_5, ldb_di1_div_3_5, |
| 156 | clk_max | 156 | clk_max |
| 157 | }; | 157 | }; |
| 158 | 158 | ||
| @@ -288,8 +288,10 @@ int __init mx6q_clocks_init(void) | |||
| 288 | clk[gpu3d_shader] = imx_clk_divider("gpu3d_shader", "gpu3d_shader_sel", base + 0x18, 29, 3); | 288 | clk[gpu3d_shader] = imx_clk_divider("gpu3d_shader", "gpu3d_shader_sel", base + 0x18, 29, 3); |
| 289 | clk[ipu1_podf] = imx_clk_divider("ipu1_podf", "ipu1_sel", base + 0x3c, 11, 3); | 289 | clk[ipu1_podf] = imx_clk_divider("ipu1_podf", "ipu1_sel", base + 0x3c, 11, 3); |
| 290 | clk[ipu2_podf] = imx_clk_divider("ipu2_podf", "ipu2_sel", base + 0x3c, 16, 3); | 290 | clk[ipu2_podf] = imx_clk_divider("ipu2_podf", "ipu2_sel", base + 0x3c, 16, 3); |
| 291 | clk[ldb_di0_podf] = imx_clk_divider("ldb_di0_podf", "ldb_di0_sel", base + 0x20, 10, 1); | 291 | clk[ldb_di0_div_3_5] = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7); |
| 292 | clk[ldb_di1_podf] = imx_clk_divider("ldb_di1_podf", "ldb_di1_sel", base + 0x20, 11, 1); | 292 | clk[ldb_di0_podf] = imx_clk_divider("ldb_di0_podf", "ldb_di0_div_3_5", base + 0x20, 10, 1); |
| 293 | clk[ldb_di1_div_3_5] = imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1_sel", 2, 7); | ||
| 294 | clk[ldb_di1_podf] = imx_clk_divider("ldb_di1_podf", "ldb_di1_div_3_5", base + 0x20, 11, 1); | ||
| 293 | clk[ipu1_di0_pre] = imx_clk_divider("ipu1_di0_pre", "ipu1_di0_pre_sel", base + 0x34, 3, 3); | 295 | clk[ipu1_di0_pre] = imx_clk_divider("ipu1_di0_pre", "ipu1_di0_pre_sel", base + 0x34, 3, 3); |
| 294 | clk[ipu1_di1_pre] = imx_clk_divider("ipu1_di1_pre", "ipu1_di1_pre_sel", base + 0x34, 12, 3); | 296 | clk[ipu1_di1_pre] = imx_clk_divider("ipu1_di1_pre", "ipu1_di1_pre_sel", base + 0x34, 12, 3); |
| 295 | clk[ipu2_di0_pre] = imx_clk_divider("ipu2_di0_pre", "ipu2_di0_pre_sel", base + 0x38, 3, 3); | 297 | clk[ipu2_di0_pre] = imx_clk_divider("ipu2_di0_pre", "ipu2_di0_pre_sel", base + 0x38, 3, 3); |
diff --git a/arch/arm/mach-imx/head-v7.S b/arch/arm/mach-imx/headsmp.S index 7e49deb128a4..7e49deb128a4 100644 --- a/arch/arm/mach-imx/head-v7.S +++ b/arch/arm/mach-imx/headsmp.S | |||
diff --git a/arch/arm/mach-imx/hotplug.c b/arch/arm/mach-imx/hotplug.c index 20ed2d56c1af..f8f7437c83b8 100644 --- a/arch/arm/mach-imx/hotplug.c +++ b/arch/arm/mach-imx/hotplug.c | |||
| @@ -42,22 +42,6 @@ static inline void cpu_enter_lowpower(void) | |||
| 42 | : "cc"); | 42 | : "cc"); |
| 43 | } | 43 | } |
| 44 | 44 | ||
| 45 | static inline void cpu_leave_lowpower(void) | ||
| 46 | { | ||
| 47 | unsigned int v; | ||
| 48 | |||
| 49 | asm volatile( | ||
| 50 | "mrc p15, 0, %0, c1, c0, 0\n" | ||
| 51 | " orr %0, %0, %1\n" | ||
| 52 | " mcr p15, 0, %0, c1, c0, 0\n" | ||
| 53 | " mrc p15, 0, %0, c1, c0, 1\n" | ||
| 54 | " orr %0, %0, %2\n" | ||
| 55 | " mcr p15, 0, %0, c1, c0, 1\n" | ||
| 56 | : "=&r" (v) | ||
| 57 | : "Ir" (CR_C), "Ir" (0x40) | ||
| 58 | : "cc"); | ||
| 59 | } | ||
| 60 | |||
| 61 | /* | 45 | /* |
| 62 | * platform-specific code to shutdown a CPU | 46 | * platform-specific code to shutdown a CPU |
| 63 | * | 47 | * |
| @@ -67,11 +51,10 @@ void platform_cpu_die(unsigned int cpu) | |||
| 67 | { | 51 | { |
| 68 | cpu_enter_lowpower(); | 52 | cpu_enter_lowpower(); |
| 69 | imx_enable_cpu(cpu, false); | 53 | imx_enable_cpu(cpu, false); |
| 70 | cpu_do_idle(); | ||
| 71 | cpu_leave_lowpower(); | ||
| 72 | 54 | ||
| 73 | /* We should never return from idle */ | 55 | /* spin here until hardware takes it down */ |
| 74 | panic("cpu %d unexpectedly exit from shutdown\n", cpu); | 56 | while (1) |
| 57 | ; | ||
| 75 | } | 58 | } |
| 76 | 59 | ||
| 77 | int platform_cpu_disable(unsigned int cpu) | 60 | int platform_cpu_disable(unsigned int cpu) |
diff --git a/arch/arm/mach-imx/mach-armadillo5x0.c b/arch/arm/mach-imx/mach-armadillo5x0.c index 2c6ab3273f9e..5985ed1b8c98 100644 --- a/arch/arm/mach-imx/mach-armadillo5x0.c +++ b/arch/arm/mach-imx/mach-armadillo5x0.c | |||
| @@ -526,7 +526,8 @@ static void __init armadillo5x0_init(void) | |||
| 526 | imx31_add_mxc_nand(&armadillo5x0_nand_board_info); | 526 | imx31_add_mxc_nand(&armadillo5x0_nand_board_info); |
| 527 | 527 | ||
| 528 | /* set NAND page size to 2k if not configured via boot mode pins */ | 528 | /* set NAND page size to 2k if not configured via boot mode pins */ |
| 529 | __raw_writel(__raw_readl(MXC_CCM_RCSR) | (1 << 30), MXC_CCM_RCSR); | 529 | __raw_writel(__raw_readl(mx3_ccm_base + MXC_CCM_RCSR) | |
| 530 | (1 << 30), mx3_ccm_base + MXC_CCM_RCSR); | ||
| 530 | 531 | ||
| 531 | /* RTC */ | 532 | /* RTC */ |
| 532 | /* Get RTC IRQ and register the chip */ | 533 | /* Get RTC IRQ and register the chip */ |
diff --git a/arch/arm/mach-imx/mach-imx6q.c b/arch/arm/mach-imx/mach-imx6q.c index 5ec0608f2a76..045b3f6a387d 100644 --- a/arch/arm/mach-imx/mach-imx6q.c +++ b/arch/arm/mach-imx/mach-imx6q.c | |||
| @@ -71,7 +71,7 @@ soft: | |||
| 71 | /* For imx6q sabrelite board: set KSZ9021RN RGMII pad skew */ | 71 | /* For imx6q sabrelite board: set KSZ9021RN RGMII pad skew */ |
| 72 | static int ksz9021rn_phy_fixup(struct phy_device *phydev) | 72 | static int ksz9021rn_phy_fixup(struct phy_device *phydev) |
| 73 | { | 73 | { |
| 74 | if (IS_ENABLED(CONFIG_PHYLIB)) { | 74 | if (IS_BUILTIN(CONFIG_PHYLIB)) { |
| 75 | /* min rx data delay */ | 75 | /* min rx data delay */ |
| 76 | phy_write(phydev, 0x0b, 0x8105); | 76 | phy_write(phydev, 0x0b, 0x8105); |
| 77 | phy_write(phydev, 0x0c, 0x0000); | 77 | phy_write(phydev, 0x0c, 0x0000); |
| @@ -112,7 +112,7 @@ put_clk: | |||
| 112 | 112 | ||
| 113 | static void __init imx6q_sabrelite_init(void) | 113 | static void __init imx6q_sabrelite_init(void) |
| 114 | { | 114 | { |
| 115 | if (IS_ENABLED(CONFIG_PHYLIB)) | 115 | if (IS_BUILTIN(CONFIG_PHYLIB)) |
| 116 | phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK, | 116 | phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK, |
| 117 | ksz9021rn_phy_fixup); | 117 | ksz9021rn_phy_fixup); |
| 118 | imx6q_sabrelite_cko1_setup(); | 118 | imx6q_sabrelite_cko1_setup(); |
diff --git a/arch/arm/mach-kirkwood/Makefile.boot b/arch/arm/mach-kirkwood/Makefile.boot index a5717558ee89..a13299d758e1 100644 --- a/arch/arm/mach-kirkwood/Makefile.boot +++ b/arch/arm/mach-kirkwood/Makefile.boot | |||
| @@ -7,7 +7,8 @@ dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns320.dtb | |||
| 7 | dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb | 7 | dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb |
| 8 | dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb | 8 | dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb |
| 9 | dtb-$(CONFIG_MACH_IB62X0_DT) += kirkwood-ib62x0.dtb | 9 | dtb-$(CONFIG_MACH_IB62X0_DT) += kirkwood-ib62x0.dtb |
| 10 | dtb-$(CONFIG_MACH_TS219_DT) += kirkwood-qnap-ts219.dtb | 10 | dtb-$(CONFIG_MACH_TS219_DT) += kirkwood-ts219-6281.dtb |
| 11 | dtb-$(CONFIG_MACH_TS219_DT) += kirkwood-ts219-6282.dtb | ||
| 11 | dtb-$(CONFIG_MACH_GOFLEXNET_DT) += kirkwood-goflexnet.dtb | 12 | dtb-$(CONFIG_MACH_GOFLEXNET_DT) += kirkwood-goflexnet.dtb |
| 12 | dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lschlv2.dtb | 13 | dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lschlv2.dtb |
| 13 | dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lsxhl.dtb | 14 | dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lsxhl.dtb |
diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index c4b64adcbfce..1201191d7f1b 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c | |||
| @@ -301,7 +301,7 @@ void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) | |||
| 301 | { | 301 | { |
| 302 | orion_ge00_init(eth_data, | 302 | orion_ge00_init(eth_data, |
| 303 | GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, | 303 | GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, |
| 304 | IRQ_KIRKWOOD_GE00_ERR); | 304 | IRQ_KIRKWOOD_GE00_ERR, 1600); |
| 305 | /* The interface forgets the MAC address assigned by u-boot if | 305 | /* The interface forgets the MAC address assigned by u-boot if |
| 306 | the clock is turned off, so claim the clk now. */ | 306 | the clock is turned off, so claim the clk now. */ |
| 307 | clk_prepare_enable(ge0); | 307 | clk_prepare_enable(ge0); |
| @@ -315,7 +315,7 @@ void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) | |||
| 315 | { | 315 | { |
| 316 | orion_ge01_init(eth_data, | 316 | orion_ge01_init(eth_data, |
| 317 | GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, | 317 | GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, |
| 318 | IRQ_KIRKWOOD_GE01_ERR); | 318 | IRQ_KIRKWOOD_GE01_ERR, 1600); |
| 319 | clk_prepare_enable(ge1); | 319 | clk_prepare_enable(ge1); |
| 320 | } | 320 | } |
| 321 | 321 | ||
| @@ -517,6 +517,13 @@ void __init kirkwood_wdt_init(void) | |||
| 517 | void __init kirkwood_init_early(void) | 517 | void __init kirkwood_init_early(void) |
| 518 | { | 518 | { |
| 519 | orion_time_set_base(TIMER_VIRT_BASE); | 519 | orion_time_set_base(TIMER_VIRT_BASE); |
| 520 | |||
| 521 | /* | ||
| 522 | * Some Kirkwood devices allocate their coherent buffers from atomic | ||
| 523 | * context. Increase size of atomic coherent pool to make sure such | ||
| 524 | * the allocations won't fail. | ||
| 525 | */ | ||
| 526 | init_dma_coherent_pool_size(SZ_1M); | ||
| 520 | } | 527 | } |
| 521 | 528 | ||
| 522 | int kirkwood_tclk; | 529 | int kirkwood_tclk; |
diff --git a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c index d93359379598..be90b7d0e10b 100644 --- a/arch/arm/mach-kirkwood/db88f6281-bp-setup.c +++ b/arch/arm/mach-kirkwood/db88f6281-bp-setup.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| 12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
| 13 | #include <linux/sizes.h> | ||
| 13 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 14 | #include <linux/mtd/partitions.h> | 15 | #include <linux/mtd/partitions.h> |
| 15 | #include <linux/ata_platform.h> | 16 | #include <linux/ata_platform.h> |
diff --git a/arch/arm/mach-mmp/sram.c b/arch/arm/mach-mmp/sram.c index 4304f9519372..7e8a5a2e1ec7 100644 --- a/arch/arm/mach-mmp/sram.c +++ b/arch/arm/mach-mmp/sram.c | |||
| @@ -68,7 +68,7 @@ static int __devinit sram_probe(struct platform_device *pdev) | |||
| 68 | struct resource *res; | 68 | struct resource *res; |
| 69 | int ret = 0; | 69 | int ret = 0; |
| 70 | 70 | ||
| 71 | if (!pdata && !pdata->pool_name) | 71 | if (!pdata || !pdata->pool_name) |
| 72 | return -ENODEV; | 72 | return -ENODEV; |
| 73 | 73 | ||
| 74 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 74 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
diff --git a/arch/arm/mach-mv78xx0/addr-map.c b/arch/arm/mach-mv78xx0/addr-map.c index 62b53d710efd..a9bc84180d21 100644 --- a/arch/arm/mach-mv78xx0/addr-map.c +++ b/arch/arm/mach-mv78xx0/addr-map.c | |||
| @@ -37,7 +37,7 @@ | |||
| 37 | #define WIN0_OFF(n) (BRIDGE_VIRT_BASE + 0x0000 + ((n) << 4)) | 37 | #define WIN0_OFF(n) (BRIDGE_VIRT_BASE + 0x0000 + ((n) << 4)) |
| 38 | #define WIN8_OFF(n) (BRIDGE_VIRT_BASE + 0x0900 + (((n) - 8) << 4)) | 38 | #define WIN8_OFF(n) (BRIDGE_VIRT_BASE + 0x0900 + (((n) - 8) << 4)) |
| 39 | 39 | ||
| 40 | static void __init __iomem *win_cfg_base(int win) | 40 | static void __init __iomem *win_cfg_base(const struct orion_addr_map_cfg *cfg, int win) |
| 41 | { | 41 | { |
| 42 | /* | 42 | /* |
| 43 | * Find the control register base address for this window. | 43 | * Find the control register base address for this window. |
diff --git a/arch/arm/mach-mv78xx0/common.c b/arch/arm/mach-mv78xx0/common.c index b4c53b846c9c..3057f7d4329a 100644 --- a/arch/arm/mach-mv78xx0/common.c +++ b/arch/arm/mach-mv78xx0/common.c | |||
| @@ -213,7 +213,8 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) | |||
| 213 | { | 213 | { |
| 214 | orion_ge00_init(eth_data, | 214 | orion_ge00_init(eth_data, |
| 215 | GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, | 215 | GE00_PHYS_BASE, IRQ_MV78XX0_GE00_SUM, |
| 216 | IRQ_MV78XX0_GE_ERR); | 216 | IRQ_MV78XX0_GE_ERR, |
| 217 | MV643XX_TX_CSUM_DEFAULT_LIMIT); | ||
| 217 | } | 218 | } |
| 218 | 219 | ||
| 219 | 220 | ||
| @@ -224,7 +225,8 @@ void __init mv78xx0_ge01_init(struct mv643xx_eth_platform_data *eth_data) | |||
| 224 | { | 225 | { |
| 225 | orion_ge01_init(eth_data, | 226 | orion_ge01_init(eth_data, |
| 226 | GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, | 227 | GE01_PHYS_BASE, IRQ_MV78XX0_GE01_SUM, |
| 227 | NO_IRQ); | 228 | NO_IRQ, |
| 229 | MV643XX_TX_CSUM_DEFAULT_LIMIT); | ||
| 228 | } | 230 | } |
| 229 | 231 | ||
| 230 | 232 | ||
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index dd2db025f778..346fd26f3aa6 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -62,13 +62,14 @@ config ARCH_OMAP4 | |||
| 62 | select PM_OPP if PM | 62 | select PM_OPP if PM |
| 63 | select USB_ARCH_HAS_EHCI if USB_SUPPORT | 63 | select USB_ARCH_HAS_EHCI if USB_SUPPORT |
| 64 | select ARM_CPU_SUSPEND if PM | 64 | select ARM_CPU_SUSPEND if PM |
| 65 | select ARCH_NEEDS_CPU_IDLE_COUPLED | 65 | select ARCH_NEEDS_CPU_IDLE_COUPLED if SMP |
| 66 | 66 | ||
| 67 | config SOC_OMAP5 | 67 | config SOC_OMAP5 |
| 68 | bool "TI OMAP5" | 68 | bool "TI OMAP5" |
| 69 | select CPU_V7 | 69 | select CPU_V7 |
| 70 | select ARM_GIC | 70 | select ARM_GIC |
| 71 | select HAVE_SMP | 71 | select HAVE_SMP |
| 72 | select ARM_CPU_SUSPEND if PM | ||
| 72 | 73 | ||
| 73 | comment "OMAP Core Type" | 74 | comment "OMAP Core Type" |
| 74 | depends on ARCH_OMAP2 | 75 | depends on ARCH_OMAP2 |
| @@ -231,10 +232,11 @@ config MACH_OMAP3_PANDORA | |||
| 231 | select OMAP_PACKAGE_CBB | 232 | select OMAP_PACKAGE_CBB |
| 232 | select REGULATOR_FIXED_VOLTAGE if REGULATOR | 233 | select REGULATOR_FIXED_VOLTAGE if REGULATOR |
| 233 | 234 | ||
| 234 | config MACH_OMAP3_TOUCHBOOK | 235 | config MACH_TOUCHBOOK |
| 235 | bool "OMAP3 Touch Book" | 236 | bool "OMAP3 Touch Book" |
| 236 | depends on ARCH_OMAP3 | 237 | depends on ARCH_OMAP3 |
| 237 | default y | 238 | default y |
| 239 | select OMAP_PACKAGE_CBB | ||
| 238 | 240 | ||
| 239 | config MACH_OMAP_3430SDP | 241 | config MACH_OMAP_3430SDP |
| 240 | bool "OMAP 3430 SDP board" | 242 | bool "OMAP 3430 SDP board" |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index f6a24b3f9c4f..34c2c7f59f0a 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
| @@ -255,7 +255,7 @@ obj-$(CONFIG_MACH_OMAP_3630SDP) += board-zoom-display.o | |||
| 255 | obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o | 255 | obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o |
| 256 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o | 256 | obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o |
| 257 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o | 257 | obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o |
| 258 | obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o | 258 | obj-$(CONFIG_MACH_TOUCHBOOK) += board-omap3touchbook.o |
| 259 | obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o | 259 | obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o |
| 260 | obj-$(CONFIG_MACH_OMAP4_PANDA) += board-omap4panda.o | 260 | obj-$(CONFIG_MACH_OMAP4_PANDA) += board-omap4panda.o |
| 261 | 261 | ||
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 74915295482e..28214483aaba 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
| @@ -554,6 +554,8 @@ static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = { | |||
| 554 | 554 | ||
| 555 | #ifdef CONFIG_OMAP_MUX | 555 | #ifdef CONFIG_OMAP_MUX |
| 556 | static struct omap_board_mux board_mux[] __initdata = { | 556 | static struct omap_board_mux board_mux[] __initdata = { |
| 557 | /* SMSC9221 LAN Controller ETH IRQ (GPIO_176) */ | ||
| 558 | OMAP3_MUX(MCSPI1_CS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), | ||
| 557 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 559 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 558 | }; | 560 | }; |
| 559 | #endif | 561 | #endif |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index ef230a0eb5eb..0d362e9f9cb9 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
| @@ -58,6 +58,7 @@ | |||
| 58 | #include "hsmmc.h" | 58 | #include "hsmmc.h" |
| 59 | #include "common-board-devices.h" | 59 | #include "common-board-devices.h" |
| 60 | 60 | ||
| 61 | #define OMAP3_EVM_TS_GPIO 175 | ||
| 61 | #define OMAP3_EVM_EHCI_VBUS 22 | 62 | #define OMAP3_EVM_EHCI_VBUS 22 |
| 62 | #define OMAP3_EVM_EHCI_SELECT 61 | 63 | #define OMAP3_EVM_EHCI_SELECT 61 |
| 63 | 64 | ||
diff --git a/arch/arm/mach-omap2/clock33xx_data.c b/arch/arm/mach-omap2/clock33xx_data.c index 25bbcc7ca4dc..ae27de8899a6 100644 --- a/arch/arm/mach-omap2/clock33xx_data.c +++ b/arch/arm/mach-omap2/clock33xx_data.c | |||
| @@ -1036,13 +1036,13 @@ static struct omap_clk am33xx_clks[] = { | |||
| 1036 | CLK(NULL, "mmu_fck", &mmu_fck, CK_AM33XX), | 1036 | CLK(NULL, "mmu_fck", &mmu_fck, CK_AM33XX), |
| 1037 | CLK(NULL, "smartreflex0_fck", &smartreflex0_fck, CK_AM33XX), | 1037 | CLK(NULL, "smartreflex0_fck", &smartreflex0_fck, CK_AM33XX), |
| 1038 | CLK(NULL, "smartreflex1_fck", &smartreflex1_fck, CK_AM33XX), | 1038 | CLK(NULL, "smartreflex1_fck", &smartreflex1_fck, CK_AM33XX), |
| 1039 | CLK(NULL, "gpt1_fck", &timer1_fck, CK_AM33XX), | 1039 | CLK(NULL, "timer1_fck", &timer1_fck, CK_AM33XX), |
| 1040 | CLK(NULL, "gpt2_fck", &timer2_fck, CK_AM33XX), | 1040 | CLK(NULL, "timer2_fck", &timer2_fck, CK_AM33XX), |
| 1041 | CLK(NULL, "gpt3_fck", &timer3_fck, CK_AM33XX), | 1041 | CLK(NULL, "timer3_fck", &timer3_fck, CK_AM33XX), |
| 1042 | CLK(NULL, "gpt4_fck", &timer4_fck, CK_AM33XX), | 1042 | CLK(NULL, "timer4_fck", &timer4_fck, CK_AM33XX), |
| 1043 | CLK(NULL, "gpt5_fck", &timer5_fck, CK_AM33XX), | 1043 | CLK(NULL, "timer5_fck", &timer5_fck, CK_AM33XX), |
| 1044 | CLK(NULL, "gpt6_fck", &timer6_fck, CK_AM33XX), | 1044 | CLK(NULL, "timer6_fck", &timer6_fck, CK_AM33XX), |
| 1045 | CLK(NULL, "gpt7_fck", &timer7_fck, CK_AM33XX), | 1045 | CLK(NULL, "timer7_fck", &timer7_fck, CK_AM33XX), |
| 1046 | CLK(NULL, "usbotg_fck", &usbotg_fck, CK_AM33XX), | 1046 | CLK(NULL, "usbotg_fck", &usbotg_fck, CK_AM33XX), |
| 1047 | CLK(NULL, "ieee5000_fck", &ieee5000_fck, CK_AM33XX), | 1047 | CLK(NULL, "ieee5000_fck", &ieee5000_fck, CK_AM33XX), |
| 1048 | CLK(NULL, "wdt1_fck", &wdt1_fck, CK_AM33XX), | 1048 | CLK(NULL, "wdt1_fck", &wdt1_fck, CK_AM33XX), |
diff --git a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c index a0d68dbecfa3..f99e65cfb862 100644 --- a/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c +++ b/arch/arm/mach-omap2/clockdomain2xxx_3xxx.c | |||
| @@ -241,6 +241,52 @@ static void omap3_clkdm_deny_idle(struct clockdomain *clkdm) | |||
| 241 | _clkdm_del_autodeps(clkdm); | 241 | _clkdm_del_autodeps(clkdm); |
| 242 | } | 242 | } |
| 243 | 243 | ||
| 244 | static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) | ||
| 245 | { | ||
| 246 | bool hwsup = false; | ||
| 247 | |||
| 248 | if (!clkdm->clktrctrl_mask) | ||
| 249 | return 0; | ||
| 250 | |||
| 251 | hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 252 | clkdm->clktrctrl_mask); | ||
| 253 | |||
| 254 | if (hwsup) { | ||
| 255 | /* Disable HW transitions when we are changing deps */ | ||
| 256 | _disable_hwsup(clkdm); | ||
| 257 | _clkdm_add_autodeps(clkdm); | ||
| 258 | _enable_hwsup(clkdm); | ||
| 259 | } else { | ||
| 260 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | ||
| 261 | omap3_clkdm_wakeup(clkdm); | ||
| 262 | } | ||
| 263 | |||
| 264 | return 0; | ||
| 265 | } | ||
| 266 | |||
| 267 | static int omap3xxx_clkdm_clk_disable(struct clockdomain *clkdm) | ||
| 268 | { | ||
| 269 | bool hwsup = false; | ||
| 270 | |||
| 271 | if (!clkdm->clktrctrl_mask) | ||
| 272 | return 0; | ||
| 273 | |||
| 274 | hwsup = omap2_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
| 275 | clkdm->clktrctrl_mask); | ||
| 276 | |||
| 277 | if (hwsup) { | ||
| 278 | /* Disable HW transitions when we are changing deps */ | ||
| 279 | _disable_hwsup(clkdm); | ||
| 280 | _clkdm_del_autodeps(clkdm); | ||
| 281 | _enable_hwsup(clkdm); | ||
| 282 | } else { | ||
| 283 | if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP) | ||
| 284 | omap3_clkdm_sleep(clkdm); | ||
| 285 | } | ||
| 286 | |||
| 287 | return 0; | ||
| 288 | } | ||
| 289 | |||
| 244 | struct clkdm_ops omap2_clkdm_operations = { | 290 | struct clkdm_ops omap2_clkdm_operations = { |
| 245 | .clkdm_add_wkdep = omap2_clkdm_add_wkdep, | 291 | .clkdm_add_wkdep = omap2_clkdm_add_wkdep, |
| 246 | .clkdm_del_wkdep = omap2_clkdm_del_wkdep, | 292 | .clkdm_del_wkdep = omap2_clkdm_del_wkdep, |
| @@ -267,6 +313,6 @@ struct clkdm_ops omap3_clkdm_operations = { | |||
| 267 | .clkdm_wakeup = omap3_clkdm_wakeup, | 313 | .clkdm_wakeup = omap3_clkdm_wakeup, |
| 268 | .clkdm_allow_idle = omap3_clkdm_allow_idle, | 314 | .clkdm_allow_idle = omap3_clkdm_allow_idle, |
| 269 | .clkdm_deny_idle = omap3_clkdm_deny_idle, | 315 | .clkdm_deny_idle = omap3_clkdm_deny_idle, |
| 270 | .clkdm_clk_enable = omap2_clkdm_clk_enable, | 316 | .clkdm_clk_enable = omap3xxx_clkdm_clk_enable, |
| 271 | .clkdm_clk_disable = omap2_clkdm_clk_disable, | 317 | .clkdm_clk_disable = omap3xxx_clkdm_clk_disable, |
| 272 | }; | 318 | }; |
diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h index 766338fe4d34..975f6bda0e0b 100644 --- a/arch/arm/mach-omap2/cm-regbits-34xx.h +++ b/arch/arm/mach-omap2/cm-regbits-34xx.h | |||
| @@ -67,6 +67,7 @@ | |||
| 67 | #define OMAP3430_EN_IVA2_DPLL_MASK (0x7 << 0) | 67 | #define OMAP3430_EN_IVA2_DPLL_MASK (0x7 << 0) |
| 68 | 68 | ||
| 69 | /* CM_IDLEST_IVA2 */ | 69 | /* CM_IDLEST_IVA2 */ |
| 70 | #define OMAP3430_ST_IVA2_SHIFT 0 | ||
| 70 | #define OMAP3430_ST_IVA2_MASK (1 << 0) | 71 | #define OMAP3430_ST_IVA2_MASK (1 << 0) |
| 71 | 72 | ||
| 72 | /* CM_IDLEST_PLL_IVA2 */ | 73 | /* CM_IDLEST_PLL_IVA2 */ |
diff --git a/arch/arm/mach-omap2/common-board-devices.c b/arch/arm/mach-omap2/common-board-devices.c index 14734746457c..c1875862679f 100644 --- a/arch/arm/mach-omap2/common-board-devices.c +++ b/arch/arm/mach-omap2/common-board-devices.c | |||
| @@ -35,16 +35,6 @@ static struct omap2_mcspi_device_config ads7846_mcspi_config = { | |||
| 35 | .turbo_mode = 0, | 35 | .turbo_mode = 0, |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | /* | ||
| 39 | * ADS7846 driver maybe request a gpio according to the value | ||
| 40 | * of pdata->get_pendown_state, but we have done this. So set | ||
| 41 | * get_pendown_state to avoid twice gpio requesting. | ||
| 42 | */ | ||
| 43 | static int omap3_get_pendown_state(void) | ||
| 44 | { | ||
| 45 | return !gpio_get_value(OMAP3_EVM_TS_GPIO); | ||
| 46 | } | ||
| 47 | |||
| 48 | static struct ads7846_platform_data ads7846_config = { | 38 | static struct ads7846_platform_data ads7846_config = { |
| 49 | .x_max = 0x0fff, | 39 | .x_max = 0x0fff, |
| 50 | .y_max = 0x0fff, | 40 | .y_max = 0x0fff, |
| @@ -55,7 +45,6 @@ static struct ads7846_platform_data ads7846_config = { | |||
| 55 | .debounce_rep = 1, | 45 | .debounce_rep = 1, |
| 56 | .gpio_pendown = -EINVAL, | 46 | .gpio_pendown = -EINVAL, |
| 57 | .keep_vref_on = 1, | 47 | .keep_vref_on = 1, |
| 58 | .get_pendown_state = &omap3_get_pendown_state, | ||
| 59 | }; | 48 | }; |
| 60 | 49 | ||
| 61 | static struct spi_board_info ads7846_spi_board_info __initdata = { | 50 | static struct spi_board_info ads7846_spi_board_info __initdata = { |
diff --git a/arch/arm/mach-omap2/common-board-devices.h b/arch/arm/mach-omap2/common-board-devices.h index 4c4ef6a6166b..a0b4a42836ab 100644 --- a/arch/arm/mach-omap2/common-board-devices.h +++ b/arch/arm/mach-omap2/common-board-devices.h | |||
| @@ -4,7 +4,6 @@ | |||
| 4 | #include "twl-common.h" | 4 | #include "twl-common.h" |
| 5 | 5 | ||
| 6 | #define NAND_BLOCK_SIZE SZ_128K | 6 | #define NAND_BLOCK_SIZE SZ_128K |
| 7 | #define OMAP3_EVM_TS_GPIO 175 | ||
| 8 | 7 | ||
| 9 | struct mtd_partition; | 8 | struct mtd_partition; |
| 10 | struct ads7846_platform_data; | 9 | struct ads7846_platform_data; |
diff --git a/arch/arm/mach-omap2/cpuidle44xx.c b/arch/arm/mach-omap2/cpuidle44xx.c index ee05e193fc61..288bee6cbb76 100644 --- a/arch/arm/mach-omap2/cpuidle44xx.c +++ b/arch/arm/mach-omap2/cpuidle44xx.c | |||
| @@ -238,8 +238,9 @@ int __init omap4_idle_init(void) | |||
| 238 | for_each_cpu(cpu_id, cpu_online_mask) { | 238 | for_each_cpu(cpu_id, cpu_online_mask) { |
| 239 | dev = &per_cpu(omap4_idle_dev, cpu_id); | 239 | dev = &per_cpu(omap4_idle_dev, cpu_id); |
| 240 | dev->cpu = cpu_id; | 240 | dev->cpu = cpu_id; |
| 241 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | ||
| 241 | dev->coupled_cpus = *cpu_online_mask; | 242 | dev->coupled_cpus = *cpu_online_mask; |
| 242 | 243 | #endif | |
| 243 | cpuidle_register_driver(&omap4_idle_driver); | 244 | cpuidle_register_driver(&omap4_idle_driver); |
| 244 | 245 | ||
| 245 | if (cpuidle_register_device(dev)) { | 246 | if (cpuidle_register_device(dev)) { |
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h index 471e62a74a16..76f9b3c2f586 100644 --- a/arch/arm/mach-omap2/mux.h +++ b/arch/arm/mach-omap2/mux.h | |||
| @@ -127,7 +127,6 @@ struct omap_mux_partition { | |||
| 127 | * @gpio: GPIO number | 127 | * @gpio: GPIO number |
| 128 | * @muxnames: available signal modes for a ball | 128 | * @muxnames: available signal modes for a ball |
| 129 | * @balls: available balls on the package | 129 | * @balls: available balls on the package |
| 130 | * @partition: mux partition | ||
| 131 | */ | 130 | */ |
| 132 | struct omap_mux { | 131 | struct omap_mux { |
| 133 | u16 reg_offset; | 132 | u16 reg_offset; |
diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c index 05fdebfaa195..330d4c6e746b 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.c +++ b/arch/arm/mach-omap2/omap-wakeupgen.c | |||
| @@ -46,7 +46,7 @@ | |||
| 46 | static void __iomem *wakeupgen_base; | 46 | static void __iomem *wakeupgen_base; |
| 47 | static void __iomem *sar_base; | 47 | static void __iomem *sar_base; |
| 48 | static DEFINE_SPINLOCK(wakeupgen_lock); | 48 | static DEFINE_SPINLOCK(wakeupgen_lock); |
| 49 | static unsigned int irq_target_cpu[NR_IRQS]; | 49 | static unsigned int irq_target_cpu[MAX_IRQS]; |
| 50 | static unsigned int irq_banks = MAX_NR_REG_BANKS; | 50 | static unsigned int irq_banks = MAX_NR_REG_BANKS; |
| 51 | static unsigned int max_irqs = MAX_IRQS; | 51 | static unsigned int max_irqs = MAX_IRQS; |
| 52 | static unsigned int omap_secure_apis; | 52 | static unsigned int omap_secure_apis; |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index 6ca8e519968d..37afbd173c2c 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
| @@ -1889,6 +1889,7 @@ static int _enable(struct omap_hwmod *oh) | |||
| 1889 | _enable_sysc(oh); | 1889 | _enable_sysc(oh); |
| 1890 | } | 1890 | } |
| 1891 | } else { | 1891 | } else { |
| 1892 | _omap4_disable_module(oh); | ||
| 1892 | _disable_clocks(oh); | 1893 | _disable_clocks(oh); |
| 1893 | pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n", | 1894 | pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n", |
| 1894 | oh->name, r); | 1895 | oh->name, r); |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index c9e38200216b..ce7e6068768f 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
| @@ -100,9 +100,9 @@ static struct omap_hwmod omap3xxx_mpu_hwmod = { | |||
| 100 | 100 | ||
| 101 | /* IVA2 (IVA2) */ | 101 | /* IVA2 (IVA2) */ |
| 102 | static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = { | 102 | static struct omap_hwmod_rst_info omap3xxx_iva_resets[] = { |
| 103 | { .name = "logic", .rst_shift = 0 }, | 103 | { .name = "logic", .rst_shift = 0, .st_shift = 8 }, |
| 104 | { .name = "seq0", .rst_shift = 1 }, | 104 | { .name = "seq0", .rst_shift = 1, .st_shift = 9 }, |
| 105 | { .name = "seq1", .rst_shift = 2 }, | 105 | { .name = "seq1", .rst_shift = 2, .st_shift = 10 }, |
| 106 | }; | 106 | }; |
| 107 | 107 | ||
| 108 | static struct omap_hwmod omap3xxx_iva_hwmod = { | 108 | static struct omap_hwmod omap3xxx_iva_hwmod = { |
| @@ -112,6 +112,15 @@ static struct omap_hwmod omap3xxx_iva_hwmod = { | |||
| 112 | .rst_lines = omap3xxx_iva_resets, | 112 | .rst_lines = omap3xxx_iva_resets, |
| 113 | .rst_lines_cnt = ARRAY_SIZE(omap3xxx_iva_resets), | 113 | .rst_lines_cnt = ARRAY_SIZE(omap3xxx_iva_resets), |
| 114 | .main_clk = "iva2_ck", | 114 | .main_clk = "iva2_ck", |
| 115 | .prcm = { | ||
| 116 | .omap2 = { | ||
| 117 | .module_offs = OMAP3430_IVA2_MOD, | ||
| 118 | .prcm_reg_id = 1, | ||
| 119 | .module_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT, | ||
| 120 | .idlest_reg_id = 1, | ||
| 121 | .idlest_idle_bit = OMAP3430_ST_IVA2_SHIFT, | ||
| 122 | } | ||
| 123 | }, | ||
| 115 | }; | 124 | }; |
| 116 | 125 | ||
| 117 | /* timer class */ | 126 | /* timer class */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 242aee498ceb..afb60917a948 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
| @@ -4210,7 +4210,7 @@ static struct omap_hwmod_ocp_if omap44xx_dsp__iva = { | |||
| 4210 | }; | 4210 | }; |
| 4211 | 4211 | ||
| 4212 | /* dsp -> sl2if */ | 4212 | /* dsp -> sl2if */ |
| 4213 | static struct omap_hwmod_ocp_if omap44xx_dsp__sl2if = { | 4213 | static struct omap_hwmod_ocp_if __maybe_unused omap44xx_dsp__sl2if = { |
| 4214 | .master = &omap44xx_dsp_hwmod, | 4214 | .master = &omap44xx_dsp_hwmod, |
| 4215 | .slave = &omap44xx_sl2if_hwmod, | 4215 | .slave = &omap44xx_sl2if_hwmod, |
| 4216 | .clk = "dpll_iva_m5x2_ck", | 4216 | .clk = "dpll_iva_m5x2_ck", |
| @@ -4828,7 +4828,7 @@ static struct omap_hwmod_ocp_if omap44xx_l3_main_2__iss = { | |||
| 4828 | }; | 4828 | }; |
| 4829 | 4829 | ||
| 4830 | /* iva -> sl2if */ | 4830 | /* iva -> sl2if */ |
| 4831 | static struct omap_hwmod_ocp_if omap44xx_iva__sl2if = { | 4831 | static struct omap_hwmod_ocp_if __maybe_unused omap44xx_iva__sl2if = { |
| 4832 | .master = &omap44xx_iva_hwmod, | 4832 | .master = &omap44xx_iva_hwmod, |
| 4833 | .slave = &omap44xx_sl2if_hwmod, | 4833 | .slave = &omap44xx_sl2if_hwmod, |
| 4834 | .clk = "dpll_iva_m5x2_ck", | 4834 | .clk = "dpll_iva_m5x2_ck", |
| @@ -5362,7 +5362,7 @@ static struct omap_hwmod_ocp_if omap44xx_l4_wkup__scrm = { | |||
| 5362 | }; | 5362 | }; |
| 5363 | 5363 | ||
| 5364 | /* l3_main_2 -> sl2if */ | 5364 | /* l3_main_2 -> sl2if */ |
| 5365 | static struct omap_hwmod_ocp_if omap44xx_l3_main_2__sl2if = { | 5365 | static struct omap_hwmod_ocp_if __maybe_unused omap44xx_l3_main_2__sl2if = { |
| 5366 | .master = &omap44xx_l3_main_2_hwmod, | 5366 | .master = &omap44xx_l3_main_2_hwmod, |
| 5367 | .slave = &omap44xx_sl2if_hwmod, | 5367 | .slave = &omap44xx_sl2if_hwmod, |
| 5368 | .clk = "l3_div_ck", | 5368 | .clk = "l3_div_ck", |
| @@ -6032,7 +6032,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = { | |||
| 6032 | &omap44xx_l4_abe__dmic, | 6032 | &omap44xx_l4_abe__dmic, |
| 6033 | &omap44xx_l4_abe__dmic_dma, | 6033 | &omap44xx_l4_abe__dmic_dma, |
| 6034 | &omap44xx_dsp__iva, | 6034 | &omap44xx_dsp__iva, |
| 6035 | &omap44xx_dsp__sl2if, | 6035 | /* &omap44xx_dsp__sl2if, */ |
| 6036 | &omap44xx_l4_cfg__dsp, | 6036 | &omap44xx_l4_cfg__dsp, |
| 6037 | &omap44xx_l3_main_2__dss, | 6037 | &omap44xx_l3_main_2__dss, |
| 6038 | &omap44xx_l4_per__dss, | 6038 | &omap44xx_l4_per__dss, |
| @@ -6068,7 +6068,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = { | |||
| 6068 | &omap44xx_l4_per__i2c4, | 6068 | &omap44xx_l4_per__i2c4, |
| 6069 | &omap44xx_l3_main_2__ipu, | 6069 | &omap44xx_l3_main_2__ipu, |
| 6070 | &omap44xx_l3_main_2__iss, | 6070 | &omap44xx_l3_main_2__iss, |
| 6071 | &omap44xx_iva__sl2if, | 6071 | /* &omap44xx_iva__sl2if, */ |
| 6072 | &omap44xx_l3_main_2__iva, | 6072 | &omap44xx_l3_main_2__iva, |
| 6073 | &omap44xx_l4_wkup__kbd, | 6073 | &omap44xx_l4_wkup__kbd, |
| 6074 | &omap44xx_l4_cfg__mailbox, | 6074 | &omap44xx_l4_cfg__mailbox, |
| @@ -6099,7 +6099,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = { | |||
| 6099 | &omap44xx_l4_cfg__cm_core, | 6099 | &omap44xx_l4_cfg__cm_core, |
| 6100 | &omap44xx_l4_wkup__prm, | 6100 | &omap44xx_l4_wkup__prm, |
| 6101 | &omap44xx_l4_wkup__scrm, | 6101 | &omap44xx_l4_wkup__scrm, |
| 6102 | &omap44xx_l3_main_2__sl2if, | 6102 | /* &omap44xx_l3_main_2__sl2if, */ |
| 6103 | &omap44xx_l4_abe__slimbus1, | 6103 | &omap44xx_l4_abe__slimbus1, |
| 6104 | &omap44xx_l4_abe__slimbus1_dma, | 6104 | &omap44xx_l4_abe__slimbus1_dma, |
| 6105 | &omap44xx_l4_per__slimbus2, | 6105 | &omap44xx_l4_per__slimbus2, |
diff --git a/arch/arm/mach-omap2/opp4xxx_data.c b/arch/arm/mach-omap2/opp4xxx_data.c index 2293ba27101b..c95415da23c2 100644 --- a/arch/arm/mach-omap2/opp4xxx_data.c +++ b/arch/arm/mach-omap2/opp4xxx_data.c | |||
| @@ -94,7 +94,7 @@ int __init omap4_opp_init(void) | |||
| 94 | { | 94 | { |
| 95 | int r = -ENODEV; | 95 | int r = -ENODEV; |
| 96 | 96 | ||
| 97 | if (!cpu_is_omap44xx()) | 97 | if (!cpu_is_omap443x()) |
| 98 | return r; | 98 | return r; |
| 99 | 99 | ||
| 100 | r = omap_init_opp_table(omap44xx_opp_def_list, | 100 | r = omap_init_opp_table(omap44xx_opp_def_list, |
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index e4fc88c65dbd..05bd8f02723f 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
| @@ -272,21 +272,16 @@ void omap_sram_idle(void) | |||
| 272 | per_next_state = pwrdm_read_next_pwrst(per_pwrdm); | 272 | per_next_state = pwrdm_read_next_pwrst(per_pwrdm); |
| 273 | core_next_state = pwrdm_read_next_pwrst(core_pwrdm); | 273 | core_next_state = pwrdm_read_next_pwrst(core_pwrdm); |
| 274 | 274 | ||
| 275 | if (mpu_next_state < PWRDM_POWER_ON) { | 275 | pwrdm_pre_transition(NULL); |
| 276 | pwrdm_pre_transition(mpu_pwrdm); | ||
| 277 | pwrdm_pre_transition(neon_pwrdm); | ||
| 278 | } | ||
| 279 | 276 | ||
| 280 | /* PER */ | 277 | /* PER */ |
| 281 | if (per_next_state < PWRDM_POWER_ON) { | 278 | if (per_next_state < PWRDM_POWER_ON) { |
| 282 | pwrdm_pre_transition(per_pwrdm); | ||
| 283 | per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0; | 279 | per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0; |
| 284 | omap2_gpio_prepare_for_idle(per_going_off); | 280 | omap2_gpio_prepare_for_idle(per_going_off); |
| 285 | } | 281 | } |
| 286 | 282 | ||
| 287 | /* CORE */ | 283 | /* CORE */ |
| 288 | if (core_next_state < PWRDM_POWER_ON) { | 284 | if (core_next_state < PWRDM_POWER_ON) { |
| 289 | pwrdm_pre_transition(core_pwrdm); | ||
| 290 | if (core_next_state == PWRDM_POWER_OFF) { | 285 | if (core_next_state == PWRDM_POWER_OFF) { |
| 291 | omap3_core_save_context(); | 286 | omap3_core_save_context(); |
| 292 | omap3_cm_save_context(); | 287 | omap3_cm_save_context(); |
| @@ -339,20 +334,14 @@ void omap_sram_idle(void) | |||
| 339 | omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK, | 334 | omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK, |
| 340 | OMAP3430_GR_MOD, | 335 | OMAP3430_GR_MOD, |
| 341 | OMAP3_PRM_VOLTCTRL_OFFSET); | 336 | OMAP3_PRM_VOLTCTRL_OFFSET); |
| 342 | pwrdm_post_transition(core_pwrdm); | ||
| 343 | } | 337 | } |
| 344 | omap3_intc_resume_idle(); | 338 | omap3_intc_resume_idle(); |
| 345 | 339 | ||
| 340 | pwrdm_post_transition(NULL); | ||
| 341 | |||
| 346 | /* PER */ | 342 | /* PER */ |
| 347 | if (per_next_state < PWRDM_POWER_ON) { | 343 | if (per_next_state < PWRDM_POWER_ON) |
| 348 | omap2_gpio_resume_after_idle(); | 344 | omap2_gpio_resume_after_idle(); |
| 349 | pwrdm_post_transition(per_pwrdm); | ||
| 350 | } | ||
| 351 | |||
| 352 | if (mpu_next_state < PWRDM_POWER_ON) { | ||
| 353 | pwrdm_post_transition(mpu_pwrdm); | ||
| 354 | pwrdm_post_transition(neon_pwrdm); | ||
| 355 | } | ||
| 356 | } | 345 | } |
| 357 | 346 | ||
| 358 | static void omap3_pm_idle(void) | 347 | static void omap3_pm_idle(void) |
diff --git a/arch/arm/mach-omap2/sleep44xx.S b/arch/arm/mach-omap2/sleep44xx.S index 9f6b83d1b193..91e71d8f46f0 100644 --- a/arch/arm/mach-omap2/sleep44xx.S +++ b/arch/arm/mach-omap2/sleep44xx.S | |||
| @@ -56,9 +56,13 @@ ppa_por_params: | |||
| 56 | * The restore function pointer is stored at CPUx_WAKEUP_NS_PA_ADDR_OFFSET. | 56 | * The restore function pointer is stored at CPUx_WAKEUP_NS_PA_ADDR_OFFSET. |
| 57 | * It returns to the caller for CPU INACTIVE and ON power states or in case | 57 | * It returns to the caller for CPU INACTIVE and ON power states or in case |
| 58 | * CPU failed to transition to targeted OFF/DORMANT state. | 58 | * CPU failed to transition to targeted OFF/DORMANT state. |
| 59 | * | ||
| 60 | * omap4_finish_suspend() calls v7_flush_dcache_all() which doesn't save | ||
| 61 | * stack frame and it expects the caller to take care of it. Hence the entire | ||
| 62 | * stack frame is saved to avoid possible stack corruption. | ||
| 59 | */ | 63 | */ |
| 60 | ENTRY(omap4_finish_suspend) | 64 | ENTRY(omap4_finish_suspend) |
| 61 | stmfd sp!, {lr} | 65 | stmfd sp!, {r4-r12, lr} |
| 62 | cmp r0, #0x0 | 66 | cmp r0, #0x0 |
| 63 | beq do_WFI @ No lowpower state, jump to WFI | 67 | beq do_WFI @ No lowpower state, jump to WFI |
| 64 | 68 | ||
| @@ -226,7 +230,7 @@ scu_gp_clear: | |||
| 226 | skip_scu_gp_clear: | 230 | skip_scu_gp_clear: |
| 227 | isb | 231 | isb |
| 228 | dsb | 232 | dsb |
| 229 | ldmfd sp!, {pc} | 233 | ldmfd sp!, {r4-r12, pc} |
| 230 | ENDPROC(omap4_finish_suspend) | 234 | ENDPROC(omap4_finish_suspend) |
| 231 | 235 | ||
| 232 | /* | 236 | /* |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 2ff6d41ec6c6..2ba4f57dda86 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
| @@ -260,6 +260,7 @@ static u32 notrace dmtimer_read_sched_clock(void) | |||
| 260 | return 0; | 260 | return 0; |
| 261 | } | 261 | } |
| 262 | 262 | ||
| 263 | #ifdef CONFIG_OMAP_32K_TIMER | ||
| 263 | /* Setup free-running counter for clocksource */ | 264 | /* Setup free-running counter for clocksource */ |
| 264 | static int __init omap2_sync32k_clocksource_init(void) | 265 | static int __init omap2_sync32k_clocksource_init(void) |
| 265 | { | 266 | { |
| @@ -299,6 +300,12 @@ static int __init omap2_sync32k_clocksource_init(void) | |||
| 299 | 300 | ||
| 300 | return ret; | 301 | return ret; |
| 301 | } | 302 | } |
| 303 | #else | ||
| 304 | static inline int omap2_sync32k_clocksource_init(void) | ||
| 305 | { | ||
| 306 | return -ENODEV; | ||
| 307 | } | ||
| 308 | #endif | ||
| 302 | 309 | ||
| 303 | static void __init omap2_gptimer_clocksource_init(int gptimer_id, | 310 | static void __init omap2_gptimer_clocksource_init(int gptimer_id, |
| 304 | const char *fck_source) | 311 | const char *fck_source) |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index de47f170ba50..db5ff6642375 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
| @@ -67,6 +67,7 @@ void __init omap_pmic_init(int bus, u32 clkrate, | |||
| 67 | const char *pmic_type, int pmic_irq, | 67 | const char *pmic_type, int pmic_irq, |
| 68 | struct twl4030_platform_data *pmic_data) | 68 | struct twl4030_platform_data *pmic_data) |
| 69 | { | 69 | { |
| 70 | omap_mux_init_signal("sys_nirq", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); | ||
| 70 | strncpy(pmic_i2c_board_info.type, pmic_type, | 71 | strncpy(pmic_i2c_board_info.type, pmic_type, |
| 71 | sizeof(pmic_i2c_board_info.type)); | 72 | sizeof(pmic_i2c_board_info.type)); |
| 72 | pmic_i2c_board_info.irq = pmic_irq; | 73 | pmic_i2c_board_info.irq = pmic_irq; |
diff --git a/arch/arm/mach-orion5x/common.c b/arch/arm/mach-orion5x/common.c index 9148b229d0de..410291c67666 100644 --- a/arch/arm/mach-orion5x/common.c +++ b/arch/arm/mach-orion5x/common.c | |||
| @@ -109,7 +109,8 @@ void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) | |||
| 109 | { | 109 | { |
| 110 | orion_ge00_init(eth_data, | 110 | orion_ge00_init(eth_data, |
| 111 | ORION5X_ETH_PHYS_BASE, IRQ_ORION5X_ETH_SUM, | 111 | ORION5X_ETH_PHYS_BASE, IRQ_ORION5X_ETH_SUM, |
| 112 | IRQ_ORION5X_ETH_ERR); | 112 | IRQ_ORION5X_ETH_ERR, |
| 113 | MV643XX_TX_CSUM_DEFAULT_LIMIT); | ||
| 113 | } | 114 | } |
| 114 | 115 | ||
| 115 | 116 | ||
diff --git a/arch/arm/mach-s3c24xx/include/mach/dma.h b/arch/arm/mach-s3c24xx/include/mach/dma.h index 454831b66037..ee99fd56c043 100644 --- a/arch/arm/mach-s3c24xx/include/mach/dma.h +++ b/arch/arm/mach-s3c24xx/include/mach/dma.h | |||
| @@ -24,7 +24,8 @@ | |||
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | enum dma_ch { | 26 | enum dma_ch { |
| 27 | DMACH_XD0, | 27 | DMACH_DT_PROP = -1, /* not yet supported, do not use */ |
| 28 | DMACH_XD0 = 0, | ||
| 28 | DMACH_XD1, | 29 | DMACH_XD1, |
| 29 | DMACH_SDI, | 30 | DMACH_SDI, |
| 30 | DMACH_SPI0, | 31 | DMACH_SPI0, |
diff --git a/arch/arm/mach-shmobile/board-armadillo800eva.c b/arch/arm/mach-shmobile/board-armadillo800eva.c index cf10f92856dc..453a6e50db8b 100644 --- a/arch/arm/mach-shmobile/board-armadillo800eva.c +++ b/arch/arm/mach-shmobile/board-armadillo800eva.c | |||
| @@ -520,13 +520,14 @@ static struct platform_device hdmi_lcdc_device = { | |||
| 520 | }; | 520 | }; |
| 521 | 521 | ||
| 522 | /* GPIO KEY */ | 522 | /* GPIO KEY */ |
| 523 | #define GPIO_KEY(c, g, d) { .code = c, .gpio = g, .desc = d, .active_low = 1 } | 523 | #define GPIO_KEY(c, g, d, ...) \ |
| 524 | { .code = c, .gpio = g, .desc = d, .active_low = 1, __VA_ARGS__ } | ||
| 524 | 525 | ||
| 525 | static struct gpio_keys_button gpio_buttons[] = { | 526 | static struct gpio_keys_button gpio_buttons[] = { |
| 526 | GPIO_KEY(KEY_POWER, GPIO_PORT99, "SW1"), | 527 | GPIO_KEY(KEY_POWER, GPIO_PORT99, "SW3", .wakeup = 1), |
| 527 | GPIO_KEY(KEY_BACK, GPIO_PORT100, "SW2"), | 528 | GPIO_KEY(KEY_BACK, GPIO_PORT100, "SW4"), |
| 528 | GPIO_KEY(KEY_MENU, GPIO_PORT97, "SW3"), | 529 | GPIO_KEY(KEY_MENU, GPIO_PORT97, "SW5"), |
| 529 | GPIO_KEY(KEY_HOME, GPIO_PORT98, "SW4"), | 530 | GPIO_KEY(KEY_HOME, GPIO_PORT98, "SW6"), |
| 530 | }; | 531 | }; |
| 531 | 532 | ||
| 532 | static struct gpio_keys_platform_data gpio_key_info = { | 533 | static struct gpio_keys_platform_data gpio_key_info = { |
| @@ -901,8 +902,8 @@ static struct platform_device *eva_devices[] __initdata = { | |||
| 901 | &camera_device, | 902 | &camera_device, |
| 902 | &ceu0_device, | 903 | &ceu0_device, |
| 903 | &fsi_device, | 904 | &fsi_device, |
| 904 | &fsi_hdmi_device, | ||
| 905 | &fsi_wm8978_device, | 905 | &fsi_wm8978_device, |
| 906 | &fsi_hdmi_device, | ||
| 906 | }; | 907 | }; |
| 907 | 908 | ||
| 908 | static void __init eva_clock_init(void) | 909 | static void __init eva_clock_init(void) |
diff --git a/arch/arm/mach-shmobile/board-kzm9g.c b/arch/arm/mach-shmobile/board-kzm9g.c index 53b7ea92c32c..3b8a0171c3cb 100644 --- a/arch/arm/mach-shmobile/board-kzm9g.c +++ b/arch/arm/mach-shmobile/board-kzm9g.c | |||
| @@ -346,11 +346,11 @@ static struct resource sh_mmcif_resources[] = { | |||
| 346 | .flags = IORESOURCE_MEM, | 346 | .flags = IORESOURCE_MEM, |
| 347 | }, | 347 | }, |
| 348 | [1] = { | 348 | [1] = { |
| 349 | .start = gic_spi(141), | 349 | .start = gic_spi(140), |
| 350 | .flags = IORESOURCE_IRQ, | 350 | .flags = IORESOURCE_IRQ, |
| 351 | }, | 351 | }, |
| 352 | [2] = { | 352 | [2] = { |
| 353 | .start = gic_spi(140), | 353 | .start = gic_spi(141), |
| 354 | .flags = IORESOURCE_IRQ, | 354 | .flags = IORESOURCE_IRQ, |
| 355 | }, | 355 | }, |
| 356 | }; | 356 | }; |
diff --git a/arch/arm/mach-shmobile/board-mackerel.c b/arch/arm/mach-shmobile/board-mackerel.c index 7ea2b31e3199..c129542f6aed 100644 --- a/arch/arm/mach-shmobile/board-mackerel.c +++ b/arch/arm/mach-shmobile/board-mackerel.c | |||
| @@ -695,6 +695,7 @@ static struct platform_device usbhs0_device = { | |||
| 695 | * - J30 "open" | 695 | * - J30 "open" |
| 696 | * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET | 696 | * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET |
| 697 | * - add .get_vbus = usbhs_get_vbus in usbhs1_private | 697 | * - add .get_vbus = usbhs_get_vbus in usbhs1_private |
| 698 | * - check usbhs0_device(pio)/usbhs1_device(irq) order in mackerel_devices. | ||
| 698 | */ | 699 | */ |
| 699 | #define IRQ8 evt2irq(0x0300) | 700 | #define IRQ8 evt2irq(0x0300) |
| 700 | #define USB_PHY_MODE (1 << 4) | 701 | #define USB_PHY_MODE (1 << 4) |
| @@ -1325,8 +1326,8 @@ static struct platform_device *mackerel_devices[] __initdata = { | |||
| 1325 | &nor_flash_device, | 1326 | &nor_flash_device, |
| 1326 | &smc911x_device, | 1327 | &smc911x_device, |
| 1327 | &lcdc_device, | 1328 | &lcdc_device, |
| 1328 | &usbhs1_device, | ||
| 1329 | &usbhs0_device, | 1329 | &usbhs0_device, |
| 1330 | &usbhs1_device, | ||
| 1330 | &leds_device, | 1331 | &leds_device, |
| 1331 | &fsi_device, | 1332 | &fsi_device, |
| 1332 | &fsi_ak4643_device, | 1333 | &fsi_ak4643_device, |
diff --git a/arch/arm/mach-shmobile/board-marzen.c b/arch/arm/mach-shmobile/board-marzen.c index 3a528cf4366c..fcf5a47f4772 100644 --- a/arch/arm/mach-shmobile/board-marzen.c +++ b/arch/arm/mach-shmobile/board-marzen.c | |||
| @@ -67,7 +67,7 @@ static struct smsc911x_platform_config smsc911x_platdata = { | |||
| 67 | 67 | ||
| 68 | static struct platform_device eth_device = { | 68 | static struct platform_device eth_device = { |
| 69 | .name = "smsc911x", | 69 | .name = "smsc911x", |
| 70 | .id = 0, | 70 | .id = -1, |
| 71 | .dev = { | 71 | .dev = { |
| 72 | .platform_data = &smsc911x_platdata, | 72 | .platform_data = &smsc911x_platdata, |
| 73 | }, | 73 | }, |
diff --git a/arch/arm/mach-shmobile/intc-sh73a0.c b/arch/arm/mach-shmobile/intc-sh73a0.c index ee447404c857..588555a67d9c 100644 --- a/arch/arm/mach-shmobile/intc-sh73a0.c +++ b/arch/arm/mach-shmobile/intc-sh73a0.c | |||
| @@ -259,9 +259,9 @@ static int sh73a0_set_wake(struct irq_data *data, unsigned int on) | |||
| 259 | return 0; /* always allow wakeup */ | 259 | return 0; /* always allow wakeup */ |
| 260 | } | 260 | } |
| 261 | 261 | ||
| 262 | #define RELOC_BASE 0x1000 | 262 | #define RELOC_BASE 0x1200 |
| 263 | 263 | ||
| 264 | /* INTCA IRQ pins at INTCS + 0x1000 to make space for GIC+INTC handling */ | 264 | /* INTCA IRQ pins at INTCS + RELOC_BASE to make space for GIC+INTC handling */ |
| 265 | #define INTCS_VECT_RELOC(n, vect) INTCS_VECT((n), (vect) + RELOC_BASE) | 265 | #define INTCS_VECT_RELOC(n, vect) INTCS_VECT((n), (vect) + RELOC_BASE) |
| 266 | 266 | ||
| 267 | INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000, | 267 | INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000, |
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index c013bbf79cac..53d3d46dec12 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
| @@ -41,7 +41,6 @@ config MACH_HREFV60 | |||
| 41 | config MACH_SNOWBALL | 41 | config MACH_SNOWBALL |
| 42 | bool "U8500 Snowball platform" | 42 | bool "U8500 Snowball platform" |
| 43 | select MACH_MOP500 | 43 | select MACH_MOP500 |
| 44 | select LEDS_GPIO | ||
| 45 | help | 44 | help |
| 46 | Include support for the snowball development platform. | 45 | Include support for the snowball development platform. |
| 47 | 46 | ||
diff --git a/arch/arm/mach-ux500/board-mop500-msp.c b/arch/arm/mach-ux500/board-mop500-msp.c index 996048038743..df15646036aa 100644 --- a/arch/arm/mach-ux500/board-mop500-msp.c +++ b/arch/arm/mach-ux500/board-mop500-msp.c | |||
| @@ -191,9 +191,9 @@ static struct platform_device *db8500_add_msp_i2s(struct device *parent, | |||
| 191 | return pdev; | 191 | return pdev; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | /* Platform device for ASoC U8500 machine */ | 194 | /* Platform device for ASoC MOP500 machine */ |
| 195 | static struct platform_device snd_soc_u8500 = { | 195 | static struct platform_device snd_soc_mop500 = { |
| 196 | .name = "snd-soc-u8500", | 196 | .name = "snd-soc-mop500", |
| 197 | .id = 0, | 197 | .id = 0, |
| 198 | .dev = { | 198 | .dev = { |
| 199 | .platform_data = NULL, | 199 | .platform_data = NULL, |
| @@ -227,8 +227,8 @@ int mop500_msp_init(struct device *parent) | |||
| 227 | { | 227 | { |
| 228 | struct platform_device *msp1; | 228 | struct platform_device *msp1; |
| 229 | 229 | ||
| 230 | pr_info("%s: Register platform-device 'snd-soc-u8500'.\n", __func__); | 230 | pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__); |
| 231 | platform_device_register(&snd_soc_u8500); | 231 | platform_device_register(&snd_soc_mop500); |
| 232 | 232 | ||
| 233 | pr_info("Initialize MSP I2S-devices.\n"); | 233 | pr_info("Initialize MSP I2S-devices.\n"); |
| 234 | db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, | 234 | db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 8674a890fd1c..a534d8880de1 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
| @@ -797,6 +797,7 @@ static void __init u8500_init_machine(void) | |||
| 797 | ARRAY_SIZE(mop500_platform_devs)); | 797 | ARRAY_SIZE(mop500_platform_devs)); |
| 798 | 798 | ||
| 799 | mop500_sdi_init(parent); | 799 | mop500_sdi_init(parent); |
| 800 | mop500_msp_init(parent); | ||
| 800 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); | 801 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
| 801 | i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); | 802 | i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); |
| 802 | i2c_register_board_info(2, mop500_i2c2_devices, | 803 | i2c_register_board_info(2, mop500_i2c2_devices, |
| @@ -804,6 +805,8 @@ static void __init u8500_init_machine(void) | |||
| 804 | 805 | ||
| 805 | mop500_uib_init(); | 806 | mop500_uib_init(); |
| 806 | 807 | ||
| 808 | } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { | ||
| 809 | mop500_msp_init(parent); | ||
| 807 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) { | 810 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) { |
| 808 | /* | 811 | /* |
| 809 | * The HREFv60 board removed a GPIO expander and routed | 812 | * The HREFv60 board removed a GPIO expander and routed |
| @@ -815,6 +818,7 @@ static void __init u8500_init_machine(void) | |||
| 815 | ARRAY_SIZE(mop500_platform_devs)); | 818 | ARRAY_SIZE(mop500_platform_devs)); |
| 816 | 819 | ||
| 817 | hrefv60_sdi_init(parent); | 820 | hrefv60_sdi_init(parent); |
| 821 | mop500_msp_init(parent); | ||
| 818 | 822 | ||
| 819 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); | 823 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
| 820 | i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES; | 824 | i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES; |
diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 119bc52ab93e..4e07eec1270d 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c | |||
| @@ -63,10 +63,11 @@ static int contextidr_notifier(struct notifier_block *unused, unsigned long cmd, | |||
| 63 | pid = task_pid_nr(thread->task) << ASID_BITS; | 63 | pid = task_pid_nr(thread->task) << ASID_BITS; |
| 64 | asm volatile( | 64 | asm volatile( |
| 65 | " mrc p15, 0, %0, c13, c0, 1\n" | 65 | " mrc p15, 0, %0, c13, c0, 1\n" |
| 66 | " bfi %1, %0, #0, %2\n" | 66 | " and %0, %0, %2\n" |
| 67 | " mcr p15, 0, %1, c13, c0, 1\n" | 67 | " orr %0, %0, %1\n" |
| 68 | " mcr p15, 0, %0, c13, c0, 1\n" | ||
| 68 | : "=r" (contextidr), "+r" (pid) | 69 | : "=r" (contextidr), "+r" (pid) |
| 69 | : "I" (ASID_BITS)); | 70 | : "I" (~ASID_MASK)); |
| 70 | isb(); | 71 | isb(); |
| 71 | 72 | ||
| 72 | return NOTIFY_OK; | 73 | return NOTIFY_OK; |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4e7d1182e8a3..e59c4ab71bcb 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -267,17 +267,19 @@ static void __dma_free_remap(void *cpu_addr, size_t size) | |||
| 267 | vunmap(cpu_addr); | 267 | vunmap(cpu_addr); |
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | #define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K | ||
| 271 | |||
| 270 | struct dma_pool { | 272 | struct dma_pool { |
| 271 | size_t size; | 273 | size_t size; |
| 272 | spinlock_t lock; | 274 | spinlock_t lock; |
| 273 | unsigned long *bitmap; | 275 | unsigned long *bitmap; |
| 274 | unsigned long nr_pages; | 276 | unsigned long nr_pages; |
| 275 | void *vaddr; | 277 | void *vaddr; |
| 276 | struct page *page; | 278 | struct page **pages; |
| 277 | }; | 279 | }; |
| 278 | 280 | ||
| 279 | static struct dma_pool atomic_pool = { | 281 | static struct dma_pool atomic_pool = { |
| 280 | .size = SZ_256K, | 282 | .size = DEFAULT_DMA_COHERENT_POOL_SIZE, |
| 281 | }; | 283 | }; |
| 282 | 284 | ||
| 283 | static int __init early_coherent_pool(char *p) | 285 | static int __init early_coherent_pool(char *p) |
| @@ -287,6 +289,21 @@ static int __init early_coherent_pool(char *p) | |||
| 287 | } | 289 | } |
| 288 | early_param("coherent_pool", early_coherent_pool); | 290 | early_param("coherent_pool", early_coherent_pool); |
| 289 | 291 | ||
| 292 | void __init init_dma_coherent_pool_size(unsigned long size) | ||
| 293 | { | ||
| 294 | /* | ||
| 295 | * Catch any attempt to set the pool size too late. | ||
| 296 | */ | ||
| 297 | BUG_ON(atomic_pool.vaddr); | ||
| 298 | |||
| 299 | /* | ||
| 300 | * Set architecture specific coherent pool size only if | ||
| 301 | * it has not been changed by kernel command line parameter. | ||
| 302 | */ | ||
| 303 | if (atomic_pool.size == DEFAULT_DMA_COHERENT_POOL_SIZE) | ||
| 304 | atomic_pool.size = size; | ||
| 305 | } | ||
| 306 | |||
| 290 | /* | 307 | /* |
| 291 | * Initialise the coherent pool for atomic allocations. | 308 | * Initialise the coherent pool for atomic allocations. |
| 292 | */ | 309 | */ |
| @@ -297,6 +314,7 @@ static int __init atomic_pool_init(void) | |||
| 297 | unsigned long nr_pages = pool->size >> PAGE_SHIFT; | 314 | unsigned long nr_pages = pool->size >> PAGE_SHIFT; |
| 298 | unsigned long *bitmap; | 315 | unsigned long *bitmap; |
| 299 | struct page *page; | 316 | struct page *page; |
| 317 | struct page **pages; | ||
| 300 | void *ptr; | 318 | void *ptr; |
| 301 | int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long); | 319 | int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long); |
| 302 | 320 | ||
| @@ -304,21 +322,31 @@ static int __init atomic_pool_init(void) | |||
| 304 | if (!bitmap) | 322 | if (!bitmap) |
| 305 | goto no_bitmap; | 323 | goto no_bitmap; |
| 306 | 324 | ||
| 325 | pages = kzalloc(nr_pages * sizeof(struct page *), GFP_KERNEL); | ||
| 326 | if (!pages) | ||
| 327 | goto no_pages; | ||
| 328 | |||
| 307 | if (IS_ENABLED(CONFIG_CMA)) | 329 | if (IS_ENABLED(CONFIG_CMA)) |
| 308 | ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page); | 330 | ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page); |
| 309 | else | 331 | else |
| 310 | ptr = __alloc_remap_buffer(NULL, pool->size, GFP_KERNEL, prot, | 332 | ptr = __alloc_remap_buffer(NULL, pool->size, GFP_KERNEL, prot, |
| 311 | &page, NULL); | 333 | &page, NULL); |
| 312 | if (ptr) { | 334 | if (ptr) { |
| 335 | int i; | ||
| 336 | |||
| 337 | for (i = 0; i < nr_pages; i++) | ||
| 338 | pages[i] = page + i; | ||
| 339 | |||
| 313 | spin_lock_init(&pool->lock); | 340 | spin_lock_init(&pool->lock); |
| 314 | pool->vaddr = ptr; | 341 | pool->vaddr = ptr; |
| 315 | pool->page = page; | 342 | pool->pages = pages; |
| 316 | pool->bitmap = bitmap; | 343 | pool->bitmap = bitmap; |
| 317 | pool->nr_pages = nr_pages; | 344 | pool->nr_pages = nr_pages; |
| 318 | pr_info("DMA: preallocated %u KiB pool for atomic coherent allocations\n", | 345 | pr_info("DMA: preallocated %u KiB pool for atomic coherent allocations\n", |
| 319 | (unsigned)pool->size / 1024); | 346 | (unsigned)pool->size / 1024); |
| 320 | return 0; | 347 | return 0; |
| 321 | } | 348 | } |
| 349 | no_pages: | ||
| 322 | kfree(bitmap); | 350 | kfree(bitmap); |
| 323 | no_bitmap: | 351 | no_bitmap: |
| 324 | pr_err("DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", | 352 | pr_err("DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", |
| @@ -443,27 +471,45 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page) | |||
| 443 | if (pageno < pool->nr_pages) { | 471 | if (pageno < pool->nr_pages) { |
| 444 | bitmap_set(pool->bitmap, pageno, count); | 472 | bitmap_set(pool->bitmap, pageno, count); |
| 445 | ptr = pool->vaddr + PAGE_SIZE * pageno; | 473 | ptr = pool->vaddr + PAGE_SIZE * pageno; |
| 446 | *ret_page = pool->page + pageno; | 474 | *ret_page = pool->pages[pageno]; |
| 475 | } else { | ||
| 476 | pr_err_once("ERROR: %u KiB atomic DMA coherent pool is too small!\n" | ||
| 477 | "Please increase it with coherent_pool= kernel parameter!\n", | ||
| 478 | (unsigned)pool->size / 1024); | ||
| 447 | } | 479 | } |
| 448 | spin_unlock_irqrestore(&pool->lock, flags); | 480 | spin_unlock_irqrestore(&pool->lock, flags); |
| 449 | 481 | ||
| 450 | return ptr; | 482 | return ptr; |
| 451 | } | 483 | } |
| 452 | 484 | ||
| 485 | static bool __in_atomic_pool(void *start, size_t size) | ||
| 486 | { | ||
| 487 | struct dma_pool *pool = &atomic_pool; | ||
| 488 | void *end = start + size; | ||
| 489 | void *pool_start = pool->vaddr; | ||
| 490 | void *pool_end = pool->vaddr + pool->size; | ||
| 491 | |||
| 492 | if (start < pool_start || start >= pool_end) | ||
| 493 | return false; | ||
| 494 | |||
| 495 | if (end <= pool_end) | ||
| 496 | return true; | ||
| 497 | |||
| 498 | WARN(1, "Wrong coherent size(%p-%p) from atomic pool(%p-%p)\n", | ||
| 499 | start, end - 1, pool_start, pool_end - 1); | ||
| 500 | |||
| 501 | return false; | ||
| 502 | } | ||
| 503 | |||
| 453 | static int __free_from_pool(void *start, size_t size) | 504 | static int __free_from_pool(void *start, size_t size) |
| 454 | { | 505 | { |
| 455 | struct dma_pool *pool = &atomic_pool; | 506 | struct dma_pool *pool = &atomic_pool; |
| 456 | unsigned long pageno, count; | 507 | unsigned long pageno, count; |
| 457 | unsigned long flags; | 508 | unsigned long flags; |
| 458 | 509 | ||
| 459 | if (start < pool->vaddr || start > pool->vaddr + pool->size) | 510 | if (!__in_atomic_pool(start, size)) |
| 460 | return 0; | 511 | return 0; |
| 461 | 512 | ||
| 462 | if (start + size > pool->vaddr + pool->size) { | ||
| 463 | WARN(1, "freeing wrong coherent size from pool\n"); | ||
| 464 | return 0; | ||
| 465 | } | ||
| 466 | |||
| 467 | pageno = (start - pool->vaddr) >> PAGE_SHIFT; | 513 | pageno = (start - pool->vaddr) >> PAGE_SHIFT; |
| 468 | count = size >> PAGE_SHIFT; | 514 | count = size >> PAGE_SHIFT; |
| 469 | 515 | ||
| @@ -1090,10 +1136,22 @@ static int __iommu_remove_mapping(struct device *dev, dma_addr_t iova, size_t si | |||
| 1090 | return 0; | 1136 | return 0; |
| 1091 | } | 1137 | } |
| 1092 | 1138 | ||
| 1139 | static struct page **__atomic_get_pages(void *addr) | ||
| 1140 | { | ||
| 1141 | struct dma_pool *pool = &atomic_pool; | ||
| 1142 | struct page **pages = pool->pages; | ||
| 1143 | int offs = (addr - pool->vaddr) >> PAGE_SHIFT; | ||
| 1144 | |||
| 1145 | return pages + offs; | ||
| 1146 | } | ||
| 1147 | |||
| 1093 | static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs) | 1148 | static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs) |
| 1094 | { | 1149 | { |
| 1095 | struct vm_struct *area; | 1150 | struct vm_struct *area; |
| 1096 | 1151 | ||
| 1152 | if (__in_atomic_pool(cpu_addr, PAGE_SIZE)) | ||
| 1153 | return __atomic_get_pages(cpu_addr); | ||
| 1154 | |||
| 1097 | if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) | 1155 | if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) |
| 1098 | return cpu_addr; | 1156 | return cpu_addr; |
| 1099 | 1157 | ||
| @@ -1103,6 +1161,34 @@ static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs) | |||
| 1103 | return NULL; | 1161 | return NULL; |
| 1104 | } | 1162 | } |
| 1105 | 1163 | ||
| 1164 | static void *__iommu_alloc_atomic(struct device *dev, size_t size, | ||
| 1165 | dma_addr_t *handle) | ||
| 1166 | { | ||
| 1167 | struct page *page; | ||
| 1168 | void *addr; | ||
| 1169 | |||
| 1170 | addr = __alloc_from_pool(size, &page); | ||
| 1171 | if (!addr) | ||
| 1172 | return NULL; | ||
| 1173 | |||
| 1174 | *handle = __iommu_create_mapping(dev, &page, size); | ||
| 1175 | if (*handle == DMA_ERROR_CODE) | ||
| 1176 | goto err_mapping; | ||
| 1177 | |||
| 1178 | return addr; | ||
| 1179 | |||
| 1180 | err_mapping: | ||
| 1181 | __free_from_pool(addr, size); | ||
| 1182 | return NULL; | ||
| 1183 | } | ||
| 1184 | |||
| 1185 | static void __iommu_free_atomic(struct device *dev, struct page **pages, | ||
| 1186 | dma_addr_t handle, size_t size) | ||
| 1187 | { | ||
| 1188 | __iommu_remove_mapping(dev, handle, size); | ||
| 1189 | __free_from_pool(page_address(pages[0]), size); | ||
| 1190 | } | ||
| 1191 | |||
| 1106 | static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, | 1192 | static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, |
| 1107 | dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) | 1193 | dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) |
| 1108 | { | 1194 | { |
| @@ -1113,6 +1199,9 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, | |||
| 1113 | *handle = DMA_ERROR_CODE; | 1199 | *handle = DMA_ERROR_CODE; |
| 1114 | size = PAGE_ALIGN(size); | 1200 | size = PAGE_ALIGN(size); |
| 1115 | 1201 | ||
| 1202 | if (gfp & GFP_ATOMIC) | ||
| 1203 | return __iommu_alloc_atomic(dev, size, handle); | ||
| 1204 | |||
| 1116 | pages = __iommu_alloc_buffer(dev, size, gfp); | 1205 | pages = __iommu_alloc_buffer(dev, size, gfp); |
| 1117 | if (!pages) | 1206 | if (!pages) |
| 1118 | return NULL; | 1207 | return NULL; |
| @@ -1179,6 +1268,11 @@ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, | |||
| 1179 | return; | 1268 | return; |
| 1180 | } | 1269 | } |
| 1181 | 1270 | ||
| 1271 | if (__in_atomic_pool(cpu_addr, size)) { | ||
| 1272 | __iommu_free_atomic(dev, pages, handle, size); | ||
| 1273 | return; | ||
| 1274 | } | ||
| 1275 | |||
| 1182 | if (!dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) { | 1276 | if (!dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) { |
| 1183 | unmap_kernel_range((unsigned long)cpu_addr, size); | 1277 | unmap_kernel_range((unsigned long)cpu_addr, size); |
| 1184 | vunmap(cpu_addr); | 1278 | vunmap(cpu_addr); |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index 6776160618ef..a8ee92da3544 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
| @@ -55,6 +55,9 @@ extern void __flush_dcache_page(struct address_space *mapping, struct page *page | |||
| 55 | /* permanent static mappings from iotable_init() */ | 55 | /* permanent static mappings from iotable_init() */ |
| 56 | #define VM_ARM_STATIC_MAPPING 0x40000000 | 56 | #define VM_ARM_STATIC_MAPPING 0x40000000 |
| 57 | 57 | ||
| 58 | /* empty mapping */ | ||
| 59 | #define VM_ARM_EMPTY_MAPPING 0x20000000 | ||
| 60 | |||
| 58 | /* mapping type (attributes) for permanent static mappings */ | 61 | /* mapping type (attributes) for permanent static mappings */ |
| 59 | #define VM_ARM_MTYPE(mt) ((mt) << 20) | 62 | #define VM_ARM_MTYPE(mt) ((mt) << 20) |
| 60 | #define VM_ARM_MTYPE_MASK (0x1f << 20) | 63 | #define VM_ARM_MTYPE_MASK (0x1f << 20) |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 4c2d0451e84a..c2fa21d0103e 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -807,7 +807,7 @@ static void __init pmd_empty_section_gap(unsigned long addr) | |||
| 807 | vm = early_alloc_aligned(sizeof(*vm), __alignof__(*vm)); | 807 | vm = early_alloc_aligned(sizeof(*vm), __alignof__(*vm)); |
| 808 | vm->addr = (void *)addr; | 808 | vm->addr = (void *)addr; |
| 809 | vm->size = SECTION_SIZE; | 809 | vm->size = SECTION_SIZE; |
| 810 | vm->flags = VM_IOREMAP | VM_ARM_STATIC_MAPPING; | 810 | vm->flags = VM_IOREMAP | VM_ARM_EMPTY_MAPPING; |
| 811 | vm->caller = pmd_empty_section_gap; | 811 | vm->caller = pmd_empty_section_gap; |
| 812 | vm_area_add_early(vm); | 812 | vm_area_add_early(vm); |
| 813 | } | 813 | } |
| @@ -820,7 +820,7 @@ static void __init fill_pmd_gaps(void) | |||
| 820 | 820 | ||
| 821 | /* we're still single threaded hence no lock needed here */ | 821 | /* we're still single threaded hence no lock needed here */ |
| 822 | for (vm = vmlist; vm; vm = vm->next) { | 822 | for (vm = vmlist; vm; vm = vm->next) { |
| 823 | if (!(vm->flags & VM_ARM_STATIC_MAPPING)) | 823 | if (!(vm->flags & (VM_ARM_STATIC_MAPPING | VM_ARM_EMPTY_MAPPING))) |
| 824 | continue; | 824 | continue; |
| 825 | addr = (unsigned long)vm->addr; | 825 | addr = (unsigned long)vm->addr; |
| 826 | if (addr < next) | 826 | if (addr < next) |
| @@ -961,8 +961,8 @@ void __init sanity_check_meminfo(void) | |||
| 961 | * Check whether this memory bank would partially overlap | 961 | * Check whether this memory bank would partially overlap |
| 962 | * the vmalloc area. | 962 | * the vmalloc area. |
| 963 | */ | 963 | */ |
| 964 | if (__va(bank->start + bank->size) > vmalloc_min || | 964 | if (__va(bank->start + bank->size - 1) >= vmalloc_min || |
| 965 | __va(bank->start + bank->size) < __va(bank->start)) { | 965 | __va(bank->start + bank->size - 1) <= __va(bank->start)) { |
| 966 | unsigned long newsize = vmalloc_min - __va(bank->start); | 966 | unsigned long newsize = vmalloc_min - __va(bank->start); |
| 967 | printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx " | 967 | printk(KERN_NOTICE "Truncating RAM at %.8llx-%.8llx " |
| 968 | "to -%.8llx (vmalloc region overlap).\n", | 968 | "to -%.8llx (vmalloc region overlap).\n", |
diff --git a/arch/arm/plat-mxc/include/mach/mx25.h b/arch/arm/plat-mxc/include/mach/mx25.h index 627d94f1b010..ec466400a200 100644 --- a/arch/arm/plat-mxc/include/mach/mx25.h +++ b/arch/arm/plat-mxc/include/mach/mx25.h | |||
| @@ -98,6 +98,7 @@ | |||
| 98 | #define MX25_INT_UART1 (NR_IRQS_LEGACY + 45) | 98 | #define MX25_INT_UART1 (NR_IRQS_LEGACY + 45) |
| 99 | #define MX25_INT_GPIO2 (NR_IRQS_LEGACY + 51) | 99 | #define MX25_INT_GPIO2 (NR_IRQS_LEGACY + 51) |
| 100 | #define MX25_INT_GPIO1 (NR_IRQS_LEGACY + 52) | 100 | #define MX25_INT_GPIO1 (NR_IRQS_LEGACY + 52) |
| 101 | #define MX25_INT_GPT1 (NR_IRQS_LEGACY + 54) | ||
| 101 | #define MX25_INT_FEC (NR_IRQS_LEGACY + 57) | 102 | #define MX25_INT_FEC (NR_IRQS_LEGACY + 57) |
| 102 | 103 | ||
| 103 | #define MX25_DMA_REQ_SSI2_RX1 22 | 104 | #define MX25_DMA_REQ_SSI2_RX1 22 |
diff --git a/arch/arm/plat-omap/dmtimer.c b/arch/arm/plat-omap/dmtimer.c index 626ad8cad7a9..938b50a33439 100644 --- a/arch/arm/plat-omap/dmtimer.c +++ b/arch/arm/plat-omap/dmtimer.c | |||
| @@ -189,6 +189,7 @@ struct omap_dm_timer *omap_dm_timer_request(void) | |||
| 189 | timer->reserved = 1; | 189 | timer->reserved = 1; |
| 190 | break; | 190 | break; |
| 191 | } | 191 | } |
| 192 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
| 192 | 193 | ||
| 193 | if (timer) { | 194 | if (timer) { |
| 194 | ret = omap_dm_timer_prepare(timer); | 195 | ret = omap_dm_timer_prepare(timer); |
| @@ -197,7 +198,6 @@ struct omap_dm_timer *omap_dm_timer_request(void) | |||
| 197 | timer = NULL; | 198 | timer = NULL; |
| 198 | } | 199 | } |
| 199 | } | 200 | } |
| 200 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
| 201 | 201 | ||
| 202 | if (!timer) | 202 | if (!timer) |
| 203 | pr_debug("%s: timer request failed!\n", __func__); | 203 | pr_debug("%s: timer request failed!\n", __func__); |
| @@ -220,6 +220,7 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) | |||
| 220 | break; | 220 | break; |
| 221 | } | 221 | } |
| 222 | } | 222 | } |
| 223 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
| 223 | 224 | ||
| 224 | if (timer) { | 225 | if (timer) { |
| 225 | ret = omap_dm_timer_prepare(timer); | 226 | ret = omap_dm_timer_prepare(timer); |
| @@ -228,7 +229,6 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) | |||
| 228 | timer = NULL; | 229 | timer = NULL; |
| 229 | } | 230 | } |
| 230 | } | 231 | } |
| 231 | spin_unlock_irqrestore(&dm_timer_lock, flags); | ||
| 232 | 232 | ||
| 233 | if (!timer) | 233 | if (!timer) |
| 234 | pr_debug("%s: timer%d request failed!\n", __func__, id); | 234 | pr_debug("%s: timer%d request failed!\n", __func__, id); |
| @@ -258,7 +258,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_enable); | |||
| 258 | 258 | ||
| 259 | void omap_dm_timer_disable(struct omap_dm_timer *timer) | 259 | void omap_dm_timer_disable(struct omap_dm_timer *timer) |
| 260 | { | 260 | { |
| 261 | pm_runtime_put(&timer->pdev->dev); | 261 | pm_runtime_put_sync(&timer->pdev->dev); |
| 262 | } | 262 | } |
| 263 | EXPORT_SYMBOL_GPL(omap_dm_timer_disable); | 263 | EXPORT_SYMBOL_GPL(omap_dm_timer_disable); |
| 264 | 264 | ||
diff --git a/arch/arm/plat-omap/include/plat/cpu.h b/arch/arm/plat-omap/include/plat/cpu.h index 68b180edcfff..bb5d08a70dbc 100644 --- a/arch/arm/plat-omap/include/plat/cpu.h +++ b/arch/arm/plat-omap/include/plat/cpu.h | |||
| @@ -372,7 +372,8 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
| 372 | #define cpu_class_is_omap1() (cpu_is_omap7xx() || cpu_is_omap15xx() || \ | 372 | #define cpu_class_is_omap1() (cpu_is_omap7xx() || cpu_is_omap15xx() || \ |
| 373 | cpu_is_omap16xx()) | 373 | cpu_is_omap16xx()) |
| 374 | #define cpu_class_is_omap2() (cpu_is_omap24xx() || cpu_is_omap34xx() || \ | 374 | #define cpu_class_is_omap2() (cpu_is_omap24xx() || cpu_is_omap34xx() || \ |
| 375 | cpu_is_omap44xx() || soc_is_omap54xx()) | 375 | cpu_is_omap44xx() || soc_is_omap54xx() || \ |
| 376 | soc_is_am33xx()) | ||
| 376 | 377 | ||
| 377 | /* Various silicon revisions for omap2 */ | 378 | /* Various silicon revisions for omap2 */ |
| 378 | #define OMAP242X_CLASS 0x24200024 | 379 | #define OMAP242X_CLASS 0x24200024 |
diff --git a/arch/arm/plat-omap/include/plat/multi.h b/arch/arm/plat-omap/include/plat/multi.h index 045e320f1067..324d31b14852 100644 --- a/arch/arm/plat-omap/include/plat/multi.h +++ b/arch/arm/plat-omap/include/plat/multi.h | |||
| @@ -108,4 +108,13 @@ | |||
| 108 | # endif | 108 | # endif |
| 109 | #endif | 109 | #endif |
| 110 | 110 | ||
| 111 | #ifdef CONFIG_SOC_AM33XX | ||
| 112 | # ifdef OMAP_NAME | ||
| 113 | # undef MULTI_OMAP2 | ||
| 114 | # define MULTI_OMAP2 | ||
| 115 | # else | ||
| 116 | # define OMAP_NAME am33xx | ||
| 117 | # endif | ||
| 118 | #endif | ||
| 119 | |||
| 111 | #endif /* __PLAT_OMAP_MULTI_H */ | 120 | #endif /* __PLAT_OMAP_MULTI_H */ |
diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h index b8d19a136781..7f7b112acccb 100644 --- a/arch/arm/plat-omap/include/plat/uncompress.h +++ b/arch/arm/plat-omap/include/plat/uncompress.h | |||
| @@ -110,7 +110,7 @@ static inline void flush(void) | |||
| 110 | _DEBUG_LL_ENTRY(mach, AM33XX_UART##p##_BASE, OMAP_PORT_SHIFT, \ | 110 | _DEBUG_LL_ENTRY(mach, AM33XX_UART##p##_BASE, OMAP_PORT_SHIFT, \ |
| 111 | AM33XXUART##p) | 111 | AM33XXUART##p) |
| 112 | 112 | ||
| 113 | static inline void __arch_decomp_setup(unsigned long arch_id) | 113 | static inline void arch_decomp_setup(void) |
| 114 | { | 114 | { |
| 115 | int port = 0; | 115 | int port = 0; |
| 116 | 116 | ||
| @@ -198,8 +198,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id) | |||
| 198 | } while (0); | 198 | } while (0); |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | #define arch_decomp_setup() __arch_decomp_setup(arch_id) | ||
| 202 | |||
| 203 | /* | 201 | /* |
| 204 | * nothing to do | 202 | * nothing to do |
| 205 | */ | 203 | */ |
diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c index 766181cb5c95..024f3b08db29 100644 --- a/arch/arm/plat-omap/sram.c +++ b/arch/arm/plat-omap/sram.c | |||
| @@ -68,6 +68,7 @@ | |||
| 68 | 68 | ||
| 69 | static unsigned long omap_sram_start; | 69 | static unsigned long omap_sram_start; |
| 70 | static void __iomem *omap_sram_base; | 70 | static void __iomem *omap_sram_base; |
| 71 | static unsigned long omap_sram_skip; | ||
| 71 | static unsigned long omap_sram_size; | 72 | static unsigned long omap_sram_size; |
| 72 | static void __iomem *omap_sram_ceil; | 73 | static void __iomem *omap_sram_ceil; |
| 73 | 74 | ||
| @@ -106,6 +107,7 @@ static int is_sram_locked(void) | |||
| 106 | */ | 107 | */ |
| 107 | static void __init omap_detect_sram(void) | 108 | static void __init omap_detect_sram(void) |
| 108 | { | 109 | { |
| 110 | omap_sram_skip = SRAM_BOOTLOADER_SZ; | ||
| 109 | if (cpu_class_is_omap2()) { | 111 | if (cpu_class_is_omap2()) { |
| 110 | if (is_sram_locked()) { | 112 | if (is_sram_locked()) { |
| 111 | if (cpu_is_omap34xx()) { | 113 | if (cpu_is_omap34xx()) { |
| @@ -113,6 +115,7 @@ static void __init omap_detect_sram(void) | |||
| 113 | if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) || | 115 | if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) || |
| 114 | (omap_type() == OMAP2_DEVICE_TYPE_SEC)) { | 116 | (omap_type() == OMAP2_DEVICE_TYPE_SEC)) { |
| 115 | omap_sram_size = 0x7000; /* 28K */ | 117 | omap_sram_size = 0x7000; /* 28K */ |
| 118 | omap_sram_skip += SZ_16K; | ||
| 116 | } else { | 119 | } else { |
| 117 | omap_sram_size = 0x8000; /* 32K */ | 120 | omap_sram_size = 0x8000; /* 32K */ |
| 118 | } | 121 | } |
| @@ -175,8 +178,10 @@ static void __init omap_map_sram(void) | |||
| 175 | return; | 178 | return; |
| 176 | 179 | ||
| 177 | #ifdef CONFIG_OMAP4_ERRATA_I688 | 180 | #ifdef CONFIG_OMAP4_ERRATA_I688 |
| 181 | if (cpu_is_omap44xx()) { | ||
| 178 | omap_sram_start += PAGE_SIZE; | 182 | omap_sram_start += PAGE_SIZE; |
| 179 | omap_sram_size -= SZ_16K; | 183 | omap_sram_size -= SZ_16K; |
| 184 | } | ||
| 180 | #endif | 185 | #endif |
| 181 | if (cpu_is_omap34xx()) { | 186 | if (cpu_is_omap34xx()) { |
| 182 | /* | 187 | /* |
| @@ -203,8 +208,8 @@ static void __init omap_map_sram(void) | |||
| 203 | * Looks like we need to preserve some bootloader code at the | 208 | * Looks like we need to preserve some bootloader code at the |
| 204 | * beginning of SRAM for jumping to flash for reboot to work... | 209 | * beginning of SRAM for jumping to flash for reboot to work... |
| 205 | */ | 210 | */ |
| 206 | memset_io(omap_sram_base + SRAM_BOOTLOADER_SZ, 0, | 211 | memset_io(omap_sram_base + omap_sram_skip, 0, |
| 207 | omap_sram_size - SRAM_BOOTLOADER_SZ); | 212 | omap_sram_size - omap_sram_skip); |
| 208 | } | 213 | } |
| 209 | 214 | ||
| 210 | /* | 215 | /* |
| @@ -218,7 +223,7 @@ void *omap_sram_push_address(unsigned long size) | |||
| 218 | { | 223 | { |
| 219 | unsigned long available, new_ceil = (unsigned long)omap_sram_ceil; | 224 | unsigned long available, new_ceil = (unsigned long)omap_sram_ceil; |
| 220 | 225 | ||
| 221 | available = omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ); | 226 | available = omap_sram_ceil - (omap_sram_base + omap_sram_skip); |
| 222 | 227 | ||
| 223 | if (size > available) { | 228 | if (size > available) { |
| 224 | pr_err("Not enough space in SRAM\n"); | 229 | pr_err("Not enough space in SRAM\n"); |
diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c index d245a87dc014..b8b747a9d360 100644 --- a/arch/arm/plat-orion/common.c +++ b/arch/arm/plat-orion/common.c | |||
| @@ -291,10 +291,12 @@ static struct platform_device orion_ge00 = { | |||
| 291 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, | 291 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, |
| 292 | unsigned long mapbase, | 292 | unsigned long mapbase, |
| 293 | unsigned long irq, | 293 | unsigned long irq, |
| 294 | unsigned long irq_err) | 294 | unsigned long irq_err, |
| 295 | unsigned int tx_csum_limit) | ||
| 295 | { | 296 | { |
| 296 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, | 297 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, |
| 297 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 298 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
| 299 | orion_ge00_shared_data.tx_csum_limit = tx_csum_limit; | ||
| 298 | ge_complete(&orion_ge00_shared_data, | 300 | ge_complete(&orion_ge00_shared_data, |
| 299 | orion_ge00_resources, irq, &orion_ge00_shared, | 301 | orion_ge00_resources, irq, &orion_ge00_shared, |
| 300 | eth_data, &orion_ge00); | 302 | eth_data, &orion_ge00); |
| @@ -343,10 +345,12 @@ static struct platform_device orion_ge01 = { | |||
| 343 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, | 345 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, |
| 344 | unsigned long mapbase, | 346 | unsigned long mapbase, |
| 345 | unsigned long irq, | 347 | unsigned long irq, |
| 346 | unsigned long irq_err) | 348 | unsigned long irq_err, |
| 349 | unsigned int tx_csum_limit) | ||
| 347 | { | 350 | { |
| 348 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, | 351 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, |
| 349 | mapbase + 0x2000, SZ_16K - 1, irq_err); | 352 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
| 353 | orion_ge01_shared_data.tx_csum_limit = tx_csum_limit; | ||
| 350 | ge_complete(&orion_ge01_shared_data, | 354 | ge_complete(&orion_ge01_shared_data, |
| 351 | orion_ge01_resources, irq, &orion_ge01_shared, | 355 | orion_ge01_resources, irq, &orion_ge01_shared, |
| 352 | eth_data, &orion_ge01); | 356 | eth_data, &orion_ge01); |
diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h index e00fdb213609..ae2377ef63e5 100644 --- a/arch/arm/plat-orion/include/plat/common.h +++ b/arch/arm/plat-orion/include/plat/common.h | |||
| @@ -39,12 +39,14 @@ void __init orion_rtc_init(unsigned long mapbase, | |||
| 39 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, | 39 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, |
| 40 | unsigned long mapbase, | 40 | unsigned long mapbase, |
| 41 | unsigned long irq, | 41 | unsigned long irq, |
| 42 | unsigned long irq_err); | 42 | unsigned long irq_err, |
| 43 | unsigned int tx_csum_limit); | ||
| 43 | 44 | ||
| 44 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, | 45 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, |
| 45 | unsigned long mapbase, | 46 | unsigned long mapbase, |
| 46 | unsigned long irq, | 47 | unsigned long irq, |
| 47 | unsigned long irq_err); | 48 | unsigned long irq_err, |
| 49 | unsigned int tx_csum_limit); | ||
| 48 | 50 | ||
| 49 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, | 51 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, |
| 50 | unsigned long mapbase, | 52 | unsigned long mapbase, |
diff --git a/arch/arm/plat-s3c24xx/dma.c b/arch/arm/plat-s3c24xx/dma.c index 28f898f75380..db98e7021f0d 100644 --- a/arch/arm/plat-s3c24xx/dma.c +++ b/arch/arm/plat-s3c24xx/dma.c | |||
| @@ -430,7 +430,7 @@ s3c2410_dma_canload(struct s3c2410_dma_chan *chan) | |||
| 430 | * when necessary. | 430 | * when necessary. |
| 431 | */ | 431 | */ |
| 432 | 432 | ||
| 433 | int s3c2410_dma_enqueue(unsigned int channel, void *id, | 433 | int s3c2410_dma_enqueue(enum dma_ch channel, void *id, |
| 434 | dma_addr_t data, int size) | 434 | dma_addr_t data, int size) |
| 435 | { | 435 | { |
| 436 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); | 436 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); |
diff --git a/arch/arm/plat-samsung/clock.c b/arch/arm/plat-samsung/clock.c index 65c5eca475e7..d1116e2dfbea 100644 --- a/arch/arm/plat-samsung/clock.c +++ b/arch/arm/plat-samsung/clock.c | |||
| @@ -144,6 +144,7 @@ long clk_round_rate(struct clk *clk, unsigned long rate) | |||
| 144 | 144 | ||
| 145 | int clk_set_rate(struct clk *clk, unsigned long rate) | 145 | int clk_set_rate(struct clk *clk, unsigned long rate) |
| 146 | { | 146 | { |
| 147 | unsigned long flags; | ||
| 147 | int ret; | 148 | int ret; |
| 148 | 149 | ||
| 149 | if (IS_ERR(clk)) | 150 | if (IS_ERR(clk)) |
| @@ -159,9 +160,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
| 159 | if (clk->ops == NULL || clk->ops->set_rate == NULL) | 160 | if (clk->ops == NULL || clk->ops->set_rate == NULL) |
| 160 | return -EINVAL; | 161 | return -EINVAL; |
| 161 | 162 | ||
| 162 | spin_lock(&clocks_lock); | 163 | spin_lock_irqsave(&clocks_lock, flags); |
| 163 | ret = (clk->ops->set_rate)(clk, rate); | 164 | ret = (clk->ops->set_rate)(clk, rate); |
| 164 | spin_unlock(&clocks_lock); | 165 | spin_unlock_irqrestore(&clocks_lock, flags); |
| 165 | 166 | ||
| 166 | return ret; | 167 | return ret; |
| 167 | } | 168 | } |
| @@ -173,17 +174,18 @@ struct clk *clk_get_parent(struct clk *clk) | |||
| 173 | 174 | ||
| 174 | int clk_set_parent(struct clk *clk, struct clk *parent) | 175 | int clk_set_parent(struct clk *clk, struct clk *parent) |
| 175 | { | 176 | { |
| 177 | unsigned long flags; | ||
| 176 | int ret = 0; | 178 | int ret = 0; |
| 177 | 179 | ||
| 178 | if (IS_ERR(clk)) | 180 | if (IS_ERR(clk)) |
| 179 | return -EINVAL; | 181 | return -EINVAL; |
| 180 | 182 | ||
| 181 | spin_lock(&clocks_lock); | 183 | spin_lock_irqsave(&clocks_lock, flags); |
| 182 | 184 | ||
| 183 | if (clk->ops && clk->ops->set_parent) | 185 | if (clk->ops && clk->ops->set_parent) |
| 184 | ret = (clk->ops->set_parent)(clk, parent); | 186 | ret = (clk->ops->set_parent)(clk, parent); |
| 185 | 187 | ||
| 186 | spin_unlock(&clocks_lock); | 188 | spin_unlock_irqrestore(&clocks_lock, flags); |
| 187 | 189 | ||
| 188 | return ret; | 190 | return ret; |
| 189 | } | 191 | } |
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 74e31ce35538..fc49f3dabd76 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
| @@ -32,6 +32,8 @@ | |||
| 32 | #include <linux/platform_data/s3c-hsudc.h> | 32 | #include <linux/platform_data/s3c-hsudc.h> |
| 33 | #include <linux/platform_data/s3c-hsotg.h> | 33 | #include <linux/platform_data/s3c-hsotg.h> |
| 34 | 34 | ||
| 35 | #include <media/s5p_hdmi.h> | ||
| 36 | |||
| 35 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
| 36 | #include <asm/pmu.h> | 38 | #include <asm/pmu.h> |
| 37 | #include <asm/mach/arch.h> | 39 | #include <asm/mach/arch.h> |
| @@ -748,7 +750,8 @@ void __init s5p_i2c_hdmiphy_set_platdata(struct s3c2410_platform_i2c *pd) | |||
| 748 | if (!pd) { | 750 | if (!pd) { |
| 749 | pd = &default_i2c_data; | 751 | pd = &default_i2c_data; |
| 750 | 752 | ||
| 751 | if (soc_is_exynos4210()) | 753 | if (soc_is_exynos4210() || |
| 754 | soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 752 | pd->bus_num = 8; | 755 | pd->bus_num = 8; |
| 753 | else if (soc_is_s5pv210()) | 756 | else if (soc_is_s5pv210()) |
| 754 | pd->bus_num = 3; | 757 | pd->bus_num = 3; |
| @@ -759,6 +762,30 @@ void __init s5p_i2c_hdmiphy_set_platdata(struct s3c2410_platform_i2c *pd) | |||
| 759 | npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c), | 762 | npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c), |
| 760 | &s5p_device_i2c_hdmiphy); | 763 | &s5p_device_i2c_hdmiphy); |
| 761 | } | 764 | } |
| 765 | |||
| 766 | struct s5p_hdmi_platform_data s5p_hdmi_def_platdata; | ||
| 767 | |||
| 768 | void __init s5p_hdmi_set_platdata(struct i2c_board_info *hdmiphy_info, | ||
| 769 | struct i2c_board_info *mhl_info, int mhl_bus) | ||
| 770 | { | ||
| 771 | struct s5p_hdmi_platform_data *pd = &s5p_hdmi_def_platdata; | ||
| 772 | |||
| 773 | if (soc_is_exynos4210() || | ||
| 774 | soc_is_exynos4212() || soc_is_exynos4412()) | ||
| 775 | pd->hdmiphy_bus = 8; | ||
| 776 | else if (soc_is_s5pv210()) | ||
| 777 | pd->hdmiphy_bus = 3; | ||
| 778 | else | ||
| 779 | pd->hdmiphy_bus = 0; | ||
| 780 | |||
| 781 | pd->hdmiphy_info = hdmiphy_info; | ||
| 782 | pd->mhl_info = mhl_info; | ||
| 783 | pd->mhl_bus = mhl_bus; | ||
| 784 | |||
| 785 | s3c_set_platdata(pd, sizeof(struct s5p_hdmi_platform_data), | ||
| 786 | &s5p_device_hdmi); | ||
| 787 | } | ||
| 788 | |||
| 762 | #endif /* CONFIG_S5P_DEV_I2C_HDMIPHY */ | 789 | #endif /* CONFIG_S5P_DEV_I2C_HDMIPHY */ |
| 763 | 790 | ||
| 764 | /* I2S */ | 791 | /* I2S */ |
diff --git a/arch/arm/plat-samsung/include/plat/hdmi.h b/arch/arm/plat-samsung/include/plat/hdmi.h new file mode 100644 index 000000000000..331d046ac2c5 --- /dev/null +++ b/arch/arm/plat-samsung/include/plat/hdmi.h | |||
| @@ -0,0 +1,16 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Samsung Electronics Co.Ltd | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it | ||
| 5 | * under the terms of the GNU General Public License as published by the | ||
| 6 | * Free Software Foundation; either version 2 of the License, or (at your | ||
| 7 | * option) any later version. | ||
| 8 | */ | ||
| 9 | |||
| 10 | #ifndef __PLAT_SAMSUNG_HDMI_H | ||
| 11 | #define __PLAT_SAMSUNG_HDMI_H __FILE__ | ||
| 12 | |||
| 13 | extern void s5p_hdmi_set_platdata(struct i2c_board_info *hdmiphy_info, | ||
| 14 | struct i2c_board_info *mhl_info, int mhl_bus); | ||
| 15 | |||
| 16 | #endif /* __PLAT_SAMSUNG_HDMI_H */ | ||
diff --git a/arch/arm/plat-samsung/pm.c b/arch/arm/plat-samsung/pm.c index 64ab65f0fdbc..15070284343e 100644 --- a/arch/arm/plat-samsung/pm.c +++ b/arch/arm/plat-samsung/pm.c | |||
| @@ -74,7 +74,7 @@ unsigned char pm_uart_udivslot; | |||
| 74 | 74 | ||
| 75 | #ifdef CONFIG_SAMSUNG_PM_DEBUG | 75 | #ifdef CONFIG_SAMSUNG_PM_DEBUG |
| 76 | 76 | ||
| 77 | struct pm_uart_save uart_save[CONFIG_SERIAL_SAMSUNG_UARTS]; | 77 | static struct pm_uart_save uart_save[CONFIG_SERIAL_SAMSUNG_UARTS]; |
| 78 | 78 | ||
| 79 | static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) | 79 | static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) |
| 80 | { | 80 | { |
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index f34861920634..c7092e6057c5 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
| @@ -38,6 +38,7 @@ config BLACKFIN | |||
| 38 | select GENERIC_ATOMIC64 | 38 | select GENERIC_ATOMIC64 |
| 39 | select GENERIC_IRQ_PROBE | 39 | select GENERIC_IRQ_PROBE |
| 40 | select IRQ_PER_CPU if SMP | 40 | select IRQ_PER_CPU if SMP |
| 41 | select USE_GENERIC_SMP_HELPERS if SMP | ||
| 41 | select HAVE_NMI_WATCHDOG if NMI_WATCHDOG | 42 | select HAVE_NMI_WATCHDOG if NMI_WATCHDOG |
| 42 | select GENERIC_SMP_IDLE_THREAD | 43 | select GENERIC_SMP_IDLE_THREAD |
| 43 | select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS | 44 | select ARCH_USES_GETTIMEOFFSET if !GENERIC_CLOCKEVENTS |
diff --git a/arch/blackfin/Makefile b/arch/blackfin/Makefile index d3d7e64ca96d..66cf00095b84 100644 --- a/arch/blackfin/Makefile +++ b/arch/blackfin/Makefile | |||
| @@ -20,7 +20,6 @@ endif | |||
| 20 | KBUILD_AFLAGS += $(call cc-option,-mno-fdpic) | 20 | KBUILD_AFLAGS += $(call cc-option,-mno-fdpic) |
| 21 | KBUILD_CFLAGS_MODULE += -mlong-calls | 21 | KBUILD_CFLAGS_MODULE += -mlong-calls |
| 22 | LDFLAGS += -m elf32bfin | 22 | LDFLAGS += -m elf32bfin |
| 23 | KALLSYMS += --symbol-prefix=_ | ||
| 24 | 23 | ||
| 25 | KBUILD_DEFCONFIG := BF537-STAMP_defconfig | 24 | KBUILD_DEFCONFIG := BF537-STAMP_defconfig |
| 26 | 25 | ||
diff --git a/arch/blackfin/include/asm/smp.h b/arch/blackfin/include/asm/smp.h index dc3d144b4bb5..9631598dcc5d 100644 --- a/arch/blackfin/include/asm/smp.h +++ b/arch/blackfin/include/asm/smp.h | |||
| @@ -18,6 +18,8 @@ | |||
| 18 | #define raw_smp_processor_id() blackfin_core_id() | 18 | #define raw_smp_processor_id() blackfin_core_id() |
| 19 | 19 | ||
| 20 | extern void bfin_relocate_coreb_l1_mem(void); | 20 | extern void bfin_relocate_coreb_l1_mem(void); |
| 21 | extern void arch_send_call_function_single_ipi(int cpu); | ||
| 22 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | ||
| 21 | 23 | ||
| 22 | #if defined(CONFIG_SMP) && defined(CONFIG_ICACHE_FLUSH_L1) | 24 | #if defined(CONFIG_SMP) && defined(CONFIG_ICACHE_FLUSH_L1) |
| 23 | asmlinkage void blackfin_icache_flush_range_l1(unsigned long *ptr); | 25 | asmlinkage void blackfin_icache_flush_range_l1(unsigned long *ptr); |
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index 00bbe672b3b3..a40151306b77 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c | |||
| @@ -48,10 +48,13 @@ unsigned long blackfin_iflush_l1_entry[NR_CPUS]; | |||
| 48 | 48 | ||
| 49 | struct blackfin_initial_pda __cpuinitdata initial_pda_coreb; | 49 | struct blackfin_initial_pda __cpuinitdata initial_pda_coreb; |
| 50 | 50 | ||
| 51 | #define BFIN_IPI_TIMER 0 | 51 | enum ipi_message_type { |
| 52 | #define BFIN_IPI_RESCHEDULE 1 | 52 | BFIN_IPI_TIMER, |
| 53 | #define BFIN_IPI_CALL_FUNC 2 | 53 | BFIN_IPI_RESCHEDULE, |
| 54 | #define BFIN_IPI_CPU_STOP 3 | 54 | BFIN_IPI_CALL_FUNC, |
| 55 | BFIN_IPI_CALL_FUNC_SINGLE, | ||
| 56 | BFIN_IPI_CPU_STOP, | ||
| 57 | }; | ||
| 55 | 58 | ||
| 56 | struct blackfin_flush_data { | 59 | struct blackfin_flush_data { |
| 57 | unsigned long start; | 60 | unsigned long start; |
| @@ -60,35 +63,20 @@ struct blackfin_flush_data { | |||
| 60 | 63 | ||
| 61 | void *secondary_stack; | 64 | void *secondary_stack; |
| 62 | 65 | ||
| 63 | |||
| 64 | struct smp_call_struct { | ||
| 65 | void (*func)(void *info); | ||
| 66 | void *info; | ||
| 67 | int wait; | ||
| 68 | cpumask_t *waitmask; | ||
| 69 | }; | ||
| 70 | |||
| 71 | static struct blackfin_flush_data smp_flush_data; | 66 | static struct blackfin_flush_data smp_flush_data; |
| 72 | 67 | ||
| 73 | static DEFINE_SPINLOCK(stop_lock); | 68 | static DEFINE_SPINLOCK(stop_lock); |
| 74 | 69 | ||
| 75 | struct ipi_message { | ||
| 76 | unsigned long type; | ||
| 77 | struct smp_call_struct call_struct; | ||
| 78 | }; | ||
| 79 | |||
| 80 | /* A magic number - stress test shows this is safe for common cases */ | 70 | /* A magic number - stress test shows this is safe for common cases */ |
| 81 | #define BFIN_IPI_MSGQ_LEN 5 | 71 | #define BFIN_IPI_MSGQ_LEN 5 |
| 82 | 72 | ||
| 83 | /* Simple FIFO buffer, overflow leads to panic */ | 73 | /* Simple FIFO buffer, overflow leads to panic */ |
| 84 | struct ipi_message_queue { | 74 | struct ipi_data { |
| 85 | spinlock_t lock; | ||
| 86 | unsigned long count; | 75 | unsigned long count; |
| 87 | unsigned long head; /* head of the queue */ | 76 | unsigned long bits; |
| 88 | struct ipi_message ipi_message[BFIN_IPI_MSGQ_LEN]; | ||
| 89 | }; | 77 | }; |
| 90 | 78 | ||
| 91 | static DEFINE_PER_CPU(struct ipi_message_queue, ipi_msg_queue); | 79 | static DEFINE_PER_CPU(struct ipi_data, bfin_ipi); |
| 92 | 80 | ||
| 93 | static void ipi_cpu_stop(unsigned int cpu) | 81 | static void ipi_cpu_stop(unsigned int cpu) |
| 94 | { | 82 | { |
| @@ -129,28 +117,6 @@ static void ipi_flush_icache(void *info) | |||
| 129 | blackfin_icache_flush_range(fdata->start, fdata->end); | 117 | blackfin_icache_flush_range(fdata->start, fdata->end); |
| 130 | } | 118 | } |
| 131 | 119 | ||
| 132 | static void ipi_call_function(unsigned int cpu, struct ipi_message *msg) | ||
| 133 | { | ||
| 134 | int wait; | ||
| 135 | void (*func)(void *info); | ||
| 136 | void *info; | ||
| 137 | func = msg->call_struct.func; | ||
| 138 | info = msg->call_struct.info; | ||
| 139 | wait = msg->call_struct.wait; | ||
| 140 | func(info); | ||
| 141 | if (wait) { | ||
| 142 | #ifdef __ARCH_SYNC_CORE_DCACHE | ||
| 143 | /* | ||
| 144 | * 'wait' usually means synchronization between CPUs. | ||
| 145 | * Invalidate D cache in case shared data was changed | ||
| 146 | * by func() to ensure cache coherence. | ||
| 147 | */ | ||
| 148 | resync_core_dcache(); | ||
| 149 | #endif | ||
| 150 | cpumask_clear_cpu(cpu, msg->call_struct.waitmask); | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | /* Use IRQ_SUPPLE_0 to request reschedule. | 120 | /* Use IRQ_SUPPLE_0 to request reschedule. |
| 155 | * When returning from interrupt to user space, | 121 | * When returning from interrupt to user space, |
| 156 | * there is chance to reschedule */ | 122 | * there is chance to reschedule */ |
| @@ -172,152 +138,95 @@ void ipi_timer(void) | |||
| 172 | 138 | ||
| 173 | static irqreturn_t ipi_handler_int1(int irq, void *dev_instance) | 139 | static irqreturn_t ipi_handler_int1(int irq, void *dev_instance) |
| 174 | { | 140 | { |
| 175 | struct ipi_message *msg; | 141 | struct ipi_data *bfin_ipi_data; |
| 176 | struct ipi_message_queue *msg_queue; | ||
| 177 | unsigned int cpu = smp_processor_id(); | 142 | unsigned int cpu = smp_processor_id(); |
| 178 | unsigned long flags; | 143 | unsigned long pending; |
| 144 | unsigned long msg; | ||
| 179 | 145 | ||
| 180 | platform_clear_ipi(cpu, IRQ_SUPPLE_1); | 146 | platform_clear_ipi(cpu, IRQ_SUPPLE_1); |
| 181 | 147 | ||
| 182 | msg_queue = &__get_cpu_var(ipi_msg_queue); | 148 | bfin_ipi_data = &__get_cpu_var(bfin_ipi); |
| 183 | 149 | ||
| 184 | spin_lock_irqsave(&msg_queue->lock, flags); | 150 | while ((pending = xchg(&bfin_ipi_data->bits, 0)) != 0) { |
| 185 | 151 | msg = 0; | |
| 186 | while (msg_queue->count) { | 152 | do { |
| 187 | msg = &msg_queue->ipi_message[msg_queue->head]; | 153 | msg = find_next_bit(&pending, BITS_PER_LONG, msg + 1); |
| 188 | switch (msg->type) { | 154 | switch (msg) { |
| 189 | case BFIN_IPI_TIMER: | 155 | case BFIN_IPI_TIMER: |
| 190 | ipi_timer(); | 156 | ipi_timer(); |
| 191 | break; | 157 | break; |
| 192 | case BFIN_IPI_RESCHEDULE: | 158 | case BFIN_IPI_RESCHEDULE: |
| 193 | scheduler_ipi(); | 159 | scheduler_ipi(); |
| 194 | break; | 160 | break; |
| 195 | case BFIN_IPI_CALL_FUNC: | 161 | case BFIN_IPI_CALL_FUNC: |
| 196 | ipi_call_function(cpu, msg); | 162 | generic_smp_call_function_interrupt(); |
| 197 | break; | 163 | break; |
| 198 | case BFIN_IPI_CPU_STOP: | 164 | |
| 199 | ipi_cpu_stop(cpu); | 165 | case BFIN_IPI_CALL_FUNC_SINGLE: |
| 200 | break; | 166 | generic_smp_call_function_single_interrupt(); |
| 201 | default: | 167 | break; |
| 202 | printk(KERN_CRIT "CPU%u: Unknown IPI message 0x%lx\n", | 168 | |
| 203 | cpu, msg->type); | 169 | case BFIN_IPI_CPU_STOP: |
| 204 | break; | 170 | ipi_cpu_stop(cpu); |
| 205 | } | 171 | break; |
| 206 | msg_queue->head++; | 172 | } |
| 207 | msg_queue->head %= BFIN_IPI_MSGQ_LEN; | 173 | } while (msg < BITS_PER_LONG); |
| 208 | msg_queue->count--; | 174 | |
| 175 | smp_mb(); | ||
| 209 | } | 176 | } |
| 210 | spin_unlock_irqrestore(&msg_queue->lock, flags); | ||
| 211 | return IRQ_HANDLED; | 177 | return IRQ_HANDLED; |
| 212 | } | 178 | } |
| 213 | 179 | ||
| 214 | static void ipi_queue_init(void) | 180 | static void bfin_ipi_init(void) |
| 215 | { | 181 | { |
| 216 | unsigned int cpu; | 182 | unsigned int cpu; |
| 217 | struct ipi_message_queue *msg_queue; | 183 | struct ipi_data *bfin_ipi_data; |
| 218 | for_each_possible_cpu(cpu) { | 184 | for_each_possible_cpu(cpu) { |
| 219 | msg_queue = &per_cpu(ipi_msg_queue, cpu); | 185 | bfin_ipi_data = &per_cpu(bfin_ipi, cpu); |
| 220 | spin_lock_init(&msg_queue->lock); | 186 | bfin_ipi_data->bits = 0; |
| 221 | msg_queue->count = 0; | 187 | bfin_ipi_data->count = 0; |
| 222 | msg_queue->head = 0; | ||
| 223 | } | 188 | } |
| 224 | } | 189 | } |
| 225 | 190 | ||
| 226 | static inline void smp_send_message(cpumask_t callmap, unsigned long type, | 191 | void send_ipi(const struct cpumask *cpumask, enum ipi_message_type msg) |
| 227 | void (*func) (void *info), void *info, int wait) | ||
| 228 | { | 192 | { |
| 229 | unsigned int cpu; | 193 | unsigned int cpu; |
| 230 | struct ipi_message_queue *msg_queue; | 194 | struct ipi_data *bfin_ipi_data; |
| 231 | struct ipi_message *msg; | 195 | unsigned long flags; |
| 232 | unsigned long flags, next_msg; | 196 | |
| 233 | cpumask_t waitmask; /* waitmask is shared by all cpus */ | 197 | local_irq_save(flags); |
| 234 | 198 | ||
| 235 | cpumask_copy(&waitmask, &callmap); | 199 | for_each_cpu(cpu, cpumask) { |
| 236 | for_each_cpu(cpu, &callmap) { | 200 | bfin_ipi_data = &per_cpu(bfin_ipi, cpu); |
| 237 | msg_queue = &per_cpu(ipi_msg_queue, cpu); | 201 | smp_mb(); |
| 238 | spin_lock_irqsave(&msg_queue->lock, flags); | 202 | set_bit(msg, &bfin_ipi_data->bits); |
| 239 | if (msg_queue->count < BFIN_IPI_MSGQ_LEN) { | 203 | bfin_ipi_data->count++; |
| 240 | next_msg = (msg_queue->head + msg_queue->count) | ||
| 241 | % BFIN_IPI_MSGQ_LEN; | ||
| 242 | msg = &msg_queue->ipi_message[next_msg]; | ||
| 243 | msg->type = type; | ||
| 244 | if (type == BFIN_IPI_CALL_FUNC) { | ||
| 245 | msg->call_struct.func = func; | ||
| 246 | msg->call_struct.info = info; | ||
| 247 | msg->call_struct.wait = wait; | ||
| 248 | msg->call_struct.waitmask = &waitmask; | ||
| 249 | } | ||
| 250 | msg_queue->count++; | ||
| 251 | } else | ||
| 252 | panic("IPI message queue overflow\n"); | ||
| 253 | spin_unlock_irqrestore(&msg_queue->lock, flags); | ||
| 254 | platform_send_ipi_cpu(cpu, IRQ_SUPPLE_1); | 204 | platform_send_ipi_cpu(cpu, IRQ_SUPPLE_1); |
| 255 | } | 205 | } |
| 256 | 206 | ||
| 257 | if (wait) { | 207 | local_irq_restore(flags); |
| 258 | while (!cpumask_empty(&waitmask)) | ||
| 259 | blackfin_dcache_invalidate_range( | ||
| 260 | (unsigned long)(&waitmask), | ||
| 261 | (unsigned long)(&waitmask)); | ||
| 262 | #ifdef __ARCH_SYNC_CORE_DCACHE | ||
| 263 | /* | ||
| 264 | * Invalidate D cache in case shared data was changed by | ||
| 265 | * other processors to ensure cache coherence. | ||
| 266 | */ | ||
| 267 | resync_core_dcache(); | ||
| 268 | #endif | ||
| 269 | } | ||
| 270 | } | 208 | } |
| 271 | 209 | ||
| 272 | int smp_call_function(void (*func)(void *info), void *info, int wait) | 210 | void arch_send_call_function_single_ipi(int cpu) |
| 273 | { | 211 | { |
| 274 | cpumask_t callmap; | 212 | send_ipi(cpumask_of(cpu), BFIN_IPI_CALL_FUNC_SINGLE); |
| 275 | |||
| 276 | preempt_disable(); | ||
| 277 | cpumask_copy(&callmap, cpu_online_mask); | ||
| 278 | cpumask_clear_cpu(smp_processor_id(), &callmap); | ||
| 279 | if (!cpumask_empty(&callmap)) | ||
| 280 | smp_send_message(callmap, BFIN_IPI_CALL_FUNC, func, info, wait); | ||
| 281 | |||
| 282 | preempt_enable(); | ||
| 283 | |||
| 284 | return 0; | ||
| 285 | } | 213 | } |
| 286 | EXPORT_SYMBOL_GPL(smp_call_function); | ||
| 287 | 214 | ||
| 288 | int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, | 215 | void arch_send_call_function_ipi_mask(const struct cpumask *mask) |
| 289 | int wait) | ||
| 290 | { | 216 | { |
| 291 | unsigned int cpu = cpuid; | 217 | send_ipi(mask, BFIN_IPI_CALL_FUNC); |
| 292 | cpumask_t callmap; | ||
| 293 | |||
| 294 | if (cpu_is_offline(cpu)) | ||
| 295 | return 0; | ||
| 296 | cpumask_clear(&callmap); | ||
| 297 | cpumask_set_cpu(cpu, &callmap); | ||
| 298 | |||
| 299 | smp_send_message(callmap, BFIN_IPI_CALL_FUNC, func, info, wait); | ||
| 300 | |||
| 301 | return 0; | ||
| 302 | } | 218 | } |
| 303 | EXPORT_SYMBOL_GPL(smp_call_function_single); | ||
| 304 | 219 | ||
| 305 | void smp_send_reschedule(int cpu) | 220 | void smp_send_reschedule(int cpu) |
| 306 | { | 221 | { |
| 307 | cpumask_t callmap; | 222 | send_ipi(cpumask_of(cpu), BFIN_IPI_RESCHEDULE); |
| 308 | /* simply trigger an ipi */ | ||
| 309 | |||
| 310 | cpumask_clear(&callmap); | ||
| 311 | cpumask_set_cpu(cpu, &callmap); | ||
| 312 | |||
| 313 | smp_send_message(callmap, BFIN_IPI_RESCHEDULE, NULL, NULL, 0); | ||
| 314 | 223 | ||
| 315 | return; | 224 | return; |
| 316 | } | 225 | } |
| 317 | 226 | ||
| 318 | void smp_send_msg(const struct cpumask *mask, unsigned long type) | 227 | void smp_send_msg(const struct cpumask *mask, unsigned long type) |
| 319 | { | 228 | { |
| 320 | smp_send_message(*mask, type, NULL, NULL, 0); | 229 | send_ipi(mask, type); |
| 321 | } | 230 | } |
| 322 | 231 | ||
| 323 | void smp_timer_broadcast(const struct cpumask *mask) | 232 | void smp_timer_broadcast(const struct cpumask *mask) |
| @@ -333,7 +242,7 @@ void smp_send_stop(void) | |||
| 333 | cpumask_copy(&callmap, cpu_online_mask); | 242 | cpumask_copy(&callmap, cpu_online_mask); |
| 334 | cpumask_clear_cpu(smp_processor_id(), &callmap); | 243 | cpumask_clear_cpu(smp_processor_id(), &callmap); |
| 335 | if (!cpumask_empty(&callmap)) | 244 | if (!cpumask_empty(&callmap)) |
| 336 | smp_send_message(callmap, BFIN_IPI_CPU_STOP, NULL, NULL, 0); | 245 | send_ipi(&callmap, BFIN_IPI_CPU_STOP); |
| 337 | 246 | ||
| 338 | preempt_enable(); | 247 | preempt_enable(); |
| 339 | 248 | ||
| @@ -436,7 +345,7 @@ void __init smp_prepare_boot_cpu(void) | |||
| 436 | void __init smp_prepare_cpus(unsigned int max_cpus) | 345 | void __init smp_prepare_cpus(unsigned int max_cpus) |
| 437 | { | 346 | { |
| 438 | platform_prepare_cpus(max_cpus); | 347 | platform_prepare_cpus(max_cpus); |
| 439 | ipi_queue_init(); | 348 | bfin_ipi_init(); |
| 440 | platform_request_ipi(IRQ_SUPPLE_0, ipi_handler_int0); | 349 | platform_request_ipi(IRQ_SUPPLE_0, ipi_handler_int0); |
| 441 | platform_request_ipi(IRQ_SUPPLE_1, ipi_handler_int1); | 350 | platform_request_ipi(IRQ_SUPPLE_1, ipi_handler_int1); |
| 442 | } | 351 | } |
diff --git a/arch/m68k/platform/coldfire/clk.c b/arch/m68k/platform/coldfire/clk.c index 75f9ee967ea7..9cd13b4ce42b 100644 --- a/arch/m68k/platform/coldfire/clk.c +++ b/arch/m68k/platform/coldfire/clk.c | |||
| @@ -146,9 +146,3 @@ struct clk_ops clk_ops1 = { | |||
| 146 | }; | 146 | }; |
| 147 | #endif /* MCFPM_PPMCR1 */ | 147 | #endif /* MCFPM_PPMCR1 */ |
| 148 | #endif /* MCFPM_PPMCR0 */ | 148 | #endif /* MCFPM_PPMCR0 */ |
| 149 | |||
| 150 | struct clk *devm_clk_get(struct device *dev, const char *id) | ||
| 151 | { | ||
| 152 | return NULL; | ||
| 153 | } | ||
| 154 | EXPORT_SYMBOL(devm_clk_get); | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 331d574df99c..faf65286574e 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -89,6 +89,7 @@ config ATH79 | |||
| 89 | select CEVT_R4K | 89 | select CEVT_R4K |
| 90 | select CSRC_R4K | 90 | select CSRC_R4K |
| 91 | select DMA_NONCOHERENT | 91 | select DMA_NONCOHERENT |
| 92 | select HAVE_CLK | ||
| 92 | select IRQ_CPU | 93 | select IRQ_CPU |
| 93 | select MIPS_MACHINE | 94 | select MIPS_MACHINE |
| 94 | select SYS_HAS_CPU_MIPS32_R2 | 95 | select SYS_HAS_CPU_MIPS32_R2 |
diff --git a/arch/mips/alchemy/board-mtx1.c b/arch/mips/alchemy/board-mtx1.c index 99969484c475..a124c251c0c9 100644 --- a/arch/mips/alchemy/board-mtx1.c +++ b/arch/mips/alchemy/board-mtx1.c | |||
| @@ -228,6 +228,8 @@ static int mtx1_pci_idsel(unsigned int devsel, int assert) | |||
| 228 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom | 228 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom |
| 229 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. | 229 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. |
| 230 | */ | 230 | */ |
| 231 | udelay(1); | ||
| 232 | |||
| 231 | if (assert && devsel != 0) | 233 | if (assert && devsel != 0) |
| 232 | /* Suppress signal to Cardbus */ | 234 | /* Suppress signal to Cardbus */ |
| 233 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ | 235 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ |
diff --git a/arch/mips/ath79/dev-usb.c b/arch/mips/ath79/dev-usb.c index 36e9570e7bc4..b2a2311ec85b 100644 --- a/arch/mips/ath79/dev-usb.c +++ b/arch/mips/ath79/dev-usb.c | |||
| @@ -145,6 +145,8 @@ static void __init ar7240_usb_setup(void) | |||
| 145 | 145 | ||
| 146 | ath79_ohci_resources[0].start = AR7240_OHCI_BASE; | 146 | ath79_ohci_resources[0].start = AR7240_OHCI_BASE; |
| 147 | ath79_ohci_resources[0].end = AR7240_OHCI_BASE + AR7240_OHCI_SIZE - 1; | 147 | ath79_ohci_resources[0].end = AR7240_OHCI_BASE + AR7240_OHCI_SIZE - 1; |
| 148 | ath79_ohci_resources[1].start = ATH79_CPU_IRQ_USB; | ||
| 149 | ath79_ohci_resources[1].end = ATH79_CPU_IRQ_USB; | ||
| 148 | platform_device_register(&ath79_ohci_device); | 150 | platform_device_register(&ath79_ohci_device); |
| 149 | } | 151 | } |
| 150 | 152 | ||
diff --git a/arch/mips/ath79/gpio.c b/arch/mips/ath79/gpio.c index 29054f211832..48fe762d2526 100644 --- a/arch/mips/ath79/gpio.c +++ b/arch/mips/ath79/gpio.c | |||
| @@ -188,8 +188,10 @@ void __init ath79_gpio_init(void) | |||
| 188 | 188 | ||
| 189 | if (soc_is_ar71xx()) | 189 | if (soc_is_ar71xx()) |
| 190 | ath79_gpio_count = AR71XX_GPIO_COUNT; | 190 | ath79_gpio_count = AR71XX_GPIO_COUNT; |
| 191 | else if (soc_is_ar724x()) | 191 | else if (soc_is_ar7240()) |
| 192 | ath79_gpio_count = AR724X_GPIO_COUNT; | 192 | ath79_gpio_count = AR7240_GPIO_COUNT; |
| 193 | else if (soc_is_ar7241() || soc_is_ar7242()) | ||
| 194 | ath79_gpio_count = AR7241_GPIO_COUNT; | ||
| 193 | else if (soc_is_ar913x()) | 195 | else if (soc_is_ar913x()) |
| 194 | ath79_gpio_count = AR913X_GPIO_COUNT; | 196 | ath79_gpio_count = AR913X_GPIO_COUNT; |
| 195 | else if (soc_is_ar933x()) | 197 | else if (soc_is_ar933x()) |
diff --git a/arch/mips/bcm63xx/dev-spi.c b/arch/mips/bcm63xx/dev-spi.c index e39f73048d4f..f1c9c3e2f678 100644 --- a/arch/mips/bcm63xx/dev-spi.c +++ b/arch/mips/bcm63xx/dev-spi.c | |||
| @@ -106,11 +106,15 @@ int __init bcm63xx_spi_register(void) | |||
| 106 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { | 106 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { |
| 107 | spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1; | 107 | spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1; |
| 108 | spi_pdata.fifo_size = SPI_6338_MSG_DATA_SIZE; | 108 | spi_pdata.fifo_size = SPI_6338_MSG_DATA_SIZE; |
| 109 | spi_pdata.msg_type_shift = SPI_6338_MSG_TYPE_SHIFT; | ||
| 110 | spi_pdata.msg_ctl_width = SPI_6338_MSG_CTL_WIDTH; | ||
| 109 | } | 111 | } |
| 110 | 112 | ||
| 111 | if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) { | 113 | if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) { |
| 112 | spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1; | 114 | spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1; |
| 113 | spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE; | 115 | spi_pdata.fifo_size = SPI_6358_MSG_DATA_SIZE; |
| 116 | spi_pdata.msg_type_shift = SPI_6358_MSG_TYPE_SHIFT; | ||
| 117 | spi_pdata.msg_ctl_width = SPI_6358_MSG_CTL_WIDTH; | ||
| 114 | } | 118 | } |
| 115 | 119 | ||
| 116 | bcm63xx_spi_regs_init(); | 120 | bcm63xx_spi_regs_init(); |
diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c index 7fb1f222b8a5..274cd4fad30c 100644 --- a/arch/mips/cavium-octeon/octeon-irq.c +++ b/arch/mips/cavium-octeon/octeon-irq.c | |||
| @@ -61,6 +61,12 @@ static void octeon_irq_set_ciu_mapping(int irq, int line, int bit, | |||
| 61 | octeon_irq_ciu_to_irq[line][bit] = irq; | 61 | octeon_irq_ciu_to_irq[line][bit] = irq; |
| 62 | } | 62 | } |
| 63 | 63 | ||
| 64 | static void octeon_irq_force_ciu_mapping(struct irq_domain *domain, | ||
| 65 | int irq, int line, int bit) | ||
| 66 | { | ||
| 67 | irq_domain_associate(domain, irq, line << 6 | bit); | ||
| 68 | } | ||
| 69 | |||
| 64 | static int octeon_coreid_for_cpu(int cpu) | 70 | static int octeon_coreid_for_cpu(int cpu) |
| 65 | { | 71 | { |
| 66 | #ifdef CONFIG_SMP | 72 | #ifdef CONFIG_SMP |
| @@ -183,19 +189,9 @@ static void __init octeon_irq_init_core(void) | |||
| 183 | mutex_init(&cd->core_irq_mutex); | 189 | mutex_init(&cd->core_irq_mutex); |
| 184 | 190 | ||
| 185 | irq = OCTEON_IRQ_SW0 + i; | 191 | irq = OCTEON_IRQ_SW0 + i; |
| 186 | switch (irq) { | 192 | irq_set_chip_data(irq, cd); |
| 187 | case OCTEON_IRQ_TIMER: | 193 | irq_set_chip_and_handler(irq, &octeon_irq_chip_core, |
| 188 | case OCTEON_IRQ_SW0: | 194 | handle_percpu_irq); |
| 189 | case OCTEON_IRQ_SW1: | ||
| 190 | case OCTEON_IRQ_5: | ||
| 191 | case OCTEON_IRQ_PERF: | ||
| 192 | irq_set_chip_data(irq, cd); | ||
| 193 | irq_set_chip_and_handler(irq, &octeon_irq_chip_core, | ||
| 194 | handle_percpu_irq); | ||
| 195 | break; | ||
| 196 | default: | ||
| 197 | break; | ||
| 198 | } | ||
| 199 | } | 195 | } |
| 200 | } | 196 | } |
| 201 | 197 | ||
| @@ -890,7 +886,6 @@ static int octeon_irq_gpio_xlat(struct irq_domain *d, | |||
| 890 | unsigned int type; | 886 | unsigned int type; |
| 891 | unsigned int pin; | 887 | unsigned int pin; |
| 892 | unsigned int trigger; | 888 | unsigned int trigger; |
| 893 | struct octeon_irq_gpio_domain_data *gpiod; | ||
| 894 | 889 | ||
| 895 | if (d->of_node != node) | 890 | if (d->of_node != node) |
| 896 | return -EINVAL; | 891 | return -EINVAL; |
| @@ -925,8 +920,7 @@ static int octeon_irq_gpio_xlat(struct irq_domain *d, | |||
| 925 | break; | 920 | break; |
| 926 | } | 921 | } |
| 927 | *out_type = type; | 922 | *out_type = type; |
| 928 | gpiod = d->host_data; | 923 | *out_hwirq = pin; |
| 929 | *out_hwirq = gpiod->base_hwirq + pin; | ||
| 930 | 924 | ||
| 931 | return 0; | 925 | return 0; |
| 932 | } | 926 | } |
| @@ -996,19 +990,21 @@ static int octeon_irq_ciu_map(struct irq_domain *d, | |||
| 996 | static int octeon_irq_gpio_map(struct irq_domain *d, | 990 | static int octeon_irq_gpio_map(struct irq_domain *d, |
| 997 | unsigned int virq, irq_hw_number_t hw) | 991 | unsigned int virq, irq_hw_number_t hw) |
| 998 | { | 992 | { |
| 999 | unsigned int line = hw >> 6; | 993 | struct octeon_irq_gpio_domain_data *gpiod = d->host_data; |
| 1000 | unsigned int bit = hw & 63; | 994 | unsigned int line, bit; |
| 1001 | 995 | ||
| 1002 | if (!octeon_irq_virq_in_range(virq)) | 996 | if (!octeon_irq_virq_in_range(virq)) |
| 1003 | return -EINVAL; | 997 | return -EINVAL; |
| 1004 | 998 | ||
| 999 | hw += gpiod->base_hwirq; | ||
| 1000 | line = hw >> 6; | ||
| 1001 | bit = hw & 63; | ||
| 1005 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) | 1002 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) |
| 1006 | return -EINVAL; | 1003 | return -EINVAL; |
| 1007 | 1004 | ||
| 1008 | octeon_irq_set_ciu_mapping(virq, line, bit, | 1005 | octeon_irq_set_ciu_mapping(virq, line, bit, |
| 1009 | octeon_irq_gpio_chip, | 1006 | octeon_irq_gpio_chip, |
| 1010 | octeon_irq_handle_gpio); | 1007 | octeon_irq_handle_gpio); |
| 1011 | |||
| 1012 | return 0; | 1008 | return 0; |
| 1013 | } | 1009 | } |
| 1014 | 1010 | ||
| @@ -1149,6 +1145,7 @@ static void __init octeon_irq_init_ciu(void) | |||
| 1149 | struct irq_chip *chip_wd; | 1145 | struct irq_chip *chip_wd; |
| 1150 | struct device_node *gpio_node; | 1146 | struct device_node *gpio_node; |
| 1151 | struct device_node *ciu_node; | 1147 | struct device_node *ciu_node; |
| 1148 | struct irq_domain *ciu_domain = NULL; | ||
| 1152 | 1149 | ||
| 1153 | octeon_irq_init_ciu_percpu(); | 1150 | octeon_irq_init_ciu_percpu(); |
| 1154 | octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu; | 1151 | octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu; |
| @@ -1177,31 +1174,6 @@ static void __init octeon_irq_init_ciu(void) | |||
| 1177 | /* Mips internal */ | 1174 | /* Mips internal */ |
| 1178 | octeon_irq_init_core(); | 1175 | octeon_irq_init_core(); |
| 1179 | 1176 | ||
| 1180 | /* CIU_0 */ | ||
| 1181 | for (i = 0; i < 16; i++) | ||
| 1182 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WORKQ0, 0, i + 0, chip, handle_level_irq); | ||
| 1183 | |||
| 1184 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX0, 0, 32, chip_mbox, handle_percpu_irq); | ||
| 1185 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX1, 0, 33, chip_mbox, handle_percpu_irq); | ||
| 1186 | |||
| 1187 | for (i = 0; i < 4; i++) | ||
| 1188 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_PCI_INT0, 0, i + 36, chip, handle_level_irq); | ||
| 1189 | for (i = 0; i < 4; i++) | ||
| 1190 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_PCI_MSI0, 0, i + 40, chip, handle_level_irq); | ||
| 1191 | |||
| 1192 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_RML, 0, 46, chip, handle_level_irq); | ||
| 1193 | for (i = 0; i < 4; i++) | ||
| 1194 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_TIMER0, 0, i + 52, chip, handle_edge_irq); | ||
| 1195 | |||
| 1196 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_USB0, 0, 56, chip, handle_level_irq); | ||
| 1197 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_BOOTDMA, 0, 63, chip, handle_level_irq); | ||
| 1198 | |||
| 1199 | /* CIU_1 */ | ||
| 1200 | for (i = 0; i < 16; i++) | ||
| 1201 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WDOG0, 1, i + 0, chip_wd, handle_level_irq); | ||
| 1202 | |||
| 1203 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_USB1, 1, 17, chip, handle_level_irq); | ||
| 1204 | |||
| 1205 | gpio_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-gpio"); | 1177 | gpio_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-gpio"); |
| 1206 | if (gpio_node) { | 1178 | if (gpio_node) { |
| 1207 | struct octeon_irq_gpio_domain_data *gpiod; | 1179 | struct octeon_irq_gpio_domain_data *gpiod; |
| @@ -1219,10 +1191,35 @@ static void __init octeon_irq_init_ciu(void) | |||
| 1219 | 1191 | ||
| 1220 | ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-ciu"); | 1192 | ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-ciu"); |
| 1221 | if (ciu_node) { | 1193 | if (ciu_node) { |
| 1222 | irq_domain_add_tree(ciu_node, &octeon_irq_domain_ciu_ops, NULL); | 1194 | ciu_domain = irq_domain_add_tree(ciu_node, &octeon_irq_domain_ciu_ops, NULL); |
| 1223 | of_node_put(ciu_node); | 1195 | of_node_put(ciu_node); |
| 1224 | } else | 1196 | } else |
| 1225 | pr_warn("Cannot find device node for cavium,octeon-3860-ciu.\n"); | 1197 | panic("Cannot find device node for cavium,octeon-3860-ciu."); |
| 1198 | |||
| 1199 | /* CIU_0 */ | ||
| 1200 | for (i = 0; i < 16; i++) | ||
| 1201 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_WORKQ0, 0, i + 0); | ||
| 1202 | |||
| 1203 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX0, 0, 32, chip_mbox, handle_percpu_irq); | ||
| 1204 | octeon_irq_set_ciu_mapping(OCTEON_IRQ_MBOX1, 0, 33, chip_mbox, handle_percpu_irq); | ||
| 1205 | |||
| 1206 | for (i = 0; i < 4; i++) | ||
| 1207 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_PCI_INT0, 0, i + 36); | ||
| 1208 | for (i = 0; i < 4; i++) | ||
| 1209 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_PCI_MSI0, 0, i + 40); | ||
| 1210 | |||
| 1211 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_RML, 0, 46); | ||
| 1212 | for (i = 0; i < 4; i++) | ||
| 1213 | octeon_irq_force_ciu_mapping(ciu_domain, i + OCTEON_IRQ_TIMER0, 0, i + 52); | ||
| 1214 | |||
| 1215 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_USB0, 0, 56); | ||
| 1216 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_BOOTDMA, 0, 63); | ||
| 1217 | |||
| 1218 | /* CIU_1 */ | ||
| 1219 | for (i = 0; i < 16; i++) | ||
| 1220 | octeon_irq_set_ciu_mapping(i + OCTEON_IRQ_WDOG0, 1, i + 0, chip_wd, handle_level_irq); | ||
| 1221 | |||
| 1222 | octeon_irq_force_ciu_mapping(ciu_domain, OCTEON_IRQ_USB1, 1, 17); | ||
| 1226 | 1223 | ||
| 1227 | /* Enable the CIU lines */ | 1224 | /* Enable the CIU lines */ |
| 1228 | set_c0_status(STATUSF_IP3 | STATUSF_IP2); | 1225 | set_c0_status(STATUSF_IP3 | STATUSF_IP2); |
diff --git a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h index 1caa78ad06d5..dde504477fac 100644 --- a/arch/mips/include/asm/mach-ath79/ar71xx_regs.h +++ b/arch/mips/include/asm/mach-ath79/ar71xx_regs.h | |||
| @@ -393,7 +393,8 @@ | |||
| 393 | #define AR71XX_GPIO_REG_FUNC 0x28 | 393 | #define AR71XX_GPIO_REG_FUNC 0x28 |
| 394 | 394 | ||
| 395 | #define AR71XX_GPIO_COUNT 16 | 395 | #define AR71XX_GPIO_COUNT 16 |
| 396 | #define AR724X_GPIO_COUNT 18 | 396 | #define AR7240_GPIO_COUNT 18 |
| 397 | #define AR7241_GPIO_COUNT 20 | ||
| 397 | #define AR913X_GPIO_COUNT 22 | 398 | #define AR913X_GPIO_COUNT 22 |
| 398 | #define AR933X_GPIO_COUNT 30 | 399 | #define AR933X_GPIO_COUNT 30 |
| 399 | #define AR934X_GPIO_COUNT 23 | 400 | #define AR934X_GPIO_COUNT 23 |
diff --git a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h index 4476fa03bf36..6ddae926bf79 100644 --- a/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h +++ b/arch/mips/include/asm/mach-ath79/cpu-feature-overrides.h | |||
| @@ -42,7 +42,6 @@ | |||
| 42 | #define cpu_has_mips64r1 0 | 42 | #define cpu_has_mips64r1 0 |
| 43 | #define cpu_has_mips64r2 0 | 43 | #define cpu_has_mips64r2 0 |
| 44 | 44 | ||
| 45 | #define cpu_has_dsp 0 | ||
| 46 | #define cpu_has_mipsmt 0 | 45 | #define cpu_has_mipsmt 0 |
| 47 | 46 | ||
| 48 | #define cpu_has_64bits 0 | 47 | #define cpu_has_64bits 0 |
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h index 7d98dbe5d4b5..c9bae1362606 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_dev_spi.h | |||
| @@ -9,6 +9,8 @@ int __init bcm63xx_spi_register(void); | |||
| 9 | 9 | ||
| 10 | struct bcm63xx_spi_pdata { | 10 | struct bcm63xx_spi_pdata { |
| 11 | unsigned int fifo_size; | 11 | unsigned int fifo_size; |
| 12 | unsigned int msg_type_shift; | ||
| 13 | unsigned int msg_ctl_width; | ||
| 12 | int bus_num; | 14 | int bus_num; |
| 13 | int num_chipselect; | 15 | int num_chipselect; |
| 14 | u32 speed_hz; | 16 | u32 speed_hz; |
diff --git a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h index 4ccc2a748aff..61f2a2a5099d 100644 --- a/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h +++ b/arch/mips/include/asm/mach-bcm63xx/bcm63xx_regs.h | |||
| @@ -1054,7 +1054,8 @@ | |||
| 1054 | #define SPI_6338_FILL_BYTE 0x07 | 1054 | #define SPI_6338_FILL_BYTE 0x07 |
| 1055 | #define SPI_6338_MSG_TAIL 0x09 | 1055 | #define SPI_6338_MSG_TAIL 0x09 |
| 1056 | #define SPI_6338_RX_TAIL 0x0b | 1056 | #define SPI_6338_RX_TAIL 0x0b |
| 1057 | #define SPI_6338_MSG_CTL 0x40 | 1057 | #define SPI_6338_MSG_CTL 0x40 /* 8-bits register */ |
| 1058 | #define SPI_6338_MSG_CTL_WIDTH 8 | ||
| 1058 | #define SPI_6338_MSG_DATA 0x41 | 1059 | #define SPI_6338_MSG_DATA 0x41 |
| 1059 | #define SPI_6338_MSG_DATA_SIZE 0x3f | 1060 | #define SPI_6338_MSG_DATA_SIZE 0x3f |
| 1060 | #define SPI_6338_RX_DATA 0x80 | 1061 | #define SPI_6338_RX_DATA 0x80 |
| @@ -1070,7 +1071,8 @@ | |||
| 1070 | #define SPI_6348_FILL_BYTE 0x07 | 1071 | #define SPI_6348_FILL_BYTE 0x07 |
| 1071 | #define SPI_6348_MSG_TAIL 0x09 | 1072 | #define SPI_6348_MSG_TAIL 0x09 |
| 1072 | #define SPI_6348_RX_TAIL 0x0b | 1073 | #define SPI_6348_RX_TAIL 0x0b |
| 1073 | #define SPI_6348_MSG_CTL 0x40 | 1074 | #define SPI_6348_MSG_CTL 0x40 /* 8-bits register */ |
| 1075 | #define SPI_6348_MSG_CTL_WIDTH 8 | ||
| 1074 | #define SPI_6348_MSG_DATA 0x41 | 1076 | #define SPI_6348_MSG_DATA 0x41 |
| 1075 | #define SPI_6348_MSG_DATA_SIZE 0x3f | 1077 | #define SPI_6348_MSG_DATA_SIZE 0x3f |
| 1076 | #define SPI_6348_RX_DATA 0x80 | 1078 | #define SPI_6348_RX_DATA 0x80 |
| @@ -1078,6 +1080,7 @@ | |||
| 1078 | 1080 | ||
| 1079 | /* BCM 6358 SPI core */ | 1081 | /* BCM 6358 SPI core */ |
| 1080 | #define SPI_6358_MSG_CTL 0x00 /* 16-bits register */ | 1082 | #define SPI_6358_MSG_CTL 0x00 /* 16-bits register */ |
| 1083 | #define SPI_6358_MSG_CTL_WIDTH 16 | ||
| 1081 | #define SPI_6358_MSG_DATA 0x02 | 1084 | #define SPI_6358_MSG_DATA 0x02 |
| 1082 | #define SPI_6358_MSG_DATA_SIZE 0x21e | 1085 | #define SPI_6358_MSG_DATA_SIZE 0x21e |
| 1083 | #define SPI_6358_RX_DATA 0x400 | 1086 | #define SPI_6358_RX_DATA 0x400 |
| @@ -1094,6 +1097,7 @@ | |||
| 1094 | 1097 | ||
| 1095 | /* BCM 6358 SPI core */ | 1098 | /* BCM 6358 SPI core */ |
| 1096 | #define SPI_6368_MSG_CTL 0x00 /* 16-bits register */ | 1099 | #define SPI_6368_MSG_CTL 0x00 /* 16-bits register */ |
| 1100 | #define SPI_6368_MSG_CTL_WIDTH 16 | ||
| 1097 | #define SPI_6368_MSG_DATA 0x02 | 1101 | #define SPI_6368_MSG_DATA 0x02 |
| 1098 | #define SPI_6368_MSG_DATA_SIZE 0x21e | 1102 | #define SPI_6368_MSG_DATA_SIZE 0x21e |
| 1099 | #define SPI_6368_RX_DATA 0x400 | 1103 | #define SPI_6368_RX_DATA 0x400 |
| @@ -1115,7 +1119,10 @@ | |||
| 1115 | #define SPI_HD_W 0x01 | 1119 | #define SPI_HD_W 0x01 |
| 1116 | #define SPI_HD_R 0x02 | 1120 | #define SPI_HD_R 0x02 |
| 1117 | #define SPI_BYTE_CNT_SHIFT 0 | 1121 | #define SPI_BYTE_CNT_SHIFT 0 |
| 1118 | #define SPI_MSG_TYPE_SHIFT 14 | 1122 | #define SPI_6338_MSG_TYPE_SHIFT 6 |
| 1123 | #define SPI_6348_MSG_TYPE_SHIFT 6 | ||
| 1124 | #define SPI_6358_MSG_TYPE_SHIFT 14 | ||
| 1125 | #define SPI_6368_MSG_TYPE_SHIFT 14 | ||
| 1119 | 1126 | ||
| 1120 | /* Command */ | 1127 | /* Command */ |
| 1121 | #define SPI_CMD_NOOP 0x00 | 1128 | #define SPI_CMD_NOOP 0x00 |
diff --git a/arch/mips/include/asm/mach-cavium-octeon/irq.h b/arch/mips/include/asm/mach-cavium-octeon/irq.h index 418992042f6f..c22a3078bf11 100644 --- a/arch/mips/include/asm/mach-cavium-octeon/irq.h +++ b/arch/mips/include/asm/mach-cavium-octeon/irq.h | |||
| @@ -21,14 +21,10 @@ enum octeon_irq { | |||
| 21 | OCTEON_IRQ_TIMER, | 21 | OCTEON_IRQ_TIMER, |
| 22 | /* sources in CIU_INTX_EN0 */ | 22 | /* sources in CIU_INTX_EN0 */ |
| 23 | OCTEON_IRQ_WORKQ0, | 23 | OCTEON_IRQ_WORKQ0, |
| 24 | OCTEON_IRQ_GPIO0 = OCTEON_IRQ_WORKQ0 + 16, | 24 | OCTEON_IRQ_WDOG0 = OCTEON_IRQ_WORKQ0 + 16, |
| 25 | OCTEON_IRQ_WDOG0 = OCTEON_IRQ_GPIO0 + 16, | ||
| 26 | OCTEON_IRQ_WDOG15 = OCTEON_IRQ_WDOG0 + 15, | 25 | OCTEON_IRQ_WDOG15 = OCTEON_IRQ_WDOG0 + 15, |
| 27 | OCTEON_IRQ_MBOX0 = OCTEON_IRQ_WDOG0 + 16, | 26 | OCTEON_IRQ_MBOX0 = OCTEON_IRQ_WDOG0 + 16, |
| 28 | OCTEON_IRQ_MBOX1, | 27 | OCTEON_IRQ_MBOX1, |
| 29 | OCTEON_IRQ_UART0, | ||
| 30 | OCTEON_IRQ_UART1, | ||
| 31 | OCTEON_IRQ_UART2, | ||
| 32 | OCTEON_IRQ_PCI_INT0, | 28 | OCTEON_IRQ_PCI_INT0, |
| 33 | OCTEON_IRQ_PCI_INT1, | 29 | OCTEON_IRQ_PCI_INT1, |
| 34 | OCTEON_IRQ_PCI_INT2, | 30 | OCTEON_IRQ_PCI_INT2, |
| @@ -38,8 +34,6 @@ enum octeon_irq { | |||
| 38 | OCTEON_IRQ_PCI_MSI2, | 34 | OCTEON_IRQ_PCI_MSI2, |
| 39 | OCTEON_IRQ_PCI_MSI3, | 35 | OCTEON_IRQ_PCI_MSI3, |
| 40 | 36 | ||
| 41 | OCTEON_IRQ_TWSI, | ||
| 42 | OCTEON_IRQ_TWSI2, | ||
| 43 | OCTEON_IRQ_RML, | 37 | OCTEON_IRQ_RML, |
| 44 | OCTEON_IRQ_TIMER0, | 38 | OCTEON_IRQ_TIMER0, |
| 45 | OCTEON_IRQ_TIMER1, | 39 | OCTEON_IRQ_TIMER1, |
| @@ -47,8 +41,6 @@ enum octeon_irq { | |||
| 47 | OCTEON_IRQ_TIMER3, | 41 | OCTEON_IRQ_TIMER3, |
| 48 | OCTEON_IRQ_USB0, | 42 | OCTEON_IRQ_USB0, |
| 49 | OCTEON_IRQ_USB1, | 43 | OCTEON_IRQ_USB1, |
| 50 | OCTEON_IRQ_MII0, | ||
| 51 | OCTEON_IRQ_MII1, | ||
| 52 | OCTEON_IRQ_BOOTDMA, | 44 | OCTEON_IRQ_BOOTDMA, |
| 53 | #ifndef CONFIG_PCI_MSI | 45 | #ifndef CONFIG_PCI_MSI |
| 54 | OCTEON_IRQ_LAST = 127 | 46 | OCTEON_IRQ_LAST = 127 |
diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h index 7531ecd654d6..dca8bce8c7ab 100644 --- a/arch/mips/include/asm/module.h +++ b/arch/mips/include/asm/module.h | |||
| @@ -10,6 +10,7 @@ struct mod_arch_specific { | |||
| 10 | struct list_head dbe_list; | 10 | struct list_head dbe_list; |
| 11 | const struct exception_table_entry *dbe_start; | 11 | const struct exception_table_entry *dbe_start; |
| 12 | const struct exception_table_entry *dbe_end; | 12 | const struct exception_table_entry *dbe_end; |
| 13 | struct mips_hi16 *r_mips_hi16_list; | ||
| 13 | }; | 14 | }; |
| 14 | 15 | ||
| 15 | typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ | 16 | typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ |
diff --git a/arch/mips/include/asm/r4k-timer.h b/arch/mips/include/asm/r4k-timer.h index a37d12b3b61c..afe9e0e03fe9 100644 --- a/arch/mips/include/asm/r4k-timer.h +++ b/arch/mips/include/asm/r4k-timer.h | |||
| @@ -12,16 +12,16 @@ | |||
| 12 | 12 | ||
| 13 | #ifdef CONFIG_SYNC_R4K | 13 | #ifdef CONFIG_SYNC_R4K |
| 14 | 14 | ||
| 15 | extern void synchronise_count_master(void); | 15 | extern void synchronise_count_master(int cpu); |
| 16 | extern void synchronise_count_slave(void); | 16 | extern void synchronise_count_slave(int cpu); |
| 17 | 17 | ||
| 18 | #else | 18 | #else |
| 19 | 19 | ||
| 20 | static inline void synchronise_count_master(void) | 20 | static inline void synchronise_count_master(int cpu) |
| 21 | { | 21 | { |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | static inline void synchronise_count_slave(void) | 24 | static inline void synchronise_count_slave(int cpu) |
| 25 | { | 25 | { |
| 26 | } | 26 | } |
| 27 | 27 | ||
diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c index a5066b1c3de3..4f8c3cba8c0c 100644 --- a/arch/mips/kernel/module.c +++ b/arch/mips/kernel/module.c | |||
| @@ -39,8 +39,6 @@ struct mips_hi16 { | |||
| 39 | Elf_Addr value; | 39 | Elf_Addr value; |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | static struct mips_hi16 *mips_hi16_list; | ||
| 43 | |||
| 44 | static LIST_HEAD(dbe_list); | 42 | static LIST_HEAD(dbe_list); |
| 45 | static DEFINE_SPINLOCK(dbe_lock); | 43 | static DEFINE_SPINLOCK(dbe_lock); |
| 46 | 44 | ||
| @@ -128,8 +126,8 @@ static int apply_r_mips_hi16_rel(struct module *me, u32 *location, Elf_Addr v) | |||
| 128 | 126 | ||
| 129 | n->addr = (Elf_Addr *)location; | 127 | n->addr = (Elf_Addr *)location; |
| 130 | n->value = v; | 128 | n->value = v; |
| 131 | n->next = mips_hi16_list; | 129 | n->next = me->arch.r_mips_hi16_list; |
| 132 | mips_hi16_list = n; | 130 | me->arch.r_mips_hi16_list = n; |
| 133 | 131 | ||
| 134 | return 0; | 132 | return 0; |
| 135 | } | 133 | } |
| @@ -142,18 +140,28 @@ static int apply_r_mips_hi16_rela(struct module *me, u32 *location, Elf_Addr v) | |||
| 142 | return 0; | 140 | return 0; |
| 143 | } | 141 | } |
| 144 | 142 | ||
| 143 | static void free_relocation_chain(struct mips_hi16 *l) | ||
| 144 | { | ||
| 145 | struct mips_hi16 *next; | ||
| 146 | |||
| 147 | while (l) { | ||
| 148 | next = l->next; | ||
| 149 | kfree(l); | ||
| 150 | l = next; | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 145 | static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) | 154 | static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) |
| 146 | { | 155 | { |
| 147 | unsigned long insnlo = *location; | 156 | unsigned long insnlo = *location; |
| 157 | struct mips_hi16 *l; | ||
| 148 | Elf_Addr val, vallo; | 158 | Elf_Addr val, vallo; |
| 149 | 159 | ||
| 150 | /* Sign extend the addend we extract from the lo insn. */ | 160 | /* Sign extend the addend we extract from the lo insn. */ |
| 151 | vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; | 161 | vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; |
| 152 | 162 | ||
| 153 | if (mips_hi16_list != NULL) { | 163 | if (me->arch.r_mips_hi16_list != NULL) { |
| 154 | struct mips_hi16 *l; | 164 | l = me->arch.r_mips_hi16_list; |
| 155 | |||
| 156 | l = mips_hi16_list; | ||
| 157 | while (l != NULL) { | 165 | while (l != NULL) { |
| 158 | struct mips_hi16 *next; | 166 | struct mips_hi16 *next; |
| 159 | unsigned long insn; | 167 | unsigned long insn; |
| @@ -188,7 +196,7 @@ static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) | |||
| 188 | l = next; | 196 | l = next; |
| 189 | } | 197 | } |
| 190 | 198 | ||
| 191 | mips_hi16_list = NULL; | 199 | me->arch.r_mips_hi16_list = NULL; |
| 192 | } | 200 | } |
| 193 | 201 | ||
| 194 | /* | 202 | /* |
| @@ -201,6 +209,9 @@ static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) | |||
| 201 | return 0; | 209 | return 0; |
| 202 | 210 | ||
| 203 | out_danger: | 211 | out_danger: |
| 212 | free_relocation_chain(l); | ||
| 213 | me->arch.r_mips_hi16_list = NULL; | ||
| 214 | |||
| 204 | pr_err("module %s: dangerous R_MIPS_LO16 REL relocation\n", me->name); | 215 | pr_err("module %s: dangerous R_MIPS_LO16 REL relocation\n", me->name); |
| 205 | 216 | ||
| 206 | return -ENOEXEC; | 217 | return -ENOEXEC; |
| @@ -273,6 +284,7 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, | |||
| 273 | pr_debug("Applying relocate section %u to %u\n", relsec, | 284 | pr_debug("Applying relocate section %u to %u\n", relsec, |
| 274 | sechdrs[relsec].sh_info); | 285 | sechdrs[relsec].sh_info); |
| 275 | 286 | ||
| 287 | me->arch.r_mips_hi16_list = NULL; | ||
| 276 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { | 288 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { |
| 277 | /* This is where to make the change */ | 289 | /* This is where to make the change */ |
| 278 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr | 290 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr |
| @@ -296,6 +308,19 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, | |||
| 296 | return res; | 308 | return res; |
| 297 | } | 309 | } |
| 298 | 310 | ||
| 311 | /* | ||
| 312 | * Normally the hi16 list should be deallocated at this point. A | ||
| 313 | * malformed binary however could contain a series of R_MIPS_HI16 | ||
| 314 | * relocations not followed by a R_MIPS_LO16 relocation. In that | ||
| 315 | * case, free up the list and return an error. | ||
| 316 | */ | ||
| 317 | if (me->arch.r_mips_hi16_list) { | ||
| 318 | free_relocation_chain(me->arch.r_mips_hi16_list); | ||
| 319 | me->arch.r_mips_hi16_list = NULL; | ||
| 320 | |||
| 321 | return -ENOEXEC; | ||
| 322 | } | ||
| 323 | |||
| 299 | return 0; | 324 | return 0; |
| 300 | } | 325 | } |
| 301 | 326 | ||
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c index 31637d8c8738..9005bf9fb859 100644 --- a/arch/mips/kernel/smp.c +++ b/arch/mips/kernel/smp.c | |||
| @@ -130,7 +130,7 @@ asmlinkage __cpuinit void start_secondary(void) | |||
| 130 | 130 | ||
| 131 | cpu_set(cpu, cpu_callin_map); | 131 | cpu_set(cpu, cpu_callin_map); |
| 132 | 132 | ||
| 133 | synchronise_count_slave(); | 133 | synchronise_count_slave(cpu); |
| 134 | 134 | ||
| 135 | /* | 135 | /* |
| 136 | * irq will be enabled in ->smp_finish(), enabling it too early | 136 | * irq will be enabled in ->smp_finish(), enabling it too early |
| @@ -173,7 +173,6 @@ void smp_send_stop(void) | |||
| 173 | void __init smp_cpus_done(unsigned int max_cpus) | 173 | void __init smp_cpus_done(unsigned int max_cpus) |
| 174 | { | 174 | { |
| 175 | mp_ops->cpus_done(); | 175 | mp_ops->cpus_done(); |
| 176 | synchronise_count_master(); | ||
| 177 | } | 176 | } |
| 178 | 177 | ||
| 179 | /* called from main before smp_init() */ | 178 | /* called from main before smp_init() */ |
| @@ -206,6 +205,7 @@ int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) | |||
| 206 | while (!cpu_isset(cpu, cpu_callin_map)) | 205 | while (!cpu_isset(cpu, cpu_callin_map)) |
| 207 | udelay(100); | 206 | udelay(100); |
| 208 | 207 | ||
| 208 | synchronise_count_master(cpu); | ||
| 209 | return 0; | 209 | return 0; |
| 210 | } | 210 | } |
| 211 | 211 | ||
diff --git a/arch/mips/kernel/sync-r4k.c b/arch/mips/kernel/sync-r4k.c index 842d55e411fd..7f1eca3858de 100644 --- a/arch/mips/kernel/sync-r4k.c +++ b/arch/mips/kernel/sync-r4k.c | |||
| @@ -28,12 +28,11 @@ static atomic_t __cpuinitdata count_reference = ATOMIC_INIT(0); | |||
| 28 | #define COUNTON 100 | 28 | #define COUNTON 100 |
| 29 | #define NR_LOOPS 5 | 29 | #define NR_LOOPS 5 |
| 30 | 30 | ||
| 31 | void __cpuinit synchronise_count_master(void) | 31 | void __cpuinit synchronise_count_master(int cpu) |
| 32 | { | 32 | { |
| 33 | int i; | 33 | int i; |
| 34 | unsigned long flags; | 34 | unsigned long flags; |
| 35 | unsigned int initcount; | 35 | unsigned int initcount; |
| 36 | int nslaves; | ||
| 37 | 36 | ||
| 38 | #ifdef CONFIG_MIPS_MT_SMTC | 37 | #ifdef CONFIG_MIPS_MT_SMTC |
| 39 | /* | 38 | /* |
| @@ -43,8 +42,7 @@ void __cpuinit synchronise_count_master(void) | |||
| 43 | return; | 42 | return; |
| 44 | #endif | 43 | #endif |
| 45 | 44 | ||
| 46 | printk(KERN_INFO "Synchronize counters across %u CPUs: ", | 45 | printk(KERN_INFO "Synchronize counters for CPU %u: ", cpu); |
| 47 | num_online_cpus()); | ||
| 48 | 46 | ||
| 49 | local_irq_save(flags); | 47 | local_irq_save(flags); |
| 50 | 48 | ||
| @@ -52,7 +50,7 @@ void __cpuinit synchronise_count_master(void) | |||
| 52 | * Notify the slaves that it's time to start | 50 | * Notify the slaves that it's time to start |
| 53 | */ | 51 | */ |
| 54 | atomic_set(&count_reference, read_c0_count()); | 52 | atomic_set(&count_reference, read_c0_count()); |
| 55 | atomic_set(&count_start_flag, 1); | 53 | atomic_set(&count_start_flag, cpu); |
| 56 | smp_wmb(); | 54 | smp_wmb(); |
| 57 | 55 | ||
| 58 | /* Count will be initialised to current timer for all CPU's */ | 56 | /* Count will be initialised to current timer for all CPU's */ |
| @@ -69,10 +67,9 @@ void __cpuinit synchronise_count_master(void) | |||
| 69 | * two CPUs. | 67 | * two CPUs. |
| 70 | */ | 68 | */ |
| 71 | 69 | ||
| 72 | nslaves = num_online_cpus()-1; | ||
| 73 | for (i = 0; i < NR_LOOPS; i++) { | 70 | for (i = 0; i < NR_LOOPS; i++) { |
| 74 | /* slaves loop on '!= ncpus' */ | 71 | /* slaves loop on '!= 2' */ |
| 75 | while (atomic_read(&count_count_start) != nslaves) | 72 | while (atomic_read(&count_count_start) != 1) |
| 76 | mb(); | 73 | mb(); |
| 77 | atomic_set(&count_count_stop, 0); | 74 | atomic_set(&count_count_stop, 0); |
| 78 | smp_wmb(); | 75 | smp_wmb(); |
| @@ -89,7 +86,7 @@ void __cpuinit synchronise_count_master(void) | |||
| 89 | /* | 86 | /* |
| 90 | * Wait for all slaves to leave the synchronization point: | 87 | * Wait for all slaves to leave the synchronization point: |
| 91 | */ | 88 | */ |
| 92 | while (atomic_read(&count_count_stop) != nslaves) | 89 | while (atomic_read(&count_count_stop) != 1) |
| 93 | mb(); | 90 | mb(); |
| 94 | atomic_set(&count_count_start, 0); | 91 | atomic_set(&count_count_start, 0); |
| 95 | smp_wmb(); | 92 | smp_wmb(); |
| @@ -97,6 +94,7 @@ void __cpuinit synchronise_count_master(void) | |||
| 97 | } | 94 | } |
| 98 | /* Arrange for an interrupt in a short while */ | 95 | /* Arrange for an interrupt in a short while */ |
| 99 | write_c0_compare(read_c0_count() + COUNTON); | 96 | write_c0_compare(read_c0_count() + COUNTON); |
| 97 | atomic_set(&count_start_flag, 0); | ||
| 100 | 98 | ||
| 101 | local_irq_restore(flags); | 99 | local_irq_restore(flags); |
| 102 | 100 | ||
| @@ -108,11 +106,10 @@ void __cpuinit synchronise_count_master(void) | |||
| 108 | printk("done.\n"); | 106 | printk("done.\n"); |
| 109 | } | 107 | } |
| 110 | 108 | ||
| 111 | void __cpuinit synchronise_count_slave(void) | 109 | void __cpuinit synchronise_count_slave(int cpu) |
| 112 | { | 110 | { |
| 113 | int i; | 111 | int i; |
| 114 | unsigned int initcount; | 112 | unsigned int initcount; |
| 115 | int ncpus; | ||
| 116 | 113 | ||
| 117 | #ifdef CONFIG_MIPS_MT_SMTC | 114 | #ifdef CONFIG_MIPS_MT_SMTC |
| 118 | /* | 115 | /* |
| @@ -127,16 +124,15 @@ void __cpuinit synchronise_count_slave(void) | |||
| 127 | * so we first wait for the master to say everyone is ready | 124 | * so we first wait for the master to say everyone is ready |
| 128 | */ | 125 | */ |
| 129 | 126 | ||
| 130 | while (!atomic_read(&count_start_flag)) | 127 | while (atomic_read(&count_start_flag) != cpu) |
| 131 | mb(); | 128 | mb(); |
| 132 | 129 | ||
| 133 | /* Count will be initialised to next expire for all CPU's */ | 130 | /* Count will be initialised to next expire for all CPU's */ |
| 134 | initcount = atomic_read(&count_reference); | 131 | initcount = atomic_read(&count_reference); |
| 135 | 132 | ||
| 136 | ncpus = num_online_cpus(); | ||
| 137 | for (i = 0; i < NR_LOOPS; i++) { | 133 | for (i = 0; i < NR_LOOPS; i++) { |
| 138 | atomic_inc(&count_count_start); | 134 | atomic_inc(&count_count_start); |
| 139 | while (atomic_read(&count_count_start) != ncpus) | 135 | while (atomic_read(&count_count_start) != 2) |
| 140 | mb(); | 136 | mb(); |
| 141 | 137 | ||
| 142 | /* | 138 | /* |
| @@ -146,7 +142,7 @@ void __cpuinit synchronise_count_slave(void) | |||
| 146 | write_c0_count(initcount); | 142 | write_c0_count(initcount); |
| 147 | 143 | ||
| 148 | atomic_inc(&count_count_stop); | 144 | atomic_inc(&count_count_stop); |
| 149 | while (atomic_read(&count_count_stop) != ncpus) | 145 | while (atomic_read(&count_count_stop) != 2) |
| 150 | mb(); | 146 | mb(); |
| 151 | } | 147 | } |
| 152 | /* Arrange for an interrupt in a short while */ | 148 | /* Arrange for an interrupt in a short while */ |
diff --git a/arch/mips/mti-malta/malta-pci.c b/arch/mips/mti-malta/malta-pci.c index 284dea54faf5..2147cb34e705 100644 --- a/arch/mips/mti-malta/malta-pci.c +++ b/arch/mips/mti-malta/malta-pci.c | |||
| @@ -252,16 +252,3 @@ void __init mips_pcibios_init(void) | |||
| 252 | 252 | ||
| 253 | register_pci_controller(controller); | 253 | register_pci_controller(controller); |
| 254 | } | 254 | } |
| 255 | |||
| 256 | /* Enable PCI 2.1 compatibility in PIIX4 */ | ||
| 257 | static void __devinit quirk_dlcsetup(struct pci_dev *dev) | ||
| 258 | { | ||
| 259 | u8 odlc, ndlc; | ||
| 260 | (void) pci_read_config_byte(dev, 0x82, &odlc); | ||
| 261 | /* Enable passive releases and delayed transaction */ | ||
| 262 | ndlc = odlc | 7; | ||
| 263 | (void) pci_write_config_byte(dev, 0x82, ndlc); | ||
| 264 | } | ||
| 265 | |||
| 266 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_0, | ||
| 267 | quirk_dlcsetup); | ||
diff --git a/arch/mips/pci/pci-ar724x.c b/arch/mips/pci/pci-ar724x.c index 414a7459858d..86d77a666458 100644 --- a/arch/mips/pci/pci-ar724x.c +++ b/arch/mips/pci/pci-ar724x.c | |||
| @@ -23,9 +23,12 @@ | |||
| 23 | #define AR724X_PCI_MEM_BASE 0x10000000 | 23 | #define AR724X_PCI_MEM_BASE 0x10000000 |
| 24 | #define AR724X_PCI_MEM_SIZE 0x08000000 | 24 | #define AR724X_PCI_MEM_SIZE 0x08000000 |
| 25 | 25 | ||
| 26 | #define AR724X_PCI_REG_RESET 0x18 | ||
| 26 | #define AR724X_PCI_REG_INT_STATUS 0x4c | 27 | #define AR724X_PCI_REG_INT_STATUS 0x4c |
| 27 | #define AR724X_PCI_REG_INT_MASK 0x50 | 28 | #define AR724X_PCI_REG_INT_MASK 0x50 |
| 28 | 29 | ||
| 30 | #define AR724X_PCI_RESET_LINK_UP BIT(0) | ||
| 31 | |||
| 29 | #define AR724X_PCI_INT_DEV0 BIT(14) | 32 | #define AR724X_PCI_INT_DEV0 BIT(14) |
| 30 | 33 | ||
| 31 | #define AR724X_PCI_IRQ_COUNT 1 | 34 | #define AR724X_PCI_IRQ_COUNT 1 |
| @@ -38,6 +41,15 @@ static void __iomem *ar724x_pci_ctrl_base; | |||
| 38 | 41 | ||
| 39 | static u32 ar724x_pci_bar0_value; | 42 | static u32 ar724x_pci_bar0_value; |
| 40 | static bool ar724x_pci_bar0_is_cached; | 43 | static bool ar724x_pci_bar0_is_cached; |
| 44 | static bool ar724x_pci_link_up; | ||
| 45 | |||
| 46 | static inline bool ar724x_pci_check_link(void) | ||
| 47 | { | ||
| 48 | u32 reset; | ||
| 49 | |||
| 50 | reset = __raw_readl(ar724x_pci_ctrl_base + AR724X_PCI_REG_RESET); | ||
| 51 | return reset & AR724X_PCI_RESET_LINK_UP; | ||
| 52 | } | ||
| 41 | 53 | ||
| 42 | static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, | 54 | static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, |
| 43 | int size, uint32_t *value) | 55 | int size, uint32_t *value) |
| @@ -46,6 +58,9 @@ static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, | |||
| 46 | void __iomem *base; | 58 | void __iomem *base; |
| 47 | u32 data; | 59 | u32 data; |
| 48 | 60 | ||
| 61 | if (!ar724x_pci_link_up) | ||
| 62 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 63 | |||
| 49 | if (devfn) | 64 | if (devfn) |
| 50 | return PCIBIOS_DEVICE_NOT_FOUND; | 65 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 51 | 66 | ||
| @@ -96,6 +111,9 @@ static int ar724x_pci_write(struct pci_bus *bus, unsigned int devfn, int where, | |||
| 96 | u32 data; | 111 | u32 data; |
| 97 | int s; | 112 | int s; |
| 98 | 113 | ||
| 114 | if (!ar724x_pci_link_up) | ||
| 115 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 116 | |||
| 99 | if (devfn) | 117 | if (devfn) |
| 100 | return PCIBIOS_DEVICE_NOT_FOUND; | 118 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 101 | 119 | ||
| @@ -280,6 +298,10 @@ int __init ar724x_pcibios_init(int irq) | |||
| 280 | if (ar724x_pci_ctrl_base == NULL) | 298 | if (ar724x_pci_ctrl_base == NULL) |
| 281 | goto err_unmap_devcfg; | 299 | goto err_unmap_devcfg; |
| 282 | 300 | ||
| 301 | ar724x_pci_link_up = ar724x_pci_check_link(); | ||
| 302 | if (!ar724x_pci_link_up) | ||
| 303 | pr_warn("ar724x: PCIe link is down\n"); | ||
| 304 | |||
| 283 | ar724x_pci_irq_init(irq); | 305 | ar724x_pci_irq_init(irq); |
| 284 | register_pci_controller(&ar724x_pci_controller); | 306 | register_pci_controller(&ar724x_pci_controller); |
| 285 | 307 | ||
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h index 6c6defc24619..af9cf30ed474 100644 --- a/arch/parisc/include/asm/atomic.h +++ b/arch/parisc/include/asm/atomic.h | |||
| @@ -141,7 +141,7 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) | |||
| 141 | 141 | ||
| 142 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i),(v)) == 0) | 142 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i),(v)) == 0) |
| 143 | 143 | ||
| 144 | #define ATOMIC_INIT(i) ((atomic_t) { (i) }) | 144 | #define ATOMIC_INIT(i) { (i) } |
| 145 | 145 | ||
| 146 | #define smp_mb__before_atomic_dec() smp_mb() | 146 | #define smp_mb__before_atomic_dec() smp_mb() |
| 147 | #define smp_mb__after_atomic_dec() smp_mb() | 147 | #define smp_mb__after_atomic_dec() smp_mb() |
| @@ -150,7 +150,7 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) | |||
| 150 | 150 | ||
| 151 | #ifdef CONFIG_64BIT | 151 | #ifdef CONFIG_64BIT |
| 152 | 152 | ||
| 153 | #define ATOMIC64_INIT(i) ((atomic64_t) { (i) }) | 153 | #define ATOMIC64_INIT(i) { (i) } |
| 154 | 154 | ||
| 155 | static __inline__ s64 | 155 | static __inline__ s64 |
| 156 | __atomic64_add_return(s64 i, atomic64_t *v) | 156 | __atomic64_add_return(s64 i, atomic64_t *v) |
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c index d4b94b395c16..2c05a9292a81 100644 --- a/arch/parisc/kernel/process.c +++ b/arch/parisc/kernel/process.c | |||
| @@ -309,7 +309,7 @@ copy_thread(unsigned long clone_flags, unsigned long usp, | |||
| 309 | cregs->ksp = (unsigned long)stack | 309 | cregs->ksp = (unsigned long)stack |
| 310 | + (pregs->gr[21] & (THREAD_SIZE - 1)); | 310 | + (pregs->gr[21] & (THREAD_SIZE - 1)); |
| 311 | cregs->gr[30] = usp; | 311 | cregs->gr[30] = usp; |
| 312 | if (p->personality == PER_HPUX) { | 312 | if (personality(p->personality) == PER_HPUX) { |
| 313 | #ifdef CONFIG_HPUX | 313 | #ifdef CONFIG_HPUX |
| 314 | cregs->kpc = (unsigned long) &hpux_child_return; | 314 | cregs->kpc = (unsigned long) &hpux_child_return; |
| 315 | #else | 315 | #else |
diff --git a/arch/parisc/kernel/sys_parisc.c b/arch/parisc/kernel/sys_parisc.c index c9b932260f47..7426e40699bd 100644 --- a/arch/parisc/kernel/sys_parisc.c +++ b/arch/parisc/kernel/sys_parisc.c | |||
| @@ -225,12 +225,12 @@ long parisc_personality(unsigned long personality) | |||
| 225 | long err; | 225 | long err; |
| 226 | 226 | ||
| 227 | if (personality(current->personality) == PER_LINUX32 | 227 | if (personality(current->personality) == PER_LINUX32 |
| 228 | && personality == PER_LINUX) | 228 | && personality(personality) == PER_LINUX) |
| 229 | personality = PER_LINUX32; | 229 | personality = (personality & ~PER_MASK) | PER_LINUX32; |
| 230 | 230 | ||
| 231 | err = sys_personality(personality); | 231 | err = sys_personality(personality); |
| 232 | if (err == PER_LINUX32) | 232 | if (personality(err) == PER_LINUX32) |
| 233 | err = PER_LINUX; | 233 | err = (err & ~PER_MASK) | PER_LINUX; |
| 234 | 234 | ||
| 235 | return err; | 235 | return err; |
| 236 | } | 236 | } |
diff --git a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi index 8d35d2c1f694..4f9c9f682ecf 100644 --- a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi | |||
| @@ -345,6 +345,13 @@ | |||
| 345 | /include/ "qoriq-duart-1.dtsi" | 345 | /include/ "qoriq-duart-1.dtsi" |
| 346 | /include/ "qoriq-gpio-0.dtsi" | 346 | /include/ "qoriq-gpio-0.dtsi" |
| 347 | /include/ "qoriq-usb2-mph-0.dtsi" | 347 | /include/ "qoriq-usb2-mph-0.dtsi" |
| 348 | usb@210000 { | ||
| 349 | compatible = "fsl-usb2-mph-v1.6", "fsl,mpc85xx-usb2-mph", "fsl-usb2-mph"; | ||
| 350 | port0; | ||
| 351 | }; | ||
| 348 | /include/ "qoriq-usb2-dr-0.dtsi" | 352 | /include/ "qoriq-usb2-dr-0.dtsi" |
| 353 | usb@211000 { | ||
| 354 | compatible = "fsl-usb2-dr-v1.6", "fsl,mpc85xx-usb2-dr", "fsl-usb2-dr"; | ||
| 355 | }; | ||
| 349 | /include/ "qoriq-sec4.0-0.dtsi" | 356 | /include/ "qoriq-sec4.0-0.dtsi" |
| 350 | }; | 357 | }; |
diff --git a/arch/powerpc/configs/85xx/p1023rds_defconfig b/arch/powerpc/configs/85xx/p1023rds_defconfig index f4337bacd0e7..26e541c4662b 100644 --- a/arch/powerpc/configs/85xx/p1023rds_defconfig +++ b/arch/powerpc/configs/85xx/p1023rds_defconfig | |||
| @@ -6,28 +6,27 @@ CONFIG_SYSVIPC=y | |||
| 6 | CONFIG_POSIX_MQUEUE=y | 6 | CONFIG_POSIX_MQUEUE=y |
| 7 | CONFIG_BSD_PROCESS_ACCT=y | 7 | CONFIG_BSD_PROCESS_ACCT=y |
| 8 | CONFIG_AUDIT=y | 8 | CONFIG_AUDIT=y |
| 9 | CONFIG_SPARSE_IRQ=y | 9 | CONFIG_IRQ_DOMAIN_DEBUG=y |
| 10 | CONFIG_NO_HZ=y | ||
| 11 | CONFIG_HIGH_RES_TIMERS=y | ||
| 10 | CONFIG_IKCONFIG=y | 12 | CONFIG_IKCONFIG=y |
| 11 | CONFIG_IKCONFIG_PROC=y | 13 | CONFIG_IKCONFIG_PROC=y |
| 12 | CONFIG_LOG_BUF_SHIFT=14 | 14 | CONFIG_LOG_BUF_SHIFT=14 |
| 13 | CONFIG_BLK_DEV_INITRD=y | 15 | CONFIG_BLK_DEV_INITRD=y |
| 14 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 15 | CONFIG_KALLSYMS_ALL=y | 16 | CONFIG_KALLSYMS_ALL=y |
| 16 | CONFIG_KALLSYMS_EXTRA_PASS=y | ||
| 17 | CONFIG_EMBEDDED=y | 17 | CONFIG_EMBEDDED=y |
| 18 | CONFIG_MODULES=y | 18 | CONFIG_MODULES=y |
| 19 | CONFIG_MODULE_UNLOAD=y | 19 | CONFIG_MODULE_UNLOAD=y |
| 20 | CONFIG_MODULE_FORCE_UNLOAD=y | 20 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 21 | CONFIG_MODVERSIONS=y | 21 | CONFIG_MODVERSIONS=y |
| 22 | # CONFIG_BLK_DEV_BSG is not set | 22 | # CONFIG_BLK_DEV_BSG is not set |
| 23 | CONFIG_PARTITION_ADVANCED=y | ||
| 24 | CONFIG_MAC_PARTITION=y | ||
| 23 | CONFIG_P1023_RDS=y | 25 | CONFIG_P1023_RDS=y |
| 24 | CONFIG_QUICC_ENGINE=y | 26 | CONFIG_QUICC_ENGINE=y |
| 25 | CONFIG_QE_GPIO=y | 27 | CONFIG_QE_GPIO=y |
| 26 | CONFIG_CPM2=y | 28 | CONFIG_CPM2=y |
| 27 | CONFIG_GPIO_MPC8XXX=y | ||
| 28 | CONFIG_HIGHMEM=y | 29 | CONFIG_HIGHMEM=y |
| 29 | CONFIG_NO_HZ=y | ||
| 30 | CONFIG_HIGH_RES_TIMERS=y | ||
| 31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 30 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
| 32 | CONFIG_BINFMT_MISC=m | 31 | CONFIG_BINFMT_MISC=m |
| 33 | CONFIG_MATH_EMULATION=y | 32 | CONFIG_MATH_EMULATION=y |
| @@ -63,11 +62,11 @@ CONFIG_INET_ESP=y | |||
| 63 | CONFIG_IPV6=y | 62 | CONFIG_IPV6=y |
| 64 | CONFIG_IP_SCTP=m | 63 | CONFIG_IP_SCTP=m |
| 65 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 64 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 65 | CONFIG_DEVTMPFS=y | ||
| 66 | CONFIG_PROC_DEVICETREE=y | 66 | CONFIG_PROC_DEVICETREE=y |
| 67 | CONFIG_BLK_DEV_LOOP=y | 67 | CONFIG_BLK_DEV_LOOP=y |
| 68 | CONFIG_BLK_DEV_RAM=y | 68 | CONFIG_BLK_DEV_RAM=y |
| 69 | CONFIG_BLK_DEV_RAM_SIZE=131072 | 69 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 70 | CONFIG_MISC_DEVICES=y | ||
| 71 | CONFIG_EEPROM_LEGACY=y | 70 | CONFIG_EEPROM_LEGACY=y |
| 72 | CONFIG_BLK_DEV_SD=y | 71 | CONFIG_BLK_DEV_SD=y |
| 73 | CONFIG_CHR_DEV_ST=y | 72 | CONFIG_CHR_DEV_ST=y |
| @@ -80,15 +79,14 @@ CONFIG_SATA_FSL=y | |||
| 80 | CONFIG_SATA_SIL24=y | 79 | CONFIG_SATA_SIL24=y |
| 81 | CONFIG_NETDEVICES=y | 80 | CONFIG_NETDEVICES=y |
| 82 | CONFIG_DUMMY=y | 81 | CONFIG_DUMMY=y |
| 82 | CONFIG_FS_ENET=y | ||
| 83 | CONFIG_FSL_PQ_MDIO=y | ||
| 84 | CONFIG_E1000E=y | ||
| 83 | CONFIG_MARVELL_PHY=y | 85 | CONFIG_MARVELL_PHY=y |
| 84 | CONFIG_DAVICOM_PHY=y | 86 | CONFIG_DAVICOM_PHY=y |
| 85 | CONFIG_CICADA_PHY=y | 87 | CONFIG_CICADA_PHY=y |
| 86 | CONFIG_VITESSE_PHY=y | 88 | CONFIG_VITESSE_PHY=y |
| 87 | CONFIG_FIXED_PHY=y | 89 | CONFIG_FIXED_PHY=y |
| 88 | CONFIG_NET_ETHERNET=y | ||
| 89 | CONFIG_FS_ENET=y | ||
| 90 | CONFIG_E1000E=y | ||
| 91 | CONFIG_FSL_PQ_MDIO=y | ||
| 92 | CONFIG_INPUT_FF_MEMLESS=m | 90 | CONFIG_INPUT_FF_MEMLESS=m |
| 93 | # CONFIG_INPUT_MOUSEDEV is not set | 91 | # CONFIG_INPUT_MOUSEDEV is not set |
| 94 | # CONFIG_INPUT_KEYBOARD is not set | 92 | # CONFIG_INPUT_KEYBOARD is not set |
| @@ -98,16 +96,15 @@ CONFIG_SERIAL_8250=y | |||
| 98 | CONFIG_SERIAL_8250_CONSOLE=y | 96 | CONFIG_SERIAL_8250_CONSOLE=y |
| 99 | CONFIG_SERIAL_8250_NR_UARTS=2 | 97 | CONFIG_SERIAL_8250_NR_UARTS=2 |
| 100 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | 98 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
| 101 | CONFIG_SERIAL_8250_EXTENDED=y | ||
| 102 | CONFIG_SERIAL_8250_MANY_PORTS=y | 99 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 103 | CONFIG_SERIAL_8250_DETECT_IRQ=y | 100 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 104 | CONFIG_SERIAL_8250_RSA=y | 101 | CONFIG_SERIAL_8250_RSA=y |
| 105 | CONFIG_SERIAL_QE=m | 102 | CONFIG_SERIAL_QE=m |
| 106 | CONFIG_HW_RANDOM=y | ||
| 107 | CONFIG_NVRAM=y | 103 | CONFIG_NVRAM=y |
| 108 | CONFIG_I2C=y | 104 | CONFIG_I2C=y |
| 109 | CONFIG_I2C_CPM=m | 105 | CONFIG_I2C_CPM=m |
| 110 | CONFIG_I2C_MPC=y | 106 | CONFIG_I2C_MPC=y |
| 107 | CONFIG_GPIO_MPC8XXX=y | ||
| 111 | # CONFIG_HWMON is not set | 108 | # CONFIG_HWMON is not set |
| 112 | CONFIG_VIDEO_OUTPUT_CONTROL=y | 109 | CONFIG_VIDEO_OUTPUT_CONTROL=y |
| 113 | CONFIG_SOUND=y | 110 | CONFIG_SOUND=y |
| @@ -123,7 +120,6 @@ CONFIG_DMADEVICES=y | |||
| 123 | CONFIG_FSL_DMA=y | 120 | CONFIG_FSL_DMA=y |
| 124 | # CONFIG_NET_DMA is not set | 121 | # CONFIG_NET_DMA is not set |
| 125 | CONFIG_STAGING=y | 122 | CONFIG_STAGING=y |
| 126 | # CONFIG_STAGING_EXCLUDE_BUILD is not set | ||
| 127 | CONFIG_EXT2_FS=y | 123 | CONFIG_EXT2_FS=y |
| 128 | CONFIG_EXT3_FS=y | 124 | CONFIG_EXT3_FS=y |
| 129 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 125 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
| @@ -150,22 +146,15 @@ CONFIG_QNX4FS_FS=m | |||
| 150 | CONFIG_SYSV_FS=m | 146 | CONFIG_SYSV_FS=m |
| 151 | CONFIG_UFS_FS=m | 147 | CONFIG_UFS_FS=m |
| 152 | CONFIG_NFS_FS=y | 148 | CONFIG_NFS_FS=y |
| 153 | CONFIG_NFS_V3=y | ||
| 154 | CONFIG_NFS_V4=y | 149 | CONFIG_NFS_V4=y |
| 155 | CONFIG_ROOT_NFS=y | 150 | CONFIG_ROOT_NFS=y |
| 156 | CONFIG_NFSD=y | 151 | CONFIG_NFSD=y |
| 157 | CONFIG_PARTITION_ADVANCED=y | ||
| 158 | CONFIG_MAC_PARTITION=y | ||
| 159 | CONFIG_CRC_T10DIF=y | 152 | CONFIG_CRC_T10DIF=y |
| 160 | CONFIG_FRAME_WARN=8092 | 153 | CONFIG_FRAME_WARN=8092 |
| 161 | CONFIG_DEBUG_FS=y | 154 | CONFIG_DEBUG_FS=y |
| 162 | CONFIG_DEBUG_KERNEL=y | ||
| 163 | CONFIG_DETECT_HUNG_TASK=y | 155 | CONFIG_DETECT_HUNG_TASK=y |
| 164 | # CONFIG_DEBUG_BUGVERBOSE is not set | 156 | # CONFIG_DEBUG_BUGVERBOSE is not set |
| 165 | CONFIG_DEBUG_INFO=y | 157 | CONFIG_DEBUG_INFO=y |
| 166 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 167 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 168 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
| 169 | CONFIG_CRYPTO_PCBC=m | 158 | CONFIG_CRYPTO_PCBC=m |
| 170 | CONFIG_CRYPTO_SHA256=y | 159 | CONFIG_CRYPTO_SHA256=y |
| 171 | CONFIG_CRYPTO_SHA512=y | 160 | CONFIG_CRYPTO_SHA512=y |
diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig index cbb98c1234fd..8b3d57c1ebe8 100644 --- a/arch/powerpc/configs/corenet32_smp_defconfig +++ b/arch/powerpc/configs/corenet32_smp_defconfig | |||
| @@ -6,8 +6,8 @@ CONFIG_SYSVIPC=y | |||
| 6 | CONFIG_POSIX_MQUEUE=y | 6 | CONFIG_POSIX_MQUEUE=y |
| 7 | CONFIG_BSD_PROCESS_ACCT=y | 7 | CONFIG_BSD_PROCESS_ACCT=y |
| 8 | CONFIG_AUDIT=y | 8 | CONFIG_AUDIT=y |
| 9 | CONFIG_SPARSE_IRQ=y | 9 | CONFIG_NO_HZ=y |
| 10 | CONFIG_RCU_TRACE=y | 10 | CONFIG_HIGH_RES_TIMERS=y |
| 11 | CONFIG_IKCONFIG=y | 11 | CONFIG_IKCONFIG=y |
| 12 | CONFIG_IKCONFIG_PROC=y | 12 | CONFIG_IKCONFIG_PROC=y |
| 13 | CONFIG_LOG_BUF_SHIFT=14 | 13 | CONFIG_LOG_BUF_SHIFT=14 |
| @@ -21,23 +21,22 @@ CONFIG_MODULE_UNLOAD=y | |||
| 21 | CONFIG_MODULE_FORCE_UNLOAD=y | 21 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 22 | CONFIG_MODVERSIONS=y | 22 | CONFIG_MODVERSIONS=y |
| 23 | # CONFIG_BLK_DEV_BSG is not set | 23 | # CONFIG_BLK_DEV_BSG is not set |
| 24 | CONFIG_PARTITION_ADVANCED=y | ||
| 25 | CONFIG_MAC_PARTITION=y | ||
| 24 | CONFIG_P2041_RDB=y | 26 | CONFIG_P2041_RDB=y |
| 25 | CONFIG_P3041_DS=y | 27 | CONFIG_P3041_DS=y |
| 26 | CONFIG_P4080_DS=y | 28 | CONFIG_P4080_DS=y |
| 27 | CONFIG_P5020_DS=y | 29 | CONFIG_P5020_DS=y |
| 28 | CONFIG_HIGHMEM=y | 30 | CONFIG_HIGHMEM=y |
| 29 | CONFIG_NO_HZ=y | ||
| 30 | CONFIG_HIGH_RES_TIMERS=y | ||
| 31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | 31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
| 32 | CONFIG_BINFMT_MISC=m | 32 | CONFIG_BINFMT_MISC=m |
| 33 | CONFIG_KEXEC=y | 33 | CONFIG_KEXEC=y |
| 34 | CONFIG_IRQ_ALL_CPUS=y | 34 | CONFIG_IRQ_ALL_CPUS=y |
| 35 | CONFIG_FORCE_MAX_ZONEORDER=13 | 35 | CONFIG_FORCE_MAX_ZONEORDER=13 |
| 36 | CONFIG_FSL_LBC=y | ||
| 37 | CONFIG_PCI=y | 36 | CONFIG_PCI=y |
| 38 | CONFIG_PCIEPORTBUS=y | 37 | CONFIG_PCIEPORTBUS=y |
| 39 | CONFIG_PCI_MSI=y | ||
| 40 | # CONFIG_PCIEASPM is not set | 38 | # CONFIG_PCIEASPM is not set |
| 39 | CONFIG_PCI_MSI=y | ||
| 41 | CONFIG_RAPIDIO=y | 40 | CONFIG_RAPIDIO=y |
| 42 | CONFIG_FSL_RIO=y | 41 | CONFIG_FSL_RIO=y |
| 43 | CONFIG_NET=y | 42 | CONFIG_NET=y |
| @@ -70,6 +69,7 @@ CONFIG_INET_IPCOMP=y | |||
| 70 | CONFIG_IPV6=y | 69 | CONFIG_IPV6=y |
| 71 | CONFIG_IP_SCTP=m | 70 | CONFIG_IP_SCTP=m |
| 72 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 71 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 72 | CONFIG_DEVTMPFS=y | ||
| 73 | CONFIG_MTD=y | 73 | CONFIG_MTD=y |
| 74 | CONFIG_MTD_CMDLINE_PARTS=y | 74 | CONFIG_MTD_CMDLINE_PARTS=y |
| 75 | CONFIG_MTD_CHAR=y | 75 | CONFIG_MTD_CHAR=y |
| @@ -77,17 +77,14 @@ CONFIG_MTD_BLOCK=y | |||
| 77 | CONFIG_MTD_CFI=y | 77 | CONFIG_MTD_CFI=y |
| 78 | CONFIG_MTD_CFI_AMDSTD=y | 78 | CONFIG_MTD_CFI_AMDSTD=y |
| 79 | CONFIG_MTD_PHYSMAP_OF=y | 79 | CONFIG_MTD_PHYSMAP_OF=y |
| 80 | CONFIG_MTD_M25P80=y | ||
| 80 | CONFIG_MTD_NAND=y | 81 | CONFIG_MTD_NAND=y |
| 81 | CONFIG_MTD_NAND_ECC=y | ||
| 82 | CONFIG_MTD_NAND_IDS=y | ||
| 83 | CONFIG_MTD_NAND_FSL_IFC=y | ||
| 84 | CONFIG_MTD_NAND_FSL_ELBC=y | 82 | CONFIG_MTD_NAND_FSL_ELBC=y |
| 85 | CONFIG_MTD_M25P80=y | 83 | CONFIG_MTD_NAND_FSL_IFC=y |
| 86 | CONFIG_PROC_DEVICETREE=y | 84 | CONFIG_PROC_DEVICETREE=y |
| 87 | CONFIG_BLK_DEV_LOOP=y | 85 | CONFIG_BLK_DEV_LOOP=y |
| 88 | CONFIG_BLK_DEV_RAM=y | 86 | CONFIG_BLK_DEV_RAM=y |
| 89 | CONFIG_BLK_DEV_RAM_SIZE=131072 | 87 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 90 | CONFIG_MISC_DEVICES=y | ||
| 91 | CONFIG_BLK_DEV_SD=y | 88 | CONFIG_BLK_DEV_SD=y |
| 92 | CONFIG_CHR_DEV_ST=y | 89 | CONFIG_CHR_DEV_ST=y |
| 93 | CONFIG_BLK_DEV_SR=y | 90 | CONFIG_BLK_DEV_SR=y |
| @@ -115,11 +112,9 @@ CONFIG_SERIO_LIBPS2=y | |||
| 115 | CONFIG_PPC_EPAPR_HV_BYTECHAN=y | 112 | CONFIG_PPC_EPAPR_HV_BYTECHAN=y |
| 116 | CONFIG_SERIAL_8250=y | 113 | CONFIG_SERIAL_8250=y |
| 117 | CONFIG_SERIAL_8250_CONSOLE=y | 114 | CONFIG_SERIAL_8250_CONSOLE=y |
| 118 | CONFIG_SERIAL_8250_EXTENDED=y | ||
| 119 | CONFIG_SERIAL_8250_MANY_PORTS=y | 115 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 120 | CONFIG_SERIAL_8250_DETECT_IRQ=y | 116 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 121 | CONFIG_SERIAL_8250_RSA=y | 117 | CONFIG_SERIAL_8250_RSA=y |
| 122 | CONFIG_HW_RANDOM=y | ||
| 123 | CONFIG_NVRAM=y | 118 | CONFIG_NVRAM=y |
| 124 | CONFIG_I2C=y | 119 | CONFIG_I2C=y |
| 125 | CONFIG_I2C_CHARDEV=y | 120 | CONFIG_I2C_CHARDEV=y |
| @@ -132,7 +127,6 @@ CONFIG_SPI_FSL_ESPI=y | |||
| 132 | CONFIG_VIDEO_OUTPUT_CONTROL=y | 127 | CONFIG_VIDEO_OUTPUT_CONTROL=y |
| 133 | CONFIG_USB_HID=m | 128 | CONFIG_USB_HID=m |
| 134 | CONFIG_USB=y | 129 | CONFIG_USB=y |
| 135 | CONFIG_USB_DEVICEFS=y | ||
| 136 | CONFIG_USB_MON=y | 130 | CONFIG_USB_MON=y |
| 137 | CONFIG_USB_EHCI_HCD=y | 131 | CONFIG_USB_EHCI_HCD=y |
| 138 | CONFIG_USB_EHCI_FSL=y | 132 | CONFIG_USB_EHCI_FSL=y |
| @@ -142,8 +136,6 @@ CONFIG_USB_OHCI_HCD_PPC_OF_LE=y | |||
| 142 | CONFIG_USB_STORAGE=y | 136 | CONFIG_USB_STORAGE=y |
| 143 | CONFIG_MMC=y | 137 | CONFIG_MMC=y |
| 144 | CONFIG_MMC_SDHCI=y | 138 | CONFIG_MMC_SDHCI=y |
| 145 | CONFIG_MMC_SDHCI_OF=y | ||
| 146 | CONFIG_MMC_SDHCI_OF_ESDHC=y | ||
| 147 | CONFIG_EDAC=y | 139 | CONFIG_EDAC=y |
| 148 | CONFIG_EDAC_MM_EDAC=y | 140 | CONFIG_EDAC_MM_EDAC=y |
| 149 | CONFIG_EDAC_MPC85XX=y | 141 | CONFIG_EDAC_MPC85XX=y |
| @@ -170,19 +162,16 @@ CONFIG_HUGETLBFS=y | |||
| 170 | CONFIG_JFFS2_FS=y | 162 | CONFIG_JFFS2_FS=y |
| 171 | CONFIG_CRAMFS=y | 163 | CONFIG_CRAMFS=y |
| 172 | CONFIG_NFS_FS=y | 164 | CONFIG_NFS_FS=y |
| 173 | CONFIG_NFS_V3=y | ||
| 174 | CONFIG_NFS_V4=y | 165 | CONFIG_NFS_V4=y |
| 175 | CONFIG_ROOT_NFS=y | 166 | CONFIG_ROOT_NFS=y |
| 176 | CONFIG_NFSD=m | 167 | CONFIG_NFSD=m |
| 177 | CONFIG_PARTITION_ADVANCED=y | ||
| 178 | CONFIG_MAC_PARTITION=y | ||
| 179 | CONFIG_NLS_ISO8859_1=y | 168 | CONFIG_NLS_ISO8859_1=y |
| 180 | CONFIG_NLS_UTF8=m | 169 | CONFIG_NLS_UTF8=m |
| 181 | CONFIG_MAGIC_SYSRQ=y | 170 | CONFIG_MAGIC_SYSRQ=y |
| 182 | CONFIG_DEBUG_SHIRQ=y | 171 | CONFIG_DEBUG_SHIRQ=y |
| 183 | CONFIG_DETECT_HUNG_TASK=y | 172 | CONFIG_DETECT_HUNG_TASK=y |
| 184 | CONFIG_DEBUG_INFO=y | 173 | CONFIG_DEBUG_INFO=y |
| 185 | CONFIG_SYSCTL_SYSCALL_CHECK=y | 174 | CONFIG_RCU_TRACE=y |
| 186 | CONFIG_CRYPTO_NULL=y | 175 | CONFIG_CRYPTO_NULL=y |
| 187 | CONFIG_CRYPTO_PCBC=m | 176 | CONFIG_CRYPTO_PCBC=m |
| 188 | CONFIG_CRYPTO_MD4=y | 177 | CONFIG_CRYPTO_MD4=y |
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig index dd89de8b0b7f..0516e22ca3de 100644 --- a/arch/powerpc/configs/corenet64_smp_defconfig +++ b/arch/powerpc/configs/corenet64_smp_defconfig | |||
| @@ -56,6 +56,7 @@ CONFIG_INET_ESP=y | |||
| 56 | CONFIG_IPV6=y | 56 | CONFIG_IPV6=y |
| 57 | CONFIG_IP_SCTP=m | 57 | CONFIG_IP_SCTP=m |
| 58 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 58 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 59 | CONFIG_DEVTMPFS=y | ||
| 59 | CONFIG_MTD=y | 60 | CONFIG_MTD=y |
| 60 | CONFIG_MTD_CMDLINE_PARTS=y | 61 | CONFIG_MTD_CMDLINE_PARTS=y |
| 61 | CONFIG_MTD_CHAR=y | 62 | CONFIG_MTD_CHAR=y |
diff --git a/arch/powerpc/configs/g5_defconfig b/arch/powerpc/configs/g5_defconfig index 15130066e5e2..07b7f2af2dca 100644 --- a/arch/powerpc/configs/g5_defconfig +++ b/arch/powerpc/configs/g5_defconfig | |||
| @@ -1,8 +1,10 @@ | |||
| 1 | CONFIG_PPC64=y | ||
| 2 | CONFIG_ALTIVEC=y | ||
| 3 | CONFIG_SMP=y | ||
| 4 | CONFIG_NR_CPUS=4 | ||
| 1 | CONFIG_EXPERIMENTAL=y | 5 | CONFIG_EXPERIMENTAL=y |
| 2 | CONFIG_SYSVIPC=y | 6 | CONFIG_SYSVIPC=y |
| 3 | CONFIG_POSIX_MQUEUE=y | 7 | CONFIG_POSIX_MQUEUE=y |
| 4 | CONFIG_NO_HZ=y | ||
| 5 | CONFIG_HIGH_RES_TIMERS=y | ||
| 6 | CONFIG_IKCONFIG=y | 8 | CONFIG_IKCONFIG=y |
| 7 | CONFIG_IKCONFIG_PROC=y | 9 | CONFIG_IKCONFIG_PROC=y |
| 8 | CONFIG_BLK_DEV_INITRD=y | 10 | CONFIG_BLK_DEV_INITRD=y |
| @@ -13,15 +15,16 @@ CONFIG_MODULES=y | |||
| 13 | CONFIG_MODULE_UNLOAD=y | 15 | CONFIG_MODULE_UNLOAD=y |
| 14 | CONFIG_MODVERSIONS=y | 16 | CONFIG_MODVERSIONS=y |
| 15 | CONFIG_MODULE_SRCVERSION_ALL=y | 17 | CONFIG_MODULE_SRCVERSION_ALL=y |
| 16 | CONFIG_PARTITION_ADVANCED=y | 18 | # CONFIG_PPC_PSERIES is not set |
| 17 | CONFIG_MAC_PARTITION=y | ||
| 18 | CONFIG_SMP=y | ||
| 19 | CONFIG_NR_CPUS=4 | ||
| 20 | CONFIG_KEXEC=y | ||
| 21 | # CONFIG_RELOCATABLE is not set | ||
| 22 | CONFIG_CPU_FREQ=y | 19 | CONFIG_CPU_FREQ=y |
| 23 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | 20 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
| 24 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | 21 | CONFIG_CPU_FREQ_GOV_USERSPACE=y |
| 22 | CONFIG_CPU_FREQ_PMAC64=y | ||
| 23 | CONFIG_NO_HZ=y | ||
| 24 | CONFIG_HIGH_RES_TIMERS=y | ||
| 25 | CONFIG_KEXEC=y | ||
| 26 | CONFIG_IRQ_ALL_CPUS=y | ||
| 27 | # CONFIG_MIGRATION is not set | ||
| 25 | CONFIG_PCI_MSI=y | 28 | CONFIG_PCI_MSI=y |
| 26 | CONFIG_NET=y | 29 | CONFIG_NET=y |
| 27 | CONFIG_PACKET=y | 30 | CONFIG_PACKET=y |
| @@ -49,6 +52,7 @@ CONFIG_NF_CT_NETLINK=m | |||
| 49 | CONFIG_NF_CONNTRACK_IPV4=m | 52 | CONFIG_NF_CONNTRACK_IPV4=m |
| 50 | CONFIG_IP_NF_QUEUE=m | 53 | CONFIG_IP_NF_QUEUE=m |
| 51 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 54 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 55 | CONFIG_PROC_DEVICETREE=y | ||
| 52 | CONFIG_BLK_DEV_LOOP=y | 56 | CONFIG_BLK_DEV_LOOP=y |
| 53 | CONFIG_BLK_DEV_NBD=m | 57 | CONFIG_BLK_DEV_NBD=m |
| 54 | CONFIG_BLK_DEV_RAM=y | 58 | CONFIG_BLK_DEV_RAM=y |
| @@ -56,6 +60,8 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 | |||
| 56 | CONFIG_CDROM_PKTCDVD=m | 60 | CONFIG_CDROM_PKTCDVD=m |
| 57 | CONFIG_IDE=y | 61 | CONFIG_IDE=y |
| 58 | CONFIG_BLK_DEV_IDECD=y | 62 | CONFIG_BLK_DEV_IDECD=y |
| 63 | CONFIG_BLK_DEV_IDE_PMAC=y | ||
| 64 | CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y | ||
| 59 | CONFIG_BLK_DEV_SD=y | 65 | CONFIG_BLK_DEV_SD=y |
| 60 | CONFIG_CHR_DEV_ST=y | 66 | CONFIG_CHR_DEV_ST=y |
| 61 | CONFIG_BLK_DEV_SR=y | 67 | CONFIG_BLK_DEV_SR=y |
| @@ -79,24 +85,33 @@ CONFIG_DM_CRYPT=m | |||
| 79 | CONFIG_DM_SNAPSHOT=m | 85 | CONFIG_DM_SNAPSHOT=m |
| 80 | CONFIG_DM_MIRROR=m | 86 | CONFIG_DM_MIRROR=m |
| 81 | CONFIG_DM_ZERO=m | 87 | CONFIG_DM_ZERO=m |
| 82 | CONFIG_MACINTOSH_DRIVERS=y | 88 | CONFIG_IEEE1394=y |
| 89 | CONFIG_IEEE1394_OHCI1394=y | ||
| 90 | CONFIG_IEEE1394_SBP2=m | ||
| 91 | CONFIG_IEEE1394_ETH1394=m | ||
| 92 | CONFIG_IEEE1394_RAWIO=y | ||
| 93 | CONFIG_IEEE1394_VIDEO1394=m | ||
| 94 | CONFIG_IEEE1394_DV1394=m | ||
| 95 | CONFIG_ADB_PMU=y | ||
| 96 | CONFIG_PMAC_SMU=y | ||
| 83 | CONFIG_MAC_EMUMOUSEBTN=y | 97 | CONFIG_MAC_EMUMOUSEBTN=y |
| 98 | CONFIG_THERM_PM72=y | ||
| 99 | CONFIG_WINDFARM=y | ||
| 100 | CONFIG_WINDFARM_PM81=y | ||
| 101 | CONFIG_WINDFARM_PM91=y | ||
| 102 | CONFIG_WINDFARM_PM112=y | ||
| 103 | CONFIG_WINDFARM_PM121=y | ||
| 84 | CONFIG_NETDEVICES=y | 104 | CONFIG_NETDEVICES=y |
| 85 | CONFIG_BONDING=m | ||
| 86 | CONFIG_DUMMY=m | 105 | CONFIG_DUMMY=m |
| 87 | CONFIG_MII=y | 106 | CONFIG_BONDING=m |
| 88 | CONFIG_TUN=m | 107 | CONFIG_TUN=m |
| 108 | CONFIG_NET_ETHERNET=y | ||
| 109 | CONFIG_MII=y | ||
| 110 | CONFIG_SUNGEM=y | ||
| 89 | CONFIG_ACENIC=m | 111 | CONFIG_ACENIC=m |
| 90 | CONFIG_ACENIC_OMIT_TIGON_I=y | 112 | CONFIG_ACENIC_OMIT_TIGON_I=y |
| 91 | CONFIG_TIGON3=y | ||
| 92 | CONFIG_E1000=y | 113 | CONFIG_E1000=y |
| 93 | CONFIG_SUNGEM=y | 114 | CONFIG_TIGON3=y |
| 94 | CONFIG_PPP=m | ||
| 95 | CONFIG_PPP_BSDCOMP=m | ||
| 96 | CONFIG_PPP_DEFLATE=m | ||
| 97 | CONFIG_PPPOE=m | ||
| 98 | CONFIG_PPP_ASYNC=m | ||
| 99 | CONFIG_PPP_SYNC_TTY=m | ||
| 100 | CONFIG_USB_CATC=m | 115 | CONFIG_USB_CATC=m |
| 101 | CONFIG_USB_KAWETH=m | 116 | CONFIG_USB_KAWETH=m |
| 102 | CONFIG_USB_PEGASUS=m | 117 | CONFIG_USB_PEGASUS=m |
| @@ -106,24 +121,36 @@ CONFIG_USB_USBNET=m | |||
| 106 | # CONFIG_USB_NET_NET1080 is not set | 121 | # CONFIG_USB_NET_NET1080 is not set |
| 107 | # CONFIG_USB_NET_CDC_SUBSET is not set | 122 | # CONFIG_USB_NET_CDC_SUBSET is not set |
| 108 | # CONFIG_USB_NET_ZAURUS is not set | 123 | # CONFIG_USB_NET_ZAURUS is not set |
| 124 | CONFIG_PPP=m | ||
| 125 | CONFIG_PPP_ASYNC=m | ||
| 126 | CONFIG_PPP_SYNC_TTY=m | ||
| 127 | CONFIG_PPP_DEFLATE=m | ||
| 128 | CONFIG_PPP_BSDCOMP=m | ||
| 129 | CONFIG_PPPOE=m | ||
| 109 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | 130 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
| 110 | CONFIG_INPUT_JOYDEV=m | 131 | CONFIG_INPUT_JOYDEV=m |
| 111 | CONFIG_INPUT_EVDEV=y | 132 | CONFIG_INPUT_EVDEV=y |
| 133 | # CONFIG_KEYBOARD_ATKBD is not set | ||
| 112 | # CONFIG_MOUSE_PS2 is not set | 134 | # CONFIG_MOUSE_PS2 is not set |
| 135 | # CONFIG_SERIO_I8042 is not set | ||
| 113 | # CONFIG_SERIO_SERPORT is not set | 136 | # CONFIG_SERIO_SERPORT is not set |
| 114 | CONFIG_VT_HW_CONSOLE_BINDING=y | ||
| 115 | # CONFIG_HW_RANDOM is not set | 137 | # CONFIG_HW_RANDOM is not set |
| 116 | CONFIG_GEN_RTC=y | 138 | CONFIG_GEN_RTC=y |
| 117 | CONFIG_RAW_DRIVER=y | 139 | CONFIG_RAW_DRIVER=y |
| 118 | CONFIG_I2C_CHARDEV=y | 140 | CONFIG_I2C_CHARDEV=y |
| 119 | # CONFIG_HWMON is not set | 141 | # CONFIG_HWMON is not set |
| 120 | CONFIG_AGP=y | 142 | CONFIG_AGP=m |
| 121 | CONFIG_DRM=y | 143 | CONFIG_AGP_UNINORTH=m |
| 122 | CONFIG_DRM_NOUVEAU=y | ||
| 123 | CONFIG_VIDEO_OUTPUT_CONTROL=m | 144 | CONFIG_VIDEO_OUTPUT_CONTROL=m |
| 145 | CONFIG_FB=y | ||
| 124 | CONFIG_FIRMWARE_EDID=y | 146 | CONFIG_FIRMWARE_EDID=y |
| 125 | CONFIG_FB_TILEBLITTING=y | 147 | CONFIG_FB_TILEBLITTING=y |
| 148 | CONFIG_FB_OF=y | ||
| 149 | CONFIG_FB_NVIDIA=y | ||
| 150 | CONFIG_FB_NVIDIA_I2C=y | ||
| 126 | CONFIG_FB_RADEON=y | 151 | CONFIG_FB_RADEON=y |
| 152 | # CONFIG_VGA_CONSOLE is not set | ||
| 153 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
| 127 | CONFIG_LOGO=y | 154 | CONFIG_LOGO=y |
| 128 | CONFIG_SOUND=m | 155 | CONFIG_SOUND=m |
| 129 | CONFIG_SND=m | 156 | CONFIG_SND=m |
| @@ -131,7 +158,15 @@ CONFIG_SND_SEQUENCER=m | |||
| 131 | CONFIG_SND_MIXER_OSS=m | 158 | CONFIG_SND_MIXER_OSS=m |
| 132 | CONFIG_SND_PCM_OSS=m | 159 | CONFIG_SND_PCM_OSS=m |
| 133 | CONFIG_SND_SEQUENCER_OSS=y | 160 | CONFIG_SND_SEQUENCER_OSS=y |
| 161 | CONFIG_SND_POWERMAC=m | ||
| 162 | CONFIG_SND_AOA=m | ||
| 163 | CONFIG_SND_AOA_FABRIC_LAYOUT=m | ||
| 164 | CONFIG_SND_AOA_ONYX=m | ||
| 165 | CONFIG_SND_AOA_TAS=m | ||
| 166 | CONFIG_SND_AOA_TOONIE=m | ||
| 134 | CONFIG_SND_USB_AUDIO=m | 167 | CONFIG_SND_USB_AUDIO=m |
| 168 | CONFIG_HID_PID=y | ||
| 169 | CONFIG_USB_HIDDEV=y | ||
| 135 | CONFIG_HID_GYRATION=y | 170 | CONFIG_HID_GYRATION=y |
| 136 | CONFIG_LOGITECH_FF=y | 171 | CONFIG_LOGITECH_FF=y |
| 137 | CONFIG_HID_PANTHERLORD=y | 172 | CONFIG_HID_PANTHERLORD=y |
| @@ -139,12 +174,13 @@ CONFIG_HID_PETALYNX=y | |||
| 139 | CONFIG_HID_SAMSUNG=y | 174 | CONFIG_HID_SAMSUNG=y |
| 140 | CONFIG_HID_SONY=y | 175 | CONFIG_HID_SONY=y |
| 141 | CONFIG_HID_SUNPLUS=y | 176 | CONFIG_HID_SUNPLUS=y |
| 142 | CONFIG_HID_PID=y | ||
| 143 | CONFIG_USB_HIDDEV=y | ||
| 144 | CONFIG_USB=y | 177 | CONFIG_USB=y |
| 178 | CONFIG_USB_DEVICEFS=y | ||
| 145 | CONFIG_USB_MON=y | 179 | CONFIG_USB_MON=y |
| 146 | CONFIG_USB_EHCI_HCD=y | 180 | CONFIG_USB_EHCI_HCD=y |
| 181 | # CONFIG_USB_EHCI_HCD_PPC_OF is not set | ||
| 147 | CONFIG_USB_OHCI_HCD=y | 182 | CONFIG_USB_OHCI_HCD=y |
| 183 | CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | ||
| 148 | CONFIG_USB_ACM=m | 184 | CONFIG_USB_ACM=m |
| 149 | CONFIG_USB_PRINTER=y | 185 | CONFIG_USB_PRINTER=y |
| 150 | CONFIG_USB_STORAGE=y | 186 | CONFIG_USB_STORAGE=y |
| @@ -208,6 +244,8 @@ CONFIG_REISERFS_FS_POSIX_ACL=y | |||
| 208 | CONFIG_REISERFS_FS_SECURITY=y | 244 | CONFIG_REISERFS_FS_SECURITY=y |
| 209 | CONFIG_XFS_FS=m | 245 | CONFIG_XFS_FS=m |
| 210 | CONFIG_XFS_POSIX_ACL=y | 246 | CONFIG_XFS_POSIX_ACL=y |
| 247 | CONFIG_INOTIFY=y | ||
| 248 | CONFIG_AUTOFS_FS=m | ||
| 211 | CONFIG_ISO9660_FS=y | 249 | CONFIG_ISO9660_FS=y |
| 212 | CONFIG_JOLIET=y | 250 | CONFIG_JOLIET=y |
| 213 | CONFIG_ZISOFS=y | 251 | CONFIG_ZISOFS=y |
| @@ -221,12 +259,14 @@ CONFIG_HFS_FS=m | |||
| 221 | CONFIG_HFSPLUS_FS=m | 259 | CONFIG_HFSPLUS_FS=m |
| 222 | CONFIG_CRAMFS=y | 260 | CONFIG_CRAMFS=y |
| 223 | CONFIG_NFS_FS=y | 261 | CONFIG_NFS_FS=y |
| 262 | CONFIG_NFS_V3=y | ||
| 224 | CONFIG_NFS_V3_ACL=y | 263 | CONFIG_NFS_V3_ACL=y |
| 225 | CONFIG_NFS_V4=y | 264 | CONFIG_NFS_V4=y |
| 226 | CONFIG_NFSD=y | 265 | CONFIG_NFSD=y |
| 227 | CONFIG_NFSD_V3_ACL=y | 266 | CONFIG_NFSD_V3_ACL=y |
| 228 | CONFIG_NFSD_V4=y | 267 | CONFIG_NFSD_V4=y |
| 229 | CONFIG_CIFS=m | 268 | CONFIG_CIFS=m |
| 269 | CONFIG_PARTITION_ADVANCED=y | ||
| 230 | CONFIG_NLS_CODEPAGE_437=y | 270 | CONFIG_NLS_CODEPAGE_437=y |
| 231 | CONFIG_NLS_CODEPAGE_1250=y | 271 | CONFIG_NLS_CODEPAGE_1250=y |
| 232 | CONFIG_NLS_CODEPAGE_1251=y | 272 | CONFIG_NLS_CODEPAGE_1251=y |
| @@ -234,23 +274,29 @@ CONFIG_NLS_ASCII=y | |||
| 234 | CONFIG_NLS_ISO8859_1=y | 274 | CONFIG_NLS_ISO8859_1=y |
| 235 | CONFIG_NLS_ISO8859_15=y | 275 | CONFIG_NLS_ISO8859_15=y |
| 236 | CONFIG_NLS_UTF8=y | 276 | CONFIG_NLS_UTF8=y |
| 277 | CONFIG_CRC_T10DIF=y | ||
| 278 | CONFIG_LIBCRC32C=m | ||
| 237 | CONFIG_MAGIC_SYSRQ=y | 279 | CONFIG_MAGIC_SYSRQ=y |
| 238 | # CONFIG_UNUSED_SYMBOLS is not set | ||
| 239 | CONFIG_DEBUG_FS=y | 280 | CONFIG_DEBUG_FS=y |
| 240 | CONFIG_DEBUG_KERNEL=y | 281 | CONFIG_DEBUG_KERNEL=y |
| 241 | CONFIG_DEBUG_MUTEXES=y | 282 | CONFIG_DEBUG_MUTEXES=y |
| 283 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 242 | CONFIG_LATENCYTOP=y | 284 | CONFIG_LATENCYTOP=y |
| 243 | CONFIG_STRICT_DEVMEM=y | 285 | CONFIG_SYSCTL_SYSCALL_CHECK=y |
| 286 | CONFIG_BOOTX_TEXT=y | ||
| 244 | CONFIG_CRYPTO_NULL=m | 287 | CONFIG_CRYPTO_NULL=m |
| 245 | CONFIG_CRYPTO_TEST=m | 288 | CONFIG_CRYPTO_TEST=m |
| 289 | CONFIG_CRYPTO_ECB=m | ||
| 246 | CONFIG_CRYPTO_PCBC=m | 290 | CONFIG_CRYPTO_PCBC=m |
| 247 | CONFIG_CRYPTO_HMAC=y | 291 | CONFIG_CRYPTO_HMAC=y |
| 292 | CONFIG_CRYPTO_MD4=m | ||
| 248 | CONFIG_CRYPTO_MICHAEL_MIC=m | 293 | CONFIG_CRYPTO_MICHAEL_MIC=m |
| 249 | CONFIG_CRYPTO_SHA256=m | 294 | CONFIG_CRYPTO_SHA256=m |
| 250 | CONFIG_CRYPTO_SHA512=m | 295 | CONFIG_CRYPTO_SHA512=m |
| 251 | CONFIG_CRYPTO_WP512=m | 296 | CONFIG_CRYPTO_WP512=m |
| 252 | CONFIG_CRYPTO_AES=m | 297 | CONFIG_CRYPTO_AES=m |
| 253 | CONFIG_CRYPTO_ANUBIS=m | 298 | CONFIG_CRYPTO_ANUBIS=m |
| 299 | CONFIG_CRYPTO_ARC4=m | ||
| 254 | CONFIG_CRYPTO_BLOWFISH=m | 300 | CONFIG_CRYPTO_BLOWFISH=m |
| 255 | CONFIG_CRYPTO_CAST5=m | 301 | CONFIG_CRYPTO_CAST5=m |
| 256 | CONFIG_CRYPTO_CAST6=m | 302 | CONFIG_CRYPTO_CAST6=m |
| @@ -260,6 +306,3 @@ CONFIG_CRYPTO_TEA=m | |||
| 260 | CONFIG_CRYPTO_TWOFISH=m | 306 | CONFIG_CRYPTO_TWOFISH=m |
| 261 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 307 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
| 262 | # CONFIG_CRYPTO_HW is not set | 308 | # CONFIG_CRYPTO_HW is not set |
| 263 | # CONFIG_VIRTUALIZATION is not set | ||
| 264 | CONFIG_CRC_T10DIF=y | ||
| 265 | CONFIG_LIBCRC32C=m | ||
diff --git a/arch/powerpc/configs/mpc83xx_defconfig b/arch/powerpc/configs/mpc83xx_defconfig index 5aac9a8bc53b..9352e4430c3b 100644 --- a/arch/powerpc/configs/mpc83xx_defconfig +++ b/arch/powerpc/configs/mpc83xx_defconfig | |||
| @@ -2,12 +2,12 @@ CONFIG_EXPERIMENTAL=y | |||
| 2 | CONFIG_SYSVIPC=y | 2 | CONFIG_SYSVIPC=y |
| 3 | CONFIG_LOG_BUF_SHIFT=14 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | CONFIG_BLK_DEV_INITRD=y | 4 | CONFIG_BLK_DEV_INITRD=y |
| 5 | # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | ||
| 6 | CONFIG_EXPERT=y | 5 | CONFIG_EXPERT=y |
| 7 | CONFIG_SLAB=y | 6 | CONFIG_SLAB=y |
| 8 | CONFIG_MODULES=y | 7 | CONFIG_MODULES=y |
| 9 | CONFIG_MODULE_UNLOAD=y | 8 | CONFIG_MODULE_UNLOAD=y |
| 10 | # CONFIG_BLK_DEV_BSG is not set | 9 | # CONFIG_BLK_DEV_BSG is not set |
| 10 | CONFIG_PARTITION_ADVANCED=y | ||
| 11 | # CONFIG_PPC_CHRP is not set | 11 | # CONFIG_PPC_CHRP is not set |
| 12 | # CONFIG_PPC_PMAC is not set | 12 | # CONFIG_PPC_PMAC is not set |
| 13 | CONFIG_PPC_83xx=y | 13 | CONFIG_PPC_83xx=y |
| @@ -25,7 +25,6 @@ CONFIG_ASP834x=y | |||
| 25 | CONFIG_QUICC_ENGINE=y | 25 | CONFIG_QUICC_ENGINE=y |
| 26 | CONFIG_QE_GPIO=y | 26 | CONFIG_QE_GPIO=y |
| 27 | CONFIG_MATH_EMULATION=y | 27 | CONFIG_MATH_EMULATION=y |
| 28 | CONFIG_SPARSE_IRQ=y | ||
| 29 | CONFIG_PCI=y | 28 | CONFIG_PCI=y |
| 30 | CONFIG_NET=y | 29 | CONFIG_NET=y |
| 31 | CONFIG_PACKET=y | 30 | CONFIG_PACKET=y |
| @@ -42,10 +41,9 @@ CONFIG_INET_ESP=y | |||
| 42 | # CONFIG_INET_LRO is not set | 41 | # CONFIG_INET_LRO is not set |
| 43 | # CONFIG_IPV6 is not set | 42 | # CONFIG_IPV6 is not set |
| 44 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 43 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 44 | CONFIG_DEVTMPFS=y | ||
| 45 | # CONFIG_FW_LOADER is not set | 45 | # CONFIG_FW_LOADER is not set |
| 46 | CONFIG_MTD=y | 46 | CONFIG_MTD=y |
| 47 | CONFIG_MTD_PARTITIONS=y | ||
| 48 | CONFIG_MTD_OF_PARTS=y | ||
| 49 | CONFIG_MTD_CHAR=y | 47 | CONFIG_MTD_CHAR=y |
| 50 | CONFIG_MTD_BLOCK=y | 48 | CONFIG_MTD_BLOCK=y |
| 51 | CONFIG_MTD_CFI=y | 49 | CONFIG_MTD_CFI=y |
| @@ -64,15 +62,14 @@ CONFIG_ATA=y | |||
| 64 | CONFIG_SATA_FSL=y | 62 | CONFIG_SATA_FSL=y |
| 65 | CONFIG_SATA_SIL=y | 63 | CONFIG_SATA_SIL=y |
| 66 | CONFIG_NETDEVICES=y | 64 | CONFIG_NETDEVICES=y |
| 65 | CONFIG_MII=y | ||
| 66 | CONFIG_UCC_GETH=y | ||
| 67 | CONFIG_GIANFAR=y | ||
| 67 | CONFIG_MARVELL_PHY=y | 68 | CONFIG_MARVELL_PHY=y |
| 68 | CONFIG_DAVICOM_PHY=y | 69 | CONFIG_DAVICOM_PHY=y |
| 69 | CONFIG_VITESSE_PHY=y | 70 | CONFIG_VITESSE_PHY=y |
| 70 | CONFIG_ICPLUS_PHY=y | 71 | CONFIG_ICPLUS_PHY=y |
| 71 | CONFIG_FIXED_PHY=y | 72 | CONFIG_FIXED_PHY=y |
| 72 | CONFIG_NET_ETHERNET=y | ||
| 73 | CONFIG_MII=y | ||
| 74 | CONFIG_GIANFAR=y | ||
| 75 | CONFIG_UCC_GETH=y | ||
| 76 | CONFIG_INPUT_FF_MEMLESS=m | 73 | CONFIG_INPUT_FF_MEMLESS=m |
| 77 | # CONFIG_INPUT_MOUSEDEV is not set | 74 | # CONFIG_INPUT_MOUSEDEV is not set |
| 78 | # CONFIG_INPUT_KEYBOARD is not set | 75 | # CONFIG_INPUT_KEYBOARD is not set |
| @@ -112,17 +109,12 @@ CONFIG_RTC_DRV_DS1374=y | |||
| 112 | CONFIG_EXT2_FS=y | 109 | CONFIG_EXT2_FS=y |
| 113 | CONFIG_EXT3_FS=y | 110 | CONFIG_EXT3_FS=y |
| 114 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set | 111 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
| 115 | CONFIG_INOTIFY=y | ||
| 116 | CONFIG_PROC_KCORE=y | 112 | CONFIG_PROC_KCORE=y |
| 117 | CONFIG_TMPFS=y | 113 | CONFIG_TMPFS=y |
| 118 | CONFIG_NFS_FS=y | 114 | CONFIG_NFS_FS=y |
| 119 | CONFIG_NFS_V3=y | ||
| 120 | CONFIG_NFS_V4=y | 115 | CONFIG_NFS_V4=y |
| 121 | CONFIG_ROOT_NFS=y | 116 | CONFIG_ROOT_NFS=y |
| 122 | CONFIG_PARTITION_ADVANCED=y | ||
| 123 | CONFIG_CRC_T10DIF=y | 117 | CONFIG_CRC_T10DIF=y |
| 124 | # CONFIG_RCU_CPU_STALL_DETECTOR is not set | ||
| 125 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 126 | CONFIG_CRYPTO_ECB=m | 118 | CONFIG_CRYPTO_ECB=m |
| 127 | CONFIG_CRYPTO_PCBC=m | 119 | CONFIG_CRYPTO_PCBC=m |
| 128 | CONFIG_CRYPTO_SHA256=y | 120 | CONFIG_CRYPTO_SHA256=y |
diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig index 03ee911c4577..8b5bda27d248 100644 --- a/arch/powerpc/configs/mpc85xx_defconfig +++ b/arch/powerpc/configs/mpc85xx_defconfig | |||
| @@ -5,7 +5,9 @@ CONFIG_SYSVIPC=y | |||
| 5 | CONFIG_POSIX_MQUEUE=y | 5 | CONFIG_POSIX_MQUEUE=y |
| 6 | CONFIG_BSD_PROCESS_ACCT=y | 6 | CONFIG_BSD_PROCESS_ACCT=y |
| 7 | CONFIG_AUDIT=y | 7 | CONFIG_AUDIT=y |
| 8 | CONFIG_SPARSE_IRQ=y | 8 | CONFIG_IRQ_DOMAIN_DEBUG=y |
| 9 | CONFIG_NO_HZ=y | ||
| 10 | CONFIG_HIGH_RES_TIMERS=y | ||
| 9 | CONFIG_IKCONFIG=y | 11 | CONFIG_IKCONFIG=y |
| 10 | CONFIG_IKCONFIG_PROC=y | 12 | CONFIG_IKCONFIG_PROC=y |
| 11 | CONFIG_LOG_BUF_SHIFT=14 | 13 | CONFIG_LOG_BUF_SHIFT=14 |
| @@ -17,6 +19,8 @@ CONFIG_MODULE_UNLOAD=y | |||
| 17 | CONFIG_MODULE_FORCE_UNLOAD=y | 19 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 18 | CONFIG_MODVERSIONS=y | 20 | CONFIG_MODVERSIONS=y |
| 19 | # CONFIG_BLK_DEV_BSG is not set | 21 | # CONFIG_BLK_DEV_BSG is not set |
| 22 | CONFIG_PARTITION_ADVANCED=y | ||
| 23 | CONFIG_MAC_PARTITION=y | ||
| 20 | CONFIG_MPC8540_ADS=y | 24 | CONFIG_MPC8540_ADS=y |
| 21 | CONFIG_MPC8560_ADS=y | 25 | CONFIG_MPC8560_ADS=y |
| 22 | CONFIG_MPC85xx_CDS=y | 26 | CONFIG_MPC85xx_CDS=y |
| @@ -40,8 +44,6 @@ CONFIG_SBC8548=y | |||
| 40 | CONFIG_QUICC_ENGINE=y | 44 | CONFIG_QUICC_ENGINE=y |
| 41 | CONFIG_QE_GPIO=y | 45 | CONFIG_QE_GPIO=y |
| 42 | CONFIG_HIGHMEM=y | 46 | CONFIG_HIGHMEM=y |
| 43 | CONFIG_NO_HZ=y | ||
| 44 | CONFIG_HIGH_RES_TIMERS=y | ||
| 45 | CONFIG_BINFMT_MISC=m | 47 | CONFIG_BINFMT_MISC=m |
| 46 | CONFIG_MATH_EMULATION=y | 48 | CONFIG_MATH_EMULATION=y |
| 47 | CONFIG_FORCE_MAX_ZONEORDER=12 | 49 | CONFIG_FORCE_MAX_ZONEORDER=12 |
| @@ -74,36 +76,25 @@ CONFIG_INET_ESP=y | |||
| 74 | CONFIG_IPV6=y | 76 | CONFIG_IPV6=y |
| 75 | CONFIG_IP_SCTP=m | 77 | CONFIG_IP_SCTP=m |
| 76 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 78 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 79 | CONFIG_DEVTMPFS=y | ||
| 77 | CONFIG_MTD=y | 80 | CONFIG_MTD=y |
| 78 | CONFIG_MTD_CMDLINE_PARTS=y | 81 | CONFIG_MTD_CMDLINE_PARTS=y |
| 79 | CONFIG_MTD_CHAR=y | 82 | CONFIG_MTD_CHAR=y |
| 80 | CONFIG_MTD_BLOCK=y | 83 | CONFIG_MTD_BLOCK=y |
| 81 | CONFIG_MTD_CFI=y | ||
| 82 | CONFIG_FTL=y | 84 | CONFIG_FTL=y |
| 83 | CONFIG_MTD_GEN_PROBE=y | 85 | CONFIG_MTD_CFI=y |
| 84 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 85 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 86 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 87 | CONFIG_MTD_CFI_I1=y | ||
| 88 | CONFIG_MTD_CFI_I2=y | ||
| 89 | CONFIG_MTD_CFI_INTELEXT=y | 86 | CONFIG_MTD_CFI_INTELEXT=y |
| 90 | CONFIG_MTD_CFI_AMDSTD=y | 87 | CONFIG_MTD_CFI_AMDSTD=y |
| 91 | CONFIG_MTD_CFI_UTIL=y | ||
| 92 | CONFIG_MTD_PHYSMAP_OF=y | 88 | CONFIG_MTD_PHYSMAP_OF=y |
| 93 | CONFIG_MTD_PARTITIONS=y | 89 | CONFIG_MTD_M25P80=y |
| 94 | CONFIG_MTD_OF_PARTS=y | ||
| 95 | CONFIG_MTD_NAND=y | 90 | CONFIG_MTD_NAND=y |
| 96 | CONFIG_MTD_NAND_FSL_ELBC=y | 91 | CONFIG_MTD_NAND_FSL_ELBC=y |
| 97 | CONFIG_MTD_NAND_FSL_IFC=y | 92 | CONFIG_MTD_NAND_FSL_IFC=y |
| 98 | CONFIG_MTD_NAND_IDS=y | ||
| 99 | CONFIG_MTD_NAND_ECC=y | ||
| 100 | CONFIG_MTD_M25P80=y | ||
| 101 | CONFIG_PROC_DEVICETREE=y | 93 | CONFIG_PROC_DEVICETREE=y |
| 102 | CONFIG_BLK_DEV_LOOP=y | 94 | CONFIG_BLK_DEV_LOOP=y |
| 103 | CONFIG_BLK_DEV_NBD=y | 95 | CONFIG_BLK_DEV_NBD=y |
| 104 | CONFIG_BLK_DEV_RAM=y | 96 | CONFIG_BLK_DEV_RAM=y |
| 105 | CONFIG_BLK_DEV_RAM_SIZE=131072 | 97 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 106 | CONFIG_MISC_DEVICES=y | ||
| 107 | CONFIG_EEPROM_LEGACY=y | 98 | CONFIG_EEPROM_LEGACY=y |
| 108 | CONFIG_BLK_DEV_SD=y | 99 | CONFIG_BLK_DEV_SD=y |
| 109 | CONFIG_CHR_DEV_ST=y | 100 | CONFIG_CHR_DEV_ST=y |
| @@ -115,6 +106,7 @@ CONFIG_ATA=y | |||
| 115 | CONFIG_SATA_AHCI=y | 106 | CONFIG_SATA_AHCI=y |
| 116 | CONFIG_SATA_FSL=y | 107 | CONFIG_SATA_FSL=y |
| 117 | CONFIG_PATA_ALI=y | 108 | CONFIG_PATA_ALI=y |
| 109 | CONFIG_PATA_VIA=y | ||
| 118 | CONFIG_NETDEVICES=y | 110 | CONFIG_NETDEVICES=y |
| 119 | CONFIG_DUMMY=y | 111 | CONFIG_DUMMY=y |
| 120 | CONFIG_FS_ENET=y | 112 | CONFIG_FS_ENET=y |
| @@ -134,7 +126,6 @@ CONFIG_SERIAL_8250=y | |||
| 134 | CONFIG_SERIAL_8250_CONSOLE=y | 126 | CONFIG_SERIAL_8250_CONSOLE=y |
| 135 | CONFIG_SERIAL_8250_NR_UARTS=2 | 127 | CONFIG_SERIAL_8250_NR_UARTS=2 |
| 136 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | 128 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
| 137 | CONFIG_SERIAL_8250_EXTENDED=y | ||
| 138 | CONFIG_SERIAL_8250_MANY_PORTS=y | 129 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 139 | CONFIG_SERIAL_8250_DETECT_IRQ=y | 130 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 140 | CONFIG_SERIAL_8250_RSA=y | 131 | CONFIG_SERIAL_8250_RSA=y |
| @@ -183,7 +174,6 @@ CONFIG_HID_SAMSUNG=y | |||
| 183 | CONFIG_HID_SONY=y | 174 | CONFIG_HID_SONY=y |
| 184 | CONFIG_HID_SUNPLUS=y | 175 | CONFIG_HID_SUNPLUS=y |
| 185 | CONFIG_USB=y | 176 | CONFIG_USB=y |
| 186 | CONFIG_USB_DEVICEFS=y | ||
| 187 | CONFIG_USB_MON=y | 177 | CONFIG_USB_MON=y |
| 188 | CONFIG_USB_EHCI_HCD=y | 178 | CONFIG_USB_EHCI_HCD=y |
| 189 | CONFIG_USB_EHCI_FSL=y | 179 | CONFIG_USB_EHCI_FSL=y |
| @@ -229,18 +219,13 @@ CONFIG_QNX4FS_FS=m | |||
| 229 | CONFIG_SYSV_FS=m | 219 | CONFIG_SYSV_FS=m |
| 230 | CONFIG_UFS_FS=m | 220 | CONFIG_UFS_FS=m |
| 231 | CONFIG_NFS_FS=y | 221 | CONFIG_NFS_FS=y |
| 232 | CONFIG_NFS_V3=y | ||
| 233 | CONFIG_NFS_V4=y | 222 | CONFIG_NFS_V4=y |
| 234 | CONFIG_ROOT_NFS=y | 223 | CONFIG_ROOT_NFS=y |
| 235 | CONFIG_NFSD=y | 224 | CONFIG_NFSD=y |
| 236 | CONFIG_PARTITION_ADVANCED=y | ||
| 237 | CONFIG_MAC_PARTITION=y | ||
| 238 | CONFIG_CRC_T10DIF=y | 225 | CONFIG_CRC_T10DIF=y |
| 239 | CONFIG_DEBUG_FS=y | 226 | CONFIG_DEBUG_FS=y |
| 240 | CONFIG_DETECT_HUNG_TASK=y | 227 | CONFIG_DETECT_HUNG_TASK=y |
| 241 | CONFIG_DEBUG_INFO=y | 228 | CONFIG_DEBUG_INFO=y |
| 242 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 243 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
| 244 | CONFIG_CRYPTO_PCBC=m | 229 | CONFIG_CRYPTO_PCBC=m |
| 245 | CONFIG_CRYPTO_SHA256=y | 230 | CONFIG_CRYPTO_SHA256=y |
| 246 | CONFIG_CRYPTO_SHA512=y | 231 | CONFIG_CRYPTO_SHA512=y |
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig index fdfa84dc908f..b0974e7e98ae 100644 --- a/arch/powerpc/configs/mpc85xx_smp_defconfig +++ b/arch/powerpc/configs/mpc85xx_smp_defconfig | |||
| @@ -7,7 +7,9 @@ CONFIG_SYSVIPC=y | |||
| 7 | CONFIG_POSIX_MQUEUE=y | 7 | CONFIG_POSIX_MQUEUE=y |
| 8 | CONFIG_BSD_PROCESS_ACCT=y | 8 | CONFIG_BSD_PROCESS_ACCT=y |
| 9 | CONFIG_AUDIT=y | 9 | CONFIG_AUDIT=y |
| 10 | CONFIG_SPARSE_IRQ=y | 10 | CONFIG_IRQ_DOMAIN_DEBUG=y |
| 11 | CONFIG_NO_HZ=y | ||
| 12 | CONFIG_HIGH_RES_TIMERS=y | ||
| 11 | CONFIG_IKCONFIG=y | 13 | CONFIG_IKCONFIG=y |
| 12 | CONFIG_IKCONFIG_PROC=y | 14 | CONFIG_IKCONFIG_PROC=y |
| 13 | CONFIG_LOG_BUF_SHIFT=14 | 15 | CONFIG_LOG_BUF_SHIFT=14 |
| @@ -19,6 +21,8 @@ CONFIG_MODULE_UNLOAD=y | |||
| 19 | CONFIG_MODULE_FORCE_UNLOAD=y | 21 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 20 | CONFIG_MODVERSIONS=y | 22 | CONFIG_MODVERSIONS=y |
| 21 | # CONFIG_BLK_DEV_BSG is not set | 23 | # CONFIG_BLK_DEV_BSG is not set |
| 24 | CONFIG_PARTITION_ADVANCED=y | ||
| 25 | CONFIG_MAC_PARTITION=y | ||
| 22 | CONFIG_MPC8540_ADS=y | 26 | CONFIG_MPC8540_ADS=y |
| 23 | CONFIG_MPC8560_ADS=y | 27 | CONFIG_MPC8560_ADS=y |
| 24 | CONFIG_MPC85xx_CDS=y | 28 | CONFIG_MPC85xx_CDS=y |
| @@ -42,8 +46,6 @@ CONFIG_SBC8548=y | |||
| 42 | CONFIG_QUICC_ENGINE=y | 46 | CONFIG_QUICC_ENGINE=y |
| 43 | CONFIG_QE_GPIO=y | 47 | CONFIG_QE_GPIO=y |
| 44 | CONFIG_HIGHMEM=y | 48 | CONFIG_HIGHMEM=y |
| 45 | CONFIG_NO_HZ=y | ||
| 46 | CONFIG_HIGH_RES_TIMERS=y | ||
| 47 | CONFIG_BINFMT_MISC=m | 49 | CONFIG_BINFMT_MISC=m |
| 48 | CONFIG_MATH_EMULATION=y | 50 | CONFIG_MATH_EMULATION=y |
| 49 | CONFIG_IRQ_ALL_CPUS=y | 51 | CONFIG_IRQ_ALL_CPUS=y |
| @@ -77,36 +79,25 @@ CONFIG_INET_ESP=y | |||
| 77 | CONFIG_IPV6=y | 79 | CONFIG_IPV6=y |
| 78 | CONFIG_IP_SCTP=m | 80 | CONFIG_IP_SCTP=m |
| 79 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | 81 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 82 | CONFIG_DEVTMPFS=y | ||
| 80 | CONFIG_MTD=y | 83 | CONFIG_MTD=y |
| 81 | CONFIG_MTD_CMDLINE_PARTS=y | 84 | CONFIG_MTD_CMDLINE_PARTS=y |
| 82 | CONFIG_MTD_CHAR=y | 85 | CONFIG_MTD_CHAR=y |
| 83 | CONFIG_MTD_BLOCK=y | 86 | CONFIG_MTD_BLOCK=y |
| 84 | CONFIG_MTD_CFI=y | ||
| 85 | CONFIG_FTL=y | 87 | CONFIG_FTL=y |
| 86 | CONFIG_MTD_GEN_PROBE=y | 88 | CONFIG_MTD_CFI=y |
| 87 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
| 88 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
| 89 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
| 90 | CONFIG_MTD_CFI_I1=y | ||
| 91 | CONFIG_MTD_CFI_I2=y | ||
| 92 | CONFIG_MTD_CFI_INTELEXT=y | 89 | CONFIG_MTD_CFI_INTELEXT=y |
| 93 | CONFIG_MTD_CFI_AMDSTD=y | 90 | CONFIG_MTD_CFI_AMDSTD=y |
| 94 | CONFIG_MTD_CFI_UTIL=y | ||
| 95 | CONFIG_MTD_PHYSMAP_OF=y | 91 | CONFIG_MTD_PHYSMAP_OF=y |
| 96 | CONFIG_MTD_PARTITIONS=y | 92 | CONFIG_MTD_M25P80=y |
| 97 | CONFIG_MTD_OF_PARTS=y | ||
| 98 | CONFIG_MTD_NAND=y | 93 | CONFIG_MTD_NAND=y |
| 99 | CONFIG_MTD_NAND_FSL_ELBC=y | 94 | CONFIG_MTD_NAND_FSL_ELBC=y |
| 100 | CONFIG_MTD_NAND_FSL_IFC=y | 95 | CONFIG_MTD_NAND_FSL_IFC=y |
| 101 | CONFIG_MTD_NAND_IDS=y | ||
| 102 | CONFIG_MTD_NAND_ECC=y | ||
| 103 | CONFIG_MTD_M25P80=y | ||
| 104 | CONFIG_PROC_DEVICETREE=y | 96 | CONFIG_PROC_DEVICETREE=y |
| 105 | CONFIG_BLK_DEV_LOOP=y | 97 | CONFIG_BLK_DEV_LOOP=y |
| 106 | CONFIG_BLK_DEV_NBD=y | 98 | CONFIG_BLK_DEV_NBD=y |
| 107 | CONFIG_BLK_DEV_RAM=y | 99 | CONFIG_BLK_DEV_RAM=y |
| 108 | CONFIG_BLK_DEV_RAM_SIZE=131072 | 100 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 109 | CONFIG_MISC_DEVICES=y | ||
| 110 | CONFIG_EEPROM_LEGACY=y | 101 | CONFIG_EEPROM_LEGACY=y |
| 111 | CONFIG_BLK_DEV_SD=y | 102 | CONFIG_BLK_DEV_SD=y |
| 112 | CONFIG_CHR_DEV_ST=y | 103 | CONFIG_CHR_DEV_ST=y |
| @@ -137,7 +128,6 @@ CONFIG_SERIAL_8250=y | |||
| 137 | CONFIG_SERIAL_8250_CONSOLE=y | 128 | CONFIG_SERIAL_8250_CONSOLE=y |
| 138 | CONFIG_SERIAL_8250_NR_UARTS=2 | 129 | CONFIG_SERIAL_8250_NR_UARTS=2 |
| 139 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 | 130 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
| 140 | CONFIG_SERIAL_8250_EXTENDED=y | ||
| 141 | CONFIG_SERIAL_8250_MANY_PORTS=y | 131 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 142 | CONFIG_SERIAL_8250_DETECT_IRQ=y | 132 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 143 | CONFIG_SERIAL_8250_RSA=y | 133 | CONFIG_SERIAL_8250_RSA=y |
| @@ -186,7 +176,6 @@ CONFIG_HID_SAMSUNG=y | |||
| 186 | CONFIG_HID_SONY=y | 176 | CONFIG_HID_SONY=y |
| 187 | CONFIG_HID_SUNPLUS=y | 177 | CONFIG_HID_SUNPLUS=y |
| 188 | CONFIG_USB=y | 178 | CONFIG_USB=y |
| 189 | CONFIG_USB_DEVICEFS=y | ||
| 190 | CONFIG_USB_MON=y | 179 | CONFIG_USB_MON=y |
| 191 | CONFIG_USB_EHCI_HCD=y | 180 | CONFIG_USB_EHCI_HCD=y |
| 192 | CONFIG_USB_EHCI_FSL=y | 181 | CONFIG_USB_EHCI_FSL=y |
| @@ -232,18 +221,13 @@ CONFIG_QNX4FS_FS=m | |||
| 232 | CONFIG_SYSV_FS=m | 221 | CONFIG_SYSV_FS=m |
| 233 | CONFIG_UFS_FS=m | 222 | CONFIG_UFS_FS=m |
| 234 | CONFIG_NFS_FS=y | 223 | CONFIG_NFS_FS=y |
| 235 | CONFIG_NFS_V3=y | ||
| 236 | CONFIG_NFS_V4=y | 224 | CONFIG_NFS_V4=y |
| 237 | CONFIG_ROOT_NFS=y | 225 | CONFIG_ROOT_NFS=y |
| 238 | CONFIG_NFSD=y | 226 | CONFIG_NFSD=y |
| 239 | CONFIG_PARTITION_ADVANCED=y | ||
| 240 | CONFIG_MAC_PARTITION=y | ||
| 241 | CONFIG_CRC_T10DIF=y | 227 | CONFIG_CRC_T10DIF=y |
| 242 | CONFIG_DEBUG_FS=y | 228 | CONFIG_DEBUG_FS=y |
| 243 | CONFIG_DETECT_HUNG_TASK=y | 229 | CONFIG_DETECT_HUNG_TASK=y |
| 244 | CONFIG_DEBUG_INFO=y | 230 | CONFIG_DEBUG_INFO=y |
| 245 | CONFIG_SYSCTL_SYSCALL_CHECK=y | ||
| 246 | CONFIG_IRQ_DOMAIN_DEBUG=y | ||
| 247 | CONFIG_CRYPTO_PCBC=m | 231 | CONFIG_CRYPTO_PCBC=m |
| 248 | CONFIG_CRYPTO_SHA256=y | 232 | CONFIG_CRYPTO_SHA256=y |
| 249 | CONFIG_CRYPTO_SHA512=y | 233 | CONFIG_CRYPTO_SHA512=y |
diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 50d82c8a037f..b3c083de17ad 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h | |||
| @@ -553,9 +553,7 @@ static inline int cpu_has_feature(unsigned long feature) | |||
| 553 | & feature); | 553 | & feature); |
| 554 | } | 554 | } |
| 555 | 555 | ||
| 556 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | ||
| 557 | #define HBP_NUM 1 | 556 | #define HBP_NUM 1 |
| 558 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | ||
| 559 | 557 | ||
| 560 | #endif /* !__ASSEMBLY__ */ | 558 | #endif /* !__ASSEMBLY__ */ |
| 561 | 559 | ||
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 50ea12fd7bf5..a8bf5c673a3c 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <asm/kvm_asm.h> | 33 | #include <asm/kvm_asm.h> |
| 34 | #include <asm/processor.h> | 34 | #include <asm/processor.h> |
| 35 | #include <asm/page.h> | 35 | #include <asm/page.h> |
| 36 | #include <asm/cacheflush.h> | ||
| 36 | 37 | ||
| 37 | #define KVM_MAX_VCPUS NR_CPUS | 38 | #define KVM_MAX_VCPUS NR_CPUS |
| 38 | #define KVM_MAX_VCORES NR_CPUS | 39 | #define KVM_MAX_VCORES NR_CPUS |
diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 0124937a23b9..e006f0bdea95 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h | |||
| @@ -219,4 +219,16 @@ void kvmppc_claim_lpid(long lpid); | |||
| 219 | void kvmppc_free_lpid(long lpid); | 219 | void kvmppc_free_lpid(long lpid); |
| 220 | void kvmppc_init_lpid(unsigned long nr_lpids); | 220 | void kvmppc_init_lpid(unsigned long nr_lpids); |
| 221 | 221 | ||
| 222 | static inline void kvmppc_mmu_flush_icache(pfn_t pfn) | ||
| 223 | { | ||
| 224 | /* Clear i-cache for new pages */ | ||
| 225 | struct page *page; | ||
| 226 | page = pfn_to_page(pfn); | ||
| 227 | if (!test_bit(PG_arch_1, &page->flags)) { | ||
| 228 | flush_dcache_icache_page(page); | ||
| 229 | set_bit(PG_arch_1, &page->flags); | ||
| 230 | } | ||
| 231 | } | ||
| 232 | |||
| 233 | |||
| 222 | #endif /* __POWERPC_KVM_PPC_H__ */ | 234 | #endif /* __POWERPC_KVM_PPC_H__ */ |
diff --git a/arch/powerpc/include/asm/mpic_msgr.h b/arch/powerpc/include/asm/mpic_msgr.h index 326d33ca55cd..d4f471fb1031 100644 --- a/arch/powerpc/include/asm/mpic_msgr.h +++ b/arch/powerpc/include/asm/mpic_msgr.h | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/types.h> | 14 | #include <linux/types.h> |
| 15 | #include <linux/spinlock.h> | 15 | #include <linux/spinlock.h> |
| 16 | #include <asm/smp.h> | 16 | #include <asm/smp.h> |
| 17 | #include <asm/io.h> | ||
| 17 | 18 | ||
| 18 | struct mpic_msgr { | 19 | struct mpic_msgr { |
| 19 | u32 __iomem *base; | 20 | u32 __iomem *base; |
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 53b6dfa83344..54b73a28c205 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
| @@ -386,6 +386,7 @@ extern unsigned long cpuidle_disable; | |||
| 386 | enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF}; | 386 | enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF}; |
| 387 | 387 | ||
| 388 | extern int powersave_nap; /* set if nap mode can be used in idle loop */ | 388 | extern int powersave_nap; /* set if nap mode can be used in idle loop */ |
| 389 | extern void power7_nap(void); | ||
| 389 | 390 | ||
| 390 | #ifdef CONFIG_PSERIES_IDLE | 391 | #ifdef CONFIG_PSERIES_IDLE |
| 391 | extern void update_smt_snooze_delay(int snooze); | 392 | extern void update_smt_snooze_delay(int snooze); |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index 85b05c463fae..e8995727b1c1 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
| @@ -76,6 +76,7 @@ int main(void) | |||
| 76 | DEFINE(SIGSEGV, SIGSEGV); | 76 | DEFINE(SIGSEGV, SIGSEGV); |
| 77 | DEFINE(NMI_MASK, NMI_MASK); | 77 | DEFINE(NMI_MASK, NMI_MASK); |
| 78 | DEFINE(THREAD_DSCR, offsetof(struct thread_struct, dscr)); | 78 | DEFINE(THREAD_DSCR, offsetof(struct thread_struct, dscr)); |
| 79 | DEFINE(THREAD_DSCR_INHERIT, offsetof(struct thread_struct, dscr_inherit)); | ||
| 79 | #else | 80 | #else |
| 80 | DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); | 81 | DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); |
| 81 | #endif /* CONFIG_PPC64 */ | 82 | #endif /* CONFIG_PPC64 */ |
diff --git a/arch/powerpc/kernel/dbell.c b/arch/powerpc/kernel/dbell.c index 5b25c8060fd6..a892680668d8 100644 --- a/arch/powerpc/kernel/dbell.c +++ b/arch/powerpc/kernel/dbell.c | |||
| @@ -28,6 +28,8 @@ void doorbell_setup_this_cpu(void) | |||
| 28 | 28 | ||
| 29 | void doorbell_cause_ipi(int cpu, unsigned long data) | 29 | void doorbell_cause_ipi(int cpu, unsigned long data) |
| 30 | { | 30 | { |
| 31 | /* Order previous accesses vs. msgsnd, which is treated as a store */ | ||
| 32 | mb(); | ||
| 31 | ppc_msgsnd(PPC_DBELL, 0, data); | 33 | ppc_msgsnd(PPC_DBELL, 0, data); |
| 32 | } | 34 | } |
| 33 | 35 | ||
diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c index 2d7bb8ced136..e4897523de41 100644 --- a/arch/powerpc/kernel/dma-iommu.c +++ b/arch/powerpc/kernel/dma-iommu.c | |||
| @@ -83,11 +83,10 @@ static int dma_iommu_dma_supported(struct device *dev, u64 mask) | |||
| 83 | return 0; | 83 | return 0; |
| 84 | } | 84 | } |
| 85 | 85 | ||
| 86 | if ((tbl->it_offset + tbl->it_size) > (mask >> IOMMU_PAGE_SHIFT)) { | 86 | if (tbl->it_offset > (mask >> IOMMU_PAGE_SHIFT)) { |
| 87 | dev_info(dev, "Warning: IOMMU window too big for device mask\n"); | 87 | dev_info(dev, "Warning: IOMMU offset too big for device mask\n"); |
| 88 | dev_info(dev, "mask: 0x%08llx, table end: 0x%08lx\n", | 88 | dev_info(dev, "mask: 0x%08llx, table offset: 0x%08lx\n", |
| 89 | mask, (tbl->it_offset + tbl->it_size) << | 89 | mask, tbl->it_offset << IOMMU_PAGE_SHIFT); |
| 90 | IOMMU_PAGE_SHIFT); | ||
| 91 | return 0; | 90 | return 0; |
| 92 | } else | 91 | } else |
| 93 | return 1; | 92 | return 1; |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 4b01a25e29ef..b40e0b4815b3 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -370,6 +370,12 @@ _GLOBAL(ret_from_fork) | |||
| 370 | li r3,0 | 370 | li r3,0 |
| 371 | b syscall_exit | 371 | b syscall_exit |
| 372 | 372 | ||
| 373 | .section ".toc","aw" | ||
| 374 | DSCR_DEFAULT: | ||
| 375 | .tc dscr_default[TC],dscr_default | ||
| 376 | |||
| 377 | .section ".text" | ||
| 378 | |||
| 373 | /* | 379 | /* |
| 374 | * This routine switches between two different tasks. The process | 380 | * This routine switches between two different tasks. The process |
| 375 | * state of one is saved on its kernel stack. Then the state | 381 | * state of one is saved on its kernel stack. Then the state |
| @@ -509,9 +515,6 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
| 509 | mr r1,r8 /* start using new stack pointer */ | 515 | mr r1,r8 /* start using new stack pointer */ |
| 510 | std r7,PACAKSAVE(r13) | 516 | std r7,PACAKSAVE(r13) |
| 511 | 517 | ||
| 512 | ld r6,_CCR(r1) | ||
| 513 | mtcrf 0xFF,r6 | ||
| 514 | |||
| 515 | #ifdef CONFIG_ALTIVEC | 518 | #ifdef CONFIG_ALTIVEC |
| 516 | BEGIN_FTR_SECTION | 519 | BEGIN_FTR_SECTION |
| 517 | ld r0,THREAD_VRSAVE(r4) | 520 | ld r0,THREAD_VRSAVE(r4) |
| @@ -520,14 +523,22 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) | |||
| 520 | #endif /* CONFIG_ALTIVEC */ | 523 | #endif /* CONFIG_ALTIVEC */ |
| 521 | #ifdef CONFIG_PPC64 | 524 | #ifdef CONFIG_PPC64 |
| 522 | BEGIN_FTR_SECTION | 525 | BEGIN_FTR_SECTION |
| 526 | lwz r6,THREAD_DSCR_INHERIT(r4) | ||
| 527 | ld r7,DSCR_DEFAULT@toc(2) | ||
| 523 | ld r0,THREAD_DSCR(r4) | 528 | ld r0,THREAD_DSCR(r4) |
| 524 | cmpd r0,r25 | 529 | cmpwi r6,0 |
| 525 | beq 1f | 530 | bne 1f |
| 531 | ld r0,0(r7) | ||
| 532 | 1: cmpd r0,r25 | ||
| 533 | beq 2f | ||
| 526 | mtspr SPRN_DSCR,r0 | 534 | mtspr SPRN_DSCR,r0 |
| 527 | 1: | 535 | 2: |
| 528 | END_FTR_SECTION_IFSET(CPU_FTR_DSCR) | 536 | END_FTR_SECTION_IFSET(CPU_FTR_DSCR) |
| 529 | #endif | 537 | #endif |
| 530 | 538 | ||
| 539 | ld r6,_CCR(r1) | ||
| 540 | mtcrf 0xFF,r6 | ||
| 541 | |||
| 531 | /* r3-r13 are destroyed -- Cort */ | 542 | /* r3-r13 are destroyed -- Cort */ |
| 532 | REST_8GPRS(14, r1) | 543 | REST_8GPRS(14, r1) |
| 533 | REST_10GPRS(22, r1) | 544 | REST_10GPRS(22, r1) |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index e894515e77bb..39aa97d3ff88 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
| @@ -186,7 +186,7 @@ hardware_interrupt_hv: | |||
| 186 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800) | 186 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800) |
| 187 | 187 | ||
| 188 | MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) | 188 | MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) |
| 189 | MASKABLE_EXCEPTION_HV(0x980, 0x982, decrementer) | 189 | STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) |
| 190 | 190 | ||
| 191 | STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a) | 191 | STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a) |
| 192 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) | 192 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) |
| @@ -486,6 +486,7 @@ machine_check_common: | |||
| 486 | 486 | ||
| 487 | STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) | 487 | STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) |
| 488 | STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt) | 488 | STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt) |
| 489 | STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt) | ||
| 489 | STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception) | 490 | STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception) |
| 490 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) | 491 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) |
| 491 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) | 492 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) |
diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c index f3a82dde61db..956a4c496de9 100644 --- a/arch/powerpc/kernel/hw_breakpoint.c +++ b/arch/powerpc/kernel/hw_breakpoint.c | |||
| @@ -253,7 +253,7 @@ int __kprobes hw_breakpoint_handler(struct die_args *args) | |||
| 253 | 253 | ||
| 254 | /* Do not emulate user-space instructions, instead single-step them */ | 254 | /* Do not emulate user-space instructions, instead single-step them */ |
| 255 | if (user_mode(regs)) { | 255 | if (user_mode(regs)) { |
| 256 | bp->ctx->task->thread.last_hit_ubp = bp; | 256 | current->thread.last_hit_ubp = bp; |
| 257 | regs->msr |= MSR_SE; | 257 | regs->msr |= MSR_SE; |
| 258 | goto out; | 258 | goto out; |
| 259 | } | 259 | } |
diff --git a/arch/powerpc/kernel/idle_power7.S b/arch/powerpc/kernel/idle_power7.S index 7140d838339e..e11863f4e595 100644 --- a/arch/powerpc/kernel/idle_power7.S +++ b/arch/powerpc/kernel/idle_power7.S | |||
| @@ -28,7 +28,9 @@ _GLOBAL(power7_idle) | |||
| 28 | lwz r4,ADDROFF(powersave_nap)(r3) | 28 | lwz r4,ADDROFF(powersave_nap)(r3) |
| 29 | cmpwi 0,r4,0 | 29 | cmpwi 0,r4,0 |
| 30 | beqlr | 30 | beqlr |
| 31 | /* fall through */ | ||
| 31 | 32 | ||
| 33 | _GLOBAL(power7_nap) | ||
| 32 | /* NAP is a state loss, we create a regs frame on the | 34 | /* NAP is a state loss, we create a regs frame on the |
| 33 | * stack, fill it up with the state we care about and | 35 | * stack, fill it up with the state we care about and |
| 34 | * stick a pointer to it in PACAR1. We really only | 36 | * stick a pointer to it in PACAR1. We really only |
diff --git a/arch/powerpc/kernel/kgdb.c b/arch/powerpc/kernel/kgdb.c index 782bd0a3c2f0..c470a40b29f5 100644 --- a/arch/powerpc/kernel/kgdb.c +++ b/arch/powerpc/kernel/kgdb.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <asm/processor.h> | 25 | #include <asm/processor.h> |
| 26 | #include <asm/machdep.h> | 26 | #include <asm/machdep.h> |
| 27 | #include <asm/debug.h> | 27 | #include <asm/debug.h> |
| 28 | #include <linux/slab.h> | ||
| 28 | 29 | ||
| 29 | /* | 30 | /* |
| 30 | * This table contains the mapping between PowerPC hardware trap types, and | 31 | * This table contains the mapping between PowerPC hardware trap types, and |
| @@ -101,6 +102,21 @@ static int computeSignal(unsigned int tt) | |||
| 101 | return SIGHUP; /* default for things we don't know about */ | 102 | return SIGHUP; /* default for things we don't know about */ |
| 102 | } | 103 | } |
| 103 | 104 | ||
| 105 | /** | ||
| 106 | * | ||
| 107 | * kgdb_skipexception - Bail out of KGDB when we've been triggered. | ||
| 108 | * @exception: Exception vector number | ||
| 109 | * @regs: Current &struct pt_regs. | ||
| 110 | * | ||
| 111 | * On some architectures we need to skip a breakpoint exception when | ||
| 112 | * it occurs after a breakpoint has been removed. | ||
| 113 | * | ||
| 114 | */ | ||
| 115 | int kgdb_skipexception(int exception, struct pt_regs *regs) | ||
| 116 | { | ||
| 117 | return kgdb_isremovedbreak(regs->nip); | ||
| 118 | } | ||
| 119 | |||
| 104 | static int kgdb_call_nmi_hook(struct pt_regs *regs) | 120 | static int kgdb_call_nmi_hook(struct pt_regs *regs) |
| 105 | { | 121 | { |
| 106 | kgdb_nmicallback(raw_smp_processor_id(), regs); | 122 | kgdb_nmicallback(raw_smp_processor_id(), regs); |
| @@ -138,6 +154,8 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs) | |||
| 138 | static int kgdb_singlestep(struct pt_regs *regs) | 154 | static int kgdb_singlestep(struct pt_regs *regs) |
| 139 | { | 155 | { |
| 140 | struct thread_info *thread_info, *exception_thread_info; | 156 | struct thread_info *thread_info, *exception_thread_info; |
| 157 | struct thread_info *backup_current_thread_info = \ | ||
| 158 | (struct thread_info *)kmalloc(sizeof(struct thread_info), GFP_KERNEL); | ||
| 141 | 159 | ||
| 142 | if (user_mode(regs)) | 160 | if (user_mode(regs)) |
| 143 | return 0; | 161 | return 0; |
| @@ -155,13 +173,17 @@ static int kgdb_singlestep(struct pt_regs *regs) | |||
| 155 | thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1)); | 173 | thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1)); |
| 156 | exception_thread_info = current_thread_info(); | 174 | exception_thread_info = current_thread_info(); |
| 157 | 175 | ||
| 158 | if (thread_info != exception_thread_info) | 176 | if (thread_info != exception_thread_info) { |
| 177 | /* Save the original current_thread_info. */ | ||
| 178 | memcpy(backup_current_thread_info, exception_thread_info, sizeof *thread_info); | ||
| 159 | memcpy(exception_thread_info, thread_info, sizeof *thread_info); | 179 | memcpy(exception_thread_info, thread_info, sizeof *thread_info); |
| 180 | } | ||
| 160 | 181 | ||
| 161 | kgdb_handle_exception(0, SIGTRAP, 0, regs); | 182 | kgdb_handle_exception(0, SIGTRAP, 0, regs); |
| 162 | 183 | ||
| 163 | if (thread_info != exception_thread_info) | 184 | if (thread_info != exception_thread_info) |
| 164 | memcpy(thread_info, exception_thread_info, sizeof *thread_info); | 185 | /* Restore current_thread_info lastly. */ |
| 186 | memcpy(exception_thread_info, backup_current_thread_info, sizeof *thread_info); | ||
| 165 | 187 | ||
| 166 | return 1; | 188 | return 1; |
| 167 | } | 189 | } |
| @@ -410,7 +432,6 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code, | |||
| 410 | #else | 432 | #else |
| 411 | linux_regs->msr |= MSR_SE; | 433 | linux_regs->msr |= MSR_SE; |
| 412 | #endif | 434 | #endif |
| 413 | kgdb_single_step = 1; | ||
| 414 | atomic_set(&kgdb_cpu_doing_single_step, | 435 | atomic_set(&kgdb_cpu_doing_single_step, |
| 415 | raw_smp_processor_id()); | 436 | raw_smp_processor_id()); |
| 416 | } | 437 | } |
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 710f400476de..1a1f2ddfb581 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
| @@ -802,16 +802,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
| 802 | #endif /* CONFIG_PPC_STD_MMU_64 */ | 802 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
| 803 | #ifdef CONFIG_PPC64 | 803 | #ifdef CONFIG_PPC64 |
| 804 | if (cpu_has_feature(CPU_FTR_DSCR)) { | 804 | if (cpu_has_feature(CPU_FTR_DSCR)) { |
| 805 | if (current->thread.dscr_inherit) { | 805 | p->thread.dscr_inherit = current->thread.dscr_inherit; |
| 806 | p->thread.dscr_inherit = 1; | 806 | p->thread.dscr = current->thread.dscr; |
| 807 | p->thread.dscr = current->thread.dscr; | ||
| 808 | } else if (0 != dscr_default) { | ||
| 809 | p->thread.dscr_inherit = 1; | ||
| 810 | p->thread.dscr = dscr_default; | ||
| 811 | } else { | ||
| 812 | p->thread.dscr_inherit = 0; | ||
| 813 | p->thread.dscr = 0; | ||
| 814 | } | ||
| 815 | } | 807 | } |
| 816 | #endif | 808 | #endif |
| 817 | 809 | ||
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c index 0321007086f7..8d4214afc21d 100644 --- a/arch/powerpc/kernel/smp.c +++ b/arch/powerpc/kernel/smp.c | |||
| @@ -198,8 +198,15 @@ void smp_muxed_ipi_message_pass(int cpu, int msg) | |||
| 198 | struct cpu_messages *info = &per_cpu(ipi_message, cpu); | 198 | struct cpu_messages *info = &per_cpu(ipi_message, cpu); |
| 199 | char *message = (char *)&info->messages; | 199 | char *message = (char *)&info->messages; |
| 200 | 200 | ||
| 201 | /* | ||
| 202 | * Order previous accesses before accesses in the IPI handler. | ||
| 203 | */ | ||
| 204 | smp_mb(); | ||
| 201 | message[msg] = 1; | 205 | message[msg] = 1; |
| 202 | mb(); | 206 | /* |
| 207 | * cause_ipi functions are required to include a full barrier | ||
| 208 | * before doing whatever causes the IPI. | ||
| 209 | */ | ||
| 203 | smp_ops->cause_ipi(cpu, info->data); | 210 | smp_ops->cause_ipi(cpu, info->data); |
| 204 | } | 211 | } |
| 205 | 212 | ||
| @@ -211,7 +218,7 @@ irqreturn_t smp_ipi_demux(void) | |||
| 211 | mb(); /* order any irq clear */ | 218 | mb(); /* order any irq clear */ |
| 212 | 219 | ||
| 213 | do { | 220 | do { |
| 214 | all = xchg_local(&info->messages, 0); | 221 | all = xchg(&info->messages, 0); |
| 215 | 222 | ||
| 216 | #ifdef __BIG_ENDIAN | 223 | #ifdef __BIG_ENDIAN |
| 217 | if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNCTION))) | 224 | if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNCTION))) |
diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c index f2496f2faecc..4e3cc47f26b9 100644 --- a/arch/powerpc/kernel/syscalls.c +++ b/arch/powerpc/kernel/syscalls.c | |||
| @@ -107,11 +107,11 @@ long ppc64_personality(unsigned long personality) | |||
| 107 | long ret; | 107 | long ret; |
| 108 | 108 | ||
| 109 | if (personality(current->personality) == PER_LINUX32 | 109 | if (personality(current->personality) == PER_LINUX32 |
| 110 | && personality == PER_LINUX) | 110 | && personality(personality) == PER_LINUX) |
| 111 | personality = PER_LINUX32; | 111 | personality = (personality & ~PER_MASK) | PER_LINUX32; |
| 112 | ret = sys_personality(personality); | 112 | ret = sys_personality(personality); |
| 113 | if (ret == PER_LINUX32) | 113 | if (personality(ret) == PER_LINUX32) |
| 114 | ret = PER_LINUX; | 114 | ret = (ret & ~PER_MASK) | PER_LINUX; |
| 115 | return ret; | 115 | return ret; |
| 116 | } | 116 | } |
| 117 | #endif | 117 | #endif |
diff --git a/arch/powerpc/kernel/sysfs.c b/arch/powerpc/kernel/sysfs.c index 3529446c2abd..8302af649219 100644 --- a/arch/powerpc/kernel/sysfs.c +++ b/arch/powerpc/kernel/sysfs.c | |||
| @@ -194,6 +194,14 @@ static ssize_t show_dscr_default(struct device *dev, | |||
| 194 | return sprintf(buf, "%lx\n", dscr_default); | 194 | return sprintf(buf, "%lx\n", dscr_default); |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | static void update_dscr(void *dummy) | ||
| 198 | { | ||
| 199 | if (!current->thread.dscr_inherit) { | ||
| 200 | current->thread.dscr = dscr_default; | ||
| 201 | mtspr(SPRN_DSCR, dscr_default); | ||
| 202 | } | ||
| 203 | } | ||
| 204 | |||
| 197 | static ssize_t __used store_dscr_default(struct device *dev, | 205 | static ssize_t __used store_dscr_default(struct device *dev, |
| 198 | struct device_attribute *attr, const char *buf, | 206 | struct device_attribute *attr, const char *buf, |
| 199 | size_t count) | 207 | size_t count) |
| @@ -206,6 +214,8 @@ static ssize_t __used store_dscr_default(struct device *dev, | |||
| 206 | return -EINVAL; | 214 | return -EINVAL; |
| 207 | dscr_default = val; | 215 | dscr_default = val; |
| 208 | 216 | ||
| 217 | on_each_cpu(update_dscr, NULL, 1); | ||
| 218 | |||
| 209 | return count; | 219 | return count; |
| 210 | } | 220 | } |
| 211 | 221 | ||
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index be171ee73bf8..e49e93191b69 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
| @@ -535,6 +535,15 @@ void timer_interrupt(struct pt_regs * regs) | |||
| 535 | trace_timer_interrupt_exit(regs); | 535 | trace_timer_interrupt_exit(regs); |
| 536 | } | 536 | } |
| 537 | 537 | ||
| 538 | /* | ||
| 539 | * Hypervisor decrementer interrupts shouldn't occur but are sometimes | ||
| 540 | * left pending on exit from a KVM guest. We don't need to do anything | ||
| 541 | * to clear them, as they are edge-triggered. | ||
| 542 | */ | ||
| 543 | void hdec_interrupt(struct pt_regs *regs) | ||
| 544 | { | ||
| 545 | } | ||
| 546 | |||
| 538 | #ifdef CONFIG_SUSPEND | 547 | #ifdef CONFIG_SUSPEND |
| 539 | static void generic_suspend_disable_irqs(void) | 548 | static void generic_suspend_disable_irqs(void) |
| 540 | { | 549 | { |
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 158972341a2d..ae0843fa7a61 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
| @@ -972,8 +972,9 @@ static int emulate_instruction(struct pt_regs *regs) | |||
| 972 | cpu_has_feature(CPU_FTR_DSCR)) { | 972 | cpu_has_feature(CPU_FTR_DSCR)) { |
| 973 | PPC_WARN_EMULATED(mtdscr, regs); | 973 | PPC_WARN_EMULATED(mtdscr, regs); |
| 974 | rd = (instword >> 21) & 0x1f; | 974 | rd = (instword >> 21) & 0x1f; |
| 975 | mtspr(SPRN_DSCR, regs->gpr[rd]); | 975 | current->thread.dscr = regs->gpr[rd]; |
| 976 | current->thread.dscr_inherit = 1; | 976 | current->thread.dscr_inherit = 1; |
| 977 | mtspr(SPRN_DSCR, current->thread.dscr); | ||
| 977 | return 0; | 978 | return 0; |
| 978 | } | 979 | } |
| 979 | #endif | 980 | #endif |
diff --git a/arch/powerpc/kvm/book3s_32_mmu_host.c b/arch/powerpc/kvm/book3s_32_mmu_host.c index f922c29bb234..837f13e7b6bf 100644 --- a/arch/powerpc/kvm/book3s_32_mmu_host.c +++ b/arch/powerpc/kvm/book3s_32_mmu_host.c | |||
| @@ -211,6 +211,9 @@ next_pteg: | |||
| 211 | pteg1 |= PP_RWRX; | 211 | pteg1 |= PP_RWRX; |
| 212 | } | 212 | } |
| 213 | 213 | ||
| 214 | if (orig_pte->may_execute) | ||
| 215 | kvmppc_mmu_flush_icache(hpaddr >> PAGE_SHIFT); | ||
| 216 | |||
| 214 | local_irq_disable(); | 217 | local_irq_disable(); |
| 215 | 218 | ||
| 216 | if (pteg[rr]) { | 219 | if (pteg[rr]) { |
diff --git a/arch/powerpc/kvm/book3s_64_mmu_host.c b/arch/powerpc/kvm/book3s_64_mmu_host.c index 10fc8ec9d2a8..0688b6b39585 100644 --- a/arch/powerpc/kvm/book3s_64_mmu_host.c +++ b/arch/powerpc/kvm/book3s_64_mmu_host.c | |||
| @@ -126,6 +126,8 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) | |||
| 126 | 126 | ||
| 127 | if (!orig_pte->may_execute) | 127 | if (!orig_pte->may_execute) |
| 128 | rflags |= HPTE_R_N; | 128 | rflags |= HPTE_R_N; |
| 129 | else | ||
| 130 | kvmppc_mmu_flush_icache(hpaddr >> PAGE_SHIFT); | ||
| 129 | 131 | ||
| 130 | hash = hpt_hash(va, PTE_SIZE, MMU_SEGSIZE_256M); | 132 | hash = hpt_hash(va, PTE_SIZE, MMU_SEGSIZE_256M); |
| 131 | 133 | ||
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 5a84c8d3d040..44b72feaff7d 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | |||
| @@ -1421,13 +1421,13 @@ _GLOBAL(kvmppc_h_cede) | |||
| 1421 | sync /* order setting ceded vs. testing prodded */ | 1421 | sync /* order setting ceded vs. testing prodded */ |
| 1422 | lbz r5,VCPU_PRODDED(r3) | 1422 | lbz r5,VCPU_PRODDED(r3) |
| 1423 | cmpwi r5,0 | 1423 | cmpwi r5,0 |
| 1424 | bne 1f | 1424 | bne kvm_cede_prodded |
| 1425 | li r0,0 /* set trap to 0 to say hcall is handled */ | 1425 | li r0,0 /* set trap to 0 to say hcall is handled */ |
| 1426 | stw r0,VCPU_TRAP(r3) | 1426 | stw r0,VCPU_TRAP(r3) |
| 1427 | li r0,H_SUCCESS | 1427 | li r0,H_SUCCESS |
| 1428 | std r0,VCPU_GPR(R3)(r3) | 1428 | std r0,VCPU_GPR(R3)(r3) |
| 1429 | BEGIN_FTR_SECTION | 1429 | BEGIN_FTR_SECTION |
| 1430 | b 2f /* just send it up to host on 970 */ | 1430 | b kvm_cede_exit /* just send it up to host on 970 */ |
| 1431 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) | 1431 | END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) |
| 1432 | 1432 | ||
| 1433 | /* | 1433 | /* |
| @@ -1446,7 +1446,7 @@ END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_206) | |||
| 1446 | or r4,r4,r0 | 1446 | or r4,r4,r0 |
| 1447 | PPC_POPCNTW(R7,R4) | 1447 | PPC_POPCNTW(R7,R4) |
| 1448 | cmpw r7,r8 | 1448 | cmpw r7,r8 |
| 1449 | bge 2f | 1449 | bge kvm_cede_exit |
| 1450 | stwcx. r4,0,r6 | 1450 | stwcx. r4,0,r6 |
| 1451 | bne 31b | 1451 | bne 31b |
| 1452 | li r0,1 | 1452 | li r0,1 |
| @@ -1555,7 +1555,8 @@ kvm_end_cede: | |||
| 1555 | b hcall_real_fallback | 1555 | b hcall_real_fallback |
| 1556 | 1556 | ||
| 1557 | /* cede when already previously prodded case */ | 1557 | /* cede when already previously prodded case */ |
| 1558 | 1: li r0,0 | 1558 | kvm_cede_prodded: |
| 1559 | li r0,0 | ||
| 1559 | stb r0,VCPU_PRODDED(r3) | 1560 | stb r0,VCPU_PRODDED(r3) |
| 1560 | sync /* order testing prodded vs. clearing ceded */ | 1561 | sync /* order testing prodded vs. clearing ceded */ |
| 1561 | stb r0,VCPU_CEDED(r3) | 1562 | stb r0,VCPU_CEDED(r3) |
| @@ -1563,7 +1564,8 @@ kvm_end_cede: | |||
| 1563 | blr | 1564 | blr |
| 1564 | 1565 | ||
| 1565 | /* we've ceded but we want to give control to the host */ | 1566 | /* we've ceded but we want to give control to the host */ |
| 1566 | 2: li r3,H_TOO_HARD | 1567 | kvm_cede_exit: |
| 1568 | li r3,H_TOO_HARD | ||
| 1567 | blr | 1569 | blr |
| 1568 | 1570 | ||
| 1569 | secondary_too_late: | 1571 | secondary_too_late: |
diff --git a/arch/powerpc/kvm/e500_tlb.c b/arch/powerpc/kvm/e500_tlb.c index c510fc961302..a2b66717813d 100644 --- a/arch/powerpc/kvm/e500_tlb.c +++ b/arch/powerpc/kvm/e500_tlb.c | |||
| @@ -322,11 +322,11 @@ static inline void kvmppc_e500_ref_release(struct tlbe_ref *ref) | |||
| 322 | static void clear_tlb1_bitmap(struct kvmppc_vcpu_e500 *vcpu_e500) | 322 | static void clear_tlb1_bitmap(struct kvmppc_vcpu_e500 *vcpu_e500) |
| 323 | { | 323 | { |
| 324 | if (vcpu_e500->g2h_tlb1_map) | 324 | if (vcpu_e500->g2h_tlb1_map) |
| 325 | memset(vcpu_e500->g2h_tlb1_map, | 325 | memset(vcpu_e500->g2h_tlb1_map, 0, |
| 326 | sizeof(u64) * vcpu_e500->gtlb_params[1].entries, 0); | 326 | sizeof(u64) * vcpu_e500->gtlb_params[1].entries); |
| 327 | if (vcpu_e500->h2g_tlb1_rmap) | 327 | if (vcpu_e500->h2g_tlb1_rmap) |
| 328 | memset(vcpu_e500->h2g_tlb1_rmap, | 328 | memset(vcpu_e500->h2g_tlb1_rmap, 0, |
| 329 | sizeof(unsigned int) * host_tlb_params[1].entries, 0); | 329 | sizeof(unsigned int) * host_tlb_params[1].entries); |
| 330 | } | 330 | } |
| 331 | 331 | ||
| 332 | static void clear_tlb_privs(struct kvmppc_vcpu_e500 *vcpu_e500) | 332 | static void clear_tlb_privs(struct kvmppc_vcpu_e500 *vcpu_e500) |
| @@ -539,6 +539,9 @@ static inline void kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500, | |||
| 539 | 539 | ||
| 540 | kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize, | 540 | kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize, |
| 541 | ref, gvaddr, stlbe); | 541 | ref, gvaddr, stlbe); |
| 542 | |||
| 543 | /* Clear i-cache for new pages */ | ||
| 544 | kvmppc_mmu_flush_icache(pfn); | ||
| 542 | } | 545 | } |
| 543 | 546 | ||
| 544 | /* XXX only map the one-one case, for now use TLB0 */ | 547 | /* XXX only map the one-one case, for now use TLB0 */ |
diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c index dd223b3eb333..17e5b2364312 100644 --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c | |||
| @@ -20,7 +20,7 @@ int patch_instruction(unsigned int *addr, unsigned int instr) | |||
| 20 | { | 20 | { |
| 21 | int err; | 21 | int err; |
| 22 | 22 | ||
| 23 | err = __put_user(instr, addr); | 23 | __put_user_size(instr, addr, 4, err); |
| 24 | if (err) | 24 | if (err) |
| 25 | return err; | 25 | return err; |
| 26 | asm ("dcbst 0, %0; sync; icbi 0,%0; sync; isync" : : "r" (addr)); | 26 | asm ("dcbst 0, %0; sync; icbi 0,%0; sync; isync" : : "r" (addr)); |
diff --git a/arch/powerpc/lib/copyuser_power7.S b/arch/powerpc/lib/copyuser_power7.S index f9ede7c6606e..0d24ff15f5f6 100644 --- a/arch/powerpc/lib/copyuser_power7.S +++ b/arch/powerpc/lib/copyuser_power7.S | |||
| @@ -288,7 +288,7 @@ err1; stb r0,0(r3) | |||
| 288 | std r0,16(r1) | 288 | std r0,16(r1) |
| 289 | stdu r1,-STACKFRAMESIZE(r1) | 289 | stdu r1,-STACKFRAMESIZE(r1) |
| 290 | bl .enter_vmx_usercopy | 290 | bl .enter_vmx_usercopy |
| 291 | cmpwi r3,0 | 291 | cmpwi cr1,r3,0 |
| 292 | ld r0,STACKFRAMESIZE+16(r1) | 292 | ld r0,STACKFRAMESIZE+16(r1) |
| 293 | ld r3,STACKFRAMESIZE+48(r1) | 293 | ld r3,STACKFRAMESIZE+48(r1) |
| 294 | ld r4,STACKFRAMESIZE+56(r1) | 294 | ld r4,STACKFRAMESIZE+56(r1) |
| @@ -326,38 +326,7 @@ err1; stb r0,0(r3) | |||
| 326 | dcbt r0,r8,0b01010 /* GO */ | 326 | dcbt r0,r8,0b01010 /* GO */ |
| 327 | .machine pop | 327 | .machine pop |
| 328 | 328 | ||
| 329 | /* | 329 | beq cr1,.Lunwind_stack_nonvmx_copy |
| 330 | * We prefetch both the source and destination using enhanced touch | ||
| 331 | * instructions. We use a stream ID of 0 for the load side and | ||
| 332 | * 1 for the store side. | ||
| 333 | */ | ||
| 334 | clrrdi r6,r4,7 | ||
| 335 | clrrdi r9,r3,7 | ||
| 336 | ori r9,r9,1 /* stream=1 */ | ||
| 337 | |||
| 338 | srdi r7,r5,7 /* length in cachelines, capped at 0x3FF */ | ||
| 339 | cmpldi cr1,r7,0x3FF | ||
| 340 | ble cr1,1f | ||
| 341 | li r7,0x3FF | ||
| 342 | 1: lis r0,0x0E00 /* depth=7 */ | ||
| 343 | sldi r7,r7,7 | ||
| 344 | or r7,r7,r0 | ||
| 345 | ori r10,r7,1 /* stream=1 */ | ||
| 346 | |||
| 347 | lis r8,0x8000 /* GO=1 */ | ||
| 348 | clrldi r8,r8,32 | ||
| 349 | |||
| 350 | .machine push | ||
| 351 | .machine "power4" | ||
| 352 | dcbt r0,r6,0b01000 | ||
| 353 | dcbt r0,r7,0b01010 | ||
| 354 | dcbtst r0,r9,0b01000 | ||
| 355 | dcbtst r0,r10,0b01010 | ||
| 356 | eieio | ||
| 357 | dcbt r0,r8,0b01010 /* GO */ | ||
| 358 | .machine pop | ||
| 359 | |||
| 360 | beq .Lunwind_stack_nonvmx_copy | ||
| 361 | 330 | ||
| 362 | /* | 331 | /* |
| 363 | * If source and destination are not relatively aligned we use a | 332 | * If source and destination are not relatively aligned we use a |
diff --git a/arch/powerpc/lib/memcpy_power7.S b/arch/powerpc/lib/memcpy_power7.S index 0efdc51bc716..7ba6c96de778 100644 --- a/arch/powerpc/lib/memcpy_power7.S +++ b/arch/powerpc/lib/memcpy_power7.S | |||
| @@ -222,7 +222,7 @@ _GLOBAL(memcpy_power7) | |||
| 222 | std r0,16(r1) | 222 | std r0,16(r1) |
| 223 | stdu r1,-STACKFRAMESIZE(r1) | 223 | stdu r1,-STACKFRAMESIZE(r1) |
| 224 | bl .enter_vmx_copy | 224 | bl .enter_vmx_copy |
| 225 | cmpwi r3,0 | 225 | cmpwi cr1,r3,0 |
| 226 | ld r0,STACKFRAMESIZE+16(r1) | 226 | ld r0,STACKFRAMESIZE+16(r1) |
| 227 | ld r3,STACKFRAMESIZE+48(r1) | 227 | ld r3,STACKFRAMESIZE+48(r1) |
| 228 | ld r4,STACKFRAMESIZE+56(r1) | 228 | ld r4,STACKFRAMESIZE+56(r1) |
| @@ -260,7 +260,7 @@ _GLOBAL(memcpy_power7) | |||
| 260 | dcbt r0,r8,0b01010 /* GO */ | 260 | dcbt r0,r8,0b01010 /* GO */ |
| 261 | .machine pop | 261 | .machine pop |
| 262 | 262 | ||
| 263 | beq .Lunwind_stack_nonvmx_copy | 263 | beq cr1,.Lunwind_stack_nonvmx_copy |
| 264 | 264 | ||
| 265 | /* | 265 | /* |
| 266 | * If source and destination are not relatively aligned we use a | 266 | * If source and destination are not relatively aligned we use a |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index baaafde7d135..fbdad0e3929a 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
| @@ -469,6 +469,7 @@ void flush_dcache_icache_page(struct page *page) | |||
| 469 | __flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT); | 469 | __flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT); |
| 470 | #endif | 470 | #endif |
| 471 | } | 471 | } |
| 472 | EXPORT_SYMBOL(flush_dcache_icache_page); | ||
| 472 | 473 | ||
| 473 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) | 474 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) |
| 474 | { | 475 | { |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index 39b159751c35..59213cfaeca9 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
| @@ -1436,11 +1436,11 @@ static long vphn_get_associativity(unsigned long cpu, | |||
| 1436 | 1436 | ||
| 1437 | /* | 1437 | /* |
| 1438 | * Update the node maps and sysfs entries for each cpu whose home node | 1438 | * Update the node maps and sysfs entries for each cpu whose home node |
| 1439 | * has changed. | 1439 | * has changed. Returns 1 when the topology has changed, and 0 otherwise. |
| 1440 | */ | 1440 | */ |
| 1441 | int arch_update_cpu_topology(void) | 1441 | int arch_update_cpu_topology(void) |
| 1442 | { | 1442 | { |
| 1443 | int cpu, nid, old_nid; | 1443 | int cpu, nid, old_nid, changed = 0; |
| 1444 | unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0}; | 1444 | unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0}; |
| 1445 | struct device *dev; | 1445 | struct device *dev; |
| 1446 | 1446 | ||
| @@ -1466,9 +1466,10 @@ int arch_update_cpu_topology(void) | |||
| 1466 | dev = get_cpu_device(cpu); | 1466 | dev = get_cpu_device(cpu); |
| 1467 | if (dev) | 1467 | if (dev) |
| 1468 | kobject_uevent(&dev->kobj, KOBJ_CHANGE); | 1468 | kobject_uevent(&dev->kobj, KOBJ_CHANGE); |
| 1469 | changed = 1; | ||
| 1469 | } | 1470 | } |
| 1470 | 1471 | ||
| 1471 | return 1; | 1472 | return changed; |
| 1472 | } | 1473 | } |
| 1473 | 1474 | ||
| 1474 | static void topology_work_fn(struct work_struct *work) | 1475 | static void topology_work_fn(struct work_struct *work) |
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 77b49ddda9d3..7cd2dbd6e4c4 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
| @@ -1431,7 +1431,7 @@ static void perf_event_interrupt(struct pt_regs *regs) | |||
| 1431 | if (!event->hw.idx || is_limited_pmc(event->hw.idx)) | 1431 | if (!event->hw.idx || is_limited_pmc(event->hw.idx)) |
| 1432 | continue; | 1432 | continue; |
| 1433 | val = read_pmc(event->hw.idx); | 1433 | val = read_pmc(event->hw.idx); |
| 1434 | if ((int)val < 0) { | 1434 | if (pmc_overflow(val)) { |
| 1435 | /* event has overflowed */ | 1435 | /* event has overflowed */ |
| 1436 | found = 1; | 1436 | found = 1; |
| 1437 | record_and_restart(event, val, regs); | 1437 | record_and_restart(event, val, regs); |
diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c index 3ef46254c35b..7698b6e13c57 100644 --- a/arch/powerpc/platforms/powernv/smp.c +++ b/arch/powerpc/platforms/powernv/smp.c | |||
| @@ -106,14 +106,6 @@ static void pnv_smp_cpu_kill_self(void) | |||
| 106 | { | 106 | { |
| 107 | unsigned int cpu; | 107 | unsigned int cpu; |
| 108 | 108 | ||
| 109 | /* If powersave_nap is enabled, use NAP mode, else just | ||
| 110 | * spin aimlessly | ||
| 111 | */ | ||
| 112 | if (!powersave_nap) { | ||
| 113 | generic_mach_cpu_die(); | ||
| 114 | return; | ||
| 115 | } | ||
| 116 | |||
| 117 | /* Standard hot unplug procedure */ | 109 | /* Standard hot unplug procedure */ |
| 118 | local_irq_disable(); | 110 | local_irq_disable(); |
| 119 | idle_task_exit(); | 111 | idle_task_exit(); |
| @@ -128,7 +120,7 @@ static void pnv_smp_cpu_kill_self(void) | |||
| 128 | */ | 120 | */ |
| 129 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1); | 121 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1); |
| 130 | while (!generic_check_cpu_restart(cpu)) { | 122 | while (!generic_check_cpu_restart(cpu)) { |
| 131 | power7_idle(); | 123 | power7_nap(); |
| 132 | if (!generic_check_cpu_restart(cpu)) { | 124 | if (!generic_check_cpu_restart(cpu)) { |
| 133 | DBG("CPU%d Unexpected exit while offline !\n", cpu); | 125 | DBG("CPU%d Unexpected exit while offline !\n", cpu); |
| 134 | /* We may be getting an IPI, so we re-enable | 126 | /* We may be getting an IPI, so we re-enable |
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index a7b2a600d0a4..c37f46136321 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
| @@ -465,7 +465,7 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary) | |||
| 465 | iounmap(hose->cfg_data); | 465 | iounmap(hose->cfg_data); |
| 466 | iounmap(hose->cfg_addr); | 466 | iounmap(hose->cfg_addr); |
| 467 | pcibios_free_controller(hose); | 467 | pcibios_free_controller(hose); |
| 468 | return 0; | 468 | return -ENODEV; |
| 469 | } | 469 | } |
| 470 | 470 | ||
| 471 | setup_pci_cmd(hose); | 471 | setup_pci_cmd(hose); |
| @@ -827,6 +827,7 @@ struct device_node *fsl_pci_primary; | |||
| 827 | 827 | ||
| 828 | void __devinit fsl_pci_init(void) | 828 | void __devinit fsl_pci_init(void) |
| 829 | { | 829 | { |
| 830 | int ret; | ||
| 830 | struct device_node *node; | 831 | struct device_node *node; |
| 831 | struct pci_controller *hose; | 832 | struct pci_controller *hose; |
| 832 | dma_addr_t max = 0xffffffff; | 833 | dma_addr_t max = 0xffffffff; |
| @@ -855,10 +856,12 @@ void __devinit fsl_pci_init(void) | |||
| 855 | if (!fsl_pci_primary) | 856 | if (!fsl_pci_primary) |
| 856 | fsl_pci_primary = node; | 857 | fsl_pci_primary = node; |
| 857 | 858 | ||
| 858 | fsl_add_bridge(node, fsl_pci_primary == node); | 859 | ret = fsl_add_bridge(node, fsl_pci_primary == node); |
| 859 | hose = pci_find_hose_for_OF_device(node); | 860 | if (ret == 0) { |
| 860 | max = min(max, hose->dma_window_base_cur + | 861 | hose = pci_find_hose_for_OF_device(node); |
| 861 | hose->dma_window_size); | 862 | max = min(max, hose->dma_window_base_cur + |
| 863 | hose->dma_window_size); | ||
| 864 | } | ||
| 862 | } | 865 | } |
| 863 | } | 866 | } |
| 864 | 867 | ||
diff --git a/arch/powerpc/sysdev/mpic_msgr.c b/arch/powerpc/sysdev/mpic_msgr.c index 483d8fa72e8b..e961f8c4a8f0 100644 --- a/arch/powerpc/sysdev/mpic_msgr.c +++ b/arch/powerpc/sysdev/mpic_msgr.c | |||
| @@ -14,6 +14,9 @@ | |||
| 14 | #include <linux/list.h> | 14 | #include <linux/list.h> |
| 15 | #include <linux/of_platform.h> | 15 | #include <linux/of_platform.h> |
| 16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
| 17 | #include <linux/err.h> | ||
| 18 | #include <linux/export.h> | ||
| 19 | #include <linux/slab.h> | ||
| 17 | #include <asm/prom.h> | 20 | #include <asm/prom.h> |
| 18 | #include <asm/hw_irq.h> | 21 | #include <asm/hw_irq.h> |
| 19 | #include <asm/ppc-pci.h> | 22 | #include <asm/ppc-pci.h> |
diff --git a/arch/powerpc/sysdev/xics/icp-hv.c b/arch/powerpc/sysdev/xics/icp-hv.c index 14469cf9df68..df0fc5821469 100644 --- a/arch/powerpc/sysdev/xics/icp-hv.c +++ b/arch/powerpc/sysdev/xics/icp-hv.c | |||
| @@ -65,7 +65,11 @@ static inline void icp_hv_set_xirr(unsigned int value) | |||
| 65 | static inline void icp_hv_set_qirr(int n_cpu , u8 value) | 65 | static inline void icp_hv_set_qirr(int n_cpu , u8 value) |
| 66 | { | 66 | { |
| 67 | int hw_cpu = get_hard_smp_processor_id(n_cpu); | 67 | int hw_cpu = get_hard_smp_processor_id(n_cpu); |
| 68 | long rc = plpar_hcall_norets(H_IPI, hw_cpu, value); | 68 | long rc; |
| 69 | |||
| 70 | /* Make sure all previous accesses are ordered before IPI sending */ | ||
| 71 | mb(); | ||
| 72 | rc = plpar_hcall_norets(H_IPI, hw_cpu, value); | ||
| 69 | if (rc != H_SUCCESS) { | 73 | if (rc != H_SUCCESS) { |
| 70 | pr_err("%s: bad return code qirr cpu=%d hw_cpu=%d mfrr=0x%x " | 74 | pr_err("%s: bad return code qirr cpu=%d hw_cpu=%d mfrr=0x%x " |
| 71 | "returned %ld\n", __func__, n_cpu, hw_cpu, value, rc); | 75 | "returned %ld\n", __func__, n_cpu, hw_cpu, value, rc); |
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index eab3492a45c5..9b49c65ee7a4 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/reboot.h> | 17 | #include <linux/reboot.h> |
| 18 | #include <linux/delay.h> | 18 | #include <linux/delay.h> |
| 19 | #include <linux/kallsyms.h> | 19 | #include <linux/kallsyms.h> |
| 20 | #include <linux/kmsg_dump.h> | ||
| 20 | #include <linux/cpumask.h> | 21 | #include <linux/cpumask.h> |
| 21 | #include <linux/export.h> | 22 | #include <linux/export.h> |
| 22 | #include <linux/sysrq.h> | 23 | #include <linux/sysrq.h> |
| @@ -894,13 +895,13 @@ cmds(struct pt_regs *excp) | |||
| 894 | #endif | 895 | #endif |
| 895 | default: | 896 | default: |
| 896 | printf("Unrecognized command: "); | 897 | printf("Unrecognized command: "); |
| 897 | do { | 898 | do { |
| 898 | if (' ' < cmd && cmd <= '~') | 899 | if (' ' < cmd && cmd <= '~') |
| 899 | putchar(cmd); | 900 | putchar(cmd); |
| 900 | else | 901 | else |
| 901 | printf("\\x%x", cmd); | 902 | printf("\\x%x", cmd); |
| 902 | cmd = inchar(); | 903 | cmd = inchar(); |
| 903 | } while (cmd != '\n'); | 904 | } while (cmd != '\n'); |
| 904 | printf(" (type ? for help)\n"); | 905 | printf(" (type ? for help)\n"); |
| 905 | break; | 906 | break; |
| 906 | } | 907 | } |
| @@ -1097,7 +1098,7 @@ static long check_bp_loc(unsigned long addr) | |||
| 1097 | return 1; | 1098 | return 1; |
| 1098 | } | 1099 | } |
| 1099 | 1100 | ||
| 1100 | static char *breakpoint_help_string = | 1101 | static char *breakpoint_help_string = |
| 1101 | "Breakpoint command usage:\n" | 1102 | "Breakpoint command usage:\n" |
| 1102 | "b show breakpoints\n" | 1103 | "b show breakpoints\n" |
| 1103 | "b <addr> [cnt] set breakpoint at given instr addr\n" | 1104 | "b <addr> [cnt] set breakpoint at given instr addr\n" |
| @@ -1193,7 +1194,7 @@ bpt_cmds(void) | |||
| 1193 | 1194 | ||
| 1194 | default: | 1195 | default: |
| 1195 | termch = cmd; | 1196 | termch = cmd; |
| 1196 | cmd = skipbl(); | 1197 | cmd = skipbl(); |
| 1197 | if (cmd == '?') { | 1198 | if (cmd == '?') { |
| 1198 | printf(breakpoint_help_string); | 1199 | printf(breakpoint_help_string); |
| 1199 | break; | 1200 | break; |
| @@ -1359,7 +1360,7 @@ static void xmon_show_stack(unsigned long sp, unsigned long lr, | |||
| 1359 | sp + REGS_OFFSET); | 1360 | sp + REGS_OFFSET); |
| 1360 | break; | 1361 | break; |
| 1361 | } | 1362 | } |
| 1362 | printf("--- Exception: %lx %s at ", regs.trap, | 1363 | printf("--- Exception: %lx %s at ", regs.trap, |
| 1363 | getvecname(TRAP(®s))); | 1364 | getvecname(TRAP(®s))); |
| 1364 | pc = regs.nip; | 1365 | pc = regs.nip; |
| 1365 | lr = regs.link; | 1366 | lr = regs.link; |
| @@ -1623,14 +1624,14 @@ static void super_regs(void) | |||
| 1623 | 1624 | ||
| 1624 | cmd = skipbl(); | 1625 | cmd = skipbl(); |
| 1625 | if (cmd == '\n') { | 1626 | if (cmd == '\n') { |
| 1626 | unsigned long sp, toc; | 1627 | unsigned long sp, toc; |
| 1627 | asm("mr %0,1" : "=r" (sp) :); | 1628 | asm("mr %0,1" : "=r" (sp) :); |
| 1628 | asm("mr %0,2" : "=r" (toc) :); | 1629 | asm("mr %0,2" : "=r" (toc) :); |
| 1629 | 1630 | ||
| 1630 | printf("msr = "REG" sprg0= "REG"\n", | 1631 | printf("msr = "REG" sprg0= "REG"\n", |
| 1631 | mfmsr(), mfspr(SPRN_SPRG0)); | 1632 | mfmsr(), mfspr(SPRN_SPRG0)); |
| 1632 | printf("pvr = "REG" sprg1= "REG"\n", | 1633 | printf("pvr = "REG" sprg1= "REG"\n", |
| 1633 | mfspr(SPRN_PVR), mfspr(SPRN_SPRG1)); | 1634 | mfspr(SPRN_PVR), mfspr(SPRN_SPRG1)); |
| 1634 | printf("dec = "REG" sprg2= "REG"\n", | 1635 | printf("dec = "REG" sprg2= "REG"\n", |
| 1635 | mfspr(SPRN_DEC), mfspr(SPRN_SPRG2)); | 1636 | mfspr(SPRN_DEC), mfspr(SPRN_SPRG2)); |
| 1636 | printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3)); | 1637 | printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3)); |
| @@ -1783,7 +1784,7 @@ byterev(unsigned char *val, int size) | |||
| 1783 | static int brev; | 1784 | static int brev; |
| 1784 | static int mnoread; | 1785 | static int mnoread; |
| 1785 | 1786 | ||
| 1786 | static char *memex_help_string = | 1787 | static char *memex_help_string = |
| 1787 | "Memory examine command usage:\n" | 1788 | "Memory examine command usage:\n" |
| 1788 | "m [addr] [flags] examine/change memory\n" | 1789 | "m [addr] [flags] examine/change memory\n" |
| 1789 | " addr is optional. will start where left off.\n" | 1790 | " addr is optional. will start where left off.\n" |
| @@ -1798,7 +1799,7 @@ static char *memex_help_string = | |||
| 1798 | "NOTE: flags are saved as defaults\n" | 1799 | "NOTE: flags are saved as defaults\n" |
| 1799 | ""; | 1800 | ""; |
| 1800 | 1801 | ||
| 1801 | static char *memex_subcmd_help_string = | 1802 | static char *memex_subcmd_help_string = |
| 1802 | "Memory examine subcommands:\n" | 1803 | "Memory examine subcommands:\n" |
| 1803 | " hexval write this val to current location\n" | 1804 | " hexval write this val to current location\n" |
| 1804 | " 'string' write chars from string to this location\n" | 1805 | " 'string' write chars from string to this location\n" |
| @@ -2064,7 +2065,7 @@ prdump(unsigned long adrs, long ndump) | |||
| 2064 | nr = mread(adrs, temp, r); | 2065 | nr = mread(adrs, temp, r); |
| 2065 | adrs += nr; | 2066 | adrs += nr; |
| 2066 | for (m = 0; m < r; ++m) { | 2067 | for (m = 0; m < r; ++m) { |
| 2067 | if ((m & (sizeof(long) - 1)) == 0 && m > 0) | 2068 | if ((m & (sizeof(long) - 1)) == 0 && m > 0) |
| 2068 | putchar(' '); | 2069 | putchar(' '); |
| 2069 | if (m < nr) | 2070 | if (m < nr) |
| 2070 | printf("%.2x", temp[m]); | 2071 | printf("%.2x", temp[m]); |
| @@ -2072,7 +2073,7 @@ prdump(unsigned long adrs, long ndump) | |||
| 2072 | printf("%s", fault_chars[fault_type]); | 2073 | printf("%s", fault_chars[fault_type]); |
| 2073 | } | 2074 | } |
| 2074 | for (; m < 16; ++m) { | 2075 | for (; m < 16; ++m) { |
| 2075 | if ((m & (sizeof(long) - 1)) == 0) | 2076 | if ((m & (sizeof(long) - 1)) == 0) |
| 2076 | putchar(' '); | 2077 | putchar(' '); |
| 2077 | printf(" "); | 2078 | printf(" "); |
| 2078 | } | 2079 | } |
| @@ -2148,45 +2149,28 @@ print_address(unsigned long addr) | |||
| 2148 | void | 2149 | void |
| 2149 | dump_log_buf(void) | 2150 | dump_log_buf(void) |
| 2150 | { | 2151 | { |
| 2151 | const unsigned long size = 128; | 2152 | struct kmsg_dumper dumper = { .active = 1 }; |
| 2152 | unsigned long end, addr; | 2153 | unsigned char buf[128]; |
| 2153 | unsigned char buf[size + 1]; | 2154 | size_t len; |
| 2154 | 2155 | ||
| 2155 | addr = 0; | 2156 | if (setjmp(bus_error_jmp) != 0) { |
| 2156 | buf[size] = '\0'; | 2157 | printf("Error dumping printk buffer!\n"); |
| 2157 | 2158 | return; | |
| 2158 | if (setjmp(bus_error_jmp) != 0) { | 2159 | } |
| 2159 | printf("Unable to lookup symbol __log_buf!\n"); | 2160 | |
| 2160 | return; | 2161 | catch_memory_errors = 1; |
| 2161 | } | 2162 | sync(); |
| 2162 | 2163 | ||
| 2163 | catch_memory_errors = 1; | 2164 | kmsg_dump_rewind_nolock(&dumper); |
| 2164 | sync(); | 2165 | while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) { |
| 2165 | addr = kallsyms_lookup_name("__log_buf"); | 2166 | buf[len] = '\0'; |
| 2166 | 2167 | printf("%s", buf); | |
| 2167 | if (! addr) | 2168 | } |
| 2168 | printf("Symbol __log_buf not found!\n"); | 2169 | |
| 2169 | else { | 2170 | sync(); |
| 2170 | end = addr + (1 << CONFIG_LOG_BUF_SHIFT); | 2171 | /* wait a little while to see if we get a machine check */ |
| 2171 | while (addr < end) { | 2172 | __delay(200); |
| 2172 | if (! mread(addr, buf, size)) { | 2173 | catch_memory_errors = 0; |
| 2173 | printf("Can't read memory at address 0x%lx\n", addr); | ||
| 2174 | break; | ||
| 2175 | } | ||
| 2176 | |||
| 2177 | printf("%s", buf); | ||
| 2178 | |||
| 2179 | if (strlen(buf) < size) | ||
| 2180 | break; | ||
| 2181 | |||
| 2182 | addr += size; | ||
| 2183 | } | ||
| 2184 | } | ||
| 2185 | |||
| 2186 | sync(); | ||
| 2187 | /* wait a little while to see if we get a machine check */ | ||
| 2188 | __delay(200); | ||
| 2189 | catch_memory_errors = 0; | ||
| 2190 | } | 2174 | } |
| 2191 | 2175 | ||
| 2192 | /* | 2176 | /* |
diff --git a/arch/s390/include/asm/elf.h b/arch/s390/include/asm/elf.h index 32e8449640fa..9b94a160fe7f 100644 --- a/arch/s390/include/asm/elf.h +++ b/arch/s390/include/asm/elf.h | |||
| @@ -180,7 +180,8 @@ extern char elf_platform[]; | |||
| 180 | #define ELF_PLATFORM (elf_platform) | 180 | #define ELF_PLATFORM (elf_platform) |
| 181 | 181 | ||
| 182 | #ifndef CONFIG_64BIT | 182 | #ifndef CONFIG_64BIT |
| 183 | #define SET_PERSONALITY(ex) set_personality(PER_LINUX) | 183 | #define SET_PERSONALITY(ex) \ |
| 184 | set_personality(PER_LINUX | (current->personality & (~PER_MASK))) | ||
| 184 | #else /* CONFIG_64BIT */ | 185 | #else /* CONFIG_64BIT */ |
| 185 | #define SET_PERSONALITY(ex) \ | 186 | #define SET_PERSONALITY(ex) \ |
| 186 | do { \ | 187 | do { \ |
diff --git a/arch/s390/include/asm/hugetlb.h b/arch/s390/include/asm/hugetlb.h index 799ed0f1643d..2d6e6e380564 100644 --- a/arch/s390/include/asm/hugetlb.h +++ b/arch/s390/include/asm/hugetlb.h | |||
| @@ -66,16 +66,6 @@ static inline pte_t huge_ptep_get(pte_t *ptep) | |||
| 66 | return pte; | 66 | return pte; |
| 67 | } | 67 | } |
| 68 | 68 | ||
| 69 | static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | ||
| 70 | unsigned long addr, pte_t *ptep) | ||
| 71 | { | ||
| 72 | pte_t pte = huge_ptep_get(ptep); | ||
| 73 | |||
| 74 | mm->context.flush_mm = 1; | ||
| 75 | pmd_clear((pmd_t *) ptep); | ||
| 76 | return pte; | ||
| 77 | } | ||
| 78 | |||
| 79 | static inline void __pmd_csp(pmd_t *pmdp) | 69 | static inline void __pmd_csp(pmd_t *pmdp) |
| 80 | { | 70 | { |
| 81 | register unsigned long reg2 asm("2") = pmd_val(*pmdp); | 71 | register unsigned long reg2 asm("2") = pmd_val(*pmdp); |
| @@ -117,6 +107,15 @@ static inline void huge_ptep_invalidate(struct mm_struct *mm, | |||
| 117 | __pmd_csp(pmdp); | 107 | __pmd_csp(pmdp); |
| 118 | } | 108 | } |
| 119 | 109 | ||
| 110 | static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | ||
| 111 | unsigned long addr, pte_t *ptep) | ||
| 112 | { | ||
| 113 | pte_t pte = huge_ptep_get(ptep); | ||
| 114 | |||
| 115 | huge_ptep_invalidate(mm, addr, ptep); | ||
| 116 | return pte; | ||
| 117 | } | ||
| 118 | |||
| 120 | #define huge_ptep_set_access_flags(__vma, __addr, __ptep, __entry, __dirty) \ | 119 | #define huge_ptep_set_access_flags(__vma, __addr, __ptep, __entry, __dirty) \ |
| 121 | ({ \ | 120 | ({ \ |
| 122 | int __changed = !pte_same(huge_ptep_get(__ptep), __entry); \ | 121 | int __changed = !pte_same(huge_ptep_get(__ptep), __entry); \ |
| @@ -131,10 +130,7 @@ static inline void huge_ptep_invalidate(struct mm_struct *mm, | |||
| 131 | ({ \ | 130 | ({ \ |
| 132 | pte_t __pte = huge_ptep_get(__ptep); \ | 131 | pte_t __pte = huge_ptep_get(__ptep); \ |
| 133 | if (pte_write(__pte)) { \ | 132 | if (pte_write(__pte)) { \ |
| 134 | (__mm)->context.flush_mm = 1; \ | 133 | huge_ptep_invalidate(__mm, __addr, __ptep); \ |
| 135 | if (atomic_read(&(__mm)->context.attach_count) > 1 || \ | ||
| 136 | (__mm) != current->active_mm) \ | ||
| 137 | huge_ptep_invalidate(__mm, __addr, __ptep); \ | ||
| 138 | set_huge_pte_at(__mm, __addr, __ptep, \ | 134 | set_huge_pte_at(__mm, __addr, __ptep, \ |
| 139 | huge_pte_wrprotect(__pte)); \ | 135 | huge_pte_wrprotect(__pte)); \ |
| 140 | } \ | 136 | } \ |
diff --git a/arch/s390/include/asm/posix_types.h b/arch/s390/include/asm/posix_types.h index 7bcc14e395f0..bf2a2ad2f800 100644 --- a/arch/s390/include/asm/posix_types.h +++ b/arch/s390/include/asm/posix_types.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | */ | 13 | */ |
| 14 | 14 | ||
| 15 | typedef unsigned long __kernel_size_t; | 15 | typedef unsigned long __kernel_size_t; |
| 16 | typedef long __kernel_ssize_t; | ||
| 16 | #define __kernel_size_t __kernel_size_t | 17 | #define __kernel_size_t __kernel_size_t |
| 17 | 18 | ||
| 18 | typedef unsigned short __kernel_old_dev_t; | 19 | typedef unsigned short __kernel_old_dev_t; |
| @@ -25,7 +26,6 @@ typedef unsigned short __kernel_mode_t; | |||
| 25 | typedef unsigned short __kernel_ipc_pid_t; | 26 | typedef unsigned short __kernel_ipc_pid_t; |
| 26 | typedef unsigned short __kernel_uid_t; | 27 | typedef unsigned short __kernel_uid_t; |
| 27 | typedef unsigned short __kernel_gid_t; | 28 | typedef unsigned short __kernel_gid_t; |
| 28 | typedef int __kernel_ssize_t; | ||
| 29 | typedef int __kernel_ptrdiff_t; | 29 | typedef int __kernel_ptrdiff_t; |
| 30 | 30 | ||
| 31 | #else /* __s390x__ */ | 31 | #else /* __s390x__ */ |
| @@ -35,7 +35,6 @@ typedef unsigned int __kernel_mode_t; | |||
| 35 | typedef int __kernel_ipc_pid_t; | 35 | typedef int __kernel_ipc_pid_t; |
| 36 | typedef unsigned int __kernel_uid_t; | 36 | typedef unsigned int __kernel_uid_t; |
| 37 | typedef unsigned int __kernel_gid_t; | 37 | typedef unsigned int __kernel_gid_t; |
| 38 | typedef long __kernel_ssize_t; | ||
| 39 | typedef long __kernel_ptrdiff_t; | 38 | typedef long __kernel_ptrdiff_t; |
| 40 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ | 39 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ |
| 41 | 40 | ||
diff --git a/arch/s390/include/asm/smp.h b/arch/s390/include/asm/smp.h index a0a8340daafa..ce26ac3cb162 100644 --- a/arch/s390/include/asm/smp.h +++ b/arch/s390/include/asm/smp.h | |||
| @@ -44,6 +44,7 @@ static inline void smp_call_online_cpu(void (*func)(void *), void *data) | |||
| 44 | } | 44 | } |
| 45 | 45 | ||
| 46 | static inline int smp_find_processor_id(int address) { return 0; } | 46 | static inline int smp_find_processor_id(int address) { return 0; } |
| 47 | static inline int smp_store_status(int cpu) { return 0; } | ||
| 47 | static inline int smp_vcpu_scheduled(int cpu) { return 1; } | 48 | static inline int smp_vcpu_scheduled(int cpu) { return 1; } |
| 48 | static inline void smp_yield_cpu(int cpu) { } | 49 | static inline void smp_yield_cpu(int cpu) { } |
| 49 | static inline void smp_yield(void) { } | 50 | static inline void smp_yield(void) { } |
diff --git a/arch/s390/include/asm/tlbflush.h b/arch/s390/include/asm/tlbflush.h index 9fde315f3a7c..1d8fe2b17ef6 100644 --- a/arch/s390/include/asm/tlbflush.h +++ b/arch/s390/include/asm/tlbflush.h | |||
| @@ -90,12 +90,10 @@ static inline void __tlb_flush_mm(struct mm_struct * mm) | |||
| 90 | 90 | ||
| 91 | static inline void __tlb_flush_mm_cond(struct mm_struct * mm) | 91 | static inline void __tlb_flush_mm_cond(struct mm_struct * mm) |
| 92 | { | 92 | { |
| 93 | spin_lock(&mm->page_table_lock); | ||
| 94 | if (mm->context.flush_mm) { | 93 | if (mm->context.flush_mm) { |
| 95 | __tlb_flush_mm(mm); | 94 | __tlb_flush_mm(mm); |
| 96 | mm->context.flush_mm = 0; | 95 | mm->context.flush_mm = 0; |
| 97 | } | 96 | } |
| 98 | spin_unlock(&mm->page_table_lock); | ||
| 99 | } | 97 | } |
| 100 | 98 | ||
| 101 | /* | 99 | /* |
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c index f86c81e13c37..40b57693de38 100644 --- a/arch/s390/kernel/setup.c +++ b/arch/s390/kernel/setup.c | |||
| @@ -974,11 +974,13 @@ static void __init setup_hwcaps(void) | |||
| 974 | if (MACHINE_HAS_HPAGE) | 974 | if (MACHINE_HAS_HPAGE) |
| 975 | elf_hwcap |= HWCAP_S390_HPAGE; | 975 | elf_hwcap |= HWCAP_S390_HPAGE; |
| 976 | 976 | ||
| 977 | #if defined(CONFIG_64BIT) | ||
| 977 | /* | 978 | /* |
| 978 | * 64-bit register support for 31-bit processes | 979 | * 64-bit register support for 31-bit processes |
| 979 | * HWCAP_S390_HIGH_GPRS is bit 9. | 980 | * HWCAP_S390_HIGH_GPRS is bit 9. |
| 980 | */ | 981 | */ |
| 981 | elf_hwcap |= HWCAP_S390_HIGH_GPRS; | 982 | elf_hwcap |= HWCAP_S390_HIGH_GPRS; |
| 983 | #endif | ||
| 982 | 984 | ||
| 983 | get_cpu_id(&cpu_id); | 985 | get_cpu_id(&cpu_id); |
| 984 | switch (cpu_id.machine) { | 986 | switch (cpu_id.machine) { |
diff --git a/arch/s390/lib/uaccess_pt.c b/arch/s390/lib/uaccess_pt.c index 60ee2b883797..2d37bb861faf 100644 --- a/arch/s390/lib/uaccess_pt.c +++ b/arch/s390/lib/uaccess_pt.c | |||
| @@ -2,69 +2,82 @@ | |||
| 2 | * User access functions based on page table walks for enhanced | 2 | * User access functions based on page table walks for enhanced |
| 3 | * system layout without hardware support. | 3 | * system layout without hardware support. |
| 4 | * | 4 | * |
| 5 | * Copyright IBM Corp. 2006 | 5 | * Copyright IBM Corp. 2006, 2012 |
| 6 | * Author(s): Gerald Schaefer (gerald.schaefer@de.ibm.com) | 6 | * Author(s): Gerald Schaefer (gerald.schaefer@de.ibm.com) |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/errno.h> | 9 | #include <linux/errno.h> |
| 10 | #include <linux/hardirq.h> | 10 | #include <linux/hardirq.h> |
| 11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
| 12 | #include <linux/hugetlb.h> | ||
| 12 | #include <asm/uaccess.h> | 13 | #include <asm/uaccess.h> |
| 13 | #include <asm/futex.h> | 14 | #include <asm/futex.h> |
| 14 | #include "uaccess.h" | 15 | #include "uaccess.h" |
| 15 | 16 | ||
| 16 | static inline pte_t *follow_table(struct mm_struct *mm, unsigned long addr) | 17 | |
| 18 | /* | ||
| 19 | * Returns kernel address for user virtual address. If the returned address is | ||
| 20 | * >= -4095 (IS_ERR_VALUE(x) returns true), a fault has occured and the address | ||
| 21 | * contains the (negative) exception code. | ||
| 22 | */ | ||
| 23 | static __always_inline unsigned long follow_table(struct mm_struct *mm, | ||
| 24 | unsigned long addr, int write) | ||
| 17 | { | 25 | { |
| 18 | pgd_t *pgd; | 26 | pgd_t *pgd; |
| 19 | pud_t *pud; | 27 | pud_t *pud; |
| 20 | pmd_t *pmd; | 28 | pmd_t *pmd; |
| 29 | pte_t *ptep; | ||
| 21 | 30 | ||
| 22 | pgd = pgd_offset(mm, addr); | 31 | pgd = pgd_offset(mm, addr); |
| 23 | if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) | 32 | if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) |
| 24 | return (pte_t *) 0x3a; | 33 | return -0x3aUL; |
| 25 | 34 | ||
| 26 | pud = pud_offset(pgd, addr); | 35 | pud = pud_offset(pgd, addr); |
| 27 | if (pud_none(*pud) || unlikely(pud_bad(*pud))) | 36 | if (pud_none(*pud) || unlikely(pud_bad(*pud))) |
| 28 | return (pte_t *) 0x3b; | 37 | return -0x3bUL; |
| 29 | 38 | ||
| 30 | pmd = pmd_offset(pud, addr); | 39 | pmd = pmd_offset(pud, addr); |
| 31 | if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd))) | 40 | if (pmd_none(*pmd)) |
| 32 | return (pte_t *) 0x10; | 41 | return -0x10UL; |
| 42 | if (pmd_huge(*pmd)) { | ||
| 43 | if (write && (pmd_val(*pmd) & _SEGMENT_ENTRY_RO)) | ||
| 44 | return -0x04UL; | ||
| 45 | return (pmd_val(*pmd) & HPAGE_MASK) + (addr & ~HPAGE_MASK); | ||
| 46 | } | ||
| 47 | if (unlikely(pmd_bad(*pmd))) | ||
| 48 | return -0x10UL; | ||
| 49 | |||
| 50 | ptep = pte_offset_map(pmd, addr); | ||
| 51 | if (!pte_present(*ptep)) | ||
| 52 | return -0x11UL; | ||
| 53 | if (write && !pte_write(*ptep)) | ||
| 54 | return -0x04UL; | ||
| 33 | 55 | ||
| 34 | return pte_offset_map(pmd, addr); | 56 | return (pte_val(*ptep) & PAGE_MASK) + (addr & ~PAGE_MASK); |
| 35 | } | 57 | } |
| 36 | 58 | ||
| 37 | static __always_inline size_t __user_copy_pt(unsigned long uaddr, void *kptr, | 59 | static __always_inline size_t __user_copy_pt(unsigned long uaddr, void *kptr, |
| 38 | size_t n, int write_user) | 60 | size_t n, int write_user) |
| 39 | { | 61 | { |
| 40 | struct mm_struct *mm = current->mm; | 62 | struct mm_struct *mm = current->mm; |
| 41 | unsigned long offset, pfn, done, size; | 63 | unsigned long offset, done, size, kaddr; |
| 42 | pte_t *pte; | ||
| 43 | void *from, *to; | 64 | void *from, *to; |
| 44 | 65 | ||
| 45 | done = 0; | 66 | done = 0; |
| 46 | retry: | 67 | retry: |
| 47 | spin_lock(&mm->page_table_lock); | 68 | spin_lock(&mm->page_table_lock); |
| 48 | do { | 69 | do { |
| 49 | pte = follow_table(mm, uaddr); | 70 | kaddr = follow_table(mm, uaddr, write_user); |
| 50 | if ((unsigned long) pte < 0x1000) | 71 | if (IS_ERR_VALUE(kaddr)) |
| 51 | goto fault; | 72 | goto fault; |
| 52 | if (!pte_present(*pte)) { | ||
| 53 | pte = (pte_t *) 0x11; | ||
| 54 | goto fault; | ||
| 55 | } else if (write_user && !pte_write(*pte)) { | ||
| 56 | pte = (pte_t *) 0x04; | ||
| 57 | goto fault; | ||
| 58 | } | ||
| 59 | 73 | ||
| 60 | pfn = pte_pfn(*pte); | 74 | offset = uaddr & ~PAGE_MASK; |
| 61 | offset = uaddr & (PAGE_SIZE - 1); | ||
| 62 | size = min(n - done, PAGE_SIZE - offset); | 75 | size = min(n - done, PAGE_SIZE - offset); |
| 63 | if (write_user) { | 76 | if (write_user) { |
| 64 | to = (void *)((pfn << PAGE_SHIFT) + offset); | 77 | to = (void *) kaddr; |
| 65 | from = kptr + done; | 78 | from = kptr + done; |
| 66 | } else { | 79 | } else { |
| 67 | from = (void *)((pfn << PAGE_SHIFT) + offset); | 80 | from = (void *) kaddr; |
| 68 | to = kptr + done; | 81 | to = kptr + done; |
| 69 | } | 82 | } |
| 70 | memcpy(to, from, size); | 83 | memcpy(to, from, size); |
| @@ -75,7 +88,7 @@ retry: | |||
| 75 | return n - done; | 88 | return n - done; |
| 76 | fault: | 89 | fault: |
| 77 | spin_unlock(&mm->page_table_lock); | 90 | spin_unlock(&mm->page_table_lock); |
| 78 | if (__handle_fault(uaddr, (unsigned long) pte, write_user)) | 91 | if (__handle_fault(uaddr, -kaddr, write_user)) |
| 79 | return n - done; | 92 | return n - done; |
| 80 | goto retry; | 93 | goto retry; |
| 81 | } | 94 | } |
| @@ -84,27 +97,22 @@ fault: | |||
| 84 | * Do DAT for user address by page table walk, return kernel address. | 97 | * Do DAT for user address by page table walk, return kernel address. |
| 85 | * This function needs to be called with current->mm->page_table_lock held. | 98 | * This function needs to be called with current->mm->page_table_lock held. |
| 86 | */ | 99 | */ |
| 87 | static __always_inline unsigned long __dat_user_addr(unsigned long uaddr) | 100 | static __always_inline unsigned long __dat_user_addr(unsigned long uaddr, |
| 101 | int write) | ||
| 88 | { | 102 | { |
| 89 | struct mm_struct *mm = current->mm; | 103 | struct mm_struct *mm = current->mm; |
| 90 | unsigned long pfn; | 104 | unsigned long kaddr; |
| 91 | pte_t *pte; | ||
| 92 | int rc; | 105 | int rc; |
| 93 | 106 | ||
| 94 | retry: | 107 | retry: |
| 95 | pte = follow_table(mm, uaddr); | 108 | kaddr = follow_table(mm, uaddr, write); |
| 96 | if ((unsigned long) pte < 0x1000) | 109 | if (IS_ERR_VALUE(kaddr)) |
| 97 | goto fault; | ||
| 98 | if (!pte_present(*pte)) { | ||
| 99 | pte = (pte_t *) 0x11; | ||
| 100 | goto fault; | 110 | goto fault; |
| 101 | } | ||
| 102 | 111 | ||
| 103 | pfn = pte_pfn(*pte); | 112 | return kaddr; |
| 104 | return (pfn << PAGE_SHIFT) + (uaddr & (PAGE_SIZE - 1)); | ||
| 105 | fault: | 113 | fault: |
| 106 | spin_unlock(&mm->page_table_lock); | 114 | spin_unlock(&mm->page_table_lock); |
| 107 | rc = __handle_fault(uaddr, (unsigned long) pte, 0); | 115 | rc = __handle_fault(uaddr, -kaddr, write); |
| 108 | spin_lock(&mm->page_table_lock); | 116 | spin_lock(&mm->page_table_lock); |
| 109 | if (!rc) | 117 | if (!rc) |
| 110 | goto retry; | 118 | goto retry; |
| @@ -159,11 +167,9 @@ static size_t clear_user_pt(size_t n, void __user *to) | |||
| 159 | 167 | ||
| 160 | static size_t strnlen_user_pt(size_t count, const char __user *src) | 168 | static size_t strnlen_user_pt(size_t count, const char __user *src) |
| 161 | { | 169 | { |
| 162 | char *addr; | ||
| 163 | unsigned long uaddr = (unsigned long) src; | 170 | unsigned long uaddr = (unsigned long) src; |
| 164 | struct mm_struct *mm = current->mm; | 171 | struct mm_struct *mm = current->mm; |
| 165 | unsigned long offset, pfn, done, len; | 172 | unsigned long offset, done, len, kaddr; |
| 166 | pte_t *pte; | ||
| 167 | size_t len_str; | 173 | size_t len_str; |
| 168 | 174 | ||
| 169 | if (segment_eq(get_fs(), KERNEL_DS)) | 175 | if (segment_eq(get_fs(), KERNEL_DS)) |
| @@ -172,19 +178,13 @@ static size_t strnlen_user_pt(size_t count, const char __user *src) | |||
| 172 | retry: | 178 | retry: |
| 173 | spin_lock(&mm->page_table_lock); | 179 | spin_lock(&mm->page_table_lock); |
| 174 | do { | 180 | do { |
| 175 | pte = follow_table(mm, uaddr); | 181 | kaddr = follow_table(mm, uaddr, 0); |
| 176 | if ((unsigned long) pte < 0x1000) | 182 | if (IS_ERR_VALUE(kaddr)) |
| 177 | goto fault; | ||
| 178 | if (!pte_present(*pte)) { | ||
| 179 | pte = (pte_t *) 0x11; | ||
| 180 | goto fault; | 183 | goto fault; |
| 181 | } | ||
| 182 | 184 | ||
| 183 | pfn = pte_pfn(*pte); | 185 | offset = uaddr & ~PAGE_MASK; |
| 184 | offset = uaddr & (PAGE_SIZE-1); | ||
| 185 | addr = (char *)(pfn << PAGE_SHIFT) + offset; | ||
| 186 | len = min(count - done, PAGE_SIZE - offset); | 186 | len = min(count - done, PAGE_SIZE - offset); |
| 187 | len_str = strnlen(addr, len); | 187 | len_str = strnlen((char *) kaddr, len); |
| 188 | done += len_str; | 188 | done += len_str; |
| 189 | uaddr += len_str; | 189 | uaddr += len_str; |
| 190 | } while ((len_str == len) && (done < count)); | 190 | } while ((len_str == len) && (done < count)); |
| @@ -192,7 +192,7 @@ retry: | |||
| 192 | return done + 1; | 192 | return done + 1; |
| 193 | fault: | 193 | fault: |
| 194 | spin_unlock(&mm->page_table_lock); | 194 | spin_unlock(&mm->page_table_lock); |
| 195 | if (__handle_fault(uaddr, (unsigned long) pte, 0)) | 195 | if (__handle_fault(uaddr, -kaddr, 0)) |
| 196 | return 0; | 196 | return 0; |
| 197 | goto retry; | 197 | goto retry; |
| 198 | } | 198 | } |
| @@ -225,11 +225,10 @@ static size_t copy_in_user_pt(size_t n, void __user *to, | |||
| 225 | const void __user *from) | 225 | const void __user *from) |
| 226 | { | 226 | { |
| 227 | struct mm_struct *mm = current->mm; | 227 | struct mm_struct *mm = current->mm; |
| 228 | unsigned long offset_from, offset_to, offset_max, pfn_from, pfn_to, | 228 | unsigned long offset_max, uaddr, done, size, error_code; |
| 229 | uaddr, done, size, error_code; | ||
| 230 | unsigned long uaddr_from = (unsigned long) from; | 229 | unsigned long uaddr_from = (unsigned long) from; |
| 231 | unsigned long uaddr_to = (unsigned long) to; | 230 | unsigned long uaddr_to = (unsigned long) to; |
| 232 | pte_t *pte_from, *pte_to; | 231 | unsigned long kaddr_to, kaddr_from; |
| 233 | int write_user; | 232 | int write_user; |
| 234 | 233 | ||
| 235 | if (segment_eq(get_fs(), KERNEL_DS)) { | 234 | if (segment_eq(get_fs(), KERNEL_DS)) { |
| @@ -242,38 +241,23 @@ retry: | |||
| 242 | do { | 241 | do { |
| 243 | write_user = 0; | 242 | write_user = 0; |
| 244 | uaddr = uaddr_from; | 243 | uaddr = uaddr_from; |
| 245 | pte_from = follow_table(mm, uaddr_from); | 244 | kaddr_from = follow_table(mm, uaddr_from, 0); |
| 246 | error_code = (unsigned long) pte_from; | 245 | error_code = kaddr_from; |
| 247 | if (error_code < 0x1000) | 246 | if (IS_ERR_VALUE(error_code)) |
| 248 | goto fault; | ||
| 249 | if (!pte_present(*pte_from)) { | ||
| 250 | error_code = 0x11; | ||
| 251 | goto fault; | 247 | goto fault; |
| 252 | } | ||
| 253 | 248 | ||
| 254 | write_user = 1; | 249 | write_user = 1; |
| 255 | uaddr = uaddr_to; | 250 | uaddr = uaddr_to; |
| 256 | pte_to = follow_table(mm, uaddr_to); | 251 | kaddr_to = follow_table(mm, uaddr_to, 1); |
| 257 | error_code = (unsigned long) pte_to; | 252 | error_code = (unsigned long) kaddr_to; |
| 258 | if (error_code < 0x1000) | 253 | if (IS_ERR_VALUE(error_code)) |
| 259 | goto fault; | ||
| 260 | if (!pte_present(*pte_to)) { | ||
| 261 | error_code = 0x11; | ||
| 262 | goto fault; | 254 | goto fault; |
| 263 | } else if (!pte_write(*pte_to)) { | ||
| 264 | error_code = 0x04; | ||
| 265 | goto fault; | ||
| 266 | } | ||
| 267 | 255 | ||
| 268 | pfn_from = pte_pfn(*pte_from); | 256 | offset_max = max(uaddr_from & ~PAGE_MASK, |
| 269 | pfn_to = pte_pfn(*pte_to); | 257 | uaddr_to & ~PAGE_MASK); |
| 270 | offset_from = uaddr_from & (PAGE_SIZE-1); | ||
| 271 | offset_to = uaddr_from & (PAGE_SIZE-1); | ||
| 272 | offset_max = max(offset_from, offset_to); | ||
| 273 | size = min(n - done, PAGE_SIZE - offset_max); | 258 | size = min(n - done, PAGE_SIZE - offset_max); |
| 274 | 259 | ||
| 275 | memcpy((void *)(pfn_to << PAGE_SHIFT) + offset_to, | 260 | memcpy((void *) kaddr_to, (void *) kaddr_from, size); |
| 276 | (void *)(pfn_from << PAGE_SHIFT) + offset_from, size); | ||
| 277 | done += size; | 261 | done += size; |
| 278 | uaddr_from += size; | 262 | uaddr_from += size; |
| 279 | uaddr_to += size; | 263 | uaddr_to += size; |
| @@ -282,7 +266,7 @@ retry: | |||
| 282 | return n - done; | 266 | return n - done; |
| 283 | fault: | 267 | fault: |
| 284 | spin_unlock(&mm->page_table_lock); | 268 | spin_unlock(&mm->page_table_lock); |
| 285 | if (__handle_fault(uaddr, error_code, write_user)) | 269 | if (__handle_fault(uaddr, -error_code, write_user)) |
| 286 | return n - done; | 270 | return n - done; |
| 287 | goto retry; | 271 | goto retry; |
| 288 | } | 272 | } |
| @@ -341,7 +325,7 @@ int futex_atomic_op_pt(int op, u32 __user *uaddr, int oparg, int *old) | |||
| 341 | return __futex_atomic_op_pt(op, uaddr, oparg, old); | 325 | return __futex_atomic_op_pt(op, uaddr, oparg, old); |
| 342 | spin_lock(¤t->mm->page_table_lock); | 326 | spin_lock(¤t->mm->page_table_lock); |
| 343 | uaddr = (u32 __force __user *) | 327 | uaddr = (u32 __force __user *) |
| 344 | __dat_user_addr((__force unsigned long) uaddr); | 328 | __dat_user_addr((__force unsigned long) uaddr, 1); |
| 345 | if (!uaddr) { | 329 | if (!uaddr) { |
| 346 | spin_unlock(¤t->mm->page_table_lock); | 330 | spin_unlock(¤t->mm->page_table_lock); |
| 347 | return -EFAULT; | 331 | return -EFAULT; |
| @@ -378,7 +362,7 @@ int futex_atomic_cmpxchg_pt(u32 *uval, u32 __user *uaddr, | |||
| 378 | return __futex_atomic_cmpxchg_pt(uval, uaddr, oldval, newval); | 362 | return __futex_atomic_cmpxchg_pt(uval, uaddr, oldval, newval); |
| 379 | spin_lock(¤t->mm->page_table_lock); | 363 | spin_lock(¤t->mm->page_table_lock); |
| 380 | uaddr = (u32 __force __user *) | 364 | uaddr = (u32 __force __user *) |
| 381 | __dat_user_addr((__force unsigned long) uaddr); | 365 | __dat_user_addr((__force unsigned long) uaddr, 1); |
| 382 | if (!uaddr) { | 366 | if (!uaddr) { |
| 383 | spin_unlock(¤t->mm->page_table_lock); | 367 | spin_unlock(¤t->mm->page_table_lock); |
| 384 | return -EFAULT; | 368 | return -EFAULT; |
diff --git a/arch/s390/oprofile/init.c b/arch/s390/oprofile/init.c index a1e9d69a9c90..584b93674ea4 100644 --- a/arch/s390/oprofile/init.c +++ b/arch/s390/oprofile/init.c | |||
| @@ -169,7 +169,7 @@ static ssize_t hw_interval_write(struct file *file, char const __user *buf, | |||
| 169 | if (*offset) | 169 | if (*offset) |
| 170 | return -EINVAL; | 170 | return -EINVAL; |
| 171 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 171 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 172 | if (retval) | 172 | if (retval <= 0) |
| 173 | return retval; | 173 | return retval; |
| 174 | if (val < oprofile_min_interval) | 174 | if (val < oprofile_min_interval) |
| 175 | oprofile_hw_interval = oprofile_min_interval; | 175 | oprofile_hw_interval = oprofile_min_interval; |
| @@ -212,7 +212,7 @@ static ssize_t hwsampler_zero_write(struct file *file, char const __user *buf, | |||
| 212 | return -EINVAL; | 212 | return -EINVAL; |
| 213 | 213 | ||
| 214 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 214 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 215 | if (retval) | 215 | if (retval <= 0) |
| 216 | return retval; | 216 | return retval; |
| 217 | if (val != 0) | 217 | if (val != 0) |
| 218 | return -EINVAL; | 218 | return -EINVAL; |
| @@ -243,7 +243,7 @@ static ssize_t hwsampler_kernel_write(struct file *file, char const __user *buf, | |||
| 243 | return -EINVAL; | 243 | return -EINVAL; |
| 244 | 244 | ||
| 245 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 245 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 246 | if (retval) | 246 | if (retval <= 0) |
| 247 | return retval; | 247 | return retval; |
| 248 | 248 | ||
| 249 | if (val != 0 && val != 1) | 249 | if (val != 0 && val != 1) |
| @@ -278,7 +278,7 @@ static ssize_t hwsampler_user_write(struct file *file, char const __user *buf, | |||
| 278 | return -EINVAL; | 278 | return -EINVAL; |
| 279 | 279 | ||
| 280 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 280 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 281 | if (retval) | 281 | if (retval <= 0) |
| 282 | return retval; | 282 | return retval; |
| 283 | 283 | ||
| 284 | if (val != 0 && val != 1) | 284 | if (val != 0 && val != 1) |
| @@ -317,7 +317,7 @@ static ssize_t timer_enabled_write(struct file *file, char const __user *buf, | |||
| 317 | return -EINVAL; | 317 | return -EINVAL; |
| 318 | 318 | ||
| 319 | retval = oprofilefs_ulong_from_user(&val, buf, count); | 319 | retval = oprofilefs_ulong_from_user(&val, buf, count); |
| 320 | if (retval) | 320 | if (retval <= 0) |
| 321 | return retval; | 321 | return retval; |
| 322 | 322 | ||
| 323 | if (val != 0 && val != 1) | 323 | if (val != 0 && val != 1) |
diff --git a/arch/sh/kernel/cpu/sh5/entry.S b/arch/sh/kernel/cpu/sh5/entry.S index b7cf6a547f11..7e605b95592a 100644 --- a/arch/sh/kernel/cpu/sh5/entry.S +++ b/arch/sh/kernel/cpu/sh5/entry.S | |||
| @@ -933,7 +933,7 @@ ret_with_reschedule: | |||
| 933 | 933 | ||
| 934 | pta restore_all, tr1 | 934 | pta restore_all, tr1 |
| 935 | 935 | ||
| 936 | movi _TIF_SIGPENDING, r8 | 936 | movi (_TIF_SIGPENDING|_TIF_NOTIFY_RESUME), r8 |
| 937 | and r8, r7, r8 | 937 | and r8, r7, r8 |
| 938 | pta work_notifysig, tr0 | 938 | pta work_notifysig, tr0 |
| 939 | bne r8, ZERO, tr0 | 939 | bne r8, ZERO, tr0 |
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index f67601cb3f1f..b96489d8b27d 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S | |||
| @@ -139,7 +139,7 @@ work_pending: | |||
| 139 | ! r8: current_thread_info | 139 | ! r8: current_thread_info |
| 140 | ! t: result of "tst #_TIF_NEED_RESCHED, r0" | 140 | ! t: result of "tst #_TIF_NEED_RESCHED, r0" |
| 141 | bf/s work_resched | 141 | bf/s work_resched |
| 142 | tst #_TIF_SIGPENDING, r0 | 142 | tst #(_TIF_SIGPENDING | _TIF_NOTIFY_RESUME), r0 |
| 143 | work_notifysig: | 143 | work_notifysig: |
| 144 | bt/s __restore_all | 144 | bt/s __restore_all |
| 145 | mov r15, r4 | 145 | mov r15, r4 |
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 15e0a1693976..f1ddc0d23679 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c | |||
| @@ -48,9 +48,7 @@ void *module_alloc(unsigned long size) | |||
| 48 | return NULL; | 48 | return NULL; |
| 49 | 49 | ||
| 50 | ret = module_map(size); | 50 | ret = module_map(size); |
| 51 | if (!ret) | 51 | if (ret) |
| 52 | ret = ERR_PTR(-ENOMEM); | ||
| 53 | else | ||
| 54 | memset(ret, 0, size); | 52 | memset(ret, 0, size); |
| 55 | 53 | ||
| 56 | return ret; | 54 | return ret; |
| @@ -116,6 +114,10 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
| 116 | v = sym->st_value + rel[i].r_addend; | 114 | v = sym->st_value + rel[i].r_addend; |
| 117 | 115 | ||
| 118 | switch (ELF_R_TYPE(rel[i].r_info) & 0xff) { | 116 | switch (ELF_R_TYPE(rel[i].r_info) & 0xff) { |
| 117 | case R_SPARC_DISP32: | ||
| 118 | v -= (Elf_Addr) location; | ||
| 119 | *loc32 = v; | ||
| 120 | break; | ||
| 119 | #ifdef CONFIG_SPARC64 | 121 | #ifdef CONFIG_SPARC64 |
| 120 | case R_SPARC_64: | 122 | case R_SPARC_64: |
| 121 | location[0] = v >> 56; | 123 | location[0] = v >> 56; |
| @@ -128,11 +130,6 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
| 128 | location[7] = v >> 0; | 130 | location[7] = v >> 0; |
| 129 | break; | 131 | break; |
| 130 | 132 | ||
| 131 | case R_SPARC_DISP32: | ||
| 132 | v -= (Elf_Addr) location; | ||
| 133 | *loc32 = v; | ||
| 134 | break; | ||
| 135 | |||
| 136 | case R_SPARC_WDISP19: | 133 | case R_SPARC_WDISP19: |
| 137 | v -= (Elf_Addr) location; | 134 | v -= (Elf_Addr) location; |
| 138 | *loc32 = (*loc32 & ~0x7ffff) | | 135 | *loc32 = (*loc32 & ~0x7ffff) | |
diff --git a/arch/um/os-Linux/time.c b/arch/um/os-Linux/time.c index f60238559af3..0748fe0c8a73 100644 --- a/arch/um/os-Linux/time.c +++ b/arch/um/os-Linux/time.c | |||
| @@ -114,7 +114,7 @@ static void deliver_alarm(void) | |||
| 114 | skew += this_tick - last_tick; | 114 | skew += this_tick - last_tick; |
| 115 | 115 | ||
| 116 | while (skew >= one_tick) { | 116 | while (skew >= one_tick) { |
| 117 | alarm_handler(SIGVTALRM, NULL); | 117 | alarm_handler(SIGVTALRM, NULL, NULL); |
| 118 | skew -= one_tick; | 118 | skew -= one_tick; |
| 119 | } | 119 | } |
| 120 | 120 | ||
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 8ec3a1aa4abd..50a1d1f9b6d3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
| @@ -746,10 +746,10 @@ config SWIOTLB | |||
| 746 | def_bool y if X86_64 | 746 | def_bool y if X86_64 |
| 747 | ---help--- | 747 | ---help--- |
| 748 | Support for software bounce buffers used on x86-64 systems | 748 | Support for software bounce buffers used on x86-64 systems |
| 749 | which don't have a hardware IOMMU (e.g. the current generation | 749 | which don't have a hardware IOMMU. Using this PCI devices |
| 750 | of Intel's x86-64 CPUs). Using this PCI devices which can only | 750 | which can only access 32-bits of memory can be used on systems |
| 751 | access 32-bits of memory can be used on systems with more than | 751 | with more than 3 GB of memory. |
| 752 | 3 GB of memory. If unsure, say Y. | 752 | If unsure, say Y. |
| 753 | 753 | ||
| 754 | config IOMMU_HELPER | 754 | config IOMMU_HELPER |
| 755 | def_bool (CALGARY_IOMMU || GART_IOMMU || SWIOTLB || AMD_IOMMU) | 755 | def_bool (CALGARY_IOMMU || GART_IOMMU || SWIOTLB || AMD_IOMMU) |
diff --git a/arch/x86/include/asm/spinlock.h b/arch/x86/include/asm/spinlock.h index b315a33867f2..33692eaabab5 100644 --- a/arch/x86/include/asm/spinlock.h +++ b/arch/x86/include/asm/spinlock.h | |||
| @@ -12,8 +12,7 @@ | |||
| 12 | * Simple spin lock operations. There are two variants, one clears IRQ's | 12 | * Simple spin lock operations. There are two variants, one clears IRQ's |
| 13 | * on the local processor, one does not. | 13 | * on the local processor, one does not. |
| 14 | * | 14 | * |
| 15 | * These are fair FIFO ticket locks, which are currently limited to 256 | 15 | * These are fair FIFO ticket locks, which support up to 2^16 CPUs. |
| 16 | * CPUs. | ||
| 17 | * | 16 | * |
| 18 | * (the type definitions are in asm/spinlock_types.h) | 17 | * (the type definitions are in asm/spinlock_types.h) |
| 19 | */ | 18 | */ |
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 93971e841dd5..472b9b783019 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h | |||
| @@ -51,7 +51,8 @@ extern unsigned long set_phys_range_identity(unsigned long pfn_s, | |||
| 51 | 51 | ||
| 52 | extern int m2p_add_override(unsigned long mfn, struct page *page, | 52 | extern int m2p_add_override(unsigned long mfn, struct page *page, |
| 53 | struct gnttab_map_grant_ref *kmap_op); | 53 | struct gnttab_map_grant_ref *kmap_op); |
| 54 | extern int m2p_remove_override(struct page *page, bool clear_pte); | 54 | extern int m2p_remove_override(struct page *page, |
| 55 | struct gnttab_map_grant_ref *kmap_op); | ||
| 55 | extern struct page *m2p_find_override(unsigned long mfn); | 56 | extern struct page *m2p_find_override(unsigned long mfn); |
| 56 | extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); | 57 | extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); |
| 57 | 58 | ||
diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index afb7ff79a29f..ced4534baed5 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c | |||
| @@ -165,7 +165,7 @@ static const unsigned char * const k7_nops[ASM_NOP_MAX+2] = | |||
| 165 | #endif | 165 | #endif |
| 166 | 166 | ||
| 167 | #ifdef P6_NOP1 | 167 | #ifdef P6_NOP1 |
| 168 | static const unsigned char __initconst_or_module p6nops[] = | 168 | static const unsigned char p6nops[] = |
| 169 | { | 169 | { |
| 170 | P6_NOP1, | 170 | P6_NOP1, |
| 171 | P6_NOP2, | 171 | P6_NOP2, |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index 6605a81ba339..8b6defe7eefc 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
| @@ -586,6 +586,8 @@ extern struct event_constraint intel_westmere_pebs_event_constraints[]; | |||
| 586 | 586 | ||
| 587 | extern struct event_constraint intel_snb_pebs_event_constraints[]; | 587 | extern struct event_constraint intel_snb_pebs_event_constraints[]; |
| 588 | 588 | ||
| 589 | extern struct event_constraint intel_ivb_pebs_event_constraints[]; | ||
| 590 | |||
| 589 | struct event_constraint *intel_pebs_constraints(struct perf_event *event); | 591 | struct event_constraint *intel_pebs_constraints(struct perf_event *event); |
| 590 | 592 | ||
| 591 | void intel_pmu_pebs_enable(struct perf_event *event); | 593 | void intel_pmu_pebs_enable(struct perf_event *event); |
diff --git a/arch/x86/kernel/cpu/perf_event_amd_ibs.c b/arch/x86/kernel/cpu/perf_event_amd_ibs.c index 7bfb5bec8630..eebd5ffe1bba 100644 --- a/arch/x86/kernel/cpu/perf_event_amd_ibs.c +++ b/arch/x86/kernel/cpu/perf_event_amd_ibs.c | |||
| @@ -209,6 +209,15 @@ static int perf_ibs_precise_event(struct perf_event *event, u64 *config) | |||
| 209 | return -EOPNOTSUPP; | 209 | return -EOPNOTSUPP; |
| 210 | } | 210 | } |
| 211 | 211 | ||
| 212 | static const struct perf_event_attr ibs_notsupp = { | ||
| 213 | .exclude_user = 1, | ||
| 214 | .exclude_kernel = 1, | ||
| 215 | .exclude_hv = 1, | ||
| 216 | .exclude_idle = 1, | ||
| 217 | .exclude_host = 1, | ||
| 218 | .exclude_guest = 1, | ||
| 219 | }; | ||
| 220 | |||
| 212 | static int perf_ibs_init(struct perf_event *event) | 221 | static int perf_ibs_init(struct perf_event *event) |
| 213 | { | 222 | { |
| 214 | struct hw_perf_event *hwc = &event->hw; | 223 | struct hw_perf_event *hwc = &event->hw; |
| @@ -229,6 +238,9 @@ static int perf_ibs_init(struct perf_event *event) | |||
| 229 | if (event->pmu != &perf_ibs->pmu) | 238 | if (event->pmu != &perf_ibs->pmu) |
| 230 | return -ENOENT; | 239 | return -ENOENT; |
| 231 | 240 | ||
| 241 | if (perf_flags(&event->attr) & perf_flags(&ibs_notsupp)) | ||
| 242 | return -EINVAL; | ||
| 243 | |||
| 232 | if (config & ~perf_ibs->config_mask) | 244 | if (config & ~perf_ibs->config_mask) |
| 233 | return -EINVAL; | 245 | return -EINVAL; |
| 234 | 246 | ||
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 7f2739e03e79..6bca492b8547 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -2008,6 +2008,7 @@ __init int intel_pmu_init(void) | |||
| 2008 | break; | 2008 | break; |
| 2009 | 2009 | ||
| 2010 | case 28: /* Atom */ | 2010 | case 28: /* Atom */ |
| 2011 | case 54: /* Cedariew */ | ||
| 2011 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, | 2012 | memcpy(hw_cache_event_ids, atom_hw_cache_event_ids, |
| 2012 | sizeof(hw_cache_event_ids)); | 2013 | sizeof(hw_cache_event_ids)); |
| 2013 | 2014 | ||
| @@ -2047,7 +2048,6 @@ __init int intel_pmu_init(void) | |||
| 2047 | case 42: /* SandyBridge */ | 2048 | case 42: /* SandyBridge */ |
| 2048 | case 45: /* SandyBridge, "Romely-EP" */ | 2049 | case 45: /* SandyBridge, "Romely-EP" */ |
| 2049 | x86_add_quirk(intel_sandybridge_quirk); | 2050 | x86_add_quirk(intel_sandybridge_quirk); |
| 2050 | case 58: /* IvyBridge */ | ||
| 2051 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, | 2051 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, |
| 2052 | sizeof(hw_cache_event_ids)); | 2052 | sizeof(hw_cache_event_ids)); |
| 2053 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, | 2053 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, |
| @@ -2072,6 +2072,29 @@ __init int intel_pmu_init(void) | |||
| 2072 | 2072 | ||
| 2073 | pr_cont("SandyBridge events, "); | 2073 | pr_cont("SandyBridge events, "); |
| 2074 | break; | 2074 | break; |
| 2075 | case 58: /* IvyBridge */ | ||
| 2076 | memcpy(hw_cache_event_ids, snb_hw_cache_event_ids, | ||
| 2077 | sizeof(hw_cache_event_ids)); | ||
| 2078 | memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, | ||
| 2079 | sizeof(hw_cache_extra_regs)); | ||
| 2080 | |||
| 2081 | intel_pmu_lbr_init_snb(); | ||
| 2082 | |||
| 2083 | x86_pmu.event_constraints = intel_snb_event_constraints; | ||
| 2084 | x86_pmu.pebs_constraints = intel_ivb_pebs_event_constraints; | ||
| 2085 | x86_pmu.pebs_aliases = intel_pebs_aliases_snb; | ||
| 2086 | x86_pmu.extra_regs = intel_snb_extra_regs; | ||
| 2087 | /* all extra regs are per-cpu when HT is on */ | ||
| 2088 | x86_pmu.er_flags |= ERF_HAS_RSP_1; | ||
| 2089 | x86_pmu.er_flags |= ERF_NO_HT_SHARING; | ||
| 2090 | |||
| 2091 | /* UOPS_ISSUED.ANY,c=1,i=1 to count stall cycles */ | ||
| 2092 | intel_perfmon_event_map[PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = | ||
| 2093 | X86_CONFIG(.event=0x0e, .umask=0x01, .inv=1, .cmask=1); | ||
| 2094 | |||
| 2095 | pr_cont("IvyBridge events, "); | ||
| 2096 | break; | ||
| 2097 | |||
| 2075 | 2098 | ||
| 2076 | default: | 2099 | default: |
| 2077 | switch (x86_pmu.version) { | 2100 | switch (x86_pmu.version) { |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index e38d97bf4259..826054a4f2ee 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
| @@ -407,6 +407,20 @@ struct event_constraint intel_snb_pebs_event_constraints[] = { | |||
| 407 | EVENT_CONSTRAINT_END | 407 | EVENT_CONSTRAINT_END |
| 408 | }; | 408 | }; |
| 409 | 409 | ||
| 410 | struct event_constraint intel_ivb_pebs_event_constraints[] = { | ||
| 411 | INTEL_UEVENT_CONSTRAINT(0x01c0, 0x2), /* INST_RETIRED.PRECDIST */ | ||
| 412 | INTEL_UEVENT_CONSTRAINT(0x01c2, 0xf), /* UOPS_RETIRED.ALL */ | ||
| 413 | INTEL_UEVENT_CONSTRAINT(0x02c2, 0xf), /* UOPS_RETIRED.RETIRE_SLOTS */ | ||
| 414 | INTEL_EVENT_CONSTRAINT(0xc4, 0xf), /* BR_INST_RETIRED.* */ | ||
| 415 | INTEL_EVENT_CONSTRAINT(0xc5, 0xf), /* BR_MISP_RETIRED.* */ | ||
| 416 | INTEL_EVENT_CONSTRAINT(0xcd, 0x8), /* MEM_TRANS_RETIRED.* */ | ||
| 417 | INTEL_EVENT_CONSTRAINT(0xd0, 0xf), /* MEM_UOP_RETIRED.* */ | ||
| 418 | INTEL_EVENT_CONSTRAINT(0xd1, 0xf), /* MEM_LOAD_UOPS_RETIRED.* */ | ||
| 419 | INTEL_EVENT_CONSTRAINT(0xd2, 0xf), /* MEM_LOAD_UOPS_LLC_HIT_RETIRED.* */ | ||
| 420 | INTEL_EVENT_CONSTRAINT(0xd3, 0xf), /* MEM_LOAD_UOPS_LLC_MISS_RETIRED.* */ | ||
| 421 | EVENT_CONSTRAINT_END | ||
| 422 | }; | ||
| 423 | |||
| 410 | struct event_constraint *intel_pebs_constraints(struct perf_event *event) | 424 | struct event_constraint *intel_pebs_constraints(struct perf_event *event) |
| 411 | { | 425 | { |
| 412 | struct event_constraint *c; | 426 | struct event_constraint *c; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_lbr.c b/arch/x86/kernel/cpu/perf_event_intel_lbr.c index 520b4265fcd2..da02e9cc3754 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_lbr.c +++ b/arch/x86/kernel/cpu/perf_event_intel_lbr.c | |||
| @@ -686,7 +686,8 @@ void intel_pmu_lbr_init_atom(void) | |||
| 686 | * to have an operational LBR which can freeze | 686 | * to have an operational LBR which can freeze |
| 687 | * on PMU interrupt | 687 | * on PMU interrupt |
| 688 | */ | 688 | */ |
| 689 | if (boot_cpu_data.x86_mask < 10) { | 689 | if (boot_cpu_data.x86_model == 28 |
| 690 | && boot_cpu_data.x86_mask < 10) { | ||
| 690 | pr_cont("LBR disabled due to erratum"); | 691 | pr_cont("LBR disabled due to erratum"); |
| 691 | return; | 692 | return; |
| 692 | } | 693 | } |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 0a5571080e74..38e4894165b9 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
| @@ -661,6 +661,11 @@ static void snb_uncore_msr_init_box(struct intel_uncore_box *box) | |||
| 661 | } | 661 | } |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | static struct uncore_event_desc snb_uncore_events[] = { | ||
| 665 | INTEL_UNCORE_EVENT_DESC(clockticks, "event=0xff,umask=0x00"), | ||
| 666 | { /* end: all zeroes */ }, | ||
| 667 | }; | ||
| 668 | |||
| 664 | static struct attribute *snb_uncore_formats_attr[] = { | 669 | static struct attribute *snb_uncore_formats_attr[] = { |
| 665 | &format_attr_event.attr, | 670 | &format_attr_event.attr, |
| 666 | &format_attr_umask.attr, | 671 | &format_attr_umask.attr, |
| @@ -704,6 +709,7 @@ static struct intel_uncore_type snb_uncore_cbox = { | |||
| 704 | .constraints = snb_uncore_cbox_constraints, | 709 | .constraints = snb_uncore_cbox_constraints, |
| 705 | .ops = &snb_uncore_msr_ops, | 710 | .ops = &snb_uncore_msr_ops, |
| 706 | .format_group = &snb_uncore_format_group, | 711 | .format_group = &snb_uncore_format_group, |
| 712 | .event_descs = snb_uncore_events, | ||
| 707 | }; | 713 | }; |
| 708 | 714 | ||
| 709 | static struct intel_uncore_type *snb_msr_uncores[] = { | 715 | static struct intel_uncore_type *snb_msr_uncores[] = { |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 7ad683d78645..d44f7829968e 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -270,7 +270,7 @@ void fixup_irqs(void) | |||
| 270 | 270 | ||
| 271 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { | 271 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { |
| 272 | break_affinity = 1; | 272 | break_affinity = 1; |
| 273 | affinity = cpu_all_mask; | 273 | affinity = cpu_online_mask; |
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | chip = irq_data_get_irq_chip(data); | 276 | chip = irq_data_get_irq_chip(data); |
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 8a2ce8fd41c0..82746f942cd8 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
| @@ -143,11 +143,12 @@ static int get_matching_microcode(int cpu, const u8 *ucode_ptr, | |||
| 143 | unsigned int *current_size) | 143 | unsigned int *current_size) |
| 144 | { | 144 | { |
| 145 | struct microcode_header_amd *mc_hdr; | 145 | struct microcode_header_amd *mc_hdr; |
| 146 | unsigned int actual_size; | 146 | unsigned int actual_size, patch_size; |
| 147 | u16 equiv_cpu_id; | 147 | u16 equiv_cpu_id; |
| 148 | 148 | ||
| 149 | /* size of the current patch we're staring at */ | 149 | /* size of the current patch we're staring at */ |
| 150 | *current_size = *(u32 *)(ucode_ptr + 4) + SECTION_HDR_SIZE; | 150 | patch_size = *(u32 *)(ucode_ptr + 4); |
| 151 | *current_size = patch_size + SECTION_HDR_SIZE; | ||
| 151 | 152 | ||
| 152 | equiv_cpu_id = find_equiv_id(); | 153 | equiv_cpu_id = find_equiv_id(); |
| 153 | if (!equiv_cpu_id) | 154 | if (!equiv_cpu_id) |
| @@ -174,7 +175,7 @@ static int get_matching_microcode(int cpu, const u8 *ucode_ptr, | |||
| 174 | /* | 175 | /* |
| 175 | * now that the header looks sane, verify its size | 176 | * now that the header looks sane, verify its size |
| 176 | */ | 177 | */ |
| 177 | actual_size = verify_ucode_size(cpu, *current_size, leftover_size); | 178 | actual_size = verify_ucode_size(cpu, patch_size, leftover_size); |
| 178 | if (!actual_size) | 179 | if (!actual_size) |
| 179 | return 0; | 180 | return 0; |
| 180 | 181 | ||
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index 4873e62db6a1..9e5bcf1e2376 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c | |||
| @@ -225,6 +225,9 @@ static ssize_t microcode_write(struct file *file, const char __user *buf, | |||
| 225 | if (do_microcode_update(buf, len) == 0) | 225 | if (do_microcode_update(buf, len) == 0) |
| 226 | ret = (ssize_t)len; | 226 | ret = (ssize_t)len; |
| 227 | 227 | ||
| 228 | if (ret > 0) | ||
| 229 | perf_check_microcode(); | ||
| 230 | |||
| 228 | mutex_unlock(µcode_mutex); | 231 | mutex_unlock(µcode_mutex); |
| 229 | put_online_cpus(); | 232 | put_online_cpus(); |
| 230 | 233 | ||
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 97d9a9914ba8..a3b57a27be88 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
| @@ -475,13 +475,26 @@ register_address(struct x86_emulate_ctxt *ctxt, unsigned long reg) | |||
| 475 | return address_mask(ctxt, reg); | 475 | return address_mask(ctxt, reg); |
| 476 | } | 476 | } |
| 477 | 477 | ||
| 478 | static void masked_increment(ulong *reg, ulong mask, int inc) | ||
| 479 | { | ||
| 480 | assign_masked(reg, *reg + inc, mask); | ||
| 481 | } | ||
| 482 | |||
| 478 | static inline void | 483 | static inline void |
| 479 | register_address_increment(struct x86_emulate_ctxt *ctxt, unsigned long *reg, int inc) | 484 | register_address_increment(struct x86_emulate_ctxt *ctxt, unsigned long *reg, int inc) |
| 480 | { | 485 | { |
| 486 | ulong mask; | ||
| 487 | |||
| 481 | if (ctxt->ad_bytes == sizeof(unsigned long)) | 488 | if (ctxt->ad_bytes == sizeof(unsigned long)) |
| 482 | *reg += inc; | 489 | mask = ~0UL; |
| 483 | else | 490 | else |
| 484 | *reg = (*reg & ~ad_mask(ctxt)) | ((*reg + inc) & ad_mask(ctxt)); | 491 | mask = ad_mask(ctxt); |
| 492 | masked_increment(reg, mask, inc); | ||
| 493 | } | ||
| 494 | |||
| 495 | static void rsp_increment(struct x86_emulate_ctxt *ctxt, int inc) | ||
| 496 | { | ||
| 497 | masked_increment(&ctxt->regs[VCPU_REGS_RSP], stack_mask(ctxt), inc); | ||
| 485 | } | 498 | } |
| 486 | 499 | ||
| 487 | static inline void jmp_rel(struct x86_emulate_ctxt *ctxt, int rel) | 500 | static inline void jmp_rel(struct x86_emulate_ctxt *ctxt, int rel) |
| @@ -1522,8 +1535,8 @@ static int push(struct x86_emulate_ctxt *ctxt, void *data, int bytes) | |||
| 1522 | { | 1535 | { |
| 1523 | struct segmented_address addr; | 1536 | struct segmented_address addr; |
| 1524 | 1537 | ||
| 1525 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], -bytes); | 1538 | rsp_increment(ctxt, -bytes); |
| 1526 | addr.ea = register_address(ctxt, ctxt->regs[VCPU_REGS_RSP]); | 1539 | addr.ea = ctxt->regs[VCPU_REGS_RSP] & stack_mask(ctxt); |
| 1527 | addr.seg = VCPU_SREG_SS; | 1540 | addr.seg = VCPU_SREG_SS; |
| 1528 | 1541 | ||
| 1529 | return segmented_write(ctxt, addr, data, bytes); | 1542 | return segmented_write(ctxt, addr, data, bytes); |
| @@ -1542,13 +1555,13 @@ static int emulate_pop(struct x86_emulate_ctxt *ctxt, | |||
| 1542 | int rc; | 1555 | int rc; |
| 1543 | struct segmented_address addr; | 1556 | struct segmented_address addr; |
| 1544 | 1557 | ||
| 1545 | addr.ea = register_address(ctxt, ctxt->regs[VCPU_REGS_RSP]); | 1558 | addr.ea = ctxt->regs[VCPU_REGS_RSP] & stack_mask(ctxt); |
| 1546 | addr.seg = VCPU_SREG_SS; | 1559 | addr.seg = VCPU_SREG_SS; |
| 1547 | rc = segmented_read(ctxt, addr, dest, len); | 1560 | rc = segmented_read(ctxt, addr, dest, len); |
| 1548 | if (rc != X86EMUL_CONTINUE) | 1561 | if (rc != X86EMUL_CONTINUE) |
| 1549 | return rc; | 1562 | return rc; |
| 1550 | 1563 | ||
| 1551 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], len); | 1564 | rsp_increment(ctxt, len); |
| 1552 | return rc; | 1565 | return rc; |
| 1553 | } | 1566 | } |
| 1554 | 1567 | ||
| @@ -1688,8 +1701,7 @@ static int em_popa(struct x86_emulate_ctxt *ctxt) | |||
| 1688 | 1701 | ||
| 1689 | while (reg >= VCPU_REGS_RAX) { | 1702 | while (reg >= VCPU_REGS_RAX) { |
| 1690 | if (reg == VCPU_REGS_RSP) { | 1703 | if (reg == VCPU_REGS_RSP) { |
| 1691 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], | 1704 | rsp_increment(ctxt, ctxt->op_bytes); |
| 1692 | ctxt->op_bytes); | ||
| 1693 | --reg; | 1705 | --reg; |
| 1694 | } | 1706 | } |
| 1695 | 1707 | ||
| @@ -2825,7 +2837,7 @@ static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt) | |||
| 2825 | rc = emulate_pop(ctxt, &ctxt->dst.val, ctxt->op_bytes); | 2837 | rc = emulate_pop(ctxt, &ctxt->dst.val, ctxt->op_bytes); |
| 2826 | if (rc != X86EMUL_CONTINUE) | 2838 | if (rc != X86EMUL_CONTINUE) |
| 2827 | return rc; | 2839 | return rc; |
| 2828 | register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], ctxt->src.val); | 2840 | rsp_increment(ctxt, ctxt->src.val); |
| 2829 | return X86EMUL_CONTINUE; | 2841 | return X86EMUL_CONTINUE; |
| 2830 | } | 2842 | } |
| 2831 | 2843 | ||
diff --git a/arch/x86/kvm/i8259.c b/arch/x86/kvm/i8259.c index e498b18f010c..9fc9aa7ac703 100644 --- a/arch/x86/kvm/i8259.c +++ b/arch/x86/kvm/i8259.c | |||
| @@ -318,7 +318,7 @@ static void pic_ioport_write(void *opaque, u32 addr, u32 val) | |||
| 318 | if (val & 0x10) { | 318 | if (val & 0x10) { |
| 319 | u8 edge_irr = s->irr & ~s->elcr; | 319 | u8 edge_irr = s->irr & ~s->elcr; |
| 320 | int i; | 320 | int i; |
| 321 | bool found; | 321 | bool found = false; |
| 322 | struct kvm_vcpu *vcpu; | 322 | struct kvm_vcpu *vcpu; |
| 323 | 323 | ||
| 324 | s->init4 = val & 1; | 324 | s->init4 = val & 1; |
diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c index 01ca00423938..7fbd0d273ea8 100644 --- a/arch/x86/kvm/mmu.c +++ b/arch/x86/kvm/mmu.c | |||
| @@ -4113,16 +4113,21 @@ static int mmu_shrink(struct shrinker *shrink, struct shrink_control *sc) | |||
| 4113 | LIST_HEAD(invalid_list); | 4113 | LIST_HEAD(invalid_list); |
| 4114 | 4114 | ||
| 4115 | /* | 4115 | /* |
| 4116 | * Never scan more than sc->nr_to_scan VM instances. | ||
| 4117 | * Will not hit this condition practically since we do not try | ||
| 4118 | * to shrink more than one VM and it is very unlikely to see | ||
| 4119 | * !n_used_mmu_pages so many times. | ||
| 4120 | */ | ||
| 4121 | if (!nr_to_scan--) | ||
| 4122 | break; | ||
| 4123 | /* | ||
| 4116 | * n_used_mmu_pages is accessed without holding kvm->mmu_lock | 4124 | * n_used_mmu_pages is accessed without holding kvm->mmu_lock |
| 4117 | * here. We may skip a VM instance errorneosly, but we do not | 4125 | * here. We may skip a VM instance errorneosly, but we do not |
| 4118 | * want to shrink a VM that only started to populate its MMU | 4126 | * want to shrink a VM that only started to populate its MMU |
| 4119 | * anyway. | 4127 | * anyway. |
| 4120 | */ | 4128 | */ |
| 4121 | if (kvm->arch.n_used_mmu_pages > 0) { | 4129 | if (!kvm->arch.n_used_mmu_pages) |
| 4122 | if (!nr_to_scan--) | ||
| 4123 | break; | ||
| 4124 | continue; | 4130 | continue; |
| 4125 | } | ||
| 4126 | 4131 | ||
| 4127 | idx = srcu_read_lock(&kvm->srcu); | 4132 | idx = srcu_read_lock(&kvm->srcu); |
| 4128 | spin_lock(&kvm->mmu_lock); | 4133 | spin_lock(&kvm->mmu_lock); |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index c00f03de1b79..b1eb202ee76a 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -3619,6 +3619,7 @@ static void seg_setup(int seg) | |||
| 3619 | 3619 | ||
| 3620 | static int alloc_apic_access_page(struct kvm *kvm) | 3620 | static int alloc_apic_access_page(struct kvm *kvm) |
| 3621 | { | 3621 | { |
| 3622 | struct page *page; | ||
| 3622 | struct kvm_userspace_memory_region kvm_userspace_mem; | 3623 | struct kvm_userspace_memory_region kvm_userspace_mem; |
| 3623 | int r = 0; | 3624 | int r = 0; |
| 3624 | 3625 | ||
| @@ -3633,7 +3634,13 @@ static int alloc_apic_access_page(struct kvm *kvm) | |||
| 3633 | if (r) | 3634 | if (r) |
| 3634 | goto out; | 3635 | goto out; |
| 3635 | 3636 | ||
| 3636 | kvm->arch.apic_access_page = gfn_to_page(kvm, 0xfee00); | 3637 | page = gfn_to_page(kvm, 0xfee00); |
| 3638 | if (is_error_page(page)) { | ||
| 3639 | r = -EFAULT; | ||
| 3640 | goto out; | ||
| 3641 | } | ||
| 3642 | |||
| 3643 | kvm->arch.apic_access_page = page; | ||
| 3637 | out: | 3644 | out: |
| 3638 | mutex_unlock(&kvm->slots_lock); | 3645 | mutex_unlock(&kvm->slots_lock); |
| 3639 | return r; | 3646 | return r; |
| @@ -3641,6 +3648,7 @@ out: | |||
| 3641 | 3648 | ||
| 3642 | static int alloc_identity_pagetable(struct kvm *kvm) | 3649 | static int alloc_identity_pagetable(struct kvm *kvm) |
| 3643 | { | 3650 | { |
| 3651 | struct page *page; | ||
| 3644 | struct kvm_userspace_memory_region kvm_userspace_mem; | 3652 | struct kvm_userspace_memory_region kvm_userspace_mem; |
| 3645 | int r = 0; | 3653 | int r = 0; |
| 3646 | 3654 | ||
| @@ -3656,8 +3664,13 @@ static int alloc_identity_pagetable(struct kvm *kvm) | |||
| 3656 | if (r) | 3664 | if (r) |
| 3657 | goto out; | 3665 | goto out; |
| 3658 | 3666 | ||
| 3659 | kvm->arch.ept_identity_pagetable = gfn_to_page(kvm, | 3667 | page = gfn_to_page(kvm, kvm->arch.ept_identity_map_addr >> PAGE_SHIFT); |
| 3660 | kvm->arch.ept_identity_map_addr >> PAGE_SHIFT); | 3668 | if (is_error_page(page)) { |
| 3669 | r = -EFAULT; | ||
| 3670 | goto out; | ||
| 3671 | } | ||
| 3672 | |||
| 3673 | kvm->arch.ept_identity_pagetable = page; | ||
| 3661 | out: | 3674 | out: |
| 3662 | mutex_unlock(&kvm->slots_lock); | 3675 | mutex_unlock(&kvm->slots_lock); |
| 3663 | return r; | 3676 | return r; |
| @@ -6575,7 +6588,7 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | |||
| 6575 | /* Exposing INVPCID only when PCID is exposed */ | 6588 | /* Exposing INVPCID only when PCID is exposed */ |
| 6576 | best = kvm_find_cpuid_entry(vcpu, 0x7, 0); | 6589 | best = kvm_find_cpuid_entry(vcpu, 0x7, 0); |
| 6577 | if (vmx_invpcid_supported() && | 6590 | if (vmx_invpcid_supported() && |
| 6578 | best && (best->ecx & bit(X86_FEATURE_INVPCID)) && | 6591 | best && (best->ebx & bit(X86_FEATURE_INVPCID)) && |
| 6579 | guest_cpuid_has_pcid(vcpu)) { | 6592 | guest_cpuid_has_pcid(vcpu)) { |
| 6580 | exec_control |= SECONDARY_EXEC_ENABLE_INVPCID; | 6593 | exec_control |= SECONDARY_EXEC_ENABLE_INVPCID; |
| 6581 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | 6594 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, |
| @@ -6585,7 +6598,7 @@ static void vmx_cpuid_update(struct kvm_vcpu *vcpu) | |||
| 6585 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, | 6598 | vmcs_write32(SECONDARY_VM_EXEC_CONTROL, |
| 6586 | exec_control); | 6599 | exec_control); |
| 6587 | if (best) | 6600 | if (best) |
| 6588 | best->ecx &= ~bit(X86_FEATURE_INVPCID); | 6601 | best->ebx &= ~bit(X86_FEATURE_INVPCID); |
| 6589 | } | 6602 | } |
| 6590 | } | 6603 | } |
| 6591 | 6604 | ||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 42bce48f6928..2966c847d489 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c | |||
| @@ -806,7 +806,7 @@ EXPORT_SYMBOL_GPL(kvm_rdpmc); | |||
| 806 | * kvm-specific. Those are put in the beginning of the list. | 806 | * kvm-specific. Those are put in the beginning of the list. |
| 807 | */ | 807 | */ |
| 808 | 808 | ||
| 809 | #define KVM_SAVE_MSRS_BEGIN 9 | 809 | #define KVM_SAVE_MSRS_BEGIN 10 |
| 810 | static u32 msrs_to_save[] = { | 810 | static u32 msrs_to_save[] = { |
| 811 | MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, | 811 | MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, |
| 812 | MSR_KVM_SYSTEM_TIME_NEW, MSR_KVM_WALL_CLOCK_NEW, | 812 | MSR_KVM_SYSTEM_TIME_NEW, MSR_KVM_WALL_CLOCK_NEW, |
| @@ -2000,6 +2000,9 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata) | |||
| 2000 | case MSR_KVM_STEAL_TIME: | 2000 | case MSR_KVM_STEAL_TIME: |
| 2001 | data = vcpu->arch.st.msr_val; | 2001 | data = vcpu->arch.st.msr_val; |
| 2002 | break; | 2002 | break; |
| 2003 | case MSR_KVM_PV_EOI_EN: | ||
| 2004 | data = vcpu->arch.pv_eoi.msr_val; | ||
| 2005 | break; | ||
| 2003 | case MSR_IA32_P5_MC_ADDR: | 2006 | case MSR_IA32_P5_MC_ADDR: |
| 2004 | case MSR_IA32_P5_MC_TYPE: | 2007 | case MSR_IA32_P5_MC_TYPE: |
| 2005 | case MSR_IA32_MCG_CAP: | 2008 | case MSR_IA32_MCG_CAP: |
| @@ -5110,17 +5113,20 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu) | |||
| 5110 | !kvm_event_needs_reinjection(vcpu); | 5113 | !kvm_event_needs_reinjection(vcpu); |
| 5111 | } | 5114 | } |
| 5112 | 5115 | ||
| 5113 | static void vapic_enter(struct kvm_vcpu *vcpu) | 5116 | static int vapic_enter(struct kvm_vcpu *vcpu) |
| 5114 | { | 5117 | { |
| 5115 | struct kvm_lapic *apic = vcpu->arch.apic; | 5118 | struct kvm_lapic *apic = vcpu->arch.apic; |
| 5116 | struct page *page; | 5119 | struct page *page; |
| 5117 | 5120 | ||
| 5118 | if (!apic || !apic->vapic_addr) | 5121 | if (!apic || !apic->vapic_addr) |
| 5119 | return; | 5122 | return 0; |
| 5120 | 5123 | ||
| 5121 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); | 5124 | page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); |
| 5125 | if (is_error_page(page)) | ||
| 5126 | return -EFAULT; | ||
| 5122 | 5127 | ||
| 5123 | vcpu->arch.apic->vapic_page = page; | 5128 | vcpu->arch.apic->vapic_page = page; |
| 5129 | return 0; | ||
| 5124 | } | 5130 | } |
| 5125 | 5131 | ||
| 5126 | static void vapic_exit(struct kvm_vcpu *vcpu) | 5132 | static void vapic_exit(struct kvm_vcpu *vcpu) |
| @@ -5427,7 +5433,11 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) | |||
| 5427 | } | 5433 | } |
| 5428 | 5434 | ||
| 5429 | vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); | 5435 | vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); |
| 5430 | vapic_enter(vcpu); | 5436 | r = vapic_enter(vcpu); |
| 5437 | if (r) { | ||
| 5438 | srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); | ||
| 5439 | return r; | ||
| 5440 | } | ||
| 5431 | 5441 | ||
| 5432 | r = 1; | 5442 | r = 1; |
| 5433 | while (r > 0) { | 5443 | while (r > 0) { |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index e0e6990723e9..ab1f6a93b527 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
| @@ -319,7 +319,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, | |||
| 319 | */ | 319 | */ |
| 320 | int devmem_is_allowed(unsigned long pagenr) | 320 | int devmem_is_allowed(unsigned long pagenr) |
| 321 | { | 321 | { |
| 322 | if (pagenr <= 256) | 322 | if (pagenr < 256) |
| 323 | return 1; | 323 | return 1; |
| 324 | if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) | 324 | if (iomem_is_exclusive(pagenr << PAGE_SHIFT)) |
| 325 | return 0; | 325 | return 0; |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index bf4bda6d3e9a..1fbe75a95f15 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include <linux/pci.h> | 31 | #include <linux/pci.h> |
| 32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
| 33 | #include <linux/memblock.h> | 33 | #include <linux/memblock.h> |
| 34 | #include <linux/syscore_ops.h> | ||
| 35 | 34 | ||
| 36 | #include <xen/xen.h> | 35 | #include <xen/xen.h> |
| 37 | #include <xen/interface/xen.h> | 36 | #include <xen/interface/xen.h> |
| @@ -1453,6 +1452,10 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1453 | pci_request_acs(); | 1452 | pci_request_acs(); |
| 1454 | 1453 | ||
| 1455 | xen_acpi_sleep_register(); | 1454 | xen_acpi_sleep_register(); |
| 1455 | |||
| 1456 | /* Avoid searching for BIOS MP tables */ | ||
| 1457 | x86_init.mpparse.find_smp_config = x86_init_noop; | ||
| 1458 | x86_init.mpparse.get_smp_config = x86_init_uint_noop; | ||
| 1456 | } | 1459 | } |
| 1457 | #ifdef CONFIG_PCI | 1460 | #ifdef CONFIG_PCI |
| 1458 | /* PCI BIOS service won't work from a PV guest. */ | 1461 | /* PCI BIOS service won't work from a PV guest. */ |
| @@ -1470,130 +1473,38 @@ asmlinkage void __init xen_start_kernel(void) | |||
| 1470 | #endif | 1473 | #endif |
| 1471 | } | 1474 | } |
| 1472 | 1475 | ||
| 1473 | #ifdef CONFIG_XEN_PVHVM | 1476 | void __ref xen_hvm_init_shared_info(void) |
| 1474 | /* | ||
| 1475 | * The pfn containing the shared_info is located somewhere in RAM. This | ||
| 1476 | * will cause trouble if the current kernel is doing a kexec boot into a | ||
| 1477 | * new kernel. The new kernel (and its startup code) can not know where | ||
| 1478 | * the pfn is, so it can not reserve the page. The hypervisor will | ||
| 1479 | * continue to update the pfn, and as a result memory corruption occours | ||
| 1480 | * in the new kernel. | ||
| 1481 | * | ||
| 1482 | * One way to work around this issue is to allocate a page in the | ||
| 1483 | * xen-platform pci device's BAR memory range. But pci init is done very | ||
| 1484 | * late and the shared_info page is already in use very early to read | ||
| 1485 | * the pvclock. So moving the pfn from RAM to MMIO is racy because some | ||
| 1486 | * code paths on other vcpus could access the pfn during the small | ||
| 1487 | * window when the old pfn is moved to the new pfn. There is even a | ||
| 1488 | * small window were the old pfn is not backed by a mfn, and during that | ||
| 1489 | * time all reads return -1. | ||
| 1490 | * | ||
| 1491 | * Because it is not known upfront where the MMIO region is located it | ||
| 1492 | * can not be used right from the start in xen_hvm_init_shared_info. | ||
| 1493 | * | ||
| 1494 | * To minimise trouble the move of the pfn is done shortly before kexec. | ||
| 1495 | * This does not eliminate the race because all vcpus are still online | ||
| 1496 | * when the syscore_ops will be called. But hopefully there is no work | ||
| 1497 | * pending at this point in time. Also the syscore_op is run last which | ||
| 1498 | * reduces the risk further. | ||
| 1499 | */ | ||
| 1500 | |||
| 1501 | static struct shared_info *xen_hvm_shared_info; | ||
| 1502 | |||
| 1503 | static void xen_hvm_connect_shared_info(unsigned long pfn) | ||
| 1504 | { | 1477 | { |
| 1478 | int cpu; | ||
| 1505 | struct xen_add_to_physmap xatp; | 1479 | struct xen_add_to_physmap xatp; |
| 1480 | static struct shared_info *shared_info_page = 0; | ||
| 1506 | 1481 | ||
| 1482 | if (!shared_info_page) | ||
| 1483 | shared_info_page = (struct shared_info *) | ||
| 1484 | extend_brk(PAGE_SIZE, PAGE_SIZE); | ||
| 1507 | xatp.domid = DOMID_SELF; | 1485 | xatp.domid = DOMID_SELF; |
| 1508 | xatp.idx = 0; | 1486 | xatp.idx = 0; |
| 1509 | xatp.space = XENMAPSPACE_shared_info; | 1487 | xatp.space = XENMAPSPACE_shared_info; |
| 1510 | xatp.gpfn = pfn; | 1488 | xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT; |
| 1511 | if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) | 1489 | if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) |
| 1512 | BUG(); | 1490 | BUG(); |
| 1513 | 1491 | ||
| 1514 | } | 1492 | HYPERVISOR_shared_info = (struct shared_info *)shared_info_page; |
| 1515 | static void xen_hvm_set_shared_info(struct shared_info *sip) | ||
| 1516 | { | ||
| 1517 | int cpu; | ||
| 1518 | |||
| 1519 | HYPERVISOR_shared_info = sip; | ||
| 1520 | 1493 | ||
| 1521 | /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info | 1494 | /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info |
| 1522 | * page, we use it in the event channel upcall and in some pvclock | 1495 | * page, we use it in the event channel upcall and in some pvclock |
| 1523 | * related functions. We don't need the vcpu_info placement | 1496 | * related functions. We don't need the vcpu_info placement |
| 1524 | * optimizations because we don't use any pv_mmu or pv_irq op on | 1497 | * optimizations because we don't use any pv_mmu or pv_irq op on |
| 1525 | * HVM. | 1498 | * HVM. |
| 1526 | * When xen_hvm_set_shared_info is run at boot time only vcpu 0 is | 1499 | * When xen_hvm_init_shared_info is run at boot time only vcpu 0 is |
| 1527 | * online but xen_hvm_set_shared_info is run at resume time too and | 1500 | * online but xen_hvm_init_shared_info is run at resume time too and |
| 1528 | * in that case multiple vcpus might be online. */ | 1501 | * in that case multiple vcpus might be online. */ |
| 1529 | for_each_online_cpu(cpu) { | 1502 | for_each_online_cpu(cpu) { |
| 1530 | per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; | 1503 | per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; |
| 1531 | } | 1504 | } |
| 1532 | } | 1505 | } |
| 1533 | 1506 | ||
| 1534 | /* Reconnect the shared_info pfn to a mfn */ | 1507 | #ifdef CONFIG_XEN_PVHVM |
| 1535 | void xen_hvm_resume_shared_info(void) | ||
| 1536 | { | ||
| 1537 | xen_hvm_connect_shared_info(__pa(xen_hvm_shared_info) >> PAGE_SHIFT); | ||
| 1538 | } | ||
| 1539 | |||
| 1540 | #ifdef CONFIG_KEXEC | ||
| 1541 | static struct shared_info *xen_hvm_shared_info_kexec; | ||
| 1542 | static unsigned long xen_hvm_shared_info_pfn_kexec; | ||
| 1543 | |||
| 1544 | /* Remember a pfn in MMIO space for kexec reboot */ | ||
| 1545 | void __devinit xen_hvm_prepare_kexec(struct shared_info *sip, unsigned long pfn) | ||
| 1546 | { | ||
| 1547 | xen_hvm_shared_info_kexec = sip; | ||
| 1548 | xen_hvm_shared_info_pfn_kexec = pfn; | ||
| 1549 | } | ||
| 1550 | |||
| 1551 | static void xen_hvm_syscore_shutdown(void) | ||
| 1552 | { | ||
| 1553 | struct xen_memory_reservation reservation = { | ||
| 1554 | .domid = DOMID_SELF, | ||
| 1555 | .nr_extents = 1, | ||
| 1556 | }; | ||
| 1557 | unsigned long prev_pfn; | ||
| 1558 | int rc; | ||
| 1559 | |||
| 1560 | if (!xen_hvm_shared_info_kexec) | ||
| 1561 | return; | ||
| 1562 | |||
| 1563 | prev_pfn = __pa(xen_hvm_shared_info) >> PAGE_SHIFT; | ||
| 1564 | set_xen_guest_handle(reservation.extent_start, &prev_pfn); | ||
| 1565 | |||
| 1566 | /* Move pfn to MMIO, disconnects previous pfn from mfn */ | ||
| 1567 | xen_hvm_connect_shared_info(xen_hvm_shared_info_pfn_kexec); | ||
| 1568 | |||
| 1569 | /* Update pointers, following hypercall is also a memory barrier */ | ||
| 1570 | xen_hvm_set_shared_info(xen_hvm_shared_info_kexec); | ||
| 1571 | |||
| 1572 | /* Allocate new mfn for previous pfn */ | ||
| 1573 | do { | ||
| 1574 | rc = HYPERVISOR_memory_op(XENMEM_populate_physmap, &reservation); | ||
| 1575 | if (rc == 0) | ||
| 1576 | msleep(123); | ||
| 1577 | } while (rc == 0); | ||
| 1578 | |||
| 1579 | /* Make sure the previous pfn is really connected to a (new) mfn */ | ||
| 1580 | BUG_ON(rc != 1); | ||
| 1581 | } | ||
| 1582 | |||
| 1583 | static struct syscore_ops xen_hvm_syscore_ops = { | ||
| 1584 | .shutdown = xen_hvm_syscore_shutdown, | ||
| 1585 | }; | ||
| 1586 | #endif | ||
| 1587 | |||
| 1588 | /* Use a pfn in RAM, may move to MMIO before kexec. */ | ||
| 1589 | static void __init xen_hvm_init_shared_info(void) | ||
| 1590 | { | ||
| 1591 | /* Remember pointer for resume */ | ||
| 1592 | xen_hvm_shared_info = extend_brk(PAGE_SIZE, PAGE_SIZE); | ||
| 1593 | xen_hvm_connect_shared_info(__pa(xen_hvm_shared_info) >> PAGE_SHIFT); | ||
| 1594 | xen_hvm_set_shared_info(xen_hvm_shared_info); | ||
| 1595 | } | ||
| 1596 | |||
| 1597 | static void __init init_hvm_pv_info(void) | 1508 | static void __init init_hvm_pv_info(void) |
| 1598 | { | 1509 | { |
| 1599 | int major, minor; | 1510 | int major, minor; |
| @@ -1644,9 +1555,6 @@ static void __init xen_hvm_guest_init(void) | |||
| 1644 | init_hvm_pv_info(); | 1555 | init_hvm_pv_info(); |
| 1645 | 1556 | ||
| 1646 | xen_hvm_init_shared_info(); | 1557 | xen_hvm_init_shared_info(); |
| 1647 | #ifdef CONFIG_KEXEC | ||
| 1648 | register_syscore_ops(&xen_hvm_syscore_ops); | ||
| 1649 | #endif | ||
| 1650 | 1558 | ||
| 1651 | if (xen_feature(XENFEAT_hvm_callback_vector)) | 1559 | if (xen_feature(XENFEAT_hvm_callback_vector)) |
| 1652 | xen_have_vector_callback = 1; | 1560 | xen_have_vector_callback = 1; |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index b65a76133f4f..5141d808e751 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1283,7 +1283,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, | |||
| 1283 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); | 1283 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); |
| 1284 | 1284 | ||
| 1285 | args->op.cmd = MMUEXT_TLB_FLUSH_MULTI; | 1285 | args->op.cmd = MMUEXT_TLB_FLUSH_MULTI; |
| 1286 | if (start != TLB_FLUSH_ALL && (end - start) <= PAGE_SIZE) { | 1286 | if (end != TLB_FLUSH_ALL && (end - start) <= PAGE_SIZE) { |
| 1287 | args->op.cmd = MMUEXT_INVLPG_MULTI; | 1287 | args->op.cmd = MMUEXT_INVLPG_MULTI; |
| 1288 | args->op.arg1.linear_addr = start; | 1288 | args->op.arg1.linear_addr = start; |
| 1289 | } | 1289 | } |
diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index b2e91d40a4cb..72213da605f5 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c | |||
| @@ -196,9 +196,11 @@ RESERVE_BRK(p2m_mid_identity, PAGE_SIZE * 2 * 3); | |||
| 196 | 196 | ||
| 197 | /* When we populate back during bootup, the amount of pages can vary. The | 197 | /* When we populate back during bootup, the amount of pages can vary. The |
| 198 | * max we have is seen is 395979, but that does not mean it can't be more. | 198 | * max we have is seen is 395979, but that does not mean it can't be more. |
| 199 | * But some machines can have 3GB I/O holes even. So lets reserve enough | 199 | * Some machines can have 3GB I/O holes even. With early_can_reuse_p2m_middle |
| 200 | * for 4GB of I/O and E820 holes. */ | 200 | * it can re-use Xen provided mfn_list array, so we only need to allocate at |
| 201 | RESERVE_BRK(p2m_populated, PMD_SIZE * 4); | 201 | * most three P2M top nodes. */ |
| 202 | RESERVE_BRK(p2m_populated, PAGE_SIZE * 3); | ||
| 203 | |||
| 202 | static inline unsigned p2m_top_index(unsigned long pfn) | 204 | static inline unsigned p2m_top_index(unsigned long pfn) |
| 203 | { | 205 | { |
| 204 | BUG_ON(pfn >= MAX_P2M_PFN); | 206 | BUG_ON(pfn >= MAX_P2M_PFN); |
| @@ -575,12 +577,99 @@ static bool __init early_alloc_p2m(unsigned long pfn) | |||
| 575 | } | 577 | } |
| 576 | return true; | 578 | return true; |
| 577 | } | 579 | } |
| 580 | |||
| 581 | /* | ||
| 582 | * Skim over the P2M tree looking at pages that are either filled with | ||
| 583 | * INVALID_P2M_ENTRY or with 1:1 PFNs. If found, re-use that page and | ||
| 584 | * replace the P2M leaf with a p2m_missing or p2m_identity. | ||
| 585 | * Stick the old page in the new P2M tree location. | ||
| 586 | */ | ||
| 587 | bool __init early_can_reuse_p2m_middle(unsigned long set_pfn, unsigned long set_mfn) | ||
| 588 | { | ||
| 589 | unsigned topidx; | ||
| 590 | unsigned mididx; | ||
| 591 | unsigned ident_pfns; | ||
| 592 | unsigned inv_pfns; | ||
| 593 | unsigned long *p2m; | ||
| 594 | unsigned long *mid_mfn_p; | ||
| 595 | unsigned idx; | ||
| 596 | unsigned long pfn; | ||
| 597 | |||
| 598 | /* We only look when this entails a P2M middle layer */ | ||
| 599 | if (p2m_index(set_pfn)) | ||
| 600 | return false; | ||
| 601 | |||
| 602 | for (pfn = 0; pfn < MAX_DOMAIN_PAGES; pfn += P2M_PER_PAGE) { | ||
| 603 | topidx = p2m_top_index(pfn); | ||
| 604 | |||
| 605 | if (!p2m_top[topidx]) | ||
| 606 | continue; | ||
| 607 | |||
| 608 | if (p2m_top[topidx] == p2m_mid_missing) | ||
| 609 | continue; | ||
| 610 | |||
| 611 | mididx = p2m_mid_index(pfn); | ||
| 612 | p2m = p2m_top[topidx][mididx]; | ||
| 613 | if (!p2m) | ||
| 614 | continue; | ||
| 615 | |||
| 616 | if ((p2m == p2m_missing) || (p2m == p2m_identity)) | ||
| 617 | continue; | ||
| 618 | |||
| 619 | if ((unsigned long)p2m == INVALID_P2M_ENTRY) | ||
| 620 | continue; | ||
| 621 | |||
| 622 | ident_pfns = 0; | ||
| 623 | inv_pfns = 0; | ||
| 624 | for (idx = 0; idx < P2M_PER_PAGE; idx++) { | ||
| 625 | /* IDENTITY_PFNs are 1:1 */ | ||
| 626 | if (p2m[idx] == IDENTITY_FRAME(pfn + idx)) | ||
| 627 | ident_pfns++; | ||
| 628 | else if (p2m[idx] == INVALID_P2M_ENTRY) | ||
| 629 | inv_pfns++; | ||
| 630 | else | ||
| 631 | break; | ||
| 632 | } | ||
| 633 | if ((ident_pfns == P2M_PER_PAGE) || (inv_pfns == P2M_PER_PAGE)) | ||
| 634 | goto found; | ||
| 635 | } | ||
| 636 | return false; | ||
| 637 | found: | ||
| 638 | /* Found one, replace old with p2m_identity or p2m_missing */ | ||
| 639 | p2m_top[topidx][mididx] = (ident_pfns ? p2m_identity : p2m_missing); | ||
| 640 | /* And the other for save/restore.. */ | ||
| 641 | mid_mfn_p = p2m_top_mfn_p[topidx]; | ||
| 642 | /* NOTE: Even if it is a p2m_identity it should still be point to | ||
| 643 | * a page filled with INVALID_P2M_ENTRY entries. */ | ||
| 644 | mid_mfn_p[mididx] = virt_to_mfn(p2m_missing); | ||
| 645 | |||
| 646 | /* Reset where we want to stick the old page in. */ | ||
| 647 | topidx = p2m_top_index(set_pfn); | ||
| 648 | mididx = p2m_mid_index(set_pfn); | ||
| 649 | |||
| 650 | /* This shouldn't happen */ | ||
| 651 | if (WARN_ON(p2m_top[topidx] == p2m_mid_missing)) | ||
| 652 | early_alloc_p2m(set_pfn); | ||
| 653 | |||
| 654 | if (WARN_ON(p2m_top[topidx][mididx] != p2m_missing)) | ||
| 655 | return false; | ||
| 656 | |||
| 657 | p2m_init(p2m); | ||
| 658 | p2m_top[topidx][mididx] = p2m; | ||
| 659 | mid_mfn_p = p2m_top_mfn_p[topidx]; | ||
| 660 | mid_mfn_p[mididx] = virt_to_mfn(p2m); | ||
| 661 | |||
| 662 | return true; | ||
| 663 | } | ||
| 578 | bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn) | 664 | bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn) |
| 579 | { | 665 | { |
| 580 | if (unlikely(!__set_phys_to_machine(pfn, mfn))) { | 666 | if (unlikely(!__set_phys_to_machine(pfn, mfn))) { |
| 581 | if (!early_alloc_p2m(pfn)) | 667 | if (!early_alloc_p2m(pfn)) |
| 582 | return false; | 668 | return false; |
| 583 | 669 | ||
| 670 | if (early_can_reuse_p2m_middle(pfn, mfn)) | ||
| 671 | return __set_phys_to_machine(pfn, mfn); | ||
| 672 | |||
| 584 | if (!early_alloc_p2m_middle(pfn, false /* boundary crossover OK!*/)) | 673 | if (!early_alloc_p2m_middle(pfn, false /* boundary crossover OK!*/)) |
| 585 | return false; | 674 | return false; |
| 586 | 675 | ||
| @@ -739,9 +828,6 @@ int m2p_add_override(unsigned long mfn, struct page *page, | |||
| 739 | 828 | ||
| 740 | xen_mc_issue(PARAVIRT_LAZY_MMU); | 829 | xen_mc_issue(PARAVIRT_LAZY_MMU); |
| 741 | } | 830 | } |
| 742 | /* let's use dev_bus_addr to record the old mfn instead */ | ||
| 743 | kmap_op->dev_bus_addr = page->index; | ||
| 744 | page->index = (unsigned long) kmap_op; | ||
| 745 | } | 831 | } |
| 746 | spin_lock_irqsave(&m2p_override_lock, flags); | 832 | spin_lock_irqsave(&m2p_override_lock, flags); |
| 747 | list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]); | 833 | list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]); |
| @@ -768,7 +854,8 @@ int m2p_add_override(unsigned long mfn, struct page *page, | |||
| 768 | return 0; | 854 | return 0; |
| 769 | } | 855 | } |
| 770 | EXPORT_SYMBOL_GPL(m2p_add_override); | 856 | EXPORT_SYMBOL_GPL(m2p_add_override); |
| 771 | int m2p_remove_override(struct page *page, bool clear_pte) | 857 | int m2p_remove_override(struct page *page, |
| 858 | struct gnttab_map_grant_ref *kmap_op) | ||
| 772 | { | 859 | { |
| 773 | unsigned long flags; | 860 | unsigned long flags; |
| 774 | unsigned long mfn; | 861 | unsigned long mfn; |
| @@ -798,10 +885,8 @@ int m2p_remove_override(struct page *page, bool clear_pte) | |||
| 798 | WARN_ON(!PagePrivate(page)); | 885 | WARN_ON(!PagePrivate(page)); |
| 799 | ClearPagePrivate(page); | 886 | ClearPagePrivate(page); |
| 800 | 887 | ||
| 801 | if (clear_pte) { | 888 | set_phys_to_machine(pfn, page->index); |
| 802 | struct gnttab_map_grant_ref *map_op = | 889 | if (kmap_op != NULL) { |
| 803 | (struct gnttab_map_grant_ref *) page->index; | ||
| 804 | set_phys_to_machine(pfn, map_op->dev_bus_addr); | ||
| 805 | if (!PageHighMem(page)) { | 890 | if (!PageHighMem(page)) { |
| 806 | struct multicall_space mcs; | 891 | struct multicall_space mcs; |
| 807 | struct gnttab_unmap_grant_ref *unmap_op; | 892 | struct gnttab_unmap_grant_ref *unmap_op; |
| @@ -813,13 +898,13 @@ int m2p_remove_override(struct page *page, bool clear_pte) | |||
| 813 | * issued. In this case handle is going to -1 because | 898 | * issued. In this case handle is going to -1 because |
| 814 | * it hasn't been modified yet. | 899 | * it hasn't been modified yet. |
| 815 | */ | 900 | */ |
| 816 | if (map_op->handle == -1) | 901 | if (kmap_op->handle == -1) |
| 817 | xen_mc_flush(); | 902 | xen_mc_flush(); |
| 818 | /* | 903 | /* |
| 819 | * Now if map_op->handle is negative it means that the | 904 | * Now if kmap_op->handle is negative it means that the |
| 820 | * hypercall actually returned an error. | 905 | * hypercall actually returned an error. |
| 821 | */ | 906 | */ |
| 822 | if (map_op->handle == GNTST_general_error) { | 907 | if (kmap_op->handle == GNTST_general_error) { |
| 823 | printk(KERN_WARNING "m2p_remove_override: " | 908 | printk(KERN_WARNING "m2p_remove_override: " |
| 824 | "pfn %lx mfn %lx, failed to modify kernel mappings", | 909 | "pfn %lx mfn %lx, failed to modify kernel mappings", |
| 825 | pfn, mfn); | 910 | pfn, mfn); |
| @@ -829,8 +914,8 @@ int m2p_remove_override(struct page *page, bool clear_pte) | |||
| 829 | mcs = xen_mc_entry( | 914 | mcs = xen_mc_entry( |
| 830 | sizeof(struct gnttab_unmap_grant_ref)); | 915 | sizeof(struct gnttab_unmap_grant_ref)); |
| 831 | unmap_op = mcs.args; | 916 | unmap_op = mcs.args; |
| 832 | unmap_op->host_addr = map_op->host_addr; | 917 | unmap_op->host_addr = kmap_op->host_addr; |
| 833 | unmap_op->handle = map_op->handle; | 918 | unmap_op->handle = kmap_op->handle; |
| 834 | unmap_op->dev_bus_addr = 0; | 919 | unmap_op->dev_bus_addr = 0; |
| 835 | 920 | ||
| 836 | MULTI_grant_table_op(mcs.mc, | 921 | MULTI_grant_table_op(mcs.mc, |
| @@ -841,10 +926,9 @@ int m2p_remove_override(struct page *page, bool clear_pte) | |||
| 841 | set_pte_at(&init_mm, address, ptep, | 926 | set_pte_at(&init_mm, address, ptep, |
| 842 | pfn_pte(pfn, PAGE_KERNEL)); | 927 | pfn_pte(pfn, PAGE_KERNEL)); |
| 843 | __flush_tlb_single(address); | 928 | __flush_tlb_single(address); |
| 844 | map_op->host_addr = 0; | 929 | kmap_op->host_addr = 0; |
| 845 | } | 930 | } |
| 846 | } else | 931 | } |
| 847 | set_phys_to_machine(pfn, page->index); | ||
| 848 | 932 | ||
| 849 | /* p2m(m2p(mfn)) == FOREIGN_FRAME(mfn): the mfn is already present | 933 | /* p2m(m2p(mfn)) == FOREIGN_FRAME(mfn): the mfn is already present |
| 850 | * somewhere in this domain, even before being added to the | 934 | * somewhere in this domain, even before being added to the |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index ead85576d54a..d11ca11d14fc 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
| @@ -78,9 +78,16 @@ static void __init xen_add_extra_mem(u64 start, u64 size) | |||
| 78 | memblock_reserve(start, size); | 78 | memblock_reserve(start, size); |
| 79 | 79 | ||
| 80 | xen_max_p2m_pfn = PFN_DOWN(start + size); | 80 | xen_max_p2m_pfn = PFN_DOWN(start + size); |
| 81 | for (pfn = PFN_DOWN(start); pfn < xen_max_p2m_pfn; pfn++) { | ||
| 82 | unsigned long mfn = pfn_to_mfn(pfn); | ||
| 83 | |||
| 84 | if (WARN(mfn == pfn, "Trying to over-write 1-1 mapping (pfn: %lx)\n", pfn)) | ||
| 85 | continue; | ||
| 86 | WARN(mfn != INVALID_P2M_ENTRY, "Trying to remove %lx which has %lx mfn!\n", | ||
| 87 | pfn, mfn); | ||
| 81 | 88 | ||
| 82 | for (pfn = PFN_DOWN(start); pfn <= xen_max_p2m_pfn; pfn++) | ||
| 83 | __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); | 89 | __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); |
| 90 | } | ||
| 84 | } | 91 | } |
| 85 | 92 | ||
| 86 | static unsigned long __init xen_do_chunk(unsigned long start, | 93 | static unsigned long __init xen_do_chunk(unsigned long start, |
diff --git a/arch/x86/xen/suspend.c b/arch/x86/xen/suspend.c index ae8a00c39de4..45329c8c226e 100644 --- a/arch/x86/xen/suspend.c +++ b/arch/x86/xen/suspend.c | |||
| @@ -30,7 +30,7 @@ void xen_arch_hvm_post_suspend(int suspend_cancelled) | |||
| 30 | { | 30 | { |
| 31 | #ifdef CONFIG_XEN_PVHVM | 31 | #ifdef CONFIG_XEN_PVHVM |
| 32 | int cpu; | 32 | int cpu; |
| 33 | xen_hvm_resume_shared_info(); | 33 | xen_hvm_init_shared_info(); |
| 34 | xen_callback_vector(); | 34 | xen_callback_vector(); |
| 35 | xen_unplug_emulated_devices(); | 35 | xen_unplug_emulated_devices(); |
| 36 | if (xen_feature(XENFEAT_hvm_safe_pvclock)) { | 36 | if (xen_feature(XENFEAT_hvm_safe_pvclock)) { |
diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index 1e4329e04e0f..202d4c150154 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h | |||
| @@ -41,7 +41,7 @@ void xen_enable_syscall(void); | |||
| 41 | void xen_vcpu_restore(void); | 41 | void xen_vcpu_restore(void); |
| 42 | 42 | ||
| 43 | void xen_callback_vector(void); | 43 | void xen_callback_vector(void); |
| 44 | void xen_hvm_resume_shared_info(void); | 44 | void xen_hvm_init_shared_info(void); |
| 45 | void xen_unplug_emulated_devices(void); | 45 | void xen_unplug_emulated_devices(void); |
| 46 | 46 | ||
| 47 | void __init xen_build_dynamic_phys_to_machine(void); | 47 | void __init xen_build_dynamic_phys_to_machine(void); |
diff --git a/block/blk-core.c b/block/blk-core.c index 4b4dbdfbca89..ee3cb3a5e278 100644 --- a/block/blk-core.c +++ b/block/blk-core.c | |||
| @@ -2254,9 +2254,11 @@ bool blk_update_request(struct request *req, int error, unsigned int nr_bytes) | |||
| 2254 | error_type = "I/O"; | 2254 | error_type = "I/O"; |
| 2255 | break; | 2255 | break; |
| 2256 | } | 2256 | } |
| 2257 | printk(KERN_ERR "end_request: %s error, dev %s, sector %llu\n", | 2257 | printk_ratelimited(KERN_ERR "end_request: %s error, dev %s, sector %llu\n", |
| 2258 | error_type, req->rq_disk ? req->rq_disk->disk_name : "?", | 2258 | error_type, req->rq_disk ? |
| 2259 | (unsigned long long)blk_rq_pos(req)); | 2259 | req->rq_disk->disk_name : "?", |
| 2260 | (unsigned long long)blk_rq_pos(req)); | ||
| 2261 | |||
| 2260 | } | 2262 | } |
| 2261 | 2263 | ||
| 2262 | blk_account_io_completion(req, nr_bytes); | 2264 | blk_account_io_completion(req, nr_bytes); |
diff --git a/block/blk-lib.c b/block/blk-lib.c index 2b461b496a78..19cc761cacb2 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c | |||
| @@ -44,6 +44,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
| 44 | struct request_queue *q = bdev_get_queue(bdev); | 44 | struct request_queue *q = bdev_get_queue(bdev); |
| 45 | int type = REQ_WRITE | REQ_DISCARD; | 45 | int type = REQ_WRITE | REQ_DISCARD; |
| 46 | unsigned int max_discard_sectors; | 46 | unsigned int max_discard_sectors; |
| 47 | unsigned int granularity, alignment, mask; | ||
| 47 | struct bio_batch bb; | 48 | struct bio_batch bb; |
| 48 | struct bio *bio; | 49 | struct bio *bio; |
| 49 | int ret = 0; | 50 | int ret = 0; |
| @@ -54,18 +55,20 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
| 54 | if (!blk_queue_discard(q)) | 55 | if (!blk_queue_discard(q)) |
| 55 | return -EOPNOTSUPP; | 56 | return -EOPNOTSUPP; |
| 56 | 57 | ||
| 58 | /* Zero-sector (unknown) and one-sector granularities are the same. */ | ||
| 59 | granularity = max(q->limits.discard_granularity >> 9, 1U); | ||
| 60 | mask = granularity - 1; | ||
| 61 | alignment = (bdev_discard_alignment(bdev) >> 9) & mask; | ||
| 62 | |||
| 57 | /* | 63 | /* |
| 58 | * Ensure that max_discard_sectors is of the proper | 64 | * Ensure that max_discard_sectors is of the proper |
| 59 | * granularity | 65 | * granularity, so that requests stay aligned after a split. |
| 60 | */ | 66 | */ |
| 61 | max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9); | 67 | max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9); |
| 68 | max_discard_sectors = round_down(max_discard_sectors, granularity); | ||
| 62 | if (unlikely(!max_discard_sectors)) { | 69 | if (unlikely(!max_discard_sectors)) { |
| 63 | /* Avoid infinite loop below. Being cautious never hurts. */ | 70 | /* Avoid infinite loop below. Being cautious never hurts. */ |
| 64 | return -EOPNOTSUPP; | 71 | return -EOPNOTSUPP; |
| 65 | } else if (q->limits.discard_granularity) { | ||
| 66 | unsigned int disc_sects = q->limits.discard_granularity >> 9; | ||
| 67 | |||
| 68 | max_discard_sectors &= ~(disc_sects - 1); | ||
| 69 | } | 72 | } |
| 70 | 73 | ||
| 71 | if (flags & BLKDEV_DISCARD_SECURE) { | 74 | if (flags & BLKDEV_DISCARD_SECURE) { |
| @@ -79,25 +82,37 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, | |||
| 79 | bb.wait = &wait; | 82 | bb.wait = &wait; |
| 80 | 83 | ||
| 81 | while (nr_sects) { | 84 | while (nr_sects) { |
| 85 | unsigned int req_sects; | ||
| 86 | sector_t end_sect; | ||
| 87 | |||
| 82 | bio = bio_alloc(gfp_mask, 1); | 88 | bio = bio_alloc(gfp_mask, 1); |
| 83 | if (!bio) { | 89 | if (!bio) { |
| 84 | ret = -ENOMEM; | 90 | ret = -ENOMEM; |
| 85 | break; | 91 | break; |
| 86 | } | 92 | } |
| 87 | 93 | ||
| 94 | req_sects = min_t(sector_t, nr_sects, max_discard_sectors); | ||
| 95 | |||
| 96 | /* | ||
| 97 | * If splitting a request, and the next starting sector would be | ||
| 98 | * misaligned, stop the discard at the previous aligned sector. | ||
| 99 | */ | ||
| 100 | end_sect = sector + req_sects; | ||
| 101 | if (req_sects < nr_sects && (end_sect & mask) != alignment) { | ||
| 102 | end_sect = | ||
| 103 | round_down(end_sect - alignment, granularity) | ||
| 104 | + alignment; | ||
| 105 | req_sects = end_sect - sector; | ||
| 106 | } | ||
| 107 | |||
| 88 | bio->bi_sector = sector; | 108 | bio->bi_sector = sector; |
| 89 | bio->bi_end_io = bio_batch_end_io; | 109 | bio->bi_end_io = bio_batch_end_io; |
| 90 | bio->bi_bdev = bdev; | 110 | bio->bi_bdev = bdev; |
| 91 | bio->bi_private = &bb; | 111 | bio->bi_private = &bb; |
| 92 | 112 | ||
| 93 | if (nr_sects > max_discard_sectors) { | 113 | bio->bi_size = req_sects << 9; |
| 94 | bio->bi_size = max_discard_sectors << 9; | 114 | nr_sects -= req_sects; |
| 95 | nr_sects -= max_discard_sectors; | 115 | sector = end_sect; |
| 96 | sector += max_discard_sectors; | ||
| 97 | } else { | ||
| 98 | bio->bi_size = nr_sects << 9; | ||
| 99 | nr_sects = 0; | ||
| 100 | } | ||
| 101 | 116 | ||
| 102 | atomic_inc(&bb.done); | 117 | atomic_inc(&bb.done); |
| 103 | submit_bio(type, bio); | 118 | submit_bio(type, bio); |
diff --git a/block/blk-merge.c b/block/blk-merge.c index 160035f54882..e76279e41162 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c | |||
| @@ -110,6 +110,49 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio, | |||
| 110 | return 0; | 110 | return 0; |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | static void | ||
| 114 | __blk_segment_map_sg(struct request_queue *q, struct bio_vec *bvec, | ||
| 115 | struct scatterlist *sglist, struct bio_vec **bvprv, | ||
| 116 | struct scatterlist **sg, int *nsegs, int *cluster) | ||
| 117 | { | ||
| 118 | |||
| 119 | int nbytes = bvec->bv_len; | ||
| 120 | |||
| 121 | if (*bvprv && *cluster) { | ||
| 122 | if ((*sg)->length + nbytes > queue_max_segment_size(q)) | ||
| 123 | goto new_segment; | ||
| 124 | |||
| 125 | if (!BIOVEC_PHYS_MERGEABLE(*bvprv, bvec)) | ||
| 126 | goto new_segment; | ||
| 127 | if (!BIOVEC_SEG_BOUNDARY(q, *bvprv, bvec)) | ||
| 128 | goto new_segment; | ||
| 129 | |||
| 130 | (*sg)->length += nbytes; | ||
| 131 | } else { | ||
| 132 | new_segment: | ||
| 133 | if (!*sg) | ||
| 134 | *sg = sglist; | ||
| 135 | else { | ||
| 136 | /* | ||
| 137 | * If the driver previously mapped a shorter | ||
| 138 | * list, we could see a termination bit | ||
| 139 | * prematurely unless it fully inits the sg | ||
| 140 | * table on each mapping. We KNOW that there | ||
| 141 | * must be more entries here or the driver | ||
| 142 | * would be buggy, so force clear the | ||
| 143 | * termination bit to avoid doing a full | ||
| 144 | * sg_init_table() in drivers for each command. | ||
| 145 | */ | ||
| 146 | (*sg)->page_link &= ~0x02; | ||
| 147 | *sg = sg_next(*sg); | ||
| 148 | } | ||
| 149 | |||
| 150 | sg_set_page(*sg, bvec->bv_page, nbytes, bvec->bv_offset); | ||
| 151 | (*nsegs)++; | ||
| 152 | } | ||
| 153 | *bvprv = bvec; | ||
| 154 | } | ||
| 155 | |||
| 113 | /* | 156 | /* |
| 114 | * map a request to scatterlist, return number of sg entries setup. Caller | 157 | * map a request to scatterlist, return number of sg entries setup. Caller |
| 115 | * must make sure sg can hold rq->nr_phys_segments entries | 158 | * must make sure sg can hold rq->nr_phys_segments entries |
| @@ -131,41 +174,8 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq, | |||
| 131 | bvprv = NULL; | 174 | bvprv = NULL; |
| 132 | sg = NULL; | 175 | sg = NULL; |
| 133 | rq_for_each_segment(bvec, rq, iter) { | 176 | rq_for_each_segment(bvec, rq, iter) { |
| 134 | int nbytes = bvec->bv_len; | 177 | __blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg, |
| 135 | 178 | &nsegs, &cluster); | |
| 136 | if (bvprv && cluster) { | ||
| 137 | if (sg->length + nbytes > queue_max_segment_size(q)) | ||
| 138 | goto new_segment; | ||
| 139 | |||
| 140 | if (!BIOVEC_PHYS_MERGEABLE(bvprv, bvec)) | ||
| 141 | goto new_segment; | ||
| 142 | if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec)) | ||
| 143 | goto new_segment; | ||
| 144 | |||
| 145 | sg->length += nbytes; | ||
| 146 | } else { | ||
| 147 | new_segment: | ||
| 148 | if (!sg) | ||
| 149 | sg = sglist; | ||
| 150 | else { | ||
| 151 | /* | ||
| 152 | * If the driver previously mapped a shorter | ||
| 153 | * list, we could see a termination bit | ||
| 154 | * prematurely unless it fully inits the sg | ||
| 155 | * table on each mapping. We KNOW that there | ||
| 156 | * must be more entries here or the driver | ||
| 157 | * would be buggy, so force clear the | ||
| 158 | * termination bit to avoid doing a full | ||
| 159 | * sg_init_table() in drivers for each command. | ||
| 160 | */ | ||
| 161 | sg->page_link &= ~0x02; | ||
| 162 | sg = sg_next(sg); | ||
| 163 | } | ||
| 164 | |||
| 165 | sg_set_page(sg, bvec->bv_page, nbytes, bvec->bv_offset); | ||
| 166 | nsegs++; | ||
| 167 | } | ||
| 168 | bvprv = bvec; | ||
| 169 | } /* segments in rq */ | 179 | } /* segments in rq */ |
| 170 | 180 | ||
| 171 | 181 | ||
| @@ -199,6 +209,43 @@ new_segment: | |||
| 199 | } | 209 | } |
| 200 | EXPORT_SYMBOL(blk_rq_map_sg); | 210 | EXPORT_SYMBOL(blk_rq_map_sg); |
| 201 | 211 | ||
| 212 | /** | ||
| 213 | * blk_bio_map_sg - map a bio to a scatterlist | ||
| 214 | * @q: request_queue in question | ||
| 215 | * @bio: bio being mapped | ||
| 216 | * @sglist: scatterlist being mapped | ||
| 217 | * | ||
| 218 | * Note: | ||
| 219 | * Caller must make sure sg can hold bio->bi_phys_segments entries | ||
| 220 | * | ||
| 221 | * Will return the number of sg entries setup | ||
| 222 | */ | ||
| 223 | int blk_bio_map_sg(struct request_queue *q, struct bio *bio, | ||
| 224 | struct scatterlist *sglist) | ||
| 225 | { | ||
| 226 | struct bio_vec *bvec, *bvprv; | ||
| 227 | struct scatterlist *sg; | ||
| 228 | int nsegs, cluster; | ||
| 229 | unsigned long i; | ||
| 230 | |||
| 231 | nsegs = 0; | ||
| 232 | cluster = blk_queue_cluster(q); | ||
| 233 | |||
| 234 | bvprv = NULL; | ||
| 235 | sg = NULL; | ||
| 236 | bio_for_each_segment(bvec, bio, i) { | ||
| 237 | __blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg, | ||
| 238 | &nsegs, &cluster); | ||
| 239 | } /* segments in bio */ | ||
| 240 | |||
| 241 | if (sg) | ||
| 242 | sg_mark_end(sg); | ||
| 243 | |||
| 244 | BUG_ON(bio->bi_phys_segments && nsegs > bio->bi_phys_segments); | ||
| 245 | return nsegs; | ||
| 246 | } | ||
| 247 | EXPORT_SYMBOL(blk_bio_map_sg); | ||
| 248 | |||
| 202 | static inline int ll_new_hw_segment(struct request_queue *q, | 249 | static inline int ll_new_hw_segment(struct request_queue *q, |
| 203 | struct request *req, | 250 | struct request *req, |
| 204 | struct bio *bio) | 251 | struct bio *bio) |
diff --git a/block/genhd.c b/block/genhd.c index cac7366957c3..d839723303c8 100644 --- a/block/genhd.c +++ b/block/genhd.c | |||
| @@ -835,7 +835,7 @@ static void disk_seqf_stop(struct seq_file *seqf, void *v) | |||
| 835 | 835 | ||
| 836 | static void *show_partition_start(struct seq_file *seqf, loff_t *pos) | 836 | static void *show_partition_start(struct seq_file *seqf, loff_t *pos) |
| 837 | { | 837 | { |
| 838 | static void *p; | 838 | void *p; |
| 839 | 839 | ||
| 840 | p = disk_seqf_start(seqf, pos); | 840 | p = disk_seqf_start(seqf, pos); |
| 841 | if (!IS_ERR_OR_NULL(p) && !*pos) | 841 | if (!IS_ERR_OR_NULL(p) && !*pos) |
diff --git a/block/ioctl.c b/block/ioctl.c index 4476e0e85d16..4a85096f5410 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
| @@ -41,7 +41,7 @@ static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user | |||
| 41 | sizeof(long long) > sizeof(long)) { | 41 | sizeof(long long) > sizeof(long)) { |
| 42 | long pstart = start, plength = length; | 42 | long pstart = start, plength = length; |
| 43 | if (pstart != start || plength != length | 43 | if (pstart != start || plength != length |
| 44 | || pstart < 0 || plength < 0) | 44 | || pstart < 0 || plength < 0 || partno > 65535) |
| 45 | return -EINVAL; | 45 | return -EINVAL; |
| 46 | } | 46 | } |
| 47 | 47 | ||
diff --git a/crypto/authenc.c b/crypto/authenc.c index 5ef7ba6b6a76..d0583a4489e6 100644 --- a/crypto/authenc.c +++ b/crypto/authenc.c | |||
| @@ -336,7 +336,7 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv, | |||
| 336 | cryptlen += ivsize; | 336 | cryptlen += ivsize; |
| 337 | } | 337 | } |
| 338 | 338 | ||
| 339 | if (sg_is_last(assoc)) { | 339 | if (req->assoclen && sg_is_last(assoc)) { |
| 340 | authenc_ahash_fn = crypto_authenc_ahash; | 340 | authenc_ahash_fn = crypto_authenc_ahash; |
| 341 | sg_init_table(asg, 2); | 341 | sg_init_table(asg, 2); |
| 342 | sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset); | 342 | sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset); |
| @@ -490,7 +490,7 @@ static int crypto_authenc_iverify(struct aead_request *req, u8 *iv, | |||
| 490 | cryptlen += ivsize; | 490 | cryptlen += ivsize; |
| 491 | } | 491 | } |
| 492 | 492 | ||
| 493 | if (sg_is_last(assoc)) { | 493 | if (req->assoclen && sg_is_last(assoc)) { |
| 494 | authenc_ahash_fn = crypto_authenc_ahash; | 494 | authenc_ahash_fn = crypto_authenc_ahash; |
| 495 | sg_init_table(asg, 2); | 495 | sg_init_table(asg, 2); |
| 496 | sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset); | 496 | sg_set_page(asg, sg_page(assoc), assoc->length, assoc->offset); |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 9628652e080c..e0596954290b 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
| @@ -237,6 +237,16 @@ static int __acpi_bus_get_power(struct acpi_device *device, int *state) | |||
| 237 | } else if (result == ACPI_STATE_D3_HOT) { | 237 | } else if (result == ACPI_STATE_D3_HOT) { |
| 238 | result = ACPI_STATE_D3; | 238 | result = ACPI_STATE_D3; |
| 239 | } | 239 | } |
| 240 | |||
| 241 | /* | ||
| 242 | * If we were unsure about the device parent's power state up to this | ||
| 243 | * point, the fact that the device is in D0 implies that the parent has | ||
| 244 | * to be in D0 too. | ||
| 245 | */ | ||
| 246 | if (device->parent && device->parent->power.state == ACPI_STATE_UNKNOWN | ||
| 247 | && result == ACPI_STATE_D0) | ||
| 248 | device->parent->power.state = ACPI_STATE_D0; | ||
| 249 | |||
| 240 | *state = result; | 250 | *state = result; |
| 241 | 251 | ||
| 242 | out: | 252 | out: |
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c index fc1803414629..40e38a06ba85 100644 --- a/drivers/acpi/power.c +++ b/drivers/acpi/power.c | |||
| @@ -107,6 +107,7 @@ struct acpi_power_resource { | |||
| 107 | 107 | ||
| 108 | /* List of devices relying on this power resource */ | 108 | /* List of devices relying on this power resource */ |
| 109 | struct acpi_power_resource_device *devices; | 109 | struct acpi_power_resource_device *devices; |
| 110 | struct mutex devices_lock; | ||
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | static struct list_head acpi_power_resource_list; | 113 | static struct list_head acpi_power_resource_list; |
| @@ -225,7 +226,6 @@ static void acpi_power_on_device(struct acpi_power_managed_device *device) | |||
| 225 | 226 | ||
| 226 | static int __acpi_power_on(struct acpi_power_resource *resource) | 227 | static int __acpi_power_on(struct acpi_power_resource *resource) |
| 227 | { | 228 | { |
| 228 | struct acpi_power_resource_device *device_list = resource->devices; | ||
| 229 | acpi_status status = AE_OK; | 229 | acpi_status status = AE_OK; |
| 230 | 230 | ||
| 231 | status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL); | 231 | status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL); |
| @@ -238,19 +238,15 @@ static int __acpi_power_on(struct acpi_power_resource *resource) | |||
| 238 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n", | 238 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n", |
| 239 | resource->name)); | 239 | resource->name)); |
| 240 | 240 | ||
| 241 | while (device_list) { | ||
| 242 | acpi_power_on_device(device_list->device); | ||
| 243 | |||
| 244 | device_list = device_list->next; | ||
| 245 | } | ||
| 246 | |||
| 247 | return 0; | 241 | return 0; |
| 248 | } | 242 | } |
| 249 | 243 | ||
| 250 | static int acpi_power_on(acpi_handle handle) | 244 | static int acpi_power_on(acpi_handle handle) |
| 251 | { | 245 | { |
| 252 | int result = 0; | 246 | int result = 0; |
| 247 | bool resume_device = false; | ||
| 253 | struct acpi_power_resource *resource = NULL; | 248 | struct acpi_power_resource *resource = NULL; |
| 249 | struct acpi_power_resource_device *device_list; | ||
| 254 | 250 | ||
| 255 | result = acpi_power_get_context(handle, &resource); | 251 | result = acpi_power_get_context(handle, &resource); |
| 256 | if (result) | 252 | if (result) |
| @@ -266,10 +262,25 @@ static int acpi_power_on(acpi_handle handle) | |||
| 266 | result = __acpi_power_on(resource); | 262 | result = __acpi_power_on(resource); |
| 267 | if (result) | 263 | if (result) |
| 268 | resource->ref_count--; | 264 | resource->ref_count--; |
| 265 | else | ||
| 266 | resume_device = true; | ||
| 269 | } | 267 | } |
| 270 | 268 | ||
| 271 | mutex_unlock(&resource->resource_lock); | 269 | mutex_unlock(&resource->resource_lock); |
| 272 | 270 | ||
| 271 | if (!resume_device) | ||
| 272 | return result; | ||
| 273 | |||
| 274 | mutex_lock(&resource->devices_lock); | ||
| 275 | |||
| 276 | device_list = resource->devices; | ||
| 277 | while (device_list) { | ||
| 278 | acpi_power_on_device(device_list->device); | ||
| 279 | device_list = device_list->next; | ||
| 280 | } | ||
| 281 | |||
| 282 | mutex_unlock(&resource->devices_lock); | ||
| 283 | |||
| 273 | return result; | 284 | return result; |
| 274 | } | 285 | } |
| 275 | 286 | ||
| @@ -355,7 +366,7 @@ static void __acpi_power_resource_unregister_device(struct device *dev, | |||
| 355 | if (acpi_power_get_context(res_handle, &resource)) | 366 | if (acpi_power_get_context(res_handle, &resource)) |
| 356 | return; | 367 | return; |
| 357 | 368 | ||
| 358 | mutex_lock(&resource->resource_lock); | 369 | mutex_lock(&resource->devices_lock); |
| 359 | prev = NULL; | 370 | prev = NULL; |
| 360 | curr = resource->devices; | 371 | curr = resource->devices; |
| 361 | while (curr) { | 372 | while (curr) { |
| @@ -372,7 +383,7 @@ static void __acpi_power_resource_unregister_device(struct device *dev, | |||
| 372 | prev = curr; | 383 | prev = curr; |
| 373 | curr = curr->next; | 384 | curr = curr->next; |
| 374 | } | 385 | } |
| 375 | mutex_unlock(&resource->resource_lock); | 386 | mutex_unlock(&resource->devices_lock); |
| 376 | } | 387 | } |
| 377 | 388 | ||
| 378 | /* Unlink dev from all power resources in _PR0 */ | 389 | /* Unlink dev from all power resources in _PR0 */ |
| @@ -414,10 +425,10 @@ static int __acpi_power_resource_register_device( | |||
| 414 | 425 | ||
| 415 | power_resource_device->device = powered_device; | 426 | power_resource_device->device = powered_device; |
| 416 | 427 | ||
| 417 | mutex_lock(&resource->resource_lock); | 428 | mutex_lock(&resource->devices_lock); |
| 418 | power_resource_device->next = resource->devices; | 429 | power_resource_device->next = resource->devices; |
| 419 | resource->devices = power_resource_device; | 430 | resource->devices = power_resource_device; |
| 420 | mutex_unlock(&resource->resource_lock); | 431 | mutex_unlock(&resource->devices_lock); |
| 421 | 432 | ||
| 422 | return 0; | 433 | return 0; |
| 423 | } | 434 | } |
| @@ -462,7 +473,7 @@ int acpi_power_resource_register_device(struct device *dev, acpi_handle handle) | |||
| 462 | return ret; | 473 | return ret; |
| 463 | 474 | ||
| 464 | no_power_resource: | 475 | no_power_resource: |
| 465 | printk(KERN_WARNING PREFIX "Invalid Power Resource to register!"); | 476 | printk(KERN_DEBUG PREFIX "Invalid Power Resource to register!"); |
| 466 | return -ENODEV; | 477 | return -ENODEV; |
| 467 | } | 478 | } |
| 468 | EXPORT_SYMBOL_GPL(acpi_power_resource_register_device); | 479 | EXPORT_SYMBOL_GPL(acpi_power_resource_register_device); |
| @@ -721,6 +732,7 @@ static int acpi_power_add(struct acpi_device *device) | |||
| 721 | 732 | ||
| 722 | resource->device = device; | 733 | resource->device = device; |
| 723 | mutex_init(&resource->resource_lock); | 734 | mutex_init(&resource->resource_lock); |
| 735 | mutex_init(&resource->devices_lock); | ||
| 724 | strcpy(resource->name, device->pnp.bus_id); | 736 | strcpy(resource->name, device->pnp.bus_id); |
| 725 | strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); | 737 | strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME); |
| 726 | strcpy(acpi_device_class(device), ACPI_POWER_CLASS); | 738 | strcpy(acpi_device_class(device), ACPI_POWER_CLASS); |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 2be8ef1d3093..27cecd313e75 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
| @@ -115,7 +115,7 @@ config SATA_SIL24 | |||
| 115 | If unsure, say N. | 115 | If unsure, say N. |
| 116 | 116 | ||
| 117 | config ATA_SFF | 117 | config ATA_SFF |
| 118 | bool "ATA SFF support" | 118 | bool "ATA SFF support (for legacy IDE and PATA)" |
| 119 | default y | 119 | default y |
| 120 | help | 120 | help |
| 121 | This option adds support for ATA controllers with SFF | 121 | This option adds support for ATA controllers with SFF |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 062e6a1a248f..7862d17976b7 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -256,10 +256,21 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 256 | { PCI_VDEVICE(INTEL, 0x8c07), board_ahci }, /* Lynx Point RAID */ | 256 | { PCI_VDEVICE(INTEL, 0x8c07), board_ahci }, /* Lynx Point RAID */ |
| 257 | { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */ | 257 | { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */ |
| 258 | { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci }, /* Lynx Point RAID */ | 258 | { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci }, /* Lynx Point RAID */ |
| 259 | { PCI_VDEVICE(INTEL, 0x9c02), board_ahci }, /* Lynx Point-LP AHCI */ | ||
| 260 | { PCI_VDEVICE(INTEL, 0x9c03), board_ahci }, /* Lynx Point-LP AHCI */ | ||
| 261 | { PCI_VDEVICE(INTEL, 0x9c04), board_ahci }, /* Lynx Point-LP RAID */ | ||
| 262 | { PCI_VDEVICE(INTEL, 0x9c05), board_ahci }, /* Lynx Point-LP RAID */ | ||
| 263 | { PCI_VDEVICE(INTEL, 0x9c06), board_ahci }, /* Lynx Point-LP RAID */ | ||
| 264 | { PCI_VDEVICE(INTEL, 0x9c07), board_ahci }, /* Lynx Point-LP RAID */ | ||
| 265 | { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci }, /* Lynx Point-LP RAID */ | ||
| 266 | { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci }, /* Lynx Point-LP RAID */ | ||
| 259 | 267 | ||
| 260 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ | 268 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ |
| 261 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 269 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
| 262 | PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr }, | 270 | PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr }, |
| 271 | /* JMicron 362B and 362C have an AHCI function with IDE class code */ | ||
| 272 | { PCI_VDEVICE(JMICRON, 0x2362), board_ahci_ign_iferr }, | ||
| 273 | { PCI_VDEVICE(JMICRON, 0x236f), board_ahci_ign_iferr }, | ||
| 263 | 274 | ||
| 264 | /* ATI */ | 275 | /* ATI */ |
| 265 | { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */ | 276 | { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 */ |
| @@ -385,6 +396,8 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 385 | .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ | 396 | .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ |
| 386 | { PCI_DEVICE(0x1b4b, 0x917a), | 397 | { PCI_DEVICE(0x1b4b, 0x917a), |
| 387 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ | 398 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ |
| 399 | { PCI_DEVICE(0x1b4b, 0x9192), | ||
| 400 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */ | ||
| 388 | { PCI_DEVICE(0x1b4b, 0x91a3), | 401 | { PCI_DEVICE(0x1b4b, 0x91a3), |
| 389 | .driver_data = board_ahci_yes_fbs }, | 402 | .driver_data = board_ahci_yes_fbs }, |
| 390 | 403 | ||
| @@ -392,7 +405,10 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 392 | { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ | 405 | { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */ |
| 393 | 406 | ||
| 394 | /* Asmedia */ | 407 | /* Asmedia */ |
| 395 | { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1061 */ | 408 | { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */ |
| 409 | { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci }, /* ASM1060 */ | ||
| 410 | { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */ | ||
| 411 | { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */ | ||
| 396 | 412 | ||
| 397 | /* Generic, PCI class code for AHCI */ | 413 | /* Generic, PCI class code for AHCI */ |
| 398 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 414 | { PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index c2594ddf25b0..57eb1c212a4c 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h | |||
| @@ -320,6 +320,7 @@ extern struct device_attribute *ahci_sdev_attrs[]; | |||
| 320 | extern struct ata_port_operations ahci_ops; | 320 | extern struct ata_port_operations ahci_ops; |
| 321 | extern struct ata_port_operations ahci_pmp_retry_srst_ops; | 321 | extern struct ata_port_operations ahci_pmp_retry_srst_ops; |
| 322 | 322 | ||
| 323 | unsigned int ahci_dev_classify(struct ata_port *ap); | ||
| 323 | void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, | 324 | void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, |
| 324 | u32 opts); | 325 | u32 opts); |
| 325 | void ahci_save_initial_config(struct device *dev, | 326 | void ahci_save_initial_config(struct device *dev, |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 3c809bfbccf5..ef773e12af79 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -329,6 +329,14 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
| 329 | { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 329 | { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 330 | /* SATA Controller IDE (Lynx Point) */ | 330 | /* SATA Controller IDE (Lynx Point) */ |
| 331 | { 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 331 | { 0x8086, 0x8c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 332 | /* SATA Controller IDE (Lynx Point-LP) */ | ||
| 333 | { 0x8086, 0x9c00, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
| 334 | /* SATA Controller IDE (Lynx Point-LP) */ | ||
| 335 | { 0x8086, 0x9c01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb }, | ||
| 336 | /* SATA Controller IDE (Lynx Point-LP) */ | ||
| 337 | { 0x8086, 0x9c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
| 338 | /* SATA Controller IDE (Lynx Point-LP) */ | ||
| 339 | { 0x8086, 0x9c09, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | ||
| 332 | /* SATA Controller IDE (DH89xxCC) */ | 340 | /* SATA Controller IDE (DH89xxCC) */ |
| 333 | { 0x8086, 0x2326, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 341 | { 0x8086, 0x2326, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 334 | { } /* terminate list */ | 342 | { } /* terminate list */ |
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index f9eaa82311a9..555c07afa05b 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c | |||
| @@ -1139,7 +1139,7 @@ static void ahci_dev_config(struct ata_device *dev) | |||
| 1139 | } | 1139 | } |
| 1140 | } | 1140 | } |
| 1141 | 1141 | ||
| 1142 | static unsigned int ahci_dev_classify(struct ata_port *ap) | 1142 | unsigned int ahci_dev_classify(struct ata_port *ap) |
| 1143 | { | 1143 | { |
| 1144 | void __iomem *port_mmio = ahci_port_base(ap); | 1144 | void __iomem *port_mmio = ahci_port_base(ap); |
| 1145 | struct ata_taskfile tf; | 1145 | struct ata_taskfile tf; |
| @@ -1153,6 +1153,7 @@ static unsigned int ahci_dev_classify(struct ata_port *ap) | |||
| 1153 | 1153 | ||
| 1154 | return ata_dev_classify(&tf); | 1154 | return ata_dev_classify(&tf); |
| 1155 | } | 1155 | } |
| 1156 | EXPORT_SYMBOL_GPL(ahci_dev_classify); | ||
| 1156 | 1157 | ||
| 1157 | void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, | 1158 | void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, |
| 1158 | u32 opts) | 1159 | u32 opts) |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 902b5a457170..fd9ecf74e631 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -60,17 +60,7 @@ acpi_handle ata_ap_acpi_handle(struct ata_port *ap) | |||
| 60 | if (ap->flags & ATA_FLAG_ACPI_SATA) | 60 | if (ap->flags & ATA_FLAG_ACPI_SATA) |
| 61 | return NULL; | 61 | return NULL; |
| 62 | 62 | ||
| 63 | /* | 63 | return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), ap->port_no); |
| 64 | * If acpi bind operation has already happened, we can get the handle | ||
| 65 | * for the port by checking the corresponding scsi_host device's | ||
| 66 | * firmware node, otherwise we will need to find out the handle from | ||
| 67 | * its parent's acpi node. | ||
| 68 | */ | ||
| 69 | if (ap->scsi_host) | ||
| 70 | return DEVICE_ACPI_HANDLE(&ap->scsi_host->shost_gendev); | ||
| 71 | else | ||
| 72 | return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), | ||
| 73 | ap->port_no); | ||
| 74 | } | 64 | } |
| 75 | EXPORT_SYMBOL(ata_ap_acpi_handle); | 65 | EXPORT_SYMBOL(ata_ap_acpi_handle); |
| 76 | 66 | ||
| @@ -1101,6 +1091,9 @@ static int ata_acpi_bind_host(struct ata_port *ap, acpi_handle *handle) | |||
| 1101 | if (!*handle) | 1091 | if (!*handle) |
| 1102 | return -ENODEV; | 1092 | return -ENODEV; |
| 1103 | 1093 | ||
| 1094 | if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0) | ||
| 1095 | ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; | ||
| 1096 | |||
| 1104 | return 0; | 1097 | return 0; |
| 1105 | } | 1098 | } |
| 1106 | 1099 | ||
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index fadd5866d40f..8e1039c8e159 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -4062,7 +4062,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4062 | { "_NEC DV5800A", NULL, ATA_HORKAGE_NODMA }, | 4062 | { "_NEC DV5800A", NULL, ATA_HORKAGE_NODMA }, |
| 4063 | { "SAMSUNG CD-ROM SN-124", "N001", ATA_HORKAGE_NODMA }, | 4063 | { "SAMSUNG CD-ROM SN-124", "N001", ATA_HORKAGE_NODMA }, |
| 4064 | { "Seagate STT20000A", NULL, ATA_HORKAGE_NODMA }, | 4064 | { "Seagate STT20000A", NULL, ATA_HORKAGE_NODMA }, |
| 4065 | { "2GB ATA Flash Disk", "ADMA428M", ATA_HORKAGE_NODMA }, | 4065 | { " 2GB ATA Flash Disk", "ADMA428M", ATA_HORKAGE_NODMA }, |
| 4066 | /* Odd clown on sil3726/4726 PMPs */ | 4066 | /* Odd clown on sil3726/4726 PMPs */ |
| 4067 | { "Config Disk", NULL, ATA_HORKAGE_DISABLE }, | 4067 | { "Config Disk", NULL, ATA_HORKAGE_DISABLE }, |
| 4068 | 4068 | ||
| @@ -4128,6 +4128,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4128 | 4128 | ||
| 4129 | /* Devices that do not need bridging limits applied */ | 4129 | /* Devices that do not need bridging limits applied */ |
| 4130 | { "MTRON MSP-SATA*", NULL, ATA_HORKAGE_BRIDGE_OK, }, | 4130 | { "MTRON MSP-SATA*", NULL, ATA_HORKAGE_BRIDGE_OK, }, |
| 4131 | { "BUFFALO HD-QSU2/R5", NULL, ATA_HORKAGE_BRIDGE_OK, }, | ||
| 4131 | 4132 | ||
| 4132 | /* Devices which aren't very happy with higher link speeds */ | 4133 | /* Devices which aren't very happy with higher link speeds */ |
| 4133 | { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, }, | 4134 | { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, }, |
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index 361c75cea57b..24e51056ac26 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | #include <linux/delay.h> | 20 | #include <linux/delay.h> |
| 21 | #include <scsi/scsi_host.h> | 21 | #include <scsi/scsi_host.h> |
| 22 | #include <linux/libata.h> | 22 | #include <linux/libata.h> |
| 23 | #include <linux/dmi.h> | ||
| 23 | 24 | ||
| 24 | #define DRV_NAME "pata_atiixp" | 25 | #define DRV_NAME "pata_atiixp" |
| 25 | #define DRV_VERSION "0.4.6" | 26 | #define DRV_VERSION "0.4.6" |
| @@ -33,11 +34,26 @@ enum { | |||
| 33 | ATIIXP_IDE_UDMA_MODE = 0x56 | 34 | ATIIXP_IDE_UDMA_MODE = 0x56 |
| 34 | }; | 35 | }; |
| 35 | 36 | ||
| 37 | static const struct dmi_system_id attixp_cable_override_dmi_table[] = { | ||
| 38 | { | ||
| 39 | /* Board has onboard PATA<->SATA converters */ | ||
| 40 | .ident = "MSI E350DM-E33", | ||
| 41 | .matches = { | ||
| 42 | DMI_MATCH(DMI_BOARD_VENDOR, "MSI"), | ||
| 43 | DMI_MATCH(DMI_BOARD_NAME, "E350DM-E33(MS-7720)"), | ||
| 44 | }, | ||
| 45 | }, | ||
| 46 | { } | ||
| 47 | }; | ||
| 48 | |||
| 36 | static int atiixp_cable_detect(struct ata_port *ap) | 49 | static int atiixp_cable_detect(struct ata_port *ap) |
| 37 | { | 50 | { |
| 38 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | 51 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 39 | u8 udma; | 52 | u8 udma; |
| 40 | 53 | ||
| 54 | if (dmi_check_system(attixp_cable_override_dmi_table)) | ||
| 55 | return ATA_CBL_PATA40_SHORT; | ||
| 56 | |||
| 41 | /* Hack from drivers/ide/pci. Really we want to know how to do the | 57 | /* Hack from drivers/ide/pci. Really we want to know how to do the |
| 42 | raw detection not play follow the bios mode guess */ | 58 | raw detection not play follow the bios mode guess */ |
| 43 | pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ap->port_no, &udma); | 59 | pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ap->port_no, &udma); |
diff --git a/drivers/base/dma-contiguous.c b/drivers/base/dma-contiguous.c index 78efb0306a44..34d94c762a1e 100644 --- a/drivers/base/dma-contiguous.c +++ b/drivers/base/dma-contiguous.c | |||
| @@ -250,7 +250,7 @@ int __init dma_declare_contiguous(struct device *dev, unsigned long size, | |||
| 250 | return -EINVAL; | 250 | return -EINVAL; |
| 251 | 251 | ||
| 252 | /* Sanitise input arguments */ | 252 | /* Sanitise input arguments */ |
| 253 | alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order); | 253 | alignment = PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order); |
| 254 | base = ALIGN(base, alignment); | 254 | base = ALIGN(base, alignment); |
| 255 | size = ALIGN(size, alignment); | 255 | size = ALIGN(size, alignment); |
| 256 | limit &= ~(alignment - 1); | 256 | limit &= ~(alignment - 1); |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index de0435e63b02..887f68f6d79a 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
| @@ -35,6 +35,7 @@ new_skb(ulong len) | |||
| 35 | skb_reset_mac_header(skb); | 35 | skb_reset_mac_header(skb); |
| 36 | skb_reset_network_header(skb); | 36 | skb_reset_network_header(skb); |
| 37 | skb->protocol = __constant_htons(ETH_P_AOE); | 37 | skb->protocol = __constant_htons(ETH_P_AOE); |
| 38 | skb_checksum_none_assert(skb); | ||
| 38 | } | 39 | } |
| 39 | return skb; | 40 | return skb; |
| 40 | } | 41 | } |
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c index 38aa6dda6b81..da3311129a0c 100644 --- a/drivers/block/cciss_scsi.c +++ b/drivers/block/cciss_scsi.c | |||
| @@ -795,6 +795,7 @@ static void complete_scsi_command(CommandList_struct *c, int timeout, | |||
| 795 | } | 795 | } |
| 796 | break; | 796 | break; |
| 797 | case CMD_PROTOCOL_ERR: | 797 | case CMD_PROTOCOL_ERR: |
| 798 | cmd->result = DID_ERROR << 16; | ||
| 798 | dev_warn(&h->pdev->dev, | 799 | dev_warn(&h->pdev->dev, |
| 799 | "%p has protocol error\n", c); | 800 | "%p has protocol error\n", c); |
| 800 | break; | 801 | break; |
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c index ba91b408abad..d84566496746 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c | |||
| @@ -889,6 +889,7 @@ struct bm_aio_ctx { | |||
| 889 | unsigned int done; | 889 | unsigned int done; |
| 890 | unsigned flags; | 890 | unsigned flags; |
| 891 | #define BM_AIO_COPY_PAGES 1 | 891 | #define BM_AIO_COPY_PAGES 1 |
| 892 | #define BM_WRITE_ALL_PAGES 2 | ||
| 892 | int error; | 893 | int error; |
| 893 | struct kref kref; | 894 | struct kref kref; |
| 894 | }; | 895 | }; |
| @@ -1059,7 +1060,8 @@ static int bm_rw(struct drbd_conf *mdev, int rw, unsigned flags, unsigned lazy_w | |||
| 1059 | if (lazy_writeout_upper_idx && i == lazy_writeout_upper_idx) | 1060 | if (lazy_writeout_upper_idx && i == lazy_writeout_upper_idx) |
| 1060 | break; | 1061 | break; |
| 1061 | if (rw & WRITE) { | 1062 | if (rw & WRITE) { |
| 1062 | if (bm_test_page_unchanged(b->bm_pages[i])) { | 1063 | if (!(flags & BM_WRITE_ALL_PAGES) && |
| 1064 | bm_test_page_unchanged(b->bm_pages[i])) { | ||
| 1063 | dynamic_dev_dbg(DEV, "skipped bm write for idx %u\n", i); | 1065 | dynamic_dev_dbg(DEV, "skipped bm write for idx %u\n", i); |
| 1064 | continue; | 1066 | continue; |
| 1065 | } | 1067 | } |
| @@ -1141,6 +1143,17 @@ int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local) | |||
| 1141 | } | 1143 | } |
| 1142 | 1144 | ||
| 1143 | /** | 1145 | /** |
| 1146 | * drbd_bm_write_all() - Write the whole bitmap to its on disk location. | ||
| 1147 | * @mdev: DRBD device. | ||
| 1148 | * | ||
| 1149 | * Will write all pages. | ||
| 1150 | */ | ||
| 1151 | int drbd_bm_write_all(struct drbd_conf *mdev) __must_hold(local) | ||
| 1152 | { | ||
| 1153 | return bm_rw(mdev, WRITE, BM_WRITE_ALL_PAGES, 0); | ||
| 1154 | } | ||
| 1155 | |||
| 1156 | /** | ||
| 1144 | * drbd_bm_lazy_write_out() - Write bitmap pages 0 to @upper_idx-1, if they have changed. | 1157 | * drbd_bm_lazy_write_out() - Write bitmap pages 0 to @upper_idx-1, if they have changed. |
| 1145 | * @mdev: DRBD device. | 1158 | * @mdev: DRBD device. |
| 1146 | * @upper_idx: 0: write all changed pages; +ve: page index to stop scanning for changed pages | 1159 | * @upper_idx: 0: write all changed pages; +ve: page index to stop scanning for changed pages |
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index b2ca143d0053..b953cc7c9c00 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
| @@ -1469,6 +1469,7 @@ extern int drbd_bm_e_weight(struct drbd_conf *mdev, unsigned long enr); | |||
| 1469 | extern int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(local); | 1469 | extern int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(local); |
| 1470 | extern int drbd_bm_read(struct drbd_conf *mdev) __must_hold(local); | 1470 | extern int drbd_bm_read(struct drbd_conf *mdev) __must_hold(local); |
| 1471 | extern int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local); | 1471 | extern int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local); |
| 1472 | extern int drbd_bm_write_all(struct drbd_conf *mdev) __must_hold(local); | ||
| 1472 | extern int drbd_bm_write_copy_pages(struct drbd_conf *mdev) __must_hold(local); | 1473 | extern int drbd_bm_write_copy_pages(struct drbd_conf *mdev) __must_hold(local); |
| 1473 | extern unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev, | 1474 | extern unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev, |
| 1474 | unsigned long al_enr); | 1475 | unsigned long al_enr); |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index dbe6135a2abe..f93a0320e952 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
| @@ -79,6 +79,7 @@ static int w_md_sync(struct drbd_conf *mdev, struct drbd_work *w, int unused); | |||
| 79 | static void md_sync_timer_fn(unsigned long data); | 79 | static void md_sync_timer_fn(unsigned long data); |
| 80 | static int w_bitmap_io(struct drbd_conf *mdev, struct drbd_work *w, int unused); | 80 | static int w_bitmap_io(struct drbd_conf *mdev, struct drbd_work *w, int unused); |
| 81 | static int w_go_diskless(struct drbd_conf *mdev, struct drbd_work *w, int unused); | 81 | static int w_go_diskless(struct drbd_conf *mdev, struct drbd_work *w, int unused); |
| 82 | static void _tl_clear(struct drbd_conf *mdev); | ||
| 82 | 83 | ||
| 83 | MODULE_AUTHOR("Philipp Reisner <phil@linbit.com>, " | 84 | MODULE_AUTHOR("Philipp Reisner <phil@linbit.com>, " |
| 84 | "Lars Ellenberg <lars@linbit.com>"); | 85 | "Lars Ellenberg <lars@linbit.com>"); |
| @@ -432,19 +433,10 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) | |||
| 432 | 433 | ||
| 433 | /* Actions operating on the disk state, also want to work on | 434 | /* Actions operating on the disk state, also want to work on |
| 434 | requests that got barrier acked. */ | 435 | requests that got barrier acked. */ |
| 435 | switch (what) { | ||
| 436 | case fail_frozen_disk_io: | ||
| 437 | case restart_frozen_disk_io: | ||
| 438 | list_for_each_safe(le, tle, &mdev->barrier_acked_requests) { | ||
| 439 | req = list_entry(le, struct drbd_request, tl_requests); | ||
| 440 | _req_mod(req, what); | ||
| 441 | } | ||
| 442 | 436 | ||
| 443 | case connection_lost_while_pending: | 437 | list_for_each_safe(le, tle, &mdev->barrier_acked_requests) { |
| 444 | case resend: | 438 | req = list_entry(le, struct drbd_request, tl_requests); |
| 445 | break; | 439 | _req_mod(req, what); |
| 446 | default: | ||
| 447 | dev_err(DEV, "what = %d in _tl_restart()\n", what); | ||
| 448 | } | 440 | } |
| 449 | } | 441 | } |
| 450 | 442 | ||
| @@ -459,11 +451,16 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) | |||
| 459 | */ | 451 | */ |
| 460 | void tl_clear(struct drbd_conf *mdev) | 452 | void tl_clear(struct drbd_conf *mdev) |
| 461 | { | 453 | { |
| 454 | spin_lock_irq(&mdev->req_lock); | ||
| 455 | _tl_clear(mdev); | ||
| 456 | spin_unlock_irq(&mdev->req_lock); | ||
| 457 | } | ||
| 458 | |||
| 459 | static void _tl_clear(struct drbd_conf *mdev) | ||
| 460 | { | ||
| 462 | struct list_head *le, *tle; | 461 | struct list_head *le, *tle; |
| 463 | struct drbd_request *r; | 462 | struct drbd_request *r; |
| 464 | 463 | ||
| 465 | spin_lock_irq(&mdev->req_lock); | ||
| 466 | |||
| 467 | _tl_restart(mdev, connection_lost_while_pending); | 464 | _tl_restart(mdev, connection_lost_while_pending); |
| 468 | 465 | ||
| 469 | /* we expect this list to be empty. */ | 466 | /* we expect this list to be empty. */ |
| @@ -482,7 +479,6 @@ void tl_clear(struct drbd_conf *mdev) | |||
| 482 | 479 | ||
| 483 | memset(mdev->app_reads_hash, 0, APP_R_HSIZE*sizeof(void *)); | 480 | memset(mdev->app_reads_hash, 0, APP_R_HSIZE*sizeof(void *)); |
| 484 | 481 | ||
| 485 | spin_unlock_irq(&mdev->req_lock); | ||
| 486 | } | 482 | } |
| 487 | 483 | ||
| 488 | void tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) | 484 | void tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) |
| @@ -1476,12 +1472,12 @@ static void after_state_ch(struct drbd_conf *mdev, union drbd_state os, | |||
| 1476 | if (ns.susp_fen) { | 1472 | if (ns.susp_fen) { |
| 1477 | /* case1: The outdate peer handler is successful: */ | 1473 | /* case1: The outdate peer handler is successful: */ |
| 1478 | if (os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) { | 1474 | if (os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) { |
| 1479 | tl_clear(mdev); | ||
| 1480 | if (test_bit(NEW_CUR_UUID, &mdev->flags)) { | 1475 | if (test_bit(NEW_CUR_UUID, &mdev->flags)) { |
| 1481 | drbd_uuid_new_current(mdev); | 1476 | drbd_uuid_new_current(mdev); |
| 1482 | clear_bit(NEW_CUR_UUID, &mdev->flags); | 1477 | clear_bit(NEW_CUR_UUID, &mdev->flags); |
| 1483 | } | 1478 | } |
| 1484 | spin_lock_irq(&mdev->req_lock); | 1479 | spin_lock_irq(&mdev->req_lock); |
| 1480 | _tl_clear(mdev); | ||
| 1485 | _drbd_set_state(_NS(mdev, susp_fen, 0), CS_VERBOSE, NULL); | 1481 | _drbd_set_state(_NS(mdev, susp_fen, 0), CS_VERBOSE, NULL); |
| 1486 | spin_unlock_irq(&mdev->req_lock); | 1482 | spin_unlock_irq(&mdev->req_lock); |
| 1487 | } | 1483 | } |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index fb9dce8daa24..edb490aad8b4 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
| @@ -674,8 +674,8 @@ enum determine_dev_size drbd_determine_dev_size(struct drbd_conf *mdev, enum dds | |||
| 674 | la_size_changed && md_moved ? "size changed and md moved" : | 674 | la_size_changed && md_moved ? "size changed and md moved" : |
| 675 | la_size_changed ? "size changed" : "md moved"); | 675 | la_size_changed ? "size changed" : "md moved"); |
| 676 | /* next line implicitly does drbd_suspend_io()+drbd_resume_io() */ | 676 | /* next line implicitly does drbd_suspend_io()+drbd_resume_io() */ |
| 677 | err = drbd_bitmap_io(mdev, &drbd_bm_write, | 677 | err = drbd_bitmap_io(mdev, md_moved ? &drbd_bm_write_all : &drbd_bm_write, |
| 678 | "size changed", BM_LOCKED_MASK); | 678 | "size changed", BM_LOCKED_MASK); |
| 679 | if (err) { | 679 | if (err) { |
| 680 | rv = dev_size_error; | 680 | rv = dev_size_error; |
| 681 | goto out; | 681 | goto out; |
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 910335c30927..01b2ac641c7b 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c | |||
| @@ -695,6 +695,12 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, | |||
| 695 | break; | 695 | break; |
| 696 | 696 | ||
| 697 | case resend: | 697 | case resend: |
| 698 | /* Simply complete (local only) READs. */ | ||
| 699 | if (!(req->rq_state & RQ_WRITE) && !req->w.cb) { | ||
| 700 | _req_may_be_done(req, m); | ||
| 701 | break; | ||
| 702 | } | ||
| 703 | |||
| 698 | /* If RQ_NET_OK is already set, we got a P_WRITE_ACK or P_RECV_ACK | 704 | /* If RQ_NET_OK is already set, we got a P_WRITE_ACK or P_RECV_ACK |
| 699 | before the connection loss (B&C only); only P_BARRIER_ACK was missing. | 705 | before the connection loss (B&C only); only P_BARRIER_ACK was missing. |
| 700 | Trowing them out of the TL here by pretending we got a BARRIER_ACK | 706 | Trowing them out of the TL here by pretending we got a BARRIER_ACK |
| @@ -834,7 +840,15 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, uns | |||
| 834 | req->private_bio = NULL; | 840 | req->private_bio = NULL; |
| 835 | } | 841 | } |
| 836 | if (rw == WRITE) { | 842 | if (rw == WRITE) { |
| 837 | remote = 1; | 843 | /* Need to replicate writes. Unless it is an empty flush, |
| 844 | * which is better mapped to a DRBD P_BARRIER packet, | ||
| 845 | * also for drbd wire protocol compatibility reasons. */ | ||
| 846 | if (unlikely(size == 0)) { | ||
| 847 | /* The only size==0 bios we expect are empty flushes. */ | ||
| 848 | D_ASSERT(bio->bi_rw & REQ_FLUSH); | ||
| 849 | remote = 0; | ||
| 850 | } else | ||
| 851 | remote = 1; | ||
| 838 | } else { | 852 | } else { |
| 839 | /* READ || READA */ | 853 | /* READ || READA */ |
| 840 | if (local) { | 854 | if (local) { |
| @@ -870,8 +884,11 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, uns | |||
| 870 | * extent. This waits for any resync activity in the corresponding | 884 | * extent. This waits for any resync activity in the corresponding |
| 871 | * resync extent to finish, and, if necessary, pulls in the target | 885 | * resync extent to finish, and, if necessary, pulls in the target |
| 872 | * extent into the activity log, which involves further disk io because | 886 | * extent into the activity log, which involves further disk io because |
| 873 | * of transactional on-disk meta data updates. */ | 887 | * of transactional on-disk meta data updates. |
| 874 | if (rw == WRITE && local && !test_bit(AL_SUSPENDED, &mdev->flags)) { | 888 | * Empty flushes don't need to go into the activity log, they can only |
| 889 | * flush data for pending writes which are already in there. */ | ||
| 890 | if (rw == WRITE && local && size | ||
| 891 | && !test_bit(AL_SUSPENDED, &mdev->flags)) { | ||
| 875 | req->rq_state |= RQ_IN_ACT_LOG; | 892 | req->rq_state |= RQ_IN_ACT_LOG; |
| 876 | drbd_al_begin_io(mdev, sector); | 893 | drbd_al_begin_io(mdev, sector); |
| 877 | } | 894 | } |
| @@ -994,7 +1011,10 @@ allocate_barrier: | |||
| 994 | if (rw == WRITE && _req_conflicts(req)) | 1011 | if (rw == WRITE && _req_conflicts(req)) |
| 995 | goto fail_conflicting; | 1012 | goto fail_conflicting; |
| 996 | 1013 | ||
| 997 | list_add_tail(&req->tl_requests, &mdev->newest_tle->requests); | 1014 | /* no point in adding empty flushes to the transfer log, |
| 1015 | * they are mapped to drbd barriers already. */ | ||
| 1016 | if (likely(size!=0)) | ||
| 1017 | list_add_tail(&req->tl_requests, &mdev->newest_tle->requests); | ||
| 998 | 1018 | ||
| 999 | /* NOTE remote first: to get the concurrent write detection right, | 1019 | /* NOTE remote first: to get the concurrent write detection right, |
| 1000 | * we must register the request before start of local IO. */ | 1020 | * we must register the request before start of local IO. */ |
| @@ -1014,6 +1034,14 @@ allocate_barrier: | |||
| 1014 | mdev->net_conf->on_congestion != OC_BLOCK && mdev->agreed_pro_version >= 96) | 1034 | mdev->net_conf->on_congestion != OC_BLOCK && mdev->agreed_pro_version >= 96) |
| 1015 | maybe_pull_ahead(mdev); | 1035 | maybe_pull_ahead(mdev); |
| 1016 | 1036 | ||
| 1037 | /* If this was a flush, queue a drbd barrier/start a new epoch. | ||
| 1038 | * Unless the current epoch was empty anyways, or we are not currently | ||
| 1039 | * replicating, in which case there is no point. */ | ||
| 1040 | if (unlikely(bio->bi_rw & REQ_FLUSH) | ||
| 1041 | && mdev->newest_tle->n_writes | ||
| 1042 | && drbd_should_do_remote(mdev->state)) | ||
| 1043 | queue_barrier(mdev); | ||
| 1044 | |||
| 1017 | spin_unlock_irq(&mdev->req_lock); | 1045 | spin_unlock_irq(&mdev->req_lock); |
| 1018 | kfree(b); /* if someone else has beaten us to it... */ | 1046 | kfree(b); /* if someone else has beaten us to it... */ |
| 1019 | 1047 | ||
diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c index a8fddeb3d638..f946d31d6917 100644 --- a/drivers/block/mtip32xx/mtip32xx.c +++ b/drivers/block/mtip32xx/mtip32xx.c | |||
| @@ -1148,11 +1148,15 @@ static bool mtip_pause_ncq(struct mtip_port *port, | |||
| 1148 | reply = port->rxfis + RX_FIS_D2H_REG; | 1148 | reply = port->rxfis + RX_FIS_D2H_REG; |
| 1149 | task_file_data = readl(port->mmio+PORT_TFDATA); | 1149 | task_file_data = readl(port->mmio+PORT_TFDATA); |
| 1150 | 1150 | ||
| 1151 | if ((task_file_data & 1) || (fis->command == ATA_CMD_SEC_ERASE_UNIT)) | 1151 | if (fis->command == ATA_CMD_SEC_ERASE_UNIT) |
| 1152 | clear_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); | ||
| 1153 | |||
| 1154 | if ((task_file_data & 1)) | ||
| 1152 | return false; | 1155 | return false; |
| 1153 | 1156 | ||
| 1154 | if (fis->command == ATA_CMD_SEC_ERASE_PREP) { | 1157 | if (fis->command == ATA_CMD_SEC_ERASE_PREP) { |
| 1155 | set_bit(MTIP_PF_SE_ACTIVE_BIT, &port->flags); | 1158 | set_bit(MTIP_PF_SE_ACTIVE_BIT, &port->flags); |
| 1159 | set_bit(MTIP_DDF_SEC_LOCK_BIT, &port->dd->dd_flag); | ||
| 1156 | port->ic_pause_timer = jiffies; | 1160 | port->ic_pause_timer = jiffies; |
| 1157 | return true; | 1161 | return true; |
| 1158 | } else if ((fis->command == ATA_CMD_DOWNLOAD_MICRO) && | 1162 | } else if ((fis->command == ATA_CMD_DOWNLOAD_MICRO) && |
| @@ -1900,7 +1904,7 @@ static int exec_drive_command(struct mtip_port *port, u8 *command, | |||
| 1900 | int rv = 0, xfer_sz = command[3]; | 1904 | int rv = 0, xfer_sz = command[3]; |
| 1901 | 1905 | ||
| 1902 | if (xfer_sz) { | 1906 | if (xfer_sz) { |
| 1903 | if (user_buffer) | 1907 | if (!user_buffer) |
| 1904 | return -EFAULT; | 1908 | return -EFAULT; |
| 1905 | 1909 | ||
| 1906 | buf = dmam_alloc_coherent(&port->dd->pdev->dev, | 1910 | buf = dmam_alloc_coherent(&port->dd->pdev->dev, |
| @@ -2043,7 +2047,7 @@ static void mtip_set_timeout(struct host_to_dev_fis *fis, unsigned int *timeout) | |||
| 2043 | *timeout = 240000; /* 4 minutes */ | 2047 | *timeout = 240000; /* 4 minutes */ |
| 2044 | break; | 2048 | break; |
| 2045 | case ATA_CMD_STANDBYNOW1: | 2049 | case ATA_CMD_STANDBYNOW1: |
| 2046 | *timeout = 10000; /* 10 seconds */ | 2050 | *timeout = 120000; /* 2 minutes */ |
| 2047 | break; | 2051 | break; |
| 2048 | case 0xF7: | 2052 | case 0xF7: |
| 2049 | case 0xFA: | 2053 | case 0xFA: |
| @@ -2588,9 +2592,6 @@ static ssize_t mtip_hw_read_registers(struct file *f, char __user *ubuf, | |||
| 2588 | if (!len || size) | 2592 | if (!len || size) |
| 2589 | return 0; | 2593 | return 0; |
| 2590 | 2594 | ||
| 2591 | if (size < 0) | ||
| 2592 | return -EINVAL; | ||
| 2593 | |||
| 2594 | size += sprintf(&buf[size], "H/ S ACTive : [ 0x"); | 2595 | size += sprintf(&buf[size], "H/ S ACTive : [ 0x"); |
| 2595 | 2596 | ||
| 2596 | for (n = dd->slot_groups-1; n >= 0; n--) | 2597 | for (n = dd->slot_groups-1; n >= 0; n--) |
| @@ -2660,9 +2661,6 @@ static ssize_t mtip_hw_read_flags(struct file *f, char __user *ubuf, | |||
| 2660 | if (!len || size) | 2661 | if (!len || size) |
| 2661 | return 0; | 2662 | return 0; |
| 2662 | 2663 | ||
| 2663 | if (size < 0) | ||
| 2664 | return -EINVAL; | ||
| 2665 | |||
| 2666 | size += sprintf(&buf[size], "Flag-port : [ %08lX ]\n", | 2664 | size += sprintf(&buf[size], "Flag-port : [ %08lX ]\n", |
| 2667 | dd->port->flags); | 2665 | dd->port->flags); |
| 2668 | size += sprintf(&buf[size], "Flag-dd : [ %08lX ]\n", | 2666 | size += sprintf(&buf[size], "Flag-dd : [ %08lX ]\n", |
| @@ -3214,8 +3212,8 @@ static int mtip_hw_init(struct driver_data *dd) | |||
| 3214 | "Unable to check write protect progress\n"); | 3212 | "Unable to check write protect progress\n"); |
| 3215 | else | 3213 | else |
| 3216 | dev_info(&dd->pdev->dev, | 3214 | dev_info(&dd->pdev->dev, |
| 3217 | "Write protect progress: %d%% (%d blocks)\n", | 3215 | "Write protect progress: %u%% (%u blocks)\n", |
| 3218 | attr242.cur, attr242.data); | 3216 | attr242.cur, le32_to_cpu(attr242.data)); |
| 3219 | return rv; | 3217 | return rv; |
| 3220 | 3218 | ||
| 3221 | out3: | 3219 | out3: |
| @@ -3619,6 +3617,10 @@ static void mtip_make_request(struct request_queue *queue, struct bio *bio) | |||
| 3619 | bio_endio(bio, -ENODATA); | 3617 | bio_endio(bio, -ENODATA); |
| 3620 | return; | 3618 | return; |
| 3621 | } | 3619 | } |
| 3620 | if (unlikely(test_bit(MTIP_DDF_SEC_LOCK_BIT, &dd->dd_flag))) { | ||
| 3621 | bio_endio(bio, -ENODATA); | ||
| 3622 | return; | ||
| 3623 | } | ||
| 3622 | } | 3624 | } |
| 3623 | 3625 | ||
| 3624 | if (unlikely(!bio_has_data(bio))) { | 3626 | if (unlikely(!bio_has_data(bio))) { |
| @@ -4168,7 +4170,13 @@ static void mtip_pci_shutdown(struct pci_dev *pdev) | |||
| 4168 | 4170 | ||
| 4169 | /* Table of device ids supported by this driver. */ | 4171 | /* Table of device ids supported by this driver. */ |
| 4170 | static DEFINE_PCI_DEVICE_TABLE(mtip_pci_tbl) = { | 4172 | static DEFINE_PCI_DEVICE_TABLE(mtip_pci_tbl) = { |
| 4171 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P320_DEVICE_ID) }, | 4173 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P320H_DEVICE_ID) }, |
| 4174 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P320M_DEVICE_ID) }, | ||
| 4175 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P320S_DEVICE_ID) }, | ||
| 4176 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P325M_DEVICE_ID) }, | ||
| 4177 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P420H_DEVICE_ID) }, | ||
| 4178 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P420M_DEVICE_ID) }, | ||
| 4179 | { PCI_DEVICE(PCI_VENDOR_ID_MICRON, P425M_DEVICE_ID) }, | ||
| 4172 | { 0 } | 4180 | { 0 } |
| 4173 | }; | 4181 | }; |
| 4174 | 4182 | ||
| @@ -4199,12 +4207,12 @@ static int __init mtip_init(void) | |||
| 4199 | { | 4207 | { |
| 4200 | int error; | 4208 | int error; |
| 4201 | 4209 | ||
| 4202 | printk(KERN_INFO MTIP_DRV_NAME " Version " MTIP_DRV_VERSION "\n"); | 4210 | pr_info(MTIP_DRV_NAME " Version " MTIP_DRV_VERSION "\n"); |
| 4203 | 4211 | ||
| 4204 | /* Allocate a major block device number to use with this driver. */ | 4212 | /* Allocate a major block device number to use with this driver. */ |
| 4205 | error = register_blkdev(0, MTIP_DRV_NAME); | 4213 | error = register_blkdev(0, MTIP_DRV_NAME); |
| 4206 | if (error <= 0) { | 4214 | if (error <= 0) { |
| 4207 | printk(KERN_ERR "Unable to register block device (%d)\n", | 4215 | pr_err("Unable to register block device (%d)\n", |
| 4208 | error); | 4216 | error); |
| 4209 | return -EBUSY; | 4217 | return -EBUSY; |
| 4210 | } | 4218 | } |
| @@ -4213,7 +4221,7 @@ static int __init mtip_init(void) | |||
| 4213 | if (!dfs_parent) { | 4221 | if (!dfs_parent) { |
| 4214 | dfs_parent = debugfs_create_dir("rssd", NULL); | 4222 | dfs_parent = debugfs_create_dir("rssd", NULL); |
| 4215 | if (IS_ERR_OR_NULL(dfs_parent)) { | 4223 | if (IS_ERR_OR_NULL(dfs_parent)) { |
| 4216 | printk(KERN_WARNING "Error creating debugfs parent\n"); | 4224 | pr_warn("Error creating debugfs parent\n"); |
| 4217 | dfs_parent = NULL; | 4225 | dfs_parent = NULL; |
| 4218 | } | 4226 | } |
| 4219 | } | 4227 | } |
diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h index f51fc23d17bb..18627a1d04c5 100644 --- a/drivers/block/mtip32xx/mtip32xx.h +++ b/drivers/block/mtip32xx/mtip32xx.h | |||
| @@ -76,7 +76,13 @@ | |||
| 76 | 76 | ||
| 77 | /* Micron Vendor ID & P320x SSD Device ID */ | 77 | /* Micron Vendor ID & P320x SSD Device ID */ |
| 78 | #define PCI_VENDOR_ID_MICRON 0x1344 | 78 | #define PCI_VENDOR_ID_MICRON 0x1344 |
| 79 | #define P320_DEVICE_ID 0x5150 | 79 | #define P320H_DEVICE_ID 0x5150 |
| 80 | #define P320M_DEVICE_ID 0x5151 | ||
| 81 | #define P320S_DEVICE_ID 0x5152 | ||
| 82 | #define P325M_DEVICE_ID 0x5153 | ||
| 83 | #define P420H_DEVICE_ID 0x5160 | ||
| 84 | #define P420M_DEVICE_ID 0x5161 | ||
| 85 | #define P425M_DEVICE_ID 0x5163 | ||
| 80 | 86 | ||
| 81 | /* Driver name and version strings */ | 87 | /* Driver name and version strings */ |
| 82 | #define MTIP_DRV_NAME "mtip32xx" | 88 | #define MTIP_DRV_NAME "mtip32xx" |
| @@ -131,10 +137,12 @@ enum { | |||
| 131 | MTIP_PF_SVC_THD_STOP_BIT = 8, | 137 | MTIP_PF_SVC_THD_STOP_BIT = 8, |
| 132 | 138 | ||
| 133 | /* below are bit numbers in 'dd_flag' defined in driver_data */ | 139 | /* below are bit numbers in 'dd_flag' defined in driver_data */ |
| 140 | MTIP_DDF_SEC_LOCK_BIT = 0, | ||
| 134 | MTIP_DDF_REMOVE_PENDING_BIT = 1, | 141 | MTIP_DDF_REMOVE_PENDING_BIT = 1, |
| 135 | MTIP_DDF_OVER_TEMP_BIT = 2, | 142 | MTIP_DDF_OVER_TEMP_BIT = 2, |
| 136 | MTIP_DDF_WRITE_PROTECT_BIT = 3, | 143 | MTIP_DDF_WRITE_PROTECT_BIT = 3, |
| 137 | MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | \ | 144 | MTIP_DDF_STOP_IO = ((1 << MTIP_DDF_REMOVE_PENDING_BIT) | \ |
| 145 | (1 << MTIP_DDF_SEC_LOCK_BIT) | \ | ||
| 138 | (1 << MTIP_DDF_OVER_TEMP_BIT) | \ | 146 | (1 << MTIP_DDF_OVER_TEMP_BIT) | \ |
| 139 | (1 << MTIP_DDF_WRITE_PROTECT_BIT)), | 147 | (1 << MTIP_DDF_WRITE_PROTECT_BIT)), |
| 140 | 148 | ||
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index d07c9f7fded6..0c03411c59eb 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c | |||
| @@ -449,6 +449,14 @@ static void nbd_clear_que(struct nbd_device *nbd) | |||
| 449 | req->errors++; | 449 | req->errors++; |
| 450 | nbd_end_request(req); | 450 | nbd_end_request(req); |
| 451 | } | 451 | } |
| 452 | |||
| 453 | while (!list_empty(&nbd->waiting_queue)) { | ||
| 454 | req = list_entry(nbd->waiting_queue.next, struct request, | ||
| 455 | queuelist); | ||
| 456 | list_del_init(&req->queuelist); | ||
| 457 | req->errors++; | ||
| 458 | nbd_end_request(req); | ||
| 459 | } | ||
| 452 | } | 460 | } |
| 453 | 461 | ||
| 454 | 462 | ||
| @@ -598,6 +606,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | |||
| 598 | nbd->file = NULL; | 606 | nbd->file = NULL; |
| 599 | nbd_clear_que(nbd); | 607 | nbd_clear_que(nbd); |
| 600 | BUG_ON(!list_empty(&nbd->queue_head)); | 608 | BUG_ON(!list_empty(&nbd->queue_head)); |
| 609 | BUG_ON(!list_empty(&nbd->waiting_queue)); | ||
| 601 | if (file) | 610 | if (file) |
| 602 | fput(file); | 611 | fput(file); |
| 603 | return 0; | 612 | return 0; |
diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index 73f196ca713f..c6decb901e5e 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c | |||
| @@ -337,7 +337,7 @@ static void xen_blkbk_unmap(struct pending_req *req) | |||
| 337 | invcount++; | 337 | invcount++; |
| 338 | } | 338 | } |
| 339 | 339 | ||
| 340 | ret = gnttab_unmap_refs(unmap, pages, invcount, false); | 340 | ret = gnttab_unmap_refs(unmap, NULL, pages, invcount); |
| 341 | BUG_ON(ret); | 341 | BUG_ON(ret); |
| 342 | } | 342 | } |
| 343 | 343 | ||
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c index 11f36e502136..fc2de5528dcc 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c | |||
| @@ -86,6 +86,7 @@ static struct usb_device_id ath3k_table[] = { | |||
| 86 | 86 | ||
| 87 | /* Atheros AR5BBU22 with sflash firmware */ | 87 | /* Atheros AR5BBU22 with sflash firmware */ |
| 88 | { USB_DEVICE(0x0489, 0xE03C) }, | 88 | { USB_DEVICE(0x0489, 0xE03C) }, |
| 89 | { USB_DEVICE(0x0489, 0xE036) }, | ||
| 89 | 90 | ||
| 90 | { } /* Terminating entry */ | 91 | { } /* Terminating entry */ |
| 91 | }; | 92 | }; |
| @@ -109,6 +110,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { | |||
| 109 | 110 | ||
| 110 | /* Atheros AR5BBU22 with sflash firmware */ | 111 | /* Atheros AR5BBU22 with sflash firmware */ |
| 111 | { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, | 112 | { USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 }, |
| 113 | { USB_DEVICE(0x0489, 0xE036), .driver_info = BTUSB_ATH3012 }, | ||
| 112 | 114 | ||
| 113 | { } /* Terminating entry */ | 115 | { } /* Terminating entry */ |
| 114 | }; | 116 | }; |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index cef3bac1a543..654e248763ef 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
| @@ -52,6 +52,9 @@ static struct usb_device_id btusb_table[] = { | |||
| 52 | /* Generic Bluetooth USB device */ | 52 | /* Generic Bluetooth USB device */ |
| 53 | { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, | 53 | { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, |
| 54 | 54 | ||
| 55 | /* Apple-specific (Broadcom) devices */ | ||
| 56 | { USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01) }, | ||
| 57 | |||
| 55 | /* Broadcom SoftSailing reporting vendor specific */ | 58 | /* Broadcom SoftSailing reporting vendor specific */ |
| 56 | { USB_DEVICE(0x0a5c, 0x21e1) }, | 59 | { USB_DEVICE(0x0a5c, 0x21e1) }, |
| 57 | 60 | ||
| @@ -94,16 +97,14 @@ static struct usb_device_id btusb_table[] = { | |||
| 94 | 97 | ||
| 95 | /* Broadcom BCM20702A0 */ | 98 | /* Broadcom BCM20702A0 */ |
| 96 | { USB_DEVICE(0x0489, 0xe042) }, | 99 | { USB_DEVICE(0x0489, 0xe042) }, |
| 97 | { USB_DEVICE(0x0a5c, 0x21e3) }, | ||
| 98 | { USB_DEVICE(0x0a5c, 0x21e6) }, | ||
| 99 | { USB_DEVICE(0x0a5c, 0x21e8) }, | ||
| 100 | { USB_DEVICE(0x0a5c, 0x21f3) }, | ||
| 101 | { USB_DEVICE(0x0a5c, 0x21f4) }, | ||
| 102 | { USB_DEVICE(0x413c, 0x8197) }, | 100 | { USB_DEVICE(0x413c, 0x8197) }, |
| 103 | 101 | ||
| 104 | /* Foxconn - Hon Hai */ | 102 | /* Foxconn - Hon Hai */ |
| 105 | { USB_DEVICE(0x0489, 0xe033) }, | 103 | { USB_DEVICE(0x0489, 0xe033) }, |
| 106 | 104 | ||
| 105 | /*Broadcom devices with vendor specific id */ | ||
| 106 | { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) }, | ||
| 107 | |||
| 107 | { } /* Terminating entry */ | 108 | { } /* Terminating entry */ |
| 108 | }; | 109 | }; |
| 109 | 110 | ||
| @@ -141,6 +142,7 @@ static struct usb_device_id blacklist_table[] = { | |||
| 141 | 142 | ||
| 142 | /* Atheros AR5BBU12 with sflash firmware */ | 143 | /* Atheros AR5BBU12 with sflash firmware */ |
| 143 | { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, | 144 | { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, |
| 145 | { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 }, | ||
| 144 | 146 | ||
| 145 | /* Broadcom BCM2035 */ | 147 | /* Broadcom BCM2035 */ |
| 146 | { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, | 148 | { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, |
diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile index 5869ea387054..72ce247a0e8d 100644 --- a/drivers/clk/Makefile +++ b/drivers/clk/Makefile | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | # common clock types | 1 | # common clock types |
| 2 | obj-$(CONFIG_HAVE_CLK) += clk-devres.o | ||
| 2 | obj-$(CONFIG_CLKDEV_LOOKUP) += clkdev.o | 3 | obj-$(CONFIG_CLKDEV_LOOKUP) += clkdev.o |
| 3 | obj-$(CONFIG_COMMON_CLK) += clk.o clk-fixed-rate.o clk-gate.o \ | 4 | obj-$(CONFIG_COMMON_CLK) += clk.o clk-fixed-rate.o clk-gate.o \ |
| 4 | clk-mux.o clk-divider.o clk-fixed-factor.o | 5 | clk-mux.o clk-divider.o clk-fixed-factor.o |
diff --git a/drivers/clk/clk-devres.c b/drivers/clk/clk-devres.c new file mode 100644 index 000000000000..8f571548870f --- /dev/null +++ b/drivers/clk/clk-devres.c | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | */ | ||
| 6 | |||
| 7 | #include <linux/clk.h> | ||
| 8 | #include <linux/device.h> | ||
| 9 | #include <linux/export.h> | ||
| 10 | #include <linux/gfp.h> | ||
| 11 | |||
| 12 | static void devm_clk_release(struct device *dev, void *res) | ||
| 13 | { | ||
| 14 | clk_put(*(struct clk **)res); | ||
| 15 | } | ||
| 16 | |||
| 17 | struct clk *devm_clk_get(struct device *dev, const char *id) | ||
| 18 | { | ||
| 19 | struct clk **ptr, *clk; | ||
| 20 | |||
| 21 | ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL); | ||
| 22 | if (!ptr) | ||
| 23 | return ERR_PTR(-ENOMEM); | ||
| 24 | |||
| 25 | clk = clk_get(dev, id); | ||
| 26 | if (!IS_ERR(clk)) { | ||
| 27 | *ptr = clk; | ||
| 28 | devres_add(dev, ptr); | ||
| 29 | } else { | ||
| 30 | devres_free(ptr); | ||
| 31 | } | ||
| 32 | |||
| 33 | return clk; | ||
| 34 | } | ||
| 35 | EXPORT_SYMBOL(devm_clk_get); | ||
| 36 | |||
| 37 | static int devm_clk_match(struct device *dev, void *res, void *data) | ||
| 38 | { | ||
| 39 | struct clk **c = res; | ||
| 40 | if (!c || !*c) { | ||
| 41 | WARN_ON(!c || !*c); | ||
| 42 | return 0; | ||
| 43 | } | ||
| 44 | return *c == data; | ||
| 45 | } | ||
| 46 | |||
| 47 | void devm_clk_put(struct device *dev, struct clk *clk) | ||
| 48 | { | ||
| 49 | int ret; | ||
| 50 | |||
| 51 | ret = devres_release(dev, devm_clk_release, devm_clk_match, clk); | ||
| 52 | |||
| 53 | WARN_ON(ret); | ||
| 54 | } | ||
| 55 | EXPORT_SYMBOL(devm_clk_put); | ||
diff --git a/drivers/clk/clkdev.c b/drivers/clk/clkdev.c index d423c9bdd71a..442a31363873 100644 --- a/drivers/clk/clkdev.c +++ b/drivers/clk/clkdev.c | |||
| @@ -171,51 +171,6 @@ void clk_put(struct clk *clk) | |||
| 171 | } | 171 | } |
| 172 | EXPORT_SYMBOL(clk_put); | 172 | EXPORT_SYMBOL(clk_put); |
| 173 | 173 | ||
| 174 | static void devm_clk_release(struct device *dev, void *res) | ||
| 175 | { | ||
| 176 | clk_put(*(struct clk **)res); | ||
| 177 | } | ||
| 178 | |||
| 179 | struct clk *devm_clk_get(struct device *dev, const char *id) | ||
| 180 | { | ||
| 181 | struct clk **ptr, *clk; | ||
| 182 | |||
| 183 | ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL); | ||
| 184 | if (!ptr) | ||
| 185 | return ERR_PTR(-ENOMEM); | ||
| 186 | |||
| 187 | clk = clk_get(dev, id); | ||
| 188 | if (!IS_ERR(clk)) { | ||
| 189 | *ptr = clk; | ||
| 190 | devres_add(dev, ptr); | ||
| 191 | } else { | ||
| 192 | devres_free(ptr); | ||
| 193 | } | ||
| 194 | |||
| 195 | return clk; | ||
| 196 | } | ||
| 197 | EXPORT_SYMBOL(devm_clk_get); | ||
| 198 | |||
| 199 | static int devm_clk_match(struct device *dev, void *res, void *data) | ||
| 200 | { | ||
| 201 | struct clk **c = res; | ||
| 202 | if (!c || !*c) { | ||
| 203 | WARN_ON(!c || !*c); | ||
| 204 | return 0; | ||
| 205 | } | ||
| 206 | return *c == data; | ||
| 207 | } | ||
| 208 | |||
| 209 | void devm_clk_put(struct device *dev, struct clk *clk) | ||
| 210 | { | ||
| 211 | int ret; | ||
| 212 | |||
| 213 | ret = devres_destroy(dev, devm_clk_release, devm_clk_match, clk); | ||
| 214 | |||
| 215 | WARN_ON(ret); | ||
| 216 | } | ||
| 217 | EXPORT_SYMBOL(devm_clk_put); | ||
| 218 | |||
| 219 | void clkdev_add(struct clk_lookup *cl) | 174 | void clkdev_add(struct clk_lookup *cl) |
| 220 | { | 175 | { |
| 221 | mutex_lock(&clocks_mutex); | 176 | mutex_lock(&clocks_mutex); |
diff --git a/drivers/cpufreq/omap-cpufreq.c b/drivers/cpufreq/omap-cpufreq.c index 17fa04d08be9..b47034e650a5 100644 --- a/drivers/cpufreq/omap-cpufreq.c +++ b/drivers/cpufreq/omap-cpufreq.c | |||
| @@ -218,7 +218,7 @@ static int __cpuinit omap_cpu_init(struct cpufreq_policy *policy) | |||
| 218 | 218 | ||
| 219 | policy->cur = policy->min = policy->max = omap_getspeed(policy->cpu); | 219 | policy->cur = policy->min = policy->max = omap_getspeed(policy->cpu); |
| 220 | 220 | ||
| 221 | if (atomic_inc_return(&freq_table_users) == 1) | 221 | if (!freq_table) |
| 222 | result = opp_init_cpufreq_table(mpu_dev, &freq_table); | 222 | result = opp_init_cpufreq_table(mpu_dev, &freq_table); |
| 223 | 223 | ||
| 224 | if (result) { | 224 | if (result) { |
| @@ -227,6 +227,8 @@ static int __cpuinit omap_cpu_init(struct cpufreq_policy *policy) | |||
| 227 | goto fail_ck; | 227 | goto fail_ck; |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | atomic_inc_return(&freq_table_users); | ||
| 231 | |||
| 230 | result = cpufreq_frequency_table_cpuinfo(policy, freq_table); | 232 | result = cpufreq_frequency_table_cpuinfo(policy, freq_table); |
| 231 | if (result) | 233 | if (result) |
| 232 | goto fail_table; | 234 | goto fail_table; |
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c index c0e816468e30..1a40935c85fd 100644 --- a/drivers/cpufreq/powernow-k8.c +++ b/drivers/cpufreq/powernow-k8.c | |||
| @@ -35,7 +35,6 @@ | |||
| 35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
| 36 | #include <linux/string.h> | 36 | #include <linux/string.h> |
| 37 | #include <linux/cpumask.h> | 37 | #include <linux/cpumask.h> |
| 38 | #include <linux/sched.h> /* for current / set_cpus_allowed() */ | ||
| 39 | #include <linux/io.h> | 38 | #include <linux/io.h> |
| 40 | #include <linux/delay.h> | 39 | #include <linux/delay.h> |
| 41 | 40 | ||
| @@ -1139,16 +1138,23 @@ static int transition_frequency_pstate(struct powernow_k8_data *data, | |||
| 1139 | return res; | 1138 | return res; |
| 1140 | } | 1139 | } |
| 1141 | 1140 | ||
| 1142 | /* Driver entry point to switch to the target frequency */ | 1141 | struct powernowk8_target_arg { |
| 1143 | static int powernowk8_target(struct cpufreq_policy *pol, | 1142 | struct cpufreq_policy *pol; |
| 1144 | unsigned targfreq, unsigned relation) | 1143 | unsigned targfreq; |
| 1144 | unsigned relation; | ||
| 1145 | }; | ||
| 1146 | |||
| 1147 | static long powernowk8_target_fn(void *arg) | ||
| 1145 | { | 1148 | { |
| 1146 | cpumask_var_t oldmask; | 1149 | struct powernowk8_target_arg *pta = arg; |
| 1150 | struct cpufreq_policy *pol = pta->pol; | ||
| 1151 | unsigned targfreq = pta->targfreq; | ||
| 1152 | unsigned relation = pta->relation; | ||
| 1147 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); | 1153 | struct powernow_k8_data *data = per_cpu(powernow_data, pol->cpu); |
| 1148 | u32 checkfid; | 1154 | u32 checkfid; |
| 1149 | u32 checkvid; | 1155 | u32 checkvid; |
| 1150 | unsigned int newstate; | 1156 | unsigned int newstate; |
| 1151 | int ret = -EIO; | 1157 | int ret; |
| 1152 | 1158 | ||
| 1153 | if (!data) | 1159 | if (!data) |
| 1154 | return -EINVAL; | 1160 | return -EINVAL; |
| @@ -1156,29 +1162,16 @@ static int powernowk8_target(struct cpufreq_policy *pol, | |||
| 1156 | checkfid = data->currfid; | 1162 | checkfid = data->currfid; |
| 1157 | checkvid = data->currvid; | 1163 | checkvid = data->currvid; |
| 1158 | 1164 | ||
| 1159 | /* only run on specific CPU from here on. */ | ||
| 1160 | /* This is poor form: use a workqueue or smp_call_function_single */ | ||
| 1161 | if (!alloc_cpumask_var(&oldmask, GFP_KERNEL)) | ||
| 1162 | return -ENOMEM; | ||
| 1163 | |||
| 1164 | cpumask_copy(oldmask, tsk_cpus_allowed(current)); | ||
| 1165 | set_cpus_allowed_ptr(current, cpumask_of(pol->cpu)); | ||
| 1166 | |||
| 1167 | if (smp_processor_id() != pol->cpu) { | ||
| 1168 | printk(KERN_ERR PFX "limiting to cpu %u failed\n", pol->cpu); | ||
| 1169 | goto err_out; | ||
| 1170 | } | ||
| 1171 | |||
| 1172 | if (pending_bit_stuck()) { | 1165 | if (pending_bit_stuck()) { |
| 1173 | printk(KERN_ERR PFX "failing targ, change pending bit set\n"); | 1166 | printk(KERN_ERR PFX "failing targ, change pending bit set\n"); |
| 1174 | goto err_out; | 1167 | return -EIO; |
| 1175 | } | 1168 | } |
| 1176 | 1169 | ||
| 1177 | pr_debug("targ: cpu %d, %d kHz, min %d, max %d, relation %d\n", | 1170 | pr_debug("targ: cpu %d, %d kHz, min %d, max %d, relation %d\n", |
| 1178 | pol->cpu, targfreq, pol->min, pol->max, relation); | 1171 | pol->cpu, targfreq, pol->min, pol->max, relation); |
| 1179 | 1172 | ||
| 1180 | if (query_current_values_with_pending_wait(data)) | 1173 | if (query_current_values_with_pending_wait(data)) |
| 1181 | goto err_out; | 1174 | return -EIO; |
| 1182 | 1175 | ||
| 1183 | if (cpu_family != CPU_HW_PSTATE) { | 1176 | if (cpu_family != CPU_HW_PSTATE) { |
| 1184 | pr_debug("targ: curr fid 0x%x, vid 0x%x\n", | 1177 | pr_debug("targ: curr fid 0x%x, vid 0x%x\n", |
| @@ -1196,7 +1189,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, | |||
| 1196 | 1189 | ||
| 1197 | if (cpufreq_frequency_table_target(pol, data->powernow_table, | 1190 | if (cpufreq_frequency_table_target(pol, data->powernow_table, |
| 1198 | targfreq, relation, &newstate)) | 1191 | targfreq, relation, &newstate)) |
| 1199 | goto err_out; | 1192 | return -EIO; |
| 1200 | 1193 | ||
| 1201 | mutex_lock(&fidvid_mutex); | 1194 | mutex_lock(&fidvid_mutex); |
| 1202 | 1195 | ||
| @@ -1209,9 +1202,8 @@ static int powernowk8_target(struct cpufreq_policy *pol, | |||
| 1209 | ret = transition_frequency_fidvid(data, newstate); | 1202 | ret = transition_frequency_fidvid(data, newstate); |
| 1210 | if (ret) { | 1203 | if (ret) { |
| 1211 | printk(KERN_ERR PFX "transition frequency failed\n"); | 1204 | printk(KERN_ERR PFX "transition frequency failed\n"); |
| 1212 | ret = 1; | ||
| 1213 | mutex_unlock(&fidvid_mutex); | 1205 | mutex_unlock(&fidvid_mutex); |
| 1214 | goto err_out; | 1206 | return 1; |
| 1215 | } | 1207 | } |
| 1216 | mutex_unlock(&fidvid_mutex); | 1208 | mutex_unlock(&fidvid_mutex); |
| 1217 | 1209 | ||
| @@ -1220,12 +1212,25 @@ static int powernowk8_target(struct cpufreq_policy *pol, | |||
| 1220 | data->powernow_table[newstate].index); | 1212 | data->powernow_table[newstate].index); |
| 1221 | else | 1213 | else |
| 1222 | pol->cur = find_khz_freq_from_fid(data->currfid); | 1214 | pol->cur = find_khz_freq_from_fid(data->currfid); |
| 1223 | ret = 0; | ||
| 1224 | 1215 | ||
| 1225 | err_out: | 1216 | return 0; |
| 1226 | set_cpus_allowed_ptr(current, oldmask); | 1217 | } |
| 1227 | free_cpumask_var(oldmask); | 1218 | |
| 1228 | return ret; | 1219 | /* Driver entry point to switch to the target frequency */ |
| 1220 | static int powernowk8_target(struct cpufreq_policy *pol, | ||
| 1221 | unsigned targfreq, unsigned relation) | ||
| 1222 | { | ||
| 1223 | struct powernowk8_target_arg pta = { .pol = pol, .targfreq = targfreq, | ||
| 1224 | .relation = relation }; | ||
| 1225 | |||
| 1226 | /* | ||
| 1227 | * Must run on @pol->cpu. cpufreq core is responsible for ensuring | ||
| 1228 | * that we're bound to the current CPU and pol->cpu stays online. | ||
| 1229 | */ | ||
| 1230 | if (smp_processor_id() == pol->cpu) | ||
| 1231 | return powernowk8_target_fn(&pta); | ||
| 1232 | else | ||
| 1233 | return work_on_cpu(pol->cpu, powernowk8_target_fn, &pta); | ||
| 1229 | } | 1234 | } |
| 1230 | 1235 | ||
| 1231 | /* Driver entry point to verify the policy and range of frequencies */ | 1236 | /* Driver entry point to verify the policy and range of frequencies */ |
diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c index 53c8c51d5881..93d14070141a 100644 --- a/drivers/crypto/caam/jr.c +++ b/drivers/crypto/caam/jr.c | |||
| @@ -63,7 +63,7 @@ static void caam_jr_dequeue(unsigned long devarg) | |||
| 63 | 63 | ||
| 64 | head = ACCESS_ONCE(jrp->head); | 64 | head = ACCESS_ONCE(jrp->head); |
| 65 | 65 | ||
| 66 | spin_lock_bh(&jrp->outlock); | 66 | spin_lock(&jrp->outlock); |
| 67 | 67 | ||
| 68 | sw_idx = tail = jrp->tail; | 68 | sw_idx = tail = jrp->tail; |
| 69 | hw_idx = jrp->out_ring_read_index; | 69 | hw_idx = jrp->out_ring_read_index; |
| @@ -115,7 +115,7 @@ static void caam_jr_dequeue(unsigned long devarg) | |||
| 115 | jrp->tail = tail; | 115 | jrp->tail = tail; |
| 116 | } | 116 | } |
| 117 | 117 | ||
| 118 | spin_unlock_bh(&jrp->outlock); | 118 | spin_unlock(&jrp->outlock); |
| 119 | 119 | ||
| 120 | /* Finally, execute user's callback */ | 120 | /* Finally, execute user's callback */ |
| 121 | usercall(dev, userdesc, userstatus, userarg); | 121 | usercall(dev, userdesc, userstatus, userarg); |
| @@ -236,14 +236,14 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, | |||
| 236 | return -EIO; | 236 | return -EIO; |
| 237 | } | 237 | } |
| 238 | 238 | ||
| 239 | spin_lock(&jrp->inplock); | 239 | spin_lock_bh(&jrp->inplock); |
| 240 | 240 | ||
| 241 | head = jrp->head; | 241 | head = jrp->head; |
| 242 | tail = ACCESS_ONCE(jrp->tail); | 242 | tail = ACCESS_ONCE(jrp->tail); |
| 243 | 243 | ||
| 244 | if (!rd_reg32(&jrp->rregs->inpring_avail) || | 244 | if (!rd_reg32(&jrp->rregs->inpring_avail) || |
| 245 | CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { | 245 | CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { |
| 246 | spin_unlock(&jrp->inplock); | 246 | spin_unlock_bh(&jrp->inplock); |
| 247 | dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); | 247 | dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); |
| 248 | return -EBUSY; | 248 | return -EBUSY; |
| 249 | } | 249 | } |
| @@ -265,7 +265,7 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, | |||
| 265 | 265 | ||
| 266 | wr_reg32(&jrp->rregs->inpring_jobadd, 1); | 266 | wr_reg32(&jrp->rregs->inpring_jobadd, 1); |
| 267 | 267 | ||
| 268 | spin_unlock(&jrp->inplock); | 268 | spin_unlock_bh(&jrp->inplock); |
| 269 | 269 | ||
| 270 | return 0; | 270 | return 0; |
| 271 | } | 271 | } |
diff --git a/drivers/crypto/caam/key_gen.c b/drivers/crypto/caam/key_gen.c index 002888185f17..d216cd3cc569 100644 --- a/drivers/crypto/caam/key_gen.c +++ b/drivers/crypto/caam/key_gen.c | |||
| @@ -120,3 +120,4 @@ u32 gen_split_key(struct device *jrdev, u8 *key_out, int split_key_len, | |||
| 120 | 120 | ||
| 121 | return ret; | 121 | return ret; |
| 122 | } | 122 | } |
| 123 | EXPORT_SYMBOL(gen_split_key); | ||
diff --git a/drivers/crypto/hifn_795x.c b/drivers/crypto/hifn_795x.c index c9c4befb5a8d..df14358d7fa1 100644 --- a/drivers/crypto/hifn_795x.c +++ b/drivers/crypto/hifn_795x.c | |||
| @@ -821,8 +821,8 @@ static int hifn_register_rng(struct hifn_device *dev) | |||
| 821 | /* | 821 | /* |
| 822 | * We must wait at least 256 Pk_clk cycles between two reads of the rng. | 822 | * We must wait at least 256 Pk_clk cycles between two reads of the rng. |
| 823 | */ | 823 | */ |
| 824 | dev->rng_wait_time = DIV_ROUND_UP(NSEC_PER_SEC, dev->pk_clk_freq) * | 824 | dev->rng_wait_time = DIV_ROUND_UP_ULL(NSEC_PER_SEC, |
| 825 | 256; | 825 | dev->pk_clk_freq) * 256; |
| 826 | 826 | ||
| 827 | dev->rng.name = dev->name; | 827 | dev->rng.name = dev->name; |
| 828 | dev->rng.data_present = hifn_rng_data_present, | 828 | dev->rng.data_present = hifn_rng_data_present, |
diff --git a/drivers/dma/at_hdmac.c b/drivers/dma/at_hdmac.c index 3934fcc4e00b..7ab6e26664a7 100644 --- a/drivers/dma/at_hdmac.c +++ b/drivers/dma/at_hdmac.c | |||
| @@ -661,7 +661,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 661 | flags); | 661 | flags); |
| 662 | 662 | ||
| 663 | if (unlikely(!atslave || !sg_len)) { | 663 | if (unlikely(!atslave || !sg_len)) { |
| 664 | dev_dbg(chan2dev(chan), "prep_dma_memcpy: length is zero!\n"); | 664 | dev_dbg(chan2dev(chan), "prep_slave_sg: sg length is zero!\n"); |
| 665 | return NULL; | 665 | return NULL; |
| 666 | } | 666 | } |
| 667 | 667 | ||
| @@ -689,6 +689,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 689 | 689 | ||
| 690 | mem = sg_dma_address(sg); | 690 | mem = sg_dma_address(sg); |
| 691 | len = sg_dma_len(sg); | 691 | len = sg_dma_len(sg); |
| 692 | if (unlikely(!len)) { | ||
| 693 | dev_dbg(chan2dev(chan), | ||
| 694 | "prep_slave_sg: sg(%d) data length is zero\n", i); | ||
| 695 | goto err; | ||
| 696 | } | ||
| 692 | mem_width = 2; | 697 | mem_width = 2; |
| 693 | if (unlikely(mem & 3 || len & 3)) | 698 | if (unlikely(mem & 3 || len & 3)) |
| 694 | mem_width = 0; | 699 | mem_width = 0; |
| @@ -724,6 +729,11 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 724 | 729 | ||
| 725 | mem = sg_dma_address(sg); | 730 | mem = sg_dma_address(sg); |
| 726 | len = sg_dma_len(sg); | 731 | len = sg_dma_len(sg); |
| 732 | if (unlikely(!len)) { | ||
| 733 | dev_dbg(chan2dev(chan), | ||
| 734 | "prep_slave_sg: sg(%d) data length is zero\n", i); | ||
| 735 | goto err; | ||
| 736 | } | ||
| 727 | mem_width = 2; | 737 | mem_width = 2; |
| 728 | if (unlikely(mem & 3 || len & 3)) | 738 | if (unlikely(mem & 3 || len & 3)) |
| 729 | mem_width = 0; | 739 | mem_width = 0; |
| @@ -757,6 +767,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, | |||
| 757 | 767 | ||
| 758 | err_desc_get: | 768 | err_desc_get: |
| 759 | dev_err(chan2dev(chan), "not enough descriptors available\n"); | 769 | dev_err(chan2dev(chan), "not enough descriptors available\n"); |
| 770 | err: | ||
| 760 | atc_desc_put(atchan, first); | 771 | atc_desc_put(atchan, first); |
| 761 | return NULL; | 772 | return NULL; |
| 762 | } | 773 | } |
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index e4feba6b03c0..f5843bc80baa 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c | |||
| @@ -1567,17 +1567,19 @@ static int pl330_submit_req(void *ch_id, struct pl330_req *r) | |||
| 1567 | goto xfer_exit; | 1567 | goto xfer_exit; |
| 1568 | } | 1568 | } |
| 1569 | 1569 | ||
| 1570 | /* Prefer Secure Channel */ | ||
| 1571 | if (!_manager_ns(thrd)) | ||
| 1572 | r->cfg->nonsecure = 0; | ||
| 1573 | else | ||
| 1574 | r->cfg->nonsecure = 1; | ||
| 1575 | 1570 | ||
| 1576 | /* Use last settings, if not provided */ | 1571 | /* Use last settings, if not provided */ |
| 1577 | if (r->cfg) | 1572 | if (r->cfg) { |
| 1573 | /* Prefer Secure Channel */ | ||
| 1574 | if (!_manager_ns(thrd)) | ||
| 1575 | r->cfg->nonsecure = 0; | ||
| 1576 | else | ||
| 1577 | r->cfg->nonsecure = 1; | ||
| 1578 | |||
| 1578 | ccr = _prepare_ccr(r->cfg); | 1579 | ccr = _prepare_ccr(r->cfg); |
| 1579 | else | 1580 | } else { |
| 1580 | ccr = readl(regs + CC(thrd->id)); | 1581 | ccr = readl(regs + CC(thrd->id)); |
| 1582 | } | ||
| 1581 | 1583 | ||
| 1582 | /* If this req doesn't have valid xfer settings */ | 1584 | /* If this req doesn't have valid xfer settings */ |
| 1583 | if (!_is_valid(ccr)) { | 1585 | if (!_is_valid(ccr)) { |
| @@ -2928,6 +2930,11 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 2928 | num_chan = max_t(int, pi->pcfg.num_peri, pi->pcfg.num_chan); | 2930 | num_chan = max_t(int, pi->pcfg.num_peri, pi->pcfg.num_chan); |
| 2929 | 2931 | ||
| 2930 | pdmac->peripherals = kzalloc(num_chan * sizeof(*pch), GFP_KERNEL); | 2932 | pdmac->peripherals = kzalloc(num_chan * sizeof(*pch), GFP_KERNEL); |
| 2933 | if (!pdmac->peripherals) { | ||
| 2934 | ret = -ENOMEM; | ||
| 2935 | dev_err(&adev->dev, "unable to allocate pdmac->peripherals\n"); | ||
| 2936 | goto probe_err5; | ||
| 2937 | } | ||
| 2931 | 2938 | ||
| 2932 | for (i = 0; i < num_chan; i++) { | 2939 | for (i = 0; i < num_chan; i++) { |
| 2933 | pch = &pdmac->peripherals[i]; | 2940 | pch = &pdmac->peripherals[i]; |
diff --git a/drivers/extcon/extcon-max77693.c b/drivers/extcon/extcon-max77693.c index 920a609b2c35..38f9e52f358b 100644 --- a/drivers/extcon/extcon-max77693.c +++ b/drivers/extcon/extcon-max77693.c | |||
| @@ -669,13 +669,18 @@ static int __devinit max77693_muic_probe(struct platform_device *pdev) | |||
| 669 | } | 669 | } |
| 670 | info->dev = &pdev->dev; | 670 | info->dev = &pdev->dev; |
| 671 | info->max77693 = max77693; | 671 | info->max77693 = max77693; |
| 672 | info->max77693->regmap_muic = regmap_init_i2c(info->max77693->muic, | 672 | if (info->max77693->regmap_muic) |
| 673 | &max77693_muic_regmap_config); | 673 | dev_dbg(&pdev->dev, "allocate register map\n"); |
| 674 | if (IS_ERR(info->max77693->regmap_muic)) { | 674 | else { |
| 675 | ret = PTR_ERR(info->max77693->regmap_muic); | 675 | info->max77693->regmap_muic = devm_regmap_init_i2c( |
| 676 | dev_err(max77693->dev, | 676 | info->max77693->muic, |
| 677 | "failed to allocate register map: %d\n", ret); | 677 | &max77693_muic_regmap_config); |
| 678 | goto err_regmap; | 678 | if (IS_ERR(info->max77693->regmap_muic)) { |
| 679 | ret = PTR_ERR(info->max77693->regmap_muic); | ||
| 680 | dev_err(max77693->dev, | ||
| 681 | "failed to allocate register map: %d\n", ret); | ||
| 682 | goto err_regmap; | ||
| 683 | } | ||
| 679 | } | 684 | } |
| 680 | platform_set_drvdata(pdev, info); | 685 | platform_set_drvdata(pdev, info); |
| 681 | mutex_init(&info->mutex); | 686 | mutex_init(&info->mutex); |
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index b16c8a72a2e2..ba7926f5c099 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig | |||
| @@ -294,7 +294,7 @@ config GPIO_MAX732X_IRQ | |||
| 294 | 294 | ||
| 295 | config GPIO_MC9S08DZ60 | 295 | config GPIO_MC9S08DZ60 |
| 296 | bool "MX35 3DS BOARD MC9S08DZ60 GPIO functions" | 296 | bool "MX35 3DS BOARD MC9S08DZ60 GPIO functions" |
| 297 | depends on I2C && MACH_MX35_3DS | 297 | depends on I2C=y && MACH_MX35_3DS |
| 298 | help | 298 | help |
| 299 | Select this to enable the MC9S08DZ60 GPIO driver | 299 | Select this to enable the MC9S08DZ60 GPIO driver |
| 300 | 300 | ||
diff --git a/drivers/gpio/gpio-em.c b/drivers/gpio/gpio-em.c index ae37181798b3..ec48ed512628 100644 --- a/drivers/gpio/gpio-em.c +++ b/drivers/gpio/gpio-em.c | |||
| @@ -247,9 +247,9 @@ static int __devinit em_gio_irq_domain_init(struct em_gio_priv *p) | |||
| 247 | 247 | ||
| 248 | p->irq_base = irq_alloc_descs(pdata->irq_base, 0, | 248 | p->irq_base = irq_alloc_descs(pdata->irq_base, 0, |
| 249 | pdata->number_of_pins, numa_node_id()); | 249 | pdata->number_of_pins, numa_node_id()); |
| 250 | if (IS_ERR_VALUE(p->irq_base)) { | 250 | if (p->irq_base < 0) { |
| 251 | dev_err(&pdev->dev, "cannot get irq_desc\n"); | 251 | dev_err(&pdev->dev, "cannot get irq_desc\n"); |
| 252 | return -ENXIO; | 252 | return p->irq_base; |
| 253 | } | 253 | } |
| 254 | pr_debug("gio: hw base = %d, nr = %d, sw base = %d\n", | 254 | pr_debug("gio: hw base = %d, nr = %d, sw base = %d\n", |
| 255 | pdata->gpio_base, pdata->number_of_pins, p->irq_base); | 255 | pdata->gpio_base, pdata->number_of_pins, p->irq_base); |
diff --git a/drivers/gpio/gpio-rdc321x.c b/drivers/gpio/gpio-rdc321x.c index e97016af6443..b62d443e9a59 100644 --- a/drivers/gpio/gpio-rdc321x.c +++ b/drivers/gpio/gpio-rdc321x.c | |||
| @@ -170,6 +170,7 @@ static int __devinit rdc321x_gpio_probe(struct platform_device *pdev) | |||
| 170 | rdc321x_gpio_dev->reg2_data_base = r->start + 0x4; | 170 | rdc321x_gpio_dev->reg2_data_base = r->start + 0x4; |
| 171 | 171 | ||
| 172 | rdc321x_gpio_dev->chip.label = "rdc321x-gpio"; | 172 | rdc321x_gpio_dev->chip.label = "rdc321x-gpio"; |
| 173 | rdc321x_gpio_dev->chip.owner = THIS_MODULE; | ||
| 173 | rdc321x_gpio_dev->chip.direction_input = rdc_gpio_direction_input; | 174 | rdc321x_gpio_dev->chip.direction_input = rdc_gpio_direction_input; |
| 174 | rdc321x_gpio_dev->chip.direction_output = rdc_gpio_config; | 175 | rdc321x_gpio_dev->chip.direction_output = rdc_gpio_config; |
| 175 | rdc321x_gpio_dev->chip.get = rdc_gpio_get_value; | 176 | rdc321x_gpio_dev->chip.get = rdc_gpio_get_value; |
diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c index a18c4aa68b1e..f1a45997aea8 100644 --- a/drivers/gpio/gpiolib-of.c +++ b/drivers/gpio/gpiolib-of.c | |||
| @@ -82,7 +82,7 @@ int of_get_named_gpio_flags(struct device_node *np, const char *propname, | |||
| 82 | gpiochip_find(&gg_data, of_gpiochip_find_and_xlate); | 82 | gpiochip_find(&gg_data, of_gpiochip_find_and_xlate); |
| 83 | 83 | ||
| 84 | of_node_put(gg_data.gpiospec.np); | 84 | of_node_put(gg_data.gpiospec.np); |
| 85 | pr_debug("%s exited with status %d\n", __func__, ret); | 85 | pr_debug("%s exited with status %d\n", __func__, gg_data.out_gpio); |
| 86 | return gg_data.out_gpio; | 86 | return gg_data.out_gpio; |
| 87 | } | 87 | } |
| 88 | EXPORT_SYMBOL(of_get_named_gpio_flags); | 88 | EXPORT_SYMBOL(of_get_named_gpio_flags); |
diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c index d0c4574ef49c..36164806b9d4 100644 --- a/drivers/gpu/drm/ast/ast_drv.c +++ b/drivers/gpu/drm/ast/ast_drv.c | |||
| @@ -193,6 +193,9 @@ static const struct file_operations ast_fops = { | |||
| 193 | .mmap = ast_mmap, | 193 | .mmap = ast_mmap, |
| 194 | .poll = drm_poll, | 194 | .poll = drm_poll, |
| 195 | .fasync = drm_fasync, | 195 | .fasync = drm_fasync, |
| 196 | #ifdef CONFIG_COMPAT | ||
| 197 | .compat_ioctl = drm_compat_ioctl, | ||
| 198 | #endif | ||
| 196 | .read = drm_read, | 199 | .read = drm_read, |
| 197 | }; | 200 | }; |
| 198 | 201 | ||
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 7282c081fb53..a712cafcfa1d 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c | |||
| @@ -841,7 +841,7 @@ int ast_cursor_init(struct drm_device *dev) | |||
| 841 | 841 | ||
| 842 | ast->cursor_cache = obj; | 842 | ast->cursor_cache = obj; |
| 843 | ast->cursor_cache_gpu_addr = gpu_addr; | 843 | ast->cursor_cache_gpu_addr = gpu_addr; |
| 844 | DRM_ERROR("pinned cursor cache at %llx\n", ast->cursor_cache_gpu_addr); | 844 | DRM_DEBUG_KMS("pinned cursor cache at %llx\n", ast->cursor_cache_gpu_addr); |
| 845 | return 0; | 845 | return 0; |
| 846 | fail: | 846 | fail: |
| 847 | return ret; | 847 | return ret; |
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c index 7053140c6596..b83a2d7ddd1a 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.c +++ b/drivers/gpu/drm/cirrus/cirrus_drv.c | |||
| @@ -74,6 +74,9 @@ static const struct file_operations cirrus_driver_fops = { | |||
| 74 | .unlocked_ioctl = drm_ioctl, | 74 | .unlocked_ioctl = drm_ioctl, |
| 75 | .mmap = cirrus_mmap, | 75 | .mmap = cirrus_mmap, |
| 76 | .poll = drm_poll, | 76 | .poll = drm_poll, |
| 77 | #ifdef CONFIG_COMPAT | ||
| 78 | .compat_ioctl = drm_compat_ioctl, | ||
| 79 | #endif | ||
| 77 | .fasync = drm_fasync, | 80 | .fasync = drm_fasync, |
| 78 | }; | 81 | }; |
| 79 | static struct drm_driver driver = { | 82 | static struct drm_driver driver = { |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 08a7aa722d6b..6fbfc244748f 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -1981,7 +1981,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, | |||
| 1981 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | 1981 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 1982 | return -EINVAL; | 1982 | return -EINVAL; |
| 1983 | 1983 | ||
| 1984 | if (!req->flags) | 1984 | if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags)) |
| 1985 | return -EINVAL; | 1985 | return -EINVAL; |
| 1986 | 1986 | ||
| 1987 | mutex_lock(&dev->mode_config.mutex); | 1987 | mutex_lock(&dev->mode_config.mutex); |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index a8743c399e83..b7ee230572b7 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -87,6 +87,9 @@ static struct edid_quirk { | |||
| 87 | int product_id; | 87 | int product_id; |
| 88 | u32 quirks; | 88 | u32 quirks; |
| 89 | } edid_quirk_list[] = { | 89 | } edid_quirk_list[] = { |
| 90 | /* ASUS VW222S */ | ||
| 91 | { "ACI", 0x22a2, EDID_QUIRK_FORCE_REDUCED_BLANKING }, | ||
| 92 | |||
| 90 | /* Acer AL1706 */ | 93 | /* Acer AL1706 */ |
| 91 | { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, | 94 | { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, |
| 92 | /* Acer F51 */ | 95 | /* Acer F51 */ |
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 7f5096763b7d..59a26e577b57 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig | |||
| @@ -36,6 +36,6 @@ config DRM_EXYNOS_VIDI | |||
| 36 | 36 | ||
| 37 | config DRM_EXYNOS_G2D | 37 | config DRM_EXYNOS_G2D |
| 38 | bool "Exynos DRM G2D" | 38 | bool "Exynos DRM G2D" |
| 39 | depends on DRM_EXYNOS | 39 | depends on DRM_EXYNOS && !VIDEO_SAMSUNG_S5P_G2D |
| 40 | help | 40 | help |
| 41 | Choose this option if you want to use Exynos G2D for DRM. | 41 | Choose this option if you want to use Exynos G2D for DRM. |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 613bf8a5d9b2..ae13febe0eaa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | |||
| @@ -163,6 +163,12 @@ static void exynos_gem_dmabuf_kunmap(struct dma_buf *dma_buf, | |||
| 163 | /* TODO */ | 163 | /* TODO */ |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | static int exynos_gem_dmabuf_mmap(struct dma_buf *dma_buf, | ||
| 167 | struct vm_area_struct *vma) | ||
| 168 | { | ||
| 169 | return -ENOTTY; | ||
| 170 | } | ||
| 171 | |||
| 166 | static struct dma_buf_ops exynos_dmabuf_ops = { | 172 | static struct dma_buf_ops exynos_dmabuf_ops = { |
| 167 | .map_dma_buf = exynos_gem_map_dma_buf, | 173 | .map_dma_buf = exynos_gem_map_dma_buf, |
| 168 | .unmap_dma_buf = exynos_gem_unmap_dma_buf, | 174 | .unmap_dma_buf = exynos_gem_unmap_dma_buf, |
| @@ -170,6 +176,7 @@ static struct dma_buf_ops exynos_dmabuf_ops = { | |||
| 170 | .kmap_atomic = exynos_gem_dmabuf_kmap_atomic, | 176 | .kmap_atomic = exynos_gem_dmabuf_kmap_atomic, |
| 171 | .kunmap = exynos_gem_dmabuf_kunmap, | 177 | .kunmap = exynos_gem_dmabuf_kunmap, |
| 172 | .kunmap_atomic = exynos_gem_dmabuf_kunmap_atomic, | 178 | .kunmap_atomic = exynos_gem_dmabuf_kunmap_atomic, |
| 179 | .mmap = exynos_gem_dmabuf_mmap, | ||
| 173 | .release = exynos_dmabuf_release, | 180 | .release = exynos_dmabuf_release, |
| 174 | }; | 181 | }; |
| 175 | 182 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index ebacec6f1e48..d07071937453 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -160,7 +160,6 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | |||
| 160 | if (!file_priv) | 160 | if (!file_priv) |
| 161 | return -ENOMEM; | 161 | return -ENOMEM; |
| 162 | 162 | ||
| 163 | drm_prime_init_file_private(&file->prime); | ||
| 164 | file->driver_priv = file_priv; | 163 | file->driver_priv = file_priv; |
| 165 | 164 | ||
| 166 | return exynos_drm_subdrv_open(dev, file); | 165 | return exynos_drm_subdrv_open(dev, file); |
| @@ -184,7 +183,6 @@ static void exynos_drm_preclose(struct drm_device *dev, | |||
| 184 | e->base.destroy(&e->base); | 183 | e->base.destroy(&e->base); |
| 185 | } | 184 | } |
| 186 | } | 185 | } |
| 187 | drm_prime_destroy_file_private(&file->prime); | ||
| 188 | spin_unlock_irqrestore(&dev->event_lock, flags); | 186 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 189 | 187 | ||
| 190 | exynos_drm_subdrv_close(dev, file); | 188 | exynos_drm_subdrv_close(dev, file); |
| @@ -241,6 +239,9 @@ static const struct file_operations exynos_drm_driver_fops = { | |||
| 241 | .poll = drm_poll, | 239 | .poll = drm_poll, |
| 242 | .read = drm_read, | 240 | .read = drm_read, |
| 243 | .unlocked_ioctl = drm_ioctl, | 241 | .unlocked_ioctl = drm_ioctl, |
| 242 | #ifdef CONFIG_COMPAT | ||
| 243 | .compat_ioctl = drm_compat_ioctl, | ||
| 244 | #endif | ||
| 244 | .release = drm_release, | 245 | .release = drm_release, |
| 245 | }; | 246 | }; |
| 246 | 247 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index a68d2b313f03..b19cd93e7047 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -831,11 +831,6 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
| 831 | } | 831 | } |
| 832 | 832 | ||
| 833 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 833 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 834 | if (!res) { | ||
| 835 | dev_err(dev, "failed to find registers\n"); | ||
| 836 | ret = -ENOENT; | ||
| 837 | goto err_clk; | ||
| 838 | } | ||
| 839 | 834 | ||
| 840 | ctx->regs = devm_request_and_ioremap(&pdev->dev, res); | 835 | ctx->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 841 | if (!ctx->regs) { | 836 | if (!ctx->regs) { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index d2d88f22a037..1065e90d0919 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
| @@ -129,7 +129,6 @@ struct g2d_runqueue_node { | |||
| 129 | struct g2d_data { | 129 | struct g2d_data { |
| 130 | struct device *dev; | 130 | struct device *dev; |
| 131 | struct clk *gate_clk; | 131 | struct clk *gate_clk; |
| 132 | struct resource *regs_res; | ||
| 133 | void __iomem *regs; | 132 | void __iomem *regs; |
| 134 | int irq; | 133 | int irq; |
| 135 | struct workqueue_struct *g2d_workq; | 134 | struct workqueue_struct *g2d_workq; |
| @@ -751,7 +750,7 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 751 | struct exynos_drm_subdrv *subdrv; | 750 | struct exynos_drm_subdrv *subdrv; |
| 752 | int ret; | 751 | int ret; |
| 753 | 752 | ||
| 754 | g2d = kzalloc(sizeof(*g2d), GFP_KERNEL); | 753 | g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL); |
| 755 | if (!g2d) { | 754 | if (!g2d) { |
| 756 | dev_err(dev, "failed to allocate driver data\n"); | 755 | dev_err(dev, "failed to allocate driver data\n"); |
| 757 | return -ENOMEM; | 756 | return -ENOMEM; |
| @@ -759,10 +758,8 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 759 | 758 | ||
| 760 | g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", | 759 | g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", |
| 761 | sizeof(struct g2d_runqueue_node), 0, 0, NULL); | 760 | sizeof(struct g2d_runqueue_node), 0, 0, NULL); |
| 762 | if (!g2d->runqueue_slab) { | 761 | if (!g2d->runqueue_slab) |
| 763 | ret = -ENOMEM; | 762 | return -ENOMEM; |
| 764 | goto err_free_mem; | ||
| 765 | } | ||
| 766 | 763 | ||
| 767 | g2d->dev = dev; | 764 | g2d->dev = dev; |
| 768 | 765 | ||
| @@ -794,38 +791,26 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 794 | pm_runtime_enable(dev); | 791 | pm_runtime_enable(dev); |
| 795 | 792 | ||
| 796 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 793 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 797 | if (!res) { | ||
| 798 | dev_err(dev, "failed to get I/O memory\n"); | ||
| 799 | ret = -ENOENT; | ||
| 800 | goto err_put_clk; | ||
| 801 | } | ||
| 802 | 794 | ||
| 803 | g2d->regs_res = request_mem_region(res->start, resource_size(res), | 795 | g2d->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 804 | dev_name(dev)); | ||
| 805 | if (!g2d->regs_res) { | ||
| 806 | dev_err(dev, "failed to request I/O memory\n"); | ||
| 807 | ret = -ENOENT; | ||
| 808 | goto err_put_clk; | ||
| 809 | } | ||
| 810 | |||
| 811 | g2d->regs = ioremap(res->start, resource_size(res)); | ||
| 812 | if (!g2d->regs) { | 796 | if (!g2d->regs) { |
| 813 | dev_err(dev, "failed to remap I/O memory\n"); | 797 | dev_err(dev, "failed to remap I/O memory\n"); |
| 814 | ret = -ENXIO; | 798 | ret = -ENXIO; |
| 815 | goto err_release_res; | 799 | goto err_put_clk; |
| 816 | } | 800 | } |
| 817 | 801 | ||
| 818 | g2d->irq = platform_get_irq(pdev, 0); | 802 | g2d->irq = platform_get_irq(pdev, 0); |
| 819 | if (g2d->irq < 0) { | 803 | if (g2d->irq < 0) { |
| 820 | dev_err(dev, "failed to get irq\n"); | 804 | dev_err(dev, "failed to get irq\n"); |
| 821 | ret = g2d->irq; | 805 | ret = g2d->irq; |
| 822 | goto err_unmap_base; | 806 | goto err_put_clk; |
| 823 | } | 807 | } |
| 824 | 808 | ||
| 825 | ret = request_irq(g2d->irq, g2d_irq_handler, 0, "drm_g2d", g2d); | 809 | ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0, |
| 810 | "drm_g2d", g2d); | ||
| 826 | if (ret < 0) { | 811 | if (ret < 0) { |
| 827 | dev_err(dev, "irq request failed\n"); | 812 | dev_err(dev, "irq request failed\n"); |
| 828 | goto err_unmap_base; | 813 | goto err_put_clk; |
| 829 | } | 814 | } |
| 830 | 815 | ||
| 831 | platform_set_drvdata(pdev, g2d); | 816 | platform_set_drvdata(pdev, g2d); |
| @@ -838,7 +823,7 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 838 | ret = exynos_drm_subdrv_register(subdrv); | 823 | ret = exynos_drm_subdrv_register(subdrv); |
| 839 | if (ret < 0) { | 824 | if (ret < 0) { |
| 840 | dev_err(dev, "failed to register drm g2d device\n"); | 825 | dev_err(dev, "failed to register drm g2d device\n"); |
| 841 | goto err_free_irq; | 826 | goto err_put_clk; |
| 842 | } | 827 | } |
| 843 | 828 | ||
| 844 | dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", | 829 | dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", |
| @@ -846,13 +831,6 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 846 | 831 | ||
| 847 | return 0; | 832 | return 0; |
| 848 | 833 | ||
| 849 | err_free_irq: | ||
| 850 | free_irq(g2d->irq, g2d); | ||
| 851 | err_unmap_base: | ||
| 852 | iounmap(g2d->regs); | ||
| 853 | err_release_res: | ||
| 854 | release_resource(g2d->regs_res); | ||
| 855 | kfree(g2d->regs_res); | ||
| 856 | err_put_clk: | 834 | err_put_clk: |
| 857 | pm_runtime_disable(dev); | 835 | pm_runtime_disable(dev); |
| 858 | clk_put(g2d->gate_clk); | 836 | clk_put(g2d->gate_clk); |
| @@ -862,8 +840,6 @@ err_destroy_workqueue: | |||
| 862 | destroy_workqueue(g2d->g2d_workq); | 840 | destroy_workqueue(g2d->g2d_workq); |
| 863 | err_destroy_slab: | 841 | err_destroy_slab: |
| 864 | kmem_cache_destroy(g2d->runqueue_slab); | 842 | kmem_cache_destroy(g2d->runqueue_slab); |
| 865 | err_free_mem: | ||
| 866 | kfree(g2d); | ||
| 867 | return ret; | 843 | return ret; |
| 868 | } | 844 | } |
| 869 | 845 | ||
| @@ -873,24 +849,18 @@ static int __devexit g2d_remove(struct platform_device *pdev) | |||
| 873 | 849 | ||
| 874 | cancel_work_sync(&g2d->runqueue_work); | 850 | cancel_work_sync(&g2d->runqueue_work); |
| 875 | exynos_drm_subdrv_unregister(&g2d->subdrv); | 851 | exynos_drm_subdrv_unregister(&g2d->subdrv); |
| 876 | free_irq(g2d->irq, g2d); | ||
| 877 | 852 | ||
| 878 | while (g2d->runqueue_node) { | 853 | while (g2d->runqueue_node) { |
| 879 | g2d_free_runqueue_node(g2d, g2d->runqueue_node); | 854 | g2d_free_runqueue_node(g2d, g2d->runqueue_node); |
| 880 | g2d->runqueue_node = g2d_get_runqueue_node(g2d); | 855 | g2d->runqueue_node = g2d_get_runqueue_node(g2d); |
| 881 | } | 856 | } |
| 882 | 857 | ||
| 883 | iounmap(g2d->regs); | ||
| 884 | release_resource(g2d->regs_res); | ||
| 885 | kfree(g2d->regs_res); | ||
| 886 | |||
| 887 | pm_runtime_disable(&pdev->dev); | 858 | pm_runtime_disable(&pdev->dev); |
| 888 | clk_put(g2d->gate_clk); | 859 | clk_put(g2d->gate_clk); |
| 889 | 860 | ||
| 890 | g2d_fini_cmdlist(g2d); | 861 | g2d_fini_cmdlist(g2d); |
| 891 | destroy_workqueue(g2d->g2d_workq); | 862 | destroy_workqueue(g2d->g2d_workq); |
| 892 | kmem_cache_destroy(g2d->runqueue_slab); | 863 | kmem_cache_destroy(g2d->runqueue_slab); |
| 893 | kfree(g2d); | ||
| 894 | 864 | ||
| 895 | return 0; | 865 | return 0; |
| 896 | } | 866 | } |
| @@ -924,7 +894,7 @@ static int g2d_resume(struct device *dev) | |||
| 924 | } | 894 | } |
| 925 | #endif | 895 | #endif |
| 926 | 896 | ||
| 927 | SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume); | 897 | static SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume); |
| 928 | 898 | ||
| 929 | struct platform_driver g2d_driver = { | 899 | struct platform_driver g2d_driver = { |
| 930 | .probe = g2d_probe, | 900 | .probe = g2d_probe, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index f9efde40c097..a38051c95ec4 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
| @@ -122,7 +122,7 @@ fail: | |||
| 122 | __free_page(pages[i]); | 122 | __free_page(pages[i]); |
| 123 | 123 | ||
| 124 | drm_free_large(pages); | 124 | drm_free_large(pages); |
| 125 | return ERR_PTR(PTR_ERR(p)); | 125 | return ERR_CAST(p); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | static void exynos_gem_put_pages(struct drm_gem_object *obj, | 128 | static void exynos_gem_put_pages(struct drm_gem_object *obj, |
| @@ -662,7 +662,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv, | |||
| 662 | */ | 662 | */ |
| 663 | 663 | ||
| 664 | args->pitch = args->width * ((args->bpp + 7) / 8); | 664 | args->pitch = args->width * ((args->bpp + 7) / 8); |
| 665 | args->size = PAGE_ALIGN(args->pitch * args->height); | 665 | args->size = args->pitch * args->height; |
| 666 | 666 | ||
| 667 | exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size); | 667 | exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size); |
| 668 | if (IS_ERR(exynos_gem_obj)) | 668 | if (IS_ERR(exynos_gem_obj)) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c index 8ffcdf8b9e22..3fdf0b65f47e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c | |||
| @@ -345,7 +345,7 @@ static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev) | |||
| 345 | 345 | ||
| 346 | DRM_DEBUG_KMS("%s\n", __FILE__); | 346 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 347 | 347 | ||
| 348 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 348 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
| 349 | if (!ctx) { | 349 | if (!ctx) { |
| 350 | DRM_LOG_KMS("failed to alloc common hdmi context.\n"); | 350 | DRM_LOG_KMS("failed to alloc common hdmi context.\n"); |
| 351 | return -ENOMEM; | 351 | return -ENOMEM; |
| @@ -371,7 +371,6 @@ static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev) | |||
| 371 | DRM_DEBUG_KMS("%s\n", __FILE__); | 371 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 372 | 372 | ||
| 373 | exynos_drm_subdrv_unregister(&ctx->subdrv); | 373 | exynos_drm_subdrv_unregister(&ctx->subdrv); |
| 374 | kfree(ctx); | ||
| 375 | 374 | ||
| 376 | return 0; | 375 | return 0; |
| 377 | } | 376 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c index b89829e5043a..e1f94b746bd7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c | |||
| @@ -29,7 +29,6 @@ static const uint32_t formats[] = { | |||
| 29 | DRM_FORMAT_XRGB8888, | 29 | DRM_FORMAT_XRGB8888, |
| 30 | DRM_FORMAT_ARGB8888, | 30 | DRM_FORMAT_ARGB8888, |
| 31 | DRM_FORMAT_NV12, | 31 | DRM_FORMAT_NV12, |
| 32 | DRM_FORMAT_NV12M, | ||
| 33 | DRM_FORMAT_NV12MT, | 32 | DRM_FORMAT_NV12MT, |
| 34 | }; | 33 | }; |
| 35 | 34 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index bb1550c4dd57..537027a74fd5 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c | |||
| @@ -633,7 +633,7 @@ static int __devinit vidi_probe(struct platform_device *pdev) | |||
| 633 | 633 | ||
| 634 | DRM_DEBUG_KMS("%s\n", __FILE__); | 634 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 635 | 635 | ||
| 636 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 636 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
| 637 | if (!ctx) | 637 | if (!ctx) |
| 638 | return -ENOMEM; | 638 | return -ENOMEM; |
| 639 | 639 | ||
| @@ -673,8 +673,6 @@ static int __devexit vidi_remove(struct platform_device *pdev) | |||
| 673 | ctx->raw_edid = NULL; | 673 | ctx->raw_edid = NULL; |
| 674 | } | 674 | } |
| 675 | 675 | ||
| 676 | kfree(ctx); | ||
| 677 | |||
| 678 | return 0; | 676 | return 0; |
| 679 | } | 677 | } |
| 680 | 678 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 409e2ec1207c..a6aea6f3ea1a 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
| @@ -2172,7 +2172,7 @@ static int __devinit hdmi_resources_init(struct hdmi_context *hdata) | |||
| 2172 | 2172 | ||
| 2173 | DRM_DEBUG_KMS("HDMI resource init\n"); | 2173 | DRM_DEBUG_KMS("HDMI resource init\n"); |
| 2174 | 2174 | ||
| 2175 | memset(res, 0, sizeof *res); | 2175 | memset(res, 0, sizeof(*res)); |
| 2176 | 2176 | ||
| 2177 | /* get clocks, power */ | 2177 | /* get clocks, power */ |
| 2178 | res->hdmi = clk_get(dev, "hdmi"); | 2178 | res->hdmi = clk_get(dev, "hdmi"); |
| @@ -2204,7 +2204,7 @@ static int __devinit hdmi_resources_init(struct hdmi_context *hdata) | |||
| 2204 | clk_set_parent(res->sclk_hdmi, res->sclk_pixel); | 2204 | clk_set_parent(res->sclk_hdmi, res->sclk_pixel); |
| 2205 | 2205 | ||
| 2206 | res->regul_bulk = kzalloc(ARRAY_SIZE(supply) * | 2206 | res->regul_bulk = kzalloc(ARRAY_SIZE(supply) * |
| 2207 | sizeof res->regul_bulk[0], GFP_KERNEL); | 2207 | sizeof(res->regul_bulk[0]), GFP_KERNEL); |
| 2208 | if (!res->regul_bulk) { | 2208 | if (!res->regul_bulk) { |
| 2209 | DRM_ERROR("failed to get memory for regulators\n"); | 2209 | DRM_ERROR("failed to get memory for regulators\n"); |
| 2210 | goto fail; | 2210 | goto fail; |
| @@ -2243,7 +2243,7 @@ static int hdmi_resources_cleanup(struct hdmi_context *hdata) | |||
| 2243 | clk_put(res->sclk_hdmi); | 2243 | clk_put(res->sclk_hdmi); |
| 2244 | if (!IS_ERR_OR_NULL(res->hdmi)) | 2244 | if (!IS_ERR_OR_NULL(res->hdmi)) |
| 2245 | clk_put(res->hdmi); | 2245 | clk_put(res->hdmi); |
| 2246 | memset(res, 0, sizeof *res); | 2246 | memset(res, 0, sizeof(*res)); |
| 2247 | 2247 | ||
| 2248 | return 0; | 2248 | return 0; |
| 2249 | } | 2249 | } |
| @@ -2312,11 +2312,6 @@ static int __devinit hdmi_probe(struct platform_device *pdev) | |||
| 2312 | } | 2312 | } |
| 2313 | 2313 | ||
| 2314 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2314 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 2315 | if (!res) { | ||
| 2316 | DRM_ERROR("failed to find registers\n"); | ||
| 2317 | ret = -ENOENT; | ||
| 2318 | goto err_resource; | ||
| 2319 | } | ||
| 2320 | 2315 | ||
| 2321 | hdata->regs = devm_request_and_ioremap(&pdev->dev, res); | 2316 | hdata->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 2322 | if (!hdata->regs) { | 2317 | if (!hdata->regs) { |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 30fcc12f81dd..25b97d5e5fcb 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
| @@ -236,11 +236,11 @@ static inline void vp_filter_set(struct mixer_resources *res, | |||
| 236 | static void vp_default_filter(struct mixer_resources *res) | 236 | static void vp_default_filter(struct mixer_resources *res) |
| 237 | { | 237 | { |
| 238 | vp_filter_set(res, VP_POLY8_Y0_LL, | 238 | vp_filter_set(res, VP_POLY8_Y0_LL, |
| 239 | filter_y_horiz_tap8, sizeof filter_y_horiz_tap8); | 239 | filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8)); |
| 240 | vp_filter_set(res, VP_POLY4_Y0_LL, | 240 | vp_filter_set(res, VP_POLY4_Y0_LL, |
| 241 | filter_y_vert_tap4, sizeof filter_y_vert_tap4); | 241 | filter_y_vert_tap4, sizeof(filter_y_vert_tap4)); |
| 242 | vp_filter_set(res, VP_POLY4_C0_LL, | 242 | vp_filter_set(res, VP_POLY4_C0_LL, |
| 243 | filter_cr_horiz_tap4, sizeof filter_cr_horiz_tap4); | 243 | filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4)); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) | 246 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) |
diff --git a/drivers/gpu/drm/gma500/oaktrail_device.c b/drivers/gpu/drm/gma500/oaktrail_device.c index 0f9b7db80f6b..cf49ba5a54bf 100644 --- a/drivers/gpu/drm/gma500/oaktrail_device.c +++ b/drivers/gpu/drm/gma500/oaktrail_device.c | |||
| @@ -476,6 +476,7 @@ static const struct psb_offset oaktrail_regmap[2] = { | |||
| 476 | .pos = DSPAPOS, | 476 | .pos = DSPAPOS, |
| 477 | .surf = DSPASURF, | 477 | .surf = DSPASURF, |
| 478 | .addr = MRST_DSPABASE, | 478 | .addr = MRST_DSPABASE, |
| 479 | .base = MRST_DSPABASE, | ||
| 479 | .status = PIPEASTAT, | 480 | .status = PIPEASTAT, |
| 480 | .linoff = DSPALINOFF, | 481 | .linoff = DSPALINOFF, |
| 481 | .tileoff = DSPATILEOFF, | 482 | .tileoff = DSPATILEOFF, |
| @@ -499,6 +500,7 @@ static const struct psb_offset oaktrail_regmap[2] = { | |||
| 499 | .pos = DSPBPOS, | 500 | .pos = DSPBPOS, |
| 500 | .surf = DSPBSURF, | 501 | .surf = DSPBSURF, |
| 501 | .addr = DSPBBASE, | 502 | .addr = DSPBBASE, |
| 503 | .base = DSPBBASE, | ||
| 502 | .status = PIPEBSTAT, | 504 | .status = PIPEBSTAT, |
| 503 | .linoff = DSPBLINOFF, | 505 | .linoff = DSPBLINOFF, |
| 504 | .tileoff = DSPBTILEOFF, | 506 | .tileoff = DSPBTILEOFF, |
diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c index 30dc22a7156c..8033526bb53b 100644 --- a/drivers/gpu/drm/gma500/psb_intel_display.c +++ b/drivers/gpu/drm/gma500/psb_intel_display.c | |||
| @@ -1362,6 +1362,9 @@ void psb_intel_crtc_init(struct drm_device *dev, int pipe, | |||
| 1362 | (struct drm_connector **) (psb_intel_crtc + 1); | 1362 | (struct drm_connector **) (psb_intel_crtc + 1); |
| 1363 | psb_intel_crtc->mode_set.num_connectors = 0; | 1363 | psb_intel_crtc->mode_set.num_connectors = 0; |
| 1364 | psb_intel_cursor_init(dev, psb_intel_crtc); | 1364 | psb_intel_cursor_init(dev, psb_intel_crtc); |
| 1365 | |||
| 1366 | /* Set to true so that the pipe is forced off on initial config. */ | ||
| 1367 | psb_intel_crtc->active = true; | ||
| 1365 | } | 1368 | } |
| 1366 | 1369 | ||
| 1367 | int psb_intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, | 1370 | int psb_intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, |
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index 57d892eaaa6e..463ec6871fe9 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
| @@ -115,6 +115,9 @@ static const struct file_operations i810_buffer_fops = { | |||
| 115 | .unlocked_ioctl = drm_ioctl, | 115 | .unlocked_ioctl = drm_ioctl, |
| 116 | .mmap = i810_mmap_buffers, | 116 | .mmap = i810_mmap_buffers, |
| 117 | .fasync = drm_fasync, | 117 | .fasync = drm_fasync, |
| 118 | #ifdef CONFIG_COMPAT | ||
| 119 | .compat_ioctl = drm_compat_ioctl, | ||
| 120 | #endif | ||
| 118 | .llseek = noop_llseek, | 121 | .llseek = noop_llseek, |
| 119 | }; | 122 | }; |
| 120 | 123 | ||
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c index f9924ad04d09..48cfcca2b350 100644 --- a/drivers/gpu/drm/i810/i810_drv.c +++ b/drivers/gpu/drm/i810/i810_drv.c | |||
| @@ -51,6 +51,9 @@ static const struct file_operations i810_driver_fops = { | |||
| 51 | .mmap = drm_mmap, | 51 | .mmap = drm_mmap, |
| 52 | .poll = drm_poll, | 52 | .poll = drm_poll, |
| 53 | .fasync = drm_fasync, | 53 | .fasync = drm_fasync, |
| 54 | #ifdef CONFIG_COMPAT | ||
| 55 | .compat_ioctl = drm_compat_ioctl, | ||
| 56 | #endif | ||
| 54 | .llseek = noop_llseek, | 57 | .llseek = noop_llseek, |
| 55 | }; | 58 | }; |
| 56 | 59 | ||
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 9cf7dfe022b9..914c0dfabe60 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1587,6 +1587,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1587 | spin_lock_init(&dev_priv->irq_lock); | 1587 | spin_lock_init(&dev_priv->irq_lock); |
| 1588 | spin_lock_init(&dev_priv->error_lock); | 1588 | spin_lock_init(&dev_priv->error_lock); |
| 1589 | spin_lock_init(&dev_priv->rps_lock); | 1589 | spin_lock_init(&dev_priv->rps_lock); |
| 1590 | spin_lock_init(&dev_priv->dpio_lock); | ||
| 1590 | 1591 | ||
| 1591 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | 1592 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
| 1592 | dev_priv->num_pipe = 3; | 1593 | dev_priv->num_pipe = 3; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 489e2b162b27..274d25de521e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -3242,7 +3242,8 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj, | |||
| 3242 | { | 3242 | { |
| 3243 | int ret; | 3243 | int ret; |
| 3244 | 3244 | ||
| 3245 | BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT); | 3245 | if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT)) |
| 3246 | return -EBUSY; | ||
| 3246 | 3247 | ||
| 3247 | if (obj->gtt_space != NULL) { | 3248 | if (obj->gtt_space != NULL) { |
| 3248 | if ((alignment && obj->gtt_offset & (alignment - 1)) || | 3249 | if ((alignment && obj->gtt_offset & (alignment - 1)) || |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index d9a5372ec56f..60815b861ec2 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
| @@ -72,7 +72,7 @@ int i915_gem_init_aliasing_ppgtt(struct drm_device *dev) | |||
| 72 | /* ppgtt PDEs reside in the global gtt pagetable, which has 512*1024 | 72 | /* ppgtt PDEs reside in the global gtt pagetable, which has 512*1024 |
| 73 | * entries. For aliasing ppgtt support we just steal them at the end for | 73 | * entries. For aliasing ppgtt support we just steal them at the end for |
| 74 | * now. */ | 74 | * now. */ |
| 75 | first_pd_entry_in_global_pt = 512*1024 - I915_PPGTT_PD_ENTRIES; | 75 | first_pd_entry_in_global_pt = dev_priv->mm.gtt->gtt_total_entries - I915_PPGTT_PD_ENTRIES; |
| 76 | 76 | ||
| 77 | ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL); | 77 | ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL); |
| 78 | if (!ppgtt) | 78 | if (!ppgtt) |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 8a3828528b9d..5249640cce13 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -2700,9 +2700,6 @@ void intel_irq_init(struct drm_device *dev) | |||
| 2700 | dev->driver->irq_handler = i8xx_irq_handler; | 2700 | dev->driver->irq_handler = i8xx_irq_handler; |
| 2701 | dev->driver->irq_uninstall = i8xx_irq_uninstall; | 2701 | dev->driver->irq_uninstall = i8xx_irq_uninstall; |
| 2702 | } else if (INTEL_INFO(dev)->gen == 3) { | 2702 | } else if (INTEL_INFO(dev)->gen == 3) { |
| 2703 | /* IIR "flip pending" means done if this bit is set */ | ||
| 2704 | I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); | ||
| 2705 | |||
| 2706 | dev->driver->irq_preinstall = i915_irq_preinstall; | 2703 | dev->driver->irq_preinstall = i915_irq_preinstall; |
| 2707 | dev->driver->irq_postinstall = i915_irq_postinstall; | 2704 | dev->driver->irq_postinstall = i915_irq_postinstall; |
| 2708 | dev->driver->irq_uninstall = i915_irq_uninstall; | 2705 | dev->driver->irq_uninstall = i915_irq_uninstall; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index a69a3d0d3acf..c040aee1341c 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1376,7 +1376,8 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, | |||
| 1376 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", | 1376 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1377 | reg, pipe_name(pipe)); | 1377 | reg, pipe_name(pipe)); |
| 1378 | 1378 | ||
| 1379 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT), | 1379 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0 |
| 1380 | && (val & DP_PIPEB_SELECT), | ||
| 1380 | "IBX PCH dp port still using transcoder B\n"); | 1381 | "IBX PCH dp port still using transcoder B\n"); |
| 1381 | } | 1382 | } |
| 1382 | 1383 | ||
| @@ -1384,11 +1385,12 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, | |||
| 1384 | enum pipe pipe, int reg) | 1385 | enum pipe pipe, int reg) |
| 1385 | { | 1386 | { |
| 1386 | u32 val = I915_READ(reg); | 1387 | u32 val = I915_READ(reg); |
| 1387 | WARN(hdmi_pipe_enabled(dev_priv, val, pipe), | 1388 | WARN(hdmi_pipe_enabled(dev_priv, pipe, val), |
| 1388 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", | 1389 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1389 | reg, pipe_name(pipe)); | 1390 | reg, pipe_name(pipe)); |
| 1390 | 1391 | ||
| 1391 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT), | 1392 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & PORT_ENABLE) == 0 |
| 1393 | && (val & SDVO_PIPE_B_SELECT), | ||
| 1392 | "IBX PCH hdmi port still using transcoder B\n"); | 1394 | "IBX PCH hdmi port still using transcoder B\n"); |
| 1393 | } | 1395 | } |
| 1394 | 1396 | ||
| @@ -1404,13 +1406,13 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv, | |||
| 1404 | 1406 | ||
| 1405 | reg = PCH_ADPA; | 1407 | reg = PCH_ADPA; |
| 1406 | val = I915_READ(reg); | 1408 | val = I915_READ(reg); |
| 1407 | WARN(adpa_pipe_enabled(dev_priv, val, pipe), | 1409 | WARN(adpa_pipe_enabled(dev_priv, pipe, val), |
| 1408 | "PCH VGA enabled on transcoder %c, should be disabled\n", | 1410 | "PCH VGA enabled on transcoder %c, should be disabled\n", |
| 1409 | pipe_name(pipe)); | 1411 | pipe_name(pipe)); |
| 1410 | 1412 | ||
| 1411 | reg = PCH_LVDS; | 1413 | reg = PCH_LVDS; |
| 1412 | val = I915_READ(reg); | 1414 | val = I915_READ(reg); |
| 1413 | WARN(lvds_pipe_enabled(dev_priv, val, pipe), | 1415 | WARN(lvds_pipe_enabled(dev_priv, pipe, val), |
| 1414 | "PCH LVDS enabled on transcoder %c, should be disabled\n", | 1416 | "PCH LVDS enabled on transcoder %c, should be disabled\n", |
| 1415 | pipe_name(pipe)); | 1417 | pipe_name(pipe)); |
| 1416 | 1418 | ||
| @@ -1872,7 +1874,7 @@ static void disable_pch_hdmi(struct drm_i915_private *dev_priv, | |||
| 1872 | enum pipe pipe, int reg) | 1874 | enum pipe pipe, int reg) |
| 1873 | { | 1875 | { |
| 1874 | u32 val = I915_READ(reg); | 1876 | u32 val = I915_READ(reg); |
| 1875 | if (hdmi_pipe_enabled(dev_priv, val, pipe)) { | 1877 | if (hdmi_pipe_enabled(dev_priv, pipe, val)) { |
| 1876 | DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n", | 1878 | DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n", |
| 1877 | reg, pipe); | 1879 | reg, pipe); |
| 1878 | I915_WRITE(reg, val & ~PORT_ENABLE); | 1880 | I915_WRITE(reg, val & ~PORT_ENABLE); |
| @@ -1894,12 +1896,12 @@ static void intel_disable_pch_ports(struct drm_i915_private *dev_priv, | |||
| 1894 | 1896 | ||
| 1895 | reg = PCH_ADPA; | 1897 | reg = PCH_ADPA; |
| 1896 | val = I915_READ(reg); | 1898 | val = I915_READ(reg); |
| 1897 | if (adpa_pipe_enabled(dev_priv, val, pipe)) | 1899 | if (adpa_pipe_enabled(dev_priv, pipe, val)) |
| 1898 | I915_WRITE(reg, val & ~ADPA_DAC_ENABLE); | 1900 | I915_WRITE(reg, val & ~ADPA_DAC_ENABLE); |
| 1899 | 1901 | ||
| 1900 | reg = PCH_LVDS; | 1902 | reg = PCH_LVDS; |
| 1901 | val = I915_READ(reg); | 1903 | val = I915_READ(reg); |
| 1902 | if (lvds_pipe_enabled(dev_priv, val, pipe)) { | 1904 | if (lvds_pipe_enabled(dev_priv, pipe, val)) { |
| 1903 | DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val); | 1905 | DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val); |
| 1904 | I915_WRITE(reg, val & ~LVDS_PORT_EN); | 1906 | I915_WRITE(reg, val & ~LVDS_PORT_EN); |
| 1905 | POSTING_READ(reg); | 1907 | POSTING_READ(reg); |
| @@ -4189,12 +4191,6 @@ static void i8xx_update_pll(struct drm_crtc *crtc, | |||
| 4189 | POSTING_READ(DPLL(pipe)); | 4191 | POSTING_READ(DPLL(pipe)); |
| 4190 | udelay(150); | 4192 | udelay(150); |
| 4191 | 4193 | ||
| 4192 | I915_WRITE(DPLL(pipe), dpll); | ||
| 4193 | |||
| 4194 | /* Wait for the clocks to stabilize. */ | ||
| 4195 | POSTING_READ(DPLL(pipe)); | ||
| 4196 | udelay(150); | ||
| 4197 | |||
| 4198 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. | 4194 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. |
| 4199 | * This is an exception to the general rule that mode_set doesn't turn | 4195 | * This is an exception to the general rule that mode_set doesn't turn |
| 4200 | * things on. | 4196 | * things on. |
| @@ -4202,6 +4198,12 @@ static void i8xx_update_pll(struct drm_crtc *crtc, | |||
| 4202 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) | 4198 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) |
| 4203 | intel_update_lvds(crtc, clock, adjusted_mode); | 4199 | intel_update_lvds(crtc, clock, adjusted_mode); |
| 4204 | 4200 | ||
| 4201 | I915_WRITE(DPLL(pipe), dpll); | ||
| 4202 | |||
| 4203 | /* Wait for the clocks to stabilize. */ | ||
| 4204 | POSTING_READ(DPLL(pipe)); | ||
| 4205 | udelay(150); | ||
| 4206 | |||
| 4205 | /* The pixel multiplier can only be updated once the | 4207 | /* The pixel multiplier can only be updated once the |
| 4206 | * DPLL is enabled and the clocks are stable. | 4208 | * DPLL is enabled and the clocks are stable. |
| 4207 | * | 4209 | * |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a6c426afaa7a..ace757af9133 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -2533,14 +2533,10 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 2533 | break; | 2533 | break; |
| 2534 | } | 2534 | } |
| 2535 | 2535 | ||
| 2536 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
| 2537 | |||
| 2538 | /* Cache some DPCD data in the eDP case */ | 2536 | /* Cache some DPCD data in the eDP case */ |
| 2539 | if (is_edp(intel_dp)) { | 2537 | if (is_edp(intel_dp)) { |
| 2540 | bool ret; | ||
| 2541 | struct edp_power_seq cur, vbt; | 2538 | struct edp_power_seq cur, vbt; |
| 2542 | u32 pp_on, pp_off, pp_div; | 2539 | u32 pp_on, pp_off, pp_div; |
| 2543 | struct edid *edid; | ||
| 2544 | 2540 | ||
| 2545 | pp_on = I915_READ(PCH_PP_ON_DELAYS); | 2541 | pp_on = I915_READ(PCH_PP_ON_DELAYS); |
| 2546 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); | 2542 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); |
| @@ -2591,6 +2587,13 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 2591 | 2587 | ||
| 2592 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", | 2588 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", |
| 2593 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); | 2589 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); |
| 2590 | } | ||
| 2591 | |||
| 2592 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
| 2593 | |||
| 2594 | if (is_edp(intel_dp)) { | ||
| 2595 | bool ret; | ||
| 2596 | struct edid *edid; | ||
| 2594 | 2597 | ||
| 2595 | ironlake_edp_panel_vdd_on(intel_dp); | 2598 | ironlake_edp_panel_vdd_on(intel_dp); |
| 2596 | ret = intel_dp_get_dpcd(intel_dp); | 2599 | ret = intel_dp_get_dpcd(intel_dp); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 98f602427eb8..12dc3308ab8c 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -609,7 +609,7 @@ static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) | |||
| 609 | u32 temp; | 609 | u32 temp; |
| 610 | u32 enable_bits = SDVO_ENABLE; | 610 | u32 enable_bits = SDVO_ENABLE; |
| 611 | 611 | ||
| 612 | if (intel_hdmi->has_audio) | 612 | if (intel_hdmi->has_audio || mode != DRM_MODE_DPMS_ON) |
| 613 | enable_bits |= SDVO_AUDIO_ENABLE; | 613 | enable_bits |= SDVO_AUDIO_ENABLE; |
| 614 | 614 | ||
| 615 | temp = I915_READ(intel_hdmi->sdvox_reg); | 615 | temp = I915_READ(intel_hdmi->sdvox_reg); |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index e05c0d3e3440..e9a6f6aaed85 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -780,6 +780,14 @@ static const struct dmi_system_id intel_no_lvds[] = { | |||
| 780 | DMI_MATCH(DMI_BOARD_NAME, "ZBOXSD-ID12/ID13"), | 780 | DMI_MATCH(DMI_BOARD_NAME, "ZBOXSD-ID12/ID13"), |
| 781 | }, | 781 | }, |
| 782 | }, | 782 | }, |
| 783 | { | ||
| 784 | .callback = intel_no_lvds_dmi_callback, | ||
| 785 | .ident = "Gigabyte GA-D525TUD", | ||
| 786 | .matches = { | ||
| 787 | DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co., Ltd."), | ||
| 788 | DMI_MATCH(DMI_BOARD_NAME, "D525TUD"), | ||
| 789 | }, | ||
| 790 | }, | ||
| 783 | 791 | ||
| 784 | { } /* terminating entry */ | 792 | { } /* terminating entry */ |
| 785 | }; | 793 | }; |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 3df4f5fa892a..e019b2369861 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -162,19 +162,12 @@ static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) | |||
| 162 | return val; | 162 | return val; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | 165 | static u32 _intel_panel_get_max_backlight(struct drm_device *dev) |
| 166 | { | 166 | { |
| 167 | struct drm_i915_private *dev_priv = dev->dev_private; | 167 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 168 | u32 max; | 168 | u32 max; |
| 169 | 169 | ||
| 170 | max = i915_read_blc_pwm_ctl(dev_priv); | 170 | max = i915_read_blc_pwm_ctl(dev_priv); |
| 171 | if (max == 0) { | ||
| 172 | /* XXX add code here to query mode clock or hardware clock | ||
| 173 | * and program max PWM appropriately. | ||
| 174 | */ | ||
| 175 | pr_warn_once("fixme: max PWM is zero\n"); | ||
| 176 | return 1; | ||
| 177 | } | ||
| 178 | 171 | ||
| 179 | if (HAS_PCH_SPLIT(dev)) { | 172 | if (HAS_PCH_SPLIT(dev)) { |
| 180 | max >>= 16; | 173 | max >>= 16; |
| @@ -188,6 +181,22 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) | |||
| 188 | max *= 0xff; | 181 | max *= 0xff; |
| 189 | } | 182 | } |
| 190 | 183 | ||
| 184 | return max; | ||
| 185 | } | ||
| 186 | |||
| 187 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | ||
| 188 | { | ||
| 189 | u32 max; | ||
| 190 | |||
| 191 | max = _intel_panel_get_max_backlight(dev); | ||
| 192 | if (max == 0) { | ||
| 193 | /* XXX add code here to query mode clock or hardware clock | ||
| 194 | * and program max PWM appropriately. | ||
| 195 | */ | ||
| 196 | pr_warn_once("fixme: max PWM is zero\n"); | ||
| 197 | return 1; | ||
| 198 | } | ||
| 199 | |||
| 191 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); | 200 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); |
| 192 | return max; | 201 | return max; |
| 193 | } | 202 | } |
| @@ -424,7 +433,11 @@ int intel_panel_setup_backlight(struct drm_device *dev) | |||
| 424 | 433 | ||
| 425 | memset(&props, 0, sizeof(props)); | 434 | memset(&props, 0, sizeof(props)); |
| 426 | props.type = BACKLIGHT_RAW; | 435 | props.type = BACKLIGHT_RAW; |
| 427 | props.max_brightness = intel_panel_get_max_backlight(dev); | 436 | props.max_brightness = _intel_panel_get_max_backlight(dev); |
| 437 | if (props.max_brightness == 0) { | ||
| 438 | DRM_ERROR("Failed to get maximum backlight value\n"); | ||
| 439 | return -ENODEV; | ||
| 440 | } | ||
| 428 | dev_priv->backlight = | 441 | dev_priv->backlight = |
| 429 | backlight_device_register("intel_backlight", | 442 | backlight_device_register("intel_backlight", |
| 430 | &connector->kdev, dev, | 443 | &connector->kdev, dev, |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1881c8c83f0e..ba8a27b1757a 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -3672,6 +3672,9 @@ static void gen3_init_clock_gating(struct drm_device *dev) | |||
| 3672 | 3672 | ||
| 3673 | if (IS_PINEVIEW(dev)) | 3673 | if (IS_PINEVIEW(dev)) |
| 3674 | I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); | 3674 | I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); |
| 3675 | |||
| 3676 | /* IIR "flip pending" means done if this bit is set */ | ||
| 3677 | I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); | ||
| 3675 | } | 3678 | } |
| 3676 | 3679 | ||
| 3677 | static void i85x_init_clock_gating(struct drm_device *dev) | 3680 | static void i85x_init_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d81bb0bf2885..123afd357611 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2573,7 +2573,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2573 | hotplug_mask = intel_sdvo->is_sdvob ? | 2573 | hotplug_mask = intel_sdvo->is_sdvob ? |
| 2574 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; | 2574 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; |
| 2575 | } | 2575 | } |
| 2576 | dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
| 2577 | 2576 | ||
| 2578 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); | 2577 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); |
| 2579 | 2578 | ||
| @@ -2581,14 +2580,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2581 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) | 2580 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) |
| 2582 | goto err; | 2581 | goto err; |
| 2583 | 2582 | ||
| 2584 | /* Set up hotplug command - note paranoia about contents of reply. | ||
| 2585 | * We assume that the hardware is in a sane state, and only touch | ||
| 2586 | * the bits we think we understand. | ||
| 2587 | */ | ||
| 2588 | intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG, | ||
| 2589 | &intel_sdvo->hotplug_active, 2); | ||
| 2590 | intel_sdvo->hotplug_active[0] &= ~0x3; | ||
| 2591 | |||
| 2592 | if (intel_sdvo_output_setup(intel_sdvo, | 2583 | if (intel_sdvo_output_setup(intel_sdvo, |
| 2593 | intel_sdvo->caps.output_flags) != true) { | 2584 | intel_sdvo->caps.output_flags) != true) { |
| 2594 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", | 2585 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", |
| @@ -2596,6 +2587,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2596 | goto err; | 2587 | goto err; |
| 2597 | } | 2588 | } |
| 2598 | 2589 | ||
| 2590 | /* Only enable the hotplug irq if we need it, to work around noisy | ||
| 2591 | * hotplug lines. | ||
| 2592 | */ | ||
| 2593 | if (intel_sdvo->hotplug_active[0]) | ||
| 2594 | dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
| 2595 | |||
| 2599 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); | 2596 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); |
| 2600 | 2597 | ||
| 2601 | /* Set the input timing to the screen. Assume always input 0. */ | 2598 | /* Set the input timing to the screen. Assume always input 0. */ |
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index cc8df4de2d92..7644f31a3778 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c | |||
| @@ -60,11 +60,11 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, | |||
| 60 | 60 | ||
| 61 | switch (fb->pixel_format) { | 61 | switch (fb->pixel_format) { |
| 62 | case DRM_FORMAT_XBGR8888: | 62 | case DRM_FORMAT_XBGR8888: |
| 63 | sprctl |= SPRITE_FORMAT_RGBX888; | 63 | sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX; |
| 64 | pixel_size = 4; | 64 | pixel_size = 4; |
| 65 | break; | 65 | break; |
| 66 | case DRM_FORMAT_XRGB8888: | 66 | case DRM_FORMAT_XRGB8888: |
| 67 | sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX; | 67 | sprctl |= SPRITE_FORMAT_RGBX888; |
| 68 | pixel_size = 4; | 68 | pixel_size = 4; |
| 69 | break; | 69 | break; |
| 70 | case DRM_FORMAT_YUYV: | 70 | case DRM_FORMAT_YUYV: |
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c index ea1024d79974..e5f145d2cb3b 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.c +++ b/drivers/gpu/drm/mgag200/mgag200_drv.c | |||
| @@ -84,6 +84,9 @@ static const struct file_operations mgag200_driver_fops = { | |||
| 84 | .mmap = mgag200_mmap, | 84 | .mmap = mgag200_mmap, |
| 85 | .poll = drm_poll, | 85 | .poll = drm_poll, |
| 86 | .fasync = drm_fasync, | 86 | .fasync = drm_fasync, |
| 87 | #ifdef CONFIG_COMPAT | ||
| 88 | .compat_ioctl = drm_compat_ioctl, | ||
| 89 | #endif | ||
| 87 | .read = drm_read, | 90 | .read = drm_read, |
| 88 | }; | 91 | }; |
| 89 | 92 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 69688ef5cf46..7e16dc5e6467 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
| @@ -598,7 +598,7 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev, | |||
| 598 | args->size = args->pitch * args->height; | 598 | args->size = args->pitch * args->height; |
| 599 | args->size = roundup(args->size, PAGE_SIZE); | 599 | args->size = roundup(args->size, PAGE_SIZE); |
| 600 | 600 | ||
| 601 | ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo); | 601 | ret = nouveau_gem_new(dev, args->size, 0, NOUVEAU_GEM_DOMAIN_VRAM, 0, 0, &bo); |
| 602 | if (ret) | 602 | if (ret) |
| 603 | return ret; | 603 | return ret; |
| 604 | 604 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index 1866dbb49979..c61014442aa9 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -736,9 +736,11 @@ nouveau_card_init(struct drm_device *dev) | |||
| 736 | } | 736 | } |
| 737 | break; | 737 | break; |
| 738 | case NV_C0: | 738 | case NV_C0: |
| 739 | nvc0_copy_create(dev, 1); | 739 | if (!(nv_rd32(dev, 0x022500) & 0x00000200)) |
| 740 | nvc0_copy_create(dev, 1); | ||
| 740 | case NV_D0: | 741 | case NV_D0: |
| 741 | nvc0_copy_create(dev, 0); | 742 | if (!(nv_rd32(dev, 0x022500) & 0x00000100)) |
| 743 | nvc0_copy_create(dev, 0); | ||
| 742 | break; | 744 | break; |
| 743 | default: | 745 | default: |
| 744 | break; | 746 | break; |
diff --git a/drivers/gpu/drm/nouveau/nv50_gpio.c b/drivers/gpu/drm/nouveau/nv50_gpio.c index f429e6a8ca7a..c399d510b27a 100644 --- a/drivers/gpu/drm/nouveau/nv50_gpio.c +++ b/drivers/gpu/drm/nouveau/nv50_gpio.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | * Authors: Ben Skeggs | 22 | * Authors: Ben Skeggs |
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | #include <linux/dmi.h> | ||
| 25 | #include "drmP.h" | 26 | #include "drmP.h" |
| 26 | #include "nouveau_drv.h" | 27 | #include "nouveau_drv.h" |
| 27 | #include "nouveau_hw.h" | 28 | #include "nouveau_hw.h" |
| @@ -110,11 +111,26 @@ nv50_gpio_isr(struct drm_device *dev) | |||
| 110 | nv_wr32(dev, 0xe074, intr1); | 111 | nv_wr32(dev, 0xe074, intr1); |
| 111 | } | 112 | } |
| 112 | 113 | ||
| 114 | static struct dmi_system_id gpio_reset_ids[] = { | ||
| 115 | { | ||
| 116 | .ident = "Apple Macbook 10,1", | ||
| 117 | .matches = { | ||
| 118 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
| 119 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro10,1"), | ||
| 120 | } | ||
| 121 | }, | ||
| 122 | { } | ||
| 123 | }; | ||
| 124 | |||
| 113 | int | 125 | int |
| 114 | nv50_gpio_init(struct drm_device *dev) | 126 | nv50_gpio_init(struct drm_device *dev) |
| 115 | { | 127 | { |
| 116 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 128 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 117 | 129 | ||
| 130 | /* initialise gpios and routing to vbios defaults */ | ||
| 131 | if (dmi_check_system(gpio_reset_ids)) | ||
| 132 | nouveau_gpio_reset(dev); | ||
| 133 | |||
| 118 | /* disable, and ack any pending gpio interrupts */ | 134 | /* disable, and ack any pending gpio interrupts */ |
| 119 | nv_wr32(dev, 0xe050, 0x00000000); | 135 | nv_wr32(dev, 0xe050, 0x00000000); |
| 120 | nv_wr32(dev, 0xe054, 0xffffffff); | 136 | nv_wr32(dev, 0xe054, 0xffffffff); |
diff --git a/drivers/gpu/drm/nouveau/nvd0_display.c b/drivers/gpu/drm/nouveau/nvd0_display.c index dac525b2994e..8a2fc89b7763 100644 --- a/drivers/gpu/drm/nouveau/nvd0_display.c +++ b/drivers/gpu/drm/nouveau/nvd0_display.c | |||
| @@ -1510,10 +1510,10 @@ nvd0_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *umode, | |||
| 1510 | case OUTPUT_DP: | 1510 | case OUTPUT_DP: |
| 1511 | if (nv_connector->base.display_info.bpc == 6) { | 1511 | if (nv_connector->base.display_info.bpc == 6) { |
| 1512 | nv_encoder->dp.datarate = mode->clock * 18 / 8; | 1512 | nv_encoder->dp.datarate = mode->clock * 18 / 8; |
| 1513 | syncs |= 0x00000140; | 1513 | syncs |= 0x00000002 << 6; |
| 1514 | } else { | 1514 | } else { |
| 1515 | nv_encoder->dp.datarate = mode->clock * 24 / 8; | 1515 | nv_encoder->dp.datarate = mode->clock * 24 / 8; |
| 1516 | syncs |= 0x00000180; | 1516 | syncs |= 0x00000005 << 6; |
| 1517 | } | 1517 | } |
| 1518 | 1518 | ||
| 1519 | if (nv_encoder->dcb->sorconf.link & 1) | 1519 | if (nv_encoder->dcb->sorconf.link & 1) |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index f4d4505fe831..2817101fb167 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -258,7 +258,6 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 258 | radeon_crtc->enabled = true; | 258 | radeon_crtc->enabled = true; |
| 259 | /* adjust pm to dpms changes BEFORE enabling crtcs */ | 259 | /* adjust pm to dpms changes BEFORE enabling crtcs */ |
| 260 | radeon_pm_compute_clocks(rdev); | 260 | radeon_pm_compute_clocks(rdev); |
| 261 | /* disable crtc pair power gating before programming */ | ||
| 262 | if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) | 261 | if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) |
| 263 | atombios_powergate_crtc(crtc, ATOM_DISABLE); | 262 | atombios_powergate_crtc(crtc, ATOM_DISABLE); |
| 264 | atombios_enable_crtc(crtc, ATOM_ENABLE); | 263 | atombios_enable_crtc(crtc, ATOM_ENABLE); |
| @@ -278,25 +277,8 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
| 278 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); | 277 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); |
| 279 | atombios_enable_crtc(crtc, ATOM_DISABLE); | 278 | atombios_enable_crtc(crtc, ATOM_DISABLE); |
| 280 | radeon_crtc->enabled = false; | 279 | radeon_crtc->enabled = false; |
| 281 | /* power gating is per-pair */ | 280 | if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) |
| 282 | if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) { | 281 | atombios_powergate_crtc(crtc, ATOM_ENABLE); |
| 283 | struct drm_crtc *other_crtc; | ||
| 284 | struct radeon_crtc *other_radeon_crtc; | ||
| 285 | list_for_each_entry(other_crtc, &rdev->ddev->mode_config.crtc_list, head) { | ||
| 286 | other_radeon_crtc = to_radeon_crtc(other_crtc); | ||
| 287 | if (((radeon_crtc->crtc_id == 0) && (other_radeon_crtc->crtc_id == 1)) || | ||
| 288 | ((radeon_crtc->crtc_id == 1) && (other_radeon_crtc->crtc_id == 0)) || | ||
| 289 | ((radeon_crtc->crtc_id == 2) && (other_radeon_crtc->crtc_id == 3)) || | ||
| 290 | ((radeon_crtc->crtc_id == 3) && (other_radeon_crtc->crtc_id == 2)) || | ||
| 291 | ((radeon_crtc->crtc_id == 4) && (other_radeon_crtc->crtc_id == 5)) || | ||
| 292 | ((radeon_crtc->crtc_id == 5) && (other_radeon_crtc->crtc_id == 4))) { | ||
| 293 | /* if both crtcs in the pair are off, enable power gating */ | ||
| 294 | if (other_radeon_crtc->enabled == false) | ||
| 295 | atombios_powergate_crtc(crtc, ATOM_ENABLE); | ||
| 296 | break; | ||
| 297 | } | ||
| 298 | } | ||
| 299 | } | ||
| 300 | /* adjust pm to dpms changes AFTER disabling crtcs */ | 282 | /* adjust pm to dpms changes AFTER disabling crtcs */ |
| 301 | radeon_pm_compute_clocks(rdev); | 283 | radeon_pm_compute_clocks(rdev); |
| 302 | break; | 284 | break; |
| @@ -1682,9 +1664,22 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) | |||
| 1682 | struct drm_device *dev = crtc->dev; | 1664 | struct drm_device *dev = crtc->dev; |
| 1683 | struct radeon_device *rdev = dev->dev_private; | 1665 | struct radeon_device *rdev = dev->dev_private; |
| 1684 | struct radeon_atom_ss ss; | 1666 | struct radeon_atom_ss ss; |
| 1667 | int i; | ||
| 1685 | 1668 | ||
| 1686 | atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); | 1669 | atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); |
| 1687 | 1670 | ||
| 1671 | for (i = 0; i < rdev->num_crtc; i++) { | ||
| 1672 | if (rdev->mode_info.crtcs[i] && | ||
| 1673 | rdev->mode_info.crtcs[i]->enabled && | ||
| 1674 | i != radeon_crtc->crtc_id && | ||
| 1675 | radeon_crtc->pll_id == rdev->mode_info.crtcs[i]->pll_id) { | ||
| 1676 | /* one other crtc is using this pll don't turn | ||
| 1677 | * off the pll | ||
| 1678 | */ | ||
| 1679 | goto done; | ||
| 1680 | } | ||
| 1681 | } | ||
| 1682 | |||
| 1688 | switch (radeon_crtc->pll_id) { | 1683 | switch (radeon_crtc->pll_id) { |
| 1689 | case ATOM_PPLL1: | 1684 | case ATOM_PPLL1: |
| 1690 | case ATOM_PPLL2: | 1685 | case ATOM_PPLL2: |
| @@ -1701,6 +1696,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) | |||
| 1701 | default: | 1696 | default: |
| 1702 | break; | 1697 | break; |
| 1703 | } | 1698 | } |
| 1699 | done: | ||
| 1704 | radeon_crtc->pll_id = -1; | 1700 | radeon_crtc->pll_id = -1; |
| 1705 | } | 1701 | } |
| 1706 | 1702 | ||
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 7712cf5ab33b..3623b98ed3fe 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -577,30 +577,25 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder, | |||
| 577 | struct radeon_device *rdev = dev->dev_private; | 577 | struct radeon_device *rdev = dev->dev_private; |
| 578 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 578 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 579 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | 579 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
| 580 | u16 dp_bridge = radeon_connector_encoder_get_dp_bridge_encoder_id(connector); | ||
| 581 | u8 tmp; | ||
| 580 | 582 | ||
| 581 | if (!ASIC_IS_DCE4(rdev)) | 583 | if (!ASIC_IS_DCE4(rdev)) |
| 582 | return panel_mode; | 584 | return panel_mode; |
| 583 | 585 | ||
| 584 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | 586 | if (dp_bridge != ENCODER_OBJECT_ID_NONE) { |
| 585 | ENCODER_OBJECT_ID_NUTMEG) | 587 | /* DP bridge chips */ |
| 586 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; | 588 | tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); |
| 587 | else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | 589 | if (tmp & 1) |
| 588 | ENCODER_OBJECT_ID_TRAVIS) { | 590 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
| 589 | u8 id[6]; | 591 | else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) || |
| 590 | int i; | 592 | (dp_bridge == ENCODER_OBJECT_ID_TRAVIS)) |
| 591 | for (i = 0; i < 6; i++) | ||
| 592 | id[i] = radeon_read_dpcd_reg(radeon_connector, 0x503 + i); | ||
| 593 | if (id[0] == 0x73 && | ||
| 594 | id[1] == 0x69 && | ||
| 595 | id[2] == 0x76 && | ||
| 596 | id[3] == 0x61 && | ||
| 597 | id[4] == 0x72 && | ||
| 598 | id[5] == 0x54) | ||
| 599 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; | 593 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; |
| 600 | else | 594 | else |
| 601 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | 595 | panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
| 602 | } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | 596 | } else if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
| 603 | u8 tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); | 597 | /* eDP */ |
| 598 | tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); | ||
| 604 | if (tmp & 1) | 599 | if (tmp & 1) |
| 605 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | 600 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
| 606 | } | 601 | } |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index f9bc27fe269a..6e8803a1170c 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -1379,6 +1379,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1379 | struct drm_device *dev = encoder->dev; | 1379 | struct drm_device *dev = encoder->dev; |
| 1380 | struct radeon_device *rdev = dev->dev_private; | 1380 | struct radeon_device *rdev = dev->dev_private; |
| 1381 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 1381 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1382 | struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); | ||
| 1383 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
| 1382 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1384 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1383 | struct radeon_connector *radeon_connector = NULL; | 1385 | struct radeon_connector *radeon_connector = NULL; |
| 1384 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; | 1386 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; |
| @@ -1390,19 +1392,37 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1390 | 1392 | ||
| 1391 | switch (mode) { | 1393 | switch (mode) { |
| 1392 | case DRM_MODE_DPMS_ON: | 1394 | case DRM_MODE_DPMS_ON: |
| 1393 | /* some early dce3.2 boards have a bug in their transmitter control table */ | 1395 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
| 1394 | if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || | 1396 | if (!connector) |
| 1395 | ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | 1397 | dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
| 1396 | if (ASIC_IS_DCE6(rdev)) { | 1398 | else |
| 1397 | /* It seems we need to call ATOM_ENCODER_CMD_SETUP again | 1399 | dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); |
| 1398 | * before reenabling encoder on DPMS ON, otherwise we never | 1400 | |
| 1399 | * get picture | 1401 | /* setup and enable the encoder */ |
| 1400 | */ | 1402 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); |
| 1401 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | 1403 | atombios_dig_encoder_setup(encoder, |
| 1404 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
| 1405 | dig->panel_mode); | ||
| 1406 | if (ext_encoder) { | ||
| 1407 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) | ||
| 1408 | atombios_external_encoder_setup(encoder, ext_encoder, | ||
| 1409 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP); | ||
| 1402 | } | 1410 | } |
| 1403 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | 1411 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
| 1404 | } else { | 1412 | } else if (ASIC_IS_DCE4(rdev)) { |
| 1413 | /* setup and enable the encoder */ | ||
| 1414 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | ||
| 1415 | /* enable the transmitter */ | ||
| 1416 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | ||
| 1405 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | 1417 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
| 1418 | } else { | ||
| 1419 | /* setup and enable the encoder and transmitter */ | ||
| 1420 | atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0); | ||
| 1421 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); | ||
| 1422 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | ||
| 1423 | /* some early dce3.2 boards have a bug in their transmitter control table */ | ||
| 1424 | if ((rdev->family != CHIP_RV710) || (rdev->family != CHIP_RV730)) | ||
| 1425 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
| 1406 | } | 1426 | } |
| 1407 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | 1427 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
| 1408 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { | 1428 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
| @@ -1420,10 +1440,19 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1420 | case DRM_MODE_DPMS_STANDBY: | 1440 | case DRM_MODE_DPMS_STANDBY: |
| 1421 | case DRM_MODE_DPMS_SUSPEND: | 1441 | case DRM_MODE_DPMS_SUSPEND: |
| 1422 | case DRM_MODE_DPMS_OFF: | 1442 | case DRM_MODE_DPMS_OFF: |
| 1423 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) | 1443 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
| 1444 | /* disable the transmitter */ | ||
| 1424 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | 1445 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); |
| 1425 | else | 1446 | } else if (ASIC_IS_DCE4(rdev)) { |
| 1447 | /* disable the transmitter */ | ||
| 1448 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | ||
| 1449 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1450 | } else { | ||
| 1451 | /* disable the encoder and transmitter */ | ||
| 1426 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); | 1452 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); |
| 1453 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1454 | atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); | ||
| 1455 | } | ||
| 1427 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { | 1456 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
| 1428 | if (ASIC_IS_DCE4(rdev)) | 1457 | if (ASIC_IS_DCE4(rdev)) |
| 1429 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); | 1458 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
| @@ -1740,13 +1769,34 @@ static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder) | |||
| 1740 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); | 1769 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); |
| 1741 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 1770 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1742 | struct drm_encoder *test_encoder; | 1771 | struct drm_encoder *test_encoder; |
| 1743 | struct radeon_encoder_atom_dig *dig; | 1772 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 1744 | uint32_t dig_enc_in_use = 0; | 1773 | uint32_t dig_enc_in_use = 0; |
| 1745 | 1774 | ||
| 1746 | /* DCE4/5 */ | 1775 | if (ASIC_IS_DCE6(rdev)) { |
| 1747 | if (ASIC_IS_DCE4(rdev)) { | 1776 | /* DCE6 */ |
| 1748 | dig = radeon_encoder->enc_priv; | 1777 | switch (radeon_encoder->encoder_id) { |
| 1749 | if (ASIC_IS_DCE41(rdev)) { | 1778 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: |
| 1779 | if (dig->linkb) | ||
| 1780 | return 1; | ||
| 1781 | else | ||
| 1782 | return 0; | ||
| 1783 | break; | ||
| 1784 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | ||
| 1785 | if (dig->linkb) | ||
| 1786 | return 3; | ||
| 1787 | else | ||
| 1788 | return 2; | ||
| 1789 | break; | ||
| 1790 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | ||
| 1791 | if (dig->linkb) | ||
| 1792 | return 5; | ||
| 1793 | else | ||
| 1794 | return 4; | ||
| 1795 | break; | ||
| 1796 | } | ||
| 1797 | } else if (ASIC_IS_DCE4(rdev)) { | ||
| 1798 | /* DCE4/5 */ | ||
| 1799 | if (ASIC_IS_DCE41(rdev) && !ASIC_IS_DCE61(rdev)) { | ||
| 1750 | /* ontario follows DCE4 */ | 1800 | /* ontario follows DCE4 */ |
| 1751 | if (rdev->family == CHIP_PALM) { | 1801 | if (rdev->family == CHIP_PALM) { |
| 1752 | if (dig->linkb) | 1802 | if (dig->linkb) |
| @@ -1848,10 +1898,12 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 1848 | struct drm_device *dev = encoder->dev; | 1898 | struct drm_device *dev = encoder->dev; |
| 1849 | struct radeon_device *rdev = dev->dev_private; | 1899 | struct radeon_device *rdev = dev->dev_private; |
| 1850 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 1900 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1851 | struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); | ||
| 1852 | 1901 | ||
| 1853 | radeon_encoder->pixel_clock = adjusted_mode->clock; | 1902 | radeon_encoder->pixel_clock = adjusted_mode->clock; |
| 1854 | 1903 | ||
| 1904 | /* need to call this here rather than in prepare() since we need some crtc info */ | ||
| 1905 | radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); | ||
| 1906 | |||
| 1855 | if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) { | 1907 | if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) { |
| 1856 | if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) | 1908 | if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) |
| 1857 | atombios_yuv_setup(encoder, true); | 1909 | atombios_yuv_setup(encoder, true); |
| @@ -1870,38 +1922,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 1870 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | 1922 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
| 1871 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | 1923 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
| 1872 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 1924 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 1873 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | 1925 | /* handled in dpms */ |
| 1874 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
| 1875 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | ||
| 1876 | |||
| 1877 | if (!connector) | ||
| 1878 | dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | ||
| 1879 | else | ||
| 1880 | dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); | ||
| 1881 | |||
| 1882 | /* setup and enable the encoder */ | ||
| 1883 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | ||
| 1884 | atombios_dig_encoder_setup(encoder, | ||
| 1885 | ATOM_ENCODER_CMD_SETUP_PANEL_MODE, | ||
| 1886 | dig->panel_mode); | ||
| 1887 | } else if (ASIC_IS_DCE4(rdev)) { | ||
| 1888 | /* disable the transmitter */ | ||
| 1889 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1890 | /* setup and enable the encoder */ | ||
| 1891 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | ||
| 1892 | |||
| 1893 | /* enable the transmitter */ | ||
| 1894 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | ||
| 1895 | } else { | ||
| 1896 | /* disable the encoder and transmitter */ | ||
| 1897 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 1898 | atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); | ||
| 1899 | |||
| 1900 | /* setup and enable the encoder and transmitter */ | ||
| 1901 | atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0); | ||
| 1902 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); | ||
| 1903 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); | ||
| 1904 | } | ||
| 1905 | break; | 1926 | break; |
| 1906 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | 1927 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
| 1907 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | 1928 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
| @@ -1922,14 +1943,6 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 1922 | break; | 1943 | break; |
| 1923 | } | 1944 | } |
| 1924 | 1945 | ||
| 1925 | if (ext_encoder) { | ||
| 1926 | if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) | ||
| 1927 | atombios_external_encoder_setup(encoder, ext_encoder, | ||
| 1928 | EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP); | ||
| 1929 | else | ||
| 1930 | atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); | ||
| 1931 | } | ||
| 1932 | |||
| 1933 | atombios_apply_encoder_quirks(encoder, adjusted_mode); | 1946 | atombios_apply_encoder_quirks(encoder, adjusted_mode); |
| 1934 | 1947 | ||
| 1935 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { | 1948 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { |
| @@ -2116,7 +2129,6 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) | |||
| 2116 | } | 2129 | } |
| 2117 | 2130 | ||
| 2118 | radeon_atom_output_lock(encoder, true); | 2131 | radeon_atom_output_lock(encoder, true); |
| 2119 | radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); | ||
| 2120 | 2132 | ||
| 2121 | if (connector) { | 2133 | if (connector) { |
| 2122 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 2134 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| @@ -2137,6 +2149,7 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) | |||
| 2137 | 2149 | ||
| 2138 | static void radeon_atom_encoder_commit(struct drm_encoder *encoder) | 2150 | static void radeon_atom_encoder_commit(struct drm_encoder *encoder) |
| 2139 | { | 2151 | { |
| 2152 | /* need to call this here as we need the crtc set up */ | ||
| 2140 | radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON); | 2153 | radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON); |
| 2141 | radeon_atom_output_lock(encoder, false); | 2154 | radeon_atom_output_lock(encoder, false); |
| 2142 | } | 2155 | } |
| @@ -2177,14 +2190,7 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder) | |||
| 2177 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | 2190 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
| 2178 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | 2191 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
| 2179 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 2192 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 2180 | if (ASIC_IS_DCE4(rdev)) | 2193 | /* handled in dpms */ |
| 2181 | /* disable the transmitter */ | ||
| 2182 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 2183 | else { | ||
| 2184 | /* disable the encoder and transmitter */ | ||
| 2185 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); | ||
| 2186 | atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); | ||
| 2187 | } | ||
| 2188 | break; | 2194 | break; |
| 2189 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | 2195 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
| 2190 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | 2196 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 8acb34fd3fd5..8d7e33a0b243 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -1182,7 +1182,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 1182 | ring->ready = true; | 1182 | ring->ready = true; |
| 1183 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); | 1183 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); |
| 1184 | 1184 | ||
| 1185 | if (radeon_ring_supports_scratch_reg(rdev, ring)) { | 1185 | if (!ring->rptr_save_reg /* not resuming from suspend */ |
| 1186 | && radeon_ring_supports_scratch_reg(rdev, ring)) { | ||
| 1186 | r = radeon_scratch_get(rdev, &ring->rptr_save_reg); | 1187 | r = radeon_scratch_get(rdev, &ring->rptr_save_reg); |
| 1187 | if (r) { | 1188 | if (r) { |
| 1188 | DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r); | 1189 | DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r); |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index ab74e6b149e7..f37676d7f217 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
| @@ -63,6 +63,7 @@ struct r600_cs_track { | |||
| 63 | u32 cb_color_size_idx[8]; /* unused */ | 63 | u32 cb_color_size_idx[8]; /* unused */ |
| 64 | u32 cb_target_mask; | 64 | u32 cb_target_mask; |
| 65 | u32 cb_shader_mask; /* unused */ | 65 | u32 cb_shader_mask; /* unused */ |
| 66 | bool is_resolve; | ||
| 66 | u32 cb_color_size[8]; | 67 | u32 cb_color_size[8]; |
| 67 | u32 vgt_strmout_en; | 68 | u32 vgt_strmout_en; |
| 68 | u32 vgt_strmout_buffer_en; | 69 | u32 vgt_strmout_buffer_en; |
| @@ -315,7 +316,15 @@ static void r600_cs_track_init(struct r600_cs_track *track) | |||
| 315 | track->cb_color_bo[i] = NULL; | 316 | track->cb_color_bo[i] = NULL; |
| 316 | track->cb_color_bo_offset[i] = 0xFFFFFFFF; | 317 | track->cb_color_bo_offset[i] = 0xFFFFFFFF; |
| 317 | track->cb_color_bo_mc[i] = 0xFFFFFFFF; | 318 | track->cb_color_bo_mc[i] = 0xFFFFFFFF; |
| 318 | } | 319 | track->cb_color_frag_bo[i] = NULL; |
| 320 | track->cb_color_frag_offset[i] = 0xFFFFFFFF; | ||
| 321 | track->cb_color_tile_bo[i] = NULL; | ||
| 322 | track->cb_color_tile_offset[i] = 0xFFFFFFFF; | ||
| 323 | track->cb_color_mask[i] = 0xFFFFFFFF; | ||
| 324 | } | ||
| 325 | track->is_resolve = false; | ||
| 326 | track->nsamples = 16; | ||
| 327 | track->log_nsamples = 4; | ||
| 319 | track->cb_target_mask = 0xFFFFFFFF; | 328 | track->cb_target_mask = 0xFFFFFFFF; |
| 320 | track->cb_shader_mask = 0xFFFFFFFF; | 329 | track->cb_shader_mask = 0xFFFFFFFF; |
| 321 | track->cb_dirty = true; | 330 | track->cb_dirty = true; |
| @@ -352,6 +361,8 @@ static int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) | |||
| 352 | volatile u32 *ib = p->ib.ptr; | 361 | volatile u32 *ib = p->ib.ptr; |
| 353 | unsigned array_mode; | 362 | unsigned array_mode; |
| 354 | u32 format; | 363 | u32 format; |
| 364 | /* When resolve is used, the second colorbuffer has always 1 sample. */ | ||
| 365 | unsigned nsamples = track->is_resolve && i == 1 ? 1 : track->nsamples; | ||
| 355 | 366 | ||
| 356 | size = radeon_bo_size(track->cb_color_bo[i]) - track->cb_color_bo_offset[i]; | 367 | size = radeon_bo_size(track->cb_color_bo[i]) - track->cb_color_bo_offset[i]; |
| 357 | format = G_0280A0_FORMAT(track->cb_color_info[i]); | 368 | format = G_0280A0_FORMAT(track->cb_color_info[i]); |
| @@ -375,7 +386,7 @@ static int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) | |||
| 375 | array_check.group_size = track->group_size; | 386 | array_check.group_size = track->group_size; |
| 376 | array_check.nbanks = track->nbanks; | 387 | array_check.nbanks = track->nbanks; |
| 377 | array_check.npipes = track->npipes; | 388 | array_check.npipes = track->npipes; |
| 378 | array_check.nsamples = track->nsamples; | 389 | array_check.nsamples = nsamples; |
| 379 | array_check.blocksize = r600_fmt_get_blocksize(format); | 390 | array_check.blocksize = r600_fmt_get_blocksize(format); |
| 380 | if (r600_get_array_mode_alignment(&array_check, | 391 | if (r600_get_array_mode_alignment(&array_check, |
| 381 | &pitch_align, &height_align, &depth_align, &base_align)) { | 392 | &pitch_align, &height_align, &depth_align, &base_align)) { |
| @@ -421,7 +432,7 @@ static int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) | |||
| 421 | 432 | ||
| 422 | /* check offset */ | 433 | /* check offset */ |
| 423 | tmp = r600_fmt_get_nblocksy(format, height) * r600_fmt_get_nblocksx(format, pitch) * | 434 | tmp = r600_fmt_get_nblocksy(format, height) * r600_fmt_get_nblocksx(format, pitch) * |
| 424 | r600_fmt_get_blocksize(format) * track->nsamples; | 435 | r600_fmt_get_blocksize(format) * nsamples; |
| 425 | switch (array_mode) { | 436 | switch (array_mode) { |
| 426 | default: | 437 | default: |
| 427 | case V_0280A0_ARRAY_LINEAR_GENERAL: | 438 | case V_0280A0_ARRAY_LINEAR_GENERAL: |
| @@ -792,6 +803,12 @@ static int r600_cs_track_check(struct radeon_cs_parser *p) | |||
| 792 | */ | 803 | */ |
| 793 | if (track->cb_dirty) { | 804 | if (track->cb_dirty) { |
| 794 | tmp = track->cb_target_mask; | 805 | tmp = track->cb_target_mask; |
| 806 | |||
| 807 | /* We must check both colorbuffers for RESOLVE. */ | ||
| 808 | if (track->is_resolve) { | ||
| 809 | tmp |= 0xff; | ||
| 810 | } | ||
| 811 | |||
| 795 | for (i = 0; i < 8; i++) { | 812 | for (i = 0; i < 8; i++) { |
| 796 | if ((tmp >> (i * 4)) & 0xF) { | 813 | if ((tmp >> (i * 4)) & 0xF) { |
| 797 | /* at least one component is enabled */ | 814 | /* at least one component is enabled */ |
| @@ -1281,6 +1298,11 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) | |||
| 1281 | track->nsamples = 1 << tmp; | 1298 | track->nsamples = 1 << tmp; |
| 1282 | track->cb_dirty = true; | 1299 | track->cb_dirty = true; |
| 1283 | break; | 1300 | break; |
| 1301 | case R_028808_CB_COLOR_CONTROL: | ||
| 1302 | tmp = G_028808_SPECIAL_OP(radeon_get_ib_value(p, idx)); | ||
| 1303 | track->is_resolve = tmp == V_028808_SPECIAL_RESOLVE_BOX; | ||
| 1304 | track->cb_dirty = true; | ||
| 1305 | break; | ||
| 1284 | case R_0280A0_CB_COLOR0_INFO: | 1306 | case R_0280A0_CB_COLOR0_INFO: |
| 1285 | case R_0280A4_CB_COLOR1_INFO: | 1307 | case R_0280A4_CB_COLOR1_INFO: |
| 1286 | case R_0280A8_CB_COLOR2_INFO: | 1308 | case R_0280A8_CB_COLOR2_INFO: |
| @@ -1416,7 +1438,7 @@ static int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) | |||
| 1416 | case R_028118_CB_COLOR6_MASK: | 1438 | case R_028118_CB_COLOR6_MASK: |
| 1417 | case R_02811C_CB_COLOR7_MASK: | 1439 | case R_02811C_CB_COLOR7_MASK: |
| 1418 | tmp = (reg - R_028100_CB_COLOR0_MASK) / 4; | 1440 | tmp = (reg - R_028100_CB_COLOR0_MASK) / 4; |
| 1419 | track->cb_color_mask[tmp] = ib[idx]; | 1441 | track->cb_color_mask[tmp] = radeon_get_ib_value(p, idx); |
| 1420 | if (G_0280A0_TILE_MODE(track->cb_color_info[tmp])) { | 1442 | if (G_0280A0_TILE_MODE(track->cb_color_info[tmp])) { |
| 1421 | track->cb_dirty = true; | 1443 | track->cb_dirty = true; |
| 1422 | } | 1444 | } |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index bdb69a63062f..fa6f37099ba9 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -66,6 +66,14 @@ | |||
| 66 | #define CC_RB_BACKEND_DISABLE 0x98F4 | 66 | #define CC_RB_BACKEND_DISABLE 0x98F4 |
| 67 | #define BACKEND_DISABLE(x) ((x) << 16) | 67 | #define BACKEND_DISABLE(x) ((x) << 16) |
| 68 | 68 | ||
| 69 | #define R_028808_CB_COLOR_CONTROL 0x28808 | ||
| 70 | #define S_028808_SPECIAL_OP(x) (((x) & 0x7) << 4) | ||
| 71 | #define G_028808_SPECIAL_OP(x) (((x) >> 4) & 0x7) | ||
| 72 | #define C_028808_SPECIAL_OP 0xFFFFFF8F | ||
| 73 | #define V_028808_SPECIAL_NORMAL 0x00 | ||
| 74 | #define V_028808_SPECIAL_DISABLE 0x01 | ||
| 75 | #define V_028808_SPECIAL_RESOLVE_BOX 0x07 | ||
| 76 | |||
| 69 | #define CB_COLOR0_BASE 0x28040 | 77 | #define CB_COLOR0_BASE 0x28040 |
| 70 | #define CB_COLOR1_BASE 0x28044 | 78 | #define CB_COLOR1_BASE 0x28044 |
| 71 | #define CB_COLOR2_BASE 0x28048 | 79 | #define CB_COLOR2_BASE 0x28048 |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index d2e243867ac6..7a3daebd732d 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -1051,7 +1051,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 1051 | if (rdev->flags & RADEON_IS_AGP) | 1051 | if (rdev->flags & RADEON_IS_AGP) |
| 1052 | rdev->need_dma32 = true; | 1052 | rdev->need_dma32 = true; |
| 1053 | if ((rdev->flags & RADEON_IS_PCI) && | 1053 | if ((rdev->flags & RADEON_IS_PCI) && |
| 1054 | (rdev->family < CHIP_RS400)) | 1054 | (rdev->family <= CHIP_RS740)) |
| 1055 | rdev->need_dma32 = true; | 1055 | rdev->need_dma32 = true; |
| 1056 | 1056 | ||
| 1057 | dma_bits = rdev->need_dma32 ? 32 : 40; | 1057 | dma_bits = rdev->need_dma32 ? 32 : 40; |
| @@ -1346,12 +1346,15 @@ retry: | |||
| 1346 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { | 1346 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { |
| 1347 | radeon_ring_restore(rdev, &rdev->ring[i], | 1347 | radeon_ring_restore(rdev, &rdev->ring[i], |
| 1348 | ring_sizes[i], ring_data[i]); | 1348 | ring_sizes[i], ring_data[i]); |
| 1349 | ring_sizes[i] = 0; | ||
| 1350 | ring_data[i] = NULL; | ||
| 1349 | } | 1351 | } |
| 1350 | 1352 | ||
| 1351 | r = radeon_ib_ring_tests(rdev); | 1353 | r = radeon_ib_ring_tests(rdev); |
| 1352 | if (r) { | 1354 | if (r) { |
| 1353 | dev_err(rdev->dev, "ib ring test failed (%d).\n", r); | 1355 | dev_err(rdev->dev, "ib ring test failed (%d).\n", r); |
| 1354 | if (saved) { | 1356 | if (saved) { |
| 1357 | saved = false; | ||
| 1355 | radeon_suspend(rdev); | 1358 | radeon_suspend(rdev); |
| 1356 | goto retry; | 1359 | goto retry; |
| 1357 | } | 1360 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 27d22d709c90..8c593ea82c41 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
| @@ -63,9 +63,10 @@ | |||
| 63 | * 2.19.0 - r600-eg: MSAA textures | 63 | * 2.19.0 - r600-eg: MSAA textures |
| 64 | * 2.20.0 - r600-si: RADEON_INFO_TIMESTAMP query | 64 | * 2.20.0 - r600-si: RADEON_INFO_TIMESTAMP query |
| 65 | * 2.21.0 - r600-r700: FMASK and CMASK | 65 | * 2.21.0 - r600-r700: FMASK and CMASK |
| 66 | * 2.22.0 - r600 only: RESOLVE_BOX allowed | ||
| 66 | */ | 67 | */ |
| 67 | #define KMS_DRIVER_MAJOR 2 | 68 | #define KMS_DRIVER_MAJOR 2 |
| 68 | #define KMS_DRIVER_MINOR 21 | 69 | #define KMS_DRIVER_MINOR 22 |
| 69 | #define KMS_DRIVER_PATCHLEVEL 0 | 70 | #define KMS_DRIVER_PATCHLEVEL 0 |
| 70 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); | 71 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); |
| 71 | int radeon_driver_unload_kms(struct drm_device *dev); | 72 | int radeon_driver_unload_kms(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 7b737b9339ad..2a59375dbe52 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
| @@ -131,7 +131,7 @@ int radeon_fence_emit(struct radeon_device *rdev, | |||
| 131 | */ | 131 | */ |
| 132 | void radeon_fence_process(struct radeon_device *rdev, int ring) | 132 | void radeon_fence_process(struct radeon_device *rdev, int ring) |
| 133 | { | 133 | { |
| 134 | uint64_t seq, last_seq; | 134 | uint64_t seq, last_seq, last_emitted; |
| 135 | unsigned count_loop = 0; | 135 | unsigned count_loop = 0; |
| 136 | bool wake = false; | 136 | bool wake = false; |
| 137 | 137 | ||
| @@ -158,13 +158,15 @@ void radeon_fence_process(struct radeon_device *rdev, int ring) | |||
| 158 | */ | 158 | */ |
| 159 | last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq); | 159 | last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq); |
| 160 | do { | 160 | do { |
| 161 | last_emitted = rdev->fence_drv[ring].sync_seq[ring]; | ||
| 161 | seq = radeon_fence_read(rdev, ring); | 162 | seq = radeon_fence_read(rdev, ring); |
| 162 | seq |= last_seq & 0xffffffff00000000LL; | 163 | seq |= last_seq & 0xffffffff00000000LL; |
| 163 | if (seq < last_seq) { | 164 | if (seq < last_seq) { |
| 164 | seq += 0x100000000LL; | 165 | seq &= 0xffffffff; |
| 166 | seq |= last_emitted & 0xffffffff00000000LL; | ||
| 165 | } | 167 | } |
| 166 | 168 | ||
| 167 | if (seq == last_seq) { | 169 | if (seq <= last_seq || seq > last_emitted) { |
| 168 | break; | 170 | break; |
| 169 | } | 171 | } |
| 170 | /* If we loop over we don't want to return without | 172 | /* If we loop over we don't want to return without |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600 index f93e45d869f4..20bfbda7b3f1 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/r600 +++ b/drivers/gpu/drm/radeon/reg_srcs/r600 | |||
| @@ -744,7 +744,6 @@ r600 0x9400 | |||
| 744 | 0x00028C38 CB_CLRCMP_DST | 744 | 0x00028C38 CB_CLRCMP_DST |
| 745 | 0x00028C3C CB_CLRCMP_MSK | 745 | 0x00028C3C CB_CLRCMP_MSK |
| 746 | 0x00028C34 CB_CLRCMP_SRC | 746 | 0x00028C34 CB_CLRCMP_SRC |
| 747 | 0x00028808 CB_COLOR_CONTROL | ||
| 748 | 0x0002842C CB_FOG_BLUE | 747 | 0x0002842C CB_FOG_BLUE |
| 749 | 0x00028428 CB_FOG_GREEN | 748 | 0x00028428 CB_FOG_GREEN |
| 750 | 0x00028424 CB_FOG_RED | 749 | 0x00028424 CB_FOG_RED |
diff --git a/drivers/gpu/drm/savage/savage_drv.c b/drivers/gpu/drm/savage/savage_drv.c index d31d4cca9a4c..c5a164337bd5 100644 --- a/drivers/gpu/drm/savage/savage_drv.c +++ b/drivers/gpu/drm/savage/savage_drv.c | |||
| @@ -43,6 +43,9 @@ static const struct file_operations savage_driver_fops = { | |||
| 43 | .mmap = drm_mmap, | 43 | .mmap = drm_mmap, |
| 44 | .poll = drm_poll, | 44 | .poll = drm_poll, |
| 45 | .fasync = drm_fasync, | 45 | .fasync = drm_fasync, |
| 46 | #ifdef CONFIG_COMPAT | ||
| 47 | .compat_ioctl = drm_compat_ioctl, | ||
| 48 | #endif | ||
| 46 | .llseek = noop_llseek, | 49 | .llseek = noop_llseek, |
| 47 | }; | 50 | }; |
| 48 | 51 | ||
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c index 7f119870147c..867dc03000e6 100644 --- a/drivers/gpu/drm/sis/sis_drv.c +++ b/drivers/gpu/drm/sis/sis_drv.c | |||
| @@ -74,6 +74,9 @@ static const struct file_operations sis_driver_fops = { | |||
| 74 | .mmap = drm_mmap, | 74 | .mmap = drm_mmap, |
| 75 | .poll = drm_poll, | 75 | .poll = drm_poll, |
| 76 | .fasync = drm_fasync, | 76 | .fasync = drm_fasync, |
| 77 | #ifdef CONFIG_COMPAT | ||
| 78 | .compat_ioctl = drm_compat_ioctl, | ||
| 79 | #endif | ||
| 77 | .llseek = noop_llseek, | 80 | .llseek = noop_llseek, |
| 78 | }; | 81 | }; |
| 79 | 82 | ||
diff --git a/drivers/gpu/drm/tdfx/tdfx_drv.c b/drivers/gpu/drm/tdfx/tdfx_drv.c index 90f6b13acfac..a7f4d6bd1330 100644 --- a/drivers/gpu/drm/tdfx/tdfx_drv.c +++ b/drivers/gpu/drm/tdfx/tdfx_drv.c | |||
| @@ -49,6 +49,9 @@ static const struct file_operations tdfx_driver_fops = { | |||
| 49 | .mmap = drm_mmap, | 49 | .mmap = drm_mmap, |
| 50 | .poll = drm_poll, | 50 | .poll = drm_poll, |
| 51 | .fasync = drm_fasync, | 51 | .fasync = drm_fasync, |
| 52 | #ifdef CONFIG_COMPAT | ||
| 53 | .compat_ioctl = drm_compat_ioctl, | ||
| 54 | #endif | ||
| 52 | .llseek = noop_llseek, | 55 | .llseek = noop_llseek, |
| 53 | }; | 56 | }; |
| 54 | 57 | ||
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index 6e52069894b3..9f84128505bb 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c | |||
| @@ -66,6 +66,9 @@ static const struct file_operations udl_driver_fops = { | |||
| 66 | .unlocked_ioctl = drm_ioctl, | 66 | .unlocked_ioctl = drm_ioctl, |
| 67 | .release = drm_release, | 67 | .release = drm_release, |
| 68 | .fasync = drm_fasync, | 68 | .fasync = drm_fasync, |
| 69 | #ifdef CONFIG_COMPAT | ||
| 70 | .compat_ioctl = drm_compat_ioctl, | ||
| 71 | #endif | ||
| 69 | .llseek = noop_llseek, | 72 | .llseek = noop_llseek, |
| 70 | }; | 73 | }; |
| 71 | 74 | ||
diff --git a/drivers/gpu/drm/via/via_drv.c b/drivers/gpu/drm/via/via_drv.c index e927b4c052f5..af1b914b17e3 100644 --- a/drivers/gpu/drm/via/via_drv.c +++ b/drivers/gpu/drm/via/via_drv.c | |||
| @@ -65,6 +65,9 @@ static const struct file_operations via_driver_fops = { | |||
| 65 | .mmap = drm_mmap, | 65 | .mmap = drm_mmap, |
| 66 | .poll = drm_poll, | 66 | .poll = drm_poll, |
| 67 | .fasync = drm_fasync, | 67 | .fasync = drm_fasync, |
| 68 | #ifdef CONFIG_COMPAT | ||
| 69 | .compat_ioctl = drm_compat_ioctl, | ||
| 70 | #endif | ||
| 68 | .llseek = noop_llseek, | 71 | .llseek = noop_llseek, |
| 69 | }; | 72 | }; |
| 70 | 73 | ||
diff --git a/drivers/gpu/drm/vmwgfx/Kconfig b/drivers/gpu/drm/vmwgfx/Kconfig index 794ff67c5701..b71bcd0bfbbf 100644 --- a/drivers/gpu/drm/vmwgfx/Kconfig +++ b/drivers/gpu/drm/vmwgfx/Kconfig | |||
| @@ -12,3 +12,11 @@ config DRM_VMWGFX | |||
| 12 | This is a KMS enabled DRM driver for the VMware SVGA2 | 12 | This is a KMS enabled DRM driver for the VMware SVGA2 |
| 13 | virtual hardware. | 13 | virtual hardware. |
| 14 | The compiled module will be called "vmwgfx.ko". | 14 | The compiled module will be called "vmwgfx.ko". |
| 15 | |||
| 16 | config DRM_VMWGFX_FBCON | ||
| 17 | depends on DRM_VMWGFX | ||
| 18 | bool "Enable framebuffer console under vmwgfx by default" | ||
| 19 | help | ||
| 20 | Choose this option if you are shipping a new vmwgfx | ||
| 21 | userspace driver that supports using the kernel driver. | ||
| 22 | |||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 4d9edead01ac..ba2c35dbf10e 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
| @@ -182,8 +182,9 @@ static struct pci_device_id vmw_pci_id_list[] = { | |||
| 182 | {0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII}, | 182 | {0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII}, |
| 183 | {0, 0, 0} | 183 | {0, 0, 0} |
| 184 | }; | 184 | }; |
| 185 | MODULE_DEVICE_TABLE(pci, vmw_pci_id_list); | ||
| 185 | 186 | ||
| 186 | static int enable_fbdev; | 187 | static int enable_fbdev = IS_ENABLED(CONFIG_DRM_VMWGFX_FBCON); |
| 187 | 188 | ||
| 188 | static int vmw_probe(struct pci_dev *, const struct pci_device_id *); | 189 | static int vmw_probe(struct pci_dev *, const struct pci_device_id *); |
| 189 | static void vmw_master_init(struct vmw_master *); | 190 | static void vmw_master_init(struct vmw_master *); |
| @@ -1154,6 +1155,11 @@ static struct drm_driver driver = { | |||
| 1154 | .open = vmw_driver_open, | 1155 | .open = vmw_driver_open, |
| 1155 | .preclose = vmw_preclose, | 1156 | .preclose = vmw_preclose, |
| 1156 | .postclose = vmw_postclose, | 1157 | .postclose = vmw_postclose, |
| 1158 | |||
| 1159 | .dumb_create = vmw_dumb_create, | ||
| 1160 | .dumb_map_offset = vmw_dumb_map_offset, | ||
| 1161 | .dumb_destroy = vmw_dumb_destroy, | ||
| 1162 | |||
| 1157 | .fops = &vmwgfx_driver_fops, | 1163 | .fops = &vmwgfx_driver_fops, |
| 1158 | .name = VMWGFX_DRIVER_NAME, | 1164 | .name = VMWGFX_DRIVER_NAME, |
| 1159 | .desc = VMWGFX_DRIVER_DESC, | 1165 | .desc = VMWGFX_DRIVER_DESC, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index d0f2c079ee27..29c984ff7f23 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -645,6 +645,16 @@ int vmw_kms_readback(struct vmw_private *dev_priv, | |||
| 645 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | 645 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, |
| 646 | struct drm_file *file_priv); | 646 | struct drm_file *file_priv); |
| 647 | 647 | ||
| 648 | int vmw_dumb_create(struct drm_file *file_priv, | ||
| 649 | struct drm_device *dev, | ||
| 650 | struct drm_mode_create_dumb *args); | ||
| 651 | |||
| 652 | int vmw_dumb_map_offset(struct drm_file *file_priv, | ||
| 653 | struct drm_device *dev, uint32_t handle, | ||
| 654 | uint64_t *offset); | ||
| 655 | int vmw_dumb_destroy(struct drm_file *file_priv, | ||
| 656 | struct drm_device *dev, | ||
| 657 | uint32_t handle); | ||
| 648 | /** | 658 | /** |
| 649 | * Overlay control - vmwgfx_overlay.c | 659 | * Overlay control - vmwgfx_overlay.c |
| 650 | */ | 660 | */ |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 22bf9a21ec71..2c6ffe0e2c07 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -1917,3 +1917,76 @@ err_ref: | |||
| 1917 | vmw_resource_unreference(&res); | 1917 | vmw_resource_unreference(&res); |
| 1918 | return ret; | 1918 | return ret; |
| 1919 | } | 1919 | } |
| 1920 | |||
| 1921 | |||
| 1922 | int vmw_dumb_create(struct drm_file *file_priv, | ||
| 1923 | struct drm_device *dev, | ||
| 1924 | struct drm_mode_create_dumb *args) | ||
| 1925 | { | ||
| 1926 | struct vmw_private *dev_priv = vmw_priv(dev); | ||
| 1927 | struct vmw_master *vmaster = vmw_master(file_priv->master); | ||
| 1928 | struct vmw_user_dma_buffer *vmw_user_bo; | ||
| 1929 | struct ttm_buffer_object *tmp; | ||
| 1930 | int ret; | ||
| 1931 | |||
| 1932 | args->pitch = args->width * ((args->bpp + 7) / 8); | ||
| 1933 | args->size = args->pitch * args->height; | ||
| 1934 | |||
| 1935 | vmw_user_bo = kzalloc(sizeof(*vmw_user_bo), GFP_KERNEL); | ||
| 1936 | if (vmw_user_bo == NULL) | ||
| 1937 | return -ENOMEM; | ||
| 1938 | |||
| 1939 | ret = ttm_read_lock(&vmaster->lock, true); | ||
| 1940 | if (ret != 0) { | ||
| 1941 | kfree(vmw_user_bo); | ||
| 1942 | return ret; | ||
| 1943 | } | ||
| 1944 | |||
| 1945 | ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, args->size, | ||
| 1946 | &vmw_vram_sys_placement, true, | ||
| 1947 | &vmw_user_dmabuf_destroy); | ||
| 1948 | if (ret != 0) | ||
| 1949 | goto out_no_dmabuf; | ||
| 1950 | |||
| 1951 | tmp = ttm_bo_reference(&vmw_user_bo->dma.base); | ||
| 1952 | ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile, | ||
| 1953 | &vmw_user_bo->base, | ||
| 1954 | false, | ||
| 1955 | ttm_buffer_type, | ||
| 1956 | &vmw_user_dmabuf_release, NULL); | ||
| 1957 | if (unlikely(ret != 0)) | ||
| 1958 | goto out_no_base_object; | ||
| 1959 | |||
| 1960 | args->handle = vmw_user_bo->base.hash.key; | ||
| 1961 | |||
| 1962 | out_no_base_object: | ||
| 1963 | ttm_bo_unref(&tmp); | ||
| 1964 | out_no_dmabuf: | ||
| 1965 | ttm_read_unlock(&vmaster->lock); | ||
| 1966 | return ret; | ||
| 1967 | } | ||
| 1968 | |||
| 1969 | int vmw_dumb_map_offset(struct drm_file *file_priv, | ||
| 1970 | struct drm_device *dev, uint32_t handle, | ||
| 1971 | uint64_t *offset) | ||
| 1972 | { | ||
| 1973 | struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; | ||
| 1974 | struct vmw_dma_buffer *out_buf; | ||
| 1975 | int ret; | ||
| 1976 | |||
| 1977 | ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf); | ||
| 1978 | if (ret != 0) | ||
| 1979 | return -EINVAL; | ||
| 1980 | |||
| 1981 | *offset = out_buf->base.addr_space_offset; | ||
| 1982 | vmw_dmabuf_unreference(&out_buf); | ||
| 1983 | return 0; | ||
| 1984 | } | ||
| 1985 | |||
| 1986 | int vmw_dumb_destroy(struct drm_file *file_priv, | ||
| 1987 | struct drm_device *dev, | ||
| 1988 | uint32_t handle) | ||
| 1989 | { | ||
| 1990 | return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile, | ||
| 1991 | handle, TTM_REF_USAGE); | ||
| 1992 | } | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 60ea284407ce..8bcd168fffae 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -996,7 +996,8 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, | |||
| 996 | struct hid_driver *hdrv = hid->driver; | 996 | struct hid_driver *hdrv = hid->driver; |
| 997 | int ret; | 997 | int ret; |
| 998 | 998 | ||
| 999 | hid_dump_input(hid, usage, value); | 999 | if (!list_empty(&hid->debug_list)) |
| 1000 | hid_dump_input(hid, usage, value); | ||
| 1000 | 1001 | ||
| 1001 | if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { | 1002 | if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { |
| 1002 | ret = hdrv->event(hid, field, usage, value); | 1003 | ret = hdrv->event(hid, field, usage, value); |
| @@ -1558,7 +1559,9 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 1558 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, | 1559 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
| 1559 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1560 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
| 1560 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, | 1561 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, |
| 1561 | { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) }, | 1562 | #if IS_ENABLED(CONFIG_HID_LENOVO_TPKBD) |
| 1563 | { HID_USB_DEVICE(USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_TPKBD) }, | ||
| 1564 | #endif | ||
| 1562 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, | 1565 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, |
| 1563 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, | 1566 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, |
| 1564 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, | 1567 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2) }, |
| @@ -1624,7 +1627,6 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 1624 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, | 1627 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, |
| 1625 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, | 1628 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, |
| 1626 | { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) }, | 1629 | { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) }, |
| 1627 | { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) }, | ||
| 1628 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) }, | 1630 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) }, |
| 1629 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, | 1631 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, |
| 1630 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, | 1632 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, |
diff --git a/drivers/hid/hid-lenovo-tpkbd.c b/drivers/hid/hid-lenovo-tpkbd.c index 77d2df04c97b..60c4e1e85913 100644 --- a/drivers/hid/hid-lenovo-tpkbd.c +++ b/drivers/hid/hid-lenovo-tpkbd.c | |||
| @@ -519,6 +519,8 @@ static void tpkbd_remove_tp(struct hid_device *hdev) | |||
| 519 | led_classdev_unregister(&data_pointer->led_mute); | 519 | led_classdev_unregister(&data_pointer->led_mute); |
| 520 | 520 | ||
| 521 | hid_set_drvdata(hdev, NULL); | 521 | hid_set_drvdata(hdev, NULL); |
| 522 | kfree(data_pointer->led_micmute.name); | ||
| 523 | kfree(data_pointer->led_mute.name); | ||
| 522 | kfree(data_pointer); | 524 | kfree(data_pointer); |
| 523 | } | 525 | } |
| 524 | 526 | ||
diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c index 0f9c146fc00d..9500f2f3f8fe 100644 --- a/drivers/hid/hid-logitech-dj.c +++ b/drivers/hid/hid-logitech-dj.c | |||
| @@ -193,6 +193,7 @@ static struct hid_ll_driver logi_dj_ll_driver; | |||
| 193 | static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf, | 193 | static int logi_dj_output_hidraw_report(struct hid_device *hid, u8 * buf, |
| 194 | size_t count, | 194 | size_t count, |
| 195 | unsigned char report_type); | 195 | unsigned char report_type); |
| 196 | static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev); | ||
| 196 | 197 | ||
| 197 | static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, | 198 | static void logi_dj_recv_destroy_djhid_device(struct dj_receiver_dev *djrcv_dev, |
| 198 | struct dj_report *dj_report) | 199 | struct dj_report *dj_report) |
| @@ -233,6 +234,7 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, | |||
| 233 | if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] & | 234 | if (dj_report->report_params[DEVICE_PAIRED_PARAM_SPFUNCTION] & |
| 234 | SPFUNCTION_DEVICE_LIST_EMPTY) { | 235 | SPFUNCTION_DEVICE_LIST_EMPTY) { |
| 235 | dbg_hid("%s: device list is empty\n", __func__); | 236 | dbg_hid("%s: device list is empty\n", __func__); |
| 237 | djrcv_dev->querying_devices = false; | ||
| 236 | return; | 238 | return; |
| 237 | } | 239 | } |
| 238 | 240 | ||
| @@ -243,6 +245,12 @@ static void logi_dj_recv_add_djhid_device(struct dj_receiver_dev *djrcv_dev, | |||
| 243 | return; | 245 | return; |
| 244 | } | 246 | } |
| 245 | 247 | ||
| 248 | if (djrcv_dev->paired_dj_devices[dj_report->device_index]) { | ||
| 249 | /* The device is already known. No need to reallocate it. */ | ||
| 250 | dbg_hid("%s: device is already known\n", __func__); | ||
| 251 | return; | ||
| 252 | } | ||
| 253 | |||
| 246 | dj_hiddev = hid_allocate_device(); | 254 | dj_hiddev = hid_allocate_device(); |
| 247 | if (IS_ERR(dj_hiddev)) { | 255 | if (IS_ERR(dj_hiddev)) { |
| 248 | dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n", | 256 | dev_err(&djrcv_hdev->dev, "%s: hid_allocate_device failed\n", |
| @@ -306,6 +314,7 @@ static void delayedwork_callback(struct work_struct *work) | |||
| 306 | struct dj_report dj_report; | 314 | struct dj_report dj_report; |
| 307 | unsigned long flags; | 315 | unsigned long flags; |
| 308 | int count; | 316 | int count; |
| 317 | int retval; | ||
| 309 | 318 | ||
| 310 | dbg_hid("%s\n", __func__); | 319 | dbg_hid("%s\n", __func__); |
| 311 | 320 | ||
| @@ -338,6 +347,25 @@ static void delayedwork_callback(struct work_struct *work) | |||
| 338 | logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report); | 347 | logi_dj_recv_destroy_djhid_device(djrcv_dev, &dj_report); |
| 339 | break; | 348 | break; |
| 340 | default: | 349 | default: |
| 350 | /* A normal report (i. e. not belonging to a pair/unpair notification) | ||
| 351 | * arriving here, means that the report arrived but we did not have a | ||
| 352 | * paired dj_device associated to the report's device_index, this | ||
| 353 | * means that the original "device paired" notification corresponding | ||
| 354 | * to this dj_device never arrived to this driver. The reason is that | ||
| 355 | * hid-core discards all packets coming from a device while probe() is | ||
| 356 | * executing. */ | ||
| 357 | if (!djrcv_dev->paired_dj_devices[dj_report.device_index]) { | ||
| 358 | /* ok, we don't know the device, just re-ask the | ||
| 359 | * receiver for the list of connected devices. */ | ||
| 360 | retval = logi_dj_recv_query_paired_devices(djrcv_dev); | ||
| 361 | if (!retval) { | ||
| 362 | /* everything went fine, so just leave */ | ||
| 363 | break; | ||
| 364 | } | ||
| 365 | dev_err(&djrcv_dev->hdev->dev, | ||
| 366 | "%s:logi_dj_recv_query_paired_devices " | ||
| 367 | "error:%d\n", __func__, retval); | ||
| 368 | } | ||
| 341 | dbg_hid("%s: unexpected report type\n", __func__); | 369 | dbg_hid("%s: unexpected report type\n", __func__); |
| 342 | } | 370 | } |
| 343 | } | 371 | } |
| @@ -368,6 +396,12 @@ static void logi_dj_recv_forward_null_report(struct dj_receiver_dev *djrcv_dev, | |||
| 368 | if (!djdev) { | 396 | if (!djdev) { |
| 369 | dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" | 397 | dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" |
| 370 | " is NULL, index %d\n", dj_report->device_index); | 398 | " is NULL, index %d\n", dj_report->device_index); |
| 399 | kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report)); | ||
| 400 | |||
| 401 | if (schedule_work(&djrcv_dev->work) == 0) { | ||
| 402 | dbg_hid("%s: did not schedule the work item, was already " | ||
| 403 | "queued\n", __func__); | ||
| 404 | } | ||
| 371 | return; | 405 | return; |
| 372 | } | 406 | } |
| 373 | 407 | ||
| @@ -398,6 +432,12 @@ static void logi_dj_recv_forward_report(struct dj_receiver_dev *djrcv_dev, | |||
| 398 | if (dj_device == NULL) { | 432 | if (dj_device == NULL) { |
| 399 | dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" | 433 | dbg_hid("djrcv_dev->paired_dj_devices[dj_report->device_index]" |
| 400 | " is NULL, index %d\n", dj_report->device_index); | 434 | " is NULL, index %d\n", dj_report->device_index); |
| 435 | kfifo_in(&djrcv_dev->notif_fifo, dj_report, sizeof(struct dj_report)); | ||
| 436 | |||
| 437 | if (schedule_work(&djrcv_dev->work) == 0) { | ||
| 438 | dbg_hid("%s: did not schedule the work item, was already " | ||
| 439 | "queued\n", __func__); | ||
| 440 | } | ||
| 401 | return; | 441 | return; |
| 402 | } | 442 | } |
| 403 | 443 | ||
| @@ -439,7 +479,11 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) | |||
| 439 | struct dj_report *dj_report; | 479 | struct dj_report *dj_report; |
| 440 | int retval; | 480 | int retval; |
| 441 | 481 | ||
| 442 | dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL); | 482 | /* no need to protect djrcv_dev->querying_devices */ |
| 483 | if (djrcv_dev->querying_devices) | ||
| 484 | return 0; | ||
| 485 | |||
| 486 | dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); | ||
| 443 | if (!dj_report) | 487 | if (!dj_report) |
| 444 | return -ENOMEM; | 488 | return -ENOMEM; |
| 445 | dj_report->report_id = REPORT_ID_DJ_SHORT; | 489 | dj_report->report_id = REPORT_ID_DJ_SHORT; |
| @@ -450,13 +494,14 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) | |||
| 450 | return retval; | 494 | return retval; |
| 451 | } | 495 | } |
| 452 | 496 | ||
| 497 | |||
| 453 | static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, | 498 | static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, |
| 454 | unsigned timeout) | 499 | unsigned timeout) |
| 455 | { | 500 | { |
| 456 | struct dj_report *dj_report; | 501 | struct dj_report *dj_report; |
| 457 | int retval; | 502 | int retval; |
| 458 | 503 | ||
| 459 | dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL); | 504 | dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); |
| 460 | if (!dj_report) | 505 | if (!dj_report) |
| 461 | return -ENOMEM; | 506 | return -ENOMEM; |
| 462 | dj_report->report_id = REPORT_ID_DJ_SHORT; | 507 | dj_report->report_id = REPORT_ID_DJ_SHORT; |
diff --git a/drivers/hid/hid-logitech-dj.h b/drivers/hid/hid-logitech-dj.h index fd28a5e0ca3b..4a4000340ce1 100644 --- a/drivers/hid/hid-logitech-dj.h +++ b/drivers/hid/hid-logitech-dj.h | |||
| @@ -101,6 +101,7 @@ struct dj_receiver_dev { | |||
| 101 | struct work_struct work; | 101 | struct work_struct work; |
| 102 | struct kfifo notif_fifo; | 102 | struct kfifo notif_fifo; |
| 103 | spinlock_t lock; | 103 | spinlock_t lock; |
| 104 | bool querying_devices; | ||
| 104 | }; | 105 | }; |
| 105 | 106 | ||
| 106 | struct dj_device { | 107 | struct dj_device { |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 903eef3d3e10..991e85c7325c 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
| @@ -70,6 +70,7 @@ static const struct hid_blacklist { | |||
| 70 | { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, | 70 | { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, |
| 71 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, | 71 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
| 72 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | 72 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, |
| 73 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, | ||
| 73 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS }, | 74 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS }, |
| 74 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS }, | 75 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS }, |
| 75 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS }, | 76 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS }, |
diff --git a/drivers/hwmon/ad7314.c b/drivers/hwmon/ad7314.c index cfec802cf9ca..f915eb1c29f7 100644 --- a/drivers/hwmon/ad7314.c +++ b/drivers/hwmon/ad7314.c | |||
| @@ -87,10 +87,18 @@ static ssize_t ad7314_show_temperature(struct device *dev, | |||
| 87 | } | 87 | } |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | static ssize_t ad7314_show_name(struct device *dev, | ||
| 91 | struct device_attribute *devattr, char *buf) | ||
| 92 | { | ||
| 93 | return sprintf(buf, "%s\n", to_spi_device(dev)->modalias); | ||
| 94 | } | ||
| 95 | |||
| 96 | static DEVICE_ATTR(name, S_IRUGO, ad7314_show_name, NULL); | ||
| 90 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, | 97 | static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, |
| 91 | ad7314_show_temperature, NULL, 0); | 98 | ad7314_show_temperature, NULL, 0); |
| 92 | 99 | ||
| 93 | static struct attribute *ad7314_attributes[] = { | 100 | static struct attribute *ad7314_attributes[] = { |
| 101 | &dev_attr_name.attr, | ||
| 94 | &sensor_dev_attr_temp1_input.dev_attr.attr, | 102 | &sensor_dev_attr_temp1_input.dev_attr.attr, |
| 95 | NULL, | 103 | NULL, |
| 96 | }; | 104 | }; |
diff --git a/drivers/hwmon/ads7871.c b/drivers/hwmon/ads7871.c index e65c6e45d36b..7bf4ce3d405e 100644 --- a/drivers/hwmon/ads7871.c +++ b/drivers/hwmon/ads7871.c | |||
| @@ -139,6 +139,12 @@ static ssize_t show_voltage(struct device *dev, | |||
| 139 | } | 139 | } |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | static ssize_t ads7871_show_name(struct device *dev, | ||
| 143 | struct device_attribute *devattr, char *buf) | ||
| 144 | { | ||
| 145 | return sprintf(buf, "%s\n", to_spi_device(dev)->modalias); | ||
| 146 | } | ||
| 147 | |||
| 142 | static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_voltage, NULL, 0); | 148 | static SENSOR_DEVICE_ATTR(in0_input, S_IRUGO, show_voltage, NULL, 0); |
| 143 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_voltage, NULL, 1); | 149 | static SENSOR_DEVICE_ATTR(in1_input, S_IRUGO, show_voltage, NULL, 1); |
| 144 | static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_voltage, NULL, 2); | 150 | static SENSOR_DEVICE_ATTR(in2_input, S_IRUGO, show_voltage, NULL, 2); |
| @@ -148,6 +154,8 @@ static SENSOR_DEVICE_ATTR(in5_input, S_IRUGO, show_voltage, NULL, 5); | |||
| 148 | static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_voltage, NULL, 6); | 154 | static SENSOR_DEVICE_ATTR(in6_input, S_IRUGO, show_voltage, NULL, 6); |
| 149 | static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_voltage, NULL, 7); | 155 | static SENSOR_DEVICE_ATTR(in7_input, S_IRUGO, show_voltage, NULL, 7); |
| 150 | 156 | ||
| 157 | static DEVICE_ATTR(name, S_IRUGO, ads7871_show_name, NULL); | ||
| 158 | |||
| 151 | static struct attribute *ads7871_attributes[] = { | 159 | static struct attribute *ads7871_attributes[] = { |
| 152 | &sensor_dev_attr_in0_input.dev_attr.attr, | 160 | &sensor_dev_attr_in0_input.dev_attr.attr, |
| 153 | &sensor_dev_attr_in1_input.dev_attr.attr, | 161 | &sensor_dev_attr_in1_input.dev_attr.attr, |
| @@ -157,6 +165,7 @@ static struct attribute *ads7871_attributes[] = { | |||
| 157 | &sensor_dev_attr_in5_input.dev_attr.attr, | 165 | &sensor_dev_attr_in5_input.dev_attr.attr, |
| 158 | &sensor_dev_attr_in6_input.dev_attr.attr, | 166 | &sensor_dev_attr_in6_input.dev_attr.attr, |
| 159 | &sensor_dev_attr_in7_input.dev_attr.attr, | 167 | &sensor_dev_attr_in7_input.dev_attr.attr, |
| 168 | &dev_attr_name.attr, | ||
| 160 | NULL | 169 | NULL |
| 161 | }; | 170 | }; |
| 162 | 171 | ||
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 282708860517..8f3f6f2c45fd 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
| @@ -53,10 +53,10 @@ | |||
| 53 | 53 | ||
| 54 | #define APPLESMC_MAX_DATA_LENGTH 32 | 54 | #define APPLESMC_MAX_DATA_LENGTH 32 |
| 55 | 55 | ||
| 56 | /* wait up to 32 ms for a status change. */ | 56 | /* wait up to 128 ms for a status change. */ |
| 57 | #define APPLESMC_MIN_WAIT 0x0010 | 57 | #define APPLESMC_MIN_WAIT 0x0010 |
| 58 | #define APPLESMC_RETRY_WAIT 0x0100 | 58 | #define APPLESMC_RETRY_WAIT 0x0100 |
| 59 | #define APPLESMC_MAX_WAIT 0x8000 | 59 | #define APPLESMC_MAX_WAIT 0x20000 |
| 60 | 60 | ||
| 61 | #define APPLESMC_READ_CMD 0x10 | 61 | #define APPLESMC_READ_CMD 0x10 |
| 62 | #define APPLESMC_WRITE_CMD 0x11 | 62 | #define APPLESMC_WRITE_CMD 0x11 |
diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c index 351d1f4593e7..4ee578948723 100644 --- a/drivers/hwmon/asus_atk0110.c +++ b/drivers/hwmon/asus_atk0110.c | |||
| @@ -34,6 +34,12 @@ static const struct dmi_system_id __initconst atk_force_new_if[] = { | |||
| 34 | .matches = { | 34 | .matches = { |
| 35 | DMI_MATCH(DMI_BOARD_NAME, "SABERTOOTH X58") | 35 | DMI_MATCH(DMI_BOARD_NAME, "SABERTOOTH X58") |
| 36 | } | 36 | } |
| 37 | }, { | ||
| 38 | /* Old interface reads the same sensor for fan0 and fan1 */ | ||
| 39 | .ident = "Asus M5A78L", | ||
| 40 | .matches = { | ||
| 41 | DMI_MATCH(DMI_BOARD_NAME, "M5A78L") | ||
| 42 | } | ||
| 37 | }, | 43 | }, |
| 38 | { } | 44 | { } |
| 39 | }; | 45 | }; |
diff --git a/drivers/hwmon/ina2xx.c b/drivers/hwmon/ina2xx.c index 7f3f4a385729..602148299f68 100644 --- a/drivers/hwmon/ina2xx.c +++ b/drivers/hwmon/ina2xx.c | |||
| @@ -69,22 +69,6 @@ struct ina2xx_data { | |||
| 69 | u16 regs[INA2XX_MAX_REGISTERS]; | 69 | u16 regs[INA2XX_MAX_REGISTERS]; |
| 70 | }; | 70 | }; |
| 71 | 71 | ||
| 72 | int ina2xx_read_word(struct i2c_client *client, int reg) | ||
| 73 | { | ||
| 74 | int val = i2c_smbus_read_word_data(client, reg); | ||
| 75 | if (unlikely(val < 0)) { | ||
| 76 | dev_dbg(&client->dev, | ||
| 77 | "Failed to read register: %d\n", reg); | ||
| 78 | return val; | ||
| 79 | } | ||
| 80 | return be16_to_cpu(val); | ||
| 81 | } | ||
| 82 | |||
| 83 | void ina2xx_write_word(struct i2c_client *client, int reg, int data) | ||
| 84 | { | ||
| 85 | i2c_smbus_write_word_data(client, reg, cpu_to_be16(data)); | ||
| 86 | } | ||
| 87 | |||
| 88 | static struct ina2xx_data *ina2xx_update_device(struct device *dev) | 72 | static struct ina2xx_data *ina2xx_update_device(struct device *dev) |
| 89 | { | 73 | { |
| 90 | struct i2c_client *client = to_i2c_client(dev); | 74 | struct i2c_client *client = to_i2c_client(dev); |
| @@ -102,7 +86,7 @@ static struct ina2xx_data *ina2xx_update_device(struct device *dev) | |||
| 102 | 86 | ||
| 103 | /* Read all registers */ | 87 | /* Read all registers */ |
| 104 | for (i = 0; i < data->registers; i++) { | 88 | for (i = 0; i < data->registers; i++) { |
| 105 | int rv = ina2xx_read_word(client, i); | 89 | int rv = i2c_smbus_read_word_swapped(client, i); |
| 106 | if (rv < 0) { | 90 | if (rv < 0) { |
| 107 | ret = ERR_PTR(rv); | 91 | ret = ERR_PTR(rv); |
| 108 | goto abort; | 92 | goto abort; |
| @@ -279,22 +263,26 @@ static int ina2xx_probe(struct i2c_client *client, | |||
| 279 | switch (data->kind) { | 263 | switch (data->kind) { |
| 280 | case ina219: | 264 | case ina219: |
| 281 | /* device configuration */ | 265 | /* device configuration */ |
| 282 | ina2xx_write_word(client, INA2XX_CONFIG, INA219_CONFIG_DEFAULT); | 266 | i2c_smbus_write_word_swapped(client, INA2XX_CONFIG, |
| 267 | INA219_CONFIG_DEFAULT); | ||
| 283 | 268 | ||
| 284 | /* set current LSB to 1mA, shunt is in uOhms */ | 269 | /* set current LSB to 1mA, shunt is in uOhms */ |
| 285 | /* (equation 13 in datasheet) */ | 270 | /* (equation 13 in datasheet) */ |
| 286 | ina2xx_write_word(client, INA2XX_CALIBRATION, 40960000 / shunt); | 271 | i2c_smbus_write_word_swapped(client, INA2XX_CALIBRATION, |
| 272 | 40960000 / shunt); | ||
| 287 | dev_info(&client->dev, | 273 | dev_info(&client->dev, |
| 288 | "power monitor INA219 (Rshunt = %li uOhm)\n", shunt); | 274 | "power monitor INA219 (Rshunt = %li uOhm)\n", shunt); |
| 289 | data->registers = INA219_REGISTERS; | 275 | data->registers = INA219_REGISTERS; |
| 290 | break; | 276 | break; |
| 291 | case ina226: | 277 | case ina226: |
| 292 | /* device configuration */ | 278 | /* device configuration */ |
| 293 | ina2xx_write_word(client, INA2XX_CONFIG, INA226_CONFIG_DEFAULT); | 279 | i2c_smbus_write_word_swapped(client, INA2XX_CONFIG, |
| 280 | INA226_CONFIG_DEFAULT); | ||
| 294 | 281 | ||
| 295 | /* set current LSB to 1mA, shunt is in uOhms */ | 282 | /* set current LSB to 1mA, shunt is in uOhms */ |
| 296 | /* (equation 1 in datasheet)*/ | 283 | /* (equation 1 in datasheet)*/ |
| 297 | ina2xx_write_word(client, INA2XX_CALIBRATION, 5120000 / shunt); | 284 | i2c_smbus_write_word_swapped(client, INA2XX_CALIBRATION, |
| 285 | 5120000 / shunt); | ||
| 298 | dev_info(&client->dev, | 286 | dev_info(&client->dev, |
| 299 | "power monitor INA226 (Rshunt = %li uOhm)\n", shunt); | 287 | "power monitor INA226 (Rshunt = %li uOhm)\n", shunt); |
| 300 | data->registers = INA226_REGISTERS; | 288 | data->registers = INA226_REGISTERS; |
diff --git a/drivers/hwmon/twl4030-madc-hwmon.c b/drivers/hwmon/twl4030-madc-hwmon.c index 0018c7dd0097..1a174f0a3cde 100644 --- a/drivers/hwmon/twl4030-madc-hwmon.c +++ b/drivers/hwmon/twl4030-madc-hwmon.c | |||
| @@ -44,12 +44,13 @@ static ssize_t madc_read(struct device *dev, | |||
| 44 | struct device_attribute *devattr, char *buf) | 44 | struct device_attribute *devattr, char *buf) |
| 45 | { | 45 | { |
| 46 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); | 46 | struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr); |
| 47 | struct twl4030_madc_request req; | 47 | struct twl4030_madc_request req = { |
| 48 | .channels = 1 << attr->index, | ||
| 49 | .method = TWL4030_MADC_SW2, | ||
| 50 | .type = TWL4030_MADC_WAIT, | ||
| 51 | }; | ||
| 48 | long val; | 52 | long val; |
| 49 | 53 | ||
| 50 | req.channels = (1 << attr->index); | ||
| 51 | req.method = TWL4030_MADC_SW2; | ||
| 52 | req.func_cb = NULL; | ||
| 53 | val = twl4030_madc_conversion(&req); | 54 | val = twl4030_madc_conversion(&req); |
| 54 | if (val < 0) | 55 | if (val < 0) |
| 55 | return val; | 56 | return val; |
diff --git a/drivers/hwspinlock/hwspinlock_core.c b/drivers/hwspinlock/hwspinlock_core.c index 1201a15784c3..db713c0dfba4 100644 --- a/drivers/hwspinlock/hwspinlock_core.c +++ b/drivers/hwspinlock/hwspinlock_core.c | |||
| @@ -552,7 +552,7 @@ EXPORT_SYMBOL_GPL(hwspin_lock_request_specific); | |||
| 552 | */ | 552 | */ |
| 553 | int hwspin_lock_free(struct hwspinlock *hwlock) | 553 | int hwspin_lock_free(struct hwspinlock *hwlock) |
| 554 | { | 554 | { |
| 555 | struct device *dev = hwlock->bank->dev; | 555 | struct device *dev; |
| 556 | struct hwspinlock *tmp; | 556 | struct hwspinlock *tmp; |
| 557 | int ret; | 557 | int ret; |
| 558 | 558 | ||
| @@ -561,6 +561,7 @@ int hwspin_lock_free(struct hwspinlock *hwlock) | |||
| 561 | return -EINVAL; | 561 | return -EINVAL; |
| 562 | } | 562 | } |
| 563 | 563 | ||
| 564 | dev = hwlock->bank->dev; | ||
| 564 | mutex_lock(&hwspinlock_tree_lock); | 565 | mutex_lock(&hwspinlock_tree_lock); |
| 565 | 566 | ||
| 566 | /* make sure the hwspinlock is used */ | 567 | /* make sure the hwspinlock is used */ |
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 73133b1063f0..6f5f98d69af7 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
| @@ -476,17 +476,17 @@ static int pca_init(struct i2c_adapter *adap) | |||
| 476 | /* To avoid integer overflow, use clock/100 for calculations */ | 476 | /* To avoid integer overflow, use clock/100 for calculations */ |
| 477 | clock = pca_clock(pca_data) / 100; | 477 | clock = pca_clock(pca_data) / 100; |
| 478 | 478 | ||
| 479 | if (pca_data->i2c_clock > 10000) { | 479 | if (pca_data->i2c_clock > 1000000) { |
| 480 | mode = I2C_PCA_MODE_TURBO; | 480 | mode = I2C_PCA_MODE_TURBO; |
| 481 | min_tlow = 14; | 481 | min_tlow = 14; |
| 482 | min_thi = 5; | 482 | min_thi = 5; |
| 483 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ | 483 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ |
| 484 | } else if (pca_data->i2c_clock > 4000) { | 484 | } else if (pca_data->i2c_clock > 400000) { |
| 485 | mode = I2C_PCA_MODE_FASTP; | 485 | mode = I2C_PCA_MODE_FASTP; |
| 486 | min_tlow = 17; | 486 | min_tlow = 17; |
| 487 | min_thi = 9; | 487 | min_thi = 9; |
| 488 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ | 488 | raise_fall_time = 22; /* Raise 11e-8s, Fall 11e-8s */ |
| 489 | } else if (pca_data->i2c_clock > 1000) { | 489 | } else if (pca_data->i2c_clock > 100000) { |
| 490 | mode = I2C_PCA_MODE_FAST; | 490 | mode = I2C_PCA_MODE_FAST; |
| 491 | min_tlow = 44; | 491 | min_tlow = 44; |
| 492 | min_thi = 20; | 492 | min_thi = 20; |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index b4aaa1bd6728..970a1612e795 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -104,6 +104,7 @@ config I2C_I801 | |||
| 104 | DH89xxCC (PCH) | 104 | DH89xxCC (PCH) |
| 105 | Panther Point (PCH) | 105 | Panther Point (PCH) |
| 106 | Lynx Point (PCH) | 106 | Lynx Point (PCH) |
| 107 | Lynx Point-LP (PCH) | ||
| 107 | 108 | ||
| 108 | This driver can also be built as a module. If so, the module | 109 | This driver can also be built as a module. If so, the module |
| 109 | will be called i2c-i801. | 110 | will be called i2c-i801. |
| @@ -354,9 +355,13 @@ config I2C_DAVINCI | |||
| 354 | devices such as DaVinci NIC. | 355 | devices such as DaVinci NIC. |
| 355 | For details please see http://www.ti.com/davinci | 356 | For details please see http://www.ti.com/davinci |
| 356 | 357 | ||
| 358 | config I2C_DESIGNWARE_CORE | ||
| 359 | tristate | ||
| 360 | |||
| 357 | config I2C_DESIGNWARE_PLATFORM | 361 | config I2C_DESIGNWARE_PLATFORM |
| 358 | tristate "Synopsys DesignWare Platform" | 362 | tristate "Synopsys DesignWare Platform" |
| 359 | depends on HAVE_CLK | 363 | depends on HAVE_CLK |
| 364 | select I2C_DESIGNWARE_CORE | ||
| 360 | help | 365 | help |
| 361 | If you say yes to this option, support will be included for the | 366 | If you say yes to this option, support will be included for the |
| 362 | Synopsys DesignWare I2C adapter. Only master mode is supported. | 367 | Synopsys DesignWare I2C adapter. Only master mode is supported. |
| @@ -367,6 +372,7 @@ config I2C_DESIGNWARE_PLATFORM | |||
| 367 | config I2C_DESIGNWARE_PCI | 372 | config I2C_DESIGNWARE_PCI |
| 368 | tristate "Synopsys DesignWare PCI" | 373 | tristate "Synopsys DesignWare PCI" |
| 369 | depends on PCI | 374 | depends on PCI |
| 375 | select I2C_DESIGNWARE_CORE | ||
| 370 | help | 376 | help |
| 371 | If you say yes to this option, support will be included for the | 377 | If you say yes to this option, support will be included for the |
| 372 | Synopsys DesignWare I2C adapter. Only master mode is supported. | 378 | Synopsys DesignWare I2C adapter. Only master mode is supported. |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index ce3c2be7fb40..37c4182cc98b 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -33,10 +33,11 @@ obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o | |||
| 33 | obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o | 33 | obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o |
| 34 | obj-$(CONFIG_I2C_CPM) += i2c-cpm.o | 34 | obj-$(CONFIG_I2C_CPM) += i2c-cpm.o |
| 35 | obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o | 35 | obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o |
| 36 | obj-$(CONFIG_I2C_DESIGNWARE_CORE) += i2c-designware-core.o | ||
| 36 | obj-$(CONFIG_I2C_DESIGNWARE_PLATFORM) += i2c-designware-platform.o | 37 | obj-$(CONFIG_I2C_DESIGNWARE_PLATFORM) += i2c-designware-platform.o |
| 37 | i2c-designware-platform-objs := i2c-designware-platdrv.o i2c-designware-core.o | 38 | i2c-designware-platform-objs := i2c-designware-platdrv.o |
| 38 | obj-$(CONFIG_I2C_DESIGNWARE_PCI) += i2c-designware-pci.o | 39 | obj-$(CONFIG_I2C_DESIGNWARE_PCI) += i2c-designware-pci.o |
| 39 | i2c-designware-pci-objs := i2c-designware-pcidrv.o i2c-designware-core.o | 40 | i2c-designware-pci-objs := i2c-designware-pcidrv.o |
| 40 | obj-$(CONFIG_I2C_EG20T) += i2c-eg20t.o | 41 | obj-$(CONFIG_I2C_EG20T) += i2c-eg20t.o |
| 41 | obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o | 42 | obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o |
| 42 | obj-$(CONFIG_I2C_HIGHLANDER) += i2c-highlander.o | 43 | obj-$(CONFIG_I2C_HIGHLANDER) += i2c-highlander.o |
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 1e48bec80edf..7b8ebbefb581 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | * ---------------------------------------------------------------------------- | 25 | * ---------------------------------------------------------------------------- |
| 26 | * | 26 | * |
| 27 | */ | 27 | */ |
| 28 | #include <linux/export.h> | ||
| 28 | #include <linux/clk.h> | 29 | #include <linux/clk.h> |
| 29 | #include <linux/errno.h> | 30 | #include <linux/errno.h> |
| 30 | #include <linux/err.h> | 31 | #include <linux/err.h> |
| @@ -316,6 +317,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 316 | dw_writel(dev, dev->master_cfg , DW_IC_CON); | 317 | dw_writel(dev, dev->master_cfg , DW_IC_CON); |
| 317 | return 0; | 318 | return 0; |
| 318 | } | 319 | } |
| 320 | EXPORT_SYMBOL_GPL(i2c_dw_init); | ||
| 319 | 321 | ||
| 320 | /* | 322 | /* |
| 321 | * Waiting for bus not busy | 323 | * Waiting for bus not busy |
| @@ -568,12 +570,14 @@ done: | |||
| 568 | 570 | ||
| 569 | return ret; | 571 | return ret; |
| 570 | } | 572 | } |
| 573 | EXPORT_SYMBOL_GPL(i2c_dw_xfer); | ||
| 571 | 574 | ||
| 572 | u32 i2c_dw_func(struct i2c_adapter *adap) | 575 | u32 i2c_dw_func(struct i2c_adapter *adap) |
| 573 | { | 576 | { |
| 574 | struct dw_i2c_dev *dev = i2c_get_adapdata(adap); | 577 | struct dw_i2c_dev *dev = i2c_get_adapdata(adap); |
| 575 | return dev->functionality; | 578 | return dev->functionality; |
| 576 | } | 579 | } |
| 580 | EXPORT_SYMBOL_GPL(i2c_dw_func); | ||
| 577 | 581 | ||
| 578 | static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev) | 582 | static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev) |
| 579 | { | 583 | { |
| @@ -678,17 +682,20 @@ tx_aborted: | |||
| 678 | 682 | ||
| 679 | return IRQ_HANDLED; | 683 | return IRQ_HANDLED; |
| 680 | } | 684 | } |
| 685 | EXPORT_SYMBOL_GPL(i2c_dw_isr); | ||
| 681 | 686 | ||
| 682 | void i2c_dw_enable(struct dw_i2c_dev *dev) | 687 | void i2c_dw_enable(struct dw_i2c_dev *dev) |
| 683 | { | 688 | { |
| 684 | /* Enable the adapter */ | 689 | /* Enable the adapter */ |
| 685 | dw_writel(dev, 1, DW_IC_ENABLE); | 690 | dw_writel(dev, 1, DW_IC_ENABLE); |
| 686 | } | 691 | } |
| 692 | EXPORT_SYMBOL_GPL(i2c_dw_enable); | ||
| 687 | 693 | ||
| 688 | u32 i2c_dw_is_enabled(struct dw_i2c_dev *dev) | 694 | u32 i2c_dw_is_enabled(struct dw_i2c_dev *dev) |
| 689 | { | 695 | { |
| 690 | return dw_readl(dev, DW_IC_ENABLE); | 696 | return dw_readl(dev, DW_IC_ENABLE); |
| 691 | } | 697 | } |
| 698 | EXPORT_SYMBOL_GPL(i2c_dw_is_enabled); | ||
| 692 | 699 | ||
| 693 | void i2c_dw_disable(struct dw_i2c_dev *dev) | 700 | void i2c_dw_disable(struct dw_i2c_dev *dev) |
| 694 | { | 701 | { |
| @@ -699,18 +706,22 @@ void i2c_dw_disable(struct dw_i2c_dev *dev) | |||
| 699 | dw_writel(dev, 0, DW_IC_INTR_MASK); | 706 | dw_writel(dev, 0, DW_IC_INTR_MASK); |
| 700 | dw_readl(dev, DW_IC_CLR_INTR); | 707 | dw_readl(dev, DW_IC_CLR_INTR); |
| 701 | } | 708 | } |
| 709 | EXPORT_SYMBOL_GPL(i2c_dw_disable); | ||
| 702 | 710 | ||
| 703 | void i2c_dw_clear_int(struct dw_i2c_dev *dev) | 711 | void i2c_dw_clear_int(struct dw_i2c_dev *dev) |
| 704 | { | 712 | { |
| 705 | dw_readl(dev, DW_IC_CLR_INTR); | 713 | dw_readl(dev, DW_IC_CLR_INTR); |
| 706 | } | 714 | } |
| 715 | EXPORT_SYMBOL_GPL(i2c_dw_clear_int); | ||
| 707 | 716 | ||
| 708 | void i2c_dw_disable_int(struct dw_i2c_dev *dev) | 717 | void i2c_dw_disable_int(struct dw_i2c_dev *dev) |
| 709 | { | 718 | { |
| 710 | dw_writel(dev, 0, DW_IC_INTR_MASK); | 719 | dw_writel(dev, 0, DW_IC_INTR_MASK); |
| 711 | } | 720 | } |
| 721 | EXPORT_SYMBOL_GPL(i2c_dw_disable_int); | ||
| 712 | 722 | ||
| 713 | u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev) | 723 | u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev) |
| 714 | { | 724 | { |
| 715 | return dw_readl(dev, DW_IC_COMP_PARAM_1); | 725 | return dw_readl(dev, DW_IC_COMP_PARAM_1); |
| 716 | } | 726 | } |
| 727 | EXPORT_SYMBOL_GPL(i2c_dw_read_comp_param); | ||
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 898dcf9c7ade..33e9b0c09af2 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | DH89xxCC (PCH) 0x2330 32 hard yes yes yes | 52 | DH89xxCC (PCH) 0x2330 32 hard yes yes yes |
| 53 | Panther Point (PCH) 0x1e22 32 hard yes yes yes | 53 | Panther Point (PCH) 0x1e22 32 hard yes yes yes |
| 54 | Lynx Point (PCH) 0x8c22 32 hard yes yes yes | 54 | Lynx Point (PCH) 0x8c22 32 hard yes yes yes |
| 55 | Lynx Point-LP (PCH) 0x9c22 32 hard yes yes yes | ||
| 55 | 56 | ||
| 56 | Features supported by this driver: | 57 | Features supported by this driver: |
| 57 | Software PEC no | 58 | Software PEC no |
| @@ -155,6 +156,7 @@ | |||
| 155 | #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 | 156 | #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330 |
| 156 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 | 157 | #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30 |
| 157 | #define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS 0x8c22 | 158 | #define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS 0x8c22 |
| 159 | #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS 0x9c22 | ||
| 158 | 160 | ||
| 159 | struct i801_priv { | 161 | struct i801_priv { |
| 160 | struct i2c_adapter adapter; | 162 | struct i2c_adapter adapter; |
| @@ -771,6 +773,7 @@ static DEFINE_PCI_DEVICE_TABLE(i801_ids) = { | |||
| 771 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) }, | 773 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) }, |
| 772 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) }, | 774 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) }, |
| 773 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) }, | 775 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) }, |
| 776 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) }, | ||
| 774 | { 0, } | 777 | { 0, } |
| 775 | }; | 778 | }; |
| 776 | 779 | ||
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index 088c5c1ed17d..51f05b8520ed 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c | |||
| @@ -365,10 +365,6 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c) | |||
| 365 | struct device_node *node = dev->of_node; | 365 | struct device_node *node = dev->of_node; |
| 366 | int ret; | 366 | int ret; |
| 367 | 367 | ||
| 368 | if (!node) | ||
| 369 | return -EINVAL; | ||
| 370 | |||
| 371 | i2c->speed = &mxs_i2c_95kHz_config; | ||
| 372 | ret = of_property_read_u32(node, "clock-frequency", &speed); | 368 | ret = of_property_read_u32(node, "clock-frequency", &speed); |
| 373 | if (ret) | 369 | if (ret) |
| 374 | dev_warn(dev, "No I2C speed selected, using 100kHz\n"); | 370 | dev_warn(dev, "No I2C speed selected, using 100kHz\n"); |
| @@ -419,10 +415,13 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev) | |||
| 419 | return err; | 415 | return err; |
| 420 | 416 | ||
| 421 | i2c->dev = dev; | 417 | i2c->dev = dev; |
| 418 | i2c->speed = &mxs_i2c_95kHz_config; | ||
| 422 | 419 | ||
| 423 | err = mxs_i2c_get_ofdata(i2c); | 420 | if (dev->of_node) { |
| 424 | if (err) | 421 | err = mxs_i2c_get_ofdata(i2c); |
| 425 | return err; | 422 | if (err) |
| 423 | return err; | ||
| 424 | } | ||
| 426 | 425 | ||
| 427 | platform_set_drvdata(pdev, i2c); | 426 | platform_set_drvdata(pdev, i2c); |
| 428 | 427 | ||
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 5d54416770b0..8488bddfe465 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c | |||
| @@ -48,8 +48,9 @@ enum { | |||
| 48 | mcntrl_afie = 0x00000002, | 48 | mcntrl_afie = 0x00000002, |
| 49 | mcntrl_naie = 0x00000004, | 49 | mcntrl_naie = 0x00000004, |
| 50 | mcntrl_drmie = 0x00000008, | 50 | mcntrl_drmie = 0x00000008, |
| 51 | mcntrl_daie = 0x00000020, | 51 | mcntrl_drsie = 0x00000010, |
| 52 | mcntrl_rffie = 0x00000040, | 52 | mcntrl_rffie = 0x00000020, |
| 53 | mcntrl_daie = 0x00000040, | ||
| 53 | mcntrl_tffie = 0x00000080, | 54 | mcntrl_tffie = 0x00000080, |
| 54 | mcntrl_reset = 0x00000100, | 55 | mcntrl_reset = 0x00000100, |
| 55 | mcntrl_cdbmode = 0x00000400, | 56 | mcntrl_cdbmode = 0x00000400, |
| @@ -290,31 +291,37 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data *alg_data) | |||
| 290 | * or we didn't 'ask' for it yet. | 291 | * or we didn't 'ask' for it yet. |
| 291 | */ | 292 | */ |
| 292 | if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) { | 293 | if (ioread32(I2C_REG_STS(alg_data)) & mstatus_rfe) { |
| 293 | dev_dbg(&alg_data->adapter.dev, | 294 | /* 'Asking' is done asynchronously, e.g. dummy TX of several |
| 294 | "%s(): Write dummy data to fill Rx-fifo...\n", | 295 | * bytes is done before the first actual RX arrives in FIFO. |
| 295 | __func__); | 296 | * Therefore, ordered bytes (via TX) are counted separately. |
| 297 | */ | ||
| 298 | if (alg_data->mif.order) { | ||
| 299 | dev_dbg(&alg_data->adapter.dev, | ||
| 300 | "%s(): Write dummy data to fill Rx-fifo...\n", | ||
| 301 | __func__); | ||
| 296 | 302 | ||
| 297 | if (alg_data->mif.len == 1) { | 303 | if (alg_data->mif.order == 1) { |
| 298 | /* Last byte, do not acknowledge next rcv. */ | 304 | /* Last byte, do not acknowledge next rcv. */ |
| 299 | val |= stop_bit; | 305 | val |= stop_bit; |
| 306 | |||
| 307 | /* | ||
| 308 | * Enable interrupt RFDAIE (data in Rx fifo), | ||
| 309 | * and disable DRMIE (need data for Tx) | ||
| 310 | */ | ||
| 311 | ctl = ioread32(I2C_REG_CTL(alg_data)); | ||
| 312 | ctl |= mcntrl_rffie | mcntrl_daie; | ||
| 313 | ctl &= ~mcntrl_drmie; | ||
| 314 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 315 | } | ||
| 300 | 316 | ||
| 301 | /* | 317 | /* |
| 302 | * Enable interrupt RFDAIE (data in Rx fifo), | 318 | * Now we'll 'ask' for data: |
| 303 | * and disable DRMIE (need data for Tx) | 319 | * For each byte we want to receive, we must |
| 320 | * write a (dummy) byte to the Tx-FIFO. | ||
| 304 | */ | 321 | */ |
| 305 | ctl = ioread32(I2C_REG_CTL(alg_data)); | 322 | iowrite32(val, I2C_REG_TX(alg_data)); |
| 306 | ctl |= mcntrl_rffie | mcntrl_daie; | 323 | alg_data->mif.order--; |
| 307 | ctl &= ~mcntrl_drmie; | ||
| 308 | iowrite32(ctl, I2C_REG_CTL(alg_data)); | ||
| 309 | } | 324 | } |
| 310 | |||
| 311 | /* | ||
| 312 | * Now we'll 'ask' for data: | ||
| 313 | * For each byte we want to receive, we must | ||
| 314 | * write a (dummy) byte to the Tx-FIFO. | ||
| 315 | */ | ||
| 316 | iowrite32(val, I2C_REG_TX(alg_data)); | ||
| 317 | |||
| 318 | return 0; | 325 | return 0; |
| 319 | } | 326 | } |
| 320 | 327 | ||
| @@ -514,6 +521,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 514 | 521 | ||
| 515 | alg_data->mif.buf = pmsg->buf; | 522 | alg_data->mif.buf = pmsg->buf; |
| 516 | alg_data->mif.len = pmsg->len; | 523 | alg_data->mif.len = pmsg->len; |
| 524 | alg_data->mif.order = pmsg->len; | ||
| 517 | alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ? | 525 | alg_data->mif.mode = (pmsg->flags & I2C_M_RD) ? |
| 518 | I2C_SMBUS_READ : I2C_SMBUS_WRITE; | 526 | I2C_SMBUS_READ : I2C_SMBUS_WRITE; |
| 519 | alg_data->mif.ret = 0; | 527 | alg_data->mif.ret = 0; |
| @@ -566,6 +574,7 @@ i2c_pnx_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 566 | /* Cleanup to be sure... */ | 574 | /* Cleanup to be sure... */ |
| 567 | alg_data->mif.buf = NULL; | 575 | alg_data->mif.buf = NULL; |
| 568 | alg_data->mif.len = 0; | 576 | alg_data->mif.len = 0; |
| 577 | alg_data->mif.order = 0; | ||
| 569 | 578 | ||
| 570 | dev_dbg(&alg_data->adapter.dev, "%s(): exiting, stat = %x\n", | 579 | dev_dbg(&alg_data->adapter.dev, "%s(): exiting, stat = %x\n", |
| 571 | __func__, ioread32(I2C_REG_STS(alg_data))); | 580 | __func__, ioread32(I2C_REG_STS(alg_data))); |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 2efa56c5ff2c..2091ae8f539a 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -637,6 +637,22 @@ static void i2c_adapter_dev_release(struct device *dev) | |||
| 637 | } | 637 | } |
| 638 | 638 | ||
| 639 | /* | 639 | /* |
| 640 | * This function is only needed for mutex_lock_nested, so it is never | ||
| 641 | * called unless locking correctness checking is enabled. Thus we | ||
| 642 | * make it inline to avoid a compiler warning. That's what gcc ends up | ||
| 643 | * doing anyway. | ||
| 644 | */ | ||
| 645 | static inline unsigned int i2c_adapter_depth(struct i2c_adapter *adapter) | ||
| 646 | { | ||
| 647 | unsigned int depth = 0; | ||
| 648 | |||
| 649 | while ((adapter = i2c_parent_is_i2c_adapter(adapter))) | ||
| 650 | depth++; | ||
| 651 | |||
| 652 | return depth; | ||
| 653 | } | ||
| 654 | |||
| 655 | /* | ||
| 640 | * Let users instantiate I2C devices through sysfs. This can be used when | 656 | * Let users instantiate I2C devices through sysfs. This can be used when |
| 641 | * platform initialization code doesn't contain the proper data for | 657 | * platform initialization code doesn't contain the proper data for |
| 642 | * whatever reason. Also useful for drivers that do device detection and | 658 | * whatever reason. Also useful for drivers that do device detection and |
| @@ -726,7 +742,8 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr, | |||
| 726 | 742 | ||
| 727 | /* Make sure the device was added through sysfs */ | 743 | /* Make sure the device was added through sysfs */ |
| 728 | res = -ENOENT; | 744 | res = -ENOENT; |
| 729 | mutex_lock(&adap->userspace_clients_lock); | 745 | mutex_lock_nested(&adap->userspace_clients_lock, |
| 746 | i2c_adapter_depth(adap)); | ||
| 730 | list_for_each_entry_safe(client, next, &adap->userspace_clients, | 747 | list_for_each_entry_safe(client, next, &adap->userspace_clients, |
| 731 | detected) { | 748 | detected) { |
| 732 | if (client->addr == addr) { | 749 | if (client->addr == addr) { |
| @@ -1073,7 +1090,8 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
| 1073 | return res; | 1090 | return res; |
| 1074 | 1091 | ||
| 1075 | /* Remove devices instantiated from sysfs */ | 1092 | /* Remove devices instantiated from sysfs */ |
| 1076 | mutex_lock(&adap->userspace_clients_lock); | 1093 | mutex_lock_nested(&adap->userspace_clients_lock, |
| 1094 | i2c_adapter_depth(adap)); | ||
| 1077 | list_for_each_entry_safe(client, next, &adap->userspace_clients, | 1095 | list_for_each_entry_safe(client, next, &adap->userspace_clients, |
| 1078 | detected) { | 1096 | detected) { |
| 1079 | dev_dbg(&adap->dev, "Removing %s at 0x%x\n", client->name, | 1097 | dev_dbg(&adap->dev, "Removing %s at 0x%x\n", client->name, |
diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c index 92406097efeb..8d1e32d7cd97 100644 --- a/drivers/ide/ide-pm.c +++ b/drivers/ide/ide-pm.c | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | int generic_ide_suspend(struct device *dev, pm_message_t mesg) | 5 | int generic_ide_suspend(struct device *dev, pm_message_t mesg) |
| 6 | { | 6 | { |
| 7 | ide_drive_t *drive = dev_get_drvdata(dev); | 7 | ide_drive_t *drive = to_ide_device(dev); |
| 8 | ide_drive_t *pair = ide_get_pair_dev(drive); | 8 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 9 | ide_hwif_t *hwif = drive->hwif; | 9 | ide_hwif_t *hwif = drive->hwif; |
| 10 | struct request *rq; | 10 | struct request *rq; |
| @@ -40,7 +40,7 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg) | |||
| 40 | 40 | ||
| 41 | int generic_ide_resume(struct device *dev) | 41 | int generic_ide_resume(struct device *dev) |
| 42 | { | 42 | { |
| 43 | ide_drive_t *drive = dev_get_drvdata(dev); | 43 | ide_drive_t *drive = to_ide_device(dev); |
| 44 | ide_drive_t *pair = ide_get_pair_dev(drive); | 44 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 45 | ide_hwif_t *hwif = drive->hwif; | 45 | ide_hwif_t *hwif = drive->hwif; |
| 46 | struct request *rq; | 46 | struct request *rq; |
diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c index f61780a02374..3bd5540238a7 100644 --- a/drivers/iio/adc/at91_adc.c +++ b/drivers/iio/adc/at91_adc.c | |||
| @@ -617,7 +617,7 @@ static int __devinit at91_adc_probe(struct platform_device *pdev) | |||
| 617 | st->adc_clk = clk_get(&pdev->dev, "adc_op_clk"); | 617 | st->adc_clk = clk_get(&pdev->dev, "adc_op_clk"); |
| 618 | if (IS_ERR(st->adc_clk)) { | 618 | if (IS_ERR(st->adc_clk)) { |
| 619 | dev_err(&pdev->dev, "Failed to get the ADC clock.\n"); | 619 | dev_err(&pdev->dev, "Failed to get the ADC clock.\n"); |
| 620 | ret = PTR_ERR(st->clk); | 620 | ret = PTR_ERR(st->adc_clk); |
| 621 | goto error_disable_clk; | 621 | goto error_disable_clk; |
| 622 | } | 622 | } |
| 623 | 623 | ||
diff --git a/drivers/infiniband/hw/cxgb4/cm.c b/drivers/infiniband/hw/cxgb4/cm.c index 51f42061dae9..6cfd4d8fd0bd 100644 --- a/drivers/infiniband/hw/cxgb4/cm.c +++ b/drivers/infiniband/hw/cxgb4/cm.c | |||
| @@ -1361,11 +1361,11 @@ static int abort_rpl(struct c4iw_dev *dev, struct sk_buff *skb) | |||
| 1361 | struct tid_info *t = dev->rdev.lldi.tids; | 1361 | struct tid_info *t = dev->rdev.lldi.tids; |
| 1362 | 1362 | ||
| 1363 | ep = lookup_tid(t, tid); | 1363 | ep = lookup_tid(t, tid); |
| 1364 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | ||
| 1365 | if (!ep) { | 1364 | if (!ep) { |
| 1366 | printk(KERN_WARNING MOD "Abort rpl to freed endpoint\n"); | 1365 | printk(KERN_WARNING MOD "Abort rpl to freed endpoint\n"); |
| 1367 | return 0; | 1366 | return 0; |
| 1368 | } | 1367 | } |
| 1368 | PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid); | ||
| 1369 | mutex_lock(&ep->com.mutex); | 1369 | mutex_lock(&ep->com.mutex); |
| 1370 | switch (ep->com.state) { | 1370 | switch (ep->com.state) { |
| 1371 | case ABORTING: | 1371 | case ABORTING: |
diff --git a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c index cb5b7f7d4d38..b29a4246ef41 100644 --- a/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c +++ b/drivers/infiniband/hw/ocrdma/ocrdma_verbs.c | |||
| @@ -2219,7 +2219,6 @@ static bool ocrdma_poll_success_scqe(struct ocrdma_qp *qp, | |||
| 2219 | u32 wqe_idx; | 2219 | u32 wqe_idx; |
| 2220 | 2220 | ||
| 2221 | if (!qp->wqe_wr_id_tbl[tail].signaled) { | 2221 | if (!qp->wqe_wr_id_tbl[tail].signaled) { |
| 2222 | expand = true; /* CQE cannot be consumed yet */ | ||
| 2223 | *polled = false; /* WC cannot be consumed yet */ | 2222 | *polled = false; /* WC cannot be consumed yet */ |
| 2224 | } else { | 2223 | } else { |
| 2225 | ibwc->status = IB_WC_SUCCESS; | 2224 | ibwc->status = IB_WC_SUCCESS; |
| @@ -2227,10 +2226,11 @@ static bool ocrdma_poll_success_scqe(struct ocrdma_qp *qp, | |||
| 2227 | ibwc->qp = &qp->ibqp; | 2226 | ibwc->qp = &qp->ibqp; |
| 2228 | ocrdma_update_wc(qp, ibwc, tail); | 2227 | ocrdma_update_wc(qp, ibwc, tail); |
| 2229 | *polled = true; | 2228 | *polled = true; |
| 2230 | wqe_idx = le32_to_cpu(cqe->wq.wqeidx) & OCRDMA_CQE_WQEIDX_MASK; | ||
| 2231 | if (tail != wqe_idx) | ||
| 2232 | expand = true; /* Coalesced CQE can't be consumed yet */ | ||
| 2233 | } | 2229 | } |
| 2230 | wqe_idx = le32_to_cpu(cqe->wq.wqeidx) & OCRDMA_CQE_WQEIDX_MASK; | ||
| 2231 | if (tail != wqe_idx) | ||
| 2232 | expand = true; /* Coalesced CQE can't be consumed yet */ | ||
| 2233 | |||
| 2234 | ocrdma_hwq_inc_tail(&qp->sq); | 2234 | ocrdma_hwq_inc_tail(&qp->sq); |
| 2235 | return expand; | 2235 | return expand; |
| 2236 | } | 2236 | } |
diff --git a/drivers/infiniband/hw/qib/qib_mad.c b/drivers/infiniband/hw/qib/qib_mad.c index 19f1e6c45fb6..ccb119143d20 100644 --- a/drivers/infiniband/hw/qib/qib_mad.c +++ b/drivers/infiniband/hw/qib/qib_mad.c | |||
| @@ -471,9 +471,10 @@ static int subn_get_portinfo(struct ib_smp *smp, struct ib_device *ibdev, | |||
| 471 | if (port_num != port) { | 471 | if (port_num != port) { |
| 472 | ibp = to_iport(ibdev, port_num); | 472 | ibp = to_iport(ibdev, port_num); |
| 473 | ret = check_mkey(ibp, smp, 0); | 473 | ret = check_mkey(ibp, smp, 0); |
| 474 | if (ret) | 474 | if (ret) { |
| 475 | ret = IB_MAD_RESULT_FAILURE; | 475 | ret = IB_MAD_RESULT_FAILURE; |
| 476 | goto bail; | 476 | goto bail; |
| 477 | } | ||
| 477 | } | 478 | } |
| 478 | } | 479 | } |
| 479 | 480 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index ca43901ed861..0af216d21f87 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
| @@ -262,7 +262,10 @@ struct ipoib_ethtool_st { | |||
| 262 | u16 max_coalesced_frames; | 262 | u16 max_coalesced_frames; |
| 263 | }; | 263 | }; |
| 264 | 264 | ||
| 265 | struct ipoib_neigh_table; | ||
| 266 | |||
| 265 | struct ipoib_neigh_hash { | 267 | struct ipoib_neigh_hash { |
| 268 | struct ipoib_neigh_table *ntbl; | ||
| 266 | struct ipoib_neigh __rcu **buckets; | 269 | struct ipoib_neigh __rcu **buckets; |
| 267 | struct rcu_head rcu; | 270 | struct rcu_head rcu; |
| 268 | u32 mask; | 271 | u32 mask; |
| @@ -271,9 +274,9 @@ struct ipoib_neigh_hash { | |||
| 271 | 274 | ||
| 272 | struct ipoib_neigh_table { | 275 | struct ipoib_neigh_table { |
| 273 | struct ipoib_neigh_hash __rcu *htbl; | 276 | struct ipoib_neigh_hash __rcu *htbl; |
| 274 | rwlock_t rwlock; | ||
| 275 | atomic_t entries; | 277 | atomic_t entries; |
| 276 | struct completion flushed; | 278 | struct completion flushed; |
| 279 | struct completion deleted; | ||
| 277 | }; | 280 | }; |
| 278 | 281 | ||
| 279 | /* | 282 | /* |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 3e2085a3ee47..1e19b5ae7c47 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
| @@ -546,15 +546,15 @@ static void neigh_add_path(struct sk_buff *skb, u8 *daddr, | |||
| 546 | struct ipoib_neigh *neigh; | 546 | struct ipoib_neigh *neigh; |
| 547 | unsigned long flags; | 547 | unsigned long flags; |
| 548 | 548 | ||
| 549 | spin_lock_irqsave(&priv->lock, flags); | ||
| 549 | neigh = ipoib_neigh_alloc(daddr, dev); | 550 | neigh = ipoib_neigh_alloc(daddr, dev); |
| 550 | if (!neigh) { | 551 | if (!neigh) { |
| 552 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 551 | ++dev->stats.tx_dropped; | 553 | ++dev->stats.tx_dropped; |
| 552 | dev_kfree_skb_any(skb); | 554 | dev_kfree_skb_any(skb); |
| 553 | return; | 555 | return; |
| 554 | } | 556 | } |
| 555 | 557 | ||
| 556 | spin_lock_irqsave(&priv->lock, flags); | ||
| 557 | |||
| 558 | path = __path_find(dev, daddr + 4); | 558 | path = __path_find(dev, daddr + 4); |
| 559 | if (!path) { | 559 | if (!path) { |
| 560 | path = path_rec_create(dev, daddr + 4); | 560 | path = path_rec_create(dev, daddr + 4); |
| @@ -863,10 +863,10 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv) | |||
| 863 | if (test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) | 863 | if (test_bit(IPOIB_STOP_NEIGH_GC, &priv->flags)) |
| 864 | return; | 864 | return; |
| 865 | 865 | ||
| 866 | write_lock_bh(&ntbl->rwlock); | 866 | spin_lock_irqsave(&priv->lock, flags); |
| 867 | 867 | ||
| 868 | htbl = rcu_dereference_protected(ntbl->htbl, | 868 | htbl = rcu_dereference_protected(ntbl->htbl, |
| 869 | lockdep_is_held(&ntbl->rwlock)); | 869 | lockdep_is_held(&priv->lock)); |
| 870 | 870 | ||
| 871 | if (!htbl) | 871 | if (!htbl) |
| 872 | goto out_unlock; | 872 | goto out_unlock; |
| @@ -883,16 +883,14 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv) | |||
| 883 | struct ipoib_neigh __rcu **np = &htbl->buckets[i]; | 883 | struct ipoib_neigh __rcu **np = &htbl->buckets[i]; |
| 884 | 884 | ||
| 885 | while ((neigh = rcu_dereference_protected(*np, | 885 | while ((neigh = rcu_dereference_protected(*np, |
| 886 | lockdep_is_held(&ntbl->rwlock))) != NULL) { | 886 | lockdep_is_held(&priv->lock))) != NULL) { |
| 887 | /* was the neigh idle for two GC periods */ | 887 | /* was the neigh idle for two GC periods */ |
| 888 | if (time_after(neigh_obsolete, neigh->alive)) { | 888 | if (time_after(neigh_obsolete, neigh->alive)) { |
| 889 | rcu_assign_pointer(*np, | 889 | rcu_assign_pointer(*np, |
| 890 | rcu_dereference_protected(neigh->hnext, | 890 | rcu_dereference_protected(neigh->hnext, |
| 891 | lockdep_is_held(&ntbl->rwlock))); | 891 | lockdep_is_held(&priv->lock))); |
| 892 | /* remove from path/mc list */ | 892 | /* remove from path/mc list */ |
| 893 | spin_lock_irqsave(&priv->lock, flags); | ||
| 894 | list_del(&neigh->list); | 893 | list_del(&neigh->list); |
| 895 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 896 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); | 894 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); |
| 897 | } else { | 895 | } else { |
| 898 | np = &neigh->hnext; | 896 | np = &neigh->hnext; |
| @@ -902,7 +900,7 @@ static void __ipoib_reap_neigh(struct ipoib_dev_priv *priv) | |||
| 902 | } | 900 | } |
| 903 | 901 | ||
| 904 | out_unlock: | 902 | out_unlock: |
| 905 | write_unlock_bh(&ntbl->rwlock); | 903 | spin_unlock_irqrestore(&priv->lock, flags); |
| 906 | } | 904 | } |
| 907 | 905 | ||
| 908 | static void ipoib_reap_neigh(struct work_struct *work) | 906 | static void ipoib_reap_neigh(struct work_struct *work) |
| @@ -947,10 +945,8 @@ struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr, | |||
| 947 | struct ipoib_neigh *neigh; | 945 | struct ipoib_neigh *neigh; |
| 948 | u32 hash_val; | 946 | u32 hash_val; |
| 949 | 947 | ||
| 950 | write_lock_bh(&ntbl->rwlock); | ||
| 951 | |||
| 952 | htbl = rcu_dereference_protected(ntbl->htbl, | 948 | htbl = rcu_dereference_protected(ntbl->htbl, |
| 953 | lockdep_is_held(&ntbl->rwlock)); | 949 | lockdep_is_held(&priv->lock)); |
| 954 | if (!htbl) { | 950 | if (!htbl) { |
| 955 | neigh = NULL; | 951 | neigh = NULL; |
| 956 | goto out_unlock; | 952 | goto out_unlock; |
| @@ -961,10 +957,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr, | |||
| 961 | */ | 957 | */ |
| 962 | hash_val = ipoib_addr_hash(htbl, daddr); | 958 | hash_val = ipoib_addr_hash(htbl, daddr); |
| 963 | for (neigh = rcu_dereference_protected(htbl->buckets[hash_val], | 959 | for (neigh = rcu_dereference_protected(htbl->buckets[hash_val], |
| 964 | lockdep_is_held(&ntbl->rwlock)); | 960 | lockdep_is_held(&priv->lock)); |
| 965 | neigh != NULL; | 961 | neigh != NULL; |
| 966 | neigh = rcu_dereference_protected(neigh->hnext, | 962 | neigh = rcu_dereference_protected(neigh->hnext, |
| 967 | lockdep_is_held(&ntbl->rwlock))) { | 963 | lockdep_is_held(&priv->lock))) { |
| 968 | if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) { | 964 | if (memcmp(daddr, neigh->daddr, INFINIBAND_ALEN) == 0) { |
| 969 | /* found, take one ref on behalf of the caller */ | 965 | /* found, take one ref on behalf of the caller */ |
| 970 | if (!atomic_inc_not_zero(&neigh->refcnt)) { | 966 | if (!atomic_inc_not_zero(&neigh->refcnt)) { |
| @@ -987,12 +983,11 @@ struct ipoib_neigh *ipoib_neigh_alloc(u8 *daddr, | |||
| 987 | /* put in hash */ | 983 | /* put in hash */ |
| 988 | rcu_assign_pointer(neigh->hnext, | 984 | rcu_assign_pointer(neigh->hnext, |
| 989 | rcu_dereference_protected(htbl->buckets[hash_val], | 985 | rcu_dereference_protected(htbl->buckets[hash_val], |
| 990 | lockdep_is_held(&ntbl->rwlock))); | 986 | lockdep_is_held(&priv->lock))); |
| 991 | rcu_assign_pointer(htbl->buckets[hash_val], neigh); | 987 | rcu_assign_pointer(htbl->buckets[hash_val], neigh); |
| 992 | atomic_inc(&ntbl->entries); | 988 | atomic_inc(&ntbl->entries); |
| 993 | 989 | ||
| 994 | out_unlock: | 990 | out_unlock: |
| 995 | write_unlock_bh(&ntbl->rwlock); | ||
| 996 | 991 | ||
| 997 | return neigh; | 992 | return neigh; |
| 998 | } | 993 | } |
| @@ -1040,35 +1035,29 @@ void ipoib_neigh_free(struct ipoib_neigh *neigh) | |||
| 1040 | struct ipoib_neigh *n; | 1035 | struct ipoib_neigh *n; |
| 1041 | u32 hash_val; | 1036 | u32 hash_val; |
| 1042 | 1037 | ||
| 1043 | write_lock_bh(&ntbl->rwlock); | ||
| 1044 | |||
| 1045 | htbl = rcu_dereference_protected(ntbl->htbl, | 1038 | htbl = rcu_dereference_protected(ntbl->htbl, |
| 1046 | lockdep_is_held(&ntbl->rwlock)); | 1039 | lockdep_is_held(&priv->lock)); |
| 1047 | if (!htbl) | 1040 | if (!htbl) |
| 1048 | goto out_unlock; | 1041 | return; |
| 1049 | 1042 | ||
| 1050 | hash_val = ipoib_addr_hash(htbl, neigh->daddr); | 1043 | hash_val = ipoib_addr_hash(htbl, neigh->daddr); |
| 1051 | np = &htbl->buckets[hash_val]; | 1044 | np = &htbl->buckets[hash_val]; |
| 1052 | for (n = rcu_dereference_protected(*np, | 1045 | for (n = rcu_dereference_protected(*np, |
| 1053 | lockdep_is_held(&ntbl->rwlock)); | 1046 | lockdep_is_held(&priv->lock)); |
| 1054 | n != NULL; | 1047 | n != NULL; |
| 1055 | n = rcu_dereference_protected(*np, | 1048 | n = rcu_dereference_protected(*np, |
| 1056 | lockdep_is_held(&ntbl->rwlock))) { | 1049 | lockdep_is_held(&priv->lock))) { |
| 1057 | if (n == neigh) { | 1050 | if (n == neigh) { |
| 1058 | /* found */ | 1051 | /* found */ |
| 1059 | rcu_assign_pointer(*np, | 1052 | rcu_assign_pointer(*np, |
| 1060 | rcu_dereference_protected(neigh->hnext, | 1053 | rcu_dereference_protected(neigh->hnext, |
| 1061 | lockdep_is_held(&ntbl->rwlock))); | 1054 | lockdep_is_held(&priv->lock))); |
| 1062 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); | 1055 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); |
| 1063 | goto out_unlock; | 1056 | return; |
| 1064 | } else { | 1057 | } else { |
| 1065 | np = &n->hnext; | 1058 | np = &n->hnext; |
| 1066 | } | 1059 | } |
| 1067 | } | 1060 | } |
| 1068 | |||
| 1069 | out_unlock: | ||
| 1070 | write_unlock_bh(&ntbl->rwlock); | ||
| 1071 | |||
| 1072 | } | 1061 | } |
| 1073 | 1062 | ||
| 1074 | static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv) | 1063 | static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv) |
| @@ -1080,7 +1069,6 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv) | |||
| 1080 | 1069 | ||
| 1081 | clear_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags); | 1070 | clear_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags); |
| 1082 | ntbl->htbl = NULL; | 1071 | ntbl->htbl = NULL; |
| 1083 | rwlock_init(&ntbl->rwlock); | ||
| 1084 | htbl = kzalloc(sizeof(*htbl), GFP_KERNEL); | 1072 | htbl = kzalloc(sizeof(*htbl), GFP_KERNEL); |
| 1085 | if (!htbl) | 1073 | if (!htbl) |
| 1086 | return -ENOMEM; | 1074 | return -ENOMEM; |
| @@ -1095,6 +1083,7 @@ static int ipoib_neigh_hash_init(struct ipoib_dev_priv *priv) | |||
| 1095 | htbl->mask = (size - 1); | 1083 | htbl->mask = (size - 1); |
| 1096 | htbl->buckets = buckets; | 1084 | htbl->buckets = buckets; |
| 1097 | ntbl->htbl = htbl; | 1085 | ntbl->htbl = htbl; |
| 1086 | htbl->ntbl = ntbl; | ||
| 1098 | atomic_set(&ntbl->entries, 0); | 1087 | atomic_set(&ntbl->entries, 0); |
| 1099 | 1088 | ||
| 1100 | /* start garbage collection */ | 1089 | /* start garbage collection */ |
| @@ -1111,9 +1100,11 @@ static void neigh_hash_free_rcu(struct rcu_head *head) | |||
| 1111 | struct ipoib_neigh_hash, | 1100 | struct ipoib_neigh_hash, |
| 1112 | rcu); | 1101 | rcu); |
| 1113 | struct ipoib_neigh __rcu **buckets = htbl->buckets; | 1102 | struct ipoib_neigh __rcu **buckets = htbl->buckets; |
| 1103 | struct ipoib_neigh_table *ntbl = htbl->ntbl; | ||
| 1114 | 1104 | ||
| 1115 | kfree(buckets); | 1105 | kfree(buckets); |
| 1116 | kfree(htbl); | 1106 | kfree(htbl); |
| 1107 | complete(&ntbl->deleted); | ||
| 1117 | } | 1108 | } |
| 1118 | 1109 | ||
| 1119 | void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid) | 1110 | void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid) |
| @@ -1125,10 +1116,10 @@ void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid) | |||
| 1125 | int i; | 1116 | int i; |
| 1126 | 1117 | ||
| 1127 | /* remove all neigh connected to a given path or mcast */ | 1118 | /* remove all neigh connected to a given path or mcast */ |
| 1128 | write_lock_bh(&ntbl->rwlock); | 1119 | spin_lock_irqsave(&priv->lock, flags); |
| 1129 | 1120 | ||
| 1130 | htbl = rcu_dereference_protected(ntbl->htbl, | 1121 | htbl = rcu_dereference_protected(ntbl->htbl, |
| 1131 | lockdep_is_held(&ntbl->rwlock)); | 1122 | lockdep_is_held(&priv->lock)); |
| 1132 | 1123 | ||
| 1133 | if (!htbl) | 1124 | if (!htbl) |
| 1134 | goto out_unlock; | 1125 | goto out_unlock; |
| @@ -1138,16 +1129,14 @@ void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid) | |||
| 1138 | struct ipoib_neigh __rcu **np = &htbl->buckets[i]; | 1129 | struct ipoib_neigh __rcu **np = &htbl->buckets[i]; |
| 1139 | 1130 | ||
| 1140 | while ((neigh = rcu_dereference_protected(*np, | 1131 | while ((neigh = rcu_dereference_protected(*np, |
| 1141 | lockdep_is_held(&ntbl->rwlock))) != NULL) { | 1132 | lockdep_is_held(&priv->lock))) != NULL) { |
| 1142 | /* delete neighs belong to this parent */ | 1133 | /* delete neighs belong to this parent */ |
| 1143 | if (!memcmp(gid, neigh->daddr + 4, sizeof (union ib_gid))) { | 1134 | if (!memcmp(gid, neigh->daddr + 4, sizeof (union ib_gid))) { |
| 1144 | rcu_assign_pointer(*np, | 1135 | rcu_assign_pointer(*np, |
| 1145 | rcu_dereference_protected(neigh->hnext, | 1136 | rcu_dereference_protected(neigh->hnext, |
| 1146 | lockdep_is_held(&ntbl->rwlock))); | 1137 | lockdep_is_held(&priv->lock))); |
| 1147 | /* remove from parent list */ | 1138 | /* remove from parent list */ |
| 1148 | spin_lock_irqsave(&priv->lock, flags); | ||
| 1149 | list_del(&neigh->list); | 1139 | list_del(&neigh->list); |
| 1150 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 1151 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); | 1140 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); |
| 1152 | } else { | 1141 | } else { |
| 1153 | np = &neigh->hnext; | 1142 | np = &neigh->hnext; |
| @@ -1156,7 +1145,7 @@ void ipoib_del_neighs_by_gid(struct net_device *dev, u8 *gid) | |||
| 1156 | } | 1145 | } |
| 1157 | } | 1146 | } |
| 1158 | out_unlock: | 1147 | out_unlock: |
| 1159 | write_unlock_bh(&ntbl->rwlock); | 1148 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1160 | } | 1149 | } |
| 1161 | 1150 | ||
| 1162 | static void ipoib_flush_neighs(struct ipoib_dev_priv *priv) | 1151 | static void ipoib_flush_neighs(struct ipoib_dev_priv *priv) |
| @@ -1164,37 +1153,44 @@ static void ipoib_flush_neighs(struct ipoib_dev_priv *priv) | |||
| 1164 | struct ipoib_neigh_table *ntbl = &priv->ntbl; | 1153 | struct ipoib_neigh_table *ntbl = &priv->ntbl; |
| 1165 | struct ipoib_neigh_hash *htbl; | 1154 | struct ipoib_neigh_hash *htbl; |
| 1166 | unsigned long flags; | 1155 | unsigned long flags; |
| 1167 | int i; | 1156 | int i, wait_flushed = 0; |
| 1168 | 1157 | ||
| 1169 | write_lock_bh(&ntbl->rwlock); | 1158 | init_completion(&priv->ntbl.flushed); |
| 1159 | |||
| 1160 | spin_lock_irqsave(&priv->lock, flags); | ||
| 1170 | 1161 | ||
| 1171 | htbl = rcu_dereference_protected(ntbl->htbl, | 1162 | htbl = rcu_dereference_protected(ntbl->htbl, |
| 1172 | lockdep_is_held(&ntbl->rwlock)); | 1163 | lockdep_is_held(&priv->lock)); |
| 1173 | if (!htbl) | 1164 | if (!htbl) |
| 1174 | goto out_unlock; | 1165 | goto out_unlock; |
| 1175 | 1166 | ||
| 1167 | wait_flushed = atomic_read(&priv->ntbl.entries); | ||
| 1168 | if (!wait_flushed) | ||
| 1169 | goto free_htbl; | ||
| 1170 | |||
| 1176 | for (i = 0; i < htbl->size; i++) { | 1171 | for (i = 0; i < htbl->size; i++) { |
| 1177 | struct ipoib_neigh *neigh; | 1172 | struct ipoib_neigh *neigh; |
| 1178 | struct ipoib_neigh __rcu **np = &htbl->buckets[i]; | 1173 | struct ipoib_neigh __rcu **np = &htbl->buckets[i]; |
| 1179 | 1174 | ||
| 1180 | while ((neigh = rcu_dereference_protected(*np, | 1175 | while ((neigh = rcu_dereference_protected(*np, |
| 1181 | lockdep_is_held(&ntbl->rwlock))) != NULL) { | 1176 | lockdep_is_held(&priv->lock))) != NULL) { |
| 1182 | rcu_assign_pointer(*np, | 1177 | rcu_assign_pointer(*np, |
| 1183 | rcu_dereference_protected(neigh->hnext, | 1178 | rcu_dereference_protected(neigh->hnext, |
| 1184 | lockdep_is_held(&ntbl->rwlock))); | 1179 | lockdep_is_held(&priv->lock))); |
| 1185 | /* remove from path/mc list */ | 1180 | /* remove from path/mc list */ |
| 1186 | spin_lock_irqsave(&priv->lock, flags); | ||
| 1187 | list_del(&neigh->list); | 1181 | list_del(&neigh->list); |
| 1188 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 1189 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); | 1182 | call_rcu(&neigh->rcu, ipoib_neigh_reclaim); |
| 1190 | } | 1183 | } |
| 1191 | } | 1184 | } |
| 1192 | 1185 | ||
| 1186 | free_htbl: | ||
| 1193 | rcu_assign_pointer(ntbl->htbl, NULL); | 1187 | rcu_assign_pointer(ntbl->htbl, NULL); |
| 1194 | call_rcu(&htbl->rcu, neigh_hash_free_rcu); | 1188 | call_rcu(&htbl->rcu, neigh_hash_free_rcu); |
| 1195 | 1189 | ||
| 1196 | out_unlock: | 1190 | out_unlock: |
| 1197 | write_unlock_bh(&ntbl->rwlock); | 1191 | spin_unlock_irqrestore(&priv->lock, flags); |
| 1192 | if (wait_flushed) | ||
| 1193 | wait_for_completion(&priv->ntbl.flushed); | ||
| 1198 | } | 1194 | } |
| 1199 | 1195 | ||
| 1200 | static void ipoib_neigh_hash_uninit(struct net_device *dev) | 1196 | static void ipoib_neigh_hash_uninit(struct net_device *dev) |
| @@ -1203,7 +1199,7 @@ static void ipoib_neigh_hash_uninit(struct net_device *dev) | |||
| 1203 | int stopped; | 1199 | int stopped; |
| 1204 | 1200 | ||
| 1205 | ipoib_dbg(priv, "ipoib_neigh_hash_uninit\n"); | 1201 | ipoib_dbg(priv, "ipoib_neigh_hash_uninit\n"); |
| 1206 | init_completion(&priv->ntbl.flushed); | 1202 | init_completion(&priv->ntbl.deleted); |
| 1207 | set_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags); | 1203 | set_bit(IPOIB_NEIGH_TBL_FLUSH, &priv->flags); |
| 1208 | 1204 | ||
| 1209 | /* Stop GC if called at init fail need to cancel work */ | 1205 | /* Stop GC if called at init fail need to cancel work */ |
| @@ -1211,10 +1207,9 @@ static void ipoib_neigh_hash_uninit(struct net_device *dev) | |||
| 1211 | if (!stopped) | 1207 | if (!stopped) |
| 1212 | cancel_delayed_work(&priv->neigh_reap_task); | 1208 | cancel_delayed_work(&priv->neigh_reap_task); |
| 1213 | 1209 | ||
| 1214 | if (atomic_read(&priv->ntbl.entries)) { | 1210 | ipoib_flush_neighs(priv); |
| 1215 | ipoib_flush_neighs(priv); | 1211 | |
| 1216 | wait_for_completion(&priv->ntbl.flushed); | 1212 | wait_for_completion(&priv->ntbl.deleted); |
| 1217 | } | ||
| 1218 | } | 1213 | } |
| 1219 | 1214 | ||
| 1220 | 1215 | ||
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c index 13f4aa7593c8..75367249f447 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_multicast.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_multicast.c | |||
| @@ -707,9 +707,7 @@ out: | |||
| 707 | neigh = ipoib_neigh_get(dev, daddr); | 707 | neigh = ipoib_neigh_get(dev, daddr); |
| 708 | spin_lock_irqsave(&priv->lock, flags); | 708 | spin_lock_irqsave(&priv->lock, flags); |
| 709 | if (!neigh) { | 709 | if (!neigh) { |
| 710 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 711 | neigh = ipoib_neigh_alloc(daddr, dev); | 710 | neigh = ipoib_neigh_alloc(daddr, dev); |
| 712 | spin_lock_irqsave(&priv->lock, flags); | ||
| 713 | if (neigh) { | 711 | if (neigh) { |
| 714 | kref_get(&mcast->ah->ref); | 712 | kref_get(&mcast->ah->ref); |
| 715 | neigh->ah = mcast->ah; | 713 | neigh->ah = mcast->ah; |
diff --git a/drivers/input/keyboard/imx_keypad.c b/drivers/input/keyboard/imx_keypad.c index ff4c0a87a25f..cdc252612c0b 100644 --- a/drivers/input/keyboard/imx_keypad.c +++ b/drivers/input/keyboard/imx_keypad.c | |||
| @@ -358,6 +358,7 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad) | |||
| 358 | /* Inhibit KDI and KRI interrupts. */ | 358 | /* Inhibit KDI and KRI interrupts. */ |
| 359 | reg_val = readw(keypad->mmio_base + KPSR); | 359 | reg_val = readw(keypad->mmio_base + KPSR); |
| 360 | reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); | 360 | reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); |
| 361 | reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD; | ||
| 361 | writew(reg_val, keypad->mmio_base + KPSR); | 362 | writew(reg_val, keypad->mmio_base + KPSR); |
| 362 | 363 | ||
| 363 | /* Colums as open drain and disable all rows */ | 364 | /* Colums as open drain and disable all rows */ |
| @@ -515,7 +516,9 @@ static int __devinit imx_keypad_probe(struct platform_device *pdev) | |||
| 515 | input_set_drvdata(input_dev, keypad); | 516 | input_set_drvdata(input_dev, keypad); |
| 516 | 517 | ||
| 517 | /* Ensure that the keypad will stay dormant until opened */ | 518 | /* Ensure that the keypad will stay dormant until opened */ |
| 519 | clk_prepare_enable(keypad->clk); | ||
| 518 | imx_keypad_inhibit(keypad); | 520 | imx_keypad_inhibit(keypad); |
| 521 | clk_disable_unprepare(keypad->clk); | ||
| 519 | 522 | ||
| 520 | error = request_irq(irq, imx_keypad_irq_handler, 0, | 523 | error = request_irq(irq, imx_keypad_irq_handler, 0, |
| 521 | pdev->name, keypad); | 524 | pdev->name, keypad); |
diff --git a/drivers/input/misc/ab8500-ponkey.c b/drivers/input/misc/ab8500-ponkey.c index f06231b7cab1..84ec691c05aa 100644 --- a/drivers/input/misc/ab8500-ponkey.c +++ b/drivers/input/misc/ab8500-ponkey.c | |||
| @@ -74,8 +74,8 @@ static int __devinit ab8500_ponkey_probe(struct platform_device *pdev) | |||
| 74 | 74 | ||
| 75 | ponkey->idev = input; | 75 | ponkey->idev = input; |
| 76 | ponkey->ab8500 = ab8500; | 76 | ponkey->ab8500 = ab8500; |
| 77 | ponkey->irq_dbf = ab8500_irq_get_virq(ab8500, irq_dbf); | 77 | ponkey->irq_dbf = irq_dbf; |
| 78 | ponkey->irq_dbr = ab8500_irq_get_virq(ab8500, irq_dbr); | 78 | ponkey->irq_dbr = irq_dbr; |
| 79 | 79 | ||
| 80 | input->name = "AB8500 POn(PowerOn) Key"; | 80 | input->name = "AB8500 POn(PowerOn) Key"; |
| 81 | input->dev.parent = &pdev->dev; | 81 | input->dev.parent = &pdev->dev; |
diff --git a/drivers/input/mouse/sentelic.c b/drivers/input/mouse/sentelic.c index 3f5649f19082..a261d8576919 100644 --- a/drivers/input/mouse/sentelic.c +++ b/drivers/input/mouse/sentelic.c | |||
| @@ -721,6 +721,17 @@ static psmouse_ret_t fsp_process_byte(struct psmouse *psmouse) | |||
| 721 | 721 | ||
| 722 | switch (psmouse->packet[0] >> FSP_PKT_TYPE_SHIFT) { | 722 | switch (psmouse->packet[0] >> FSP_PKT_TYPE_SHIFT) { |
| 723 | case FSP_PKT_TYPE_ABS: | 723 | case FSP_PKT_TYPE_ABS: |
| 724 | |||
| 725 | if ((packet[0] == 0x48 || packet[0] == 0x49) && | ||
| 726 | packet[1] == 0 && packet[2] == 0) { | ||
| 727 | /* | ||
| 728 | * Ignore coordinate noise when finger leaving the | ||
| 729 | * surface, otherwise cursor may jump to upper-left | ||
| 730 | * corner. | ||
| 731 | */ | ||
| 732 | packet[3] &= 0xf0; | ||
| 733 | } | ||
| 734 | |||
| 724 | abs_x = GET_ABS_X(packet); | 735 | abs_x = GET_ABS_X(packet); |
| 725 | abs_y = GET_ABS_Y(packet); | 736 | abs_y = GET_ABS_Y(packet); |
| 726 | 737 | ||
diff --git a/drivers/input/serio/ambakmi.c b/drivers/input/serio/ambakmi.c index 2ffd110bd5bc..2e77246c2e5a 100644 --- a/drivers/input/serio/ambakmi.c +++ b/drivers/input/serio/ambakmi.c | |||
| @@ -72,7 +72,7 @@ static int amba_kmi_open(struct serio *io) | |||
| 72 | unsigned int divisor; | 72 | unsigned int divisor; |
| 73 | int ret; | 73 | int ret; |
| 74 | 74 | ||
| 75 | ret = clk_enable(kmi->clk); | 75 | ret = clk_prepare_enable(kmi->clk); |
| 76 | if (ret) | 76 | if (ret) |
| 77 | goto out; | 77 | goto out; |
| 78 | 78 | ||
| @@ -92,7 +92,7 @@ static int amba_kmi_open(struct serio *io) | |||
| 92 | return 0; | 92 | return 0; |
| 93 | 93 | ||
| 94 | clk_disable: | 94 | clk_disable: |
| 95 | clk_disable(kmi->clk); | 95 | clk_disable_unprepare(kmi->clk); |
| 96 | out: | 96 | out: |
| 97 | return ret; | 97 | return ret; |
| 98 | } | 98 | } |
| @@ -104,7 +104,7 @@ static void amba_kmi_close(struct serio *io) | |||
| 104 | writeb(0, KMICR); | 104 | writeb(0, KMICR); |
| 105 | 105 | ||
| 106 | free_irq(kmi->irq, kmi); | 106 | free_irq(kmi->irq, kmi); |
| 107 | clk_disable(kmi->clk); | 107 | clk_disable_unprepare(kmi->clk); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | static int __devinit amba_kmi_probe(struct amba_device *dev, | 110 | static int __devinit amba_kmi_probe(struct amba_device *dev, |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 5ec774d6c82b..d6cc77a53c7e 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
| @@ -177,6 +177,20 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { | |||
| 177 | }, | 177 | }, |
| 178 | }, | 178 | }, |
| 179 | { | 179 | { |
| 180 | /* Gigabyte T1005 - defines wrong chassis type ("Other") */ | ||
| 181 | .matches = { | ||
| 182 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
| 183 | DMI_MATCH(DMI_PRODUCT_NAME, "T1005"), | ||
| 184 | }, | ||
| 185 | }, | ||
| 186 | { | ||
| 187 | /* Gigabyte T1005M/P - defines wrong chassis type ("Other") */ | ||
| 188 | .matches = { | ||
| 189 | DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
| 190 | DMI_MATCH(DMI_PRODUCT_NAME, "T1005M/P"), | ||
| 191 | }, | ||
| 192 | }, | ||
| 193 | { | ||
| 180 | .matches = { | 194 | .matches = { |
| 181 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), | 195 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
| 182 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), | 196 | DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dv9700"), |
| @@ -321,6 +335,12 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | |||
| 321 | }, | 335 | }, |
| 322 | { | 336 | { |
| 323 | .matches = { | 337 | .matches = { |
| 338 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
| 339 | DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE C850D"), | ||
| 340 | }, | ||
| 341 | }, | ||
| 342 | { | ||
| 343 | .matches = { | ||
| 324 | DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), | 344 | DMI_MATCH(DMI_SYS_VENDOR, "ALIENWARE"), |
| 325 | DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), | 345 | DMI_MATCH(DMI_PRODUCT_NAME, "Sentia"), |
| 326 | }, | 346 | }, |
diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c index 002041975de9..532d067a9e07 100644 --- a/drivers/input/tablet/wacom_wac.c +++ b/drivers/input/tablet/wacom_wac.c | |||
| @@ -1848,7 +1848,10 @@ static const struct wacom_features wacom_features_0x2A = | |||
| 1848 | { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, | 1848 | { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, |
| 1849 | 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; | 1849 | 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; |
| 1850 | static const struct wacom_features wacom_features_0xF4 = | 1850 | static const struct wacom_features wacom_features_0xF4 = |
| 1851 | { "Wacom Cintiq 24HD", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, | 1851 | { "Wacom Cintiq 24HD", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, |
| 1852 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; | ||
| 1853 | static const struct wacom_features wacom_features_0xF8 = | ||
| 1854 | { "Wacom Cintiq 24HD touch", WACOM_PKGLEN_INTUOS, 104480, 65600, 2047, | ||
| 1852 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; | 1855 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; |
| 1853 | static const struct wacom_features wacom_features_0x3F = | 1856 | static const struct wacom_features wacom_features_0x3F = |
| 1854 | { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, | 1857 | { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, |
| @@ -2091,6 +2094,7 @@ const struct usb_device_id wacom_ids[] = { | |||
| 2091 | { USB_DEVICE_WACOM(0xEF) }, | 2094 | { USB_DEVICE_WACOM(0xEF) }, |
| 2092 | { USB_DEVICE_WACOM(0x47) }, | 2095 | { USB_DEVICE_WACOM(0x47) }, |
| 2093 | { USB_DEVICE_WACOM(0xF4) }, | 2096 | { USB_DEVICE_WACOM(0xF4) }, |
| 2097 | { USB_DEVICE_WACOM(0xF8) }, | ||
| 2094 | { USB_DEVICE_WACOM(0xFA) }, | 2098 | { USB_DEVICE_WACOM(0xFA) }, |
| 2095 | { USB_DEVICE_LENOVO(0x6004) }, | 2099 | { USB_DEVICE_LENOVO(0x6004) }, |
| 2096 | { } | 2100 | { } |
diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c index 9afc777a40a7..64957770b522 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c | |||
| @@ -566,9 +566,12 @@ static ssize_t edt_ft5x06_debugfs_raw_data_read(struct file *file, | |||
| 566 | } | 566 | } |
| 567 | 567 | ||
| 568 | read = min_t(size_t, count, tsdata->raw_bufsize - *off); | 568 | read = min_t(size_t, count, tsdata->raw_bufsize - *off); |
| 569 | error = copy_to_user(buf, tsdata->raw_buffer + *off, read); | 569 | if (copy_to_user(buf, tsdata->raw_buffer + *off, read)) { |
| 570 | if (!error) | 570 | error = -EFAULT; |
| 571 | *off += read; | 571 | goto out; |
| 572 | } | ||
| 573 | |||
| 574 | *off += read; | ||
| 572 | out: | 575 | out: |
| 573 | mutex_unlock(&tsdata->mutex); | 576 | mutex_unlock(&tsdata->mutex); |
| 574 | return error ?: read; | 577 | return error ?: read; |
| @@ -602,6 +605,7 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) | |||
| 602 | { | 605 | { |
| 603 | if (tsdata->debug_dir) | 606 | if (tsdata->debug_dir) |
| 604 | debugfs_remove_recursive(tsdata->debug_dir); | 607 | debugfs_remove_recursive(tsdata->debug_dir); |
| 608 | kfree(tsdata->raw_buffer); | ||
| 605 | } | 609 | } |
| 606 | 610 | ||
| 607 | #else | 611 | #else |
| @@ -843,7 +847,6 @@ static int __devexit edt_ft5x06_ts_remove(struct i2c_client *client) | |||
| 843 | if (gpio_is_valid(pdata->reset_pin)) | 847 | if (gpio_is_valid(pdata->reset_pin)) |
| 844 | gpio_free(pdata->reset_pin); | 848 | gpio_free(pdata->reset_pin); |
| 845 | 849 | ||
| 846 | kfree(tsdata->raw_buffer); | ||
| 847 | kfree(tsdata); | 850 | kfree(tsdata); |
| 848 | 851 | ||
| 849 | return 0; | 852 | return 0; |
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c index e32709e0dd65..721fdb3597ca 100644 --- a/drivers/input/touchscreen/usbtouchscreen.c +++ b/drivers/input/touchscreen/usbtouchscreen.c | |||
| @@ -304,6 +304,45 @@ static int e2i_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | |||
| 304 | #define EGALAX_PKT_TYPE_REPT 0x80 | 304 | #define EGALAX_PKT_TYPE_REPT 0x80 |
| 305 | #define EGALAX_PKT_TYPE_DIAG 0x0A | 305 | #define EGALAX_PKT_TYPE_DIAG 0x0A |
| 306 | 306 | ||
| 307 | static int egalax_init(struct usbtouch_usb *usbtouch) | ||
| 308 | { | ||
| 309 | int ret, i; | ||
| 310 | unsigned char *buf; | ||
| 311 | struct usb_device *udev = interface_to_usbdev(usbtouch->interface); | ||
| 312 | |||
| 313 | /* | ||
| 314 | * An eGalax diagnostic packet kicks the device into using the right | ||
| 315 | * protocol. We send a "check active" packet. The response will be | ||
| 316 | * read later and ignored. | ||
| 317 | */ | ||
| 318 | |||
| 319 | buf = kmalloc(3, GFP_KERNEL); | ||
| 320 | if (!buf) | ||
| 321 | return -ENOMEM; | ||
| 322 | |||
| 323 | buf[0] = EGALAX_PKT_TYPE_DIAG; | ||
| 324 | buf[1] = 1; /* length */ | ||
| 325 | buf[2] = 'A'; /* command - check active */ | ||
| 326 | |||
| 327 | for (i = 0; i < 3; i++) { | ||
| 328 | ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0), | ||
| 329 | 0, | ||
| 330 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
| 331 | 0, 0, buf, 3, | ||
| 332 | USB_CTRL_SET_TIMEOUT); | ||
| 333 | if (ret >= 0) { | ||
| 334 | ret = 0; | ||
| 335 | break; | ||
| 336 | } | ||
| 337 | if (ret != -EPIPE) | ||
| 338 | break; | ||
| 339 | } | ||
| 340 | |||
| 341 | kfree(buf); | ||
| 342 | |||
| 343 | return ret; | ||
| 344 | } | ||
| 345 | |||
| 307 | static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt) | 346 | static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt) |
| 308 | { | 347 | { |
| 309 | if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) | 348 | if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT) |
| @@ -1056,6 +1095,7 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
| 1056 | .process_pkt = usbtouch_process_multi, | 1095 | .process_pkt = usbtouch_process_multi, |
| 1057 | .get_pkt_len = egalax_get_pkt_len, | 1096 | .get_pkt_len = egalax_get_pkt_len, |
| 1058 | .read_data = egalax_read_data, | 1097 | .read_data = egalax_read_data, |
| 1098 | .init = egalax_init, | ||
| 1059 | }, | 1099 | }, |
| 1060 | #endif | 1100 | #endif |
| 1061 | 1101 | ||
diff --git a/drivers/isdn/hardware/mISDN/avmfritz.c b/drivers/isdn/hardware/mISDN/avmfritz.c index fa6ca4733725..dceaec821b0e 100644 --- a/drivers/isdn/hardware/mISDN/avmfritz.c +++ b/drivers/isdn/hardware/mISDN/avmfritz.c | |||
| @@ -857,8 +857,9 @@ avm_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) | |||
| 857 | switch (cmd) { | 857 | switch (cmd) { |
| 858 | case CLOSE_CHANNEL: | 858 | case CLOSE_CHANNEL: |
| 859 | test_and_clear_bit(FLG_OPEN, &bch->Flags); | 859 | test_and_clear_bit(FLG_OPEN, &bch->Flags); |
| 860 | cancel_work_sync(&bch->workq); | ||
| 860 | spin_lock_irqsave(&fc->lock, flags); | 861 | spin_lock_irqsave(&fc->lock, flags); |
| 861 | mISDN_freebchannel(bch); | 862 | mISDN_clear_bchannel(bch); |
| 862 | modehdlc(bch, ISDN_P_NONE); | 863 | modehdlc(bch, ISDN_P_NONE); |
| 863 | spin_unlock_irqrestore(&fc->lock, flags); | 864 | spin_unlock_irqrestore(&fc->lock, flags); |
| 864 | ch->protocol = ISDN_P_NONE; | 865 | ch->protocol = ISDN_P_NONE; |
diff --git a/drivers/isdn/hardware/mISDN/hfcmulti.c b/drivers/isdn/hardware/mISDN/hfcmulti.c index 5e402cf2e795..f02794203bb1 100644 --- a/drivers/isdn/hardware/mISDN/hfcmulti.c +++ b/drivers/isdn/hardware/mISDN/hfcmulti.c | |||
| @@ -5059,6 +5059,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev, | |||
| 5059 | printk(KERN_INFO | 5059 | printk(KERN_INFO |
| 5060 | "HFC-E1 #%d has overlapping B-channels on fragment #%d\n", | 5060 | "HFC-E1 #%d has overlapping B-channels on fragment #%d\n", |
| 5061 | E1_cnt + 1, pt); | 5061 | E1_cnt + 1, pt); |
| 5062 | kfree(hc); | ||
| 5062 | return -EINVAL; | 5063 | return -EINVAL; |
| 5063 | } | 5064 | } |
| 5064 | maskcheck |= hc->bmask[pt]; | 5065 | maskcheck |= hc->bmask[pt]; |
| @@ -5086,6 +5087,7 @@ hfcmulti_init(struct hm_map *m, struct pci_dev *pdev, | |||
| 5086 | if ((poll >> 1) > sizeof(hc->silence_data)) { | 5087 | if ((poll >> 1) > sizeof(hc->silence_data)) { |
| 5087 | printk(KERN_ERR "HFCMULTI error: silence_data too small, " | 5088 | printk(KERN_ERR "HFCMULTI error: silence_data too small, " |
| 5088 | "please fix\n"); | 5089 | "please fix\n"); |
| 5090 | kfree(hc); | ||
| 5089 | return -EINVAL; | 5091 | return -EINVAL; |
| 5090 | } | 5092 | } |
| 5091 | for (i = 0; i < (poll >> 1); i++) | 5093 | for (i = 0; i < (poll >> 1); i++) |
diff --git a/drivers/isdn/hardware/mISDN/mISDNipac.c b/drivers/isdn/hardware/mISDN/mISDNipac.c index 752e0825591f..ccd7d851be26 100644 --- a/drivers/isdn/hardware/mISDN/mISDNipac.c +++ b/drivers/isdn/hardware/mISDN/mISDNipac.c | |||
| @@ -1406,8 +1406,9 @@ hscx_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) | |||
| 1406 | switch (cmd) { | 1406 | switch (cmd) { |
| 1407 | case CLOSE_CHANNEL: | 1407 | case CLOSE_CHANNEL: |
| 1408 | test_and_clear_bit(FLG_OPEN, &bch->Flags); | 1408 | test_and_clear_bit(FLG_OPEN, &bch->Flags); |
| 1409 | cancel_work_sync(&bch->workq); | ||
| 1409 | spin_lock_irqsave(hx->ip->hwlock, flags); | 1410 | spin_lock_irqsave(hx->ip->hwlock, flags); |
| 1410 | mISDN_freebchannel(bch); | 1411 | mISDN_clear_bchannel(bch); |
| 1411 | hscx_mode(hx, ISDN_P_NONE); | 1412 | hscx_mode(hx, ISDN_P_NONE); |
| 1412 | spin_unlock_irqrestore(hx->ip->hwlock, flags); | 1413 | spin_unlock_irqrestore(hx->ip->hwlock, flags); |
| 1413 | ch->protocol = ISDN_P_NONE; | 1414 | ch->protocol = ISDN_P_NONE; |
diff --git a/drivers/isdn/hardware/mISDN/mISDNisar.c b/drivers/isdn/hardware/mISDN/mISDNisar.c index be5973ded6d6..182ecf0626c2 100644 --- a/drivers/isdn/hardware/mISDN/mISDNisar.c +++ b/drivers/isdn/hardware/mISDN/mISDNisar.c | |||
| @@ -1588,8 +1588,9 @@ isar_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) | |||
| 1588 | switch (cmd) { | 1588 | switch (cmd) { |
| 1589 | case CLOSE_CHANNEL: | 1589 | case CLOSE_CHANNEL: |
| 1590 | test_and_clear_bit(FLG_OPEN, &bch->Flags); | 1590 | test_and_clear_bit(FLG_OPEN, &bch->Flags); |
| 1591 | cancel_work_sync(&bch->workq); | ||
| 1591 | spin_lock_irqsave(ich->is->hwlock, flags); | 1592 | spin_lock_irqsave(ich->is->hwlock, flags); |
| 1592 | mISDN_freebchannel(bch); | 1593 | mISDN_clear_bchannel(bch); |
| 1593 | modeisar(ich, ISDN_P_NONE); | 1594 | modeisar(ich, ISDN_P_NONE); |
| 1594 | spin_unlock_irqrestore(ich->is->hwlock, flags); | 1595 | spin_unlock_irqrestore(ich->is->hwlock, flags); |
| 1595 | ch->protocol = ISDN_P_NONE; | 1596 | ch->protocol = ISDN_P_NONE; |
diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c index c3e3e7686273..9bcade59eb73 100644 --- a/drivers/isdn/hardware/mISDN/netjet.c +++ b/drivers/isdn/hardware/mISDN/netjet.c | |||
| @@ -812,8 +812,9 @@ nj_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) | |||
| 812 | switch (cmd) { | 812 | switch (cmd) { |
| 813 | case CLOSE_CHANNEL: | 813 | case CLOSE_CHANNEL: |
| 814 | test_and_clear_bit(FLG_OPEN, &bch->Flags); | 814 | test_and_clear_bit(FLG_OPEN, &bch->Flags); |
| 815 | cancel_work_sync(&bch->workq); | ||
| 815 | spin_lock_irqsave(&card->lock, flags); | 816 | spin_lock_irqsave(&card->lock, flags); |
| 816 | mISDN_freebchannel(bch); | 817 | mISDN_clear_bchannel(bch); |
| 817 | mode_tiger(bc, ISDN_P_NONE); | 818 | mode_tiger(bc, ISDN_P_NONE); |
| 818 | spin_unlock_irqrestore(&card->lock, flags); | 819 | spin_unlock_irqrestore(&card->lock, flags); |
| 819 | ch->protocol = ISDN_P_NONE; | 820 | ch->protocol = ISDN_P_NONE; |
diff --git a/drivers/isdn/hardware/mISDN/w6692.c b/drivers/isdn/hardware/mISDN/w6692.c index 26a86b846099..335fe6455002 100644 --- a/drivers/isdn/hardware/mISDN/w6692.c +++ b/drivers/isdn/hardware/mISDN/w6692.c | |||
| @@ -1054,8 +1054,9 @@ w6692_bctrl(struct mISDNchannel *ch, u32 cmd, void *arg) | |||
| 1054 | switch (cmd) { | 1054 | switch (cmd) { |
| 1055 | case CLOSE_CHANNEL: | 1055 | case CLOSE_CHANNEL: |
| 1056 | test_and_clear_bit(FLG_OPEN, &bch->Flags); | 1056 | test_and_clear_bit(FLG_OPEN, &bch->Flags); |
| 1057 | cancel_work_sync(&bch->workq); | ||
| 1057 | spin_lock_irqsave(&card->lock, flags); | 1058 | spin_lock_irqsave(&card->lock, flags); |
| 1058 | mISDN_freebchannel(bch); | 1059 | mISDN_clear_bchannel(bch); |
| 1059 | w6692_mode(bc, ISDN_P_NONE); | 1060 | w6692_mode(bc, ISDN_P_NONE); |
| 1060 | spin_unlock_irqrestore(&card->lock, flags); | 1061 | spin_unlock_irqrestore(&card->lock, flags); |
| 1061 | ch->protocol = ISDN_P_NONE; | 1062 | ch->protocol = ISDN_P_NONE; |
diff --git a/drivers/isdn/mISDN/hwchannel.c b/drivers/isdn/mISDN/hwchannel.c index ef34fd40867c..2602be23f341 100644 --- a/drivers/isdn/mISDN/hwchannel.c +++ b/drivers/isdn/mISDN/hwchannel.c | |||
| @@ -148,17 +148,16 @@ mISDN_clear_bchannel(struct bchannel *ch) | |||
| 148 | ch->next_minlen = ch->init_minlen; | 148 | ch->next_minlen = ch->init_minlen; |
| 149 | ch->maxlen = ch->init_maxlen; | 149 | ch->maxlen = ch->init_maxlen; |
| 150 | ch->next_maxlen = ch->init_maxlen; | 150 | ch->next_maxlen = ch->init_maxlen; |
| 151 | skb_queue_purge(&ch->rqueue); | ||
| 152 | ch->rcount = 0; | ||
| 151 | } | 153 | } |
| 152 | EXPORT_SYMBOL(mISDN_clear_bchannel); | 154 | EXPORT_SYMBOL(mISDN_clear_bchannel); |
| 153 | 155 | ||
| 154 | int | 156 | void |
| 155 | mISDN_freebchannel(struct bchannel *ch) | 157 | mISDN_freebchannel(struct bchannel *ch) |
| 156 | { | 158 | { |
| 159 | cancel_work_sync(&ch->workq); | ||
| 157 | mISDN_clear_bchannel(ch); | 160 | mISDN_clear_bchannel(ch); |
| 158 | skb_queue_purge(&ch->rqueue); | ||
| 159 | ch->rcount = 0; | ||
| 160 | flush_work_sync(&ch->workq); | ||
| 161 | return 0; | ||
| 162 | } | 161 | } |
| 163 | EXPORT_SYMBOL(mISDN_freebchannel); | 162 | EXPORT_SYMBOL(mISDN_freebchannel); |
| 164 | 163 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index 3f6203a4c7ea..308e87b417e0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -7619,6 +7619,8 @@ static int remove_and_add_spares(struct mddev *mddev) | |||
| 7619 | } | 7619 | } |
| 7620 | } | 7620 | } |
| 7621 | } | 7621 | } |
| 7622 | if (removed) | ||
| 7623 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | ||
| 7622 | return spares; | 7624 | return spares; |
| 7623 | } | 7625 | } |
| 7624 | 7626 | ||
| @@ -7632,9 +7634,11 @@ static void reap_sync_thread(struct mddev *mddev) | |||
| 7632 | !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { | 7634 | !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { |
| 7633 | /* success...*/ | 7635 | /* success...*/ |
| 7634 | /* activate any spares */ | 7636 | /* activate any spares */ |
| 7635 | if (mddev->pers->spare_active(mddev)) | 7637 | if (mddev->pers->spare_active(mddev)) { |
| 7636 | sysfs_notify(&mddev->kobj, NULL, | 7638 | sysfs_notify(&mddev->kobj, NULL, |
| 7637 | "degraded"); | 7639 | "degraded"); |
| 7640 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | ||
| 7641 | } | ||
| 7638 | } | 7642 | } |
| 7639 | if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && | 7643 | if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && |
| 7640 | mddev->pers->finish_reshape) | 7644 | mddev->pers->finish_reshape) |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index adda94df5eb2..7031b865b3a0 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -393,6 +393,8 @@ static int calc_degraded(struct r5conf *conf) | |||
| 393 | degraded = 0; | 393 | degraded = 0; |
| 394 | for (i = 0; i < conf->previous_raid_disks; i++) { | 394 | for (i = 0; i < conf->previous_raid_disks; i++) { |
| 395 | struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); | 395 | struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); |
| 396 | if (rdev && test_bit(Faulty, &rdev->flags)) | ||
| 397 | rdev = rcu_dereference(conf->disks[i].replacement); | ||
| 396 | if (!rdev || test_bit(Faulty, &rdev->flags)) | 398 | if (!rdev || test_bit(Faulty, &rdev->flags)) |
| 397 | degraded++; | 399 | degraded++; |
| 398 | else if (test_bit(In_sync, &rdev->flags)) | 400 | else if (test_bit(In_sync, &rdev->flags)) |
| @@ -417,6 +419,8 @@ static int calc_degraded(struct r5conf *conf) | |||
| 417 | degraded2 = 0; | 419 | degraded2 = 0; |
| 418 | for (i = 0; i < conf->raid_disks; i++) { | 420 | for (i = 0; i < conf->raid_disks; i++) { |
| 419 | struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); | 421 | struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev); |
| 422 | if (rdev && test_bit(Faulty, &rdev->flags)) | ||
| 423 | rdev = rcu_dereference(conf->disks[i].replacement); | ||
| 420 | if (!rdev || test_bit(Faulty, &rdev->flags)) | 424 | if (!rdev || test_bit(Faulty, &rdev->flags)) |
| 421 | degraded2++; | 425 | degraded2++; |
| 422 | else if (test_bit(In_sync, &rdev->flags)) | 426 | else if (test_bit(In_sync, &rdev->flags)) |
| @@ -4192,7 +4196,7 @@ static void make_request(struct mddev *mddev, struct bio * bi) | |||
| 4192 | finish_wait(&conf->wait_for_overlap, &w); | 4196 | finish_wait(&conf->wait_for_overlap, &w); |
| 4193 | set_bit(STRIPE_HANDLE, &sh->state); | 4197 | set_bit(STRIPE_HANDLE, &sh->state); |
| 4194 | clear_bit(STRIPE_DELAYED, &sh->state); | 4198 | clear_bit(STRIPE_DELAYED, &sh->state); |
| 4195 | if ((bi->bi_rw & REQ_NOIDLE) && | 4199 | if ((bi->bi_rw & REQ_SYNC) && |
| 4196 | !test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) | 4200 | !test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) |
| 4197 | atomic_inc(&conf->preread_active_stripes); | 4201 | atomic_inc(&conf->preread_active_stripes); |
| 4198 | release_stripe_plug(mddev, sh); | 4202 | release_stripe_plug(mddev, sh); |
diff --git a/drivers/mfd/88pm800.c b/drivers/mfd/88pm800.c index b67a3018b136..ce229ea933d1 100644 --- a/drivers/mfd/88pm800.c +++ b/drivers/mfd/88pm800.c | |||
| @@ -470,7 +470,8 @@ static int __devinit device_800_init(struct pm80x_chip *chip, | |||
| 470 | 470 | ||
| 471 | ret = | 471 | ret = |
| 472 | mfd_add_devices(chip->dev, 0, &onkey_devs[0], | 472 | mfd_add_devices(chip->dev, 0, &onkey_devs[0], |
| 473 | ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0); | 473 | ARRAY_SIZE(onkey_devs), &onkey_resources[0], 0, |
| 474 | NULL); | ||
| 474 | if (ret < 0) { | 475 | if (ret < 0) { |
| 475 | dev_err(chip->dev, "Failed to add onkey subdev\n"); | 476 | dev_err(chip->dev, "Failed to add onkey subdev\n"); |
| 476 | goto out_dev; | 477 | goto out_dev; |
| @@ -481,7 +482,7 @@ static int __devinit device_800_init(struct pm80x_chip *chip, | |||
| 481 | rtc_devs[0].platform_data = pdata->rtc; | 482 | rtc_devs[0].platform_data = pdata->rtc; |
| 482 | rtc_devs[0].pdata_size = sizeof(struct pm80x_rtc_pdata); | 483 | rtc_devs[0].pdata_size = sizeof(struct pm80x_rtc_pdata); |
| 483 | ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], | 484 | ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], |
| 484 | ARRAY_SIZE(rtc_devs), NULL, 0); | 485 | ARRAY_SIZE(rtc_devs), NULL, 0, NULL); |
| 485 | if (ret < 0) { | 486 | if (ret < 0) { |
| 486 | dev_err(chip->dev, "Failed to add rtc subdev\n"); | 487 | dev_err(chip->dev, "Failed to add rtc subdev\n"); |
| 487 | goto out_dev; | 488 | goto out_dev; |
diff --git a/drivers/mfd/88pm805.c b/drivers/mfd/88pm805.c index 6146583589f6..c20a31136f04 100644 --- a/drivers/mfd/88pm805.c +++ b/drivers/mfd/88pm805.c | |||
| @@ -216,7 +216,8 @@ static int __devinit device_805_init(struct pm80x_chip *chip) | |||
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], | 218 | ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], |
| 219 | ARRAY_SIZE(codec_devs), &codec_resources[0], 0); | 219 | ARRAY_SIZE(codec_devs), &codec_resources[0], 0, |
| 220 | NULL); | ||
| 220 | if (ret < 0) { | 221 | if (ret < 0) { |
| 221 | dev_err(chip->dev, "Failed to add codec subdev\n"); | 222 | dev_err(chip->dev, "Failed to add codec subdev\n"); |
| 222 | goto out_codec; | 223 | goto out_codec; |
diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c index d09918cf1b15..b73f033b2c60 100644 --- a/drivers/mfd/88pm860x-core.c +++ b/drivers/mfd/88pm860x-core.c | |||
| @@ -637,7 +637,7 @@ static void __devinit device_bk_init(struct pm860x_chip *chip, | |||
| 637 | bk_devs[i].resources = &bk_resources[j]; | 637 | bk_devs[i].resources = &bk_resources[j]; |
| 638 | ret = mfd_add_devices(chip->dev, 0, | 638 | ret = mfd_add_devices(chip->dev, 0, |
| 639 | &bk_devs[i], 1, | 639 | &bk_devs[i], 1, |
| 640 | &bk_resources[j], 0); | 640 | &bk_resources[j], 0, NULL); |
| 641 | if (ret < 0) { | 641 | if (ret < 0) { |
| 642 | dev_err(chip->dev, "Failed to add " | 642 | dev_err(chip->dev, "Failed to add " |
| 643 | "backlight subdev\n"); | 643 | "backlight subdev\n"); |
| @@ -672,7 +672,7 @@ static void __devinit device_led_init(struct pm860x_chip *chip, | |||
| 672 | led_devs[i].resources = &led_resources[j], | 672 | led_devs[i].resources = &led_resources[j], |
| 673 | ret = mfd_add_devices(chip->dev, 0, | 673 | ret = mfd_add_devices(chip->dev, 0, |
| 674 | &led_devs[i], 1, | 674 | &led_devs[i], 1, |
| 675 | &led_resources[j], 0); | 675 | &led_resources[j], 0, NULL); |
| 676 | if (ret < 0) { | 676 | if (ret < 0) { |
| 677 | dev_err(chip->dev, "Failed to add " | 677 | dev_err(chip->dev, "Failed to add " |
| 678 | "led subdev\n"); | 678 | "led subdev\n"); |
| @@ -709,7 +709,7 @@ static void __devinit device_regulator_init(struct pm860x_chip *chip, | |||
| 709 | regulator_devs[i].resources = ®ulator_resources[seq]; | 709 | regulator_devs[i].resources = ®ulator_resources[seq]; |
| 710 | 710 | ||
| 711 | ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[i], 1, | 711 | ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[i], 1, |
| 712 | ®ulator_resources[seq], 0); | 712 | ®ulator_resources[seq], 0, NULL); |
| 713 | if (ret < 0) { | 713 | if (ret < 0) { |
| 714 | dev_err(chip->dev, "Failed to add regulator subdev\n"); | 714 | dev_err(chip->dev, "Failed to add regulator subdev\n"); |
| 715 | goto out; | 715 | goto out; |
| @@ -733,7 +733,7 @@ static void __devinit device_rtc_init(struct pm860x_chip *chip, | |||
| 733 | rtc_devs[0].resources = &rtc_resources[0]; | 733 | rtc_devs[0].resources = &rtc_resources[0]; |
| 734 | ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], | 734 | ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], |
| 735 | ARRAY_SIZE(rtc_devs), &rtc_resources[0], | 735 | ARRAY_SIZE(rtc_devs), &rtc_resources[0], |
| 736 | chip->irq_base); | 736 | chip->irq_base, NULL); |
| 737 | if (ret < 0) | 737 | if (ret < 0) |
| 738 | dev_err(chip->dev, "Failed to add rtc subdev\n"); | 738 | dev_err(chip->dev, "Failed to add rtc subdev\n"); |
| 739 | } | 739 | } |
| @@ -752,7 +752,7 @@ static void __devinit device_touch_init(struct pm860x_chip *chip, | |||
| 752 | touch_devs[0].resources = &touch_resources[0]; | 752 | touch_devs[0].resources = &touch_resources[0]; |
| 753 | ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], | 753 | ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], |
| 754 | ARRAY_SIZE(touch_devs), &touch_resources[0], | 754 | ARRAY_SIZE(touch_devs), &touch_resources[0], |
| 755 | chip->irq_base); | 755 | chip->irq_base, NULL); |
| 756 | if (ret < 0) | 756 | if (ret < 0) |
| 757 | dev_err(chip->dev, "Failed to add touch subdev\n"); | 757 | dev_err(chip->dev, "Failed to add touch subdev\n"); |
| 758 | } | 758 | } |
| @@ -770,7 +770,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, | |||
| 770 | power_devs[0].num_resources = ARRAY_SIZE(battery_resources); | 770 | power_devs[0].num_resources = ARRAY_SIZE(battery_resources); |
| 771 | power_devs[0].resources = &battery_resources[0], | 771 | power_devs[0].resources = &battery_resources[0], |
| 772 | ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1, | 772 | ret = mfd_add_devices(chip->dev, 0, &power_devs[0], 1, |
| 773 | &battery_resources[0], chip->irq_base); | 773 | &battery_resources[0], chip->irq_base, NULL); |
| 774 | if (ret < 0) | 774 | if (ret < 0) |
| 775 | dev_err(chip->dev, "Failed to add battery subdev\n"); | 775 | dev_err(chip->dev, "Failed to add battery subdev\n"); |
| 776 | 776 | ||
| @@ -779,7 +779,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, | |||
| 779 | power_devs[1].num_resources = ARRAY_SIZE(charger_resources); | 779 | power_devs[1].num_resources = ARRAY_SIZE(charger_resources); |
| 780 | power_devs[1].resources = &charger_resources[0], | 780 | power_devs[1].resources = &charger_resources[0], |
| 781 | ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1, | 781 | ret = mfd_add_devices(chip->dev, 0, &power_devs[1], 1, |
| 782 | &charger_resources[0], chip->irq_base); | 782 | &charger_resources[0], chip->irq_base, NULL); |
| 783 | if (ret < 0) | 783 | if (ret < 0) |
| 784 | dev_err(chip->dev, "Failed to add charger subdev\n"); | 784 | dev_err(chip->dev, "Failed to add charger subdev\n"); |
| 785 | 785 | ||
| @@ -788,7 +788,7 @@ static void __devinit device_power_init(struct pm860x_chip *chip, | |||
| 788 | power_devs[2].num_resources = ARRAY_SIZE(preg_resources); | 788 | power_devs[2].num_resources = ARRAY_SIZE(preg_resources); |
| 789 | power_devs[2].resources = &preg_resources[0], | 789 | power_devs[2].resources = &preg_resources[0], |
| 790 | ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1, | 790 | ret = mfd_add_devices(chip->dev, 0, &power_devs[2], 1, |
| 791 | &preg_resources[0], chip->irq_base); | 791 | &preg_resources[0], chip->irq_base, NULL); |
| 792 | if (ret < 0) | 792 | if (ret < 0) |
| 793 | dev_err(chip->dev, "Failed to add preg subdev\n"); | 793 | dev_err(chip->dev, "Failed to add preg subdev\n"); |
| 794 | } | 794 | } |
| @@ -802,7 +802,7 @@ static void __devinit device_onkey_init(struct pm860x_chip *chip, | |||
| 802 | onkey_devs[0].resources = &onkey_resources[0], | 802 | onkey_devs[0].resources = &onkey_resources[0], |
| 803 | ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], | 803 | ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], |
| 804 | ARRAY_SIZE(onkey_devs), &onkey_resources[0], | 804 | ARRAY_SIZE(onkey_devs), &onkey_resources[0], |
| 805 | chip->irq_base); | 805 | chip->irq_base, NULL); |
| 806 | if (ret < 0) | 806 | if (ret < 0) |
| 807 | dev_err(chip->dev, "Failed to add onkey subdev\n"); | 807 | dev_err(chip->dev, "Failed to add onkey subdev\n"); |
| 808 | } | 808 | } |
| @@ -815,7 +815,8 @@ static void __devinit device_codec_init(struct pm860x_chip *chip, | |||
| 815 | codec_devs[0].num_resources = ARRAY_SIZE(codec_resources); | 815 | codec_devs[0].num_resources = ARRAY_SIZE(codec_resources); |
| 816 | codec_devs[0].resources = &codec_resources[0], | 816 | codec_devs[0].resources = &codec_resources[0], |
| 817 | ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], | 817 | ret = mfd_add_devices(chip->dev, 0, &codec_devs[0], |
| 818 | ARRAY_SIZE(codec_devs), &codec_resources[0], 0); | 818 | ARRAY_SIZE(codec_devs), &codec_resources[0], 0, |
| 819 | NULL); | ||
| 819 | if (ret < 0) | 820 | if (ret < 0) |
| 820 | dev_err(chip->dev, "Failed to add codec subdev\n"); | 821 | dev_err(chip->dev, "Failed to add codec subdev\n"); |
| 821 | } | 822 | } |
diff --git a/drivers/mfd/aat2870-core.c b/drivers/mfd/aat2870-core.c index 44a3fdbadef4..f1beb4971f87 100644 --- a/drivers/mfd/aat2870-core.c +++ b/drivers/mfd/aat2870-core.c | |||
| @@ -424,7 +424,7 @@ static int aat2870_i2c_probe(struct i2c_client *client, | |||
| 424 | } | 424 | } |
| 425 | 425 | ||
| 426 | ret = mfd_add_devices(aat2870->dev, 0, aat2870_devs, | 426 | ret = mfd_add_devices(aat2870->dev, 0, aat2870_devs, |
| 427 | ARRAY_SIZE(aat2870_devs), NULL, 0); | 427 | ARRAY_SIZE(aat2870_devs), NULL, 0, NULL); |
| 428 | if (ret != 0) { | 428 | if (ret != 0) { |
| 429 | dev_err(aat2870->dev, "Failed to add subdev: %d\n", ret); | 429 | dev_err(aat2870->dev, "Failed to add subdev: %d\n", ret); |
| 430 | goto out_disable; | 430 | goto out_disable; |
diff --git a/drivers/mfd/ab3100-core.c b/drivers/mfd/ab3100-core.c index 78fca2902c8d..01781ae5d0d7 100644 --- a/drivers/mfd/ab3100-core.c +++ b/drivers/mfd/ab3100-core.c | |||
| @@ -946,7 +946,7 @@ static int __devinit ab3100_probe(struct i2c_client *client, | |||
| 946 | } | 946 | } |
| 947 | 947 | ||
| 948 | err = mfd_add_devices(&client->dev, 0, ab3100_devs, | 948 | err = mfd_add_devices(&client->dev, 0, ab3100_devs, |
| 949 | ARRAY_SIZE(ab3100_devs), NULL, 0); | 949 | ARRAY_SIZE(ab3100_devs), NULL, 0, NULL); |
| 950 | 950 | ||
| 951 | ab3100_setup_debugfs(ab3100); | 951 | ab3100_setup_debugfs(ab3100); |
| 952 | 952 | ||
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c index 626b4ecaf647..47adf800024e 100644 --- a/drivers/mfd/ab8500-core.c +++ b/drivers/mfd/ab8500-core.c | |||
| @@ -1418,25 +1418,25 @@ static int __devinit ab8500_probe(struct platform_device *pdev) | |||
| 1418 | 1418 | ||
| 1419 | ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs, | 1419 | ret = mfd_add_devices(ab8500->dev, 0, abx500_common_devs, |
| 1420 | ARRAY_SIZE(abx500_common_devs), NULL, | 1420 | ARRAY_SIZE(abx500_common_devs), NULL, |
| 1421 | ab8500->irq_base); | 1421 | ab8500->irq_base, ab8500->domain); |
| 1422 | if (ret) | 1422 | if (ret) |
| 1423 | goto out_freeirq; | 1423 | goto out_freeirq; |
| 1424 | 1424 | ||
| 1425 | if (is_ab9540(ab8500)) | 1425 | if (is_ab9540(ab8500)) |
| 1426 | ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, | 1426 | ret = mfd_add_devices(ab8500->dev, 0, ab9540_devs, |
| 1427 | ARRAY_SIZE(ab9540_devs), NULL, | 1427 | ARRAY_SIZE(ab9540_devs), NULL, |
| 1428 | ab8500->irq_base); | 1428 | ab8500->irq_base, ab8500->domain); |
| 1429 | else | 1429 | else |
| 1430 | ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, | 1430 | ret = mfd_add_devices(ab8500->dev, 0, ab8500_devs, |
| 1431 | ARRAY_SIZE(ab8500_devs), NULL, | 1431 | ARRAY_SIZE(ab8500_devs), NULL, |
| 1432 | ab8500->irq_base); | 1432 | ab8500->irq_base, ab8500->domain); |
| 1433 | if (ret) | 1433 | if (ret) |
| 1434 | goto out_freeirq; | 1434 | goto out_freeirq; |
| 1435 | 1435 | ||
| 1436 | if (is_ab9540(ab8500) || is_ab8505(ab8500)) | 1436 | if (is_ab9540(ab8500) || is_ab8505(ab8500)) |
| 1437 | ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, | 1437 | ret = mfd_add_devices(ab8500->dev, 0, ab9540_ab8505_devs, |
| 1438 | ARRAY_SIZE(ab9540_ab8505_devs), NULL, | 1438 | ARRAY_SIZE(ab9540_ab8505_devs), NULL, |
| 1439 | ab8500->irq_base); | 1439 | ab8500->irq_base, ab8500->domain); |
| 1440 | if (ret) | 1440 | if (ret) |
| 1441 | goto out_freeirq; | 1441 | goto out_freeirq; |
| 1442 | 1442 | ||
| @@ -1444,7 +1444,7 @@ static int __devinit ab8500_probe(struct platform_device *pdev) | |||
| 1444 | /* Add battery management devices */ | 1444 | /* Add battery management devices */ |
| 1445 | ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, | 1445 | ret = mfd_add_devices(ab8500->dev, 0, ab8500_bm_devs, |
| 1446 | ARRAY_SIZE(ab8500_bm_devs), NULL, | 1446 | ARRAY_SIZE(ab8500_bm_devs), NULL, |
| 1447 | ab8500->irq_base); | 1447 | ab8500->irq_base, ab8500->domain); |
| 1448 | if (ret) | 1448 | if (ret) |
| 1449 | dev_err(ab8500->dev, "error adding bm devices\n"); | 1449 | dev_err(ab8500->dev, "error adding bm devices\n"); |
| 1450 | } | 1450 | } |
diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c index c7983e862549..1b48f2094806 100644 --- a/drivers/mfd/arizona-core.c +++ b/drivers/mfd/arizona-core.c | |||
| @@ -316,7 +316,7 @@ int __devinit arizona_dev_init(struct arizona *arizona) | |||
| 316 | } | 316 | } |
| 317 | 317 | ||
| 318 | ret = mfd_add_devices(arizona->dev, -1, early_devs, | 318 | ret = mfd_add_devices(arizona->dev, -1, early_devs, |
| 319 | ARRAY_SIZE(early_devs), NULL, 0); | 319 | ARRAY_SIZE(early_devs), NULL, 0, NULL); |
| 320 | if (ret != 0) { | 320 | if (ret != 0) { |
| 321 | dev_err(dev, "Failed to add early children: %d\n", ret); | 321 | dev_err(dev, "Failed to add early children: %d\n", ret); |
| 322 | return ret; | 322 | return ret; |
| @@ -516,11 +516,11 @@ int __devinit arizona_dev_init(struct arizona *arizona) | |||
| 516 | switch (arizona->type) { | 516 | switch (arizona->type) { |
| 517 | case WM5102: | 517 | case WM5102: |
| 518 | ret = mfd_add_devices(arizona->dev, -1, wm5102_devs, | 518 | ret = mfd_add_devices(arizona->dev, -1, wm5102_devs, |
| 519 | ARRAY_SIZE(wm5102_devs), NULL, 0); | 519 | ARRAY_SIZE(wm5102_devs), NULL, 0, NULL); |
| 520 | break; | 520 | break; |
| 521 | case WM5110: | 521 | case WM5110: |
| 522 | ret = mfd_add_devices(arizona->dev, -1, wm5110_devs, | 522 | ret = mfd_add_devices(arizona->dev, -1, wm5110_devs, |
| 523 | ARRAY_SIZE(wm5102_devs), NULL, 0); | 523 | ARRAY_SIZE(wm5102_devs), NULL, 0, NULL); |
| 524 | break; | 524 | break; |
| 525 | } | 525 | } |
| 526 | 526 | ||
diff --git a/drivers/mfd/asic3.c b/drivers/mfd/asic3.c index 683e18a23329..62f0883a7630 100644 --- a/drivers/mfd/asic3.c +++ b/drivers/mfd/asic3.c | |||
| @@ -913,14 +913,14 @@ static int __init asic3_mfd_probe(struct platform_device *pdev, | |||
| 913 | if (pdata->clock_rate) { | 913 | if (pdata->clock_rate) { |
| 914 | ds1wm_pdata.clock_rate = pdata->clock_rate; | 914 | ds1wm_pdata.clock_rate = pdata->clock_rate; |
| 915 | ret = mfd_add_devices(&pdev->dev, pdev->id, | 915 | ret = mfd_add_devices(&pdev->dev, pdev->id, |
| 916 | &asic3_cell_ds1wm, 1, mem, asic->irq_base); | 916 | &asic3_cell_ds1wm, 1, mem, asic->irq_base, NULL); |
| 917 | if (ret < 0) | 917 | if (ret < 0) |
| 918 | goto out; | 918 | goto out; |
| 919 | } | 919 | } |
| 920 | 920 | ||
| 921 | if (mem_sdio && (irq >= 0)) { | 921 | if (mem_sdio && (irq >= 0)) { |
| 922 | ret = mfd_add_devices(&pdev->dev, pdev->id, | 922 | ret = mfd_add_devices(&pdev->dev, pdev->id, |
| 923 | &asic3_cell_mmc, 1, mem_sdio, irq); | 923 | &asic3_cell_mmc, 1, mem_sdio, irq, NULL); |
| 924 | if (ret < 0) | 924 | if (ret < 0) |
| 925 | goto out; | 925 | goto out; |
| 926 | } | 926 | } |
| @@ -934,7 +934,7 @@ static int __init asic3_mfd_probe(struct platform_device *pdev, | |||
| 934 | asic3_cell_leds[i].pdata_size = sizeof(pdata->leds[i]); | 934 | asic3_cell_leds[i].pdata_size = sizeof(pdata->leds[i]); |
| 935 | } | 935 | } |
| 936 | ret = mfd_add_devices(&pdev->dev, 0, | 936 | ret = mfd_add_devices(&pdev->dev, 0, |
| 937 | asic3_cell_leds, ASIC3_NUM_LEDS, NULL, 0); | 937 | asic3_cell_leds, ASIC3_NUM_LEDS, NULL, 0, NULL); |
| 938 | } | 938 | } |
| 939 | 939 | ||
| 940 | out: | 940 | out: |
diff --git a/drivers/mfd/cs5535-mfd.c b/drivers/mfd/cs5535-mfd.c index 3419e726de47..2b282133c725 100644 --- a/drivers/mfd/cs5535-mfd.c +++ b/drivers/mfd/cs5535-mfd.c | |||
| @@ -149,7 +149,7 @@ static int __devinit cs5535_mfd_probe(struct pci_dev *pdev, | |||
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells, | 151 | err = mfd_add_devices(&pdev->dev, -1, cs5535_mfd_cells, |
| 152 | ARRAY_SIZE(cs5535_mfd_cells), NULL, 0); | 152 | ARRAY_SIZE(cs5535_mfd_cells), NULL, 0, NULL); |
| 153 | if (err) { | 153 | if (err) { |
| 154 | dev_err(&pdev->dev, "MFD add devices failed: %d\n", err); | 154 | dev_err(&pdev->dev, "MFD add devices failed: %d\n", err); |
| 155 | goto err_disable; | 155 | goto err_disable; |
diff --git a/drivers/mfd/da9052-core.c b/drivers/mfd/da9052-core.c index 2544910e1fd6..a0a62b24621b 100644 --- a/drivers/mfd/da9052-core.c +++ b/drivers/mfd/da9052-core.c | |||
| @@ -803,7 +803,7 @@ int __devinit da9052_device_init(struct da9052 *da9052, u8 chip_id) | |||
| 803 | dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret); | 803 | dev_err(da9052->dev, "DA9052 ADC IRQ failed ret=%d\n", ret); |
| 804 | 804 | ||
| 805 | ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info, | 805 | ret = mfd_add_devices(da9052->dev, -1, da9052_subdev_info, |
| 806 | ARRAY_SIZE(da9052_subdev_info), NULL, 0); | 806 | ARRAY_SIZE(da9052_subdev_info), NULL, 0, NULL); |
| 807 | if (ret) | 807 | if (ret) |
| 808 | goto err; | 808 | goto err; |
| 809 | 809 | ||
diff --git a/drivers/mfd/davinci_voicecodec.c b/drivers/mfd/davinci_voicecodec.c index 4e2af2cb2d26..45e83a68641b 100644 --- a/drivers/mfd/davinci_voicecodec.c +++ b/drivers/mfd/davinci_voicecodec.c | |||
| @@ -129,7 +129,7 @@ static int __init davinci_vc_probe(struct platform_device *pdev) | |||
| 129 | cell->pdata_size = sizeof(*davinci_vc); | 129 | cell->pdata_size = sizeof(*davinci_vc); |
| 130 | 130 | ||
| 131 | ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells, | 131 | ret = mfd_add_devices(&pdev->dev, pdev->id, davinci_vc->cells, |
| 132 | DAVINCI_VC_CELLS, NULL, 0); | 132 | DAVINCI_VC_CELLS, NULL, 0, NULL); |
| 133 | if (ret != 0) { | 133 | if (ret != 0) { |
| 134 | dev_err(&pdev->dev, "fail to register client devices\n"); | 134 | dev_err(&pdev->dev, "fail to register client devices\n"); |
| 135 | goto fail4; | 135 | goto fail4; |
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c index 7040a0081130..0e63cdd9b52a 100644 --- a/drivers/mfd/db8500-prcmu.c +++ b/drivers/mfd/db8500-prcmu.c | |||
| @@ -3010,7 +3010,7 @@ static int __devinit db8500_prcmu_probe(struct platform_device *pdev) | |||
| 3010 | prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET); | 3010 | prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET); |
| 3011 | 3011 | ||
| 3012 | err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, | 3012 | err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, |
| 3013 | ARRAY_SIZE(db8500_prcmu_devs), NULL, 0); | 3013 | ARRAY_SIZE(db8500_prcmu_devs), NULL, 0, NULL); |
| 3014 | if (err) { | 3014 | if (err) { |
| 3015 | pr_err("prcmu: Failed to add subdevices\n"); | 3015 | pr_err("prcmu: Failed to add subdevices\n"); |
| 3016 | return err; | 3016 | return err; |
diff --git a/drivers/mfd/htc-pasic3.c b/drivers/mfd/htc-pasic3.c index 04c7093d6499..9e5453d21a68 100644 --- a/drivers/mfd/htc-pasic3.c +++ b/drivers/mfd/htc-pasic3.c | |||
| @@ -168,7 +168,7 @@ static int __init pasic3_probe(struct platform_device *pdev) | |||
| 168 | /* the first 5 PASIC3 registers control the DS1WM */ | 168 | /* the first 5 PASIC3 registers control the DS1WM */ |
| 169 | ds1wm_resources[0].end = (5 << asic->bus_shift) - 1; | 169 | ds1wm_resources[0].end = (5 << asic->bus_shift) - 1; |
| 170 | ret = mfd_add_devices(&pdev->dev, pdev->id, | 170 | ret = mfd_add_devices(&pdev->dev, pdev->id, |
| 171 | &ds1wm_cell, 1, r, irq); | 171 | &ds1wm_cell, 1, r, irq, NULL); |
| 172 | if (ret < 0) | 172 | if (ret < 0) |
| 173 | dev_warn(dev, "failed to register DS1WM\n"); | 173 | dev_warn(dev, "failed to register DS1WM\n"); |
| 174 | } | 174 | } |
| @@ -176,7 +176,8 @@ static int __init pasic3_probe(struct platform_device *pdev) | |||
| 176 | if (pdata && pdata->led_pdata) { | 176 | if (pdata && pdata->led_pdata) { |
| 177 | led_cell.platform_data = pdata->led_pdata; | 177 | led_cell.platform_data = pdata->led_pdata; |
| 178 | led_cell.pdata_size = sizeof(struct pasic3_leds_machinfo); | 178 | led_cell.pdata_size = sizeof(struct pasic3_leds_machinfo); |
| 179 | ret = mfd_add_devices(&pdev->dev, pdev->id, &led_cell, 1, r, 0); | 179 | ret = mfd_add_devices(&pdev->dev, pdev->id, &led_cell, 1, r, |
| 180 | 0, NULL); | ||
| 180 | if (ret < 0) | 181 | if (ret < 0) |
| 181 | dev_warn(dev, "failed to register LED device\n"); | 182 | dev_warn(dev, "failed to register LED device\n"); |
| 182 | } | 183 | } |
diff --git a/drivers/mfd/intel_msic.c b/drivers/mfd/intel_msic.c index 59df5584cb58..266bdc5bd96d 100644 --- a/drivers/mfd/intel_msic.c +++ b/drivers/mfd/intel_msic.c | |||
| @@ -344,13 +344,13 @@ static int __devinit intel_msic_init_devices(struct intel_msic *msic) | |||
| 344 | continue; | 344 | continue; |
| 345 | 345 | ||
| 346 | ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL, | 346 | ret = mfd_add_devices(&pdev->dev, -1, &msic_devs[i], 1, NULL, |
| 347 | pdata->irq[i]); | 347 | pdata->irq[i], NULL); |
| 348 | if (ret) | 348 | if (ret) |
| 349 | goto fail; | 349 | goto fail; |
| 350 | } | 350 | } |
| 351 | 351 | ||
| 352 | ret = mfd_add_devices(&pdev->dev, 0, msic_other_devs, | 352 | ret = mfd_add_devices(&pdev->dev, 0, msic_other_devs, |
| 353 | ARRAY_SIZE(msic_other_devs), NULL, 0); | 353 | ARRAY_SIZE(msic_other_devs), NULL, 0, NULL); |
| 354 | if (ret) | 354 | if (ret) |
| 355 | goto fail; | 355 | goto fail; |
| 356 | 356 | ||
diff --git a/drivers/mfd/janz-cmodio.c b/drivers/mfd/janz-cmodio.c index 2ea99989551a..965c4801df8a 100644 --- a/drivers/mfd/janz-cmodio.c +++ b/drivers/mfd/janz-cmodio.c | |||
| @@ -147,7 +147,7 @@ static int __devinit cmodio_probe_submodules(struct cmodio_device *priv) | |||
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | return mfd_add_devices(&pdev->dev, 0, priv->cells, | 149 | return mfd_add_devices(&pdev->dev, 0, priv->cells, |
| 150 | num_probed, NULL, pdev->irq); | 150 | num_probed, NULL, pdev->irq, NULL); |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | /* | 153 | /* |
diff --git a/drivers/mfd/jz4740-adc.c b/drivers/mfd/jz4740-adc.c index 87662a17dec6..c6b6d7dda517 100644 --- a/drivers/mfd/jz4740-adc.c +++ b/drivers/mfd/jz4740-adc.c | |||
| @@ -287,7 +287,8 @@ static int __devinit jz4740_adc_probe(struct platform_device *pdev) | |||
| 287 | writeb(0xff, adc->base + JZ_REG_ADC_CTRL); | 287 | writeb(0xff, adc->base + JZ_REG_ADC_CTRL); |
| 288 | 288 | ||
| 289 | ret = mfd_add_devices(&pdev->dev, 0, jz4740_adc_cells, | 289 | ret = mfd_add_devices(&pdev->dev, 0, jz4740_adc_cells, |
| 290 | ARRAY_SIZE(jz4740_adc_cells), mem_base, irq_base); | 290 | ARRAY_SIZE(jz4740_adc_cells), mem_base, |
| 291 | irq_base, NULL); | ||
| 291 | if (ret < 0) | 292 | if (ret < 0) |
| 292 | goto err_clk_put; | 293 | goto err_clk_put; |
| 293 | 294 | ||
diff --git a/drivers/mfd/lm3533-core.c b/drivers/mfd/lm3533-core.c index 0b2879b87fd9..24212f45b201 100644 --- a/drivers/mfd/lm3533-core.c +++ b/drivers/mfd/lm3533-core.c | |||
| @@ -393,7 +393,8 @@ static int __devinit lm3533_device_als_init(struct lm3533 *lm3533) | |||
| 393 | lm3533_als_devs[0].platform_data = pdata->als; | 393 | lm3533_als_devs[0].platform_data = pdata->als; |
| 394 | lm3533_als_devs[0].pdata_size = sizeof(*pdata->als); | 394 | lm3533_als_devs[0].pdata_size = sizeof(*pdata->als); |
| 395 | 395 | ||
| 396 | ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL, 0); | 396 | ret = mfd_add_devices(lm3533->dev, 0, lm3533_als_devs, 1, NULL, |
| 397 | 0, NULL); | ||
| 397 | if (ret) { | 398 | if (ret) { |
| 398 | dev_err(lm3533->dev, "failed to add ALS device\n"); | 399 | dev_err(lm3533->dev, "failed to add ALS device\n"); |
| 399 | return ret; | 400 | return ret; |
| @@ -422,7 +423,7 @@ static int __devinit lm3533_device_bl_init(struct lm3533 *lm3533) | |||
| 422 | } | 423 | } |
| 423 | 424 | ||
| 424 | ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs, | 425 | ret = mfd_add_devices(lm3533->dev, 0, lm3533_bl_devs, |
| 425 | pdata->num_backlights, NULL, 0); | 426 | pdata->num_backlights, NULL, 0, NULL); |
| 426 | if (ret) { | 427 | if (ret) { |
| 427 | dev_err(lm3533->dev, "failed to add backlight devices\n"); | 428 | dev_err(lm3533->dev, "failed to add backlight devices\n"); |
| 428 | return ret; | 429 | return ret; |
| @@ -451,7 +452,7 @@ static int __devinit lm3533_device_led_init(struct lm3533 *lm3533) | |||
| 451 | } | 452 | } |
| 452 | 453 | ||
| 453 | ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs, | 454 | ret = mfd_add_devices(lm3533->dev, 0, lm3533_led_devs, |
| 454 | pdata->num_leds, NULL, 0); | 455 | pdata->num_leds, NULL, 0, NULL); |
| 455 | if (ret) { | 456 | if (ret) { |
| 456 | dev_err(lm3533->dev, "failed to add LED devices\n"); | 457 | dev_err(lm3533->dev, "failed to add LED devices\n"); |
| 457 | return ret; | 458 | return ret; |
diff --git a/drivers/mfd/lpc_ich.c b/drivers/mfd/lpc_ich.c index 027cc8f86132..092ad4b44b6d 100644 --- a/drivers/mfd/lpc_ich.c +++ b/drivers/mfd/lpc_ich.c | |||
| @@ -750,7 +750,7 @@ gpe0_done: | |||
| 750 | 750 | ||
| 751 | lpc_ich_finalize_cell(&lpc_ich_cells[LPC_GPIO], id); | 751 | lpc_ich_finalize_cell(&lpc_ich_cells[LPC_GPIO], id); |
| 752 | ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO], | 752 | ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO], |
| 753 | 1, NULL, 0); | 753 | 1, NULL, 0, NULL); |
| 754 | 754 | ||
| 755 | gpio_done: | 755 | gpio_done: |
| 756 | if (acpi_conflict) | 756 | if (acpi_conflict) |
| @@ -765,7 +765,6 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, | |||
| 765 | u32 base_addr_cfg; | 765 | u32 base_addr_cfg; |
| 766 | u32 base_addr; | 766 | u32 base_addr; |
| 767 | int ret; | 767 | int ret; |
| 768 | bool acpi_conflict = false; | ||
| 769 | struct resource *res; | 768 | struct resource *res; |
| 770 | 769 | ||
| 771 | /* Setup power management base register */ | 770 | /* Setup power management base register */ |
| @@ -780,20 +779,11 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, | |||
| 780 | res = wdt_io_res(ICH_RES_IO_TCO); | 779 | res = wdt_io_res(ICH_RES_IO_TCO); |
| 781 | res->start = base_addr + ACPIBASE_TCO_OFF; | 780 | res->start = base_addr + ACPIBASE_TCO_OFF; |
| 782 | res->end = base_addr + ACPIBASE_TCO_END; | 781 | res->end = base_addr + ACPIBASE_TCO_END; |
| 783 | ret = acpi_check_resource_conflict(res); | ||
| 784 | if (ret) { | ||
| 785 | acpi_conflict = true; | ||
| 786 | goto wdt_done; | ||
| 787 | } | ||
| 788 | 782 | ||
| 789 | res = wdt_io_res(ICH_RES_IO_SMI); | 783 | res = wdt_io_res(ICH_RES_IO_SMI); |
| 790 | res->start = base_addr + ACPIBASE_SMI_OFF; | 784 | res->start = base_addr + ACPIBASE_SMI_OFF; |
| 791 | res->end = base_addr + ACPIBASE_SMI_END; | 785 | res->end = base_addr + ACPIBASE_SMI_END; |
| 792 | ret = acpi_check_resource_conflict(res); | 786 | |
| 793 | if (ret) { | ||
| 794 | acpi_conflict = true; | ||
| 795 | goto wdt_done; | ||
| 796 | } | ||
| 797 | lpc_ich_enable_acpi_space(dev); | 787 | lpc_ich_enable_acpi_space(dev); |
| 798 | 788 | ||
| 799 | /* | 789 | /* |
| @@ -813,21 +803,13 @@ static int __devinit lpc_ich_init_wdt(struct pci_dev *dev, | |||
| 813 | res = wdt_mem_res(ICH_RES_MEM_GCS); | 803 | res = wdt_mem_res(ICH_RES_MEM_GCS); |
| 814 | res->start = base_addr + ACPIBASE_GCS_OFF; | 804 | res->start = base_addr + ACPIBASE_GCS_OFF; |
| 815 | res->end = base_addr + ACPIBASE_GCS_END; | 805 | res->end = base_addr + ACPIBASE_GCS_END; |
| 816 | ret = acpi_check_resource_conflict(res); | ||
| 817 | if (ret) { | ||
| 818 | acpi_conflict = true; | ||
| 819 | goto wdt_done; | ||
| 820 | } | ||
| 821 | } | 806 | } |
| 822 | 807 | ||
| 823 | lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id); | 808 | lpc_ich_finalize_cell(&lpc_ich_cells[LPC_WDT], id); |
| 824 | ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT], | 809 | ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT], |
| 825 | 1, NULL, 0); | 810 | 1, NULL, 0, NULL); |
| 826 | 811 | ||
| 827 | wdt_done: | 812 | wdt_done: |
| 828 | if (acpi_conflict) | ||
| 829 | pr_warn("Resource conflict(s) found affecting %s\n", | ||
| 830 | lpc_ich_cells[LPC_WDT].name); | ||
| 831 | return ret; | 813 | return ret; |
| 832 | } | 814 | } |
| 833 | 815 | ||
diff --git a/drivers/mfd/lpc_sch.c b/drivers/mfd/lpc_sch.c index 9f20abc5e393..f6b9c5c96b24 100644 --- a/drivers/mfd/lpc_sch.c +++ b/drivers/mfd/lpc_sch.c | |||
| @@ -127,7 +127,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev, | |||
| 127 | lpc_sch_cells[i].id = id->device; | 127 | lpc_sch_cells[i].id = id->device; |
| 128 | 128 | ||
| 129 | ret = mfd_add_devices(&dev->dev, 0, | 129 | ret = mfd_add_devices(&dev->dev, 0, |
| 130 | lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL, 0); | 130 | lpc_sch_cells, ARRAY_SIZE(lpc_sch_cells), NULL, |
| 131 | 0, NULL); | ||
| 131 | if (ret) | 132 | if (ret) |
| 132 | goto out_dev; | 133 | goto out_dev; |
| 133 | 134 | ||
| @@ -153,7 +154,8 @@ static int __devinit lpc_sch_probe(struct pci_dev *dev, | |||
| 153 | tunnelcreek_cells[i].id = id->device; | 154 | tunnelcreek_cells[i].id = id->device; |
| 154 | 155 | ||
| 155 | ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells, | 156 | ret = mfd_add_devices(&dev->dev, 0, tunnelcreek_cells, |
| 156 | ARRAY_SIZE(tunnelcreek_cells), NULL, 0); | 157 | ARRAY_SIZE(tunnelcreek_cells), NULL, |
| 158 | 0, NULL); | ||
| 157 | } | 159 | } |
| 158 | 160 | ||
| 159 | return ret; | 161 | return ret; |
diff --git a/drivers/mfd/max77686.c b/drivers/mfd/max77686.c index c03e12b51924..d9e24c849a00 100644 --- a/drivers/mfd/max77686.c +++ b/drivers/mfd/max77686.c | |||
| @@ -126,7 +126,7 @@ static int max77686_i2c_probe(struct i2c_client *i2c, | |||
| 126 | max77686_irq_init(max77686); | 126 | max77686_irq_init(max77686); |
| 127 | 127 | ||
| 128 | ret = mfd_add_devices(max77686->dev, -1, max77686_devs, | 128 | ret = mfd_add_devices(max77686->dev, -1, max77686_devs, |
| 129 | ARRAY_SIZE(max77686_devs), NULL, 0); | 129 | ARRAY_SIZE(max77686_devs), NULL, 0, NULL); |
| 130 | 130 | ||
| 131 | if (ret < 0) | 131 | if (ret < 0) |
| 132 | goto err_mfd; | 132 | goto err_mfd; |
diff --git a/drivers/mfd/max77693-irq.c b/drivers/mfd/max77693-irq.c index 2b403569e0a6..1029d018c739 100644 --- a/drivers/mfd/max77693-irq.c +++ b/drivers/mfd/max77693-irq.c | |||
| @@ -137,6 +137,9 @@ static void max77693_irq_mask(struct irq_data *data) | |||
| 137 | const struct max77693_irq_data *irq_data = | 137 | const struct max77693_irq_data *irq_data = |
| 138 | irq_to_max77693_irq(max77693, data->irq); | 138 | irq_to_max77693_irq(max77693, data->irq); |
| 139 | 139 | ||
| 140 | if (irq_data->group >= MAX77693_IRQ_GROUP_NR) | ||
| 141 | return; | ||
| 142 | |||
| 140 | if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3) | 143 | if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3) |
| 141 | max77693->irq_masks_cur[irq_data->group] &= ~irq_data->mask; | 144 | max77693->irq_masks_cur[irq_data->group] &= ~irq_data->mask; |
| 142 | else | 145 | else |
| @@ -149,6 +152,9 @@ static void max77693_irq_unmask(struct irq_data *data) | |||
| 149 | const struct max77693_irq_data *irq_data = | 152 | const struct max77693_irq_data *irq_data = |
| 150 | irq_to_max77693_irq(max77693, data->irq); | 153 | irq_to_max77693_irq(max77693, data->irq); |
| 151 | 154 | ||
| 155 | if (irq_data->group >= MAX77693_IRQ_GROUP_NR) | ||
| 156 | return; | ||
| 157 | |||
| 152 | if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3) | 158 | if (irq_data->group >= MUIC_INT1 && irq_data->group <= MUIC_INT3) |
| 153 | max77693->irq_masks_cur[irq_data->group] |= irq_data->mask; | 159 | max77693->irq_masks_cur[irq_data->group] |= irq_data->mask; |
| 154 | else | 160 | else |
| @@ -200,7 +206,7 @@ static irqreturn_t max77693_irq_thread(int irq, void *data) | |||
| 200 | 206 | ||
| 201 | if (irq_src & MAX77693_IRQSRC_MUIC) | 207 | if (irq_src & MAX77693_IRQSRC_MUIC) |
| 202 | /* MUIC INT1 ~ INT3 */ | 208 | /* MUIC INT1 ~ INT3 */ |
| 203 | max77693_bulk_read(max77693->regmap, MAX77693_MUIC_REG_INT1, | 209 | max77693_bulk_read(max77693->regmap_muic, MAX77693_MUIC_REG_INT1, |
| 204 | MAX77693_NUM_IRQ_MUIC_REGS, &irq_reg[MUIC_INT1]); | 210 | MAX77693_NUM_IRQ_MUIC_REGS, &irq_reg[MUIC_INT1]); |
| 205 | 211 | ||
| 206 | /* Apply masking */ | 212 | /* Apply masking */ |
| @@ -255,7 +261,8 @@ int max77693_irq_init(struct max77693_dev *max77693) | |||
| 255 | { | 261 | { |
| 256 | struct irq_domain *domain; | 262 | struct irq_domain *domain; |
| 257 | int i; | 263 | int i; |
| 258 | int ret; | 264 | int ret = 0; |
| 265 | u8 intsrc_mask; | ||
| 259 | 266 | ||
| 260 | mutex_init(&max77693->irqlock); | 267 | mutex_init(&max77693->irqlock); |
| 261 | 268 | ||
| @@ -287,19 +294,38 @@ int max77693_irq_init(struct max77693_dev *max77693) | |||
| 287 | &max77693_irq_domain_ops, max77693); | 294 | &max77693_irq_domain_ops, max77693); |
| 288 | if (!domain) { | 295 | if (!domain) { |
| 289 | dev_err(max77693->dev, "could not create irq domain\n"); | 296 | dev_err(max77693->dev, "could not create irq domain\n"); |
| 290 | return -ENODEV; | 297 | ret = -ENODEV; |
| 298 | goto err_irq; | ||
| 291 | } | 299 | } |
| 292 | max77693->irq_domain = domain; | 300 | max77693->irq_domain = domain; |
| 293 | 301 | ||
| 302 | /* Unmask max77693 interrupt */ | ||
| 303 | ret = max77693_read_reg(max77693->regmap, | ||
| 304 | MAX77693_PMIC_REG_INTSRC_MASK, &intsrc_mask); | ||
| 305 | if (ret < 0) { | ||
| 306 | dev_err(max77693->dev, "fail to read PMIC register\n"); | ||
| 307 | goto err_irq; | ||
| 308 | } | ||
| 309 | |||
| 310 | intsrc_mask &= ~(MAX77693_IRQSRC_CHG); | ||
| 311 | intsrc_mask &= ~(MAX77693_IRQSRC_FLASH); | ||
| 312 | intsrc_mask &= ~(MAX77693_IRQSRC_MUIC); | ||
| 313 | ret = max77693_write_reg(max77693->regmap, | ||
| 314 | MAX77693_PMIC_REG_INTSRC_MASK, intsrc_mask); | ||
| 315 | if (ret < 0) { | ||
| 316 | dev_err(max77693->dev, "fail to write PMIC register\n"); | ||
| 317 | goto err_irq; | ||
| 318 | } | ||
| 319 | |||
| 294 | ret = request_threaded_irq(max77693->irq, NULL, max77693_irq_thread, | 320 | ret = request_threaded_irq(max77693->irq, NULL, max77693_irq_thread, |
| 295 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, | 321 | IRQF_TRIGGER_FALLING | IRQF_ONESHOT, |
| 296 | "max77693-irq", max77693); | 322 | "max77693-irq", max77693); |
| 297 | |||
| 298 | if (ret) | 323 | if (ret) |
| 299 | dev_err(max77693->dev, "Failed to request IRQ %d: %d\n", | 324 | dev_err(max77693->dev, "Failed to request IRQ %d: %d\n", |
| 300 | max77693->irq, ret); | 325 | max77693->irq, ret); |
| 301 | 326 | ||
| 302 | return 0; | 327 | err_irq: |
| 328 | return ret; | ||
| 303 | } | 329 | } |
| 304 | 330 | ||
| 305 | void max77693_irq_exit(struct max77693_dev *max77693) | 331 | void max77693_irq_exit(struct max77693_dev *max77693) |
diff --git a/drivers/mfd/max77693.c b/drivers/mfd/max77693.c index a1811cb50ec7..cc5155e20494 100644 --- a/drivers/mfd/max77693.c +++ b/drivers/mfd/max77693.c | |||
| @@ -152,6 +152,20 @@ static int max77693_i2c_probe(struct i2c_client *i2c, | |||
| 152 | max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); | 152 | max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); |
| 153 | i2c_set_clientdata(max77693->haptic, max77693); | 153 | i2c_set_clientdata(max77693->haptic, max77693); |
| 154 | 154 | ||
| 155 | /* | ||
| 156 | * Initialize register map for MUIC device because use regmap-muic | ||
| 157 | * instance of MUIC device when irq of max77693 is initialized | ||
| 158 | * before call max77693-muic probe() function. | ||
| 159 | */ | ||
| 160 | max77693->regmap_muic = devm_regmap_init_i2c(max77693->muic, | ||
| 161 | &max77693_regmap_config); | ||
| 162 | if (IS_ERR(max77693->regmap_muic)) { | ||
| 163 | ret = PTR_ERR(max77693->regmap_muic); | ||
| 164 | dev_err(max77693->dev, | ||
| 165 | "failed to allocate register map: %d\n", ret); | ||
| 166 | goto err_regmap; | ||
| 167 | } | ||
| 168 | |||
| 155 | ret = max77693_irq_init(max77693); | 169 | ret = max77693_irq_init(max77693); |
| 156 | if (ret < 0) | 170 | if (ret < 0) |
| 157 | goto err_irq; | 171 | goto err_irq; |
| @@ -159,7 +173,7 @@ static int max77693_i2c_probe(struct i2c_client *i2c, | |||
| 159 | pm_runtime_set_active(max77693->dev); | 173 | pm_runtime_set_active(max77693->dev); |
| 160 | 174 | ||
| 161 | ret = mfd_add_devices(max77693->dev, -1, max77693_devs, | 175 | ret = mfd_add_devices(max77693->dev, -1, max77693_devs, |
| 162 | ARRAY_SIZE(max77693_devs), NULL, 0); | 176 | ARRAY_SIZE(max77693_devs), NULL, 0, NULL); |
| 163 | if (ret < 0) | 177 | if (ret < 0) |
| 164 | goto err_mfd; | 178 | goto err_mfd; |
| 165 | 179 | ||
diff --git a/drivers/mfd/max8925-core.c b/drivers/mfd/max8925-core.c index 825a7f06d9ba..ee53757beca7 100644 --- a/drivers/mfd/max8925-core.c +++ b/drivers/mfd/max8925-core.c | |||
| @@ -598,7 +598,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, | |||
| 598 | 598 | ||
| 599 | ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], | 599 | ret = mfd_add_devices(chip->dev, 0, &rtc_devs[0], |
| 600 | ARRAY_SIZE(rtc_devs), | 600 | ARRAY_SIZE(rtc_devs), |
| 601 | &rtc_resources[0], chip->irq_base); | 601 | &rtc_resources[0], chip->irq_base, NULL); |
| 602 | if (ret < 0) { | 602 | if (ret < 0) { |
| 603 | dev_err(chip->dev, "Failed to add rtc subdev\n"); | 603 | dev_err(chip->dev, "Failed to add rtc subdev\n"); |
| 604 | goto out; | 604 | goto out; |
| @@ -606,7 +606,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, | |||
| 606 | 606 | ||
| 607 | ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], | 607 | ret = mfd_add_devices(chip->dev, 0, &onkey_devs[0], |
| 608 | ARRAY_SIZE(onkey_devs), | 608 | ARRAY_SIZE(onkey_devs), |
| 609 | &onkey_resources[0], 0); | 609 | &onkey_resources[0], 0, NULL); |
| 610 | if (ret < 0) { | 610 | if (ret < 0) { |
| 611 | dev_err(chip->dev, "Failed to add onkey subdev\n"); | 611 | dev_err(chip->dev, "Failed to add onkey subdev\n"); |
| 612 | goto out_dev; | 612 | goto out_dev; |
| @@ -615,7 +615,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, | |||
| 615 | if (pdata) { | 615 | if (pdata) { |
| 616 | ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[0], | 616 | ret = mfd_add_devices(chip->dev, 0, ®ulator_devs[0], |
| 617 | ARRAY_SIZE(regulator_devs), | 617 | ARRAY_SIZE(regulator_devs), |
| 618 | ®ulator_resources[0], 0); | 618 | ®ulator_resources[0], 0, NULL); |
| 619 | if (ret < 0) { | 619 | if (ret < 0) { |
| 620 | dev_err(chip->dev, "Failed to add regulator subdev\n"); | 620 | dev_err(chip->dev, "Failed to add regulator subdev\n"); |
| 621 | goto out_dev; | 621 | goto out_dev; |
| @@ -625,7 +625,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, | |||
| 625 | if (pdata && pdata->backlight) { | 625 | if (pdata && pdata->backlight) { |
| 626 | ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0], | 626 | ret = mfd_add_devices(chip->dev, 0, &backlight_devs[0], |
| 627 | ARRAY_SIZE(backlight_devs), | 627 | ARRAY_SIZE(backlight_devs), |
| 628 | &backlight_resources[0], 0); | 628 | &backlight_resources[0], 0, NULL); |
| 629 | if (ret < 0) { | 629 | if (ret < 0) { |
| 630 | dev_err(chip->dev, "Failed to add backlight subdev\n"); | 630 | dev_err(chip->dev, "Failed to add backlight subdev\n"); |
| 631 | goto out_dev; | 631 | goto out_dev; |
| @@ -635,7 +635,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, | |||
| 635 | if (pdata && pdata->power) { | 635 | if (pdata && pdata->power) { |
| 636 | ret = mfd_add_devices(chip->dev, 0, &power_devs[0], | 636 | ret = mfd_add_devices(chip->dev, 0, &power_devs[0], |
| 637 | ARRAY_SIZE(power_devs), | 637 | ARRAY_SIZE(power_devs), |
| 638 | &power_supply_resources[0], 0); | 638 | &power_supply_resources[0], 0, NULL); |
| 639 | if (ret < 0) { | 639 | if (ret < 0) { |
| 640 | dev_err(chip->dev, "Failed to add power supply " | 640 | dev_err(chip->dev, "Failed to add power supply " |
| 641 | "subdev\n"); | 641 | "subdev\n"); |
| @@ -646,7 +646,7 @@ int __devinit max8925_device_init(struct max8925_chip *chip, | |||
| 646 | if (pdata && pdata->touch) { | 646 | if (pdata && pdata->touch) { |
| 647 | ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], | 647 | ret = mfd_add_devices(chip->dev, 0, &touch_devs[0], |
| 648 | ARRAY_SIZE(touch_devs), | 648 | ARRAY_SIZE(touch_devs), |
| 649 | &touch_resources[0], 0); | 649 | &touch_resources[0], 0, NULL); |
| 650 | if (ret < 0) { | 650 | if (ret < 0) { |
| 651 | dev_err(chip->dev, "Failed to add touch subdev\n"); | 651 | dev_err(chip->dev, "Failed to add touch subdev\n"); |
| 652 | goto out_dev; | 652 | goto out_dev; |
diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c index 10b629c245b6..f123517065ec 100644 --- a/drivers/mfd/max8997.c +++ b/drivers/mfd/max8997.c | |||
| @@ -160,7 +160,7 @@ static int max8997_i2c_probe(struct i2c_client *i2c, | |||
| 160 | 160 | ||
| 161 | mfd_add_devices(max8997->dev, -1, max8997_devs, | 161 | mfd_add_devices(max8997->dev, -1, max8997_devs, |
| 162 | ARRAY_SIZE(max8997_devs), | 162 | ARRAY_SIZE(max8997_devs), |
| 163 | NULL, 0); | 163 | NULL, 0, NULL); |
| 164 | 164 | ||
| 165 | /* | 165 | /* |
| 166 | * TODO: enable others (flash, muic, rtc, battery, ...) and | 166 | * TODO: enable others (flash, muic, rtc, battery, ...) and |
diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c index 6ef56d28c056..d7218cc90945 100644 --- a/drivers/mfd/max8998.c +++ b/drivers/mfd/max8998.c | |||
| @@ -161,13 +161,13 @@ static int max8998_i2c_probe(struct i2c_client *i2c, | |||
| 161 | switch (id->driver_data) { | 161 | switch (id->driver_data) { |
| 162 | case TYPE_LP3974: | 162 | case TYPE_LP3974: |
| 163 | ret = mfd_add_devices(max8998->dev, -1, | 163 | ret = mfd_add_devices(max8998->dev, -1, |
| 164 | lp3974_devs, ARRAY_SIZE(lp3974_devs), | 164 | lp3974_devs, ARRAY_SIZE(lp3974_devs), |
| 165 | NULL, 0); | 165 | NULL, 0, NULL); |
| 166 | break; | 166 | break; |
| 167 | case TYPE_MAX8998: | 167 | case TYPE_MAX8998: |
| 168 | ret = mfd_add_devices(max8998->dev, -1, | 168 | ret = mfd_add_devices(max8998->dev, -1, |
| 169 | max8998_devs, ARRAY_SIZE(max8998_devs), | 169 | max8998_devs, ARRAY_SIZE(max8998_devs), |
| 170 | NULL, 0); | 170 | NULL, 0, NULL); |
| 171 | break; | 171 | break; |
| 172 | default: | 172 | default: |
| 173 | ret = -EINVAL; | 173 | ret = -EINVAL; |
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c index b801dc72f041..1ec79b54bd2f 100644 --- a/drivers/mfd/mc13xxx-core.c +++ b/drivers/mfd/mc13xxx-core.c | |||
| @@ -612,7 +612,7 @@ static int mc13xxx_add_subdevice_pdata(struct mc13xxx *mc13xxx, | |||
| 612 | if (!cell.name) | 612 | if (!cell.name) |
| 613 | return -ENOMEM; | 613 | return -ENOMEM; |
| 614 | 614 | ||
| 615 | return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0); | 615 | return mfd_add_devices(mc13xxx->dev, -1, &cell, 1, NULL, 0, NULL); |
| 616 | } | 616 | } |
| 617 | 617 | ||
| 618 | static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) | 618 | static int mc13xxx_add_subdevice(struct mc13xxx *mc13xxx, const char *format) |
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c index 0c3a01cde2f7..f8b77711ad2d 100644 --- a/drivers/mfd/mfd-core.c +++ b/drivers/mfd/mfd-core.c | |||
| @@ -74,12 +74,11 @@ static int mfd_platform_add_cell(struct platform_device *pdev, | |||
| 74 | static int mfd_add_device(struct device *parent, int id, | 74 | static int mfd_add_device(struct device *parent, int id, |
| 75 | const struct mfd_cell *cell, | 75 | const struct mfd_cell *cell, |
| 76 | struct resource *mem_base, | 76 | struct resource *mem_base, |
| 77 | int irq_base) | 77 | int irq_base, struct irq_domain *domain) |
| 78 | { | 78 | { |
| 79 | struct resource *res; | 79 | struct resource *res; |
| 80 | struct platform_device *pdev; | 80 | struct platform_device *pdev; |
| 81 | struct device_node *np = NULL; | 81 | struct device_node *np = NULL; |
| 82 | struct irq_domain *domain = NULL; | ||
| 83 | int ret = -ENOMEM; | 82 | int ret = -ENOMEM; |
| 84 | int r; | 83 | int r; |
| 85 | 84 | ||
| @@ -97,7 +96,6 @@ static int mfd_add_device(struct device *parent, int id, | |||
| 97 | for_each_child_of_node(parent->of_node, np) { | 96 | for_each_child_of_node(parent->of_node, np) { |
| 98 | if (of_device_is_compatible(np, cell->of_compatible)) { | 97 | if (of_device_is_compatible(np, cell->of_compatible)) { |
| 99 | pdev->dev.of_node = np; | 98 | pdev->dev.of_node = np; |
| 100 | domain = irq_find_host(parent->of_node); | ||
| 101 | break; | 99 | break; |
| 102 | } | 100 | } |
| 103 | } | 101 | } |
| @@ -177,7 +175,7 @@ fail_alloc: | |||
| 177 | int mfd_add_devices(struct device *parent, int id, | 175 | int mfd_add_devices(struct device *parent, int id, |
| 178 | struct mfd_cell *cells, int n_devs, | 176 | struct mfd_cell *cells, int n_devs, |
| 179 | struct resource *mem_base, | 177 | struct resource *mem_base, |
| 180 | int irq_base) | 178 | int irq_base, struct irq_domain *domain) |
| 181 | { | 179 | { |
| 182 | int i; | 180 | int i; |
| 183 | int ret = 0; | 181 | int ret = 0; |
| @@ -191,7 +189,8 @@ int mfd_add_devices(struct device *parent, int id, | |||
| 191 | for (i = 0; i < n_devs; i++) { | 189 | for (i = 0; i < n_devs; i++) { |
| 192 | atomic_set(&cnts[i], 0); | 190 | atomic_set(&cnts[i], 0); |
| 193 | cells[i].usage_count = &cnts[i]; | 191 | cells[i].usage_count = &cnts[i]; |
| 194 | ret = mfd_add_device(parent, id, cells + i, mem_base, irq_base); | 192 | ret = mfd_add_device(parent, id, cells + i, mem_base, |
| 193 | irq_base, domain); | ||
| 195 | if (ret) | 194 | if (ret) |
| 196 | break; | 195 | break; |
| 197 | } | 196 | } |
| @@ -247,7 +246,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones) | |||
| 247 | for (i = 0; i < n_clones; i++) { | 246 | for (i = 0; i < n_clones; i++) { |
| 248 | cell_entry.name = clones[i]; | 247 | cell_entry.name = clones[i]; |
| 249 | /* don't give up if a single call fails; just report error */ | 248 | /* don't give up if a single call fails; just report error */ |
| 250 | if (mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0)) | 249 | if (mfd_add_device(pdev->dev.parent, -1, &cell_entry, NULL, 0, |
| 250 | NULL)) | ||
| 251 | dev_err(dev, "failed to create platform device '%s'\n", | 251 | dev_err(dev, "failed to create platform device '%s'\n", |
| 252 | clones[i]); | 252 | clones[i]); |
| 253 | } | 253 | } |
diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c index c4a69f193a1d..a345f9bb7b47 100644 --- a/drivers/mfd/palmas.c +++ b/drivers/mfd/palmas.c | |||
| @@ -453,7 +453,8 @@ static int __devinit palmas_i2c_probe(struct i2c_client *i2c, | |||
| 453 | 453 | ||
| 454 | ret = mfd_add_devices(palmas->dev, -1, | 454 | ret = mfd_add_devices(palmas->dev, -1, |
| 455 | children, ARRAY_SIZE(palmas_children), | 455 | children, ARRAY_SIZE(palmas_children), |
| 456 | NULL, regmap_irq_chip_get_base(palmas->irq_data)); | 456 | NULL, regmap_irq_chip_get_base(palmas->irq_data), |
| 457 | NULL); | ||
| 457 | kfree(children); | 458 | kfree(children); |
| 458 | 459 | ||
| 459 | if (ret < 0) | 460 | if (ret < 0) |
diff --git a/drivers/mfd/rc5t583.c b/drivers/mfd/rc5t583.c index cdc1df7fa0e9..3a8fa88567b1 100644 --- a/drivers/mfd/rc5t583.c +++ b/drivers/mfd/rc5t583.c | |||
| @@ -289,7 +289,7 @@ static int __devinit rc5t583_i2c_probe(struct i2c_client *i2c, | |||
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | ret = mfd_add_devices(rc5t583->dev, -1, rc5t583_subdevs, | 291 | ret = mfd_add_devices(rc5t583->dev, -1, rc5t583_subdevs, |
| 292 | ARRAY_SIZE(rc5t583_subdevs), NULL, 0); | 292 | ARRAY_SIZE(rc5t583_subdevs), NULL, 0, NULL); |
| 293 | if (ret) { | 293 | if (ret) { |
| 294 | dev_err(&i2c->dev, "add mfd devices failed: %d\n", ret); | 294 | dev_err(&i2c->dev, "add mfd devices failed: %d\n", ret); |
| 295 | goto err_add_devs; | 295 | goto err_add_devs; |
diff --git a/drivers/mfd/rdc321x-southbridge.c b/drivers/mfd/rdc321x-southbridge.c index 685d61e431ad..0f70dce61160 100644 --- a/drivers/mfd/rdc321x-southbridge.c +++ b/drivers/mfd/rdc321x-southbridge.c | |||
| @@ -87,7 +87,8 @@ static int __devinit rdc321x_sb_probe(struct pci_dev *pdev, | |||
| 87 | rdc321x_wdt_pdata.sb_pdev = pdev; | 87 | rdc321x_wdt_pdata.sb_pdev = pdev; |
| 88 | 88 | ||
| 89 | return mfd_add_devices(&pdev->dev, -1, | 89 | return mfd_add_devices(&pdev->dev, -1, |
| 90 | rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells), NULL, 0); | 90 | rdc321x_sb_cells, ARRAY_SIZE(rdc321x_sb_cells), |
| 91 | NULL, 0, NULL); | ||
| 91 | } | 92 | } |
| 92 | 93 | ||
| 93 | static void __devexit rdc321x_sb_remove(struct pci_dev *pdev) | 94 | static void __devexit rdc321x_sb_remove(struct pci_dev *pdev) |
diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c index 2988efde11eb..49d361a618d0 100644 --- a/drivers/mfd/sec-core.c +++ b/drivers/mfd/sec-core.c | |||
| @@ -141,19 +141,19 @@ static int sec_pmic_probe(struct i2c_client *i2c, | |||
| 141 | switch (sec_pmic->device_type) { | 141 | switch (sec_pmic->device_type) { |
| 142 | case S5M8751X: | 142 | case S5M8751X: |
| 143 | ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, | 143 | ret = mfd_add_devices(sec_pmic->dev, -1, s5m8751_devs, |
| 144 | ARRAY_SIZE(s5m8751_devs), NULL, 0); | 144 | ARRAY_SIZE(s5m8751_devs), NULL, 0, NULL); |
| 145 | break; | 145 | break; |
| 146 | case S5M8763X: | 146 | case S5M8763X: |
| 147 | ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, | 147 | ret = mfd_add_devices(sec_pmic->dev, -1, s5m8763_devs, |
| 148 | ARRAY_SIZE(s5m8763_devs), NULL, 0); | 148 | ARRAY_SIZE(s5m8763_devs), NULL, 0, NULL); |
| 149 | break; | 149 | break; |
| 150 | case S5M8767X: | 150 | case S5M8767X: |
| 151 | ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, | 151 | ret = mfd_add_devices(sec_pmic->dev, -1, s5m8767_devs, |
| 152 | ARRAY_SIZE(s5m8767_devs), NULL, 0); | 152 | ARRAY_SIZE(s5m8767_devs), NULL, 0, NULL); |
| 153 | break; | 153 | break; |
| 154 | case S2MPS11X: | 154 | case S2MPS11X: |
| 155 | ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, | 155 | ret = mfd_add_devices(sec_pmic->dev, -1, s2mps11_devs, |
| 156 | ARRAY_SIZE(s2mps11_devs), NULL, 0); | 156 | ARRAY_SIZE(s2mps11_devs), NULL, 0, NULL); |
| 157 | break; | 157 | break; |
| 158 | default: | 158 | default: |
| 159 | /* If this happens the probe function is problem */ | 159 | /* If this happens the probe function is problem */ |
diff --git a/drivers/mfd/sta2x11-mfd.c b/drivers/mfd/sta2x11-mfd.c index d31fed07aefb..d35da6820bea 100644 --- a/drivers/mfd/sta2x11-mfd.c +++ b/drivers/mfd/sta2x11-mfd.c | |||
| @@ -407,7 +407,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev, | |||
| 407 | sta2x11_mfd_bar0, | 407 | sta2x11_mfd_bar0, |
| 408 | ARRAY_SIZE(sta2x11_mfd_bar0), | 408 | ARRAY_SIZE(sta2x11_mfd_bar0), |
| 409 | &pdev->resource[0], | 409 | &pdev->resource[0], |
| 410 | 0); | 410 | 0, NULL); |
| 411 | if (err) { | 411 | if (err) { |
| 412 | dev_err(&pdev->dev, "mfd_add_devices[0] failed: %d\n", err); | 412 | dev_err(&pdev->dev, "mfd_add_devices[0] failed: %d\n", err); |
| 413 | goto err_disable; | 413 | goto err_disable; |
| @@ -417,7 +417,7 @@ static int __devinit sta2x11_mfd_probe(struct pci_dev *pdev, | |||
| 417 | sta2x11_mfd_bar1, | 417 | sta2x11_mfd_bar1, |
| 418 | ARRAY_SIZE(sta2x11_mfd_bar1), | 418 | ARRAY_SIZE(sta2x11_mfd_bar1), |
| 419 | &pdev->resource[1], | 419 | &pdev->resource[1], |
| 420 | 0); | 420 | 0, NULL); |
| 421 | if (err) { | 421 | if (err) { |
| 422 | dev_err(&pdev->dev, "mfd_add_devices[1] failed: %d\n", err); | 422 | dev_err(&pdev->dev, "mfd_add_devices[1] failed: %d\n", err); |
| 423 | goto err_disable; | 423 | goto err_disable; |
diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c index 2dd8d49cb30b..c94f521f392c 100644 --- a/drivers/mfd/stmpe.c +++ b/drivers/mfd/stmpe.c | |||
| @@ -962,7 +962,7 @@ static int __devinit stmpe_add_device(struct stmpe *stmpe, | |||
| 962 | struct mfd_cell *cell, int irq) | 962 | struct mfd_cell *cell, int irq) |
| 963 | { | 963 | { |
| 964 | return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1, | 964 | return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1, |
| 965 | NULL, stmpe->irq_base + irq); | 965 | NULL, stmpe->irq_base + irq, NULL); |
| 966 | } | 966 | } |
| 967 | 967 | ||
| 968 | static int __devinit stmpe_devices_init(struct stmpe *stmpe) | 968 | static int __devinit stmpe_devices_init(struct stmpe *stmpe) |
diff --git a/drivers/mfd/t7l66xb.c b/drivers/mfd/t7l66xb.c index 2d9e8799e733..b32940ec9034 100644 --- a/drivers/mfd/t7l66xb.c +++ b/drivers/mfd/t7l66xb.c | |||
| @@ -388,7 +388,7 @@ static int t7l66xb_probe(struct platform_device *dev) | |||
| 388 | 388 | ||
| 389 | ret = mfd_add_devices(&dev->dev, dev->id, | 389 | ret = mfd_add_devices(&dev->dev, dev->id, |
| 390 | t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells), | 390 | t7l66xb_cells, ARRAY_SIZE(t7l66xb_cells), |
| 391 | iomem, t7l66xb->irq_base); | 391 | iomem, t7l66xb->irq_base, NULL); |
| 392 | 392 | ||
| 393 | if (!ret) | 393 | if (!ret) |
| 394 | return 0; | 394 | return 0; |
diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c index 048bf0532a09..b56ba6b43294 100644 --- a/drivers/mfd/tc3589x.c +++ b/drivers/mfd/tc3589x.c | |||
| @@ -262,8 +262,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x) | |||
| 262 | 262 | ||
| 263 | if (blocks & TC3589x_BLOCK_GPIO) { | 263 | if (blocks & TC3589x_BLOCK_GPIO) { |
| 264 | ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio, | 264 | ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_gpio, |
| 265 | ARRAY_SIZE(tc3589x_dev_gpio), NULL, | 265 | ARRAY_SIZE(tc3589x_dev_gpio), NULL, |
| 266 | tc3589x->irq_base); | 266 | tc3589x->irq_base, NULL); |
| 267 | if (ret) { | 267 | if (ret) { |
| 268 | dev_err(tc3589x->dev, "failed to add gpio child\n"); | 268 | dev_err(tc3589x->dev, "failed to add gpio child\n"); |
| 269 | return ret; | 269 | return ret; |
| @@ -273,8 +273,8 @@ static int __devinit tc3589x_device_init(struct tc3589x *tc3589x) | |||
| 273 | 273 | ||
| 274 | if (blocks & TC3589x_BLOCK_KEYPAD) { | 274 | if (blocks & TC3589x_BLOCK_KEYPAD) { |
| 275 | ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad, | 275 | ret = mfd_add_devices(tc3589x->dev, -1, tc3589x_dev_keypad, |
| 276 | ARRAY_SIZE(tc3589x_dev_keypad), NULL, | 276 | ARRAY_SIZE(tc3589x_dev_keypad), NULL, |
| 277 | tc3589x->irq_base); | 277 | tc3589x->irq_base, NULL); |
| 278 | if (ret) { | 278 | if (ret) { |
| 279 | dev_err(tc3589x->dev, "failed to keypad child\n"); | 279 | dev_err(tc3589x->dev, "failed to keypad child\n"); |
| 280 | return ret; | 280 | return ret; |
diff --git a/drivers/mfd/tc6387xb.c b/drivers/mfd/tc6387xb.c index d20a284ad4ba..413c891102f8 100644 --- a/drivers/mfd/tc6387xb.c +++ b/drivers/mfd/tc6387xb.c | |||
| @@ -192,7 +192,7 @@ static int __devinit tc6387xb_probe(struct platform_device *dev) | |||
| 192 | printk(KERN_INFO "Toshiba tc6387xb initialised\n"); | 192 | printk(KERN_INFO "Toshiba tc6387xb initialised\n"); |
| 193 | 193 | ||
| 194 | ret = mfd_add_devices(&dev->dev, dev->id, tc6387xb_cells, | 194 | ret = mfd_add_devices(&dev->dev, dev->id, tc6387xb_cells, |
| 195 | ARRAY_SIZE(tc6387xb_cells), iomem, irq); | 195 | ARRAY_SIZE(tc6387xb_cells), iomem, irq, NULL); |
| 196 | 196 | ||
| 197 | if (!ret) | 197 | if (!ret) |
| 198 | return 0; | 198 | return 0; |
diff --git a/drivers/mfd/tc6393xb.c b/drivers/mfd/tc6393xb.c index 9612264f0e6d..dcab026fcbb2 100644 --- a/drivers/mfd/tc6393xb.c +++ b/drivers/mfd/tc6393xb.c | |||
| @@ -700,8 +700,8 @@ static int __devinit tc6393xb_probe(struct platform_device *dev) | |||
| 700 | tc6393xb_cells[TC6393XB_CELL_FB].pdata_size = sizeof(*tcpd->fb_data); | 700 | tc6393xb_cells[TC6393XB_CELL_FB].pdata_size = sizeof(*tcpd->fb_data); |
| 701 | 701 | ||
| 702 | ret = mfd_add_devices(&dev->dev, dev->id, | 702 | ret = mfd_add_devices(&dev->dev, dev->id, |
| 703 | tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells), | 703 | tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells), |
| 704 | iomem, tcpd->irq_base); | 704 | iomem, tcpd->irq_base, NULL); |
| 705 | 705 | ||
| 706 | if (!ret) | 706 | if (!ret) |
| 707 | return 0; | 707 | return 0; |
diff --git a/drivers/mfd/ti-ssp.c b/drivers/mfd/ti-ssp.c index 4fb0e6c8e8fe..7c3675a74f93 100644 --- a/drivers/mfd/ti-ssp.c +++ b/drivers/mfd/ti-ssp.c | |||
| @@ -412,7 +412,7 @@ static int __devinit ti_ssp_probe(struct platform_device *pdev) | |||
| 412 | cells[id].data_size = data->pdata_size; | 412 | cells[id].data_size = data->pdata_size; |
| 413 | } | 413 | } |
| 414 | 414 | ||
| 415 | error = mfd_add_devices(dev, 0, cells, 2, NULL, 0); | 415 | error = mfd_add_devices(dev, 0, cells, 2, NULL, 0, NULL); |
| 416 | if (error < 0) { | 416 | if (error < 0) { |
| 417 | dev_err(dev, "cannot add mfd cells\n"); | 417 | dev_err(dev, "cannot add mfd cells\n"); |
| 418 | goto error_enable; | 418 | goto error_enable; |
diff --git a/drivers/mfd/timberdale.c b/drivers/mfd/timberdale.c index a447f4ec11fb..cccc626c83c8 100644 --- a/drivers/mfd/timberdale.c +++ b/drivers/mfd/timberdale.c | |||
| @@ -757,25 +757,25 @@ static int __devinit timb_probe(struct pci_dev *dev, | |||
| 757 | err = mfd_add_devices(&dev->dev, -1, | 757 | err = mfd_add_devices(&dev->dev, -1, |
| 758 | timberdale_cells_bar0_cfg0, | 758 | timberdale_cells_bar0_cfg0, |
| 759 | ARRAY_SIZE(timberdale_cells_bar0_cfg0), | 759 | ARRAY_SIZE(timberdale_cells_bar0_cfg0), |
| 760 | &dev->resource[0], msix_entries[0].vector); | 760 | &dev->resource[0], msix_entries[0].vector, NULL); |
| 761 | break; | 761 | break; |
| 762 | case TIMB_HW_VER1: | 762 | case TIMB_HW_VER1: |
| 763 | err = mfd_add_devices(&dev->dev, -1, | 763 | err = mfd_add_devices(&dev->dev, -1, |
| 764 | timberdale_cells_bar0_cfg1, | 764 | timberdale_cells_bar0_cfg1, |
| 765 | ARRAY_SIZE(timberdale_cells_bar0_cfg1), | 765 | ARRAY_SIZE(timberdale_cells_bar0_cfg1), |
| 766 | &dev->resource[0], msix_entries[0].vector); | 766 | &dev->resource[0], msix_entries[0].vector, NULL); |
| 767 | break; | 767 | break; |
| 768 | case TIMB_HW_VER2: | 768 | case TIMB_HW_VER2: |
| 769 | err = mfd_add_devices(&dev->dev, -1, | 769 | err = mfd_add_devices(&dev->dev, -1, |
| 770 | timberdale_cells_bar0_cfg2, | 770 | timberdale_cells_bar0_cfg2, |
| 771 | ARRAY_SIZE(timberdale_cells_bar0_cfg2), | 771 | ARRAY_SIZE(timberdale_cells_bar0_cfg2), |
| 772 | &dev->resource[0], msix_entries[0].vector); | 772 | &dev->resource[0], msix_entries[0].vector, NULL); |
| 773 | break; | 773 | break; |
| 774 | case TIMB_HW_VER3: | 774 | case TIMB_HW_VER3: |
| 775 | err = mfd_add_devices(&dev->dev, -1, | 775 | err = mfd_add_devices(&dev->dev, -1, |
| 776 | timberdale_cells_bar0_cfg3, | 776 | timberdale_cells_bar0_cfg3, |
| 777 | ARRAY_SIZE(timberdale_cells_bar0_cfg3), | 777 | ARRAY_SIZE(timberdale_cells_bar0_cfg3), |
| 778 | &dev->resource[0], msix_entries[0].vector); | 778 | &dev->resource[0], msix_entries[0].vector, NULL); |
| 779 | break; | 779 | break; |
| 780 | default: | 780 | default: |
| 781 | dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n", | 781 | dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n", |
| @@ -792,7 +792,7 @@ static int __devinit timb_probe(struct pci_dev *dev, | |||
| 792 | 792 | ||
| 793 | err = mfd_add_devices(&dev->dev, 0, | 793 | err = mfd_add_devices(&dev->dev, 0, |
| 794 | timberdale_cells_bar1, ARRAY_SIZE(timberdale_cells_bar1), | 794 | timberdale_cells_bar1, ARRAY_SIZE(timberdale_cells_bar1), |
| 795 | &dev->resource[1], msix_entries[0].vector); | 795 | &dev->resource[1], msix_entries[0].vector, NULL); |
| 796 | if (err) { | 796 | if (err) { |
| 797 | dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); | 797 | dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); |
| 798 | goto err_mfd2; | 798 | goto err_mfd2; |
| @@ -803,7 +803,7 @@ static int __devinit timb_probe(struct pci_dev *dev, | |||
| 803 | ((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) { | 803 | ((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) { |
| 804 | err = mfd_add_devices(&dev->dev, 1, timberdale_cells_bar2, | 804 | err = mfd_add_devices(&dev->dev, 1, timberdale_cells_bar2, |
| 805 | ARRAY_SIZE(timberdale_cells_bar2), | 805 | ARRAY_SIZE(timberdale_cells_bar2), |
| 806 | &dev->resource[2], msix_entries[0].vector); | 806 | &dev->resource[2], msix_entries[0].vector, NULL); |
| 807 | if (err) { | 807 | if (err) { |
| 808 | dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); | 808 | dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); |
| 809 | goto err_mfd2; | 809 | goto err_mfd2; |
diff --git a/drivers/mfd/tps6105x.c b/drivers/mfd/tps6105x.c index a293b978e27c..14051bdc714b 100644 --- a/drivers/mfd/tps6105x.c +++ b/drivers/mfd/tps6105x.c | |||
| @@ -188,7 +188,7 @@ static int __devinit tps6105x_probe(struct i2c_client *client, | |||
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | ret = mfd_add_devices(&client->dev, 0, tps6105x_cells, | 190 | ret = mfd_add_devices(&client->dev, 0, tps6105x_cells, |
| 191 | ARRAY_SIZE(tps6105x_cells), NULL, 0); | 191 | ARRAY_SIZE(tps6105x_cells), NULL, 0, NULL); |
| 192 | if (ret) | 192 | if (ret) |
| 193 | goto fail; | 193 | goto fail; |
| 194 | 194 | ||
diff --git a/drivers/mfd/tps6507x.c b/drivers/mfd/tps6507x.c index 33ba7723c967..1b203499c744 100644 --- a/drivers/mfd/tps6507x.c +++ b/drivers/mfd/tps6507x.c | |||
| @@ -100,7 +100,7 @@ static int tps6507x_i2c_probe(struct i2c_client *i2c, | |||
| 100 | 100 | ||
| 101 | ret = mfd_add_devices(tps6507x->dev, -1, | 101 | ret = mfd_add_devices(tps6507x->dev, -1, |
| 102 | tps6507x_devs, ARRAY_SIZE(tps6507x_devs), | 102 | tps6507x_devs, ARRAY_SIZE(tps6507x_devs), |
| 103 | NULL, 0); | 103 | NULL, 0, NULL); |
| 104 | 104 | ||
| 105 | if (ret < 0) | 105 | if (ret < 0) |
| 106 | goto err; | 106 | goto err; |
diff --git a/drivers/mfd/tps65090.c b/drivers/mfd/tps65090.c index 80e24f4b47bf..50fd87c87a1c 100644 --- a/drivers/mfd/tps65090.c +++ b/drivers/mfd/tps65090.c | |||
| @@ -292,7 +292,7 @@ static int __devinit tps65090_i2c_probe(struct i2c_client *client, | |||
| 292 | } | 292 | } |
| 293 | 293 | ||
| 294 | ret = mfd_add_devices(tps65090->dev, -1, tps65090s, | 294 | ret = mfd_add_devices(tps65090->dev, -1, tps65090s, |
| 295 | ARRAY_SIZE(tps65090s), NULL, 0); | 295 | ARRAY_SIZE(tps65090s), NULL, 0, NULL); |
| 296 | if (ret) { | 296 | if (ret) { |
| 297 | dev_err(&client->dev, "add mfd devices failed with err: %d\n", | 297 | dev_err(&client->dev, "add mfd devices failed with err: %d\n", |
| 298 | ret); | 298 | ret); |
diff --git a/drivers/mfd/tps65217.c b/drivers/mfd/tps65217.c index 61c097a98f5d..a95e9421b735 100644 --- a/drivers/mfd/tps65217.c +++ b/drivers/mfd/tps65217.c | |||
| @@ -24,11 +24,18 @@ | |||
| 24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
| 25 | #include <linux/regmap.h> | 25 | #include <linux/regmap.h> |
| 26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
| 27 | #include <linux/regulator/of_regulator.h> | 27 | #include <linux/of.h> |
| 28 | #include <linux/of_device.h> | ||
| 28 | 29 | ||
| 29 | #include <linux/mfd/core.h> | 30 | #include <linux/mfd/core.h> |
| 30 | #include <linux/mfd/tps65217.h> | 31 | #include <linux/mfd/tps65217.h> |
| 31 | 32 | ||
| 33 | static struct mfd_cell tps65217s[] = { | ||
| 34 | { | ||
| 35 | .name = "tps65217-pmic", | ||
| 36 | }, | ||
| 37 | }; | ||
| 38 | |||
| 32 | /** | 39 | /** |
| 33 | * tps65217_reg_read: Read a single tps65217 register. | 40 | * tps65217_reg_read: Read a single tps65217 register. |
| 34 | * | 41 | * |
| @@ -133,83 +140,48 @@ int tps65217_clear_bits(struct tps65217 *tps, unsigned int reg, | |||
| 133 | } | 140 | } |
| 134 | EXPORT_SYMBOL_GPL(tps65217_clear_bits); | 141 | EXPORT_SYMBOL_GPL(tps65217_clear_bits); |
| 135 | 142 | ||
| 136 | #ifdef CONFIG_OF | ||
| 137 | static struct of_regulator_match reg_matches[] = { | ||
| 138 | { .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 }, | ||
| 139 | { .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 }, | ||
| 140 | { .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 }, | ||
| 141 | { .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 }, | ||
| 142 | { .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 }, | ||
| 143 | { .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 }, | ||
| 144 | { .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 }, | ||
| 145 | }; | ||
| 146 | |||
| 147 | static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client) | ||
| 148 | { | ||
| 149 | struct device_node *node = client->dev.of_node; | ||
| 150 | struct tps65217_board *pdata; | ||
| 151 | struct device_node *regs; | ||
| 152 | int count = ARRAY_SIZE(reg_matches); | ||
| 153 | int ret, i; | ||
| 154 | |||
| 155 | regs = of_find_node_by_name(node, "regulators"); | ||
| 156 | if (!regs) | ||
| 157 | return NULL; | ||
| 158 | |||
| 159 | ret = of_regulator_match(&client->dev, regs, reg_matches, count); | ||
| 160 | of_node_put(regs); | ||
| 161 | if ((ret < 0) || (ret > count)) | ||
| 162 | return NULL; | ||
| 163 | |||
| 164 | count = ret; | ||
| 165 | pdata = devm_kzalloc(&client->dev, count * sizeof(*pdata), GFP_KERNEL); | ||
| 166 | if (!pdata) | ||
| 167 | return NULL; | ||
| 168 | |||
| 169 | for (i = 0; i < count; i++) { | ||
| 170 | if (!reg_matches[i].init_data || !reg_matches[i].of_node) | ||
| 171 | continue; | ||
| 172 | |||
| 173 | pdata->tps65217_init_data[i] = reg_matches[i].init_data; | ||
| 174 | pdata->of_node[i] = reg_matches[i].of_node; | ||
| 175 | } | ||
| 176 | |||
| 177 | return pdata; | ||
| 178 | } | ||
| 179 | |||
| 180 | static struct of_device_id tps65217_of_match[] = { | ||
| 181 | { .compatible = "ti,tps65217", }, | ||
| 182 | { }, | ||
| 183 | }; | ||
| 184 | #else | ||
| 185 | static struct tps65217_board *tps65217_parse_dt(struct i2c_client *client) | ||
| 186 | { | ||
| 187 | return NULL; | ||
| 188 | } | ||
| 189 | #endif | ||
| 190 | |||
| 191 | static struct regmap_config tps65217_regmap_config = { | 143 | static struct regmap_config tps65217_regmap_config = { |
| 192 | .reg_bits = 8, | 144 | .reg_bits = 8, |
| 193 | .val_bits = 8, | 145 | .val_bits = 8, |
| 194 | }; | 146 | }; |
| 195 | 147 | ||
| 148 | static const struct of_device_id tps65217_of_match[] = { | ||
| 149 | { .compatible = "ti,tps65217", .data = (void *)TPS65217 }, | ||
| 150 | { /* sentinel */ }, | ||
| 151 | }; | ||
| 152 | |||
| 196 | static int __devinit tps65217_probe(struct i2c_client *client, | 153 | static int __devinit tps65217_probe(struct i2c_client *client, |
| 197 | const struct i2c_device_id *ids) | 154 | const struct i2c_device_id *ids) |
| 198 | { | 155 | { |
| 199 | struct tps65217 *tps; | 156 | struct tps65217 *tps; |
| 200 | struct regulator_init_data *reg_data; | ||
| 201 | struct tps65217_board *pdata = client->dev.platform_data; | ||
| 202 | int i, ret; | ||
| 203 | unsigned int version; | 157 | unsigned int version; |
| 158 | unsigned int chip_id = ids->driver_data; | ||
| 159 | const struct of_device_id *match; | ||
| 160 | int ret; | ||
| 204 | 161 | ||
| 205 | if (!pdata && client->dev.of_node) | 162 | if (client->dev.of_node) { |
| 206 | pdata = tps65217_parse_dt(client); | 163 | match = of_match_device(tps65217_of_match, &client->dev); |
| 164 | if (!match) { | ||
| 165 | dev_err(&client->dev, | ||
| 166 | "Failed to find matching dt id\n"); | ||
| 167 | return -EINVAL; | ||
| 168 | } | ||
| 169 | chip_id = (unsigned int)match->data; | ||
| 170 | } | ||
| 171 | |||
| 172 | if (!chip_id) { | ||
| 173 | dev_err(&client->dev, "id is null.\n"); | ||
| 174 | return -ENODEV; | ||
| 175 | } | ||
| 207 | 176 | ||
| 208 | tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); | 177 | tps = devm_kzalloc(&client->dev, sizeof(*tps), GFP_KERNEL); |
| 209 | if (!tps) | 178 | if (!tps) |
| 210 | return -ENOMEM; | 179 | return -ENOMEM; |
| 211 | 180 | ||
| 212 | tps->pdata = pdata; | 181 | i2c_set_clientdata(client, tps); |
| 182 | tps->dev = &client->dev; | ||
| 183 | tps->id = chip_id; | ||
| 184 | |||
| 213 | tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config); | 185 | tps->regmap = devm_regmap_init_i2c(client, &tps65217_regmap_config); |
| 214 | if (IS_ERR(tps->regmap)) { | 186 | if (IS_ERR(tps->regmap)) { |
| 215 | ret = PTR_ERR(tps->regmap); | 187 | ret = PTR_ERR(tps->regmap); |
| @@ -218,8 +190,12 @@ static int __devinit tps65217_probe(struct i2c_client *client, | |||
| 218 | return ret; | 190 | return ret; |
| 219 | } | 191 | } |
| 220 | 192 | ||
| 221 | i2c_set_clientdata(client, tps); | 193 | ret = mfd_add_devices(tps->dev, -1, tps65217s, |
| 222 | tps->dev = &client->dev; | 194 | ARRAY_SIZE(tps65217s), NULL, 0, NULL); |
| 195 | if (ret < 0) { | ||
| 196 | dev_err(tps->dev, "mfd_add_devices failed: %d\n", ret); | ||
| 197 | return ret; | ||
| 198 | } | ||
| 223 | 199 | ||
| 224 | ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); | 200 | ret = tps65217_reg_read(tps, TPS65217_REG_CHIPID, &version); |
| 225 | if (ret < 0) { | 201 | if (ret < 0) { |
| @@ -232,41 +208,21 @@ static int __devinit tps65217_probe(struct i2c_client *client, | |||
| 232 | (version & TPS65217_CHIPID_CHIP_MASK) >> 4, | 208 | (version & TPS65217_CHIPID_CHIP_MASK) >> 4, |
| 233 | version & TPS65217_CHIPID_REV_MASK); | 209 | version & TPS65217_CHIPID_REV_MASK); |
| 234 | 210 | ||
| 235 | for (i = 0; i < TPS65217_NUM_REGULATOR; i++) { | ||
| 236 | struct platform_device *pdev; | ||
| 237 | |||
| 238 | pdev = platform_device_alloc("tps65217-pmic", i); | ||
| 239 | if (!pdev) { | ||
| 240 | dev_err(tps->dev, "Cannot create regulator %d\n", i); | ||
| 241 | continue; | ||
| 242 | } | ||
| 243 | |||
| 244 | pdev->dev.parent = tps->dev; | ||
| 245 | pdev->dev.of_node = pdata->of_node[i]; | ||
| 246 | reg_data = pdata->tps65217_init_data[i]; | ||
| 247 | platform_device_add_data(pdev, reg_data, sizeof(*reg_data)); | ||
| 248 | tps->regulator_pdev[i] = pdev; | ||
| 249 | |||
| 250 | platform_device_add(pdev); | ||
| 251 | } | ||
| 252 | |||
| 253 | return 0; | 211 | return 0; |
| 254 | } | 212 | } |
| 255 | 213 | ||
| 256 | static int __devexit tps65217_remove(struct i2c_client *client) | 214 | static int __devexit tps65217_remove(struct i2c_client *client) |
| 257 | { | 215 | { |
| 258 | struct tps65217 *tps = i2c_get_clientdata(client); | 216 | struct tps65217 *tps = i2c_get_clientdata(client); |
| 259 | int i; | ||
| 260 | 217 | ||
| 261 | for (i = 0; i < TPS65217_NUM_REGULATOR; i++) | 218 | mfd_remove_devices(tps->dev); |
| 262 | platform_device_unregister(tps->regulator_pdev[i]); | ||
| 263 | 219 | ||
| 264 | return 0; | 220 | return 0; |
| 265 | } | 221 | } |
| 266 | 222 | ||
| 267 | static const struct i2c_device_id tps65217_id_table[] = { | 223 | static const struct i2c_device_id tps65217_id_table[] = { |
| 268 | {"tps65217", 0xF0}, | 224 | {"tps65217", TPS65217}, |
| 269 | {/* end of list */} | 225 | { /* sentinel */ } |
| 270 | }; | 226 | }; |
| 271 | MODULE_DEVICE_TABLE(i2c, tps65217_id_table); | 227 | MODULE_DEVICE_TABLE(i2c, tps65217_id_table); |
| 272 | 228 | ||
diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c index 353c34812120..5f58370ccf55 100644 --- a/drivers/mfd/tps6586x.c +++ b/drivers/mfd/tps6586x.c | |||
| @@ -493,7 +493,8 @@ static int __devinit tps6586x_i2c_probe(struct i2c_client *client, | |||
| 493 | } | 493 | } |
| 494 | 494 | ||
| 495 | ret = mfd_add_devices(tps6586x->dev, -1, | 495 | ret = mfd_add_devices(tps6586x->dev, -1, |
| 496 | tps6586x_cell, ARRAY_SIZE(tps6586x_cell), NULL, 0); | 496 | tps6586x_cell, ARRAY_SIZE(tps6586x_cell), |
| 497 | NULL, 0, NULL); | ||
| 497 | if (ret < 0) { | 498 | if (ret < 0) { |
| 498 | dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret); | 499 | dev_err(&client->dev, "mfd_add_devices failed: %d\n", ret); |
| 499 | goto err_mfd_add; | 500 | goto err_mfd_add; |
diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c index 1c563792c777..d3ce4d569deb 100644 --- a/drivers/mfd/tps65910.c +++ b/drivers/mfd/tps65910.c | |||
| @@ -254,7 +254,7 @@ static __devinit int tps65910_i2c_probe(struct i2c_client *i2c, | |||
| 254 | 254 | ||
| 255 | ret = mfd_add_devices(tps65910->dev, -1, | 255 | ret = mfd_add_devices(tps65910->dev, -1, |
| 256 | tps65910s, ARRAY_SIZE(tps65910s), | 256 | tps65910s, ARRAY_SIZE(tps65910s), |
| 257 | NULL, 0); | 257 | NULL, 0, NULL); |
| 258 | if (ret < 0) { | 258 | if (ret < 0) { |
| 259 | dev_err(&i2c->dev, "mfd_add_devices failed: %d\n", ret); | 259 | dev_err(&i2c->dev, "mfd_add_devices failed: %d\n", ret); |
| 260 | return ret; | 260 | return ret; |
diff --git a/drivers/mfd/tps65912-core.c b/drivers/mfd/tps65912-core.c index 74fd8cb5f372..4658b5bdcd84 100644 --- a/drivers/mfd/tps65912-core.c +++ b/drivers/mfd/tps65912-core.c | |||
| @@ -146,7 +146,7 @@ int tps65912_device_init(struct tps65912 *tps65912) | |||
| 146 | 146 | ||
| 147 | ret = mfd_add_devices(tps65912->dev, -1, | 147 | ret = mfd_add_devices(tps65912->dev, -1, |
| 148 | tps65912s, ARRAY_SIZE(tps65912s), | 148 | tps65912s, ARRAY_SIZE(tps65912s), |
| 149 | NULL, 0); | 149 | NULL, 0, NULL); |
| 150 | if (ret < 0) | 150 | if (ret < 0) |
| 151 | goto err; | 151 | goto err; |
| 152 | 152 | ||
diff --git a/drivers/mfd/twl4030-audio.c b/drivers/mfd/twl4030-audio.c index 838ce4eb444e..77c9acb14583 100644 --- a/drivers/mfd/twl4030-audio.c +++ b/drivers/mfd/twl4030-audio.c | |||
| @@ -223,7 +223,7 @@ static int __devinit twl4030_audio_probe(struct platform_device *pdev) | |||
| 223 | 223 | ||
| 224 | if (childs) | 224 | if (childs) |
| 225 | ret = mfd_add_devices(&pdev->dev, pdev->id, audio->cells, | 225 | ret = mfd_add_devices(&pdev->dev, pdev->id, audio->cells, |
| 226 | childs, NULL, 0); | 226 | childs, NULL, 0, NULL); |
| 227 | else { | 227 | else { |
| 228 | dev_err(&pdev->dev, "No platform data found for childs\n"); | 228 | dev_err(&pdev->dev, "No platform data found for childs\n"); |
| 229 | ret = -ENODEV; | 229 | ret = -ENODEV; |
diff --git a/drivers/mfd/twl6040-core.c b/drivers/mfd/twl6040-core.c index b0fad0ffca56..3dca5c195a20 100644 --- a/drivers/mfd/twl6040-core.c +++ b/drivers/mfd/twl6040-core.c | |||
| @@ -632,7 +632,7 @@ static int __devinit twl6040_probe(struct i2c_client *client, | |||
| 632 | } | 632 | } |
| 633 | 633 | ||
| 634 | ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children, | 634 | ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children, |
| 635 | NULL, 0); | 635 | NULL, 0, NULL); |
| 636 | if (ret) | 636 | if (ret) |
| 637 | goto mfd_err; | 637 | goto mfd_err; |
| 638 | 638 | ||
diff --git a/drivers/mfd/vx855.c b/drivers/mfd/vx855.c index 872aff21e4be..b9a636d44c7f 100644 --- a/drivers/mfd/vx855.c +++ b/drivers/mfd/vx855.c | |||
| @@ -102,7 +102,7 @@ static __devinit int vx855_probe(struct pci_dev *pdev, | |||
| 102 | vx855_gpio_resources[1].end = vx855_gpio_resources[1].start + 3; | 102 | vx855_gpio_resources[1].end = vx855_gpio_resources[1].start + 3; |
| 103 | 103 | ||
| 104 | ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells), | 104 | ret = mfd_add_devices(&pdev->dev, -1, vx855_cells, ARRAY_SIZE(vx855_cells), |
| 105 | NULL, 0); | 105 | NULL, 0, NULL); |
| 106 | 106 | ||
| 107 | /* we always return -ENODEV here in order to enable other | 107 | /* we always return -ENODEV here in order to enable other |
| 108 | * drivers like old, not-yet-platform_device ported i2c-viapro */ | 108 | * drivers like old, not-yet-platform_device ported i2c-viapro */ |
diff --git a/drivers/mfd/wl1273-core.c b/drivers/mfd/wl1273-core.c index f39b756df561..86e0e4309fc2 100644 --- a/drivers/mfd/wl1273-core.c +++ b/drivers/mfd/wl1273-core.c | |||
| @@ -241,7 +241,7 @@ static int __devinit wl1273_core_probe(struct i2c_client *client, | |||
| 241 | __func__, children); | 241 | __func__, children); |
| 242 | 242 | ||
| 243 | r = mfd_add_devices(&client->dev, -1, core->cells, | 243 | r = mfd_add_devices(&client->dev, -1, core->cells, |
| 244 | children, NULL, 0); | 244 | children, NULL, 0, NULL); |
| 245 | if (r) | 245 | if (r) |
| 246 | goto err; | 246 | goto err; |
| 247 | 247 | ||
diff --git a/drivers/mfd/wm831x-core.c b/drivers/mfd/wm831x-core.c index 946698fd2dc6..301731035940 100644 --- a/drivers/mfd/wm831x-core.c +++ b/drivers/mfd/wm831x-core.c | |||
| @@ -1813,27 +1813,27 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) | |||
| 1813 | case WM8310: | 1813 | case WM8310: |
| 1814 | ret = mfd_add_devices(wm831x->dev, wm831x_num, | 1814 | ret = mfd_add_devices(wm831x->dev, wm831x_num, |
| 1815 | wm8310_devs, ARRAY_SIZE(wm8310_devs), | 1815 | wm8310_devs, ARRAY_SIZE(wm8310_devs), |
| 1816 | NULL, 0); | 1816 | NULL, 0, NULL); |
| 1817 | break; | 1817 | break; |
| 1818 | 1818 | ||
| 1819 | case WM8311: | 1819 | case WM8311: |
| 1820 | ret = mfd_add_devices(wm831x->dev, wm831x_num, | 1820 | ret = mfd_add_devices(wm831x->dev, wm831x_num, |
| 1821 | wm8311_devs, ARRAY_SIZE(wm8311_devs), | 1821 | wm8311_devs, ARRAY_SIZE(wm8311_devs), |
| 1822 | NULL, 0); | 1822 | NULL, 0, NULL); |
| 1823 | if (!pdata || !pdata->disable_touch) | 1823 | if (!pdata || !pdata->disable_touch) |
| 1824 | mfd_add_devices(wm831x->dev, wm831x_num, | 1824 | mfd_add_devices(wm831x->dev, wm831x_num, |
| 1825 | touch_devs, ARRAY_SIZE(touch_devs), | 1825 | touch_devs, ARRAY_SIZE(touch_devs), |
| 1826 | NULL, 0); | 1826 | NULL, 0, NULL); |
| 1827 | break; | 1827 | break; |
| 1828 | 1828 | ||
| 1829 | case WM8312: | 1829 | case WM8312: |
| 1830 | ret = mfd_add_devices(wm831x->dev, wm831x_num, | 1830 | ret = mfd_add_devices(wm831x->dev, wm831x_num, |
| 1831 | wm8312_devs, ARRAY_SIZE(wm8312_devs), | 1831 | wm8312_devs, ARRAY_SIZE(wm8312_devs), |
| 1832 | NULL, 0); | 1832 | NULL, 0, NULL); |
| 1833 | if (!pdata || !pdata->disable_touch) | 1833 | if (!pdata || !pdata->disable_touch) |
| 1834 | mfd_add_devices(wm831x->dev, wm831x_num, | 1834 | mfd_add_devices(wm831x->dev, wm831x_num, |
| 1835 | touch_devs, ARRAY_SIZE(touch_devs), | 1835 | touch_devs, ARRAY_SIZE(touch_devs), |
| 1836 | NULL, 0); | 1836 | NULL, 0, NULL); |
| 1837 | break; | 1837 | break; |
| 1838 | 1838 | ||
| 1839 | case WM8320: | 1839 | case WM8320: |
| @@ -1842,7 +1842,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) | |||
| 1842 | case WM8326: | 1842 | case WM8326: |
| 1843 | ret = mfd_add_devices(wm831x->dev, wm831x_num, | 1843 | ret = mfd_add_devices(wm831x->dev, wm831x_num, |
| 1844 | wm8320_devs, ARRAY_SIZE(wm8320_devs), | 1844 | wm8320_devs, ARRAY_SIZE(wm8320_devs), |
| 1845 | NULL, 0); | 1845 | NULL, 0, NULL); |
| 1846 | break; | 1846 | break; |
| 1847 | 1847 | ||
| 1848 | default: | 1848 | default: |
| @@ -1867,7 +1867,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) | |||
| 1867 | if (ret & WM831X_XTAL_ENA) { | 1867 | if (ret & WM831X_XTAL_ENA) { |
| 1868 | ret = mfd_add_devices(wm831x->dev, wm831x_num, | 1868 | ret = mfd_add_devices(wm831x->dev, wm831x_num, |
| 1869 | rtc_devs, ARRAY_SIZE(rtc_devs), | 1869 | rtc_devs, ARRAY_SIZE(rtc_devs), |
| 1870 | NULL, 0); | 1870 | NULL, 0, NULL); |
| 1871 | if (ret != 0) { | 1871 | if (ret != 0) { |
| 1872 | dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret); | 1872 | dev_err(wm831x->dev, "Failed to add RTC: %d\n", ret); |
| 1873 | goto err_irq; | 1873 | goto err_irq; |
| @@ -1880,7 +1880,7 @@ int wm831x_device_init(struct wm831x *wm831x, unsigned long id, int irq) | |||
| 1880 | /* Treat errors as non-critical */ | 1880 | /* Treat errors as non-critical */ |
| 1881 | ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs, | 1881 | ret = mfd_add_devices(wm831x->dev, wm831x_num, backlight_devs, |
| 1882 | ARRAY_SIZE(backlight_devs), NULL, | 1882 | ARRAY_SIZE(backlight_devs), NULL, |
| 1883 | 0); | 1883 | 0, NULL); |
| 1884 | if (ret < 0) | 1884 | if (ret < 0) |
| 1885 | dev_err(wm831x->dev, "Failed to add backlight: %d\n", | 1885 | dev_err(wm831x->dev, "Failed to add backlight: %d\n", |
| 1886 | ret); | 1886 | ret); |
diff --git a/drivers/mfd/wm8400-core.c b/drivers/mfd/wm8400-core.c index 4b7d378551d5..639ca359242f 100644 --- a/drivers/mfd/wm8400-core.c +++ b/drivers/mfd/wm8400-core.c | |||
| @@ -70,7 +70,7 @@ static int wm8400_register_codec(struct wm8400 *wm8400) | |||
| 70 | .pdata_size = sizeof(*wm8400), | 70 | .pdata_size = sizeof(*wm8400), |
| 71 | }; | 71 | }; |
| 72 | 72 | ||
| 73 | return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0); | 73 | return mfd_add_devices(wm8400->dev, -1, &cell, 1, NULL, 0, NULL); |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | /* | 76 | /* |
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c index eec74aa55fdf..2febf88cfce8 100644 --- a/drivers/mfd/wm8994-core.c +++ b/drivers/mfd/wm8994-core.c | |||
| @@ -414,7 +414,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) | |||
| 414 | ret = mfd_add_devices(wm8994->dev, -1, | 414 | ret = mfd_add_devices(wm8994->dev, -1, |
| 415 | wm8994_regulator_devs, | 415 | wm8994_regulator_devs, |
| 416 | ARRAY_SIZE(wm8994_regulator_devs), | 416 | ARRAY_SIZE(wm8994_regulator_devs), |
| 417 | NULL, 0); | 417 | NULL, 0, NULL); |
| 418 | if (ret != 0) { | 418 | if (ret != 0) { |
| 419 | dev_err(wm8994->dev, "Failed to add children: %d\n", ret); | 419 | dev_err(wm8994->dev, "Failed to add children: %d\n", ret); |
| 420 | goto err; | 420 | goto err; |
| @@ -648,7 +648,7 @@ static __devinit int wm8994_device_init(struct wm8994 *wm8994, int irq) | |||
| 648 | 648 | ||
| 649 | ret = mfd_add_devices(wm8994->dev, -1, | 649 | ret = mfd_add_devices(wm8994->dev, -1, |
| 650 | wm8994_devs, ARRAY_SIZE(wm8994_devs), | 650 | wm8994_devs, ARRAY_SIZE(wm8994_devs), |
| 651 | NULL, 0); | 651 | NULL, 0, NULL); |
| 652 | if (ret != 0) { | 652 | if (ret != 0) { |
| 653 | dev_err(wm8994->dev, "Failed to add children: %d\n", ret); | 653 | dev_err(wm8994->dev, "Failed to add children: %d\n", ret); |
| 654 | goto err_irq; | 654 | goto err_irq; |
diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index f1c84decb192..172a768036d8 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c | |||
| @@ -1411,7 +1411,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) | |||
| 1411 | /* complete ongoing async transfer before issuing discard */ | 1411 | /* complete ongoing async transfer before issuing discard */ |
| 1412 | if (card->host->areq) | 1412 | if (card->host->areq) |
| 1413 | mmc_blk_issue_rw_rq(mq, NULL); | 1413 | mmc_blk_issue_rw_rq(mq, NULL); |
| 1414 | if (req->cmd_flags & REQ_SECURE) | 1414 | if (req->cmd_flags & REQ_SECURE && |
| 1415 | !(card->quirks & MMC_QUIRK_SEC_ERASE_TRIM_BROKEN)) | ||
| 1415 | ret = mmc_blk_issue_secdiscard_rq(mq, req); | 1416 | ret = mmc_blk_issue_secdiscard_rq(mq, req); |
| 1416 | else | 1417 | else |
| 1417 | ret = mmc_blk_issue_discard_rq(mq, req); | 1418 | ret = mmc_blk_issue_discard_rq(mq, req); |
| @@ -1716,6 +1717,7 @@ force_ro_fail: | |||
| 1716 | #define CID_MANFID_SANDISK 0x2 | 1717 | #define CID_MANFID_SANDISK 0x2 |
| 1717 | #define CID_MANFID_TOSHIBA 0x11 | 1718 | #define CID_MANFID_TOSHIBA 0x11 |
| 1718 | #define CID_MANFID_MICRON 0x13 | 1719 | #define CID_MANFID_MICRON 0x13 |
| 1720 | #define CID_MANFID_SAMSUNG 0x15 | ||
| 1719 | 1721 | ||
| 1720 | static const struct mmc_fixup blk_fixups[] = | 1722 | static const struct mmc_fixup blk_fixups[] = |
| 1721 | { | 1723 | { |
| @@ -1752,6 +1754,28 @@ static const struct mmc_fixup blk_fixups[] = | |||
| 1752 | MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc, | 1754 | MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc, |
| 1753 | MMC_QUIRK_LONG_READ_TIME), | 1755 | MMC_QUIRK_LONG_READ_TIME), |
| 1754 | 1756 | ||
| 1757 | /* | ||
| 1758 | * On these Samsung MoviNAND parts, performing secure erase or | ||
| 1759 | * secure trim can result in unrecoverable corruption due to a | ||
| 1760 | * firmware bug. | ||
| 1761 | */ | ||
| 1762 | MMC_FIXUP("M8G2FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1763 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1764 | MMC_FIXUP("MAG4FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1765 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1766 | MMC_FIXUP("MBG8FA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1767 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1768 | MMC_FIXUP("MCGAFA", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1769 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1770 | MMC_FIXUP("VAL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1771 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1772 | MMC_FIXUP("VYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1773 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1774 | MMC_FIXUP("KYL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1775 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1776 | MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, | ||
| 1777 | MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), | ||
| 1778 | |||
| 1755 | END_FIXUP | 1779 | END_FIXUP |
| 1756 | }; | 1780 | }; |
| 1757 | 1781 | ||
diff --git a/drivers/mmc/host/atmel-mci.c b/drivers/mmc/host/atmel-mci.c index 322412cec4ee..a53c7c478e05 100644 --- a/drivers/mmc/host/atmel-mci.c +++ b/drivers/mmc/host/atmel-mci.c | |||
| @@ -81,6 +81,7 @@ struct atmel_mci_caps { | |||
| 81 | bool has_bad_data_ordering; | 81 | bool has_bad_data_ordering; |
| 82 | bool need_reset_after_xfer; | 82 | bool need_reset_after_xfer; |
| 83 | bool need_blksz_mul_4; | 83 | bool need_blksz_mul_4; |
| 84 | bool need_notbusy_for_read_ops; | ||
| 84 | }; | 85 | }; |
| 85 | 86 | ||
| 86 | struct atmel_mci_dma { | 87 | struct atmel_mci_dma { |
| @@ -1625,7 +1626,8 @@ static void atmci_tasklet_func(unsigned long priv) | |||
| 1625 | __func__); | 1626 | __func__); |
| 1626 | atmci_set_completed(host, EVENT_XFER_COMPLETE); | 1627 | atmci_set_completed(host, EVENT_XFER_COMPLETE); |
| 1627 | 1628 | ||
| 1628 | if (host->data->flags & MMC_DATA_WRITE) { | 1629 | if (host->caps.need_notbusy_for_read_ops || |
| 1630 | (host->data->flags & MMC_DATA_WRITE)) { | ||
| 1629 | atmci_writel(host, ATMCI_IER, ATMCI_NOTBUSY); | 1631 | atmci_writel(host, ATMCI_IER, ATMCI_NOTBUSY); |
| 1630 | state = STATE_WAITING_NOTBUSY; | 1632 | state = STATE_WAITING_NOTBUSY; |
| 1631 | } else if (host->mrq->stop) { | 1633 | } else if (host->mrq->stop) { |
| @@ -2218,6 +2220,7 @@ static void __init atmci_get_cap(struct atmel_mci *host) | |||
| 2218 | host->caps.has_bad_data_ordering = 1; | 2220 | host->caps.has_bad_data_ordering = 1; |
| 2219 | host->caps.need_reset_after_xfer = 1; | 2221 | host->caps.need_reset_after_xfer = 1; |
| 2220 | host->caps.need_blksz_mul_4 = 1; | 2222 | host->caps.need_blksz_mul_4 = 1; |
| 2223 | host->caps.need_notbusy_for_read_ops = 0; | ||
| 2221 | 2224 | ||
| 2222 | /* keep only major version number */ | 2225 | /* keep only major version number */ |
| 2223 | switch (version & 0xf00) { | 2226 | switch (version & 0xf00) { |
| @@ -2238,6 +2241,7 @@ static void __init atmci_get_cap(struct atmel_mci *host) | |||
| 2238 | case 0x200: | 2241 | case 0x200: |
| 2239 | host->caps.has_rwproof = 1; | 2242 | host->caps.has_rwproof = 1; |
| 2240 | host->caps.need_blksz_mul_4 = 0; | 2243 | host->caps.need_blksz_mul_4 = 0; |
| 2244 | host->caps.need_notbusy_for_read_ops = 1; | ||
| 2241 | case 0x100: | 2245 | case 0x100: |
| 2242 | host->caps.has_bad_data_ordering = 0; | 2246 | host->caps.has_bad_data_ordering = 0; |
| 2243 | host->caps.need_reset_after_xfer = 0; | 2247 | host->caps.need_reset_after_xfer = 0; |
diff --git a/drivers/mmc/host/bfin_sdh.c b/drivers/mmc/host/bfin_sdh.c index 03666174ca48..a17dd7363ceb 100644 --- a/drivers/mmc/host/bfin_sdh.c +++ b/drivers/mmc/host/bfin_sdh.c | |||
| @@ -49,13 +49,6 @@ | |||
| 49 | #define bfin_write_SDH_CFG bfin_write_RSI_CFG | 49 | #define bfin_write_SDH_CFG bfin_write_RSI_CFG |
| 50 | #endif | 50 | #endif |
| 51 | 51 | ||
| 52 | struct dma_desc_array { | ||
| 53 | unsigned long start_addr; | ||
| 54 | unsigned short cfg; | ||
| 55 | unsigned short x_count; | ||
| 56 | short x_modify; | ||
| 57 | } __packed; | ||
| 58 | |||
| 59 | struct sdh_host { | 52 | struct sdh_host { |
| 60 | struct mmc_host *mmc; | 53 | struct mmc_host *mmc; |
| 61 | spinlock_t lock; | 54 | spinlock_t lock; |
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 72dc3cde646d..af40d227bece 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c | |||
| @@ -627,6 +627,7 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot) | |||
| 627 | { | 627 | { |
| 628 | struct dw_mci *host = slot->host; | 628 | struct dw_mci *host = slot->host; |
| 629 | u32 div; | 629 | u32 div; |
| 630 | u32 clk_en_a; | ||
| 630 | 631 | ||
| 631 | if (slot->clock != host->current_speed) { | 632 | if (slot->clock != host->current_speed) { |
| 632 | div = host->bus_hz / slot->clock; | 633 | div = host->bus_hz / slot->clock; |
| @@ -659,9 +660,11 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot) | |||
| 659 | mci_send_cmd(slot, | 660 | mci_send_cmd(slot, |
| 660 | SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0); | 661 | SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0); |
| 661 | 662 | ||
| 662 | /* enable clock */ | 663 | /* enable clock; only low power if no SDIO */ |
| 663 | mci_writel(host, CLKENA, ((SDMMC_CLKEN_ENABLE | | 664 | clk_en_a = SDMMC_CLKEN_ENABLE << slot->id; |
| 664 | SDMMC_CLKEN_LOW_PWR) << slot->id)); | 665 | if (!(mci_readl(host, INTMASK) & SDMMC_INT_SDIO(slot->id))) |
| 666 | clk_en_a |= SDMMC_CLKEN_LOW_PWR << slot->id; | ||
| 667 | mci_writel(host, CLKENA, clk_en_a); | ||
| 665 | 668 | ||
| 666 | /* inform CIU */ | 669 | /* inform CIU */ |
| 667 | mci_send_cmd(slot, | 670 | mci_send_cmd(slot, |
| @@ -862,6 +865,30 @@ static int dw_mci_get_cd(struct mmc_host *mmc) | |||
| 862 | return present; | 865 | return present; |
| 863 | } | 866 | } |
| 864 | 867 | ||
| 868 | /* | ||
| 869 | * Disable lower power mode. | ||
| 870 | * | ||
| 871 | * Low power mode will stop the card clock when idle. According to the | ||
| 872 | * description of the CLKENA register we should disable low power mode | ||
| 873 | * for SDIO cards if we need SDIO interrupts to work. | ||
| 874 | * | ||
| 875 | * This function is fast if low power mode is already disabled. | ||
| 876 | */ | ||
| 877 | static void dw_mci_disable_low_power(struct dw_mci_slot *slot) | ||
| 878 | { | ||
| 879 | struct dw_mci *host = slot->host; | ||
| 880 | u32 clk_en_a; | ||
| 881 | const u32 clken_low_pwr = SDMMC_CLKEN_LOW_PWR << slot->id; | ||
| 882 | |||
| 883 | clk_en_a = mci_readl(host, CLKENA); | ||
| 884 | |||
| 885 | if (clk_en_a & clken_low_pwr) { | ||
| 886 | mci_writel(host, CLKENA, clk_en_a & ~clken_low_pwr); | ||
| 887 | mci_send_cmd(slot, SDMMC_CMD_UPD_CLK | | ||
| 888 | SDMMC_CMD_PRV_DAT_WAIT, 0); | ||
| 889 | } | ||
| 890 | } | ||
| 891 | |||
| 865 | static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb) | 892 | static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb) |
| 866 | { | 893 | { |
| 867 | struct dw_mci_slot *slot = mmc_priv(mmc); | 894 | struct dw_mci_slot *slot = mmc_priv(mmc); |
| @@ -871,6 +898,14 @@ static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb) | |||
| 871 | /* Enable/disable Slot Specific SDIO interrupt */ | 898 | /* Enable/disable Slot Specific SDIO interrupt */ |
| 872 | int_mask = mci_readl(host, INTMASK); | 899 | int_mask = mci_readl(host, INTMASK); |
| 873 | if (enb) { | 900 | if (enb) { |
| 901 | /* | ||
| 902 | * Turn off low power mode if it was enabled. This is a bit of | ||
| 903 | * a heavy operation and we disable / enable IRQs a lot, so | ||
| 904 | * we'll leave low power mode disabled and it will get | ||
| 905 | * re-enabled again in dw_mci_setup_bus(). | ||
| 906 | */ | ||
| 907 | dw_mci_disable_low_power(slot); | ||
| 908 | |||
| 874 | mci_writel(host, INTMASK, | 909 | mci_writel(host, INTMASK, |
| 875 | (int_mask | SDMMC_INT_SDIO(slot->id))); | 910 | (int_mask | SDMMC_INT_SDIO(slot->id))); |
| 876 | } else { | 911 | } else { |
| @@ -1429,22 +1464,10 @@ static void dw_mci_read_data_pio(struct dw_mci *host) | |||
| 1429 | nbytes += len; | 1464 | nbytes += len; |
| 1430 | remain -= len; | 1465 | remain -= len; |
| 1431 | } while (remain); | 1466 | } while (remain); |
| 1432 | sg_miter->consumed = offset; | ||
| 1433 | 1467 | ||
| 1468 | sg_miter->consumed = offset; | ||
| 1434 | status = mci_readl(host, MINTSTS); | 1469 | status = mci_readl(host, MINTSTS); |
| 1435 | mci_writel(host, RINTSTS, SDMMC_INT_RXDR); | 1470 | mci_writel(host, RINTSTS, SDMMC_INT_RXDR); |
| 1436 | if (status & DW_MCI_DATA_ERROR_FLAGS) { | ||
| 1437 | host->data_status = status; | ||
| 1438 | data->bytes_xfered += nbytes; | ||
| 1439 | sg_miter_stop(sg_miter); | ||
| 1440 | host->sg = NULL; | ||
| 1441 | smp_wmb(); | ||
| 1442 | |||
| 1443 | set_bit(EVENT_DATA_ERROR, &host->pending_events); | ||
| 1444 | |||
| 1445 | tasklet_schedule(&host->tasklet); | ||
| 1446 | return; | ||
| 1447 | } | ||
| 1448 | } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ | 1471 | } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ |
| 1449 | data->bytes_xfered += nbytes; | 1472 | data->bytes_xfered += nbytes; |
| 1450 | 1473 | ||
| @@ -1497,23 +1520,10 @@ static void dw_mci_write_data_pio(struct dw_mci *host) | |||
| 1497 | nbytes += len; | 1520 | nbytes += len; |
| 1498 | remain -= len; | 1521 | remain -= len; |
| 1499 | } while (remain); | 1522 | } while (remain); |
| 1500 | sg_miter->consumed = offset; | ||
| 1501 | 1523 | ||
| 1524 | sg_miter->consumed = offset; | ||
| 1502 | status = mci_readl(host, MINTSTS); | 1525 | status = mci_readl(host, MINTSTS); |
| 1503 | mci_writel(host, RINTSTS, SDMMC_INT_TXDR); | 1526 | mci_writel(host, RINTSTS, SDMMC_INT_TXDR); |
| 1504 | if (status & DW_MCI_DATA_ERROR_FLAGS) { | ||
| 1505 | host->data_status = status; | ||
| 1506 | data->bytes_xfered += nbytes; | ||
| 1507 | sg_miter_stop(sg_miter); | ||
| 1508 | host->sg = NULL; | ||
| 1509 | |||
| 1510 | smp_wmb(); | ||
| 1511 | |||
| 1512 | set_bit(EVENT_DATA_ERROR, &host->pending_events); | ||
| 1513 | |||
| 1514 | tasklet_schedule(&host->tasklet); | ||
| 1515 | return; | ||
| 1516 | } | ||
| 1517 | } while (status & SDMMC_INT_TXDR); /* if TXDR write again */ | 1527 | } while (status & SDMMC_INT_TXDR); /* if TXDR write again */ |
| 1518 | data->bytes_xfered += nbytes; | 1528 | data->bytes_xfered += nbytes; |
| 1519 | 1529 | ||
| @@ -1547,12 +1557,11 @@ static void dw_mci_cmd_interrupt(struct dw_mci *host, u32 status) | |||
| 1547 | static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) | 1557 | static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) |
| 1548 | { | 1558 | { |
| 1549 | struct dw_mci *host = dev_id; | 1559 | struct dw_mci *host = dev_id; |
| 1550 | u32 status, pending; | 1560 | u32 pending; |
| 1551 | unsigned int pass_count = 0; | 1561 | unsigned int pass_count = 0; |
| 1552 | int i; | 1562 | int i; |
| 1553 | 1563 | ||
| 1554 | do { | 1564 | do { |
| 1555 | status = mci_readl(host, RINTSTS); | ||
| 1556 | pending = mci_readl(host, MINTSTS); /* read-only mask reg */ | 1565 | pending = mci_readl(host, MINTSTS); /* read-only mask reg */ |
| 1557 | 1566 | ||
| 1558 | /* | 1567 | /* |
| @@ -1570,7 +1579,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) | |||
| 1570 | 1579 | ||
| 1571 | if (pending & DW_MCI_CMD_ERROR_FLAGS) { | 1580 | if (pending & DW_MCI_CMD_ERROR_FLAGS) { |
| 1572 | mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS); | 1581 | mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS); |
| 1573 | host->cmd_status = status; | 1582 | host->cmd_status = pending; |
| 1574 | smp_wmb(); | 1583 | smp_wmb(); |
| 1575 | set_bit(EVENT_CMD_COMPLETE, &host->pending_events); | 1584 | set_bit(EVENT_CMD_COMPLETE, &host->pending_events); |
| 1576 | } | 1585 | } |
| @@ -1578,18 +1587,16 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) | |||
| 1578 | if (pending & DW_MCI_DATA_ERROR_FLAGS) { | 1587 | if (pending & DW_MCI_DATA_ERROR_FLAGS) { |
| 1579 | /* if there is an error report DATA_ERROR */ | 1588 | /* if there is an error report DATA_ERROR */ |
| 1580 | mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS); | 1589 | mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS); |
| 1581 | host->data_status = status; | 1590 | host->data_status = pending; |
| 1582 | smp_wmb(); | 1591 | smp_wmb(); |
| 1583 | set_bit(EVENT_DATA_ERROR, &host->pending_events); | 1592 | set_bit(EVENT_DATA_ERROR, &host->pending_events); |
| 1584 | if (!(pending & (SDMMC_INT_DTO | SDMMC_INT_DCRC | | 1593 | tasklet_schedule(&host->tasklet); |
| 1585 | SDMMC_INT_SBE | SDMMC_INT_EBE))) | ||
| 1586 | tasklet_schedule(&host->tasklet); | ||
| 1587 | } | 1594 | } |
| 1588 | 1595 | ||
| 1589 | if (pending & SDMMC_INT_DATA_OVER) { | 1596 | if (pending & SDMMC_INT_DATA_OVER) { |
| 1590 | mci_writel(host, RINTSTS, SDMMC_INT_DATA_OVER); | 1597 | mci_writel(host, RINTSTS, SDMMC_INT_DATA_OVER); |
| 1591 | if (!host->data_status) | 1598 | if (!host->data_status) |
| 1592 | host->data_status = status; | 1599 | host->data_status = pending; |
| 1593 | smp_wmb(); | 1600 | smp_wmb(); |
| 1594 | if (host->dir_status == DW_MCI_RECV_STATUS) { | 1601 | if (host->dir_status == DW_MCI_RECV_STATUS) { |
| 1595 | if (host->sg != NULL) | 1602 | if (host->sg != NULL) |
| @@ -1613,7 +1620,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) | |||
| 1613 | 1620 | ||
| 1614 | if (pending & SDMMC_INT_CMD_DONE) { | 1621 | if (pending & SDMMC_INT_CMD_DONE) { |
| 1615 | mci_writel(host, RINTSTS, SDMMC_INT_CMD_DONE); | 1622 | mci_writel(host, RINTSTS, SDMMC_INT_CMD_DONE); |
| 1616 | dw_mci_cmd_interrupt(host, status); | 1623 | dw_mci_cmd_interrupt(host, pending); |
| 1617 | } | 1624 | } |
| 1618 | 1625 | ||
| 1619 | if (pending & SDMMC_INT_CD) { | 1626 | if (pending & SDMMC_INT_CD) { |
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c index a51f9309ffbb..ad3fcea1269e 100644 --- a/drivers/mmc/host/mxs-mmc.c +++ b/drivers/mmc/host/mxs-mmc.c | |||
| @@ -285,11 +285,11 @@ static irqreturn_t mxs_mmc_irq_handler(int irq, void *dev_id) | |||
| 285 | writel(stat & MXS_MMC_IRQ_BITS, | 285 | writel(stat & MXS_MMC_IRQ_BITS, |
| 286 | host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR); | 286 | host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR); |
| 287 | 287 | ||
| 288 | spin_unlock(&host->lock); | ||
| 289 | |||
| 288 | if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN)) | 290 | if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN)) |
| 289 | mmc_signal_sdio_irq(host->mmc); | 291 | mmc_signal_sdio_irq(host->mmc); |
| 290 | 292 | ||
| 291 | spin_unlock(&host->lock); | ||
| 292 | |||
| 293 | if (stat & BM_SSP_CTRL1_RESP_TIMEOUT_IRQ) | 293 | if (stat & BM_SSP_CTRL1_RESP_TIMEOUT_IRQ) |
| 294 | cmd->error = -ETIMEDOUT; | 294 | cmd->error = -ETIMEDOUT; |
| 295 | else if (stat & BM_SSP_CTRL1_RESP_ERR_IRQ) | 295 | else if (stat & BM_SSP_CTRL1_RESP_ERR_IRQ) |
| @@ -644,11 +644,6 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) | |||
| 644 | host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); | 644 | host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); |
| 645 | writel(BM_SSP_CTRL1_SDIO_IRQ_EN, | 645 | writel(BM_SSP_CTRL1_SDIO_IRQ_EN, |
| 646 | host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_SET); | 646 | host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_SET); |
| 647 | |||
| 648 | if (readl(host->base + HW_SSP_STATUS(host)) & | ||
| 649 | BM_SSP_STATUS_SDIO_IRQ) | ||
| 650 | mmc_signal_sdio_irq(host->mmc); | ||
| 651 | |||
| 652 | } else { | 647 | } else { |
| 653 | writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, | 648 | writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, |
| 654 | host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR); | 649 | host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_CLR); |
| @@ -657,6 +652,11 @@ static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable) | |||
| 657 | } | 652 | } |
| 658 | 653 | ||
| 659 | spin_unlock_irqrestore(&host->lock, flags); | 654 | spin_unlock_irqrestore(&host->lock, flags); |
| 655 | |||
| 656 | if (enable && readl(host->base + HW_SSP_STATUS(host)) & | ||
| 657 | BM_SSP_STATUS_SDIO_IRQ) | ||
| 658 | mmc_signal_sdio_irq(host->mmc); | ||
| 659 | |||
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | static const struct mmc_host_ops mxs_mmc_ops = { | 662 | static const struct mmc_host_ops mxs_mmc_ops = { |
diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index 50e08f03aa65..a5999a74496a 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c | |||
| @@ -668,7 +668,7 @@ mmc_omap_clk_timer(unsigned long data) | |||
| 668 | static void | 668 | static void |
| 669 | mmc_omap_xfer_data(struct mmc_omap_host *host, int write) | 669 | mmc_omap_xfer_data(struct mmc_omap_host *host, int write) |
| 670 | { | 670 | { |
| 671 | int n; | 671 | int n, nwords; |
| 672 | 672 | ||
| 673 | if (host->buffer_bytes_left == 0) { | 673 | if (host->buffer_bytes_left == 0) { |
| 674 | host->sg_idx++; | 674 | host->sg_idx++; |
| @@ -678,15 +678,23 @@ mmc_omap_xfer_data(struct mmc_omap_host *host, int write) | |||
| 678 | n = 64; | 678 | n = 64; |
| 679 | if (n > host->buffer_bytes_left) | 679 | if (n > host->buffer_bytes_left) |
| 680 | n = host->buffer_bytes_left; | 680 | n = host->buffer_bytes_left; |
| 681 | |||
| 682 | nwords = n / 2; | ||
| 683 | nwords += n & 1; /* handle odd number of bytes to transfer */ | ||
| 684 | |||
| 681 | host->buffer_bytes_left -= n; | 685 | host->buffer_bytes_left -= n; |
| 682 | host->total_bytes_left -= n; | 686 | host->total_bytes_left -= n; |
| 683 | host->data->bytes_xfered += n; | 687 | host->data->bytes_xfered += n; |
| 684 | 688 | ||
| 685 | if (write) { | 689 | if (write) { |
| 686 | __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA), host->buffer, n); | 690 | __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA), |
| 691 | host->buffer, nwords); | ||
| 687 | } else { | 692 | } else { |
| 688 | __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA), host->buffer, n); | 693 | __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA), |
| 694 | host->buffer, nwords); | ||
| 689 | } | 695 | } |
| 696 | |||
| 697 | host->buffer += nwords; | ||
| 690 | } | 698 | } |
| 691 | 699 | ||
| 692 | static inline void mmc_omap_report_irq(u16 status) | 700 | static inline void mmc_omap_report_irq(u16 status) |
diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h index b97b2f5dafdb..d25f9ab9a54d 100644 --- a/drivers/mmc/host/sdhci-esdhc.h +++ b/drivers/mmc/host/sdhci-esdhc.h | |||
| @@ -48,14 +48,14 @@ static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock) | |||
| 48 | int div = 1; | 48 | int div = 1; |
| 49 | u32 temp; | 49 | u32 temp; |
| 50 | 50 | ||
| 51 | if (clock == 0) | ||
| 52 | goto out; | ||
| 53 | |||
| 51 | temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); | 54 | temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); |
| 52 | temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN | 55 | temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
| 53 | | ESDHC_CLOCK_MASK); | 56 | | ESDHC_CLOCK_MASK); |
| 54 | sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL); | 57 | sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL); |
| 55 | 58 | ||
| 56 | if (clock == 0) | ||
| 57 | goto out; | ||
| 58 | |||
| 59 | while (host->max_clk / pre_div / 16 > clock && pre_div < 256) | 59 | while (host->max_clk / pre_div / 16 > clock && pre_div < 256) |
| 60 | pre_div *= 2; | 60 | pre_div *= 2; |
| 61 | 61 | ||
diff --git a/drivers/mtd/ubi/vtbl.c b/drivers/mtd/ubi/vtbl.c index 437bc193e170..568307cc7caf 100644 --- a/drivers/mtd/ubi/vtbl.c +++ b/drivers/mtd/ubi/vtbl.c | |||
| @@ -340,7 +340,7 @@ retry: | |||
| 340 | * of this LEB as it will be deleted and freed in 'ubi_add_to_av()'. | 340 | * of this LEB as it will be deleted and freed in 'ubi_add_to_av()'. |
| 341 | */ | 341 | */ |
| 342 | err = ubi_add_to_av(ubi, ai, new_aeb->pnum, new_aeb->ec, vid_hdr, 0); | 342 | err = ubi_add_to_av(ubi, ai, new_aeb->pnum, new_aeb->ec, vid_hdr, 0); |
| 343 | kfree(new_aeb); | 343 | kmem_cache_free(ai->aeb_slab_cache, new_aeb); |
| 344 | ubi_free_vid_hdr(ubi, vid_hdr); | 344 | ubi_free_vid_hdr(ubi, vid_hdr); |
| 345 | return err; | 345 | return err; |
| 346 | 346 | ||
| @@ -353,7 +353,7 @@ write_error: | |||
| 353 | list_add(&new_aeb->u.list, &ai->erase); | 353 | list_add(&new_aeb->u.list, &ai->erase); |
| 354 | goto retry; | 354 | goto retry; |
| 355 | } | 355 | } |
| 356 | kfree(new_aeb); | 356 | kmem_cache_free(ai->aeb_slab_cache, new_aeb); |
| 357 | out_free: | 357 | out_free: |
| 358 | ubi_free_vid_hdr(ubi, vid_hdr); | 358 | ubi_free_vid_hdr(ubi, vid_hdr); |
| 359 | return err; | 359 | return err; |
diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c index 98ee43819911..7edadee487ba 100644 --- a/drivers/net/can/janz-ican3.c +++ b/drivers/net/can/janz-ican3.c | |||
| @@ -1391,7 +1391,6 @@ static irqreturn_t ican3_irq(int irq, void *dev_id) | |||
| 1391 | */ | 1391 | */ |
| 1392 | static int ican3_reset_module(struct ican3_dev *mod) | 1392 | static int ican3_reset_module(struct ican3_dev *mod) |
| 1393 | { | 1393 | { |
| 1394 | u8 val = 1 << mod->num; | ||
| 1395 | unsigned long start; | 1394 | unsigned long start; |
| 1396 | u8 runold, runnew; | 1395 | u8 runold, runnew; |
| 1397 | 1396 | ||
| @@ -1405,8 +1404,7 @@ static int ican3_reset_module(struct ican3_dev *mod) | |||
| 1405 | runold = ioread8(mod->dpm + TARGET_RUNNING); | 1404 | runold = ioread8(mod->dpm + TARGET_RUNNING); |
| 1406 | 1405 | ||
| 1407 | /* reset the module */ | 1406 | /* reset the module */ |
| 1408 | iowrite8(val, &mod->ctrl->reset_assert); | 1407 | iowrite8(0x00, &mod->dpmctrl->hwreset); |
| 1409 | iowrite8(val, &mod->ctrl->reset_deassert); | ||
| 1410 | 1408 | ||
| 1411 | /* wait until the module has finished resetting and is running */ | 1409 | /* wait until the module has finished resetting and is running */ |
| 1412 | start = jiffies; | 1410 | start = jiffies; |
diff --git a/drivers/net/can/mcp251x.c b/drivers/net/can/mcp251x.c index a580db29e503..26e7129332ab 100644 --- a/drivers/net/can/mcp251x.c +++ b/drivers/net/can/mcp251x.c | |||
| @@ -83,6 +83,11 @@ | |||
| 83 | #define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n)) | 83 | #define INSTRUCTION_LOAD_TXB(n) (0x40 + 2 * (n)) |
| 84 | #define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94) | 84 | #define INSTRUCTION_READ_RXB(n) (((n) == 0) ? 0x90 : 0x94) |
| 85 | #define INSTRUCTION_RESET 0xC0 | 85 | #define INSTRUCTION_RESET 0xC0 |
| 86 | #define RTS_TXB0 0x01 | ||
| 87 | #define RTS_TXB1 0x02 | ||
| 88 | #define RTS_TXB2 0x04 | ||
| 89 | #define INSTRUCTION_RTS(n) (0x80 | ((n) & 0x07)) | ||
| 90 | |||
| 86 | 91 | ||
| 87 | /* MPC251x registers */ | 92 | /* MPC251x registers */ |
| 88 | #define CANSTAT 0x0e | 93 | #define CANSTAT 0x0e |
| @@ -397,6 +402,7 @@ static void mcp251x_hw_tx_frame(struct spi_device *spi, u8 *buf, | |||
| 397 | static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, | 402 | static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, |
| 398 | int tx_buf_idx) | 403 | int tx_buf_idx) |
| 399 | { | 404 | { |
| 405 | struct mcp251x_priv *priv = dev_get_drvdata(&spi->dev); | ||
| 400 | u32 sid, eid, exide, rtr; | 406 | u32 sid, eid, exide, rtr; |
| 401 | u8 buf[SPI_TRANSFER_BUF_LEN]; | 407 | u8 buf[SPI_TRANSFER_BUF_LEN]; |
| 402 | 408 | ||
| @@ -418,7 +424,10 @@ static void mcp251x_hw_tx(struct spi_device *spi, struct can_frame *frame, | |||
| 418 | buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; | 424 | buf[TXBDLC_OFF] = (rtr << DLC_RTR_SHIFT) | frame->can_dlc; |
| 419 | memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); | 425 | memcpy(buf + TXBDAT_OFF, frame->data, frame->can_dlc); |
| 420 | mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); | 426 | mcp251x_hw_tx_frame(spi, buf, frame->can_dlc, tx_buf_idx); |
| 421 | mcp251x_write_reg(spi, TXBCTRL(tx_buf_idx), TXBCTRL_TXREQ); | 427 | |
| 428 | /* use INSTRUCTION_RTS, to avoid "repeated frame problem" */ | ||
| 429 | priv->spi_tx_buf[0] = INSTRUCTION_RTS(1 << tx_buf_idx); | ||
| 430 | mcp251x_spi_trans(priv->spi, 1); | ||
| 422 | } | 431 | } |
| 423 | 432 | ||
| 424 | static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, | 433 | static void mcp251x_hw_rx_frame(struct spi_device *spi, u8 *buf, |
diff --git a/drivers/net/can/sja1000/sja1000_platform.c b/drivers/net/can/sja1000/sja1000_platform.c index 4f50145f6483..662c5f7eb0c5 100644 --- a/drivers/net/can/sja1000/sja1000_platform.c +++ b/drivers/net/can/sja1000/sja1000_platform.c | |||
| @@ -109,7 +109,9 @@ static int sp_probe(struct platform_device *pdev) | |||
| 109 | priv = netdev_priv(dev); | 109 | priv = netdev_priv(dev); |
| 110 | 110 | ||
| 111 | dev->irq = res_irq->start; | 111 | dev->irq = res_irq->start; |
| 112 | priv->irq_flags = res_irq->flags & (IRQF_TRIGGER_MASK | IRQF_SHARED); | 112 | priv->irq_flags = res_irq->flags & IRQF_TRIGGER_MASK; |
| 113 | if (res_irq->flags & IORESOURCE_IRQ_SHAREABLE) | ||
| 114 | priv->irq_flags |= IRQF_SHARED; | ||
| 113 | priv->reg_base = addr; | 115 | priv->reg_base = addr; |
| 114 | /* The CAN clock frequency is half the oscillator clock frequency */ | 116 | /* The CAN clock frequency is half the oscillator clock frequency */ |
| 115 | priv->can.clock.freq = pdata->osc_freq / 2; | 117 | priv->can.clock.freq = pdata->osc_freq / 2; |
diff --git a/drivers/net/can/softing/softing_fw.c b/drivers/net/can/softing/softing_fw.c index 310596175676..b595d3422b9f 100644 --- a/drivers/net/can/softing/softing_fw.c +++ b/drivers/net/can/softing/softing_fw.c | |||
| @@ -150,7 +150,7 @@ int softing_load_fw(const char *file, struct softing *card, | |||
| 150 | const uint8_t *mem, *end, *dat; | 150 | const uint8_t *mem, *end, *dat; |
| 151 | uint16_t type, len; | 151 | uint16_t type, len; |
| 152 | uint32_t addr; | 152 | uint32_t addr; |
| 153 | uint8_t *buf = NULL; | 153 | uint8_t *buf = NULL, *new_buf; |
| 154 | int buflen = 0; | 154 | int buflen = 0; |
| 155 | int8_t type_end = 0; | 155 | int8_t type_end = 0; |
| 156 | 156 | ||
| @@ -199,11 +199,12 @@ int softing_load_fw(const char *file, struct softing *card, | |||
| 199 | if (len > buflen) { | 199 | if (len > buflen) { |
| 200 | /* align buflen */ | 200 | /* align buflen */ |
| 201 | buflen = (len + (1024-1)) & ~(1024-1); | 201 | buflen = (len + (1024-1)) & ~(1024-1); |
| 202 | buf = krealloc(buf, buflen, GFP_KERNEL); | 202 | new_buf = krealloc(buf, buflen, GFP_KERNEL); |
| 203 | if (!buf) { | 203 | if (!new_buf) { |
| 204 | ret = -ENOMEM; | 204 | ret = -ENOMEM; |
| 205 | goto failed; | 205 | goto failed; |
| 206 | } | 206 | } |
| 207 | buf = new_buf; | ||
| 207 | } | 208 | } |
| 208 | /* verify record data */ | 209 | /* verify record data */ |
| 209 | memcpy_fromio(buf, &dpram[addr + offset], len); | 210 | memcpy_fromio(buf, &dpram[addr + offset], len); |
diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c index 527dbcf95335..9ded21e79db5 100644 --- a/drivers/net/can/ti_hecc.c +++ b/drivers/net/can/ti_hecc.c | |||
| @@ -984,12 +984,12 @@ static int __devexit ti_hecc_remove(struct platform_device *pdev) | |||
| 984 | struct net_device *ndev = platform_get_drvdata(pdev); | 984 | struct net_device *ndev = platform_get_drvdata(pdev); |
| 985 | struct ti_hecc_priv *priv = netdev_priv(ndev); | 985 | struct ti_hecc_priv *priv = netdev_priv(ndev); |
| 986 | 986 | ||
| 987 | unregister_candev(ndev); | ||
| 987 | clk_disable(priv->clk); | 988 | clk_disable(priv->clk); |
| 988 | clk_put(priv->clk); | 989 | clk_put(priv->clk); |
| 989 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 990 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 990 | iounmap(priv->base); | 991 | iounmap(priv->base); |
| 991 | release_mem_region(res->start, resource_size(res)); | 992 | release_mem_region(res->start, resource_size(res)); |
| 992 | unregister_candev(ndev); | ||
| 993 | free_candev(ndev); | 993 | free_candev(ndev); |
| 994 | platform_set_drvdata(pdev, NULL); | 994 | platform_set_drvdata(pdev, NULL); |
| 995 | 995 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 463b9ec57d80..6d1a24acb77e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | |||
| @@ -1708,9 +1708,6 @@ struct bnx2x_func_init_params { | |||
| 1708 | continue; \ | 1708 | continue; \ |
| 1709 | else | 1709 | else |
| 1710 | 1710 | ||
| 1711 | #define for_each_napi_rx_queue(bp, var) \ | ||
| 1712 | for ((var) = 0; (var) < bp->num_napi_queues; (var)++) | ||
| 1713 | |||
| 1714 | /* Skip OOO FP */ | 1711 | /* Skip OOO FP */ |
| 1715 | #define for_each_tx_queue(bp, var) \ | 1712 | #define for_each_tx_queue(bp, var) \ |
| 1716 | for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \ | 1713 | for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \ |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index e879e19eb0d6..e8e97a7d1d06 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -662,14 +662,16 @@ void bnx2x_csum_validate(struct sk_buff *skb, union eth_rx_cqe *cqe, | |||
| 662 | struct bnx2x_fastpath *fp, | 662 | struct bnx2x_fastpath *fp, |
| 663 | struct bnx2x_eth_q_stats *qstats) | 663 | struct bnx2x_eth_q_stats *qstats) |
| 664 | { | 664 | { |
| 665 | /* Do nothing if no IP/L4 csum validation was done */ | 665 | /* Do nothing if no L4 csum validation was done. |
| 666 | 666 | * We do not check whether IP csum was validated. For IPv4 we assume | |
| 667 | * that if the card got as far as validating the L4 csum, it also | ||
| 668 | * validated the IP csum. IPv6 has no IP csum. | ||
| 669 | */ | ||
| 667 | if (cqe->fast_path_cqe.status_flags & | 670 | if (cqe->fast_path_cqe.status_flags & |
| 668 | (ETH_FAST_PATH_RX_CQE_IP_XSUM_NO_VALIDATION_FLG | | 671 | ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG) |
| 669 | ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG)) | ||
| 670 | return; | 672 | return; |
| 671 | 673 | ||
| 672 | /* If both IP/L4 validation were done, check if an error was found. */ | 674 | /* If L4 validation was done, check if an error was found. */ |
| 673 | 675 | ||
| 674 | if (cqe->fast_path_cqe.type_error_flags & | 676 | if (cqe->fast_path_cqe.type_error_flags & |
| 675 | (ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG | | 677 | (ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG | |
| @@ -2046,6 +2048,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
| 2046 | */ | 2048 | */ |
| 2047 | bnx2x_setup_tc(bp->dev, bp->max_cos); | 2049 | bnx2x_setup_tc(bp->dev, bp->max_cos); |
| 2048 | 2050 | ||
| 2051 | /* Add all NAPI objects */ | ||
| 2052 | bnx2x_add_all_napi(bp); | ||
| 2049 | bnx2x_napi_enable(bp); | 2053 | bnx2x_napi_enable(bp); |
| 2050 | 2054 | ||
| 2051 | /* set pf load just before approaching the MCP */ | 2055 | /* set pf load just before approaching the MCP */ |
| @@ -2408,6 +2412,8 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode) | |||
| 2408 | 2412 | ||
| 2409 | /* Disable HW interrupts, NAPI */ | 2413 | /* Disable HW interrupts, NAPI */ |
| 2410 | bnx2x_netif_stop(bp, 1); | 2414 | bnx2x_netif_stop(bp, 1); |
| 2415 | /* Delete all NAPI objects */ | ||
| 2416 | bnx2x_del_all_napi(bp); | ||
| 2411 | 2417 | ||
| 2412 | /* Release IRQs */ | 2418 | /* Release IRQs */ |
| 2413 | bnx2x_free_irq(bp); | 2419 | bnx2x_free_irq(bp); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h index dfa757e74296..dfd86a55f1dc 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.h | |||
| @@ -710,17 +710,15 @@ static inline u16 bnx2x_tx_avail(struct bnx2x *bp, | |||
| 710 | prod = txdata->tx_bd_prod; | 710 | prod = txdata->tx_bd_prod; |
| 711 | cons = txdata->tx_bd_cons; | 711 | cons = txdata->tx_bd_cons; |
| 712 | 712 | ||
| 713 | /* NUM_TX_RINGS = number of "next-page" entries | 713 | used = SUB_S16(prod, cons); |
| 714 | It will be used as a threshold */ | ||
| 715 | used = SUB_S16(prod, cons) + (s16)NUM_TX_RINGS; | ||
| 716 | 714 | ||
| 717 | #ifdef BNX2X_STOP_ON_ERROR | 715 | #ifdef BNX2X_STOP_ON_ERROR |
| 718 | WARN_ON(used < 0); | 716 | WARN_ON(used < 0); |
| 719 | WARN_ON(used > bp->tx_ring_size); | 717 | WARN_ON(used > txdata->tx_ring_size); |
| 720 | WARN_ON((bp->tx_ring_size - used) > MAX_TX_AVAIL); | 718 | WARN_ON((txdata->tx_ring_size - used) > MAX_TX_AVAIL); |
| 721 | #endif | 719 | #endif |
| 722 | 720 | ||
| 723 | return (s16)(bp->tx_ring_size) - used; | 721 | return (s16)(txdata->tx_ring_size) - used; |
| 724 | } | 722 | } |
| 725 | 723 | ||
| 726 | static inline int bnx2x_tx_queue_has_work(struct bnx2x_fp_txdata *txdata) | 724 | static inline int bnx2x_tx_queue_has_work(struct bnx2x_fp_txdata *txdata) |
| @@ -792,7 +790,7 @@ static inline void bnx2x_add_all_napi(struct bnx2x *bp) | |||
| 792 | bp->num_napi_queues = bp->num_queues; | 790 | bp->num_napi_queues = bp->num_queues; |
| 793 | 791 | ||
| 794 | /* Add NAPI objects */ | 792 | /* Add NAPI objects */ |
| 795 | for_each_napi_rx_queue(bp, i) | 793 | for_each_rx_queue(bp, i) |
| 796 | netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), | 794 | netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), |
| 797 | bnx2x_poll, BNX2X_NAPI_WEIGHT); | 795 | bnx2x_poll, BNX2X_NAPI_WEIGHT); |
| 798 | } | 796 | } |
| @@ -801,7 +799,7 @@ static inline void bnx2x_del_all_napi(struct bnx2x *bp) | |||
| 801 | { | 799 | { |
| 802 | int i; | 800 | int i; |
| 803 | 801 | ||
| 804 | for_each_napi_rx_queue(bp, i) | 802 | for_each_rx_queue(bp, i) |
| 805 | netif_napi_del(&bnx2x_fp(bp, i, napi)); | 803 | netif_napi_del(&bnx2x_fp(bp, i, napi)); |
| 806 | } | 804 | } |
| 807 | 805 | ||
| @@ -1088,6 +1086,7 @@ static inline void bnx2x_init_txdata(struct bnx2x *bp, | |||
| 1088 | txdata->txq_index = txq_index; | 1086 | txdata->txq_index = txq_index; |
| 1089 | txdata->tx_cons_sb = tx_cons_sb; | 1087 | txdata->tx_cons_sb = tx_cons_sb; |
| 1090 | txdata->parent_fp = fp; | 1088 | txdata->parent_fp = fp; |
| 1089 | txdata->tx_ring_size = IS_FCOE_FP(fp) ? MAX_TX_AVAIL : bp->tx_ring_size; | ||
| 1091 | 1090 | ||
| 1092 | DP(NETIF_MSG_IFUP, "created tx data cid %d, txq %d\n", | 1091 | DP(NETIF_MSG_IFUP, "created tx data cid %d, txq %d\n", |
| 1093 | txdata->cid, txdata->txq_index); | 1092 | txdata->cid, txdata->txq_index); |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h index 3e4cff9b1ebe..b926f58e983b 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_dump.h | |||
| @@ -401,11 +401,11 @@ static const struct reg_addr reg_addrs[] = { | |||
| 401 | { 0x70000, 8, RI_ALL_ONLINE }, | 401 | { 0x70000, 8, RI_ALL_ONLINE }, |
| 402 | { 0x70020, 8184, RI_ALL_OFFLINE }, | 402 | { 0x70020, 8184, RI_ALL_OFFLINE }, |
| 403 | { 0x78000, 8192, RI_E3E3B0_OFFLINE }, | 403 | { 0x78000, 8192, RI_E3E3B0_OFFLINE }, |
| 404 | { 0x85000, 3, RI_ALL_ONLINE }, | 404 | { 0x85000, 3, RI_ALL_OFFLINE }, |
| 405 | { 0x8501c, 7, RI_ALL_ONLINE }, | 405 | { 0x8501c, 7, RI_ALL_OFFLINE }, |
| 406 | { 0x85048, 1, RI_ALL_ONLINE }, | 406 | { 0x85048, 1, RI_ALL_OFFLINE }, |
| 407 | { 0x85200, 32, RI_ALL_ONLINE }, | 407 | { 0x85200, 32, RI_ALL_OFFLINE }, |
| 408 | { 0xb0000, 16384, RI_E1H_ONLINE }, | 408 | { 0xb0000, 16384, RI_E1H_OFFLINE }, |
| 409 | { 0xc1000, 7, RI_ALL_ONLINE }, | 409 | { 0xc1000, 7, RI_ALL_ONLINE }, |
| 410 | { 0xc103c, 2, RI_E2E3E3B0_ONLINE }, | 410 | { 0xc103c, 2, RI_E2E3E3B0_ONLINE }, |
| 411 | { 0xc1800, 2, RI_ALL_ONLINE }, | 411 | { 0xc1800, 2, RI_ALL_ONLINE }, |
| @@ -581,17 +581,12 @@ static const struct reg_addr reg_addrs[] = { | |||
| 581 | { 0x140188, 3, RI_E1E1HE2E3_ONLINE }, | 581 | { 0x140188, 3, RI_E1E1HE2E3_ONLINE }, |
| 582 | { 0x140194, 13, RI_ALL_ONLINE }, | 582 | { 0x140194, 13, RI_ALL_ONLINE }, |
| 583 | { 0x140200, 6, RI_E1E1HE2E3_ONLINE }, | 583 | { 0x140200, 6, RI_E1E1HE2E3_ONLINE }, |
| 584 | { 0x140220, 4, RI_E2E3_ONLINE }, | ||
| 585 | { 0x140240, 4, RI_E2E3_ONLINE }, | ||
| 586 | { 0x140260, 4, RI_E2E3_ONLINE }, | 584 | { 0x140260, 4, RI_E2E3_ONLINE }, |
| 587 | { 0x140280, 4, RI_E2E3_ONLINE }, | 585 | { 0x140280, 4, RI_E2E3_ONLINE }, |
| 588 | { 0x1402a0, 4, RI_E2E3_ONLINE }, | ||
| 589 | { 0x1402c0, 4, RI_E2E3_ONLINE }, | ||
| 590 | { 0x1402e0, 2, RI_E2E3_ONLINE }, | 586 | { 0x1402e0, 2, RI_E2E3_ONLINE }, |
| 591 | { 0x1402e8, 2, RI_E2E3E3B0_ONLINE }, | 587 | { 0x1402e8, 2, RI_E2E3E3B0_ONLINE }, |
| 592 | { 0x1402f0, 9, RI_E2E3_ONLINE }, | 588 | { 0x1402f0, 9, RI_E2E3_ONLINE }, |
| 593 | { 0x140314, 44, RI_E3B0_ONLINE }, | 589 | { 0x140314, 44, RI_E3B0_ONLINE }, |
| 594 | { 0x1403d0, 70, RI_E3B0_ONLINE }, | ||
| 595 | { 0x144000, 4, RI_E1E1H_ONLINE }, | 590 | { 0x144000, 4, RI_E1E1H_ONLINE }, |
| 596 | { 0x148000, 4, RI_E1E1H_ONLINE }, | 591 | { 0x148000, 4, RI_E1E1H_ONLINE }, |
| 597 | { 0x14c000, 4, RI_E1E1H_ONLINE }, | 592 | { 0x14c000, 4, RI_E1E1H_ONLINE }, |
| @@ -704,7 +699,6 @@ static const struct reg_addr reg_addrs[] = { | |||
| 704 | { 0x180398, 1, RI_E2E3E3B0_ONLINE }, | 699 | { 0x180398, 1, RI_E2E3E3B0_ONLINE }, |
| 705 | { 0x1803a0, 5, RI_E2E3E3B0_ONLINE }, | 700 | { 0x1803a0, 5, RI_E2E3E3B0_ONLINE }, |
| 706 | { 0x1803b4, 2, RI_E3E3B0_ONLINE }, | 701 | { 0x1803b4, 2, RI_E3E3B0_ONLINE }, |
| 707 | { 0x180400, 1, RI_ALL_ONLINE }, | ||
| 708 | { 0x180404, 255, RI_E1E1H_OFFLINE }, | 702 | { 0x180404, 255, RI_E1E1H_OFFLINE }, |
| 709 | { 0x181000, 4, RI_ALL_ONLINE }, | 703 | { 0x181000, 4, RI_ALL_ONLINE }, |
| 710 | { 0x181010, 1020, RI_ALL_OFFLINE }, | 704 | { 0x181010, 1020, RI_ALL_OFFLINE }, |
| @@ -800,9 +794,9 @@ static const struct reg_addr reg_addrs[] = { | |||
| 800 | { 0x1b905c, 1, RI_E3E3B0_ONLINE }, | 794 | { 0x1b905c, 1, RI_E3E3B0_ONLINE }, |
| 801 | { 0x1b9064, 1, RI_E3B0_ONLINE }, | 795 | { 0x1b9064, 1, RI_E3B0_ONLINE }, |
| 802 | { 0x1b9080, 10, RI_E3B0_ONLINE }, | 796 | { 0x1b9080, 10, RI_E3B0_ONLINE }, |
| 803 | { 0x1b9400, 14, RI_E2E3E3B0_ONLINE }, | 797 | { 0x1b9400, 14, RI_E2E3E3B0_OFFLINE }, |
| 804 | { 0x1b943c, 19, RI_E2E3E3B0_ONLINE }, | 798 | { 0x1b943c, 19, RI_E2E3E3B0_OFFLINE }, |
| 805 | { 0x1b9490, 10, RI_E2E3E3B0_ONLINE }, | 799 | { 0x1b9490, 10, RI_E2E3E3B0_OFFLINE }, |
| 806 | { 0x1c0000, 2, RI_ALL_ONLINE }, | 800 | { 0x1c0000, 2, RI_ALL_ONLINE }, |
| 807 | { 0x200000, 65, RI_ALL_ONLINE }, | 801 | { 0x200000, 65, RI_ALL_ONLINE }, |
| 808 | { 0x20014c, 2, RI_E1HE2E3E3B0_ONLINE }, | 802 | { 0x20014c, 2, RI_E1HE2E3E3B0_ONLINE }, |
| @@ -814,7 +808,6 @@ static const struct reg_addr reg_addrs[] = { | |||
| 814 | { 0x200398, 1, RI_E2E3E3B0_ONLINE }, | 808 | { 0x200398, 1, RI_E2E3E3B0_ONLINE }, |
| 815 | { 0x2003a0, 1, RI_E2E3E3B0_ONLINE }, | 809 | { 0x2003a0, 1, RI_E2E3E3B0_ONLINE }, |
| 816 | { 0x2003a8, 2, RI_E2E3E3B0_ONLINE }, | 810 | { 0x2003a8, 2, RI_E2E3E3B0_ONLINE }, |
| 817 | { 0x200400, 1, RI_ALL_ONLINE }, | ||
| 818 | { 0x200404, 255, RI_E1E1H_OFFLINE }, | 811 | { 0x200404, 255, RI_E1E1H_OFFLINE }, |
| 819 | { 0x202000, 4, RI_ALL_ONLINE }, | 812 | { 0x202000, 4, RI_ALL_ONLINE }, |
| 820 | { 0x202010, 2044, RI_ALL_OFFLINE }, | 813 | { 0x202010, 2044, RI_ALL_OFFLINE }, |
| @@ -921,7 +914,6 @@ static const struct reg_addr reg_addrs[] = { | |||
| 921 | { 0x280398, 1, RI_E2E3E3B0_ONLINE }, | 914 | { 0x280398, 1, RI_E2E3E3B0_ONLINE }, |
| 922 | { 0x2803a0, 1, RI_E2E3E3B0_ONLINE }, | 915 | { 0x2803a0, 1, RI_E2E3E3B0_ONLINE }, |
| 923 | { 0x2803a8, 2, RI_E2E3E3B0_ONLINE }, | 916 | { 0x2803a8, 2, RI_E2E3E3B0_ONLINE }, |
| 924 | { 0x280400, 1, RI_ALL_ONLINE }, | ||
| 925 | { 0x280404, 255, RI_E1E1H_OFFLINE }, | 917 | { 0x280404, 255, RI_E1E1H_OFFLINE }, |
| 926 | { 0x282000, 4, RI_ALL_ONLINE }, | 918 | { 0x282000, 4, RI_ALL_ONLINE }, |
| 927 | { 0x282010, 2044, RI_ALL_OFFLINE }, | 919 | { 0x282010, 2044, RI_ALL_OFFLINE }, |
| @@ -1031,7 +1023,6 @@ static const struct reg_addr reg_addrs[] = { | |||
| 1031 | { 0x300398, 1, RI_E2E3E3B0_ONLINE }, | 1023 | { 0x300398, 1, RI_E2E3E3B0_ONLINE }, |
| 1032 | { 0x3003a0, 1, RI_E2E3E3B0_ONLINE }, | 1024 | { 0x3003a0, 1, RI_E2E3E3B0_ONLINE }, |
| 1033 | { 0x3003a8, 2, RI_E2E3E3B0_ONLINE }, | 1025 | { 0x3003a8, 2, RI_E2E3E3B0_ONLINE }, |
| 1034 | { 0x300400, 1, RI_ALL_ONLINE }, | ||
| 1035 | { 0x300404, 255, RI_E1E1H_OFFLINE }, | 1026 | { 0x300404, 255, RI_E1E1H_OFFLINE }, |
| 1036 | { 0x302000, 4, RI_ALL_ONLINE }, | 1027 | { 0x302000, 4, RI_ALL_ONLINE }, |
| 1037 | { 0x302010, 2044, RI_ALL_OFFLINE }, | 1028 | { 0x302010, 2044, RI_ALL_OFFLINE }, |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c index fc4e0e3885b0..ebf40cd7aa10 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | |||
| @@ -775,7 +775,7 @@ static void bnx2x_get_regs(struct net_device *dev, | |||
| 775 | struct bnx2x *bp = netdev_priv(dev); | 775 | struct bnx2x *bp = netdev_priv(dev); |
| 776 | struct dump_hdr dump_hdr = {0}; | 776 | struct dump_hdr dump_hdr = {0}; |
| 777 | 777 | ||
| 778 | regs->version = 0; | 778 | regs->version = 1; |
| 779 | memset(p, 0, regs->len); | 779 | memset(p, 0, regs->len); |
| 780 | 780 | ||
| 781 | if (!netif_running(bp->dev)) | 781 | if (!netif_running(bp->dev)) |
| @@ -1587,6 +1587,12 @@ static int bnx2x_set_pauseparam(struct net_device *dev, | |||
| 1587 | bp->link_params.req_flow_ctrl[cfg_idx] = | 1587 | bp->link_params.req_flow_ctrl[cfg_idx] = |
| 1588 | BNX2X_FLOW_CTRL_AUTO; | 1588 | BNX2X_FLOW_CTRL_AUTO; |
| 1589 | } | 1589 | } |
| 1590 | bp->link_params.req_fc_auto_adv = BNX2X_FLOW_CTRL_NONE; | ||
| 1591 | if (epause->rx_pause) | ||
| 1592 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_RX; | ||
| 1593 | |||
| 1594 | if (epause->tx_pause) | ||
| 1595 | bp->link_params.req_fc_auto_adv |= BNX2X_FLOW_CTRL_TX; | ||
| 1590 | } | 1596 | } |
| 1591 | 1597 | ||
| 1592 | DP(BNX2X_MSG_ETHTOOL, | 1598 | DP(BNX2X_MSG_ETHTOOL, |
| @@ -2888,11 +2894,9 @@ static void bnx2x_get_channels(struct net_device *dev, | |||
| 2888 | */ | 2894 | */ |
| 2889 | static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss) | 2895 | static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss) |
| 2890 | { | 2896 | { |
| 2891 | bnx2x_del_all_napi(bp); | ||
| 2892 | bnx2x_disable_msi(bp); | 2897 | bnx2x_disable_msi(bp); |
| 2893 | BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE; | 2898 | BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE; |
| 2894 | bnx2x_set_int_mode(bp); | 2899 | bnx2x_set_int_mode(bp); |
| 2895 | bnx2x_add_all_napi(bp); | ||
| 2896 | } | 2900 | } |
| 2897 | 2901 | ||
| 2898 | /** | 2902 | /** |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c index f4beb46c4709..b046beb435b2 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | |||
| @@ -2667,9 +2667,11 @@ int bnx2x_update_pfc(struct link_params *params, | |||
| 2667 | return bnx2x_status; | 2667 | return bnx2x_status; |
| 2668 | 2668 | ||
| 2669 | DP(NETIF_MSG_LINK, "About to update PFC in BMAC\n"); | 2669 | DP(NETIF_MSG_LINK, "About to update PFC in BMAC\n"); |
| 2670 | if (CHIP_IS_E3(bp)) | 2670 | |
| 2671 | bnx2x_update_pfc_xmac(params, vars, 0); | 2671 | if (CHIP_IS_E3(bp)) { |
| 2672 | else { | 2672 | if (vars->mac_type == MAC_TYPE_XMAC) |
| 2673 | bnx2x_update_pfc_xmac(params, vars, 0); | ||
| 2674 | } else { | ||
| 2673 | val = REG_RD(bp, MISC_REG_RESET_REG_2); | 2675 | val = REG_RD(bp, MISC_REG_RESET_REG_2); |
| 2674 | if ((val & | 2676 | if ((val & |
| 2675 | (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) | 2677 | (MISC_REGISTERS_RESET_REG_2_RST_BMAC0 << params->port)) |
| @@ -5432,7 +5434,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy, | |||
| 5432 | switch (speed_mask) { | 5434 | switch (speed_mask) { |
| 5433 | case GP_STATUS_10M: | 5435 | case GP_STATUS_10M: |
| 5434 | vars->line_speed = SPEED_10; | 5436 | vars->line_speed = SPEED_10; |
| 5435 | if (vars->duplex == DUPLEX_FULL) | 5437 | if (is_duplex == DUPLEX_FULL) |
| 5436 | vars->link_status |= LINK_10TFD; | 5438 | vars->link_status |= LINK_10TFD; |
| 5437 | else | 5439 | else |
| 5438 | vars->link_status |= LINK_10THD; | 5440 | vars->link_status |= LINK_10THD; |
| @@ -5440,7 +5442,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy, | |||
| 5440 | 5442 | ||
| 5441 | case GP_STATUS_100M: | 5443 | case GP_STATUS_100M: |
| 5442 | vars->line_speed = SPEED_100; | 5444 | vars->line_speed = SPEED_100; |
| 5443 | if (vars->duplex == DUPLEX_FULL) | 5445 | if (is_duplex == DUPLEX_FULL) |
| 5444 | vars->link_status |= LINK_100TXFD; | 5446 | vars->link_status |= LINK_100TXFD; |
| 5445 | else | 5447 | else |
| 5446 | vars->link_status |= LINK_100TXHD; | 5448 | vars->link_status |= LINK_100TXHD; |
| @@ -5449,7 +5451,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy, | |||
| 5449 | case GP_STATUS_1G: | 5451 | case GP_STATUS_1G: |
| 5450 | case GP_STATUS_1G_KX: | 5452 | case GP_STATUS_1G_KX: |
| 5451 | vars->line_speed = SPEED_1000; | 5453 | vars->line_speed = SPEED_1000; |
| 5452 | if (vars->duplex == DUPLEX_FULL) | 5454 | if (is_duplex == DUPLEX_FULL) |
| 5453 | vars->link_status |= LINK_1000TFD; | 5455 | vars->link_status |= LINK_1000TFD; |
| 5454 | else | 5456 | else |
| 5455 | vars->link_status |= LINK_1000THD; | 5457 | vars->link_status |= LINK_1000THD; |
| @@ -5457,7 +5459,7 @@ static int bnx2x_get_link_speed_duplex(struct bnx2x_phy *phy, | |||
| 5457 | 5459 | ||
| 5458 | case GP_STATUS_2_5G: | 5460 | case GP_STATUS_2_5G: |
| 5459 | vars->line_speed = SPEED_2500; | 5461 | vars->line_speed = SPEED_2500; |
| 5460 | if (vars->duplex == DUPLEX_FULL) | 5462 | if (is_duplex == DUPLEX_FULL) |
| 5461 | vars->link_status |= LINK_2500TFD; | 5463 | vars->link_status |= LINK_2500TFD; |
| 5462 | else | 5464 | else |
| 5463 | vars->link_status |= LINK_2500THD; | 5465 | vars->link_status |= LINK_2500THD; |
| @@ -5531,6 +5533,7 @@ static int bnx2x_link_settings_status(struct bnx2x_phy *phy, | |||
| 5531 | 5533 | ||
| 5532 | if (gp_status & MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS) { | 5534 | if (gp_status & MDIO_GP_STATUS_TOP_AN_STATUS1_LINK_STATUS) { |
| 5533 | if (SINGLE_MEDIA_DIRECT(params)) { | 5535 | if (SINGLE_MEDIA_DIRECT(params)) { |
| 5536 | vars->duplex = duplex; | ||
| 5534 | bnx2x_flow_ctrl_resolve(phy, params, vars, gp_status); | 5537 | bnx2x_flow_ctrl_resolve(phy, params, vars, gp_status); |
| 5535 | if (phy->req_line_speed == SPEED_AUTO_NEG) | 5538 | if (phy->req_line_speed == SPEED_AUTO_NEG) |
| 5536 | bnx2x_xgxs_an_resolve(phy, params, vars, | 5539 | bnx2x_xgxs_an_resolve(phy, params, vars, |
| @@ -5625,6 +5628,7 @@ static int bnx2x_warpcore_read_status(struct bnx2x_phy *phy, | |||
| 5625 | LINK_STATUS_PARALLEL_DETECTION_USED; | 5628 | LINK_STATUS_PARALLEL_DETECTION_USED; |
| 5626 | } | 5629 | } |
| 5627 | bnx2x_ext_phy_resolve_fc(phy, params, vars); | 5630 | bnx2x_ext_phy_resolve_fc(phy, params, vars); |
| 5631 | vars->duplex = duplex; | ||
| 5628 | } | 5632 | } |
| 5629 | } | 5633 | } |
| 5630 | 5634 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index 02b5a343b195..0875ecfe3372 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
| @@ -7561,8 +7561,14 @@ int bnx2x_set_mac_one(struct bnx2x *bp, u8 *mac, | |||
| 7561 | } | 7561 | } |
| 7562 | 7562 | ||
| 7563 | rc = bnx2x_config_vlan_mac(bp, &ramrod_param); | 7563 | rc = bnx2x_config_vlan_mac(bp, &ramrod_param); |
| 7564 | if (rc < 0) | 7564 | |
| 7565 | if (rc == -EEXIST) { | ||
| 7566 | DP(BNX2X_MSG_SP, "Failed to schedule ADD operations: %d\n", rc); | ||
| 7567 | /* do not treat adding same MAC as error */ | ||
| 7568 | rc = 0; | ||
| 7569 | } else if (rc < 0) | ||
| 7565 | BNX2X_ERR("%s MAC failed\n", (set ? "Set" : "Del")); | 7570 | BNX2X_ERR("%s MAC failed\n", (set ? "Set" : "Del")); |
| 7571 | |||
| 7566 | return rc; | 7572 | return rc; |
| 7567 | } | 7573 | } |
| 7568 | 7574 | ||
| @@ -8427,6 +8433,8 @@ unload_error: | |||
| 8427 | 8433 | ||
| 8428 | /* Disable HW interrupts, NAPI */ | 8434 | /* Disable HW interrupts, NAPI */ |
| 8429 | bnx2x_netif_stop(bp, 1); | 8435 | bnx2x_netif_stop(bp, 1); |
| 8436 | /* Delete all NAPI objects */ | ||
| 8437 | bnx2x_del_all_napi(bp); | ||
| 8430 | 8438 | ||
| 8431 | /* Release IRQs */ | 8439 | /* Release IRQs */ |
| 8432 | bnx2x_free_irq(bp); | 8440 | bnx2x_free_irq(bp); |
| @@ -9823,12 +9831,13 @@ static void __devinit bnx2x_get_igu_cam_info(struct bnx2x *bp) | |||
| 9823 | } | 9831 | } |
| 9824 | 9832 | ||
| 9825 | #ifdef CONFIG_PCI_MSI | 9833 | #ifdef CONFIG_PCI_MSI |
| 9826 | /* | 9834 | /* Due to new PF resource allocation by MFW T7.4 and above, it's |
| 9827 | * It's expected that number of CAM entries for this functions is equal | 9835 | * optional that number of CAM entries will not be equal to the value |
| 9828 | * to the number evaluated based on the MSI-X table size. We want a | 9836 | * advertised in PCI. |
| 9829 | * harsh warning if these values are different! | 9837 | * Driver should use the minimal value of both as the actual status |
| 9838 | * block count | ||
| 9830 | */ | 9839 | */ |
| 9831 | WARN_ON(bp->igu_sb_cnt != igu_sb_cnt); | 9840 | bp->igu_sb_cnt = min_t(int, bp->igu_sb_cnt, igu_sb_cnt); |
| 9832 | #endif | 9841 | #endif |
| 9833 | 9842 | ||
| 9834 | if (igu_sb_cnt == 0) | 9843 | if (igu_sb_cnt == 0) |
| @@ -10292,13 +10301,11 @@ static void __devinit bnx2x_get_fcoe_info(struct bnx2x *bp) | |||
| 10292 | dev_info.port_hw_config[port]. | 10301 | dev_info.port_hw_config[port]. |
| 10293 | fcoe_wwn_node_name_lower); | 10302 | fcoe_wwn_node_name_lower); |
| 10294 | } else if (!IS_MF_SD(bp)) { | 10303 | } else if (!IS_MF_SD(bp)) { |
| 10295 | u32 cfg = MF_CFG_RD(bp, func_ext_config[func].func_cfg); | ||
| 10296 | |||
| 10297 | /* | 10304 | /* |
| 10298 | * Read the WWN info only if the FCoE feature is enabled for | 10305 | * Read the WWN info only if the FCoE feature is enabled for |
| 10299 | * this function. | 10306 | * this function. |
| 10300 | */ | 10307 | */ |
| 10301 | if (cfg & MACP_FUNC_CFG_FLAGS_FCOE_OFFLOAD) | 10308 | if (BNX2X_MF_EXT_PROTOCOL_FCOE(bp) && !CHIP_IS_E1x(bp)) |
| 10302 | bnx2x_get_ext_wwn_info(bp, func); | 10309 | bnx2x_get_ext_wwn_info(bp, func); |
| 10303 | 10310 | ||
| 10304 | } else if (IS_MF_FCOE_SD(bp)) | 10311 | } else if (IS_MF_FCOE_SD(bp)) |
| @@ -11071,7 +11078,14 @@ static int bnx2x_set_uc_list(struct bnx2x *bp) | |||
| 11071 | netdev_for_each_uc_addr(ha, dev) { | 11078 | netdev_for_each_uc_addr(ha, dev) { |
| 11072 | rc = bnx2x_set_mac_one(bp, bnx2x_uc_addr(ha), mac_obj, true, | 11079 | rc = bnx2x_set_mac_one(bp, bnx2x_uc_addr(ha), mac_obj, true, |
| 11073 | BNX2X_UC_LIST_MAC, &ramrod_flags); | 11080 | BNX2X_UC_LIST_MAC, &ramrod_flags); |
| 11074 | if (rc < 0) { | 11081 | if (rc == -EEXIST) { |
| 11082 | DP(BNX2X_MSG_SP, | ||
| 11083 | "Failed to schedule ADD operations: %d\n", rc); | ||
| 11084 | /* do not treat adding same MAC as error */ | ||
| 11085 | rc = 0; | ||
| 11086 | |||
| 11087 | } else if (rc < 0) { | ||
| 11088 | |||
| 11075 | BNX2X_ERR("Failed to schedule ADD operations: %d\n", | 11089 | BNX2X_ERR("Failed to schedule ADD operations: %d\n", |
| 11076 | rc); | 11090 | rc); |
| 11077 | return rc; | 11091 | return rc; |
| @@ -11229,10 +11243,12 @@ static int bnx2x_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) | |||
| 11229 | static void poll_bnx2x(struct net_device *dev) | 11243 | static void poll_bnx2x(struct net_device *dev) |
| 11230 | { | 11244 | { |
| 11231 | struct bnx2x *bp = netdev_priv(dev); | 11245 | struct bnx2x *bp = netdev_priv(dev); |
| 11246 | int i; | ||
| 11232 | 11247 | ||
| 11233 | disable_irq(bp->pdev->irq); | 11248 | for_each_eth_queue(bp, i) { |
| 11234 | bnx2x_interrupt(bp->pdev->irq, dev); | 11249 | struct bnx2x_fastpath *fp = &bp->fp[i]; |
| 11235 | enable_irq(bp->pdev->irq); | 11250 | napi_schedule(&bnx2x_fp(bp, fp->index, napi)); |
| 11251 | } | ||
| 11236 | } | 11252 | } |
| 11237 | #endif | 11253 | #endif |
| 11238 | 11254 | ||
| @@ -11899,9 +11915,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, | |||
| 11899 | */ | 11915 | */ |
| 11900 | bnx2x_set_int_mode(bp); | 11916 | bnx2x_set_int_mode(bp); |
| 11901 | 11917 | ||
| 11902 | /* Add all NAPI objects */ | ||
| 11903 | bnx2x_add_all_napi(bp); | ||
| 11904 | |||
| 11905 | rc = register_netdev(dev); | 11918 | rc = register_netdev(dev); |
| 11906 | if (rc) { | 11919 | if (rc) { |
| 11907 | dev_err(&pdev->dev, "Cannot register net device\n"); | 11920 | dev_err(&pdev->dev, "Cannot register net device\n"); |
| @@ -11976,9 +11989,6 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev) | |||
| 11976 | 11989 | ||
| 11977 | unregister_netdev(dev); | 11990 | unregister_netdev(dev); |
| 11978 | 11991 | ||
| 11979 | /* Delete all NAPI objects */ | ||
| 11980 | bnx2x_del_all_napi(bp); | ||
| 11981 | |||
| 11982 | /* Power on: we can't let PCI layer write to us while we are in D3 */ | 11992 | /* Power on: we can't let PCI layer write to us while we are in D3 */ |
| 11983 | bnx2x_set_power_state(bp, PCI_D0); | 11993 | bnx2x_set_power_state(bp, PCI_D0); |
| 11984 | 11994 | ||
| @@ -12025,6 +12035,8 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp) | |||
| 12025 | bnx2x_tx_disable(bp); | 12035 | bnx2x_tx_disable(bp); |
| 12026 | 12036 | ||
| 12027 | bnx2x_netif_stop(bp, 0); | 12037 | bnx2x_netif_stop(bp, 0); |
| 12038 | /* Delete all NAPI objects */ | ||
| 12039 | bnx2x_del_all_napi(bp); | ||
| 12028 | 12040 | ||
| 12029 | del_timer_sync(&bp->timer); | 12041 | del_timer_sync(&bp->timer); |
| 12030 | 12042 | ||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c index 332db64dd5be..a1d0446b39b3 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c | |||
| @@ -101,6 +101,11 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp) | |||
| 101 | if (CHIP_REV_IS_SLOW(bp)) | 101 | if (CHIP_REV_IS_SLOW(bp)) |
| 102 | return; | 102 | return; |
| 103 | 103 | ||
| 104 | /* Update MCP's statistics if possible */ | ||
| 105 | if (bp->func_stx) | ||
| 106 | memcpy(bnx2x_sp(bp, func_stats), &bp->func_stats, | ||
| 107 | sizeof(bp->func_stats)); | ||
| 108 | |||
| 104 | /* loader */ | 109 | /* loader */ |
| 105 | if (bp->executer_idx) { | 110 | if (bp->executer_idx) { |
| 106 | int loader_idx = PMF_DMAE_C(bp); | 111 | int loader_idx = PMF_DMAE_C(bp); |
| @@ -128,8 +133,6 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp) | |||
| 128 | 133 | ||
| 129 | } else if (bp->func_stx) { | 134 | } else if (bp->func_stx) { |
| 130 | *stats_comp = 0; | 135 | *stats_comp = 0; |
| 131 | memcpy(bnx2x_sp(bp, func_stats), &bp->func_stats, | ||
| 132 | sizeof(bp->func_stats)); | ||
| 133 | bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp)); | 136 | bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp)); |
| 134 | } | 137 | } |
| 135 | } | 138 | } |
| @@ -1151,9 +1154,11 @@ static void bnx2x_stats_update(struct bnx2x *bp) | |||
| 1151 | if (bp->port.pmf) | 1154 | if (bp->port.pmf) |
| 1152 | bnx2x_hw_stats_update(bp); | 1155 | bnx2x_hw_stats_update(bp); |
| 1153 | 1156 | ||
| 1154 | if (bnx2x_storm_stats_update(bp) && (bp->stats_pending++ == 3)) { | 1157 | if (bnx2x_storm_stats_update(bp)) { |
| 1155 | BNX2X_ERR("storm stats were not updated for 3 times\n"); | 1158 | if (bp->stats_pending++ == 3) { |
| 1156 | bnx2x_panic(); | 1159 | BNX2X_ERR("storm stats were not updated for 3 times\n"); |
| 1160 | bnx2x_panic(); | ||
| 1161 | } | ||
| 1157 | return; | 1162 | return; |
| 1158 | } | 1163 | } |
| 1159 | 1164 | ||
diff --git a/drivers/net/ethernet/cadence/at91_ether.c b/drivers/net/ethernet/cadence/at91_ether.c index 77884191a8c6..4e980a7886fb 100644 --- a/drivers/net/ethernet/cadence/at91_ether.c +++ b/drivers/net/ethernet/cadence/at91_ether.c | |||
| @@ -1086,7 +1086,7 @@ static int __init at91ether_probe(struct platform_device *pdev) | |||
| 1086 | /* Clock */ | 1086 | /* Clock */ |
| 1087 | lp->ether_clk = clk_get(&pdev->dev, "ether_clk"); | 1087 | lp->ether_clk = clk_get(&pdev->dev, "ether_clk"); |
| 1088 | if (IS_ERR(lp->ether_clk)) { | 1088 | if (IS_ERR(lp->ether_clk)) { |
| 1089 | res = -ENODEV; | 1089 | res = PTR_ERR(lp->ether_clk); |
| 1090 | goto err_ioumap; | 1090 | goto err_ioumap; |
| 1091 | } | 1091 | } |
| 1092 | clk_enable(lp->ether_clk); | 1092 | clk_enable(lp->ether_clk); |
diff --git a/drivers/net/ethernet/cirrus/cs89x0.c b/drivers/net/ethernet/cirrus/cs89x0.c index 845b2020f291..138446957786 100644 --- a/drivers/net/ethernet/cirrus/cs89x0.c +++ b/drivers/net/ethernet/cirrus/cs89x0.c | |||
| @@ -1243,6 +1243,7 @@ static void set_multicast_list(struct net_device *dev) | |||
| 1243 | { | 1243 | { |
| 1244 | struct net_local *lp = netdev_priv(dev); | 1244 | struct net_local *lp = netdev_priv(dev); |
| 1245 | unsigned long flags; | 1245 | unsigned long flags; |
| 1246 | u16 cfg; | ||
| 1246 | 1247 | ||
| 1247 | spin_lock_irqsave(&lp->lock, flags); | 1248 | spin_lock_irqsave(&lp->lock, flags); |
| 1248 | if (dev->flags & IFF_PROMISC) | 1249 | if (dev->flags & IFF_PROMISC) |
| @@ -1260,11 +1261,10 @@ static void set_multicast_list(struct net_device *dev) | |||
| 1260 | /* in promiscuous mode, we accept errored packets, | 1261 | /* in promiscuous mode, we accept errored packets, |
| 1261 | * so we have to enable interrupts on them also | 1262 | * so we have to enable interrupts on them also |
| 1262 | */ | 1263 | */ |
| 1263 | writereg(dev, PP_RxCFG, | 1264 | cfg = lp->curr_rx_cfg; |
| 1264 | (lp->curr_rx_cfg | | 1265 | if (lp->rx_mode == RX_ALL_ACCEPT) |
| 1265 | (lp->rx_mode == RX_ALL_ACCEPT) | 1266 | cfg |= RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL; |
| 1266 | ? (RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL) | 1267 | writereg(dev, PP_RxCFG, cfg); |
| 1267 | : 0)); | ||
| 1268 | spin_unlock_irqrestore(&lp->lock, flags); | 1268 | spin_unlock_irqrestore(&lp->lock, flags); |
| 1269 | } | 1269 | } |
| 1270 | 1270 | ||
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c index 7fac97b4bb59..8c63d06ab12b 100644 --- a/drivers/net/ethernet/emulex/benet/be_cmds.c +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c | |||
| @@ -259,7 +259,7 @@ int be_process_mcc(struct be_adapter *adapter) | |||
| 259 | int num = 0, status = 0; | 259 | int num = 0, status = 0; |
| 260 | struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; | 260 | struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; |
| 261 | 261 | ||
| 262 | spin_lock_bh(&adapter->mcc_cq_lock); | 262 | spin_lock(&adapter->mcc_cq_lock); |
| 263 | while ((compl = be_mcc_compl_get(adapter))) { | 263 | while ((compl = be_mcc_compl_get(adapter))) { |
| 264 | if (compl->flags & CQE_FLAGS_ASYNC_MASK) { | 264 | if (compl->flags & CQE_FLAGS_ASYNC_MASK) { |
| 265 | /* Interpret flags as an async trailer */ | 265 | /* Interpret flags as an async trailer */ |
| @@ -280,7 +280,7 @@ int be_process_mcc(struct be_adapter *adapter) | |||
| 280 | if (num) | 280 | if (num) |
| 281 | be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num); | 281 | be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num); |
| 282 | 282 | ||
| 283 | spin_unlock_bh(&adapter->mcc_cq_lock); | 283 | spin_unlock(&adapter->mcc_cq_lock); |
| 284 | return status; | 284 | return status; |
| 285 | } | 285 | } |
| 286 | 286 | ||
| @@ -295,7 +295,9 @@ static int be_mcc_wait_compl(struct be_adapter *adapter) | |||
| 295 | if (be_error(adapter)) | 295 | if (be_error(adapter)) |
| 296 | return -EIO; | 296 | return -EIO; |
| 297 | 297 | ||
| 298 | local_bh_disable(); | ||
| 298 | status = be_process_mcc(adapter); | 299 | status = be_process_mcc(adapter); |
| 300 | local_bh_enable(); | ||
| 299 | 301 | ||
| 300 | if (atomic_read(&mcc_obj->q.used) == 0) | 302 | if (atomic_read(&mcc_obj->q.used) == 0) |
| 301 | break; | 303 | break; |
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 90a903d83d87..78b8aa8069f0 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
| @@ -3763,7 +3763,9 @@ static void be_worker(struct work_struct *work) | |||
| 3763 | /* when interrupts are not yet enabled, just reap any pending | 3763 | /* when interrupts are not yet enabled, just reap any pending |
| 3764 | * mcc completions */ | 3764 | * mcc completions */ |
| 3765 | if (!netif_running(adapter->netdev)) { | 3765 | if (!netif_running(adapter->netdev)) { |
| 3766 | local_bh_disable(); | ||
| 3766 | be_process_mcc(adapter); | 3767 | be_process_mcc(adapter); |
| 3768 | local_bh_enable(); | ||
| 3767 | goto reschedule; | 3769 | goto reschedule; |
| 3768 | } | 3770 | } |
| 3769 | 3771 | ||
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 4605f7246687..d3233f59a82e 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c | |||
| @@ -1041,7 +1041,7 @@ static int gfar_probe(struct platform_device *ofdev) | |||
| 1041 | 1041 | ||
| 1042 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) { | 1042 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) { |
| 1043 | dev->hw_features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1043 | dev->hw_features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; |
| 1044 | dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX; | 1044 | dev->features |= NETIF_F_HW_VLAN_RX; |
| 1045 | } | 1045 | } |
| 1046 | 1046 | ||
| 1047 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) { | 1047 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) { |
diff --git a/drivers/net/ethernet/freescale/gianfar_ethtool.c b/drivers/net/ethernet/freescale/gianfar_ethtool.c index 8971921cc1c8..ab6762caa957 100644 --- a/drivers/net/ethernet/freescale/gianfar_ethtool.c +++ b/drivers/net/ethernet/freescale/gianfar_ethtool.c | |||
| @@ -1773,6 +1773,7 @@ static int gfar_get_nfc(struct net_device *dev, struct ethtool_rxnfc *cmd, | |||
| 1773 | } | 1773 | } |
| 1774 | 1774 | ||
| 1775 | int gfar_phc_index = -1; | 1775 | int gfar_phc_index = -1; |
| 1776 | EXPORT_SYMBOL(gfar_phc_index); | ||
| 1776 | 1777 | ||
| 1777 | static int gfar_get_ts_info(struct net_device *dev, | 1778 | static int gfar_get_ts_info(struct net_device *dev, |
| 1778 | struct ethtool_ts_info *info) | 1779 | struct ethtool_ts_info *info) |
diff --git a/drivers/net/ethernet/freescale/gianfar_ptp.c b/drivers/net/ethernet/freescale/gianfar_ptp.c index c08e5d40fecb..0daa66b8eca0 100644 --- a/drivers/net/ethernet/freescale/gianfar_ptp.c +++ b/drivers/net/ethernet/freescale/gianfar_ptp.c | |||
| @@ -515,7 +515,7 @@ static int gianfar_ptp_probe(struct platform_device *dev) | |||
| 515 | err = PTR_ERR(etsects->clock); | 515 | err = PTR_ERR(etsects->clock); |
| 516 | goto no_clock; | 516 | goto no_clock; |
| 517 | } | 517 | } |
| 518 | gfar_phc_clock = ptp_clock_index(etsects->clock); | 518 | gfar_phc_index = ptp_clock_index(etsects->clock); |
| 519 | 519 | ||
| 520 | dev_set_drvdata(&dev->dev, etsects); | 520 | dev_set_drvdata(&dev->dev, etsects); |
| 521 | 521 | ||
| @@ -539,7 +539,7 @@ static int gianfar_ptp_remove(struct platform_device *dev) | |||
| 539 | gfar_write(&etsects->regs->tmr_temask, 0); | 539 | gfar_write(&etsects->regs->tmr_temask, 0); |
| 540 | gfar_write(&etsects->regs->tmr_ctrl, 0); | 540 | gfar_write(&etsects->regs->tmr_ctrl, 0); |
| 541 | 541 | ||
| 542 | gfar_phc_clock = -1; | 542 | gfar_phc_index = -1; |
| 543 | ptp_clock_unregister(etsects->clock); | 543 | ptp_clock_unregister(etsects->clock); |
| 544 | iounmap(etsects->regs); | 544 | iounmap(etsects->regs); |
| 545 | release_resource(etsects->rsrc); | 545 | release_resource(etsects->rsrc); |
diff --git a/drivers/net/ethernet/i825xx/znet.c b/drivers/net/ethernet/i825xx/znet.c index bd1f1ef91e19..ba4e0cea3506 100644 --- a/drivers/net/ethernet/i825xx/znet.c +++ b/drivers/net/ethernet/i825xx/znet.c | |||
| @@ -139,8 +139,11 @@ struct znet_private { | |||
| 139 | /* Only one can be built-in;-> */ | 139 | /* Only one can be built-in;-> */ |
| 140 | static struct net_device *znet_dev; | 140 | static struct net_device *znet_dev; |
| 141 | 141 | ||
| 142 | #define NETIDBLK_MAGIC "NETIDBLK" | ||
| 143 | #define NETIDBLK_MAGIC_SIZE 8 | ||
| 144 | |||
| 142 | struct netidblk { | 145 | struct netidblk { |
| 143 | char magic[8]; /* The magic number (string) "NETIDBLK" */ | 146 | char magic[NETIDBLK_MAGIC_SIZE]; /* The magic number (string) "NETIDBLK" */ |
| 144 | unsigned char netid[8]; /* The physical station address */ | 147 | unsigned char netid[8]; /* The physical station address */ |
| 145 | char nettype, globalopt; | 148 | char nettype, globalopt; |
| 146 | char vendor[8]; /* The machine vendor and product name. */ | 149 | char vendor[8]; /* The machine vendor and product name. */ |
| @@ -373,14 +376,16 @@ static int __init znet_probe (void) | |||
| 373 | struct znet_private *znet; | 376 | struct znet_private *znet; |
| 374 | struct net_device *dev; | 377 | struct net_device *dev; |
| 375 | char *p; | 378 | char *p; |
| 379 | char *plast = phys_to_virt(0x100000 - NETIDBLK_MAGIC_SIZE); | ||
| 376 | int err = -ENOMEM; | 380 | int err = -ENOMEM; |
| 377 | 381 | ||
| 378 | /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */ | 382 | /* This code scans the region 0xf0000 to 0xfffff for a "NETIDBLK". */ |
| 379 | for(p = (char *)phys_to_virt(0xf0000); p < (char *)phys_to_virt(0x100000); p++) | 383 | for(p = (char *)phys_to_virt(0xf0000); p <= plast; p++) |
| 380 | if (*p == 'N' && strncmp(p, "NETIDBLK", 8) == 0) | 384 | if (*p == 'N' && |
| 385 | strncmp(p, NETIDBLK_MAGIC, NETIDBLK_MAGIC_SIZE) == 0) | ||
| 381 | break; | 386 | break; |
| 382 | 387 | ||
| 383 | if (p >= (char *)phys_to_virt(0x100000)) { | 388 | if (p > plast) { |
| 384 | if (znet_debug > 1) | 389 | if (znet_debug > 1) |
| 385 | printk(KERN_INFO "No Z-Note ethernet adaptor found.\n"); | 390 | printk(KERN_INFO "No Z-Note ethernet adaptor found.\n"); |
| 386 | return -ENODEV; | 391 | return -ENODEV; |
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c index 9010cea68bc3..b68d28a130e6 100644 --- a/drivers/net/ethernet/ibm/ibmveth.c +++ b/drivers/net/ethernet/ibm/ibmveth.c | |||
| @@ -472,14 +472,9 @@ static void ibmveth_cleanup(struct ibmveth_adapter *adapter) | |||
| 472 | } | 472 | } |
| 473 | 473 | ||
| 474 | if (adapter->rx_queue.queue_addr != NULL) { | 474 | if (adapter->rx_queue.queue_addr != NULL) { |
| 475 | if (!dma_mapping_error(dev, adapter->rx_queue.queue_dma)) { | 475 | dma_free_coherent(dev, adapter->rx_queue.queue_len, |
| 476 | dma_unmap_single(dev, | 476 | adapter->rx_queue.queue_addr, |
| 477 | adapter->rx_queue.queue_dma, | 477 | adapter->rx_queue.queue_dma); |
| 478 | adapter->rx_queue.queue_len, | ||
| 479 | DMA_BIDIRECTIONAL); | ||
| 480 | adapter->rx_queue.queue_dma = DMA_ERROR_CODE; | ||
| 481 | } | ||
| 482 | kfree(adapter->rx_queue.queue_addr); | ||
| 483 | adapter->rx_queue.queue_addr = NULL; | 478 | adapter->rx_queue.queue_addr = NULL; |
| 484 | } | 479 | } |
| 485 | 480 | ||
| @@ -556,10 +551,13 @@ static int ibmveth_open(struct net_device *netdev) | |||
| 556 | goto err_out; | 551 | goto err_out; |
| 557 | } | 552 | } |
| 558 | 553 | ||
| 554 | dev = &adapter->vdev->dev; | ||
| 555 | |||
| 559 | adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) * | 556 | adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) * |
| 560 | rxq_entries; | 557 | rxq_entries; |
| 561 | adapter->rx_queue.queue_addr = kmalloc(adapter->rx_queue.queue_len, | 558 | adapter->rx_queue.queue_addr = |
| 562 | GFP_KERNEL); | 559 | dma_alloc_coherent(dev, adapter->rx_queue.queue_len, |
| 560 | &adapter->rx_queue.queue_dma, GFP_KERNEL); | ||
| 563 | 561 | ||
| 564 | if (!adapter->rx_queue.queue_addr) { | 562 | if (!adapter->rx_queue.queue_addr) { |
| 565 | netdev_err(netdev, "unable to allocate rx queue pages\n"); | 563 | netdev_err(netdev, "unable to allocate rx queue pages\n"); |
| @@ -567,19 +565,13 @@ static int ibmveth_open(struct net_device *netdev) | |||
| 567 | goto err_out; | 565 | goto err_out; |
| 568 | } | 566 | } |
| 569 | 567 | ||
| 570 | dev = &adapter->vdev->dev; | ||
| 571 | |||
| 572 | adapter->buffer_list_dma = dma_map_single(dev, | 568 | adapter->buffer_list_dma = dma_map_single(dev, |
| 573 | adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL); | 569 | adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL); |
| 574 | adapter->filter_list_dma = dma_map_single(dev, | 570 | adapter->filter_list_dma = dma_map_single(dev, |
| 575 | adapter->filter_list_addr, 4096, DMA_BIDIRECTIONAL); | 571 | adapter->filter_list_addr, 4096, DMA_BIDIRECTIONAL); |
| 576 | adapter->rx_queue.queue_dma = dma_map_single(dev, | ||
| 577 | adapter->rx_queue.queue_addr, | ||
| 578 | adapter->rx_queue.queue_len, DMA_BIDIRECTIONAL); | ||
| 579 | 572 | ||
| 580 | if ((dma_mapping_error(dev, adapter->buffer_list_dma)) || | 573 | if ((dma_mapping_error(dev, adapter->buffer_list_dma)) || |
| 581 | (dma_mapping_error(dev, adapter->filter_list_dma)) || | 574 | (dma_mapping_error(dev, adapter->filter_list_dma))) { |
| 582 | (dma_mapping_error(dev, adapter->rx_queue.queue_dma))) { | ||
| 583 | netdev_err(netdev, "unable to map filter or buffer list " | 575 | netdev_err(netdev, "unable to map filter or buffer list " |
| 584 | "pages\n"); | 576 | "pages\n"); |
| 585 | rc = -ENOMEM; | 577 | rc = -ENOMEM; |
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 3bfbb8df8989..bde337ee1a34 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | |||
| @@ -3149,6 +3149,17 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | |||
| 3149 | return NETDEV_TX_OK; | 3149 | return NETDEV_TX_OK; |
| 3150 | } | 3150 | } |
| 3151 | 3151 | ||
| 3152 | /* On PCI/PCI-X HW, if packet size is less than ETH_ZLEN, | ||
| 3153 | * packets may get corrupted during padding by HW. | ||
| 3154 | * To WA this issue, pad all small packets manually. | ||
| 3155 | */ | ||
| 3156 | if (skb->len < ETH_ZLEN) { | ||
| 3157 | if (skb_pad(skb, ETH_ZLEN - skb->len)) | ||
| 3158 | return NETDEV_TX_OK; | ||
| 3159 | skb->len = ETH_ZLEN; | ||
| 3160 | skb_set_tail_pointer(skb, ETH_ZLEN); | ||
| 3161 | } | ||
| 3162 | |||
| 3152 | mss = skb_shinfo(skb)->gso_size; | 3163 | mss = skb_shinfo(skb)->gso_size; |
| 3153 | /* The controller does a simple calculation to | 3164 | /* The controller does a simple calculation to |
| 3154 | * make sure there is enough room in the FIFO before | 3165 | * make sure there is enough room in the FIFO before |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index cd153326c3cf..cb3356c9af80 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
| @@ -310,6 +310,7 @@ struct e1000_adapter { | |||
| 310 | */ | 310 | */ |
| 311 | struct e1000_ring *tx_ring /* One per active queue */ | 311 | struct e1000_ring *tx_ring /* One per active queue */ |
| 312 | ____cacheline_aligned_in_smp; | 312 | ____cacheline_aligned_in_smp; |
| 313 | u32 tx_fifo_limit; | ||
| 313 | 314 | ||
| 314 | struct napi_struct napi; | 315 | struct napi_struct napi; |
| 315 | 316 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 46c3b1f9ff89..d01a099475a1 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -3517,6 +3517,15 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
| 3517 | } | 3517 | } |
| 3518 | 3518 | ||
| 3519 | /* | 3519 | /* |
| 3520 | * Alignment of Tx data is on an arbitrary byte boundary with the | ||
| 3521 | * maximum size per Tx descriptor limited only to the transmit | ||
| 3522 | * allocation of the packet buffer minus 96 bytes with an upper | ||
| 3523 | * limit of 24KB due to receive synchronization limitations. | ||
| 3524 | */ | ||
| 3525 | adapter->tx_fifo_limit = min_t(u32, ((er32(PBA) >> 16) << 10) - 96, | ||
| 3526 | 24 << 10); | ||
| 3527 | |||
| 3528 | /* | ||
| 3520 | * Disable Adaptive Interrupt Moderation if 2 full packets cannot | 3529 | * Disable Adaptive Interrupt Moderation if 2 full packets cannot |
| 3521 | * fit in receive buffer. | 3530 | * fit in receive buffer. |
| 3522 | */ | 3531 | */ |
| @@ -4785,12 +4794,9 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb) | |||
| 4785 | return 1; | 4794 | return 1; |
| 4786 | } | 4795 | } |
| 4787 | 4796 | ||
| 4788 | #define E1000_MAX_PER_TXD 8192 | ||
| 4789 | #define E1000_MAX_TXD_PWR 12 | ||
| 4790 | |||
| 4791 | static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb, | 4797 | static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb, |
| 4792 | unsigned int first, unsigned int max_per_txd, | 4798 | unsigned int first, unsigned int max_per_txd, |
| 4793 | unsigned int nr_frags, unsigned int mss) | 4799 | unsigned int nr_frags) |
| 4794 | { | 4800 | { |
| 4795 | struct e1000_adapter *adapter = tx_ring->adapter; | 4801 | struct e1000_adapter *adapter = tx_ring->adapter; |
| 4796 | struct pci_dev *pdev = adapter->pdev; | 4802 | struct pci_dev *pdev = adapter->pdev; |
| @@ -5023,20 +5029,19 @@ static int __e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size) | |||
| 5023 | 5029 | ||
| 5024 | static int e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size) | 5030 | static int e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size) |
| 5025 | { | 5031 | { |
| 5032 | BUG_ON(size > tx_ring->count); | ||
| 5033 | |||
| 5026 | if (e1000_desc_unused(tx_ring) >= size) | 5034 | if (e1000_desc_unused(tx_ring) >= size) |
| 5027 | return 0; | 5035 | return 0; |
| 5028 | return __e1000_maybe_stop_tx(tx_ring, size); | 5036 | return __e1000_maybe_stop_tx(tx_ring, size); |
| 5029 | } | 5037 | } |
| 5030 | 5038 | ||
| 5031 | #define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1) | ||
| 5032 | static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | 5039 | static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, |
| 5033 | struct net_device *netdev) | 5040 | struct net_device *netdev) |
| 5034 | { | 5041 | { |
| 5035 | struct e1000_adapter *adapter = netdev_priv(netdev); | 5042 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 5036 | struct e1000_ring *tx_ring = adapter->tx_ring; | 5043 | struct e1000_ring *tx_ring = adapter->tx_ring; |
| 5037 | unsigned int first; | 5044 | unsigned int first; |
| 5038 | unsigned int max_per_txd = E1000_MAX_PER_TXD; | ||
| 5039 | unsigned int max_txd_pwr = E1000_MAX_TXD_PWR; | ||
| 5040 | unsigned int tx_flags = 0; | 5045 | unsigned int tx_flags = 0; |
| 5041 | unsigned int len = skb_headlen(skb); | 5046 | unsigned int len = skb_headlen(skb); |
| 5042 | unsigned int nr_frags; | 5047 | unsigned int nr_frags; |
| @@ -5056,18 +5061,8 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | |||
| 5056 | } | 5061 | } |
| 5057 | 5062 | ||
| 5058 | mss = skb_shinfo(skb)->gso_size; | 5063 | mss = skb_shinfo(skb)->gso_size; |
| 5059 | /* | ||
| 5060 | * The controller does a simple calculation to | ||
| 5061 | * make sure there is enough room in the FIFO before | ||
| 5062 | * initiating the DMA for each buffer. The calc is: | ||
| 5063 | * 4 = ceil(buffer len/mss). To make sure we don't | ||
| 5064 | * overrun the FIFO, adjust the max buffer len if mss | ||
| 5065 | * drops. | ||
| 5066 | */ | ||
| 5067 | if (mss) { | 5064 | if (mss) { |
| 5068 | u8 hdr_len; | 5065 | u8 hdr_len; |
| 5069 | max_per_txd = min(mss << 2, max_per_txd); | ||
| 5070 | max_txd_pwr = fls(max_per_txd) - 1; | ||
| 5071 | 5066 | ||
| 5072 | /* | 5067 | /* |
| 5073 | * TSO Workaround for 82571/2/3 Controllers -- if skb->data | 5068 | * TSO Workaround for 82571/2/3 Controllers -- if skb->data |
| @@ -5097,12 +5092,12 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | |||
| 5097 | count++; | 5092 | count++; |
| 5098 | count++; | 5093 | count++; |
| 5099 | 5094 | ||
| 5100 | count += TXD_USE_COUNT(len, max_txd_pwr); | 5095 | count += DIV_ROUND_UP(len, adapter->tx_fifo_limit); |
| 5101 | 5096 | ||
| 5102 | nr_frags = skb_shinfo(skb)->nr_frags; | 5097 | nr_frags = skb_shinfo(skb)->nr_frags; |
| 5103 | for (f = 0; f < nr_frags; f++) | 5098 | for (f = 0; f < nr_frags; f++) |
| 5104 | count += TXD_USE_COUNT(skb_frag_size(&skb_shinfo(skb)->frags[f]), | 5099 | count += DIV_ROUND_UP(skb_frag_size(&skb_shinfo(skb)->frags[f]), |
| 5105 | max_txd_pwr); | 5100 | adapter->tx_fifo_limit); |
| 5106 | 5101 | ||
| 5107 | if (adapter->hw.mac.tx_pkt_filtering) | 5102 | if (adapter->hw.mac.tx_pkt_filtering) |
| 5108 | e1000_transfer_dhcp_info(adapter, skb); | 5103 | e1000_transfer_dhcp_info(adapter, skb); |
| @@ -5144,15 +5139,18 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, | |||
| 5144 | tx_flags |= E1000_TX_FLAGS_NO_FCS; | 5139 | tx_flags |= E1000_TX_FLAGS_NO_FCS; |
| 5145 | 5140 | ||
| 5146 | /* if count is 0 then mapping error has occurred */ | 5141 | /* if count is 0 then mapping error has occurred */ |
| 5147 | count = e1000_tx_map(tx_ring, skb, first, max_per_txd, nr_frags, mss); | 5142 | count = e1000_tx_map(tx_ring, skb, first, adapter->tx_fifo_limit, |
| 5143 | nr_frags); | ||
| 5148 | if (count) { | 5144 | if (count) { |
| 5149 | skb_tx_timestamp(skb); | 5145 | skb_tx_timestamp(skb); |
| 5150 | 5146 | ||
| 5151 | netdev_sent_queue(netdev, skb->len); | 5147 | netdev_sent_queue(netdev, skb->len); |
| 5152 | e1000_tx_queue(tx_ring, tx_flags, count); | 5148 | e1000_tx_queue(tx_ring, tx_flags, count); |
| 5153 | /* Make sure there is space in the ring for the next send. */ | 5149 | /* Make sure there is space in the ring for the next send. */ |
| 5154 | e1000_maybe_stop_tx(tx_ring, MAX_SKB_FRAGS + 2); | 5150 | e1000_maybe_stop_tx(tx_ring, |
| 5155 | 5151 | (MAX_SKB_FRAGS * | |
| 5152 | DIV_ROUND_UP(PAGE_SIZE, | ||
| 5153 | adapter->tx_fifo_limit) + 2)); | ||
| 5156 | } else { | 5154 | } else { |
| 5157 | dev_kfree_skb_any(skb); | 5155 | dev_kfree_skb_any(skb); |
| 5158 | tx_ring->buffer_info[first].time_stamp = 0; | 5156 | tx_ring->buffer_info[first].time_stamp = 0; |
| @@ -6327,8 +6325,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, | |||
| 6327 | adapter->hw.phy.autoneg_advertised = 0x2f; | 6325 | adapter->hw.phy.autoneg_advertised = 0x2f; |
| 6328 | 6326 | ||
| 6329 | /* ring size defaults */ | 6327 | /* ring size defaults */ |
| 6330 | adapter->rx_ring->count = 256; | 6328 | adapter->rx_ring->count = E1000_DEFAULT_RXD; |
| 6331 | adapter->tx_ring->count = 256; | 6329 | adapter->tx_ring->count = E1000_DEFAULT_TXD; |
| 6332 | 6330 | ||
| 6333 | /* | 6331 | /* |
| 6334 | * Initial Wake on LAN setting - If APM wake is enabled in | 6332 | * Initial Wake on LAN setting - If APM wake is enabled in |
diff --git a/drivers/net/ethernet/mellanox/mlx4/icm.c b/drivers/net/ethernet/mellanox/mlx4/icm.c index daf417923661..31d02649be41 100644 --- a/drivers/net/ethernet/mellanox/mlx4/icm.c +++ b/drivers/net/ethernet/mellanox/mlx4/icm.c | |||
| @@ -227,9 +227,10 @@ int mlx4_UNMAP_ICM_AUX(struct mlx4_dev *dev) | |||
| 227 | MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); | 227 | MLX4_CMD_TIME_CLASS_B, MLX4_CMD_NATIVE); |
| 228 | } | 228 | } |
| 229 | 229 | ||
| 230 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, int obj) | 230 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj) |
| 231 | { | 231 | { |
| 232 | int i = (obj & (table->num_obj - 1)) / (MLX4_TABLE_CHUNK_SIZE / table->obj_size); | 232 | u32 i = (obj & (table->num_obj - 1)) / |
| 233 | (MLX4_TABLE_CHUNK_SIZE / table->obj_size); | ||
| 233 | int ret = 0; | 234 | int ret = 0; |
| 234 | 235 | ||
| 235 | mutex_lock(&table->mutex); | 236 | mutex_lock(&table->mutex); |
| @@ -262,16 +263,18 @@ out: | |||
| 262 | return ret; | 263 | return ret; |
| 263 | } | 264 | } |
| 264 | 265 | ||
| 265 | void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, int obj) | 266 | void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj) |
| 266 | { | 267 | { |
| 267 | int i; | 268 | u32 i; |
| 269 | u64 offset; | ||
| 268 | 270 | ||
| 269 | i = (obj & (table->num_obj - 1)) / (MLX4_TABLE_CHUNK_SIZE / table->obj_size); | 271 | i = (obj & (table->num_obj - 1)) / (MLX4_TABLE_CHUNK_SIZE / table->obj_size); |
| 270 | 272 | ||
| 271 | mutex_lock(&table->mutex); | 273 | mutex_lock(&table->mutex); |
| 272 | 274 | ||
| 273 | if (--table->icm[i]->refcount == 0) { | 275 | if (--table->icm[i]->refcount == 0) { |
| 274 | mlx4_UNMAP_ICM(dev, table->virt + i * MLX4_TABLE_CHUNK_SIZE, | 276 | offset = (u64) i * MLX4_TABLE_CHUNK_SIZE; |
| 277 | mlx4_UNMAP_ICM(dev, table->virt + offset, | ||
| 275 | MLX4_TABLE_CHUNK_SIZE / MLX4_ICM_PAGE_SIZE); | 278 | MLX4_TABLE_CHUNK_SIZE / MLX4_ICM_PAGE_SIZE); |
| 276 | mlx4_free_icm(dev, table->icm[i], table->coherent); | 279 | mlx4_free_icm(dev, table->icm[i], table->coherent); |
| 277 | table->icm[i] = NULL; | 280 | table->icm[i] = NULL; |
| @@ -280,9 +283,11 @@ void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, int obj) | |||
| 280 | mutex_unlock(&table->mutex); | 283 | mutex_unlock(&table->mutex); |
| 281 | } | 284 | } |
| 282 | 285 | ||
| 283 | void *mlx4_table_find(struct mlx4_icm_table *table, int obj, dma_addr_t *dma_handle) | 286 | void *mlx4_table_find(struct mlx4_icm_table *table, u32 obj, |
| 287 | dma_addr_t *dma_handle) | ||
| 284 | { | 288 | { |
| 285 | int idx, offset, dma_offset, i; | 289 | int offset, dma_offset, i; |
| 290 | u64 idx; | ||
| 286 | struct mlx4_icm_chunk *chunk; | 291 | struct mlx4_icm_chunk *chunk; |
| 287 | struct mlx4_icm *icm; | 292 | struct mlx4_icm *icm; |
| 288 | struct page *page = NULL; | 293 | struct page *page = NULL; |
| @@ -292,7 +297,7 @@ void *mlx4_table_find(struct mlx4_icm_table *table, int obj, dma_addr_t *dma_han | |||
| 292 | 297 | ||
| 293 | mutex_lock(&table->mutex); | 298 | mutex_lock(&table->mutex); |
| 294 | 299 | ||
| 295 | idx = (obj & (table->num_obj - 1)) * table->obj_size; | 300 | idx = (u64) (obj & (table->num_obj - 1)) * table->obj_size; |
| 296 | icm = table->icm[idx / MLX4_TABLE_CHUNK_SIZE]; | 301 | icm = table->icm[idx / MLX4_TABLE_CHUNK_SIZE]; |
| 297 | dma_offset = offset = idx % MLX4_TABLE_CHUNK_SIZE; | 302 | dma_offset = offset = idx % MLX4_TABLE_CHUNK_SIZE; |
| 298 | 303 | ||
| @@ -326,10 +331,11 @@ out: | |||
| 326 | } | 331 | } |
| 327 | 332 | ||
| 328 | int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, | 333 | int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, |
| 329 | int start, int end) | 334 | u32 start, u32 end) |
| 330 | { | 335 | { |
| 331 | int inc = MLX4_TABLE_CHUNK_SIZE / table->obj_size; | 336 | int inc = MLX4_TABLE_CHUNK_SIZE / table->obj_size; |
| 332 | int i, err; | 337 | int err; |
| 338 | u32 i; | ||
| 333 | 339 | ||
| 334 | for (i = start; i <= end; i += inc) { | 340 | for (i = start; i <= end; i += inc) { |
| 335 | err = mlx4_table_get(dev, table, i); | 341 | err = mlx4_table_get(dev, table, i); |
| @@ -349,9 +355,9 @@ fail: | |||
| 349 | } | 355 | } |
| 350 | 356 | ||
| 351 | void mlx4_table_put_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, | 357 | void mlx4_table_put_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, |
| 352 | int start, int end) | 358 | u32 start, u32 end) |
| 353 | { | 359 | { |
| 354 | int i; | 360 | u32 i; |
| 355 | 361 | ||
| 356 | for (i = start; i <= end; i += MLX4_TABLE_CHUNK_SIZE / table->obj_size) | 362 | for (i = start; i <= end; i += MLX4_TABLE_CHUNK_SIZE / table->obj_size) |
| 357 | mlx4_table_put(dev, table, i); | 363 | mlx4_table_put(dev, table, i); |
diff --git a/drivers/net/ethernet/mellanox/mlx4/icm.h b/drivers/net/ethernet/mellanox/mlx4/icm.h index a67744f53506..dee67fa39107 100644 --- a/drivers/net/ethernet/mellanox/mlx4/icm.h +++ b/drivers/net/ethernet/mellanox/mlx4/icm.h | |||
| @@ -71,17 +71,17 @@ struct mlx4_icm *mlx4_alloc_icm(struct mlx4_dev *dev, int npages, | |||
| 71 | gfp_t gfp_mask, int coherent); | 71 | gfp_t gfp_mask, int coherent); |
| 72 | void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent); | 72 | void mlx4_free_icm(struct mlx4_dev *dev, struct mlx4_icm *icm, int coherent); |
| 73 | 73 | ||
| 74 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, int obj); | 74 | int mlx4_table_get(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); |
| 75 | void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, int obj); | 75 | void mlx4_table_put(struct mlx4_dev *dev, struct mlx4_icm_table *table, u32 obj); |
| 76 | int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, | 76 | int mlx4_table_get_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, |
| 77 | int start, int end); | 77 | u32 start, u32 end); |
| 78 | void mlx4_table_put_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, | 78 | void mlx4_table_put_range(struct mlx4_dev *dev, struct mlx4_icm_table *table, |
| 79 | int start, int end); | 79 | u32 start, u32 end); |
| 80 | int mlx4_init_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table, | 80 | int mlx4_init_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table, |
| 81 | u64 virt, int obj_size, u32 nobj, int reserved, | 81 | u64 virt, int obj_size, u32 nobj, int reserved, |
| 82 | int use_lowmem, int use_coherent); | 82 | int use_lowmem, int use_coherent); |
| 83 | void mlx4_cleanup_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table); | 83 | void mlx4_cleanup_icm_table(struct mlx4_dev *dev, struct mlx4_icm_table *table); |
| 84 | void *mlx4_table_find(struct mlx4_icm_table *table, int obj, dma_addr_t *dma_handle); | 84 | void *mlx4_table_find(struct mlx4_icm_table *table, u32 obj, dma_addr_t *dma_handle); |
| 85 | 85 | ||
| 86 | static inline void mlx4_icm_first(struct mlx4_icm *icm, | 86 | static inline void mlx4_icm_first(struct mlx4_icm *icm, |
| 87 | struct mlx4_icm_iter *iter) | 87 | struct mlx4_icm_iter *iter) |
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c index 827b72dfce99..2f816c6aed72 100644 --- a/drivers/net/ethernet/mellanox/mlx4/main.c +++ b/drivers/net/ethernet/mellanox/mlx4/main.c | |||
| @@ -1234,13 +1234,13 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1234 | mlx4_info(dev, "non-primary physical function, skipping.\n"); | 1234 | mlx4_info(dev, "non-primary physical function, skipping.\n"); |
| 1235 | else | 1235 | else |
| 1236 | mlx4_err(dev, "QUERY_FW command failed, aborting.\n"); | 1236 | mlx4_err(dev, "QUERY_FW command failed, aborting.\n"); |
| 1237 | goto unmap_bf; | 1237 | return err; |
| 1238 | } | 1238 | } |
| 1239 | 1239 | ||
| 1240 | err = mlx4_load_fw(dev); | 1240 | err = mlx4_load_fw(dev); |
| 1241 | if (err) { | 1241 | if (err) { |
| 1242 | mlx4_err(dev, "Failed to start FW, aborting.\n"); | 1242 | mlx4_err(dev, "Failed to start FW, aborting.\n"); |
| 1243 | goto unmap_bf; | 1243 | return err; |
| 1244 | } | 1244 | } |
| 1245 | 1245 | ||
| 1246 | mlx4_cfg.log_pg_sz_m = 1; | 1246 | mlx4_cfg.log_pg_sz_m = 1; |
| @@ -1304,7 +1304,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1304 | err = mlx4_init_slave(dev); | 1304 | err = mlx4_init_slave(dev); |
| 1305 | if (err) { | 1305 | if (err) { |
| 1306 | mlx4_err(dev, "Failed to initialize slave\n"); | 1306 | mlx4_err(dev, "Failed to initialize slave\n"); |
| 1307 | goto unmap_bf; | 1307 | return err; |
| 1308 | } | 1308 | } |
| 1309 | 1309 | ||
| 1310 | err = mlx4_slave_cap(dev); | 1310 | err = mlx4_slave_cap(dev); |
| @@ -1324,7 +1324,7 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1324 | err = mlx4_QUERY_ADAPTER(dev, &adapter); | 1324 | err = mlx4_QUERY_ADAPTER(dev, &adapter); |
| 1325 | if (err) { | 1325 | if (err) { |
| 1326 | mlx4_err(dev, "QUERY_ADAPTER command failed, aborting.\n"); | 1326 | mlx4_err(dev, "QUERY_ADAPTER command failed, aborting.\n"); |
| 1327 | goto err_close; | 1327 | goto unmap_bf; |
| 1328 | } | 1328 | } |
| 1329 | 1329 | ||
| 1330 | priv->eq_table.inta_pin = adapter.inta_pin; | 1330 | priv->eq_table.inta_pin = adapter.inta_pin; |
| @@ -1332,6 +1332,9 @@ static int mlx4_init_hca(struct mlx4_dev *dev) | |||
| 1332 | 1332 | ||
| 1333 | return 0; | 1333 | return 0; |
| 1334 | 1334 | ||
| 1335 | unmap_bf: | ||
| 1336 | unmap_bf_area(dev); | ||
| 1337 | |||
| 1335 | err_close: | 1338 | err_close: |
| 1336 | mlx4_close_hca(dev); | 1339 | mlx4_close_hca(dev); |
| 1337 | 1340 | ||
| @@ -1344,8 +1347,6 @@ err_stop_fw: | |||
| 1344 | mlx4_UNMAP_FA(dev); | 1347 | mlx4_UNMAP_FA(dev); |
| 1345 | mlx4_free_icm(dev, priv->fw.fw_icm, 0); | 1348 | mlx4_free_icm(dev, priv->fw.fw_icm, 0); |
| 1346 | } | 1349 | } |
| 1347 | unmap_bf: | ||
| 1348 | unmap_bf_area(dev); | ||
| 1349 | return err; | 1350 | return err; |
| 1350 | } | 1351 | } |
| 1351 | 1352 | ||
| @@ -1996,7 +1997,8 @@ static int __mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 1996 | } | 1997 | } |
| 1997 | 1998 | ||
| 1998 | slave_start: | 1999 | slave_start: |
| 1999 | if (mlx4_cmd_init(dev)) { | 2000 | err = mlx4_cmd_init(dev); |
| 2001 | if (err) { | ||
| 2000 | mlx4_err(dev, "Failed to init command interface, aborting.\n"); | 2002 | mlx4_err(dev, "Failed to init command interface, aborting.\n"); |
| 2001 | goto err_sriov; | 2003 | goto err_sriov; |
| 2002 | } | 2004 | } |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c index a018ea2a43de..e151c21baf2b 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mcg.c +++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c | |||
| @@ -137,11 +137,11 @@ static int mlx4_GID_HASH(struct mlx4_dev *dev, struct mlx4_cmd_mailbox *mailbox, | |||
| 137 | return err; | 137 | return err; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static struct mlx4_promisc_qp *get_promisc_qp(struct mlx4_dev *dev, u8 pf_num, | 140 | static struct mlx4_promisc_qp *get_promisc_qp(struct mlx4_dev *dev, u8 port, |
| 141 | enum mlx4_steer_type steer, | 141 | enum mlx4_steer_type steer, |
| 142 | u32 qpn) | 142 | u32 qpn) |
| 143 | { | 143 | { |
| 144 | struct mlx4_steer *s_steer = &mlx4_priv(dev)->steer[pf_num]; | 144 | struct mlx4_steer *s_steer = &mlx4_priv(dev)->steer[port - 1]; |
| 145 | struct mlx4_promisc_qp *pqp; | 145 | struct mlx4_promisc_qp *pqp; |
| 146 | 146 | ||
| 147 | list_for_each_entry(pqp, &s_steer->promisc_qps[steer], list) { | 147 | list_for_each_entry(pqp, &s_steer->promisc_qps[steer], list) { |
| @@ -182,7 +182,7 @@ static int new_steering_entry(struct mlx4_dev *dev, u8 port, | |||
| 182 | /* If the given qpn is also a promisc qp, | 182 | /* If the given qpn is also a promisc qp, |
| 183 | * it should be inserted to duplicates list | 183 | * it should be inserted to duplicates list |
| 184 | */ | 184 | */ |
| 185 | pqp = get_promisc_qp(dev, 0, steer, qpn); | 185 | pqp = get_promisc_qp(dev, port, steer, qpn); |
| 186 | if (pqp) { | 186 | if (pqp) { |
| 187 | dqp = kmalloc(sizeof *dqp, GFP_KERNEL); | 187 | dqp = kmalloc(sizeof *dqp, GFP_KERNEL); |
| 188 | if (!dqp) { | 188 | if (!dqp) { |
| @@ -256,7 +256,7 @@ static int existing_steering_entry(struct mlx4_dev *dev, u8 port, | |||
| 256 | 256 | ||
| 257 | s_steer = &mlx4_priv(dev)->steer[port - 1]; | 257 | s_steer = &mlx4_priv(dev)->steer[port - 1]; |
| 258 | 258 | ||
| 259 | pqp = get_promisc_qp(dev, 0, steer, qpn); | 259 | pqp = get_promisc_qp(dev, port, steer, qpn); |
| 260 | if (!pqp) | 260 | if (!pqp) |
| 261 | return 0; /* nothing to do */ | 261 | return 0; /* nothing to do */ |
| 262 | 262 | ||
| @@ -302,7 +302,7 @@ static bool check_duplicate_entry(struct mlx4_dev *dev, u8 port, | |||
| 302 | s_steer = &mlx4_priv(dev)->steer[port - 1]; | 302 | s_steer = &mlx4_priv(dev)->steer[port - 1]; |
| 303 | 303 | ||
| 304 | /* if qp is not promisc, it cannot be duplicated */ | 304 | /* if qp is not promisc, it cannot be duplicated */ |
| 305 | if (!get_promisc_qp(dev, 0, steer, qpn)) | 305 | if (!get_promisc_qp(dev, port, steer, qpn)) |
| 306 | return false; | 306 | return false; |
| 307 | 307 | ||
| 308 | /* The qp is promisc qp so it is a duplicate on this index | 308 | /* The qp is promisc qp so it is a duplicate on this index |
| @@ -352,7 +352,7 @@ static bool can_remove_steering_entry(struct mlx4_dev *dev, u8 port, | |||
| 352 | members_count = be32_to_cpu(mgm->members_count) & 0xffffff; | 352 | members_count = be32_to_cpu(mgm->members_count) & 0xffffff; |
| 353 | for (i = 0; i < members_count; i++) { | 353 | for (i = 0; i < members_count; i++) { |
| 354 | qpn = be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK; | 354 | qpn = be32_to_cpu(mgm->qp[i]) & MGM_QPN_MASK; |
| 355 | if (!get_promisc_qp(dev, 0, steer, qpn) && qpn != tqpn) { | 355 | if (!get_promisc_qp(dev, port, steer, qpn) && qpn != tqpn) { |
| 356 | /* the qp is not promisc, the entry can't be removed */ | 356 | /* the qp is not promisc, the entry can't be removed */ |
| 357 | goto out; | 357 | goto out; |
| 358 | } | 358 | } |
| @@ -398,7 +398,7 @@ static int add_promisc_qp(struct mlx4_dev *dev, u8 port, | |||
| 398 | 398 | ||
| 399 | mutex_lock(&priv->mcg_table.mutex); | 399 | mutex_lock(&priv->mcg_table.mutex); |
| 400 | 400 | ||
| 401 | if (get_promisc_qp(dev, 0, steer, qpn)) { | 401 | if (get_promisc_qp(dev, port, steer, qpn)) { |
| 402 | err = 0; /* Noting to do, already exists */ | 402 | err = 0; /* Noting to do, already exists */ |
| 403 | goto out_mutex; | 403 | goto out_mutex; |
| 404 | } | 404 | } |
| @@ -503,7 +503,7 @@ static int remove_promisc_qp(struct mlx4_dev *dev, u8 port, | |||
| 503 | s_steer = &mlx4_priv(dev)->steer[port - 1]; | 503 | s_steer = &mlx4_priv(dev)->steer[port - 1]; |
| 504 | mutex_lock(&priv->mcg_table.mutex); | 504 | mutex_lock(&priv->mcg_table.mutex); |
| 505 | 505 | ||
| 506 | pqp = get_promisc_qp(dev, 0, steer, qpn); | 506 | pqp = get_promisc_qp(dev, port, steer, qpn); |
| 507 | if (unlikely(!pqp)) { | 507 | if (unlikely(!pqp)) { |
| 508 | mlx4_warn(dev, "QP %x is not promiscuous QP\n", qpn); | 508 | mlx4_warn(dev, "QP %x is not promiscuous QP\n", qpn); |
| 509 | /* nothing to do */ | 509 | /* nothing to do */ |
| @@ -650,13 +650,6 @@ static int find_entry(struct mlx4_dev *dev, u8 port, | |||
| 650 | return err; | 650 | return err; |
| 651 | } | 651 | } |
| 652 | 652 | ||
| 653 | struct mlx4_net_trans_rule_hw_ctrl { | ||
| 654 | __be32 ctrl; | ||
| 655 | __be32 vf_vep_port; | ||
| 656 | __be32 qpn; | ||
| 657 | __be32 reserved; | ||
| 658 | }; | ||
| 659 | |||
| 660 | static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl, | 653 | static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl, |
| 661 | struct mlx4_net_trans_rule_hw_ctrl *hw) | 654 | struct mlx4_net_trans_rule_hw_ctrl *hw) |
| 662 | { | 655 | { |
| @@ -680,87 +673,18 @@ static void trans_rule_ctrl_to_hw(struct mlx4_net_trans_rule *ctrl, | |||
| 680 | hw->qpn = cpu_to_be32(ctrl->qpn); | 673 | hw->qpn = cpu_to_be32(ctrl->qpn); |
| 681 | } | 674 | } |
| 682 | 675 | ||
| 683 | struct mlx4_net_trans_rule_hw_ib { | 676 | const u16 __sw_id_hw[] = { |
| 684 | u8 size; | 677 | [MLX4_NET_TRANS_RULE_ID_ETH] = 0xE001, |
| 685 | u8 rsvd1; | 678 | [MLX4_NET_TRANS_RULE_ID_IB] = 0xE005, |
| 686 | __be16 id; | 679 | [MLX4_NET_TRANS_RULE_ID_IPV6] = 0xE003, |
| 687 | u32 rsvd2; | 680 | [MLX4_NET_TRANS_RULE_ID_IPV4] = 0xE002, |
| 688 | __be32 qpn; | 681 | [MLX4_NET_TRANS_RULE_ID_TCP] = 0xE004, |
| 689 | __be32 qpn_mask; | 682 | [MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006 |
| 690 | u8 dst_gid[16]; | ||
| 691 | u8 dst_gid_msk[16]; | ||
| 692 | } __packed; | ||
| 693 | |||
| 694 | struct mlx4_net_trans_rule_hw_eth { | ||
| 695 | u8 size; | ||
| 696 | u8 rsvd; | ||
| 697 | __be16 id; | ||
| 698 | u8 rsvd1[6]; | ||
| 699 | u8 dst_mac[6]; | ||
| 700 | u16 rsvd2; | ||
| 701 | u8 dst_mac_msk[6]; | ||
| 702 | u16 rsvd3; | ||
| 703 | u8 src_mac[6]; | ||
| 704 | u16 rsvd4; | ||
| 705 | u8 src_mac_msk[6]; | ||
| 706 | u8 rsvd5; | ||
| 707 | u8 ether_type_enable; | ||
| 708 | __be16 ether_type; | ||
| 709 | __be16 vlan_id_msk; | ||
| 710 | __be16 vlan_id; | ||
| 711 | } __packed; | ||
| 712 | |||
| 713 | struct mlx4_net_trans_rule_hw_tcp_udp { | ||
| 714 | u8 size; | ||
| 715 | u8 rsvd; | ||
| 716 | __be16 id; | ||
| 717 | __be16 rsvd1[3]; | ||
| 718 | __be16 dst_port; | ||
| 719 | __be16 rsvd2; | ||
| 720 | __be16 dst_port_msk; | ||
| 721 | __be16 rsvd3; | ||
| 722 | __be16 src_port; | ||
| 723 | __be16 rsvd4; | ||
| 724 | __be16 src_port_msk; | ||
| 725 | } __packed; | ||
| 726 | |||
| 727 | struct mlx4_net_trans_rule_hw_ipv4 { | ||
| 728 | u8 size; | ||
| 729 | u8 rsvd; | ||
| 730 | __be16 id; | ||
| 731 | __be32 rsvd1; | ||
| 732 | __be32 dst_ip; | ||
| 733 | __be32 dst_ip_msk; | ||
| 734 | __be32 src_ip; | ||
| 735 | __be32 src_ip_msk; | ||
| 736 | } __packed; | ||
| 737 | |||
| 738 | struct _rule_hw { | ||
| 739 | union { | ||
| 740 | struct { | ||
| 741 | u8 size; | ||
| 742 | u8 rsvd; | ||
| 743 | __be16 id; | ||
| 744 | }; | ||
| 745 | struct mlx4_net_trans_rule_hw_eth eth; | ||
| 746 | struct mlx4_net_trans_rule_hw_ib ib; | ||
| 747 | struct mlx4_net_trans_rule_hw_ipv4 ipv4; | ||
| 748 | struct mlx4_net_trans_rule_hw_tcp_udp tcp_udp; | ||
| 749 | }; | ||
| 750 | }; | 683 | }; |
| 751 | 684 | ||
| 752 | static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec, | 685 | static int parse_trans_rule(struct mlx4_dev *dev, struct mlx4_spec_list *spec, |
| 753 | struct _rule_hw *rule_hw) | 686 | struct _rule_hw *rule_hw) |
| 754 | { | 687 | { |
| 755 | static const u16 __sw_id_hw[] = { | ||
| 756 | [MLX4_NET_TRANS_RULE_ID_ETH] = 0xE001, | ||
| 757 | [MLX4_NET_TRANS_RULE_ID_IB] = 0xE005, | ||
| 758 | [MLX4_NET_TRANS_RULE_ID_IPV6] = 0xE003, | ||
| 759 | [MLX4_NET_TRANS_RULE_ID_IPV4] = 0xE002, | ||
| 760 | [MLX4_NET_TRANS_RULE_ID_TCP] = 0xE004, | ||
| 761 | [MLX4_NET_TRANS_RULE_ID_UDP] = 0xE006 | ||
| 762 | }; | ||
| 763 | |||
| 764 | static const size_t __rule_hw_sz[] = { | 688 | static const size_t __rule_hw_sz[] = { |
| 765 | [MLX4_NET_TRANS_RULE_ID_ETH] = | 689 | [MLX4_NET_TRANS_RULE_ID_ETH] = |
| 766 | sizeof(struct mlx4_net_trans_rule_hw_eth), | 690 | sizeof(struct mlx4_net_trans_rule_hw_eth), |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4.h b/drivers/net/ethernet/mellanox/mlx4/mlx4.h index 4d9df8f2a126..dba69d98734a 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4.h | |||
| @@ -690,6 +690,82 @@ struct mlx4_steer { | |||
| 690 | struct list_head steer_entries[MLX4_NUM_STEERS]; | 690 | struct list_head steer_entries[MLX4_NUM_STEERS]; |
| 691 | }; | 691 | }; |
| 692 | 692 | ||
| 693 | struct mlx4_net_trans_rule_hw_ctrl { | ||
| 694 | __be32 ctrl; | ||
| 695 | __be32 vf_vep_port; | ||
| 696 | __be32 qpn; | ||
| 697 | __be32 reserved; | ||
| 698 | }; | ||
| 699 | |||
| 700 | struct mlx4_net_trans_rule_hw_ib { | ||
| 701 | u8 size; | ||
| 702 | u8 rsvd1; | ||
| 703 | __be16 id; | ||
| 704 | u32 rsvd2; | ||
| 705 | __be32 qpn; | ||
| 706 | __be32 qpn_mask; | ||
| 707 | u8 dst_gid[16]; | ||
| 708 | u8 dst_gid_msk[16]; | ||
| 709 | } __packed; | ||
| 710 | |||
| 711 | struct mlx4_net_trans_rule_hw_eth { | ||
| 712 | u8 size; | ||
| 713 | u8 rsvd; | ||
| 714 | __be16 id; | ||
| 715 | u8 rsvd1[6]; | ||
| 716 | u8 dst_mac[6]; | ||
| 717 | u16 rsvd2; | ||
| 718 | u8 dst_mac_msk[6]; | ||
| 719 | u16 rsvd3; | ||
| 720 | u8 src_mac[6]; | ||
| 721 | u16 rsvd4; | ||
| 722 | u8 src_mac_msk[6]; | ||
| 723 | u8 rsvd5; | ||
| 724 | u8 ether_type_enable; | ||
| 725 | __be16 ether_type; | ||
| 726 | __be16 vlan_id_msk; | ||
| 727 | __be16 vlan_id; | ||
| 728 | } __packed; | ||
| 729 | |||
| 730 | struct mlx4_net_trans_rule_hw_tcp_udp { | ||
| 731 | u8 size; | ||
| 732 | u8 rsvd; | ||
| 733 | __be16 id; | ||
| 734 | __be16 rsvd1[3]; | ||
| 735 | __be16 dst_port; | ||
| 736 | __be16 rsvd2; | ||
| 737 | __be16 dst_port_msk; | ||
| 738 | __be16 rsvd3; | ||
| 739 | __be16 src_port; | ||
| 740 | __be16 rsvd4; | ||
| 741 | __be16 src_port_msk; | ||
| 742 | } __packed; | ||
| 743 | |||
| 744 | struct mlx4_net_trans_rule_hw_ipv4 { | ||
| 745 | u8 size; | ||
| 746 | u8 rsvd; | ||
| 747 | __be16 id; | ||
| 748 | __be32 rsvd1; | ||
| 749 | __be32 dst_ip; | ||
| 750 | __be32 dst_ip_msk; | ||
| 751 | __be32 src_ip; | ||
| 752 | __be32 src_ip_msk; | ||
| 753 | } __packed; | ||
| 754 | |||
| 755 | struct _rule_hw { | ||
| 756 | union { | ||
| 757 | struct { | ||
| 758 | u8 size; | ||
| 759 | u8 rsvd; | ||
| 760 | __be16 id; | ||
| 761 | }; | ||
| 762 | struct mlx4_net_trans_rule_hw_eth eth; | ||
| 763 | struct mlx4_net_trans_rule_hw_ib ib; | ||
| 764 | struct mlx4_net_trans_rule_hw_ipv4 ipv4; | ||
| 765 | struct mlx4_net_trans_rule_hw_tcp_udp tcp_udp; | ||
| 766 | }; | ||
| 767 | }; | ||
| 768 | |||
| 693 | struct mlx4_priv { | 769 | struct mlx4_priv { |
| 694 | struct mlx4_dev dev; | 770 | struct mlx4_dev dev; |
| 695 | 771 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c index 94ceddd17ab2..293c9e820c49 100644 --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/mlx4/cmd.h> | 42 | #include <linux/mlx4/cmd.h> |
| 43 | #include <linux/mlx4/qp.h> | 43 | #include <linux/mlx4/qp.h> |
| 44 | #include <linux/if_ether.h> | 44 | #include <linux/if_ether.h> |
| 45 | #include <linux/etherdevice.h> | ||
| 45 | 46 | ||
| 46 | #include "mlx4.h" | 47 | #include "mlx4.h" |
| 47 | #include "fw.h" | 48 | #include "fw.h" |
| @@ -2776,18 +2777,133 @@ ex_put: | |||
| 2776 | return err; | 2777 | return err; |
| 2777 | } | 2778 | } |
| 2778 | 2779 | ||
| 2780 | /* | ||
| 2781 | * MAC validation for Flow Steering rules. | ||
| 2782 | * VF can attach rules only with a mac address which is assigned to it. | ||
| 2783 | */ | ||
| 2784 | static int validate_eth_header_mac(int slave, struct _rule_hw *eth_header, | ||
| 2785 | struct list_head *rlist) | ||
| 2786 | { | ||
| 2787 | struct mac_res *res, *tmp; | ||
| 2788 | __be64 be_mac; | ||
| 2789 | |||
| 2790 | /* make sure it isn't multicast or broadcast mac*/ | ||
| 2791 | if (!is_multicast_ether_addr(eth_header->eth.dst_mac) && | ||
| 2792 | !is_broadcast_ether_addr(eth_header->eth.dst_mac)) { | ||
| 2793 | list_for_each_entry_safe(res, tmp, rlist, list) { | ||
| 2794 | be_mac = cpu_to_be64(res->mac << 16); | ||
| 2795 | if (!memcmp(&be_mac, eth_header->eth.dst_mac, ETH_ALEN)) | ||
| 2796 | return 0; | ||
| 2797 | } | ||
| 2798 | pr_err("MAC %pM doesn't belong to VF %d, Steering rule rejected\n", | ||
| 2799 | eth_header->eth.dst_mac, slave); | ||
| 2800 | return -EINVAL; | ||
| 2801 | } | ||
| 2802 | return 0; | ||
| 2803 | } | ||
| 2804 | |||
| 2805 | /* | ||
| 2806 | * In case of missing eth header, append eth header with a MAC address | ||
| 2807 | * assigned to the VF. | ||
| 2808 | */ | ||
| 2809 | static int add_eth_header(struct mlx4_dev *dev, int slave, | ||
| 2810 | struct mlx4_cmd_mailbox *inbox, | ||
| 2811 | struct list_head *rlist, int header_id) | ||
| 2812 | { | ||
| 2813 | struct mac_res *res, *tmp; | ||
| 2814 | u8 port; | ||
| 2815 | struct mlx4_net_trans_rule_hw_ctrl *ctrl; | ||
| 2816 | struct mlx4_net_trans_rule_hw_eth *eth_header; | ||
| 2817 | struct mlx4_net_trans_rule_hw_ipv4 *ip_header; | ||
| 2818 | struct mlx4_net_trans_rule_hw_tcp_udp *l4_header; | ||
| 2819 | __be64 be_mac = 0; | ||
| 2820 | __be64 mac_msk = cpu_to_be64(MLX4_MAC_MASK << 16); | ||
| 2821 | |||
| 2822 | ctrl = (struct mlx4_net_trans_rule_hw_ctrl *)inbox->buf; | ||
| 2823 | port = be32_to_cpu(ctrl->vf_vep_port) & 0xff; | ||
| 2824 | eth_header = (struct mlx4_net_trans_rule_hw_eth *)(ctrl + 1); | ||
| 2825 | |||
| 2826 | /* Clear a space in the inbox for eth header */ | ||
| 2827 | switch (header_id) { | ||
| 2828 | case MLX4_NET_TRANS_RULE_ID_IPV4: | ||
| 2829 | ip_header = | ||
| 2830 | (struct mlx4_net_trans_rule_hw_ipv4 *)(eth_header + 1); | ||
| 2831 | memmove(ip_header, eth_header, | ||
| 2832 | sizeof(*ip_header) + sizeof(*l4_header)); | ||
| 2833 | break; | ||
| 2834 | case MLX4_NET_TRANS_RULE_ID_TCP: | ||
| 2835 | case MLX4_NET_TRANS_RULE_ID_UDP: | ||
| 2836 | l4_header = (struct mlx4_net_trans_rule_hw_tcp_udp *) | ||
| 2837 | (eth_header + 1); | ||
| 2838 | memmove(l4_header, eth_header, sizeof(*l4_header)); | ||
| 2839 | break; | ||
| 2840 | default: | ||
| 2841 | return -EINVAL; | ||
| 2842 | } | ||
| 2843 | list_for_each_entry_safe(res, tmp, rlist, list) { | ||
| 2844 | if (port == res->port) { | ||
| 2845 | be_mac = cpu_to_be64(res->mac << 16); | ||
| 2846 | break; | ||
| 2847 | } | ||
| 2848 | } | ||
| 2849 | if (!be_mac) { | ||
| 2850 | pr_err("Failed adding eth header to FS rule, Can't find matching MAC for port %d .\n", | ||
| 2851 | port); | ||
| 2852 | return -EINVAL; | ||
| 2853 | } | ||
| 2854 | |||
| 2855 | memset(eth_header, 0, sizeof(*eth_header)); | ||
| 2856 | eth_header->size = sizeof(*eth_header) >> 2; | ||
| 2857 | eth_header->id = cpu_to_be16(__sw_id_hw[MLX4_NET_TRANS_RULE_ID_ETH]); | ||
| 2858 | memcpy(eth_header->dst_mac, &be_mac, ETH_ALEN); | ||
| 2859 | memcpy(eth_header->dst_mac_msk, &mac_msk, ETH_ALEN); | ||
| 2860 | |||
| 2861 | return 0; | ||
| 2862 | |||
| 2863 | } | ||
| 2864 | |||
| 2779 | int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave, | 2865 | int mlx4_QP_FLOW_STEERING_ATTACH_wrapper(struct mlx4_dev *dev, int slave, |
| 2780 | struct mlx4_vhcr *vhcr, | 2866 | struct mlx4_vhcr *vhcr, |
| 2781 | struct mlx4_cmd_mailbox *inbox, | 2867 | struct mlx4_cmd_mailbox *inbox, |
| 2782 | struct mlx4_cmd_mailbox *outbox, | 2868 | struct mlx4_cmd_mailbox *outbox, |
| 2783 | struct mlx4_cmd_info *cmd) | 2869 | struct mlx4_cmd_info *cmd) |
| 2784 | { | 2870 | { |
| 2871 | |||
| 2872 | struct mlx4_priv *priv = mlx4_priv(dev); | ||
| 2873 | struct mlx4_resource_tracker *tracker = &priv->mfunc.master.res_tracker; | ||
| 2874 | struct list_head *rlist = &tracker->slave_list[slave].res_list[RES_MAC]; | ||
| 2785 | int err; | 2875 | int err; |
| 2876 | struct mlx4_net_trans_rule_hw_ctrl *ctrl; | ||
| 2877 | struct _rule_hw *rule_header; | ||
| 2878 | int header_id; | ||
| 2786 | 2879 | ||
| 2787 | if (dev->caps.steering_mode != | 2880 | if (dev->caps.steering_mode != |
| 2788 | MLX4_STEERING_MODE_DEVICE_MANAGED) | 2881 | MLX4_STEERING_MODE_DEVICE_MANAGED) |
| 2789 | return -EOPNOTSUPP; | 2882 | return -EOPNOTSUPP; |
| 2790 | 2883 | ||
| 2884 | ctrl = (struct mlx4_net_trans_rule_hw_ctrl *)inbox->buf; | ||
| 2885 | rule_header = (struct _rule_hw *)(ctrl + 1); | ||
| 2886 | header_id = map_hw_to_sw_id(be16_to_cpu(rule_header->id)); | ||
| 2887 | |||
| 2888 | switch (header_id) { | ||
| 2889 | case MLX4_NET_TRANS_RULE_ID_ETH: | ||
| 2890 | if (validate_eth_header_mac(slave, rule_header, rlist)) | ||
| 2891 | return -EINVAL; | ||
| 2892 | break; | ||
| 2893 | case MLX4_NET_TRANS_RULE_ID_IPV4: | ||
| 2894 | case MLX4_NET_TRANS_RULE_ID_TCP: | ||
| 2895 | case MLX4_NET_TRANS_RULE_ID_UDP: | ||
| 2896 | pr_warn("Can't attach FS rule without L2 headers, adding L2 header.\n"); | ||
| 2897 | if (add_eth_header(dev, slave, inbox, rlist, header_id)) | ||
| 2898 | return -EINVAL; | ||
| 2899 | vhcr->in_modifier += | ||
| 2900 | sizeof(struct mlx4_net_trans_rule_hw_eth) >> 2; | ||
| 2901 | break; | ||
| 2902 | default: | ||
| 2903 | pr_err("Corrupted mailbox.\n"); | ||
| 2904 | return -EINVAL; | ||
| 2905 | } | ||
| 2906 | |||
| 2791 | err = mlx4_cmd_imm(dev, inbox->dma, &vhcr->out_param, | 2907 | err = mlx4_cmd_imm(dev, inbox->dma, &vhcr->out_param, |
| 2792 | vhcr->in_modifier, 0, | 2908 | vhcr->in_modifier, 0, |
| 2793 | MLX4_QP_FLOW_STEERING_ATTACH, MLX4_CMD_TIME_CLASS_A, | 2909 | MLX4_QP_FLOW_STEERING_ATTACH, MLX4_CMD_TIME_CLASS_A, |
diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c index 342b3a79bd0f..a77c558d8f40 100644 --- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c +++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c | |||
| @@ -1378,6 +1378,10 @@ static void netxen_mask_aer_correctable(struct netxen_adapter *adapter) | |||
| 1378 | struct pci_dev *root = pdev->bus->self; | 1378 | struct pci_dev *root = pdev->bus->self; |
| 1379 | u32 aer_pos; | 1379 | u32 aer_pos; |
| 1380 | 1380 | ||
| 1381 | /* root bus? */ | ||
| 1382 | if (!root) | ||
| 1383 | return; | ||
| 1384 | |||
| 1381 | if (adapter->ahw.board_type != NETXEN_BRDTYPE_P3_4_GB_MM && | 1385 | if (adapter->ahw.board_type != NETXEN_BRDTYPE_P3_4_GB_MM && |
| 1382 | adapter->ahw.board_type != NETXEN_BRDTYPE_P3_10G_TP) | 1386 | adapter->ahw.board_type != NETXEN_BRDTYPE_P3_10G_TP) |
| 1383 | return; | 1387 | return; |
diff --git a/drivers/net/ethernet/seeq/sgiseeq.c b/drivers/net/ethernet/seeq/sgiseeq.c index bb8c8222122b..4d15bf413bdc 100644 --- a/drivers/net/ethernet/seeq/sgiseeq.c +++ b/drivers/net/ethernet/seeq/sgiseeq.c | |||
| @@ -751,6 +751,7 @@ static int __devinit sgiseeq_probe(struct platform_device *pdev) | |||
| 751 | sp->srings = sr; | 751 | sp->srings = sr; |
| 752 | sp->rx_desc = sp->srings->rxvector; | 752 | sp->rx_desc = sp->srings->rxvector; |
| 753 | sp->tx_desc = sp->srings->txvector; | 753 | sp->tx_desc = sp->srings->txvector; |
| 754 | spin_lock_init(&sp->tx_lock); | ||
| 754 | 755 | ||
| 755 | /* A couple calculations now, saves many cycles later. */ | 756 | /* A couple calculations now, saves many cycles later. */ |
| 756 | setup_rx_ring(dev, sp->rx_desc, SEEQ_RX_BUFFERS); | 757 | setup_rx_ring(dev, sp->rx_desc, SEEQ_RX_BUFFERS); |
diff --git a/drivers/net/ethernet/sfc/ethtool.c b/drivers/net/ethernet/sfc/ethtool.c index 8cba2df82b18..5faedd855b77 100644 --- a/drivers/net/ethernet/sfc/ethtool.c +++ b/drivers/net/ethernet/sfc/ethtool.c | |||
| @@ -863,8 +863,8 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx, | |||
| 863 | &ip_entry->ip4dst, &ip_entry->pdst); | 863 | &ip_entry->ip4dst, &ip_entry->pdst); |
| 864 | if (rc != 0) { | 864 | if (rc != 0) { |
| 865 | rc = efx_filter_get_ipv4_full( | 865 | rc = efx_filter_get_ipv4_full( |
| 866 | &spec, &proto, &ip_entry->ip4src, &ip_entry->psrc, | 866 | &spec, &proto, &ip_entry->ip4dst, &ip_entry->pdst, |
| 867 | &ip_entry->ip4dst, &ip_entry->pdst); | 867 | &ip_entry->ip4src, &ip_entry->psrc); |
| 868 | EFX_WARN_ON_PARANOID(rc); | 868 | EFX_WARN_ON_PARANOID(rc); |
| 869 | ip_mask->ip4src = ~0; | 869 | ip_mask->ip4src = ~0; |
| 870 | ip_mask->psrc = ~0; | 870 | ip_mask->psrc = ~0; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h index e2d083228f3a..719be3912aa9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/common.h +++ b/drivers/net/ethernet/stmicro/stmmac/common.h | |||
| @@ -22,6 +22,9 @@ | |||
| 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | *******************************************************************************/ | 23 | *******************************************************************************/ |
| 24 | 24 | ||
| 25 | #ifndef __COMMON_H__ | ||
| 26 | #define __COMMON_H__ | ||
| 27 | |||
| 25 | #include <linux/etherdevice.h> | 28 | #include <linux/etherdevice.h> |
| 26 | #include <linux/netdevice.h> | 29 | #include <linux/netdevice.h> |
| 27 | #include <linux/phy.h> | 30 | #include <linux/phy.h> |
| @@ -366,3 +369,5 @@ extern void stmmac_set_mac(void __iomem *ioaddr, bool enable); | |||
| 366 | 369 | ||
| 367 | extern void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); | 370 | extern void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); |
| 368 | extern const struct stmmac_ring_mode_ops ring_mode_ops; | 371 | extern const struct stmmac_ring_mode_ops ring_mode_ops; |
| 372 | |||
| 373 | #endif /* __COMMON_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/descs.h b/drivers/net/ethernet/stmicro/stmmac/descs.h index 9820ec842cc0..223adf95fd03 100644 --- a/drivers/net/ethernet/stmicro/stmmac/descs.h +++ b/drivers/net/ethernet/stmicro/stmmac/descs.h | |||
| @@ -20,6 +20,10 @@ | |||
| 20 | 20 | ||
| 21 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 21 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 22 | *******************************************************************************/ | 22 | *******************************************************************************/ |
| 23 | |||
| 24 | #ifndef __DESCS_H__ | ||
| 25 | #define __DESCS_H__ | ||
| 26 | |||
| 23 | struct dma_desc { | 27 | struct dma_desc { |
| 24 | /* Receive descriptor */ | 28 | /* Receive descriptor */ |
| 25 | union { | 29 | union { |
| @@ -166,3 +170,5 @@ enum tdes_csum_insertion { | |||
| 166 | * is not calculated */ | 170 | * is not calculated */ |
| 167 | cic_full = 3, /* IP header and pseudoheader */ | 171 | cic_full = 3, /* IP header and pseudoheader */ |
| 168 | }; | 172 | }; |
| 173 | |||
| 174 | #endif /* __DESCS_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/descs_com.h b/drivers/net/ethernet/stmicro/stmmac/descs_com.h index dd8d6e19dff6..7ee9499a6e38 100644 --- a/drivers/net/ethernet/stmicro/stmmac/descs_com.h +++ b/drivers/net/ethernet/stmicro/stmmac/descs_com.h | |||
| @@ -27,6 +27,9 @@ | |||
| 27 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 27 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 28 | *******************************************************************************/ | 28 | *******************************************************************************/ |
| 29 | 29 | ||
| 30 | #ifndef __DESC_COM_H__ | ||
| 31 | #define __DESC_COM_H__ | ||
| 32 | |||
| 30 | #if defined(CONFIG_STMMAC_RING) | 33 | #if defined(CONFIG_STMMAC_RING) |
| 31 | static inline void ehn_desc_rx_set_on_ring_chain(struct dma_desc *p, int end) | 34 | static inline void ehn_desc_rx_set_on_ring_chain(struct dma_desc *p, int end) |
| 32 | { | 35 | { |
| @@ -124,3 +127,5 @@ static inline void norm_set_tx_desc_len(struct dma_desc *p, int len) | |||
| 124 | p->des01.tx.buffer1_size = len; | 127 | p->des01.tx.buffer1_size = len; |
| 125 | } | 128 | } |
| 126 | #endif | 129 | #endif |
| 130 | |||
| 131 | #endif /* __DESC_COM_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac100.h b/drivers/net/ethernet/stmicro/stmmac/dwmac100.h index 7c6d857a9cc7..2ec6aeae349e 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac100.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac100.h | |||
| @@ -22,6 +22,9 @@ | |||
| 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | *******************************************************************************/ | 23 | *******************************************************************************/ |
| 24 | 24 | ||
| 25 | #ifndef __DWMAC100_H__ | ||
| 26 | #define __DWMAC100_H__ | ||
| 27 | |||
| 25 | #include <linux/phy.h> | 28 | #include <linux/phy.h> |
| 26 | #include "common.h" | 29 | #include "common.h" |
| 27 | 30 | ||
| @@ -119,3 +122,5 @@ enum ttc_control { | |||
| 119 | #define DMA_MISSED_FRAME_M_CNTR 0x0000ffff /* Missed Frame Couinter */ | 122 | #define DMA_MISSED_FRAME_M_CNTR 0x0000ffff /* Missed Frame Couinter */ |
| 120 | 123 | ||
| 121 | extern const struct stmmac_dma_ops dwmac100_dma_ops; | 124 | extern const struct stmmac_dma_ops dwmac100_dma_ops; |
| 125 | |||
| 126 | #endif /* __DWMAC100_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h b/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h index f90fcb5f9573..0e4cacedc1f0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000.h | |||
| @@ -19,6 +19,8 @@ | |||
| 19 | 19 | ||
| 20 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 20 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 21 | *******************************************************************************/ | 21 | *******************************************************************************/ |
| 22 | #ifndef __DWMAC1000_H__ | ||
| 23 | #define __DWMAC1000_H__ | ||
| 22 | 24 | ||
| 23 | #include <linux/phy.h> | 25 | #include <linux/phy.h> |
| 24 | #include "common.h" | 26 | #include "common.h" |
| @@ -229,6 +231,7 @@ enum rtc_control { | |||
| 229 | #define GMAC_MMC_RX_CSUM_OFFLOAD 0x208 | 231 | #define GMAC_MMC_RX_CSUM_OFFLOAD 0x208 |
| 230 | 232 | ||
| 231 | /* Synopsys Core versions */ | 233 | /* Synopsys Core versions */ |
| 232 | #define DWMAC_CORE_3_40 34 | 234 | #define DWMAC_CORE_3_40 0x34 |
| 233 | 235 | ||
| 234 | extern const struct stmmac_dma_ops dwmac1000_dma_ops; | 236 | extern const struct stmmac_dma_ops dwmac1000_dma_ops; |
| 237 | #endif /* __DWMAC1000_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h b/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h index e678ce39d014..e49c9a0fd6ff 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac_dma.h | |||
| @@ -22,6 +22,9 @@ | |||
| 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | *******************************************************************************/ | 23 | *******************************************************************************/ |
| 24 | 24 | ||
| 25 | #ifndef __DWMAC_DMA_H__ | ||
| 26 | #define __DWMAC_DMA_H__ | ||
| 27 | |||
| 25 | /* DMA CRS Control and Status Register Mapping */ | 28 | /* DMA CRS Control and Status Register Mapping */ |
| 26 | #define DMA_BUS_MODE 0x00001000 /* Bus Mode */ | 29 | #define DMA_BUS_MODE 0x00001000 /* Bus Mode */ |
| 27 | #define DMA_XMT_POLL_DEMAND 0x00001004 /* Transmit Poll Demand */ | 30 | #define DMA_XMT_POLL_DEMAND 0x00001004 /* Transmit Poll Demand */ |
| @@ -109,3 +112,5 @@ extern void dwmac_dma_start_rx(void __iomem *ioaddr); | |||
| 109 | extern void dwmac_dma_stop_rx(void __iomem *ioaddr); | 112 | extern void dwmac_dma_stop_rx(void __iomem *ioaddr); |
| 110 | extern int dwmac_dma_interrupt(void __iomem *ioaddr, | 113 | extern int dwmac_dma_interrupt(void __iomem *ioaddr, |
| 111 | struct stmmac_extra_stats *x); | 114 | struct stmmac_extra_stats *x); |
| 115 | |||
| 116 | #endif /* __DWMAC_DMA_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/mmc.h b/drivers/net/ethernet/stmicro/stmmac/mmc.h index a38352024cb8..67995ef25251 100644 --- a/drivers/net/ethernet/stmicro/stmmac/mmc.h +++ b/drivers/net/ethernet/stmicro/stmmac/mmc.h | |||
| @@ -22,6 +22,9 @@ | |||
| 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | *******************************************************************************/ | 23 | *******************************************************************************/ |
| 24 | 24 | ||
| 25 | #ifndef __MMC_H__ | ||
| 26 | #define __MMC_H__ | ||
| 27 | |||
| 25 | /* MMC control register */ | 28 | /* MMC control register */ |
| 26 | /* When set, all counter are reset */ | 29 | /* When set, all counter are reset */ |
| 27 | #define MMC_CNTRL_COUNTER_RESET 0x1 | 30 | #define MMC_CNTRL_COUNTER_RESET 0x1 |
| @@ -129,3 +132,5 @@ struct stmmac_counters { | |||
| 129 | extern void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode); | 132 | extern void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode); |
| 130 | extern void dwmac_mmc_intr_all_mask(void __iomem *ioaddr); | 133 | extern void dwmac_mmc_intr_all_mask(void __iomem *ioaddr); |
| 131 | extern void dwmac_mmc_read(void __iomem *ioaddr, struct stmmac_counters *mmc); | 134 | extern void dwmac_mmc_read(void __iomem *ioaddr, struct stmmac_counters *mmc); |
| 135 | |||
| 136 | #endif /* __MMC_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c index c07cfe989f6e..0c74a702d461 100644 --- a/drivers/net/ethernet/stmicro/stmmac/mmc_core.c +++ b/drivers/net/ethernet/stmicro/stmmac/mmc_core.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | #define MMC_TX_INTR 0x00000108 /* MMC TX Interrupt */ | 33 | #define MMC_TX_INTR 0x00000108 /* MMC TX Interrupt */ |
| 34 | #define MMC_RX_INTR_MASK 0x0000010c /* MMC Interrupt Mask */ | 34 | #define MMC_RX_INTR_MASK 0x0000010c /* MMC Interrupt Mask */ |
| 35 | #define MMC_TX_INTR_MASK 0x00000110 /* MMC Interrupt Mask */ | 35 | #define MMC_TX_INTR_MASK 0x00000110 /* MMC Interrupt Mask */ |
| 36 | #define MMC_DEFAUL_MASK 0xffffffff | 36 | #define MMC_DEFAULT_MASK 0xffffffff |
| 37 | 37 | ||
| 38 | /* MMC TX counter registers */ | 38 | /* MMC TX counter registers */ |
| 39 | 39 | ||
| @@ -147,8 +147,8 @@ void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode) | |||
| 147 | /* To mask all all interrupts.*/ | 147 | /* To mask all all interrupts.*/ |
| 148 | void dwmac_mmc_intr_all_mask(void __iomem *ioaddr) | 148 | void dwmac_mmc_intr_all_mask(void __iomem *ioaddr) |
| 149 | { | 149 | { |
| 150 | writel(MMC_DEFAUL_MASK, ioaddr + MMC_RX_INTR_MASK); | 150 | writel(MMC_DEFAULT_MASK, ioaddr + MMC_RX_INTR_MASK); |
| 151 | writel(MMC_DEFAUL_MASK, ioaddr + MMC_TX_INTR_MASK); | 151 | writel(MMC_DEFAULT_MASK, ioaddr + MMC_TX_INTR_MASK); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | /* This reads the MAC core counters (if actaully supported). | 154 | /* This reads the MAC core counters (if actaully supported). |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h index f2d3665430ad..e872e1da3137 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h | |||
| @@ -20,6 +20,9 @@ | |||
| 20 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 20 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 21 | *******************************************************************************/ | 21 | *******************************************************************************/ |
| 22 | 22 | ||
| 23 | #ifndef __STMMAC_H__ | ||
| 24 | #define __STMMAC_H__ | ||
| 25 | |||
| 23 | #define STMMAC_RESOURCE_NAME "stmmaceth" | 26 | #define STMMAC_RESOURCE_NAME "stmmaceth" |
| 24 | #define DRV_MODULE_VERSION "March_2012" | 27 | #define DRV_MODULE_VERSION "March_2012" |
| 25 | 28 | ||
| @@ -166,3 +169,5 @@ static inline void stmmac_unregister_pci(void) | |||
| 166 | { | 169 | { |
| 167 | } | 170 | } |
| 168 | #endif /* CONFIG_STMMAC_PCI */ | 171 | #endif /* CONFIG_STMMAC_PCI */ |
| 172 | |||
| 173 | #endif /* __STMMAC_H__ */ | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index c136162e6473..3be88331d17a 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | |||
| @@ -1066,7 +1066,7 @@ static int stmmac_open(struct net_device *dev) | |||
| 1066 | } else | 1066 | } else |
| 1067 | priv->tm->enable = 1; | 1067 | priv->tm->enable = 1; |
| 1068 | #endif | 1068 | #endif |
| 1069 | clk_enable(priv->stmmac_clk); | 1069 | clk_prepare_enable(priv->stmmac_clk); |
| 1070 | 1070 | ||
| 1071 | stmmac_check_ether_addr(priv); | 1071 | stmmac_check_ether_addr(priv); |
| 1072 | 1072 | ||
| @@ -1188,7 +1188,7 @@ open_error: | |||
| 1188 | if (priv->phydev) | 1188 | if (priv->phydev) |
| 1189 | phy_disconnect(priv->phydev); | 1189 | phy_disconnect(priv->phydev); |
| 1190 | 1190 | ||
| 1191 | clk_disable(priv->stmmac_clk); | 1191 | clk_disable_unprepare(priv->stmmac_clk); |
| 1192 | 1192 | ||
| 1193 | return ret; | 1193 | return ret; |
| 1194 | } | 1194 | } |
| @@ -1246,7 +1246,7 @@ static int stmmac_release(struct net_device *dev) | |||
| 1246 | #ifdef CONFIG_STMMAC_DEBUG_FS | 1246 | #ifdef CONFIG_STMMAC_DEBUG_FS |
| 1247 | stmmac_exit_fs(); | 1247 | stmmac_exit_fs(); |
| 1248 | #endif | 1248 | #endif |
| 1249 | clk_disable(priv->stmmac_clk); | 1249 | clk_disable_unprepare(priv->stmmac_clk); |
| 1250 | 1250 | ||
| 1251 | return 0; | 1251 | return 0; |
| 1252 | } | 1252 | } |
| @@ -2178,7 +2178,7 @@ int stmmac_suspend(struct net_device *ndev) | |||
| 2178 | else { | 2178 | else { |
| 2179 | stmmac_set_mac(priv->ioaddr, false); | 2179 | stmmac_set_mac(priv->ioaddr, false); |
| 2180 | /* Disable clock in case of PWM is off */ | 2180 | /* Disable clock in case of PWM is off */ |
| 2181 | clk_disable(priv->stmmac_clk); | 2181 | clk_disable_unprepare(priv->stmmac_clk); |
| 2182 | } | 2182 | } |
| 2183 | spin_unlock_irqrestore(&priv->lock, flags); | 2183 | spin_unlock_irqrestore(&priv->lock, flags); |
| 2184 | return 0; | 2184 | return 0; |
| @@ -2203,7 +2203,7 @@ int stmmac_resume(struct net_device *ndev) | |||
| 2203 | priv->hw->mac->pmt(priv->ioaddr, 0); | 2203 | priv->hw->mac->pmt(priv->ioaddr, 0); |
| 2204 | else | 2204 | else |
| 2205 | /* enable the clk prevously disabled */ | 2205 | /* enable the clk prevously disabled */ |
| 2206 | clk_enable(priv->stmmac_clk); | 2206 | clk_prepare_enable(priv->stmmac_clk); |
| 2207 | 2207 | ||
| 2208 | netif_device_attach(ndev); | 2208 | netif_device_attach(ndev); |
| 2209 | 2209 | ||
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.c index 2a0e1abde7e7..4ccd4e2977b7 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.c | |||
| @@ -97,19 +97,19 @@ static struct clk *timer_clock; | |||
| 97 | static void stmmac_tmu_start(unsigned int new_freq) | 97 | static void stmmac_tmu_start(unsigned int new_freq) |
| 98 | { | 98 | { |
| 99 | clk_set_rate(timer_clock, new_freq); | 99 | clk_set_rate(timer_clock, new_freq); |
| 100 | clk_enable(timer_clock); | 100 | clk_prepare_enable(timer_clock); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | static void stmmac_tmu_stop(void) | 103 | static void stmmac_tmu_stop(void) |
| 104 | { | 104 | { |
| 105 | clk_disable(timer_clock); | 105 | clk_disable_unprepare(timer_clock); |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm) | 108 | int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm) |
| 109 | { | 109 | { |
| 110 | timer_clock = clk_get(NULL, TMU_CHANNEL); | 110 | timer_clock = clk_get(NULL, TMU_CHANNEL); |
| 111 | 111 | ||
| 112 | if (timer_clock == NULL) | 112 | if (IS_ERR(timer_clock)) |
| 113 | return -1; | 113 | return -1; |
| 114 | 114 | ||
| 115 | if (tmu2_register_user(stmmac_timer_handler, (void *)dev) < 0) { | 115 | if (tmu2_register_user(stmmac_timer_handler, (void *)dev) < 0) { |
| @@ -126,7 +126,7 @@ int stmmac_open_ext_timer(struct net_device *dev, struct stmmac_timer *tm) | |||
| 126 | 126 | ||
| 127 | int stmmac_close_ext_timer(void) | 127 | int stmmac_close_ext_timer(void) |
| 128 | { | 128 | { |
| 129 | clk_disable(timer_clock); | 129 | clk_disable_unprepare(timer_clock); |
| 130 | tmu2_unregister_user(); | 130 | tmu2_unregister_user(); |
| 131 | clk_put(timer_clock); | 131 | clk_put(timer_clock); |
| 132 | return 0; | 132 | return 0; |
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.h b/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.h index 6863590d184b..aea9b14cdfbe 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.h +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_timer.h | |||
| @@ -21,6 +21,8 @@ | |||
| 21 | 21 | ||
| 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | *******************************************************************************/ | 23 | *******************************************************************************/ |
| 24 | #ifndef __STMMAC_TIMER_H__ | ||
| 25 | #define __STMMAC_TIMER_H__ | ||
| 24 | 26 | ||
| 25 | struct stmmac_timer { | 27 | struct stmmac_timer { |
| 26 | void (*timer_start) (unsigned int new_freq); | 28 | void (*timer_start) (unsigned int new_freq); |
| @@ -40,3 +42,5 @@ void stmmac_schedule(struct net_device *dev); | |||
| 40 | extern int tmu2_register_user(void *fnt, void *data); | 42 | extern int tmu2_register_user(void *fnt, void *data); |
| 41 | extern void tmu2_unregister_user(void); | 43 | extern void tmu2_unregister_user(void); |
| 42 | #endif | 44 | #endif |
| 45 | |||
| 46 | #endif /* __STMMAC_TIMER_H__ */ | ||
diff --git a/drivers/net/ethernet/ti/davinci_mdio.c b/drivers/net/ethernet/ti/davinci_mdio.c index cd7ee204e94a..a9ca4a03d31b 100644 --- a/drivers/net/ethernet/ti/davinci_mdio.c +++ b/drivers/net/ethernet/ti/davinci_mdio.c | |||
| @@ -394,8 +394,10 @@ static int __devexit davinci_mdio_remove(struct platform_device *pdev) | |||
| 394 | struct device *dev = &pdev->dev; | 394 | struct device *dev = &pdev->dev; |
| 395 | struct davinci_mdio_data *data = dev_get_drvdata(dev); | 395 | struct davinci_mdio_data *data = dev_get_drvdata(dev); |
| 396 | 396 | ||
| 397 | if (data->bus) | 397 | if (data->bus) { |
| 398 | mdiobus_unregister(data->bus); | ||
| 398 | mdiobus_free(data->bus); | 399 | mdiobus_free(data->bus); |
| 400 | } | ||
| 399 | 401 | ||
| 400 | if (data->clk) | 402 | if (data->clk) |
| 401 | clk_put(data->clk); | 403 | clk_put(data->clk); |
diff --git a/drivers/net/fddi/skfp/pmf.c b/drivers/net/fddi/skfp/pmf.c index 24d8566cfd8b..441b4dc79450 100644 --- a/drivers/net/fddi/skfp/pmf.c +++ b/drivers/net/fddi/skfp/pmf.c | |||
| @@ -673,7 +673,7 @@ void smt_add_para(struct s_smc *smc, struct s_pcon *pcon, u_short para, | |||
| 673 | sm_pm_get_ls(smc,port_to_mib(smc,port))) ; | 673 | sm_pm_get_ls(smc,port_to_mib(smc,port))) ; |
| 674 | break ; | 674 | break ; |
| 675 | case SMT_P_REASON : | 675 | case SMT_P_REASON : |
| 676 | * (u_long *) to = 0 ; | 676 | *(u32 *)to = 0 ; |
| 677 | sp_len = 4 ; | 677 | sp_len = 4 ; |
| 678 | goto sp_done ; | 678 | goto sp_done ; |
| 679 | case SMT_P1033 : /* time stamp */ | 679 | case SMT_P1033 : /* time stamp */ |
diff --git a/drivers/net/irda/sh_sir.c b/drivers/net/irda/sh_sir.c index 256eddf1f75a..795109425568 100644 --- a/drivers/net/irda/sh_sir.c +++ b/drivers/net/irda/sh_sir.c | |||
| @@ -280,7 +280,7 @@ static int sh_sir_set_baudrate(struct sh_sir_self *self, u32 baudrate) | |||
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | clk = clk_get(NULL, "irda_clk"); | 282 | clk = clk_get(NULL, "irda_clk"); |
| 283 | if (!clk) { | 283 | if (IS_ERR(clk)) { |
| 284 | dev_err(dev, "can not get irda_clk\n"); | 284 | dev_err(dev, "can not get irda_clk\n"); |
| 285 | return -EIO; | 285 | return -EIO; |
| 286 | } | 286 | } |
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c index 4fd48df6b989..32e31c5c5dc6 100644 --- a/drivers/net/usb/asix_devices.c +++ b/drivers/net/usb/asix_devices.c | |||
| @@ -962,6 +962,10 @@ static const struct usb_device_id products [] = { | |||
| 962 | USB_DEVICE (0x2001, 0x3c05), | 962 | USB_DEVICE (0x2001, 0x3c05), |
| 963 | .driver_info = (unsigned long) &ax88772_info, | 963 | .driver_info = (unsigned long) &ax88772_info, |
| 964 | }, { | 964 | }, { |
| 965 | // DLink DUB-E100 H/W Ver C1 | ||
| 966 | USB_DEVICE (0x2001, 0x1a02), | ||
| 967 | .driver_info = (unsigned long) &ax88772_info, | ||
| 968 | }, { | ||
| 965 | // Linksys USB1000 | 969 | // Linksys USB1000 |
| 966 | USB_DEVICE (0x1737, 0x0039), | 970 | USB_DEVICE (0x1737, 0x0039), |
| 967 | .driver_info = (unsigned long) &ax88178_info, | 971 | .driver_info = (unsigned long) &ax88178_info, |
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c index 328397c66730..3543c9e57824 100644 --- a/drivers/net/usb/qmi_wwan.c +++ b/drivers/net/usb/qmi_wwan.c | |||
| @@ -297,7 +297,7 @@ static int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message) | |||
| 297 | if (ret < 0) | 297 | if (ret < 0) |
| 298 | goto err; | 298 | goto err; |
| 299 | 299 | ||
| 300 | if (info->subdriver && info->subdriver->suspend) | 300 | if (intf == info->control && info->subdriver && info->subdriver->suspend) |
| 301 | ret = info->subdriver->suspend(intf, message); | 301 | ret = info->subdriver->suspend(intf, message); |
| 302 | if (ret < 0) | 302 | if (ret < 0) |
| 303 | usbnet_resume(intf); | 303 | usbnet_resume(intf); |
| @@ -310,13 +310,14 @@ static int qmi_wwan_resume(struct usb_interface *intf) | |||
| 310 | struct usbnet *dev = usb_get_intfdata(intf); | 310 | struct usbnet *dev = usb_get_intfdata(intf); |
| 311 | struct qmi_wwan_state *info = (void *)&dev->data; | 311 | struct qmi_wwan_state *info = (void *)&dev->data; |
| 312 | int ret = 0; | 312 | int ret = 0; |
| 313 | bool callsub = (intf == info->control && info->subdriver && info->subdriver->resume); | ||
| 313 | 314 | ||
| 314 | if (info->subdriver && info->subdriver->resume) | 315 | if (callsub) |
| 315 | ret = info->subdriver->resume(intf); | 316 | ret = info->subdriver->resume(intf); |
| 316 | if (ret < 0) | 317 | if (ret < 0) |
| 317 | goto err; | 318 | goto err; |
| 318 | ret = usbnet_resume(intf); | 319 | ret = usbnet_resume(intf); |
| 319 | if (ret < 0 && info->subdriver && info->subdriver->resume && info->subdriver->suspend) | 320 | if (ret < 0 && callsub && info->subdriver->suspend) |
| 320 | info->subdriver->suspend(intf, PMSG_SUSPEND); | 321 | info->subdriver->suspend(intf, PMSG_SUSPEND); |
| 321 | err: | 322 | err: |
| 322 | return ret; | 323 | return ret; |
| @@ -365,16 +366,20 @@ static const struct usb_device_id products[] = { | |||
| 365 | }, | 366 | }, |
| 366 | 367 | ||
| 367 | /* 2. Combined interface devices matching on class+protocol */ | 368 | /* 2. Combined interface devices matching on class+protocol */ |
| 369 | { /* Huawei E367 and possibly others in "Windows mode" */ | ||
| 370 | USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 7), | ||
| 371 | .driver_info = (unsigned long)&qmi_wwan_info, | ||
| 372 | }, | ||
| 368 | { /* Huawei E392, E398 and possibly others in "Windows mode" */ | 373 | { /* Huawei E392, E398 and possibly others in "Windows mode" */ |
| 369 | USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 17), | 374 | USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, USB_CLASS_VENDOR_SPEC, 1, 17), |
| 370 | .driver_info = (unsigned long)&qmi_wwan_shared, | 375 | .driver_info = (unsigned long)&qmi_wwan_shared, |
| 371 | }, | 376 | }, |
| 372 | { /* Pantech UML290 */ | 377 | { /* Pantech UML290, P4200 and more */ |
| 373 | USB_DEVICE_AND_INTERFACE_INFO(0x106c, 0x3718, USB_CLASS_VENDOR_SPEC, 0xf0, 0xff), | 378 | USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf0, 0xff), |
| 374 | .driver_info = (unsigned long)&qmi_wwan_shared, | 379 | .driver_info = (unsigned long)&qmi_wwan_shared, |
| 375 | }, | 380 | }, |
| 376 | { /* Pantech UML290 - newer firmware */ | 381 | { /* Pantech UML290 - newer firmware */ |
| 377 | USB_DEVICE_AND_INTERFACE_INFO(0x106c, 0x3718, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff), | 382 | USB_VENDOR_AND_INTERFACE_INFO(0x106c, USB_CLASS_VENDOR_SPEC, 0xf1, 0xff), |
| 378 | .driver_info = (unsigned long)&qmi_wwan_shared, | 383 | .driver_info = (unsigned long)&qmi_wwan_shared, |
| 379 | }, | 384 | }, |
| 380 | 385 | ||
| @@ -382,6 +387,7 @@ static const struct usb_device_id products[] = { | |||
| 382 | {QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */ | 387 | {QMI_FIXED_INTF(0x19d2, 0x0055, 1)}, /* ZTE (Vodafone) K3520-Z */ |
| 383 | {QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */ | 388 | {QMI_FIXED_INTF(0x19d2, 0x0063, 4)}, /* ZTE (Vodafone) K3565-Z */ |
| 384 | {QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */ | 389 | {QMI_FIXED_INTF(0x19d2, 0x0104, 4)}, /* ZTE (Vodafone) K4505-Z */ |
| 390 | {QMI_FIXED_INTF(0x19d2, 0x0157, 5)}, /* ZTE MF683 */ | ||
| 385 | {QMI_FIXED_INTF(0x19d2, 0x0167, 4)}, /* ZTE MF820D */ | 391 | {QMI_FIXED_INTF(0x19d2, 0x0167, 4)}, /* ZTE MF820D */ |
| 386 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ | 392 | {QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */ |
| 387 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ | 393 | {QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */ |
| @@ -398,7 +404,6 @@ static const struct usb_device_id products[] = { | |||
| 398 | /* 4. Gobi 1000 devices */ | 404 | /* 4. Gobi 1000 devices */ |
| 399 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ | 405 | {QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */ |
| 400 | {QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ | 406 | {QMI_GOBI1K_DEVICE(0x03f0, 0x1f1d)}, /* HP un2400 Gobi Modem Device */ |
| 401 | {QMI_GOBI1K_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | ||
| 402 | {QMI_GOBI1K_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ | 407 | {QMI_GOBI1K_DEVICE(0x04da, 0x250d)}, /* Panasonic Gobi Modem device */ |
| 403 | {QMI_GOBI1K_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ | 408 | {QMI_GOBI1K_DEVICE(0x413c, 0x8172)}, /* Dell Gobi Modem device */ |
| 404 | {QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ | 409 | {QMI_GOBI1K_DEVICE(0x1410, 0xa001)}, /* Novatel Gobi Modem device */ |
| @@ -413,7 +418,9 @@ static const struct usb_device_id products[] = { | |||
| 413 | 418 | ||
| 414 | /* 5. Gobi 2000 and 3000 devices */ | 419 | /* 5. Gobi 2000 and 3000 devices */ |
| 415 | {QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ | 420 | {QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ |
| 421 | {QMI_GOBI_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */ | ||
| 416 | {QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */ | 422 | {QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */ |
| 423 | {QMI_GOBI_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */ | ||
| 417 | {QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ | 424 | {QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ |
| 418 | {QMI_GOBI_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */ | 425 | {QMI_GOBI_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */ |
| 419 | {QMI_GOBI_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */ | 426 | {QMI_GOBI_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */ |
| @@ -438,9 +445,12 @@ static const struct usb_device_id products[] = { | |||
| 438 | {QMI_GOBI_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ | 445 | {QMI_GOBI_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ |
| 439 | {QMI_GOBI_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ | 446 | {QMI_GOBI_DEVICE(0x05c6, 0x9205)}, /* Gobi 2000 Modem device */ |
| 440 | {QMI_GOBI_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */ | 447 | {QMI_GOBI_DEVICE(0x1199, 0x9013)}, /* Sierra Wireless Gobi 3000 Modem device (MC8355) */ |
| 448 | {QMI_GOBI_DEVICE(0x03f0, 0x371d)}, /* HP un2430 Mobile Broadband Module */ | ||
| 441 | {QMI_GOBI_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */ | 449 | {QMI_GOBI_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */ |
| 442 | {QMI_GOBI_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */ | 450 | {QMI_GOBI_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */ |
| 443 | {QMI_GOBI_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ | 451 | {QMI_GOBI_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ |
| 452 | {QMI_GOBI_DEVICE(0x12d1, 0x14f1)}, /* Sony Gobi 3000 Composite */ | ||
| 453 | {QMI_GOBI_DEVICE(0x1410, 0xa021)}, /* Foxconn Gobi 3000 Modem device (Novatel E396) */ | ||
| 444 | 454 | ||
| 445 | { } /* END */ | 455 | { } /* END */ |
| 446 | }; | 456 | }; |
diff --git a/drivers/net/usb/sierra_net.c b/drivers/net/usb/sierra_net.c index 7be49ea60b6d..8e22417fa6c1 100644 --- a/drivers/net/usb/sierra_net.c +++ b/drivers/net/usb/sierra_net.c | |||
| @@ -656,7 +656,7 @@ static int sierra_net_get_fw_attr(struct usbnet *dev, u16 *datap) | |||
| 656 | return -EIO; | 656 | return -EIO; |
| 657 | } | 657 | } |
| 658 | 658 | ||
| 659 | *datap = *attrdata; | 659 | *datap = le16_to_cpu(*attrdata); |
| 660 | 660 | ||
| 661 | kfree(attrdata); | 661 | kfree(attrdata); |
| 662 | return result; | 662 | return result; |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 8531c1caac28..fc9f578a1e25 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
| @@ -1201,19 +1201,26 @@ deferred: | |||
| 1201 | } | 1201 | } |
| 1202 | EXPORT_SYMBOL_GPL(usbnet_start_xmit); | 1202 | EXPORT_SYMBOL_GPL(usbnet_start_xmit); |
| 1203 | 1203 | ||
| 1204 | static void rx_alloc_submit(struct usbnet *dev, gfp_t flags) | 1204 | static int rx_alloc_submit(struct usbnet *dev, gfp_t flags) |
| 1205 | { | 1205 | { |
| 1206 | struct urb *urb; | 1206 | struct urb *urb; |
| 1207 | int i; | 1207 | int i; |
| 1208 | int ret = 0; | ||
| 1208 | 1209 | ||
| 1209 | /* don't refill the queue all at once */ | 1210 | /* don't refill the queue all at once */ |
| 1210 | for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { | 1211 | for (i = 0; i < 10 && dev->rxq.qlen < RX_QLEN(dev); i++) { |
| 1211 | urb = usb_alloc_urb(0, flags); | 1212 | urb = usb_alloc_urb(0, flags); |
| 1212 | if (urb != NULL) { | 1213 | if (urb != NULL) { |
| 1213 | if (rx_submit(dev, urb, flags) == -ENOLINK) | 1214 | ret = rx_submit(dev, urb, flags); |
| 1214 | return; | 1215 | if (ret) |
| 1216 | goto err; | ||
| 1217 | } else { | ||
| 1218 | ret = -ENOMEM; | ||
| 1219 | goto err; | ||
| 1215 | } | 1220 | } |
| 1216 | } | 1221 | } |
| 1222 | err: | ||
| 1223 | return ret; | ||
| 1217 | } | 1224 | } |
| 1218 | 1225 | ||
| 1219 | /*-------------------------------------------------------------------------*/ | 1226 | /*-------------------------------------------------------------------------*/ |
| @@ -1257,7 +1264,8 @@ static void usbnet_bh (unsigned long param) | |||
| 1257 | int temp = dev->rxq.qlen; | 1264 | int temp = dev->rxq.qlen; |
| 1258 | 1265 | ||
| 1259 | if (temp < RX_QLEN(dev)) { | 1266 | if (temp < RX_QLEN(dev)) { |
| 1260 | rx_alloc_submit(dev, GFP_ATOMIC); | 1267 | if (rx_alloc_submit(dev, GFP_ATOMIC) == -ENOLINK) |
| 1268 | return; | ||
| 1261 | if (temp != dev->rxq.qlen) | 1269 | if (temp != dev->rxq.qlen) |
| 1262 | netif_dbg(dev, link, dev->net, | 1270 | netif_dbg(dev, link, dev->net, |
| 1263 | "rxqlen %d --> %d\n", | 1271 | "rxqlen %d --> %d\n", |
| @@ -1573,7 +1581,7 @@ int usbnet_resume (struct usb_interface *intf) | |||
| 1573 | netif_device_present(dev->net) && | 1581 | netif_device_present(dev->net) && |
| 1574 | !timer_pending(&dev->delay) && | 1582 | !timer_pending(&dev->delay) && |
| 1575 | !test_bit(EVENT_RX_HALT, &dev->flags)) | 1583 | !test_bit(EVENT_RX_HALT, &dev->flags)) |
| 1576 | rx_alloc_submit(dev, GFP_KERNEL); | 1584 | rx_alloc_submit(dev, GFP_NOIO); |
| 1577 | 1585 | ||
| 1578 | if (!(dev->txq.qlen >= TX_QLEN(dev))) | 1586 | if (!(dev->txq.qlen >= TX_QLEN(dev))) |
| 1579 | netif_tx_wake_all_queues(dev->net); | 1587 | netif_tx_wake_all_queues(dev->net); |
diff --git a/drivers/net/wan/ixp4xx_hss.c b/drivers/net/wan/ixp4xx_hss.c index aaaca9aa2293..3f575afd8cfc 100644 --- a/drivers/net/wan/ixp4xx_hss.c +++ b/drivers/net/wan/ixp4xx_hss.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 11 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 12 | 12 | ||
| 13 | #include <linux/module.h> | ||
| 13 | #include <linux/bitops.h> | 14 | #include <linux/bitops.h> |
| 14 | #include <linux/cdev.h> | 15 | #include <linux/cdev.h> |
| 15 | #include <linux/dma-mapping.h> | 16 | #include <linux/dma-mapping.h> |
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.c b/drivers/net/wireless/ath/ath5k/eeprom.c index 4026c906cc7b..b7e0258887e7 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.c +++ b/drivers/net/wireless/ath/ath5k/eeprom.c | |||
| @@ -1482,7 +1482,7 @@ ath5k_eeprom_read_target_rate_pwr_info(struct ath5k_hw *ah, unsigned int mode) | |||
| 1482 | case AR5K_EEPROM_MODE_11A: | 1482 | case AR5K_EEPROM_MODE_11A: |
| 1483 | offset += AR5K_EEPROM_TARGET_PWR_OFF_11A(ee->ee_version); | 1483 | offset += AR5K_EEPROM_TARGET_PWR_OFF_11A(ee->ee_version); |
| 1484 | rate_pcal_info = ee->ee_rate_tpwr_a; | 1484 | rate_pcal_info = ee->ee_rate_tpwr_a; |
| 1485 | ee->ee_rate_target_pwr_num[mode] = AR5K_EEPROM_N_5GHZ_CHAN; | 1485 | ee->ee_rate_target_pwr_num[mode] = AR5K_EEPROM_N_5GHZ_RATE_CHAN; |
| 1486 | break; | 1486 | break; |
| 1487 | case AR5K_EEPROM_MODE_11B: | 1487 | case AR5K_EEPROM_MODE_11B: |
| 1488 | offset += AR5K_EEPROM_TARGET_PWR_OFF_11B(ee->ee_version); | 1488 | offset += AR5K_EEPROM_TARGET_PWR_OFF_11B(ee->ee_version); |
diff --git a/drivers/net/wireless/ath/ath5k/eeprom.h b/drivers/net/wireless/ath/ath5k/eeprom.h index dc2bcfeadeb4..94a9bbea6874 100644 --- a/drivers/net/wireless/ath/ath5k/eeprom.h +++ b/drivers/net/wireless/ath/ath5k/eeprom.h | |||
| @@ -182,6 +182,7 @@ | |||
| 182 | #define AR5K_EEPROM_EEP_DELTA 10 | 182 | #define AR5K_EEPROM_EEP_DELTA 10 |
| 183 | #define AR5K_EEPROM_N_MODES 3 | 183 | #define AR5K_EEPROM_N_MODES 3 |
| 184 | #define AR5K_EEPROM_N_5GHZ_CHAN 10 | 184 | #define AR5K_EEPROM_N_5GHZ_CHAN 10 |
| 185 | #define AR5K_EEPROM_N_5GHZ_RATE_CHAN 8 | ||
| 185 | #define AR5K_EEPROM_N_2GHZ_CHAN 3 | 186 | #define AR5K_EEPROM_N_2GHZ_CHAN 3 |
| 186 | #define AR5K_EEPROM_N_2GHZ_CHAN_2413 4 | 187 | #define AR5K_EEPROM_N_2GHZ_CHAN_2413 4 |
| 187 | #define AR5K_EEPROM_N_2GHZ_CHAN_MAX 4 | 188 | #define AR5K_EEPROM_N_2GHZ_CHAN_MAX 4 |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c index 2588848f4a82..d066f2516e47 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | |||
| @@ -2982,6 +2982,10 @@ static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah, | |||
| 2982 | case EEP_RX_MASK: | 2982 | case EEP_RX_MASK: |
| 2983 | return pBase->txrxMask & 0xf; | 2983 | return pBase->txrxMask & 0xf; |
| 2984 | case EEP_PAPRD: | 2984 | case EEP_PAPRD: |
| 2985 | if (AR_SREV_9462(ah)) | ||
| 2986 | return false; | ||
| 2987 | if (!ah->config.enable_paprd); | ||
| 2988 | return false; | ||
| 2985 | return !!(pBase->featureEnable & BIT(5)); | 2989 | return !!(pBase->featureEnable & BIT(5)); |
| 2986 | case EEP_CHAIN_MASK_REDUCE: | 2990 | case EEP_CHAIN_MASK_REDUCE: |
| 2987 | return (pBase->miscConfiguration >> 0x3) & 0x1; | 2991 | return (pBase->miscConfiguration >> 0x3) & 0x1; |
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c index 2c9f7d7ed4cc..0ed3846f9cbb 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_paprd.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_paprd.c | |||
| @@ -142,6 +142,7 @@ static int ar9003_paprd_setup_single_table(struct ath_hw *ah) | |||
| 142 | }; | 142 | }; |
| 143 | int training_power; | 143 | int training_power; |
| 144 | int i, val; | 144 | int i, val; |
| 145 | u32 am2pm_mask = ah->paprd_ratemask; | ||
| 145 | 146 | ||
| 146 | if (IS_CHAN_2GHZ(ah->curchan)) | 147 | if (IS_CHAN_2GHZ(ah->curchan)) |
| 147 | training_power = ar9003_get_training_power_2g(ah); | 148 | training_power = ar9003_get_training_power_2g(ah); |
| @@ -158,10 +159,13 @@ static int ar9003_paprd_setup_single_table(struct ath_hw *ah) | |||
| 158 | } | 159 | } |
| 159 | ah->paprd_training_power = training_power; | 160 | ah->paprd_training_power = training_power; |
| 160 | 161 | ||
| 162 | if (AR_SREV_9330(ah)) | ||
| 163 | am2pm_mask = 0; | ||
| 164 | |||
| 161 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, | 165 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2AM, AR_PHY_PAPRD_AM2AM_MASK, |
| 162 | ah->paprd_ratemask); | 166 | ah->paprd_ratemask); |
| 163 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, | 167 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_AM2PM, AR_PHY_PAPRD_AM2PM_MASK, |
| 164 | ah->paprd_ratemask); | 168 | am2pm_mask); |
| 165 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, | 169 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_HT40, AR_PHY_PAPRD_HT40_MASK, |
| 166 | ah->paprd_ratemask_ht40); | 170 | ah->paprd_ratemask_ht40); |
| 167 | 171 | ||
| @@ -782,6 +786,102 @@ int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain) | |||
| 782 | } | 786 | } |
| 783 | EXPORT_SYMBOL(ar9003_paprd_setup_gain_table); | 787 | EXPORT_SYMBOL(ar9003_paprd_setup_gain_table); |
| 784 | 788 | ||
| 789 | static bool ar9003_paprd_retrain_pa_in(struct ath_hw *ah, | ||
| 790 | struct ath9k_hw_cal_data *caldata, | ||
| 791 | int chain) | ||
| 792 | { | ||
| 793 | u32 *pa_in = caldata->pa_table[chain]; | ||
| 794 | int capdiv_offset, quick_drop_offset; | ||
| 795 | int capdiv2g, quick_drop; | ||
| 796 | int count = 0; | ||
| 797 | int i; | ||
| 798 | |||
| 799 | if (!AR_SREV_9485(ah) && !AR_SREV_9330(ah)) | ||
| 800 | return false; | ||
| 801 | |||
| 802 | capdiv2g = REG_READ_FIELD(ah, AR_PHY_65NM_CH0_TXRF3, | ||
| 803 | AR_PHY_65NM_CH0_TXRF3_CAPDIV2G); | ||
| 804 | |||
| 805 | quick_drop = REG_READ_FIELD(ah, AR_PHY_PAPRD_TRAINER_CNTL3, | ||
| 806 | AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP); | ||
| 807 | |||
| 808 | if (quick_drop) | ||
| 809 | quick_drop -= 0x40; | ||
| 810 | |||
| 811 | for (i = 0; i < NUM_BIN + 1; i++) { | ||
| 812 | if (pa_in[i] == 1400) | ||
| 813 | count++; | ||
| 814 | } | ||
| 815 | |||
| 816 | if (AR_SREV_9485(ah)) { | ||
| 817 | if (pa_in[23] < 800) { | ||
| 818 | capdiv_offset = (int)((1000 - pa_in[23] + 75) / 150); | ||
| 819 | capdiv2g += capdiv_offset; | ||
| 820 | if (capdiv2g > 7) { | ||
| 821 | capdiv2g = 7; | ||
| 822 | if (pa_in[23] < 600) { | ||
| 823 | quick_drop++; | ||
| 824 | if (quick_drop > 0) | ||
| 825 | quick_drop = 0; | ||
| 826 | } | ||
| 827 | } | ||
| 828 | } else if (pa_in[23] == 1400) { | ||
| 829 | quick_drop_offset = min_t(int, count / 3, 2); | ||
| 830 | quick_drop += quick_drop_offset; | ||
| 831 | capdiv2g += quick_drop_offset / 2; | ||
| 832 | |||
| 833 | if (capdiv2g > 7) | ||
| 834 | capdiv2g = 7; | ||
| 835 | |||
| 836 | if (quick_drop > 0) { | ||
| 837 | quick_drop = 0; | ||
| 838 | capdiv2g -= quick_drop_offset; | ||
| 839 | if (capdiv2g < 0) | ||
| 840 | capdiv2g = 0; | ||
| 841 | } | ||
| 842 | } else { | ||
| 843 | return false; | ||
| 844 | } | ||
| 845 | } else if (AR_SREV_9330(ah)) { | ||
| 846 | if (pa_in[23] < 1000) { | ||
| 847 | capdiv_offset = (1000 - pa_in[23]) / 100; | ||
| 848 | capdiv2g += capdiv_offset; | ||
| 849 | if (capdiv_offset > 3) { | ||
| 850 | capdiv_offset = 1; | ||
| 851 | quick_drop--; | ||
| 852 | } | ||
| 853 | |||
| 854 | capdiv2g += capdiv_offset; | ||
| 855 | if (capdiv2g > 6) | ||
| 856 | capdiv2g = 6; | ||
| 857 | if (quick_drop < -4) | ||
| 858 | quick_drop = -4; | ||
| 859 | } else if (pa_in[23] == 1400) { | ||
| 860 | if (count > 3) { | ||
| 861 | quick_drop++; | ||
| 862 | capdiv2g -= count / 4; | ||
| 863 | if (quick_drop > -2) | ||
| 864 | quick_drop = -2; | ||
| 865 | } else { | ||
| 866 | capdiv2g--; | ||
| 867 | } | ||
| 868 | |||
| 869 | if (capdiv2g < 0) | ||
| 870 | capdiv2g = 0; | ||
| 871 | } else { | ||
| 872 | return false; | ||
| 873 | } | ||
| 874 | } | ||
| 875 | |||
| 876 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_TXRF3, | ||
| 877 | AR_PHY_65NM_CH0_TXRF3_CAPDIV2G, capdiv2g); | ||
| 878 | REG_RMW_FIELD(ah, AR_PHY_PAPRD_TRAINER_CNTL3, | ||
| 879 | AR_PHY_PAPRD_TRAINER_CNTL3_CF_PAPRD_QUICK_DROP, | ||
| 880 | quick_drop); | ||
| 881 | |||
| 882 | return true; | ||
| 883 | } | ||
| 884 | |||
| 785 | int ar9003_paprd_create_curve(struct ath_hw *ah, | 885 | int ar9003_paprd_create_curve(struct ath_hw *ah, |
| 786 | struct ath9k_hw_cal_data *caldata, int chain) | 886 | struct ath9k_hw_cal_data *caldata, int chain) |
| 787 | { | 887 | { |
| @@ -817,6 +917,9 @@ int ar9003_paprd_create_curve(struct ath_hw *ah, | |||
| 817 | if (!create_pa_curve(data_L, data_U, pa_table, small_signal_gain)) | 917 | if (!create_pa_curve(data_L, data_U, pa_table, small_signal_gain)) |
| 818 | status = -2; | 918 | status = -2; |
| 819 | 919 | ||
| 920 | if (ar9003_paprd_retrain_pa_in(ah, caldata, chain)) | ||
| 921 | status = -EINPROGRESS; | ||
| 922 | |||
| 820 | REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1, | 923 | REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1, |
| 821 | AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); | 924 | AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE); |
| 822 | 925 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h index 7bfbaf065a43..84d3d4956861 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | |||
| @@ -625,6 +625,10 @@ | |||
| 625 | #define AR_PHY_AIC_CTRL_4_B0 (AR_SM_BASE + 0x4c0) | 625 | #define AR_PHY_AIC_CTRL_4_B0 (AR_SM_BASE + 0x4c0) |
| 626 | #define AR_PHY_AIC_STAT_2_B0 (AR_SM_BASE + 0x4cc) | 626 | #define AR_PHY_AIC_STAT_2_B0 (AR_SM_BASE + 0x4cc) |
| 627 | 627 | ||
| 628 | #define AR_PHY_65NM_CH0_TXRF3 0x16048 | ||
| 629 | #define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G 0x0000001e | ||
| 630 | #define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G_S 1 | ||
| 631 | |||
| 628 | #define AR_PHY_65NM_CH0_SYNTH4 0x1608c | 632 | #define AR_PHY_65NM_CH0_SYNTH4 0x1608c |
| 629 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT (AR_SREV_9462(ah) ? 0x00000001 : 0x00000002) | 633 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT (AR_SREV_9462(ah) ? 0x00000001 : 0x00000002) |
| 630 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S (AR_SREV_9462(ah) ? 0 : 1) | 634 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S (AR_SREV_9462(ah) ? 0 : 1) |
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 68b643c8943c..c8ef30127adb 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
| @@ -1577,6 +1577,8 @@ int ath9k_init_debug(struct ath_hw *ah) | |||
| 1577 | sc->debug.debugfs_phy, sc, &fops_tx_chainmask); | 1577 | sc->debug.debugfs_phy, sc, &fops_tx_chainmask); |
| 1578 | debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR, | 1578 | debugfs_create_file("disable_ani", S_IRUSR | S_IWUSR, |
| 1579 | sc->debug.debugfs_phy, sc, &fops_disable_ani); | 1579 | sc->debug.debugfs_phy, sc, &fops_disable_ani); |
| 1580 | debugfs_create_bool("paprd", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, | ||
| 1581 | &sc->sc_ah->config.enable_paprd); | ||
| 1580 | debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, | 1582 | debugfs_create_file("regidx", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, |
| 1581 | sc, &fops_regidx); | 1583 | sc, &fops_regidx); |
| 1582 | debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, | 1584 | debugfs_create_file("regval", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy, |
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index bacdb8fb4ef4..9f83f71742a5 100644 --- a/drivers/net/wireless/ath/ath9k/gpio.c +++ b/drivers/net/wireless/ath/ath9k/gpio.c | |||
| @@ -341,7 +341,8 @@ void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc) | |||
| 341 | { | 341 | { |
| 342 | struct ath_btcoex *btcoex = &sc->btcoex; | 342 | struct ath_btcoex *btcoex = &sc->btcoex; |
| 343 | 343 | ||
| 344 | ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); | 344 | if (btcoex->hw_timer_enabled) |
| 345 | ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer); | ||
| 345 | } | 346 | } |
| 346 | 347 | ||
| 347 | u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) | 348 | u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen) |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index 60b6a9daff7e..4faf0a395876 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -463,9 +463,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) | |||
| 463 | ah->config.spurchans[i][1] = AR_NO_SPUR; | 463 | ah->config.spurchans[i][1] = AR_NO_SPUR; |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | /* PAPRD needs some more work to be enabled */ | ||
| 467 | ah->config.paprd_disable = 1; | ||
| 468 | |||
| 469 | ah->config.rx_intr_mitigation = true; | 466 | ah->config.rx_intr_mitigation = true; |
| 470 | ah->config.pcieSerDesWrite = true; | 467 | ah->config.pcieSerDesWrite = true; |
| 471 | 468 | ||
| @@ -978,9 +975,6 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah, | |||
| 978 | else | 975 | else |
| 979 | imr_reg |= AR_IMR_TXOK; | 976 | imr_reg |= AR_IMR_TXOK; |
| 980 | 977 | ||
| 981 | if (opmode == NL80211_IFTYPE_AP) | ||
| 982 | imr_reg |= AR_IMR_MIB; | ||
| 983 | |||
| 984 | ENABLE_REGWRITE_BUFFER(ah); | 978 | ENABLE_REGWRITE_BUFFER(ah); |
| 985 | 979 | ||
| 986 | REG_WRITE(ah, AR_IMR, imr_reg); | 980 | REG_WRITE(ah, AR_IMR, imr_reg); |
| @@ -1778,6 +1772,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
| 1778 | /* Operating channel changed, reset channel calibration data */ | 1772 | /* Operating channel changed, reset channel calibration data */ |
| 1779 | memset(caldata, 0, sizeof(*caldata)); | 1773 | memset(caldata, 0, sizeof(*caldata)); |
| 1780 | ath9k_init_nfcal_hist_buffer(ah, chan); | 1774 | ath9k_init_nfcal_hist_buffer(ah, chan); |
| 1775 | } else if (caldata) { | ||
| 1776 | caldata->paprd_packet_sent = false; | ||
| 1781 | } | 1777 | } |
| 1782 | ah->noise = ath9k_hw_getchan_noise(ah, chan); | 1778 | ah->noise = ath9k_hw_getchan_noise(ah, chan); |
| 1783 | 1779 | ||
| @@ -2501,9 +2497,6 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) | |||
| 2501 | pCap->rx_status_len = sizeof(struct ar9003_rxs); | 2497 | pCap->rx_status_len = sizeof(struct ar9003_rxs); |
| 2502 | pCap->tx_desc_len = sizeof(struct ar9003_txc); | 2498 | pCap->tx_desc_len = sizeof(struct ar9003_txc); |
| 2503 | pCap->txs_len = sizeof(struct ar9003_txs); | 2499 | pCap->txs_len = sizeof(struct ar9003_txs); |
| 2504 | if (!ah->config.paprd_disable && | ||
| 2505 | ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) | ||
| 2506 | pCap->hw_caps |= ATH9K_HW_CAP_PAPRD; | ||
| 2507 | } else { | 2500 | } else { |
| 2508 | pCap->tx_desc_len = sizeof(struct ath_desc); | 2501 | pCap->tx_desc_len = sizeof(struct ath_desc); |
| 2509 | if (AR_SREV_9280_20(ah)) | 2502 | if (AR_SREV_9280_20(ah)) |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index ce7332c64efb..de6968fc64f4 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
| @@ -236,7 +236,6 @@ enum ath9k_hw_caps { | |||
| 236 | ATH9K_HW_CAP_LDPC = BIT(6), | 236 | ATH9K_HW_CAP_LDPC = BIT(6), |
| 237 | ATH9K_HW_CAP_FASTCLOCK = BIT(7), | 237 | ATH9K_HW_CAP_FASTCLOCK = BIT(7), |
| 238 | ATH9K_HW_CAP_SGI_20 = BIT(8), | 238 | ATH9K_HW_CAP_SGI_20 = BIT(8), |
| 239 | ATH9K_HW_CAP_PAPRD = BIT(9), | ||
| 240 | ATH9K_HW_CAP_ANT_DIV_COMB = BIT(10), | 239 | ATH9K_HW_CAP_ANT_DIV_COMB = BIT(10), |
| 241 | ATH9K_HW_CAP_2GHZ = BIT(11), | 240 | ATH9K_HW_CAP_2GHZ = BIT(11), |
| 242 | ATH9K_HW_CAP_5GHZ = BIT(12), | 241 | ATH9K_HW_CAP_5GHZ = BIT(12), |
| @@ -287,12 +286,12 @@ struct ath9k_ops_config { | |||
| 287 | u8 pcie_clock_req; | 286 | u8 pcie_clock_req; |
| 288 | u32 pcie_waen; | 287 | u32 pcie_waen; |
| 289 | u8 analog_shiftreg; | 288 | u8 analog_shiftreg; |
| 290 | u8 paprd_disable; | ||
| 291 | u32 ofdm_trig_low; | 289 | u32 ofdm_trig_low; |
| 292 | u32 ofdm_trig_high; | 290 | u32 ofdm_trig_high; |
| 293 | u32 cck_trig_high; | 291 | u32 cck_trig_high; |
| 294 | u32 cck_trig_low; | 292 | u32 cck_trig_low; |
| 295 | u32 enable_ani; | 293 | u32 enable_ani; |
| 294 | u32 enable_paprd; | ||
| 296 | int serialize_regmode; | 295 | int serialize_regmode; |
| 297 | bool rx_intr_mitigation; | 296 | bool rx_intr_mitigation; |
| 298 | bool tx_intr_mitigation; | 297 | bool tx_intr_mitigation; |
| @@ -405,6 +404,7 @@ struct ath9k_hw_cal_data { | |||
| 405 | int8_t iCoff; | 404 | int8_t iCoff; |
| 406 | int8_t qCoff; | 405 | int8_t qCoff; |
| 407 | bool rtt_done; | 406 | bool rtt_done; |
| 407 | bool paprd_packet_sent; | ||
| 408 | bool paprd_done; | 408 | bool paprd_done; |
| 409 | bool nfcal_pending; | 409 | bool nfcal_pending; |
| 410 | bool nfcal_interference; | 410 | bool nfcal_interference; |
diff --git a/drivers/net/wireless/ath/ath9k/link.c b/drivers/net/wireless/ath/ath9k/link.c index d4549e9aac5c..7b88b9c39ccd 100644 --- a/drivers/net/wireless/ath/ath9k/link.c +++ b/drivers/net/wireless/ath/ath9k/link.c | |||
| @@ -254,8 +254,9 @@ void ath_paprd_calibrate(struct work_struct *work) | |||
| 254 | int chain_ok = 0; | 254 | int chain_ok = 0; |
| 255 | int chain; | 255 | int chain; |
| 256 | int len = 1800; | 256 | int len = 1800; |
| 257 | int ret; | ||
| 257 | 258 | ||
| 258 | if (!caldata) | 259 | if (!caldata || !caldata->paprd_packet_sent || caldata->paprd_done) |
| 259 | return; | 260 | return; |
| 260 | 261 | ||
| 261 | ath9k_ps_wakeup(sc); | 262 | ath9k_ps_wakeup(sc); |
| @@ -282,13 +283,6 @@ void ath_paprd_calibrate(struct work_struct *work) | |||
| 282 | continue; | 283 | continue; |
| 283 | 284 | ||
| 284 | chain_ok = 0; | 285 | chain_ok = 0; |
| 285 | |||
| 286 | ath_dbg(common, CALIBRATE, | ||
| 287 | "Sending PAPRD frame for thermal measurement on chain %d\n", | ||
| 288 | chain); | ||
| 289 | if (!ath_paprd_send_frame(sc, skb, chain)) | ||
| 290 | goto fail_paprd; | ||
| 291 | |||
| 292 | ar9003_paprd_setup_gain_table(ah, chain); | 286 | ar9003_paprd_setup_gain_table(ah, chain); |
| 293 | 287 | ||
| 294 | ath_dbg(common, CALIBRATE, | 288 | ath_dbg(common, CALIBRATE, |
| @@ -302,7 +296,13 @@ void ath_paprd_calibrate(struct work_struct *work) | |||
| 302 | break; | 296 | break; |
| 303 | } | 297 | } |
| 304 | 298 | ||
| 305 | if (ar9003_paprd_create_curve(ah, caldata, chain)) { | 299 | ret = ar9003_paprd_create_curve(ah, caldata, chain); |
| 300 | if (ret == -EINPROGRESS) { | ||
| 301 | ath_dbg(common, CALIBRATE, | ||
| 302 | "PAPRD curve on chain %d needs to be re-trained\n", | ||
| 303 | chain); | ||
| 304 | break; | ||
| 305 | } else if (ret) { | ||
| 306 | ath_dbg(common, CALIBRATE, | 306 | ath_dbg(common, CALIBRATE, |
| 307 | "PAPRD create curve failed on chain %d\n", | 307 | "PAPRD create curve failed on chain %d\n", |
| 308 | chain); | 308 | chain); |
| @@ -423,7 +423,7 @@ set_timer: | |||
| 423 | cal_interval = min(cal_interval, (u32)short_cal_interval); | 423 | cal_interval = min(cal_interval, (u32)short_cal_interval); |
| 424 | 424 | ||
| 425 | mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); | 425 | mod_timer(&common->ani.timer, jiffies + msecs_to_jiffies(cal_interval)); |
| 426 | if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_PAPRD) && ah->caldata) { | 426 | if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD) && ah->caldata) { |
| 427 | if (!ah->caldata->paprd_done) | 427 | if (!ah->caldata->paprd_done) |
| 428 | ieee80211_queue_work(sc->hw, &sc->paprd_work); | 428 | ieee80211_queue_work(sc->hw, &sc->paprd_work); |
| 429 | else if (!ah->paprd_table_write_done) | 429 | else if (!ah->paprd_table_write_done) |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 2c9da6b2ecb1..0d4155aec48d 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -2018,6 +2018,9 @@ static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, | |||
| 2018 | 2018 | ||
| 2019 | ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); | 2019 | ath_dbg(common, XMIT, "TX complete: skb: %p\n", skb); |
| 2020 | 2020 | ||
| 2021 | if (sc->sc_ah->caldata) | ||
| 2022 | sc->sc_ah->caldata->paprd_packet_sent = true; | ||
| 2023 | |||
| 2021 | if (!(tx_flags & ATH_TX_ERROR)) | 2024 | if (!(tx_flags & ATH_TX_ERROR)) |
| 2022 | /* Frame was ACKed */ | 2025 | /* Frame was ACKed */ |
| 2023 | tx_info->flags |= IEEE80211_TX_STAT_ACK; | 2026 | tx_info->flags |= IEEE80211_TX_STAT_ACK; |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c index 49765d34b4e0..7c4ee72f9d56 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c | |||
| @@ -638,6 +638,8 @@ static int brcmf_sdio_pd_probe(struct platform_device *pdev) | |||
| 638 | 638 | ||
| 639 | oobirq_entry = kzalloc(sizeof(struct brcmf_sdio_oobirq), | 639 | oobirq_entry = kzalloc(sizeof(struct brcmf_sdio_oobirq), |
| 640 | GFP_KERNEL); | 640 | GFP_KERNEL); |
| 641 | if (!oobirq_entry) | ||
| 642 | return -ENOMEM; | ||
| 641 | oobirq_entry->irq = res->start; | 643 | oobirq_entry->irq = res->start; |
| 642 | oobirq_entry->flags = res->flags & IRQF_TRIGGER_MASK; | 644 | oobirq_entry->flags = res->flags & IRQF_TRIGGER_MASK; |
| 643 | list_add_tail(&oobirq_entry->list, &oobirq_lh); | 645 | list_add_tail(&oobirq_entry->list, &oobirq_lh); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c index 2621dd3d7dcd..6f70953f0bad 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_common.c | |||
| @@ -764,8 +764,11 @@ static void brcmf_c_arp_offload_set(struct brcmf_pub *drvr, int arp_mode) | |||
| 764 | { | 764 | { |
| 765 | char iovbuf[32]; | 765 | char iovbuf[32]; |
| 766 | int retcode; | 766 | int retcode; |
| 767 | __le32 arp_mode_le; | ||
| 767 | 768 | ||
| 768 | brcmf_c_mkiovar("arp_ol", (char *)&arp_mode, 4, iovbuf, sizeof(iovbuf)); | 769 | arp_mode_le = cpu_to_le32(arp_mode); |
| 770 | brcmf_c_mkiovar("arp_ol", (char *)&arp_mode_le, 4, iovbuf, | ||
| 771 | sizeof(iovbuf)); | ||
| 769 | retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, | 772 | retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, |
| 770 | iovbuf, sizeof(iovbuf)); | 773 | iovbuf, sizeof(iovbuf)); |
| 771 | retcode = retcode >= 0 ? 0 : retcode; | 774 | retcode = retcode >= 0 ? 0 : retcode; |
| @@ -781,8 +784,11 @@ static void brcmf_c_arp_offload_enable(struct brcmf_pub *drvr, int arp_enable) | |||
| 781 | { | 784 | { |
| 782 | char iovbuf[32]; | 785 | char iovbuf[32]; |
| 783 | int retcode; | 786 | int retcode; |
| 787 | __le32 arp_enable_le; | ||
| 784 | 788 | ||
| 785 | brcmf_c_mkiovar("arpoe", (char *)&arp_enable, 4, | 789 | arp_enable_le = cpu_to_le32(arp_enable); |
| 790 | |||
| 791 | brcmf_c_mkiovar("arpoe", (char *)&arp_enable_le, 4, | ||
| 786 | iovbuf, sizeof(iovbuf)); | 792 | iovbuf, sizeof(iovbuf)); |
| 787 | retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, | 793 | retcode = brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, |
| 788 | iovbuf, sizeof(iovbuf)); | 794 | iovbuf, sizeof(iovbuf)); |
| @@ -800,10 +806,10 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr) | |||
| 800 | char iovbuf[BRCMF_EVENTING_MASK_LEN + 12]; /* Room for | 806 | char iovbuf[BRCMF_EVENTING_MASK_LEN + 12]; /* Room for |
| 801 | "event_msgs" + '\0' + bitvec */ | 807 | "event_msgs" + '\0' + bitvec */ |
| 802 | char buf[128], *ptr; | 808 | char buf[128], *ptr; |
| 803 | u32 roaming = 1; | 809 | __le32 roaming_le = cpu_to_le32(1); |
| 804 | uint bcn_timeout = 3; | 810 | __le32 bcn_timeout_le = cpu_to_le32(3); |
| 805 | int scan_assoc_time = 40; | 811 | __le32 scan_assoc_time_le = cpu_to_le32(40); |
| 806 | int scan_unassoc_time = 40; | 812 | __le32 scan_unassoc_time_le = cpu_to_le32(40); |
| 807 | int i; | 813 | int i; |
| 808 | struct brcmf_bus_dcmd *cmdlst; | 814 | struct brcmf_bus_dcmd *cmdlst; |
| 809 | struct list_head *cur, *q; | 815 | struct list_head *cur, *q; |
| @@ -829,14 +835,14 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr) | |||
| 829 | 835 | ||
| 830 | /* Setup timeout if Beacons are lost and roam is off to report | 836 | /* Setup timeout if Beacons are lost and roam is off to report |
| 831 | link down */ | 837 | link down */ |
| 832 | brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout, 4, iovbuf, | 838 | brcmf_c_mkiovar("bcn_timeout", (char *)&bcn_timeout_le, 4, iovbuf, |
| 833 | sizeof(iovbuf)); | 839 | sizeof(iovbuf)); |
| 834 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, | 840 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, |
| 835 | sizeof(iovbuf)); | 841 | sizeof(iovbuf)); |
| 836 | 842 | ||
| 837 | /* Enable/Disable build-in roaming to allowed ext supplicant to take | 843 | /* Enable/Disable build-in roaming to allowed ext supplicant to take |
| 838 | of romaing */ | 844 | of romaing */ |
| 839 | brcmf_c_mkiovar("roam_off", (char *)&roaming, 4, | 845 | brcmf_c_mkiovar("roam_off", (char *)&roaming_le, 4, |
| 840 | iovbuf, sizeof(iovbuf)); | 846 | iovbuf, sizeof(iovbuf)); |
| 841 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, | 847 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_VAR, iovbuf, |
| 842 | sizeof(iovbuf)); | 848 | sizeof(iovbuf)); |
| @@ -848,9 +854,9 @@ int brcmf_c_preinit_dcmds(struct brcmf_pub *drvr) | |||
| 848 | sizeof(iovbuf)); | 854 | sizeof(iovbuf)); |
| 849 | 855 | ||
| 850 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_CHANNEL_TIME, | 856 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_CHANNEL_TIME, |
| 851 | (char *)&scan_assoc_time, sizeof(scan_assoc_time)); | 857 | (char *)&scan_assoc_time_le, sizeof(scan_assoc_time_le)); |
| 852 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_UNASSOC_TIME, | 858 | brcmf_proto_cdc_set_dcmd(drvr, 0, BRCMF_C_SET_SCAN_UNASSOC_TIME, |
| 853 | (char *)&scan_unassoc_time, sizeof(scan_unassoc_time)); | 859 | (char *)&scan_unassoc_time_le, sizeof(scan_unassoc_time_le)); |
| 854 | 860 | ||
| 855 | /* Set and enable ARP offload feature */ | 861 | /* Set and enable ARP offload feature */ |
| 856 | brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE); | 862 | brcmf_c_arp_offload_set(drvr, BRCMF_ARPOL_MODE); |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c index a299d42da8e7..58f89fa9c9f8 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c | |||
| @@ -519,7 +519,7 @@ static void brcmf_usb_tx_complete(struct urb *urb) | |||
| 519 | else | 519 | else |
| 520 | devinfo->bus_pub.bus->dstats.tx_errors++; | 520 | devinfo->bus_pub.bus->dstats.tx_errors++; |
| 521 | 521 | ||
| 522 | dev_kfree_skb(req->skb); | 522 | brcmu_pkt_buf_free_skb(req->skb); |
| 523 | req->skb = NULL; | 523 | req->skb = NULL; |
| 524 | brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req); | 524 | brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req); |
| 525 | 525 | ||
| @@ -540,7 +540,7 @@ static void brcmf_usb_rx_complete(struct urb *urb) | |||
| 540 | devinfo->bus_pub.bus->dstats.rx_packets++; | 540 | devinfo->bus_pub.bus->dstats.rx_packets++; |
| 541 | } else { | 541 | } else { |
| 542 | devinfo->bus_pub.bus->dstats.rx_errors++; | 542 | devinfo->bus_pub.bus->dstats.rx_errors++; |
| 543 | dev_kfree_skb(skb); | 543 | brcmu_pkt_buf_free_skb(skb); |
| 544 | brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req); | 544 | brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req); |
| 545 | return; | 545 | return; |
| 546 | } | 546 | } |
| @@ -550,13 +550,15 @@ static void brcmf_usb_rx_complete(struct urb *urb) | |||
| 550 | if (brcmf_proto_hdrpull(devinfo->dev, &ifidx, skb) != 0) { | 550 | if (brcmf_proto_hdrpull(devinfo->dev, &ifidx, skb) != 0) { |
| 551 | brcmf_dbg(ERROR, "rx protocol error\n"); | 551 | brcmf_dbg(ERROR, "rx protocol error\n"); |
| 552 | brcmu_pkt_buf_free_skb(skb); | 552 | brcmu_pkt_buf_free_skb(skb); |
| 553 | brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req); | ||
| 553 | devinfo->bus_pub.bus->dstats.rx_errors++; | 554 | devinfo->bus_pub.bus->dstats.rx_errors++; |
| 554 | } else { | 555 | } else { |
| 555 | brcmf_rx_packet(devinfo->dev, ifidx, skb); | 556 | brcmf_rx_packet(devinfo->dev, ifidx, skb); |
| 556 | brcmf_usb_rx_refill(devinfo, req); | 557 | brcmf_usb_rx_refill(devinfo, req); |
| 557 | } | 558 | } |
| 558 | } else { | 559 | } else { |
| 559 | dev_kfree_skb(skb); | 560 | brcmu_pkt_buf_free_skb(skb); |
| 561 | brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req); | ||
| 560 | } | 562 | } |
| 561 | return; | 563 | return; |
| 562 | 564 | ||
| @@ -581,14 +583,13 @@ static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo, | |||
| 581 | usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe, | 583 | usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe, |
| 582 | skb->data, skb_tailroom(skb), brcmf_usb_rx_complete, | 584 | skb->data, skb_tailroom(skb), brcmf_usb_rx_complete, |
| 583 | req); | 585 | req); |
| 584 | req->urb->transfer_flags |= URB_ZERO_PACKET; | ||
| 585 | req->devinfo = devinfo; | 586 | req->devinfo = devinfo; |
| 587 | brcmf_usb_enq(devinfo, &devinfo->rx_postq, req); | ||
| 586 | 588 | ||
| 587 | ret = usb_submit_urb(req->urb, GFP_ATOMIC); | 589 | ret = usb_submit_urb(req->urb, GFP_ATOMIC); |
| 588 | if (ret == 0) { | 590 | if (ret) { |
| 589 | brcmf_usb_enq(devinfo, &devinfo->rx_postq, req); | 591 | brcmf_usb_del_fromq(devinfo, req); |
| 590 | } else { | 592 | brcmu_pkt_buf_free_skb(req->skb); |
| 591 | dev_kfree_skb(req->skb); | ||
| 592 | req->skb = NULL; | 593 | req->skb = NULL; |
| 593 | brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req); | 594 | brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req); |
| 594 | } | 595 | } |
| @@ -683,23 +684,22 @@ static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb) | |||
| 683 | 684 | ||
| 684 | req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq); | 685 | req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq); |
| 685 | if (!req) { | 686 | if (!req) { |
| 687 | brcmu_pkt_buf_free_skb(skb); | ||
| 686 | brcmf_dbg(ERROR, "no req to send\n"); | 688 | brcmf_dbg(ERROR, "no req to send\n"); |
| 687 | return -ENOMEM; | 689 | return -ENOMEM; |
| 688 | } | 690 | } |
| 689 | if (!req->urb) { | ||
| 690 | brcmf_dbg(ERROR, "no urb for req %p\n", req); | ||
| 691 | return -ENOBUFS; | ||
| 692 | } | ||
| 693 | 691 | ||
| 694 | req->skb = skb; | 692 | req->skb = skb; |
| 695 | req->devinfo = devinfo; | 693 | req->devinfo = devinfo; |
| 696 | usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe, | 694 | usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe, |
| 697 | skb->data, skb->len, brcmf_usb_tx_complete, req); | 695 | skb->data, skb->len, brcmf_usb_tx_complete, req); |
| 698 | req->urb->transfer_flags |= URB_ZERO_PACKET; | 696 | req->urb->transfer_flags |= URB_ZERO_PACKET; |
| 697 | brcmf_usb_enq(devinfo, &devinfo->tx_postq, req); | ||
| 699 | ret = usb_submit_urb(req->urb, GFP_ATOMIC); | 698 | ret = usb_submit_urb(req->urb, GFP_ATOMIC); |
| 700 | if (!ret) { | 699 | if (ret) { |
| 701 | brcmf_usb_enq(devinfo, &devinfo->tx_postq, req); | 700 | brcmf_dbg(ERROR, "brcmf_usb_tx usb_submit_urb FAILED\n"); |
| 702 | } else { | 701 | brcmf_usb_del_fromq(devinfo, req); |
| 702 | brcmu_pkt_buf_free_skb(req->skb); | ||
| 703 | req->skb = NULL; | 703 | req->skb = NULL; |
| 704 | brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req); | 704 | brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req); |
| 705 | } | 705 | } |
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c index 28c5fbb4af26..50b5553b6964 100644 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | |||
| @@ -500,8 +500,10 @@ static void wl_iscan_prep(struct brcmf_scan_params_le *params_le, | |||
| 500 | params_le->active_time = cpu_to_le32(-1); | 500 | params_le->active_time = cpu_to_le32(-1); |
| 501 | params_le->passive_time = cpu_to_le32(-1); | 501 | params_le->passive_time = cpu_to_le32(-1); |
| 502 | params_le->home_time = cpu_to_le32(-1); | 502 | params_le->home_time = cpu_to_le32(-1); |
| 503 | if (ssid && ssid->SSID_len) | 503 | if (ssid && ssid->SSID_len) { |
| 504 | memcpy(¶ms_le->ssid_le, ssid, sizeof(struct brcmf_ssid)); | 504 | params_le->ssid_le.SSID_len = cpu_to_le32(ssid->SSID_len); |
| 505 | memcpy(¶ms_le->ssid_le.SSID, ssid->SSID, ssid->SSID_len); | ||
| 506 | } | ||
| 505 | } | 507 | } |
| 506 | 508 | ||
| 507 | static s32 | 509 | static s32 |
| @@ -1876,16 +1878,17 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev, | |||
| 1876 | } | 1878 | } |
| 1877 | 1879 | ||
| 1878 | if (test_bit(WL_STATUS_CONNECTED, &cfg_priv->status)) { | 1880 | if (test_bit(WL_STATUS_CONNECTED, &cfg_priv->status)) { |
| 1879 | scb_val.val = cpu_to_le32(0); | 1881 | memset(&scb_val, 0, sizeof(scb_val)); |
| 1880 | err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_RSSI, &scb_val, | 1882 | err = brcmf_exec_dcmd(ndev, BRCMF_C_GET_RSSI, &scb_val, |
| 1881 | sizeof(struct brcmf_scb_val_le)); | 1883 | sizeof(struct brcmf_scb_val_le)); |
| 1882 | if (err) | 1884 | if (err) { |
| 1883 | WL_ERR("Could not get rssi (%d)\n", err); | 1885 | WL_ERR("Could not get rssi (%d)\n", err); |
| 1884 | 1886 | } else { | |
| 1885 | rssi = le32_to_cpu(scb_val.val); | 1887 | rssi = le32_to_cpu(scb_val.val); |
| 1886 | sinfo->filled |= STATION_INFO_SIGNAL; | 1888 | sinfo->filled |= STATION_INFO_SIGNAL; |
| 1887 | sinfo->signal = rssi; | 1889 | sinfo->signal = rssi; |
| 1888 | WL_CONN("RSSI %d dBm\n", rssi); | 1890 | WL_CONN("RSSI %d dBm\n", rssi); |
| 1891 | } | ||
| 1889 | } | 1892 | } |
| 1890 | 1893 | ||
| 1891 | done: | 1894 | done: |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/channel.c b/drivers/net/wireless/brcm80211/brcmsmac/channel.c index 7ed7d7577024..64a48f06d68b 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c | |||
| @@ -77,7 +77,7 @@ | |||
| 77 | NL80211_RRF_NO_IBSS) | 77 | NL80211_RRF_NO_IBSS) |
| 78 | 78 | ||
| 79 | static const struct ieee80211_regdomain brcms_regdom_x2 = { | 79 | static const struct ieee80211_regdomain brcms_regdom_x2 = { |
| 80 | .n_reg_rules = 7, | 80 | .n_reg_rules = 6, |
| 81 | .alpha2 = "X2", | 81 | .alpha2 = "X2", |
| 82 | .reg_rules = { | 82 | .reg_rules = { |
| 83 | BRCM_2GHZ_2412_2462, | 83 | BRCM_2GHZ_2412_2462, |
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c index 192ad5c1fcc8..a5edebeb0b4f 100644 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | |||
| @@ -1233,6 +1233,9 @@ uint brcms_reset(struct brcms_info *wl) | |||
| 1233 | /* dpc will not be rescheduled */ | 1233 | /* dpc will not be rescheduled */ |
| 1234 | wl->resched = false; | 1234 | wl->resched = false; |
| 1235 | 1235 | ||
| 1236 | /* inform publicly that interface is down */ | ||
| 1237 | wl->pub->up = false; | ||
| 1238 | |||
| 1236 | return 0; | 1239 | return 0; |
| 1237 | } | 1240 | } |
| 1238 | 1241 | ||
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 95aa8e1683ec..83324b321652 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c | |||
| @@ -2042,7 +2042,8 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status) | |||
| 2042 | return; | 2042 | return; |
| 2043 | } | 2043 | } |
| 2044 | len = ETH_ALEN; | 2044 | len = ETH_ALEN; |
| 2045 | ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, &bssid, &len); | 2045 | ret = ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, bssid, |
| 2046 | &len); | ||
| 2046 | if (ret) { | 2047 | if (ret) { |
| 2047 | IPW_DEBUG_INFO("failed querying ordinals at line %d\n", | 2048 | IPW_DEBUG_INFO("failed querying ordinals at line %d\n", |
| 2048 | __LINE__); | 2049 | __LINE__); |
diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c index 46782f1102ac..a47b306b522c 100644 --- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c +++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c | |||
| @@ -124,6 +124,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, | |||
| 124 | const struct fw_img *img; | 124 | const struct fw_img *img; |
| 125 | size_t bufsz; | 125 | size_t bufsz; |
| 126 | 126 | ||
| 127 | if (!iwl_is_ready_rf(priv)) | ||
| 128 | return -EAGAIN; | ||
| 129 | |||
| 127 | /* default is to dump the entire data segment */ | 130 | /* default is to dump the entire data segment */ |
| 128 | if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { | 131 | if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { |
| 129 | priv->dbgfs_sram_offset = 0x800000; | 132 | priv->dbgfs_sram_offset = 0x800000; |
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h index d9694c58208c..4ffc18dc3a57 100644 --- a/drivers/net/wireless/iwlwifi/pcie/internal.h +++ b/drivers/net/wireless/iwlwifi/pcie/internal.h | |||
| @@ -350,7 +350,7 @@ int iwl_queue_space(const struct iwl_queue *q); | |||
| 350 | /***************************************************** | 350 | /***************************************************** |
| 351 | * Error handling | 351 | * Error handling |
| 352 | ******************************************************/ | 352 | ******************************************************/ |
| 353 | int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display); | 353 | int iwl_dump_fh(struct iwl_trans *trans, char **buf); |
| 354 | void iwl_dump_csr(struct iwl_trans *trans); | 354 | void iwl_dump_csr(struct iwl_trans *trans); |
| 355 | 355 | ||
| 356 | /***************************************************** | 356 | /***************************************************** |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index 39a6ca1f009c..d1a61ba6247a 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
| @@ -555,7 +555,7 @@ static void iwl_irq_handle_error(struct iwl_trans *trans) | |||
| 555 | } | 555 | } |
| 556 | 556 | ||
| 557 | iwl_dump_csr(trans); | 557 | iwl_dump_csr(trans); |
| 558 | iwl_dump_fh(trans, NULL, false); | 558 | iwl_dump_fh(trans, NULL); |
| 559 | 559 | ||
| 560 | iwl_op_mode_nic_error(trans->op_mode); | 560 | iwl_op_mode_nic_error(trans->op_mode); |
| 561 | } | 561 | } |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index 939c2f78df58..1e86ea2266d4 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
| @@ -1649,13 +1649,9 @@ static const char *get_fh_string(int cmd) | |||
| 1649 | #undef IWL_CMD | 1649 | #undef IWL_CMD |
| 1650 | } | 1650 | } |
| 1651 | 1651 | ||
| 1652 | int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) | 1652 | int iwl_dump_fh(struct iwl_trans *trans, char **buf) |
| 1653 | { | 1653 | { |
| 1654 | int i; | 1654 | int i; |
| 1655 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
| 1656 | int pos = 0; | ||
| 1657 | size_t bufsz = 0; | ||
| 1658 | #endif | ||
| 1659 | static const u32 fh_tbl[] = { | 1655 | static const u32 fh_tbl[] = { |
| 1660 | FH_RSCSR_CHNL0_STTS_WPTR_REG, | 1656 | FH_RSCSR_CHNL0_STTS_WPTR_REG, |
| 1661 | FH_RSCSR_CHNL0_RBDCB_BASE_REG, | 1657 | FH_RSCSR_CHNL0_RBDCB_BASE_REG, |
| @@ -1667,29 +1663,35 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) | |||
| 1667 | FH_TSSR_TX_STATUS_REG, | 1663 | FH_TSSR_TX_STATUS_REG, |
| 1668 | FH_TSSR_TX_ERROR_REG | 1664 | FH_TSSR_TX_ERROR_REG |
| 1669 | }; | 1665 | }; |
| 1670 | #ifdef CONFIG_IWLWIFI_DEBUG | 1666 | |
| 1671 | if (display) { | 1667 | #ifdef CONFIG_IWLWIFI_DEBUGFS |
| 1672 | bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; | 1668 | if (buf) { |
| 1669 | int pos = 0; | ||
| 1670 | size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; | ||
| 1671 | |||
| 1673 | *buf = kmalloc(bufsz, GFP_KERNEL); | 1672 | *buf = kmalloc(bufsz, GFP_KERNEL); |
| 1674 | if (!*buf) | 1673 | if (!*buf) |
| 1675 | return -ENOMEM; | 1674 | return -ENOMEM; |
| 1675 | |||
| 1676 | pos += scnprintf(*buf + pos, bufsz - pos, | 1676 | pos += scnprintf(*buf + pos, bufsz - pos, |
| 1677 | "FH register values:\n"); | 1677 | "FH register values:\n"); |
| 1678 | for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) { | 1678 | |
| 1679 | for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) | ||
| 1679 | pos += scnprintf(*buf + pos, bufsz - pos, | 1680 | pos += scnprintf(*buf + pos, bufsz - pos, |
| 1680 | " %34s: 0X%08x\n", | 1681 | " %34s: 0X%08x\n", |
| 1681 | get_fh_string(fh_tbl[i]), | 1682 | get_fh_string(fh_tbl[i]), |
| 1682 | iwl_read_direct32(trans, fh_tbl[i])); | 1683 | iwl_read_direct32(trans, fh_tbl[i])); |
| 1683 | } | 1684 | |
| 1684 | return pos; | 1685 | return pos; |
| 1685 | } | 1686 | } |
| 1686 | #endif | 1687 | #endif |
| 1688 | |||
| 1687 | IWL_ERR(trans, "FH register values:\n"); | 1689 | IWL_ERR(trans, "FH register values:\n"); |
| 1688 | for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) { | 1690 | for (i = 0; i < ARRAY_SIZE(fh_tbl); i++) |
| 1689 | IWL_ERR(trans, " %34s: 0X%08x\n", | 1691 | IWL_ERR(trans, " %34s: 0X%08x\n", |
| 1690 | get_fh_string(fh_tbl[i]), | 1692 | get_fh_string(fh_tbl[i]), |
| 1691 | iwl_read_direct32(trans, fh_tbl[i])); | 1693 | iwl_read_direct32(trans, fh_tbl[i])); |
| 1692 | } | 1694 | |
| 1693 | return 0; | 1695 | return 0; |
| 1694 | } | 1696 | } |
| 1695 | 1697 | ||
| @@ -1982,11 +1984,11 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file, | |||
| 1982 | size_t count, loff_t *ppos) | 1984 | size_t count, loff_t *ppos) |
| 1983 | { | 1985 | { |
| 1984 | struct iwl_trans *trans = file->private_data; | 1986 | struct iwl_trans *trans = file->private_data; |
| 1985 | char *buf; | 1987 | char *buf = NULL; |
| 1986 | int pos = 0; | 1988 | int pos = 0; |
| 1987 | ssize_t ret = -EFAULT; | 1989 | ssize_t ret = -EFAULT; |
| 1988 | 1990 | ||
| 1989 | ret = pos = iwl_dump_fh(trans, &buf, true); | 1991 | ret = pos = iwl_dump_fh(trans, &buf); |
| 1990 | if (buf) { | 1992 | if (buf) { |
| 1991 | ret = simple_read_from_buffer(user_buf, | 1993 | ret = simple_read_from_buffer(user_buf, |
| 1992 | count, ppos, buf, pos); | 1994 | count, ppos, buf, pos); |
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index e970897f6ab5..4cb234349fbf 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c | |||
| @@ -1326,6 +1326,11 @@ static int if_sdio_suspend(struct device *dev) | |||
| 1326 | 1326 | ||
| 1327 | mmc_pm_flag_t flags = sdio_get_host_pm_caps(func); | 1327 | mmc_pm_flag_t flags = sdio_get_host_pm_caps(func); |
| 1328 | 1328 | ||
| 1329 | /* If we're powered off anyway, just let the mmc layer remove the | ||
| 1330 | * card. */ | ||
| 1331 | if (!lbs_iface_active(card->priv)) | ||
| 1332 | return -ENOSYS; | ||
| 1333 | |||
| 1329 | dev_info(dev, "%s: suspend: PM flags = 0x%x\n", | 1334 | dev_info(dev, "%s: suspend: PM flags = 0x%x\n", |
| 1330 | sdio_func_id(func), flags); | 1335 | sdio_func_id(func), flags); |
| 1331 | 1336 | ||
diff --git a/drivers/net/wireless/mwifiex/cmdevt.c b/drivers/net/wireless/mwifiex/cmdevt.c index c68adec3cc8b..565527aee0ea 100644 --- a/drivers/net/wireless/mwifiex/cmdevt.c +++ b/drivers/net/wireless/mwifiex/cmdevt.c | |||
| @@ -170,7 +170,20 @@ static int mwifiex_dnld_cmd_to_fw(struct mwifiex_private *priv, | |||
| 170 | cmd_code = le16_to_cpu(host_cmd->command); | 170 | cmd_code = le16_to_cpu(host_cmd->command); |
| 171 | cmd_size = le16_to_cpu(host_cmd->size); | 171 | cmd_size = le16_to_cpu(host_cmd->size); |
| 172 | 172 | ||
| 173 | skb_trim(cmd_node->cmd_skb, cmd_size); | 173 | /* Adjust skb length */ |
| 174 | if (cmd_node->cmd_skb->len > cmd_size) | ||
| 175 | /* | ||
| 176 | * cmd_size is less than sizeof(struct host_cmd_ds_command). | ||
| 177 | * Trim off the unused portion. | ||
| 178 | */ | ||
| 179 | skb_trim(cmd_node->cmd_skb, cmd_size); | ||
| 180 | else if (cmd_node->cmd_skb->len < cmd_size) | ||
| 181 | /* | ||
| 182 | * cmd_size is larger than sizeof(struct host_cmd_ds_command) | ||
| 183 | * because we have appended custom IE TLV. Increase skb length | ||
| 184 | * accordingly. | ||
| 185 | */ | ||
| 186 | skb_put(cmd_node->cmd_skb, cmd_size - cmd_node->cmd_skb->len); | ||
| 174 | 187 | ||
| 175 | do_gettimeofday(&tstamp); | 188 | do_gettimeofday(&tstamp); |
| 176 | dev_dbg(adapter->dev, "cmd: DNLD_CMD: (%lu.%lu): %#x, act %#x, len %d," | 189 | dev_dbg(adapter->dev, "cmd: DNLD_CMD: (%lu.%lu): %#x, act %#x, len %d," |
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 8b9dbd76a252..64328af496f5 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
| @@ -1611,6 +1611,7 @@ static int rt2400pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
| 1611 | static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) | 1611 | static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 1612 | { | 1612 | { |
| 1613 | int retval; | 1613 | int retval; |
| 1614 | u32 reg; | ||
| 1614 | 1615 | ||
| 1615 | /* | 1616 | /* |
| 1616 | * Allocate eeprom data. | 1617 | * Allocate eeprom data. |
| @@ -1624,6 +1625,14 @@ static int rt2400pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1624 | return retval; | 1625 | return retval; |
| 1625 | 1626 | ||
| 1626 | /* | 1627 | /* |
| 1628 | * Enable rfkill polling by setting GPIO direction of the | ||
| 1629 | * rfkill switch GPIO pin correctly. | ||
| 1630 | */ | ||
| 1631 | rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); | ||
| 1632 | rt2x00_set_field32(®, GPIOCSR_BIT8, 1); | ||
| 1633 | rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg); | ||
| 1634 | |||
| 1635 | /* | ||
| 1627 | * Initialize hw specifications. | 1636 | * Initialize hw specifications. |
| 1628 | */ | 1637 | */ |
| 1629 | retval = rt2400pci_probe_hw_mode(rt2x00dev); | 1638 | retval = rt2400pci_probe_hw_mode(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.h b/drivers/net/wireless/rt2x00/rt2400pci.h index d3a4a68cc439..7564ae992b73 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.h +++ b/drivers/net/wireless/rt2x00/rt2400pci.h | |||
| @@ -670,6 +670,7 @@ | |||
| 670 | #define GPIOCSR_BIT5 FIELD32(0x00000020) | 670 | #define GPIOCSR_BIT5 FIELD32(0x00000020) |
| 671 | #define GPIOCSR_BIT6 FIELD32(0x00000040) | 671 | #define GPIOCSR_BIT6 FIELD32(0x00000040) |
| 672 | #define GPIOCSR_BIT7 FIELD32(0x00000080) | 672 | #define GPIOCSR_BIT7 FIELD32(0x00000080) |
| 673 | #define GPIOCSR_BIT8 FIELD32(0x00000100) | ||
| 673 | 674 | ||
| 674 | /* | 675 | /* |
| 675 | * BBPPCSR: BBP Pin control register. | 676 | * BBPPCSR: BBP Pin control register. |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index d2cf8a4bc8b5..3de0406735f6 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
| @@ -1929,6 +1929,7 @@ static int rt2500pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
| 1929 | static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) | 1929 | static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 1930 | { | 1930 | { |
| 1931 | int retval; | 1931 | int retval; |
| 1932 | u32 reg; | ||
| 1932 | 1933 | ||
| 1933 | /* | 1934 | /* |
| 1934 | * Allocate eeprom data. | 1935 | * Allocate eeprom data. |
| @@ -1942,6 +1943,14 @@ static int rt2500pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1942 | return retval; | 1943 | return retval; |
| 1943 | 1944 | ||
| 1944 | /* | 1945 | /* |
| 1946 | * Enable rfkill polling by setting GPIO direction of the | ||
| 1947 | * rfkill switch GPIO pin correctly. | ||
| 1948 | */ | ||
| 1949 | rt2x00pci_register_read(rt2x00dev, GPIOCSR, ®); | ||
| 1950 | rt2x00_set_field32(®, GPIOCSR_DIR0, 1); | ||
| 1951 | rt2x00pci_register_write(rt2x00dev, GPIOCSR, reg); | ||
| 1952 | |||
| 1953 | /* | ||
| 1945 | * Initialize hw specifications. | 1954 | * Initialize hw specifications. |
| 1946 | */ | 1955 | */ |
| 1947 | retval = rt2500pci_probe_hw_mode(rt2x00dev); | 1956 | retval = rt2500pci_probe_hw_mode(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 3aae36bb0a9e..89fee311d8fd 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
| @@ -283,7 +283,7 @@ static int rt2500usb_rfkill_poll(struct rt2x00_dev *rt2x00dev) | |||
| 283 | u16 reg; | 283 | u16 reg; |
| 284 | 284 | ||
| 285 | rt2500usb_register_read(rt2x00dev, MAC_CSR19, ®); | 285 | rt2500usb_register_read(rt2x00dev, MAC_CSR19, ®); |
| 286 | return rt2x00_get_field32(reg, MAC_CSR19_BIT7); | 286 | return rt2x00_get_field16(reg, MAC_CSR19_BIT7); |
| 287 | } | 287 | } |
| 288 | 288 | ||
| 289 | #ifdef CONFIG_RT2X00_LIB_LEDS | 289 | #ifdef CONFIG_RT2X00_LIB_LEDS |
| @@ -1768,6 +1768,7 @@ static int rt2500usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
| 1768 | static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) | 1768 | static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 1769 | { | 1769 | { |
| 1770 | int retval; | 1770 | int retval; |
| 1771 | u16 reg; | ||
| 1771 | 1772 | ||
| 1772 | /* | 1773 | /* |
| 1773 | * Allocate eeprom data. | 1774 | * Allocate eeprom data. |
| @@ -1781,6 +1782,14 @@ static int rt2500usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 1781 | return retval; | 1782 | return retval; |
| 1782 | 1783 | ||
| 1783 | /* | 1784 | /* |
| 1785 | * Enable rfkill polling by setting GPIO direction of the | ||
| 1786 | * rfkill switch GPIO pin correctly. | ||
| 1787 | */ | ||
| 1788 | rt2500usb_register_read(rt2x00dev, MAC_CSR19, ®); | ||
| 1789 | rt2x00_set_field16(®, MAC_CSR19_BIT8, 0); | ||
| 1790 | rt2500usb_register_write(rt2x00dev, MAC_CSR19, reg); | ||
| 1791 | |||
| 1792 | /* | ||
| 1784 | * Initialize hw specifications. | 1793 | * Initialize hw specifications. |
| 1785 | */ | 1794 | */ |
| 1786 | retval = rt2500usb_probe_hw_mode(rt2x00dev); | 1795 | retval = rt2500usb_probe_hw_mode(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.h b/drivers/net/wireless/rt2x00/rt2500usb.h index b493306a7eed..196bd5103e4f 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.h +++ b/drivers/net/wireless/rt2x00/rt2500usb.h | |||
| @@ -189,14 +189,15 @@ | |||
| 189 | * MAC_CSR19: GPIO control register. | 189 | * MAC_CSR19: GPIO control register. |
| 190 | */ | 190 | */ |
| 191 | #define MAC_CSR19 0x0426 | 191 | #define MAC_CSR19 0x0426 |
| 192 | #define MAC_CSR19_BIT0 FIELD32(0x0001) | 192 | #define MAC_CSR19_BIT0 FIELD16(0x0001) |
| 193 | #define MAC_CSR19_BIT1 FIELD32(0x0002) | 193 | #define MAC_CSR19_BIT1 FIELD16(0x0002) |
| 194 | #define MAC_CSR19_BIT2 FIELD32(0x0004) | 194 | #define MAC_CSR19_BIT2 FIELD16(0x0004) |
| 195 | #define MAC_CSR19_BIT3 FIELD32(0x0008) | 195 | #define MAC_CSR19_BIT3 FIELD16(0x0008) |
| 196 | #define MAC_CSR19_BIT4 FIELD32(0x0010) | 196 | #define MAC_CSR19_BIT4 FIELD16(0x0010) |
| 197 | #define MAC_CSR19_BIT5 FIELD32(0x0020) | 197 | #define MAC_CSR19_BIT5 FIELD16(0x0020) |
| 198 | #define MAC_CSR19_BIT6 FIELD32(0x0040) | 198 | #define MAC_CSR19_BIT6 FIELD16(0x0040) |
| 199 | #define MAC_CSR19_BIT7 FIELD32(0x0080) | 199 | #define MAC_CSR19_BIT7 FIELD16(0x0080) |
| 200 | #define MAC_CSR19_BIT8 FIELD16(0x0100) | ||
| 200 | 201 | ||
| 201 | /* | 202 | /* |
| 202 | * MAC_CSR20: LED control register. | 203 | * MAC_CSR20: LED control register. |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index cb8c2aca54e4..b93516d832fb 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
| @@ -4089,6 +4089,7 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev) | |||
| 4089 | rt2800_register_write(rt2x00dev, LDO_CFG0, reg); | 4089 | rt2800_register_write(rt2x00dev, LDO_CFG0, reg); |
| 4090 | msleep(1); | 4090 | msleep(1); |
| 4091 | rt2800_register_read(rt2x00dev, LDO_CFG0, ®); | 4091 | rt2800_register_read(rt2x00dev, LDO_CFG0, ®); |
| 4092 | rt2x00_set_field32(®, LDO_CFG0_LDO_CORE_VLEVEL, 0); | ||
| 4092 | rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); | 4093 | rt2x00_set_field32(®, LDO_CFG0_BGSEL, 1); |
| 4093 | rt2800_register_write(rt2x00dev, LDO_CFG0, reg); | 4094 | rt2800_register_write(rt2x00dev, LDO_CFG0, reg); |
| 4094 | } | 4095 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 98aa426a3564..4765bbd654cd 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
| @@ -983,6 +983,7 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev) | |||
| 983 | static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) | 983 | static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 984 | { | 984 | { |
| 985 | int retval; | 985 | int retval; |
| 986 | u32 reg; | ||
| 986 | 987 | ||
| 987 | /* | 988 | /* |
| 988 | * Allocate eeprom data. | 989 | * Allocate eeprom data. |
| @@ -996,6 +997,14 @@ static int rt2800pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 996 | return retval; | 997 | return retval; |
| 997 | 998 | ||
| 998 | /* | 999 | /* |
| 1000 | * Enable rfkill polling by setting GPIO direction of the | ||
| 1001 | * rfkill switch GPIO pin correctly. | ||
| 1002 | */ | ||
| 1003 | rt2x00pci_register_read(rt2x00dev, GPIO_CTRL_CFG, ®); | ||
| 1004 | rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT2, 1); | ||
| 1005 | rt2x00pci_register_write(rt2x00dev, GPIO_CTRL_CFG, reg); | ||
| 1006 | |||
| 1007 | /* | ||
| 999 | * Initialize hw specifications. | 1008 | * Initialize hw specifications. |
| 1000 | */ | 1009 | */ |
| 1001 | retval = rt2800_probe_hw_mode(rt2x00dev); | 1010 | retval = rt2800_probe_hw_mode(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 6cf336595e25..6b4226b71618 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
| @@ -667,8 +667,16 @@ static void rt2800usb_fill_rxdone(struct queue_entry *entry, | |||
| 667 | skb_pull(entry->skb, RXINFO_DESC_SIZE); | 667 | skb_pull(entry->skb, RXINFO_DESC_SIZE); |
| 668 | 668 | ||
| 669 | /* | 669 | /* |
| 670 | * FIXME: we need to check for rx_pkt_len validity | 670 | * Check for rx_pkt_len validity. Return if invalid, leaving |
| 671 | * rxdesc->size zeroed out by the upper level. | ||
| 671 | */ | 672 | */ |
| 673 | if (unlikely(rx_pkt_len == 0 || | ||
| 674 | rx_pkt_len > entry->queue->data_size)) { | ||
| 675 | ERROR(entry->queue->rt2x00dev, | ||
| 676 | "Bad frame size %d, forcing to 0\n", rx_pkt_len); | ||
| 677 | return; | ||
| 678 | } | ||
| 679 | |||
| 672 | rxd = (__le32 *)(entry->skb->data + rx_pkt_len); | 680 | rxd = (__le32 *)(entry->skb->data + rx_pkt_len); |
| 673 | 681 | ||
| 674 | /* | 682 | /* |
| @@ -736,6 +744,7 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev) | |||
| 736 | static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) | 744 | static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 737 | { | 745 | { |
| 738 | int retval; | 746 | int retval; |
| 747 | u32 reg; | ||
| 739 | 748 | ||
| 740 | /* | 749 | /* |
| 741 | * Allocate eeprom data. | 750 | * Allocate eeprom data. |
| @@ -749,6 +758,14 @@ static int rt2800usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 749 | return retval; | 758 | return retval; |
| 750 | 759 | ||
| 751 | /* | 760 | /* |
| 761 | * Enable rfkill polling by setting GPIO direction of the | ||
| 762 | * rfkill switch GPIO pin correctly. | ||
| 763 | */ | ||
| 764 | rt2x00usb_register_read(rt2x00dev, GPIO_CTRL_CFG, ®); | ||
| 765 | rt2x00_set_field32(®, GPIO_CTRL_CFG_GPIOD_BIT2, 1); | ||
| 766 | rt2x00usb_register_write(rt2x00dev, GPIO_CTRL_CFG, reg); | ||
| 767 | |||
| 768 | /* | ||
| 752 | * Initialize hw specifications. | 769 | * Initialize hw specifications. |
| 753 | */ | 770 | */ |
| 754 | retval = rt2800_probe_hw_mode(rt2x00dev); | 771 | retval = rt2800_probe_hw_mode(rt2x00dev); |
| @@ -1157,6 +1174,8 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
| 1157 | { USB_DEVICE(0x1690, 0x0744) }, | 1174 | { USB_DEVICE(0x1690, 0x0744) }, |
| 1158 | { USB_DEVICE(0x1690, 0x0761) }, | 1175 | { USB_DEVICE(0x1690, 0x0761) }, |
| 1159 | { USB_DEVICE(0x1690, 0x0764) }, | 1176 | { USB_DEVICE(0x1690, 0x0764) }, |
| 1177 | /* ASUS */ | ||
| 1178 | { USB_DEVICE(0x0b05, 0x179d) }, | ||
| 1160 | /* Cisco */ | 1179 | /* Cisco */ |
| 1161 | { USB_DEVICE(0x167b, 0x4001) }, | 1180 | { USB_DEVICE(0x167b, 0x4001) }, |
| 1162 | /* EnGenius */ | 1181 | /* EnGenius */ |
| @@ -1222,7 +1241,6 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
| 1222 | { USB_DEVICE(0x0b05, 0x1760) }, | 1241 | { USB_DEVICE(0x0b05, 0x1760) }, |
| 1223 | { USB_DEVICE(0x0b05, 0x1761) }, | 1242 | { USB_DEVICE(0x0b05, 0x1761) }, |
| 1224 | { USB_DEVICE(0x0b05, 0x1790) }, | 1243 | { USB_DEVICE(0x0b05, 0x1790) }, |
| 1225 | { USB_DEVICE(0x0b05, 0x179d) }, | ||
| 1226 | /* AzureWave */ | 1244 | /* AzureWave */ |
| 1227 | { USB_DEVICE(0x13d3, 0x3262) }, | 1245 | { USB_DEVICE(0x13d3, 0x3262) }, |
| 1228 | { USB_DEVICE(0x13d3, 0x3284) }, | 1246 | { USB_DEVICE(0x13d3, 0x3284) }, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index a6b88bd4a1a5..3f07e36f462b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
| @@ -629,7 +629,7 @@ void rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp) | |||
| 629 | */ | 629 | */ |
| 630 | if (unlikely(rxdesc.size == 0 || | 630 | if (unlikely(rxdesc.size == 0 || |
| 631 | rxdesc.size > entry->queue->data_size)) { | 631 | rxdesc.size > entry->queue->data_size)) { |
| 632 | WARNING(rt2x00dev, "Wrong frame size %d max %d.\n", | 632 | ERROR(rt2x00dev, "Wrong frame size %d max %d.\n", |
| 633 | rxdesc.size, entry->queue->data_size); | 633 | rxdesc.size, entry->queue->data_size); |
| 634 | dev_kfree_skb(entry->skb); | 634 | dev_kfree_skb(entry->skb); |
| 635 | goto renew_skb; | 635 | goto renew_skb; |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 3f7bc5cadf9a..b8ec96163922 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
| @@ -2832,6 +2832,7 @@ static int rt61pci_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
| 2832 | static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) | 2832 | static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 2833 | { | 2833 | { |
| 2834 | int retval; | 2834 | int retval; |
| 2835 | u32 reg; | ||
| 2835 | 2836 | ||
| 2836 | /* | 2837 | /* |
| 2837 | * Disable power saving. | 2838 | * Disable power saving. |
| @@ -2850,6 +2851,14 @@ static int rt61pci_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 2850 | return retval; | 2851 | return retval; |
| 2851 | 2852 | ||
| 2852 | /* | 2853 | /* |
| 2854 | * Enable rfkill polling by setting GPIO direction of the | ||
| 2855 | * rfkill switch GPIO pin correctly. | ||
| 2856 | */ | ||
| 2857 | rt2x00pci_register_read(rt2x00dev, MAC_CSR13, ®); | ||
| 2858 | rt2x00_set_field32(®, MAC_CSR13_BIT13, 1); | ||
| 2859 | rt2x00pci_register_write(rt2x00dev, MAC_CSR13, reg); | ||
| 2860 | |||
| 2861 | /* | ||
| 2853 | * Initialize hw specifications. | 2862 | * Initialize hw specifications. |
| 2854 | */ | 2863 | */ |
| 2855 | retval = rt61pci_probe_hw_mode(rt2x00dev); | 2864 | retval = rt61pci_probe_hw_mode(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.h b/drivers/net/wireless/rt2x00/rt61pci.h index e3cd6db76b0e..8f3da5a56766 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.h +++ b/drivers/net/wireless/rt2x00/rt61pci.h | |||
| @@ -372,6 +372,7 @@ struct hw_pairwise_ta_entry { | |||
| 372 | #define MAC_CSR13_BIT10 FIELD32(0x00000400) | 372 | #define MAC_CSR13_BIT10 FIELD32(0x00000400) |
| 373 | #define MAC_CSR13_BIT11 FIELD32(0x00000800) | 373 | #define MAC_CSR13_BIT11 FIELD32(0x00000800) |
| 374 | #define MAC_CSR13_BIT12 FIELD32(0x00001000) | 374 | #define MAC_CSR13_BIT12 FIELD32(0x00001000) |
| 375 | #define MAC_CSR13_BIT13 FIELD32(0x00002000) | ||
| 375 | 376 | ||
| 376 | /* | 377 | /* |
| 377 | * MAC_CSR14: LED control register. | 378 | * MAC_CSR14: LED control register. |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index ba6e434b859d..248436c13ce0 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
| @@ -2177,6 +2177,7 @@ static int rt73usb_probe_hw_mode(struct rt2x00_dev *rt2x00dev) | |||
| 2177 | static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) | 2177 | static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) |
| 2178 | { | 2178 | { |
| 2179 | int retval; | 2179 | int retval; |
| 2180 | u32 reg; | ||
| 2180 | 2181 | ||
| 2181 | /* | 2182 | /* |
| 2182 | * Allocate eeprom data. | 2183 | * Allocate eeprom data. |
| @@ -2190,6 +2191,14 @@ static int rt73usb_probe_hw(struct rt2x00_dev *rt2x00dev) | |||
| 2190 | return retval; | 2191 | return retval; |
| 2191 | 2192 | ||
| 2192 | /* | 2193 | /* |
| 2194 | * Enable rfkill polling by setting GPIO direction of the | ||
| 2195 | * rfkill switch GPIO pin correctly. | ||
| 2196 | */ | ||
| 2197 | rt2x00usb_register_read(rt2x00dev, MAC_CSR13, ®); | ||
| 2198 | rt2x00_set_field32(®, MAC_CSR13_BIT15, 0); | ||
| 2199 | rt2x00usb_register_write(rt2x00dev, MAC_CSR13, reg); | ||
| 2200 | |||
| 2201 | /* | ||
| 2193 | * Initialize hw specifications. | 2202 | * Initialize hw specifications. |
| 2194 | */ | 2203 | */ |
| 2195 | retval = rt73usb_probe_hw_mode(rt2x00dev); | 2204 | retval = rt73usb_probe_hw_mode(rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.h b/drivers/net/wireless/rt2x00/rt73usb.h index 9f6b470414d3..df1cc116b83b 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.h +++ b/drivers/net/wireless/rt2x00/rt73usb.h | |||
| @@ -282,6 +282,9 @@ struct hw_pairwise_ta_entry { | |||
| 282 | #define MAC_CSR13_BIT10 FIELD32(0x00000400) | 282 | #define MAC_CSR13_BIT10 FIELD32(0x00000400) |
| 283 | #define MAC_CSR13_BIT11 FIELD32(0x00000800) | 283 | #define MAC_CSR13_BIT11 FIELD32(0x00000800) |
| 284 | #define MAC_CSR13_BIT12 FIELD32(0x00001000) | 284 | #define MAC_CSR13_BIT12 FIELD32(0x00001000) |
| 285 | #define MAC_CSR13_BIT13 FIELD32(0x00002000) | ||
| 286 | #define MAC_CSR13_BIT14 FIELD32(0x00004000) | ||
| 287 | #define MAC_CSR13_BIT15 FIELD32(0x00008000) | ||
| 285 | 288 | ||
| 286 | /* | 289 | /* |
| 287 | * MAC_CSR14: LED control register. | 290 | * MAC_CSR14: LED control register. |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h index 04c3aef8a4f6..2925094b2d91 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h | |||
| @@ -117,6 +117,7 @@ | |||
| 117 | 117 | ||
| 118 | #define CHIP_VER_B BIT(4) | 118 | #define CHIP_VER_B BIT(4) |
| 119 | #define CHIP_92C_BITMASK BIT(0) | 119 | #define CHIP_92C_BITMASK BIT(0) |
| 120 | #define CHIP_UNKNOWN BIT(7) | ||
| 120 | #define CHIP_92C_1T2R 0x03 | 121 | #define CHIP_92C_1T2R 0x03 |
| 121 | #define CHIP_92C 0x01 | 122 | #define CHIP_92C 0x01 |
| 122 | #define CHIP_88C 0x00 | 123 | #define CHIP_88C 0x00 |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c index bd0da7ef290b..dd4bb0950a57 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c | |||
| @@ -994,8 +994,16 @@ static enum version_8192c _rtl92ce_read_chip_version(struct ieee80211_hw *hw) | |||
| 994 | version = (value32 & TYPE_ID) ? VERSION_A_CHIP_92C : | 994 | version = (value32 & TYPE_ID) ? VERSION_A_CHIP_92C : |
| 995 | VERSION_A_CHIP_88C; | 995 | VERSION_A_CHIP_88C; |
| 996 | } else { | 996 | } else { |
| 997 | version = (value32 & TYPE_ID) ? VERSION_B_CHIP_92C : | 997 | version = (enum version_8192c) (CHIP_VER_B | |
| 998 | VERSION_B_CHIP_88C; | 998 | ((value32 & TYPE_ID) ? CHIP_92C_BITMASK : 0) | |
| 999 | ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0)); | ||
| 1000 | if ((!IS_CHIP_VENDOR_UMC(version)) && (value32 & | ||
| 1001 | CHIP_VER_RTL_MASK)) { | ||
| 1002 | version = (enum version_8192c)(version | | ||
| 1003 | ((((value32 & CHIP_VER_RTL_MASK) == BIT(12)) | ||
| 1004 | ? CHIP_VENDOR_UMC_B_CUT : CHIP_UNKNOWN) | | ||
| 1005 | CHIP_VENDOR_UMC)); | ||
| 1006 | } | ||
| 999 | } | 1007 | } |
| 1000 | 1008 | ||
| 1001 | switch (version) { | 1009 | switch (version) { |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c index 3aa927f8b9b9..7d8f96405f42 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c | |||
| @@ -162,10 +162,12 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw) | |||
| 162 | 162 | ||
| 163 | /* request fw */ | 163 | /* request fw */ |
| 164 | if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && | 164 | if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && |
| 165 | !IS_92C_SERIAL(rtlhal->version)) | 165 | !IS_92C_SERIAL(rtlhal->version)) { |
| 166 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin"; | 166 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin"; |
| 167 | else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) | 167 | } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) { |
| 168 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin"; | 168 | rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin"; |
| 169 | pr_info("****** This B_CUT device may not work with kernels 3.6 and earlier\n"); | ||
| 170 | } | ||
| 169 | 171 | ||
| 170 | rtlpriv->max_fw_size = 0x4000; | 172 | rtlpriv->max_fw_size = 0x4000; |
| 171 | pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name); | 173 | pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name); |
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index 30899901aef5..650f79a1f2bd 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -57,8 +57,7 @@ | |||
| 57 | static const struct ethtool_ops xennet_ethtool_ops; | 57 | static const struct ethtool_ops xennet_ethtool_ops; |
| 58 | 58 | ||
| 59 | struct netfront_cb { | 59 | struct netfront_cb { |
| 60 | struct page *page; | 60 | int pull_to; |
| 61 | unsigned offset; | ||
| 62 | }; | 61 | }; |
| 63 | 62 | ||
| 64 | #define NETFRONT_SKB_CB(skb) ((struct netfront_cb *)((skb)->cb)) | 63 | #define NETFRONT_SKB_CB(skb) ((struct netfront_cb *)((skb)->cb)) |
| @@ -867,15 +866,9 @@ static int handle_incoming_queue(struct net_device *dev, | |||
| 867 | struct sk_buff *skb; | 866 | struct sk_buff *skb; |
| 868 | 867 | ||
| 869 | while ((skb = __skb_dequeue(rxq)) != NULL) { | 868 | while ((skb = __skb_dequeue(rxq)) != NULL) { |
| 870 | struct page *page = NETFRONT_SKB_CB(skb)->page; | 869 | int pull_to = NETFRONT_SKB_CB(skb)->pull_to; |
| 871 | void *vaddr = page_address(page); | ||
| 872 | unsigned offset = NETFRONT_SKB_CB(skb)->offset; | ||
| 873 | |||
| 874 | memcpy(skb->data, vaddr + offset, | ||
| 875 | skb_headlen(skb)); | ||
| 876 | 870 | ||
| 877 | if (page != skb_frag_page(&skb_shinfo(skb)->frags[0])) | 871 | __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); |
| 878 | __free_page(page); | ||
| 879 | 872 | ||
| 880 | /* Ethernet work: Delayed to here as it peeks the header. */ | 873 | /* Ethernet work: Delayed to here as it peeks the header. */ |
| 881 | skb->protocol = eth_type_trans(skb, dev); | 874 | skb->protocol = eth_type_trans(skb, dev); |
| @@ -913,7 +906,6 @@ static int xennet_poll(struct napi_struct *napi, int budget) | |||
| 913 | struct sk_buff_head errq; | 906 | struct sk_buff_head errq; |
| 914 | struct sk_buff_head tmpq; | 907 | struct sk_buff_head tmpq; |
| 915 | unsigned long flags; | 908 | unsigned long flags; |
| 916 | unsigned int len; | ||
| 917 | int err; | 909 | int err; |
| 918 | 910 | ||
| 919 | spin_lock(&np->rx_lock); | 911 | spin_lock(&np->rx_lock); |
| @@ -955,24 +947,13 @@ err: | |||
| 955 | } | 947 | } |
| 956 | } | 948 | } |
| 957 | 949 | ||
| 958 | NETFRONT_SKB_CB(skb)->page = | 950 | NETFRONT_SKB_CB(skb)->pull_to = rx->status; |
| 959 | skb_frag_page(&skb_shinfo(skb)->frags[0]); | 951 | if (NETFRONT_SKB_CB(skb)->pull_to > RX_COPY_THRESHOLD) |
| 960 | NETFRONT_SKB_CB(skb)->offset = rx->offset; | 952 | NETFRONT_SKB_CB(skb)->pull_to = RX_COPY_THRESHOLD; |
| 961 | |||
| 962 | len = rx->status; | ||
| 963 | if (len > RX_COPY_THRESHOLD) | ||
| 964 | len = RX_COPY_THRESHOLD; | ||
| 965 | skb_put(skb, len); | ||
| 966 | 953 | ||
| 967 | if (rx->status > len) { | 954 | skb_shinfo(skb)->frags[0].page_offset = rx->offset; |
| 968 | skb_shinfo(skb)->frags[0].page_offset = | 955 | skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status); |
| 969 | rx->offset + len; | 956 | skb->data_len = rx->status; |
| 970 | skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status - len); | ||
| 971 | skb->data_len = rx->status - len; | ||
| 972 | } else { | ||
| 973 | __skb_fill_page_desc(skb, 0, NULL, 0, 0); | ||
| 974 | skb_shinfo(skb)->nr_frags = 0; | ||
| 975 | } | ||
| 976 | 957 | ||
| 977 | i = xennet_fill_frags(np, skb, &tmpq); | 958 | i = xennet_fill_frags(np, skb, &tmpq); |
| 978 | 959 | ||
| @@ -999,7 +980,7 @@ err: | |||
| 999 | * receive throughout using the standard receive | 980 | * receive throughout using the standard receive |
| 1000 | * buffer size was cut by 25%(!!!). | 981 | * buffer size was cut by 25%(!!!). |
| 1001 | */ | 982 | */ |
| 1002 | skb->truesize += skb->data_len - (RX_COPY_THRESHOLD - len); | 983 | skb->truesize += skb->data_len - RX_COPY_THRESHOLD; |
| 1003 | skb->len += skb->data_len; | 984 | skb->len += skb->data_len; |
| 1004 | 985 | ||
| 1005 | if (rx->flags & XEN_NETRXF_csum_blank) | 986 | if (rx->flags & XEN_NETRXF_csum_blank) |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 5270f1a99328..d6fd6b6d9d4b 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -280,8 +280,12 @@ static long local_pci_probe(void *_ddi) | |||
| 280 | { | 280 | { |
| 281 | struct drv_dev_and_id *ddi = _ddi; | 281 | struct drv_dev_and_id *ddi = _ddi; |
| 282 | struct device *dev = &ddi->dev->dev; | 282 | struct device *dev = &ddi->dev->dev; |
| 283 | struct device *parent = dev->parent; | ||
| 283 | int rc; | 284 | int rc; |
| 284 | 285 | ||
| 286 | /* The parent bridge must be in active state when probing */ | ||
| 287 | if (parent) | ||
| 288 | pm_runtime_get_sync(parent); | ||
| 285 | /* Unbound PCI devices are always set to disabled and suspended. | 289 | /* Unbound PCI devices are always set to disabled and suspended. |
| 286 | * During probe, the device is set to enabled and active and the | 290 | * During probe, the device is set to enabled and active and the |
| 287 | * usage count is incremented. If the driver supports runtime PM, | 291 | * usage count is incremented. If the driver supports runtime PM, |
| @@ -298,6 +302,8 @@ static long local_pci_probe(void *_ddi) | |||
| 298 | pm_runtime_set_suspended(dev); | 302 | pm_runtime_set_suspended(dev); |
| 299 | pm_runtime_put_noidle(dev); | 303 | pm_runtime_put_noidle(dev); |
| 300 | } | 304 | } |
| 305 | if (parent) | ||
| 306 | pm_runtime_put(parent); | ||
| 301 | return rc; | 307 | return rc; |
| 302 | } | 308 | } |
| 303 | 309 | ||
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 6869009c7393..02d107b15281 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -458,6 +458,40 @@ boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf) | |||
| 458 | } | 458 | } |
| 459 | struct device_attribute vga_attr = __ATTR_RO(boot_vga); | 459 | struct device_attribute vga_attr = __ATTR_RO(boot_vga); |
| 460 | 460 | ||
| 461 | static void | ||
| 462 | pci_config_pm_runtime_get(struct pci_dev *pdev) | ||
| 463 | { | ||
| 464 | struct device *dev = &pdev->dev; | ||
| 465 | struct device *parent = dev->parent; | ||
| 466 | |||
| 467 | if (parent) | ||
| 468 | pm_runtime_get_sync(parent); | ||
| 469 | pm_runtime_get_noresume(dev); | ||
| 470 | /* | ||
| 471 | * pdev->current_state is set to PCI_D3cold during suspending, | ||
| 472 | * so wait until suspending completes | ||
| 473 | */ | ||
| 474 | pm_runtime_barrier(dev); | ||
| 475 | /* | ||
| 476 | * Only need to resume devices in D3cold, because config | ||
| 477 | * registers are still accessible for devices suspended but | ||
| 478 | * not in D3cold. | ||
| 479 | */ | ||
| 480 | if (pdev->current_state == PCI_D3cold) | ||
| 481 | pm_runtime_resume(dev); | ||
| 482 | } | ||
| 483 | |||
| 484 | static void | ||
| 485 | pci_config_pm_runtime_put(struct pci_dev *pdev) | ||
| 486 | { | ||
| 487 | struct device *dev = &pdev->dev; | ||
| 488 | struct device *parent = dev->parent; | ||
| 489 | |||
| 490 | pm_runtime_put(dev); | ||
| 491 | if (parent) | ||
| 492 | pm_runtime_put_sync(parent); | ||
| 493 | } | ||
| 494 | |||
| 461 | static ssize_t | 495 | static ssize_t |
| 462 | pci_read_config(struct file *filp, struct kobject *kobj, | 496 | pci_read_config(struct file *filp, struct kobject *kobj, |
| 463 | struct bin_attribute *bin_attr, | 497 | struct bin_attribute *bin_attr, |
| @@ -484,6 +518,8 @@ pci_read_config(struct file *filp, struct kobject *kobj, | |||
| 484 | size = count; | 518 | size = count; |
| 485 | } | 519 | } |
| 486 | 520 | ||
| 521 | pci_config_pm_runtime_get(dev); | ||
| 522 | |||
| 487 | if ((off & 1) && size) { | 523 | if ((off & 1) && size) { |
| 488 | u8 val; | 524 | u8 val; |
| 489 | pci_user_read_config_byte(dev, off, &val); | 525 | pci_user_read_config_byte(dev, off, &val); |
| @@ -529,6 +565,8 @@ pci_read_config(struct file *filp, struct kobject *kobj, | |||
| 529 | --size; | 565 | --size; |
| 530 | } | 566 | } |
| 531 | 567 | ||
| 568 | pci_config_pm_runtime_put(dev); | ||
| 569 | |||
| 532 | return count; | 570 | return count; |
| 533 | } | 571 | } |
| 534 | 572 | ||
| @@ -549,6 +587,8 @@ pci_write_config(struct file* filp, struct kobject *kobj, | |||
| 549 | count = size; | 587 | count = size; |
| 550 | } | 588 | } |
| 551 | 589 | ||
| 590 | pci_config_pm_runtime_get(dev); | ||
| 591 | |||
| 552 | if ((off & 1) && size) { | 592 | if ((off & 1) && size) { |
| 553 | pci_user_write_config_byte(dev, off, data[off - init_off]); | 593 | pci_user_write_config_byte(dev, off, data[off - init_off]); |
| 554 | off++; | 594 | off++; |
| @@ -587,6 +627,8 @@ pci_write_config(struct file* filp, struct kobject *kobj, | |||
| 587 | --size; | 627 | --size; |
| 588 | } | 628 | } |
| 589 | 629 | ||
| 630 | pci_config_pm_runtime_put(dev); | ||
| 631 | |||
| 590 | return count; | 632 | return count; |
| 591 | } | 633 | } |
| 592 | 634 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index f3ea977a5b1b..ab4bf5a4c2f1 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
| @@ -1941,6 +1941,7 @@ void pci_pm_init(struct pci_dev *dev) | |||
| 1941 | dev->pm_cap = pm; | 1941 | dev->pm_cap = pm; |
| 1942 | dev->d3_delay = PCI_PM_D3_WAIT; | 1942 | dev->d3_delay = PCI_PM_D3_WAIT; |
| 1943 | dev->d3cold_delay = PCI_PM_D3COLD_WAIT; | 1943 | dev->d3cold_delay = PCI_PM_D3COLD_WAIT; |
| 1944 | dev->d3cold_allowed = true; | ||
| 1944 | 1945 | ||
| 1945 | dev->d1_support = false; | 1946 | dev->d1_support = false; |
| 1946 | dev->d2_support = false; | 1947 | dev->d2_support = false; |
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 3a7eefcb270a..e76b44777dbf 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c | |||
| @@ -140,9 +140,17 @@ static int pcie_port_runtime_resume(struct device *dev) | |||
| 140 | { | 140 | { |
| 141 | return 0; | 141 | return 0; |
| 142 | } | 142 | } |
| 143 | |||
| 144 | static int pcie_port_runtime_idle(struct device *dev) | ||
| 145 | { | ||
| 146 | /* Delay for a short while to prevent too frequent suspend/resume */ | ||
| 147 | pm_schedule_suspend(dev, 10); | ||
| 148 | return -EBUSY; | ||
| 149 | } | ||
| 143 | #else | 150 | #else |
| 144 | #define pcie_port_runtime_suspend NULL | 151 | #define pcie_port_runtime_suspend NULL |
| 145 | #define pcie_port_runtime_resume NULL | 152 | #define pcie_port_runtime_resume NULL |
| 153 | #define pcie_port_runtime_idle NULL | ||
| 146 | #endif | 154 | #endif |
| 147 | 155 | ||
| 148 | static const struct dev_pm_ops pcie_portdrv_pm_ops = { | 156 | static const struct dev_pm_ops pcie_portdrv_pm_ops = { |
| @@ -155,6 +163,7 @@ static const struct dev_pm_ops pcie_portdrv_pm_ops = { | |||
| 155 | .resume_noirq = pcie_port_resume_noirq, | 163 | .resume_noirq = pcie_port_resume_noirq, |
| 156 | .runtime_suspend = pcie_port_runtime_suspend, | 164 | .runtime_suspend = pcie_port_runtime_suspend, |
| 157 | .runtime_resume = pcie_port_runtime_resume, | 165 | .runtime_resume = pcie_port_runtime_resume, |
| 166 | .runtime_idle = pcie_port_runtime_idle, | ||
| 158 | }; | 167 | }; |
| 159 | 168 | ||
| 160 | #define PCIE_PORTDRV_PM_OPS (&pcie_portdrv_pm_ops) | 169 | #define PCIE_PORTDRV_PM_OPS (&pcie_portdrv_pm_ops) |
| @@ -200,6 +209,11 @@ static int __devinit pcie_portdrv_probe(struct pci_dev *dev, | |||
| 200 | return status; | 209 | return status; |
| 201 | 210 | ||
| 202 | pci_save_state(dev); | 211 | pci_save_state(dev); |
| 212 | /* | ||
| 213 | * D3cold may not work properly on some PCIe port, so disable | ||
| 214 | * it by default. | ||
| 215 | */ | ||
| 216 | dev->d3cold_allowed = false; | ||
| 203 | if (!pci_match_id(port_runtime_pm_black_list, dev)) | 217 | if (!pci_match_id(port_runtime_pm_black_list, dev)) |
| 204 | pm_runtime_put_noidle(&dev->dev); | 218 | pm_runtime_put_noidle(&dev->dev); |
| 205 | 219 | ||
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 6c143b4497ca..9f8a6b79a8ec 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
| @@ -144,15 +144,13 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar) | |||
| 144 | case PCI_BASE_ADDRESS_MEM_TYPE_32: | 144 | case PCI_BASE_ADDRESS_MEM_TYPE_32: |
| 145 | break; | 145 | break; |
| 146 | case PCI_BASE_ADDRESS_MEM_TYPE_1M: | 146 | case PCI_BASE_ADDRESS_MEM_TYPE_1M: |
| 147 | dev_info(&dev->dev, "1M mem BAR treated as 32-bit BAR\n"); | 147 | /* 1M mem BAR treated as 32-bit BAR */ |
| 148 | break; | 148 | break; |
| 149 | case PCI_BASE_ADDRESS_MEM_TYPE_64: | 149 | case PCI_BASE_ADDRESS_MEM_TYPE_64: |
| 150 | flags |= IORESOURCE_MEM_64; | 150 | flags |= IORESOURCE_MEM_64; |
| 151 | break; | 151 | break; |
| 152 | default: | 152 | default: |
| 153 | dev_warn(&dev->dev, | 153 | /* mem unknown type treated as 32-bit BAR */ |
| 154 | "mem unknown type %x treated as 32-bit BAR\n", | ||
| 155 | mem_type); | ||
| 156 | break; | 154 | break; |
| 157 | } | 155 | } |
| 158 | return flags; | 156 | return flags; |
| @@ -173,9 +171,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 173 | u32 l, sz, mask; | 171 | u32 l, sz, mask; |
| 174 | u16 orig_cmd; | 172 | u16 orig_cmd; |
| 175 | struct pci_bus_region region; | 173 | struct pci_bus_region region; |
| 174 | bool bar_too_big = false, bar_disabled = false; | ||
| 176 | 175 | ||
| 177 | mask = type ? PCI_ROM_ADDRESS_MASK : ~0; | 176 | mask = type ? PCI_ROM_ADDRESS_MASK : ~0; |
| 178 | 177 | ||
| 178 | /* No printks while decoding is disabled! */ | ||
| 179 | if (!dev->mmio_always_on) { | 179 | if (!dev->mmio_always_on) { |
| 180 | pci_read_config_word(dev, PCI_COMMAND, &orig_cmd); | 180 | pci_read_config_word(dev, PCI_COMMAND, &orig_cmd); |
| 181 | pci_write_config_word(dev, PCI_COMMAND, | 181 | pci_write_config_word(dev, PCI_COMMAND, |
| @@ -240,8 +240,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 240 | goto fail; | 240 | goto fail; |
| 241 | 241 | ||
| 242 | if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) { | 242 | if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) { |
| 243 | dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n", | 243 | bar_too_big = true; |
| 244 | pos); | ||
| 245 | goto fail; | 244 | goto fail; |
| 246 | } | 245 | } |
| 247 | 246 | ||
| @@ -252,12 +251,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 252 | region.start = 0; | 251 | region.start = 0; |
| 253 | region.end = sz64; | 252 | region.end = sz64; |
| 254 | pcibios_bus_to_resource(dev, res, ®ion); | 253 | pcibios_bus_to_resource(dev, res, ®ion); |
| 254 | bar_disabled = true; | ||
| 255 | } else { | 255 | } else { |
| 256 | region.start = l64; | 256 | region.start = l64; |
| 257 | region.end = l64 + sz64; | 257 | region.end = l64 + sz64; |
| 258 | pcibios_bus_to_resource(dev, res, ®ion); | 258 | pcibios_bus_to_resource(dev, res, ®ion); |
| 259 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", | ||
| 260 | pos, res); | ||
| 261 | } | 259 | } |
| 262 | } else { | 260 | } else { |
| 263 | sz = pci_size(l, sz, mask); | 261 | sz = pci_size(l, sz, mask); |
| @@ -268,18 +266,23 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, | |||
| 268 | region.start = l; | 266 | region.start = l; |
| 269 | region.end = l + sz; | 267 | region.end = l + sz; |
| 270 | pcibios_bus_to_resource(dev, res, ®ion); | 268 | pcibios_bus_to_resource(dev, res, ®ion); |
| 271 | |||
| 272 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); | ||
| 273 | } | 269 | } |
| 274 | 270 | ||
| 275 | out: | 271 | goto out; |
| 272 | |||
| 273 | |||
| 274 | fail: | ||
| 275 | res->flags = 0; | ||
| 276 | out: | ||
| 276 | if (!dev->mmio_always_on) | 277 | if (!dev->mmio_always_on) |
| 277 | pci_write_config_word(dev, PCI_COMMAND, orig_cmd); | 278 | pci_write_config_word(dev, PCI_COMMAND, orig_cmd); |
| 278 | 279 | ||
| 280 | if (bar_too_big) | ||
| 281 | dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n", pos); | ||
| 282 | if (res->flags && !bar_disabled) | ||
| 283 | dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); | ||
| 284 | |||
| 279 | return (res->flags & IORESOURCE_MEM_64) ? 1 : 0; | 285 | return (res->flags & IORESOURCE_MEM_64) ? 1 : 0; |
| 280 | fail: | ||
| 281 | res->flags = 0; | ||
| 282 | goto out; | ||
| 283 | } | 286 | } |
| 284 | 287 | ||
| 285 | static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) | 288 | static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) |
diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c index 3782e1cd3697..934d861a3235 100644 --- a/drivers/platform/x86/acer-wmi.c +++ b/drivers/platform/x86/acer-wmi.c | |||
| @@ -2196,10 +2196,8 @@ static int __init acer_wmi_init(void) | |||
| 2196 | interface->capability &= ~ACER_CAP_BRIGHTNESS; | 2196 | interface->capability &= ~ACER_CAP_BRIGHTNESS; |
| 2197 | pr_info("Brightness must be controlled by acpi video driver\n"); | 2197 | pr_info("Brightness must be controlled by acpi video driver\n"); |
| 2198 | } else { | 2198 | } else { |
| 2199 | #ifdef CONFIG_ACPI_VIDEO | ||
| 2200 | pr_info("Disabling ACPI video driver\n"); | 2199 | pr_info("Disabling ACPI video driver\n"); |
| 2201 | acpi_video_unregister(); | 2200 | acpi_video_unregister(); |
| 2202 | #endif | ||
| 2203 | } | 2201 | } |
| 2204 | 2202 | ||
| 2205 | if (wmi_has_guid(WMID_GUID3)) { | 2203 | if (wmi_has_guid(WMID_GUID3)) { |
diff --git a/drivers/platform/x86/apple-gmux.c b/drivers/platform/x86/apple-gmux.c index dfb1a92ce949..db8f63841b42 100644 --- a/drivers/platform/x86/apple-gmux.c +++ b/drivers/platform/x86/apple-gmux.c | |||
| @@ -101,7 +101,7 @@ static void gmux_pio_write32(struct apple_gmux_data *gmux_data, int port, | |||
| 101 | 101 | ||
| 102 | for (i = 0; i < 4; i++) { | 102 | for (i = 0; i < 4; i++) { |
| 103 | tmpval = (val >> (i * 8)) & 0xff; | 103 | tmpval = (val >> (i * 8)) & 0xff; |
| 104 | outb(tmpval, port + i); | 104 | outb(tmpval, gmux_data->iostart + port + i); |
| 105 | } | 105 | } |
| 106 | } | 106 | } |
| 107 | 107 | ||
| @@ -142,8 +142,9 @@ static u8 gmux_index_read8(struct apple_gmux_data *gmux_data, int port) | |||
| 142 | u8 val; | 142 | u8 val; |
| 143 | 143 | ||
| 144 | mutex_lock(&gmux_data->index_lock); | 144 | mutex_lock(&gmux_data->index_lock); |
| 145 | outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); | ||
| 146 | gmux_index_wait_ready(gmux_data); | 145 | gmux_index_wait_ready(gmux_data); |
| 146 | outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); | ||
| 147 | gmux_index_wait_complete(gmux_data); | ||
| 147 | val = inb(gmux_data->iostart + GMUX_PORT_VALUE); | 148 | val = inb(gmux_data->iostart + GMUX_PORT_VALUE); |
| 148 | mutex_unlock(&gmux_data->index_lock); | 149 | mutex_unlock(&gmux_data->index_lock); |
| 149 | 150 | ||
| @@ -166,8 +167,9 @@ static u32 gmux_index_read32(struct apple_gmux_data *gmux_data, int port) | |||
| 166 | u32 val; | 167 | u32 val; |
| 167 | 168 | ||
| 168 | mutex_lock(&gmux_data->index_lock); | 169 | mutex_lock(&gmux_data->index_lock); |
| 169 | outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); | ||
| 170 | gmux_index_wait_ready(gmux_data); | 170 | gmux_index_wait_ready(gmux_data); |
| 171 | outb((port & 0xff), gmux_data->iostart + GMUX_PORT_READ); | ||
| 172 | gmux_index_wait_complete(gmux_data); | ||
| 171 | val = inl(gmux_data->iostart + GMUX_PORT_VALUE); | 173 | val = inl(gmux_data->iostart + GMUX_PORT_VALUE); |
| 172 | mutex_unlock(&gmux_data->index_lock); | 174 | mutex_unlock(&gmux_data->index_lock); |
| 173 | 175 | ||
| @@ -461,18 +463,22 @@ static int __devinit gmux_probe(struct pnp_dev *pnp, | |||
| 461 | ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE); | 463 | ver_release = gmux_read8(gmux_data, GMUX_PORT_VERSION_RELEASE); |
| 462 | if (ver_major == 0xff && ver_minor == 0xff && ver_release == 0xff) { | 464 | if (ver_major == 0xff && ver_minor == 0xff && ver_release == 0xff) { |
| 463 | if (gmux_is_indexed(gmux_data)) { | 465 | if (gmux_is_indexed(gmux_data)) { |
| 466 | u32 version; | ||
| 464 | mutex_init(&gmux_data->index_lock); | 467 | mutex_init(&gmux_data->index_lock); |
| 465 | gmux_data->indexed = true; | 468 | gmux_data->indexed = true; |
| 469 | version = gmux_read32(gmux_data, | ||
| 470 | GMUX_PORT_VERSION_MAJOR); | ||
| 471 | ver_major = (version >> 24) & 0xff; | ||
| 472 | ver_minor = (version >> 16) & 0xff; | ||
| 473 | ver_release = (version >> 8) & 0xff; | ||
| 466 | } else { | 474 | } else { |
| 467 | pr_info("gmux device not present\n"); | 475 | pr_info("gmux device not present\n"); |
| 468 | ret = -ENODEV; | 476 | ret = -ENODEV; |
| 469 | goto err_release; | 477 | goto err_release; |
| 470 | } | 478 | } |
| 471 | pr_info("Found indexed gmux\n"); | ||
| 472 | } else { | ||
| 473 | pr_info("Found gmux version %d.%d.%d\n", ver_major, ver_minor, | ||
| 474 | ver_release); | ||
| 475 | } | 479 | } |
| 480 | pr_info("Found gmux version %d.%d.%d [%s]\n", ver_major, ver_minor, | ||
| 481 | ver_release, (gmux_data->indexed ? "indexed" : "classic")); | ||
| 476 | 482 | ||
| 477 | memset(&props, 0, sizeof(props)); | 483 | memset(&props, 0, sizeof(props)); |
| 478 | props.type = BACKLIGHT_PLATFORM; | 484 | props.type = BACKLIGHT_PLATFORM; |
| @@ -505,9 +511,7 @@ static int __devinit gmux_probe(struct pnp_dev *pnp, | |||
| 505 | * Disable the other backlight choices. | 511 | * Disable the other backlight choices. |
| 506 | */ | 512 | */ |
| 507 | acpi_video_dmi_promote_vendor(); | 513 | acpi_video_dmi_promote_vendor(); |
| 508 | #if defined (CONFIG_ACPI_VIDEO) || defined (CONFIG_ACPI_VIDEO_MODULE) | ||
| 509 | acpi_video_unregister(); | 514 | acpi_video_unregister(); |
| 510 | #endif | ||
| 511 | apple_bl_unregister(); | 515 | apple_bl_unregister(); |
| 512 | 516 | ||
| 513 | gmux_data->power_state = VGA_SWITCHEROO_ON; | 517 | gmux_data->power_state = VGA_SWITCHEROO_ON; |
| @@ -593,9 +597,7 @@ static void __devexit gmux_remove(struct pnp_dev *pnp) | |||
| 593 | kfree(gmux_data); | 597 | kfree(gmux_data); |
| 594 | 598 | ||
| 595 | acpi_video_dmi_demote_vendor(); | 599 | acpi_video_dmi_demote_vendor(); |
| 596 | #if defined (CONFIG_ACPI_VIDEO) || defined (CONFIG_ACPI_VIDEO_MODULE) | ||
| 597 | acpi_video_register(); | 600 | acpi_video_register(); |
| 598 | #endif | ||
| 599 | apple_bl_register(); | 601 | apple_bl_register(); |
| 600 | } | 602 | } |
| 601 | 603 | ||
diff --git a/drivers/platform/x86/asus-laptop.c b/drivers/platform/x86/asus-laptop.c index e38f91be0b10..4b568df56643 100644 --- a/drivers/platform/x86/asus-laptop.c +++ b/drivers/platform/x86/asus-laptop.c | |||
| @@ -85,7 +85,7 @@ static char *wled_type = "unknown"; | |||
| 85 | static char *bled_type = "unknown"; | 85 | static char *bled_type = "unknown"; |
| 86 | 86 | ||
| 87 | module_param(wled_type, charp, 0444); | 87 | module_param(wled_type, charp, 0444); |
| 88 | MODULE_PARM_DESC(wlan_status, "Set the wled type on boot " | 88 | MODULE_PARM_DESC(wled_type, "Set the wled type on boot " |
| 89 | "(unknown, led or rfkill). " | 89 | "(unknown, led or rfkill). " |
| 90 | "default is unknown"); | 90 | "default is unknown"); |
| 91 | 91 | ||
| @@ -863,9 +863,9 @@ static ssize_t show_infos(struct device *dev, | |||
| 863 | * The significance of others is yet to be found. | 863 | * The significance of others is yet to be found. |
| 864 | * If we don't find the method, we assume the device are present. | 864 | * If we don't find the method, we assume the device are present. |
| 865 | */ | 865 | */ |
| 866 | rv = acpi_evaluate_integer(asus->handle, "HRWS", NULL, &temp); | 866 | rv = acpi_evaluate_integer(asus->handle, "HWRS", NULL, &temp); |
| 867 | if (!ACPI_FAILURE(rv)) | 867 | if (!ACPI_FAILURE(rv)) |
| 868 | len += sprintf(page + len, "HRWS value : %#x\n", | 868 | len += sprintf(page + len, "HWRS value : %#x\n", |
| 869 | (uint) temp); | 869 | (uint) temp); |
| 870 | /* | 870 | /* |
| 871 | * Another value for userspace: the ASYM method returns 0x02 for | 871 | * Another value for userspace: the ASYM method returns 0x02 for |
| @@ -1751,9 +1751,9 @@ static int asus_laptop_get_info(struct asus_laptop *asus) | |||
| 1751 | * The significance of others is yet to be found. | 1751 | * The significance of others is yet to be found. |
| 1752 | */ | 1752 | */ |
| 1753 | status = | 1753 | status = |
| 1754 | acpi_evaluate_integer(asus->handle, "HRWS", NULL, &hwrs_result); | 1754 | acpi_evaluate_integer(asus->handle, "HWRS", NULL, &hwrs_result); |
| 1755 | if (!ACPI_FAILURE(status)) | 1755 | if (!ACPI_FAILURE(status)) |
| 1756 | pr_notice(" HRWS returned %x", (int)hwrs_result); | 1756 | pr_notice(" HWRS returned %x", (int)hwrs_result); |
| 1757 | 1757 | ||
| 1758 | if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL)) | 1758 | if (!acpi_check_handle(asus->handle, METHOD_WL_STATUS, NULL)) |
| 1759 | asus->have_rsts = true; | 1759 | asus->have_rsts = true; |
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c index 2eb9fe8e8efd..c0e9ff489b24 100644 --- a/drivers/platform/x86/asus-wmi.c +++ b/drivers/platform/x86/asus-wmi.c | |||
| @@ -47,9 +47,7 @@ | |||
| 47 | #include <linux/thermal.h> | 47 | #include <linux/thermal.h> |
| 48 | #include <acpi/acpi_bus.h> | 48 | #include <acpi/acpi_bus.h> |
| 49 | #include <acpi/acpi_drivers.h> | 49 | #include <acpi/acpi_drivers.h> |
| 50 | #ifdef CONFIG_ACPI_VIDEO | ||
| 51 | #include <acpi/video.h> | 50 | #include <acpi/video.h> |
| 52 | #endif | ||
| 53 | 51 | ||
| 54 | #include "asus-wmi.h" | 52 | #include "asus-wmi.h" |
| 55 | 53 | ||
| @@ -1704,10 +1702,8 @@ static int asus_wmi_add(struct platform_device *pdev) | |||
| 1704 | if (asus->driver->quirks->wmi_backlight_power) | 1702 | if (asus->driver->quirks->wmi_backlight_power) |
| 1705 | acpi_video_dmi_promote_vendor(); | 1703 | acpi_video_dmi_promote_vendor(); |
| 1706 | if (!acpi_video_backlight_support()) { | 1704 | if (!acpi_video_backlight_support()) { |
| 1707 | #ifdef CONFIG_ACPI_VIDEO | ||
| 1708 | pr_info("Disabling ACPI video driver\n"); | 1705 | pr_info("Disabling ACPI video driver\n"); |
| 1709 | acpi_video_unregister(); | 1706 | acpi_video_unregister(); |
| 1710 | #endif | ||
| 1711 | err = asus_wmi_backlight_init(asus); | 1707 | err = asus_wmi_backlight_init(asus); |
| 1712 | if (err && err != -ENODEV) | 1708 | if (err && err != -ENODEV) |
| 1713 | goto fail_backlight; | 1709 | goto fail_backlight; |
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index dab91b48d22c..5ca264179f4e 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
| @@ -610,12 +610,12 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle) | |||
| 610 | 610 | ||
| 611 | if (!bus) { | 611 | if (!bus) { |
| 612 | pr_warn("Unable to find PCI bus 1?\n"); | 612 | pr_warn("Unable to find PCI bus 1?\n"); |
| 613 | goto out_unlock; | 613 | goto out_put_dev; |
| 614 | } | 614 | } |
| 615 | 615 | ||
| 616 | if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) { | 616 | if (pci_bus_read_config_dword(bus, 0, PCI_VENDOR_ID, &l)) { |
| 617 | pr_err("Unable to read PCI config space?\n"); | 617 | pr_err("Unable to read PCI config space?\n"); |
| 618 | goto out_unlock; | 618 | goto out_put_dev; |
| 619 | } | 619 | } |
| 620 | 620 | ||
| 621 | absent = (l == 0xffffffff); | 621 | absent = (l == 0xffffffff); |
| @@ -627,7 +627,7 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle) | |||
| 627 | absent ? "absent" : "present"); | 627 | absent ? "absent" : "present"); |
| 628 | pr_warn("skipped wireless hotplug as probably " | 628 | pr_warn("skipped wireless hotplug as probably " |
| 629 | "inappropriate for this model\n"); | 629 | "inappropriate for this model\n"); |
| 630 | goto out_unlock; | 630 | goto out_put_dev; |
| 631 | } | 631 | } |
| 632 | 632 | ||
| 633 | if (!blocked) { | 633 | if (!blocked) { |
| @@ -635,7 +635,7 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle) | |||
| 635 | if (dev) { | 635 | if (dev) { |
| 636 | /* Device already present */ | 636 | /* Device already present */ |
| 637 | pci_dev_put(dev); | 637 | pci_dev_put(dev); |
| 638 | goto out_unlock; | 638 | goto out_put_dev; |
| 639 | } | 639 | } |
| 640 | dev = pci_scan_single_device(bus, 0); | 640 | dev = pci_scan_single_device(bus, 0); |
| 641 | if (dev) { | 641 | if (dev) { |
| @@ -650,6 +650,8 @@ static void eeepc_rfkill_hotplug(struct eeepc_laptop *eeepc, acpi_handle handle) | |||
| 650 | pci_dev_put(dev); | 650 | pci_dev_put(dev); |
| 651 | } | 651 | } |
| 652 | } | 652 | } |
| 653 | out_put_dev: | ||
| 654 | pci_dev_put(port); | ||
| 653 | } | 655 | } |
| 654 | 656 | ||
| 655 | out_unlock: | 657 | out_unlock: |
diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c index c1ca7bcebb66..dd90d15f5210 100644 --- a/drivers/platform/x86/samsung-laptop.c +++ b/drivers/platform/x86/samsung-laptop.c | |||
| @@ -26,9 +26,7 @@ | |||
| 26 | #include <linux/seq_file.h> | 26 | #include <linux/seq_file.h> |
| 27 | #include <linux/debugfs.h> | 27 | #include <linux/debugfs.h> |
| 28 | #include <linux/ctype.h> | 28 | #include <linux/ctype.h> |
| 29 | #ifdef CONFIG_ACPI_VIDEO | ||
| 30 | #include <acpi/video.h> | 29 | #include <acpi/video.h> |
| 31 | #endif | ||
| 32 | 30 | ||
| 33 | /* | 31 | /* |
| 34 | * This driver is needed because a number of Samsung laptops do not hook | 32 | * This driver is needed because a number of Samsung laptops do not hook |
| @@ -1558,9 +1556,7 @@ static int __init samsung_init(void) | |||
| 1558 | samsung->handle_backlight = false; | 1556 | samsung->handle_backlight = false; |
| 1559 | } else if (samsung->quirks->broken_acpi_video) { | 1557 | } else if (samsung->quirks->broken_acpi_video) { |
| 1560 | pr_info("Disabling ACPI video driver\n"); | 1558 | pr_info("Disabling ACPI video driver\n"); |
| 1561 | #ifdef CONFIG_ACPI_VIDEO | ||
| 1562 | acpi_video_unregister(); | 1559 | acpi_video_unregister(); |
| 1563 | #endif | ||
| 1564 | } | 1560 | } |
| 1565 | #endif | 1561 | #endif |
| 1566 | 1562 | ||
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c index 80e377949314..52daaa816e53 100644 --- a/drivers/platform/x86/thinkpad_acpi.c +++ b/drivers/platform/x86/thinkpad_acpi.c | |||
| @@ -545,7 +545,7 @@ TPACPI_HANDLE(hkey, ec, "\\_SB.HKEY", /* 600e/x, 770e, 770x */ | |||
| 545 | */ | 545 | */ |
| 546 | 546 | ||
| 547 | static int acpi_evalf(acpi_handle handle, | 547 | static int acpi_evalf(acpi_handle handle, |
| 548 | void *res, char *method, char *fmt, ...) | 548 | int *res, char *method, char *fmt, ...) |
| 549 | { | 549 | { |
| 550 | char *fmt0 = fmt; | 550 | char *fmt0 = fmt; |
| 551 | struct acpi_object_list params; | 551 | struct acpi_object_list params; |
| @@ -606,7 +606,7 @@ static int acpi_evalf(acpi_handle handle, | |||
| 606 | success = (status == AE_OK && | 606 | success = (status == AE_OK && |
| 607 | out_obj.type == ACPI_TYPE_INTEGER); | 607 | out_obj.type == ACPI_TYPE_INTEGER); |
| 608 | if (success && res) | 608 | if (success && res) |
| 609 | *(int *)res = out_obj.integer.value; | 609 | *res = out_obj.integer.value; |
| 610 | break; | 610 | break; |
| 611 | case 'v': /* void */ | 611 | case 'v': /* void */ |
| 612 | success = status == AE_OK; | 612 | success = status == AE_OK; |
| @@ -7386,17 +7386,18 @@ static int fan_get_status(u8 *status) | |||
| 7386 | * Add TPACPI_FAN_RD_ACPI_FANS ? */ | 7386 | * Add TPACPI_FAN_RD_ACPI_FANS ? */ |
| 7387 | 7387 | ||
| 7388 | switch (fan_status_access_mode) { | 7388 | switch (fan_status_access_mode) { |
| 7389 | case TPACPI_FAN_RD_ACPI_GFAN: | 7389 | case TPACPI_FAN_RD_ACPI_GFAN: { |
| 7390 | /* 570, 600e/x, 770e, 770x */ | 7390 | /* 570, 600e/x, 770e, 770x */ |
| 7391 | int res; | ||
| 7391 | 7392 | ||
| 7392 | if (unlikely(!acpi_evalf(gfan_handle, &s, NULL, "d"))) | 7393 | if (unlikely(!acpi_evalf(gfan_handle, &res, NULL, "d"))) |
| 7393 | return -EIO; | 7394 | return -EIO; |
| 7394 | 7395 | ||
| 7395 | if (likely(status)) | 7396 | if (likely(status)) |
| 7396 | *status = s & 0x07; | 7397 | *status = res & 0x07; |
| 7397 | 7398 | ||
| 7398 | break; | 7399 | break; |
| 7399 | 7400 | } | |
| 7400 | case TPACPI_FAN_RD_TPEC: | 7401 | case TPACPI_FAN_RD_TPEC: |
| 7401 | /* all except 570, 600e/x, 770e, 770x */ | 7402 | /* all except 570, 600e/x, 770e, 770x */ |
| 7402 | if (unlikely(!acpi_ec_read(fan_status_offset, &s))) | 7403 | if (unlikely(!acpi_ec_read(fan_status_offset, &s))) |
diff --git a/drivers/pwm/pwm-tiecap.c b/drivers/pwm/pwm-tiecap.c index 0b66d0f25922..4b6688909fee 100644 --- a/drivers/pwm/pwm-tiecap.c +++ b/drivers/pwm/pwm-tiecap.c | |||
| @@ -100,6 +100,13 @@ static int ecap_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | |||
| 100 | writel(period_cycles, pc->mmio_base + CAP3); | 100 | writel(period_cycles, pc->mmio_base + CAP3); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | if (!test_bit(PWMF_ENABLED, &pwm->flags)) { | ||
| 104 | reg_val = readw(pc->mmio_base + ECCTL2); | ||
| 105 | /* Disable APWM mode to put APWM output Low */ | ||
| 106 | reg_val &= ~ECCTL2_APWM_MODE; | ||
| 107 | writew(reg_val, pc->mmio_base + ECCTL2); | ||
| 108 | } | ||
| 109 | |||
| 103 | pm_runtime_put_sync(pc->chip.dev); | 110 | pm_runtime_put_sync(pc->chip.dev); |
| 104 | return 0; | 111 | return 0; |
| 105 | } | 112 | } |
diff --git a/drivers/pwm/pwm-tiehrpwm.c b/drivers/pwm/pwm-tiehrpwm.c index c3756d1be194..b1996bcd5b78 100644 --- a/drivers/pwm/pwm-tiehrpwm.c +++ b/drivers/pwm/pwm-tiehrpwm.c | |||
| @@ -104,6 +104,7 @@ struct ehrpwm_pwm_chip { | |||
| 104 | struct pwm_chip chip; | 104 | struct pwm_chip chip; |
| 105 | unsigned int clk_rate; | 105 | unsigned int clk_rate; |
| 106 | void __iomem *mmio_base; | 106 | void __iomem *mmio_base; |
| 107 | unsigned long period_cycles[NUM_PWM_CHANNEL]; | ||
| 107 | }; | 108 | }; |
| 108 | 109 | ||
| 109 | static inline struct ehrpwm_pwm_chip *to_ehrpwm_pwm_chip(struct pwm_chip *chip) | 110 | static inline struct ehrpwm_pwm_chip *to_ehrpwm_pwm_chip(struct pwm_chip *chip) |
| @@ -210,6 +211,7 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | |||
| 210 | unsigned long long c; | 211 | unsigned long long c; |
| 211 | unsigned long period_cycles, duty_cycles; | 212 | unsigned long period_cycles, duty_cycles; |
| 212 | unsigned short ps_divval, tb_divval; | 213 | unsigned short ps_divval, tb_divval; |
| 214 | int i; | ||
| 213 | 215 | ||
| 214 | if (period_ns < 0 || duty_ns < 0 || period_ns > NSEC_PER_SEC) | 216 | if (period_ns < 0 || duty_ns < 0 || period_ns > NSEC_PER_SEC) |
| 215 | return -ERANGE; | 217 | return -ERANGE; |
| @@ -229,6 +231,28 @@ static int ehrpwm_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | |||
| 229 | duty_cycles = (unsigned long)c; | 231 | duty_cycles = (unsigned long)c; |
| 230 | } | 232 | } |
| 231 | 233 | ||
| 234 | /* | ||
| 235 | * Period values should be same for multiple PWM channels as IP uses | ||
| 236 | * same period register for multiple channels. | ||
| 237 | */ | ||
| 238 | for (i = 0; i < NUM_PWM_CHANNEL; i++) { | ||
| 239 | if (pc->period_cycles[i] && | ||
| 240 | (pc->period_cycles[i] != period_cycles)) { | ||
| 241 | /* | ||
| 242 | * Allow channel to reconfigure period if no other | ||
| 243 | * channels being configured. | ||
| 244 | */ | ||
| 245 | if (i == pwm->hwpwm) | ||
| 246 | continue; | ||
| 247 | |||
| 248 | dev_err(chip->dev, "Period value conflicts with channel %d\n", | ||
| 249 | i); | ||
| 250 | return -EINVAL; | ||
| 251 | } | ||
| 252 | } | ||
| 253 | |||
| 254 | pc->period_cycles[pwm->hwpwm] = period_cycles; | ||
| 255 | |||
| 232 | /* Configure clock prescaler to support Low frequency PWM wave */ | 256 | /* Configure clock prescaler to support Low frequency PWM wave */ |
| 233 | if (set_prescale_div(period_cycles/PERIOD_MAX, &ps_divval, | 257 | if (set_prescale_div(period_cycles/PERIOD_MAX, &ps_divval, |
| 234 | &tb_divval)) { | 258 | &tb_divval)) { |
| @@ -320,10 +344,15 @@ static void ehrpwm_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) | |||
| 320 | 344 | ||
| 321 | static void ehrpwm_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) | 345 | static void ehrpwm_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) |
| 322 | { | 346 | { |
| 347 | struct ehrpwm_pwm_chip *pc = to_ehrpwm_pwm_chip(chip); | ||
| 348 | |||
| 323 | if (test_bit(PWMF_ENABLED, &pwm->flags)) { | 349 | if (test_bit(PWMF_ENABLED, &pwm->flags)) { |
| 324 | dev_warn(chip->dev, "Removing PWM device without disabling\n"); | 350 | dev_warn(chip->dev, "Removing PWM device without disabling\n"); |
| 325 | pm_runtime_put_sync(chip->dev); | 351 | pm_runtime_put_sync(chip->dev); |
| 326 | } | 352 | } |
| 353 | |||
| 354 | /* set period value to zero on free */ | ||
| 355 | pc->period_cycles[pwm->hwpwm] = 0; | ||
| 327 | } | 356 | } |
| 328 | 357 | ||
| 329 | static const struct pwm_ops ehrpwm_pwm_ops = { | 358 | static const struct pwm_ops ehrpwm_pwm_ops = { |
diff --git a/drivers/regulator/tps65217-regulator.c b/drivers/regulator/tps65217-regulator.c index 6caa222af77a..ab00cab905b7 100644 --- a/drivers/regulator/tps65217-regulator.c +++ b/drivers/regulator/tps65217-regulator.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
| 23 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
| 24 | 24 | ||
| 25 | #include <linux/regulator/of_regulator.h> | ||
| 25 | #include <linux/regulator/driver.h> | 26 | #include <linux/regulator/driver.h> |
| 26 | #include <linux/regulator/machine.h> | 27 | #include <linux/regulator/machine.h> |
| 27 | #include <linux/mfd/tps65217.h> | 28 | #include <linux/mfd/tps65217.h> |
| @@ -281,37 +282,130 @@ static const struct regulator_desc regulators[] = { | |||
| 281 | NULL), | 282 | NULL), |
| 282 | }; | 283 | }; |
| 283 | 284 | ||
| 285 | #ifdef CONFIG_OF | ||
| 286 | static struct of_regulator_match reg_matches[] = { | ||
| 287 | { .name = "dcdc1", .driver_data = (void *)TPS65217_DCDC_1 }, | ||
| 288 | { .name = "dcdc2", .driver_data = (void *)TPS65217_DCDC_2 }, | ||
| 289 | { .name = "dcdc3", .driver_data = (void *)TPS65217_DCDC_3 }, | ||
| 290 | { .name = "ldo1", .driver_data = (void *)TPS65217_LDO_1 }, | ||
| 291 | { .name = "ldo2", .driver_data = (void *)TPS65217_LDO_2 }, | ||
| 292 | { .name = "ldo3", .driver_data = (void *)TPS65217_LDO_3 }, | ||
| 293 | { .name = "ldo4", .driver_data = (void *)TPS65217_LDO_4 }, | ||
| 294 | }; | ||
| 295 | |||
| 296 | static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev) | ||
| 297 | { | ||
| 298 | struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent); | ||
| 299 | struct device_node *node = tps->dev->of_node; | ||
| 300 | struct tps65217_board *pdata; | ||
| 301 | struct device_node *regs; | ||
| 302 | int i, count; | ||
| 303 | |||
| 304 | regs = of_find_node_by_name(node, "regulators"); | ||
| 305 | if (!regs) | ||
| 306 | return NULL; | ||
| 307 | |||
| 308 | count = of_regulator_match(pdev->dev.parent, regs, | ||
| 309 | reg_matches, TPS65217_NUM_REGULATOR); | ||
| 310 | of_node_put(regs); | ||
| 311 | if ((count < 0) || (count > TPS65217_NUM_REGULATOR)) | ||
| 312 | return NULL; | ||
| 313 | |||
| 314 | pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); | ||
| 315 | if (!pdata) | ||
| 316 | return NULL; | ||
| 317 | |||
| 318 | for (i = 0; i < count; i++) { | ||
| 319 | if (!reg_matches[i].init_data || !reg_matches[i].of_node) | ||
| 320 | continue; | ||
| 321 | |||
| 322 | pdata->tps65217_init_data[i] = reg_matches[i].init_data; | ||
| 323 | pdata->of_node[i] = reg_matches[i].of_node; | ||
| 324 | } | ||
| 325 | |||
| 326 | return pdata; | ||
| 327 | } | ||
| 328 | #else | ||
| 329 | static struct tps65217_board *tps65217_parse_dt(struct platform_device *pdev) | ||
| 330 | { | ||
| 331 | return NULL; | ||
| 332 | } | ||
| 333 | #endif | ||
| 334 | |||
| 284 | static int __devinit tps65217_regulator_probe(struct platform_device *pdev) | 335 | static int __devinit tps65217_regulator_probe(struct platform_device *pdev) |
| 285 | { | 336 | { |
| 337 | struct tps65217 *tps = dev_get_drvdata(pdev->dev.parent); | ||
| 338 | struct tps65217_board *pdata = dev_get_platdata(tps->dev); | ||
| 339 | struct regulator_init_data *reg_data; | ||
| 286 | struct regulator_dev *rdev; | 340 | struct regulator_dev *rdev; |
| 287 | struct tps65217 *tps; | ||
| 288 | struct tps_info *info = &tps65217_pmic_regs[pdev->id]; | ||
| 289 | struct regulator_config config = { }; | 341 | struct regulator_config config = { }; |
| 342 | int i, ret; | ||
| 290 | 343 | ||
| 291 | /* Already set by core driver */ | 344 | if (tps->dev->of_node) |
| 292 | tps = dev_to_tps65217(pdev->dev.parent); | 345 | pdata = tps65217_parse_dt(pdev); |
| 293 | tps->info[pdev->id] = info; | ||
| 294 | 346 | ||
| 295 | config.dev = &pdev->dev; | 347 | if (!pdata) { |
| 296 | config.of_node = pdev->dev.of_node; | 348 | dev_err(&pdev->dev, "Platform data not found\n"); |
| 297 | config.init_data = pdev->dev.platform_data; | 349 | return -EINVAL; |
| 298 | config.driver_data = tps; | 350 | } |
| 299 | 351 | ||
| 300 | rdev = regulator_register(®ulators[pdev->id], &config); | 352 | if (tps65217_chip_id(tps) != TPS65217) { |
| 301 | if (IS_ERR(rdev)) | 353 | dev_err(&pdev->dev, "Invalid tps chip version\n"); |
| 302 | return PTR_ERR(rdev); | 354 | return -ENODEV; |
| 355 | } | ||
| 303 | 356 | ||
| 304 | platform_set_drvdata(pdev, rdev); | 357 | platform_set_drvdata(pdev, tps); |
| 305 | 358 | ||
| 359 | for (i = 0; i < TPS65217_NUM_REGULATOR; i++) { | ||
| 360 | |||
| 361 | reg_data = pdata->tps65217_init_data[i]; | ||
| 362 | |||
| 363 | /* | ||
| 364 | * Regulator API handles empty constraints but not NULL | ||
| 365 | * constraints | ||
| 366 | */ | ||
| 367 | if (!reg_data) | ||
| 368 | continue; | ||
| 369 | |||
| 370 | /* Register the regulators */ | ||
| 371 | tps->info[i] = &tps65217_pmic_regs[i]; | ||
| 372 | |||
| 373 | config.dev = tps->dev; | ||
| 374 | config.init_data = reg_data; | ||
| 375 | config.driver_data = tps; | ||
| 376 | config.regmap = tps->regmap; | ||
| 377 | if (tps->dev->of_node) | ||
| 378 | config.of_node = pdata->of_node[i]; | ||
| 379 | |||
| 380 | rdev = regulator_register(®ulators[i], &config); | ||
| 381 | if (IS_ERR(rdev)) { | ||
| 382 | dev_err(tps->dev, "failed to register %s regulator\n", | ||
| 383 | pdev->name); | ||
| 384 | ret = PTR_ERR(rdev); | ||
| 385 | goto err_unregister_regulator; | ||
| 386 | } | ||
| 387 | |||
| 388 | /* Save regulator for cleanup */ | ||
| 389 | tps->rdev[i] = rdev; | ||
| 390 | } | ||
| 306 | return 0; | 391 | return 0; |
| 392 | |||
| 393 | err_unregister_regulator: | ||
| 394 | while (--i >= 0) | ||
| 395 | regulator_unregister(tps->rdev[i]); | ||
| 396 | |||
| 397 | return ret; | ||
| 307 | } | 398 | } |
| 308 | 399 | ||
| 309 | static int __devexit tps65217_regulator_remove(struct platform_device *pdev) | 400 | static int __devexit tps65217_regulator_remove(struct platform_device *pdev) |
| 310 | { | 401 | { |
| 311 | struct regulator_dev *rdev = platform_get_drvdata(pdev); | 402 | struct tps65217 *tps = platform_get_drvdata(pdev); |
| 403 | unsigned int i; | ||
| 404 | |||
| 405 | for (i = 0; i < TPS65217_NUM_REGULATOR; i++) | ||
| 406 | regulator_unregister(tps->rdev[i]); | ||
| 312 | 407 | ||
| 313 | platform_set_drvdata(pdev, NULL); | 408 | platform_set_drvdata(pdev, NULL); |
| 314 | regulator_unregister(rdev); | ||
| 315 | 409 | ||
| 316 | return 0; | 410 | return 0; |
| 317 | } | 411 | } |
diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c index 590cfafc7c17..1859f71372e2 100644 --- a/drivers/rpmsg/virtio_rpmsg_bus.c +++ b/drivers/rpmsg/virtio_rpmsg_bus.c | |||
| @@ -1008,8 +1008,8 @@ static int rpmsg_probe(struct virtio_device *vdev) | |||
| 1008 | return 0; | 1008 | return 0; |
| 1009 | 1009 | ||
| 1010 | free_coherent: | 1010 | free_coherent: |
| 1011 | dma_free_coherent(vdev->dev.parent, RPMSG_TOTAL_BUF_SPACE, bufs_va, | 1011 | dma_free_coherent(vdev->dev.parent->parent, RPMSG_TOTAL_BUF_SPACE, |
| 1012 | vrp->bufs_dma); | 1012 | bufs_va, vrp->bufs_dma); |
| 1013 | vqs_del: | 1013 | vqs_del: |
| 1014 | vdev->config->del_vqs(vrp->vdev); | 1014 | vdev->config->del_vqs(vrp->vdev); |
| 1015 | free_vrp: | 1015 | free_vrp: |
| @@ -1043,7 +1043,7 @@ static void __devexit rpmsg_remove(struct virtio_device *vdev) | |||
| 1043 | 1043 | ||
| 1044 | vdev->config->del_vqs(vrp->vdev); | 1044 | vdev->config->del_vqs(vrp->vdev); |
| 1045 | 1045 | ||
| 1046 | dma_free_coherent(vdev->dev.parent, RPMSG_TOTAL_BUF_SPACE, | 1046 | dma_free_coherent(vdev->dev.parent->parent, RPMSG_TOTAL_BUF_SPACE, |
| 1047 | vrp->rbufs, vrp->bufs_dma); | 1047 | vrp->rbufs, vrp->bufs_dma); |
| 1048 | 1048 | ||
| 1049 | kfree(vrp); | 1049 | kfree(vrp); |
diff --git a/drivers/rtc/rtc-at91sam9.c b/drivers/rtc/rtc-at91sam9.c index 831868904e02..1dd61f402b04 100644 --- a/drivers/rtc/rtc-at91sam9.c +++ b/drivers/rtc/rtc-at91sam9.c | |||
| @@ -58,6 +58,7 @@ struct sam9_rtc { | |||
| 58 | struct rtc_device *rtcdev; | 58 | struct rtc_device *rtcdev; |
| 59 | u32 imr; | 59 | u32 imr; |
| 60 | void __iomem *gpbr; | 60 | void __iomem *gpbr; |
| 61 | int irq; | ||
| 61 | }; | 62 | }; |
| 62 | 63 | ||
| 63 | #define rtt_readl(rtc, field) \ | 64 | #define rtt_readl(rtc, field) \ |
| @@ -292,7 +293,7 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) | |||
| 292 | { | 293 | { |
| 293 | struct resource *r, *r_gpbr; | 294 | struct resource *r, *r_gpbr; |
| 294 | struct sam9_rtc *rtc; | 295 | struct sam9_rtc *rtc; |
| 295 | int ret; | 296 | int ret, irq; |
| 296 | u32 mr; | 297 | u32 mr; |
| 297 | 298 | ||
| 298 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 299 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -302,10 +303,18 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) | |||
| 302 | return -ENODEV; | 303 | return -ENODEV; |
| 303 | } | 304 | } |
| 304 | 305 | ||
| 306 | irq = platform_get_irq(pdev, 0); | ||
| 307 | if (irq < 0) { | ||
| 308 | dev_err(&pdev->dev, "failed to get interrupt resource\n"); | ||
| 309 | return irq; | ||
| 310 | } | ||
| 311 | |||
| 305 | rtc = kzalloc(sizeof *rtc, GFP_KERNEL); | 312 | rtc = kzalloc(sizeof *rtc, GFP_KERNEL); |
| 306 | if (!rtc) | 313 | if (!rtc) |
| 307 | return -ENOMEM; | 314 | return -ENOMEM; |
| 308 | 315 | ||
| 316 | rtc->irq = irq; | ||
| 317 | |||
| 309 | /* platform setup code should have handled this; sigh */ | 318 | /* platform setup code should have handled this; sigh */ |
| 310 | if (!device_can_wakeup(&pdev->dev)) | 319 | if (!device_can_wakeup(&pdev->dev)) |
| 311 | device_init_wakeup(&pdev->dev, 1); | 320 | device_init_wakeup(&pdev->dev, 1); |
| @@ -345,11 +354,10 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) | |||
| 345 | } | 354 | } |
| 346 | 355 | ||
| 347 | /* register irq handler after we know what name we'll use */ | 356 | /* register irq handler after we know what name we'll use */ |
| 348 | ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, | 357 | ret = request_irq(rtc->irq, at91_rtc_interrupt, IRQF_SHARED, |
| 349 | IRQF_SHARED, | ||
| 350 | dev_name(&rtc->rtcdev->dev), rtc); | 358 | dev_name(&rtc->rtcdev->dev), rtc); |
| 351 | if (ret) { | 359 | if (ret) { |
| 352 | dev_dbg(&pdev->dev, "can't share IRQ %d?\n", AT91_ID_SYS); | 360 | dev_dbg(&pdev->dev, "can't share IRQ %d?\n", rtc->irq); |
| 353 | rtc_device_unregister(rtc->rtcdev); | 361 | rtc_device_unregister(rtc->rtcdev); |
| 354 | goto fail_register; | 362 | goto fail_register; |
| 355 | } | 363 | } |
| @@ -386,7 +394,7 @@ static int __devexit at91_rtc_remove(struct platform_device *pdev) | |||
| 386 | 394 | ||
| 387 | /* disable all interrupts */ | 395 | /* disable all interrupts */ |
| 388 | rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); | 396 | rtt_writel(rtc, MR, mr & ~(AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN)); |
| 389 | free_irq(AT91_ID_SYS, rtc); | 397 | free_irq(rtc->irq, rtc); |
| 390 | 398 | ||
| 391 | rtc_device_unregister(rtc->rtcdev); | 399 | rtc_device_unregister(rtc->rtcdev); |
| 392 | 400 | ||
| @@ -423,7 +431,7 @@ static int at91_rtc_suspend(struct platform_device *pdev, | |||
| 423 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); | 431 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); |
| 424 | if (rtc->imr) { | 432 | if (rtc->imr) { |
| 425 | if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) { | 433 | if (device_may_wakeup(&pdev->dev) && (mr & AT91_RTT_ALMIEN)) { |
| 426 | enable_irq_wake(AT91_ID_SYS); | 434 | enable_irq_wake(rtc->irq); |
| 427 | /* don't let RTTINC cause wakeups */ | 435 | /* don't let RTTINC cause wakeups */ |
| 428 | if (mr & AT91_RTT_RTTINCIEN) | 436 | if (mr & AT91_RTT_RTTINCIEN) |
| 429 | rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); | 437 | rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); |
| @@ -441,7 +449,7 @@ static int at91_rtc_resume(struct platform_device *pdev) | |||
| 441 | 449 | ||
| 442 | if (rtc->imr) { | 450 | if (rtc->imr) { |
| 443 | if (device_may_wakeup(&pdev->dev)) | 451 | if (device_may_wakeup(&pdev->dev)) |
| 444 | disable_irq_wake(AT91_ID_SYS); | 452 | disable_irq_wake(rtc->irq); |
| 445 | mr = rtt_readl(rtc, MR); | 453 | mr = rtt_readl(rtc, MR); |
| 446 | rtt_writel(rtc, MR, mr | rtc->imr); | 454 | rtt_writel(rtc, MR, mr | rtc->imr); |
| 447 | } | 455 | } |
diff --git a/drivers/rtc/rtc-twl.c b/drivers/rtc/rtc-twl.c index c5d06fe83bba..9277d945bf48 100644 --- a/drivers/rtc/rtc-twl.c +++ b/drivers/rtc/rtc-twl.c | |||
| @@ -495,6 +495,11 @@ static int __devinit twl_rtc_probe(struct platform_device *pdev) | |||
| 495 | if (ret < 0) | 495 | if (ret < 0) |
| 496 | goto out1; | 496 | goto out1; |
| 497 | 497 | ||
| 498 | /* ensure interrupts are disabled, bootloaders can be strange */ | ||
| 499 | ret = twl_rtc_write_u8(0, REG_RTC_INTERRUPTS_REG); | ||
| 500 | if (ret < 0) | ||
| 501 | dev_warn(&pdev->dev, "unable to disable interrupt\n"); | ||
| 502 | |||
| 498 | /* init cached IRQ enable bits */ | 503 | /* init cached IRQ enable bits */ |
| 499 | ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG); | 504 | ret = twl_rtc_read_u8(&rtc_irq_bits, REG_RTC_INTERRUPTS_REG); |
| 500 | if (ret < 0) | 505 | if (ret < 0) |
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 15370a2c5ff0..0595c763dafd 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -534,11 +534,11 @@ static void dasd_change_state(struct dasd_device *device) | |||
| 534 | if (rc) | 534 | if (rc) |
| 535 | device->target = device->state; | 535 | device->target = device->state; |
| 536 | 536 | ||
| 537 | if (device->state == device->target) | ||
| 538 | wake_up(&dasd_init_waitq); | ||
| 539 | |||
| 540 | /* let user-space know that the device status changed */ | 537 | /* let user-space know that the device status changed */ |
| 541 | kobject_uevent(&device->cdev->dev.kobj, KOBJ_CHANGE); | 538 | kobject_uevent(&device->cdev->dev.kobj, KOBJ_CHANGE); |
| 539 | |||
| 540 | if (device->state == device->target) | ||
| 541 | wake_up(&dasd_init_waitq); | ||
| 542 | } | 542 | } |
| 543 | 543 | ||
| 544 | /* | 544 | /* |
| @@ -2157,6 +2157,7 @@ static int _dasd_sleep_on(struct dasd_ccw_req *maincqr, int interruptible) | |||
| 2157 | test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && | 2157 | test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && |
| 2158 | (!dasd_eer_enabled(device))) { | 2158 | (!dasd_eer_enabled(device))) { |
| 2159 | cqr->status = DASD_CQR_FAILED; | 2159 | cqr->status = DASD_CQR_FAILED; |
| 2160 | cqr->intrc = -EAGAIN; | ||
| 2160 | continue; | 2161 | continue; |
| 2161 | } | 2162 | } |
| 2162 | /* Don't try to start requests if device is stopped */ | 2163 | /* Don't try to start requests if device is stopped */ |
| @@ -3270,6 +3271,16 @@ void dasd_generic_path_event(struct ccw_device *cdev, int *path_event) | |||
| 3270 | dasd_schedule_device_bh(device); | 3271 | dasd_schedule_device_bh(device); |
| 3271 | } | 3272 | } |
| 3272 | if (path_event[chp] & PE_PATHGROUP_ESTABLISHED) { | 3273 | if (path_event[chp] & PE_PATHGROUP_ESTABLISHED) { |
| 3274 | if (!(device->path_data.opm & eventlpm) && | ||
| 3275 | !(device->path_data.tbvpm & eventlpm)) { | ||
| 3276 | /* | ||
| 3277 | * we can not establish a pathgroup on an | ||
| 3278 | * unavailable path, so trigger a path | ||
| 3279 | * verification first | ||
| 3280 | */ | ||
| 3281 | device->path_data.tbvpm |= eventlpm; | ||
| 3282 | dasd_schedule_device_bh(device); | ||
| 3283 | } | ||
| 3273 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", | 3284 | DBF_DEV_EVENT(DBF_WARNING, device, "%s", |
| 3274 | "Pathgroup re-established\n"); | 3285 | "Pathgroup re-established\n"); |
| 3275 | if (device->discipline->kick_validate) | 3286 | if (device->discipline->kick_validate) |
diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c index 157defe5e069..6b556995bb33 100644 --- a/drivers/s390/block/dasd_alias.c +++ b/drivers/s390/block/dasd_alias.c | |||
| @@ -384,6 +384,29 @@ static void _remove_device_from_lcu(struct alias_lcu *lcu, | |||
| 384 | group->next = NULL; | 384 | group->next = NULL; |
| 385 | }; | 385 | }; |
| 386 | 386 | ||
| 387 | static int | ||
| 388 | suborder_not_supported(struct dasd_ccw_req *cqr) | ||
| 389 | { | ||
| 390 | char *sense; | ||
| 391 | char reason; | ||
| 392 | char msg_format; | ||
| 393 | char msg_no; | ||
| 394 | |||
| 395 | sense = dasd_get_sense(&cqr->irb); | ||
| 396 | if (!sense) | ||
| 397 | return 0; | ||
| 398 | |||
| 399 | reason = sense[0]; | ||
| 400 | msg_format = (sense[7] & 0xF0); | ||
| 401 | msg_no = (sense[7] & 0x0F); | ||
| 402 | |||
| 403 | /* command reject, Format 0 MSG 4 - invalid parameter */ | ||
| 404 | if ((reason == 0x80) && (msg_format == 0x00) && (msg_no == 0x04)) | ||
| 405 | return 1; | ||
| 406 | |||
| 407 | return 0; | ||
| 408 | } | ||
| 409 | |||
| 387 | static int read_unit_address_configuration(struct dasd_device *device, | 410 | static int read_unit_address_configuration(struct dasd_device *device, |
| 388 | struct alias_lcu *lcu) | 411 | struct alias_lcu *lcu) |
| 389 | { | 412 | { |
| @@ -435,6 +458,8 @@ static int read_unit_address_configuration(struct dasd_device *device, | |||
| 435 | 458 | ||
| 436 | do { | 459 | do { |
| 437 | rc = dasd_sleep_on(cqr); | 460 | rc = dasd_sleep_on(cqr); |
| 461 | if (rc && suborder_not_supported(cqr)) | ||
| 462 | return -EOPNOTSUPP; | ||
| 438 | } while (rc && (cqr->retries > 0)); | 463 | } while (rc && (cqr->retries > 0)); |
| 439 | if (rc) { | 464 | if (rc) { |
| 440 | spin_lock_irqsave(&lcu->lock, flags); | 465 | spin_lock_irqsave(&lcu->lock, flags); |
| @@ -521,7 +546,7 @@ static void lcu_update_work(struct work_struct *work) | |||
| 521 | * processing the data | 546 | * processing the data |
| 522 | */ | 547 | */ |
| 523 | spin_lock_irqsave(&lcu->lock, flags); | 548 | spin_lock_irqsave(&lcu->lock, flags); |
| 524 | if (rc || (lcu->flags & NEED_UAC_UPDATE)) { | 549 | if ((rc && (rc != -EOPNOTSUPP)) || (lcu->flags & NEED_UAC_UPDATE)) { |
| 525 | DBF_DEV_EVENT(DBF_WARNING, device, "could not update" | 550 | DBF_DEV_EVENT(DBF_WARNING, device, "could not update" |
| 526 | " alias data in lcu (rc = %d), retry later", rc); | 551 | " alias data in lcu (rc = %d), retry later", rc); |
| 527 | schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ); | 552 | schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ); |
diff --git a/drivers/s390/block/dasd_eckd.c b/drivers/s390/block/dasd_eckd.c index 40a826a7295f..c48c72abbefc 100644 --- a/drivers/s390/block/dasd_eckd.c +++ b/drivers/s390/block/dasd_eckd.c | |||
| @@ -1507,7 +1507,8 @@ static struct dasd_ccw_req *dasd_eckd_build_psf_ssc(struct dasd_device *device, | |||
| 1507 | * call might change behaviour of DASD devices. | 1507 | * call might change behaviour of DASD devices. |
| 1508 | */ | 1508 | */ |
| 1509 | static int | 1509 | static int |
| 1510 | dasd_eckd_psf_ssc(struct dasd_device *device, int enable_pav) | 1510 | dasd_eckd_psf_ssc(struct dasd_device *device, int enable_pav, |
| 1511 | unsigned long flags) | ||
| 1511 | { | 1512 | { |
| 1512 | struct dasd_ccw_req *cqr; | 1513 | struct dasd_ccw_req *cqr; |
| 1513 | int rc; | 1514 | int rc; |
| @@ -1516,10 +1517,19 @@ dasd_eckd_psf_ssc(struct dasd_device *device, int enable_pav) | |||
| 1516 | if (IS_ERR(cqr)) | 1517 | if (IS_ERR(cqr)) |
| 1517 | return PTR_ERR(cqr); | 1518 | return PTR_ERR(cqr); |
| 1518 | 1519 | ||
| 1520 | /* | ||
| 1521 | * set flags e.g. turn on failfast, to prevent blocking | ||
| 1522 | * the calling function should handle failed requests | ||
| 1523 | */ | ||
| 1524 | cqr->flags |= flags; | ||
| 1525 | |||
| 1519 | rc = dasd_sleep_on(cqr); | 1526 | rc = dasd_sleep_on(cqr); |
| 1520 | if (!rc) | 1527 | if (!rc) |
| 1521 | /* trigger CIO to reprobe devices */ | 1528 | /* trigger CIO to reprobe devices */ |
| 1522 | css_schedule_reprobe(); | 1529 | css_schedule_reprobe(); |
| 1530 | else if (cqr->intrc == -EAGAIN) | ||
| 1531 | rc = -EAGAIN; | ||
| 1532 | |||
| 1523 | dasd_sfree_request(cqr, cqr->memdev); | 1533 | dasd_sfree_request(cqr, cqr->memdev); |
| 1524 | return rc; | 1534 | return rc; |
| 1525 | } | 1535 | } |
| @@ -1527,7 +1537,8 @@ dasd_eckd_psf_ssc(struct dasd_device *device, int enable_pav) | |||
| 1527 | /* | 1537 | /* |
| 1528 | * Valide storage server of current device. | 1538 | * Valide storage server of current device. |
| 1529 | */ | 1539 | */ |
| 1530 | static void dasd_eckd_validate_server(struct dasd_device *device) | 1540 | static int dasd_eckd_validate_server(struct dasd_device *device, |
| 1541 | unsigned long flags) | ||
| 1531 | { | 1542 | { |
| 1532 | int rc; | 1543 | int rc; |
| 1533 | struct dasd_eckd_private *private; | 1544 | struct dasd_eckd_private *private; |
| @@ -1536,17 +1547,18 @@ static void dasd_eckd_validate_server(struct dasd_device *device) | |||
| 1536 | private = (struct dasd_eckd_private *) device->private; | 1547 | private = (struct dasd_eckd_private *) device->private; |
| 1537 | if (private->uid.type == UA_BASE_PAV_ALIAS || | 1548 | if (private->uid.type == UA_BASE_PAV_ALIAS || |
| 1538 | private->uid.type == UA_HYPER_PAV_ALIAS) | 1549 | private->uid.type == UA_HYPER_PAV_ALIAS) |
| 1539 | return; | 1550 | return 0; |
| 1540 | if (dasd_nopav || MACHINE_IS_VM) | 1551 | if (dasd_nopav || MACHINE_IS_VM) |
| 1541 | enable_pav = 0; | 1552 | enable_pav = 0; |
| 1542 | else | 1553 | else |
| 1543 | enable_pav = 1; | 1554 | enable_pav = 1; |
| 1544 | rc = dasd_eckd_psf_ssc(device, enable_pav); | 1555 | rc = dasd_eckd_psf_ssc(device, enable_pav, flags); |
| 1545 | 1556 | ||
| 1546 | /* may be requested feature is not available on server, | 1557 | /* may be requested feature is not available on server, |
| 1547 | * therefore just report error and go ahead */ | 1558 | * therefore just report error and go ahead */ |
| 1548 | DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "PSF-SSC for SSID %04x " | 1559 | DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "PSF-SSC for SSID %04x " |
| 1549 | "returned rc=%d", private->uid.ssid, rc); | 1560 | "returned rc=%d", private->uid.ssid, rc); |
| 1561 | return rc; | ||
| 1550 | } | 1562 | } |
| 1551 | 1563 | ||
| 1552 | /* | 1564 | /* |
| @@ -1556,7 +1568,13 @@ static void dasd_eckd_do_validate_server(struct work_struct *work) | |||
| 1556 | { | 1568 | { |
| 1557 | struct dasd_device *device = container_of(work, struct dasd_device, | 1569 | struct dasd_device *device = container_of(work, struct dasd_device, |
| 1558 | kick_validate); | 1570 | kick_validate); |
| 1559 | dasd_eckd_validate_server(device); | 1571 | if (dasd_eckd_validate_server(device, DASD_CQR_FLAGS_FAILFAST) |
| 1572 | == -EAGAIN) { | ||
| 1573 | /* schedule worker again if failed */ | ||
| 1574 | schedule_work(&device->kick_validate); | ||
| 1575 | return; | ||
| 1576 | } | ||
| 1577 | |||
| 1560 | dasd_put_device(device); | 1578 | dasd_put_device(device); |
| 1561 | } | 1579 | } |
| 1562 | 1580 | ||
| @@ -1685,7 +1703,7 @@ dasd_eckd_check_characteristics(struct dasd_device *device) | |||
| 1685 | if (rc) | 1703 | if (rc) |
| 1686 | goto out_err2; | 1704 | goto out_err2; |
| 1687 | 1705 | ||
| 1688 | dasd_eckd_validate_server(device); | 1706 | dasd_eckd_validate_server(device, 0); |
| 1689 | 1707 | ||
| 1690 | /* device may report different configuration data after LCU setup */ | 1708 | /* device may report different configuration data after LCU setup */ |
| 1691 | rc = dasd_eckd_read_conf(device); | 1709 | rc = dasd_eckd_read_conf(device); |
| @@ -3804,7 +3822,7 @@ dasd_eckd_ioctl(struct dasd_block *block, unsigned int cmd, void __user *argp) | |||
| 3804 | case BIODASDSYMMIO: | 3822 | case BIODASDSYMMIO: |
| 3805 | return dasd_symm_io(device, argp); | 3823 | return dasd_symm_io(device, argp); |
| 3806 | default: | 3824 | default: |
| 3807 | return -ENOIOCTLCMD; | 3825 | return -ENOTTY; |
| 3808 | } | 3826 | } |
| 3809 | } | 3827 | } |
| 3810 | 3828 | ||
| @@ -4153,7 +4171,7 @@ static int dasd_eckd_restore_device(struct dasd_device *device) | |||
| 4153 | rc = dasd_alias_make_device_known_to_lcu(device); | 4171 | rc = dasd_alias_make_device_known_to_lcu(device); |
| 4154 | if (rc) | 4172 | if (rc) |
| 4155 | return rc; | 4173 | return rc; |
| 4156 | dasd_eckd_validate_server(device); | 4174 | dasd_eckd_validate_server(device, DASD_CQR_FLAGS_FAILFAST); |
| 4157 | 4175 | ||
| 4158 | /* RE-Read Configuration Data */ | 4176 | /* RE-Read Configuration Data */ |
| 4159 | rc = dasd_eckd_read_conf(device); | 4177 | rc = dasd_eckd_read_conf(device); |
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index cceae70279f6..654c6921a6d4 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
| @@ -498,12 +498,9 @@ int dasd_ioctl(struct block_device *bdev, fmode_t mode, | |||
| 498 | break; | 498 | break; |
| 499 | default: | 499 | default: |
| 500 | /* if the discipline has an ioctl method try it. */ | 500 | /* if the discipline has an ioctl method try it. */ |
| 501 | if (base->discipline->ioctl) { | 501 | rc = -ENOTTY; |
| 502 | if (base->discipline->ioctl) | ||
| 502 | rc = base->discipline->ioctl(block, cmd, argp); | 503 | rc = base->discipline->ioctl(block, cmd, argp); |
| 503 | if (rc == -ENOIOCTLCMD) | ||
| 504 | rc = -EINVAL; | ||
| 505 | } else | ||
| 506 | rc = -EINVAL; | ||
| 507 | } | 504 | } |
| 508 | dasd_put_device(base); | 505 | dasd_put_device(base); |
| 509 | return rc; | 506 | return rc; |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index ed25c8740a9c..fc916f5d7314 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
| @@ -1426,6 +1426,8 @@ static enum io_sch_action sch_get_action(struct subchannel *sch) | |||
| 1426 | return IO_SCH_REPROBE; | 1426 | return IO_SCH_REPROBE; |
| 1427 | if (cdev->online) | 1427 | if (cdev->online) |
| 1428 | return IO_SCH_VERIFY; | 1428 | return IO_SCH_VERIFY; |
| 1429 | if (cdev->private->state == DEV_STATE_NOT_OPER) | ||
| 1430 | return IO_SCH_UNREG_ATTACH; | ||
| 1429 | return IO_SCH_NOP; | 1431 | return IO_SCH_NOP; |
| 1430 | } | 1432 | } |
| 1431 | 1433 | ||
| @@ -1519,11 +1521,14 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process) | |||
| 1519 | goto out; | 1521 | goto out; |
| 1520 | break; | 1522 | break; |
| 1521 | case IO_SCH_UNREG_ATTACH: | 1523 | case IO_SCH_UNREG_ATTACH: |
| 1524 | spin_lock_irqsave(sch->lock, flags); | ||
| 1522 | if (cdev->private->flags.resuming) { | 1525 | if (cdev->private->flags.resuming) { |
| 1523 | /* Device will be handled later. */ | 1526 | /* Device will be handled later. */ |
| 1524 | rc = 0; | 1527 | rc = 0; |
| 1525 | goto out; | 1528 | goto out_unlock; |
| 1526 | } | 1529 | } |
| 1530 | sch_set_cdev(sch, NULL); | ||
| 1531 | spin_unlock_irqrestore(sch->lock, flags); | ||
| 1527 | /* Unregister ccw device. */ | 1532 | /* Unregister ccw device. */ |
| 1528 | ccw_device_unregister(cdev); | 1533 | ccw_device_unregister(cdev); |
| 1529 | break; | 1534 | break; |
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c index dc27598785e5..ed38454228c6 100644 --- a/drivers/scsi/megaraid/megaraid_sas_base.c +++ b/drivers/scsi/megaraid/megaraid_sas_base.c | |||
| @@ -4066,7 +4066,6 @@ megasas_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 4066 | spin_lock_init(&instance->cmd_pool_lock); | 4066 | spin_lock_init(&instance->cmd_pool_lock); |
| 4067 | spin_lock_init(&instance->hba_lock); | 4067 | spin_lock_init(&instance->hba_lock); |
| 4068 | spin_lock_init(&instance->completion_lock); | 4068 | spin_lock_init(&instance->completion_lock); |
| 4069 | spin_lock_init(&poll_aen_lock); | ||
| 4070 | 4069 | ||
| 4071 | mutex_init(&instance->aen_mutex); | 4070 | mutex_init(&instance->aen_mutex); |
| 4072 | mutex_init(&instance->reset_mutex); | 4071 | mutex_init(&instance->reset_mutex); |
| @@ -5392,6 +5391,8 @@ static int __init megasas_init(void) | |||
| 5392 | printk(KERN_INFO "megasas: %s %s\n", MEGASAS_VERSION, | 5391 | printk(KERN_INFO "megasas: %s %s\n", MEGASAS_VERSION, |
| 5393 | MEGASAS_EXT_VERSION); | 5392 | MEGASAS_EXT_VERSION); |
| 5394 | 5393 | ||
| 5394 | spin_lock_init(&poll_aen_lock); | ||
| 5395 | |||
| 5395 | support_poll_for_event = 2; | 5396 | support_poll_for_event = 2; |
| 5396 | support_device_change = 1; | 5397 | support_device_change = 1; |
| 5397 | 5398 | ||
diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c index 9d46fcbe7755..b25757d1e91b 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_base.c +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c | |||
| @@ -2424,10 +2424,13 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) | |||
| 2424 | } | 2424 | } |
| 2425 | 2425 | ||
| 2426 | /* command line tunables for max controller queue depth */ | 2426 | /* command line tunables for max controller queue depth */ |
| 2427 | if (max_queue_depth != -1) | 2427 | if (max_queue_depth != -1 && max_queue_depth != 0) { |
| 2428 | max_request_credit = (max_queue_depth < facts->RequestCredit) | 2428 | max_request_credit = min_t(u16, max_queue_depth + |
| 2429 | ? max_queue_depth : facts->RequestCredit; | 2429 | ioc->hi_priority_depth + ioc->internal_depth, |
| 2430 | else | 2430 | facts->RequestCredit); |
| 2431 | if (max_request_credit > MAX_HBA_QUEUE_DEPTH) | ||
| 2432 | max_request_credit = MAX_HBA_QUEUE_DEPTH; | ||
| 2433 | } else | ||
| 2431 | max_request_credit = min_t(u16, facts->RequestCredit, | 2434 | max_request_credit = min_t(u16, facts->RequestCredit, |
| 2432 | MAX_HBA_QUEUE_DEPTH); | 2435 | MAX_HBA_QUEUE_DEPTH); |
| 2433 | 2436 | ||
| @@ -2502,7 +2505,7 @@ _base_allocate_memory_pools(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) | |||
| 2502 | /* set the scsi host can_queue depth | 2505 | /* set the scsi host can_queue depth |
| 2503 | * with some internal commands that could be outstanding | 2506 | * with some internal commands that could be outstanding |
| 2504 | */ | 2507 | */ |
| 2505 | ioc->shost->can_queue = ioc->scsiio_depth - (2); | 2508 | ioc->shost->can_queue = ioc->scsiio_depth; |
| 2506 | dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "scsi host: " | 2509 | dinitprintk(ioc, printk(MPT2SAS_INFO_FMT "scsi host: " |
| 2507 | "can_queue depth (%d)\n", ioc->name, ioc->shost->can_queue)); | 2510 | "can_queue depth (%d)\n", ioc->name, ioc->shost->can_queue)); |
| 2508 | 2511 | ||
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 4a6381c87253..de2337f255a7 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
| @@ -42,6 +42,8 @@ | |||
| 42 | 42 | ||
| 43 | #include <trace/events/scsi.h> | 43 | #include <trace/events/scsi.h> |
| 44 | 44 | ||
| 45 | static void scsi_eh_done(struct scsi_cmnd *scmd); | ||
| 46 | |||
| 45 | #define SENSE_TIMEOUT (10*HZ) | 47 | #define SENSE_TIMEOUT (10*HZ) |
| 46 | 48 | ||
| 47 | /* | 49 | /* |
| @@ -241,6 +243,14 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
| 241 | if (! scsi_command_normalize_sense(scmd, &sshdr)) | 243 | if (! scsi_command_normalize_sense(scmd, &sshdr)) |
| 242 | return FAILED; /* no valid sense data */ | 244 | return FAILED; /* no valid sense data */ |
| 243 | 245 | ||
| 246 | if (scmd->cmnd[0] == TEST_UNIT_READY && scmd->scsi_done != scsi_eh_done) | ||
| 247 | /* | ||
| 248 | * nasty: for mid-layer issued TURs, we need to return the | ||
| 249 | * actual sense data without any recovery attempt. For eh | ||
| 250 | * issued ones, we need to try to recover and interpret | ||
| 251 | */ | ||
| 252 | return SUCCESS; | ||
| 253 | |||
| 244 | if (scsi_sense_is_deferred(&sshdr)) | 254 | if (scsi_sense_is_deferred(&sshdr)) |
| 245 | return NEEDS_RETRY; | 255 | return NEEDS_RETRY; |
| 246 | 256 | ||
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index ffd77739ae3e..faa790fba134 100644 --- a/drivers/scsi/scsi_lib.c +++ b/drivers/scsi/scsi_lib.c | |||
| @@ -776,7 +776,6 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 776 | } | 776 | } |
| 777 | 777 | ||
| 778 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */ | 778 | if (req->cmd_type == REQ_TYPE_BLOCK_PC) { /* SG_IO ioctl from block level */ |
| 779 | req->errors = result; | ||
| 780 | if (result) { | 779 | if (result) { |
| 781 | if (sense_valid && req->sense) { | 780 | if (sense_valid && req->sense) { |
| 782 | /* | 781 | /* |
| @@ -792,6 +791,10 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) | |||
| 792 | if (!sense_deferred) | 791 | if (!sense_deferred) |
| 793 | error = __scsi_error_from_host_byte(cmd, result); | 792 | error = __scsi_error_from_host_byte(cmd, result); |
| 794 | } | 793 | } |
| 794 | /* | ||
| 795 | * __scsi_error_from_host_byte may have reset the host_byte | ||
| 796 | */ | ||
| 797 | req->errors = cmd->result; | ||
| 795 | 798 | ||
| 796 | req->resid_len = scsi_get_resid(cmd); | 799 | req->resid_len = scsi_get_resid(cmd); |
| 797 | 800 | ||
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 56a93794c470..d947ffc20ceb 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
| @@ -764,6 +764,16 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, | |||
| 764 | sdev->model = (char *) (sdev->inquiry + 16); | 764 | sdev->model = (char *) (sdev->inquiry + 16); |
| 765 | sdev->rev = (char *) (sdev->inquiry + 32); | 765 | sdev->rev = (char *) (sdev->inquiry + 32); |
| 766 | 766 | ||
| 767 | if (strncmp(sdev->vendor, "ATA ", 8) == 0) { | ||
| 768 | /* | ||
| 769 | * sata emulation layer device. This is a hack to work around | ||
| 770 | * the SATL power management specifications which state that | ||
| 771 | * when the SATL detects the device has gone into standby | ||
| 772 | * mode, it shall respond with NOT READY. | ||
| 773 | */ | ||
| 774 | sdev->allow_restart = 1; | ||
| 775 | } | ||
| 776 | |||
| 767 | if (*bflags & BLIST_ISROM) { | 777 | if (*bflags & BLIST_ISROM) { |
| 768 | sdev->type = TYPE_ROM; | 778 | sdev->type = TYPE_ROM; |
| 769 | sdev->removable = 1; | 779 | sdev->removable = 1; |
diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 32c26d795ed0..8f32a1323a79 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c | |||
| @@ -355,7 +355,7 @@ int __init register_intc_controller(struct intc_desc *desc) | |||
| 355 | if (unlikely(res)) { | 355 | if (unlikely(res)) { |
| 356 | if (res == -EEXIST) { | 356 | if (res == -EEXIST) { |
| 357 | res = irq_domain_associate(d->domain, | 357 | res = irq_domain_associate(d->domain, |
| 358 | irq, irq); | 358 | irq2, irq2); |
| 359 | if (unlikely(res)) { | 359 | if (unlikely(res)) { |
| 360 | pr_err("domain association " | 360 | pr_err("domain association " |
| 361 | "failure\n"); | 361 | "failure\n"); |
diff --git a/drivers/sh/pfc/pinctrl.c b/drivers/sh/pfc/pinctrl.c index 2804eaae804e..a3ac39b79192 100644 --- a/drivers/sh/pfc/pinctrl.c +++ b/drivers/sh/pfc/pinctrl.c | |||
| @@ -211,7 +211,8 @@ static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev, | |||
| 211 | break; | 211 | break; |
| 212 | default: | 212 | default: |
| 213 | pr_err("Unsupported mux type (%d), bailing...\n", pinmux_type); | 213 | pr_err("Unsupported mux type (%d), bailing...\n", pinmux_type); |
| 214 | return -ENOTSUPP; | 214 | ret = -ENOTSUPP; |
| 215 | goto err; | ||
| 215 | } | 216 | } |
| 216 | 217 | ||
| 217 | ret = 0; | 218 | ret = 0; |
diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index ea0aaa3f13d0..a9f4049c6769 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c | |||
| @@ -47,6 +47,8 @@ struct bcm63xx_spi { | |||
| 47 | /* Platform data */ | 47 | /* Platform data */ |
| 48 | u32 speed_hz; | 48 | u32 speed_hz; |
| 49 | unsigned fifo_size; | 49 | unsigned fifo_size; |
| 50 | unsigned int msg_type_shift; | ||
| 51 | unsigned int msg_ctl_width; | ||
| 50 | 52 | ||
| 51 | /* Data buffers */ | 53 | /* Data buffers */ |
| 52 | const unsigned char *tx_ptr; | 54 | const unsigned char *tx_ptr; |
| @@ -221,13 +223,20 @@ static unsigned int bcm63xx_txrx_bufs(struct spi_device *spi, | |||
| 221 | msg_ctl = (t->len << SPI_BYTE_CNT_SHIFT); | 223 | msg_ctl = (t->len << SPI_BYTE_CNT_SHIFT); |
| 222 | 224 | ||
| 223 | if (t->rx_buf && t->tx_buf) | 225 | if (t->rx_buf && t->tx_buf) |
| 224 | msg_ctl |= (SPI_FD_RW << SPI_MSG_TYPE_SHIFT); | 226 | msg_ctl |= (SPI_FD_RW << bs->msg_type_shift); |
| 225 | else if (t->rx_buf) | 227 | else if (t->rx_buf) |
| 226 | msg_ctl |= (SPI_HD_R << SPI_MSG_TYPE_SHIFT); | 228 | msg_ctl |= (SPI_HD_R << bs->msg_type_shift); |
| 227 | else if (t->tx_buf) | 229 | else if (t->tx_buf) |
| 228 | msg_ctl |= (SPI_HD_W << SPI_MSG_TYPE_SHIFT); | 230 | msg_ctl |= (SPI_HD_W << bs->msg_type_shift); |
| 229 | 231 | ||
| 230 | bcm_spi_writew(bs, msg_ctl, SPI_MSG_CTL); | 232 | switch (bs->msg_ctl_width) { |
| 233 | case 8: | ||
| 234 | bcm_spi_writeb(bs, msg_ctl, SPI_MSG_CTL); | ||
| 235 | break; | ||
| 236 | case 16: | ||
| 237 | bcm_spi_writew(bs, msg_ctl, SPI_MSG_CTL); | ||
| 238 | break; | ||
| 239 | } | ||
| 231 | 240 | ||
| 232 | /* Issue the transfer */ | 241 | /* Issue the transfer */ |
| 233 | cmd = SPI_CMD_START_IMMEDIATE; | 242 | cmd = SPI_CMD_START_IMMEDIATE; |
| @@ -406,9 +415,21 @@ static int __devinit bcm63xx_spi_probe(struct platform_device *pdev) | |||
| 406 | master->transfer_one_message = bcm63xx_spi_transfer_one; | 415 | master->transfer_one_message = bcm63xx_spi_transfer_one; |
| 407 | master->mode_bits = MODEBITS; | 416 | master->mode_bits = MODEBITS; |
| 408 | bs->speed_hz = pdata->speed_hz; | 417 | bs->speed_hz = pdata->speed_hz; |
| 418 | bs->msg_type_shift = pdata->msg_type_shift; | ||
| 419 | bs->msg_ctl_width = pdata->msg_ctl_width; | ||
| 409 | bs->tx_io = (u8 *)(bs->regs + bcm63xx_spireg(SPI_MSG_DATA)); | 420 | bs->tx_io = (u8 *)(bs->regs + bcm63xx_spireg(SPI_MSG_DATA)); |
| 410 | bs->rx_io = (const u8 *)(bs->regs + bcm63xx_spireg(SPI_RX_DATA)); | 421 | bs->rx_io = (const u8 *)(bs->regs + bcm63xx_spireg(SPI_RX_DATA)); |
| 411 | 422 | ||
| 423 | switch (bs->msg_ctl_width) { | ||
| 424 | case 8: | ||
| 425 | case 16: | ||
| 426 | break; | ||
| 427 | default: | ||
| 428 | dev_err(dev, "unsupported MSG_CTL width: %d\n", | ||
| 429 | bs->msg_ctl_width); | ||
| 430 | goto out_clk_disable; | ||
| 431 | } | ||
| 432 | |||
| 412 | /* Initialize hardware */ | 433 | /* Initialize hardware */ |
| 413 | clk_enable(bs->clk); | 434 | clk_enable(bs->clk); |
| 414 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); | 435 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); |
diff --git a/drivers/staging/android/android_alarm.h b/drivers/staging/android/android_alarm.h index d0cafd637199..f2ffd963f1c3 100644 --- a/drivers/staging/android/android_alarm.h +++ b/drivers/staging/android/android_alarm.h | |||
| @@ -51,10 +51,12 @@ enum android_alarm_return_flags { | |||
| 51 | #define ANDROID_ALARM_WAIT _IO('a', 1) | 51 | #define ANDROID_ALARM_WAIT _IO('a', 1) |
| 52 | 52 | ||
| 53 | #define ALARM_IOW(c, type, size) _IOW('a', (c) | ((type) << 4), size) | 53 | #define ALARM_IOW(c, type, size) _IOW('a', (c) | ((type) << 4), size) |
| 54 | #define ALARM_IOR(c, type, size) _IOR('a', (c) | ((type) << 4), size) | ||
| 55 | |||
| 54 | /* Set alarm */ | 56 | /* Set alarm */ |
| 55 | #define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec) | 57 | #define ANDROID_ALARM_SET(type) ALARM_IOW(2, type, struct timespec) |
| 56 | #define ANDROID_ALARM_SET_AND_WAIT(type) ALARM_IOW(3, type, struct timespec) | 58 | #define ANDROID_ALARM_SET_AND_WAIT(type) ALARM_IOW(3, type, struct timespec) |
| 57 | #define ANDROID_ALARM_GET_TIME(type) ALARM_IOW(4, type, struct timespec) | 59 | #define ANDROID_ALARM_GET_TIME(type) ALARM_IOR(4, type, struct timespec) |
| 58 | #define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) | 60 | #define ANDROID_ALARM_SET_RTC _IOW('a', 5, struct timespec) |
| 59 | #define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0))) | 61 | #define ANDROID_ALARM_BASE_CMD(cmd) (cmd & ~(_IOC(0, 0, 0xf0, 0))) |
| 60 | #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4) | 62 | #define ANDROID_ALARM_IOCTL_TO_TYPE(cmd) (_IOC_NR(cmd) >> 4) |
diff --git a/drivers/staging/comedi/drivers/amplc_dio200.c b/drivers/staging/comedi/drivers/amplc_dio200.c index 6c81e377262c..cc8931fde839 100644 --- a/drivers/staging/comedi/drivers/amplc_dio200.c +++ b/drivers/staging/comedi/drivers/amplc_dio200.c | |||
| @@ -1412,6 +1412,13 @@ static int __devinit dio200_attach_pci(struct comedi_device *dev, | |||
| 1412 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); | 1412 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); |
| 1413 | return -EINVAL; | 1413 | return -EINVAL; |
| 1414 | } | 1414 | } |
| 1415 | /* | ||
| 1416 | * Need to 'get' the PCI device to match the 'put' in dio200_detach(). | ||
| 1417 | * TODO: Remove the pci_dev_get() and matching pci_dev_put() once | ||
| 1418 | * support for manual attachment of PCI devices via dio200_attach() | ||
| 1419 | * has been removed. | ||
| 1420 | */ | ||
| 1421 | pci_dev_get(pci_dev); | ||
| 1415 | return dio200_pci_common_attach(dev, pci_dev); | 1422 | return dio200_pci_common_attach(dev, pci_dev); |
| 1416 | } | 1423 | } |
| 1417 | 1424 | ||
diff --git a/drivers/staging/comedi/drivers/amplc_pc236.c b/drivers/staging/comedi/drivers/amplc_pc236.c index aabba9886b7d..f50287903038 100644 --- a/drivers/staging/comedi/drivers/amplc_pc236.c +++ b/drivers/staging/comedi/drivers/amplc_pc236.c | |||
| @@ -565,6 +565,13 @@ static int __devinit pc236_attach_pci(struct comedi_device *dev, | |||
| 565 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); | 565 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); |
| 566 | return -EINVAL; | 566 | return -EINVAL; |
| 567 | } | 567 | } |
| 568 | /* | ||
| 569 | * Need to 'get' the PCI device to match the 'put' in pc236_detach(). | ||
| 570 | * TODO: Remove the pci_dev_get() and matching pci_dev_put() once | ||
| 571 | * support for manual attachment of PCI devices via pc236_attach() | ||
| 572 | * has been removed. | ||
| 573 | */ | ||
| 574 | pci_dev_get(pci_dev); | ||
| 568 | return pc236_pci_common_attach(dev, pci_dev); | 575 | return pc236_pci_common_attach(dev, pci_dev); |
| 569 | } | 576 | } |
| 570 | 577 | ||
diff --git a/drivers/staging/comedi/drivers/amplc_pc263.c b/drivers/staging/comedi/drivers/amplc_pc263.c index 40ec1ffebba6..8191c4e28e0a 100644 --- a/drivers/staging/comedi/drivers/amplc_pc263.c +++ b/drivers/staging/comedi/drivers/amplc_pc263.c | |||
| @@ -298,6 +298,13 @@ static int __devinit pc263_attach_pci(struct comedi_device *dev, | |||
| 298 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); | 298 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); |
| 299 | return -EINVAL; | 299 | return -EINVAL; |
| 300 | } | 300 | } |
| 301 | /* | ||
| 302 | * Need to 'get' the PCI device to match the 'put' in pc263_detach(). | ||
| 303 | * TODO: Remove the pci_dev_get() and matching pci_dev_put() once | ||
| 304 | * support for manual attachment of PCI devices via pc263_attach() | ||
| 305 | * has been removed. | ||
| 306 | */ | ||
| 307 | pci_dev_get(pci_dev); | ||
| 301 | return pc263_pci_common_attach(dev, pci_dev); | 308 | return pc263_pci_common_attach(dev, pci_dev); |
| 302 | } | 309 | } |
| 303 | 310 | ||
diff --git a/drivers/staging/comedi/drivers/amplc_pci224.c b/drivers/staging/comedi/drivers/amplc_pci224.c index 4e17f13e57f6..8bf109e7bb05 100644 --- a/drivers/staging/comedi/drivers/amplc_pci224.c +++ b/drivers/staging/comedi/drivers/amplc_pci224.c | |||
| @@ -1503,6 +1503,13 @@ pci224_attach_pci(struct comedi_device *dev, struct pci_dev *pci_dev) | |||
| 1503 | DRIVER_NAME ": BUG! cannot determine board type!\n"); | 1503 | DRIVER_NAME ": BUG! cannot determine board type!\n"); |
| 1504 | return -EINVAL; | 1504 | return -EINVAL; |
| 1505 | } | 1505 | } |
| 1506 | /* | ||
| 1507 | * Need to 'get' the PCI device to match the 'put' in pci224_detach(). | ||
| 1508 | * TODO: Remove the pci_dev_get() and matching pci_dev_put() once | ||
| 1509 | * support for manual attachment of PCI devices via pci224_attach() | ||
| 1510 | * has been removed. | ||
| 1511 | */ | ||
| 1512 | pci_dev_get(pci_dev); | ||
| 1506 | return pci224_attach_common(dev, pci_dev, NULL); | 1513 | return pci224_attach_common(dev, pci_dev, NULL); |
| 1507 | } | 1514 | } |
| 1508 | 1515 | ||
diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c index 1b67d0c61fa7..66e74bd12267 100644 --- a/drivers/staging/comedi/drivers/amplc_pci230.c +++ b/drivers/staging/comedi/drivers/amplc_pci230.c | |||
| @@ -2925,6 +2925,13 @@ static int __devinit pci230_attach_pci(struct comedi_device *dev, | |||
| 2925 | "amplc_pci230: BUG! cannot determine board type!\n"); | 2925 | "amplc_pci230: BUG! cannot determine board type!\n"); |
| 2926 | return -EINVAL; | 2926 | return -EINVAL; |
| 2927 | } | 2927 | } |
| 2928 | /* | ||
| 2929 | * Need to 'get' the PCI device to match the 'put' in pci230_detach(). | ||
| 2930 | * TODO: Remove the pci_dev_get() and matching pci_dev_put() once | ||
| 2931 | * support for manual attachment of PCI devices via pci230_attach() | ||
| 2932 | * has been removed. | ||
| 2933 | */ | ||
| 2934 | pci_dev_get(pci_dev); | ||
| 2928 | return pci230_attach_common(dev, pci_dev); | 2935 | return pci230_attach_common(dev, pci_dev); |
| 2929 | } | 2936 | } |
| 2930 | 2937 | ||
diff --git a/drivers/staging/comedi/drivers/das08.c b/drivers/staging/comedi/drivers/das08.c index 874e02e47668..67a914a10b55 100644 --- a/drivers/staging/comedi/drivers/das08.c +++ b/drivers/staging/comedi/drivers/das08.c | |||
| @@ -378,7 +378,7 @@ das08jr_ao_winsn(struct comedi_device *dev, struct comedi_subdevice *s, | |||
| 378 | int chan; | 378 | int chan; |
| 379 | 379 | ||
| 380 | lsb = data[0] & 0xff; | 380 | lsb = data[0] & 0xff; |
| 381 | msb = (data[0] >> 8) & 0xf; | 381 | msb = (data[0] >> 8) & 0xff; |
| 382 | 382 | ||
| 383 | chan = CR_CHAN(insn->chanspec); | 383 | chan = CR_CHAN(insn->chanspec); |
| 384 | 384 | ||
| @@ -623,7 +623,7 @@ static const struct das08_board_struct das08_boards[] = { | |||
| 623 | .ai = das08_ai_rinsn, | 623 | .ai = das08_ai_rinsn, |
| 624 | .ai_nbits = 16, | 624 | .ai_nbits = 16, |
| 625 | .ai_pg = das08_pg_none, | 625 | .ai_pg = das08_pg_none, |
| 626 | .ai_encoding = das08_encode12, | 626 | .ai_encoding = das08_encode16, |
| 627 | .ao = das08jr_ao_winsn, | 627 | .ao = das08jr_ao_winsn, |
| 628 | .ao_nbits = 16, | 628 | .ao_nbits = 16, |
| 629 | .di = das08jr_di_rbits, | 629 | .di = das08jr_di_rbits, |
| @@ -922,6 +922,13 @@ das08_attach_pci(struct comedi_device *dev, struct pci_dev *pdev) | |||
| 922 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); | 922 | dev_err(dev->class_dev, "BUG! cannot determine board type!\n"); |
| 923 | return -EINVAL; | 923 | return -EINVAL; |
| 924 | } | 924 | } |
| 925 | /* | ||
| 926 | * Need to 'get' the PCI device to match the 'put' in das08_detach(). | ||
| 927 | * TODO: Remove the pci_dev_get() and matching pci_dev_put() once | ||
| 928 | * support for manual attachment of PCI devices via das08_attach() | ||
| 929 | * has been removed. | ||
| 930 | */ | ||
| 931 | pci_dev_get(pdev); | ||
| 925 | return das08_pci_attach_common(dev, pdev); | 932 | return das08_pci_attach_common(dev, pdev); |
| 926 | } | 933 | } |
| 927 | 934 | ||
diff --git a/drivers/staging/iio/accel/lis3l02dq_ring.c b/drivers/staging/iio/accel/lis3l02dq_ring.c index 18d108fd967a..f3da59063ed2 100644 --- a/drivers/staging/iio/accel/lis3l02dq_ring.c +++ b/drivers/staging/iio/accel/lis3l02dq_ring.c | |||
| @@ -121,8 +121,10 @@ static int lis3l02dq_get_buffer_element(struct iio_dev *indio_dev, | |||
| 121 | if (rx_array == NULL) | 121 | if (rx_array == NULL) |
| 122 | return -ENOMEM; | 122 | return -ENOMEM; |
| 123 | ret = lis3l02dq_read_all(indio_dev, rx_array); | 123 | ret = lis3l02dq_read_all(indio_dev, rx_array); |
| 124 | if (ret < 0) | 124 | if (ret < 0) { |
| 125 | kfree(rx_array); | ||
| 125 | return ret; | 126 | return ret; |
| 127 | } | ||
| 126 | for (i = 0; i < scan_count; i++) | 128 | for (i = 0; i < scan_count; i++) |
| 127 | data[i] = combine_8_to_16(rx_array[i*4+1], | 129 | data[i] = combine_8_to_16(rx_array[i*4+1], |
| 128 | rx_array[i*4+3]); | 130 | rx_array[i*4+3]); |
diff --git a/drivers/staging/iio/adc/ad7192.c b/drivers/staging/iio/adc/ad7192.c index 095837285f4f..19a064d649e3 100644 --- a/drivers/staging/iio/adc/ad7192.c +++ b/drivers/staging/iio/adc/ad7192.c | |||
| @@ -647,6 +647,8 @@ static ssize_t ad7192_write_frequency(struct device *dev, | |||
| 647 | ret = strict_strtoul(buf, 10, &lval); | 647 | ret = strict_strtoul(buf, 10, &lval); |
| 648 | if (ret) | 648 | if (ret) |
| 649 | return ret; | 649 | return ret; |
| 650 | if (lval == 0) | ||
| 651 | return -EINVAL; | ||
| 650 | 652 | ||
| 651 | mutex_lock(&indio_dev->mlock); | 653 | mutex_lock(&indio_dev->mlock); |
| 652 | if (iio_buffer_enabled(indio_dev)) { | 654 | if (iio_buffer_enabled(indio_dev)) { |
diff --git a/drivers/staging/iio/gyro/adis16260_core.c b/drivers/staging/iio/gyro/adis16260_core.c index 93aa431287ac..eb8e9d69efd3 100644 --- a/drivers/staging/iio/gyro/adis16260_core.c +++ b/drivers/staging/iio/gyro/adis16260_core.c | |||
| @@ -195,6 +195,8 @@ static ssize_t adis16260_write_frequency(struct device *dev, | |||
| 195 | ret = strict_strtol(buf, 10, &val); | 195 | ret = strict_strtol(buf, 10, &val); |
| 196 | if (ret) | 196 | if (ret) |
| 197 | return ret; | 197 | return ret; |
| 198 | if (val == 0) | ||
| 199 | return -EINVAL; | ||
| 198 | 200 | ||
| 199 | mutex_lock(&indio_dev->mlock); | 201 | mutex_lock(&indio_dev->mlock); |
| 200 | if (spi_get_device_id(st->us)) { | 202 | if (spi_get_device_id(st->us)) { |
diff --git a/drivers/staging/iio/imu/adis16400_core.c b/drivers/staging/iio/imu/adis16400_core.c index 1f4c17779b5a..a618327e06ed 100644 --- a/drivers/staging/iio/imu/adis16400_core.c +++ b/drivers/staging/iio/imu/adis16400_core.c | |||
| @@ -234,6 +234,8 @@ static ssize_t adis16400_write_frequency(struct device *dev, | |||
| 234 | ret = strict_strtol(buf, 10, &val); | 234 | ret = strict_strtol(buf, 10, &val); |
| 235 | if (ret) | 235 | if (ret) |
| 236 | return ret; | 236 | return ret; |
| 237 | if (val == 0) | ||
| 238 | return -EINVAL; | ||
| 237 | 239 | ||
| 238 | mutex_lock(&indio_dev->mlock); | 240 | mutex_lock(&indio_dev->mlock); |
| 239 | 241 | ||
diff --git a/drivers/staging/iio/meter/ade7753.c b/drivers/staging/iio/meter/ade7753.c index f04ece7fbc2f..3ccff189f258 100644 --- a/drivers/staging/iio/meter/ade7753.c +++ b/drivers/staging/iio/meter/ade7753.c | |||
| @@ -425,6 +425,8 @@ static ssize_t ade7753_write_frequency(struct device *dev, | |||
| 425 | ret = strict_strtol(buf, 10, &val); | 425 | ret = strict_strtol(buf, 10, &val); |
| 426 | if (ret) | 426 | if (ret) |
| 427 | return ret; | 427 | return ret; |
| 428 | if (val == 0) | ||
| 429 | return -EINVAL; | ||
| 428 | 430 | ||
| 429 | mutex_lock(&indio_dev->mlock); | 431 | mutex_lock(&indio_dev->mlock); |
| 430 | 432 | ||
diff --git a/drivers/staging/iio/meter/ade7754.c b/drivers/staging/iio/meter/ade7754.c index 6cee28a5e877..abb1e9c8d094 100644 --- a/drivers/staging/iio/meter/ade7754.c +++ b/drivers/staging/iio/meter/ade7754.c | |||
| @@ -445,6 +445,8 @@ static ssize_t ade7754_write_frequency(struct device *dev, | |||
| 445 | ret = strict_strtol(buf, 10, &val); | 445 | ret = strict_strtol(buf, 10, &val); |
| 446 | if (ret) | 446 | if (ret) |
| 447 | return ret; | 447 | return ret; |
| 448 | if (val == 0) | ||
| 449 | return -EINVAL; | ||
| 448 | 450 | ||
| 449 | mutex_lock(&indio_dev->mlock); | 451 | mutex_lock(&indio_dev->mlock); |
| 450 | 452 | ||
diff --git a/drivers/staging/iio/meter/ade7759.c b/drivers/staging/iio/meter/ade7759.c index b3f7e0fa9612..eb0a2a98f388 100644 --- a/drivers/staging/iio/meter/ade7759.c +++ b/drivers/staging/iio/meter/ade7759.c | |||
| @@ -385,6 +385,8 @@ static ssize_t ade7759_write_frequency(struct device *dev, | |||
| 385 | ret = strict_strtol(buf, 10, &val); | 385 | ret = strict_strtol(buf, 10, &val); |
| 386 | if (ret) | 386 | if (ret) |
| 387 | return ret; | 387 | return ret; |
| 388 | if (val == 0) | ||
| 389 | return -EINVAL; | ||
| 388 | 390 | ||
| 389 | mutex_lock(&indio_dev->mlock); | 391 | mutex_lock(&indio_dev->mlock); |
| 390 | 392 | ||
diff --git a/drivers/staging/nvec/nvec.c b/drivers/staging/nvec/nvec.c index 695ea35f75b0..d0a7e408efe9 100644 --- a/drivers/staging/nvec/nvec.c +++ b/drivers/staging/nvec/nvec.c | |||
| @@ -837,7 +837,7 @@ static int __devinit tegra_nvec_probe(struct platform_device *pdev) | |||
| 837 | } | 837 | } |
| 838 | 838 | ||
| 839 | ret = mfd_add_devices(nvec->dev, -1, nvec_devices, | 839 | ret = mfd_add_devices(nvec->dev, -1, nvec_devices, |
| 840 | ARRAY_SIZE(nvec_devices), base, 0); | 840 | ARRAY_SIZE(nvec_devices), base, 0, NULL); |
| 841 | if (ret) | 841 | if (ret) |
| 842 | dev_err(nvec->dev, "error adding subdevices\n"); | 842 | dev_err(nvec->dev, "error adding subdevices\n"); |
| 843 | 843 | ||
diff --git a/drivers/staging/omapdrm/omap_connector.c b/drivers/staging/omapdrm/omap_connector.c index 5e2856c0e0bb..55e9c8655850 100644 --- a/drivers/staging/omapdrm/omap_connector.c +++ b/drivers/staging/omapdrm/omap_connector.c | |||
| @@ -48,13 +48,20 @@ static inline void copy_timings_omap_to_drm(struct drm_display_mode *mode, | |||
| 48 | mode->vsync_end = mode->vsync_start + timings->vsw; | 48 | mode->vsync_end = mode->vsync_start + timings->vsw; |
| 49 | mode->vtotal = mode->vsync_end + timings->vbp; | 49 | mode->vtotal = mode->vsync_end + timings->vbp; |
| 50 | 50 | ||
| 51 | /* note: whether or not it is interlaced, +/- h/vsync, etc, | 51 | mode->flags = 0; |
| 52 | * which should be set in the mode flags, is not exposed in | 52 | |
| 53 | * the omap_video_timings struct.. but hdmi driver tracks | 53 | if (timings->interlace) |
| 54 | * those separately so all we have to have to set the mode | 54 | mode->flags |= DRM_MODE_FLAG_INTERLACE; |
| 55 | * is the way to recover these timings values, and the | 55 | |
| 56 | * omap_dss_driver would do the rest. | 56 | if (timings->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH) |
| 57 | */ | 57 | mode->flags |= DRM_MODE_FLAG_PHSYNC; |
| 58 | else | ||
| 59 | mode->flags |= DRM_MODE_FLAG_NHSYNC; | ||
| 60 | |||
| 61 | if (timings->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH) | ||
| 62 | mode->flags |= DRM_MODE_FLAG_PVSYNC; | ||
| 63 | else | ||
| 64 | mode->flags |= DRM_MODE_FLAG_NVSYNC; | ||
| 58 | } | 65 | } |
| 59 | 66 | ||
| 60 | static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings, | 67 | static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings, |
| @@ -71,6 +78,22 @@ static inline void copy_timings_drm_to_omap(struct omap_video_timings *timings, | |||
| 71 | timings->vfp = mode->vsync_start - mode->vdisplay; | 78 | timings->vfp = mode->vsync_start - mode->vdisplay; |
| 72 | timings->vsw = mode->vsync_end - mode->vsync_start; | 79 | timings->vsw = mode->vsync_end - mode->vsync_start; |
| 73 | timings->vbp = mode->vtotal - mode->vsync_end; | 80 | timings->vbp = mode->vtotal - mode->vsync_end; |
| 81 | |||
| 82 | timings->interlace = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); | ||
| 83 | |||
| 84 | if (mode->flags & DRM_MODE_FLAG_PHSYNC) | ||
| 85 | timings->hsync_level = OMAPDSS_SIG_ACTIVE_HIGH; | ||
| 86 | else | ||
| 87 | timings->hsync_level = OMAPDSS_SIG_ACTIVE_LOW; | ||
| 88 | |||
| 89 | if (mode->flags & DRM_MODE_FLAG_PVSYNC) | ||
| 90 | timings->vsync_level = OMAPDSS_SIG_ACTIVE_HIGH; | ||
| 91 | else | ||
| 92 | timings->vsync_level = OMAPDSS_SIG_ACTIVE_LOW; | ||
| 93 | |||
| 94 | timings->data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; | ||
| 95 | timings->de_level = OMAPDSS_SIG_ACTIVE_HIGH; | ||
| 96 | timings->sync_pclk_edge = OMAPDSS_DRIVE_SIG_OPPOSITE_EDGES; | ||
| 74 | } | 97 | } |
| 75 | 98 | ||
| 76 | static void omap_connector_dpms(struct drm_connector *connector, int mode) | 99 | static void omap_connector_dpms(struct drm_connector *connector, int mode) |
| @@ -187,7 +210,7 @@ static int omap_connector_get_modes(struct drm_connector *connector) | |||
| 187 | } | 210 | } |
| 188 | } else { | 211 | } else { |
| 189 | struct drm_display_mode *mode = drm_mode_create(dev); | 212 | struct drm_display_mode *mode = drm_mode_create(dev); |
| 190 | struct omap_video_timings timings; | 213 | struct omap_video_timings timings = {0}; |
| 191 | 214 | ||
| 192 | dssdrv->get_timings(dssdev, &timings); | 215 | dssdrv->get_timings(dssdev, &timings); |
| 193 | 216 | ||
| @@ -291,7 +314,7 @@ void omap_connector_mode_set(struct drm_connector *connector, | |||
| 291 | struct omap_connector *omap_connector = to_omap_connector(connector); | 314 | struct omap_connector *omap_connector = to_omap_connector(connector); |
| 292 | struct omap_dss_device *dssdev = omap_connector->dssdev; | 315 | struct omap_dss_device *dssdev = omap_connector->dssdev; |
| 293 | struct omap_dss_driver *dssdrv = dssdev->driver; | 316 | struct omap_dss_driver *dssdrv = dssdev->driver; |
| 294 | struct omap_video_timings timings; | 317 | struct omap_video_timings timings = {0}; |
| 295 | 318 | ||
| 296 | copy_timings_drm_to_omap(&timings, mode); | 319 | copy_timings_drm_to_omap(&timings, mode); |
| 297 | 320 | ||
diff --git a/drivers/staging/ozwpan/ozcdev.c b/drivers/staging/ozwpan/ozcdev.c index d98321945802..758ce0a8d82e 100644 --- a/drivers/staging/ozwpan/ozcdev.c +++ b/drivers/staging/ozwpan/ozcdev.c | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | #include <linux/cdev.h> | 8 | #include <linux/cdev.h> |
| 9 | #include <linux/uaccess.h> | 9 | #include <linux/uaccess.h> |
| 10 | #include <linux/netdevice.h> | 10 | #include <linux/netdevice.h> |
| 11 | #include <linux/etherdevice.h> | ||
| 11 | #include <linux/poll.h> | 12 | #include <linux/poll.h> |
| 12 | #include <linux/sched.h> | 13 | #include <linux/sched.h> |
| 13 | #include "ozconfig.h" | 14 | #include "ozconfig.h" |
| @@ -213,7 +214,7 @@ static int oz_set_active_pd(u8 *addr) | |||
| 213 | if (old_pd) | 214 | if (old_pd) |
| 214 | oz_pd_put(old_pd); | 215 | oz_pd_put(old_pd); |
| 215 | } else { | 216 | } else { |
| 216 | if (!memcmp(addr, "\0\0\0\0\0\0", sizeof(addr))) { | 217 | if (is_zero_ether_addr(addr)) { |
| 217 | spin_lock_bh(&g_cdev.lock); | 218 | spin_lock_bh(&g_cdev.lock); |
| 218 | pd = g_cdev.active_pd; | 219 | pd = g_cdev.active_pd; |
| 219 | g_cdev.active_pd = 0; | 220 | g_cdev.active_pd = 0; |
diff --git a/drivers/staging/rtl8712/recv_linux.c b/drivers/staging/rtl8712/recv_linux.c index 0e26d5f6cf2d..495ee1205e02 100644 --- a/drivers/staging/rtl8712/recv_linux.c +++ b/drivers/staging/rtl8712/recv_linux.c | |||
| @@ -117,13 +117,8 @@ void r8712_recv_indicatepkt(struct _adapter *padapter, | |||
| 117 | if (skb == NULL) | 117 | if (skb == NULL) |
| 118 | goto _recv_indicatepkt_drop; | 118 | goto _recv_indicatepkt_drop; |
| 119 | skb->data = precv_frame->u.hdr.rx_data; | 119 | skb->data = precv_frame->u.hdr.rx_data; |
| 120 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | ||
| 121 | skb->tail = (sk_buff_data_t)(precv_frame->u.hdr.rx_tail - | ||
| 122 | precv_frame->u.hdr.rx_head); | ||
| 123 | #else | ||
| 124 | skb->tail = (sk_buff_data_t)precv_frame->u.hdr.rx_tail; | ||
| 125 | #endif | ||
| 126 | skb->len = precv_frame->u.hdr.len; | 120 | skb->len = precv_frame->u.hdr.len; |
| 121 | skb_set_tail_pointer(skb, skb->len); | ||
| 127 | if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1)) | 122 | if ((pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1)) |
| 128 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 123 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
| 129 | else | 124 | else |
diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c index e4bdf2a2b582..3aa895ec6507 100644 --- a/drivers/staging/vt6656/dpc.c +++ b/drivers/staging/vt6656/dpc.c | |||
| @@ -200,7 +200,7 @@ s_vProcessRxMACHeader ( | |||
| 200 | } else if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) { | 200 | } else if (!compare_ether_addr(pbyRxBuffer, &pDevice->abySNAP_RFC1042[0])) { |
| 201 | cbHeaderSize += 6; | 201 | cbHeaderSize += 6; |
| 202 | pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize); | 202 | pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize); |
| 203 | if ((*pwType == cpu_to_le16(ETH_P_IPX)) || | 203 | if ((*pwType == cpu_to_be16(ETH_P_IPX)) || |
| 204 | (*pwType == cpu_to_le16(0xF380))) { | 204 | (*pwType == cpu_to_le16(0xF380))) { |
| 205 | cbHeaderSize -= 8; | 205 | cbHeaderSize -= 8; |
| 206 | pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize); | 206 | pwType = (PWORD) (pbyRxBufferAddr + cbHeaderSize); |
diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c index bb464527fc1b..b6e04e7b629b 100644 --- a/drivers/staging/vt6656/rxtx.c +++ b/drivers/staging/vt6656/rxtx.c | |||
| @@ -1699,7 +1699,7 @@ s_bPacketToWirelessUsb( | |||
| 1699 | // 802.1H | 1699 | // 802.1H |
| 1700 | if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) { | 1700 | if (ntohs(psEthHeader->wType) > ETH_DATA_LEN) { |
| 1701 | if (pDevice->dwDiagRefCount == 0) { | 1701 | if (pDevice->dwDiagRefCount == 0) { |
| 1702 | if ((psEthHeader->wType == cpu_to_le16(ETH_P_IPX)) || | 1702 | if ((psEthHeader->wType == cpu_to_be16(ETH_P_IPX)) || |
| 1703 | (psEthHeader->wType == cpu_to_le16(0xF380))) { | 1703 | (psEthHeader->wType == cpu_to_le16(0xF380))) { |
| 1704 | memcpy((PBYTE) (pbyPayloadHead), | 1704 | memcpy((PBYTE) (pbyPayloadHead), |
| 1705 | abySNAP_Bridgetunnel, 6); | 1705 | abySNAP_Bridgetunnel, 6); |
| @@ -2838,10 +2838,10 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | |||
| 2838 | Packet_Type = skb->data[ETH_HLEN+1]; | 2838 | Packet_Type = skb->data[ETH_HLEN+1]; |
| 2839 | Descriptor_type = skb->data[ETH_HLEN+1+1+2]; | 2839 | Descriptor_type = skb->data[ETH_HLEN+1+1+2]; |
| 2840 | Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]); | 2840 | Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]); |
| 2841 | if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) { | 2841 | if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) { |
| 2842 | /* 802.1x OR eapol-key challenge frame transfer */ | 2842 | /* 802.1x OR eapol-key challenge frame transfer */ |
| 2843 | if (((Protocol_Version == 1) || (Protocol_Version == 2)) && | 2843 | if (((Protocol_Version == 1) || (Protocol_Version == 2)) && |
| 2844 | (Packet_Type == 3)) { | 2844 | (Packet_Type == 3)) { |
| 2845 | bTxeapol_key = TRUE; | 2845 | bTxeapol_key = TRUE; |
| 2846 | if(!(Key_info & BIT3) && //WPA or RSN group-key challenge | 2846 | if(!(Key_info & BIT3) && //WPA or RSN group-key challenge |
| 2847 | (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key | 2847 | (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key |
| @@ -2987,19 +2987,19 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | |||
| 2987 | } | 2987 | } |
| 2988 | } | 2988 | } |
| 2989 | 2989 | ||
| 2990 | if (pDevice->sTxEthHeader.wType == cpu_to_le16(ETH_P_PAE)) { | 2990 | if (pDevice->sTxEthHeader.wType == cpu_to_be16(ETH_P_PAE)) { |
| 2991 | if (pDevice->byBBType != BB_TYPE_11A) { | 2991 | if (pDevice->byBBType != BB_TYPE_11A) { |
| 2992 | pDevice->wCurrentRate = RATE_1M; | 2992 | pDevice->wCurrentRate = RATE_1M; |
| 2993 | pDevice->byACKRate = RATE_1M; | 2993 | pDevice->byACKRate = RATE_1M; |
| 2994 | pDevice->byTopCCKBasicRate = RATE_1M; | 2994 | pDevice->byTopCCKBasicRate = RATE_1M; |
| 2995 | pDevice->byTopOFDMBasicRate = RATE_6M; | 2995 | pDevice->byTopOFDMBasicRate = RATE_6M; |
| 2996 | } else { | 2996 | } else { |
| 2997 | pDevice->wCurrentRate = RATE_6M; | 2997 | pDevice->wCurrentRate = RATE_6M; |
| 2998 | pDevice->byACKRate = RATE_6M; | 2998 | pDevice->byACKRate = RATE_6M; |
| 2999 | pDevice->byTopCCKBasicRate = RATE_1M; | 2999 | pDevice->byTopCCKBasicRate = RATE_1M; |
| 3000 | pDevice->byTopOFDMBasicRate = RATE_6M; | 3000 | pDevice->byTopOFDMBasicRate = RATE_6M; |
| 3001 | } | 3001 | } |
| 3002 | } | 3002 | } |
| 3003 | 3003 | ||
| 3004 | DBG_PRT(MSG_LEVEL_DEBUG, | 3004 | DBG_PRT(MSG_LEVEL_DEBUG, |
| 3005 | KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n", | 3005 | KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n", |
| @@ -3015,7 +3015,7 @@ int nsDMA_tx_packet(PSDevice pDevice, unsigned int uDMAIdx, struct sk_buff *skb) | |||
| 3015 | 3015 | ||
| 3016 | if (bNeedEncryption == TRUE) { | 3016 | if (bNeedEncryption == TRUE) { |
| 3017 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType)); | 3017 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.wType)); |
| 3018 | if ((pDevice->sTxEthHeader.wType) == cpu_to_le16(ETH_P_PAE)) { | 3018 | if ((pDevice->sTxEthHeader.wType) == cpu_to_be16(ETH_P_PAE)) { |
| 3019 | bNeedEncryption = FALSE; | 3019 | bNeedEncryption = FALSE; |
| 3020 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType)); | 3020 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.wType)); |
| 3021 | if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { | 3021 | if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { |
diff --git a/drivers/staging/wlan-ng/cfg80211.c b/drivers/staging/wlan-ng/cfg80211.c index fabff4d650ef..0970127344e6 100644 --- a/drivers/staging/wlan-ng/cfg80211.c +++ b/drivers/staging/wlan-ng/cfg80211.c | |||
| @@ -327,9 +327,9 @@ int prism2_get_station(struct wiphy *wiphy, struct net_device *dev, | |||
| 327 | return result; | 327 | return result; |
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | int prism2_scan(struct wiphy *wiphy, struct net_device *dev, | 330 | int prism2_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request) |
| 331 | struct cfg80211_scan_request *request) | ||
| 332 | { | 331 | { |
| 332 | struct net_device *dev = request->wdev->netdev; | ||
| 333 | struct prism2_wiphy_private *priv = wiphy_priv(wiphy); | 333 | struct prism2_wiphy_private *priv = wiphy_priv(wiphy); |
| 334 | wlandevice_t *wlandev = dev->ml_priv; | 334 | wlandevice_t *wlandev = dev->ml_priv; |
| 335 | struct p80211msg_dot11req_scan msg1; | 335 | struct p80211msg_dot11req_scan msg1; |
diff --git a/drivers/staging/zcache/zcache-main.c b/drivers/staging/zcache/zcache-main.c index c214977b4ab4..52b43b7b83d7 100644 --- a/drivers/staging/zcache/zcache-main.c +++ b/drivers/staging/zcache/zcache-main.c | |||
| @@ -1251,13 +1251,12 @@ static int zcache_pampd_get_data_and_free(char *data, size_t *bufsize, bool raw, | |||
| 1251 | void *pampd, struct tmem_pool *pool, | 1251 | void *pampd, struct tmem_pool *pool, |
| 1252 | struct tmem_oid *oid, uint32_t index) | 1252 | struct tmem_oid *oid, uint32_t index) |
| 1253 | { | 1253 | { |
| 1254 | int ret = 0; | ||
| 1255 | |||
| 1256 | BUG_ON(!is_ephemeral(pool)); | 1254 | BUG_ON(!is_ephemeral(pool)); |
| 1257 | zbud_decompress((struct page *)(data), pampd); | 1255 | if (zbud_decompress((struct page *)(data), pampd) < 0) |
| 1256 | return -EINVAL; | ||
| 1258 | zbud_free_and_delist((struct zbud_hdr *)pampd); | 1257 | zbud_free_and_delist((struct zbud_hdr *)pampd); |
| 1259 | atomic_dec(&zcache_curr_eph_pampd_count); | 1258 | atomic_dec(&zcache_curr_eph_pampd_count); |
| 1260 | return ret; | 1259 | return 0; |
| 1261 | } | 1260 | } |
| 1262 | 1261 | ||
| 1263 | /* | 1262 | /* |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index 0694d9b1bce6..6aba4395e8d8 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
| @@ -221,6 +221,7 @@ static int iscsi_login_zero_tsih_s1( | |||
| 221 | { | 221 | { |
| 222 | struct iscsi_session *sess = NULL; | 222 | struct iscsi_session *sess = NULL; |
| 223 | struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf; | 223 | struct iscsi_login_req *pdu = (struct iscsi_login_req *)buf; |
| 224 | int ret; | ||
| 224 | 225 | ||
| 225 | sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL); | 226 | sess = kzalloc(sizeof(struct iscsi_session), GFP_KERNEL); |
| 226 | if (!sess) { | 227 | if (!sess) { |
| @@ -257,9 +258,17 @@ static int iscsi_login_zero_tsih_s1( | |||
| 257 | return -ENOMEM; | 258 | return -ENOMEM; |
| 258 | } | 259 | } |
| 259 | spin_lock(&sess_idr_lock); | 260 | spin_lock(&sess_idr_lock); |
| 260 | idr_get_new(&sess_idr, NULL, &sess->session_index); | 261 | ret = idr_get_new(&sess_idr, NULL, &sess->session_index); |
| 261 | spin_unlock(&sess_idr_lock); | 262 | spin_unlock(&sess_idr_lock); |
| 262 | 263 | ||
| 264 | if (ret < 0) { | ||
| 265 | pr_err("idr_get_new() for sess_idr failed\n"); | ||
| 266 | iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR, | ||
| 267 | ISCSI_LOGIN_STATUS_NO_RESOURCES); | ||
| 268 | kfree(sess); | ||
| 269 | return -ENOMEM; | ||
| 270 | } | ||
| 271 | |||
| 263 | sess->creation_time = get_jiffies_64(); | 272 | sess->creation_time = get_jiffies_64(); |
| 264 | spin_lock_init(&sess->session_stats_lock); | 273 | spin_lock_init(&sess->session_stats_lock); |
| 265 | /* | 274 | /* |
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c index 91799973081a..41641ba54828 100644 --- a/drivers/target/target_core_alua.c +++ b/drivers/target/target_core_alua.c | |||
| @@ -218,6 +218,13 @@ int target_emulate_set_target_port_groups(struct se_cmd *cmd) | |||
| 218 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | 218 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; |
| 219 | return -EINVAL; | 219 | return -EINVAL; |
| 220 | } | 220 | } |
| 221 | if (cmd->data_length < 4) { | ||
| 222 | pr_warn("SET TARGET PORT GROUPS parameter list length %u too" | ||
| 223 | " small\n", cmd->data_length); | ||
| 224 | cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST; | ||
| 225 | return -EINVAL; | ||
| 226 | } | ||
| 227 | |||
| 221 | buf = transport_kmap_data_sg(cmd); | 228 | buf = transport_kmap_data_sg(cmd); |
| 222 | 229 | ||
| 223 | /* | 230 | /* |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index cf2c66f3c116..9fc9a6006ca0 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -669,6 +669,13 @@ int target_report_luns(struct se_cmd *se_cmd) | |||
| 669 | unsigned char *buf; | 669 | unsigned char *buf; |
| 670 | u32 lun_count = 0, offset = 8, i; | 670 | u32 lun_count = 0, offset = 8, i; |
| 671 | 671 | ||
| 672 | if (se_cmd->data_length < 16) { | ||
| 673 | pr_warn("REPORT LUNS allocation length %u too small\n", | ||
| 674 | se_cmd->data_length); | ||
| 675 | se_cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD; | ||
| 676 | return -EINVAL; | ||
| 677 | } | ||
| 678 | |||
| 672 | buf = transport_kmap_data_sg(se_cmd); | 679 | buf = transport_kmap_data_sg(se_cmd); |
| 673 | if (!buf) | 680 | if (!buf) |
| 674 | return -ENOMEM; | 681 | return -ENOMEM; |
diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 76db75e836ed..9ba495477fd2 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c | |||
| @@ -325,17 +325,30 @@ static int iblock_execute_unmap(struct se_cmd *cmd) | |||
| 325 | struct iblock_dev *ibd = dev->dev_ptr; | 325 | struct iblock_dev *ibd = dev->dev_ptr; |
| 326 | unsigned char *buf, *ptr = NULL; | 326 | unsigned char *buf, *ptr = NULL; |
| 327 | sector_t lba; | 327 | sector_t lba; |
| 328 | int size = cmd->data_length; | 328 | int size; |
| 329 | u32 range; | 329 | u32 range; |
| 330 | int ret = 0; | 330 | int ret = 0; |
| 331 | int dl, bd_dl; | 331 | int dl, bd_dl; |
| 332 | 332 | ||
| 333 | if (cmd->data_length < 8) { | ||
| 334 | pr_warn("UNMAP parameter list length %u too small\n", | ||
| 335 | cmd->data_length); | ||
| 336 | cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST; | ||
| 337 | return -EINVAL; | ||
| 338 | } | ||
| 339 | |||
| 333 | buf = transport_kmap_data_sg(cmd); | 340 | buf = transport_kmap_data_sg(cmd); |
| 334 | 341 | ||
| 335 | dl = get_unaligned_be16(&buf[0]); | 342 | dl = get_unaligned_be16(&buf[0]); |
| 336 | bd_dl = get_unaligned_be16(&buf[2]); | 343 | bd_dl = get_unaligned_be16(&buf[2]); |
| 337 | 344 | ||
| 338 | size = min(size - 8, bd_dl); | 345 | size = cmd->data_length - 8; |
| 346 | if (bd_dl > size) | ||
| 347 | pr_warn("UNMAP parameter list length %u too small, ignoring bd_dl %u\n", | ||
| 348 | cmd->data_length, bd_dl); | ||
| 349 | else | ||
| 350 | size = bd_dl; | ||
| 351 | |||
| 339 | if (size / 16 > dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count) { | 352 | if (size / 16 > dev->se_sub_dev->se_dev_attrib.max_unmap_block_desc_count) { |
| 340 | cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST; | 353 | cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST; |
| 341 | ret = -EINVAL; | 354 | ret = -EINVAL; |
diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c index 1e946502c378..956c84c6b666 100644 --- a/drivers/target/target_core_pr.c +++ b/drivers/target/target_core_pr.c | |||
| @@ -1540,6 +1540,14 @@ static int core_scsi3_decode_spec_i_port( | |||
| 1540 | tidh_new->dest_local_nexus = 1; | 1540 | tidh_new->dest_local_nexus = 1; |
| 1541 | list_add_tail(&tidh_new->dest_list, &tid_dest_list); | 1541 | list_add_tail(&tidh_new->dest_list, &tid_dest_list); |
| 1542 | 1542 | ||
| 1543 | if (cmd->data_length < 28) { | ||
| 1544 | pr_warn("SPC-PR: Received PR OUT parameter list" | ||
| 1545 | " length too small: %u\n", cmd->data_length); | ||
| 1546 | cmd->scsi_sense_reason = TCM_INVALID_PARAMETER_LIST; | ||
| 1547 | ret = -EINVAL; | ||
| 1548 | goto out; | ||
| 1549 | } | ||
| 1550 | |||
| 1543 | buf = transport_kmap_data_sg(cmd); | 1551 | buf = transport_kmap_data_sg(cmd); |
| 1544 | /* | 1552 | /* |
| 1545 | * For a PERSISTENT RESERVE OUT specify initiator ports payload, | 1553 | * For a PERSISTENT RESERVE OUT specify initiator ports payload, |
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index 5552fa7426bc..9d7ce3daa262 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c | |||
| @@ -667,7 +667,8 @@ static void pscsi_free_device(void *p) | |||
| 667 | kfree(pdv); | 667 | kfree(pdv); |
| 668 | } | 668 | } |
| 669 | 669 | ||
| 670 | static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg) | 670 | static void pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg, |
| 671 | unsigned char *sense_buffer) | ||
| 671 | { | 672 | { |
| 672 | struct pscsi_dev_virt *pdv = cmd->se_dev->dev_ptr; | 673 | struct pscsi_dev_virt *pdv = cmd->se_dev->dev_ptr; |
| 673 | struct scsi_device *sd = pdv->pdv_sd; | 674 | struct scsi_device *sd = pdv->pdv_sd; |
| @@ -679,7 +680,7 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg) | |||
| 679 | * not been allocated because TCM is handling the emulation directly. | 680 | * not been allocated because TCM is handling the emulation directly. |
| 680 | */ | 681 | */ |
| 681 | if (!pt) | 682 | if (!pt) |
| 682 | return 0; | 683 | return; |
| 683 | 684 | ||
| 684 | cdb = &pt->pscsi_cdb[0]; | 685 | cdb = &pt->pscsi_cdb[0]; |
| 685 | result = pt->pscsi_result; | 686 | result = pt->pscsi_result; |
| @@ -687,11 +688,11 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg) | |||
| 687 | * Hack to make sure that Write-Protect modepage is set if R/O mode is | 688 | * Hack to make sure that Write-Protect modepage is set if R/O mode is |
| 688 | * forced. | 689 | * forced. |
| 689 | */ | 690 | */ |
| 691 | if (!cmd->se_deve || !cmd->data_length) | ||
| 692 | goto after_mode_sense; | ||
| 693 | |||
| 690 | if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) && | 694 | if (((cdb[0] == MODE_SENSE) || (cdb[0] == MODE_SENSE_10)) && |
| 691 | (status_byte(result) << 1) == SAM_STAT_GOOD) { | 695 | (status_byte(result) << 1) == SAM_STAT_GOOD) { |
| 692 | if (!cmd->se_deve) | ||
| 693 | goto after_mode_sense; | ||
| 694 | |||
| 695 | if (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY) { | 696 | if (cmd->se_deve->lun_flags & TRANSPORT_LUNFLAGS_READ_ONLY) { |
| 696 | unsigned char *buf = transport_kmap_data_sg(cmd); | 697 | unsigned char *buf = transport_kmap_data_sg(cmd); |
| 697 | 698 | ||
| @@ -708,7 +709,7 @@ static int pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg) | |||
| 708 | } | 709 | } |
| 709 | after_mode_sense: | 710 | after_mode_sense: |
| 710 | 711 | ||
| 711 | if (sd->type != TYPE_TAPE) | 712 | if (sd->type != TYPE_TAPE || !cmd->data_length) |
| 712 | goto after_mode_select; | 713 | goto after_mode_select; |
| 713 | 714 | ||
| 714 | /* | 715 | /* |
| @@ -750,10 +751,10 @@ after_mode_sense: | |||
| 750 | } | 751 | } |
| 751 | after_mode_select: | 752 | after_mode_select: |
| 752 | 753 | ||
| 753 | if (status_byte(result) & CHECK_CONDITION) | 754 | if (sense_buffer && (status_byte(result) & CHECK_CONDITION)) { |
| 754 | return 1; | 755 | memcpy(sense_buffer, pt->pscsi_sense, TRANSPORT_SENSE_BUFFER); |
| 755 | 756 | cmd->se_cmd_flags |= SCF_TRANSPORT_TASK_SENSE; | |
| 756 | return 0; | 757 | } |
| 757 | } | 758 | } |
| 758 | 759 | ||
| 759 | enum { | 760 | enum { |
| @@ -1184,13 +1185,6 @@ fail: | |||
| 1184 | return -ENOMEM; | 1185 | return -ENOMEM; |
| 1185 | } | 1186 | } |
| 1186 | 1187 | ||
| 1187 | static unsigned char *pscsi_get_sense_buffer(struct se_cmd *cmd) | ||
| 1188 | { | ||
| 1189 | struct pscsi_plugin_task *pt = cmd->priv; | ||
| 1190 | |||
| 1191 | return pt->pscsi_sense; | ||
| 1192 | } | ||
| 1193 | |||
| 1194 | /* pscsi_get_device_rev(): | 1188 | /* pscsi_get_device_rev(): |
| 1195 | * | 1189 | * |
| 1196 | * | 1190 | * |
| @@ -1273,7 +1267,6 @@ static struct se_subsystem_api pscsi_template = { | |||
| 1273 | .check_configfs_dev_params = pscsi_check_configfs_dev_params, | 1267 | .check_configfs_dev_params = pscsi_check_configfs_dev_params, |
| 1274 | .set_configfs_dev_params = pscsi_set_configfs_dev_params, | 1268 | .set_configfs_dev_params = pscsi_set_configfs_dev_params, |
| 1275 | .show_configfs_dev_params = pscsi_show_configfs_dev_params, | 1269 | .show_configfs_dev_params = pscsi_show_configfs_dev_params, |
| 1276 | .get_sense_buffer = pscsi_get_sense_buffer, | ||
| 1277 | .get_device_rev = pscsi_get_device_rev, | 1270 | .get_device_rev = pscsi_get_device_rev, |
| 1278 | .get_device_type = pscsi_get_device_type, | 1271 | .get_device_type = pscsi_get_device_type, |
| 1279 | .get_blocks = pscsi_get_blocks, | 1272 | .get_blocks = pscsi_get_blocks, |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 4c861de538c9..388a922c8f6d 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
| @@ -877,9 +877,11 @@ static int spc_emulate_modesense(struct se_cmd *cmd) | |||
| 877 | static int spc_emulate_request_sense(struct se_cmd *cmd) | 877 | static int spc_emulate_request_sense(struct se_cmd *cmd) |
| 878 | { | 878 | { |
| 879 | unsigned char *cdb = cmd->t_task_cdb; | 879 | unsigned char *cdb = cmd->t_task_cdb; |
| 880 | unsigned char *buf; | 880 | unsigned char *rbuf; |
| 881 | u8 ua_asc = 0, ua_ascq = 0; | 881 | u8 ua_asc = 0, ua_ascq = 0; |
| 882 | int err = 0; | 882 | unsigned char buf[SE_SENSE_BUF]; |
| 883 | |||
| 884 | memset(buf, 0, SE_SENSE_BUF); | ||
| 883 | 885 | ||
| 884 | if (cdb[1] & 0x01) { | 886 | if (cdb[1] & 0x01) { |
| 885 | pr_err("REQUEST_SENSE description emulation not" | 887 | pr_err("REQUEST_SENSE description emulation not" |
| @@ -888,20 +890,21 @@ static int spc_emulate_request_sense(struct se_cmd *cmd) | |||
| 888 | return -ENOSYS; | 890 | return -ENOSYS; |
| 889 | } | 891 | } |
| 890 | 892 | ||
| 891 | buf = transport_kmap_data_sg(cmd); | 893 | rbuf = transport_kmap_data_sg(cmd); |
| 892 | 894 | if (cmd->scsi_sense_reason != 0) { | |
| 893 | if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { | 895 | /* |
| 896 | * Out of memory. We will fail with CHECK CONDITION, so | ||
| 897 | * we must not clear the unit attention condition. | ||
| 898 | */ | ||
| 899 | target_complete_cmd(cmd, CHECK_CONDITION); | ||
| 900 | return 0; | ||
| 901 | } else if (!core_scsi3_ua_clear_for_request_sense(cmd, &ua_asc, &ua_ascq)) { | ||
| 894 | /* | 902 | /* |
| 895 | * CURRENT ERROR, UNIT ATTENTION | 903 | * CURRENT ERROR, UNIT ATTENTION |
| 896 | */ | 904 | */ |
| 897 | buf[0] = 0x70; | 905 | buf[0] = 0x70; |
| 898 | buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; | 906 | buf[SPC_SENSE_KEY_OFFSET] = UNIT_ATTENTION; |
| 899 | 907 | ||
| 900 | if (cmd->data_length < 18) { | ||
| 901 | buf[7] = 0x00; | ||
| 902 | err = -EINVAL; | ||
| 903 | goto end; | ||
| 904 | } | ||
| 905 | /* | 908 | /* |
| 906 | * The Additional Sense Code (ASC) from the UNIT ATTENTION | 909 | * The Additional Sense Code (ASC) from the UNIT ATTENTION |
| 907 | */ | 910 | */ |
| @@ -915,11 +918,6 @@ static int spc_emulate_request_sense(struct se_cmd *cmd) | |||
| 915 | buf[0] = 0x70; | 918 | buf[0] = 0x70; |
| 916 | buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; | 919 | buf[SPC_SENSE_KEY_OFFSET] = NO_SENSE; |
| 917 | 920 | ||
| 918 | if (cmd->data_length < 18) { | ||
| 919 | buf[7] = 0x00; | ||
| 920 | err = -EINVAL; | ||
| 921 | goto end; | ||
| 922 | } | ||
| 923 | /* | 921 | /* |
| 924 | * NO ADDITIONAL SENSE INFORMATION | 922 | * NO ADDITIONAL SENSE INFORMATION |
| 925 | */ | 923 | */ |
| @@ -927,8 +925,11 @@ static int spc_emulate_request_sense(struct se_cmd *cmd) | |||
| 927 | buf[7] = 0x0A; | 925 | buf[7] = 0x0A; |
| 928 | } | 926 | } |
| 929 | 927 | ||
| 930 | end: | 928 | if (rbuf) { |
| 931 | transport_kunmap_data_sg(cmd); | 929 | memcpy(rbuf, buf, min_t(u32, sizeof(buf), cmd->data_length)); |
| 930 | transport_kunmap_data_sg(cmd); | ||
| 931 | } | ||
| 932 | |||
| 932 | target_complete_cmd(cmd, GOOD); | 933 | target_complete_cmd(cmd, GOOD); |
| 933 | return 0; | 934 | return 0; |
| 934 | } | 935 | } |
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 4de3186dc44e..269f54488397 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
| @@ -567,6 +567,34 @@ static void target_complete_failure_work(struct work_struct *work) | |||
| 567 | transport_generic_request_failure(cmd); | 567 | transport_generic_request_failure(cmd); |
| 568 | } | 568 | } |
| 569 | 569 | ||
| 570 | /* | ||
| 571 | * Used when asking transport to copy Sense Data from the underlying | ||
| 572 | * Linux/SCSI struct scsi_cmnd | ||
| 573 | */ | ||
| 574 | static unsigned char *transport_get_sense_buffer(struct se_cmd *cmd) | ||
| 575 | { | ||
| 576 | unsigned char *buffer = cmd->sense_buffer; | ||
| 577 | struct se_device *dev = cmd->se_dev; | ||
| 578 | u32 offset = 0; | ||
| 579 | |||
| 580 | WARN_ON(!cmd->se_lun); | ||
| 581 | |||
| 582 | if (!dev) | ||
| 583 | return NULL; | ||
| 584 | |||
| 585 | if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) | ||
| 586 | return NULL; | ||
| 587 | |||
| 588 | offset = cmd->se_tfo->set_fabric_sense_len(cmd, TRANSPORT_SENSE_BUFFER); | ||
| 589 | |||
| 590 | /* Automatically padded */ | ||
| 591 | cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER + offset; | ||
| 592 | |||
| 593 | pr_debug("HBA_[%u]_PLUG[%s]: Requesting sense for SAM STATUS: 0x%02x\n", | ||
| 594 | dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status); | ||
| 595 | return &buffer[offset]; | ||
| 596 | } | ||
| 597 | |||
| 570 | void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) | 598 | void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) |
| 571 | { | 599 | { |
| 572 | struct se_device *dev = cmd->se_dev; | 600 | struct se_device *dev = cmd->se_dev; |
| @@ -580,11 +608,11 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) | |||
| 580 | cmd->transport_state &= ~CMD_T_BUSY; | 608 | cmd->transport_state &= ~CMD_T_BUSY; |
| 581 | 609 | ||
| 582 | if (dev && dev->transport->transport_complete) { | 610 | if (dev && dev->transport->transport_complete) { |
| 583 | if (dev->transport->transport_complete(cmd, | 611 | dev->transport->transport_complete(cmd, |
| 584 | cmd->t_data_sg) != 0) { | 612 | cmd->t_data_sg, |
| 585 | cmd->se_cmd_flags |= SCF_TRANSPORT_TASK_SENSE; | 613 | transport_get_sense_buffer(cmd)); |
| 614 | if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) | ||
| 586 | success = 1; | 615 | success = 1; |
| 587 | } | ||
| 588 | } | 616 | } |
| 589 | 617 | ||
| 590 | /* | 618 | /* |
| @@ -1181,15 +1209,20 @@ int target_cmd_size_check(struct se_cmd *cmd, unsigned int size) | |||
| 1181 | /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ | 1209 | /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ |
| 1182 | goto out_invalid_cdb_field; | 1210 | goto out_invalid_cdb_field; |
| 1183 | } | 1211 | } |
| 1184 | 1212 | /* | |
| 1213 | * For the overflow case keep the existing fabric provided | ||
| 1214 | * ->data_length. Otherwise for the underflow case, reset | ||
| 1215 | * ->data_length to the smaller SCSI expected data transfer | ||
| 1216 | * length. | ||
| 1217 | */ | ||
| 1185 | if (size > cmd->data_length) { | 1218 | if (size > cmd->data_length) { |
| 1186 | cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; | 1219 | cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; |
| 1187 | cmd->residual_count = (size - cmd->data_length); | 1220 | cmd->residual_count = (size - cmd->data_length); |
| 1188 | } else { | 1221 | } else { |
| 1189 | cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; | 1222 | cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; |
| 1190 | cmd->residual_count = (cmd->data_length - size); | 1223 | cmd->residual_count = (cmd->data_length - size); |
| 1224 | cmd->data_length = size; | ||
| 1191 | } | 1225 | } |
| 1192 | cmd->data_length = size; | ||
| 1193 | } | 1226 | } |
| 1194 | 1227 | ||
| 1195 | return 0; | 1228 | return 0; |
| @@ -1816,61 +1849,6 @@ execute: | |||
| 1816 | EXPORT_SYMBOL(target_execute_cmd); | 1849 | EXPORT_SYMBOL(target_execute_cmd); |
| 1817 | 1850 | ||
| 1818 | /* | 1851 | /* |
| 1819 | * Used to obtain Sense Data from underlying Linux/SCSI struct scsi_cmnd | ||
| 1820 | */ | ||
| 1821 | static int transport_get_sense_data(struct se_cmd *cmd) | ||
| 1822 | { | ||
| 1823 | unsigned char *buffer = cmd->sense_buffer, *sense_buffer = NULL; | ||
| 1824 | struct se_device *dev = cmd->se_dev; | ||
| 1825 | unsigned long flags; | ||
| 1826 | u32 offset = 0; | ||
| 1827 | |||
| 1828 | WARN_ON(!cmd->se_lun); | ||
| 1829 | |||
| 1830 | if (!dev) | ||
| 1831 | return 0; | ||
| 1832 | |||
| 1833 | spin_lock_irqsave(&cmd->t_state_lock, flags); | ||
| 1834 | if (cmd->se_cmd_flags & SCF_SENT_CHECK_CONDITION) { | ||
| 1835 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
| 1836 | return 0; | ||
| 1837 | } | ||
| 1838 | |||
| 1839 | if (!(cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE)) | ||
| 1840 | goto out; | ||
| 1841 | |||
| 1842 | if (!dev->transport->get_sense_buffer) { | ||
| 1843 | pr_err("dev->transport->get_sense_buffer is NULL\n"); | ||
| 1844 | goto out; | ||
| 1845 | } | ||
| 1846 | |||
| 1847 | sense_buffer = dev->transport->get_sense_buffer(cmd); | ||
| 1848 | if (!sense_buffer) { | ||
| 1849 | pr_err("ITT 0x%08x cmd %p: Unable to locate" | ||
| 1850 | " sense buffer for task with sense\n", | ||
| 1851 | cmd->se_tfo->get_task_tag(cmd), cmd); | ||
| 1852 | goto out; | ||
| 1853 | } | ||
| 1854 | |||
| 1855 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
| 1856 | |||
| 1857 | offset = cmd->se_tfo->set_fabric_sense_len(cmd, TRANSPORT_SENSE_BUFFER); | ||
| 1858 | |||
| 1859 | memcpy(&buffer[offset], sense_buffer, TRANSPORT_SENSE_BUFFER); | ||
| 1860 | |||
| 1861 | /* Automatically padded */ | ||
| 1862 | cmd->scsi_sense_length = TRANSPORT_SENSE_BUFFER + offset; | ||
| 1863 | |||
| 1864 | pr_debug("HBA_[%u]_PLUG[%s]: Set SAM STATUS: 0x%02x and sense\n", | ||
| 1865 | dev->se_hba->hba_id, dev->transport->name, cmd->scsi_status); | ||
| 1866 | return 0; | ||
| 1867 | |||
| 1868 | out: | ||
| 1869 | spin_unlock_irqrestore(&cmd->t_state_lock, flags); | ||
| 1870 | return -1; | ||
| 1871 | } | ||
| 1872 | |||
| 1873 | /* | ||
| 1874 | * Process all commands up to the last received ORDERED task attribute which | 1852 | * Process all commands up to the last received ORDERED task attribute which |
| 1875 | * requires another blocking boundary | 1853 | * requires another blocking boundary |
| 1876 | */ | 1854 | */ |
| @@ -1985,7 +1963,7 @@ static void transport_handle_queue_full( | |||
| 1985 | static void target_complete_ok_work(struct work_struct *work) | 1963 | static void target_complete_ok_work(struct work_struct *work) |
| 1986 | { | 1964 | { |
| 1987 | struct se_cmd *cmd = container_of(work, struct se_cmd, work); | 1965 | struct se_cmd *cmd = container_of(work, struct se_cmd, work); |
| 1988 | int reason = 0, ret; | 1966 | int ret; |
| 1989 | 1967 | ||
| 1990 | /* | 1968 | /* |
| 1991 | * Check if we need to move delayed/dormant tasks from cmds on the | 1969 | * Check if we need to move delayed/dormant tasks from cmds on the |
| @@ -2002,23 +1980,19 @@ static void target_complete_ok_work(struct work_struct *work) | |||
| 2002 | schedule_work(&cmd->se_dev->qf_work_queue); | 1980 | schedule_work(&cmd->se_dev->qf_work_queue); |
| 2003 | 1981 | ||
| 2004 | /* | 1982 | /* |
| 2005 | * Check if we need to retrieve a sense buffer from | 1983 | * Check if we need to send a sense buffer from |
| 2006 | * the struct se_cmd in question. | 1984 | * the struct se_cmd in question. |
| 2007 | */ | 1985 | */ |
| 2008 | if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) { | 1986 | if (cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) { |
| 2009 | if (transport_get_sense_data(cmd) < 0) | 1987 | WARN_ON(!cmd->scsi_status); |
| 2010 | reason = TCM_NON_EXISTENT_LUN; | 1988 | ret = transport_send_check_condition_and_sense( |
| 2011 | 1989 | cmd, 0, 1); | |
| 2012 | if (cmd->scsi_status) { | 1990 | if (ret == -EAGAIN || ret == -ENOMEM) |
| 2013 | ret = transport_send_check_condition_and_sense( | 1991 | goto queue_full; |
| 2014 | cmd, reason, 1); | ||
| 2015 | if (ret == -EAGAIN || ret == -ENOMEM) | ||
| 2016 | goto queue_full; | ||
| 2017 | 1992 | ||
| 2018 | transport_lun_remove_cmd(cmd); | 1993 | transport_lun_remove_cmd(cmd); |
| 2019 | transport_cmd_check_stop_to_fabric(cmd); | 1994 | transport_cmd_check_stop_to_fabric(cmd); |
| 2020 | return; | 1995 | return; |
| 2021 | } | ||
| 2022 | } | 1996 | } |
| 2023 | /* | 1997 | /* |
| 2024 | * Check for a callback, used by amongst other things | 1998 | * Check for a callback, used by amongst other things |
| @@ -2216,7 +2190,6 @@ void *transport_kmap_data_sg(struct se_cmd *cmd) | |||
| 2216 | struct page **pages; | 2190 | struct page **pages; |
| 2217 | int i; | 2191 | int i; |
| 2218 | 2192 | ||
| 2219 | BUG_ON(!sg); | ||
| 2220 | /* | 2193 | /* |
| 2221 | * We need to take into account a possible offset here for fabrics like | 2194 | * We need to take into account a possible offset here for fabrics like |
| 2222 | * tcm_loop who may be using a contig buffer from the SCSI midlayer for | 2195 | * tcm_loop who may be using a contig buffer from the SCSI midlayer for |
| @@ -2224,13 +2197,17 @@ void *transport_kmap_data_sg(struct se_cmd *cmd) | |||
| 2224 | */ | 2197 | */ |
| 2225 | if (!cmd->t_data_nents) | 2198 | if (!cmd->t_data_nents) |
| 2226 | return NULL; | 2199 | return NULL; |
| 2227 | else if (cmd->t_data_nents == 1) | 2200 | |
| 2201 | BUG_ON(!sg); | ||
| 2202 | if (cmd->t_data_nents == 1) | ||
| 2228 | return kmap(sg_page(sg)) + sg->offset; | 2203 | return kmap(sg_page(sg)) + sg->offset; |
| 2229 | 2204 | ||
| 2230 | /* >1 page. use vmap */ | 2205 | /* >1 page. use vmap */ |
| 2231 | pages = kmalloc(sizeof(*pages) * cmd->t_data_nents, GFP_KERNEL); | 2206 | pages = kmalloc(sizeof(*pages) * cmd->t_data_nents, GFP_KERNEL); |
| 2232 | if (!pages) | 2207 | if (!pages) { |
| 2208 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
| 2233 | return NULL; | 2209 | return NULL; |
| 2210 | } | ||
| 2234 | 2211 | ||
| 2235 | /* convert sg[] to pages[] */ | 2212 | /* convert sg[] to pages[] */ |
| 2236 | for_each_sg(cmd->t_data_sg, sg, cmd->t_data_nents, i) { | 2213 | for_each_sg(cmd->t_data_sg, sg, cmd->t_data_nents, i) { |
| @@ -2239,8 +2216,10 @@ void *transport_kmap_data_sg(struct se_cmd *cmd) | |||
| 2239 | 2216 | ||
| 2240 | cmd->t_data_vmap = vmap(pages, cmd->t_data_nents, VM_MAP, PAGE_KERNEL); | 2217 | cmd->t_data_vmap = vmap(pages, cmd->t_data_nents, VM_MAP, PAGE_KERNEL); |
| 2241 | kfree(pages); | 2218 | kfree(pages); |
| 2242 | if (!cmd->t_data_vmap) | 2219 | if (!cmd->t_data_vmap) { |
| 2220 | cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
| 2243 | return NULL; | 2221 | return NULL; |
| 2222 | } | ||
| 2244 | 2223 | ||
| 2245 | return cmd->t_data_vmap + cmd->t_data_sg[0].offset; | 2224 | return cmd->t_data_vmap + cmd->t_data_sg[0].offset; |
| 2246 | } | 2225 | } |
| @@ -2326,19 +2305,14 @@ int transport_generic_new_cmd(struct se_cmd *cmd) | |||
| 2326 | * into the fabric for data transfers, go ahead and complete it right | 2305 | * into the fabric for data transfers, go ahead and complete it right |
| 2327 | * away. | 2306 | * away. |
| 2328 | */ | 2307 | */ |
| 2329 | if (!cmd->data_length) { | 2308 | if (!cmd->data_length && |
| 2309 | cmd->t_task_cdb[0] != REQUEST_SENSE && | ||
| 2310 | cmd->se_dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV) { | ||
| 2330 | spin_lock_irq(&cmd->t_state_lock); | 2311 | spin_lock_irq(&cmd->t_state_lock); |
| 2331 | cmd->t_state = TRANSPORT_COMPLETE; | 2312 | cmd->t_state = TRANSPORT_COMPLETE; |
| 2332 | cmd->transport_state |= CMD_T_ACTIVE; | 2313 | cmd->transport_state |= CMD_T_ACTIVE; |
| 2333 | spin_unlock_irq(&cmd->t_state_lock); | 2314 | spin_unlock_irq(&cmd->t_state_lock); |
| 2334 | 2315 | ||
| 2335 | if (cmd->t_task_cdb[0] == REQUEST_SENSE) { | ||
| 2336 | u8 ua_asc = 0, ua_ascq = 0; | ||
| 2337 | |||
| 2338 | core_scsi3_ua_clear_for_request_sense(cmd, | ||
| 2339 | &ua_asc, &ua_ascq); | ||
| 2340 | } | ||
| 2341 | |||
| 2342 | INIT_WORK(&cmd->work, target_complete_ok_work); | 2316 | INIT_WORK(&cmd->work, target_complete_ok_work); |
| 2343 | queue_work(target_completion_wq, &cmd->work); | 2317 | queue_work(target_completion_wq, &cmd->work); |
| 2344 | return 0; | 2318 | return 0; |
diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c index d5c689d6217e..e309e8b0aaba 100644 --- a/drivers/tty/serial/imx.c +++ b/drivers/tty/serial/imx.c | |||
| @@ -132,6 +132,7 @@ | |||
| 132 | #define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */ | 132 | #define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */ |
| 133 | #define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */ | 133 | #define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */ |
| 134 | #define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */ | 134 | #define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */ |
| 135 | #define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */ | ||
| 135 | #define UFCR_RFDIV (7<<7) /* Reference freq divider mask */ | 136 | #define UFCR_RFDIV (7<<7) /* Reference freq divider mask */ |
| 136 | #define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7) | 137 | #define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7) |
| 137 | #define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */ | 138 | #define UFCR_TXTL_SHF 10 /* Transmitter trigger level shift */ |
| @@ -667,22 +668,11 @@ static void imx_break_ctl(struct uart_port *port, int break_state) | |||
| 667 | static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) | 668 | static int imx_setup_ufcr(struct imx_port *sport, unsigned int mode) |
| 668 | { | 669 | { |
| 669 | unsigned int val; | 670 | unsigned int val; |
| 670 | unsigned int ufcr_rfdiv; | ||
| 671 | |||
| 672 | /* set receiver / transmitter trigger level. | ||
| 673 | * RFDIV is set such way to satisfy requested uartclk value | ||
| 674 | */ | ||
| 675 | val = TXTL << 10 | RXTL; | ||
| 676 | ufcr_rfdiv = (clk_get_rate(sport->clk_per) + sport->port.uartclk / 2) | ||
| 677 | / sport->port.uartclk; | ||
| 678 | |||
| 679 | if(!ufcr_rfdiv) | ||
| 680 | ufcr_rfdiv = 1; | ||
| 681 | |||
| 682 | val |= UFCR_RFDIV_REG(ufcr_rfdiv); | ||
| 683 | 671 | ||
| 672 | /* set receiver / transmitter trigger level */ | ||
| 673 | val = readl(sport->port.membase + UFCR) & (UFCR_RFDIV | UFCR_DCEDTE); | ||
| 674 | val |= TXTL << UFCR_TXTL_SHF | RXTL; | ||
| 684 | writel(val, sport->port.membase + UFCR); | 675 | writel(val, sport->port.membase + UFCR); |
| 685 | |||
| 686 | return 0; | 676 | return 0; |
| 687 | } | 677 | } |
| 688 | 678 | ||
| @@ -754,6 +744,7 @@ static int imx_startup(struct uart_port *port) | |||
| 754 | } | 744 | } |
| 755 | } | 745 | } |
| 756 | 746 | ||
| 747 | spin_lock_irqsave(&sport->port.lock, flags); | ||
| 757 | /* | 748 | /* |
| 758 | * Finally, clear and enable interrupts | 749 | * Finally, clear and enable interrupts |
| 759 | */ | 750 | */ |
| @@ -807,7 +798,6 @@ static int imx_startup(struct uart_port *port) | |||
| 807 | /* | 798 | /* |
| 808 | * Enable modem status interrupts | 799 | * Enable modem status interrupts |
| 809 | */ | 800 | */ |
| 810 | spin_lock_irqsave(&sport->port.lock,flags); | ||
| 811 | imx_enable_ms(&sport->port); | 801 | imx_enable_ms(&sport->port); |
| 812 | spin_unlock_irqrestore(&sport->port.lock,flags); | 802 | spin_unlock_irqrestore(&sport->port.lock,flags); |
| 813 | 803 | ||
| @@ -837,10 +827,13 @@ static void imx_shutdown(struct uart_port *port) | |||
| 837 | { | 827 | { |
| 838 | struct imx_port *sport = (struct imx_port *)port; | 828 | struct imx_port *sport = (struct imx_port *)port; |
| 839 | unsigned long temp; | 829 | unsigned long temp; |
| 830 | unsigned long flags; | ||
| 840 | 831 | ||
| 832 | spin_lock_irqsave(&sport->port.lock, flags); | ||
| 841 | temp = readl(sport->port.membase + UCR2); | 833 | temp = readl(sport->port.membase + UCR2); |
| 842 | temp &= ~(UCR2_TXEN); | 834 | temp &= ~(UCR2_TXEN); |
| 843 | writel(temp, sport->port.membase + UCR2); | 835 | writel(temp, sport->port.membase + UCR2); |
| 836 | spin_unlock_irqrestore(&sport->port.lock, flags); | ||
| 844 | 837 | ||
| 845 | if (USE_IRDA(sport)) { | 838 | if (USE_IRDA(sport)) { |
| 846 | struct imxuart_platform_data *pdata; | 839 | struct imxuart_platform_data *pdata; |
| @@ -869,12 +862,14 @@ static void imx_shutdown(struct uart_port *port) | |||
| 869 | * Disable all interrupts, port and break condition. | 862 | * Disable all interrupts, port and break condition. |
| 870 | */ | 863 | */ |
| 871 | 864 | ||
| 865 | spin_lock_irqsave(&sport->port.lock, flags); | ||
| 872 | temp = readl(sport->port.membase + UCR1); | 866 | temp = readl(sport->port.membase + UCR1); |
| 873 | temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN); | 867 | temp &= ~(UCR1_TXMPTYEN | UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN); |
| 874 | if (USE_IRDA(sport)) | 868 | if (USE_IRDA(sport)) |
| 875 | temp &= ~(UCR1_IREN); | 869 | temp &= ~(UCR1_IREN); |
| 876 | 870 | ||
| 877 | writel(temp, sport->port.membase + UCR1); | 871 | writel(temp, sport->port.membase + UCR1); |
| 872 | spin_unlock_irqrestore(&sport->port.lock, flags); | ||
| 878 | } | 873 | } |
| 879 | 874 | ||
| 880 | static void | 875 | static void |
| @@ -1217,6 +1212,9 @@ imx_console_write(struct console *co, const char *s, unsigned int count) | |||
| 1217 | struct imx_port *sport = imx_ports[co->index]; | 1212 | struct imx_port *sport = imx_ports[co->index]; |
| 1218 | struct imx_port_ucrs old_ucr; | 1213 | struct imx_port_ucrs old_ucr; |
| 1219 | unsigned int ucr1; | 1214 | unsigned int ucr1; |
| 1215 | unsigned long flags; | ||
| 1216 | |||
| 1217 | spin_lock_irqsave(&sport->port.lock, flags); | ||
| 1220 | 1218 | ||
| 1221 | /* | 1219 | /* |
| 1222 | * First, save UCR1/2/3 and then disable interrupts | 1220 | * First, save UCR1/2/3 and then disable interrupts |
| @@ -1242,6 +1240,8 @@ imx_console_write(struct console *co, const char *s, unsigned int count) | |||
| 1242 | while (!(readl(sport->port.membase + USR2) & USR2_TXDC)); | 1240 | while (!(readl(sport->port.membase + USR2) & USR2_TXDC)); |
| 1243 | 1241 | ||
| 1244 | imx_port_ucrs_restore(&sport->port, &old_ucr); | 1242 | imx_port_ucrs_restore(&sport->port, &old_ucr); |
| 1243 | |||
| 1244 | spin_unlock_irqrestore(&sport->port.lock, flags); | ||
| 1245 | } | 1245 | } |
| 1246 | 1246 | ||
| 1247 | /* | 1247 | /* |
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c index c7a032a4f0c5..d214448b677e 100644 --- a/drivers/usb/chipidea/udc.c +++ b/drivers/usb/chipidea/udc.c | |||
| @@ -78,8 +78,7 @@ static inline int ep_to_bit(struct ci13xxx *ci, int n) | |||
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | /** | 80 | /** |
| 81 | * hw_device_state: enables/disables interrupts & starts/stops device (execute | 81 | * hw_device_state: enables/disables interrupts (execute without interruption) |
| 82 | * without interruption) | ||
| 83 | * @dma: 0 => disable, !0 => enable and set dma engine | 82 | * @dma: 0 => disable, !0 => enable and set dma engine |
| 84 | * | 83 | * |
| 85 | * This function returns an error code | 84 | * This function returns an error code |
| @@ -91,9 +90,7 @@ static int hw_device_state(struct ci13xxx *ci, u32 dma) | |||
| 91 | /* interrupt, error, port change, reset, sleep/suspend */ | 90 | /* interrupt, error, port change, reset, sleep/suspend */ |
| 92 | hw_write(ci, OP_USBINTR, ~0, | 91 | hw_write(ci, OP_USBINTR, ~0, |
| 93 | USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI); | 92 | USBi_UI|USBi_UEI|USBi_PCI|USBi_URI|USBi_SLI); |
| 94 | hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS); | ||
| 95 | } else { | 93 | } else { |
| 96 | hw_write(ci, OP_USBCMD, USBCMD_RS, 0); | ||
| 97 | hw_write(ci, OP_USBINTR, ~0, 0); | 94 | hw_write(ci, OP_USBINTR, ~0, 0); |
| 98 | } | 95 | } |
| 99 | return 0; | 96 | return 0; |
| @@ -774,10 +771,7 @@ __acquires(mEp->lock) | |||
| 774 | { | 771 | { |
| 775 | struct ci13xxx_req *mReq, *mReqTemp; | 772 | struct ci13xxx_req *mReq, *mReqTemp; |
| 776 | struct ci13xxx_ep *mEpTemp = mEp; | 773 | struct ci13xxx_ep *mEpTemp = mEp; |
| 777 | int uninitialized_var(retval); | 774 | int retval = 0; |
| 778 | |||
| 779 | if (list_empty(&mEp->qh.queue)) | ||
| 780 | return -EINVAL; | ||
| 781 | 775 | ||
| 782 | list_for_each_entry_safe(mReq, mReqTemp, &mEp->qh.queue, | 776 | list_for_each_entry_safe(mReq, mReqTemp, &mEp->qh.queue, |
| 783 | queue) { | 777 | queue) { |
| @@ -1420,6 +1414,21 @@ static int ci13xxx_vbus_draw(struct usb_gadget *_gadget, unsigned mA) | |||
| 1420 | return -ENOTSUPP; | 1414 | return -ENOTSUPP; |
| 1421 | } | 1415 | } |
| 1422 | 1416 | ||
| 1417 | /* Change Data+ pullup status | ||
| 1418 | * this func is used by usb_gadget_connect/disconnet | ||
| 1419 | */ | ||
| 1420 | static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_on) | ||
| 1421 | { | ||
| 1422 | struct ci13xxx *ci = container_of(_gadget, struct ci13xxx, gadget); | ||
| 1423 | |||
| 1424 | if (is_on) | ||
| 1425 | hw_write(ci, OP_USBCMD, USBCMD_RS, USBCMD_RS); | ||
| 1426 | else | ||
| 1427 | hw_write(ci, OP_USBCMD, USBCMD_RS, 0); | ||
| 1428 | |||
| 1429 | return 0; | ||
| 1430 | } | ||
| 1431 | |||
| 1423 | static int ci13xxx_start(struct usb_gadget *gadget, | 1432 | static int ci13xxx_start(struct usb_gadget *gadget, |
| 1424 | struct usb_gadget_driver *driver); | 1433 | struct usb_gadget_driver *driver); |
| 1425 | static int ci13xxx_stop(struct usb_gadget *gadget, | 1434 | static int ci13xxx_stop(struct usb_gadget *gadget, |
| @@ -1432,6 +1441,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget, | |||
| 1432 | static const struct usb_gadget_ops usb_gadget_ops = { | 1441 | static const struct usb_gadget_ops usb_gadget_ops = { |
| 1433 | .vbus_session = ci13xxx_vbus_session, | 1442 | .vbus_session = ci13xxx_vbus_session, |
| 1434 | .wakeup = ci13xxx_wakeup, | 1443 | .wakeup = ci13xxx_wakeup, |
| 1444 | .pullup = ci13xxx_pullup, | ||
| 1435 | .vbus_draw = ci13xxx_vbus_draw, | 1445 | .vbus_draw = ci13xxx_vbus_draw, |
| 1436 | .udc_start = ci13xxx_start, | 1446 | .udc_start = ci13xxx_start, |
| 1437 | .udc_stop = ci13xxx_stop, | 1447 | .udc_stop = ci13xxx_stop, |
| @@ -1455,7 +1465,12 @@ static int init_eps(struct ci13xxx *ci) | |||
| 1455 | 1465 | ||
| 1456 | mEp->ep.name = mEp->name; | 1466 | mEp->ep.name = mEp->name; |
| 1457 | mEp->ep.ops = &usb_ep_ops; | 1467 | mEp->ep.ops = &usb_ep_ops; |
| 1458 | mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; | 1468 | /* |
| 1469 | * for ep0: maxP defined in desc, for other | ||
| 1470 | * eps, maxP is set by epautoconfig() called | ||
| 1471 | * by gadget layer | ||
| 1472 | */ | ||
| 1473 | mEp->ep.maxpacket = (unsigned short)~0; | ||
| 1459 | 1474 | ||
| 1460 | INIT_LIST_HEAD(&mEp->qh.queue); | 1475 | INIT_LIST_HEAD(&mEp->qh.queue); |
| 1461 | mEp->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL, | 1476 | mEp->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL, |
| @@ -1475,6 +1490,7 @@ static int init_eps(struct ci13xxx *ci) | |||
| 1475 | else | 1490 | else |
| 1476 | ci->ep0in = mEp; | 1491 | ci->ep0in = mEp; |
| 1477 | 1492 | ||
| 1493 | mEp->ep.maxpacket = CTRL_PAYLOAD_MAX; | ||
| 1478 | continue; | 1494 | continue; |
| 1479 | } | 1495 | } |
| 1480 | 1496 | ||
| @@ -1484,6 +1500,17 @@ static int init_eps(struct ci13xxx *ci) | |||
| 1484 | return retval; | 1500 | return retval; |
| 1485 | } | 1501 | } |
| 1486 | 1502 | ||
| 1503 | static void destroy_eps(struct ci13xxx *ci) | ||
| 1504 | { | ||
| 1505 | int i; | ||
| 1506 | |||
| 1507 | for (i = 0; i < ci->hw_ep_max; i++) { | ||
| 1508 | struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[i]; | ||
| 1509 | |||
| 1510 | dma_pool_free(ci->qh_pool, mEp->qh.ptr, mEp->qh.dma); | ||
| 1511 | } | ||
| 1512 | } | ||
| 1513 | |||
| 1487 | /** | 1514 | /** |
| 1488 | * ci13xxx_start: register a gadget driver | 1515 | * ci13xxx_start: register a gadget driver |
| 1489 | * @gadget: our gadget | 1516 | * @gadget: our gadget |
| @@ -1691,7 +1718,7 @@ static int udc_start(struct ci13xxx *ci) | |||
| 1691 | if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) { | 1718 | if (ci->platdata->flags & CI13XXX_REQUIRE_TRANSCEIVER) { |
| 1692 | if (ci->transceiver == NULL) { | 1719 | if (ci->transceiver == NULL) { |
| 1693 | retval = -ENODEV; | 1720 | retval = -ENODEV; |
| 1694 | goto free_pools; | 1721 | goto destroy_eps; |
| 1695 | } | 1722 | } |
| 1696 | } | 1723 | } |
| 1697 | 1724 | ||
| @@ -1729,7 +1756,7 @@ static int udc_start(struct ci13xxx *ci) | |||
| 1729 | 1756 | ||
| 1730 | remove_trans: | 1757 | remove_trans: |
| 1731 | if (!IS_ERR_OR_NULL(ci->transceiver)) { | 1758 | if (!IS_ERR_OR_NULL(ci->transceiver)) { |
| 1732 | otg_set_peripheral(ci->transceiver->otg, &ci->gadget); | 1759 | otg_set_peripheral(ci->transceiver->otg, NULL); |
| 1733 | if (ci->global_phy) | 1760 | if (ci->global_phy) |
| 1734 | usb_put_phy(ci->transceiver); | 1761 | usb_put_phy(ci->transceiver); |
| 1735 | } | 1762 | } |
| @@ -1742,6 +1769,8 @@ unreg_device: | |||
| 1742 | put_transceiver: | 1769 | put_transceiver: |
| 1743 | if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy) | 1770 | if (!IS_ERR_OR_NULL(ci->transceiver) && ci->global_phy) |
| 1744 | usb_put_phy(ci->transceiver); | 1771 | usb_put_phy(ci->transceiver); |
| 1772 | destroy_eps: | ||
| 1773 | destroy_eps(ci); | ||
| 1745 | free_pools: | 1774 | free_pools: |
| 1746 | dma_pool_destroy(ci->td_pool); | 1775 | dma_pool_destroy(ci->td_pool); |
| 1747 | free_qh_pool: | 1776 | free_qh_pool: |
| @@ -1756,18 +1785,12 @@ free_qh_pool: | |||
| 1756 | */ | 1785 | */ |
| 1757 | static void udc_stop(struct ci13xxx *ci) | 1786 | static void udc_stop(struct ci13xxx *ci) |
| 1758 | { | 1787 | { |
| 1759 | int i; | ||
| 1760 | |||
| 1761 | if (ci == NULL) | 1788 | if (ci == NULL) |
| 1762 | return; | 1789 | return; |
| 1763 | 1790 | ||
| 1764 | usb_del_gadget_udc(&ci->gadget); | 1791 | usb_del_gadget_udc(&ci->gadget); |
| 1765 | 1792 | ||
| 1766 | for (i = 0; i < ci->hw_ep_max; i++) { | 1793 | destroy_eps(ci); |
| 1767 | struct ci13xxx_ep *mEp = &ci->ci13xxx_ep[i]; | ||
| 1768 | |||
| 1769 | dma_pool_free(ci->qh_pool, mEp->qh.ptr, mEp->qh.dma); | ||
| 1770 | } | ||
| 1771 | 1794 | ||
| 1772 | dma_pool_destroy(ci->td_pool); | 1795 | dma_pool_destroy(ci->td_pool); |
| 1773 | dma_pool_destroy(ci->qh_pool); | 1796 | dma_pool_destroy(ci->qh_pool); |
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 65a55abb791f..5f0cb417b736 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
| @@ -109,12 +109,14 @@ static struct usb_driver wdm_driver; | |||
| 109 | /* return intfdata if we own the interface, else look up intf in the list */ | 109 | /* return intfdata if we own the interface, else look up intf in the list */ |
| 110 | static struct wdm_device *wdm_find_device(struct usb_interface *intf) | 110 | static struct wdm_device *wdm_find_device(struct usb_interface *intf) |
| 111 | { | 111 | { |
| 112 | struct wdm_device *desc = NULL; | 112 | struct wdm_device *desc; |
| 113 | 113 | ||
| 114 | spin_lock(&wdm_device_list_lock); | 114 | spin_lock(&wdm_device_list_lock); |
| 115 | list_for_each_entry(desc, &wdm_device_list, device_list) | 115 | list_for_each_entry(desc, &wdm_device_list, device_list) |
| 116 | if (desc->intf == intf) | 116 | if (desc->intf == intf) |
| 117 | break; | 117 | goto found; |
| 118 | desc = NULL; | ||
| 119 | found: | ||
| 118 | spin_unlock(&wdm_device_list_lock); | 120 | spin_unlock(&wdm_device_list_lock); |
| 119 | 121 | ||
| 120 | return desc; | 122 | return desc; |
| @@ -122,12 +124,14 @@ static struct wdm_device *wdm_find_device(struct usb_interface *intf) | |||
| 122 | 124 | ||
| 123 | static struct wdm_device *wdm_find_device_by_minor(int minor) | 125 | static struct wdm_device *wdm_find_device_by_minor(int minor) |
| 124 | { | 126 | { |
| 125 | struct wdm_device *desc = NULL; | 127 | struct wdm_device *desc; |
| 126 | 128 | ||
| 127 | spin_lock(&wdm_device_list_lock); | 129 | spin_lock(&wdm_device_list_lock); |
| 128 | list_for_each_entry(desc, &wdm_device_list, device_list) | 130 | list_for_each_entry(desc, &wdm_device_list, device_list) |
| 129 | if (desc->intf->minor == minor) | 131 | if (desc->intf->minor == minor) |
| 130 | break; | 132 | goto found; |
| 133 | desc = NULL; | ||
| 134 | found: | ||
| 131 | spin_unlock(&wdm_device_list_lock); | 135 | spin_unlock(&wdm_device_list_lock); |
| 132 | 136 | ||
| 133 | return desc; | 137 | return desc; |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index f15501f4c585..e77a8e8eaa23 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
| @@ -71,6 +71,10 @@ static const struct usb_device_id usb_quirk_list[] = { | |||
| 71 | { USB_DEVICE(0x04b4, 0x0526), .driver_info = | 71 | { USB_DEVICE(0x04b4, 0x0526), .driver_info = |
| 72 | USB_QUIRK_CONFIG_INTF_STRINGS }, | 72 | USB_QUIRK_CONFIG_INTF_STRINGS }, |
| 73 | 73 | ||
| 74 | /* Microchip Joss Optical infrared touchboard device */ | ||
| 75 | { USB_DEVICE(0x04d8, 0x000c), .driver_info = | ||
| 76 | USB_QUIRK_CONFIG_INTF_STRINGS }, | ||
| 77 | |||
| 74 | /* Samsung Android phone modem - ID conflict with SPH-I500 */ | 78 | /* Samsung Android phone modem - ID conflict with SPH-I500 */ |
| 75 | { USB_DEVICE(0x04e8, 0x6601), .driver_info = | 79 | { USB_DEVICE(0x04e8, 0x6601), .driver_info = |
| 76 | USB_QUIRK_CONFIG_INTF_STRINGS }, | 80 | USB_QUIRK_CONFIG_INTF_STRINGS }, |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c34452a7304f..a68ff53124dc 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -436,16 +436,21 @@ static int __devinit dwc3_probe(struct platform_device *pdev) | |||
| 436 | dev_err(dev, "missing IRQ\n"); | 436 | dev_err(dev, "missing IRQ\n"); |
| 437 | return -ENODEV; | 437 | return -ENODEV; |
| 438 | } | 438 | } |
| 439 | dwc->xhci_resources[1] = *res; | 439 | dwc->xhci_resources[1].start = res->start; |
| 440 | dwc->xhci_resources[1].end = res->end; | ||
| 441 | dwc->xhci_resources[1].flags = res->flags; | ||
| 442 | dwc->xhci_resources[1].name = res->name; | ||
| 440 | 443 | ||
| 441 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 444 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 442 | if (!res) { | 445 | if (!res) { |
| 443 | dev_err(dev, "missing memory resource\n"); | 446 | dev_err(dev, "missing memory resource\n"); |
| 444 | return -ENODEV; | 447 | return -ENODEV; |
| 445 | } | 448 | } |
| 446 | dwc->xhci_resources[0] = *res; | 449 | dwc->xhci_resources[0].start = res->start; |
| 447 | dwc->xhci_resources[0].end = dwc->xhci_resources[0].start + | 450 | dwc->xhci_resources[0].end = dwc->xhci_resources[0].start + |
| 448 | DWC3_XHCI_REGS_END; | 451 | DWC3_XHCI_REGS_END; |
| 452 | dwc->xhci_resources[0].flags = res->flags; | ||
| 453 | dwc->xhci_resources[0].name = res->name; | ||
| 449 | 454 | ||
| 450 | /* | 455 | /* |
| 451 | * Request memory region but exclude xHCI regs, | 456 | * Request memory region but exclude xHCI regs, |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 9b94886b66e5..e4d5ca86b9da 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
| @@ -720,7 +720,6 @@ static void dwc3_ep0_complete_data(struct dwc3 *dwc, | |||
| 720 | transferred = min_t(u32, ur->length, | 720 | transferred = min_t(u32, ur->length, |
| 721 | transfer_size - length); | 721 | transfer_size - length); |
| 722 | memcpy(ur->buf, dwc->ep0_bounce, transferred); | 722 | memcpy(ur->buf, dwc->ep0_bounce, transferred); |
| 723 | dwc->ep0_bounced = false; | ||
| 724 | } else { | 723 | } else { |
| 725 | transferred = ur->length - length; | 724 | transferred = ur->length - length; |
| 726 | } | 725 | } |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 58fdfad96b4d..c2813c2b005a 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -263,8 +263,11 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | |||
| 263 | if (req->request.status == -EINPROGRESS) | 263 | if (req->request.status == -EINPROGRESS) |
| 264 | req->request.status = status; | 264 | req->request.status = status; |
| 265 | 265 | ||
| 266 | usb_gadget_unmap_request(&dwc->gadget, &req->request, | 266 | if (dwc->ep0_bounced && dep->number == 0) |
| 267 | req->direction); | 267 | dwc->ep0_bounced = false; |
| 268 | else | ||
| 269 | usb_gadget_unmap_request(&dwc->gadget, &req->request, | ||
| 270 | req->direction); | ||
| 268 | 271 | ||
| 269 | dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", | 272 | dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", |
| 270 | req, dep->name, req->request.actual, | 273 | req, dep->name, req->request.actual, |
| @@ -1026,6 +1029,7 @@ static void __dwc3_gadget_start_isoc(struct dwc3 *dwc, | |||
| 1026 | if (list_empty(&dep->request_list)) { | 1029 | if (list_empty(&dep->request_list)) { |
| 1027 | dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", | 1030 | dev_vdbg(dwc->dev, "ISOC ep %s run out for requests.\n", |
| 1028 | dep->name); | 1031 | dep->name); |
| 1032 | dep->flags |= DWC3_EP_PENDING_REQUEST; | ||
| 1029 | return; | 1033 | return; |
| 1030 | } | 1034 | } |
| 1031 | 1035 | ||
| @@ -1089,6 +1093,17 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) | |||
| 1089 | if (dep->flags & DWC3_EP_PENDING_REQUEST) { | 1093 | if (dep->flags & DWC3_EP_PENDING_REQUEST) { |
| 1090 | int ret; | 1094 | int ret; |
| 1091 | 1095 | ||
| 1096 | /* | ||
| 1097 | * If xfernotready is already elapsed and it is a case | ||
| 1098 | * of isoc transfer, then issue END TRANSFER, so that | ||
| 1099 | * you can receive xfernotready again and can have | ||
| 1100 | * notion of current microframe. | ||
| 1101 | */ | ||
| 1102 | if (usb_endpoint_xfer_isoc(dep->endpoint.desc)) { | ||
| 1103 | dwc3_stop_active_transfer(dwc, dep->number); | ||
| 1104 | return 0; | ||
| 1105 | } | ||
| 1106 | |||
| 1092 | ret = __dwc3_gadget_kick_transfer(dep, 0, true); | 1107 | ret = __dwc3_gadget_kick_transfer(dep, 0, true); |
| 1093 | if (ret && ret != -EBUSY) { | 1108 | if (ret && ret != -EBUSY) { |
| 1094 | struct dwc3 *dwc = dep->dwc; | 1109 | struct dwc3 *dwc = dep->dwc; |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index c9e66dfb02e6..1e35963bd4ed 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
| @@ -475,8 +475,7 @@ static int at91_ep_enable(struct usb_ep *_ep, | |||
| 475 | unsigned long flags; | 475 | unsigned long flags; |
| 476 | 476 | ||
| 477 | if (!_ep || !ep | 477 | if (!_ep || !ep |
| 478 | || !desc || ep->ep.desc | 478 | || !desc || _ep->name == ep0name |
| 479 | || _ep->name == ep0name | ||
| 480 | || desc->bDescriptorType != USB_DT_ENDPOINT | 479 | || desc->bDescriptorType != USB_DT_ENDPOINT |
| 481 | || (maxpacket = usb_endpoint_maxp(desc)) == 0 | 480 | || (maxpacket = usb_endpoint_maxp(desc)) == 0 |
| 482 | || maxpacket > ep->maxpacket) { | 481 | || maxpacket > ep->maxpacket) { |
| @@ -530,7 +529,6 @@ ok: | |||
| 530 | tmp |= AT91_UDP_EPEDS; | 529 | tmp |= AT91_UDP_EPEDS; |
| 531 | __raw_writel(tmp, ep->creg); | 530 | __raw_writel(tmp, ep->creg); |
| 532 | 531 | ||
| 533 | ep->ep.desc = desc; | ||
| 534 | ep->ep.maxpacket = maxpacket; | 532 | ep->ep.maxpacket = maxpacket; |
| 535 | 533 | ||
| 536 | /* | 534 | /* |
| @@ -1635,7 +1633,6 @@ static int at91_start(struct usb_gadget *gadget, | |||
| 1635 | udc->driver = driver; | 1633 | udc->driver = driver; |
| 1636 | udc->gadget.dev.driver = &driver->driver; | 1634 | udc->gadget.dev.driver = &driver->driver; |
| 1637 | udc->gadget.dev.of_node = udc->pdev->dev.of_node; | 1635 | udc->gadget.dev.of_node = udc->pdev->dev.of_node; |
| 1638 | dev_set_drvdata(&udc->gadget.dev, &driver->driver); | ||
| 1639 | udc->enabled = 1; | 1636 | udc->enabled = 1; |
| 1640 | udc->selfpowered = 1; | 1637 | udc->selfpowered = 1; |
| 1641 | 1638 | ||
| @@ -1656,7 +1653,6 @@ static int at91_stop(struct usb_gadget *gadget, | |||
| 1656 | spin_unlock_irqrestore(&udc->lock, flags); | 1653 | spin_unlock_irqrestore(&udc->lock, flags); |
| 1657 | 1654 | ||
| 1658 | udc->gadget.dev.driver = NULL; | 1655 | udc->gadget.dev.driver = NULL; |
| 1659 | dev_set_drvdata(&udc->gadget.dev, NULL); | ||
| 1660 | udc->driver = NULL; | 1656 | udc->driver = NULL; |
| 1661 | 1657 | ||
| 1662 | DBG("unbound from %s\n", driver->driver.name); | 1658 | DBG("unbound from %s\n", driver->driver.name); |
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index b799106027ad..afdbb1cbf5d9 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
| @@ -1916,6 +1916,27 @@ done: | |||
| 1916 | return retval; | 1916 | return retval; |
| 1917 | } | 1917 | } |
| 1918 | 1918 | ||
| 1919 | /* usb 3.0 root hub device descriptor */ | ||
| 1920 | struct { | ||
| 1921 | struct usb_bos_descriptor bos; | ||
| 1922 | struct usb_ss_cap_descriptor ss_cap; | ||
| 1923 | } __packed usb3_bos_desc = { | ||
| 1924 | |||
| 1925 | .bos = { | ||
| 1926 | .bLength = USB_DT_BOS_SIZE, | ||
| 1927 | .bDescriptorType = USB_DT_BOS, | ||
| 1928 | .wTotalLength = cpu_to_le16(sizeof(usb3_bos_desc)), | ||
| 1929 | .bNumDeviceCaps = 1, | ||
| 1930 | }, | ||
| 1931 | .ss_cap = { | ||
| 1932 | .bLength = USB_DT_USB_SS_CAP_SIZE, | ||
| 1933 | .bDescriptorType = USB_DT_DEVICE_CAPABILITY, | ||
| 1934 | .bDevCapabilityType = USB_SS_CAP_TYPE, | ||
| 1935 | .wSpeedSupported = cpu_to_le16(USB_5GBPS_OPERATION), | ||
| 1936 | .bFunctionalitySupport = ilog2(USB_5GBPS_OPERATION), | ||
| 1937 | }, | ||
| 1938 | }; | ||
| 1939 | |||
| 1919 | static inline void | 1940 | static inline void |
| 1920 | ss_hub_descriptor(struct usb_hub_descriptor *desc) | 1941 | ss_hub_descriptor(struct usb_hub_descriptor *desc) |
| 1921 | { | 1942 | { |
| @@ -2006,6 +2027,18 @@ static int dummy_hub_control( | |||
| 2006 | else | 2027 | else |
| 2007 | hub_descriptor((struct usb_hub_descriptor *) buf); | 2028 | hub_descriptor((struct usb_hub_descriptor *) buf); |
| 2008 | break; | 2029 | break; |
| 2030 | |||
| 2031 | case DeviceRequest | USB_REQ_GET_DESCRIPTOR: | ||
| 2032 | if (hcd->speed != HCD_USB3) | ||
| 2033 | goto error; | ||
| 2034 | |||
| 2035 | if ((wValue >> 8) != USB_DT_BOS) | ||
| 2036 | goto error; | ||
| 2037 | |||
| 2038 | memcpy(buf, &usb3_bos_desc, sizeof(usb3_bos_desc)); | ||
| 2039 | retval = sizeof(usb3_bos_desc); | ||
| 2040 | break; | ||
| 2041 | |||
| 2009 | case GetHubStatus: | 2042 | case GetHubStatus: |
| 2010 | *(__le32 *) buf = cpu_to_le32(0); | 2043 | *(__le32 *) buf = cpu_to_le32(0); |
| 2011 | break; | 2044 | break; |
| @@ -2503,10 +2536,8 @@ static int dummy_hcd_probe(struct platform_device *pdev) | |||
| 2503 | hs_hcd->has_tt = 1; | 2536 | hs_hcd->has_tt = 1; |
| 2504 | 2537 | ||
| 2505 | retval = usb_add_hcd(hs_hcd, 0, 0); | 2538 | retval = usb_add_hcd(hs_hcd, 0, 0); |
| 2506 | if (retval != 0) { | 2539 | if (retval) |
| 2507 | usb_put_hcd(hs_hcd); | 2540 | goto put_usb2_hcd; |
| 2508 | return retval; | ||
| 2509 | } | ||
| 2510 | 2541 | ||
| 2511 | if (mod_data.is_super_speed) { | 2542 | if (mod_data.is_super_speed) { |
| 2512 | ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev, | 2543 | ss_hcd = usb_create_shared_hcd(&dummy_hcd, &pdev->dev, |
| @@ -2525,6 +2556,8 @@ static int dummy_hcd_probe(struct platform_device *pdev) | |||
| 2525 | put_usb3_hcd: | 2556 | put_usb3_hcd: |
| 2526 | usb_put_hcd(ss_hcd); | 2557 | usb_put_hcd(ss_hcd); |
| 2527 | dealloc_usb2_hcd: | 2558 | dealloc_usb2_hcd: |
| 2559 | usb_remove_hcd(hs_hcd); | ||
| 2560 | put_usb2_hcd: | ||
| 2528 | usb_put_hcd(hs_hcd); | 2561 | usb_put_hcd(hs_hcd); |
| 2529 | the_controller.hs_hcd = the_controller.ss_hcd = NULL; | 2562 | the_controller.hs_hcd = the_controller.ss_hcd = NULL; |
| 2530 | return retval; | 2563 | return retval; |
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c index 8adc79d1b402..829aba75a6df 100644 --- a/drivers/usb/gadget/f_fs.c +++ b/drivers/usb/gadget/f_fs.c | |||
| @@ -34,11 +34,15 @@ | |||
| 34 | /* Debugging ****************************************************************/ | 34 | /* Debugging ****************************************************************/ |
| 35 | 35 | ||
| 36 | #ifdef VERBOSE_DEBUG | 36 | #ifdef VERBOSE_DEBUG |
| 37 | #ifndef pr_vdebug | ||
| 37 | # define pr_vdebug pr_debug | 38 | # define pr_vdebug pr_debug |
| 39 | #endif /* pr_vdebug */ | ||
| 38 | # define ffs_dump_mem(prefix, ptr, len) \ | 40 | # define ffs_dump_mem(prefix, ptr, len) \ |
| 39 | print_hex_dump_bytes(pr_fmt(prefix ": "), DUMP_PREFIX_NONE, ptr, len) | 41 | print_hex_dump_bytes(pr_fmt(prefix ": "), DUMP_PREFIX_NONE, ptr, len) |
| 40 | #else | 42 | #else |
| 43 | #ifndef pr_vdebug | ||
| 41 | # define pr_vdebug(...) do { } while (0) | 44 | # define pr_vdebug(...) do { } while (0) |
| 45 | #endif /* pr_vdebug */ | ||
| 42 | # define ffs_dump_mem(prefix, ptr, len) do { } while (0) | 46 | # define ffs_dump_mem(prefix, ptr, len) do { } while (0) |
| 43 | #endif /* VERBOSE_DEBUG */ | 47 | #endif /* VERBOSE_DEBUG */ |
| 44 | 48 | ||
diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index b13e0bb5f5b8..0bb617e1dda2 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c | |||
| @@ -3599,6 +3599,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
| 3599 | 3599 | ||
| 3600 | if (hsotg->num_of_eps == 0) { | 3600 | if (hsotg->num_of_eps == 0) { |
| 3601 | dev_err(dev, "wrong number of EPs (zero)\n"); | 3601 | dev_err(dev, "wrong number of EPs (zero)\n"); |
| 3602 | ret = -EINVAL; | ||
| 3602 | goto err_supplies; | 3603 | goto err_supplies; |
| 3603 | } | 3604 | } |
| 3604 | 3605 | ||
| @@ -3606,6 +3607,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
| 3606 | GFP_KERNEL); | 3607 | GFP_KERNEL); |
| 3607 | if (!eps) { | 3608 | if (!eps) { |
| 3608 | dev_err(dev, "cannot get memory\n"); | 3609 | dev_err(dev, "cannot get memory\n"); |
| 3610 | ret = -ENOMEM; | ||
| 3609 | goto err_supplies; | 3611 | goto err_supplies; |
| 3610 | } | 3612 | } |
| 3611 | 3613 | ||
| @@ -3622,6 +3624,7 @@ static int __devinit s3c_hsotg_probe(struct platform_device *pdev) | |||
| 3622 | GFP_KERNEL); | 3624 | GFP_KERNEL); |
| 3623 | if (!hsotg->ctrl_req) { | 3625 | if (!hsotg->ctrl_req) { |
| 3624 | dev_err(dev, "failed to allocate ctrl req\n"); | 3626 | dev_err(dev, "failed to allocate ctrl req\n"); |
| 3627 | ret = -ENOMEM; | ||
| 3625 | goto err_ep_mem; | 3628 | goto err_ep_mem; |
| 3626 | } | 3629 | } |
| 3627 | 3630 | ||
diff --git a/drivers/usb/gadget/u_serial.c b/drivers/usb/gadget/u_serial.c index 5b3f5fffea92..da6d479ff9a6 100644 --- a/drivers/usb/gadget/u_serial.c +++ b/drivers/usb/gadget/u_serial.c | |||
| @@ -132,11 +132,15 @@ static unsigned n_ports; | |||
| 132 | 132 | ||
| 133 | 133 | ||
| 134 | #ifdef VERBOSE_DEBUG | 134 | #ifdef VERBOSE_DEBUG |
| 135 | #ifndef pr_vdebug | ||
| 135 | #define pr_vdebug(fmt, arg...) \ | 136 | #define pr_vdebug(fmt, arg...) \ |
| 136 | pr_debug(fmt, ##arg) | 137 | pr_debug(fmt, ##arg) |
| 138 | #endif /* pr_vdebug */ | ||
| 137 | #else | 139 | #else |
| 140 | #ifndef pr_vdebig | ||
| 138 | #define pr_vdebug(fmt, arg...) \ | 141 | #define pr_vdebug(fmt, arg...) \ |
| 139 | ({ if (0) pr_debug(fmt, ##arg); }) | 142 | ({ if (0) pr_debug(fmt, ##arg); }) |
| 143 | #endif /* pr_vdebug */ | ||
| 140 | #endif | 144 | #endif |
| 141 | 145 | ||
| 142 | /*-------------------------------------------------------------------------*/ | 146 | /*-------------------------------------------------------------------------*/ |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 9bc39ca460c8..4b66374bdc8e 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
| @@ -128,9 +128,17 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh) | |||
| 128 | else { | 128 | else { |
| 129 | qtd = list_entry (qh->qtd_list.next, | 129 | qtd = list_entry (qh->qtd_list.next, |
| 130 | struct ehci_qtd, qtd_list); | 130 | struct ehci_qtd, qtd_list); |
| 131 | /* first qtd may already be partially processed */ | 131 | /* |
| 132 | if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) | 132 | * first qtd may already be partially processed. |
| 133 | * If we come here during unlink, the QH overlay region | ||
| 134 | * might have reference to the just unlinked qtd. The | ||
| 135 | * qtd is updated in qh_completions(). Update the QH | ||
| 136 | * overlay here. | ||
| 137 | */ | ||
| 138 | if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) { | ||
| 139 | qh->hw->hw_qtd_next = qtd->hw_next; | ||
| 133 | qtd = NULL; | 140 | qtd = NULL; |
| 141 | } | ||
| 134 | } | 142 | } |
| 135 | 143 | ||
| 136 | if (qtd) | 144 | if (qtd) |
diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c index a665b3eaa746..aaa8d2bce217 100644 --- a/drivers/usb/host/ohci-at91.c +++ b/drivers/usb/host/ohci-at91.c | |||
| @@ -570,6 +570,16 @@ static int __devinit ohci_hcd_at91_drv_probe(struct platform_device *pdev) | |||
| 570 | 570 | ||
| 571 | if (pdata) { | 571 | if (pdata) { |
| 572 | at91_for_each_port(i) { | 572 | at91_for_each_port(i) { |
| 573 | /* | ||
| 574 | * do not configure PIO if not in relation with | ||
| 575 | * real USB port on board | ||
| 576 | */ | ||
| 577 | if (i >= pdata->ports) { | ||
| 578 | pdata->vbus_pin[i] = -EINVAL; | ||
| 579 | pdata->overcurrent_pin[i] = -EINVAL; | ||
| 580 | break; | ||
| 581 | } | ||
| 582 | |||
| 573 | if (!gpio_is_valid(pdata->vbus_pin[i])) | 583 | if (!gpio_is_valid(pdata->vbus_pin[i])) |
| 574 | continue; | 584 | continue; |
| 575 | gpio = pdata->vbus_pin[i]; | 585 | gpio = pdata->vbus_pin[i]; |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index c5e9e4a76f14..966d1484ee79 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -75,7 +75,9 @@ | |||
| 75 | #define NB_PIF0_PWRDOWN_1 0x01100013 | 75 | #define NB_PIF0_PWRDOWN_1 0x01100013 |
| 76 | 76 | ||
| 77 | #define USB_INTEL_XUSB2PR 0xD0 | 77 | #define USB_INTEL_XUSB2PR 0xD0 |
| 78 | #define USB_INTEL_USB2PRM 0xD4 | ||
| 78 | #define USB_INTEL_USB3_PSSEN 0xD8 | 79 | #define USB_INTEL_USB3_PSSEN 0xD8 |
| 80 | #define USB_INTEL_USB3PRM 0xDC | ||
| 79 | 81 | ||
| 80 | static struct amd_chipset_info { | 82 | static struct amd_chipset_info { |
| 81 | struct pci_dev *nb_dev; | 83 | struct pci_dev *nb_dev; |
| @@ -772,10 +774,18 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) | |||
| 772 | return; | 774 | return; |
| 773 | } | 775 | } |
| 774 | 776 | ||
| 775 | ports_available = 0xffffffff; | 777 | /* Read USB3PRM, the USB 3.0 Port Routing Mask Register |
| 778 | * Indicate the ports that can be changed from OS. | ||
| 779 | */ | ||
| 780 | pci_read_config_dword(xhci_pdev, USB_INTEL_USB3PRM, | ||
| 781 | &ports_available); | ||
| 782 | |||
| 783 | dev_dbg(&xhci_pdev->dev, "Configurable ports to enable SuperSpeed: 0x%x\n", | ||
| 784 | ports_available); | ||
| 785 | |||
| 776 | /* Write USB3_PSSEN, the USB 3.0 Port SuperSpeed Enable | 786 | /* Write USB3_PSSEN, the USB 3.0 Port SuperSpeed Enable |
| 777 | * Register, to turn on SuperSpeed terminations for all | 787 | * Register, to turn on SuperSpeed terminations for the |
| 778 | * available ports. | 788 | * switchable ports. |
| 779 | */ | 789 | */ |
| 780 | pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSEN, | 790 | pci_write_config_dword(xhci_pdev, USB_INTEL_USB3_PSSEN, |
| 781 | cpu_to_le32(ports_available)); | 791 | cpu_to_le32(ports_available)); |
| @@ -785,7 +795,16 @@ void usb_enable_xhci_ports(struct pci_dev *xhci_pdev) | |||
| 785 | dev_dbg(&xhci_pdev->dev, "USB 3.0 ports that are now enabled " | 795 | dev_dbg(&xhci_pdev->dev, "USB 3.0 ports that are now enabled " |
| 786 | "under xHCI: 0x%x\n", ports_available); | 796 | "under xHCI: 0x%x\n", ports_available); |
| 787 | 797 | ||
| 788 | ports_available = 0xffffffff; | 798 | /* Read XUSB2PRM, xHCI USB 2.0 Port Routing Mask Register |
| 799 | * Indicate the USB 2.0 ports to be controlled by the xHCI host. | ||
| 800 | */ | ||
| 801 | |||
| 802 | pci_read_config_dword(xhci_pdev, USB_INTEL_USB2PRM, | ||
| 803 | &ports_available); | ||
| 804 | |||
| 805 | dev_dbg(&xhci_pdev->dev, "Configurable USB 2.0 ports to hand over to xCHI: 0x%x\n", | ||
| 806 | ports_available); | ||
| 807 | |||
| 789 | /* Write XUSB2PR, the xHC USB 2.0 Port Routing Register, to | 808 | /* Write XUSB2PR, the xHC USB 2.0 Port Routing Register, to |
| 790 | * switch the USB 2.0 power and data lines over to the xHCI | 809 | * switch the USB 2.0 power and data lines over to the xHCI |
| 791 | * host. | 810 | * host. |
| @@ -822,12 +841,12 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) | |||
| 822 | void __iomem *op_reg_base; | 841 | void __iomem *op_reg_base; |
| 823 | u32 val; | 842 | u32 val; |
| 824 | int timeout; | 843 | int timeout; |
| 844 | int len = pci_resource_len(pdev, 0); | ||
| 825 | 845 | ||
| 826 | if (!mmio_resource_enabled(pdev, 0)) | 846 | if (!mmio_resource_enabled(pdev, 0)) |
| 827 | return; | 847 | return; |
| 828 | 848 | ||
| 829 | base = ioremap_nocache(pci_resource_start(pdev, 0), | 849 | base = ioremap_nocache(pci_resource_start(pdev, 0), len); |
| 830 | pci_resource_len(pdev, 0)); | ||
| 831 | if (base == NULL) | 850 | if (base == NULL) |
| 832 | return; | 851 | return; |
| 833 | 852 | ||
| @@ -837,9 +856,17 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) | |||
| 837 | */ | 856 | */ |
| 838 | ext_cap_offset = xhci_find_next_cap_offset(base, XHCI_HCC_PARAMS_OFFSET); | 857 | ext_cap_offset = xhci_find_next_cap_offset(base, XHCI_HCC_PARAMS_OFFSET); |
| 839 | do { | 858 | do { |
| 859 | if ((ext_cap_offset + sizeof(val)) > len) { | ||
| 860 | /* We're reading garbage from the controller */ | ||
| 861 | dev_warn(&pdev->dev, | ||
| 862 | "xHCI controller failing to respond"); | ||
| 863 | return; | ||
| 864 | } | ||
| 865 | |||
| 840 | if (!ext_cap_offset) | 866 | if (!ext_cap_offset) |
| 841 | /* We've reached the end of the extended capabilities */ | 867 | /* We've reached the end of the extended capabilities */ |
| 842 | goto hc_init; | 868 | goto hc_init; |
| 869 | |||
| 843 | val = readl(base + ext_cap_offset); | 870 | val = readl(base + ext_cap_offset); |
| 844 | if (XHCI_EXT_CAPS_ID(val) == XHCI_EXT_CAPS_LEGACY) | 871 | if (XHCI_EXT_CAPS_ID(val) == XHCI_EXT_CAPS_LEGACY) |
| 845 | break; | 872 | break; |
| @@ -870,9 +897,10 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) | |||
| 870 | /* Disable any BIOS SMIs and clear all SMI events*/ | 897 | /* Disable any BIOS SMIs and clear all SMI events*/ |
| 871 | writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET); | 898 | writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET); |
| 872 | 899 | ||
| 900 | hc_init: | ||
| 873 | if (usb_is_intel_switchable_xhci(pdev)) | 901 | if (usb_is_intel_switchable_xhci(pdev)) |
| 874 | usb_enable_xhci_ports(pdev); | 902 | usb_enable_xhci_ports(pdev); |
| 875 | hc_init: | 903 | |
| 876 | op_reg_base = base + XHCI_HC_LENGTH(readl(base)); | 904 | op_reg_base = base + XHCI_HC_LENGTH(readl(base)); |
| 877 | 905 | ||
| 878 | /* Wait for the host controller to be ready before writing any | 906 | /* Wait for the host controller to be ready before writing any |
diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h index ef004a5de20f..7f69a39163ce 100644 --- a/drivers/usb/host/pci-quirks.h +++ b/drivers/usb/host/pci-quirks.h | |||
| @@ -15,6 +15,7 @@ void usb_disable_xhci_ports(struct pci_dev *xhci_pdev); | |||
| 15 | static inline void usb_amd_quirk_pll_disable(void) {} | 15 | static inline void usb_amd_quirk_pll_disable(void) {} |
| 16 | static inline void usb_amd_quirk_pll_enable(void) {} | 16 | static inline void usb_amd_quirk_pll_enable(void) {} |
| 17 | static inline void usb_amd_dev_put(void) {} | 17 | static inline void usb_amd_dev_put(void) {} |
| 18 | static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {} | ||
| 18 | #endif /* CONFIG_PCI */ | 19 | #endif /* CONFIG_PCI */ |
| 19 | 20 | ||
| 20 | #endif /* __LINUX_USB_PCI_QUIRKS_H */ | 21 | #endif /* __LINUX_USB_PCI_QUIRKS_H */ |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 74bfc868b7ad..d5eb357aa5c4 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
| @@ -493,11 +493,48 @@ static void xhci_hub_report_link_state(u32 *status, u32 status_reg) | |||
| 493 | * when this bit is set. | 493 | * when this bit is set. |
| 494 | */ | 494 | */ |
| 495 | pls |= USB_PORT_STAT_CONNECTION; | 495 | pls |= USB_PORT_STAT_CONNECTION; |
| 496 | } else { | ||
| 497 | /* | ||
| 498 | * If CAS bit isn't set but the Port is already at | ||
| 499 | * Compliance Mode, fake a connection so the USB core | ||
| 500 | * notices the Compliance state and resets the port. | ||
| 501 | * This resolves an issue generated by the SN65LVPE502CP | ||
| 502 | * in which sometimes the port enters compliance mode | ||
| 503 | * caused by a delay on the host-device negotiation. | ||
| 504 | */ | ||
| 505 | if (pls == USB_SS_PORT_LS_COMP_MOD) | ||
| 506 | pls |= USB_PORT_STAT_CONNECTION; | ||
| 496 | } | 507 | } |
| 508 | |||
| 497 | /* update status field */ | 509 | /* update status field */ |
| 498 | *status |= pls; | 510 | *status |= pls; |
| 499 | } | 511 | } |
| 500 | 512 | ||
| 513 | /* | ||
| 514 | * Function for Compliance Mode Quirk. | ||
| 515 | * | ||
| 516 | * This Function verifies if all xhc USB3 ports have entered U0, if so, | ||
| 517 | * the compliance mode timer is deleted. A port won't enter | ||
| 518 | * compliance mode if it has previously entered U0. | ||
| 519 | */ | ||
| 520 | void xhci_del_comp_mod_timer(struct xhci_hcd *xhci, u32 status, u16 wIndex) | ||
| 521 | { | ||
| 522 | u32 all_ports_seen_u0 = ((1 << xhci->num_usb3_ports)-1); | ||
| 523 | bool port_in_u0 = ((status & PORT_PLS_MASK) == XDEV_U0); | ||
| 524 | |||
| 525 | if (!(xhci->quirks & XHCI_COMP_MODE_QUIRK)) | ||
| 526 | return; | ||
| 527 | |||
| 528 | if ((xhci->port_status_u0 != all_ports_seen_u0) && port_in_u0) { | ||
| 529 | xhci->port_status_u0 |= 1 << wIndex; | ||
| 530 | if (xhci->port_status_u0 == all_ports_seen_u0) { | ||
| 531 | del_timer_sync(&xhci->comp_mode_recovery_timer); | ||
| 532 | xhci_dbg(xhci, "All USB3 ports have entered U0 already!\n"); | ||
| 533 | xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted.\n"); | ||
| 534 | } | ||
| 535 | } | ||
| 536 | } | ||
| 537 | |||
| 501 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | 538 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, |
| 502 | u16 wIndex, char *buf, u16 wLength) | 539 | u16 wIndex, char *buf, u16 wLength) |
| 503 | { | 540 | { |
| @@ -651,6 +688,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
| 651 | /* Update Port Link State for super speed ports*/ | 688 | /* Update Port Link State for super speed ports*/ |
| 652 | if (hcd->speed == HCD_USB3) { | 689 | if (hcd->speed == HCD_USB3) { |
| 653 | xhci_hub_report_link_state(&status, temp); | 690 | xhci_hub_report_link_state(&status, temp); |
| 691 | /* | ||
| 692 | * Verify if all USB3 Ports Have entered U0 already. | ||
| 693 | * Delete Compliance Mode Timer if so. | ||
| 694 | */ | ||
| 695 | xhci_del_comp_mod_timer(xhci, temp, wIndex); | ||
| 654 | } | 696 | } |
| 655 | if (bus_state->port_c_suspend & (1 << wIndex)) | 697 | if (bus_state->port_c_suspend & (1 << wIndex)) |
| 656 | status |= 1 << USB_PORT_FEAT_C_SUSPEND; | 698 | status |= 1 << USB_PORT_FEAT_C_SUSPEND; |
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 689bc18b051d..df90fe51b4aa 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c | |||
| @@ -118,7 +118,7 @@ static int xhci_plat_probe(struct platform_device *pdev) | |||
| 118 | goto put_hcd; | 118 | goto put_hcd; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len); | 121 | hcd->regs = ioremap_nocache(hcd->rsrc_start, hcd->rsrc_len); |
| 122 | if (!hcd->regs) { | 122 | if (!hcd->regs) { |
| 123 | dev_dbg(&pdev->dev, "error mapping memory\n"); | 123 | dev_dbg(&pdev->dev, "error mapping memory\n"); |
| 124 | ret = -EFAULT; | 124 | ret = -EFAULT; |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index c59d5b5b6c7d..6ece0ed288d4 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/module.h> | 26 | #include <linux/module.h> |
| 27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
| 28 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
| 29 | #include <linux/dmi.h> | ||
| 29 | 30 | ||
| 30 | #include "xhci.h" | 31 | #include "xhci.h" |
| 31 | 32 | ||
| @@ -398,6 +399,95 @@ static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) | |||
| 398 | 399 | ||
| 399 | #endif | 400 | #endif |
| 400 | 401 | ||
| 402 | static void compliance_mode_recovery(unsigned long arg) | ||
| 403 | { | ||
| 404 | struct xhci_hcd *xhci; | ||
| 405 | struct usb_hcd *hcd; | ||
| 406 | u32 temp; | ||
| 407 | int i; | ||
| 408 | |||
| 409 | xhci = (struct xhci_hcd *)arg; | ||
| 410 | |||
| 411 | for (i = 0; i < xhci->num_usb3_ports; i++) { | ||
| 412 | temp = xhci_readl(xhci, xhci->usb3_ports[i]); | ||
| 413 | if ((temp & PORT_PLS_MASK) == USB_SS_PORT_LS_COMP_MOD) { | ||
| 414 | /* | ||
| 415 | * Compliance Mode Detected. Letting USB Core | ||
| 416 | * handle the Warm Reset | ||
| 417 | */ | ||
| 418 | xhci_dbg(xhci, "Compliance Mode Detected->Port %d!\n", | ||
| 419 | i + 1); | ||
| 420 | xhci_dbg(xhci, "Attempting Recovery routine!\n"); | ||
| 421 | hcd = xhci->shared_hcd; | ||
| 422 | |||
| 423 | if (hcd->state == HC_STATE_SUSPENDED) | ||
| 424 | usb_hcd_resume_root_hub(hcd); | ||
| 425 | |||
| 426 | usb_hcd_poll_rh_status(hcd); | ||
| 427 | } | ||
| 428 | } | ||
| 429 | |||
| 430 | if (xhci->port_status_u0 != ((1 << xhci->num_usb3_ports)-1)) | ||
| 431 | mod_timer(&xhci->comp_mode_recovery_timer, | ||
| 432 | jiffies + msecs_to_jiffies(COMP_MODE_RCVRY_MSECS)); | ||
| 433 | } | ||
| 434 | |||
| 435 | /* | ||
| 436 | * Quirk to work around issue generated by the SN65LVPE502CP USB3.0 re-driver | ||
| 437 | * that causes ports behind that hardware to enter compliance mode sometimes. | ||
| 438 | * The quirk creates a timer that polls every 2 seconds the link state of | ||
| 439 | * each host controller's port and recovers it by issuing a Warm reset | ||
| 440 | * if Compliance mode is detected, otherwise the port will become "dead" (no | ||
| 441 | * device connections or disconnections will be detected anymore). Becasue no | ||
| 442 | * status event is generated when entering compliance mode (per xhci spec), | ||
| 443 | * this quirk is needed on systems that have the failing hardware installed. | ||
| 444 | */ | ||
| 445 | static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci) | ||
| 446 | { | ||
| 447 | xhci->port_status_u0 = 0; | ||
| 448 | init_timer(&xhci->comp_mode_recovery_timer); | ||
| 449 | |||
| 450 | xhci->comp_mode_recovery_timer.data = (unsigned long) xhci; | ||
| 451 | xhci->comp_mode_recovery_timer.function = compliance_mode_recovery; | ||
| 452 | xhci->comp_mode_recovery_timer.expires = jiffies + | ||
| 453 | msecs_to_jiffies(COMP_MODE_RCVRY_MSECS); | ||
| 454 | |||
| 455 | set_timer_slack(&xhci->comp_mode_recovery_timer, | ||
| 456 | msecs_to_jiffies(COMP_MODE_RCVRY_MSECS)); | ||
| 457 | add_timer(&xhci->comp_mode_recovery_timer); | ||
| 458 | xhci_dbg(xhci, "Compliance Mode Recovery Timer Initialized.\n"); | ||
| 459 | } | ||
| 460 | |||
| 461 | /* | ||
| 462 | * This function identifies the systems that have installed the SN65LVPE502CP | ||
| 463 | * USB3.0 re-driver and that need the Compliance Mode Quirk. | ||
| 464 | * Systems: | ||
| 465 | * Vendor: Hewlett-Packard -> System Models: Z420, Z620 and Z820 | ||
| 466 | */ | ||
| 467 | static bool compliance_mode_recovery_timer_quirk_check(void) | ||
| 468 | { | ||
| 469 | const char *dmi_product_name, *dmi_sys_vendor; | ||
| 470 | |||
| 471 | dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME); | ||
| 472 | dmi_sys_vendor = dmi_get_system_info(DMI_SYS_VENDOR); | ||
| 473 | |||
| 474 | if (!(strstr(dmi_sys_vendor, "Hewlett-Packard"))) | ||
| 475 | return false; | ||
| 476 | |||
| 477 | if (strstr(dmi_product_name, "Z420") || | ||
| 478 | strstr(dmi_product_name, "Z620") || | ||
| 479 | strstr(dmi_product_name, "Z820")) | ||
| 480 | return true; | ||
| 481 | |||
| 482 | return false; | ||
| 483 | } | ||
| 484 | |||
| 485 | static int xhci_all_ports_seen_u0(struct xhci_hcd *xhci) | ||
| 486 | { | ||
| 487 | return (xhci->port_status_u0 == ((1 << xhci->num_usb3_ports)-1)); | ||
| 488 | } | ||
| 489 | |||
| 490 | |||
| 401 | /* | 491 | /* |
| 402 | * Initialize memory for HCD and xHC (one-time init). | 492 | * Initialize memory for HCD and xHC (one-time init). |
| 403 | * | 493 | * |
| @@ -421,6 +511,12 @@ int xhci_init(struct usb_hcd *hcd) | |||
| 421 | retval = xhci_mem_init(xhci, GFP_KERNEL); | 511 | retval = xhci_mem_init(xhci, GFP_KERNEL); |
| 422 | xhci_dbg(xhci, "Finished xhci_init\n"); | 512 | xhci_dbg(xhci, "Finished xhci_init\n"); |
| 423 | 513 | ||
| 514 | /* Initializing Compliance Mode Recovery Data If Needed */ | ||
| 515 | if (compliance_mode_recovery_timer_quirk_check()) { | ||
| 516 | xhci->quirks |= XHCI_COMP_MODE_QUIRK; | ||
| 517 | compliance_mode_recovery_timer_init(xhci); | ||
| 518 | } | ||
| 519 | |||
| 424 | return retval; | 520 | return retval; |
| 425 | } | 521 | } |
| 426 | 522 | ||
| @@ -629,6 +725,11 @@ void xhci_stop(struct usb_hcd *hcd) | |||
| 629 | del_timer_sync(&xhci->event_ring_timer); | 725 | del_timer_sync(&xhci->event_ring_timer); |
| 630 | #endif | 726 | #endif |
| 631 | 727 | ||
| 728 | /* Deleting Compliance Mode Recovery Timer */ | ||
| 729 | if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && | ||
| 730 | (!(xhci_all_ports_seen_u0(xhci)))) | ||
| 731 | del_timer_sync(&xhci->comp_mode_recovery_timer); | ||
| 732 | |||
| 632 | if (xhci->quirks & XHCI_AMD_PLL_FIX) | 733 | if (xhci->quirks & XHCI_AMD_PLL_FIX) |
| 633 | usb_amd_dev_put(); | 734 | usb_amd_dev_put(); |
| 634 | 735 | ||
| @@ -659,7 +760,7 @@ void xhci_shutdown(struct usb_hcd *hcd) | |||
| 659 | { | 760 | { |
| 660 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 761 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 661 | 762 | ||
| 662 | if (xhci->quirks && XHCI_SPURIOUS_REBOOT) | 763 | if (xhci->quirks & XHCI_SPURIOUS_REBOOT) |
| 663 | usb_disable_xhci_ports(to_pci_dev(hcd->self.controller)); | 764 | usb_disable_xhci_ports(to_pci_dev(hcd->self.controller)); |
| 664 | 765 | ||
| 665 | spin_lock_irq(&xhci->lock); | 766 | spin_lock_irq(&xhci->lock); |
| @@ -806,6 +907,16 @@ int xhci_suspend(struct xhci_hcd *xhci) | |||
| 806 | } | 907 | } |
| 807 | spin_unlock_irq(&xhci->lock); | 908 | spin_unlock_irq(&xhci->lock); |
| 808 | 909 | ||
| 910 | /* | ||
| 911 | * Deleting Compliance Mode Recovery Timer because the xHCI Host | ||
| 912 | * is about to be suspended. | ||
| 913 | */ | ||
| 914 | if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && | ||
| 915 | (!(xhci_all_ports_seen_u0(xhci)))) { | ||
| 916 | del_timer_sync(&xhci->comp_mode_recovery_timer); | ||
| 917 | xhci_dbg(xhci, "Compliance Mode Recovery Timer Deleted!\n"); | ||
| 918 | } | ||
| 919 | |||
| 809 | /* step 5: remove core well power */ | 920 | /* step 5: remove core well power */ |
| 810 | /* synchronize irq when using MSI-X */ | 921 | /* synchronize irq when using MSI-X */ |
| 811 | xhci_msix_sync_irqs(xhci); | 922 | xhci_msix_sync_irqs(xhci); |
| @@ -938,6 +1049,16 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 938 | usb_hcd_resume_root_hub(hcd); | 1049 | usb_hcd_resume_root_hub(hcd); |
| 939 | usb_hcd_resume_root_hub(xhci->shared_hcd); | 1050 | usb_hcd_resume_root_hub(xhci->shared_hcd); |
| 940 | } | 1051 | } |
| 1052 | |||
| 1053 | /* | ||
| 1054 | * If system is subject to the Quirk, Compliance Mode Timer needs to | ||
| 1055 | * be re-initialized Always after a system resume. Ports are subject | ||
| 1056 | * to suffer the Compliance Mode issue again. It doesn't matter if | ||
| 1057 | * ports have entered previously to U0 before system's suspension. | ||
| 1058 | */ | ||
| 1059 | if (xhci->quirks & XHCI_COMP_MODE_QUIRK) | ||
| 1060 | compliance_mode_recovery_timer_init(xhci); | ||
| 1061 | |||
| 941 | return retval; | 1062 | return retval; |
| 942 | } | 1063 | } |
| 943 | #endif /* CONFIG_PM */ | 1064 | #endif /* CONFIG_PM */ |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index c713256297ac..1a05908c6673 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -1495,6 +1495,7 @@ struct xhci_hcd { | |||
| 1495 | #define XHCI_LPM_SUPPORT (1 << 11) | 1495 | #define XHCI_LPM_SUPPORT (1 << 11) |
| 1496 | #define XHCI_INTEL_HOST (1 << 12) | 1496 | #define XHCI_INTEL_HOST (1 << 12) |
| 1497 | #define XHCI_SPURIOUS_REBOOT (1 << 13) | 1497 | #define XHCI_SPURIOUS_REBOOT (1 << 13) |
| 1498 | #define XHCI_COMP_MODE_QUIRK (1 << 14) | ||
| 1498 | unsigned int num_active_eps; | 1499 | unsigned int num_active_eps; |
| 1499 | unsigned int limit_active_eps; | 1500 | unsigned int limit_active_eps; |
| 1500 | /* There are two roothubs to keep track of bus suspend info for */ | 1501 | /* There are two roothubs to keep track of bus suspend info for */ |
| @@ -1511,6 +1512,11 @@ struct xhci_hcd { | |||
| 1511 | unsigned sw_lpm_support:1; | 1512 | unsigned sw_lpm_support:1; |
| 1512 | /* support xHCI 1.0 spec USB2 hardware LPM */ | 1513 | /* support xHCI 1.0 spec USB2 hardware LPM */ |
| 1513 | unsigned hw_lpm_support:1; | 1514 | unsigned hw_lpm_support:1; |
| 1515 | /* Compliance Mode Recovery Data */ | ||
| 1516 | struct timer_list comp_mode_recovery_timer; | ||
| 1517 | u32 port_status_u0; | ||
| 1518 | /* Compliance Mode Timer Triggered every 2 seconds */ | ||
| 1519 | #define COMP_MODE_RCVRY_MSECS 2000 | ||
| 1514 | }; | 1520 | }; |
| 1515 | 1521 | ||
| 1516 | /* convert between an HCD pointer and the corresponding EHCI_HCD */ | 1522 | /* convert between an HCD pointer and the corresponding EHCI_HCD */ |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index 4bb717d0bd41..1ae378d5fc6f 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
| @@ -2049,7 +2049,7 @@ static int musb_urb_enqueue( | |||
| 2049 | * we only have work to do in the former case. | 2049 | * we only have work to do in the former case. |
| 2050 | */ | 2050 | */ |
| 2051 | spin_lock_irqsave(&musb->lock, flags); | 2051 | spin_lock_irqsave(&musb->lock, flags); |
| 2052 | if (hep->hcpriv) { | 2052 | if (hep->hcpriv || !next_urb(qh)) { |
| 2053 | /* some concurrent activity submitted another urb to hep... | 2053 | /* some concurrent activity submitted another urb to hep... |
| 2054 | * odd, rare, error prone, but legal. | 2054 | * odd, rare, error prone, but legal. |
| 2055 | */ | 2055 | */ |
diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c index 57a608584e16..c1be687e00ec 100644 --- a/drivers/usb/musb/musbhsdma.c +++ b/drivers/usb/musb/musbhsdma.c | |||
| @@ -388,7 +388,7 @@ dma_controller_create(struct musb *musb, void __iomem *base) | |||
| 388 | struct platform_device *pdev = to_platform_device(dev); | 388 | struct platform_device *pdev = to_platform_device(dev); |
| 389 | int irq = platform_get_irq_byname(pdev, "dma"); | 389 | int irq = platform_get_irq_byname(pdev, "dma"); |
| 390 | 390 | ||
| 391 | if (irq == 0) { | 391 | if (irq <= 0) { |
| 392 | dev_err(dev, "No DMA interrupt line!\n"); | 392 | dev_err(dev, "No DMA interrupt line!\n"); |
| 393 | return NULL; | 393 | return NULL; |
| 394 | } | 394 | } |
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 1a1bd9cf40c5..341625442377 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
| @@ -1215,7 +1215,7 @@ static int __devinit tusb_probe(struct platform_device *pdev) | |||
| 1215 | ret = platform_device_add(musb); | 1215 | ret = platform_device_add(musb); |
| 1216 | if (ret) { | 1216 | if (ret) { |
| 1217 | dev_err(&pdev->dev, "failed to register musb device\n"); | 1217 | dev_err(&pdev->dev, "failed to register musb device\n"); |
| 1218 | goto err1; | 1218 | goto err2; |
| 1219 | } | 1219 | } |
| 1220 | 1220 | ||
| 1221 | return 0; | 1221 | return 0; |
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index ecd173032fd4..143c4e9e1be4 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c | |||
| @@ -818,7 +818,7 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done) | |||
| 818 | usbhs_pipe_is_dcp(pipe)) | 818 | usbhs_pipe_is_dcp(pipe)) |
| 819 | goto usbhsf_pio_prepare_push; | 819 | goto usbhsf_pio_prepare_push; |
| 820 | 820 | ||
| 821 | if (len % 4) /* 32bit alignment */ | 821 | if (len & 0x7) /* 8byte alignment */ |
| 822 | goto usbhsf_pio_prepare_push; | 822 | goto usbhsf_pio_prepare_push; |
| 823 | 823 | ||
| 824 | if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */ | 824 | if ((uintptr_t)(pkt->buf + pkt->actual) & 0x7) /* 8byte alignment */ |
| @@ -905,7 +905,7 @@ static int usbhsf_dma_try_pop(struct usbhs_pkt *pkt, int *is_done) | |||
| 905 | /* use PIO if packet is less than pio_dma_border */ | 905 | /* use PIO if packet is less than pio_dma_border */ |
| 906 | len = usbhsf_fifo_rcv_len(priv, fifo); | 906 | len = usbhsf_fifo_rcv_len(priv, fifo); |
| 907 | len = min(pkt->length - pkt->actual, len); | 907 | len = min(pkt->length - pkt->actual, len); |
| 908 | if (len % 4) /* 32bit alignment */ | 908 | if (len & 0x7) /* 8byte alignment */ |
| 909 | goto usbhsf_pio_prepare_pop_unselect; | 909 | goto usbhsf_pio_prepare_pop_unselect; |
| 910 | 910 | ||
| 911 | if (len < usbhs_get_dparam(priv, pio_dma_border)) | 911 | if (len < usbhs_get_dparam(priv, pio_dma_border)) |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 5620db6469e5..f906b3aec217 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -704,6 +704,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 704 | { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, | 704 | { USB_DEVICE(FTDI_VID, FTDI_PCDJ_DAC2_PID) }, |
| 705 | { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, | 705 | { USB_DEVICE(FTDI_VID, FTDI_RRCIRKITS_LOCOBUFFER_PID) }, |
| 706 | { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, | 706 | { USB_DEVICE(FTDI_VID, FTDI_ASK_RDR400_PID) }, |
| 707 | { USB_DEVICE(FTDI_VID, FTDI_NZR_SEM_USB_PID) }, | ||
| 707 | { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) }, | 708 | { USB_DEVICE(ICOM_VID, ICOM_ID_1_PID) }, |
| 708 | { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) }, | 709 | { USB_DEVICE(ICOM_VID, ICOM_OPC_U_UC_PID) }, |
| 709 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) }, | 710 | { USB_DEVICE(ICOM_VID, ICOM_ID_RP2C1_PID) }, |
| @@ -804,13 +805,32 @@ static struct usb_device_id id_table_combined [] = { | |||
| 804 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 805 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
| 805 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), | 806 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), |
| 806 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 807 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
| 807 | { USB_DEVICE(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID) }, | 808 | { USB_DEVICE_AND_INTERFACE_INFO(MICROCHIP_VID, MICROCHIP_USB_BOARD_PID, |
| 809 | USB_CLASS_VENDOR_SPEC, | ||
| 810 | USB_SUBCLASS_VENDOR_SPEC, 0x00) }, | ||
| 808 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, | 811 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, |
| 809 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), | 812 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), |
| 810 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 813 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
| 811 | { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, | 814 | { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, |
| 812 | { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, | 815 | { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, |
| 816 | { USB_DEVICE(FTDI_VID, PI_C865_PID) }, | ||
| 817 | { USB_DEVICE(FTDI_VID, PI_C857_PID) }, | ||
| 818 | { USB_DEVICE(PI_VID, PI_C866_PID) }, | ||
| 819 | { USB_DEVICE(PI_VID, PI_C663_PID) }, | ||
| 820 | { USB_DEVICE(PI_VID, PI_C725_PID) }, | ||
| 821 | { USB_DEVICE(PI_VID, PI_E517_PID) }, | ||
| 822 | { USB_DEVICE(PI_VID, PI_C863_PID) }, | ||
| 813 | { USB_DEVICE(PI_VID, PI_E861_PID) }, | 823 | { USB_DEVICE(PI_VID, PI_E861_PID) }, |
| 824 | { USB_DEVICE(PI_VID, PI_C867_PID) }, | ||
| 825 | { USB_DEVICE(PI_VID, PI_E609_PID) }, | ||
| 826 | { USB_DEVICE(PI_VID, PI_E709_PID) }, | ||
| 827 | { USB_DEVICE(PI_VID, PI_100F_PID) }, | ||
| 828 | { USB_DEVICE(PI_VID, PI_1011_PID) }, | ||
| 829 | { USB_DEVICE(PI_VID, PI_1012_PID) }, | ||
| 830 | { USB_DEVICE(PI_VID, PI_1013_PID) }, | ||
| 831 | { USB_DEVICE(PI_VID, PI_1014_PID) }, | ||
| 832 | { USB_DEVICE(PI_VID, PI_1015_PID) }, | ||
| 833 | { USB_DEVICE(PI_VID, PI_1016_PID) }, | ||
| 814 | { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) }, | 834 | { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) }, |
| 815 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, | 835 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, |
| 816 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), | 836 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 5dd96ca6c380..41fe5826100c 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -75,6 +75,9 @@ | |||
| 75 | #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB | 75 | #define FTDI_OPENDCC_GATEWAY_PID 0xBFDB |
| 76 | #define FTDI_OPENDCC_GBM_PID 0xBFDC | 76 | #define FTDI_OPENDCC_GBM_PID 0xBFDC |
| 77 | 77 | ||
| 78 | /* NZR SEM 16+ USB (http://www.nzr.de) */ | ||
| 79 | #define FTDI_NZR_SEM_USB_PID 0xC1E0 /* NZR SEM-LOG16+ */ | ||
| 80 | |||
| 78 | /* | 81 | /* |
| 79 | * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com) | 82 | * RR-CirKits LocoBuffer USB (http://www.rr-cirkits.com) |
| 80 | */ | 83 | */ |
| @@ -539,7 +542,10 @@ | |||
| 539 | /* | 542 | /* |
| 540 | * Microchip Technology, Inc. | 543 | * Microchip Technology, Inc. |
| 541 | * | 544 | * |
| 542 | * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are also used by: | 545 | * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are |
| 546 | * used by single function CDC ACM class based firmware demo | ||
| 547 | * applications. The VID/PID has also been used in firmware | ||
| 548 | * emulating FTDI serial chips by: | ||
| 543 | * Hornby Elite - Digital Command Control Console | 549 | * Hornby Elite - Digital Command Control Console |
| 544 | * http://www.hornby.com/hornby-dcc/controllers/ | 550 | * http://www.hornby.com/hornby-dcc/controllers/ |
| 545 | */ | 551 | */ |
| @@ -791,8 +797,27 @@ | |||
| 791 | * Physik Instrumente | 797 | * Physik Instrumente |
| 792 | * http://www.physikinstrumente.com/en/products/ | 798 | * http://www.physikinstrumente.com/en/products/ |
| 793 | */ | 799 | */ |
| 800 | /* These two devices use the VID of FTDI */ | ||
| 801 | #define PI_C865_PID 0xe0a0 /* PI C-865 Piezomotor Controller */ | ||
| 802 | #define PI_C857_PID 0xe0a1 /* PI Encoder Trigger Box */ | ||
| 803 | |||
| 794 | #define PI_VID 0x1a72 /* Vendor ID */ | 804 | #define PI_VID 0x1a72 /* Vendor ID */ |
| 795 | #define PI_E861_PID 0x1008 /* E-861 piezo controller USB connection */ | 805 | #define PI_C866_PID 0x1000 /* PI C-866 Piezomotor Controller */ |
| 806 | #define PI_C663_PID 0x1001 /* PI C-663 Mercury-Step */ | ||
| 807 | #define PI_C725_PID 0x1002 /* PI C-725 Piezomotor Controller */ | ||
| 808 | #define PI_E517_PID 0x1005 /* PI E-517 Digital Piezo Controller Operation Module */ | ||
| 809 | #define PI_C863_PID 0x1007 /* PI C-863 */ | ||
| 810 | #define PI_E861_PID 0x1008 /* PI E-861 Piezomotor Controller */ | ||
| 811 | #define PI_C867_PID 0x1009 /* PI C-867 Piezomotor Controller */ | ||
| 812 | #define PI_E609_PID 0x100D /* PI E-609 Digital Piezo Controller */ | ||
| 813 | #define PI_E709_PID 0x100E /* PI E-709 Digital Piezo Controller */ | ||
| 814 | #define PI_100F_PID 0x100F /* PI Digital Piezo Controller */ | ||
| 815 | #define PI_1011_PID 0x1011 /* PI Digital Piezo Controller */ | ||
| 816 | #define PI_1012_PID 0x1012 /* PI Motion Controller */ | ||
| 817 | #define PI_1013_PID 0x1013 /* PI Motion Controller */ | ||
| 818 | #define PI_1014_PID 0x1014 /* PI Device */ | ||
| 819 | #define PI_1015_PID 0x1015 /* PI Device */ | ||
| 820 | #define PI_1016_PID 0x1016 /* PI Digital Servo Module */ | ||
| 796 | 821 | ||
| 797 | /* | 822 | /* |
| 798 | * Kondo Kagaku Co.Ltd. | 823 | * Kondo Kagaku Co.Ltd. |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index cc40f47ecea1..5ce88d1bc6f1 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -886,8 +886,6 @@ static const struct usb_device_id option_ids[] = { | |||
| 886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), | 886 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), |
| 887 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, | 887 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
| 888 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, | 888 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, |
| 889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff), | ||
| 890 | .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, | ||
| 891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, | 889 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, |
| 892 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, | 890 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, |
| 893 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, | 891 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, |
| @@ -1092,6 +1090,10 @@ static const struct usb_device_id option_ids[] = { | |||
| 1092 | .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, | 1090 | .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist }, |
| 1093 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), | 1091 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff), |
| 1094 | .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, | 1092 | .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist }, |
| 1093 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x01) }, | ||
| 1094 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x02, 0x05) }, | ||
| 1095 | { USB_VENDOR_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xff, 0x86, 0x10) }, | ||
| 1096 | |||
| 1095 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, | 1097 | { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, |
| 1096 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, | 1098 | { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, |
| 1097 | { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ | 1099 | { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */ |
diff --git a/drivers/video/auo_k190x.c b/drivers/video/auo_k190x.c index 77da6a2f43dc..c03ecdd31e4c 100644 --- a/drivers/video/auo_k190x.c +++ b/drivers/video/auo_k190x.c | |||
| @@ -987,7 +987,6 @@ err_regfb: | |||
| 987 | fb_dealloc_cmap(&info->cmap); | 987 | fb_dealloc_cmap(&info->cmap); |
| 988 | err_cmap: | 988 | err_cmap: |
| 989 | fb_deferred_io_cleanup(info); | 989 | fb_deferred_io_cleanup(info); |
| 990 | kfree(info->fbdefio); | ||
| 991 | err_defio: | 990 | err_defio: |
| 992 | vfree((void *)info->screen_base); | 991 | vfree((void *)info->screen_base); |
| 993 | err_irq: | 992 | err_irq: |
| @@ -1022,7 +1021,6 @@ int __devexit auok190x_common_remove(struct platform_device *pdev) | |||
| 1022 | fb_dealloc_cmap(&info->cmap); | 1021 | fb_dealloc_cmap(&info->cmap); |
| 1023 | 1022 | ||
| 1024 | fb_deferred_io_cleanup(info); | 1023 | fb_deferred_io_cleanup(info); |
| 1025 | kfree(info->fbdefio); | ||
| 1026 | 1024 | ||
| 1027 | vfree((void *)info->screen_base); | 1025 | vfree((void *)info->screen_base); |
| 1028 | 1026 | ||
diff --git a/drivers/video/console/bitblit.c b/drivers/video/console/bitblit.c index 28b1a834906b..61b182bf32a2 100644 --- a/drivers/video/console/bitblit.c +++ b/drivers/video/console/bitblit.c | |||
| @@ -162,7 +162,7 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info, | |||
| 162 | image.depth = 1; | 162 | image.depth = 1; |
| 163 | 163 | ||
| 164 | if (attribute) { | 164 | if (attribute) { |
| 165 | buf = kmalloc(cellsize, GFP_KERNEL); | 165 | buf = kmalloc(cellsize, GFP_ATOMIC); |
| 166 | if (!buf) | 166 | if (!buf) |
| 167 | return; | 167 | return; |
| 168 | } | 168 | } |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index 88e92041d8f0..fdefa8fd72c4 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
| @@ -449,7 +449,7 @@ static int __init fb_console_setup(char *this_opt) | |||
| 449 | 449 | ||
| 450 | while ((options = strsep(&this_opt, ",")) != NULL) { | 450 | while ((options = strsep(&this_opt, ",")) != NULL) { |
| 451 | if (!strncmp(options, "font:", 5)) | 451 | if (!strncmp(options, "font:", 5)) |
| 452 | strcpy(fontname, options + 5); | 452 | strlcpy(fontname, options + 5, sizeof(fontname)); |
| 453 | 453 | ||
| 454 | if (!strncmp(options, "scrollback:", 11)) { | 454 | if (!strncmp(options, "scrollback:", 11)) { |
| 455 | options += 11; | 455 | options += 11; |
diff --git a/drivers/video/mb862xx/mb862xxfbdrv.c b/drivers/video/mb862xx/mb862xxfbdrv.c index 00ce1f34b496..57d940be5f3d 100644 --- a/drivers/video/mb862xx/mb862xxfbdrv.c +++ b/drivers/video/mb862xx/mb862xxfbdrv.c | |||
| @@ -328,6 +328,8 @@ static int mb862xxfb_ioctl(struct fb_info *fbi, unsigned int cmd, | |||
| 328 | case MB862XX_L1_SET_CFG: | 328 | case MB862XX_L1_SET_CFG: |
| 329 | if (copy_from_user(l1_cfg, argp, sizeof(*l1_cfg))) | 329 | if (copy_from_user(l1_cfg, argp, sizeof(*l1_cfg))) |
| 330 | return -EFAULT; | 330 | return -EFAULT; |
| 331 | if (l1_cfg->dh == 0 || l1_cfg->dw == 0) | ||
| 332 | return -EINVAL; | ||
| 331 | if ((l1_cfg->sw >= l1_cfg->dw) && (l1_cfg->sh >= l1_cfg->dh)) { | 333 | if ((l1_cfg->sw >= l1_cfg->dw) && (l1_cfg->sh >= l1_cfg->dh)) { |
| 332 | /* downscaling */ | 334 | /* downscaling */ |
| 333 | outreg(cap, GC_CAP_CSC, | 335 | outreg(cap, GC_CAP_CSC, |
diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c index 5d31699fbd3c..f43bfe17b3b6 100644 --- a/drivers/video/omap2/dss/sdi.c +++ b/drivers/video/omap2/dss/sdi.c | |||
| @@ -105,6 +105,20 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) | |||
| 105 | 105 | ||
| 106 | sdi_config_lcd_manager(dssdev); | 106 | sdi_config_lcd_manager(dssdev); |
| 107 | 107 | ||
| 108 | /* | ||
| 109 | * LCLK and PCLK divisors are located in shadow registers, and we | ||
| 110 | * normally write them to DISPC registers when enabling the output. | ||
| 111 | * However, SDI uses pck-free as source clock for its PLL, and pck-free | ||
| 112 | * is affected by the divisors. And as we need the PLL before enabling | ||
| 113 | * the output, we need to write the divisors early. | ||
| 114 | * | ||
| 115 | * It seems just writing to the DISPC register is enough, and we don't | ||
| 116 | * need to care about the shadow register mechanism for pck-free. The | ||
| 117 | * exact reason for this is unknown. | ||
| 118 | */ | ||
| 119 | dispc_mgr_set_clock_div(dssdev->manager->id, | ||
| 120 | &sdi.mgr_config.clock_info); | ||
| 121 | |||
| 108 | dss_sdi_init(dssdev->phy.sdi.datapairs); | 122 | dss_sdi_init(dssdev->phy.sdi.datapairs); |
| 109 | r = dss_sdi_enable(); | 123 | r = dss_sdi_enable(); |
| 110 | if (r) | 124 | if (r) |
diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c index 08ec1a7103f2..fc671d3d8004 100644 --- a/drivers/video/omap2/omapfb/omapfb-main.c +++ b/drivers/video/omap2/omapfb/omapfb-main.c | |||
| @@ -1192,7 +1192,7 @@ static int _setcolreg(struct fb_info *fbi, u_int regno, u_int red, u_int green, | |||
| 1192 | break; | 1192 | break; |
| 1193 | 1193 | ||
| 1194 | if (regno < 16) { | 1194 | if (regno < 16) { |
| 1195 | u16 pal; | 1195 | u32 pal; |
| 1196 | pal = ((red >> (16 - var->red.length)) << | 1196 | pal = ((red >> (16 - var->red.length)) << |
| 1197 | var->red.offset) | | 1197 | var->red.offset) | |
| 1198 | ((green >> (16 - var->green.length)) << | 1198 | ((green >> (16 - var->green.length)) << |
diff --git a/drivers/watchdog/booke_wdt.c b/drivers/watchdog/booke_wdt.c index 3fe82d0e8caa..5b06d31ab6a9 100644 --- a/drivers/watchdog/booke_wdt.c +++ b/drivers/watchdog/booke_wdt.c | |||
| @@ -166,18 +166,17 @@ static long booke_wdt_ioctl(struct file *file, | |||
| 166 | 166 | ||
| 167 | switch (cmd) { | 167 | switch (cmd) { |
| 168 | case WDIOC_GETSUPPORT: | 168 | case WDIOC_GETSUPPORT: |
| 169 | if (copy_to_user((void *)arg, &ident, sizeof(ident))) | 169 | return copy_to_user(p, &ident, sizeof(ident)) ? -EFAULT : 0; |
| 170 | return -EFAULT; | ||
| 171 | case WDIOC_GETSTATUS: | 170 | case WDIOC_GETSTATUS: |
| 172 | return put_user(0, p); | 171 | return put_user(0, p); |
| 173 | case WDIOC_GETBOOTSTATUS: | 172 | case WDIOC_GETBOOTSTATUS: |
| 174 | /* XXX: something is clearing TSR */ | 173 | /* XXX: something is clearing TSR */ |
| 175 | tmp = mfspr(SPRN_TSR) & TSR_WRS(3); | 174 | tmp = mfspr(SPRN_TSR) & TSR_WRS(3); |
| 176 | /* returns CARDRESET if last reset was caused by the WDT */ | 175 | /* returns CARDRESET if last reset was caused by the WDT */ |
| 177 | return (tmp ? WDIOF_CARDRESET : 0); | 176 | return put_user((tmp ? WDIOF_CARDRESET : 0), p); |
| 178 | case WDIOC_SETOPTIONS: | 177 | case WDIOC_SETOPTIONS: |
| 179 | if (get_user(tmp, p)) | 178 | if (get_user(tmp, p)) |
| 180 | return -EINVAL; | 179 | return -EFAULT; |
| 181 | if (tmp == WDIOS_ENABLECARD) { | 180 | if (tmp == WDIOS_ENABLECARD) { |
| 182 | booke_wdt_ping(); | 181 | booke_wdt_ping(); |
| 183 | break; | 182 | break; |
diff --git a/drivers/watchdog/da9052_wdt.c b/drivers/watchdog/da9052_wdt.c index 3f75129eb0a9..f7abbaeebcaf 100644 --- a/drivers/watchdog/da9052_wdt.c +++ b/drivers/watchdog/da9052_wdt.c | |||
| @@ -21,7 +21,6 @@ | |||
| 21 | #include <linux/types.h> | 21 | #include <linux/types.h> |
| 22 | #include <linux/kernel.h> | 22 | #include <linux/kernel.h> |
| 23 | #include <linux/jiffies.h> | 23 | #include <linux/jiffies.h> |
| 24 | #include <linux/delay.h> | ||
| 25 | 24 | ||
| 26 | #include <linux/mfd/da9052/reg.h> | 25 | #include <linux/mfd/da9052/reg.h> |
| 27 | #include <linux/mfd/da9052/da9052.h> | 26 | #include <linux/mfd/da9052/da9052.h> |
diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c index 1eff743ec497..ae60406ea8a1 100644 --- a/drivers/watchdog/hpwdt.c +++ b/drivers/watchdog/hpwdt.c | |||
| @@ -814,6 +814,9 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev, | |||
| 814 | hpwdt_timer_reg = pci_mem_addr + 0x70; | 814 | hpwdt_timer_reg = pci_mem_addr + 0x70; |
| 815 | hpwdt_timer_con = pci_mem_addr + 0x72; | 815 | hpwdt_timer_con = pci_mem_addr + 0x72; |
| 816 | 816 | ||
| 817 | /* Make sure that timer is disabled until /dev/watchdog is opened */ | ||
| 818 | hpwdt_stop(); | ||
| 819 | |||
| 817 | /* Make sure that we have a valid soft_margin */ | 820 | /* Make sure that we have a valid soft_margin */ |
| 818 | if (hpwdt_change_timer(soft_margin)) | 821 | if (hpwdt_change_timer(soft_margin)) |
| 819 | hpwdt_change_timer(DEFAULT_MARGIN); | 822 | hpwdt_change_timer(DEFAULT_MARGIN); |
diff --git a/drivers/watchdog/watchdog_core.c b/drivers/watchdog/watchdog_core.c index 6aa46a90ff02..3796434991fa 100644 --- a/drivers/watchdog/watchdog_core.c +++ b/drivers/watchdog/watchdog_core.c | |||
| @@ -128,11 +128,12 @@ EXPORT_SYMBOL_GPL(watchdog_register_device); | |||
| 128 | void watchdog_unregister_device(struct watchdog_device *wdd) | 128 | void watchdog_unregister_device(struct watchdog_device *wdd) |
| 129 | { | 129 | { |
| 130 | int ret; | 130 | int ret; |
| 131 | int devno = wdd->cdev.dev; | 131 | int devno; |
| 132 | 132 | ||
| 133 | if (wdd == NULL) | 133 | if (wdd == NULL) |
| 134 | return; | 134 | return; |
| 135 | 135 | ||
| 136 | devno = wdd->cdev.dev; | ||
| 136 | ret = watchdog_dev_unregister(wdd); | 137 | ret = watchdog_dev_unregister(wdd); |
| 137 | if (ret) | 138 | if (ret) |
| 138 | pr_err("error unregistering /dev/watchdog (err=%d)\n", ret); | 139 | pr_err("error unregistering /dev/watchdog (err=%d)\n", ret); |
diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index 1ffd03bf8e10..7f1241608489 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c | |||
| @@ -314,8 +314,9 @@ static int __unmap_grant_pages(struct grant_map *map, int offset, int pages) | |||
| 314 | } | 314 | } |
| 315 | } | 315 | } |
| 316 | 316 | ||
| 317 | err = gnttab_unmap_refs(map->unmap_ops + offset, map->pages + offset, | 317 | err = gnttab_unmap_refs(map->unmap_ops + offset, |
| 318 | pages, true); | 318 | use_ptemod ? map->kmap_ops + offset : NULL, map->pages + offset, |
| 319 | pages); | ||
| 319 | if (err) | 320 | if (err) |
| 320 | return err; | 321 | return err; |
| 321 | 322 | ||
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index 0bfc1ef11259..006726688baf 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c | |||
| @@ -870,7 +870,8 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, | |||
| 870 | EXPORT_SYMBOL_GPL(gnttab_map_refs); | 870 | EXPORT_SYMBOL_GPL(gnttab_map_refs); |
| 871 | 871 | ||
| 872 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | 872 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, |
| 873 | struct page **pages, unsigned int count, bool clear_pte) | 873 | struct gnttab_map_grant_ref *kmap_ops, |
| 874 | struct page **pages, unsigned int count) | ||
| 874 | { | 875 | { |
| 875 | int i, ret; | 876 | int i, ret; |
| 876 | bool lazy = false; | 877 | bool lazy = false; |
| @@ -888,7 +889,8 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | |||
| 888 | } | 889 | } |
| 889 | 890 | ||
| 890 | for (i = 0; i < count; i++) { | 891 | for (i = 0; i < count; i++) { |
| 891 | ret = m2p_remove_override(pages[i], clear_pte); | 892 | ret = m2p_remove_override(pages[i], kmap_ops ? |
| 893 | &kmap_ops[i] : NULL); | ||
| 892 | if (ret) | 894 | if (ret) |
| 893 | return ret; | 895 | return ret; |
| 894 | } | 896 | } |
diff --git a/drivers/xen/platform-pci.c b/drivers/xen/platform-pci.c index d4c50d63acbc..97ca359ae2bd 100644 --- a/drivers/xen/platform-pci.c +++ b/drivers/xen/platform-pci.c | |||
| @@ -101,19 +101,6 @@ static int platform_pci_resume(struct pci_dev *pdev) | |||
| 101 | return 0; | 101 | return 0; |
| 102 | } | 102 | } |
| 103 | 103 | ||
| 104 | static void __devinit prepare_shared_info(void) | ||
| 105 | { | ||
| 106 | #ifdef CONFIG_KEXEC | ||
| 107 | unsigned long addr; | ||
| 108 | struct shared_info *hvm_shared_info; | ||
| 109 | |||
| 110 | addr = alloc_xen_mmio(PAGE_SIZE); | ||
| 111 | hvm_shared_info = ioremap(addr, PAGE_SIZE); | ||
| 112 | memset(hvm_shared_info, 0, PAGE_SIZE); | ||
| 113 | xen_hvm_prepare_kexec(hvm_shared_info, addr >> PAGE_SHIFT); | ||
| 114 | #endif | ||
| 115 | } | ||
| 116 | |||
| 117 | static int __devinit platform_pci_init(struct pci_dev *pdev, | 104 | static int __devinit platform_pci_init(struct pci_dev *pdev, |
| 118 | const struct pci_device_id *ent) | 105 | const struct pci_device_id *ent) |
| 119 | { | 106 | { |
| @@ -151,8 +138,6 @@ static int __devinit platform_pci_init(struct pci_dev *pdev, | |||
| 151 | platform_mmio = mmio_addr; | 138 | platform_mmio = mmio_addr; |
| 152 | platform_mmiolen = mmio_len; | 139 | platform_mmiolen = mmio_len; |
| 153 | 140 | ||
| 154 | prepare_shared_info(); | ||
| 155 | |||
| 156 | if (!xen_have_vector_callback) { | 141 | if (!xen_have_vector_callback) { |
| 157 | ret = xen_allocate_irq(pdev); | 142 | ret = xen_allocate_irq(pdev); |
| 158 | if (ret) { | 143 | if (ret) { |
diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c index 1afb4fba11b4..4d519488d304 100644 --- a/drivers/xen/swiotlb-xen.c +++ b/drivers/xen/swiotlb-xen.c | |||
| @@ -232,7 +232,7 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size, | |||
| 232 | return ret; | 232 | return ret; |
| 233 | 233 | ||
| 234 | if (hwdev && hwdev->coherent_dma_mask) | 234 | if (hwdev && hwdev->coherent_dma_mask) |
| 235 | dma_mask = hwdev->coherent_dma_mask; | 235 | dma_mask = dma_alloc_coherent_mask(hwdev, flags); |
| 236 | 236 | ||
| 237 | phys = virt_to_phys(ret); | 237 | phys = virt_to_phys(ret); |
| 238 | dev_addr = xen_phys_to_bus(phys); | 238 | dev_addr = xen_phys_to_bus(phys); |
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c index 097e536e8672..03342728bf23 100644 --- a/drivers/xen/xen-pciback/pci_stub.c +++ b/drivers/xen/xen-pciback/pci_stub.c | |||
| @@ -353,16 +353,16 @@ static int __devinit pcistub_init_device(struct pci_dev *dev) | |||
| 353 | if (err) | 353 | if (err) |
| 354 | goto config_release; | 354 | goto config_release; |
| 355 | 355 | ||
| 356 | dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n"); | ||
| 357 | __pci_reset_function_locked(dev); | ||
| 358 | |||
| 359 | /* We need the device active to save the state. */ | 356 | /* We need the device active to save the state. */ |
| 360 | dev_dbg(&dev->dev, "save state of device\n"); | 357 | dev_dbg(&dev->dev, "save state of device\n"); |
| 361 | pci_save_state(dev); | 358 | pci_save_state(dev); |
| 362 | dev_data->pci_saved_state = pci_store_saved_state(dev); | 359 | dev_data->pci_saved_state = pci_store_saved_state(dev); |
| 363 | if (!dev_data->pci_saved_state) | 360 | if (!dev_data->pci_saved_state) |
| 364 | dev_err(&dev->dev, "Could not store PCI conf saved state!\n"); | 361 | dev_err(&dev->dev, "Could not store PCI conf saved state!\n"); |
| 365 | 362 | else { | |
| 363 | dev_dbg(&dev->dev, "reseting (FLR, D3, etc) the device\n"); | ||
| 364 | __pci_reset_function_locked(dev); | ||
| 365 | } | ||
| 366 | /* Now disable the device (this also ensures some private device | 366 | /* Now disable the device (this also ensures some private device |
| 367 | * data is setup before we export) | 367 | * data is setup before we export) |
| 368 | */ | 368 | */ |
| @@ -73,7 +73,7 @@ static struct kmem_cache *bio_find_or_create_slab(unsigned int extra_size) | |||
| 73 | { | 73 | { |
| 74 | unsigned int sz = sizeof(struct bio) + extra_size; | 74 | unsigned int sz = sizeof(struct bio) + extra_size; |
| 75 | struct kmem_cache *slab = NULL; | 75 | struct kmem_cache *slab = NULL; |
| 76 | struct bio_slab *bslab; | 76 | struct bio_slab *bslab, *new_bio_slabs; |
| 77 | unsigned int i, entry = -1; | 77 | unsigned int i, entry = -1; |
| 78 | 78 | ||
| 79 | mutex_lock(&bio_slab_lock); | 79 | mutex_lock(&bio_slab_lock); |
| @@ -97,11 +97,12 @@ static struct kmem_cache *bio_find_or_create_slab(unsigned int extra_size) | |||
| 97 | 97 | ||
| 98 | if (bio_slab_nr == bio_slab_max && entry == -1) { | 98 | if (bio_slab_nr == bio_slab_max && entry == -1) { |
| 99 | bio_slab_max <<= 1; | 99 | bio_slab_max <<= 1; |
| 100 | bio_slabs = krealloc(bio_slabs, | 100 | new_bio_slabs = krealloc(bio_slabs, |
| 101 | bio_slab_max * sizeof(struct bio_slab), | 101 | bio_slab_max * sizeof(struct bio_slab), |
| 102 | GFP_KERNEL); | 102 | GFP_KERNEL); |
| 103 | if (!bio_slabs) | 103 | if (!new_bio_slabs) |
| 104 | goto out_unlock; | 104 | goto out_unlock; |
| 105 | bio_slabs = new_bio_slabs; | ||
| 105 | } | 106 | } |
| 106 | if (entry == -1) | 107 | if (entry == -1) |
| 107 | entry = bio_slab_nr++; | 108 | entry = bio_slab_nr++; |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 1e519195d45b..38e721b35d45 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
| @@ -1578,10 +1578,12 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 1578 | unsigned long nr_segs, loff_t pos) | 1578 | unsigned long nr_segs, loff_t pos) |
| 1579 | { | 1579 | { |
| 1580 | struct file *file = iocb->ki_filp; | 1580 | struct file *file = iocb->ki_filp; |
| 1581 | struct blk_plug plug; | ||
| 1581 | ssize_t ret; | 1582 | ssize_t ret; |
| 1582 | 1583 | ||
| 1583 | BUG_ON(iocb->ki_pos != pos); | 1584 | BUG_ON(iocb->ki_pos != pos); |
| 1584 | 1585 | ||
| 1586 | blk_start_plug(&plug); | ||
| 1585 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); | 1587 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 1586 | if (ret > 0 || ret == -EIOCBQUEUED) { | 1588 | if (ret > 0 || ret == -EIOCBQUEUED) { |
| 1587 | ssize_t err; | 1589 | ssize_t err; |
| @@ -1590,6 +1592,7 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 1590 | if (err < 0 && ret > 0) | 1592 | if (err < 0 && ret > 0) |
| 1591 | ret = err; | 1593 | ret = err; |
| 1592 | } | 1594 | } |
| 1595 | blk_finish_plug(&plug); | ||
| 1593 | return ret; | 1596 | return ret; |
| 1594 | } | 1597 | } |
| 1595 | EXPORT_SYMBOL_GPL(blkdev_aio_write); | 1598 | EXPORT_SYMBOL_GPL(blkdev_aio_write); |
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index a256f3b2a845..ff6475f409d6 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
| @@ -1438,10 +1438,10 @@ int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info, | |||
| 1438 | ret = extent_from_logical(fs_info, logical, path, | 1438 | ret = extent_from_logical(fs_info, logical, path, |
| 1439 | &found_key); | 1439 | &found_key); |
| 1440 | btrfs_release_path(path); | 1440 | btrfs_release_path(path); |
| 1441 | if (ret & BTRFS_EXTENT_FLAG_TREE_BLOCK) | ||
| 1442 | ret = -EINVAL; | ||
| 1443 | if (ret < 0) | 1441 | if (ret < 0) |
| 1444 | return ret; | 1442 | return ret; |
| 1443 | if (ret & BTRFS_EXTENT_FLAG_TREE_BLOCK) | ||
| 1444 | return -EINVAL; | ||
| 1445 | 1445 | ||
| 1446 | extent_item_pos = logical - found_key.objectid; | 1446 | extent_item_pos = logical - found_key.objectid; |
| 1447 | ret = iterate_extent_inodes(fs_info, found_key.objectid, | 1447 | ret = iterate_extent_inodes(fs_info, found_key.objectid, |
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 86eff48dab78..43d1c5a3a030 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c | |||
| @@ -818,6 +818,7 @@ static void free_workspace(int type, struct list_head *workspace) | |||
| 818 | btrfs_compress_op[idx]->free_workspace(workspace); | 818 | btrfs_compress_op[idx]->free_workspace(workspace); |
| 819 | atomic_dec(alloc_workspace); | 819 | atomic_dec(alloc_workspace); |
| 820 | wake: | 820 | wake: |
| 821 | smp_mb(); | ||
| 821 | if (waitqueue_active(workspace_wait)) | 822 | if (waitqueue_active(workspace_wait)) |
| 822 | wake_up(workspace_wait); | 823 | wake_up(workspace_wait); |
| 823 | } | 824 | } |
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 9d7621f271ff..6d183f60d63a 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
| @@ -421,12 +421,6 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, | |||
| 421 | spin_unlock(&fs_info->tree_mod_seq_lock); | 421 | spin_unlock(&fs_info->tree_mod_seq_lock); |
| 422 | 422 | ||
| 423 | /* | 423 | /* |
| 424 | * we removed the lowest blocker from the blocker list, so there may be | ||
| 425 | * more processible delayed refs. | ||
| 426 | */ | ||
| 427 | wake_up(&fs_info->tree_mod_seq_wait); | ||
| 428 | |||
| 429 | /* | ||
| 430 | * anything that's lower than the lowest existing (read: blocked) | 424 | * anything that's lower than the lowest existing (read: blocked) |
| 431 | * sequence number can be removed from the tree. | 425 | * sequence number can be removed from the tree. |
| 432 | */ | 426 | */ |
| @@ -631,6 +625,9 @@ __tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb) | |||
| 631 | u32 nritems; | 625 | u32 nritems; |
| 632 | int ret; | 626 | int ret; |
| 633 | 627 | ||
| 628 | if (btrfs_header_level(eb) == 0) | ||
| 629 | return; | ||
| 630 | |||
| 634 | nritems = btrfs_header_nritems(eb); | 631 | nritems = btrfs_header_nritems(eb); |
| 635 | for (i = nritems - 1; i >= 0; i--) { | 632 | for (i = nritems - 1; i >= 0; i--) { |
| 636 | ret = tree_mod_log_insert_key_locked(fs_info, eb, i, | 633 | ret = tree_mod_log_insert_key_locked(fs_info, eb, i, |
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 4bab807227ad..0d195b507660 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -1252,7 +1252,6 @@ struct btrfs_fs_info { | |||
| 1252 | atomic_t tree_mod_seq; | 1252 | atomic_t tree_mod_seq; |
| 1253 | struct list_head tree_mod_seq_list; | 1253 | struct list_head tree_mod_seq_list; |
| 1254 | struct seq_list tree_mod_seq_elem; | 1254 | struct seq_list tree_mod_seq_elem; |
| 1255 | wait_queue_head_t tree_mod_seq_wait; | ||
| 1256 | 1255 | ||
| 1257 | /* this protects tree_mod_log */ | 1256 | /* this protects tree_mod_log */ |
| 1258 | rwlock_t tree_mod_log_lock; | 1257 | rwlock_t tree_mod_log_lock; |
| @@ -3192,7 +3191,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | |||
| 3192 | int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode, | 3191 | int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode, |
| 3193 | struct bio *bio, u32 *dst); | 3192 | struct bio *bio, u32 *dst); |
| 3194 | int btrfs_lookup_bio_sums_dio(struct btrfs_root *root, struct inode *inode, | 3193 | int btrfs_lookup_bio_sums_dio(struct btrfs_root *root, struct inode *inode, |
| 3195 | struct bio *bio, u64 logical_offset, u32 *dst); | 3194 | struct bio *bio, u64 logical_offset); |
| 3196 | int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, | 3195 | int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, |
| 3197 | struct btrfs_root *root, | 3196 | struct btrfs_root *root, |
| 3198 | u64 objectid, u64 pos, | 3197 | u64 objectid, u64 pos, |
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c index 335605c8ceab..07d5eeb1e6f1 100644 --- a/fs/btrfs/delayed-inode.c +++ b/fs/btrfs/delayed-inode.c | |||
| @@ -512,8 +512,8 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item) | |||
| 512 | 512 | ||
| 513 | rb_erase(&delayed_item->rb_node, root); | 513 | rb_erase(&delayed_item->rb_node, root); |
| 514 | delayed_item->delayed_node->count--; | 514 | delayed_item->delayed_node->count--; |
| 515 | atomic_dec(&delayed_root->items); | 515 | if (atomic_dec_return(&delayed_root->items) < |
| 516 | if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND && | 516 | BTRFS_DELAYED_BACKGROUND && |
| 517 | waitqueue_active(&delayed_root->wait)) | 517 | waitqueue_active(&delayed_root->wait)) |
| 518 | wake_up(&delayed_root->wait); | 518 | wake_up(&delayed_root->wait); |
| 519 | } | 519 | } |
| @@ -1028,9 +1028,10 @@ do_again: | |||
| 1028 | btrfs_release_delayed_item(prev); | 1028 | btrfs_release_delayed_item(prev); |
| 1029 | ret = 0; | 1029 | ret = 0; |
| 1030 | btrfs_release_path(path); | 1030 | btrfs_release_path(path); |
| 1031 | if (curr) | 1031 | if (curr) { |
| 1032 | mutex_unlock(&node->mutex); | ||
| 1032 | goto do_again; | 1033 | goto do_again; |
| 1033 | else | 1034 | } else |
| 1034 | goto delete_fail; | 1035 | goto delete_fail; |
| 1035 | } | 1036 | } |
| 1036 | 1037 | ||
| @@ -1055,8 +1056,7 @@ static void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node) | |||
| 1055 | delayed_node->count--; | 1056 | delayed_node->count--; |
| 1056 | 1057 | ||
| 1057 | delayed_root = delayed_node->root->fs_info->delayed_root; | 1058 | delayed_root = delayed_node->root->fs_info->delayed_root; |
| 1058 | atomic_dec(&delayed_root->items); | 1059 | if (atomic_dec_return(&delayed_root->items) < |
| 1059 | if (atomic_read(&delayed_root->items) < | ||
| 1060 | BTRFS_DELAYED_BACKGROUND && | 1060 | BTRFS_DELAYED_BACKGROUND && |
| 1061 | waitqueue_active(&delayed_root->wait)) | 1061 | waitqueue_active(&delayed_root->wait)) |
| 1062 | wake_up(&delayed_root->wait); | 1062 | wake_up(&delayed_root->wait); |
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c index da7419ed01bb..ae9411773397 100644 --- a/fs/btrfs/delayed-ref.c +++ b/fs/btrfs/delayed-ref.c | |||
| @@ -38,17 +38,14 @@ | |||
| 38 | static int comp_tree_refs(struct btrfs_delayed_tree_ref *ref2, | 38 | static int comp_tree_refs(struct btrfs_delayed_tree_ref *ref2, |
| 39 | struct btrfs_delayed_tree_ref *ref1) | 39 | struct btrfs_delayed_tree_ref *ref1) |
| 40 | { | 40 | { |
| 41 | if (ref1->node.type == BTRFS_TREE_BLOCK_REF_KEY) { | 41 | if (ref1->root < ref2->root) |
| 42 | if (ref1->root < ref2->root) | 42 | return -1; |
| 43 | return -1; | 43 | if (ref1->root > ref2->root) |
| 44 | if (ref1->root > ref2->root) | 44 | return 1; |
| 45 | return 1; | 45 | if (ref1->parent < ref2->parent) |
| 46 | } else { | 46 | return -1; |
| 47 | if (ref1->parent < ref2->parent) | 47 | if (ref1->parent > ref2->parent) |
| 48 | return -1; | 48 | return 1; |
| 49 | if (ref1->parent > ref2->parent) | ||
| 50 | return 1; | ||
| 51 | } | ||
| 52 | return 0; | 49 | return 0; |
| 53 | } | 50 | } |
| 54 | 51 | ||
| @@ -85,7 +82,8 @@ static int comp_data_refs(struct btrfs_delayed_data_ref *ref2, | |||
| 85 | * type of the delayed backrefs and content of delayed backrefs. | 82 | * type of the delayed backrefs and content of delayed backrefs. |
| 86 | */ | 83 | */ |
| 87 | static int comp_entry(struct btrfs_delayed_ref_node *ref2, | 84 | static int comp_entry(struct btrfs_delayed_ref_node *ref2, |
| 88 | struct btrfs_delayed_ref_node *ref1) | 85 | struct btrfs_delayed_ref_node *ref1, |
| 86 | bool compare_seq) | ||
| 89 | { | 87 | { |
| 90 | if (ref1->bytenr < ref2->bytenr) | 88 | if (ref1->bytenr < ref2->bytenr) |
| 91 | return -1; | 89 | return -1; |
| @@ -102,10 +100,12 @@ static int comp_entry(struct btrfs_delayed_ref_node *ref2, | |||
| 102 | if (ref1->type > ref2->type) | 100 | if (ref1->type > ref2->type) |
| 103 | return 1; | 101 | return 1; |
| 104 | /* merging of sequenced refs is not allowed */ | 102 | /* merging of sequenced refs is not allowed */ |
| 105 | if (ref1->seq < ref2->seq) | 103 | if (compare_seq) { |
| 106 | return -1; | 104 | if (ref1->seq < ref2->seq) |
| 107 | if (ref1->seq > ref2->seq) | 105 | return -1; |
| 108 | return 1; | 106 | if (ref1->seq > ref2->seq) |
| 107 | return 1; | ||
| 108 | } | ||
| 109 | if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY || | 109 | if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY || |
| 110 | ref1->type == BTRFS_SHARED_BLOCK_REF_KEY) { | 110 | ref1->type == BTRFS_SHARED_BLOCK_REF_KEY) { |
| 111 | return comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref2), | 111 | return comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref2), |
| @@ -139,7 +139,7 @@ static struct btrfs_delayed_ref_node *tree_insert(struct rb_root *root, | |||
| 139 | entry = rb_entry(parent_node, struct btrfs_delayed_ref_node, | 139 | entry = rb_entry(parent_node, struct btrfs_delayed_ref_node, |
| 140 | rb_node); | 140 | rb_node); |
| 141 | 141 | ||
| 142 | cmp = comp_entry(entry, ins); | 142 | cmp = comp_entry(entry, ins, 1); |
| 143 | if (cmp < 0) | 143 | if (cmp < 0) |
| 144 | p = &(*p)->rb_left; | 144 | p = &(*p)->rb_left; |
| 145 | else if (cmp > 0) | 145 | else if (cmp > 0) |
| @@ -233,6 +233,114 @@ int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans, | |||
| 233 | return 0; | 233 | return 0; |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | static void inline drop_delayed_ref(struct btrfs_trans_handle *trans, | ||
| 237 | struct btrfs_delayed_ref_root *delayed_refs, | ||
| 238 | struct btrfs_delayed_ref_node *ref) | ||
| 239 | { | ||
| 240 | rb_erase(&ref->rb_node, &delayed_refs->root); | ||
| 241 | ref->in_tree = 0; | ||
| 242 | btrfs_put_delayed_ref(ref); | ||
| 243 | delayed_refs->num_entries--; | ||
| 244 | if (trans->delayed_ref_updates) | ||
| 245 | trans->delayed_ref_updates--; | ||
| 246 | } | ||
| 247 | |||
| 248 | static int merge_ref(struct btrfs_trans_handle *trans, | ||
| 249 | struct btrfs_delayed_ref_root *delayed_refs, | ||
| 250 | struct btrfs_delayed_ref_node *ref, u64 seq) | ||
| 251 | { | ||
| 252 | struct rb_node *node; | ||
| 253 | int merged = 0; | ||
| 254 | int mod = 0; | ||
| 255 | int done = 0; | ||
| 256 | |||
| 257 | node = rb_prev(&ref->rb_node); | ||
| 258 | while (node) { | ||
| 259 | struct btrfs_delayed_ref_node *next; | ||
| 260 | |||
| 261 | next = rb_entry(node, struct btrfs_delayed_ref_node, rb_node); | ||
| 262 | node = rb_prev(node); | ||
| 263 | if (next->bytenr != ref->bytenr) | ||
| 264 | break; | ||
| 265 | if (seq && next->seq >= seq) | ||
| 266 | break; | ||
| 267 | if (comp_entry(ref, next, 0)) | ||
| 268 | continue; | ||
| 269 | |||
| 270 | if (ref->action == next->action) { | ||
| 271 | mod = next->ref_mod; | ||
| 272 | } else { | ||
| 273 | if (ref->ref_mod < next->ref_mod) { | ||
| 274 | struct btrfs_delayed_ref_node *tmp; | ||
| 275 | |||
| 276 | tmp = ref; | ||
| 277 | ref = next; | ||
| 278 | next = tmp; | ||
| 279 | done = 1; | ||
| 280 | } | ||
| 281 | mod = -next->ref_mod; | ||
| 282 | } | ||
| 283 | |||
| 284 | merged++; | ||
| 285 | drop_delayed_ref(trans, delayed_refs, next); | ||
| 286 | ref->ref_mod += mod; | ||
| 287 | if (ref->ref_mod == 0) { | ||
| 288 | drop_delayed_ref(trans, delayed_refs, ref); | ||
| 289 | break; | ||
| 290 | } else { | ||
| 291 | /* | ||
| 292 | * You can't have multiples of the same ref on a tree | ||
| 293 | * block. | ||
| 294 | */ | ||
| 295 | WARN_ON(ref->type == BTRFS_TREE_BLOCK_REF_KEY || | ||
| 296 | ref->type == BTRFS_SHARED_BLOCK_REF_KEY); | ||
| 297 | } | ||
| 298 | |||
| 299 | if (done) | ||
| 300 | break; | ||
| 301 | node = rb_prev(&ref->rb_node); | ||
| 302 | } | ||
| 303 | |||
| 304 | return merged; | ||
| 305 | } | ||
| 306 | |||
| 307 | void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans, | ||
| 308 | struct btrfs_fs_info *fs_info, | ||
| 309 | struct btrfs_delayed_ref_root *delayed_refs, | ||
| 310 | struct btrfs_delayed_ref_head *head) | ||
| 311 | { | ||
| 312 | struct rb_node *node; | ||
| 313 | u64 seq = 0; | ||
| 314 | |||
| 315 | spin_lock(&fs_info->tree_mod_seq_lock); | ||
| 316 | if (!list_empty(&fs_info->tree_mod_seq_list)) { | ||
| 317 | struct seq_list *elem; | ||
| 318 | |||
| 319 | elem = list_first_entry(&fs_info->tree_mod_seq_list, | ||
| 320 | struct seq_list, list); | ||
| 321 | seq = elem->seq; | ||
| 322 | } | ||
| 323 | spin_unlock(&fs_info->tree_mod_seq_lock); | ||
| 324 | |||
| 325 | node = rb_prev(&head->node.rb_node); | ||
| 326 | while (node) { | ||
| 327 | struct btrfs_delayed_ref_node *ref; | ||
| 328 | |||
| 329 | ref = rb_entry(node, struct btrfs_delayed_ref_node, | ||
| 330 | rb_node); | ||
| 331 | if (ref->bytenr != head->node.bytenr) | ||
| 332 | break; | ||
| 333 | |||
| 334 | /* We can't merge refs that are outside of our seq count */ | ||
| 335 | if (seq && ref->seq >= seq) | ||
| 336 | break; | ||
| 337 | if (merge_ref(trans, delayed_refs, ref, seq)) | ||
| 338 | node = rb_prev(&head->node.rb_node); | ||
| 339 | else | ||
| 340 | node = rb_prev(node); | ||
| 341 | } | ||
| 342 | } | ||
| 343 | |||
| 236 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, | 344 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, |
| 237 | struct btrfs_delayed_ref_root *delayed_refs, | 345 | struct btrfs_delayed_ref_root *delayed_refs, |
| 238 | u64 seq) | 346 | u64 seq) |
| @@ -336,18 +444,11 @@ update_existing_ref(struct btrfs_trans_handle *trans, | |||
| 336 | * every changing the extent allocation tree. | 444 | * every changing the extent allocation tree. |
| 337 | */ | 445 | */ |
| 338 | existing->ref_mod--; | 446 | existing->ref_mod--; |
| 339 | if (existing->ref_mod == 0) { | 447 | if (existing->ref_mod == 0) |
| 340 | rb_erase(&existing->rb_node, | 448 | drop_delayed_ref(trans, delayed_refs, existing); |
| 341 | &delayed_refs->root); | 449 | else |
| 342 | existing->in_tree = 0; | ||
| 343 | btrfs_put_delayed_ref(existing); | ||
| 344 | delayed_refs->num_entries--; | ||
| 345 | if (trans->delayed_ref_updates) | ||
| 346 | trans->delayed_ref_updates--; | ||
| 347 | } else { | ||
| 348 | WARN_ON(existing->type == BTRFS_TREE_BLOCK_REF_KEY || | 450 | WARN_ON(existing->type == BTRFS_TREE_BLOCK_REF_KEY || |
| 349 | existing->type == BTRFS_SHARED_BLOCK_REF_KEY); | 451 | existing->type == BTRFS_SHARED_BLOCK_REF_KEY); |
| 350 | } | ||
| 351 | } else { | 452 | } else { |
| 352 | WARN_ON(existing->type == BTRFS_TREE_BLOCK_REF_KEY || | 453 | WARN_ON(existing->type == BTRFS_TREE_BLOCK_REF_KEY || |
| 353 | existing->type == BTRFS_SHARED_BLOCK_REF_KEY); | 454 | existing->type == BTRFS_SHARED_BLOCK_REF_KEY); |
| @@ -662,9 +763,6 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info, | |||
| 662 | add_delayed_tree_ref(fs_info, trans, &ref->node, bytenr, | 763 | add_delayed_tree_ref(fs_info, trans, &ref->node, bytenr, |
| 663 | num_bytes, parent, ref_root, level, action, | 764 | num_bytes, parent, ref_root, level, action, |
| 664 | for_cow); | 765 | for_cow); |
| 665 | if (!need_ref_seq(for_cow, ref_root) && | ||
| 666 | waitqueue_active(&fs_info->tree_mod_seq_wait)) | ||
| 667 | wake_up(&fs_info->tree_mod_seq_wait); | ||
| 668 | spin_unlock(&delayed_refs->lock); | 766 | spin_unlock(&delayed_refs->lock); |
| 669 | if (need_ref_seq(for_cow, ref_root)) | 767 | if (need_ref_seq(for_cow, ref_root)) |
| 670 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); | 768 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); |
| @@ -713,9 +811,6 @@ int btrfs_add_delayed_data_ref(struct btrfs_fs_info *fs_info, | |||
| 713 | add_delayed_data_ref(fs_info, trans, &ref->node, bytenr, | 811 | add_delayed_data_ref(fs_info, trans, &ref->node, bytenr, |
| 714 | num_bytes, parent, ref_root, owner, offset, | 812 | num_bytes, parent, ref_root, owner, offset, |
| 715 | action, for_cow); | 813 | action, for_cow); |
| 716 | if (!need_ref_seq(for_cow, ref_root) && | ||
| 717 | waitqueue_active(&fs_info->tree_mod_seq_wait)) | ||
| 718 | wake_up(&fs_info->tree_mod_seq_wait); | ||
| 719 | spin_unlock(&delayed_refs->lock); | 814 | spin_unlock(&delayed_refs->lock); |
| 720 | if (need_ref_seq(for_cow, ref_root)) | 815 | if (need_ref_seq(for_cow, ref_root)) |
| 721 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); | 816 | btrfs_qgroup_record_ref(trans, &ref->node, extent_op); |
| @@ -744,8 +839,6 @@ int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info, | |||
| 744 | num_bytes, BTRFS_UPDATE_DELAYED_HEAD, | 839 | num_bytes, BTRFS_UPDATE_DELAYED_HEAD, |
| 745 | extent_op->is_data); | 840 | extent_op->is_data); |
| 746 | 841 | ||
| 747 | if (waitqueue_active(&fs_info->tree_mod_seq_wait)) | ||
| 748 | wake_up(&fs_info->tree_mod_seq_wait); | ||
| 749 | spin_unlock(&delayed_refs->lock); | 842 | spin_unlock(&delayed_refs->lock); |
| 750 | return 0; | 843 | return 0; |
| 751 | } | 844 | } |
diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h index 0d7c90c366b6..ab5300595847 100644 --- a/fs/btrfs/delayed-ref.h +++ b/fs/btrfs/delayed-ref.h | |||
| @@ -167,6 +167,10 @@ int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info, | |||
| 167 | struct btrfs_trans_handle *trans, | 167 | struct btrfs_trans_handle *trans, |
| 168 | u64 bytenr, u64 num_bytes, | 168 | u64 bytenr, u64 num_bytes, |
| 169 | struct btrfs_delayed_extent_op *extent_op); | 169 | struct btrfs_delayed_extent_op *extent_op); |
| 170 | void btrfs_merge_delayed_refs(struct btrfs_trans_handle *trans, | ||
| 171 | struct btrfs_fs_info *fs_info, | ||
| 172 | struct btrfs_delayed_ref_root *delayed_refs, | ||
| 173 | struct btrfs_delayed_ref_head *head); | ||
| 170 | 174 | ||
| 171 | struct btrfs_delayed_ref_head * | 175 | struct btrfs_delayed_ref_head * |
| 172 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); | 176 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 62e0cafd6e25..22e98e04c2ea 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -377,9 +377,13 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root, | |||
| 377 | ret = read_extent_buffer_pages(io_tree, eb, start, | 377 | ret = read_extent_buffer_pages(io_tree, eb, start, |
| 378 | WAIT_COMPLETE, | 378 | WAIT_COMPLETE, |
| 379 | btree_get_extent, mirror_num); | 379 | btree_get_extent, mirror_num); |
| 380 | if (!ret && !verify_parent_transid(io_tree, eb, | 380 | if (!ret) { |
| 381 | if (!verify_parent_transid(io_tree, eb, | ||
| 381 | parent_transid, 0)) | 382 | parent_transid, 0)) |
| 382 | break; | 383 | break; |
| 384 | else | ||
| 385 | ret = -EIO; | ||
| 386 | } | ||
| 383 | 387 | ||
| 384 | /* | 388 | /* |
| 385 | * This buffer's crc is fine, but its contents are corrupted, so | 389 | * This buffer's crc is fine, but its contents are corrupted, so |
| @@ -754,9 +758,7 @@ static void run_one_async_done(struct btrfs_work *work) | |||
| 754 | limit = btrfs_async_submit_limit(fs_info); | 758 | limit = btrfs_async_submit_limit(fs_info); |
| 755 | limit = limit * 2 / 3; | 759 | limit = limit * 2 / 3; |
| 756 | 760 | ||
| 757 | atomic_dec(&fs_info->nr_async_submits); | 761 | if (atomic_dec_return(&fs_info->nr_async_submits) < limit && |
| 758 | |||
| 759 | if (atomic_read(&fs_info->nr_async_submits) < limit && | ||
| 760 | waitqueue_active(&fs_info->async_submit_wait)) | 762 | waitqueue_active(&fs_info->async_submit_wait)) |
| 761 | wake_up(&fs_info->async_submit_wait); | 763 | wake_up(&fs_info->async_submit_wait); |
| 762 | 764 | ||
| @@ -2032,8 +2034,6 @@ int open_ctree(struct super_block *sb, | |||
| 2032 | fs_info->free_chunk_space = 0; | 2034 | fs_info->free_chunk_space = 0; |
| 2033 | fs_info->tree_mod_log = RB_ROOT; | 2035 | fs_info->tree_mod_log = RB_ROOT; |
| 2034 | 2036 | ||
| 2035 | init_waitqueue_head(&fs_info->tree_mod_seq_wait); | ||
| 2036 | |||
| 2037 | /* readahead state */ | 2037 | /* readahead state */ |
| 2038 | INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT); | 2038 | INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT); |
| 2039 | spin_lock_init(&fs_info->reada_lock); | 2039 | spin_lock_init(&fs_info->reada_lock); |
| @@ -2528,8 +2528,7 @@ retry_root_backup: | |||
| 2528 | goto fail_trans_kthread; | 2528 | goto fail_trans_kthread; |
| 2529 | 2529 | ||
| 2530 | /* do not make disk changes in broken FS */ | 2530 | /* do not make disk changes in broken FS */ |
| 2531 | if (btrfs_super_log_root(disk_super) != 0 && | 2531 | if (btrfs_super_log_root(disk_super) != 0) { |
| 2532 | !(fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR)) { | ||
| 2533 | u64 bytenr = btrfs_super_log_root(disk_super); | 2532 | u64 bytenr = btrfs_super_log_root(disk_super); |
| 2534 | 2533 | ||
| 2535 | if (fs_devices->rw_devices == 0) { | 2534 | if (fs_devices->rw_devices == 0) { |
| @@ -3189,30 +3188,14 @@ int close_ctree(struct btrfs_root *root) | |||
| 3189 | /* clear out the rbtree of defraggable inodes */ | 3188 | /* clear out the rbtree of defraggable inodes */ |
| 3190 | btrfs_run_defrag_inodes(fs_info); | 3189 | btrfs_run_defrag_inodes(fs_info); |
| 3191 | 3190 | ||
| 3192 | /* | ||
| 3193 | * Here come 2 situations when btrfs is broken to flip readonly: | ||
| 3194 | * | ||
| 3195 | * 1. when btrfs flips readonly somewhere else before | ||
| 3196 | * btrfs_commit_super, sb->s_flags has MS_RDONLY flag, | ||
| 3197 | * and btrfs will skip to write sb directly to keep | ||
| 3198 | * ERROR state on disk. | ||
| 3199 | * | ||
| 3200 | * 2. when btrfs flips readonly just in btrfs_commit_super, | ||
| 3201 | * and in such case, btrfs cannot write sb via btrfs_commit_super, | ||
| 3202 | * and since fs_state has been set BTRFS_SUPER_FLAG_ERROR flag, | ||
| 3203 | * btrfs will cleanup all FS resources first and write sb then. | ||
| 3204 | */ | ||
| 3205 | if (!(fs_info->sb->s_flags & MS_RDONLY)) { | 3191 | if (!(fs_info->sb->s_flags & MS_RDONLY)) { |
| 3206 | ret = btrfs_commit_super(root); | 3192 | ret = btrfs_commit_super(root); |
| 3207 | if (ret) | 3193 | if (ret) |
| 3208 | printk(KERN_ERR "btrfs: commit super ret %d\n", ret); | 3194 | printk(KERN_ERR "btrfs: commit super ret %d\n", ret); |
| 3209 | } | 3195 | } |
| 3210 | 3196 | ||
| 3211 | if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | 3197 | if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) |
| 3212 | ret = btrfs_error_commit_super(root); | 3198 | btrfs_error_commit_super(root); |
| 3213 | if (ret) | ||
| 3214 | printk(KERN_ERR "btrfs: commit super ret %d\n", ret); | ||
| 3215 | } | ||
| 3216 | 3199 | ||
| 3217 | btrfs_put_block_group_cache(fs_info); | 3200 | btrfs_put_block_group_cache(fs_info); |
| 3218 | 3201 | ||
| @@ -3434,18 +3417,11 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info, | |||
| 3434 | if (read_only) | 3417 | if (read_only) |
| 3435 | return 0; | 3418 | return 0; |
| 3436 | 3419 | ||
| 3437 | if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) { | ||
| 3438 | printk(KERN_WARNING "warning: mount fs with errors, " | ||
| 3439 | "running btrfsck is recommended\n"); | ||
| 3440 | } | ||
| 3441 | |||
| 3442 | return 0; | 3420 | return 0; |
| 3443 | } | 3421 | } |
| 3444 | 3422 | ||
| 3445 | int btrfs_error_commit_super(struct btrfs_root *root) | 3423 | void btrfs_error_commit_super(struct btrfs_root *root) |
| 3446 | { | 3424 | { |
| 3447 | int ret; | ||
| 3448 | |||
| 3449 | mutex_lock(&root->fs_info->cleaner_mutex); | 3425 | mutex_lock(&root->fs_info->cleaner_mutex); |
| 3450 | btrfs_run_delayed_iputs(root); | 3426 | btrfs_run_delayed_iputs(root); |
| 3451 | mutex_unlock(&root->fs_info->cleaner_mutex); | 3427 | mutex_unlock(&root->fs_info->cleaner_mutex); |
| @@ -3455,10 +3431,6 @@ int btrfs_error_commit_super(struct btrfs_root *root) | |||
| 3455 | 3431 | ||
| 3456 | /* cleanup FS via transaction */ | 3432 | /* cleanup FS via transaction */ |
| 3457 | btrfs_cleanup_transaction(root); | 3433 | btrfs_cleanup_transaction(root); |
| 3458 | |||
| 3459 | ret = write_ctree_super(NULL, root, 0); | ||
| 3460 | |||
| 3461 | return ret; | ||
| 3462 | } | 3434 | } |
| 3463 | 3435 | ||
| 3464 | static void btrfs_destroy_ordered_operations(struct btrfs_root *root) | 3436 | static void btrfs_destroy_ordered_operations(struct btrfs_root *root) |
| @@ -3782,14 +3754,17 @@ int btrfs_cleanup_transaction(struct btrfs_root *root) | |||
| 3782 | /* FIXME: cleanup wait for commit */ | 3754 | /* FIXME: cleanup wait for commit */ |
| 3783 | t->in_commit = 1; | 3755 | t->in_commit = 1; |
| 3784 | t->blocked = 1; | 3756 | t->blocked = 1; |
| 3757 | smp_mb(); | ||
| 3785 | if (waitqueue_active(&root->fs_info->transaction_blocked_wait)) | 3758 | if (waitqueue_active(&root->fs_info->transaction_blocked_wait)) |
| 3786 | wake_up(&root->fs_info->transaction_blocked_wait); | 3759 | wake_up(&root->fs_info->transaction_blocked_wait); |
| 3787 | 3760 | ||
| 3788 | t->blocked = 0; | 3761 | t->blocked = 0; |
| 3762 | smp_mb(); | ||
| 3789 | if (waitqueue_active(&root->fs_info->transaction_wait)) | 3763 | if (waitqueue_active(&root->fs_info->transaction_wait)) |
| 3790 | wake_up(&root->fs_info->transaction_wait); | 3764 | wake_up(&root->fs_info->transaction_wait); |
| 3791 | 3765 | ||
| 3792 | t->commit_done = 1; | 3766 | t->commit_done = 1; |
| 3767 | smp_mb(); | ||
| 3793 | if (waitqueue_active(&t->commit_wait)) | 3768 | if (waitqueue_active(&t->commit_wait)) |
| 3794 | wake_up(&t->commit_wait); | 3769 | wake_up(&t->commit_wait); |
| 3795 | 3770 | ||
diff --git a/fs/btrfs/disk-io.h b/fs/btrfs/disk-io.h index 95e147eea239..c5b00a735fef 100644 --- a/fs/btrfs/disk-io.h +++ b/fs/btrfs/disk-io.h | |||
| @@ -54,7 +54,7 @@ int write_ctree_super(struct btrfs_trans_handle *trans, | |||
| 54 | struct btrfs_root *root, int max_mirrors); | 54 | struct btrfs_root *root, int max_mirrors); |
| 55 | struct buffer_head *btrfs_read_dev_super(struct block_device *bdev); | 55 | struct buffer_head *btrfs_read_dev_super(struct block_device *bdev); |
| 56 | int btrfs_commit_super(struct btrfs_root *root); | 56 | int btrfs_commit_super(struct btrfs_root *root); |
| 57 | int btrfs_error_commit_super(struct btrfs_root *root); | 57 | void btrfs_error_commit_super(struct btrfs_root *root); |
| 58 | struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root, | 58 | struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root, |
| 59 | u64 bytenr, u32 blocksize); | 59 | u64 bytenr, u32 blocksize); |
| 60 | struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_root *tree_root, | 60 | struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_root *tree_root, |
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 4e1b153b7c47..ba58024d40d3 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -2252,6 +2252,16 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
| 2252 | } | 2252 | } |
| 2253 | 2253 | ||
| 2254 | /* | 2254 | /* |
| 2255 | * We need to try and merge add/drops of the same ref since we | ||
| 2256 | * can run into issues with relocate dropping the implicit ref | ||
| 2257 | * and then it being added back again before the drop can | ||
| 2258 | * finish. If we merged anything we need to re-loop so we can | ||
| 2259 | * get a good ref. | ||
| 2260 | */ | ||
| 2261 | btrfs_merge_delayed_refs(trans, fs_info, delayed_refs, | ||
| 2262 | locked_ref); | ||
| 2263 | |||
| 2264 | /* | ||
| 2255 | * locked_ref is the head node, so we have to go one | 2265 | * locked_ref is the head node, so we have to go one |
| 2256 | * node back for any delayed ref updates | 2266 | * node back for any delayed ref updates |
| 2257 | */ | 2267 | */ |
| @@ -2318,12 +2328,23 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
| 2318 | ref->in_tree = 0; | 2328 | ref->in_tree = 0; |
| 2319 | rb_erase(&ref->rb_node, &delayed_refs->root); | 2329 | rb_erase(&ref->rb_node, &delayed_refs->root); |
| 2320 | delayed_refs->num_entries--; | 2330 | delayed_refs->num_entries--; |
| 2321 | /* | 2331 | if (locked_ref) { |
| 2322 | * we modified num_entries, but as we're currently running | 2332 | /* |
| 2323 | * delayed refs, skip | 2333 | * when we play the delayed ref, also correct the |
| 2324 | * wake_up(&delayed_refs->seq_wait); | 2334 | * ref_mod on head |
| 2325 | * here. | 2335 | */ |
| 2326 | */ | 2336 | switch (ref->action) { |
| 2337 | case BTRFS_ADD_DELAYED_REF: | ||
| 2338 | case BTRFS_ADD_DELAYED_EXTENT: | ||
| 2339 | locked_ref->node.ref_mod -= ref->ref_mod; | ||
| 2340 | break; | ||
| 2341 | case BTRFS_DROP_DELAYED_REF: | ||
| 2342 | locked_ref->node.ref_mod += ref->ref_mod; | ||
| 2343 | break; | ||
| 2344 | default: | ||
| 2345 | WARN_ON(1); | ||
| 2346 | } | ||
| 2347 | } | ||
| 2327 | spin_unlock(&delayed_refs->lock); | 2348 | spin_unlock(&delayed_refs->lock); |
| 2328 | 2349 | ||
| 2329 | ret = run_one_delayed_ref(trans, root, ref, extent_op, | 2350 | ret = run_one_delayed_ref(trans, root, ref, extent_op, |
| @@ -2350,22 +2371,6 @@ next: | |||
| 2350 | return count; | 2371 | return count; |
| 2351 | } | 2372 | } |
| 2352 | 2373 | ||
| 2353 | static void wait_for_more_refs(struct btrfs_fs_info *fs_info, | ||
| 2354 | struct btrfs_delayed_ref_root *delayed_refs, | ||
| 2355 | unsigned long num_refs, | ||
| 2356 | struct list_head *first_seq) | ||
| 2357 | { | ||
| 2358 | spin_unlock(&delayed_refs->lock); | ||
| 2359 | pr_debug("waiting for more refs (num %ld, first %p)\n", | ||
| 2360 | num_refs, first_seq); | ||
| 2361 | wait_event(fs_info->tree_mod_seq_wait, | ||
| 2362 | num_refs != delayed_refs->num_entries || | ||
| 2363 | fs_info->tree_mod_seq_list.next != first_seq); | ||
| 2364 | pr_debug("done waiting for more refs (num %ld, first %p)\n", | ||
| 2365 | delayed_refs->num_entries, fs_info->tree_mod_seq_list.next); | ||
| 2366 | spin_lock(&delayed_refs->lock); | ||
| 2367 | } | ||
| 2368 | |||
| 2369 | #ifdef SCRAMBLE_DELAYED_REFS | 2374 | #ifdef SCRAMBLE_DELAYED_REFS |
| 2370 | /* | 2375 | /* |
| 2371 | * Normally delayed refs get processed in ascending bytenr order. This | 2376 | * Normally delayed refs get processed in ascending bytenr order. This |
| @@ -2460,13 +2465,11 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
| 2460 | struct btrfs_delayed_ref_root *delayed_refs; | 2465 | struct btrfs_delayed_ref_root *delayed_refs; |
| 2461 | struct btrfs_delayed_ref_node *ref; | 2466 | struct btrfs_delayed_ref_node *ref; |
| 2462 | struct list_head cluster; | 2467 | struct list_head cluster; |
| 2463 | struct list_head *first_seq = NULL; | ||
| 2464 | int ret; | 2468 | int ret; |
| 2465 | u64 delayed_start; | 2469 | u64 delayed_start; |
| 2466 | int run_all = count == (unsigned long)-1; | 2470 | int run_all = count == (unsigned long)-1; |
| 2467 | int run_most = 0; | 2471 | int run_most = 0; |
| 2468 | unsigned long num_refs = 0; | 2472 | int loops; |
| 2469 | int consider_waiting; | ||
| 2470 | 2473 | ||
| 2471 | /* We'll clean this up in btrfs_cleanup_transaction */ | 2474 | /* We'll clean this up in btrfs_cleanup_transaction */ |
| 2472 | if (trans->aborted) | 2475 | if (trans->aborted) |
| @@ -2484,7 +2487,7 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
| 2484 | delayed_refs = &trans->transaction->delayed_refs; | 2487 | delayed_refs = &trans->transaction->delayed_refs; |
| 2485 | INIT_LIST_HEAD(&cluster); | 2488 | INIT_LIST_HEAD(&cluster); |
| 2486 | again: | 2489 | again: |
| 2487 | consider_waiting = 0; | 2490 | loops = 0; |
| 2488 | spin_lock(&delayed_refs->lock); | 2491 | spin_lock(&delayed_refs->lock); |
| 2489 | 2492 | ||
| 2490 | #ifdef SCRAMBLE_DELAYED_REFS | 2493 | #ifdef SCRAMBLE_DELAYED_REFS |
| @@ -2512,31 +2515,6 @@ again: | |||
| 2512 | if (ret) | 2515 | if (ret) |
| 2513 | break; | 2516 | break; |
| 2514 | 2517 | ||
| 2515 | if (delayed_start >= delayed_refs->run_delayed_start) { | ||
| 2516 | if (consider_waiting == 0) { | ||
| 2517 | /* | ||
| 2518 | * btrfs_find_ref_cluster looped. let's do one | ||
| 2519 | * more cycle. if we don't run any delayed ref | ||
| 2520 | * during that cycle (because we can't because | ||
| 2521 | * all of them are blocked) and if the number of | ||
| 2522 | * refs doesn't change, we avoid busy waiting. | ||
| 2523 | */ | ||
| 2524 | consider_waiting = 1; | ||
| 2525 | num_refs = delayed_refs->num_entries; | ||
| 2526 | first_seq = root->fs_info->tree_mod_seq_list.next; | ||
| 2527 | } else { | ||
| 2528 | wait_for_more_refs(root->fs_info, delayed_refs, | ||
| 2529 | num_refs, first_seq); | ||
| 2530 | /* | ||
| 2531 | * after waiting, things have changed. we | ||
| 2532 | * dropped the lock and someone else might have | ||
| 2533 | * run some refs, built new clusters and so on. | ||
| 2534 | * therefore, we restart staleness detection. | ||
| 2535 | */ | ||
| 2536 | consider_waiting = 0; | ||
| 2537 | } | ||
| 2538 | } | ||
| 2539 | |||
| 2540 | ret = run_clustered_refs(trans, root, &cluster); | 2518 | ret = run_clustered_refs(trans, root, &cluster); |
| 2541 | if (ret < 0) { | 2519 | if (ret < 0) { |
| 2542 | spin_unlock(&delayed_refs->lock); | 2520 | spin_unlock(&delayed_refs->lock); |
| @@ -2549,9 +2527,26 @@ again: | |||
| 2549 | if (count == 0) | 2527 | if (count == 0) |
| 2550 | break; | 2528 | break; |
| 2551 | 2529 | ||
| 2552 | if (ret || delayed_refs->run_delayed_start == 0) { | 2530 | if (delayed_start >= delayed_refs->run_delayed_start) { |
| 2531 | if (loops == 0) { | ||
| 2532 | /* | ||
| 2533 | * btrfs_find_ref_cluster looped. let's do one | ||
| 2534 | * more cycle. if we don't run any delayed ref | ||
| 2535 | * during that cycle (because we can't because | ||
| 2536 | * all of them are blocked), bail out. | ||
| 2537 | */ | ||
| 2538 | loops = 1; | ||
| 2539 | } else { | ||
| 2540 | /* | ||
| 2541 | * no runnable refs left, stop trying | ||
| 2542 | */ | ||
| 2543 | BUG_ON(run_all); | ||
| 2544 | break; | ||
| 2545 | } | ||
| 2546 | } | ||
| 2547 | if (ret) { | ||
| 2553 | /* refs were run, let's reset staleness detection */ | 2548 | /* refs were run, let's reset staleness detection */ |
| 2554 | consider_waiting = 0; | 2549 | loops = 0; |
| 2555 | } | 2550 | } |
| 2556 | } | 2551 | } |
| 2557 | 2552 | ||
| @@ -3007,17 +3002,16 @@ again: | |||
| 3007 | } | 3002 | } |
| 3008 | spin_unlock(&block_group->lock); | 3003 | spin_unlock(&block_group->lock); |
| 3009 | 3004 | ||
| 3010 | num_pages = (int)div64_u64(block_group->key.offset, 1024 * 1024 * 1024); | 3005 | /* |
| 3006 | * Try to preallocate enough space based on how big the block group is. | ||
| 3007 | * Keep in mind this has to include any pinned space which could end up | ||
| 3008 | * taking up quite a bit since it's not folded into the other space | ||
| 3009 | * cache. | ||
| 3010 | */ | ||
| 3011 | num_pages = (int)div64_u64(block_group->key.offset, 256 * 1024 * 1024); | ||
| 3011 | if (!num_pages) | 3012 | if (!num_pages) |
| 3012 | num_pages = 1; | 3013 | num_pages = 1; |
| 3013 | 3014 | ||
| 3014 | /* | ||
| 3015 | * Just to make absolutely sure we have enough space, we're going to | ||
| 3016 | * preallocate 12 pages worth of space for each block group. In | ||
| 3017 | * practice we ought to use at most 8, but we need extra space so we can | ||
| 3018 | * add our header and have a terminator between the extents and the | ||
| 3019 | * bitmaps. | ||
| 3020 | */ | ||
| 3021 | num_pages *= 16; | 3015 | num_pages *= 16; |
| 3022 | num_pages *= PAGE_CACHE_SIZE; | 3016 | num_pages *= PAGE_CACHE_SIZE; |
| 3023 | 3017 | ||
| @@ -4571,8 +4565,10 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
| 4571 | if (root->fs_info->quota_enabled) { | 4565 | if (root->fs_info->quota_enabled) { |
| 4572 | ret = btrfs_qgroup_reserve(root, num_bytes + | 4566 | ret = btrfs_qgroup_reserve(root, num_bytes + |
| 4573 | nr_extents * root->leafsize); | 4567 | nr_extents * root->leafsize); |
| 4574 | if (ret) | 4568 | if (ret) { |
| 4569 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
| 4575 | return ret; | 4570 | return ret; |
| 4571 | } | ||
| 4576 | } | 4572 | } |
| 4577 | 4573 | ||
| 4578 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); | 4574 | ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); |
| @@ -5294,9 +5290,6 @@ static noinline int check_ref_cleanup(struct btrfs_trans_handle *trans, | |||
| 5294 | rb_erase(&head->node.rb_node, &delayed_refs->root); | 5290 | rb_erase(&head->node.rb_node, &delayed_refs->root); |
| 5295 | 5291 | ||
| 5296 | delayed_refs->num_entries--; | 5292 | delayed_refs->num_entries--; |
| 5297 | smp_mb(); | ||
| 5298 | if (waitqueue_active(&root->fs_info->tree_mod_seq_wait)) | ||
| 5299 | wake_up(&root->fs_info->tree_mod_seq_wait); | ||
| 5300 | 5293 | ||
| 5301 | /* | 5294 | /* |
| 5302 | * we don't take a ref on the node because we're removing it from the | 5295 | * we don't take a ref on the node because we're removing it from the |
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c index 45c81bb4ac82..4c878476bb91 100644 --- a/fs/btrfs/extent_io.c +++ b/fs/btrfs/extent_io.c | |||
| @@ -2330,23 +2330,10 @@ static void end_bio_extent_readpage(struct bio *bio, int err) | |||
| 2330 | if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) { | 2330 | if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) { |
| 2331 | ret = tree->ops->readpage_end_io_hook(page, start, end, | 2331 | ret = tree->ops->readpage_end_io_hook(page, start, end, |
| 2332 | state, mirror); | 2332 | state, mirror); |
| 2333 | if (ret) { | 2333 | if (ret) |
| 2334 | /* no IO indicated but software detected errors | ||
| 2335 | * in the block, either checksum errors or | ||
| 2336 | * issues with the contents */ | ||
| 2337 | struct btrfs_root *root = | ||
| 2338 | BTRFS_I(page->mapping->host)->root; | ||
| 2339 | struct btrfs_device *device; | ||
| 2340 | |||
| 2341 | uptodate = 0; | 2334 | uptodate = 0; |
| 2342 | device = btrfs_find_device_for_logical( | 2335 | else |
| 2343 | root, start, mirror); | ||
| 2344 | if (device) | ||
| 2345 | btrfs_dev_stat_inc_and_print(device, | ||
| 2346 | BTRFS_DEV_STAT_CORRUPTION_ERRS); | ||
| 2347 | } else { | ||
| 2348 | clean_io_failure(start, page); | 2336 | clean_io_failure(start, page); |
| 2349 | } | ||
| 2350 | } | 2337 | } |
| 2351 | 2338 | ||
| 2352 | if (!uptodate && tree->ops && tree->ops->readpage_io_failed_hook) { | 2339 | if (!uptodate && tree->ops && tree->ops->readpage_io_failed_hook) { |
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c index b45b9de0c21d..857d93cd01dc 100644 --- a/fs/btrfs/file-item.c +++ b/fs/btrfs/file-item.c | |||
| @@ -272,9 +272,9 @@ int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode, | |||
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | int btrfs_lookup_bio_sums_dio(struct btrfs_root *root, struct inode *inode, | 274 | int btrfs_lookup_bio_sums_dio(struct btrfs_root *root, struct inode *inode, |
| 275 | struct bio *bio, u64 offset, u32 *dst) | 275 | struct bio *bio, u64 offset) |
| 276 | { | 276 | { |
| 277 | return __btrfs_lookup_bio_sums(root, inode, bio, offset, dst, 1); | 277 | return __btrfs_lookup_bio_sums(root, inode, bio, offset, NULL, 1); |
| 278 | } | 278 | } |
| 279 | 279 | ||
| 280 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, | 280 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 6e8f416773d4..ec154f954646 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -1008,9 +1008,7 @@ static noinline void async_cow_submit(struct btrfs_work *work) | |||
| 1008 | nr_pages = (async_cow->end - async_cow->start + PAGE_CACHE_SIZE) >> | 1008 | nr_pages = (async_cow->end - async_cow->start + PAGE_CACHE_SIZE) >> |
| 1009 | PAGE_CACHE_SHIFT; | 1009 | PAGE_CACHE_SHIFT; |
| 1010 | 1010 | ||
| 1011 | atomic_sub(nr_pages, &root->fs_info->async_delalloc_pages); | 1011 | if (atomic_sub_return(nr_pages, &root->fs_info->async_delalloc_pages) < |
| 1012 | |||
| 1013 | if (atomic_read(&root->fs_info->async_delalloc_pages) < | ||
| 1014 | 5 * 1024 * 1024 && | 1012 | 5 * 1024 * 1024 && |
| 1015 | waitqueue_active(&root->fs_info->async_submit_wait)) | 1013 | waitqueue_active(&root->fs_info->async_submit_wait)) |
| 1016 | wake_up(&root->fs_info->async_submit_wait); | 1014 | wake_up(&root->fs_info->async_submit_wait); |
| @@ -1885,8 +1883,11 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) | |||
| 1885 | trans = btrfs_join_transaction_nolock(root); | 1883 | trans = btrfs_join_transaction_nolock(root); |
| 1886 | else | 1884 | else |
| 1887 | trans = btrfs_join_transaction(root); | 1885 | trans = btrfs_join_transaction(root); |
| 1888 | if (IS_ERR(trans)) | 1886 | if (IS_ERR(trans)) { |
| 1889 | return PTR_ERR(trans); | 1887 | ret = PTR_ERR(trans); |
| 1888 | trans = NULL; | ||
| 1889 | goto out; | ||
| 1890 | } | ||
| 1890 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 1891 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 1891 | ret = btrfs_update_inode_fallback(trans, root, inode); | 1892 | ret = btrfs_update_inode_fallback(trans, root, inode); |
| 1892 | if (ret) /* -ENOMEM or corruption */ | 1893 | if (ret) /* -ENOMEM or corruption */ |
| @@ -3174,7 +3175,7 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, | |||
| 3174 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); | 3175 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
| 3175 | inode_inc_iversion(dir); | 3176 | inode_inc_iversion(dir); |
| 3176 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; | 3177 | dir->i_mtime = dir->i_ctime = CURRENT_TIME; |
| 3177 | ret = btrfs_update_inode(trans, root, dir); | 3178 | ret = btrfs_update_inode_fallback(trans, root, dir); |
| 3178 | if (ret) | 3179 | if (ret) |
| 3179 | btrfs_abort_transaction(trans, root, ret); | 3180 | btrfs_abort_transaction(trans, root, ret); |
| 3180 | out: | 3181 | out: |
| @@ -5774,18 +5775,112 @@ out: | |||
| 5774 | return ret; | 5775 | return ret; |
| 5775 | } | 5776 | } |
| 5776 | 5777 | ||
| 5778 | static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend, | ||
| 5779 | struct extent_state **cached_state, int writing) | ||
| 5780 | { | ||
| 5781 | struct btrfs_ordered_extent *ordered; | ||
| 5782 | int ret = 0; | ||
| 5783 | |||
| 5784 | while (1) { | ||
| 5785 | lock_extent_bits(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 5786 | 0, cached_state); | ||
| 5787 | /* | ||
| 5788 | * We're concerned with the entire range that we're going to be | ||
| 5789 | * doing DIO to, so we need to make sure theres no ordered | ||
| 5790 | * extents in this range. | ||
| 5791 | */ | ||
| 5792 | ordered = btrfs_lookup_ordered_range(inode, lockstart, | ||
| 5793 | lockend - lockstart + 1); | ||
| 5794 | |||
| 5795 | /* | ||
| 5796 | * We need to make sure there are no buffered pages in this | ||
| 5797 | * range either, we could have raced between the invalidate in | ||
| 5798 | * generic_file_direct_write and locking the extent. The | ||
| 5799 | * invalidate needs to happen so that reads after a write do not | ||
| 5800 | * get stale data. | ||
| 5801 | */ | ||
| 5802 | if (!ordered && (!writing || | ||
| 5803 | !test_range_bit(&BTRFS_I(inode)->io_tree, | ||
| 5804 | lockstart, lockend, EXTENT_UPTODATE, 0, | ||
| 5805 | *cached_state))) | ||
| 5806 | break; | ||
| 5807 | |||
| 5808 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 5809 | cached_state, GFP_NOFS); | ||
| 5810 | |||
| 5811 | if (ordered) { | ||
| 5812 | btrfs_start_ordered_extent(inode, ordered, 1); | ||
| 5813 | btrfs_put_ordered_extent(ordered); | ||
| 5814 | } else { | ||
| 5815 | /* Screw you mmap */ | ||
| 5816 | ret = filemap_write_and_wait_range(inode->i_mapping, | ||
| 5817 | lockstart, | ||
| 5818 | lockend); | ||
| 5819 | if (ret) | ||
| 5820 | break; | ||
| 5821 | |||
| 5822 | /* | ||
| 5823 | * If we found a page that couldn't be invalidated just | ||
| 5824 | * fall back to buffered. | ||
| 5825 | */ | ||
| 5826 | ret = invalidate_inode_pages2_range(inode->i_mapping, | ||
| 5827 | lockstart >> PAGE_CACHE_SHIFT, | ||
| 5828 | lockend >> PAGE_CACHE_SHIFT); | ||
| 5829 | if (ret) | ||
| 5830 | break; | ||
| 5831 | } | ||
| 5832 | |||
| 5833 | cond_resched(); | ||
| 5834 | } | ||
| 5835 | |||
| 5836 | return ret; | ||
| 5837 | } | ||
| 5838 | |||
| 5777 | static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | 5839 | static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, |
| 5778 | struct buffer_head *bh_result, int create) | 5840 | struct buffer_head *bh_result, int create) |
| 5779 | { | 5841 | { |
| 5780 | struct extent_map *em; | 5842 | struct extent_map *em; |
| 5781 | struct btrfs_root *root = BTRFS_I(inode)->root; | 5843 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5844 | struct extent_state *cached_state = NULL; | ||
| 5782 | u64 start = iblock << inode->i_blkbits; | 5845 | u64 start = iblock << inode->i_blkbits; |
| 5846 | u64 lockstart, lockend; | ||
| 5783 | u64 len = bh_result->b_size; | 5847 | u64 len = bh_result->b_size; |
| 5784 | struct btrfs_trans_handle *trans; | 5848 | struct btrfs_trans_handle *trans; |
| 5849 | int unlock_bits = EXTENT_LOCKED; | ||
| 5850 | int ret; | ||
| 5851 | |||
| 5852 | if (create) { | ||
| 5853 | ret = btrfs_delalloc_reserve_space(inode, len); | ||
| 5854 | if (ret) | ||
| 5855 | return ret; | ||
| 5856 | unlock_bits |= EXTENT_DELALLOC | EXTENT_DIRTY; | ||
| 5857 | } else { | ||
| 5858 | len = min_t(u64, len, root->sectorsize); | ||
| 5859 | } | ||
| 5860 | |||
| 5861 | lockstart = start; | ||
| 5862 | lockend = start + len - 1; | ||
| 5863 | |||
| 5864 | /* | ||
| 5865 | * If this errors out it's because we couldn't invalidate pagecache for | ||
| 5866 | * this range and we need to fallback to buffered. | ||
| 5867 | */ | ||
| 5868 | if (lock_extent_direct(inode, lockstart, lockend, &cached_state, create)) | ||
| 5869 | return -ENOTBLK; | ||
| 5870 | |||
| 5871 | if (create) { | ||
| 5872 | ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 5873 | lockend, EXTENT_DELALLOC, NULL, | ||
| 5874 | &cached_state, GFP_NOFS); | ||
| 5875 | if (ret) | ||
| 5876 | goto unlock_err; | ||
| 5877 | } | ||
| 5785 | 5878 | ||
| 5786 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); | 5879 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); |
| 5787 | if (IS_ERR(em)) | 5880 | if (IS_ERR(em)) { |
| 5788 | return PTR_ERR(em); | 5881 | ret = PTR_ERR(em); |
| 5882 | goto unlock_err; | ||
| 5883 | } | ||
| 5789 | 5884 | ||
| 5790 | /* | 5885 | /* |
| 5791 | * Ok for INLINE and COMPRESSED extents we need to fallback on buffered | 5886 | * Ok for INLINE and COMPRESSED extents we need to fallback on buffered |
| @@ -5804,17 +5899,16 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 5804 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags) || | 5899 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags) || |
| 5805 | em->block_start == EXTENT_MAP_INLINE) { | 5900 | em->block_start == EXTENT_MAP_INLINE) { |
| 5806 | free_extent_map(em); | 5901 | free_extent_map(em); |
| 5807 | return -ENOTBLK; | 5902 | ret = -ENOTBLK; |
| 5903 | goto unlock_err; | ||
| 5808 | } | 5904 | } |
| 5809 | 5905 | ||
| 5810 | /* Just a good old fashioned hole, return */ | 5906 | /* Just a good old fashioned hole, return */ |
| 5811 | if (!create && (em->block_start == EXTENT_MAP_HOLE || | 5907 | if (!create && (em->block_start == EXTENT_MAP_HOLE || |
| 5812 | test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { | 5908 | test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
| 5813 | free_extent_map(em); | 5909 | free_extent_map(em); |
| 5814 | /* DIO will do one hole at a time, so just unlock a sector */ | 5910 | ret = 0; |
| 5815 | unlock_extent(&BTRFS_I(inode)->io_tree, start, | 5911 | goto unlock_err; |
| 5816 | start + root->sectorsize - 1); | ||
| 5817 | return 0; | ||
| 5818 | } | 5912 | } |
| 5819 | 5913 | ||
| 5820 | /* | 5914 | /* |
| @@ -5827,8 +5921,9 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 5827 | * | 5921 | * |
| 5828 | */ | 5922 | */ |
| 5829 | if (!create) { | 5923 | if (!create) { |
| 5830 | len = em->len - (start - em->start); | 5924 | len = min(len, em->len - (start - em->start)); |
| 5831 | goto map; | 5925 | lockstart = start + len; |
| 5926 | goto unlock; | ||
| 5832 | } | 5927 | } |
| 5833 | 5928 | ||
| 5834 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags) || | 5929 | if (test_bit(EXTENT_FLAG_PREALLOC, &em->flags) || |
| @@ -5860,7 +5955,7 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, | |||
| 5860 | btrfs_end_transaction(trans, root); | 5955 | btrfs_end_transaction(trans, root); |
| 5861 | if (ret) { | 5956 | if (ret) { |
| 5862 | free_extent_map(em); | 5957 | free_extent_map(em); |
| 5863 | return ret; | 5958 | goto unlock_err; |
| 5864 | } | 5959 | } |
| 5865 | goto unlock; | 5960 | goto unlock; |
| 5866 | } | 5961 | } |
| @@ -5873,14 +5968,12 @@ must_cow: | |||
| 5873 | */ | 5968 | */ |
| 5874 | len = bh_result->b_size; | 5969 | len = bh_result->b_size; |
| 5875 | em = btrfs_new_extent_direct(inode, em, start, len); | 5970 | em = btrfs_new_extent_direct(inode, em, start, len); |
| 5876 | if (IS_ERR(em)) | 5971 | if (IS_ERR(em)) { |
| 5877 | return PTR_ERR(em); | 5972 | ret = PTR_ERR(em); |
| 5973 | goto unlock_err; | ||
| 5974 | } | ||
| 5878 | len = min(len, em->len - (start - em->start)); | 5975 | len = min(len, em->len - (start - em->start)); |
| 5879 | unlock: | 5976 | unlock: |
| 5880 | clear_extent_bit(&BTRFS_I(inode)->io_tree, start, start + len - 1, | ||
| 5881 | EXTENT_LOCKED | EXTENT_DELALLOC | EXTENT_DIRTY, 1, | ||
| 5882 | 0, NULL, GFP_NOFS); | ||
| 5883 | map: | ||
| 5884 | bh_result->b_blocknr = (em->block_start + (start - em->start)) >> | 5977 | bh_result->b_blocknr = (em->block_start + (start - em->start)) >> |
| 5885 | inode->i_blkbits; | 5978 | inode->i_blkbits; |
| 5886 | bh_result->b_size = len; | 5979 | bh_result->b_size = len; |
| @@ -5898,9 +5991,44 @@ map: | |||
| 5898 | i_size_write(inode, start + len); | 5991 | i_size_write(inode, start + len); |
| 5899 | } | 5992 | } |
| 5900 | 5993 | ||
| 5994 | /* | ||
| 5995 | * In the case of write we need to clear and unlock the entire range, | ||
| 5996 | * in the case of read we need to unlock only the end area that we | ||
| 5997 | * aren't using if there is any left over space. | ||
| 5998 | */ | ||
| 5999 | if (lockstart < lockend) { | ||
| 6000 | if (create && len < lockend - lockstart) { | ||
| 6001 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 6002 | lockstart + len - 1, unlock_bits, 1, 0, | ||
| 6003 | &cached_state, GFP_NOFS); | ||
| 6004 | /* | ||
| 6005 | * Beside unlock, we also need to cleanup reserved space | ||
| 6006 | * for the left range by attaching EXTENT_DO_ACCOUNTING. | ||
| 6007 | */ | ||
| 6008 | clear_extent_bit(&BTRFS_I(inode)->io_tree, | ||
| 6009 | lockstart + len, lockend, | ||
| 6010 | unlock_bits | EXTENT_DO_ACCOUNTING, | ||
| 6011 | 1, 0, NULL, GFP_NOFS); | ||
| 6012 | } else { | ||
| 6013 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 6014 | lockend, unlock_bits, 1, 0, | ||
| 6015 | &cached_state, GFP_NOFS); | ||
| 6016 | } | ||
| 6017 | } else { | ||
| 6018 | free_extent_state(cached_state); | ||
| 6019 | } | ||
| 6020 | |||
| 5901 | free_extent_map(em); | 6021 | free_extent_map(em); |
| 5902 | 6022 | ||
| 5903 | return 0; | 6023 | return 0; |
| 6024 | |||
| 6025 | unlock_err: | ||
| 6026 | if (create) | ||
| 6027 | unlock_bits |= EXTENT_DO_ACCOUNTING; | ||
| 6028 | |||
| 6029 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 6030 | unlock_bits, 1, 0, &cached_state, GFP_NOFS); | ||
| 6031 | return ret; | ||
| 5904 | } | 6032 | } |
| 5905 | 6033 | ||
| 5906 | struct btrfs_dio_private { | 6034 | struct btrfs_dio_private { |
| @@ -5908,7 +6036,6 @@ struct btrfs_dio_private { | |||
| 5908 | u64 logical_offset; | 6036 | u64 logical_offset; |
| 5909 | u64 disk_bytenr; | 6037 | u64 disk_bytenr; |
| 5910 | u64 bytes; | 6038 | u64 bytes; |
| 5911 | u32 *csums; | ||
| 5912 | void *private; | 6039 | void *private; |
| 5913 | 6040 | ||
| 5914 | /* number of bios pending for this dio */ | 6041 | /* number of bios pending for this dio */ |
| @@ -5928,7 +6055,6 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
| 5928 | struct inode *inode = dip->inode; | 6055 | struct inode *inode = dip->inode; |
| 5929 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6056 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5930 | u64 start; | 6057 | u64 start; |
| 5931 | u32 *private = dip->csums; | ||
| 5932 | 6058 | ||
| 5933 | start = dip->logical_offset; | 6059 | start = dip->logical_offset; |
| 5934 | do { | 6060 | do { |
| @@ -5936,8 +6062,12 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
| 5936 | struct page *page = bvec->bv_page; | 6062 | struct page *page = bvec->bv_page; |
| 5937 | char *kaddr; | 6063 | char *kaddr; |
| 5938 | u32 csum = ~(u32)0; | 6064 | u32 csum = ~(u32)0; |
| 6065 | u64 private = ~(u32)0; | ||
| 5939 | unsigned long flags; | 6066 | unsigned long flags; |
| 5940 | 6067 | ||
| 6068 | if (get_state_private(&BTRFS_I(inode)->io_tree, | ||
| 6069 | start, &private)) | ||
| 6070 | goto failed; | ||
| 5941 | local_irq_save(flags); | 6071 | local_irq_save(flags); |
| 5942 | kaddr = kmap_atomic(page); | 6072 | kaddr = kmap_atomic(page); |
| 5943 | csum = btrfs_csum_data(root, kaddr + bvec->bv_offset, | 6073 | csum = btrfs_csum_data(root, kaddr + bvec->bv_offset, |
| @@ -5947,18 +6077,18 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
| 5947 | local_irq_restore(flags); | 6077 | local_irq_restore(flags); |
| 5948 | 6078 | ||
| 5949 | flush_dcache_page(bvec->bv_page); | 6079 | flush_dcache_page(bvec->bv_page); |
| 5950 | if (csum != *private) { | 6080 | if (csum != private) { |
| 6081 | failed: | ||
| 5951 | printk(KERN_ERR "btrfs csum failed ino %llu off" | 6082 | printk(KERN_ERR "btrfs csum failed ino %llu off" |
| 5952 | " %llu csum %u private %u\n", | 6083 | " %llu csum %u private %u\n", |
| 5953 | (unsigned long long)btrfs_ino(inode), | 6084 | (unsigned long long)btrfs_ino(inode), |
| 5954 | (unsigned long long)start, | 6085 | (unsigned long long)start, |
| 5955 | csum, *private); | 6086 | csum, (unsigned)private); |
| 5956 | err = -EIO; | 6087 | err = -EIO; |
| 5957 | } | 6088 | } |
| 5958 | } | 6089 | } |
| 5959 | 6090 | ||
| 5960 | start += bvec->bv_len; | 6091 | start += bvec->bv_len; |
| 5961 | private++; | ||
| 5962 | bvec++; | 6092 | bvec++; |
| 5963 | } while (bvec <= bvec_end); | 6093 | } while (bvec <= bvec_end); |
| 5964 | 6094 | ||
| @@ -5966,7 +6096,6 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) | |||
| 5966 | dip->logical_offset + dip->bytes - 1); | 6096 | dip->logical_offset + dip->bytes - 1); |
| 5967 | bio->bi_private = dip->private; | 6097 | bio->bi_private = dip->private; |
| 5968 | 6098 | ||
| 5969 | kfree(dip->csums); | ||
| 5970 | kfree(dip); | 6099 | kfree(dip); |
| 5971 | 6100 | ||
| 5972 | /* If we had a csum failure make sure to clear the uptodate flag */ | 6101 | /* If we had a csum failure make sure to clear the uptodate flag */ |
| @@ -6072,7 +6201,7 @@ static struct bio *btrfs_dio_bio_alloc(struct block_device *bdev, | |||
| 6072 | 6201 | ||
| 6073 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | 6202 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, |
| 6074 | int rw, u64 file_offset, int skip_sum, | 6203 | int rw, u64 file_offset, int skip_sum, |
| 6075 | u32 *csums, int async_submit) | 6204 | int async_submit) |
| 6076 | { | 6205 | { |
| 6077 | int write = rw & REQ_WRITE; | 6206 | int write = rw & REQ_WRITE; |
| 6078 | struct btrfs_root *root = BTRFS_I(inode)->root; | 6207 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| @@ -6105,8 +6234,7 @@ static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, | |||
| 6105 | if (ret) | 6234 | if (ret) |
| 6106 | goto err; | 6235 | goto err; |
| 6107 | } else if (!skip_sum) { | 6236 | } else if (!skip_sum) { |
| 6108 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, | 6237 | ret = btrfs_lookup_bio_sums_dio(root, inode, bio, file_offset); |
| 6109 | file_offset, csums); | ||
| 6110 | if (ret) | 6238 | if (ret) |
| 6111 | goto err; | 6239 | goto err; |
| 6112 | } | 6240 | } |
| @@ -6132,10 +6260,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
| 6132 | u64 submit_len = 0; | 6260 | u64 submit_len = 0; |
| 6133 | u64 map_length; | 6261 | u64 map_length; |
| 6134 | int nr_pages = 0; | 6262 | int nr_pages = 0; |
| 6135 | u32 *csums = dip->csums; | ||
| 6136 | int ret = 0; | 6263 | int ret = 0; |
| 6137 | int async_submit = 0; | 6264 | int async_submit = 0; |
| 6138 | int write = rw & REQ_WRITE; | ||
| 6139 | 6265 | ||
| 6140 | map_length = orig_bio->bi_size; | 6266 | map_length = orig_bio->bi_size; |
| 6141 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, | 6267 | ret = btrfs_map_block(map_tree, READ, start_sector << 9, |
| @@ -6171,16 +6297,13 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
| 6171 | atomic_inc(&dip->pending_bios); | 6297 | atomic_inc(&dip->pending_bios); |
| 6172 | ret = __btrfs_submit_dio_bio(bio, inode, rw, | 6298 | ret = __btrfs_submit_dio_bio(bio, inode, rw, |
| 6173 | file_offset, skip_sum, | 6299 | file_offset, skip_sum, |
| 6174 | csums, async_submit); | 6300 | async_submit); |
| 6175 | if (ret) { | 6301 | if (ret) { |
| 6176 | bio_put(bio); | 6302 | bio_put(bio); |
| 6177 | atomic_dec(&dip->pending_bios); | 6303 | atomic_dec(&dip->pending_bios); |
| 6178 | goto out_err; | 6304 | goto out_err; |
| 6179 | } | 6305 | } |
| 6180 | 6306 | ||
| 6181 | /* Write's use the ordered csums */ | ||
| 6182 | if (!write && !skip_sum) | ||
| 6183 | csums = csums + nr_pages; | ||
| 6184 | start_sector += submit_len >> 9; | 6307 | start_sector += submit_len >> 9; |
| 6185 | file_offset += submit_len; | 6308 | file_offset += submit_len; |
| 6186 | 6309 | ||
| @@ -6210,7 +6333,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, | |||
| 6210 | 6333 | ||
| 6211 | submit: | 6334 | submit: |
| 6212 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, | 6335 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, |
| 6213 | csums, async_submit); | 6336 | async_submit); |
| 6214 | if (!ret) | 6337 | if (!ret) |
| 6215 | return 0; | 6338 | return 0; |
| 6216 | 6339 | ||
| @@ -6246,17 +6369,6 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, | |||
| 6246 | ret = -ENOMEM; | 6369 | ret = -ENOMEM; |
| 6247 | goto free_ordered; | 6370 | goto free_ordered; |
| 6248 | } | 6371 | } |
| 6249 | dip->csums = NULL; | ||
| 6250 | |||
| 6251 | /* Write's use the ordered csum stuff, so we don't need dip->csums */ | ||
| 6252 | if (!write && !skip_sum) { | ||
| 6253 | dip->csums = kmalloc(sizeof(u32) * bio->bi_vcnt, GFP_NOFS); | ||
| 6254 | if (!dip->csums) { | ||
| 6255 | kfree(dip); | ||
| 6256 | ret = -ENOMEM; | ||
| 6257 | goto free_ordered; | ||
| 6258 | } | ||
| 6259 | } | ||
| 6260 | 6372 | ||
| 6261 | dip->private = bio->bi_private; | 6373 | dip->private = bio->bi_private; |
| 6262 | dip->inode = inode; | 6374 | dip->inode = inode; |
| @@ -6341,132 +6453,22 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io | |||
| 6341 | out: | 6453 | out: |
| 6342 | return retval; | 6454 | return retval; |
| 6343 | } | 6455 | } |
| 6456 | |||
| 6344 | static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, | 6457 | static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, |
| 6345 | const struct iovec *iov, loff_t offset, | 6458 | const struct iovec *iov, loff_t offset, |
| 6346 | unsigned long nr_segs) | 6459 | unsigned long nr_segs) |
| 6347 | { | 6460 | { |
| 6348 | struct file *file = iocb->ki_filp; | 6461 | struct file *file = iocb->ki_filp; |
| 6349 | struct inode *inode = file->f_mapping->host; | 6462 | struct inode *inode = file->f_mapping->host; |
| 6350 | struct btrfs_ordered_extent *ordered; | ||
| 6351 | struct extent_state *cached_state = NULL; | ||
| 6352 | u64 lockstart, lockend; | ||
| 6353 | ssize_t ret; | ||
| 6354 | int writing = rw & WRITE; | ||
| 6355 | int write_bits = 0; | ||
| 6356 | size_t count = iov_length(iov, nr_segs); | ||
| 6357 | 6463 | ||
| 6358 | if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov, | 6464 | if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov, |
| 6359 | offset, nr_segs)) { | 6465 | offset, nr_segs)) |
| 6360 | return 0; | 6466 | return 0; |
| 6361 | } | ||
| 6362 | |||
| 6363 | lockstart = offset; | ||
| 6364 | lockend = offset + count - 1; | ||
| 6365 | |||
| 6366 | if (writing) { | ||
| 6367 | ret = btrfs_delalloc_reserve_space(inode, count); | ||
| 6368 | if (ret) | ||
| 6369 | goto out; | ||
| 6370 | } | ||
| 6371 | |||
| 6372 | while (1) { | ||
| 6373 | lock_extent_bits(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 6374 | 0, &cached_state); | ||
| 6375 | /* | ||
| 6376 | * We're concerned with the entire range that we're going to be | ||
| 6377 | * doing DIO to, so we need to make sure theres no ordered | ||
| 6378 | * extents in this range. | ||
| 6379 | */ | ||
| 6380 | ordered = btrfs_lookup_ordered_range(inode, lockstart, | ||
| 6381 | lockend - lockstart + 1); | ||
| 6382 | |||
| 6383 | /* | ||
| 6384 | * We need to make sure there are no buffered pages in this | ||
| 6385 | * range either, we could have raced between the invalidate in | ||
| 6386 | * generic_file_direct_write and locking the extent. The | ||
| 6387 | * invalidate needs to happen so that reads after a write do not | ||
| 6388 | * get stale data. | ||
| 6389 | */ | ||
| 6390 | if (!ordered && (!writing || | ||
| 6391 | !test_range_bit(&BTRFS_I(inode)->io_tree, | ||
| 6392 | lockstart, lockend, EXTENT_UPTODATE, 0, | ||
| 6393 | cached_state))) | ||
| 6394 | break; | ||
| 6395 | |||
| 6396 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 6397 | &cached_state, GFP_NOFS); | ||
| 6398 | |||
| 6399 | if (ordered) { | ||
| 6400 | btrfs_start_ordered_extent(inode, ordered, 1); | ||
| 6401 | btrfs_put_ordered_extent(ordered); | ||
| 6402 | } else { | ||
| 6403 | /* Screw you mmap */ | ||
| 6404 | ret = filemap_write_and_wait_range(file->f_mapping, | ||
| 6405 | lockstart, | ||
| 6406 | lockend); | ||
| 6407 | if (ret) | ||
| 6408 | goto out; | ||
| 6409 | |||
| 6410 | /* | ||
| 6411 | * If we found a page that couldn't be invalidated just | ||
| 6412 | * fall back to buffered. | ||
| 6413 | */ | ||
| 6414 | ret = invalidate_inode_pages2_range(file->f_mapping, | ||
| 6415 | lockstart >> PAGE_CACHE_SHIFT, | ||
| 6416 | lockend >> PAGE_CACHE_SHIFT); | ||
| 6417 | if (ret) { | ||
| 6418 | if (ret == -EBUSY) | ||
| 6419 | ret = 0; | ||
| 6420 | goto out; | ||
| 6421 | } | ||
| 6422 | } | ||
| 6423 | |||
| 6424 | cond_resched(); | ||
| 6425 | } | ||
| 6426 | 6467 | ||
| 6427 | /* | 6468 | return __blockdev_direct_IO(rw, iocb, inode, |
| 6428 | * we don't use btrfs_set_extent_delalloc because we don't want | ||
| 6429 | * the dirty or uptodate bits | ||
| 6430 | */ | ||
| 6431 | if (writing) { | ||
| 6432 | write_bits = EXTENT_DELALLOC | EXTENT_DO_ACCOUNTING; | ||
| 6433 | ret = set_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, lockend, | ||
| 6434 | EXTENT_DELALLOC, NULL, &cached_state, | ||
| 6435 | GFP_NOFS); | ||
| 6436 | if (ret) { | ||
| 6437 | clear_extent_bit(&BTRFS_I(inode)->io_tree, lockstart, | ||
| 6438 | lockend, EXTENT_LOCKED | write_bits, | ||
| 6439 | 1, 0, &cached_state, GFP_NOFS); | ||
| 6440 | goto out; | ||
| 6441 | } | ||
| 6442 | } | ||
| 6443 | |||
| 6444 | free_extent_state(cached_state); | ||
| 6445 | cached_state = NULL; | ||
| 6446 | |||
| 6447 | ret = __blockdev_direct_IO(rw, iocb, inode, | ||
| 6448 | BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, | 6469 | BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, |
| 6449 | iov, offset, nr_segs, btrfs_get_blocks_direct, NULL, | 6470 | iov, offset, nr_segs, btrfs_get_blocks_direct, NULL, |
| 6450 | btrfs_submit_direct, 0); | 6471 | btrfs_submit_direct, 0); |
| 6451 | |||
| 6452 | if (ret < 0 && ret != -EIOCBQUEUED) { | ||
| 6453 | clear_extent_bit(&BTRFS_I(inode)->io_tree, offset, | ||
| 6454 | offset + iov_length(iov, nr_segs) - 1, | ||
| 6455 | EXTENT_LOCKED | write_bits, 1, 0, | ||
| 6456 | &cached_state, GFP_NOFS); | ||
| 6457 | } else if (ret >= 0 && ret < iov_length(iov, nr_segs)) { | ||
| 6458 | /* | ||
| 6459 | * We're falling back to buffered, unlock the section we didn't | ||
| 6460 | * do IO on. | ||
| 6461 | */ | ||
| 6462 | clear_extent_bit(&BTRFS_I(inode)->io_tree, offset + ret, | ||
| 6463 | offset + iov_length(iov, nr_segs) - 1, | ||
| 6464 | EXTENT_LOCKED | write_bits, 1, 0, | ||
| 6465 | &cached_state, GFP_NOFS); | ||
| 6466 | } | ||
| 6467 | out: | ||
| 6468 | free_extent_state(cached_state); | ||
| 6469 | return ret; | ||
| 6470 | } | 6472 | } |
| 6471 | 6473 | ||
| 6472 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | 6474 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 7bb755677a22..9df50fa8a078 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
| @@ -424,7 +424,7 @@ static noinline int create_subvol(struct btrfs_root *root, | |||
| 424 | uuid_le_gen(&new_uuid); | 424 | uuid_le_gen(&new_uuid); |
| 425 | memcpy(root_item.uuid, new_uuid.b, BTRFS_UUID_SIZE); | 425 | memcpy(root_item.uuid, new_uuid.b, BTRFS_UUID_SIZE); |
| 426 | root_item.otime.sec = cpu_to_le64(cur_time.tv_sec); | 426 | root_item.otime.sec = cpu_to_le64(cur_time.tv_sec); |
| 427 | root_item.otime.nsec = cpu_to_le64(cur_time.tv_nsec); | 427 | root_item.otime.nsec = cpu_to_le32(cur_time.tv_nsec); |
| 428 | root_item.ctime = root_item.otime; | 428 | root_item.ctime = root_item.otime; |
| 429 | btrfs_set_root_ctransid(&root_item, trans->transid); | 429 | btrfs_set_root_ctransid(&root_item, trans->transid); |
| 430 | btrfs_set_root_otransid(&root_item, trans->transid); | 430 | btrfs_set_root_otransid(&root_item, trans->transid); |
diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c index a44eff074805..2a1762c66041 100644 --- a/fs/btrfs/locking.c +++ b/fs/btrfs/locking.c | |||
| @@ -67,7 +67,7 @@ void btrfs_clear_lock_blocking_rw(struct extent_buffer *eb, int rw) | |||
| 67 | { | 67 | { |
| 68 | if (eb->lock_nested) { | 68 | if (eb->lock_nested) { |
| 69 | read_lock(&eb->lock); | 69 | read_lock(&eb->lock); |
| 70 | if (&eb->lock_nested && current->pid == eb->lock_owner) { | 70 | if (eb->lock_nested && current->pid == eb->lock_owner) { |
| 71 | read_unlock(&eb->lock); | 71 | read_unlock(&eb->lock); |
| 72 | return; | 72 | return; |
| 73 | } | 73 | } |
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index bc424ae5a81a..b65015581744 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
| @@ -1364,8 +1364,10 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, | |||
| 1364 | spin_lock(&fs_info->qgroup_lock); | 1364 | spin_lock(&fs_info->qgroup_lock); |
| 1365 | 1365 | ||
| 1366 | dstgroup = add_qgroup_rb(fs_info, objectid); | 1366 | dstgroup = add_qgroup_rb(fs_info, objectid); |
| 1367 | if (!dstgroup) | 1367 | if (IS_ERR(dstgroup)) { |
| 1368 | ret = PTR_ERR(dstgroup); | ||
| 1368 | goto unlock; | 1369 | goto unlock; |
| 1370 | } | ||
| 1369 | 1371 | ||
| 1370 | if (srcid) { | 1372 | if (srcid) { |
| 1371 | srcgroup = find_qgroup_rb(fs_info, srcid); | 1373 | srcgroup = find_qgroup_rb(fs_info, srcid); |
diff --git a/fs/btrfs/root-tree.c b/fs/btrfs/root-tree.c index 6bb465cca20f..10d8e4d88071 100644 --- a/fs/btrfs/root-tree.c +++ b/fs/btrfs/root-tree.c | |||
| @@ -544,8 +544,8 @@ void btrfs_update_root_times(struct btrfs_trans_handle *trans, | |||
| 544 | struct timespec ct = CURRENT_TIME; | 544 | struct timespec ct = CURRENT_TIME; |
| 545 | 545 | ||
| 546 | spin_lock(&root->root_times_lock); | 546 | spin_lock(&root->root_times_lock); |
| 547 | item->ctransid = trans->transid; | 547 | item->ctransid = cpu_to_le64(trans->transid); |
| 548 | item->ctime.sec = cpu_to_le64(ct.tv_sec); | 548 | item->ctime.sec = cpu_to_le64(ct.tv_sec); |
| 549 | item->ctime.nsec = cpu_to_le64(ct.tv_nsec); | 549 | item->ctime.nsec = cpu_to_le32(ct.tv_nsec); |
| 550 | spin_unlock(&root->root_times_lock); | 550 | spin_unlock(&root->root_times_lock); |
| 551 | } | 551 | } |
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index f2eb24c477a3..83d6f9f9c220 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c | |||
| @@ -838,7 +838,6 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
| 838 | struct btrfs_trans_handle *trans; | 838 | struct btrfs_trans_handle *trans; |
| 839 | struct btrfs_fs_info *fs_info = btrfs_sb(sb); | 839 | struct btrfs_fs_info *fs_info = btrfs_sb(sb); |
| 840 | struct btrfs_root *root = fs_info->tree_root; | 840 | struct btrfs_root *root = fs_info->tree_root; |
| 841 | int ret; | ||
| 842 | 841 | ||
| 843 | trace_btrfs_sync_fs(wait); | 842 | trace_btrfs_sync_fs(wait); |
| 844 | 843 | ||
| @@ -849,11 +848,17 @@ int btrfs_sync_fs(struct super_block *sb, int wait) | |||
| 849 | 848 | ||
| 850 | btrfs_wait_ordered_extents(root, 0, 0); | 849 | btrfs_wait_ordered_extents(root, 0, 0); |
| 851 | 850 | ||
| 852 | trans = btrfs_start_transaction(root, 0); | 851 | spin_lock(&fs_info->trans_lock); |
| 852 | if (!fs_info->running_transaction) { | ||
| 853 | spin_unlock(&fs_info->trans_lock); | ||
| 854 | return 0; | ||
| 855 | } | ||
| 856 | spin_unlock(&fs_info->trans_lock); | ||
| 857 | |||
| 858 | trans = btrfs_join_transaction(root); | ||
| 853 | if (IS_ERR(trans)) | 859 | if (IS_ERR(trans)) |
| 854 | return PTR_ERR(trans); | 860 | return PTR_ERR(trans); |
| 855 | ret = btrfs_commit_transaction(trans, root); | 861 | return btrfs_commit_transaction(trans, root); |
| 856 | return ret; | ||
| 857 | } | 862 | } |
| 858 | 863 | ||
| 859 | static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) | 864 | static int btrfs_show_options(struct seq_file *seq, struct dentry *dentry) |
| @@ -1530,6 +1535,8 @@ static int btrfs_show_devname(struct seq_file *m, struct dentry *root) | |||
| 1530 | while (cur_devices) { | 1535 | while (cur_devices) { |
| 1531 | head = &cur_devices->devices; | 1536 | head = &cur_devices->devices; |
| 1532 | list_for_each_entry(dev, head, dev_list) { | 1537 | list_for_each_entry(dev, head, dev_list) { |
| 1538 | if (dev->missing) | ||
| 1539 | continue; | ||
| 1533 | if (!first_dev || dev->devid < first_dev->devid) | 1540 | if (!first_dev || dev->devid < first_dev->devid) |
| 1534 | first_dev = dev; | 1541 | first_dev = dev; |
| 1535 | } | 1542 | } |
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 17be3dedacba..27c26004e050 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c | |||
| @@ -1031,6 +1031,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
| 1031 | 1031 | ||
| 1032 | btrfs_i_size_write(parent_inode, parent_inode->i_size + | 1032 | btrfs_i_size_write(parent_inode, parent_inode->i_size + |
| 1033 | dentry->d_name.len * 2); | 1033 | dentry->d_name.len * 2); |
| 1034 | parent_inode->i_mtime = parent_inode->i_ctime = CURRENT_TIME; | ||
| 1034 | ret = btrfs_update_inode(trans, parent_root, parent_inode); | 1035 | ret = btrfs_update_inode(trans, parent_root, parent_inode); |
| 1035 | if (ret) | 1036 | if (ret) |
| 1036 | goto abort_trans_dput; | 1037 | goto abort_trans_dput; |
| @@ -1066,7 +1067,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, | |||
| 1066 | memcpy(new_root_item->parent_uuid, root->root_item.uuid, | 1067 | memcpy(new_root_item->parent_uuid, root->root_item.uuid, |
| 1067 | BTRFS_UUID_SIZE); | 1068 | BTRFS_UUID_SIZE); |
| 1068 | new_root_item->otime.sec = cpu_to_le64(cur_time.tv_sec); | 1069 | new_root_item->otime.sec = cpu_to_le64(cur_time.tv_sec); |
| 1069 | new_root_item->otime.nsec = cpu_to_le64(cur_time.tv_nsec); | 1070 | new_root_item->otime.nsec = cpu_to_le32(cur_time.tv_nsec); |
| 1070 | btrfs_set_root_otransid(new_root_item, trans->transid); | 1071 | btrfs_set_root_otransid(new_root_item, trans->transid); |
| 1071 | memset(&new_root_item->stime, 0, sizeof(new_root_item->stime)); | 1072 | memset(&new_root_item->stime, 0, sizeof(new_root_item->stime)); |
| 1072 | memset(&new_root_item->rtime, 0, sizeof(new_root_item->rtime)); | 1073 | memset(&new_root_item->rtime, 0, sizeof(new_root_item->rtime)); |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index e86ae04abe6a..88b969aeeb71 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
| @@ -227,9 +227,8 @@ loop_lock: | |||
| 227 | cur = pending; | 227 | cur = pending; |
| 228 | pending = pending->bi_next; | 228 | pending = pending->bi_next; |
| 229 | cur->bi_next = NULL; | 229 | cur->bi_next = NULL; |
| 230 | atomic_dec(&fs_info->nr_async_bios); | ||
| 231 | 230 | ||
| 232 | if (atomic_read(&fs_info->nr_async_bios) < limit && | 231 | if (atomic_dec_return(&fs_info->nr_async_bios) < limit && |
| 233 | waitqueue_active(&fs_info->async_submit_wait)) | 232 | waitqueue_active(&fs_info->async_submit_wait)) |
| 234 | wake_up(&fs_info->async_submit_wait); | 233 | wake_up(&fs_info->async_submit_wait); |
| 235 | 234 | ||
| @@ -569,9 +568,11 @@ static int __btrfs_close_devices(struct btrfs_fs_devices *fs_devices) | |||
| 569 | memcpy(new_device, device, sizeof(*new_device)); | 568 | memcpy(new_device, device, sizeof(*new_device)); |
| 570 | 569 | ||
| 571 | /* Safe because we are under uuid_mutex */ | 570 | /* Safe because we are under uuid_mutex */ |
| 572 | name = rcu_string_strdup(device->name->str, GFP_NOFS); | 571 | if (device->name) { |
| 573 | BUG_ON(device->name && !name); /* -ENOMEM */ | 572 | name = rcu_string_strdup(device->name->str, GFP_NOFS); |
| 574 | rcu_assign_pointer(new_device->name, name); | 573 | BUG_ON(device->name && !name); /* -ENOMEM */ |
| 574 | rcu_assign_pointer(new_device->name, name); | ||
| 575 | } | ||
| 575 | new_device->bdev = NULL; | 576 | new_device->bdev = NULL; |
| 576 | new_device->writeable = 0; | 577 | new_device->writeable = 0; |
| 577 | new_device->in_fs_metadata = 0; | 578 | new_device->in_fs_metadata = 0; |
| @@ -4605,28 +4606,6 @@ int btrfs_read_sys_array(struct btrfs_root *root) | |||
| 4605 | return ret; | 4606 | return ret; |
| 4606 | } | 4607 | } |
| 4607 | 4608 | ||
| 4608 | struct btrfs_device *btrfs_find_device_for_logical(struct btrfs_root *root, | ||
| 4609 | u64 logical, int mirror_num) | ||
| 4610 | { | ||
| 4611 | struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree; | ||
| 4612 | int ret; | ||
| 4613 | u64 map_length = 0; | ||
| 4614 | struct btrfs_bio *bbio = NULL; | ||
| 4615 | struct btrfs_device *device; | ||
| 4616 | |||
| 4617 | BUG_ON(mirror_num == 0); | ||
| 4618 | ret = btrfs_map_block(map_tree, WRITE, logical, &map_length, &bbio, | ||
| 4619 | mirror_num); | ||
| 4620 | if (ret) { | ||
| 4621 | BUG_ON(bbio != NULL); | ||
| 4622 | return NULL; | ||
| 4623 | } | ||
| 4624 | BUG_ON(mirror_num != bbio->mirror_num); | ||
| 4625 | device = bbio->stripes[mirror_num - 1].dev; | ||
| 4626 | kfree(bbio); | ||
| 4627 | return device; | ||
| 4628 | } | ||
| 4629 | |||
| 4630 | int btrfs_read_chunk_tree(struct btrfs_root *root) | 4609 | int btrfs_read_chunk_tree(struct btrfs_root *root) |
| 4631 | { | 4610 | { |
| 4632 | struct btrfs_path *path; | 4611 | struct btrfs_path *path; |
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 5479325987b3..53c06af92e8d 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h | |||
| @@ -289,8 +289,6 @@ int btrfs_cancel_balance(struct btrfs_fs_info *fs_info); | |||
| 289 | int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset); | 289 | int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset); |
| 290 | int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes, | 290 | int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes, |
| 291 | u64 *start, u64 *max_avail); | 291 | u64 *start, u64 *max_avail); |
| 292 | struct btrfs_device *btrfs_find_device_for_logical(struct btrfs_root *root, | ||
| 293 | u64 logical, int mirror_num); | ||
| 294 | void btrfs_dev_stat_print_on_error(struct btrfs_device *device); | 292 | void btrfs_dev_stat_print_on_error(struct btrfs_device *device); |
| 295 | void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); | 293 | void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); |
| 296 | int btrfs_get_dev_stats(struct btrfs_root *root, | 294 | int btrfs_get_dev_stats(struct btrfs_root *root, |
diff --git a/fs/buffer.c b/fs/buffer.c index 9f6d2e41281d..58e2e7b77372 100644 --- a/fs/buffer.c +++ b/fs/buffer.c | |||
| @@ -914,7 +914,7 @@ link_dev_buffers(struct page *page, struct buffer_head *head) | |||
| 914 | /* | 914 | /* |
| 915 | * Initialise the state of a blockdev page's buffers. | 915 | * Initialise the state of a blockdev page's buffers. |
| 916 | */ | 916 | */ |
| 917 | static void | 917 | static sector_t |
| 918 | init_page_buffers(struct page *page, struct block_device *bdev, | 918 | init_page_buffers(struct page *page, struct block_device *bdev, |
| 919 | sector_t block, int size) | 919 | sector_t block, int size) |
| 920 | { | 920 | { |
| @@ -936,33 +936,41 @@ init_page_buffers(struct page *page, struct block_device *bdev, | |||
| 936 | block++; | 936 | block++; |
| 937 | bh = bh->b_this_page; | 937 | bh = bh->b_this_page; |
| 938 | } while (bh != head); | 938 | } while (bh != head); |
| 939 | |||
| 940 | /* | ||
| 941 | * Caller needs to validate requested block against end of device. | ||
| 942 | */ | ||
| 943 | return end_block; | ||
| 939 | } | 944 | } |
| 940 | 945 | ||
| 941 | /* | 946 | /* |
| 942 | * Create the page-cache page that contains the requested block. | 947 | * Create the page-cache page that contains the requested block. |
| 943 | * | 948 | * |
| 944 | * This is user purely for blockdev mappings. | 949 | * This is used purely for blockdev mappings. |
| 945 | */ | 950 | */ |
| 946 | static struct page * | 951 | static int |
| 947 | grow_dev_page(struct block_device *bdev, sector_t block, | 952 | grow_dev_page(struct block_device *bdev, sector_t block, |
| 948 | pgoff_t index, int size) | 953 | pgoff_t index, int size, int sizebits) |
| 949 | { | 954 | { |
| 950 | struct inode *inode = bdev->bd_inode; | 955 | struct inode *inode = bdev->bd_inode; |
| 951 | struct page *page; | 956 | struct page *page; |
| 952 | struct buffer_head *bh; | 957 | struct buffer_head *bh; |
| 958 | sector_t end_block; | ||
| 959 | int ret = 0; /* Will call free_more_memory() */ | ||
| 953 | 960 | ||
| 954 | page = find_or_create_page(inode->i_mapping, index, | 961 | page = find_or_create_page(inode->i_mapping, index, |
| 955 | (mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS)|__GFP_MOVABLE); | 962 | (mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS)|__GFP_MOVABLE); |
| 956 | if (!page) | 963 | if (!page) |
| 957 | return NULL; | 964 | return ret; |
| 958 | 965 | ||
| 959 | BUG_ON(!PageLocked(page)); | 966 | BUG_ON(!PageLocked(page)); |
| 960 | 967 | ||
| 961 | if (page_has_buffers(page)) { | 968 | if (page_has_buffers(page)) { |
| 962 | bh = page_buffers(page); | 969 | bh = page_buffers(page); |
| 963 | if (bh->b_size == size) { | 970 | if (bh->b_size == size) { |
| 964 | init_page_buffers(page, bdev, block, size); | 971 | end_block = init_page_buffers(page, bdev, |
| 965 | return page; | 972 | index << sizebits, size); |
| 973 | goto done; | ||
| 966 | } | 974 | } |
| 967 | if (!try_to_free_buffers(page)) | 975 | if (!try_to_free_buffers(page)) |
| 968 | goto failed; | 976 | goto failed; |
| @@ -982,14 +990,14 @@ grow_dev_page(struct block_device *bdev, sector_t block, | |||
| 982 | */ | 990 | */ |
| 983 | spin_lock(&inode->i_mapping->private_lock); | 991 | spin_lock(&inode->i_mapping->private_lock); |
| 984 | link_dev_buffers(page, bh); | 992 | link_dev_buffers(page, bh); |
| 985 | init_page_buffers(page, bdev, block, size); | 993 | end_block = init_page_buffers(page, bdev, index << sizebits, size); |
| 986 | spin_unlock(&inode->i_mapping->private_lock); | 994 | spin_unlock(&inode->i_mapping->private_lock); |
| 987 | return page; | 995 | done: |
| 988 | 996 | ret = (block < end_block) ? 1 : -ENXIO; | |
| 989 | failed: | 997 | failed: |
| 990 | unlock_page(page); | 998 | unlock_page(page); |
| 991 | page_cache_release(page); | 999 | page_cache_release(page); |
| 992 | return NULL; | 1000 | return ret; |
| 993 | } | 1001 | } |
| 994 | 1002 | ||
| 995 | /* | 1003 | /* |
| @@ -999,7 +1007,6 @@ failed: | |||
| 999 | static int | 1007 | static int |
| 1000 | grow_buffers(struct block_device *bdev, sector_t block, int size) | 1008 | grow_buffers(struct block_device *bdev, sector_t block, int size) |
| 1001 | { | 1009 | { |
| 1002 | struct page *page; | ||
| 1003 | pgoff_t index; | 1010 | pgoff_t index; |
| 1004 | int sizebits; | 1011 | int sizebits; |
| 1005 | 1012 | ||
| @@ -1023,22 +1030,14 @@ grow_buffers(struct block_device *bdev, sector_t block, int size) | |||
| 1023 | bdevname(bdev, b)); | 1030 | bdevname(bdev, b)); |
| 1024 | return -EIO; | 1031 | return -EIO; |
| 1025 | } | 1032 | } |
| 1026 | block = index << sizebits; | 1033 | |
| 1027 | /* Create a page with the proper size buffers.. */ | 1034 | /* Create a page with the proper size buffers.. */ |
| 1028 | page = grow_dev_page(bdev, block, index, size); | 1035 | return grow_dev_page(bdev, block, index, size, sizebits); |
| 1029 | if (!page) | ||
| 1030 | return 0; | ||
| 1031 | unlock_page(page); | ||
| 1032 | page_cache_release(page); | ||
| 1033 | return 1; | ||
| 1034 | } | 1036 | } |
| 1035 | 1037 | ||
| 1036 | static struct buffer_head * | 1038 | static struct buffer_head * |
| 1037 | __getblk_slow(struct block_device *bdev, sector_t block, int size) | 1039 | __getblk_slow(struct block_device *bdev, sector_t block, int size) |
| 1038 | { | 1040 | { |
| 1039 | int ret; | ||
| 1040 | struct buffer_head *bh; | ||
| 1041 | |||
| 1042 | /* Size must be multiple of hard sectorsize */ | 1041 | /* Size must be multiple of hard sectorsize */ |
| 1043 | if (unlikely(size & (bdev_logical_block_size(bdev)-1) || | 1042 | if (unlikely(size & (bdev_logical_block_size(bdev)-1) || |
| 1044 | (size < 512 || size > PAGE_SIZE))) { | 1043 | (size < 512 || size > PAGE_SIZE))) { |
| @@ -1051,21 +1050,20 @@ __getblk_slow(struct block_device *bdev, sector_t block, int size) | |||
| 1051 | return NULL; | 1050 | return NULL; |
| 1052 | } | 1051 | } |
| 1053 | 1052 | ||
| 1054 | retry: | 1053 | for (;;) { |
| 1055 | bh = __find_get_block(bdev, block, size); | 1054 | struct buffer_head *bh; |
| 1056 | if (bh) | 1055 | int ret; |
| 1057 | return bh; | ||
| 1058 | 1056 | ||
| 1059 | ret = grow_buffers(bdev, block, size); | ||
| 1060 | if (ret == 0) { | ||
| 1061 | free_more_memory(); | ||
| 1062 | goto retry; | ||
| 1063 | } else if (ret > 0) { | ||
| 1064 | bh = __find_get_block(bdev, block, size); | 1057 | bh = __find_get_block(bdev, block, size); |
| 1065 | if (bh) | 1058 | if (bh) |
| 1066 | return bh; | 1059 | return bh; |
| 1060 | |||
| 1061 | ret = grow_buffers(bdev, block, size); | ||
| 1062 | if (ret < 0) | ||
| 1063 | return NULL; | ||
| 1064 | if (ret == 0) | ||
| 1065 | free_more_memory(); | ||
| 1067 | } | 1066 | } |
| 1068 | return NULL; | ||
| 1069 | } | 1067 | } |
| 1070 | 1068 | ||
| 1071 | /* | 1069 | /* |
| @@ -1321,10 +1319,6 @@ EXPORT_SYMBOL(__find_get_block); | |||
| 1321 | * which corresponds to the passed block_device, block and size. The | 1319 | * which corresponds to the passed block_device, block and size. The |
| 1322 | * returned buffer has its reference count incremented. | 1320 | * returned buffer has its reference count incremented. |
| 1323 | * | 1321 | * |
| 1324 | * __getblk() cannot fail - it just keeps trying. If you pass it an | ||
| 1325 | * illegal block number, __getblk() will happily return a buffer_head | ||
| 1326 | * which represents the non-existent block. Very weird. | ||
| 1327 | * | ||
| 1328 | * __getblk() will lock up the machine if grow_dev_page's try_to_free_buffers() | 1322 | * __getblk() will lock up the machine if grow_dev_page's try_to_free_buffers() |
| 1329 | * attempt is failing. FIXME, perhaps? | 1323 | * attempt is failing. FIXME, perhaps? |
| 1330 | */ | 1324 | */ |
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 7dab9c04ad52..53cf2aabce87 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
| @@ -328,7 +328,7 @@ cifsConvertToUTF16(__le16 *target, const char *source, int srclen, | |||
| 328 | } | 328 | } |
| 329 | 329 | ||
| 330 | ctoUTF16_out: | 330 | ctoUTF16_out: |
| 331 | return i; | 331 | return j; |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | #ifdef CONFIG_CIFS_SMB2 | 334 | #ifdef CONFIG_CIFS_SMB2 |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 074923ce593d..f0cf934ba877 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
| @@ -1576,9 +1576,14 @@ cifs_readv_callback(struct mid_q_entry *mid) | |||
| 1576 | /* result already set, check signature */ | 1576 | /* result already set, check signature */ |
| 1577 | if (server->sec_mode & | 1577 | if (server->sec_mode & |
| 1578 | (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { | 1578 | (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { |
| 1579 | if (cifs_verify_signature(rdata->iov, rdata->nr_iov, | 1579 | int rc = 0; |
| 1580 | server, mid->sequence_number + 1)) | 1580 | |
| 1581 | cERROR(1, "Unexpected SMB signature"); | 1581 | rc = cifs_verify_signature(rdata->iov, rdata->nr_iov, |
| 1582 | server, | ||
| 1583 | mid->sequence_number + 1); | ||
| 1584 | if (rc) | ||
| 1585 | cERROR(1, "SMB signature verification returned " | ||
| 1586 | "error = %d", rc); | ||
| 1582 | } | 1587 | } |
| 1583 | /* FIXME: should this be counted toward the initiating task? */ | 1588 | /* FIXME: should this be counted toward the initiating task? */ |
| 1584 | task_io_account_read(rdata->bytes); | 1589 | task_io_account_read(rdata->bytes); |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index cbe709ad6663..781025be48bc 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
| @@ -356,19 +356,12 @@ cifs_create_get_file_info: | |||
| 356 | cifs_create_set_dentry: | 356 | cifs_create_set_dentry: |
| 357 | if (rc != 0) { | 357 | if (rc != 0) { |
| 358 | cFYI(1, "Create worked, get_inode_info failed rc = %d", rc); | 358 | cFYI(1, "Create worked, get_inode_info failed rc = %d", rc); |
| 359 | CIFSSMBClose(xid, tcon, *fileHandle); | ||
| 359 | goto out; | 360 | goto out; |
| 360 | } | 361 | } |
| 361 | d_drop(direntry); | 362 | d_drop(direntry); |
| 362 | d_add(direntry, newinode); | 363 | d_add(direntry, newinode); |
| 363 | 364 | ||
| 364 | /* ENOENT for create? How weird... */ | ||
| 365 | rc = -ENOENT; | ||
| 366 | if (!newinode) { | ||
| 367 | CIFSSMBClose(xid, tcon, *fileHandle); | ||
| 368 | goto out; | ||
| 369 | } | ||
| 370 | rc = 0; | ||
| 371 | |||
| 372 | out: | 365 | out: |
| 373 | kfree(buf); | 366 | kfree(buf); |
| 374 | kfree(full_path); | 367 | kfree(full_path); |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 9154192b0683..71e9ad9f5961 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -917,7 +917,7 @@ cifs_push_mandatory_locks(struct cifsFileInfo *cfile) | |||
| 917 | if (!buf) { | 917 | if (!buf) { |
| 918 | mutex_unlock(&cinode->lock_mutex); | 918 | mutex_unlock(&cinode->lock_mutex); |
| 919 | free_xid(xid); | 919 | free_xid(xid); |
| 920 | return rc; | 920 | return -ENOMEM; |
| 921 | } | 921 | } |
| 922 | 922 | ||
| 923 | for (i = 0; i < 2; i++) { | 923 | for (i = 0; i < 2; i++) { |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 7354877fa3bd..cb79c7edecb0 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
| @@ -124,10 +124,10 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) | |||
| 124 | { | 124 | { |
| 125 | struct cifsInodeInfo *cifs_i = CIFS_I(inode); | 125 | struct cifsInodeInfo *cifs_i = CIFS_I(inode); |
| 126 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); | 126 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); |
| 127 | unsigned long oldtime = cifs_i->time; | ||
| 128 | 127 | ||
| 129 | cifs_revalidate_cache(inode, fattr); | 128 | cifs_revalidate_cache(inode, fattr); |
| 130 | 129 | ||
| 130 | spin_lock(&inode->i_lock); | ||
| 131 | inode->i_atime = fattr->cf_atime; | 131 | inode->i_atime = fattr->cf_atime; |
| 132 | inode->i_mtime = fattr->cf_mtime; | 132 | inode->i_mtime = fattr->cf_mtime; |
| 133 | inode->i_ctime = fattr->cf_ctime; | 133 | inode->i_ctime = fattr->cf_ctime; |
| @@ -148,9 +148,6 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) | |||
| 148 | else | 148 | else |
| 149 | cifs_i->time = jiffies; | 149 | cifs_i->time = jiffies; |
| 150 | 150 | ||
| 151 | cFYI(1, "inode 0x%p old_time=%ld new_time=%ld", inode, | ||
| 152 | oldtime, cifs_i->time); | ||
| 153 | |||
| 154 | cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING; | 151 | cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING; |
| 155 | 152 | ||
| 156 | cifs_i->server_eof = fattr->cf_eof; | 153 | cifs_i->server_eof = fattr->cf_eof; |
| @@ -158,7 +155,6 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) | |||
| 158 | * Can't safely change the file size here if the client is writing to | 155 | * Can't safely change the file size here if the client is writing to |
| 159 | * it due to potential races. | 156 | * it due to potential races. |
| 160 | */ | 157 | */ |
| 161 | spin_lock(&inode->i_lock); | ||
| 162 | if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) { | 158 | if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) { |
| 163 | i_size_write(inode, fattr->cf_eof); | 159 | i_size_write(inode, fattr->cf_eof); |
| 164 | 160 | ||
| @@ -859,12 +855,14 @@ struct inode *cifs_root_iget(struct super_block *sb) | |||
| 859 | 855 | ||
| 860 | if (rc && tcon->ipc) { | 856 | if (rc && tcon->ipc) { |
| 861 | cFYI(1, "ipc connection - fake read inode"); | 857 | cFYI(1, "ipc connection - fake read inode"); |
| 858 | spin_lock(&inode->i_lock); | ||
| 862 | inode->i_mode |= S_IFDIR; | 859 | inode->i_mode |= S_IFDIR; |
| 863 | set_nlink(inode, 2); | 860 | set_nlink(inode, 2); |
| 864 | inode->i_op = &cifs_ipc_inode_ops; | 861 | inode->i_op = &cifs_ipc_inode_ops; |
| 865 | inode->i_fop = &simple_dir_operations; | 862 | inode->i_fop = &simple_dir_operations; |
| 866 | inode->i_uid = cifs_sb->mnt_uid; | 863 | inode->i_uid = cifs_sb->mnt_uid; |
| 867 | inode->i_gid = cifs_sb->mnt_gid; | 864 | inode->i_gid = cifs_sb->mnt_gid; |
| 865 | spin_unlock(&inode->i_lock); | ||
| 868 | } else if (rc) { | 866 | } else if (rc) { |
| 869 | iget_failed(inode); | 867 | iget_failed(inode); |
| 870 | inode = ERR_PTR(rc); | 868 | inode = ERR_PTR(rc); |
| @@ -1110,6 +1108,15 @@ undo_setattr: | |||
| 1110 | goto out_close; | 1108 | goto out_close; |
| 1111 | } | 1109 | } |
| 1112 | 1110 | ||
| 1111 | /* copied from fs/nfs/dir.c with small changes */ | ||
| 1112 | static void | ||
| 1113 | cifs_drop_nlink(struct inode *inode) | ||
| 1114 | { | ||
| 1115 | spin_lock(&inode->i_lock); | ||
| 1116 | if (inode->i_nlink > 0) | ||
| 1117 | drop_nlink(inode); | ||
| 1118 | spin_unlock(&inode->i_lock); | ||
| 1119 | } | ||
| 1113 | 1120 | ||
| 1114 | /* | 1121 | /* |
| 1115 | * If dentry->d_inode is null (usually meaning the cached dentry | 1122 | * If dentry->d_inode is null (usually meaning the cached dentry |
| @@ -1166,13 +1173,13 @@ retry_std_delete: | |||
| 1166 | psx_del_no_retry: | 1173 | psx_del_no_retry: |
| 1167 | if (!rc) { | 1174 | if (!rc) { |
| 1168 | if (inode) | 1175 | if (inode) |
| 1169 | drop_nlink(inode); | 1176 | cifs_drop_nlink(inode); |
| 1170 | } else if (rc == -ENOENT) { | 1177 | } else if (rc == -ENOENT) { |
| 1171 | d_drop(dentry); | 1178 | d_drop(dentry); |
| 1172 | } else if (rc == -ETXTBSY) { | 1179 | } else if (rc == -ETXTBSY) { |
| 1173 | rc = cifs_rename_pending_delete(full_path, dentry, xid); | 1180 | rc = cifs_rename_pending_delete(full_path, dentry, xid); |
| 1174 | if (rc == 0) | 1181 | if (rc == 0) |
| 1175 | drop_nlink(inode); | 1182 | cifs_drop_nlink(inode); |
| 1176 | } else if ((rc == -EACCES) && (dosattr == 0) && inode) { | 1183 | } else if ((rc == -EACCES) && (dosattr == 0) && inode) { |
| 1177 | attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); | 1184 | attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); |
| 1178 | if (attrs == NULL) { | 1185 | if (attrs == NULL) { |
| @@ -1241,9 +1248,10 @@ cifs_mkdir_qinfo(struct inode *inode, struct dentry *dentry, umode_t mode, | |||
| 1241 | * setting nlink not necessary except in cases where we failed to get it | 1248 | * setting nlink not necessary except in cases where we failed to get it |
| 1242 | * from the server or was set bogus | 1249 | * from the server or was set bogus |
| 1243 | */ | 1250 | */ |
| 1251 | spin_lock(&dentry->d_inode->i_lock); | ||
| 1244 | if ((dentry->d_inode) && (dentry->d_inode->i_nlink < 2)) | 1252 | if ((dentry->d_inode) && (dentry->d_inode->i_nlink < 2)) |
| 1245 | set_nlink(dentry->d_inode, 2); | 1253 | set_nlink(dentry->d_inode, 2); |
| 1246 | 1254 | spin_unlock(&dentry->d_inode->i_lock); | |
| 1247 | mode &= ~current_umask(); | 1255 | mode &= ~current_umask(); |
| 1248 | /* must turn on setgid bit if parent dir has it */ | 1256 | /* must turn on setgid bit if parent dir has it */ |
| 1249 | if (inode->i_mode & S_ISGID) | 1257 | if (inode->i_mode & S_ISGID) |
diff --git a/fs/cifs/link.c b/fs/cifs/link.c index 09e4b3ae4564..e6ce3b112875 100644 --- a/fs/cifs/link.c +++ b/fs/cifs/link.c | |||
| @@ -433,7 +433,9 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode, | |||
| 433 | if (old_file->d_inode) { | 433 | if (old_file->d_inode) { |
| 434 | cifsInode = CIFS_I(old_file->d_inode); | 434 | cifsInode = CIFS_I(old_file->d_inode); |
| 435 | if (rc == 0) { | 435 | if (rc == 0) { |
| 436 | spin_lock(&old_file->d_inode->i_lock); | ||
| 436 | inc_nlink(old_file->d_inode); | 437 | inc_nlink(old_file->d_inode); |
| 438 | spin_unlock(&old_file->d_inode->i_lock); | ||
| 437 | /* BB should we make this contingent on superblock flag NOATIME? */ | 439 | /* BB should we make this contingent on superblock flag NOATIME? */ |
| 438 | /* old_file->d_inode->i_ctime = CURRENT_TIME;*/ | 440 | /* old_file->d_inode->i_ctime = CURRENT_TIME;*/ |
| 439 | /* parent dir timestamps will update from srv | 441 | /* parent dir timestamps will update from srv |
diff --git a/fs/cifs/smb2misc.c b/fs/cifs/smb2misc.c index a4ff5d547554..e4d3b9964167 100644 --- a/fs/cifs/smb2misc.c +++ b/fs/cifs/smb2misc.c | |||
| @@ -52,7 +52,8 @@ check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid) | |||
| 52 | cERROR(1, "Bad protocol string signature header %x", | 52 | cERROR(1, "Bad protocol string signature header %x", |
| 53 | *(unsigned int *) hdr->ProtocolId); | 53 | *(unsigned int *) hdr->ProtocolId); |
| 54 | if (mid != hdr->MessageId) | 54 | if (mid != hdr->MessageId) |
| 55 | cERROR(1, "Mids do not match"); | 55 | cERROR(1, "Mids do not match: %llu and %llu", mid, |
| 56 | hdr->MessageId); | ||
| 56 | } | 57 | } |
| 57 | cERROR(1, "Bad SMB detected. The Mid=%llu", hdr->MessageId); | 58 | cERROR(1, "Bad SMB detected. The Mid=%llu", hdr->MessageId); |
| 58 | return 1; | 59 | return 1; |
| @@ -107,7 +108,7 @@ smb2_check_message(char *buf, unsigned int length) | |||
| 107 | * ie Validate the wct via smb2_struct_sizes table above | 108 | * ie Validate the wct via smb2_struct_sizes table above |
| 108 | */ | 109 | */ |
| 109 | 110 | ||
| 110 | if (length < 2 + sizeof(struct smb2_hdr)) { | 111 | if (length < sizeof(struct smb2_pdu)) { |
| 111 | if ((length >= sizeof(struct smb2_hdr)) && (hdr->Status != 0)) { | 112 | if ((length >= sizeof(struct smb2_hdr)) && (hdr->Status != 0)) { |
| 112 | pdu->StructureSize2 = 0; | 113 | pdu->StructureSize2 = 0; |
| 113 | /* | 114 | /* |
| @@ -121,15 +122,15 @@ smb2_check_message(char *buf, unsigned int length) | |||
| 121 | return 1; | 122 | return 1; |
| 122 | } | 123 | } |
| 123 | if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE - 4) { | 124 | if (len > CIFSMaxBufSize + MAX_SMB2_HDR_SIZE - 4) { |
| 124 | cERROR(1, "SMB length greater than maximum, mid=%lld", mid); | 125 | cERROR(1, "SMB length greater than maximum, mid=%llu", mid); |
| 125 | return 1; | 126 | return 1; |
| 126 | } | 127 | } |
| 127 | 128 | ||
| 128 | if (check_smb2_hdr(hdr, mid)) | 129 | if (check_smb2_hdr(hdr, mid)) |
| 129 | return 1; | 130 | return 1; |
| 130 | 131 | ||
| 131 | if (hdr->StructureSize != SMB2_HEADER_SIZE) { | 132 | if (hdr->StructureSize != SMB2_HEADER_STRUCTURE_SIZE) { |
| 132 | cERROR(1, "Illegal structure size %d", | 133 | cERROR(1, "Illegal structure size %u", |
| 133 | le16_to_cpu(hdr->StructureSize)); | 134 | le16_to_cpu(hdr->StructureSize)); |
| 134 | return 1; | 135 | return 1; |
| 135 | } | 136 | } |
| @@ -161,8 +162,9 @@ smb2_check_message(char *buf, unsigned int length) | |||
| 161 | if (4 + len != clc_len) { | 162 | if (4 + len != clc_len) { |
| 162 | cFYI(1, "Calculated size %u length %u mismatch mid %llu", | 163 | cFYI(1, "Calculated size %u length %u mismatch mid %llu", |
| 163 | clc_len, 4 + len, mid); | 164 | clc_len, 4 + len, mid); |
| 164 | if (clc_len == 4 + len + 1) /* BB FIXME (fix samba) */ | 165 | /* server can return one byte more */ |
| 165 | return 0; /* BB workaround Samba 3 bug SessSetup rsp */ | 166 | if (clc_len == 4 + len + 1) |
| 167 | return 0; | ||
| 166 | return 1; | 168 | return 1; |
| 167 | } | 169 | } |
| 168 | return 0; | 170 | return 0; |
diff --git a/fs/cifs/smb2pdu.h b/fs/cifs/smb2pdu.h index f37a1b41b402..15dc8eea8273 100644 --- a/fs/cifs/smb2pdu.h +++ b/fs/cifs/smb2pdu.h | |||
| @@ -87,10 +87,6 @@ | |||
| 87 | 87 | ||
| 88 | #define SMB2_PROTO_NUMBER __constant_cpu_to_le32(0x424d53fe) | 88 | #define SMB2_PROTO_NUMBER __constant_cpu_to_le32(0x424d53fe) |
| 89 | 89 | ||
| 90 | #define SMB2_HEADER_SIZE __constant_le16_to_cpu(64) | ||
| 91 | |||
| 92 | #define SMB2_ERROR_STRUCTURE_SIZE2 __constant_le16_to_cpu(9) | ||
| 93 | |||
| 94 | /* | 90 | /* |
| 95 | * SMB2 Header Definition | 91 | * SMB2 Header Definition |
| 96 | * | 92 | * |
| @@ -99,6 +95,9 @@ | |||
| 99 | * "PDU" : "Protocol Data Unit" (ie a network "frame") | 95 | * "PDU" : "Protocol Data Unit" (ie a network "frame") |
| 100 | * | 96 | * |
| 101 | */ | 97 | */ |
| 98 | |||
| 99 | #define SMB2_HEADER_STRUCTURE_SIZE __constant_cpu_to_le16(64) | ||
| 100 | |||
| 102 | struct smb2_hdr { | 101 | struct smb2_hdr { |
| 103 | __be32 smb2_buf_length; /* big endian on wire */ | 102 | __be32 smb2_buf_length; /* big endian on wire */ |
| 104 | /* length is only two or three bytes - with | 103 | /* length is only two or three bytes - with |
| @@ -140,6 +139,9 @@ struct smb2_pdu { | |||
| 140 | * command code name for the struct. Note that structures must be packed. | 139 | * command code name for the struct. Note that structures must be packed. |
| 141 | * | 140 | * |
| 142 | */ | 141 | */ |
| 142 | |||
| 143 | #define SMB2_ERROR_STRUCTURE_SIZE2 __constant_cpu_to_le16(9) | ||
| 144 | |||
| 143 | struct smb2_err_rsp { | 145 | struct smb2_err_rsp { |
| 144 | struct smb2_hdr hdr; | 146 | struct smb2_hdr hdr; |
| 145 | __le16 StructureSize; | 147 | __le16 StructureSize; |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 83867ef348df..d9b639b95fa8 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
| @@ -503,13 +503,16 @@ cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, | |||
| 503 | /* convert the length into a more usable form */ | 503 | /* convert the length into a more usable form */ |
| 504 | if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { | 504 | if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { |
| 505 | struct kvec iov; | 505 | struct kvec iov; |
| 506 | int rc = 0; | ||
| 506 | 507 | ||
| 507 | iov.iov_base = mid->resp_buf; | 508 | iov.iov_base = mid->resp_buf; |
| 508 | iov.iov_len = len; | 509 | iov.iov_len = len; |
| 509 | /* FIXME: add code to kill session */ | 510 | /* FIXME: add code to kill session */ |
| 510 | if (cifs_verify_signature(&iov, 1, server, | 511 | rc = cifs_verify_signature(&iov, 1, server, |
| 511 | mid->sequence_number + 1) != 0) | 512 | mid->sequence_number + 1); |
| 512 | cERROR(1, "Unexpected SMB signature"); | 513 | if (rc) |
| 514 | cERROR(1, "SMB signature verification returned error = " | ||
| 515 | "%d", rc); | ||
| 513 | } | 516 | } |
| 514 | 517 | ||
| 515 | /* BB special case reconnect tid and uid here? */ | 518 | /* BB special case reconnect tid and uid here? */ |
diff --git a/fs/dcache.c b/fs/dcache.c index 8086636bf796..16521a9f2038 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
| @@ -389,7 +389,7 @@ static struct dentry *d_kill(struct dentry *dentry, struct dentry *parent) | |||
| 389 | * Inform try_to_ascend() that we are no longer attached to the | 389 | * Inform try_to_ascend() that we are no longer attached to the |
| 390 | * dentry tree | 390 | * dentry tree |
| 391 | */ | 391 | */ |
| 392 | dentry->d_flags |= DCACHE_DISCONNECTED; | 392 | dentry->d_flags |= DCACHE_DENTRY_KILLED; |
| 393 | if (parent) | 393 | if (parent) |
| 394 | spin_unlock(&parent->d_lock); | 394 | spin_unlock(&parent->d_lock); |
| 395 | dentry_iput(dentry); | 395 | dentry_iput(dentry); |
| @@ -1048,7 +1048,7 @@ static struct dentry *try_to_ascend(struct dentry *old, int locked, unsigned seq | |||
| 1048 | * or deletion | 1048 | * or deletion |
| 1049 | */ | 1049 | */ |
| 1050 | if (new != old->d_parent || | 1050 | if (new != old->d_parent || |
| 1051 | (old->d_flags & DCACHE_DISCONNECTED) || | 1051 | (old->d_flags & DCACHE_DENTRY_KILLED) || |
| 1052 | (!locked && read_seqretry(&rename_lock, seq))) { | 1052 | (!locked && read_seqretry(&rename_lock, seq))) { |
| 1053 | spin_unlock(&new->d_lock); | 1053 | spin_unlock(&new->d_lock); |
| 1054 | new = NULL; | 1054 | new = NULL; |
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 2340f6978d6e..c5ca6ae5a30c 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
| @@ -526,73 +526,51 @@ struct array_data { | |||
| 526 | u32 elements; | 526 | u32 elements; |
| 527 | }; | 527 | }; |
| 528 | 528 | ||
| 529 | static int u32_array_open(struct inode *inode, struct file *file) | 529 | static size_t u32_format_array(char *buf, size_t bufsize, |
| 530 | { | 530 | u32 *array, int array_size) |
| 531 | file->private_data = NULL; | ||
| 532 | return nonseekable_open(inode, file); | ||
| 533 | } | ||
| 534 | |||
| 535 | static size_t format_array(char *buf, size_t bufsize, const char *fmt, | ||
| 536 | u32 *array, u32 array_size) | ||
| 537 | { | 531 | { |
| 538 | size_t ret = 0; | 532 | size_t ret = 0; |
| 539 | u32 i; | ||
| 540 | 533 | ||
| 541 | for (i = 0; i < array_size; i++) { | 534 | while (--array_size >= 0) { |
| 542 | size_t len; | 535 | size_t len; |
| 536 | char term = array_size ? ' ' : '\n'; | ||
| 543 | 537 | ||
| 544 | len = snprintf(buf, bufsize, fmt, array[i]); | 538 | len = snprintf(buf, bufsize, "%u%c", *array++, term); |
| 545 | len++; /* ' ' or '\n' */ | ||
| 546 | ret += len; | 539 | ret += len; |
| 547 | 540 | ||
| 548 | if (buf) { | 541 | buf += len; |
| 549 | buf += len; | 542 | bufsize -= len; |
| 550 | bufsize -= len; | ||
| 551 | buf[-1] = (i == array_size-1) ? '\n' : ' '; | ||
| 552 | } | ||
| 553 | } | 543 | } |
| 554 | |||
| 555 | ret++; /* \0 */ | ||
| 556 | if (buf) | ||
| 557 | *buf = '\0'; | ||
| 558 | |||
| 559 | return ret; | 544 | return ret; |
| 560 | } | 545 | } |
| 561 | 546 | ||
| 562 | static char *format_array_alloc(const char *fmt, u32 *array, | 547 | static int u32_array_open(struct inode *inode, struct file *file) |
| 563 | u32 array_size) | ||
| 564 | { | 548 | { |
| 565 | size_t len = format_array(NULL, 0, fmt, array, array_size); | 549 | struct array_data *data = inode->i_private; |
| 566 | char *ret; | 550 | int size, elements = data->elements; |
| 567 | 551 | char *buf; | |
| 568 | ret = kmalloc(len, GFP_KERNEL); | 552 | |
| 569 | if (ret == NULL) | 553 | /* |
| 570 | return NULL; | 554 | * Max size: |
| 555 | * - 10 digits + ' '/'\n' = 11 bytes per number | ||
| 556 | * - terminating NUL character | ||
| 557 | */ | ||
| 558 | size = elements*11; | ||
| 559 | buf = kmalloc(size+1, GFP_KERNEL); | ||
| 560 | if (!buf) | ||
| 561 | return -ENOMEM; | ||
| 562 | buf[size] = 0; | ||
| 563 | |||
| 564 | file->private_data = buf; | ||
| 565 | u32_format_array(buf, size, data->array, data->elements); | ||
| 571 | 566 | ||
| 572 | format_array(ret, len, fmt, array, array_size); | 567 | return nonseekable_open(inode, file); |
| 573 | return ret; | ||
| 574 | } | 568 | } |
| 575 | 569 | ||
| 576 | static ssize_t u32_array_read(struct file *file, char __user *buf, size_t len, | 570 | static ssize_t u32_array_read(struct file *file, char __user *buf, size_t len, |
| 577 | loff_t *ppos) | 571 | loff_t *ppos) |
| 578 | { | 572 | { |
| 579 | struct inode *inode = file->f_path.dentry->d_inode; | 573 | size_t size = strlen(file->private_data); |
| 580 | struct array_data *data = inode->i_private; | ||
| 581 | size_t size; | ||
| 582 | |||
| 583 | if (*ppos == 0) { | ||
| 584 | if (file->private_data) { | ||
| 585 | kfree(file->private_data); | ||
| 586 | file->private_data = NULL; | ||
| 587 | } | ||
| 588 | |||
| 589 | file->private_data = format_array_alloc("%u", data->array, | ||
| 590 | data->elements); | ||
| 591 | } | ||
| 592 | |||
| 593 | size = 0; | ||
| 594 | if (file->private_data) | ||
| 595 | size = strlen(file->private_data); | ||
| 596 | 574 | ||
| 597 | return simple_read_from_buffer(buf, len, ppos, | 575 | return simple_read_from_buffer(buf, len, ppos, |
| 598 | file->private_data, size); | 576 | file->private_data, size); |
diff --git a/fs/direct-io.c b/fs/direct-io.c index 1faf4cb56f39..f86c720dba0e 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c | |||
| @@ -1062,6 +1062,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
| 1062 | unsigned long user_addr; | 1062 | unsigned long user_addr; |
| 1063 | size_t bytes; | 1063 | size_t bytes; |
| 1064 | struct buffer_head map_bh = { 0, }; | 1064 | struct buffer_head map_bh = { 0, }; |
| 1065 | struct blk_plug plug; | ||
| 1065 | 1066 | ||
| 1066 | if (rw & WRITE) | 1067 | if (rw & WRITE) |
| 1067 | rw = WRITE_ODIRECT; | 1068 | rw = WRITE_ODIRECT; |
| @@ -1177,6 +1178,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
| 1177 | PAGE_SIZE - user_addr / PAGE_SIZE); | 1178 | PAGE_SIZE - user_addr / PAGE_SIZE); |
| 1178 | } | 1179 | } |
| 1179 | 1180 | ||
| 1181 | blk_start_plug(&plug); | ||
| 1182 | |||
| 1180 | for (seg = 0; seg < nr_segs; seg++) { | 1183 | for (seg = 0; seg < nr_segs; seg++) { |
| 1181 | user_addr = (unsigned long)iov[seg].iov_base; | 1184 | user_addr = (unsigned long)iov[seg].iov_base; |
| 1182 | sdio.size += bytes = iov[seg].iov_len; | 1185 | sdio.size += bytes = iov[seg].iov_len; |
| @@ -1235,6 +1238,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, | |||
| 1235 | if (sdio.bio) | 1238 | if (sdio.bio) |
| 1236 | dio_bio_submit(dio, &sdio); | 1239 | dio_bio_submit(dio, &sdio); |
| 1237 | 1240 | ||
| 1241 | blk_finish_plug(&plug); | ||
| 1242 | |||
| 1238 | /* | 1243 | /* |
| 1239 | * It is possible that, we return short IO due to end of file. | 1244 | * It is possible that, we return short IO due to end of file. |
| 1240 | * In that case, we need to release all the pages we got hold on. | 1245 | * In that case, we need to release all the pages we got hold on. |
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 44ce5c6a541d..d45ba4568128 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
| @@ -275,8 +275,14 @@ out: | |||
| 275 | 275 | ||
| 276 | static int ecryptfs_flush(struct file *file, fl_owner_t td) | 276 | static int ecryptfs_flush(struct file *file, fl_owner_t td) |
| 277 | { | 277 | { |
| 278 | return file->f_mode & FMODE_WRITE | 278 | struct file *lower_file = ecryptfs_file_to_lower(file); |
| 279 | ? filemap_write_and_wait(file->f_mapping) : 0; | 279 | |
| 280 | if (lower_file->f_op && lower_file->f_op->flush) { | ||
| 281 | filemap_write_and_wait(file->f_mapping); | ||
| 282 | return lower_file->f_op->flush(lower_file, td); | ||
| 283 | } | ||
| 284 | |||
| 285 | return 0; | ||
| 280 | } | 286 | } |
| 281 | 287 | ||
| 282 | static int ecryptfs_release(struct inode *inode, struct file *file) | 288 | static int ecryptfs_release(struct inode *inode, struct file *file) |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 534b129ea676..cc7709e7c508 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -619,6 +619,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 619 | struct dentry *lower_old_dir_dentry; | 619 | struct dentry *lower_old_dir_dentry; |
| 620 | struct dentry *lower_new_dir_dentry; | 620 | struct dentry *lower_new_dir_dentry; |
| 621 | struct dentry *trap = NULL; | 621 | struct dentry *trap = NULL; |
| 622 | struct inode *target_inode; | ||
| 622 | 623 | ||
| 623 | lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); | 624 | lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); |
| 624 | lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); | 625 | lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); |
| @@ -626,6 +627,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 626 | dget(lower_new_dentry); | 627 | dget(lower_new_dentry); |
| 627 | lower_old_dir_dentry = dget_parent(lower_old_dentry); | 628 | lower_old_dir_dentry = dget_parent(lower_old_dentry); |
| 628 | lower_new_dir_dentry = dget_parent(lower_new_dentry); | 629 | lower_new_dir_dentry = dget_parent(lower_new_dentry); |
| 630 | target_inode = new_dentry->d_inode; | ||
| 629 | trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); | 631 | trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); |
| 630 | /* source should not be ancestor of target */ | 632 | /* source should not be ancestor of target */ |
| 631 | if (trap == lower_old_dentry) { | 633 | if (trap == lower_old_dentry) { |
| @@ -641,6 +643,9 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 641 | lower_new_dir_dentry->d_inode, lower_new_dentry); | 643 | lower_new_dir_dentry->d_inode, lower_new_dentry); |
| 642 | if (rc) | 644 | if (rc) |
| 643 | goto out_lock; | 645 | goto out_lock; |
| 646 | if (target_inode) | ||
| 647 | fsstack_copy_attr_all(target_inode, | ||
| 648 | ecryptfs_inode_to_lower(target_inode)); | ||
| 644 | fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode); | 649 | fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode); |
| 645 | if (new_dir != old_dir) | 650 | if (new_dir != old_dir) |
| 646 | fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); | 651 | fsstack_copy_attr_all(old_dir, lower_old_dir_dentry->d_inode); |
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 2768138eefee..9b627c15010a 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c | |||
| @@ -162,6 +162,7 @@ void ecryptfs_put_lower_file(struct inode *inode) | |||
| 162 | inode_info = ecryptfs_inode_to_private(inode); | 162 | inode_info = ecryptfs_inode_to_private(inode); |
| 163 | if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count, | 163 | if (atomic_dec_and_mutex_lock(&inode_info->lower_file_count, |
| 164 | &inode_info->lower_file_mutex)) { | 164 | &inode_info->lower_file_mutex)) { |
| 165 | filemap_write_and_wait(inode->i_mapping); | ||
| 165 | fput(inode_info->lower_file); | 166 | fput(inode_info->lower_file); |
| 166 | inode_info->lower_file = NULL; | 167 | inode_info->lower_file = NULL; |
| 167 | mutex_unlock(&inode_info->lower_file_mutex); | 168 | mutex_unlock(&inode_info->lower_file_mutex); |
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index a07597307fd1..ff574b4e345e 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c | |||
| @@ -3072,6 +3072,8 @@ static int ext3_do_update_inode(handle_t *handle, | |||
| 3072 | struct ext3_inode_info *ei = EXT3_I(inode); | 3072 | struct ext3_inode_info *ei = EXT3_I(inode); |
| 3073 | struct buffer_head *bh = iloc->bh; | 3073 | struct buffer_head *bh = iloc->bh; |
| 3074 | int err = 0, rc, block; | 3074 | int err = 0, rc, block; |
| 3075 | int need_datasync = 0; | ||
| 3076 | __le32 disksize; | ||
| 3075 | uid_t i_uid; | 3077 | uid_t i_uid; |
| 3076 | gid_t i_gid; | 3078 | gid_t i_gid; |
| 3077 | 3079 | ||
| @@ -3113,7 +3115,11 @@ again: | |||
| 3113 | raw_inode->i_gid_high = 0; | 3115 | raw_inode->i_gid_high = 0; |
| 3114 | } | 3116 | } |
| 3115 | raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); | 3117 | raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); |
| 3116 | raw_inode->i_size = cpu_to_le32(ei->i_disksize); | 3118 | disksize = cpu_to_le32(ei->i_disksize); |
| 3119 | if (disksize != raw_inode->i_size) { | ||
| 3120 | need_datasync = 1; | ||
| 3121 | raw_inode->i_size = disksize; | ||
| 3122 | } | ||
| 3117 | raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); | 3123 | raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec); |
| 3118 | raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec); | 3124 | raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec); |
| 3119 | raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec); | 3125 | raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec); |
| @@ -3129,8 +3135,11 @@ again: | |||
| 3129 | if (!S_ISREG(inode->i_mode)) { | 3135 | if (!S_ISREG(inode->i_mode)) { |
| 3130 | raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl); | 3136 | raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl); |
| 3131 | } else { | 3137 | } else { |
| 3132 | raw_inode->i_size_high = | 3138 | disksize = cpu_to_le32(ei->i_disksize >> 32); |
| 3133 | cpu_to_le32(ei->i_disksize >> 32); | 3139 | if (disksize != raw_inode->i_size_high) { |
| 3140 | raw_inode->i_size_high = disksize; | ||
| 3141 | need_datasync = 1; | ||
| 3142 | } | ||
| 3134 | if (ei->i_disksize > 0x7fffffffULL) { | 3143 | if (ei->i_disksize > 0x7fffffffULL) { |
| 3135 | struct super_block *sb = inode->i_sb; | 3144 | struct super_block *sb = inode->i_sb; |
| 3136 | if (!EXT3_HAS_RO_COMPAT_FEATURE(sb, | 3145 | if (!EXT3_HAS_RO_COMPAT_FEATURE(sb, |
| @@ -3183,6 +3192,8 @@ again: | |||
| 3183 | ext3_clear_inode_state(inode, EXT3_STATE_NEW); | 3192 | ext3_clear_inode_state(inode, EXT3_STATE_NEW); |
| 3184 | 3193 | ||
| 3185 | atomic_set(&ei->i_sync_tid, handle->h_transaction->t_tid); | 3194 | atomic_set(&ei->i_sync_tid, handle->h_transaction->t_tid); |
| 3195 | if (need_datasync) | ||
| 3196 | atomic_set(&ei->i_datasync_tid, handle->h_transaction->t_tid); | ||
| 3186 | out_brelse: | 3197 | out_brelse: |
| 3187 | brelse (bh); | 3198 | brelse (bh); |
| 3188 | ext3_std_error(inode->i_sb, err); | 3199 | ext3_std_error(inode->i_sb, err); |
diff --git a/fs/fuse/control.c b/fs/fuse/control.c index 03ff5b1eba93..75a20c092dd4 100644 --- a/fs/fuse/control.c +++ b/fs/fuse/control.c | |||
| @@ -117,7 +117,7 @@ static ssize_t fuse_conn_max_background_write(struct file *file, | |||
| 117 | const char __user *buf, | 117 | const char __user *buf, |
| 118 | size_t count, loff_t *ppos) | 118 | size_t count, loff_t *ppos) |
| 119 | { | 119 | { |
| 120 | unsigned val; | 120 | unsigned uninitialized_var(val); |
| 121 | ssize_t ret; | 121 | ssize_t ret; |
| 122 | 122 | ||
| 123 | ret = fuse_conn_limit_write(file, buf, count, ppos, &val, | 123 | ret = fuse_conn_limit_write(file, buf, count, ppos, &val, |
| @@ -154,7 +154,7 @@ static ssize_t fuse_conn_congestion_threshold_write(struct file *file, | |||
| 154 | const char __user *buf, | 154 | const char __user *buf, |
| 155 | size_t count, loff_t *ppos) | 155 | size_t count, loff_t *ppos) |
| 156 | { | 156 | { |
| 157 | unsigned val; | 157 | unsigned uninitialized_var(val); |
| 158 | ssize_t ret; | 158 | ssize_t ret; |
| 159 | 159 | ||
| 160 | ret = fuse_conn_limit_write(file, buf, count, ppos, &val, | 160 | ret = fuse_conn_limit_write(file, buf, count, ppos, &val, |
diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c index 3426521f3205..ee8d55042298 100644 --- a/fs/fuse/cuse.c +++ b/fs/fuse/cuse.c | |||
| @@ -396,7 +396,7 @@ err_device: | |||
| 396 | err_region: | 396 | err_region: |
| 397 | unregister_chrdev_region(devt, 1); | 397 | unregister_chrdev_region(devt, 1); |
| 398 | err: | 398 | err: |
| 399 | fc->conn_error = 1; | 399 | fuse_conn_kill(fc); |
| 400 | goto out; | 400 | goto out; |
| 401 | } | 401 | } |
| 402 | 402 | ||
| @@ -532,8 +532,6 @@ static int cuse_channel_release(struct inode *inode, struct file *file) | |||
| 532 | cdev_del(cc->cdev); | 532 | cdev_del(cc->cdev); |
| 533 | } | 533 | } |
| 534 | 534 | ||
| 535 | /* kill connection and shutdown channel */ | ||
| 536 | fuse_conn_kill(&cc->fc); | ||
| 537 | rc = fuse_dev_release(inode, file); /* puts the base reference */ | 535 | rc = fuse_dev_release(inode, file); /* puts the base reference */ |
| 538 | 536 | ||
| 539 | return rc; | 537 | return rc; |
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 7df2b5e8fbe1..f4246cfc8d87 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c | |||
| @@ -1576,6 +1576,7 @@ static int fuse_retrieve(struct fuse_conn *fc, struct inode *inode, | |||
| 1576 | req->pages[req->num_pages] = page; | 1576 | req->pages[req->num_pages] = page; |
| 1577 | req->num_pages++; | 1577 | req->num_pages++; |
| 1578 | 1578 | ||
| 1579 | offset = 0; | ||
| 1579 | num -= this_num; | 1580 | num -= this_num; |
| 1580 | total_len += this_num; | 1581 | total_len += this_num; |
| 1581 | index++; | 1582 | index++; |
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index ce0a2838ccd0..fca222dabe3c 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
| @@ -367,11 +367,6 @@ void fuse_conn_kill(struct fuse_conn *fc) | |||
| 367 | wake_up_all(&fc->waitq); | 367 | wake_up_all(&fc->waitq); |
| 368 | wake_up_all(&fc->blocked_waitq); | 368 | wake_up_all(&fc->blocked_waitq); |
| 369 | wake_up_all(&fc->reserved_req_waitq); | 369 | wake_up_all(&fc->reserved_req_waitq); |
| 370 | mutex_lock(&fuse_mutex); | ||
| 371 | list_del(&fc->entry); | ||
| 372 | fuse_ctl_remove_conn(fc); | ||
| 373 | mutex_unlock(&fuse_mutex); | ||
| 374 | fuse_bdi_destroy(fc); | ||
| 375 | } | 370 | } |
| 376 | EXPORT_SYMBOL_GPL(fuse_conn_kill); | 371 | EXPORT_SYMBOL_GPL(fuse_conn_kill); |
| 377 | 372 | ||
| @@ -380,7 +375,14 @@ static void fuse_put_super(struct super_block *sb) | |||
| 380 | struct fuse_conn *fc = get_fuse_conn_super(sb); | 375 | struct fuse_conn *fc = get_fuse_conn_super(sb); |
| 381 | 376 | ||
| 382 | fuse_send_destroy(fc); | 377 | fuse_send_destroy(fc); |
| 378 | |||
| 383 | fuse_conn_kill(fc); | 379 | fuse_conn_kill(fc); |
| 380 | mutex_lock(&fuse_mutex); | ||
| 381 | list_del(&fc->entry); | ||
| 382 | fuse_ctl_remove_conn(fc); | ||
| 383 | mutex_unlock(&fuse_mutex); | ||
| 384 | fuse_bdi_destroy(fc); | ||
| 385 | |||
| 384 | fuse_conn_put(fc); | 386 | fuse_conn_put(fc); |
| 385 | } | 387 | } |
| 386 | 388 | ||
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index d1d791ef38de..382000ffac1f 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
| @@ -323,6 +323,29 @@ static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | |||
| 323 | } | 323 | } |
| 324 | 324 | ||
| 325 | /** | 325 | /** |
| 326 | * gfs2_size_hint - Give a hint to the size of a write request | ||
| 327 | * @file: The struct file | ||
| 328 | * @offset: The file offset of the write | ||
| 329 | * @size: The length of the write | ||
| 330 | * | ||
| 331 | * When we are about to do a write, this function records the total | ||
| 332 | * write size in order to provide a suitable hint to the lower layers | ||
| 333 | * about how many blocks will be required. | ||
| 334 | * | ||
| 335 | */ | ||
| 336 | |||
| 337 | static void gfs2_size_hint(struct file *filep, loff_t offset, size_t size) | ||
| 338 | { | ||
| 339 | struct inode *inode = filep->f_dentry->d_inode; | ||
| 340 | struct gfs2_sbd *sdp = GFS2_SB(inode); | ||
| 341 | struct gfs2_inode *ip = GFS2_I(inode); | ||
| 342 | size_t blks = (size + sdp->sd_sb.sb_bsize - 1) >> sdp->sd_sb.sb_bsize_shift; | ||
| 343 | int hint = min_t(size_t, INT_MAX, blks); | ||
| 344 | |||
| 345 | atomic_set(&ip->i_res->rs_sizehint, hint); | ||
| 346 | } | ||
| 347 | |||
| 348 | /** | ||
| 326 | * gfs2_allocate_page_backing - Use bmap to allocate blocks | 349 | * gfs2_allocate_page_backing - Use bmap to allocate blocks |
| 327 | * @page: The (locked) page to allocate backing for | 350 | * @page: The (locked) page to allocate backing for |
| 328 | * | 351 | * |
| @@ -382,8 +405,7 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
| 382 | if (ret) | 405 | if (ret) |
| 383 | return ret; | 406 | return ret; |
| 384 | 407 | ||
| 385 | atomic_set(&ip->i_res->rs_sizehint, | 408 | gfs2_size_hint(vma->vm_file, pos, PAGE_CACHE_SIZE); |
| 386 | PAGE_CACHE_SIZE >> sdp->sd_sb.sb_bsize_shift); | ||
| 387 | 409 | ||
| 388 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 410 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); |
| 389 | ret = gfs2_glock_nq(&gh); | 411 | ret = gfs2_glock_nq(&gh); |
| @@ -663,7 +685,8 @@ static ssize_t gfs2_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 663 | if (ret) | 685 | if (ret) |
| 664 | return ret; | 686 | return ret; |
| 665 | 687 | ||
| 666 | atomic_set(&ip->i_res->rs_sizehint, writesize >> sdp->sd_sb.sb_bsize_shift); | 688 | gfs2_size_hint(file, pos, writesize); |
| 689 | |||
| 667 | if (file->f_flags & O_APPEND) { | 690 | if (file->f_flags & O_APPEND) { |
| 668 | struct gfs2_holder gh; | 691 | struct gfs2_holder gh; |
| 669 | 692 | ||
| @@ -789,7 +812,7 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset, | |||
| 789 | if (unlikely(error)) | 812 | if (unlikely(error)) |
| 790 | goto out_uninit; | 813 | goto out_uninit; |
| 791 | 814 | ||
| 792 | atomic_set(&ip->i_res->rs_sizehint, len >> sdp->sd_sb.sb_bsize_shift); | 815 | gfs2_size_hint(file, offset, len); |
| 793 | 816 | ||
| 794 | while (len > 0) { | 817 | while (len > 0) { |
| 795 | if (len < bytes) | 818 | if (len < bytes) |
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 4ce22e547308..753af3d86bbc 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
| @@ -1722,7 +1722,9 @@ static int gfs2_setxattr(struct dentry *dentry, const char *name, | |||
| 1722 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 1722 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); |
| 1723 | ret = gfs2_glock_nq(&gh); | 1723 | ret = gfs2_glock_nq(&gh); |
| 1724 | if (ret == 0) { | 1724 | if (ret == 0) { |
| 1725 | ret = generic_setxattr(dentry, name, data, size, flags); | 1725 | ret = gfs2_rs_alloc(ip); |
| 1726 | if (ret == 0) | ||
| 1727 | ret = generic_setxattr(dentry, name, data, size, flags); | ||
| 1726 | gfs2_glock_dq(&gh); | 1728 | gfs2_glock_dq(&gh); |
| 1727 | } | 1729 | } |
| 1728 | gfs2_holder_uninit(&gh); | 1730 | gfs2_holder_uninit(&gh); |
| @@ -1757,7 +1759,9 @@ static int gfs2_removexattr(struct dentry *dentry, const char *name) | |||
| 1757 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); | 1759 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh); |
| 1758 | ret = gfs2_glock_nq(&gh); | 1760 | ret = gfs2_glock_nq(&gh); |
| 1759 | if (ret == 0) { | 1761 | if (ret == 0) { |
| 1760 | ret = generic_removexattr(dentry, name); | 1762 | ret = gfs2_rs_alloc(ip); |
| 1763 | if (ret == 0) | ||
| 1764 | ret = generic_removexattr(dentry, name); | ||
| 1761 | gfs2_glock_dq(&gh); | 1765 | gfs2_glock_dq(&gh); |
| 1762 | } | 1766 | } |
| 1763 | gfs2_holder_uninit(&gh); | 1767 | gfs2_holder_uninit(&gh); |
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index 4d34887a601d..c9ed814eeb6f 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c | |||
| @@ -1961,7 +1961,7 @@ static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd) | |||
| 1961 | * @dinode: 1 if this block is a dinode block, otherwise data block | 1961 | * @dinode: 1 if this block is a dinode block, otherwise data block |
| 1962 | * @nblocks: desired extent length | 1962 | * @nblocks: desired extent length |
| 1963 | * | 1963 | * |
| 1964 | * Lay claim to previously allocated block reservation blocks. | 1964 | * Lay claim to previously reserved blocks. |
| 1965 | * Returns: Starting block number of the blocks claimed. | 1965 | * Returns: Starting block number of the blocks claimed. |
| 1966 | * Sets *nblocks to the actual extent length allocated. | 1966 | * Sets *nblocks to the actual extent length allocated. |
| 1967 | */ | 1967 | */ |
| @@ -1970,19 +1970,17 @@ static u64 claim_reserved_blks(struct gfs2_inode *ip, bool dinode, | |||
| 1970 | { | 1970 | { |
| 1971 | struct gfs2_blkreserv *rs = ip->i_res; | 1971 | struct gfs2_blkreserv *rs = ip->i_res; |
| 1972 | struct gfs2_rgrpd *rgd = rs->rs_rgd; | 1972 | struct gfs2_rgrpd *rgd = rs->rs_rgd; |
| 1973 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | ||
| 1974 | struct gfs2_bitmap *bi; | 1973 | struct gfs2_bitmap *bi; |
| 1975 | u64 start_block = gfs2_rs_startblk(rs); | 1974 | u64 start_block = gfs2_rs_startblk(rs); |
| 1976 | const unsigned int elen = *nblocks; | 1975 | const unsigned int elen = *nblocks; |
| 1977 | 1976 | ||
| 1978 | /*BUG_ON(!gfs2_glock_is_locked_by_me(ip->i_gl));*/ | ||
| 1979 | gfs2_assert_withdraw(sdp, rgd); | ||
| 1980 | /*BUG_ON(!gfs2_glock_is_locked_by_me(rgd->rd_gl));*/ | ||
| 1981 | bi = rs->rs_bi; | 1977 | bi = rs->rs_bi; |
| 1982 | gfs2_trans_add_bh(rgd->rd_gl, bi->bi_bh, 1); | 1978 | gfs2_trans_add_bh(rgd->rd_gl, bi->bi_bh, 1); |
| 1983 | 1979 | ||
| 1984 | for (*nblocks = 0; *nblocks < elen && rs->rs_free; (*nblocks)++) { | 1980 | for (*nblocks = 0; *nblocks < elen && rs->rs_free; (*nblocks)++) { |
| 1985 | /* Make sure the bitmap hasn't changed */ | 1981 | if (gfs2_testbit(rgd, bi->bi_bh->b_data + bi->bi_offset, |
| 1982 | bi->bi_len, rs->rs_biblk) != GFS2_BLKST_FREE) | ||
| 1983 | break; | ||
| 1986 | gfs2_setbit(rgd, bi->bi_clone, bi, rs->rs_biblk, | 1984 | gfs2_setbit(rgd, bi->bi_clone, bi, rs->rs_biblk, |
| 1987 | dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED); | 1985 | dinode ? GFS2_BLKST_DINODE : GFS2_BLKST_USED); |
| 1988 | rs->rs_biblk++; | 1986 | rs->rs_biblk++; |
| @@ -1991,20 +1989,12 @@ static u64 claim_reserved_blks(struct gfs2_inode *ip, bool dinode, | |||
| 1991 | BUG_ON(!rgd->rd_reserved); | 1989 | BUG_ON(!rgd->rd_reserved); |
| 1992 | rgd->rd_reserved--; | 1990 | rgd->rd_reserved--; |
| 1993 | dinode = false; | 1991 | dinode = false; |
| 1994 | trace_gfs2_rs(ip, rs, TRACE_RS_CLAIM); | ||
| 1995 | } | 1992 | } |
| 1996 | 1993 | ||
| 1997 | if (!rs->rs_free) { | 1994 | trace_gfs2_rs(ip, rs, TRACE_RS_CLAIM); |
| 1998 | struct gfs2_rgrpd *rgd = ip->i_res->rs_rgd; | 1995 | if (!rs->rs_free || *nblocks != elen) |
| 1999 | |||
| 2000 | gfs2_rs_deltree(rs); | 1996 | gfs2_rs_deltree(rs); |
| 2001 | /* -nblocks because we haven't returned to do the math yet. | 1997 | |
| 2002 | I'm doing the math backwards to prevent negative numbers, | ||
| 2003 | but think of it as: | ||
| 2004 | if (unclaimed_blocks(rgd) - *nblocks >= RGRP_RSRV_MINBLKS */ | ||
| 2005 | if (unclaimed_blocks(rgd) >= RGRP_RSRV_MINBLKS + *nblocks) | ||
| 2006 | rg_mblk_search(rgd, ip); | ||
| 2007 | } | ||
| 2008 | return start_block; | 1998 | return start_block; |
| 2009 | } | 1999 | } |
| 2010 | 2000 | ||
| @@ -2037,34 +2027,34 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks, | |||
| 2037 | if (ip->i_res->rs_requested == 0) | 2027 | if (ip->i_res->rs_requested == 0) |
| 2038 | return -ECANCELED; | 2028 | return -ECANCELED; |
| 2039 | 2029 | ||
| 2040 | /* Check if we have a multi-block reservation, and if so, claim the | 2030 | /* If we have a reservation, claim blocks from it. */ |
| 2041 | next free block from it. */ | ||
| 2042 | if (gfs2_rs_active(ip->i_res)) { | 2031 | if (gfs2_rs_active(ip->i_res)) { |
| 2043 | BUG_ON(!ip->i_res->rs_free); | 2032 | BUG_ON(!ip->i_res->rs_free); |
| 2044 | rgd = ip->i_res->rs_rgd; | 2033 | rgd = ip->i_res->rs_rgd; |
| 2045 | block = claim_reserved_blks(ip, dinode, nblocks); | 2034 | block = claim_reserved_blks(ip, dinode, nblocks); |
| 2046 | } else { | 2035 | if (*nblocks) |
| 2047 | rgd = ip->i_rgd; | 2036 | goto found_blocks; |
| 2037 | } | ||
| 2048 | 2038 | ||
| 2049 | if (!dinode && rgrp_contains_block(rgd, ip->i_goal)) | 2039 | rgd = ip->i_rgd; |
| 2050 | goal = ip->i_goal - rgd->rd_data0; | ||
| 2051 | else | ||
| 2052 | goal = rgd->rd_last_alloc; | ||
| 2053 | |||
| 2054 | blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, &bi); | ||
| 2055 | |||
| 2056 | /* Since all blocks are reserved in advance, this shouldn't | ||
| 2057 | happen */ | ||
| 2058 | if (blk == BFITNOENT) { | ||
| 2059 | printk(KERN_WARNING "BFITNOENT, nblocks=%u\n", | ||
| 2060 | *nblocks); | ||
| 2061 | printk(KERN_WARNING "FULL=%d\n", | ||
| 2062 | test_bit(GBF_FULL, &rgd->rd_bits->bi_flags)); | ||
| 2063 | goto rgrp_error; | ||
| 2064 | } | ||
| 2065 | 2040 | ||
| 2066 | block = gfs2_alloc_extent(rgd, bi, blk, dinode, nblocks); | 2041 | if (!dinode && rgrp_contains_block(rgd, ip->i_goal)) |
| 2042 | goal = ip->i_goal - rgd->rd_data0; | ||
| 2043 | else | ||
| 2044 | goal = rgd->rd_last_alloc; | ||
| 2045 | |||
| 2046 | blk = rgblk_search(rgd, goal, GFS2_BLKST_FREE, &bi); | ||
| 2047 | |||
| 2048 | /* Since all blocks are reserved in advance, this shouldn't happen */ | ||
| 2049 | if (blk == BFITNOENT) { | ||
| 2050 | printk(KERN_WARNING "BFITNOENT, nblocks=%u\n", *nblocks); | ||
| 2051 | printk(KERN_WARNING "FULL=%d\n", | ||
| 2052 | test_bit(GBF_FULL, &rgd->rd_bits->bi_flags)); | ||
| 2053 | goto rgrp_error; | ||
| 2067 | } | 2054 | } |
| 2055 | |||
| 2056 | block = gfs2_alloc_extent(rgd, bi, blk, dinode, nblocks); | ||
| 2057 | found_blocks: | ||
| 2068 | ndata = *nblocks; | 2058 | ndata = *nblocks; |
| 2069 | if (dinode) | 2059 | if (dinode) |
| 2070 | ndata--; | 2060 | ndata--; |
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index 09357508ec9a..a2862339323b 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
| @@ -1113,6 +1113,11 @@ static void mark_journal_empty(journal_t *journal) | |||
| 1113 | 1113 | ||
| 1114 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); | 1114 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); |
| 1115 | spin_lock(&journal->j_state_lock); | 1115 | spin_lock(&journal->j_state_lock); |
| 1116 | /* Is it already empty? */ | ||
| 1117 | if (sb->s_start == 0) { | ||
| 1118 | spin_unlock(&journal->j_state_lock); | ||
| 1119 | return; | ||
| 1120 | } | ||
| 1116 | jbd_debug(1, "JBD: Marking journal as empty (seq %d)\n", | 1121 | jbd_debug(1, "JBD: Marking journal as empty (seq %d)\n", |
| 1117 | journal->j_tail_sequence); | 1122 | journal->j_tail_sequence); |
| 1118 | 1123 | ||
diff --git a/fs/logfs/dev_bdev.c b/fs/logfs/dev_bdev.c index df0de27c2733..e784a217b500 100644 --- a/fs/logfs/dev_bdev.c +++ b/fs/logfs/dev_bdev.c | |||
| @@ -26,6 +26,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) | |||
| 26 | struct completion complete; | 26 | struct completion complete; |
| 27 | 27 | ||
| 28 | bio_init(&bio); | 28 | bio_init(&bio); |
| 29 | bio.bi_max_vecs = 1; | ||
| 29 | bio.bi_io_vec = &bio_vec; | 30 | bio.bi_io_vec = &bio_vec; |
| 30 | bio_vec.bv_page = page; | 31 | bio_vec.bv_page = page; |
| 31 | bio_vec.bv_len = PAGE_SIZE; | 32 | bio_vec.bv_len = PAGE_SIZE; |
| @@ -95,12 +96,11 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, | |||
| 95 | struct address_space *mapping = super->s_mapping_inode->i_mapping; | 96 | struct address_space *mapping = super->s_mapping_inode->i_mapping; |
| 96 | struct bio *bio; | 97 | struct bio *bio; |
| 97 | struct page *page; | 98 | struct page *page; |
| 98 | struct request_queue *q = bdev_get_queue(sb->s_bdev); | 99 | unsigned int max_pages; |
| 99 | unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); | ||
| 100 | int i; | 100 | int i; |
| 101 | 101 | ||
| 102 | if (max_pages > BIO_MAX_PAGES) | 102 | max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev)); |
| 103 | max_pages = BIO_MAX_PAGES; | 103 | |
| 104 | bio = bio_alloc(GFP_NOFS, max_pages); | 104 | bio = bio_alloc(GFP_NOFS, max_pages); |
| 105 | BUG_ON(!bio); | 105 | BUG_ON(!bio); |
| 106 | 106 | ||
| @@ -190,12 +190,11 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, | |||
| 190 | { | 190 | { |
| 191 | struct logfs_super *super = logfs_super(sb); | 191 | struct logfs_super *super = logfs_super(sb); |
| 192 | struct bio *bio; | 192 | struct bio *bio; |
| 193 | struct request_queue *q = bdev_get_queue(sb->s_bdev); | 193 | unsigned int max_pages; |
| 194 | unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); | ||
| 195 | int i; | 194 | int i; |
| 196 | 195 | ||
| 197 | if (max_pages > BIO_MAX_PAGES) | 196 | max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev)); |
| 198 | max_pages = BIO_MAX_PAGES; | 197 | |
| 199 | bio = bio_alloc(GFP_NOFS, max_pages); | 198 | bio = bio_alloc(GFP_NOFS, max_pages); |
| 200 | BUG_ON(!bio); | 199 | BUG_ON(!bio); |
| 201 | 200 | ||
diff --git a/fs/logfs/inode.c b/fs/logfs/inode.c index a422f42238b2..6984562738d3 100644 --- a/fs/logfs/inode.c +++ b/fs/logfs/inode.c | |||
| @@ -156,10 +156,26 @@ static void __logfs_destroy_inode(struct inode *inode) | |||
| 156 | call_rcu(&inode->i_rcu, logfs_i_callback); | 156 | call_rcu(&inode->i_rcu, logfs_i_callback); |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static void __logfs_destroy_meta_inode(struct inode *inode) | ||
| 160 | { | ||
| 161 | struct logfs_inode *li = logfs_inode(inode); | ||
| 162 | BUG_ON(li->li_block); | ||
| 163 | call_rcu(&inode->i_rcu, logfs_i_callback); | ||
| 164 | } | ||
| 165 | |||
| 159 | static void logfs_destroy_inode(struct inode *inode) | 166 | static void logfs_destroy_inode(struct inode *inode) |
| 160 | { | 167 | { |
| 161 | struct logfs_inode *li = logfs_inode(inode); | 168 | struct logfs_inode *li = logfs_inode(inode); |
| 162 | 169 | ||
| 170 | if (inode->i_ino < LOGFS_RESERVED_INOS) { | ||
| 171 | /* | ||
| 172 | * The reserved inodes are never destroyed unless we are in | ||
| 173 | * unmont path. | ||
| 174 | */ | ||
| 175 | __logfs_destroy_meta_inode(inode); | ||
| 176 | return; | ||
| 177 | } | ||
| 178 | |||
| 163 | BUG_ON(list_empty(&li->li_freeing_list)); | 179 | BUG_ON(list_empty(&li->li_freeing_list)); |
| 164 | spin_lock(&logfs_inode_lock); | 180 | spin_lock(&logfs_inode_lock); |
| 165 | li->li_refcount--; | 181 | li->li_refcount--; |
| @@ -373,8 +389,8 @@ static void logfs_put_super(struct super_block *sb) | |||
| 373 | { | 389 | { |
| 374 | struct logfs_super *super = logfs_super(sb); | 390 | struct logfs_super *super = logfs_super(sb); |
| 375 | /* kill the meta-inodes */ | 391 | /* kill the meta-inodes */ |
| 376 | iput(super->s_master_inode); | ||
| 377 | iput(super->s_segfile_inode); | 392 | iput(super->s_segfile_inode); |
| 393 | iput(super->s_master_inode); | ||
| 378 | iput(super->s_mapping_inode); | 394 | iput(super->s_mapping_inode); |
| 379 | } | 395 | } |
| 380 | 396 | ||
diff --git a/fs/logfs/journal.c b/fs/logfs/journal.c index 1e1c369df22b..2a09b8d73989 100644 --- a/fs/logfs/journal.c +++ b/fs/logfs/journal.c | |||
| @@ -565,7 +565,7 @@ static void write_wbuf(struct super_block *sb, struct logfs_area *area, | |||
| 565 | index = ofs >> PAGE_SHIFT; | 565 | index = ofs >> PAGE_SHIFT; |
| 566 | page_ofs = ofs & (PAGE_SIZE - 1); | 566 | page_ofs = ofs & (PAGE_SIZE - 1); |
| 567 | 567 | ||
| 568 | page = find_lock_page(mapping, index); | 568 | page = find_or_create_page(mapping, index, GFP_NOFS); |
| 569 | BUG_ON(!page); | 569 | BUG_ON(!page); |
| 570 | memcpy(wbuf, page_address(page) + page_ofs, super->s_writesize); | 570 | memcpy(wbuf, page_address(page) + page_ofs, super->s_writesize); |
| 571 | unlock_page(page); | 571 | unlock_page(page); |
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index f1cb512c5019..5be0abef603d 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c | |||
| @@ -2189,7 +2189,6 @@ void logfs_evict_inode(struct inode *inode) | |||
| 2189 | return; | 2189 | return; |
| 2190 | } | 2190 | } |
| 2191 | 2191 | ||
| 2192 | BUG_ON(inode->i_ino < LOGFS_RESERVED_INOS); | ||
| 2193 | page = inode_to_page(inode); | 2192 | page = inode_to_page(inode); |
| 2194 | BUG_ON(!page); /* FIXME: Use emergency page */ | 2193 | BUG_ON(!page); /* FIXME: Use emergency page */ |
| 2195 | logfs_put_write_page(page); | 2194 | logfs_put_write_page(page); |
diff --git a/fs/logfs/segment.c b/fs/logfs/segment.c index e28d090c98d6..038da0991794 100644 --- a/fs/logfs/segment.c +++ b/fs/logfs/segment.c | |||
| @@ -886,7 +886,7 @@ static struct logfs_area *alloc_area(struct super_block *sb) | |||
| 886 | 886 | ||
| 887 | static void map_invalidatepage(struct page *page, unsigned long l) | 887 | static void map_invalidatepage(struct page *page, unsigned long l) |
| 888 | { | 888 | { |
| 889 | BUG(); | 889 | return; |
| 890 | } | 890 | } |
| 891 | 891 | ||
| 892 | static int map_releasepage(struct page *page, gfp_t g) | 892 | static int map_releasepage(struct page *page, gfp_t g) |
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 75d6d0a3d32e..6a7fcab7ecb3 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -287,10 +287,12 @@ nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync) | |||
| 287 | struct inode *inode = file->f_path.dentry->d_inode; | 287 | struct inode *inode = file->f_path.dentry->d_inode; |
| 288 | 288 | ||
| 289 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | 289 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); |
| 290 | if (ret != 0) | ||
| 291 | goto out; | ||
| 290 | mutex_lock(&inode->i_mutex); | 292 | mutex_lock(&inode->i_mutex); |
| 291 | ret = nfs_file_fsync_commit(file, start, end, datasync); | 293 | ret = nfs_file_fsync_commit(file, start, end, datasync); |
| 292 | mutex_unlock(&inode->i_mutex); | 294 | mutex_unlock(&inode->i_mutex); |
| 293 | 295 | out: | |
| 294 | return ret; | 296 | return ret; |
| 295 | } | 297 | } |
| 296 | 298 | ||
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index c6e895f0fbf3..9b47610338f5 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c | |||
| @@ -154,7 +154,7 @@ static void nfs_zap_caches_locked(struct inode *inode) | |||
| 154 | nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); | 154 | nfsi->attrtimeo = NFS_MINATTRTIMEO(inode); |
| 155 | nfsi->attrtimeo_timestamp = jiffies; | 155 | nfsi->attrtimeo_timestamp = jiffies; |
| 156 | 156 | ||
| 157 | memset(NFS_COOKIEVERF(inode), 0, sizeof(NFS_COOKIEVERF(inode))); | 157 | memset(NFS_I(inode)->cookieverf, 0, sizeof(NFS_I(inode)->cookieverf)); |
| 158 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) | 158 | if (S_ISREG(mode) || S_ISDIR(mode) || S_ISLNK(mode)) |
| 159 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; | 159 | nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL|NFS_INO_REVAL_PAGECACHE; |
| 160 | else | 160 | else |
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index d6b3b5f2d779..69322096c325 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c | |||
| @@ -643,7 +643,7 @@ nfs3_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, | |||
| 643 | u64 cookie, struct page **pages, unsigned int count, int plus) | 643 | u64 cookie, struct page **pages, unsigned int count, int plus) |
| 644 | { | 644 | { |
| 645 | struct inode *dir = dentry->d_inode; | 645 | struct inode *dir = dentry->d_inode; |
| 646 | __be32 *verf = NFS_COOKIEVERF(dir); | 646 | __be32 *verf = NFS_I(dir)->cookieverf; |
| 647 | struct nfs3_readdirargs arg = { | 647 | struct nfs3_readdirargs arg = { |
| 648 | .fh = NFS_FH(dir), | 648 | .fh = NFS_FH(dir), |
| 649 | .cookie = cookie, | 649 | .cookie = cookie, |
diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index acb65e7887f8..eb5eb8eef4d3 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c | |||
| @@ -96,13 +96,15 @@ nfs4_file_fsync(struct file *file, loff_t start, loff_t end, int datasync) | |||
| 96 | struct inode *inode = file->f_path.dentry->d_inode; | 96 | struct inode *inode = file->f_path.dentry->d_inode; |
| 97 | 97 | ||
| 98 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); | 98 | ret = filemap_write_and_wait_range(inode->i_mapping, start, end); |
| 99 | if (ret != 0) | ||
| 100 | goto out; | ||
| 99 | mutex_lock(&inode->i_mutex); | 101 | mutex_lock(&inode->i_mutex); |
| 100 | ret = nfs_file_fsync_commit(file, start, end, datasync); | 102 | ret = nfs_file_fsync_commit(file, start, end, datasync); |
| 101 | if (!ret && !datasync) | 103 | if (!ret && !datasync) |
| 102 | /* application has asked for meta-data sync */ | 104 | /* application has asked for meta-data sync */ |
| 103 | ret = pnfs_layoutcommit_inode(inode, true); | 105 | ret = pnfs_layoutcommit_inode(inode, true); |
| 104 | mutex_unlock(&inode->i_mutex); | 106 | mutex_unlock(&inode->i_mutex); |
| 105 | 107 | out: | |
| 106 | return ret; | 108 | return ret; |
| 107 | } | 109 | } |
| 108 | 110 | ||
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 635274140b18..1e50326d00dd 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
| @@ -3215,11 +3215,11 @@ static int _nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, | |||
| 3215 | dentry->d_parent->d_name.name, | 3215 | dentry->d_parent->d_name.name, |
| 3216 | dentry->d_name.name, | 3216 | dentry->d_name.name, |
| 3217 | (unsigned long long)cookie); | 3217 | (unsigned long long)cookie); |
| 3218 | nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args); | 3218 | nfs4_setup_readdir(cookie, NFS_I(dir)->cookieverf, dentry, &args); |
| 3219 | res.pgbase = args.pgbase; | 3219 | res.pgbase = args.pgbase; |
| 3220 | status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0); | 3220 | status = nfs4_call_sync(NFS_SERVER(dir)->client, NFS_SERVER(dir), &msg, &args.seq_args, &res.seq_res, 0); |
| 3221 | if (status >= 0) { | 3221 | if (status >= 0) { |
| 3222 | memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); | 3222 | memcpy(NFS_I(dir)->cookieverf, res.verifier.data, NFS4_VERIFIER_SIZE); |
| 3223 | status += args.pgbase; | 3223 | status += args.pgbase; |
| 3224 | } | 3224 | } |
| 3225 | 3225 | ||
| @@ -3653,11 +3653,11 @@ static inline int nfs4_server_supports_acls(struct nfs_server *server) | |||
| 3653 | && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL); | 3653 | && (server->acl_bitmask & ACL4_SUPPORT_DENY_ACL); |
| 3654 | } | 3654 | } |
| 3655 | 3655 | ||
| 3656 | /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_CACHE_SIZE, and that | 3656 | /* Assuming that XATTR_SIZE_MAX is a multiple of PAGE_SIZE, and that |
| 3657 | * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_CACHE_SIZE) bytes on | 3657 | * it's OK to put sizeof(void) * (XATTR_SIZE_MAX/PAGE_SIZE) bytes on |
| 3658 | * the stack. | 3658 | * the stack. |
| 3659 | */ | 3659 | */ |
| 3660 | #define NFS4ACL_MAXPAGES (XATTR_SIZE_MAX >> PAGE_CACHE_SHIFT) | 3660 | #define NFS4ACL_MAXPAGES DIV_ROUND_UP(XATTR_SIZE_MAX, PAGE_SIZE) |
| 3661 | 3661 | ||
| 3662 | static int buf_to_pages_noslab(const void *buf, size_t buflen, | 3662 | static int buf_to_pages_noslab(const void *buf, size_t buflen, |
| 3663 | struct page **pages, unsigned int *pgbase) | 3663 | struct page **pages, unsigned int *pgbase) |
| @@ -3668,7 +3668,7 @@ static int buf_to_pages_noslab(const void *buf, size_t buflen, | |||
| 3668 | spages = pages; | 3668 | spages = pages; |
| 3669 | 3669 | ||
| 3670 | do { | 3670 | do { |
| 3671 | len = min_t(size_t, PAGE_CACHE_SIZE, buflen); | 3671 | len = min_t(size_t, PAGE_SIZE, buflen); |
| 3672 | newpage = alloc_page(GFP_KERNEL); | 3672 | newpage = alloc_page(GFP_KERNEL); |
| 3673 | 3673 | ||
| 3674 | if (newpage == NULL) | 3674 | if (newpage == NULL) |
| @@ -3739,7 +3739,7 @@ static void nfs4_write_cached_acl(struct inode *inode, struct page **pages, size | |||
| 3739 | struct nfs4_cached_acl *acl; | 3739 | struct nfs4_cached_acl *acl; |
| 3740 | size_t buflen = sizeof(*acl) + acl_len; | 3740 | size_t buflen = sizeof(*acl) + acl_len; |
| 3741 | 3741 | ||
| 3742 | if (pages && buflen <= PAGE_SIZE) { | 3742 | if (buflen <= PAGE_SIZE) { |
| 3743 | acl = kmalloc(buflen, GFP_KERNEL); | 3743 | acl = kmalloc(buflen, GFP_KERNEL); |
| 3744 | if (acl == NULL) | 3744 | if (acl == NULL) |
| 3745 | goto out; | 3745 | goto out; |
| @@ -3782,17 +3782,15 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
| 3782 | .rpc_argp = &args, | 3782 | .rpc_argp = &args, |
| 3783 | .rpc_resp = &res, | 3783 | .rpc_resp = &res, |
| 3784 | }; | 3784 | }; |
| 3785 | int ret = -ENOMEM, npages, i; | 3785 | unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE); |
| 3786 | size_t acl_len = 0; | 3786 | int ret = -ENOMEM, i; |
| 3787 | 3787 | ||
| 3788 | npages = (buflen + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
| 3789 | /* As long as we're doing a round trip to the server anyway, | 3788 | /* As long as we're doing a round trip to the server anyway, |
| 3790 | * let's be prepared for a page of acl data. */ | 3789 | * let's be prepared for a page of acl data. */ |
| 3791 | if (npages == 0) | 3790 | if (npages == 0) |
| 3792 | npages = 1; | 3791 | npages = 1; |
| 3793 | 3792 | if (npages > ARRAY_SIZE(pages)) | |
| 3794 | /* Add an extra page to handle the bitmap returned */ | 3793 | return -ERANGE; |
| 3795 | npages++; | ||
| 3796 | 3794 | ||
| 3797 | for (i = 0; i < npages; i++) { | 3795 | for (i = 0; i < npages; i++) { |
| 3798 | pages[i] = alloc_page(GFP_KERNEL); | 3796 | pages[i] = alloc_page(GFP_KERNEL); |
| @@ -3808,11 +3806,6 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
| 3808 | args.acl_len = npages * PAGE_SIZE; | 3806 | args.acl_len = npages * PAGE_SIZE; |
| 3809 | args.acl_pgbase = 0; | 3807 | args.acl_pgbase = 0; |
| 3810 | 3808 | ||
| 3811 | /* Let decode_getfacl know not to fail if the ACL data is larger than | ||
| 3812 | * the page we send as a guess */ | ||
| 3813 | if (buf == NULL) | ||
| 3814 | res.acl_flags |= NFS4_ACL_LEN_REQUEST; | ||
| 3815 | |||
| 3816 | dprintk("%s buf %p buflen %zu npages %d args.acl_len %zu\n", | 3809 | dprintk("%s buf %p buflen %zu npages %d args.acl_len %zu\n", |
| 3817 | __func__, buf, buflen, npages, args.acl_len); | 3810 | __func__, buf, buflen, npages, args.acl_len); |
| 3818 | ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), | 3811 | ret = nfs4_call_sync(NFS_SERVER(inode)->client, NFS_SERVER(inode), |
| @@ -3820,20 +3813,19 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
| 3820 | if (ret) | 3813 | if (ret) |
| 3821 | goto out_free; | 3814 | goto out_free; |
| 3822 | 3815 | ||
| 3823 | acl_len = res.acl_len; | 3816 | /* Handle the case where the passed-in buffer is too short */ |
| 3824 | if (acl_len > args.acl_len) | 3817 | if (res.acl_flags & NFS4_ACL_TRUNC) { |
| 3825 | nfs4_write_cached_acl(inode, NULL, 0, acl_len); | 3818 | /* Did the user only issue a request for the acl length? */ |
| 3826 | else | 3819 | if (buf == NULL) |
| 3827 | nfs4_write_cached_acl(inode, pages, res.acl_data_offset, | 3820 | goto out_ok; |
| 3828 | acl_len); | ||
| 3829 | if (buf) { | ||
| 3830 | ret = -ERANGE; | 3821 | ret = -ERANGE; |
| 3831 | if (acl_len > buflen) | 3822 | goto out_free; |
| 3832 | goto out_free; | ||
| 3833 | _copy_from_pages(buf, pages, res.acl_data_offset, | ||
| 3834 | acl_len); | ||
| 3835 | } | 3823 | } |
| 3836 | ret = acl_len; | 3824 | nfs4_write_cached_acl(inode, pages, res.acl_data_offset, res.acl_len); |
| 3825 | if (buf) | ||
| 3826 | _copy_from_pages(buf, pages, res.acl_data_offset, res.acl_len); | ||
| 3827 | out_ok: | ||
| 3828 | ret = res.acl_len; | ||
| 3837 | out_free: | 3829 | out_free: |
| 3838 | for (i = 0; i < npages; i++) | 3830 | for (i = 0; i < npages; i++) |
| 3839 | if (pages[i]) | 3831 | if (pages[i]) |
| @@ -3891,10 +3883,13 @@ static int __nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t bufl | |||
| 3891 | .rpc_argp = &arg, | 3883 | .rpc_argp = &arg, |
| 3892 | .rpc_resp = &res, | 3884 | .rpc_resp = &res, |
| 3893 | }; | 3885 | }; |
| 3886 | unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE); | ||
| 3894 | int ret, i; | 3887 | int ret, i; |
| 3895 | 3888 | ||
| 3896 | if (!nfs4_server_supports_acls(server)) | 3889 | if (!nfs4_server_supports_acls(server)) |
| 3897 | return -EOPNOTSUPP; | 3890 | return -EOPNOTSUPP; |
| 3891 | if (npages > ARRAY_SIZE(pages)) | ||
| 3892 | return -ERANGE; | ||
| 3898 | i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); | 3893 | i = buf_to_pages_noslab(buf, buflen, arg.acl_pages, &arg.acl_pgbase); |
| 3899 | if (i < 0) | 3894 | if (i < 0) |
| 3900 | return i; | 3895 | return i; |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index 1bfbd67c556d..8dba6bd48557 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
| @@ -5072,18 +5072,14 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req, | |||
| 5072 | * are stored with the acl data to handle the problem of | 5072 | * are stored with the acl data to handle the problem of |
| 5073 | * variable length bitmaps.*/ | 5073 | * variable length bitmaps.*/ |
| 5074 | res->acl_data_offset = xdr_stream_pos(xdr) - pg_offset; | 5074 | res->acl_data_offset = xdr_stream_pos(xdr) - pg_offset; |
| 5075 | |||
| 5076 | /* We ignore &savep and don't do consistency checks on | ||
| 5077 | * the attr length. Let userspace figure it out.... */ | ||
| 5078 | res->acl_len = attrlen; | 5075 | res->acl_len = attrlen; |
| 5079 | if (attrlen > (xdr->nwords << 2)) { | 5076 | |
| 5080 | if (res->acl_flags & NFS4_ACL_LEN_REQUEST) { | 5077 | /* Check for receive buffer overflow */ |
| 5081 | /* getxattr interface called with a NULL buf */ | 5078 | if (res->acl_len > (xdr->nwords << 2) || |
| 5082 | goto out; | 5079 | res->acl_len + res->acl_data_offset > xdr->buf->page_len) { |
| 5083 | } | 5080 | res->acl_flags |= NFS4_ACL_TRUNC; |
| 5084 | dprintk("NFS: acl reply: attrlen %u > page_len %u\n", | 5081 | dprintk("NFS: acl reply: attrlen %u > page_len %u\n", |
| 5085 | attrlen, xdr->nwords << 2); | 5082 | attrlen, xdr->nwords << 2); |
| 5086 | return -EINVAL; | ||
| 5087 | } | 5083 | } |
| 5088 | } else | 5084 | } else |
| 5089 | status = -EOPNOTSUPP; | 5085 | status = -EOPNOTSUPP; |
| @@ -6229,7 +6225,8 @@ static int nfs4_xdr_dec_open(struct rpc_rqst *rqstp, struct xdr_stream *xdr, | |||
| 6229 | status = decode_open(xdr, res); | 6225 | status = decode_open(xdr, res); |
| 6230 | if (status) | 6226 | if (status) |
| 6231 | goto out; | 6227 | goto out; |
| 6232 | if (decode_getfh(xdr, &res->fh) != 0) | 6228 | status = decode_getfh(xdr, &res->fh); |
| 6229 | if (status) | ||
| 6233 | goto out; | 6230 | goto out; |
| 6234 | decode_getfattr(xdr, res->f_attr, res->server); | 6231 | decode_getfattr(xdr, res->f_attr, res->server); |
| 6235 | out: | 6232 | out: |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 239aff7338eb..b8eda700584b 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
| @@ -1867,6 +1867,7 @@ static int nfs23_validate_mount_data(void *options, | |||
| 1867 | 1867 | ||
| 1868 | memcpy(sap, &data->addr, sizeof(data->addr)); | 1868 | memcpy(sap, &data->addr, sizeof(data->addr)); |
| 1869 | args->nfs_server.addrlen = sizeof(data->addr); | 1869 | args->nfs_server.addrlen = sizeof(data->addr); |
| 1870 | args->nfs_server.port = ntohs(data->addr.sin_port); | ||
| 1870 | if (!nfs_verify_server_address(sap)) | 1871 | if (!nfs_verify_server_address(sap)) |
| 1871 | goto out_no_address; | 1872 | goto out_no_address; |
| 1872 | 1873 | ||
| @@ -2564,6 +2565,7 @@ static int nfs4_validate_mount_data(void *options, | |||
| 2564 | return -EFAULT; | 2565 | return -EFAULT; |
| 2565 | if (!nfs_verify_server_address(sap)) | 2566 | if (!nfs_verify_server_address(sap)) |
| 2566 | goto out_no_address; | 2567 | goto out_no_address; |
| 2568 | args->nfs_server.port = ntohs(((struct sockaddr_in *)sap)->sin_port); | ||
| 2567 | 2569 | ||
| 2568 | if (data->auth_flavourlen) { | 2570 | if (data->auth_flavourlen) { |
| 2569 | if (data->auth_flavourlen > 1) | 2571 | if (data->auth_flavourlen > 1) |
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index cbaf4f8bb7b7..4c7bd35b1876 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
| @@ -651,12 +651,12 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c | |||
| 651 | 651 | ||
| 652 | if (clp->cl_minorversion == 0) { | 652 | if (clp->cl_minorversion == 0) { |
| 653 | if (!clp->cl_cred.cr_principal && | 653 | if (!clp->cl_cred.cr_principal && |
| 654 | (clp->cl_flavor >= RPC_AUTH_GSS_KRB5)) | 654 | (clp->cl_cred.cr_flavor >= RPC_AUTH_GSS_KRB5)) |
| 655 | return -EINVAL; | 655 | return -EINVAL; |
| 656 | args.client_name = clp->cl_cred.cr_principal; | 656 | args.client_name = clp->cl_cred.cr_principal; |
| 657 | args.prognumber = conn->cb_prog, | 657 | args.prognumber = conn->cb_prog, |
| 658 | args.protocol = XPRT_TRANSPORT_TCP; | 658 | args.protocol = XPRT_TRANSPORT_TCP; |
| 659 | args.authflavor = clp->cl_flavor; | 659 | args.authflavor = clp->cl_cred.cr_flavor; |
| 660 | clp->cl_cb_ident = conn->cb_ident; | 660 | clp->cl_cb_ident = conn->cb_ident; |
| 661 | } else { | 661 | } else { |
| 662 | if (!conn->cb_xprt) | 662 | if (!conn->cb_xprt) |
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index e6173147f982..22bd0a66c356 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h | |||
| @@ -231,7 +231,6 @@ struct nfs4_client { | |||
| 231 | nfs4_verifier cl_verifier; /* generated by client */ | 231 | nfs4_verifier cl_verifier; /* generated by client */ |
| 232 | time_t cl_time; /* time of last lease renewal */ | 232 | time_t cl_time; /* time of last lease renewal */ |
| 233 | struct sockaddr_storage cl_addr; /* client ipaddress */ | 233 | struct sockaddr_storage cl_addr; /* client ipaddress */ |
| 234 | u32 cl_flavor; /* setclientid pseudoflavor */ | ||
| 235 | struct svc_cred cl_cred; /* setclientid principal */ | 234 | struct svc_cred cl_cred; /* setclientid principal */ |
| 236 | clientid_t cl_clientid; /* generated by server */ | 235 | clientid_t cl_clientid; /* generated by server */ |
| 237 | nfs4_verifier cl_confirm; /* generated by server */ | 236 | nfs4_verifier cl_confirm; /* generated by server */ |
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index dfafeb2b05a0..eb7cc91b7258 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c | |||
| @@ -462,9 +462,6 @@ static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry, | |||
| 462 | 462 | ||
| 463 | err = ERR_PTR(-ENOMEM); | 463 | err = ERR_PTR(-ENOMEM); |
| 464 | inode = proc_sys_make_inode(dir->i_sb, h ? h : head, p); | 464 | inode = proc_sys_make_inode(dir->i_sb, h ? h : head, p); |
| 465 | if (h) | ||
| 466 | sysctl_head_finish(h); | ||
| 467 | |||
| 468 | if (!inode) | 465 | if (!inode) |
| 469 | goto out; | 466 | goto out; |
| 470 | 467 | ||
| @@ -473,6 +470,8 @@ static struct dentry *proc_sys_lookup(struct inode *dir, struct dentry *dentry, | |||
| 473 | d_add(dentry, inode); | 470 | d_add(dentry, inode); |
| 474 | 471 | ||
| 475 | out: | 472 | out: |
| 473 | if (h) | ||
| 474 | sysctl_head_finish(h); | ||
| 476 | sysctl_head_finish(head); | 475 | sysctl_head_finish(head); |
| 477 | return err; | 476 | return err; |
| 478 | } | 477 | } |
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 36a29b753c79..c495a3055e2a 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
| @@ -1589,10 +1589,10 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) | |||
| 1589 | goto out; | 1589 | goto out; |
| 1590 | } | 1590 | } |
| 1591 | 1591 | ||
| 1592 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | ||
| 1593 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) | 1592 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) |
| 1594 | warn[cnt].w_type = QUOTA_NL_NOWARN; | 1593 | warn[cnt].w_type = QUOTA_NL_NOWARN; |
| 1595 | 1594 | ||
| 1595 | down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | ||
| 1596 | spin_lock(&dq_data_lock); | 1596 | spin_lock(&dq_data_lock); |
| 1597 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1597 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1598 | if (!dquots[cnt]) | 1598 | if (!dquots[cnt]) |
diff --git a/fs/reiserfs/bitmap.c b/fs/reiserfs/bitmap.c index 4c0c7d163d15..a98b7740a0fc 100644 --- a/fs/reiserfs/bitmap.c +++ b/fs/reiserfs/bitmap.c | |||
| @@ -1334,9 +1334,7 @@ struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb, | |||
| 1334 | else if (bitmap == 0) | 1334 | else if (bitmap == 0) |
| 1335 | block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1; | 1335 | block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1; |
| 1336 | 1336 | ||
| 1337 | reiserfs_write_unlock(sb); | ||
| 1338 | bh = sb_bread(sb, block); | 1337 | bh = sb_bread(sb, block); |
| 1339 | reiserfs_write_lock(sb); | ||
| 1340 | if (bh == NULL) | 1338 | if (bh == NULL) |
| 1341 | reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) " | 1339 | reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) " |
| 1342 | "reading failed", __func__, block); | 1340 | "reading failed", __func__, block); |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index a6d4268fb6c1..855da58db145 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
| @@ -76,10 +76,10 @@ void reiserfs_evict_inode(struct inode *inode) | |||
| 76 | ; | 76 | ; |
| 77 | } | 77 | } |
| 78 | out: | 78 | out: |
| 79 | reiserfs_write_unlock_once(inode->i_sb, depth); | ||
| 79 | clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */ | 80 | clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */ |
| 80 | dquot_drop(inode); | 81 | dquot_drop(inode); |
| 81 | inode->i_blocks = 0; | 82 | inode->i_blocks = 0; |
| 82 | reiserfs_write_unlock_once(inode->i_sb, depth); | ||
| 83 | return; | 83 | return; |
| 84 | 84 | ||
| 85 | no_delete: | 85 | no_delete: |
| @@ -58,7 +58,7 @@ EXPORT_SYMBOL(vfs_getattr); | |||
| 58 | int vfs_fstat(unsigned int fd, struct kstat *stat) | 58 | int vfs_fstat(unsigned int fd, struct kstat *stat) |
| 59 | { | 59 | { |
| 60 | int fput_needed; | 60 | int fput_needed; |
| 61 | struct file *f = fget_light(fd, &fput_needed); | 61 | struct file *f = fget_raw_light(fd, &fput_needed); |
| 62 | int error = -EBADF; | 62 | int error = -EBADF; |
| 63 | 63 | ||
| 64 | if (f) { | 64 | if (f) { |
diff --git a/fs/ubifs/debug.h b/fs/ubifs/debug.h index 8b8cc4e945f4..760de723dadb 100644 --- a/fs/ubifs/debug.h +++ b/fs/ubifs/debug.h | |||
| @@ -167,7 +167,7 @@ struct ubifs_global_debug_info { | |||
| 167 | #define ubifs_dbg_msg(type, fmt, ...) \ | 167 | #define ubifs_dbg_msg(type, fmt, ...) \ |
| 168 | pr_debug("UBIFS DBG " type ": " fmt "\n", ##__VA_ARGS__) | 168 | pr_debug("UBIFS DBG " type ": " fmt "\n", ##__VA_ARGS__) |
| 169 | 169 | ||
| 170 | #define DBG_KEY_BUF_LEN 32 | 170 | #define DBG_KEY_BUF_LEN 48 |
| 171 | #define ubifs_dbg_msg_key(type, key, fmt, ...) do { \ | 171 | #define ubifs_dbg_msg_key(type, key, fmt, ...) do { \ |
| 172 | char __tmp_key_buf[DBG_KEY_BUF_LEN]; \ | 172 | char __tmp_key_buf[DBG_KEY_BUF_LEN]; \ |
| 173 | pr_debug("UBIFS DBG " type ": " fmt "%s\n", ##__VA_ARGS__, \ | 173 | pr_debug("UBIFS DBG " type ": " fmt "%s\n", ##__VA_ARGS__, \ |
diff --git a/fs/ubifs/lpt.c b/fs/ubifs/lpt.c index ce33b2beb151..8640920766ed 100644 --- a/fs/ubifs/lpt.c +++ b/fs/ubifs/lpt.c | |||
| @@ -1749,7 +1749,10 @@ int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr) | |||
| 1749 | return 0; | 1749 | return 0; |
| 1750 | 1750 | ||
| 1751 | out_err: | 1751 | out_err: |
| 1752 | ubifs_lpt_free(c, 0); | 1752 | if (wr) |
| 1753 | ubifs_lpt_free(c, 1); | ||
| 1754 | if (rd) | ||
| 1755 | ubifs_lpt_free(c, 0); | ||
| 1753 | return err; | 1756 | return err; |
| 1754 | } | 1757 | } |
| 1755 | 1758 | ||
diff --git a/fs/ubifs/recovery.c b/fs/ubifs/recovery.c index c30d976b4be8..edeec499c048 100644 --- a/fs/ubifs/recovery.c +++ b/fs/ubifs/recovery.c | |||
| @@ -788,7 +788,7 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, | |||
| 788 | 788 | ||
| 789 | corrupted_rescan: | 789 | corrupted_rescan: |
| 790 | /* Re-scan the corrupted data with verbose messages */ | 790 | /* Re-scan the corrupted data with verbose messages */ |
| 791 | ubifs_err("corruptio %d", ret); | 791 | ubifs_err("corruption %d", ret); |
| 792 | ubifs_scan_a_node(c, buf, len, lnum, offs, 1); | 792 | ubifs_scan_a_node(c, buf, len, lnum, offs, 1); |
| 793 | corrupted: | 793 | corrupted: |
| 794 | ubifs_scanned_corruption(c, lnum, offs, buf); | 794 | ubifs_scanned_corruption(c, lnum, offs, buf); |
diff --git a/fs/ubifs/replay.c b/fs/ubifs/replay.c index eba46d4a7619..94d78fc5d4e0 100644 --- a/fs/ubifs/replay.c +++ b/fs/ubifs/replay.c | |||
| @@ -1026,7 +1026,6 @@ int ubifs_replay_journal(struct ubifs_info *c) | |||
| 1026 | c->replaying = 1; | 1026 | c->replaying = 1; |
| 1027 | lnum = c->ltail_lnum = c->lhead_lnum; | 1027 | lnum = c->ltail_lnum = c->lhead_lnum; |
| 1028 | 1028 | ||
| 1029 | lnum = UBIFS_LOG_LNUM; | ||
| 1030 | do { | 1029 | do { |
| 1031 | err = replay_log_leb(c, lnum, 0, c->sbuf); | 1030 | err = replay_log_leb(c, lnum, 0, c->sbuf); |
| 1032 | if (err == 1) | 1031 | if (err == 1) |
| @@ -1035,7 +1034,7 @@ int ubifs_replay_journal(struct ubifs_info *c) | |||
| 1035 | if (err) | 1034 | if (err) |
| 1036 | goto out; | 1035 | goto out; |
| 1037 | lnum = ubifs_next_log_lnum(c, lnum); | 1036 | lnum = ubifs_next_log_lnum(c, lnum); |
| 1038 | } while (lnum != UBIFS_LOG_LNUM); | 1037 | } while (lnum != c->ltail_lnum); |
| 1039 | 1038 | ||
| 1040 | err = replay_buds(c); | 1039 | err = replay_buds(c); |
| 1041 | if (err) | 1040 | if (err) |
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index c3fa6c5327a3..71a197f0f93d 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -1157,9 +1157,6 @@ static int check_free_space(struct ubifs_info *c) | |||
| 1157 | * | 1157 | * |
| 1158 | * This function mounts UBIFS file system. Returns zero in case of success and | 1158 | * This function mounts UBIFS file system. Returns zero in case of success and |
| 1159 | * a negative error code in case of failure. | 1159 | * a negative error code in case of failure. |
| 1160 | * | ||
| 1161 | * Note, the function does not de-allocate resources it it fails half way | ||
| 1162 | * through, and the caller has to do this instead. | ||
| 1163 | */ | 1160 | */ |
| 1164 | static int mount_ubifs(struct ubifs_info *c) | 1161 | static int mount_ubifs(struct ubifs_info *c) |
| 1165 | { | 1162 | { |
diff --git a/fs/udf/file.c b/fs/udf/file.c index 7f3f7ba3df6e..d1c6093fd3d3 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c | |||
| @@ -39,20 +39,24 @@ | |||
| 39 | #include "udf_i.h" | 39 | #include "udf_i.h" |
| 40 | #include "udf_sb.h" | 40 | #include "udf_sb.h" |
| 41 | 41 | ||
| 42 | static int udf_adinicb_readpage(struct file *file, struct page *page) | 42 | static void __udf_adinicb_readpage(struct page *page) |
| 43 | { | 43 | { |
| 44 | struct inode *inode = page->mapping->host; | 44 | struct inode *inode = page->mapping->host; |
| 45 | char *kaddr; | 45 | char *kaddr; |
| 46 | struct udf_inode_info *iinfo = UDF_I(inode); | 46 | struct udf_inode_info *iinfo = UDF_I(inode); |
| 47 | 47 | ||
| 48 | BUG_ON(!PageLocked(page)); | ||
| 49 | |||
| 50 | kaddr = kmap(page); | 48 | kaddr = kmap(page); |
| 51 | memset(kaddr, 0, PAGE_CACHE_SIZE); | ||
| 52 | memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size); | 49 | memcpy(kaddr, iinfo->i_ext.i_data + iinfo->i_lenEAttr, inode->i_size); |
| 50 | memset(kaddr + inode->i_size, 0, PAGE_CACHE_SIZE - inode->i_size); | ||
| 53 | flush_dcache_page(page); | 51 | flush_dcache_page(page); |
| 54 | SetPageUptodate(page); | 52 | SetPageUptodate(page); |
| 55 | kunmap(page); | 53 | kunmap(page); |
| 54 | } | ||
| 55 | |||
| 56 | static int udf_adinicb_readpage(struct file *file, struct page *page) | ||
| 57 | { | ||
| 58 | BUG_ON(!PageLocked(page)); | ||
| 59 | __udf_adinicb_readpage(page); | ||
| 56 | unlock_page(page); | 60 | unlock_page(page); |
| 57 | 61 | ||
| 58 | return 0; | 62 | return 0; |
| @@ -77,6 +81,25 @@ static int udf_adinicb_writepage(struct page *page, | |||
| 77 | return 0; | 81 | return 0; |
| 78 | } | 82 | } |
| 79 | 83 | ||
| 84 | static int udf_adinicb_write_begin(struct file *file, | ||
| 85 | struct address_space *mapping, loff_t pos, | ||
| 86 | unsigned len, unsigned flags, struct page **pagep, | ||
| 87 | void **fsdata) | ||
| 88 | { | ||
| 89 | struct page *page; | ||
| 90 | |||
| 91 | if (WARN_ON_ONCE(pos >= PAGE_CACHE_SIZE)) | ||
| 92 | return -EIO; | ||
| 93 | page = grab_cache_page_write_begin(mapping, 0, flags); | ||
| 94 | if (!page) | ||
| 95 | return -ENOMEM; | ||
| 96 | *pagep = page; | ||
| 97 | |||
| 98 | if (!PageUptodate(page) && len != PAGE_CACHE_SIZE) | ||
| 99 | __udf_adinicb_readpage(page); | ||
| 100 | return 0; | ||
| 101 | } | ||
| 102 | |||
| 80 | static int udf_adinicb_write_end(struct file *file, | 103 | static int udf_adinicb_write_end(struct file *file, |
| 81 | struct address_space *mapping, | 104 | struct address_space *mapping, |
| 82 | loff_t pos, unsigned len, unsigned copied, | 105 | loff_t pos, unsigned len, unsigned copied, |
| @@ -98,8 +121,8 @@ static int udf_adinicb_write_end(struct file *file, | |||
| 98 | const struct address_space_operations udf_adinicb_aops = { | 121 | const struct address_space_operations udf_adinicb_aops = { |
| 99 | .readpage = udf_adinicb_readpage, | 122 | .readpage = udf_adinicb_readpage, |
| 100 | .writepage = udf_adinicb_writepage, | 123 | .writepage = udf_adinicb_writepage, |
| 101 | .write_begin = simple_write_begin, | 124 | .write_begin = udf_adinicb_write_begin, |
| 102 | .write_end = udf_adinicb_write_end, | 125 | .write_end = udf_adinicb_write_end, |
| 103 | }; | 126 | }; |
| 104 | 127 | ||
| 105 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | 128 | static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov, |
diff --git a/fs/udf/inode.c b/fs/udf/inode.c index fafaad795cd6..aa233469b3c1 100644 --- a/fs/udf/inode.c +++ b/fs/udf/inode.c | |||
| @@ -1124,14 +1124,17 @@ int udf_setsize(struct inode *inode, loff_t newsize) | |||
| 1124 | if (err) | 1124 | if (err) |
| 1125 | return err; | 1125 | return err; |
| 1126 | down_write(&iinfo->i_data_sem); | 1126 | down_write(&iinfo->i_data_sem); |
| 1127 | } else | 1127 | } else { |
| 1128 | iinfo->i_lenAlloc = newsize; | 1128 | iinfo->i_lenAlloc = newsize; |
| 1129 | goto set_size; | ||
| 1130 | } | ||
| 1129 | } | 1131 | } |
| 1130 | err = udf_extend_file(inode, newsize); | 1132 | err = udf_extend_file(inode, newsize); |
| 1131 | if (err) { | 1133 | if (err) { |
| 1132 | up_write(&iinfo->i_data_sem); | 1134 | up_write(&iinfo->i_data_sem); |
| 1133 | return err; | 1135 | return err; |
| 1134 | } | 1136 | } |
| 1137 | set_size: | ||
| 1135 | truncate_setsize(inode, newsize); | 1138 | truncate_setsize(inode, newsize); |
| 1136 | up_write(&iinfo->i_data_sem); | 1139 | up_write(&iinfo->i_data_sem); |
| 1137 | } else { | 1140 | } else { |
diff --git a/fs/udf/super.c b/fs/udf/super.c index dcbf98722afc..18fc038a438d 100644 --- a/fs/udf/super.c +++ b/fs/udf/super.c | |||
| @@ -1344,6 +1344,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
| 1344 | udf_err(sb, "error loading logical volume descriptor: " | 1344 | udf_err(sb, "error loading logical volume descriptor: " |
| 1345 | "Partition table too long (%u > %lu)\n", table_len, | 1345 | "Partition table too long (%u > %lu)\n", table_len, |
| 1346 | sb->s_blocksize - sizeof(*lvd)); | 1346 | sb->s_blocksize - sizeof(*lvd)); |
| 1347 | ret = 1; | ||
| 1347 | goto out_bh; | 1348 | goto out_bh; |
| 1348 | } | 1349 | } |
| 1349 | 1350 | ||
| @@ -1388,8 +1389,10 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, | |||
| 1388 | UDF_ID_SPARABLE, | 1389 | UDF_ID_SPARABLE, |
| 1389 | strlen(UDF_ID_SPARABLE))) { | 1390 | strlen(UDF_ID_SPARABLE))) { |
| 1390 | if (udf_load_sparable_map(sb, map, | 1391 | if (udf_load_sparable_map(sb, map, |
| 1391 | (struct sparablePartitionMap *)gpm) < 0) | 1392 | (struct sparablePartitionMap *)gpm) < 0) { |
| 1393 | ret = 1; | ||
| 1392 | goto out_bh; | 1394 | goto out_bh; |
| 1395 | } | ||
| 1393 | } else if (!strncmp(upm2->partIdent.ident, | 1396 | } else if (!strncmp(upm2->partIdent.ident, |
| 1394 | UDF_ID_METADATA, | 1397 | UDF_ID_METADATA, |
| 1395 | strlen(UDF_ID_METADATA))) { | 1398 | strlen(UDF_ID_METADATA))) { |
| @@ -2000,6 +2003,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) | |||
| 2000 | if (!silent) | 2003 | if (!silent) |
| 2001 | pr_notice("Rescanning with blocksize %d\n", | 2004 | pr_notice("Rescanning with blocksize %d\n", |
| 2002 | UDF_DEFAULT_BLOCKSIZE); | 2005 | UDF_DEFAULT_BLOCKSIZE); |
| 2006 | brelse(sbi->s_lvid_bh); | ||
| 2007 | sbi->s_lvid_bh = NULL; | ||
| 2003 | uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; | 2008 | uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; |
| 2004 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); | 2009 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); |
| 2005 | } | 2010 | } |
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index d7a9dd735e1e..933b7930b863 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c | |||
| @@ -96,6 +96,7 @@ xfs_buf_lru_add( | |||
| 96 | atomic_inc(&bp->b_hold); | 96 | atomic_inc(&bp->b_hold); |
| 97 | list_add_tail(&bp->b_lru, &btp->bt_lru); | 97 | list_add_tail(&bp->b_lru, &btp->bt_lru); |
| 98 | btp->bt_lru_nr++; | 98 | btp->bt_lru_nr++; |
| 99 | bp->b_lru_flags &= ~_XBF_LRU_DISPOSE; | ||
| 99 | } | 100 | } |
| 100 | spin_unlock(&btp->bt_lru_lock); | 101 | spin_unlock(&btp->bt_lru_lock); |
| 101 | } | 102 | } |
| @@ -154,7 +155,8 @@ xfs_buf_stale( | |||
| 154 | struct xfs_buftarg *btp = bp->b_target; | 155 | struct xfs_buftarg *btp = bp->b_target; |
| 155 | 156 | ||
| 156 | spin_lock(&btp->bt_lru_lock); | 157 | spin_lock(&btp->bt_lru_lock); |
| 157 | if (!list_empty(&bp->b_lru)) { | 158 | if (!list_empty(&bp->b_lru) && |
| 159 | !(bp->b_lru_flags & _XBF_LRU_DISPOSE)) { | ||
| 158 | list_del_init(&bp->b_lru); | 160 | list_del_init(&bp->b_lru); |
| 159 | btp->bt_lru_nr--; | 161 | btp->bt_lru_nr--; |
| 160 | atomic_dec(&bp->b_hold); | 162 | atomic_dec(&bp->b_hold); |
| @@ -1501,6 +1503,7 @@ xfs_buftarg_shrink( | |||
| 1501 | */ | 1503 | */ |
| 1502 | list_move(&bp->b_lru, &dispose); | 1504 | list_move(&bp->b_lru, &dispose); |
| 1503 | btp->bt_lru_nr--; | 1505 | btp->bt_lru_nr--; |
| 1506 | bp->b_lru_flags |= _XBF_LRU_DISPOSE; | ||
| 1504 | } | 1507 | } |
| 1505 | spin_unlock(&btp->bt_lru_lock); | 1508 | spin_unlock(&btp->bt_lru_lock); |
| 1506 | 1509 | ||
diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index d03b73b9604e..7c0b6a0a1557 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h | |||
| @@ -38,27 +38,28 @@ typedef enum { | |||
| 38 | XBRW_ZERO = 3, /* Zero target memory */ | 38 | XBRW_ZERO = 3, /* Zero target memory */ |
| 39 | } xfs_buf_rw_t; | 39 | } xfs_buf_rw_t; |
| 40 | 40 | ||
| 41 | #define XBF_READ (1 << 0) /* buffer intended for reading from device */ | 41 | #define XBF_READ (1 << 0) /* buffer intended for reading from device */ |
| 42 | #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ | 42 | #define XBF_WRITE (1 << 1) /* buffer intended for writing to device */ |
| 43 | #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ | 43 | #define XBF_READ_AHEAD (1 << 2) /* asynchronous read-ahead */ |
| 44 | #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ | 44 | #define XBF_ASYNC (1 << 4) /* initiator will not wait for completion */ |
| 45 | #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ | 45 | #define XBF_DONE (1 << 5) /* all pages in the buffer uptodate */ |
| 46 | #define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */ | 46 | #define XBF_STALE (1 << 6) /* buffer has been staled, do not find it */ |
| 47 | 47 | ||
| 48 | /* I/O hints for the BIO layer */ | 48 | /* I/O hints for the BIO layer */ |
| 49 | #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ | 49 | #define XBF_SYNCIO (1 << 10)/* treat this buffer as synchronous I/O */ |
| 50 | #define XBF_FUA (1 << 11)/* force cache write through mode */ | 50 | #define XBF_FUA (1 << 11)/* force cache write through mode */ |
| 51 | #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ | 51 | #define XBF_FLUSH (1 << 12)/* flush the disk cache before a write */ |
| 52 | 52 | ||
| 53 | /* flags used only as arguments to access routines */ | 53 | /* flags used only as arguments to access routines */ |
| 54 | #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ | 54 | #define XBF_TRYLOCK (1 << 16)/* lock requested, but do not wait */ |
| 55 | #define XBF_UNMAPPED (1 << 17)/* do not map the buffer */ | 55 | #define XBF_UNMAPPED (1 << 17)/* do not map the buffer */ |
| 56 | 56 | ||
| 57 | /* flags used only internally */ | 57 | /* flags used only internally */ |
| 58 | #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ | 58 | #define _XBF_PAGES (1 << 20)/* backed by refcounted pages */ |
| 59 | #define _XBF_KMEM (1 << 21)/* backed by heap memory */ | 59 | #define _XBF_KMEM (1 << 21)/* backed by heap memory */ |
| 60 | #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ | 60 | #define _XBF_DELWRI_Q (1 << 22)/* buffer on a delwri queue */ |
| 61 | #define _XBF_COMPOUND (1 << 23)/* compound buffer */ | 61 | #define _XBF_COMPOUND (1 << 23)/* compound buffer */ |
| 62 | #define _XBF_LRU_DISPOSE (1 << 24)/* buffer being discarded */ | ||
| 62 | 63 | ||
| 63 | typedef unsigned int xfs_buf_flags_t; | 64 | typedef unsigned int xfs_buf_flags_t; |
| 64 | 65 | ||
| @@ -72,12 +73,13 @@ typedef unsigned int xfs_buf_flags_t; | |||
| 72 | { XBF_SYNCIO, "SYNCIO" }, \ | 73 | { XBF_SYNCIO, "SYNCIO" }, \ |
| 73 | { XBF_FUA, "FUA" }, \ | 74 | { XBF_FUA, "FUA" }, \ |
| 74 | { XBF_FLUSH, "FLUSH" }, \ | 75 | { XBF_FLUSH, "FLUSH" }, \ |
| 75 | { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\ | 76 | { XBF_TRYLOCK, "TRYLOCK" }, /* should never be set */\ |
| 76 | { XBF_UNMAPPED, "UNMAPPED" }, /* ditto */\ | 77 | { XBF_UNMAPPED, "UNMAPPED" }, /* ditto */\ |
| 77 | { _XBF_PAGES, "PAGES" }, \ | 78 | { _XBF_PAGES, "PAGES" }, \ |
| 78 | { _XBF_KMEM, "KMEM" }, \ | 79 | { _XBF_KMEM, "KMEM" }, \ |
| 79 | { _XBF_DELWRI_Q, "DELWRI_Q" }, \ | 80 | { _XBF_DELWRI_Q, "DELWRI_Q" }, \ |
| 80 | { _XBF_COMPOUND, "COMPOUND" } | 81 | { _XBF_COMPOUND, "COMPOUND" }, \ |
| 82 | { _XBF_LRU_DISPOSE, "LRU_DISPOSE" } | ||
| 81 | 83 | ||
| 82 | typedef struct xfs_buftarg { | 84 | typedef struct xfs_buftarg { |
| 83 | dev_t bt_dev; | 85 | dev_t bt_dev; |
| @@ -124,7 +126,12 @@ typedef struct xfs_buf { | |||
| 124 | xfs_buf_flags_t b_flags; /* status flags */ | 126 | xfs_buf_flags_t b_flags; /* status flags */ |
| 125 | struct semaphore b_sema; /* semaphore for lockables */ | 127 | struct semaphore b_sema; /* semaphore for lockables */ |
| 126 | 128 | ||
| 129 | /* | ||
| 130 | * concurrent access to b_lru and b_lru_flags are protected by | ||
| 131 | * bt_lru_lock and not by b_sema | ||
| 132 | */ | ||
| 127 | struct list_head b_lru; /* lru list */ | 133 | struct list_head b_lru; /* lru list */ |
| 134 | xfs_buf_flags_t b_lru_flags; /* internal lru status flags */ | ||
| 128 | wait_queue_head_t b_waiters; /* unpin waiters */ | 135 | wait_queue_head_t b_waiters; /* unpin waiters */ |
| 129 | struct list_head b_list; | 136 | struct list_head b_list; |
| 130 | struct xfs_perag *b_pag; /* contains rbtree root */ | 137 | struct xfs_perag *b_pag; /* contains rbtree root */ |
diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index f9c3fe304a17..69cf4fcde03e 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c | |||
| @@ -179,12 +179,14 @@ xfs_ioc_trim( | |||
| 179 | * used by the fstrim application. In the end it really doesn't | 179 | * used by the fstrim application. In the end it really doesn't |
| 180 | * matter as trimming blocks is an advisory interface. | 180 | * matter as trimming blocks is an advisory interface. |
| 181 | */ | 181 | */ |
| 182 | if (range.start >= XFS_FSB_TO_B(mp, mp->m_sb.sb_dblocks) || | ||
| 183 | range.minlen > XFS_FSB_TO_B(mp, XFS_ALLOC_AG_MAX_USABLE(mp))) | ||
| 184 | return -XFS_ERROR(EINVAL); | ||
| 185 | |||
| 182 | start = BTOBB(range.start); | 186 | start = BTOBB(range.start); |
| 183 | end = start + BTOBBT(range.len) - 1; | 187 | end = start + BTOBBT(range.len) - 1; |
| 184 | minlen = BTOBB(max_t(u64, granularity, range.minlen)); | 188 | minlen = BTOBB(max_t(u64, granularity, range.minlen)); |
| 185 | 189 | ||
| 186 | if (XFS_BB_TO_FSB(mp, start) >= mp->m_sb.sb_dblocks) | ||
| 187 | return -XFS_ERROR(EINVAL); | ||
| 188 | if (end > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) - 1) | 190 | if (end > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) - 1) |
| 189 | end = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)- 1; | 191 | end = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)- 1; |
| 190 | 192 | ||
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 21e37b55f7e5..5aceb3f8ecd6 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
| @@ -962,23 +962,22 @@ xfs_dialloc( | |||
| 962 | if (!pag->pagi_freecount && !okalloc) | 962 | if (!pag->pagi_freecount && !okalloc) |
| 963 | goto nextag; | 963 | goto nextag; |
| 964 | 964 | ||
| 965 | /* | ||
| 966 | * Then read in the AGI buffer and recheck with the AGI buffer | ||
| 967 | * lock held. | ||
| 968 | */ | ||
| 965 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); | 969 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); |
| 966 | if (error) | 970 | if (error) |
| 967 | goto out_error; | 971 | goto out_error; |
| 968 | 972 | ||
| 969 | /* | ||
| 970 | * Once the AGI has been read in we have to recheck | ||
| 971 | * pagi_freecount with the AGI buffer lock held. | ||
| 972 | */ | ||
| 973 | if (pag->pagi_freecount) { | 973 | if (pag->pagi_freecount) { |
| 974 | xfs_perag_put(pag); | 974 | xfs_perag_put(pag); |
| 975 | goto out_alloc; | 975 | goto out_alloc; |
| 976 | } | 976 | } |
| 977 | 977 | ||
| 978 | if (!okalloc) { | 978 | if (!okalloc) |
| 979 | xfs_trans_brelse(tp, agbp); | 979 | goto nextag_relse_buffer; |
| 980 | goto nextag; | 980 | |
| 981 | } | ||
| 982 | 981 | ||
| 983 | error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced); | 982 | error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced); |
| 984 | if (error) { | 983 | if (error) { |
| @@ -1007,6 +1006,8 @@ xfs_dialloc( | |||
| 1007 | return 0; | 1006 | return 0; |
| 1008 | } | 1007 | } |
| 1009 | 1008 | ||
| 1009 | nextag_relse_buffer: | ||
| 1010 | xfs_trans_brelse(tp, agbp); | ||
| 1010 | nextag: | 1011 | nextag: |
| 1011 | xfs_perag_put(pag); | 1012 | xfs_perag_put(pag); |
| 1012 | if (++agno == mp->m_sb.sb_agcount) | 1013 | if (++agno == mp->m_sb.sb_agcount) |
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 92d4331cd4f1..ca28a4ba4b54 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
| @@ -857,7 +857,7 @@ xfs_rtbuf_get( | |||
| 857 | xfs_buf_t *bp; /* block buffer, result */ | 857 | xfs_buf_t *bp; /* block buffer, result */ |
| 858 | xfs_inode_t *ip; /* bitmap or summary inode */ | 858 | xfs_inode_t *ip; /* bitmap or summary inode */ |
| 859 | xfs_bmbt_irec_t map; | 859 | xfs_bmbt_irec_t map; |
| 860 | int nmap; | 860 | int nmap = 1; |
| 861 | int error; /* error value */ | 861 | int error; /* error value */ |
| 862 | 862 | ||
| 863 | ip = issum ? mp->m_rsumip : mp->m_rbmip; | 863 | ip = issum ? mp->m_rsumip : mp->m_rbmip; |
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index bdaf4cb9f4a2..19e2380fb867 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c | |||
| @@ -919,6 +919,7 @@ xfs_fs_put_super( | |||
| 919 | struct xfs_mount *mp = XFS_M(sb); | 919 | struct xfs_mount *mp = XFS_M(sb); |
| 920 | 920 | ||
| 921 | xfs_filestream_unmount(mp); | 921 | xfs_filestream_unmount(mp); |
| 922 | cancel_delayed_work_sync(&mp->m_sync_work); | ||
| 922 | xfs_unmountfs(mp); | 923 | xfs_unmountfs(mp); |
| 923 | xfs_syncd_stop(mp); | 924 | xfs_syncd_stop(mp); |
| 924 | xfs_freesb(mp); | 925 | xfs_freesb(mp); |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index ced362533e3c..bfacf0d5a225 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
| @@ -118,7 +118,8 @@ enum drm_mode_status { | |||
| 118 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | 118 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ |
| 119 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | 119 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ |
| 120 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | 120 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ |
| 121 | .vscan = (vs), .flags = (f), .vrefresh = 0 | 121 | .vscan = (vs), .flags = (f), .vrefresh = 0, \ |
| 122 | .base.type = DRM_MODE_OBJECT_MODE | ||
| 122 | 123 | ||
| 123 | #define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ | 124 | #define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ |
| 124 | 125 | ||
diff --git a/include/drm/drm_fourcc.h b/include/drm/drm_fourcc.h index bdf0152cbbe9..f4621184a9b4 100644 --- a/include/drm/drm_fourcc.h +++ b/include/drm/drm_fourcc.h | |||
| @@ -107,8 +107,7 @@ | |||
| 107 | #define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ | 107 | #define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ |
| 108 | #define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ | 108 | #define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ |
| 109 | 109 | ||
| 110 | /* 2 non contiguous plane YCbCr */ | 110 | /* special NV12 tiled format */ |
| 111 | #define DRM_FORMAT_NV12M fourcc_code('N', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane */ | ||
| 112 | #define DRM_FORMAT_NV12MT fourcc_code('T', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane 64x32 macroblocks */ | 111 | #define DRM_FORMAT_NV12MT fourcc_code('T', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane 64x32 macroblocks */ |
| 113 | 112 | ||
| 114 | /* | 113 | /* |
| @@ -131,7 +130,4 @@ | |||
| 131 | #define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ | 130 | #define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ |
| 132 | #define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ | 131 | #define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ |
| 133 | 132 | ||
| 134 | /* 3 non contiguous plane YCbCr */ | ||
| 135 | #define DRM_FORMAT_YUV420M fourcc_code('Y', 'M', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ | ||
| 136 | |||
| 137 | #endif /* DRM_FOURCC_H */ | 133 | #endif /* DRM_FOURCC_H */ |
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h index 5581980b14f6..3d6301b6ec16 100644 --- a/include/drm/drm_mode.h +++ b/include/drm/drm_mode.h | |||
| @@ -359,8 +359,9 @@ struct drm_mode_mode_cmd { | |||
| 359 | struct drm_mode_modeinfo mode; | 359 | struct drm_mode_modeinfo mode; |
| 360 | }; | 360 | }; |
| 361 | 361 | ||
| 362 | #define DRM_MODE_CURSOR_BO (1<<0) | 362 | #define DRM_MODE_CURSOR_BO 0x01 |
| 363 | #define DRM_MODE_CURSOR_MOVE (1<<1) | 363 | #define DRM_MODE_CURSOR_MOVE 0x02 |
| 364 | #define DRM_MODE_CURSOR_FLAGS 0x03 | ||
| 364 | 365 | ||
| 365 | /* | 366 | /* |
| 366 | * depending on the value in flags different members are used. | 367 | * depending on the value in flags different members are used. |
diff --git a/include/linux/atmel-ssc.h b/include/linux/atmel-ssc.h index 06023393fba9..4eb31752e2b7 100644 --- a/include/linux/atmel-ssc.h +++ b/include/linux/atmel-ssc.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #include <linux/platform_device.h> | 4 | #include <linux/platform_device.h> |
| 5 | #include <linux/list.h> | 5 | #include <linux/list.h> |
| 6 | #include <linux/io.h> | ||
| 6 | 7 | ||
| 7 | struct ssc_device { | 8 | struct ssc_device { |
| 8 | struct list_head list; | 9 | struct list_head list; |
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 4e72a9d48232..4a2ab7c85393 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h | |||
| @@ -601,7 +601,7 @@ static inline void blk_clear_rl_full(struct request_list *rl, bool sync) | |||
| 601 | * it already be started by driver. | 601 | * it already be started by driver. |
| 602 | */ | 602 | */ |
| 603 | #define RQ_NOMERGE_FLAGS \ | 603 | #define RQ_NOMERGE_FLAGS \ |
| 604 | (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA) | 604 | (REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA | REQ_DISCARD) |
| 605 | #define rq_mergeable(rq) \ | 605 | #define rq_mergeable(rq) \ |
| 606 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ | 606 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ |
| 607 | (((rq)->cmd_flags & REQ_DISCARD) || \ | 607 | (((rq)->cmd_flags & REQ_DISCARD) || \ |
| @@ -894,6 +894,8 @@ extern void blk_queue_flush_queueable(struct request_queue *q, bool queueable); | |||
| 894 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); | 894 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
| 895 | 895 | ||
| 896 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); | 896 | extern int blk_rq_map_sg(struct request_queue *, struct request *, struct scatterlist *); |
| 897 | extern int blk_bio_map_sg(struct request_queue *q, struct bio *bio, | ||
| 898 | struct scatterlist *sglist); | ||
| 897 | extern void blk_dump_rq_flags(struct request *, char *); | 899 | extern void blk_dump_rq_flags(struct request *, char *); |
| 898 | extern long nr_blockdev_pages(void); | 900 | extern long nr_blockdev_pages(void); |
| 899 | 901 | ||
| @@ -1139,6 +1141,16 @@ static inline int queue_limit_discard_alignment(struct queue_limits *lim, sector | |||
| 1139 | & (lim->discard_granularity - 1); | 1141 | & (lim->discard_granularity - 1); |
| 1140 | } | 1142 | } |
| 1141 | 1143 | ||
| 1144 | static inline int bdev_discard_alignment(struct block_device *bdev) | ||
| 1145 | { | ||
| 1146 | struct request_queue *q = bdev_get_queue(bdev); | ||
| 1147 | |||
| 1148 | if (bdev != bdev->bd_contains) | ||
| 1149 | return bdev->bd_part->discard_alignment; | ||
| 1150 | |||
| 1151 | return q->limits.discard_alignment; | ||
| 1152 | } | ||
| 1153 | |||
| 1142 | static inline unsigned int queue_discard_zeroes_data(struct request_queue *q) | 1154 | static inline unsigned int queue_discard_zeroes_data(struct request_queue *q) |
| 1143 | { | 1155 | { |
| 1144 | if (q->limits.max_discard_sectors && q->limits.discard_zeroes_data == 1) | 1156 | if (q->limits.max_discard_sectors && q->limits.discard_zeroes_data == 1) |
diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h index 2f4079175afb..934bc34d5f99 100644 --- a/include/linux/compiler-gcc4.h +++ b/include/linux/compiler-gcc4.h | |||
| @@ -49,6 +49,13 @@ | |||
| 49 | #endif | 49 | #endif |
| 50 | #endif | 50 | #endif |
| 51 | 51 | ||
| 52 | #if __GNUC_MINOR__ >= 6 | ||
| 53 | /* | ||
| 54 | * Tell the optimizer that something else uses this function or variable. | ||
| 55 | */ | ||
| 56 | #define __visible __attribute__((externally_visible)) | ||
| 57 | #endif | ||
| 58 | |||
| 52 | #if __GNUC_MINOR__ > 0 | 59 | #if __GNUC_MINOR__ > 0 |
| 53 | #define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | 60 | #define __compiletime_object_size(obj) __builtin_object_size(obj, 0) |
| 54 | #endif | 61 | #endif |
diff --git a/include/linux/compiler.h b/include/linux/compiler.h index 923d093c9cea..f430e4162f41 100644 --- a/include/linux/compiler.h +++ b/include/linux/compiler.h | |||
| @@ -278,6 +278,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); | |||
| 278 | # define __section(S) __attribute__ ((__section__(#S))) | 278 | # define __section(S) __attribute__ ((__section__(#S))) |
| 279 | #endif | 279 | #endif |
| 280 | 280 | ||
| 281 | #ifndef __visible | ||
| 282 | #define __visible | ||
| 283 | #endif | ||
| 284 | |||
| 281 | /* Are two types/vars the same type (ignoring qualifiers)? */ | 285 | /* Are two types/vars the same type (ignoring qualifiers)? */ |
| 282 | #ifndef __same_type | 286 | #ifndef __same_type |
| 283 | # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) | 287 | # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) |
diff --git a/include/linux/cpuidle.h b/include/linux/cpuidle.h index 040b13b5c14a..279b1eaa8b73 100644 --- a/include/linux/cpuidle.h +++ b/include/linux/cpuidle.h | |||
| @@ -194,6 +194,10 @@ static inline int cpuidle_play_dead(void) {return -ENODEV; } | |||
| 194 | 194 | ||
| 195 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | 195 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED |
| 196 | void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a); | 196 | void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a); |
| 197 | #else | ||
| 198 | static inline void cpuidle_coupled_parallel_barrier(struct cpuidle_device *dev, atomic_t *a) | ||
| 199 | { | ||
| 200 | } | ||
| 197 | #endif | 201 | #endif |
| 198 | 202 | ||
| 199 | /****************************** | 203 | /****************************** |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index caa34e50537e..59200795482e 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -206,6 +206,8 @@ struct dentry_operations { | |||
| 206 | #define DCACHE_MANAGED_DENTRY \ | 206 | #define DCACHE_MANAGED_DENTRY \ |
| 207 | (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT) | 207 | (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT) |
| 208 | 208 | ||
| 209 | #define DCACHE_DENTRY_KILLED 0x100000 | ||
| 210 | |||
| 209 | extern seqlock_t rename_lock; | 211 | extern seqlock_t rename_lock; |
| 210 | 212 | ||
| 211 | static inline int dname_external(struct dentry *dentry) | 213 | static inline int dname_external(struct dentry *dentry) |
diff --git a/include/linux/i2c-pnx.h b/include/linux/i2c-pnx.h index 1bc74afe7a35..49ed17fdf055 100644 --- a/include/linux/i2c-pnx.h +++ b/include/linux/i2c-pnx.h | |||
| @@ -22,6 +22,7 @@ struct i2c_pnx_mif { | |||
| 22 | struct timer_list timer; /* Timeout */ | 22 | struct timer_list timer; /* Timeout */ |
| 23 | u8 * buf; /* Data buffer */ | 23 | u8 * buf; /* Data buffer */ |
| 24 | int len; /* Length of data buffer */ | 24 | int len; /* Length of data buffer */ |
| 25 | int order; /* RX Bytes to order via TX */ | ||
| 25 | }; | 26 | }; |
| 26 | 27 | ||
| 27 | struct i2c_pnx_algo_data { | 28 | struct i2c_pnx_algo_data { |
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 604382143bcf..2451f1f7a1d9 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
| @@ -82,10 +82,18 @@ | |||
| 82 | __x - (__x % (y)); \ | 82 | __x - (__x % (y)); \ |
| 83 | } \ | 83 | } \ |
| 84 | ) | 84 | ) |
| 85 | |||
| 86 | /* | ||
| 87 | * Divide positive or negative dividend by positive divisor and round | ||
| 88 | * to closest integer. Result is undefined for negative divisors. | ||
| 89 | */ | ||
| 85 | #define DIV_ROUND_CLOSEST(x, divisor)( \ | 90 | #define DIV_ROUND_CLOSEST(x, divisor)( \ |
| 86 | { \ | 91 | { \ |
| 87 | typeof(divisor) __divisor = divisor; \ | 92 | typeof(x) __x = x; \ |
| 88 | (((x) + ((__divisor) / 2)) / (__divisor)); \ | 93 | typeof(divisor) __d = divisor; \ |
| 94 | (((typeof(x))-1) > 0 || (__x) > 0) ? \ | ||
| 95 | (((__x) + ((__d) / 2)) / (__d)) : \ | ||
| 96 | (((__x) - ((__d) / 2)) / (__d)); \ | ||
| 89 | } \ | 97 | } \ |
| 90 | ) | 98 | ) |
| 91 | 99 | ||
diff --git a/include/linux/kobject.h b/include/linux/kobject.h index fc615a97e2d3..1e57449395b1 100644 --- a/include/linux/kobject.h +++ b/include/linux/kobject.h | |||
| @@ -224,7 +224,7 @@ static inline int kobject_uevent_env(struct kobject *kobj, | |||
| 224 | 224 | ||
| 225 | static inline __printf(2, 3) | 225 | static inline __printf(2, 3) |
| 226 | int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) | 226 | int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...) |
| 227 | { return 0; } | 227 | { return -ENOMEM; } |
| 228 | 228 | ||
| 229 | static inline int kobject_action_type(const char *buf, size_t count, | 229 | static inline int kobject_action_type(const char *buf, size_t count, |
| 230 | enum kobject_action *type) | 230 | enum kobject_action *type) |
diff --git a/include/linux/ktime.h b/include/linux/ktime.h index 603bec2913b0..06177ba10a16 100644 --- a/include/linux/ktime.h +++ b/include/linux/ktime.h | |||
| @@ -58,13 +58,6 @@ union ktime { | |||
| 58 | 58 | ||
| 59 | typedef union ktime ktime_t; /* Kill this */ | 59 | typedef union ktime ktime_t; /* Kill this */ |
| 60 | 60 | ||
| 61 | #define KTIME_MAX ((s64)~((u64)1 << 63)) | ||
| 62 | #if (BITS_PER_LONG == 64) | ||
| 63 | # define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) | ||
| 64 | #else | ||
| 65 | # define KTIME_SEC_MAX LONG_MAX | ||
| 66 | #endif | ||
| 67 | |||
| 68 | /* | 61 | /* |
| 69 | * ktime_t definitions when using the 64-bit scalar representation: | 62 | * ktime_t definitions when using the 64-bit scalar representation: |
| 70 | */ | 63 | */ |
diff --git a/include/linux/mISDNhw.h b/include/linux/mISDNhw.h index d0752eca9b44..9d96d5d4dfed 100644 --- a/include/linux/mISDNhw.h +++ b/include/linux/mISDNhw.h | |||
| @@ -183,7 +183,7 @@ extern int mISDN_initbchannel(struct bchannel *, unsigned short, | |||
| 183 | unsigned short); | 183 | unsigned short); |
| 184 | extern int mISDN_freedchannel(struct dchannel *); | 184 | extern int mISDN_freedchannel(struct dchannel *); |
| 185 | extern void mISDN_clear_bchannel(struct bchannel *); | 185 | extern void mISDN_clear_bchannel(struct bchannel *); |
| 186 | extern int mISDN_freebchannel(struct bchannel *); | 186 | extern void mISDN_freebchannel(struct bchannel *); |
| 187 | extern int mISDN_ctrl_bchannel(struct bchannel *, struct mISDN_ctrl_req *); | 187 | extern int mISDN_ctrl_bchannel(struct bchannel *, struct mISDN_ctrl_req *); |
| 188 | extern void queue_ch_frame(struct mISDNchannel *, u_int, | 188 | extern void queue_ch_frame(struct mISDNchannel *, u_int, |
| 189 | int, struct sk_buff *); | 189 | int, struct sk_buff *); |
diff --git a/include/linux/memory.h b/include/linux/memory.h index 1ac7f6e405f9..ff9a9f8e0ed9 100644 --- a/include/linux/memory.h +++ b/include/linux/memory.h | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include <linux/compiler.h> | 19 | #include <linux/compiler.h> |
| 20 | #include <linux/mutex.h> | 20 | #include <linux/mutex.h> |
| 21 | 21 | ||
| 22 | #define MIN_MEMORY_BLOCK_SIZE (1 << SECTION_SIZE_BITS) | 22 | #define MIN_MEMORY_BLOCK_SIZE (1UL << SECTION_SIZE_BITS) |
| 23 | 23 | ||
| 24 | struct memory_block { | 24 | struct memory_block { |
| 25 | unsigned long start_section_nr; | 25 | unsigned long start_section_nr; |
diff --git a/include/linux/mfd/core.h b/include/linux/mfd/core.h index 3a8435a8058f..cebe97ee98b8 100644 --- a/include/linux/mfd/core.h +++ b/include/linux/mfd/core.h | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | 16 | ||
| 17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
| 18 | 18 | ||
| 19 | struct irq_domain; | ||
| 20 | |||
| 19 | /* | 21 | /* |
| 20 | * This struct describes the MFD part ("cell"). | 22 | * This struct describes the MFD part ("cell"). |
| 21 | * After registration the copy of this structure will become the platform data | 23 | * After registration the copy of this structure will become the platform data |
| @@ -98,7 +100,7 @@ static inline const struct mfd_cell *mfd_get_cell(struct platform_device *pdev) | |||
| 98 | extern int mfd_add_devices(struct device *parent, int id, | 100 | extern int mfd_add_devices(struct device *parent, int id, |
| 99 | struct mfd_cell *cells, int n_devs, | 101 | struct mfd_cell *cells, int n_devs, |
| 100 | struct resource *mem_base, | 102 | struct resource *mem_base, |
| 101 | int irq_base); | 103 | int irq_base, struct irq_domain *irq_domain); |
| 102 | 104 | ||
| 103 | extern void mfd_remove_devices(struct device *parent); | 105 | extern void mfd_remove_devices(struct device *parent); |
| 104 | 106 | ||
diff --git a/include/linux/mfd/tps65217.h b/include/linux/mfd/tps65217.h index 12c06870829a..7cd83d826ed8 100644 --- a/include/linux/mfd/tps65217.h +++ b/include/linux/mfd/tps65217.h | |||
| @@ -22,6 +22,9 @@ | |||
| 22 | #include <linux/regulator/driver.h> | 22 | #include <linux/regulator/driver.h> |
| 23 | #include <linux/regulator/machine.h> | 23 | #include <linux/regulator/machine.h> |
| 24 | 24 | ||
| 25 | /* TPS chip id list */ | ||
| 26 | #define TPS65217 0xF0 | ||
| 27 | |||
| 25 | /* I2C ID for TPS65217 part */ | 28 | /* I2C ID for TPS65217 part */ |
| 26 | #define TPS65217_I2C_ID 0x24 | 29 | #define TPS65217_I2C_ID 0x24 |
| 27 | 30 | ||
| @@ -248,13 +251,11 @@ struct tps_info { | |||
| 248 | struct tps65217 { | 251 | struct tps65217 { |
| 249 | struct device *dev; | 252 | struct device *dev; |
| 250 | struct tps65217_board *pdata; | 253 | struct tps65217_board *pdata; |
| 254 | unsigned int id; | ||
| 251 | struct regulator_desc desc[TPS65217_NUM_REGULATOR]; | 255 | struct regulator_desc desc[TPS65217_NUM_REGULATOR]; |
| 252 | struct regulator_dev *rdev[TPS65217_NUM_REGULATOR]; | 256 | struct regulator_dev *rdev[TPS65217_NUM_REGULATOR]; |
| 253 | struct tps_info *info[TPS65217_NUM_REGULATOR]; | 257 | struct tps_info *info[TPS65217_NUM_REGULATOR]; |
| 254 | struct regmap *regmap; | 258 | struct regmap *regmap; |
| 255 | |||
| 256 | /* Client devices */ | ||
| 257 | struct platform_device *regulator_pdev[TPS65217_NUM_REGULATOR]; | ||
| 258 | }; | 259 | }; |
| 259 | 260 | ||
| 260 | static inline struct tps65217 *dev_to_tps65217(struct device *dev) | 261 | static inline struct tps65217 *dev_to_tps65217(struct device *dev) |
| @@ -262,6 +263,11 @@ static inline struct tps65217 *dev_to_tps65217(struct device *dev) | |||
| 262 | return dev_get_drvdata(dev); | 263 | return dev_get_drvdata(dev); |
| 263 | } | 264 | } |
| 264 | 265 | ||
| 266 | static inline int tps65217_chip_id(struct tps65217 *tps65217) | ||
| 267 | { | ||
| 268 | return tps65217->id; | ||
| 269 | } | ||
| 270 | |||
| 265 | int tps65217_reg_read(struct tps65217 *tps, unsigned int reg, | 271 | int tps65217_reg_read(struct tps65217 *tps, unsigned int reg, |
| 266 | unsigned int *val); | 272 | unsigned int *val); |
| 267 | int tps65217_reg_write(struct tps65217 *tps, unsigned int reg, | 273 | int tps65217_reg_write(struct tps65217 *tps, unsigned int reg, |
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index bd6c9fcdf2dd..6e1b0f973a03 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h | |||
| @@ -796,6 +796,19 @@ enum mlx4_net_trans_rule_id { | |||
| 796 | MLX4_NET_TRANS_RULE_NUM, /* should be last */ | 796 | MLX4_NET_TRANS_RULE_NUM, /* should be last */ |
| 797 | }; | 797 | }; |
| 798 | 798 | ||
| 799 | extern const u16 __sw_id_hw[]; | ||
| 800 | |||
| 801 | static inline int map_hw_to_sw_id(u16 header_id) | ||
| 802 | { | ||
| 803 | |||
| 804 | int i; | ||
| 805 | for (i = 0; i < MLX4_NET_TRANS_RULE_NUM; i++) { | ||
| 806 | if (header_id == __sw_id_hw[i]) | ||
| 807 | return i; | ||
| 808 | } | ||
| 809 | return -EINVAL; | ||
| 810 | } | ||
| 811 | |||
| 799 | enum mlx4_net_trans_promisc_mode { | 812 | enum mlx4_net_trans_promisc_mode { |
| 800 | MLX4_FS_PROMISC_NONE = 0, | 813 | MLX4_FS_PROMISC_NONE = 0, |
| 801 | MLX4_FS_PROMISC_UPLINK, | 814 | MLX4_FS_PROMISC_UPLINK, |
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 111aca5e97f3..4b27f9f503e4 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h | |||
| @@ -239,6 +239,7 @@ struct mmc_card { | |||
| 239 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ | 239 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ |
| 240 | #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ | 240 | #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ |
| 241 | #define MMC_QUIRK_LONG_READ_TIME (1<<9) /* Data read time > CSD says */ | 241 | #define MMC_QUIRK_LONG_READ_TIME (1<<9) /* Data read time > CSD says */ |
| 242 | #define MMC_QUIRK_SEC_ERASE_TRIM_BROKEN (1<<10) /* Skip secure for erase/trim */ | ||
| 242 | /* byte mode */ | 243 | /* byte mode */ |
| 243 | unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ | 244 | unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ |
| 244 | #define MMC_NO_POWER_NOTIFICATION 0 | 245 | #define MMC_NO_POWER_NOTIFICATION 0 |
diff --git a/include/linux/mv643xx_eth.h b/include/linux/mv643xx_eth.h index 51bf8ada6dc0..49258e0ed1c6 100644 --- a/include/linux/mv643xx_eth.h +++ b/include/linux/mv643xx_eth.h | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #define MV643XX_ETH_SIZE_REG_4 0x2224 | 15 | #define MV643XX_ETH_SIZE_REG_4 0x2224 |
| 16 | #define MV643XX_ETH_BASE_ADDR_ENABLE_REG 0x2290 | 16 | #define MV643XX_ETH_BASE_ADDR_ENABLE_REG 0x2290 |
| 17 | 17 | ||
| 18 | #define MV643XX_TX_CSUM_DEFAULT_LIMIT 0 | ||
| 19 | |||
| 18 | struct mv643xx_eth_shared_platform_data { | 20 | struct mv643xx_eth_shared_platform_data { |
| 19 | struct mbus_dram_target_info *dram; | 21 | struct mbus_dram_target_info *dram; |
| 20 | struct platform_device *shared_smi; | 22 | struct platform_device *shared_smi; |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 1f8fc7f9bcd8..4b03f56e280e 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -265,11 +265,6 @@ static inline const struct nfs_rpc_ops *NFS_PROTO(const struct inode *inode) | |||
| 265 | return NFS_SERVER(inode)->nfs_client->rpc_ops; | 265 | return NFS_SERVER(inode)->nfs_client->rpc_ops; |
| 266 | } | 266 | } |
| 267 | 267 | ||
| 268 | static inline __be32 *NFS_COOKIEVERF(const struct inode *inode) | ||
| 269 | { | ||
| 270 | return NFS_I(inode)->cookieverf; | ||
| 271 | } | ||
| 272 | |||
| 273 | static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode) | 268 | static inline unsigned NFS_MINATTRTIMEO(const struct inode *inode) |
| 274 | { | 269 | { |
| 275 | struct nfs_server *nfss = NFS_SERVER(inode); | 270 | struct nfs_server *nfss = NFS_SERVER(inode); |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index ac7c8ae254f2..be9cf3c7e79e 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
| @@ -652,7 +652,7 @@ struct nfs_getaclargs { | |||
| 652 | }; | 652 | }; |
| 653 | 653 | ||
| 654 | /* getxattr ACL interface flags */ | 654 | /* getxattr ACL interface flags */ |
| 655 | #define NFS4_ACL_LEN_REQUEST 0x0001 /* zero length getxattr buffer */ | 655 | #define NFS4_ACL_TRUNC 0x0001 /* ACL was truncated */ |
| 656 | struct nfs_getaclres { | 656 | struct nfs_getaclres { |
| 657 | size_t acl_len; | 657 | size_t acl_len; |
| 658 | size_t acl_data_offset; | 658 | size_t acl_data_offset; |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index fc3526077348..6b4565c440c8 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -2149,7 +2149,7 @@ | |||
| 2149 | #define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 | 2149 | #define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 |
| 2150 | #define PCI_DEVICE_ID_NX2_57800_VF 0x16a9 | 2150 | #define PCI_DEVICE_ID_NX2_57800_VF 0x16a9 |
| 2151 | #define PCI_DEVICE_ID_NX2_5706S 0x16aa | 2151 | #define PCI_DEVICE_ID_NX2_5706S 0x16aa |
| 2152 | #define PCI_DEVICE_ID_NX2_57840_MF 0x16ab | 2152 | #define PCI_DEVICE_ID_NX2_57840_MF 0x16a4 |
| 2153 | #define PCI_DEVICE_ID_NX2_5708S 0x16ac | 2153 | #define PCI_DEVICE_ID_NX2_5708S 0x16ac |
| 2154 | #define PCI_DEVICE_ID_NX2_57840_VF 0x16ad | 2154 | #define PCI_DEVICE_ID_NX2_57840_VF 0x16ad |
| 2155 | #define PCI_DEVICE_ID_NX2_57810_MF 0x16ae | 2155 | #define PCI_DEVICE_ID_NX2_57810_MF 0x16ae |
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 7602ccb3f40e..bdb41612bfec 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h | |||
| @@ -274,6 +274,8 @@ struct perf_event_attr { | |||
| 274 | __u64 branch_sample_type; /* enum branch_sample_type */ | 274 | __u64 branch_sample_type; /* enum branch_sample_type */ |
| 275 | }; | 275 | }; |
| 276 | 276 | ||
| 277 | #define perf_flags(attr) (*(&(attr)->read_format + 1)) | ||
| 278 | |||
| 277 | /* | 279 | /* |
| 278 | * Ioctls that can be done on a perf event fd: | 280 | * Ioctls that can be done on a perf event fd: |
| 279 | */ | 281 | */ |
| @@ -926,7 +928,7 @@ struct perf_event { | |||
| 926 | struct hw_perf_event hw; | 928 | struct hw_perf_event hw; |
| 927 | 929 | ||
| 928 | struct perf_event_context *ctx; | 930 | struct perf_event_context *ctx; |
| 929 | struct file *filp; | 931 | atomic_long_t refcount; |
| 930 | 932 | ||
| 931 | /* | 933 | /* |
| 932 | * These accumulate total time (in nanoseconds) that children | 934 | * These accumulate total time (in nanoseconds) that children |
| @@ -1296,6 +1298,7 @@ extern int perf_swevent_get_recursion_context(void); | |||
| 1296 | extern void perf_swevent_put_recursion_context(int rctx); | 1298 | extern void perf_swevent_put_recursion_context(int rctx); |
| 1297 | extern void perf_event_enable(struct perf_event *event); | 1299 | extern void perf_event_enable(struct perf_event *event); |
| 1298 | extern void perf_event_disable(struct perf_event *event); | 1300 | extern void perf_event_disable(struct perf_event *event); |
| 1301 | extern int __perf_event_disable(void *info); | ||
| 1299 | extern void perf_event_task_tick(void); | 1302 | extern void perf_event_task_tick(void); |
| 1300 | #else | 1303 | #else |
| 1301 | static inline void | 1304 | static inline void |
| @@ -1334,6 +1337,7 @@ static inline int perf_swevent_get_recursion_context(void) { return -1; } | |||
| 1334 | static inline void perf_swevent_put_recursion_context(int rctx) { } | 1337 | static inline void perf_swevent_put_recursion_context(int rctx) { } |
| 1335 | static inline void perf_event_enable(struct perf_event *event) { } | 1338 | static inline void perf_event_enable(struct perf_event *event) { } |
| 1336 | static inline void perf_event_disable(struct perf_event *event) { } | 1339 | static inline void perf_event_disable(struct perf_event *event) { } |
| 1340 | static inline int __perf_event_disable(void *info) { return -1; } | ||
| 1337 | static inline void perf_event_task_tick(void) { } | 1341 | static inline void perf_event_task_tick(void) { } |
| 1338 | #endif | 1342 | #endif |
| 1339 | 1343 | ||
diff --git a/include/linux/sched.h b/include/linux/sched.h index b8c86648a2f9..23bddac4bad8 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -954,7 +954,6 @@ struct sched_domain { | |||
| 954 | unsigned int smt_gain; | 954 | unsigned int smt_gain; |
| 955 | int flags; /* See SD_* */ | 955 | int flags; /* See SD_* */ |
| 956 | int level; | 956 | int level; |
| 957 | int idle_buddy; /* cpu assigned to select_idle_sibling() */ | ||
| 958 | 957 | ||
| 959 | /* Runtime fields. */ | 958 | /* Runtime fields. */ |
| 960 | unsigned long last_balance; /* init to jiffies. units in jiffies */ | 959 | unsigned long last_balance; /* init to jiffies. units in jiffies */ |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index cff40aa7db62..bf8c49ff7530 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
| @@ -114,6 +114,7 @@ struct rpc_xprt_ops { | |||
| 114 | void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); | 114 | void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize); |
| 115 | int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 115 | int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
| 116 | void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); | 116 | void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task); |
| 117 | void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task); | ||
| 117 | void (*rpcbind)(struct rpc_task *task); | 118 | void (*rpcbind)(struct rpc_task *task); |
| 118 | void (*set_port)(struct rpc_xprt *xprt, unsigned short port); | 119 | void (*set_port)(struct rpc_xprt *xprt, unsigned short port); |
| 119 | void (*connect)(struct rpc_task *task); | 120 | void (*connect)(struct rpc_task *task); |
| @@ -281,6 +282,8 @@ void xprt_connect(struct rpc_task *task); | |||
| 281 | void xprt_reserve(struct rpc_task *task); | 282 | void xprt_reserve(struct rpc_task *task); |
| 282 | int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); | 283 | int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task); |
| 283 | int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); | 284 | int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task); |
| 285 | void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); | ||
| 286 | void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task); | ||
| 284 | int xprt_prepare_transmit(struct rpc_task *task); | 287 | int xprt_prepare_transmit(struct rpc_task *task); |
| 285 | void xprt_transmit(struct rpc_task *task); | 288 | void xprt_transmit(struct rpc_task *task); |
| 286 | void xprt_end_transmit(struct rpc_task *task); | 289 | void xprt_end_transmit(struct rpc_task *task); |
diff --git a/include/linux/time.h b/include/linux/time.h index c81c5e40fcb5..b51e664c83e7 100644 --- a/include/linux/time.h +++ b/include/linux/time.h | |||
| @@ -107,11 +107,36 @@ static inline struct timespec timespec_sub(struct timespec lhs, | |||
| 107 | return ts_delta; | 107 | return ts_delta; |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | #define KTIME_MAX ((s64)~((u64)1 << 63)) | ||
| 111 | #if (BITS_PER_LONG == 64) | ||
| 112 | # define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) | ||
| 113 | #else | ||
| 114 | # define KTIME_SEC_MAX LONG_MAX | ||
| 115 | #endif | ||
| 116 | |||
| 110 | /* | 117 | /* |
| 111 | * Returns true if the timespec is norm, false if denorm: | 118 | * Returns true if the timespec is norm, false if denorm: |
| 112 | */ | 119 | */ |
| 113 | #define timespec_valid(ts) \ | 120 | static inline bool timespec_valid(const struct timespec *ts) |
| 114 | (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) | 121 | { |
| 122 | /* Dates before 1970 are bogus */ | ||
| 123 | if (ts->tv_sec < 0) | ||
| 124 | return false; | ||
| 125 | /* Can't have more nanoseconds then a second */ | ||
| 126 | if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) | ||
| 127 | return false; | ||
| 128 | return true; | ||
| 129 | } | ||
| 130 | |||
| 131 | static inline bool timespec_valid_strict(const struct timespec *ts) | ||
| 132 | { | ||
| 133 | if (!timespec_valid(ts)) | ||
| 134 | return false; | ||
| 135 | /* Disallow values that could overflow ktime_t */ | ||
| 136 | if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX) | ||
| 137 | return false; | ||
| 138 | return true; | ||
| 139 | } | ||
| 115 | 140 | ||
| 116 | extern void read_persistent_clock(struct timespec *ts); | 141 | extern void read_persistent_clock(struct timespec *ts); |
| 117 | extern void read_boot_clock(struct timespec *ts); | 142 | extern void read_boot_clock(struct timespec *ts); |
diff --git a/include/linux/xfrm.h b/include/linux/xfrm.h index 22e61fdf75a2..28e493b5b94c 100644 --- a/include/linux/xfrm.h +++ b/include/linux/xfrm.h | |||
| @@ -84,6 +84,8 @@ struct xfrm_replay_state { | |||
| 84 | __u32 bitmap; | 84 | __u32 bitmap; |
| 85 | }; | 85 | }; |
| 86 | 86 | ||
| 87 | #define XFRMA_REPLAY_ESN_MAX 4096 | ||
| 88 | |||
| 87 | struct xfrm_replay_state_esn { | 89 | struct xfrm_replay_state_esn { |
| 88 | unsigned int bmp_len; | 90 | unsigned int bmp_len; |
| 89 | __u32 oseq; | 91 | __u32 oseq; |
diff --git a/include/net/bluetooth/smp.h b/include/net/bluetooth/smp.h index ca356a734920..8b27927b2a55 100644 --- a/include/net/bluetooth/smp.h +++ b/include/net/bluetooth/smp.h | |||
| @@ -136,7 +136,7 @@ struct smp_chan { | |||
| 136 | }; | 136 | }; |
| 137 | 137 | ||
| 138 | /* SMP Commands */ | 138 | /* SMP Commands */ |
| 139 | int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level); | 139 | int smp_conn_security(struct hci_conn *hcon, __u8 sec_level); |
| 140 | int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb); | 140 | int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb); |
| 141 | int smp_distribute_keys(struct l2cap_conn *conn, __u8 force); | 141 | int smp_distribute_keys(struct l2cap_conn *conn, __u8 force); |
| 142 | int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey); | 142 | int smp_user_confirm_reply(struct hci_conn *conn, u16 mgmt_op, __le32 passkey); |
diff --git a/include/net/ip6_fib.h b/include/net/ip6_fib.h index 0fedbd8d747a..9fc7114159e8 100644 --- a/include/net/ip6_fib.h +++ b/include/net/ip6_fib.h | |||
| @@ -111,9 +111,8 @@ struct rt6_info { | |||
| 111 | struct inet6_dev *rt6i_idev; | 111 | struct inet6_dev *rt6i_idev; |
| 112 | unsigned long _rt6i_peer; | 112 | unsigned long _rt6i_peer; |
| 113 | 113 | ||
| 114 | #ifdef CONFIG_XFRM | 114 | u32 rt6i_genid; |
| 115 | u32 rt6i_flow_cache_genid; | 115 | |
| 116 | #endif | ||
| 117 | /* more non-fragment space at head required */ | 116 | /* more non-fragment space at head required */ |
| 118 | unsigned short rt6i_nfheader_len; | 117 | unsigned short rt6i_nfheader_len; |
| 119 | 118 | ||
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index ae1cd6c9ba52..fd87963a0ea5 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h | |||
| @@ -102,6 +102,7 @@ struct net { | |||
| 102 | #endif | 102 | #endif |
| 103 | struct netns_ipvs *ipvs; | 103 | struct netns_ipvs *ipvs; |
| 104 | struct sock *diag_nlsk; | 104 | struct sock *diag_nlsk; |
| 105 | atomic_t rt_genid; | ||
| 105 | }; | 106 | }; |
| 106 | 107 | ||
| 107 | 108 | ||
| @@ -300,5 +301,14 @@ static inline void unregister_net_sysctl_table(struct ctl_table_header *header) | |||
| 300 | } | 301 | } |
| 301 | #endif | 302 | #endif |
| 302 | 303 | ||
| 304 | static inline int rt_genid(struct net *net) | ||
| 305 | { | ||
| 306 | return atomic_read(&net->rt_genid); | ||
| 307 | } | ||
| 308 | |||
| 309 | static inline void rt_genid_bump(struct net *net) | ||
| 310 | { | ||
| 311 | atomic_inc(&net->rt_genid); | ||
| 312 | } | ||
| 303 | 313 | ||
| 304 | #endif /* __NET_NET_NAMESPACE_H */ | 314 | #endif /* __NET_NET_NAMESPACE_H */ |
diff --git a/include/net/netfilter/nf_conntrack_ecache.h b/include/net/netfilter/nf_conntrack_ecache.h index e1ce1048fe5f..4a045cda9c60 100644 --- a/include/net/netfilter/nf_conntrack_ecache.h +++ b/include/net/netfilter/nf_conntrack_ecache.h | |||
| @@ -18,6 +18,7 @@ struct nf_conntrack_ecache { | |||
| 18 | u16 ctmask; /* bitmask of ct events to be delivered */ | 18 | u16 ctmask; /* bitmask of ct events to be delivered */ |
| 19 | u16 expmask; /* bitmask of expect events to be delivered */ | 19 | u16 expmask; /* bitmask of expect events to be delivered */ |
| 20 | u32 pid; /* netlink pid of destroyer */ | 20 | u32 pid; /* netlink pid of destroyer */ |
| 21 | struct timer_list timeout; | ||
| 21 | }; | 22 | }; |
| 22 | 23 | ||
| 23 | static inline struct nf_conntrack_ecache * | 24 | static inline struct nf_conntrack_ecache * |
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index 1474dd65c66f..eb24dbccd81e 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h | |||
| @@ -65,7 +65,6 @@ struct netns_ipv4 { | |||
| 65 | unsigned int sysctl_ping_group_range[2]; | 65 | unsigned int sysctl_ping_group_range[2]; |
| 66 | long sysctl_tcp_mem[3]; | 66 | long sysctl_tcp_mem[3]; |
| 67 | 67 | ||
| 68 | atomic_t rt_genid; | ||
| 69 | atomic_t dev_addr_genid; | 68 | atomic_t dev_addr_genid; |
| 70 | 69 | ||
| 71 | #ifdef CONFIG_IP_MROUTE | 70 | #ifdef CONFIG_IP_MROUTE |
diff --git a/include/net/route.h b/include/net/route.h index 776a27f1ab78..da22243d2760 100644 --- a/include/net/route.h +++ b/include/net/route.h | |||
| @@ -108,7 +108,7 @@ extern struct ip_rt_acct __percpu *ip_rt_acct; | |||
| 108 | 108 | ||
| 109 | struct in_device; | 109 | struct in_device; |
| 110 | extern int ip_rt_init(void); | 110 | extern int ip_rt_init(void); |
| 111 | extern void rt_cache_flush(struct net *net, int how); | 111 | extern void rt_cache_flush(struct net *net); |
| 112 | extern void rt_flush_dev(struct net_device *dev); | 112 | extern void rt_flush_dev(struct net_device *dev); |
| 113 | extern struct rtable *__ip_route_output_key(struct net *, struct flowi4 *flp); | 113 | extern struct rtable *__ip_route_output_key(struct net *, struct flowi4 *flp); |
| 114 | extern struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp, | 114 | extern struct rtable *ip_route_output_flow(struct net *, struct flowi4 *flp, |
diff --git a/include/net/sock.h b/include/net/sock.h index 72132aef53fc..adb7da20b5a1 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -1332,7 +1332,7 @@ static inline bool sk_wmem_schedule(struct sock *sk, int size) | |||
| 1332 | } | 1332 | } |
| 1333 | 1333 | ||
| 1334 | static inline bool | 1334 | static inline bool |
| 1335 | sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, unsigned int size) | 1335 | sk_rmem_schedule(struct sock *sk, struct sk_buff *skb, int size) |
| 1336 | { | 1336 | { |
| 1337 | if (!sk_has_account(sk)) | 1337 | if (!sk_has_account(sk)) |
| 1338 | return true; | 1338 | return true; |
diff --git a/include/net/xfrm.h b/include/net/xfrm.h index 976a81abe1a2..639dd1316d37 100644 --- a/include/net/xfrm.h +++ b/include/net/xfrm.h | |||
| @@ -273,6 +273,9 @@ struct xfrm_replay { | |||
| 273 | int (*check)(struct xfrm_state *x, | 273 | int (*check)(struct xfrm_state *x, |
| 274 | struct sk_buff *skb, | 274 | struct sk_buff *skb, |
| 275 | __be32 net_seq); | 275 | __be32 net_seq); |
| 276 | int (*recheck)(struct xfrm_state *x, | ||
| 277 | struct sk_buff *skb, | ||
| 278 | __be32 net_seq); | ||
| 276 | void (*notify)(struct xfrm_state *x, int event); | 279 | void (*notify)(struct xfrm_state *x, int event); |
| 277 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); | 280 | int (*overflow)(struct xfrm_state *x, struct sk_buff *skb); |
| 278 | }; | 281 | }; |
diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index f1405d335a96..941c84bf1065 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h | |||
| @@ -23,7 +23,9 @@ struct se_subsystem_api { | |||
| 23 | struct se_device *(*create_virtdevice)(struct se_hba *, | 23 | struct se_device *(*create_virtdevice)(struct se_hba *, |
| 24 | struct se_subsystem_dev *, void *); | 24 | struct se_subsystem_dev *, void *); |
| 25 | void (*free_device)(void *); | 25 | void (*free_device)(void *); |
| 26 | int (*transport_complete)(struct se_cmd *cmd, struct scatterlist *); | 26 | void (*transport_complete)(struct se_cmd *cmd, |
| 27 | struct scatterlist *, | ||
| 28 | unsigned char *); | ||
| 27 | 29 | ||
| 28 | int (*parse_cdb)(struct se_cmd *cmd); | 30 | int (*parse_cdb)(struct se_cmd *cmd); |
| 29 | ssize_t (*check_configfs_dev_params)(struct se_hba *, | 31 | ssize_t (*check_configfs_dev_params)(struct se_hba *, |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 015cea01ae39..5be89373ceac 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
| @@ -121,6 +121,7 @@ | |||
| 121 | 121 | ||
| 122 | #define SE_INQUIRY_BUF 512 | 122 | #define SE_INQUIRY_BUF 512 |
| 123 | #define SE_MODE_PAGE_BUF 512 | 123 | #define SE_MODE_PAGE_BUF 512 |
| 124 | #define SE_SENSE_BUF 96 | ||
| 124 | 125 | ||
| 125 | /* struct se_hba->hba_flags */ | 126 | /* struct se_hba->hba_flags */ |
| 126 | enum hba_flags_table { | 127 | enum hba_flags_table { |
diff --git a/include/trace/events/kmem.h b/include/trace/events/kmem.h index 5f889f16b0c8..08fa27244da7 100644 --- a/include/trace/events/kmem.h +++ b/include/trace/events/kmem.h | |||
| @@ -214,7 +214,7 @@ TRACE_EVENT(mm_page_alloc, | |||
| 214 | 214 | ||
| 215 | TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", | 215 | TP_printk("page=%p pfn=%lu order=%d migratetype=%d gfp_flags=%s", |
| 216 | __entry->page, | 216 | __entry->page, |
| 217 | page_to_pfn(__entry->page), | 217 | __entry->page ? page_to_pfn(__entry->page) : 0, |
| 218 | __entry->order, | 218 | __entry->order, |
| 219 | __entry->migratetype, | 219 | __entry->migratetype, |
| 220 | show_gfp_flags(__entry->gfp_flags)) | 220 | show_gfp_flags(__entry->gfp_flags)) |
| @@ -240,7 +240,7 @@ DECLARE_EVENT_CLASS(mm_page, | |||
| 240 | 240 | ||
| 241 | TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", | 241 | TP_printk("page=%p pfn=%lu order=%u migratetype=%d percpu_refill=%d", |
| 242 | __entry->page, | 242 | __entry->page, |
| 243 | page_to_pfn(__entry->page), | 243 | __entry->page ? page_to_pfn(__entry->page) : 0, |
| 244 | __entry->order, | 244 | __entry->order, |
| 245 | __entry->migratetype, | 245 | __entry->migratetype, |
| 246 | __entry->order == 0) | 246 | __entry->order == 0) |
diff --git a/include/xen/events.h b/include/xen/events.h index 9c641deb65d2..04399b28e821 100644 --- a/include/xen/events.h +++ b/include/xen/events.h | |||
| @@ -58,8 +58,6 @@ void notify_remote_via_irq(int irq); | |||
| 58 | 58 | ||
| 59 | void xen_irq_resume(void); | 59 | void xen_irq_resume(void); |
| 60 | 60 | ||
| 61 | void xen_hvm_prepare_kexec(struct shared_info *sip, unsigned long pfn); | ||
| 62 | |||
| 63 | /* Clear an irq's pending state, in preparation for polling on it */ | 61 | /* Clear an irq's pending state, in preparation for polling on it */ |
| 64 | void xen_clear_irq_pending(int irq); | 62 | void xen_clear_irq_pending(int irq); |
| 65 | void xen_set_irq_pending(int irq); | 63 | void xen_set_irq_pending(int irq); |
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index 11e27c3af3cb..f19fff8650e9 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h | |||
| @@ -187,6 +187,7 @@ int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, | |||
| 187 | struct gnttab_map_grant_ref *kmap_ops, | 187 | struct gnttab_map_grant_ref *kmap_ops, |
| 188 | struct page **pages, unsigned int count); | 188 | struct page **pages, unsigned int count); |
| 189 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | 189 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, |
| 190 | struct page **pages, unsigned int count, bool clear_pte); | 190 | struct gnttab_map_grant_ref *kunmap_ops, |
| 191 | struct page **pages, unsigned int count); | ||
| 191 | 192 | ||
| 192 | #endif /* __ASM_GNTTAB_H__ */ | 193 | #endif /* __ASM_GNTTAB_H__ */ |
diff --git a/kernel/events/core.c b/kernel/events/core.c index b7935fcec7d9..7fee567153f0 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c | |||
| @@ -1253,7 +1253,7 @@ retry: | |||
| 1253 | /* | 1253 | /* |
| 1254 | * Cross CPU call to disable a performance event | 1254 | * Cross CPU call to disable a performance event |
| 1255 | */ | 1255 | */ |
| 1256 | static int __perf_event_disable(void *info) | 1256 | int __perf_event_disable(void *info) |
| 1257 | { | 1257 | { |
| 1258 | struct perf_event *event = info; | 1258 | struct perf_event *event = info; |
| 1259 | struct perf_event_context *ctx = event->ctx; | 1259 | struct perf_event_context *ctx = event->ctx; |
| @@ -2935,12 +2935,12 @@ EXPORT_SYMBOL_GPL(perf_event_release_kernel); | |||
| 2935 | /* | 2935 | /* |
| 2936 | * Called when the last reference to the file is gone. | 2936 | * Called when the last reference to the file is gone. |
| 2937 | */ | 2937 | */ |
| 2938 | static int perf_release(struct inode *inode, struct file *file) | 2938 | static void put_event(struct perf_event *event) |
| 2939 | { | 2939 | { |
| 2940 | struct perf_event *event = file->private_data; | ||
| 2941 | struct task_struct *owner; | 2940 | struct task_struct *owner; |
| 2942 | 2941 | ||
| 2943 | file->private_data = NULL; | 2942 | if (!atomic_long_dec_and_test(&event->refcount)) |
| 2943 | return; | ||
| 2944 | 2944 | ||
| 2945 | rcu_read_lock(); | 2945 | rcu_read_lock(); |
| 2946 | owner = ACCESS_ONCE(event->owner); | 2946 | owner = ACCESS_ONCE(event->owner); |
| @@ -2975,7 +2975,13 @@ static int perf_release(struct inode *inode, struct file *file) | |||
| 2975 | put_task_struct(owner); | 2975 | put_task_struct(owner); |
| 2976 | } | 2976 | } |
| 2977 | 2977 | ||
| 2978 | return perf_event_release_kernel(event); | 2978 | perf_event_release_kernel(event); |
| 2979 | } | ||
| 2980 | |||
| 2981 | static int perf_release(struct inode *inode, struct file *file) | ||
| 2982 | { | ||
| 2983 | put_event(file->private_data); | ||
| 2984 | return 0; | ||
| 2979 | } | 2985 | } |
| 2980 | 2986 | ||
| 2981 | u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running) | 2987 | u64 perf_event_read_value(struct perf_event *event, u64 *enabled, u64 *running) |
| @@ -3227,7 +3233,7 @@ unlock: | |||
| 3227 | 3233 | ||
| 3228 | static const struct file_operations perf_fops; | 3234 | static const struct file_operations perf_fops; |
| 3229 | 3235 | ||
| 3230 | static struct perf_event *perf_fget_light(int fd, int *fput_needed) | 3236 | static struct file *perf_fget_light(int fd, int *fput_needed) |
| 3231 | { | 3237 | { |
| 3232 | struct file *file; | 3238 | struct file *file; |
| 3233 | 3239 | ||
| @@ -3241,7 +3247,7 @@ static struct perf_event *perf_fget_light(int fd, int *fput_needed) | |||
| 3241 | return ERR_PTR(-EBADF); | 3247 | return ERR_PTR(-EBADF); |
| 3242 | } | 3248 | } |
| 3243 | 3249 | ||
| 3244 | return file->private_data; | 3250 | return file; |
| 3245 | } | 3251 | } |
| 3246 | 3252 | ||
| 3247 | static int perf_event_set_output(struct perf_event *event, | 3253 | static int perf_event_set_output(struct perf_event *event, |
| @@ -3273,19 +3279,21 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 3273 | 3279 | ||
| 3274 | case PERF_EVENT_IOC_SET_OUTPUT: | 3280 | case PERF_EVENT_IOC_SET_OUTPUT: |
| 3275 | { | 3281 | { |
| 3282 | struct file *output_file = NULL; | ||
| 3276 | struct perf_event *output_event = NULL; | 3283 | struct perf_event *output_event = NULL; |
| 3277 | int fput_needed = 0; | 3284 | int fput_needed = 0; |
| 3278 | int ret; | 3285 | int ret; |
| 3279 | 3286 | ||
| 3280 | if (arg != -1) { | 3287 | if (arg != -1) { |
| 3281 | output_event = perf_fget_light(arg, &fput_needed); | 3288 | output_file = perf_fget_light(arg, &fput_needed); |
| 3282 | if (IS_ERR(output_event)) | 3289 | if (IS_ERR(output_file)) |
| 3283 | return PTR_ERR(output_event); | 3290 | return PTR_ERR(output_file); |
| 3291 | output_event = output_file->private_data; | ||
| 3284 | } | 3292 | } |
| 3285 | 3293 | ||
| 3286 | ret = perf_event_set_output(event, output_event); | 3294 | ret = perf_event_set_output(event, output_event); |
| 3287 | if (output_event) | 3295 | if (output_event) |
| 3288 | fput_light(output_event->filp, fput_needed); | 3296 | fput_light(output_file, fput_needed); |
| 3289 | 3297 | ||
| 3290 | return ret; | 3298 | return ret; |
| 3291 | } | 3299 | } |
| @@ -5950,6 +5958,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, | |||
| 5950 | 5958 | ||
| 5951 | mutex_init(&event->mmap_mutex); | 5959 | mutex_init(&event->mmap_mutex); |
| 5952 | 5960 | ||
| 5961 | atomic_long_set(&event->refcount, 1); | ||
| 5953 | event->cpu = cpu; | 5962 | event->cpu = cpu; |
| 5954 | event->attr = *attr; | 5963 | event->attr = *attr; |
| 5955 | event->group_leader = group_leader; | 5964 | event->group_leader = group_leader; |
| @@ -6260,12 +6269,12 @@ SYSCALL_DEFINE5(perf_event_open, | |||
| 6260 | return event_fd; | 6269 | return event_fd; |
| 6261 | 6270 | ||
| 6262 | if (group_fd != -1) { | 6271 | if (group_fd != -1) { |
| 6263 | group_leader = perf_fget_light(group_fd, &fput_needed); | 6272 | group_file = perf_fget_light(group_fd, &fput_needed); |
| 6264 | if (IS_ERR(group_leader)) { | 6273 | if (IS_ERR(group_file)) { |
| 6265 | err = PTR_ERR(group_leader); | 6274 | err = PTR_ERR(group_file); |
| 6266 | goto err_fd; | 6275 | goto err_fd; |
| 6267 | } | 6276 | } |
| 6268 | group_file = group_leader->filp; | 6277 | group_leader = group_file->private_data; |
| 6269 | if (flags & PERF_FLAG_FD_OUTPUT) | 6278 | if (flags & PERF_FLAG_FD_OUTPUT) |
| 6270 | output_event = group_leader; | 6279 | output_event = group_leader; |
| 6271 | if (flags & PERF_FLAG_FD_NO_GROUP) | 6280 | if (flags & PERF_FLAG_FD_NO_GROUP) |
| @@ -6402,7 +6411,6 @@ SYSCALL_DEFINE5(perf_event_open, | |||
| 6402 | put_ctx(gctx); | 6411 | put_ctx(gctx); |
| 6403 | } | 6412 | } |
| 6404 | 6413 | ||
| 6405 | event->filp = event_file; | ||
| 6406 | WARN_ON_ONCE(ctx->parent_ctx); | 6414 | WARN_ON_ONCE(ctx->parent_ctx); |
| 6407 | mutex_lock(&ctx->mutex); | 6415 | mutex_lock(&ctx->mutex); |
| 6408 | 6416 | ||
| @@ -6496,7 +6504,6 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, | |||
| 6496 | goto err_free; | 6504 | goto err_free; |
| 6497 | } | 6505 | } |
| 6498 | 6506 | ||
| 6499 | event->filp = NULL; | ||
| 6500 | WARN_ON_ONCE(ctx->parent_ctx); | 6507 | WARN_ON_ONCE(ctx->parent_ctx); |
| 6501 | mutex_lock(&ctx->mutex); | 6508 | mutex_lock(&ctx->mutex); |
| 6502 | perf_install_in_context(ctx, event, cpu); | 6509 | perf_install_in_context(ctx, event, cpu); |
| @@ -6578,7 +6585,7 @@ static void sync_child_event(struct perf_event *child_event, | |||
| 6578 | * Release the parent event, if this was the last | 6585 | * Release the parent event, if this was the last |
| 6579 | * reference to it. | 6586 | * reference to it. |
| 6580 | */ | 6587 | */ |
| 6581 | fput(parent_event->filp); | 6588 | put_event(parent_event); |
| 6582 | } | 6589 | } |
| 6583 | 6590 | ||
| 6584 | static void | 6591 | static void |
| @@ -6654,9 +6661,8 @@ static void perf_event_exit_task_context(struct task_struct *child, int ctxn) | |||
| 6654 | * | 6661 | * |
| 6655 | * __perf_event_exit_task() | 6662 | * __perf_event_exit_task() |
| 6656 | * sync_child_event() | 6663 | * sync_child_event() |
| 6657 | * fput(parent_event->filp) | 6664 | * put_event() |
| 6658 | * perf_release() | 6665 | * mutex_lock(&ctx->mutex) |
| 6659 | * mutex_lock(&ctx->mutex) | ||
| 6660 | * | 6666 | * |
| 6661 | * But since its the parent context it won't be the same instance. | 6667 | * But since its the parent context it won't be the same instance. |
| 6662 | */ | 6668 | */ |
| @@ -6724,7 +6730,7 @@ static void perf_free_event(struct perf_event *event, | |||
| 6724 | list_del_init(&event->child_list); | 6730 | list_del_init(&event->child_list); |
| 6725 | mutex_unlock(&parent->child_mutex); | 6731 | mutex_unlock(&parent->child_mutex); |
| 6726 | 6732 | ||
| 6727 | fput(parent->filp); | 6733 | put_event(parent); |
| 6728 | 6734 | ||
| 6729 | perf_group_detach(event); | 6735 | perf_group_detach(event); |
| 6730 | list_del_event(event, ctx); | 6736 | list_del_event(event, ctx); |
| @@ -6804,6 +6810,12 @@ inherit_event(struct perf_event *parent_event, | |||
| 6804 | NULL, NULL); | 6810 | NULL, NULL); |
| 6805 | if (IS_ERR(child_event)) | 6811 | if (IS_ERR(child_event)) |
| 6806 | return child_event; | 6812 | return child_event; |
| 6813 | |||
| 6814 | if (!atomic_long_inc_not_zero(&parent_event->refcount)) { | ||
| 6815 | free_event(child_event); | ||
| 6816 | return NULL; | ||
| 6817 | } | ||
| 6818 | |||
| 6807 | get_ctx(child_ctx); | 6819 | get_ctx(child_ctx); |
| 6808 | 6820 | ||
| 6809 | /* | 6821 | /* |
| @@ -6845,14 +6857,6 @@ inherit_event(struct perf_event *parent_event, | |||
| 6845 | raw_spin_unlock_irqrestore(&child_ctx->lock, flags); | 6857 | raw_spin_unlock_irqrestore(&child_ctx->lock, flags); |
| 6846 | 6858 | ||
| 6847 | /* | 6859 | /* |
| 6848 | * Get a reference to the parent filp - we will fput it | ||
| 6849 | * when the child event exits. This is safe to do because | ||
| 6850 | * we are in the parent and we know that the filp still | ||
| 6851 | * exists and has a nonzero count: | ||
| 6852 | */ | ||
| 6853 | atomic_long_inc(&parent_event->filp->f_count); | ||
| 6854 | |||
| 6855 | /* | ||
| 6856 | * Link this into the parent event's child list | 6860 | * Link this into the parent event's child list |
| 6857 | */ | 6861 | */ |
| 6858 | WARN_ON_ONCE(parent_event->ctx->parent_ctx); | 6862 | WARN_ON_ONCE(parent_event->ctx->parent_ctx); |
diff --git a/kernel/events/hw_breakpoint.c b/kernel/events/hw_breakpoint.c index bb38c4d3ee12..9a7b487c6fe2 100644 --- a/kernel/events/hw_breakpoint.c +++ b/kernel/events/hw_breakpoint.c | |||
| @@ -453,7 +453,16 @@ int modify_user_hw_breakpoint(struct perf_event *bp, struct perf_event_attr *att | |||
| 453 | int old_type = bp->attr.bp_type; | 453 | int old_type = bp->attr.bp_type; |
| 454 | int err = 0; | 454 | int err = 0; |
| 455 | 455 | ||
| 456 | perf_event_disable(bp); | 456 | /* |
| 457 | * modify_user_hw_breakpoint can be invoked with IRQs disabled and hence it | ||
| 458 | * will not be possible to raise IPIs that invoke __perf_event_disable. | ||
| 459 | * So call the function directly after making sure we are targeting the | ||
| 460 | * current task. | ||
| 461 | */ | ||
| 462 | if (irqs_disabled() && bp->ctx && bp->ctx->task == current) | ||
| 463 | __perf_event_disable(bp); | ||
| 464 | else | ||
| 465 | perf_event_disable(bp); | ||
| 457 | 466 | ||
| 458 | bp->attr.bp_addr = attr->bp_addr; | 467 | bp->attr.bp_addr = attr->bp_addr; |
| 459 | bp->attr.bp_type = attr->bp_type; | 468 | bp->attr.bp_type = attr->bp_type; |
diff --git a/kernel/fork.c b/kernel/fork.c index 3bd2280d79f6..2c8857e12855 100644 --- a/kernel/fork.c +++ b/kernel/fork.c | |||
| @@ -455,8 +455,8 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) | |||
| 455 | if (retval) | 455 | if (retval) |
| 456 | goto out; | 456 | goto out; |
| 457 | 457 | ||
| 458 | if (file && uprobe_mmap(tmp)) | 458 | if (file) |
| 459 | goto out; | 459 | uprobe_mmap(tmp); |
| 460 | } | 460 | } |
| 461 | /* a new mm has just been created */ | 461 | /* a new mm has just been created */ |
| 462 | arch_dup_mmap(oldmm, mm); | 462 | arch_dup_mmap(oldmm, mm); |
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index b3c7fd554250..6144bab8fd8e 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c | |||
| @@ -232,15 +232,19 @@ static int pid_ns_ctl_handler(struct ctl_table *table, int write, | |||
| 232 | */ | 232 | */ |
| 233 | 233 | ||
| 234 | tmp.data = ¤t->nsproxy->pid_ns->last_pid; | 234 | tmp.data = ¤t->nsproxy->pid_ns->last_pid; |
| 235 | return proc_dointvec(&tmp, write, buffer, lenp, ppos); | 235 | return proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | extern int pid_max; | ||
| 239 | static int zero = 0; | ||
| 238 | static struct ctl_table pid_ns_ctl_table[] = { | 240 | static struct ctl_table pid_ns_ctl_table[] = { |
| 239 | { | 241 | { |
| 240 | .procname = "ns_last_pid", | 242 | .procname = "ns_last_pid", |
| 241 | .maxlen = sizeof(int), | 243 | .maxlen = sizeof(int), |
| 242 | .mode = 0666, /* permissions are checked in the handler */ | 244 | .mode = 0666, /* permissions are checked in the handler */ |
| 243 | .proc_handler = pid_ns_ctl_handler, | 245 | .proc_handler = pid_ns_ctl_handler, |
| 246 | .extra1 = &zero, | ||
| 247 | .extra2 = &pid_max, | ||
| 244 | }, | 248 | }, |
| 245 | { } | 249 | { } |
| 246 | }; | 250 | }; |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index fbf1fd098dc6..649c9f876cb1 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -5304,27 +5304,17 @@ void idle_task_exit(void) | |||
| 5304 | } | 5304 | } |
| 5305 | 5305 | ||
| 5306 | /* | 5306 | /* |
| 5307 | * While a dead CPU has no uninterruptible tasks queued at this point, | 5307 | * Since this CPU is going 'away' for a while, fold any nr_active delta |
| 5308 | * it might still have a nonzero ->nr_uninterruptible counter, because | 5308 | * we might have. Assumes we're called after migrate_tasks() so that the |
| 5309 | * for performance reasons the counter is not stricly tracking tasks to | 5309 | * nr_active count is stable. |
| 5310 | * their home CPUs. So we just add the counter to another CPU's counter, | 5310 | * |
| 5311 | * to keep the global sum constant after CPU-down: | 5311 | * Also see the comment "Global load-average calculations". |
| 5312 | */ | ||
| 5313 | static void migrate_nr_uninterruptible(struct rq *rq_src) | ||
| 5314 | { | ||
| 5315 | struct rq *rq_dest = cpu_rq(cpumask_any(cpu_active_mask)); | ||
| 5316 | |||
| 5317 | rq_dest->nr_uninterruptible += rq_src->nr_uninterruptible; | ||
| 5318 | rq_src->nr_uninterruptible = 0; | ||
| 5319 | } | ||
| 5320 | |||
| 5321 | /* | ||
| 5322 | * remove the tasks which were accounted by rq from calc_load_tasks. | ||
| 5323 | */ | 5312 | */ |
| 5324 | static void calc_global_load_remove(struct rq *rq) | 5313 | static void calc_load_migrate(struct rq *rq) |
| 5325 | { | 5314 | { |
| 5326 | atomic_long_sub(rq->calc_load_active, &calc_load_tasks); | 5315 | long delta = calc_load_fold_active(rq); |
| 5327 | rq->calc_load_active = 0; | 5316 | if (delta) |
| 5317 | atomic_long_add(delta, &calc_load_tasks); | ||
| 5328 | } | 5318 | } |
| 5329 | 5319 | ||
| 5330 | /* | 5320 | /* |
| @@ -5352,9 +5342,6 @@ static void migrate_tasks(unsigned int dead_cpu) | |||
| 5352 | */ | 5342 | */ |
| 5353 | rq->stop = NULL; | 5343 | rq->stop = NULL; |
| 5354 | 5344 | ||
| 5355 | /* Ensure any throttled groups are reachable by pick_next_task */ | ||
| 5356 | unthrottle_offline_cfs_rqs(rq); | ||
| 5357 | |||
| 5358 | for ( ; ; ) { | 5345 | for ( ; ; ) { |
| 5359 | /* | 5346 | /* |
| 5360 | * There's this thread running, bail when that's the only | 5347 | * There's this thread running, bail when that's the only |
| @@ -5618,8 +5605,7 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
| 5618 | BUG_ON(rq->nr_running != 1); /* the migration thread */ | 5605 | BUG_ON(rq->nr_running != 1); /* the migration thread */ |
| 5619 | raw_spin_unlock_irqrestore(&rq->lock, flags); | 5606 | raw_spin_unlock_irqrestore(&rq->lock, flags); |
| 5620 | 5607 | ||
| 5621 | migrate_nr_uninterruptible(rq); | 5608 | calc_load_migrate(rq); |
| 5622 | calc_global_load_remove(rq); | ||
| 5623 | break; | 5609 | break; |
| 5624 | #endif | 5610 | #endif |
| 5625 | } | 5611 | } |
| @@ -6028,11 +6014,6 @@ static void destroy_sched_domains(struct sched_domain *sd, int cpu) | |||
| 6028 | * SD_SHARE_PKG_RESOURCE set (Last Level Cache Domain) for this | 6014 | * SD_SHARE_PKG_RESOURCE set (Last Level Cache Domain) for this |
| 6029 | * allows us to avoid some pointer chasing select_idle_sibling(). | 6015 | * allows us to avoid some pointer chasing select_idle_sibling(). |
| 6030 | * | 6016 | * |
| 6031 | * Iterate domains and sched_groups downward, assigning CPUs to be | ||
| 6032 | * select_idle_sibling() hw buddy. Cross-wiring hw makes bouncing | ||
| 6033 | * due to random perturbation self canceling, ie sw buddies pull | ||
| 6034 | * their counterpart to their CPU's hw counterpart. | ||
| 6035 | * | ||
| 6036 | * Also keep a unique ID per domain (we use the first cpu number in | 6017 | * Also keep a unique ID per domain (we use the first cpu number in |
| 6037 | * the cpumask of the domain), this allows us to quickly tell if | 6018 | * the cpumask of the domain), this allows us to quickly tell if |
| 6038 | * two cpus are in the same cache domain, see cpus_share_cache(). | 6019 | * two cpus are in the same cache domain, see cpus_share_cache(). |
| @@ -6046,40 +6027,8 @@ static void update_top_cache_domain(int cpu) | |||
| 6046 | int id = cpu; | 6027 | int id = cpu; |
| 6047 | 6028 | ||
| 6048 | sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES); | 6029 | sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES); |
| 6049 | if (sd) { | 6030 | if (sd) |
| 6050 | struct sched_domain *tmp = sd; | ||
| 6051 | struct sched_group *sg, *prev; | ||
| 6052 | bool right; | ||
| 6053 | |||
| 6054 | /* | ||
| 6055 | * Traverse to first CPU in group, and count hops | ||
| 6056 | * to cpu from there, switching direction on each | ||
| 6057 | * hop, never ever pointing the last CPU rightward. | ||
| 6058 | */ | ||
| 6059 | do { | ||
| 6060 | id = cpumask_first(sched_domain_span(tmp)); | ||
| 6061 | prev = sg = tmp->groups; | ||
| 6062 | right = 1; | ||
| 6063 | |||
| 6064 | while (cpumask_first(sched_group_cpus(sg)) != id) | ||
| 6065 | sg = sg->next; | ||
| 6066 | |||
| 6067 | while (!cpumask_test_cpu(cpu, sched_group_cpus(sg))) { | ||
| 6068 | prev = sg; | ||
| 6069 | sg = sg->next; | ||
| 6070 | right = !right; | ||
| 6071 | } | ||
| 6072 | |||
| 6073 | /* A CPU went down, never point back to domain start. */ | ||
| 6074 | if (right && cpumask_first(sched_group_cpus(sg->next)) == id) | ||
| 6075 | right = false; | ||
| 6076 | |||
| 6077 | sg = right ? sg->next : prev; | ||
| 6078 | tmp->idle_buddy = cpumask_first(sched_group_cpus(sg)); | ||
| 6079 | } while ((tmp = tmp->child)); | ||
| 6080 | |||
| 6081 | id = cpumask_first(sched_domain_span(sd)); | 6031 | id = cpumask_first(sched_domain_span(sd)); |
| 6082 | } | ||
| 6083 | 6032 | ||
| 6084 | rcu_assign_pointer(per_cpu(sd_llc, cpu), sd); | 6033 | rcu_assign_pointer(per_cpu(sd_llc, cpu), sd); |
| 6085 | per_cpu(sd_llc_id, cpu) = id; | 6034 | per_cpu(sd_llc_id, cpu) = id; |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index c219bf8d704c..96e2b18b6283 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -2052,7 +2052,7 @@ static void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) | |||
| 2052 | hrtimer_cancel(&cfs_b->slack_timer); | 2052 | hrtimer_cancel(&cfs_b->slack_timer); |
| 2053 | } | 2053 | } |
| 2054 | 2054 | ||
| 2055 | void unthrottle_offline_cfs_rqs(struct rq *rq) | 2055 | static void unthrottle_offline_cfs_rqs(struct rq *rq) |
| 2056 | { | 2056 | { |
| 2057 | struct cfs_rq *cfs_rq; | 2057 | struct cfs_rq *cfs_rq; |
| 2058 | 2058 | ||
| @@ -2106,7 +2106,7 @@ static inline struct cfs_bandwidth *tg_cfs_bandwidth(struct task_group *tg) | |||
| 2106 | return NULL; | 2106 | return NULL; |
| 2107 | } | 2107 | } |
| 2108 | static inline void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {} | 2108 | static inline void destroy_cfs_bandwidth(struct cfs_bandwidth *cfs_b) {} |
| 2109 | void unthrottle_offline_cfs_rqs(struct rq *rq) {} | 2109 | static inline void unthrottle_offline_cfs_rqs(struct rq *rq) {} |
| 2110 | 2110 | ||
| 2111 | #endif /* CONFIG_CFS_BANDWIDTH */ | 2111 | #endif /* CONFIG_CFS_BANDWIDTH */ |
| 2112 | 2112 | ||
| @@ -2637,6 +2637,8 @@ static int select_idle_sibling(struct task_struct *p, int target) | |||
| 2637 | int cpu = smp_processor_id(); | 2637 | int cpu = smp_processor_id(); |
| 2638 | int prev_cpu = task_cpu(p); | 2638 | int prev_cpu = task_cpu(p); |
| 2639 | struct sched_domain *sd; | 2639 | struct sched_domain *sd; |
| 2640 | struct sched_group *sg; | ||
| 2641 | int i; | ||
| 2640 | 2642 | ||
| 2641 | /* | 2643 | /* |
| 2642 | * If the task is going to be woken-up on this cpu and if it is | 2644 | * If the task is going to be woken-up on this cpu and if it is |
| @@ -2653,17 +2655,29 @@ static int select_idle_sibling(struct task_struct *p, int target) | |||
| 2653 | return prev_cpu; | 2655 | return prev_cpu; |
| 2654 | 2656 | ||
| 2655 | /* | 2657 | /* |
| 2656 | * Otherwise, check assigned siblings to find an elegible idle cpu. | 2658 | * Otherwise, iterate the domains and find an elegible idle cpu. |
| 2657 | */ | 2659 | */ |
| 2658 | sd = rcu_dereference(per_cpu(sd_llc, target)); | 2660 | sd = rcu_dereference(per_cpu(sd_llc, target)); |
| 2659 | |||
| 2660 | for_each_lower_domain(sd) { | 2661 | for_each_lower_domain(sd) { |
| 2661 | if (!cpumask_test_cpu(sd->idle_buddy, tsk_cpus_allowed(p))) | 2662 | sg = sd->groups; |
| 2662 | continue; | 2663 | do { |
| 2663 | if (idle_cpu(sd->idle_buddy)) | 2664 | if (!cpumask_intersects(sched_group_cpus(sg), |
| 2664 | return sd->idle_buddy; | 2665 | tsk_cpus_allowed(p))) |
| 2665 | } | 2666 | goto next; |
| 2666 | 2667 | ||
| 2668 | for_each_cpu(i, sched_group_cpus(sg)) { | ||
| 2669 | if (!idle_cpu(i)) | ||
| 2670 | goto next; | ||
| 2671 | } | ||
| 2672 | |||
| 2673 | target = cpumask_first_and(sched_group_cpus(sg), | ||
| 2674 | tsk_cpus_allowed(p)); | ||
| 2675 | goto done; | ||
| 2676 | next: | ||
| 2677 | sg = sg->next; | ||
| 2678 | } while (sg != sd->groups); | ||
| 2679 | } | ||
| 2680 | done: | ||
| 2667 | return target; | 2681 | return target; |
| 2668 | } | 2682 | } |
| 2669 | 2683 | ||
| @@ -3658,7 +3672,6 @@ fix_small_capacity(struct sched_domain *sd, struct sched_group *group) | |||
| 3658 | * @group: sched_group whose statistics are to be updated. | 3672 | * @group: sched_group whose statistics are to be updated. |
| 3659 | * @load_idx: Load index of sched_domain of this_cpu for load calc. | 3673 | * @load_idx: Load index of sched_domain of this_cpu for load calc. |
| 3660 | * @local_group: Does group contain this_cpu. | 3674 | * @local_group: Does group contain this_cpu. |
| 3661 | * @cpus: Set of cpus considered for load balancing. | ||
| 3662 | * @balance: Should we balance. | 3675 | * @balance: Should we balance. |
| 3663 | * @sgs: variable to hold the statistics for this group. | 3676 | * @sgs: variable to hold the statistics for this group. |
| 3664 | */ | 3677 | */ |
| @@ -3805,7 +3818,6 @@ static bool update_sd_pick_busiest(struct lb_env *env, | |||
| 3805 | /** | 3818 | /** |
| 3806 | * update_sd_lb_stats - Update sched_domain's statistics for load balancing. | 3819 | * update_sd_lb_stats - Update sched_domain's statistics for load balancing. |
| 3807 | * @env: The load balancing environment. | 3820 | * @env: The load balancing environment. |
| 3808 | * @cpus: Set of cpus considered for load balancing. | ||
| 3809 | * @balance: Should we balance. | 3821 | * @balance: Should we balance. |
| 3810 | * @sds: variable to hold the statistics for this sched_domain. | 3822 | * @sds: variable to hold the statistics for this sched_domain. |
| 3811 | */ | 3823 | */ |
| @@ -4956,6 +4968,9 @@ static void rq_online_fair(struct rq *rq) | |||
| 4956 | static void rq_offline_fair(struct rq *rq) | 4968 | static void rq_offline_fair(struct rq *rq) |
| 4957 | { | 4969 | { |
| 4958 | update_sysctl(); | 4970 | update_sysctl(); |
| 4971 | |||
| 4972 | /* Ensure any throttled groups are reachable by pick_next_task */ | ||
| 4973 | unthrottle_offline_cfs_rqs(rq); | ||
| 4959 | } | 4974 | } |
| 4960 | 4975 | ||
| 4961 | #endif /* CONFIG_SMP */ | 4976 | #endif /* CONFIG_SMP */ |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 944cb68420e9..e0b7ba9c040f 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -691,6 +691,7 @@ balanced: | |||
| 691 | * runtime - in which case borrowing doesn't make sense. | 691 | * runtime - in which case borrowing doesn't make sense. |
| 692 | */ | 692 | */ |
| 693 | rt_rq->rt_runtime = RUNTIME_INF; | 693 | rt_rq->rt_runtime = RUNTIME_INF; |
| 694 | rt_rq->rt_throttled = 0; | ||
| 694 | raw_spin_unlock(&rt_rq->rt_runtime_lock); | 695 | raw_spin_unlock(&rt_rq->rt_runtime_lock); |
| 695 | raw_spin_unlock(&rt_b->rt_runtime_lock); | 696 | raw_spin_unlock(&rt_b->rt_runtime_lock); |
| 696 | } | 697 | } |
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index f6714d009e77..0848fa36c383 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h | |||
| @@ -1144,7 +1144,6 @@ extern void print_rt_stats(struct seq_file *m, int cpu); | |||
| 1144 | 1144 | ||
| 1145 | extern void init_cfs_rq(struct cfs_rq *cfs_rq); | 1145 | extern void init_cfs_rq(struct cfs_rq *cfs_rq); |
| 1146 | extern void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq); | 1146 | extern void init_rt_rq(struct rt_rq *rt_rq, struct rq *rq); |
| 1147 | extern void unthrottle_offline_cfs_rqs(struct rq *rq); | ||
| 1148 | 1147 | ||
| 1149 | extern void account_cfs_bandwidth_used(int enabled, int was_enabled); | 1148 | extern void account_cfs_bandwidth_used(int enabled, int was_enabled); |
| 1150 | 1149 | ||
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 024540f97f74..3a9e5d5c1091 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
| @@ -573,6 +573,7 @@ static void tick_nohz_restart_sched_tick(struct tick_sched *ts, ktime_t now) | |||
| 573 | tick_do_update_jiffies64(now); | 573 | tick_do_update_jiffies64(now); |
| 574 | update_cpu_load_nohz(); | 574 | update_cpu_load_nohz(); |
| 575 | 575 | ||
| 576 | calc_load_exit_idle(); | ||
| 576 | touch_softlockup_watchdog(); | 577 | touch_softlockup_watchdog(); |
| 577 | /* | 578 | /* |
| 578 | * Cancel the scheduled timer and restore the tick | 579 | * Cancel the scheduled timer and restore the tick |
diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c index e16af197a2bc..d3b91e75cecd 100644 --- a/kernel/time/timekeeping.c +++ b/kernel/time/timekeeping.c | |||
| @@ -115,6 +115,7 @@ static void tk_xtime_add(struct timekeeper *tk, const struct timespec *ts) | |||
| 115 | { | 115 | { |
| 116 | tk->xtime_sec += ts->tv_sec; | 116 | tk->xtime_sec += ts->tv_sec; |
| 117 | tk->xtime_nsec += (u64)ts->tv_nsec << tk->shift; | 117 | tk->xtime_nsec += (u64)ts->tv_nsec << tk->shift; |
| 118 | tk_normalize_xtime(tk); | ||
| 118 | } | 119 | } |
| 119 | 120 | ||
| 120 | static void tk_set_wall_to_mono(struct timekeeper *tk, struct timespec wtm) | 121 | static void tk_set_wall_to_mono(struct timekeeper *tk, struct timespec wtm) |
| @@ -276,7 +277,7 @@ static void timekeeping_forward_now(struct timekeeper *tk) | |||
| 276 | tk->xtime_nsec += cycle_delta * tk->mult; | 277 | tk->xtime_nsec += cycle_delta * tk->mult; |
| 277 | 278 | ||
| 278 | /* If arch requires, add in gettimeoffset() */ | 279 | /* If arch requires, add in gettimeoffset() */ |
| 279 | tk->xtime_nsec += arch_gettimeoffset() << tk->shift; | 280 | tk->xtime_nsec += (u64)arch_gettimeoffset() << tk->shift; |
| 280 | 281 | ||
| 281 | tk_normalize_xtime(tk); | 282 | tk_normalize_xtime(tk); |
| 282 | 283 | ||
| @@ -302,10 +303,11 @@ void getnstimeofday(struct timespec *ts) | |||
| 302 | seq = read_seqbegin(&tk->lock); | 303 | seq = read_seqbegin(&tk->lock); |
| 303 | 304 | ||
| 304 | ts->tv_sec = tk->xtime_sec; | 305 | ts->tv_sec = tk->xtime_sec; |
| 305 | ts->tv_nsec = timekeeping_get_ns(tk); | 306 | nsecs = timekeeping_get_ns(tk); |
| 306 | 307 | ||
| 307 | } while (read_seqretry(&tk->lock, seq)); | 308 | } while (read_seqretry(&tk->lock, seq)); |
| 308 | 309 | ||
| 310 | ts->tv_nsec = 0; | ||
| 309 | timespec_add_ns(ts, nsecs); | 311 | timespec_add_ns(ts, nsecs); |
| 310 | } | 312 | } |
| 311 | EXPORT_SYMBOL(getnstimeofday); | 313 | EXPORT_SYMBOL(getnstimeofday); |
| @@ -344,6 +346,7 @@ void ktime_get_ts(struct timespec *ts) | |||
| 344 | { | 346 | { |
| 345 | struct timekeeper *tk = &timekeeper; | 347 | struct timekeeper *tk = &timekeeper; |
| 346 | struct timespec tomono; | 348 | struct timespec tomono; |
| 349 | s64 nsec; | ||
| 347 | unsigned int seq; | 350 | unsigned int seq; |
| 348 | 351 | ||
| 349 | WARN_ON(timekeeping_suspended); | 352 | WARN_ON(timekeeping_suspended); |
| @@ -351,13 +354,14 @@ void ktime_get_ts(struct timespec *ts) | |||
| 351 | do { | 354 | do { |
| 352 | seq = read_seqbegin(&tk->lock); | 355 | seq = read_seqbegin(&tk->lock); |
| 353 | ts->tv_sec = tk->xtime_sec; | 356 | ts->tv_sec = tk->xtime_sec; |
| 354 | ts->tv_nsec = timekeeping_get_ns(tk); | 357 | nsec = timekeeping_get_ns(tk); |
| 355 | tomono = tk->wall_to_monotonic; | 358 | tomono = tk->wall_to_monotonic; |
| 356 | 359 | ||
| 357 | } while (read_seqretry(&tk->lock, seq)); | 360 | } while (read_seqretry(&tk->lock, seq)); |
| 358 | 361 | ||
| 359 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec, | 362 | ts->tv_sec += tomono.tv_sec; |
| 360 | ts->tv_nsec + tomono.tv_nsec); | 363 | ts->tv_nsec = 0; |
| 364 | timespec_add_ns(ts, nsec + tomono.tv_nsec); | ||
| 361 | } | 365 | } |
| 362 | EXPORT_SYMBOL_GPL(ktime_get_ts); | 366 | EXPORT_SYMBOL_GPL(ktime_get_ts); |
| 363 | 367 | ||
| @@ -427,7 +431,7 @@ int do_settimeofday(const struct timespec *tv) | |||
| 427 | struct timespec ts_delta, xt; | 431 | struct timespec ts_delta, xt; |
| 428 | unsigned long flags; | 432 | unsigned long flags; |
| 429 | 433 | ||
| 430 | if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | 434 | if (!timespec_valid_strict(tv)) |
| 431 | return -EINVAL; | 435 | return -EINVAL; |
| 432 | 436 | ||
| 433 | write_seqlock_irqsave(&tk->lock, flags); | 437 | write_seqlock_irqsave(&tk->lock, flags); |
| @@ -463,6 +467,8 @@ int timekeeping_inject_offset(struct timespec *ts) | |||
| 463 | { | 467 | { |
| 464 | struct timekeeper *tk = &timekeeper; | 468 | struct timekeeper *tk = &timekeeper; |
| 465 | unsigned long flags; | 469 | unsigned long flags; |
| 470 | struct timespec tmp; | ||
| 471 | int ret = 0; | ||
| 466 | 472 | ||
| 467 | if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) | 473 | if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) |
| 468 | return -EINVAL; | 474 | return -EINVAL; |
| @@ -471,10 +477,17 @@ int timekeeping_inject_offset(struct timespec *ts) | |||
| 471 | 477 | ||
| 472 | timekeeping_forward_now(tk); | 478 | timekeeping_forward_now(tk); |
| 473 | 479 | ||
| 480 | /* Make sure the proposed value is valid */ | ||
| 481 | tmp = timespec_add(tk_xtime(tk), *ts); | ||
| 482 | if (!timespec_valid_strict(&tmp)) { | ||
| 483 | ret = -EINVAL; | ||
| 484 | goto error; | ||
| 485 | } | ||
| 474 | 486 | ||
| 475 | tk_xtime_add(tk, ts); | 487 | tk_xtime_add(tk, ts); |
| 476 | tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, *ts)); | 488 | tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, *ts)); |
| 477 | 489 | ||
| 490 | error: /* even if we error out, we forwarded the time, so call update */ | ||
| 478 | timekeeping_update(tk, true); | 491 | timekeeping_update(tk, true); |
| 479 | 492 | ||
| 480 | write_sequnlock_irqrestore(&tk->lock, flags); | 493 | write_sequnlock_irqrestore(&tk->lock, flags); |
| @@ -482,7 +495,7 @@ int timekeeping_inject_offset(struct timespec *ts) | |||
| 482 | /* signal hrtimers about time change */ | 495 | /* signal hrtimers about time change */ |
| 483 | clock_was_set(); | 496 | clock_was_set(); |
| 484 | 497 | ||
| 485 | return 0; | 498 | return ret; |
| 486 | } | 499 | } |
| 487 | EXPORT_SYMBOL(timekeeping_inject_offset); | 500 | EXPORT_SYMBOL(timekeeping_inject_offset); |
| 488 | 501 | ||
| @@ -649,7 +662,20 @@ void __init timekeeping_init(void) | |||
| 649 | struct timespec now, boot, tmp; | 662 | struct timespec now, boot, tmp; |
| 650 | 663 | ||
| 651 | read_persistent_clock(&now); | 664 | read_persistent_clock(&now); |
| 665 | if (!timespec_valid_strict(&now)) { | ||
| 666 | pr_warn("WARNING: Persistent clock returned invalid value!\n" | ||
| 667 | " Check your CMOS/BIOS settings.\n"); | ||
| 668 | now.tv_sec = 0; | ||
| 669 | now.tv_nsec = 0; | ||
| 670 | } | ||
| 671 | |||
| 652 | read_boot_clock(&boot); | 672 | read_boot_clock(&boot); |
| 673 | if (!timespec_valid_strict(&boot)) { | ||
| 674 | pr_warn("WARNING: Boot clock returned invalid value!\n" | ||
| 675 | " Check your CMOS/BIOS settings.\n"); | ||
| 676 | boot.tv_sec = 0; | ||
| 677 | boot.tv_nsec = 0; | ||
| 678 | } | ||
| 653 | 679 | ||
| 654 | seqlock_init(&tk->lock); | 680 | seqlock_init(&tk->lock); |
| 655 | 681 | ||
| @@ -690,7 +716,7 @@ static struct timespec timekeeping_suspend_time; | |||
| 690 | static void __timekeeping_inject_sleeptime(struct timekeeper *tk, | 716 | static void __timekeeping_inject_sleeptime(struct timekeeper *tk, |
| 691 | struct timespec *delta) | 717 | struct timespec *delta) |
| 692 | { | 718 | { |
| 693 | if (!timespec_valid(delta)) { | 719 | if (!timespec_valid_strict(delta)) { |
| 694 | printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid " | 720 | printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid " |
| 695 | "sleep delta value!\n"); | 721 | "sleep delta value!\n"); |
| 696 | return; | 722 | return; |
| @@ -1129,6 +1155,10 @@ static void update_wall_time(void) | |||
| 1129 | offset = (clock->read(clock) - clock->cycle_last) & clock->mask; | 1155 | offset = (clock->read(clock) - clock->cycle_last) & clock->mask; |
| 1130 | #endif | 1156 | #endif |
| 1131 | 1157 | ||
| 1158 | /* Check if there's really nothing to do */ | ||
| 1159 | if (offset < tk->cycle_interval) | ||
| 1160 | goto out; | ||
| 1161 | |||
| 1132 | /* | 1162 | /* |
| 1133 | * With NO_HZ we may have to accumulate many cycle_intervals | 1163 | * With NO_HZ we may have to accumulate many cycle_intervals |
| 1134 | * (think "ticks") worth of time at once. To do this efficiently, | 1164 | * (think "ticks") worth of time at once. To do this efficiently, |
| @@ -1161,9 +1191,9 @@ static void update_wall_time(void) | |||
| 1161 | * the vsyscall implementations are converted to use xtime_nsec | 1191 | * the vsyscall implementations are converted to use xtime_nsec |
| 1162 | * (shifted nanoseconds), this can be killed. | 1192 | * (shifted nanoseconds), this can be killed. |
| 1163 | */ | 1193 | */ |
| 1164 | remainder = tk->xtime_nsec & ((1 << tk->shift) - 1); | 1194 | remainder = tk->xtime_nsec & ((1ULL << tk->shift) - 1); |
| 1165 | tk->xtime_nsec -= remainder; | 1195 | tk->xtime_nsec -= remainder; |
| 1166 | tk->xtime_nsec += 1 << tk->shift; | 1196 | tk->xtime_nsec += 1ULL << tk->shift; |
| 1167 | tk->ntp_error += remainder << tk->ntp_error_shift; | 1197 | tk->ntp_error += remainder << tk->ntp_error_shift; |
| 1168 | 1198 | ||
| 1169 | /* | 1199 | /* |
| @@ -1217,6 +1247,7 @@ void get_monotonic_boottime(struct timespec *ts) | |||
| 1217 | { | 1247 | { |
| 1218 | struct timekeeper *tk = &timekeeper; | 1248 | struct timekeeper *tk = &timekeeper; |
| 1219 | struct timespec tomono, sleep; | 1249 | struct timespec tomono, sleep; |
| 1250 | s64 nsec; | ||
| 1220 | unsigned int seq; | 1251 | unsigned int seq; |
| 1221 | 1252 | ||
| 1222 | WARN_ON(timekeeping_suspended); | 1253 | WARN_ON(timekeeping_suspended); |
| @@ -1224,14 +1255,15 @@ void get_monotonic_boottime(struct timespec *ts) | |||
| 1224 | do { | 1255 | do { |
| 1225 | seq = read_seqbegin(&tk->lock); | 1256 | seq = read_seqbegin(&tk->lock); |
| 1226 | ts->tv_sec = tk->xtime_sec; | 1257 | ts->tv_sec = tk->xtime_sec; |
| 1227 | ts->tv_nsec = timekeeping_get_ns(tk); | 1258 | nsec = timekeeping_get_ns(tk); |
| 1228 | tomono = tk->wall_to_monotonic; | 1259 | tomono = tk->wall_to_monotonic; |
| 1229 | sleep = tk->total_sleep_time; | 1260 | sleep = tk->total_sleep_time; |
| 1230 | 1261 | ||
| 1231 | } while (read_seqretry(&tk->lock, seq)); | 1262 | } while (read_seqretry(&tk->lock, seq)); |
| 1232 | 1263 | ||
| 1233 | set_normalized_timespec(ts, ts->tv_sec + tomono.tv_sec + sleep.tv_sec, | 1264 | ts->tv_sec += tomono.tv_sec + sleep.tv_sec; |
| 1234 | ts->tv_nsec + tomono.tv_nsec + sleep.tv_nsec); | 1265 | ts->tv_nsec = 0; |
| 1266 | timespec_add_ns(ts, nsec + tomono.tv_nsec + sleep.tv_nsec); | ||
| 1235 | } | 1267 | } |
| 1236 | EXPORT_SYMBOL_GPL(get_monotonic_boottime); | 1268 | EXPORT_SYMBOL_GPL(get_monotonic_boottime); |
| 1237 | 1269 | ||
diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 60e4d7875672..6b245f64c8dd 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c | |||
| @@ -506,6 +506,8 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) | |||
| 506 | int size; | 506 | int size; |
| 507 | 507 | ||
| 508 | syscall_nr = syscall_get_nr(current, regs); | 508 | syscall_nr = syscall_get_nr(current, regs); |
| 509 | if (syscall_nr < 0) | ||
| 510 | return; | ||
| 509 | if (!test_bit(syscall_nr, enabled_perf_enter_syscalls)) | 511 | if (!test_bit(syscall_nr, enabled_perf_enter_syscalls)) |
| 510 | return; | 512 | return; |
| 511 | 513 | ||
| @@ -580,6 +582,8 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) | |||
| 580 | int size; | 582 | int size; |
| 581 | 583 | ||
| 582 | syscall_nr = syscall_get_nr(current, regs); | 584 | syscall_nr = syscall_get_nr(current, regs); |
| 585 | if (syscall_nr < 0) | ||
| 586 | return; | ||
| 583 | if (!test_bit(syscall_nr, enabled_perf_exit_syscalls)) | 587 | if (!test_bit(syscall_nr, enabled_perf_exit_syscalls)) |
| 584 | return; | 588 | return; |
| 585 | 589 | ||
diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 692d97628a10..3c5a79e2134c 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c | |||
| @@ -66,6 +66,7 @@ enum { | |||
| 66 | 66 | ||
| 67 | /* pool flags */ | 67 | /* pool flags */ |
| 68 | POOL_MANAGE_WORKERS = 1 << 0, /* need to manage workers */ | 68 | POOL_MANAGE_WORKERS = 1 << 0, /* need to manage workers */ |
| 69 | POOL_MANAGING_WORKERS = 1 << 1, /* managing workers */ | ||
| 69 | 70 | ||
| 70 | /* worker flags */ | 71 | /* worker flags */ |
| 71 | WORKER_STARTED = 1 << 0, /* started */ | 72 | WORKER_STARTED = 1 << 0, /* started */ |
| @@ -652,7 +653,7 @@ static bool need_to_manage_workers(struct worker_pool *pool) | |||
| 652 | /* Do we have too many workers and should some go away? */ | 653 | /* Do we have too many workers and should some go away? */ |
| 653 | static bool too_many_workers(struct worker_pool *pool) | 654 | static bool too_many_workers(struct worker_pool *pool) |
| 654 | { | 655 | { |
| 655 | bool managing = mutex_is_locked(&pool->manager_mutex); | 656 | bool managing = pool->flags & POOL_MANAGING_WORKERS; |
| 656 | int nr_idle = pool->nr_idle + managing; /* manager is considered idle */ | 657 | int nr_idle = pool->nr_idle + managing; /* manager is considered idle */ |
| 657 | int nr_busy = pool->nr_workers - nr_idle; | 658 | int nr_busy = pool->nr_workers - nr_idle; |
| 658 | 659 | ||
| @@ -1326,6 +1327,15 @@ static void idle_worker_rebind(struct worker *worker) | |||
| 1326 | 1327 | ||
| 1327 | /* we did our part, wait for rebind_workers() to finish up */ | 1328 | /* we did our part, wait for rebind_workers() to finish up */ |
| 1328 | wait_event(gcwq->rebind_hold, !(worker->flags & WORKER_REBIND)); | 1329 | wait_event(gcwq->rebind_hold, !(worker->flags & WORKER_REBIND)); |
| 1330 | |||
| 1331 | /* | ||
| 1332 | * rebind_workers() shouldn't finish until all workers passed the | ||
| 1333 | * above WORKER_REBIND wait. Tell it when done. | ||
| 1334 | */ | ||
| 1335 | spin_lock_irq(&worker->pool->gcwq->lock); | ||
| 1336 | if (!--worker->idle_rebind->cnt) | ||
| 1337 | complete(&worker->idle_rebind->done); | ||
| 1338 | spin_unlock_irq(&worker->pool->gcwq->lock); | ||
| 1329 | } | 1339 | } |
| 1330 | 1340 | ||
| 1331 | /* | 1341 | /* |
| @@ -1339,8 +1349,16 @@ static void busy_worker_rebind_fn(struct work_struct *work) | |||
| 1339 | struct worker *worker = container_of(work, struct worker, rebind_work); | 1349 | struct worker *worker = container_of(work, struct worker, rebind_work); |
| 1340 | struct global_cwq *gcwq = worker->pool->gcwq; | 1350 | struct global_cwq *gcwq = worker->pool->gcwq; |
| 1341 | 1351 | ||
| 1342 | if (worker_maybe_bind_and_lock(worker)) | 1352 | worker_maybe_bind_and_lock(worker); |
| 1343 | worker_clr_flags(worker, WORKER_REBIND); | 1353 | |
| 1354 | /* | ||
| 1355 | * %WORKER_REBIND must be cleared even if the above binding failed; | ||
| 1356 | * otherwise, we may confuse the next CPU_UP cycle or oops / get | ||
| 1357 | * stuck by calling idle_worker_rebind() prematurely. If CPU went | ||
| 1358 | * down again inbetween, %WORKER_UNBOUND would be set, so clearing | ||
| 1359 | * %WORKER_REBIND is always safe. | ||
| 1360 | */ | ||
| 1361 | worker_clr_flags(worker, WORKER_REBIND); | ||
| 1344 | 1362 | ||
| 1345 | spin_unlock_irq(&gcwq->lock); | 1363 | spin_unlock_irq(&gcwq->lock); |
| 1346 | } | 1364 | } |
| @@ -1396,12 +1414,15 @@ retry: | |||
| 1396 | /* set REBIND and kick idle ones, we'll wait for these later */ | 1414 | /* set REBIND and kick idle ones, we'll wait for these later */ |
| 1397 | for_each_worker_pool(pool, gcwq) { | 1415 | for_each_worker_pool(pool, gcwq) { |
| 1398 | list_for_each_entry(worker, &pool->idle_list, entry) { | 1416 | list_for_each_entry(worker, &pool->idle_list, entry) { |
| 1417 | unsigned long worker_flags = worker->flags; | ||
| 1418 | |||
| 1399 | if (worker->flags & WORKER_REBIND) | 1419 | if (worker->flags & WORKER_REBIND) |
| 1400 | continue; | 1420 | continue; |
| 1401 | 1421 | ||
| 1402 | /* morph UNBOUND to REBIND */ | 1422 | /* morph UNBOUND to REBIND atomically */ |
| 1403 | worker->flags &= ~WORKER_UNBOUND; | 1423 | worker_flags &= ~WORKER_UNBOUND; |
| 1404 | worker->flags |= WORKER_REBIND; | 1424 | worker_flags |= WORKER_REBIND; |
| 1425 | ACCESS_ONCE(worker->flags) = worker_flags; | ||
| 1405 | 1426 | ||
| 1406 | idle_rebind.cnt++; | 1427 | idle_rebind.cnt++; |
| 1407 | worker->idle_rebind = &idle_rebind; | 1428 | worker->idle_rebind = &idle_rebind; |
| @@ -1419,25 +1440,15 @@ retry: | |||
| 1419 | goto retry; | 1440 | goto retry; |
| 1420 | } | 1441 | } |
| 1421 | 1442 | ||
| 1422 | /* | 1443 | /* all idle workers are rebound, rebind busy workers */ |
| 1423 | * All idle workers are rebound and waiting for %WORKER_REBIND to | ||
| 1424 | * be cleared inside idle_worker_rebind(). Clear and release. | ||
| 1425 | * Clearing %WORKER_REBIND from this foreign context is safe | ||
| 1426 | * because these workers are still guaranteed to be idle. | ||
| 1427 | */ | ||
| 1428 | for_each_worker_pool(pool, gcwq) | ||
| 1429 | list_for_each_entry(worker, &pool->idle_list, entry) | ||
| 1430 | worker->flags &= ~WORKER_REBIND; | ||
| 1431 | |||
| 1432 | wake_up_all(&gcwq->rebind_hold); | ||
| 1433 | |||
| 1434 | /* rebind busy workers */ | ||
| 1435 | for_each_busy_worker(worker, i, pos, gcwq) { | 1444 | for_each_busy_worker(worker, i, pos, gcwq) { |
| 1436 | struct work_struct *rebind_work = &worker->rebind_work; | 1445 | struct work_struct *rebind_work = &worker->rebind_work; |
| 1446 | unsigned long worker_flags = worker->flags; | ||
| 1437 | 1447 | ||
| 1438 | /* morph UNBOUND to REBIND */ | 1448 | /* morph UNBOUND to REBIND atomically */ |
| 1439 | worker->flags &= ~WORKER_UNBOUND; | 1449 | worker_flags &= ~WORKER_UNBOUND; |
| 1440 | worker->flags |= WORKER_REBIND; | 1450 | worker_flags |= WORKER_REBIND; |
| 1451 | ACCESS_ONCE(worker->flags) = worker_flags; | ||
| 1441 | 1452 | ||
| 1442 | if (test_and_set_bit(WORK_STRUCT_PENDING_BIT, | 1453 | if (test_and_set_bit(WORK_STRUCT_PENDING_BIT, |
| 1443 | work_data_bits(rebind_work))) | 1454 | work_data_bits(rebind_work))) |
| @@ -1449,6 +1460,34 @@ retry: | |||
| 1449 | worker->scheduled.next, | 1460 | worker->scheduled.next, |
| 1450 | work_color_to_flags(WORK_NO_COLOR)); | 1461 | work_color_to_flags(WORK_NO_COLOR)); |
| 1451 | } | 1462 | } |
| 1463 | |||
| 1464 | /* | ||
| 1465 | * All idle workers are rebound and waiting for %WORKER_REBIND to | ||
| 1466 | * be cleared inside idle_worker_rebind(). Clear and release. | ||
| 1467 | * Clearing %WORKER_REBIND from this foreign context is safe | ||
| 1468 | * because these workers are still guaranteed to be idle. | ||
| 1469 | * | ||
| 1470 | * We need to make sure all idle workers passed WORKER_REBIND wait | ||
| 1471 | * in idle_worker_rebind() before returning; otherwise, workers can | ||
| 1472 | * get stuck at the wait if hotplug cycle repeats. | ||
| 1473 | */ | ||
| 1474 | idle_rebind.cnt = 1; | ||
| 1475 | INIT_COMPLETION(idle_rebind.done); | ||
| 1476 | |||
| 1477 | for_each_worker_pool(pool, gcwq) { | ||
| 1478 | list_for_each_entry(worker, &pool->idle_list, entry) { | ||
| 1479 | worker->flags &= ~WORKER_REBIND; | ||
| 1480 | idle_rebind.cnt++; | ||
| 1481 | } | ||
| 1482 | } | ||
| 1483 | |||
| 1484 | wake_up_all(&gcwq->rebind_hold); | ||
| 1485 | |||
| 1486 | if (--idle_rebind.cnt) { | ||
| 1487 | spin_unlock_irq(&gcwq->lock); | ||
| 1488 | wait_for_completion(&idle_rebind.done); | ||
| 1489 | spin_lock_irq(&gcwq->lock); | ||
| 1490 | } | ||
| 1452 | } | 1491 | } |
| 1453 | 1492 | ||
| 1454 | static struct worker *alloc_worker(void) | 1493 | static struct worker *alloc_worker(void) |
| @@ -1794,9 +1833,45 @@ static bool manage_workers(struct worker *worker) | |||
| 1794 | struct worker_pool *pool = worker->pool; | 1833 | struct worker_pool *pool = worker->pool; |
| 1795 | bool ret = false; | 1834 | bool ret = false; |
| 1796 | 1835 | ||
| 1797 | if (!mutex_trylock(&pool->manager_mutex)) | 1836 | if (pool->flags & POOL_MANAGING_WORKERS) |
| 1798 | return ret; | 1837 | return ret; |
| 1799 | 1838 | ||
| 1839 | pool->flags |= POOL_MANAGING_WORKERS; | ||
| 1840 | |||
| 1841 | /* | ||
| 1842 | * To simplify both worker management and CPU hotplug, hold off | ||
| 1843 | * management while hotplug is in progress. CPU hotplug path can't | ||
| 1844 | * grab %POOL_MANAGING_WORKERS to achieve this because that can | ||
| 1845 | * lead to idle worker depletion (all become busy thinking someone | ||
| 1846 | * else is managing) which in turn can result in deadlock under | ||
| 1847 | * extreme circumstances. Use @pool->manager_mutex to synchronize | ||
| 1848 | * manager against CPU hotplug. | ||
| 1849 | * | ||
| 1850 | * manager_mutex would always be free unless CPU hotplug is in | ||
| 1851 | * progress. trylock first without dropping @gcwq->lock. | ||
| 1852 | */ | ||
| 1853 | if (unlikely(!mutex_trylock(&pool->manager_mutex))) { | ||
| 1854 | spin_unlock_irq(&pool->gcwq->lock); | ||
| 1855 | mutex_lock(&pool->manager_mutex); | ||
| 1856 | /* | ||
| 1857 | * CPU hotplug could have happened while we were waiting | ||
| 1858 | * for manager_mutex. Hotplug itself can't handle us | ||
| 1859 | * because manager isn't either on idle or busy list, and | ||
| 1860 | * @gcwq's state and ours could have deviated. | ||
| 1861 | * | ||
| 1862 | * As hotplug is now excluded via manager_mutex, we can | ||
| 1863 | * simply try to bind. It will succeed or fail depending | ||
| 1864 | * on @gcwq's current state. Try it and adjust | ||
| 1865 | * %WORKER_UNBOUND accordingly. | ||
| 1866 | */ | ||
| 1867 | if (worker_maybe_bind_and_lock(worker)) | ||
| 1868 | worker->flags &= ~WORKER_UNBOUND; | ||
| 1869 | else | ||
| 1870 | worker->flags |= WORKER_UNBOUND; | ||
| 1871 | |||
| 1872 | ret = true; | ||
| 1873 | } | ||
| 1874 | |||
| 1800 | pool->flags &= ~POOL_MANAGE_WORKERS; | 1875 | pool->flags &= ~POOL_MANAGE_WORKERS; |
| 1801 | 1876 | ||
| 1802 | /* | 1877 | /* |
| @@ -1806,6 +1881,7 @@ static bool manage_workers(struct worker *worker) | |||
| 1806 | ret |= maybe_destroy_workers(pool); | 1881 | ret |= maybe_destroy_workers(pool); |
| 1807 | ret |= maybe_create_worker(pool); | 1882 | ret |= maybe_create_worker(pool); |
| 1808 | 1883 | ||
| 1884 | pool->flags &= ~POOL_MANAGING_WORKERS; | ||
| 1809 | mutex_unlock(&pool->manager_mutex); | 1885 | mutex_unlock(&pool->manager_mutex); |
| 1810 | return ret; | 1886 | return ret; |
| 1811 | } | 1887 | } |
| @@ -3500,18 +3576,17 @@ static int __devinit workqueue_cpu_down_callback(struct notifier_block *nfb, | |||
| 3500 | #ifdef CONFIG_SMP | 3576 | #ifdef CONFIG_SMP |
| 3501 | 3577 | ||
| 3502 | struct work_for_cpu { | 3578 | struct work_for_cpu { |
| 3503 | struct completion completion; | 3579 | struct work_struct work; |
| 3504 | long (*fn)(void *); | 3580 | long (*fn)(void *); |
| 3505 | void *arg; | 3581 | void *arg; |
| 3506 | long ret; | 3582 | long ret; |
| 3507 | }; | 3583 | }; |
| 3508 | 3584 | ||
| 3509 | static int do_work_for_cpu(void *_wfc) | 3585 | static void work_for_cpu_fn(struct work_struct *work) |
| 3510 | { | 3586 | { |
| 3511 | struct work_for_cpu *wfc = _wfc; | 3587 | struct work_for_cpu *wfc = container_of(work, struct work_for_cpu, work); |
| 3588 | |||
| 3512 | wfc->ret = wfc->fn(wfc->arg); | 3589 | wfc->ret = wfc->fn(wfc->arg); |
| 3513 | complete(&wfc->completion); | ||
| 3514 | return 0; | ||
| 3515 | } | 3590 | } |
| 3516 | 3591 | ||
| 3517 | /** | 3592 | /** |
| @@ -3526,19 +3601,11 @@ static int do_work_for_cpu(void *_wfc) | |||
| 3526 | */ | 3601 | */ |
| 3527 | long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) | 3602 | long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) |
| 3528 | { | 3603 | { |
| 3529 | struct task_struct *sub_thread; | 3604 | struct work_for_cpu wfc = { .fn = fn, .arg = arg }; |
| 3530 | struct work_for_cpu wfc = { | ||
| 3531 | .completion = COMPLETION_INITIALIZER_ONSTACK(wfc.completion), | ||
| 3532 | .fn = fn, | ||
| 3533 | .arg = arg, | ||
| 3534 | }; | ||
| 3535 | 3605 | ||
| 3536 | sub_thread = kthread_create(do_work_for_cpu, &wfc, "work_for_cpu"); | 3606 | INIT_WORK_ONSTACK(&wfc.work, work_for_cpu_fn); |
| 3537 | if (IS_ERR(sub_thread)) | 3607 | schedule_work_on(cpu, &wfc.work); |
| 3538 | return PTR_ERR(sub_thread); | 3608 | flush_work(&wfc.work); |
| 3539 | kthread_bind(sub_thread, cpu); | ||
| 3540 | wake_up_process(sub_thread); | ||
| 3541 | wait_for_completion(&wfc.completion); | ||
| 3542 | return wfc.ret; | 3609 | return wfc.ret; |
| 3543 | } | 3610 | } |
| 3544 | EXPORT_SYMBOL_GPL(work_on_cpu); | 3611 | EXPORT_SYMBOL_GPL(work_on_cpu); |
diff --git a/lib/digsig.c b/lib/digsig.c index 286d558033e2..8c0e62975c88 100644 --- a/lib/digsig.c +++ b/lib/digsig.c | |||
| @@ -163,9 +163,11 @@ static int digsig_verify_rsa(struct key *key, | |||
| 163 | memcpy(out1 + head, p, l); | 163 | memcpy(out1 + head, p, l); |
| 164 | 164 | ||
| 165 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); | 165 | err = pkcs_1_v1_5_decode_emsa(out1, len, mblen, out2, &len); |
| 166 | if (err) | ||
| 167 | goto err; | ||
| 166 | 168 | ||
| 167 | if (!err && len == hlen) | 169 | if (len != hlen || memcmp(out2, h, hlen)) |
| 168 | err = memcmp(out2, h, hlen); | 170 | err = -EINVAL; |
| 169 | 171 | ||
| 170 | err: | 172 | err: |
| 171 | mpi_free(in); | 173 | mpi_free(in); |
diff --git a/mm/filemap.c b/mm/filemap.c index fa5ca304148e..384344575c37 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -1412,12 +1412,8 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
| 1412 | retval = filemap_write_and_wait_range(mapping, pos, | 1412 | retval = filemap_write_and_wait_range(mapping, pos, |
| 1413 | pos + iov_length(iov, nr_segs) - 1); | 1413 | pos + iov_length(iov, nr_segs) - 1); |
| 1414 | if (!retval) { | 1414 | if (!retval) { |
| 1415 | struct blk_plug plug; | ||
| 1416 | |||
| 1417 | blk_start_plug(&plug); | ||
| 1418 | retval = mapping->a_ops->direct_IO(READ, iocb, | 1415 | retval = mapping->a_ops->direct_IO(READ, iocb, |
| 1419 | iov, pos, nr_segs); | 1416 | iov, pos, nr_segs); |
| 1420 | blk_finish_plug(&plug); | ||
| 1421 | } | 1417 | } |
| 1422 | if (retval > 0) { | 1418 | if (retval > 0) { |
| 1423 | *ppos = pos + retval; | 1419 | *ppos = pos + retval; |
| @@ -2527,14 +2523,12 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 2527 | { | 2523 | { |
| 2528 | struct file *file = iocb->ki_filp; | 2524 | struct file *file = iocb->ki_filp; |
| 2529 | struct inode *inode = file->f_mapping->host; | 2525 | struct inode *inode = file->f_mapping->host; |
| 2530 | struct blk_plug plug; | ||
| 2531 | ssize_t ret; | 2526 | ssize_t ret; |
| 2532 | 2527 | ||
| 2533 | BUG_ON(iocb->ki_pos != pos); | 2528 | BUG_ON(iocb->ki_pos != pos); |
| 2534 | 2529 | ||
| 2535 | sb_start_write(inode->i_sb); | 2530 | sb_start_write(inode->i_sb); |
| 2536 | mutex_lock(&inode->i_mutex); | 2531 | mutex_lock(&inode->i_mutex); |
| 2537 | blk_start_plug(&plug); | ||
| 2538 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); | 2532 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 2539 | mutex_unlock(&inode->i_mutex); | 2533 | mutex_unlock(&inode->i_mutex); |
| 2540 | 2534 | ||
| @@ -2545,7 +2539,6 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, | |||
| 2545 | if (err < 0 && ret > 0) | 2539 | if (err < 0 && ret > 0) |
| 2546 | ret = err; | 2540 | ret = err; |
| 2547 | } | 2541 | } |
| 2548 | blk_finish_plug(&plug); | ||
| 2549 | sb_end_write(inode->i_sb); | 2542 | sb_end_write(inode->i_sb); |
| 2550 | return ret; | 2543 | return ret; |
| 2551 | } | 2544 | } |
diff --git a/mm/memblock.c b/mm/memblock.c index 4d9393c7edc9..82aa349d2f7a 100644 --- a/mm/memblock.c +++ b/mm/memblock.c | |||
| @@ -246,7 +246,7 @@ static int __init_memblock memblock_double_array(struct memblock_type *type, | |||
| 246 | min(new_area_start, memblock.current_limit), | 246 | min(new_area_start, memblock.current_limit), |
| 247 | new_alloc_size, PAGE_SIZE); | 247 | new_alloc_size, PAGE_SIZE); |
| 248 | 248 | ||
| 249 | new_array = addr ? __va(addr) : 0; | 249 | new_array = addr ? __va(addr) : NULL; |
| 250 | } | 250 | } |
| 251 | if (!addr) { | 251 | if (!addr) { |
| 252 | pr_err("memblock: Failed to double %s array from %ld to %ld entries !\n", | 252 | pr_err("memblock: Failed to double %s array from %ld to %ld entries !\n", |
diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 3ad25f9d1fc1..6a5b90d0cfd7 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c | |||
| @@ -126,9 +126,6 @@ static void register_page_bootmem_info_section(unsigned long start_pfn) | |||
| 126 | struct mem_section *ms; | 126 | struct mem_section *ms; |
| 127 | struct page *page, *memmap; | 127 | struct page *page, *memmap; |
| 128 | 128 | ||
| 129 | if (!pfn_valid(start_pfn)) | ||
| 130 | return; | ||
| 131 | |||
| 132 | section_nr = pfn_to_section_nr(start_pfn); | 129 | section_nr = pfn_to_section_nr(start_pfn); |
| 133 | ms = __nr_to_section(section_nr); | 130 | ms = __nr_to_section(section_nr); |
| 134 | 131 | ||
| @@ -187,9 +184,16 @@ void register_page_bootmem_info_node(struct pglist_data *pgdat) | |||
| 187 | end_pfn = pfn + pgdat->node_spanned_pages; | 184 | end_pfn = pfn + pgdat->node_spanned_pages; |
| 188 | 185 | ||
| 189 | /* register_section info */ | 186 | /* register_section info */ |
| 190 | for (; pfn < end_pfn; pfn += PAGES_PER_SECTION) | 187 | for (; pfn < end_pfn; pfn += PAGES_PER_SECTION) { |
| 191 | register_page_bootmem_info_section(pfn); | 188 | /* |
| 192 | 189 | * Some platforms can assign the same pfn to multiple nodes - on | |
| 190 | * node0 as well as nodeN. To avoid registering a pfn against | ||
| 191 | * multiple nodes we check that this pfn does not already | ||
| 192 | * reside in some other node. | ||
| 193 | */ | ||
| 194 | if (pfn_valid(pfn) && (pfn_to_nid(pfn) == node)) | ||
| 195 | register_page_bootmem_info_section(pfn); | ||
| 196 | } | ||
| 193 | } | 197 | } |
| 194 | #endif /* !CONFIG_SPARSEMEM_VMEMMAP */ | 198 | #endif /* !CONFIG_SPARSEMEM_VMEMMAP */ |
| 195 | 199 | ||
diff --git a/mm/mempolicy.c b/mm/mempolicy.c index bd92431d4c49..4ada3be6e252 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c | |||
| @@ -2562,7 +2562,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context) | |||
| 2562 | break; | 2562 | break; |
| 2563 | 2563 | ||
| 2564 | default: | 2564 | default: |
| 2565 | BUG(); | 2565 | return -EINVAL; |
| 2566 | } | 2566 | } |
| 2567 | 2567 | ||
| 2568 | l = strlen(policy_modes[mode]); | 2568 | l = strlen(policy_modes[mode]); |
| @@ -1356,9 +1356,8 @@ out: | |||
| 1356 | } else if ((flags & MAP_POPULATE) && !(flags & MAP_NONBLOCK)) | 1356 | } else if ((flags & MAP_POPULATE) && !(flags & MAP_NONBLOCK)) |
| 1357 | make_pages_present(addr, addr + len); | 1357 | make_pages_present(addr, addr + len); |
| 1358 | 1358 | ||
| 1359 | if (file && uprobe_mmap(vma)) | 1359 | if (file) |
| 1360 | /* matching probes but cannot insert */ | 1360 | uprobe_mmap(vma); |
| 1361 | goto unmap_and_free_vma; | ||
| 1362 | 1361 | ||
| 1363 | return addr; | 1362 | return addr; |
| 1364 | 1363 | ||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index c66fb875104a..c13ea7538891 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
| @@ -584,7 +584,7 @@ static inline void __free_one_page(struct page *page, | |||
| 584 | combined_idx = buddy_idx & page_idx; | 584 | combined_idx = buddy_idx & page_idx; |
| 585 | higher_page = page + (combined_idx - page_idx); | 585 | higher_page = page + (combined_idx - page_idx); |
| 586 | buddy_idx = __find_buddy_index(combined_idx, order + 1); | 586 | buddy_idx = __find_buddy_index(combined_idx, order + 1); |
| 587 | higher_buddy = page + (buddy_idx - combined_idx); | 587 | higher_buddy = higher_page + (buddy_idx - combined_idx); |
| 588 | if (page_is_buddy(higher_page, higher_buddy, order + 1)) { | 588 | if (page_is_buddy(higher_page, higher_buddy, order + 1)) { |
| 589 | list_add_tail(&page->lru, | 589 | list_add_tail(&page->lru, |
| 590 | &zone->free_area[order].free_list[migratetype]); | 590 | &zone->free_area[order].free_list[migratetype]); |
| @@ -983,7 +983,7 @@ static void *__ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac, | |||
| 983 | } | 983 | } |
| 984 | 984 | ||
| 985 | /* The caller cannot use PFMEMALLOC objects, find another one */ | 985 | /* The caller cannot use PFMEMALLOC objects, find another one */ |
| 986 | for (i = 1; i < ac->avail; i++) { | 986 | for (i = 0; i < ac->avail; i++) { |
| 987 | /* If a !PFMEMALLOC object is found, swap them */ | 987 | /* If a !PFMEMALLOC object is found, swap them */ |
| 988 | if (!is_obj_pfmemalloc(ac->entry[i])) { | 988 | if (!is_obj_pfmemalloc(ac->entry[i])) { |
| 989 | objp = ac->entry[i]; | 989 | objp = ac->entry[i]; |
| @@ -1000,7 +1000,7 @@ static void *__ac_get_obj(struct kmem_cache *cachep, struct array_cache *ac, | |||
| 1000 | l3 = cachep->nodelists[numa_mem_id()]; | 1000 | l3 = cachep->nodelists[numa_mem_id()]; |
| 1001 | if (!list_empty(&l3->slabs_free) && force_refill) { | 1001 | if (!list_empty(&l3->slabs_free) && force_refill) { |
| 1002 | struct slab *slabp = virt_to_slab(objp); | 1002 | struct slab *slabp = virt_to_slab(objp); |
| 1003 | ClearPageSlabPfmemalloc(virt_to_page(slabp->s_mem)); | 1003 | ClearPageSlabPfmemalloc(virt_to_head_page(slabp->s_mem)); |
| 1004 | clear_obj_pfmemalloc(&objp); | 1004 | clear_obj_pfmemalloc(&objp); |
| 1005 | recheck_pfmemalloc_active(cachep, ac); | 1005 | recheck_pfmemalloc_active(cachep, ac); |
| 1006 | return objp; | 1006 | return objp; |
| @@ -1032,7 +1032,7 @@ static void *__ac_put_obj(struct kmem_cache *cachep, struct array_cache *ac, | |||
| 1032 | { | 1032 | { |
| 1033 | if (unlikely(pfmemalloc_active)) { | 1033 | if (unlikely(pfmemalloc_active)) { |
| 1034 | /* Some pfmemalloc slabs exist, check if this is one */ | 1034 | /* Some pfmemalloc slabs exist, check if this is one */ |
| 1035 | struct page *page = virt_to_page(objp); | 1035 | struct page *page = virt_to_head_page(objp); |
| 1036 | if (PageSlabPfmemalloc(page)) | 1036 | if (PageSlabPfmemalloc(page)) |
| 1037 | set_obj_pfmemalloc(&objp); | 1037 | set_obj_pfmemalloc(&objp); |
| 1038 | } | 1038 | } |
| @@ -3260,6 +3260,7 @@ force_grow: | |||
| 3260 | 3260 | ||
| 3261 | /* cache_grow can reenable interrupts, then ac could change. */ | 3261 | /* cache_grow can reenable interrupts, then ac could change. */ |
| 3262 | ac = cpu_cache_get(cachep); | 3262 | ac = cpu_cache_get(cachep); |
| 3263 | node = numa_mem_id(); | ||
| 3263 | 3264 | ||
| 3264 | /* no objects in sight? abort */ | 3265 | /* no objects in sight? abort */ |
| 3265 | if (!x && (ac->avail == 0 || force_refill)) | 3266 | if (!x && (ac->avail == 0 || force_refill)) |
| @@ -1524,12 +1524,13 @@ static inline void *acquire_slab(struct kmem_cache *s, | |||
| 1524 | } | 1524 | } |
| 1525 | 1525 | ||
| 1526 | static int put_cpu_partial(struct kmem_cache *s, struct page *page, int drain); | 1526 | static int put_cpu_partial(struct kmem_cache *s, struct page *page, int drain); |
| 1527 | static inline bool pfmemalloc_match(struct page *page, gfp_t gfpflags); | ||
| 1527 | 1528 | ||
| 1528 | /* | 1529 | /* |
| 1529 | * Try to allocate a partial slab from a specific node. | 1530 | * Try to allocate a partial slab from a specific node. |
| 1530 | */ | 1531 | */ |
| 1531 | static void *get_partial_node(struct kmem_cache *s, | 1532 | static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n, |
| 1532 | struct kmem_cache_node *n, struct kmem_cache_cpu *c) | 1533 | struct kmem_cache_cpu *c, gfp_t flags) |
| 1533 | { | 1534 | { |
| 1534 | struct page *page, *page2; | 1535 | struct page *page, *page2; |
| 1535 | void *object = NULL; | 1536 | void *object = NULL; |
| @@ -1545,9 +1546,13 @@ static void *get_partial_node(struct kmem_cache *s, | |||
| 1545 | 1546 | ||
| 1546 | spin_lock(&n->list_lock); | 1547 | spin_lock(&n->list_lock); |
| 1547 | list_for_each_entry_safe(page, page2, &n->partial, lru) { | 1548 | list_for_each_entry_safe(page, page2, &n->partial, lru) { |
| 1548 | void *t = acquire_slab(s, n, page, object == NULL); | 1549 | void *t; |
| 1549 | int available; | 1550 | int available; |
| 1550 | 1551 | ||
| 1552 | if (!pfmemalloc_match(page, flags)) | ||
| 1553 | continue; | ||
| 1554 | |||
| 1555 | t = acquire_slab(s, n, page, object == NULL); | ||
| 1551 | if (!t) | 1556 | if (!t) |
| 1552 | break; | 1557 | break; |
| 1553 | 1558 | ||
| @@ -1614,7 +1619,7 @@ static void *get_any_partial(struct kmem_cache *s, gfp_t flags, | |||
| 1614 | 1619 | ||
| 1615 | if (n && cpuset_zone_allowed_hardwall(zone, flags) && | 1620 | if (n && cpuset_zone_allowed_hardwall(zone, flags) && |
| 1616 | n->nr_partial > s->min_partial) { | 1621 | n->nr_partial > s->min_partial) { |
| 1617 | object = get_partial_node(s, n, c); | 1622 | object = get_partial_node(s, n, c, flags); |
| 1618 | if (object) { | 1623 | if (object) { |
| 1619 | /* | 1624 | /* |
| 1620 | * Return the object even if | 1625 | * Return the object even if |
| @@ -1643,7 +1648,7 @@ static void *get_partial(struct kmem_cache *s, gfp_t flags, int node, | |||
| 1643 | void *object; | 1648 | void *object; |
| 1644 | int searchnode = (node == NUMA_NO_NODE) ? numa_node_id() : node; | 1649 | int searchnode = (node == NUMA_NO_NODE) ? numa_node_id() : node; |
| 1645 | 1650 | ||
| 1646 | object = get_partial_node(s, get_node(s, searchnode), c); | 1651 | object = get_partial_node(s, get_node(s, searchnode), c, flags); |
| 1647 | if (object || node != NUMA_NO_NODE) | 1652 | if (object || node != NUMA_NO_NODE) |
| 1648 | return object; | 1653 | return object; |
| 1649 | 1654 | ||
diff --git a/mm/vmscan.c b/mm/vmscan.c index 8d01243d9560..99b434b674c0 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c | |||
| @@ -3102,6 +3102,7 @@ int kswapd_run(int nid) | |||
| 3102 | /* failure at boot is fatal */ | 3102 | /* failure at boot is fatal */ |
| 3103 | BUG_ON(system_state == SYSTEM_BOOTING); | 3103 | BUG_ON(system_state == SYSTEM_BOOTING); |
| 3104 | printk("Failed to start kswapd on node %d\n",nid); | 3104 | printk("Failed to start kswapd on node %d\n",nid); |
| 3105 | pgdat->kswapd = NULL; | ||
| 3105 | ret = -1; | 3106 | ret = -1; |
| 3106 | } | 3107 | } |
| 3107 | return ret; | 3108 | return ret; |
diff --git a/net/batman-adv/bitarray.h b/net/batman-adv/bitarray.h index a081ce1c0514..cebaae7e148b 100644 --- a/net/batman-adv/bitarray.h +++ b/net/batman-adv/bitarray.h | |||
| @@ -20,8 +20,8 @@ | |||
| 20 | #ifndef _NET_BATMAN_ADV_BITARRAY_H_ | 20 | #ifndef _NET_BATMAN_ADV_BITARRAY_H_ |
| 21 | #define _NET_BATMAN_ADV_BITARRAY_H_ | 21 | #define _NET_BATMAN_ADV_BITARRAY_H_ |
| 22 | 22 | ||
| 23 | /* returns true if the corresponding bit in the given seq_bits indicates true | 23 | /* Returns 1 if the corresponding bit in the given seq_bits indicates true |
| 24 | * and curr_seqno is within range of last_seqno | 24 | * and curr_seqno is within range of last_seqno. Otherwise returns 0. |
| 25 | */ | 25 | */ |
| 26 | static inline int batadv_test_bit(const unsigned long *seq_bits, | 26 | static inline int batadv_test_bit(const unsigned long *seq_bits, |
| 27 | uint32_t last_seqno, uint32_t curr_seqno) | 27 | uint32_t last_seqno, uint32_t curr_seqno) |
| @@ -32,7 +32,7 @@ static inline int batadv_test_bit(const unsigned long *seq_bits, | |||
| 32 | if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE) | 32 | if (diff < 0 || diff >= BATADV_TQ_LOCAL_WINDOW_SIZE) |
| 33 | return 0; | 33 | return 0; |
| 34 | else | 34 | else |
| 35 | return test_bit(diff, seq_bits); | 35 | return test_bit(diff, seq_bits) != 0; |
| 36 | } | 36 | } |
| 37 | 37 | ||
| 38 | /* turn corresponding bit on, so we can remember that we got the packet */ | 38 | /* turn corresponding bit on, so we can remember that we got the packet */ |
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c index 5e5f5b410e0b..1eaacf10d19d 100644 --- a/net/bluetooth/bnep/sock.c +++ b/net/bluetooth/bnep/sock.c | |||
| @@ -58,7 +58,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 58 | switch (cmd) { | 58 | switch (cmd) { |
| 59 | case BNEPCONNADD: | 59 | case BNEPCONNADD: |
| 60 | if (!capable(CAP_NET_ADMIN)) | 60 | if (!capable(CAP_NET_ADMIN)) |
| 61 | return -EACCES; | 61 | return -EPERM; |
| 62 | 62 | ||
| 63 | if (copy_from_user(&ca, argp, sizeof(ca))) | 63 | if (copy_from_user(&ca, argp, sizeof(ca))) |
| 64 | return -EFAULT; | 64 | return -EFAULT; |
| @@ -84,7 +84,7 @@ static int bnep_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 84 | 84 | ||
| 85 | case BNEPCONNDEL: | 85 | case BNEPCONNDEL: |
| 86 | if (!capable(CAP_NET_ADMIN)) | 86 | if (!capable(CAP_NET_ADMIN)) |
| 87 | return -EACCES; | 87 | return -EPERM; |
| 88 | 88 | ||
| 89 | if (copy_from_user(&cd, argp, sizeof(cd))) | 89 | if (copy_from_user(&cd, argp, sizeof(cd))) |
| 90 | return -EFAULT; | 90 | return -EFAULT; |
diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c index 311668d14571..32dc83dcb6b2 100644 --- a/net/bluetooth/cmtp/sock.c +++ b/net/bluetooth/cmtp/sock.c | |||
| @@ -72,7 +72,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 72 | switch (cmd) { | 72 | switch (cmd) { |
| 73 | case CMTPCONNADD: | 73 | case CMTPCONNADD: |
| 74 | if (!capable(CAP_NET_ADMIN)) | 74 | if (!capable(CAP_NET_ADMIN)) |
| 75 | return -EACCES; | 75 | return -EPERM; |
| 76 | 76 | ||
| 77 | if (copy_from_user(&ca, argp, sizeof(ca))) | 77 | if (copy_from_user(&ca, argp, sizeof(ca))) |
| 78 | return -EFAULT; | 78 | return -EFAULT; |
| @@ -97,7 +97,7 @@ static int cmtp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 97 | 97 | ||
| 98 | case CMTPCONNDEL: | 98 | case CMTPCONNDEL: |
| 99 | if (!capable(CAP_NET_ADMIN)) | 99 | if (!capable(CAP_NET_ADMIN)) |
| 100 | return -EACCES; | 100 | return -EPERM; |
| 101 | 101 | ||
| 102 | if (copy_from_user(&cd, argp, sizeof(cd))) | 102 | if (copy_from_user(&cd, argp, sizeof(cd))) |
| 103 | return -EFAULT; | 103 | return -EFAULT; |
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 5ad7da217474..3c094e78dde9 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
| @@ -29,6 +29,7 @@ | |||
| 29 | #include <net/bluetooth/bluetooth.h> | 29 | #include <net/bluetooth/bluetooth.h> |
| 30 | #include <net/bluetooth/hci_core.h> | 30 | #include <net/bluetooth/hci_core.h> |
| 31 | #include <net/bluetooth/a2mp.h> | 31 | #include <net/bluetooth/a2mp.h> |
| 32 | #include <net/bluetooth/smp.h> | ||
| 32 | 33 | ||
| 33 | static void hci_le_connect(struct hci_conn *conn) | 34 | static void hci_le_connect(struct hci_conn *conn) |
| 34 | { | 35 | { |
| @@ -619,6 +620,9 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
| 619 | { | 620 | { |
| 620 | BT_DBG("hcon %p", conn); | 621 | BT_DBG("hcon %p", conn); |
| 621 | 622 | ||
| 623 | if (conn->type == LE_LINK) | ||
| 624 | return smp_conn_security(conn, sec_level); | ||
| 625 | |||
| 622 | /* For sdp we don't need the link key. */ | 626 | /* For sdp we don't need the link key. */ |
| 623 | if (sec_level == BT_SECURITY_SDP) | 627 | if (sec_level == BT_SECURITY_SDP) |
| 624 | return 1; | 628 | return 1; |
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 19fdac78e555..d5ace1eda3ed 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
| @@ -490,7 +490,7 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, | |||
| 490 | switch (cmd) { | 490 | switch (cmd) { |
| 491 | case HCISETRAW: | 491 | case HCISETRAW: |
| 492 | if (!capable(CAP_NET_ADMIN)) | 492 | if (!capable(CAP_NET_ADMIN)) |
| 493 | return -EACCES; | 493 | return -EPERM; |
| 494 | 494 | ||
| 495 | if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) | 495 | if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks)) |
| 496 | return -EPERM; | 496 | return -EPERM; |
| @@ -510,12 +510,12 @@ static int hci_sock_bound_ioctl(struct sock *sk, unsigned int cmd, | |||
| 510 | 510 | ||
| 511 | case HCIBLOCKADDR: | 511 | case HCIBLOCKADDR: |
| 512 | if (!capable(CAP_NET_ADMIN)) | 512 | if (!capable(CAP_NET_ADMIN)) |
| 513 | return -EACCES; | 513 | return -EPERM; |
| 514 | return hci_sock_blacklist_add(hdev, (void __user *) arg); | 514 | return hci_sock_blacklist_add(hdev, (void __user *) arg); |
| 515 | 515 | ||
| 516 | case HCIUNBLOCKADDR: | 516 | case HCIUNBLOCKADDR: |
| 517 | if (!capable(CAP_NET_ADMIN)) | 517 | if (!capable(CAP_NET_ADMIN)) |
| 518 | return -EACCES; | 518 | return -EPERM; |
| 519 | return hci_sock_blacklist_del(hdev, (void __user *) arg); | 519 | return hci_sock_blacklist_del(hdev, (void __user *) arg); |
| 520 | 520 | ||
| 521 | default: | 521 | default: |
| @@ -546,22 +546,22 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd, | |||
| 546 | 546 | ||
| 547 | case HCIDEVUP: | 547 | case HCIDEVUP: |
| 548 | if (!capable(CAP_NET_ADMIN)) | 548 | if (!capable(CAP_NET_ADMIN)) |
| 549 | return -EACCES; | 549 | return -EPERM; |
| 550 | return hci_dev_open(arg); | 550 | return hci_dev_open(arg); |
| 551 | 551 | ||
| 552 | case HCIDEVDOWN: | 552 | case HCIDEVDOWN: |
| 553 | if (!capable(CAP_NET_ADMIN)) | 553 | if (!capable(CAP_NET_ADMIN)) |
| 554 | return -EACCES; | 554 | return -EPERM; |
| 555 | return hci_dev_close(arg); | 555 | return hci_dev_close(arg); |
| 556 | 556 | ||
| 557 | case HCIDEVRESET: | 557 | case HCIDEVRESET: |
| 558 | if (!capable(CAP_NET_ADMIN)) | 558 | if (!capable(CAP_NET_ADMIN)) |
| 559 | return -EACCES; | 559 | return -EPERM; |
| 560 | return hci_dev_reset(arg); | 560 | return hci_dev_reset(arg); |
| 561 | 561 | ||
| 562 | case HCIDEVRESTAT: | 562 | case HCIDEVRESTAT: |
| 563 | if (!capable(CAP_NET_ADMIN)) | 563 | if (!capable(CAP_NET_ADMIN)) |
| 564 | return -EACCES; | 564 | return -EPERM; |
| 565 | return hci_dev_reset_stat(arg); | 565 | return hci_dev_reset_stat(arg); |
| 566 | 566 | ||
| 567 | case HCISETSCAN: | 567 | case HCISETSCAN: |
| @@ -573,7 +573,7 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd, | |||
| 573 | case HCISETACLMTU: | 573 | case HCISETACLMTU: |
| 574 | case HCISETSCOMTU: | 574 | case HCISETSCOMTU: |
| 575 | if (!capable(CAP_NET_ADMIN)) | 575 | if (!capable(CAP_NET_ADMIN)) |
| 576 | return -EACCES; | 576 | return -EPERM; |
| 577 | return hci_dev_cmd(cmd, argp); | 577 | return hci_dev_cmd(cmd, argp); |
| 578 | 578 | ||
| 579 | case HCIINQUIRY: | 579 | case HCIINQUIRY: |
diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c index 18b3f6892a36..b24fb3bd8625 100644 --- a/net/bluetooth/hidp/sock.c +++ b/net/bluetooth/hidp/sock.c | |||
| @@ -56,7 +56,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 56 | switch (cmd) { | 56 | switch (cmd) { |
| 57 | case HIDPCONNADD: | 57 | case HIDPCONNADD: |
| 58 | if (!capable(CAP_NET_ADMIN)) | 58 | if (!capable(CAP_NET_ADMIN)) |
| 59 | return -EACCES; | 59 | return -EPERM; |
| 60 | 60 | ||
| 61 | if (copy_from_user(&ca, argp, sizeof(ca))) | 61 | if (copy_from_user(&ca, argp, sizeof(ca))) |
| 62 | return -EFAULT; | 62 | return -EFAULT; |
| @@ -91,7 +91,7 @@ static int hidp_sock_ioctl(struct socket *sock, unsigned int cmd, unsigned long | |||
| 91 | 91 | ||
| 92 | case HIDPCONNDEL: | 92 | case HIDPCONNDEL: |
| 93 | if (!capable(CAP_NET_ADMIN)) | 93 | if (!capable(CAP_NET_ADMIN)) |
| 94 | return -EACCES; | 94 | return -EPERM; |
| 95 | 95 | ||
| 96 | if (copy_from_user(&cd, argp, sizeof(cd))) | 96 | if (copy_from_user(&cd, argp, sizeof(cd))) |
| 97 | return -EFAULT; | 97 | return -EFAULT; |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index daa149b7003c..4ea1710a4783 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
| @@ -1199,14 +1199,15 @@ clean: | |||
| 1199 | static void l2cap_conn_ready(struct l2cap_conn *conn) | 1199 | static void l2cap_conn_ready(struct l2cap_conn *conn) |
| 1200 | { | 1200 | { |
| 1201 | struct l2cap_chan *chan; | 1201 | struct l2cap_chan *chan; |
| 1202 | struct hci_conn *hcon = conn->hcon; | ||
| 1202 | 1203 | ||
| 1203 | BT_DBG("conn %p", conn); | 1204 | BT_DBG("conn %p", conn); |
| 1204 | 1205 | ||
| 1205 | if (!conn->hcon->out && conn->hcon->type == LE_LINK) | 1206 | if (!hcon->out && hcon->type == LE_LINK) |
| 1206 | l2cap_le_conn_ready(conn); | 1207 | l2cap_le_conn_ready(conn); |
| 1207 | 1208 | ||
| 1208 | if (conn->hcon->out && conn->hcon->type == LE_LINK) | 1209 | if (hcon->out && hcon->type == LE_LINK) |
| 1209 | smp_conn_security(conn, conn->hcon->pending_sec_level); | 1210 | smp_conn_security(hcon, hcon->pending_sec_level); |
| 1210 | 1211 | ||
| 1211 | mutex_lock(&conn->chan_lock); | 1212 | mutex_lock(&conn->chan_lock); |
| 1212 | 1213 | ||
| @@ -1219,8 +1220,8 @@ static void l2cap_conn_ready(struct l2cap_conn *conn) | |||
| 1219 | continue; | 1220 | continue; |
| 1220 | } | 1221 | } |
| 1221 | 1222 | ||
| 1222 | if (conn->hcon->type == LE_LINK) { | 1223 | if (hcon->type == LE_LINK) { |
| 1223 | if (smp_conn_security(conn, chan->sec_level)) | 1224 | if (smp_conn_security(hcon, chan->sec_level)) |
| 1224 | l2cap_chan_ready(chan); | 1225 | l2cap_chan_ready(chan); |
| 1225 | 1226 | ||
| 1226 | } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { | 1227 | } else if (chan->chan_type != L2CAP_CHAN_CONN_ORIENTED) { |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index 1497edd191a2..34bbe1c5e389 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
| @@ -616,7 +616,7 @@ static int l2cap_sock_setsockopt(struct socket *sock, int level, int optname, ch | |||
| 616 | break; | 616 | break; |
| 617 | } | 617 | } |
| 618 | 618 | ||
| 619 | if (smp_conn_security(conn, sec.level)) | 619 | if (smp_conn_security(conn->hcon, sec.level)) |
| 620 | break; | 620 | break; |
| 621 | sk->sk_state = BT_CONFIG; | 621 | sk->sk_state = BT_CONFIG; |
| 622 | chan->state = BT_CONFIG; | 622 | chan->state = BT_CONFIG; |
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c index 901a616c8083..8c225ef349cd 100644 --- a/net/bluetooth/smp.c +++ b/net/bluetooth/smp.c | |||
| @@ -267,10 +267,10 @@ static void smp_failure(struct l2cap_conn *conn, u8 reason, u8 send) | |||
| 267 | mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type, | 267 | mgmt_auth_failed(conn->hcon->hdev, conn->dst, hcon->type, |
| 268 | hcon->dst_type, reason); | 268 | hcon->dst_type, reason); |
| 269 | 269 | ||
| 270 | if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) { | 270 | cancel_delayed_work_sync(&conn->security_timer); |
| 271 | cancel_delayed_work_sync(&conn->security_timer); | 271 | |
| 272 | if (test_and_clear_bit(HCI_CONN_LE_SMP_PEND, &conn->hcon->flags)) | ||
| 272 | smp_chan_destroy(conn); | 273 | smp_chan_destroy(conn); |
| 273 | } | ||
| 274 | } | 274 | } |
| 275 | 275 | ||
| 276 | #define JUST_WORKS 0x00 | 276 | #define JUST_WORKS 0x00 |
| @@ -760,9 +760,9 @@ static u8 smp_cmd_security_req(struct l2cap_conn *conn, struct sk_buff *skb) | |||
| 760 | return 0; | 760 | return 0; |
| 761 | } | 761 | } |
| 762 | 762 | ||
| 763 | int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level) | 763 | int smp_conn_security(struct hci_conn *hcon, __u8 sec_level) |
| 764 | { | 764 | { |
| 765 | struct hci_conn *hcon = conn->hcon; | 765 | struct l2cap_conn *conn = hcon->l2cap_data; |
| 766 | struct smp_chan *smp = conn->smp_chan; | 766 | struct smp_chan *smp = conn->smp_chan; |
| 767 | __u8 authreq; | 767 | __u8 authreq; |
| 768 | 768 | ||
diff --git a/net/bridge/netfilter/ebt_log.c b/net/bridge/netfilter/ebt_log.c index f88ee537fb2b..92de5e5f9db2 100644 --- a/net/bridge/netfilter/ebt_log.c +++ b/net/bridge/netfilter/ebt_log.c | |||
| @@ -80,7 +80,7 @@ ebt_log_packet(u_int8_t pf, unsigned int hooknum, | |||
| 80 | unsigned int bitmask; | 80 | unsigned int bitmask; |
| 81 | 81 | ||
| 82 | spin_lock_bh(&ebt_log_lock); | 82 | spin_lock_bh(&ebt_log_lock); |
| 83 | printk("<%c>%s IN=%s OUT=%s MAC source = %pM MAC dest = %pM proto = 0x%04x", | 83 | printk(KERN_SOH "%c%s IN=%s OUT=%s MAC source = %pM MAC dest = %pM proto = 0x%04x", |
| 84 | '0' + loginfo->u.log.level, prefix, | 84 | '0' + loginfo->u.log.level, prefix, |
| 85 | in ? in->name : "", out ? out->name : "", | 85 | in ? in->name : "", out ? out->name : "", |
| 86 | eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, | 86 | eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest, |
diff --git a/net/caif/cfsrvl.c b/net/caif/cfsrvl.c index dd485f6128e8..ba217e90765e 100644 --- a/net/caif/cfsrvl.c +++ b/net/caif/cfsrvl.c | |||
| @@ -211,9 +211,10 @@ void caif_client_register_refcnt(struct cflayer *adapt_layer, | |||
| 211 | void (*put)(struct cflayer *lyr)) | 211 | void (*put)(struct cflayer *lyr)) |
| 212 | { | 212 | { |
| 213 | struct cfsrvl *service; | 213 | struct cfsrvl *service; |
| 214 | service = container_of(adapt_layer->dn, struct cfsrvl, layer); | ||
| 215 | 214 | ||
| 216 | WARN_ON(adapt_layer == NULL || adapt_layer->dn == NULL); | 215 | if (WARN_ON(adapt_layer == NULL || adapt_layer->dn == NULL)) |
| 216 | return; | ||
| 217 | service = container_of(adapt_layer->dn, struct cfsrvl, layer); | ||
| 217 | service->hold = hold; | 218 | service->hold = hold; |
| 218 | service->put = put; | 219 | service->put = put; |
| 219 | } | 220 | } |
diff --git a/net/core/dev.c b/net/core/dev.c index 83988362805e..89e33a5d4d93 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -2134,7 +2134,8 @@ static bool can_checksum_protocol(netdev_features_t features, __be16 protocol) | |||
| 2134 | static netdev_features_t harmonize_features(struct sk_buff *skb, | 2134 | static netdev_features_t harmonize_features(struct sk_buff *skb, |
| 2135 | __be16 protocol, netdev_features_t features) | 2135 | __be16 protocol, netdev_features_t features) |
| 2136 | { | 2136 | { |
| 2137 | if (!can_checksum_protocol(features, protocol)) { | 2137 | if (skb->ip_summed != CHECKSUM_NONE && |
| 2138 | !can_checksum_protocol(features, protocol)) { | ||
| 2138 | features &= ~NETIF_F_ALL_CSUM; | 2139 | features &= ~NETIF_F_ALL_CSUM; |
| 2139 | features &= ~NETIF_F_SG; | 2140 | features &= ~NETIF_F_SG; |
| 2140 | } else if (illegal_highdma(skb->dev, skb)) { | 2141 | } else if (illegal_highdma(skb->dev, skb)) { |
| @@ -2647,15 +2648,16 @@ void __skb_get_rxhash(struct sk_buff *skb) | |||
| 2647 | if (!skb_flow_dissect(skb, &keys)) | 2648 | if (!skb_flow_dissect(skb, &keys)) |
| 2648 | return; | 2649 | return; |
| 2649 | 2650 | ||
| 2650 | if (keys.ports) { | 2651 | if (keys.ports) |
| 2651 | if ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]) | ||
| 2652 | swap(keys.port16[0], keys.port16[1]); | ||
| 2653 | skb->l4_rxhash = 1; | 2652 | skb->l4_rxhash = 1; |
| 2654 | } | ||
| 2655 | 2653 | ||
| 2656 | /* get a consistent hash (same value on both flow directions) */ | 2654 | /* get a consistent hash (same value on both flow directions) */ |
| 2657 | if ((__force u32)keys.dst < (__force u32)keys.src) | 2655 | if (((__force u32)keys.dst < (__force u32)keys.src) || |
| 2656 | (((__force u32)keys.dst == (__force u32)keys.src) && | ||
| 2657 | ((__force u16)keys.port16[1] < (__force u16)keys.port16[0]))) { | ||
| 2658 | swap(keys.dst, keys.src); | 2658 | swap(keys.dst, keys.src); |
| 2659 | swap(keys.port16[0], keys.port16[1]); | ||
| 2660 | } | ||
| 2659 | 2661 | ||
| 2660 | hash = jhash_3words((__force u32)keys.dst, | 2662 | hash = jhash_3words((__force u32)keys.dst, |
| 2661 | (__force u32)keys.src, | 2663 | (__force u32)keys.src, |
| @@ -3321,7 +3323,7 @@ ncls: | |||
| 3321 | 3323 | ||
| 3322 | if (pt_prev) { | 3324 | if (pt_prev) { |
| 3323 | if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC))) | 3325 | if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC))) |
| 3324 | ret = -ENOMEM; | 3326 | goto drop; |
| 3325 | else | 3327 | else |
| 3326 | ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); | 3328 | ret = pt_prev->func(skb, skb->dev, pt_prev, orig_dev); |
| 3327 | } else { | 3329 | } else { |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 346b1eb83a1f..e4ba3e70c174 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -168,24 +168,16 @@ static void poll_napi(struct net_device *dev) | |||
| 168 | struct napi_struct *napi; | 168 | struct napi_struct *napi; |
| 169 | int budget = 16; | 169 | int budget = 16; |
| 170 | 170 | ||
| 171 | WARN_ON_ONCE(!irqs_disabled()); | ||
| 172 | |||
| 173 | list_for_each_entry(napi, &dev->napi_list, dev_list) { | 171 | list_for_each_entry(napi, &dev->napi_list, dev_list) { |
| 174 | local_irq_enable(); | ||
| 175 | if (napi->poll_owner != smp_processor_id() && | 172 | if (napi->poll_owner != smp_processor_id() && |
| 176 | spin_trylock(&napi->poll_lock)) { | 173 | spin_trylock(&napi->poll_lock)) { |
| 177 | rcu_read_lock_bh(); | ||
| 178 | budget = poll_one_napi(rcu_dereference_bh(dev->npinfo), | 174 | budget = poll_one_napi(rcu_dereference_bh(dev->npinfo), |
| 179 | napi, budget); | 175 | napi, budget); |
| 180 | rcu_read_unlock_bh(); | ||
| 181 | spin_unlock(&napi->poll_lock); | 176 | spin_unlock(&napi->poll_lock); |
| 182 | 177 | ||
| 183 | if (!budget) { | 178 | if (!budget) |
| 184 | local_irq_disable(); | ||
| 185 | break; | 179 | break; |
| 186 | } | ||
| 187 | } | 180 | } |
| 188 | local_irq_disable(); | ||
| 189 | } | 181 | } |
| 190 | } | 182 | } |
| 191 | 183 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index cce9e53528b1..148e73d2c451 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -2721,7 +2721,7 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
| 2721 | /* Eth + IPh + UDPh + mpls */ | 2721 | /* Eth + IPh + UDPh + mpls */ |
| 2722 | datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 - | 2722 | datalen = pkt_dev->cur_pkt_size - 14 - 20 - 8 - |
| 2723 | pkt_dev->pkt_overhead; | 2723 | pkt_dev->pkt_overhead; |
| 2724 | if (datalen < sizeof(struct pktgen_hdr)) | 2724 | if (datalen < 0 || datalen < sizeof(struct pktgen_hdr)) |
| 2725 | datalen = sizeof(struct pktgen_hdr); | 2725 | datalen = sizeof(struct pktgen_hdr); |
| 2726 | 2726 | ||
| 2727 | udph->source = htons(pkt_dev->cur_udp_src); | 2727 | udph->source = htons(pkt_dev->cur_udp_src); |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index fe00d1208167..e33ebae519c8 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -3502,7 +3502,9 @@ bool skb_try_coalesce(struct sk_buff *to, struct sk_buff *from, | |||
| 3502 | if (!skb_cloned(from)) | 3502 | if (!skb_cloned(from)) |
| 3503 | skb_shinfo(from)->nr_frags = 0; | 3503 | skb_shinfo(from)->nr_frags = 0; |
| 3504 | 3504 | ||
| 3505 | /* if the skb is cloned this does nothing since we set nr_frags to 0 */ | 3505 | /* if the skb is not cloned this does nothing |
| 3506 | * since we set nr_frags to 0. | ||
| 3507 | */ | ||
| 3506 | for (i = 0; i < skb_shinfo(from)->nr_frags; i++) | 3508 | for (i = 0; i < skb_shinfo(from)->nr_frags; i++) |
| 3507 | skb_frag_ref(from, i); | 3509 | skb_frag_ref(from, i); |
| 3508 | 3510 | ||
diff --git a/net/core/sock.c b/net/core/sock.c index 8f67ced8d6a8..305792076121 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1523,7 +1523,14 @@ EXPORT_SYMBOL(sock_rfree); | |||
| 1523 | 1523 | ||
| 1524 | void sock_edemux(struct sk_buff *skb) | 1524 | void sock_edemux(struct sk_buff *skb) |
| 1525 | { | 1525 | { |
| 1526 | sock_put(skb->sk); | 1526 | struct sock *sk = skb->sk; |
| 1527 | |||
| 1528 | #ifdef CONFIG_INET | ||
| 1529 | if (sk->sk_state == TCP_TIME_WAIT) | ||
| 1530 | inet_twsk_put(inet_twsk(sk)); | ||
| 1531 | else | ||
| 1532 | #endif | ||
| 1533 | sock_put(sk); | ||
| 1527 | } | 1534 | } |
| 1528 | EXPORT_SYMBOL(sock_edemux); | 1535 | EXPORT_SYMBOL(sock_edemux); |
| 1529 | 1536 | ||
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 77e87aff419a..47800459e4cb 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
| @@ -1225,7 +1225,7 @@ static int arp_netdev_event(struct notifier_block *this, unsigned long event, | |||
| 1225 | switch (event) { | 1225 | switch (event) { |
| 1226 | case NETDEV_CHANGEADDR: | 1226 | case NETDEV_CHANGEADDR: |
| 1227 | neigh_changeaddr(&arp_tbl, dev); | 1227 | neigh_changeaddr(&arp_tbl, dev); |
| 1228 | rt_cache_flush(dev_net(dev), 0); | 1228 | rt_cache_flush(dev_net(dev)); |
| 1229 | break; | 1229 | break; |
| 1230 | default: | 1230 | default: |
| 1231 | break; | 1231 | break; |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 44bf82e3aef7..e12fad773852 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
| @@ -725,7 +725,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
| 725 | break; | 725 | break; |
| 726 | 726 | ||
| 727 | case SIOCSIFFLAGS: | 727 | case SIOCSIFFLAGS: |
| 728 | ret = -EACCES; | 728 | ret = -EPERM; |
| 729 | if (!capable(CAP_NET_ADMIN)) | 729 | if (!capable(CAP_NET_ADMIN)) |
| 730 | goto out; | 730 | goto out; |
| 731 | break; | 731 | break; |
| @@ -733,7 +733,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
| 733 | case SIOCSIFBRDADDR: /* Set the broadcast address */ | 733 | case SIOCSIFBRDADDR: /* Set the broadcast address */ |
| 734 | case SIOCSIFDSTADDR: /* Set the destination address */ | 734 | case SIOCSIFDSTADDR: /* Set the destination address */ |
| 735 | case SIOCSIFNETMASK: /* Set the netmask for the interface */ | 735 | case SIOCSIFNETMASK: /* Set the netmask for the interface */ |
| 736 | ret = -EACCES; | 736 | ret = -EPERM; |
| 737 | if (!capable(CAP_NET_ADMIN)) | 737 | if (!capable(CAP_NET_ADMIN)) |
| 738 | goto out; | 738 | goto out; |
| 739 | ret = -EINVAL; | 739 | ret = -EINVAL; |
| @@ -1503,7 +1503,7 @@ static int devinet_conf_proc(ctl_table *ctl, int write, | |||
| 1503 | if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 || | 1503 | if (i == IPV4_DEVCONF_ACCEPT_LOCAL - 1 || |
| 1504 | i == IPV4_DEVCONF_ROUTE_LOCALNET - 1) | 1504 | i == IPV4_DEVCONF_ROUTE_LOCALNET - 1) |
| 1505 | if ((new_value == 0) && (old_value != 0)) | 1505 | if ((new_value == 0) && (old_value != 0)) |
| 1506 | rt_cache_flush(net, 0); | 1506 | rt_cache_flush(net); |
| 1507 | } | 1507 | } |
| 1508 | 1508 | ||
| 1509 | return ret; | 1509 | return ret; |
| @@ -1537,7 +1537,7 @@ static int devinet_sysctl_forward(ctl_table *ctl, int write, | |||
| 1537 | dev_disable_lro(idev->dev); | 1537 | dev_disable_lro(idev->dev); |
| 1538 | } | 1538 | } |
| 1539 | rtnl_unlock(); | 1539 | rtnl_unlock(); |
| 1540 | rt_cache_flush(net, 0); | 1540 | rt_cache_flush(net); |
| 1541 | } | 1541 | } |
| 1542 | } | 1542 | } |
| 1543 | 1543 | ||
| @@ -1554,7 +1554,7 @@ static int ipv4_doint_and_flush(ctl_table *ctl, int write, | |||
| 1554 | struct net *net = ctl->extra2; | 1554 | struct net *net = ctl->extra2; |
| 1555 | 1555 | ||
| 1556 | if (write && *valp != val) | 1556 | if (write && *valp != val) |
| 1557 | rt_cache_flush(net, 0); | 1557 | rt_cache_flush(net); |
| 1558 | 1558 | ||
| 1559 | return ret; | 1559 | return ret; |
| 1560 | } | 1560 | } |
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index c43ae3fba792..8e2b475da9fa 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c | |||
| @@ -148,7 +148,7 @@ static void fib_flush(struct net *net) | |||
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | if (flushed) | 150 | if (flushed) |
| 151 | rt_cache_flush(net, -1); | 151 | rt_cache_flush(net); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | /* | 154 | /* |
| @@ -999,11 +999,11 @@ static void nl_fib_lookup_exit(struct net *net) | |||
| 999 | net->ipv4.fibnl = NULL; | 999 | net->ipv4.fibnl = NULL; |
| 1000 | } | 1000 | } |
| 1001 | 1001 | ||
| 1002 | static void fib_disable_ip(struct net_device *dev, int force, int delay) | 1002 | static void fib_disable_ip(struct net_device *dev, int force) |
| 1003 | { | 1003 | { |
| 1004 | if (fib_sync_down_dev(dev, force)) | 1004 | if (fib_sync_down_dev(dev, force)) |
| 1005 | fib_flush(dev_net(dev)); | 1005 | fib_flush(dev_net(dev)); |
| 1006 | rt_cache_flush(dev_net(dev), delay); | 1006 | rt_cache_flush(dev_net(dev)); |
| 1007 | arp_ifdown(dev); | 1007 | arp_ifdown(dev); |
| 1008 | } | 1008 | } |
| 1009 | 1009 | ||
| @@ -1020,7 +1020,7 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event, | |||
| 1020 | fib_sync_up(dev); | 1020 | fib_sync_up(dev); |
| 1021 | #endif | 1021 | #endif |
| 1022 | atomic_inc(&net->ipv4.dev_addr_genid); | 1022 | atomic_inc(&net->ipv4.dev_addr_genid); |
| 1023 | rt_cache_flush(dev_net(dev), -1); | 1023 | rt_cache_flush(dev_net(dev)); |
| 1024 | break; | 1024 | break; |
| 1025 | case NETDEV_DOWN: | 1025 | case NETDEV_DOWN: |
| 1026 | fib_del_ifaddr(ifa, NULL); | 1026 | fib_del_ifaddr(ifa, NULL); |
| @@ -1029,9 +1029,9 @@ static int fib_inetaddr_event(struct notifier_block *this, unsigned long event, | |||
| 1029 | /* Last address was deleted from this interface. | 1029 | /* Last address was deleted from this interface. |
| 1030 | * Disable IP. | 1030 | * Disable IP. |
| 1031 | */ | 1031 | */ |
| 1032 | fib_disable_ip(dev, 1, 0); | 1032 | fib_disable_ip(dev, 1); |
| 1033 | } else { | 1033 | } else { |
| 1034 | rt_cache_flush(dev_net(dev), -1); | 1034 | rt_cache_flush(dev_net(dev)); |
| 1035 | } | 1035 | } |
| 1036 | break; | 1036 | break; |
| 1037 | } | 1037 | } |
| @@ -1045,7 +1045,7 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo | |||
| 1045 | struct net *net = dev_net(dev); | 1045 | struct net *net = dev_net(dev); |
| 1046 | 1046 | ||
| 1047 | if (event == NETDEV_UNREGISTER) { | 1047 | if (event == NETDEV_UNREGISTER) { |
| 1048 | fib_disable_ip(dev, 2, -1); | 1048 | fib_disable_ip(dev, 2); |
| 1049 | rt_flush_dev(dev); | 1049 | rt_flush_dev(dev); |
| 1050 | return NOTIFY_DONE; | 1050 | return NOTIFY_DONE; |
| 1051 | } | 1051 | } |
| @@ -1062,14 +1062,14 @@ static int fib_netdev_event(struct notifier_block *this, unsigned long event, vo | |||
| 1062 | fib_sync_up(dev); | 1062 | fib_sync_up(dev); |
| 1063 | #endif | 1063 | #endif |
| 1064 | atomic_inc(&net->ipv4.dev_addr_genid); | 1064 | atomic_inc(&net->ipv4.dev_addr_genid); |
| 1065 | rt_cache_flush(dev_net(dev), -1); | 1065 | rt_cache_flush(dev_net(dev)); |
| 1066 | break; | 1066 | break; |
| 1067 | case NETDEV_DOWN: | 1067 | case NETDEV_DOWN: |
| 1068 | fib_disable_ip(dev, 0, 0); | 1068 | fib_disable_ip(dev, 0); |
| 1069 | break; | 1069 | break; |
| 1070 | case NETDEV_CHANGEMTU: | 1070 | case NETDEV_CHANGEMTU: |
| 1071 | case NETDEV_CHANGE: | 1071 | case NETDEV_CHANGE: |
| 1072 | rt_cache_flush(dev_net(dev), 0); | 1072 | rt_cache_flush(dev_net(dev)); |
| 1073 | break; | 1073 | break; |
| 1074 | case NETDEV_UNREGISTER_BATCH: | 1074 | case NETDEV_UNREGISTER_BATCH: |
| 1075 | break; | 1075 | break; |
diff --git a/net/ipv4/fib_rules.c b/net/ipv4/fib_rules.c index a83d74e498d2..274309d3aded 100644 --- a/net/ipv4/fib_rules.c +++ b/net/ipv4/fib_rules.c | |||
| @@ -259,7 +259,7 @@ static size_t fib4_rule_nlmsg_payload(struct fib_rule *rule) | |||
| 259 | 259 | ||
| 260 | static void fib4_rule_flush_cache(struct fib_rules_ops *ops) | 260 | static void fib4_rule_flush_cache(struct fib_rules_ops *ops) |
| 261 | { | 261 | { |
| 262 | rt_cache_flush(ops->fro_net, -1); | 262 | rt_cache_flush(ops->fro_net); |
| 263 | } | 263 | } |
| 264 | 264 | ||
| 265 | static const struct fib_rules_ops __net_initdata fib4_rules_ops_template = { | 265 | static const struct fib_rules_ops __net_initdata fib4_rules_ops_template = { |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 57bd978483e1..d1b93595b4a7 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
| @@ -1286,7 +1286,7 @@ int fib_table_insert(struct fib_table *tb, struct fib_config *cfg) | |||
| 1286 | 1286 | ||
| 1287 | fib_release_info(fi_drop); | 1287 | fib_release_info(fi_drop); |
| 1288 | if (state & FA_S_ACCESSED) | 1288 | if (state & FA_S_ACCESSED) |
| 1289 | rt_cache_flush(cfg->fc_nlinfo.nl_net, -1); | 1289 | rt_cache_flush(cfg->fc_nlinfo.nl_net); |
| 1290 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, | 1290 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, |
| 1291 | tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE); | 1291 | tb->tb_id, &cfg->fc_nlinfo, NLM_F_REPLACE); |
| 1292 | 1292 | ||
| @@ -1333,7 +1333,7 @@ int fib_table_insert(struct fib_table *tb, struct fib_config *cfg) | |||
| 1333 | list_add_tail_rcu(&new_fa->fa_list, | 1333 | list_add_tail_rcu(&new_fa->fa_list, |
| 1334 | (fa ? &fa->fa_list : fa_head)); | 1334 | (fa ? &fa->fa_list : fa_head)); |
| 1335 | 1335 | ||
| 1336 | rt_cache_flush(cfg->fc_nlinfo.nl_net, -1); | 1336 | rt_cache_flush(cfg->fc_nlinfo.nl_net); |
| 1337 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, | 1337 | rtmsg_fib(RTM_NEWROUTE, htonl(key), new_fa, plen, tb->tb_id, |
| 1338 | &cfg->fc_nlinfo, 0); | 1338 | &cfg->fc_nlinfo, 0); |
| 1339 | succeeded: | 1339 | succeeded: |
| @@ -1708,7 +1708,7 @@ int fib_table_delete(struct fib_table *tb, struct fib_config *cfg) | |||
| 1708 | trie_leaf_remove(t, l); | 1708 | trie_leaf_remove(t, l); |
| 1709 | 1709 | ||
| 1710 | if (fa->fa_state & FA_S_ACCESSED) | 1710 | if (fa->fa_state & FA_S_ACCESSED) |
| 1711 | rt_cache_flush(cfg->fc_nlinfo.nl_net, -1); | 1711 | rt_cache_flush(cfg->fc_nlinfo.nl_net); |
| 1712 | 1712 | ||
| 1713 | fib_release_info(fa->fa_info); | 1713 | fib_release_info(fa->fa_info); |
| 1714 | alias_free_mem_rcu(fa); | 1714 | alias_free_mem_rcu(fa); |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 8eec8f4a0536..ebdf06f938bf 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
| @@ -124,6 +124,8 @@ static DEFINE_SPINLOCK(mfc_unres_lock); | |||
| 124 | static struct kmem_cache *mrt_cachep __read_mostly; | 124 | static struct kmem_cache *mrt_cachep __read_mostly; |
| 125 | 125 | ||
| 126 | static struct mr_table *ipmr_new_table(struct net *net, u32 id); | 126 | static struct mr_table *ipmr_new_table(struct net *net, u32 id); |
| 127 | static void ipmr_free_table(struct mr_table *mrt); | ||
| 128 | |||
| 127 | static int ip_mr_forward(struct net *net, struct mr_table *mrt, | 129 | static int ip_mr_forward(struct net *net, struct mr_table *mrt, |
| 128 | struct sk_buff *skb, struct mfc_cache *cache, | 130 | struct sk_buff *skb, struct mfc_cache *cache, |
| 129 | int local); | 131 | int local); |
| @@ -131,6 +133,7 @@ static int ipmr_cache_report(struct mr_table *mrt, | |||
| 131 | struct sk_buff *pkt, vifi_t vifi, int assert); | 133 | struct sk_buff *pkt, vifi_t vifi, int assert); |
| 132 | static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, | 134 | static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, |
| 133 | struct mfc_cache *c, struct rtmsg *rtm); | 135 | struct mfc_cache *c, struct rtmsg *rtm); |
| 136 | static void mroute_clean_tables(struct mr_table *mrt); | ||
| 134 | static void ipmr_expire_process(unsigned long arg); | 137 | static void ipmr_expire_process(unsigned long arg); |
| 135 | 138 | ||
| 136 | #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES | 139 | #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES |
| @@ -271,7 +274,7 @@ static void __net_exit ipmr_rules_exit(struct net *net) | |||
| 271 | 274 | ||
| 272 | list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { | 275 | list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { |
| 273 | list_del(&mrt->list); | 276 | list_del(&mrt->list); |
| 274 | kfree(mrt); | 277 | ipmr_free_table(mrt); |
| 275 | } | 278 | } |
| 276 | fib_rules_unregister(net->ipv4.mr_rules_ops); | 279 | fib_rules_unregister(net->ipv4.mr_rules_ops); |
| 277 | } | 280 | } |
| @@ -299,7 +302,7 @@ static int __net_init ipmr_rules_init(struct net *net) | |||
| 299 | 302 | ||
| 300 | static void __net_exit ipmr_rules_exit(struct net *net) | 303 | static void __net_exit ipmr_rules_exit(struct net *net) |
| 301 | { | 304 | { |
| 302 | kfree(net->ipv4.mrt); | 305 | ipmr_free_table(net->ipv4.mrt); |
| 303 | } | 306 | } |
| 304 | #endif | 307 | #endif |
| 305 | 308 | ||
| @@ -336,6 +339,13 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id) | |||
| 336 | return mrt; | 339 | return mrt; |
| 337 | } | 340 | } |
| 338 | 341 | ||
| 342 | static void ipmr_free_table(struct mr_table *mrt) | ||
| 343 | { | ||
| 344 | del_timer_sync(&mrt->ipmr_expire_timer); | ||
| 345 | mroute_clean_tables(mrt); | ||
| 346 | kfree(mrt); | ||
| 347 | } | ||
| 348 | |||
| 339 | /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */ | 349 | /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */ |
| 340 | 350 | ||
| 341 | static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v) | 351 | static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v) |
diff --git a/net/ipv4/netfilter/nf_nat_sip.c b/net/ipv4/netfilter/nf_nat_sip.c index 4ad9cf173992..9c87cde28ff8 100644 --- a/net/ipv4/netfilter/nf_nat_sip.c +++ b/net/ipv4/netfilter/nf_nat_sip.c | |||
| @@ -502,7 +502,10 @@ static unsigned int ip_nat_sdp_media(struct sk_buff *skb, unsigned int dataoff, | |||
| 502 | ret = nf_ct_expect_related(rtcp_exp); | 502 | ret = nf_ct_expect_related(rtcp_exp); |
| 503 | if (ret == 0) | 503 | if (ret == 0) |
| 504 | break; | 504 | break; |
| 505 | else if (ret != -EBUSY) { | 505 | else if (ret == -EBUSY) { |
| 506 | nf_ct_unexpect_related(rtp_exp); | ||
| 507 | continue; | ||
| 508 | } else if (ret < 0) { | ||
| 506 | nf_ct_unexpect_related(rtp_exp); | 509 | nf_ct_unexpect_related(rtp_exp); |
| 507 | port = 0; | 510 | port = 0; |
| 508 | break; | 511 | break; |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index fd9ecb52c66b..fd9af60397b5 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -202,11 +202,6 @@ EXPORT_SYMBOL(ip_tos2prio); | |||
| 202 | static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); | 202 | static DEFINE_PER_CPU(struct rt_cache_stat, rt_cache_stat); |
| 203 | #define RT_CACHE_STAT_INC(field) __this_cpu_inc(rt_cache_stat.field) | 203 | #define RT_CACHE_STAT_INC(field) __this_cpu_inc(rt_cache_stat.field) |
| 204 | 204 | ||
| 205 | static inline int rt_genid(struct net *net) | ||
| 206 | { | ||
| 207 | return atomic_read(&net->ipv4.rt_genid); | ||
| 208 | } | ||
| 209 | |||
| 210 | #ifdef CONFIG_PROC_FS | 205 | #ifdef CONFIG_PROC_FS |
| 211 | static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | 206 | static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) |
| 212 | { | 207 | { |
| @@ -447,27 +442,9 @@ static inline bool rt_is_expired(const struct rtable *rth) | |||
| 447 | return rth->rt_genid != rt_genid(dev_net(rth->dst.dev)); | 442 | return rth->rt_genid != rt_genid(dev_net(rth->dst.dev)); |
| 448 | } | 443 | } |
| 449 | 444 | ||
| 450 | /* | 445 | void rt_cache_flush(struct net *net) |
| 451 | * Perturbation of rt_genid by a small quantity [1..256] | ||
| 452 | * Using 8 bits of shuffling ensure we can call rt_cache_invalidate() | ||
| 453 | * many times (2^24) without giving recent rt_genid. | ||
| 454 | * Jenkins hash is strong enough that litle changes of rt_genid are OK. | ||
| 455 | */ | ||
| 456 | static void rt_cache_invalidate(struct net *net) | ||
| 457 | { | 446 | { |
| 458 | unsigned char shuffle; | 447 | rt_genid_bump(net); |
| 459 | |||
| 460 | get_random_bytes(&shuffle, sizeof(shuffle)); | ||
| 461 | atomic_add(shuffle + 1U, &net->ipv4.rt_genid); | ||
| 462 | } | ||
| 463 | |||
| 464 | /* | ||
| 465 | * delay < 0 : invalidate cache (fast : entries will be deleted later) | ||
| 466 | * delay >= 0 : invalidate & flush cache (can be long) | ||
| 467 | */ | ||
| 468 | void rt_cache_flush(struct net *net, int delay) | ||
| 469 | { | ||
| 470 | rt_cache_invalidate(net); | ||
| 471 | } | 448 | } |
| 472 | 449 | ||
| 473 | static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, | 450 | static struct neighbour *ipv4_neigh_lookup(const struct dst_entry *dst, |
| @@ -934,12 +911,14 @@ static u32 __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu) | |||
| 934 | if (mtu < ip_rt_min_pmtu) | 911 | if (mtu < ip_rt_min_pmtu) |
| 935 | mtu = ip_rt_min_pmtu; | 912 | mtu = ip_rt_min_pmtu; |
| 936 | 913 | ||
| 914 | rcu_read_lock(); | ||
| 937 | if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) { | 915 | if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) { |
| 938 | struct fib_nh *nh = &FIB_RES_NH(res); | 916 | struct fib_nh *nh = &FIB_RES_NH(res); |
| 939 | 917 | ||
| 940 | update_or_create_fnhe(nh, fl4->daddr, 0, mtu, | 918 | update_or_create_fnhe(nh, fl4->daddr, 0, mtu, |
| 941 | jiffies + ip_rt_mtu_expires); | 919 | jiffies + ip_rt_mtu_expires); |
| 942 | } | 920 | } |
| 921 | rcu_read_unlock(); | ||
| 943 | return mtu; | 922 | return mtu; |
| 944 | } | 923 | } |
| 945 | 924 | ||
| @@ -956,7 +935,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, | |||
| 956 | dst->obsolete = DST_OBSOLETE_KILL; | 935 | dst->obsolete = DST_OBSOLETE_KILL; |
| 957 | } else { | 936 | } else { |
| 958 | rt->rt_pmtu = mtu; | 937 | rt->rt_pmtu = mtu; |
| 959 | dst_set_expires(&rt->dst, ip_rt_mtu_expires); | 938 | rt->dst.expires = max(1UL, jiffies + ip_rt_mtu_expires); |
| 960 | } | 939 | } |
| 961 | } | 940 | } |
| 962 | 941 | ||
| @@ -1263,7 +1242,7 @@ static void ipv4_dst_destroy(struct dst_entry *dst) | |||
| 1263 | { | 1242 | { |
| 1264 | struct rtable *rt = (struct rtable *) dst; | 1243 | struct rtable *rt = (struct rtable *) dst; |
| 1265 | 1244 | ||
| 1266 | if (dst->flags & DST_NOCACHE) { | 1245 | if (!list_empty(&rt->rt_uncached)) { |
| 1267 | spin_lock_bh(&rt_uncached_lock); | 1246 | spin_lock_bh(&rt_uncached_lock); |
| 1268 | list_del(&rt->rt_uncached); | 1247 | list_del(&rt->rt_uncached); |
| 1269 | spin_unlock_bh(&rt_uncached_lock); | 1248 | spin_unlock_bh(&rt_uncached_lock); |
| @@ -2343,7 +2322,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb) | |||
| 2343 | 2322 | ||
| 2344 | void ip_rt_multicast_event(struct in_device *in_dev) | 2323 | void ip_rt_multicast_event(struct in_device *in_dev) |
| 2345 | { | 2324 | { |
| 2346 | rt_cache_flush(dev_net(in_dev->dev), 0); | 2325 | rt_cache_flush(dev_net(in_dev->dev)); |
| 2347 | } | 2326 | } |
| 2348 | 2327 | ||
| 2349 | #ifdef CONFIG_SYSCTL | 2328 | #ifdef CONFIG_SYSCTL |
| @@ -2352,16 +2331,7 @@ static int ipv4_sysctl_rtcache_flush(ctl_table *__ctl, int write, | |||
| 2352 | size_t *lenp, loff_t *ppos) | 2331 | size_t *lenp, loff_t *ppos) |
| 2353 | { | 2332 | { |
| 2354 | if (write) { | 2333 | if (write) { |
| 2355 | int flush_delay; | 2334 | rt_cache_flush((struct net *)__ctl->extra1); |
| 2356 | ctl_table ctl; | ||
| 2357 | struct net *net; | ||
| 2358 | |||
| 2359 | memcpy(&ctl, __ctl, sizeof(ctl)); | ||
| 2360 | ctl.data = &flush_delay; | ||
| 2361 | proc_dointvec(&ctl, write, buffer, lenp, ppos); | ||
| 2362 | |||
| 2363 | net = (struct net *)__ctl->extra1; | ||
| 2364 | rt_cache_flush(net, flush_delay); | ||
| 2365 | return 0; | 2335 | return 0; |
| 2366 | } | 2336 | } |
| 2367 | 2337 | ||
| @@ -2531,8 +2501,7 @@ static __net_initdata struct pernet_operations sysctl_route_ops = { | |||
| 2531 | 2501 | ||
| 2532 | static __net_init int rt_genid_init(struct net *net) | 2502 | static __net_init int rt_genid_init(struct net *net) |
| 2533 | { | 2503 | { |
| 2534 | get_random_bytes(&net->ipv4.rt_genid, | 2504 | atomic_set(&net->rt_genid, 0); |
| 2535 | sizeof(net->ipv4.rt_genid)); | ||
| 2536 | get_random_bytes(&net->ipv4.dev_addr_genid, | 2505 | get_random_bytes(&net->ipv4.dev_addr_genid, |
| 2537 | sizeof(net->ipv4.dev_addr_genid)); | 2506 | sizeof(net->ipv4.dev_addr_genid)); |
| 2538 | return 0; | 2507 | return 0; |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 2109ff4a1daf..5f6419341821 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -1762,8 +1762,14 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1762 | } | 1762 | } |
| 1763 | 1763 | ||
| 1764 | #ifdef CONFIG_NET_DMA | 1764 | #ifdef CONFIG_NET_DMA |
| 1765 | if (tp->ucopy.dma_chan) | 1765 | if (tp->ucopy.dma_chan) { |
| 1766 | dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | 1766 | if (tp->rcv_wnd == 0 && |
| 1767 | !skb_queue_empty(&sk->sk_async_wait_queue)) { | ||
| 1768 | tcp_service_net_dma(sk, true); | ||
| 1769 | tcp_cleanup_rbuf(sk, copied); | ||
| 1770 | } else | ||
| 1771 | dma_async_memcpy_issue_pending(tp->ucopy.dma_chan); | ||
| 1772 | } | ||
| 1767 | #endif | 1773 | #endif |
| 1768 | if (copied >= target) { | 1774 | if (copied >= target) { |
| 1769 | /* Do not sleep, just process backlog. */ | 1775 | /* Do not sleep, just process backlog. */ |
| @@ -2325,10 +2331,17 @@ static int tcp_repair_options_est(struct tcp_sock *tp, | |||
| 2325 | tp->rx_opt.mss_clamp = opt.opt_val; | 2331 | tp->rx_opt.mss_clamp = opt.opt_val; |
| 2326 | break; | 2332 | break; |
| 2327 | case TCPOPT_WINDOW: | 2333 | case TCPOPT_WINDOW: |
| 2328 | if (opt.opt_val > 14) | 2334 | { |
| 2329 | return -EFBIG; | 2335 | u16 snd_wscale = opt.opt_val & 0xFFFF; |
| 2336 | u16 rcv_wscale = opt.opt_val >> 16; | ||
| 2337 | |||
| 2338 | if (snd_wscale > 14 || rcv_wscale > 14) | ||
| 2339 | return -EFBIG; | ||
| 2330 | 2340 | ||
| 2331 | tp->rx_opt.snd_wscale = opt.opt_val; | 2341 | tp->rx_opt.snd_wscale = snd_wscale; |
| 2342 | tp->rx_opt.rcv_wscale = rcv_wscale; | ||
| 2343 | tp->rx_opt.wscale_ok = 1; | ||
| 2344 | } | ||
| 2332 | break; | 2345 | break; |
| 2333 | case TCPOPT_SACK_PERM: | 2346 | case TCPOPT_SACK_PERM: |
| 2334 | if (opt.opt_val != 0) | 2347 | if (opt.opt_val != 0) |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 85308b90df80..d377f4854cb8 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -2926,13 +2926,14 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack) | |||
| 2926 | * tcp_xmit_retransmit_queue(). | 2926 | * tcp_xmit_retransmit_queue(). |
| 2927 | */ | 2927 | */ |
| 2928 | static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | 2928 | static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, |
| 2929 | int newly_acked_sacked, bool is_dupack, | 2929 | int prior_sacked, bool is_dupack, |
| 2930 | int flag) | 2930 | int flag) |
| 2931 | { | 2931 | { |
| 2932 | struct inet_connection_sock *icsk = inet_csk(sk); | 2932 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2933 | struct tcp_sock *tp = tcp_sk(sk); | 2933 | struct tcp_sock *tp = tcp_sk(sk); |
| 2934 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && | 2934 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && |
| 2935 | (tcp_fackets_out(tp) > tp->reordering)); | 2935 | (tcp_fackets_out(tp) > tp->reordering)); |
| 2936 | int newly_acked_sacked = 0; | ||
| 2936 | int fast_rexmit = 0; | 2937 | int fast_rexmit = 0; |
| 2937 | 2938 | ||
| 2938 | if (WARN_ON(!tp->packets_out && tp->sacked_out)) | 2939 | if (WARN_ON(!tp->packets_out && tp->sacked_out)) |
| @@ -2992,6 +2993,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
| 2992 | tcp_add_reno_sack(sk); | 2993 | tcp_add_reno_sack(sk); |
| 2993 | } else | 2994 | } else |
| 2994 | do_lost = tcp_try_undo_partial(sk, pkts_acked); | 2995 | do_lost = tcp_try_undo_partial(sk, pkts_acked); |
| 2996 | newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | ||
| 2995 | break; | 2997 | break; |
| 2996 | case TCP_CA_Loss: | 2998 | case TCP_CA_Loss: |
| 2997 | if (flag & FLAG_DATA_ACKED) | 2999 | if (flag & FLAG_DATA_ACKED) |
| @@ -3013,6 +3015,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
| 3013 | if (is_dupack) | 3015 | if (is_dupack) |
| 3014 | tcp_add_reno_sack(sk); | 3016 | tcp_add_reno_sack(sk); |
| 3015 | } | 3017 | } |
| 3018 | newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | ||
| 3016 | 3019 | ||
| 3017 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) | 3020 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) |
| 3018 | tcp_try_undo_dsack(sk); | 3021 | tcp_try_undo_dsack(sk); |
| @@ -3590,7 +3593,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3590 | int prior_packets; | 3593 | int prior_packets; |
| 3591 | int prior_sacked = tp->sacked_out; | 3594 | int prior_sacked = tp->sacked_out; |
| 3592 | int pkts_acked = 0; | 3595 | int pkts_acked = 0; |
| 3593 | int newly_acked_sacked = 0; | ||
| 3594 | bool frto_cwnd = false; | 3596 | bool frto_cwnd = false; |
| 3595 | 3597 | ||
| 3596 | /* If the ack is older than previous acks | 3598 | /* If the ack is older than previous acks |
| @@ -3666,8 +3668,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3666 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); | 3668 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); |
| 3667 | 3669 | ||
| 3668 | pkts_acked = prior_packets - tp->packets_out; | 3670 | pkts_acked = prior_packets - tp->packets_out; |
| 3669 | newly_acked_sacked = (prior_packets - prior_sacked) - | ||
| 3670 | (tp->packets_out - tp->sacked_out); | ||
| 3671 | 3671 | ||
| 3672 | if (tp->frto_counter) | 3672 | if (tp->frto_counter) |
| 3673 | frto_cwnd = tcp_process_frto(sk, flag); | 3673 | frto_cwnd = tcp_process_frto(sk, flag); |
| @@ -3681,7 +3681,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3681 | tcp_may_raise_cwnd(sk, flag)) | 3681 | tcp_may_raise_cwnd(sk, flag)) |
| 3682 | tcp_cong_avoid(sk, ack, prior_in_flight); | 3682 | tcp_cong_avoid(sk, ack, prior_in_flight); |
| 3683 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); | 3683 | is_dupack = !(flag & (FLAG_SND_UNA_ADVANCED | FLAG_NOT_DUP)); |
| 3684 | tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | 3684 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3685 | is_dupack, flag); | 3685 | is_dupack, flag); |
| 3686 | } else { | 3686 | } else { |
| 3687 | if ((flag & FLAG_DATA_ACKED) && !frto_cwnd) | 3687 | if ((flag & FLAG_DATA_ACKED) && !frto_cwnd) |
| @@ -3698,7 +3698,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) | |||
| 3698 | no_queue: | 3698 | no_queue: |
| 3699 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ | 3699 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ |
| 3700 | if (flag & FLAG_DSACKING_ACK) | 3700 | if (flag & FLAG_DSACKING_ACK) |
| 3701 | tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | 3701 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3702 | is_dupack, flag); | 3702 | is_dupack, flag); |
| 3703 | /* If this ack opens up a zero window, clear backoff. It was | 3703 | /* If this ack opens up a zero window, clear backoff. It was |
| 3704 | * being used to time the probes, and is probably far higher than | 3704 | * being used to time the probes, and is probably far higher than |
| @@ -3718,8 +3718,7 @@ old_ack: | |||
| 3718 | */ | 3718 | */ |
| 3719 | if (TCP_SKB_CB(skb)->sacked) { | 3719 | if (TCP_SKB_CB(skb)->sacked) { |
| 3720 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); | 3720 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); |
| 3721 | newly_acked_sacked = tp->sacked_out - prior_sacked; | 3721 | tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, |
| 3722 | tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | ||
| 3723 | is_dupack, flag); | 3722 | is_dupack, flag); |
| 3724 | } | 3723 | } |
| 3725 | 3724 | ||
| @@ -4662,7 +4661,7 @@ queue_and_out: | |||
| 4662 | 4661 | ||
| 4663 | if (eaten > 0) | 4662 | if (eaten > 0) |
| 4664 | kfree_skb_partial(skb, fragstolen); | 4663 | kfree_skb_partial(skb, fragstolen); |
| 4665 | else if (!sock_flag(sk, SOCK_DEAD)) | 4664 | if (!sock_flag(sk, SOCK_DEAD)) |
| 4666 | sk->sk_data_ready(sk, 0); | 4665 | sk->sk_data_ready(sk, 0); |
| 4667 | return; | 4666 | return; |
| 4668 | } | 4667 | } |
| @@ -5557,8 +5556,7 @@ no_ack: | |||
| 5557 | #endif | 5556 | #endif |
| 5558 | if (eaten) | 5557 | if (eaten) |
| 5559 | kfree_skb_partial(skb, fragstolen); | 5558 | kfree_skb_partial(skb, fragstolen); |
| 5560 | else | 5559 | sk->sk_data_ready(sk, 0); |
| 5561 | sk->sk_data_ready(sk, 0); | ||
| 5562 | return 0; | 5560 | return 0; |
| 5563 | } | 5561 | } |
| 5564 | } | 5562 | } |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 6f6d1aca3c3d..2814f66dac64 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1226,6 +1226,11 @@ try_again: | |||
| 1226 | 1226 | ||
| 1227 | if (unlikely(err)) { | 1227 | if (unlikely(err)) { |
| 1228 | trace_kfree_skb(skb, udp_recvmsg); | 1228 | trace_kfree_skb(skb, udp_recvmsg); |
| 1229 | if (!peeked) { | ||
| 1230 | atomic_inc(&sk->sk_drops); | ||
| 1231 | UDP_INC_STATS_USER(sock_net(sk), | ||
| 1232 | UDP_MIB_INERRORS, is_udplite); | ||
| 1233 | } | ||
| 1229 | goto out_free; | 1234 | goto out_free; |
| 1230 | } | 1235 | } |
| 1231 | 1236 | ||
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c index 6dc7fd353ef5..282f3723ee19 100644 --- a/net/ipv6/esp6.c +++ b/net/ipv6/esp6.c | |||
| @@ -167,8 +167,6 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 167 | struct esp_data *esp = x->data; | 167 | struct esp_data *esp = x->data; |
| 168 | 168 | ||
| 169 | /* skb is pure payload to encrypt */ | 169 | /* skb is pure payload to encrypt */ |
| 170 | err = -ENOMEM; | ||
| 171 | |||
| 172 | aead = esp->aead; | 170 | aead = esp->aead; |
| 173 | alen = crypto_aead_authsize(aead); | 171 | alen = crypto_aead_authsize(aead); |
| 174 | 172 | ||
| @@ -203,8 +201,10 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) | |||
| 203 | } | 201 | } |
| 204 | 202 | ||
| 205 | tmp = esp_alloc_tmp(aead, nfrags + sglists, seqhilen); | 203 | tmp = esp_alloc_tmp(aead, nfrags + sglists, seqhilen); |
| 206 | if (!tmp) | 204 | if (!tmp) { |
| 205 | err = -ENOMEM; | ||
| 207 | goto error; | 206 | goto error; |
| 207 | } | ||
| 208 | 208 | ||
| 209 | seqhi = esp_tmp_seqhi(tmp); | 209 | seqhi = esp_tmp_seqhi(tmp); |
| 210 | iv = esp_tmp_iv(aead, tmp, seqhilen); | 210 | iv = esp_tmp_iv(aead, tmp, seqhilen); |
diff --git a/net/ipv6/inet6_connection_sock.c b/net/ipv6/inet6_connection_sock.c index 0251a6005be8..c4f934176cab 100644 --- a/net/ipv6/inet6_connection_sock.c +++ b/net/ipv6/inet6_connection_sock.c | |||
| @@ -175,33 +175,12 @@ void __inet6_csk_dst_store(struct sock *sk, struct dst_entry *dst, | |||
| 175 | const struct in6_addr *saddr) | 175 | const struct in6_addr *saddr) |
| 176 | { | 176 | { |
| 177 | __ip6_dst_store(sk, dst, daddr, saddr); | 177 | __ip6_dst_store(sk, dst, daddr, saddr); |
| 178 | |||
| 179 | #ifdef CONFIG_XFRM | ||
| 180 | { | ||
| 181 | struct rt6_info *rt = (struct rt6_info *)dst; | ||
| 182 | rt->rt6i_flow_cache_genid = atomic_read(&flow_cache_genid); | ||
| 183 | } | ||
| 184 | #endif | ||
| 185 | } | 178 | } |
| 186 | 179 | ||
| 187 | static inline | 180 | static inline |
| 188 | struct dst_entry *__inet6_csk_dst_check(struct sock *sk, u32 cookie) | 181 | struct dst_entry *__inet6_csk_dst_check(struct sock *sk, u32 cookie) |
| 189 | { | 182 | { |
| 190 | struct dst_entry *dst; | 183 | return __sk_dst_check(sk, cookie); |
| 191 | |||
| 192 | dst = __sk_dst_check(sk, cookie); | ||
| 193 | |||
| 194 | #ifdef CONFIG_XFRM | ||
| 195 | if (dst) { | ||
| 196 | struct rt6_info *rt = (struct rt6_info *)dst; | ||
| 197 | if (rt->rt6i_flow_cache_genid != atomic_read(&flow_cache_genid)) { | ||
| 198 | __sk_dst_reset(sk); | ||
| 199 | dst = NULL; | ||
| 200 | } | ||
| 201 | } | ||
| 202 | #endif | ||
| 203 | |||
| 204 | return dst; | ||
| 205 | } | 184 | } |
| 206 | 185 | ||
| 207 | static struct dst_entry *inet6_csk_route_socket(struct sock *sk, | 186 | static struct dst_entry *inet6_csk_route_socket(struct sock *sk, |
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c index 13690d650c3e..286acfc21250 100644 --- a/net/ipv6/ip6_fib.c +++ b/net/ipv6/ip6_fib.c | |||
| @@ -819,6 +819,10 @@ int fib6_add(struct fib6_node *root, struct rt6_info *rt, struct nl_info *info) | |||
| 819 | offsetof(struct rt6_info, rt6i_src), | 819 | offsetof(struct rt6_info, rt6i_src), |
| 820 | allow_create, replace_required); | 820 | allow_create, replace_required); |
| 821 | 821 | ||
| 822 | if (IS_ERR(sn)) { | ||
| 823 | err = PTR_ERR(sn); | ||
| 824 | sn = NULL; | ||
| 825 | } | ||
| 822 | if (!sn) { | 826 | if (!sn) { |
| 823 | /* If it is failed, discard just allocated | 827 | /* If it is failed, discard just allocated |
| 824 | root, and then (in st_failure) stale node | 828 | root, and then (in st_failure) stale node |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 8e80fd279100..854e4018d205 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -226,7 +226,7 @@ static struct rt6_info ip6_null_entry_template = { | |||
| 226 | .dst = { | 226 | .dst = { |
| 227 | .__refcnt = ATOMIC_INIT(1), | 227 | .__refcnt = ATOMIC_INIT(1), |
| 228 | .__use = 1, | 228 | .__use = 1, |
| 229 | .obsolete = -1, | 229 | .obsolete = DST_OBSOLETE_FORCE_CHK, |
| 230 | .error = -ENETUNREACH, | 230 | .error = -ENETUNREACH, |
| 231 | .input = ip6_pkt_discard, | 231 | .input = ip6_pkt_discard, |
| 232 | .output = ip6_pkt_discard_out, | 232 | .output = ip6_pkt_discard_out, |
| @@ -246,7 +246,7 @@ static struct rt6_info ip6_prohibit_entry_template = { | |||
| 246 | .dst = { | 246 | .dst = { |
| 247 | .__refcnt = ATOMIC_INIT(1), | 247 | .__refcnt = ATOMIC_INIT(1), |
| 248 | .__use = 1, | 248 | .__use = 1, |
| 249 | .obsolete = -1, | 249 | .obsolete = DST_OBSOLETE_FORCE_CHK, |
| 250 | .error = -EACCES, | 250 | .error = -EACCES, |
| 251 | .input = ip6_pkt_prohibit, | 251 | .input = ip6_pkt_prohibit, |
| 252 | .output = ip6_pkt_prohibit_out, | 252 | .output = ip6_pkt_prohibit_out, |
| @@ -261,7 +261,7 @@ static struct rt6_info ip6_blk_hole_entry_template = { | |||
| 261 | .dst = { | 261 | .dst = { |
| 262 | .__refcnt = ATOMIC_INIT(1), | 262 | .__refcnt = ATOMIC_INIT(1), |
| 263 | .__use = 1, | 263 | .__use = 1, |
| 264 | .obsolete = -1, | 264 | .obsolete = DST_OBSOLETE_FORCE_CHK, |
| 265 | .error = -EINVAL, | 265 | .error = -EINVAL, |
| 266 | .input = dst_discard, | 266 | .input = dst_discard, |
| 267 | .output = dst_discard, | 267 | .output = dst_discard, |
| @@ -281,13 +281,14 @@ static inline struct rt6_info *ip6_dst_alloc(struct net *net, | |||
| 281 | struct fib6_table *table) | 281 | struct fib6_table *table) |
| 282 | { | 282 | { |
| 283 | struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev, | 283 | struct rt6_info *rt = dst_alloc(&net->ipv6.ip6_dst_ops, dev, |
| 284 | 0, DST_OBSOLETE_NONE, flags); | 284 | 0, DST_OBSOLETE_FORCE_CHK, flags); |
| 285 | 285 | ||
| 286 | if (rt) { | 286 | if (rt) { |
| 287 | struct dst_entry *dst = &rt->dst; | 287 | struct dst_entry *dst = &rt->dst; |
| 288 | 288 | ||
| 289 | memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst)); | 289 | memset(dst + 1, 0, sizeof(*rt) - sizeof(*dst)); |
| 290 | rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers); | 290 | rt6_init_peer(rt, table ? &table->tb6_peers : net->ipv6.peers); |
| 291 | rt->rt6i_genid = rt_genid(net); | ||
| 291 | } | 292 | } |
| 292 | return rt; | 293 | return rt; |
| 293 | } | 294 | } |
| @@ -1031,6 +1032,13 @@ static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie) | |||
| 1031 | 1032 | ||
| 1032 | rt = (struct rt6_info *) dst; | 1033 | rt = (struct rt6_info *) dst; |
| 1033 | 1034 | ||
| 1035 | /* All IPV6 dsts are created with ->obsolete set to the value | ||
| 1036 | * DST_OBSOLETE_FORCE_CHK which forces validation calls down | ||
| 1037 | * into this function always. | ||
| 1038 | */ | ||
| 1039 | if (rt->rt6i_genid != rt_genid(dev_net(rt->dst.dev))) | ||
| 1040 | return NULL; | ||
| 1041 | |||
| 1034 | if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) { | 1042 | if (rt->rt6i_node && (rt->rt6i_node->fn_sernum == cookie)) { |
| 1035 | if (rt->rt6i_peer_genid != rt6_peer_genid()) { | 1043 | if (rt->rt6i_peer_genid != rt6_peer_genid()) { |
| 1036 | if (!rt6_has_peer(rt)) | 1044 | if (!rt6_has_peer(rt)) |
| @@ -1397,8 +1405,6 @@ int ip6_route_add(struct fib6_config *cfg) | |||
| 1397 | goto out; | 1405 | goto out; |
| 1398 | } | 1406 | } |
| 1399 | 1407 | ||
| 1400 | rt->dst.obsolete = -1; | ||
| 1401 | |||
| 1402 | if (cfg->fc_flags & RTF_EXPIRES) | 1408 | if (cfg->fc_flags & RTF_EXPIRES) |
| 1403 | rt6_set_expires(rt, jiffies + | 1409 | rt6_set_expires(rt, jiffies + |
| 1404 | clock_t_to_jiffies(cfg->fc_expires)); | 1410 | clock_t_to_jiffies(cfg->fc_expires)); |
| @@ -2080,7 +2086,6 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
| 2080 | rt->dst.input = ip6_input; | 2086 | rt->dst.input = ip6_input; |
| 2081 | rt->dst.output = ip6_output; | 2087 | rt->dst.output = ip6_output; |
| 2082 | rt->rt6i_idev = idev; | 2088 | rt->rt6i_idev = idev; |
| 2083 | rt->dst.obsolete = -1; | ||
| 2084 | 2089 | ||
| 2085 | rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; | 2090 | rt->rt6i_flags = RTF_UP | RTF_NONEXTHOP; |
| 2086 | if (anycast) | 2091 | if (anycast) |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index a3e60cc04a8a..acd32e3f1b68 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -403,8 +403,9 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt, | |||
| 403 | tp->mtu_info = ntohl(info); | 403 | tp->mtu_info = ntohl(info); |
| 404 | if (!sock_owned_by_user(sk)) | 404 | if (!sock_owned_by_user(sk)) |
| 405 | tcp_v6_mtu_reduced(sk); | 405 | tcp_v6_mtu_reduced(sk); |
| 406 | else | 406 | else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, |
| 407 | set_bit(TCP_MTU_REDUCED_DEFERRED, &tp->tsq_flags); | 407 | &tp->tsq_flags)) |
| 408 | sock_hold(sk); | ||
| 408 | goto out; | 409 | goto out; |
| 409 | } | 410 | } |
| 410 | 411 | ||
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 99d0077b56b8..07e2bfef6845 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
| @@ -394,6 +394,17 @@ try_again: | |||
| 394 | } | 394 | } |
| 395 | if (unlikely(err)) { | 395 | if (unlikely(err)) { |
| 396 | trace_kfree_skb(skb, udpv6_recvmsg); | 396 | trace_kfree_skb(skb, udpv6_recvmsg); |
| 397 | if (!peeked) { | ||
| 398 | atomic_inc(&sk->sk_drops); | ||
| 399 | if (is_udp4) | ||
| 400 | UDP_INC_STATS_USER(sock_net(sk), | ||
| 401 | UDP_MIB_INERRORS, | ||
| 402 | is_udplite); | ||
| 403 | else | ||
| 404 | UDP6_INC_STATS_USER(sock_net(sk), | ||
| 405 | UDP_MIB_INERRORS, | ||
| 406 | is_udplite); | ||
| 407 | } | ||
| 397 | goto out_free; | 408 | goto out_free; |
| 398 | } | 409 | } |
| 399 | if (!peeked) { | 410 | if (!peeked) { |
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index 393355d37b47..1a9f3723c13c 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c | |||
| @@ -1347,11 +1347,10 @@ static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel) | |||
| 1347 | /* Remove from tunnel list */ | 1347 | /* Remove from tunnel list */ |
| 1348 | spin_lock_bh(&pn->l2tp_tunnel_list_lock); | 1348 | spin_lock_bh(&pn->l2tp_tunnel_list_lock); |
| 1349 | list_del_rcu(&tunnel->list); | 1349 | list_del_rcu(&tunnel->list); |
| 1350 | kfree_rcu(tunnel, rcu); | ||
| 1350 | spin_unlock_bh(&pn->l2tp_tunnel_list_lock); | 1351 | spin_unlock_bh(&pn->l2tp_tunnel_list_lock); |
| 1351 | synchronize_rcu(); | ||
| 1352 | 1352 | ||
| 1353 | atomic_dec(&l2tp_tunnel_count); | 1353 | atomic_dec(&l2tp_tunnel_count); |
| 1354 | kfree(tunnel); | ||
| 1355 | } | 1354 | } |
| 1356 | 1355 | ||
| 1357 | /* Create a socket for the tunnel, if one isn't set up by | 1356 | /* Create a socket for the tunnel, if one isn't set up by |
| @@ -1502,6 +1501,8 @@ out: | |||
| 1502 | return err; | 1501 | return err; |
| 1503 | } | 1502 | } |
| 1504 | 1503 | ||
| 1504 | static struct lock_class_key l2tp_socket_class; | ||
| 1505 | |||
| 1505 | int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg, struct l2tp_tunnel **tunnelp) | 1506 | int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg, struct l2tp_tunnel **tunnelp) |
| 1506 | { | 1507 | { |
| 1507 | struct l2tp_tunnel *tunnel = NULL; | 1508 | struct l2tp_tunnel *tunnel = NULL; |
| @@ -1606,6 +1607,8 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 | |||
| 1606 | tunnel->old_sk_destruct = sk->sk_destruct; | 1607 | tunnel->old_sk_destruct = sk->sk_destruct; |
| 1607 | sk->sk_destruct = &l2tp_tunnel_destruct; | 1608 | sk->sk_destruct = &l2tp_tunnel_destruct; |
| 1608 | tunnel->sock = sk; | 1609 | tunnel->sock = sk; |
| 1610 | lockdep_set_class_and_name(&sk->sk_lock.slock, &l2tp_socket_class, "l2tp_sock"); | ||
| 1611 | |||
| 1609 | sk->sk_allocation = GFP_ATOMIC; | 1612 | sk->sk_allocation = GFP_ATOMIC; |
| 1610 | 1613 | ||
| 1611 | /* Add tunnel to our list */ | 1614 | /* Add tunnel to our list */ |
diff --git a/net/l2tp/l2tp_core.h b/net/l2tp/l2tp_core.h index a38ec6cdeee1..56d583e083a7 100644 --- a/net/l2tp/l2tp_core.h +++ b/net/l2tp/l2tp_core.h | |||
| @@ -163,6 +163,7 @@ struct l2tp_tunnel_cfg { | |||
| 163 | 163 | ||
| 164 | struct l2tp_tunnel { | 164 | struct l2tp_tunnel { |
| 165 | int magic; /* Should be L2TP_TUNNEL_MAGIC */ | 165 | int magic; /* Should be L2TP_TUNNEL_MAGIC */ |
| 166 | struct rcu_head rcu; | ||
| 166 | rwlock_t hlist_lock; /* protect session_hlist */ | 167 | rwlock_t hlist_lock; /* protect session_hlist */ |
| 167 | struct hlist_head session_hlist[L2TP_HASH_SIZE]; | 168 | struct hlist_head session_hlist[L2TP_HASH_SIZE]; |
| 168 | /* hashed list of sessions, | 169 | /* hashed list of sessions, |
diff --git a/net/l2tp/l2tp_eth.c b/net/l2tp/l2tp_eth.c index f9ee74deeac2..3bfb34aaee29 100644 --- a/net/l2tp/l2tp_eth.c +++ b/net/l2tp/l2tp_eth.c | |||
| @@ -153,7 +153,7 @@ static void l2tp_eth_dev_recv(struct l2tp_session *session, struct sk_buff *skb, | |||
| 153 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, skb->data, length); | 153 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, skb->data, length); |
| 154 | } | 154 | } |
| 155 | 155 | ||
| 156 | if (!pskb_may_pull(skb, sizeof(ETH_HLEN))) | 156 | if (!pskb_may_pull(skb, ETH_HLEN)) |
| 157 | goto error; | 157 | goto error; |
| 158 | 158 | ||
| 159 | secpath_reset(skb); | 159 | secpath_reset(skb); |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index d41974aacf51..a58c0b649ba1 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
| @@ -1378,6 +1378,8 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop, | |||
| 1378 | else | 1378 | else |
| 1379 | memset(next_hop, 0, ETH_ALEN); | 1379 | memset(next_hop, 0, ETH_ALEN); |
| 1380 | 1380 | ||
| 1381 | memset(pinfo, 0, sizeof(*pinfo)); | ||
| 1382 | |||
| 1381 | pinfo->generation = mesh_paths_generation; | 1383 | pinfo->generation = mesh_paths_generation; |
| 1382 | 1384 | ||
| 1383 | pinfo->filled = MPATH_INFO_FRAME_QLEN | | 1385 | pinfo->filled = MPATH_INFO_FRAME_QLEN | |
| @@ -1396,7 +1398,6 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop, | |||
| 1396 | pinfo->discovery_timeout = | 1398 | pinfo->discovery_timeout = |
| 1397 | jiffies_to_msecs(mpath->discovery_timeout); | 1399 | jiffies_to_msecs(mpath->discovery_timeout); |
| 1398 | pinfo->discovery_retries = mpath->discovery_retries; | 1400 | pinfo->discovery_retries = mpath->discovery_retries; |
| 1399 | pinfo->flags = 0; | ||
| 1400 | if (mpath->flags & MESH_PATH_ACTIVE) | 1401 | if (mpath->flags & MESH_PATH_ACTIVE) |
| 1401 | pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE; | 1402 | pinfo->flags |= NL80211_MPATH_FLAG_ACTIVE; |
| 1402 | if (mpath->flags & MESH_PATH_RESOLVING) | 1403 | if (mpath->flags & MESH_PATH_RESOLVING) |
| @@ -1405,10 +1406,8 @@ static void mpath_set_pinfo(struct mesh_path *mpath, u8 *next_hop, | |||
| 1405 | pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID; | 1406 | pinfo->flags |= NL80211_MPATH_FLAG_SN_VALID; |
| 1406 | if (mpath->flags & MESH_PATH_FIXED) | 1407 | if (mpath->flags & MESH_PATH_FIXED) |
| 1407 | pinfo->flags |= NL80211_MPATH_FLAG_FIXED; | 1408 | pinfo->flags |= NL80211_MPATH_FLAG_FIXED; |
| 1408 | if (mpath->flags & MESH_PATH_RESOLVING) | 1409 | if (mpath->flags & MESH_PATH_RESOLVED) |
| 1409 | pinfo->flags |= NL80211_MPATH_FLAG_RESOLVING; | 1410 | pinfo->flags |= NL80211_MPATH_FLAG_RESOLVED; |
| 1410 | |||
| 1411 | pinfo->flags = mpath->flags; | ||
| 1412 | } | 1411 | } |
| 1413 | 1412 | ||
| 1414 | static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev, | 1413 | static int ieee80211_get_mpath(struct wiphy *wiphy, struct net_device *dev, |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index a4a5acdbaa4d..f76b83341cf9 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
| @@ -3248,6 +3248,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, | |||
| 3248 | goto out_unlock; | 3248 | goto out_unlock; |
| 3249 | 3249 | ||
| 3250 | err_clear: | 3250 | err_clear: |
| 3251 | memset(ifmgd->bssid, 0, ETH_ALEN); | ||
| 3252 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); | ||
| 3251 | ifmgd->auth_data = NULL; | 3253 | ifmgd->auth_data = NULL; |
| 3252 | err_free: | 3254 | err_free: |
| 3253 | kfree(auth_data); | 3255 | kfree(auth_data); |
| @@ -3439,6 +3441,8 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, | |||
| 3439 | err = 0; | 3441 | err = 0; |
| 3440 | goto out; | 3442 | goto out; |
| 3441 | err_clear: | 3443 | err_clear: |
| 3444 | memset(ifmgd->bssid, 0, ETH_ALEN); | ||
| 3445 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID); | ||
| 3442 | ifmgd->assoc_data = NULL; | 3446 | ifmgd->assoc_data = NULL; |
| 3443 | err_free: | 3447 | err_free: |
| 3444 | kfree(assoc_data); | 3448 | kfree(assoc_data); |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index acf712ffb5e6..c5e8c9c31f76 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -1811,37 +1811,31 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
| 1811 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, | 1811 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, |
| 1812 | sdata, NULL, NULL); | 1812 | sdata, NULL, NULL); |
| 1813 | } else { | 1813 | } else { |
| 1814 | int is_mesh_mcast = 1; | 1814 | /* DS -> MBSS (802.11-2012 13.11.3.3). |
| 1815 | const u8 *mesh_da; | 1815 | * For unicast with unknown forwarding information, |
| 1816 | * destination might be in the MBSS or if that fails | ||
| 1817 | * forwarded to another mesh gate. In either case | ||
| 1818 | * resolution will be handled in ieee80211_xmit(), so | ||
| 1819 | * leave the original DA. This also works for mcast */ | ||
| 1820 | const u8 *mesh_da = skb->data; | ||
| 1821 | |||
| 1822 | if (mppath) | ||
| 1823 | mesh_da = mppath->mpp; | ||
| 1824 | else if (mpath) | ||
| 1825 | mesh_da = mpath->dst; | ||
| 1826 | rcu_read_unlock(); | ||
| 1816 | 1827 | ||
| 1817 | if (is_multicast_ether_addr(skb->data)) | ||
| 1818 | /* DA TA mSA AE:SA */ | ||
| 1819 | mesh_da = skb->data; | ||
| 1820 | else { | ||
| 1821 | static const u8 bcast[ETH_ALEN] = | ||
| 1822 | { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; | ||
| 1823 | if (mppath) { | ||
| 1824 | /* RA TA mDA mSA AE:DA SA */ | ||
| 1825 | mesh_da = mppath->mpp; | ||
| 1826 | is_mesh_mcast = 0; | ||
| 1827 | } else if (mpath) { | ||
| 1828 | mesh_da = mpath->dst; | ||
| 1829 | is_mesh_mcast = 0; | ||
| 1830 | } else { | ||
| 1831 | /* DA TA mSA AE:SA */ | ||
| 1832 | mesh_da = bcast; | ||
| 1833 | } | ||
| 1834 | } | ||
| 1835 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, | 1828 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, |
| 1836 | mesh_da, sdata->vif.addr); | 1829 | mesh_da, sdata->vif.addr); |
| 1837 | rcu_read_unlock(); | 1830 | if (is_multicast_ether_addr(mesh_da)) |
| 1838 | if (is_mesh_mcast) | 1831 | /* DA TA mSA AE:SA */ |
| 1839 | meshhdrlen = | 1832 | meshhdrlen = |
| 1840 | ieee80211_new_mesh_header(&mesh_hdr, | 1833 | ieee80211_new_mesh_header(&mesh_hdr, |
| 1841 | sdata, | 1834 | sdata, |
| 1842 | skb->data + ETH_ALEN, | 1835 | skb->data + ETH_ALEN, |
| 1843 | NULL); | 1836 | NULL); |
| 1844 | else | 1837 | else |
| 1838 | /* RA TA mDA mSA AE:DA SA */ | ||
| 1845 | meshhdrlen = | 1839 | meshhdrlen = |
| 1846 | ieee80211_new_mesh_header(&mesh_hdr, | 1840 | ieee80211_new_mesh_header(&mesh_hdr, |
| 1847 | sdata, | 1841 | sdata, |
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c index 72bf32a84874..f51013c07b9f 100644 --- a/net/netfilter/ipvs/ip_vs_ctl.c +++ b/net/netfilter/ipvs/ip_vs_ctl.c | |||
| @@ -1171,8 +1171,10 @@ ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u, | |||
| 1171 | goto out_err; | 1171 | goto out_err; |
| 1172 | } | 1172 | } |
| 1173 | svc->stats.cpustats = alloc_percpu(struct ip_vs_cpu_stats); | 1173 | svc->stats.cpustats = alloc_percpu(struct ip_vs_cpu_stats); |
| 1174 | if (!svc->stats.cpustats) | 1174 | if (!svc->stats.cpustats) { |
| 1175 | ret = -ENOMEM; | ||
| 1175 | goto out_err; | 1176 | goto out_err; |
| 1177 | } | ||
| 1176 | 1178 | ||
| 1177 | /* I'm the first user of the service */ | 1179 | /* I'm the first user of the service */ |
| 1178 | atomic_set(&svc->usecnt, 0); | 1180 | atomic_set(&svc->usecnt, 0); |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index cf4875565d67..2ceec64b19f9 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
| @@ -249,12 +249,15 @@ static void death_by_event(unsigned long ul_conntrack) | |||
| 249 | { | 249 | { |
| 250 | struct nf_conn *ct = (void *)ul_conntrack; | 250 | struct nf_conn *ct = (void *)ul_conntrack; |
| 251 | struct net *net = nf_ct_net(ct); | 251 | struct net *net = nf_ct_net(ct); |
| 252 | struct nf_conntrack_ecache *ecache = nf_ct_ecache_find(ct); | ||
| 253 | |||
| 254 | BUG_ON(ecache == NULL); | ||
| 252 | 255 | ||
| 253 | if (nf_conntrack_event(IPCT_DESTROY, ct) < 0) { | 256 | if (nf_conntrack_event(IPCT_DESTROY, ct) < 0) { |
| 254 | /* bad luck, let's retry again */ | 257 | /* bad luck, let's retry again */ |
| 255 | ct->timeout.expires = jiffies + | 258 | ecache->timeout.expires = jiffies + |
| 256 | (random32() % net->ct.sysctl_events_retry_timeout); | 259 | (random32() % net->ct.sysctl_events_retry_timeout); |
| 257 | add_timer(&ct->timeout); | 260 | add_timer(&ecache->timeout); |
| 258 | return; | 261 | return; |
| 259 | } | 262 | } |
| 260 | /* we've got the event delivered, now it's dying */ | 263 | /* we've got the event delivered, now it's dying */ |
| @@ -268,6 +271,9 @@ static void death_by_event(unsigned long ul_conntrack) | |||
| 268 | void nf_ct_insert_dying_list(struct nf_conn *ct) | 271 | void nf_ct_insert_dying_list(struct nf_conn *ct) |
| 269 | { | 272 | { |
| 270 | struct net *net = nf_ct_net(ct); | 273 | struct net *net = nf_ct_net(ct); |
| 274 | struct nf_conntrack_ecache *ecache = nf_ct_ecache_find(ct); | ||
| 275 | |||
| 276 | BUG_ON(ecache == NULL); | ||
| 271 | 277 | ||
| 272 | /* add this conntrack to the dying list */ | 278 | /* add this conntrack to the dying list */ |
| 273 | spin_lock_bh(&nf_conntrack_lock); | 279 | spin_lock_bh(&nf_conntrack_lock); |
| @@ -275,10 +281,10 @@ void nf_ct_insert_dying_list(struct nf_conn *ct) | |||
| 275 | &net->ct.dying); | 281 | &net->ct.dying); |
| 276 | spin_unlock_bh(&nf_conntrack_lock); | 282 | spin_unlock_bh(&nf_conntrack_lock); |
| 277 | /* set a new timer to retry event delivery */ | 283 | /* set a new timer to retry event delivery */ |
| 278 | setup_timer(&ct->timeout, death_by_event, (unsigned long)ct); | 284 | setup_timer(&ecache->timeout, death_by_event, (unsigned long)ct); |
| 279 | ct->timeout.expires = jiffies + | 285 | ecache->timeout.expires = jiffies + |
| 280 | (random32() % net->ct.sysctl_events_retry_timeout); | 286 | (random32() % net->ct.sysctl_events_retry_timeout); |
| 281 | add_timer(&ct->timeout); | 287 | add_timer(&ecache->timeout); |
| 282 | } | 288 | } |
| 283 | EXPORT_SYMBOL_GPL(nf_ct_insert_dying_list); | 289 | EXPORT_SYMBOL_GPL(nf_ct_insert_dying_list); |
| 284 | 290 | ||
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c index da4fc37a8578..9807f3278fcb 100644 --- a/net/netfilter/nf_conntrack_netlink.c +++ b/net/netfilter/nf_conntrack_netlink.c | |||
| @@ -2790,7 +2790,8 @@ static int __init ctnetlink_init(void) | |||
| 2790 | goto err_unreg_subsys; | 2790 | goto err_unreg_subsys; |
| 2791 | } | 2791 | } |
| 2792 | 2792 | ||
| 2793 | if (register_pernet_subsys(&ctnetlink_net_ops)) { | 2793 | ret = register_pernet_subsys(&ctnetlink_net_ops); |
| 2794 | if (ret < 0) { | ||
| 2794 | pr_err("ctnetlink_init: cannot register pernet operations\n"); | 2795 | pr_err("ctnetlink_init: cannot register pernet operations\n"); |
| 2795 | goto err_unreg_exp_subsys; | 2796 | goto err_unreg_exp_subsys; |
| 2796 | } | 2797 | } |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index a5ac11ebef33..e046b3756aab 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
| @@ -158,21 +158,18 @@ static const u8 tcp_conntracks[2][6][TCP_CONNTRACK_MAX] = { | |||
| 158 | * sCL -> sSS | 158 | * sCL -> sSS |
| 159 | */ | 159 | */ |
| 160 | /* sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2 */ | 160 | /* sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2 */ |
| 161 | /*synack*/ { sIV, sIV, sIG, sIG, sIG, sIG, sIG, sIG, sIG, sSR }, | 161 | /*synack*/ { sIV, sIV, sSR, sIV, sIV, sIV, sIV, sIV, sIV, sSR }, |
| 162 | /* | 162 | /* |
| 163 | * sNO -> sIV Too late and no reason to do anything | 163 | * sNO -> sIV Too late and no reason to do anything |
| 164 | * sSS -> sIV Client can't send SYN and then SYN/ACK | 164 | * sSS -> sIV Client can't send SYN and then SYN/ACK |
| 165 | * sS2 -> sSR SYN/ACK sent to SYN2 in simultaneous open | 165 | * sS2 -> sSR SYN/ACK sent to SYN2 in simultaneous open |
| 166 | * sSR -> sIG | 166 | * sSR -> sSR Late retransmitted SYN/ACK in simultaneous open |
| 167 | * sES -> sIG Error: SYNs in window outside the SYN_SENT state | 167 | * sES -> sIV Invalid SYN/ACK packets sent by the client |
| 168 | * are errors. Receiver will reply with RST | 168 | * sFW -> sIV |
| 169 | * and close the connection. | 169 | * sCW -> sIV |
| 170 | * Or we are not in sync and hold a dead connection. | 170 | * sLA -> sIV |
| 171 | * sFW -> sIG | 171 | * sTW -> sIV |
| 172 | * sCW -> sIG | 172 | * sCL -> sIV |
| 173 | * sLA -> sIG | ||
| 174 | * sTW -> sIG | ||
| 175 | * sCL -> sIG | ||
| 176 | */ | 173 | */ |
| 177 | /* sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2 */ | 174 | /* sNO, sSS, sSR, sES, sFW, sCW, sLA, sTW, sCL, sS2 */ |
| 178 | /*fin*/ { sIV, sIV, sFW, sFW, sLA, sLA, sLA, sTW, sCL, sIV }, | 175 | /*fin*/ { sIV, sIV, sFW, sFW, sLA, sLA, sLA, sTW, sCL, sIV }, |
| @@ -633,15 +630,9 @@ static bool tcp_in_window(const struct nf_conn *ct, | |||
| 633 | ack = sack = receiver->td_end; | 630 | ack = sack = receiver->td_end; |
| 634 | } | 631 | } |
| 635 | 632 | ||
| 636 | if (seq == end | 633 | if (tcph->rst && seq == 0 && state->state == TCP_CONNTRACK_SYN_SENT) |
| 637 | && (!tcph->rst | ||
| 638 | || (seq == 0 && state->state == TCP_CONNTRACK_SYN_SENT))) | ||
| 639 | /* | 634 | /* |
| 640 | * Packets contains no data: we assume it is valid | 635 | * RST sent answering SYN. |
| 641 | * and check the ack value only. | ||
| 642 | * However RST segments are always validated by their | ||
| 643 | * SEQ number, except when seq == 0 (reset sent answering | ||
| 644 | * SYN. | ||
| 645 | */ | 636 | */ |
| 646 | seq = end = sender->td_end; | 637 | seq = end = sender->td_end; |
| 647 | 638 | ||
diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c index 169ab59ed9d4..5cfb5bedb2b8 100644 --- a/net/netfilter/nfnetlink_log.c +++ b/net/netfilter/nfnetlink_log.c | |||
| @@ -381,6 +381,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
| 381 | struct nlmsghdr *nlh; | 381 | struct nlmsghdr *nlh; |
| 382 | struct nfgenmsg *nfmsg; | 382 | struct nfgenmsg *nfmsg; |
| 383 | sk_buff_data_t old_tail = inst->skb->tail; | 383 | sk_buff_data_t old_tail = inst->skb->tail; |
| 384 | struct sock *sk; | ||
| 384 | 385 | ||
| 385 | nlh = nlmsg_put(inst->skb, 0, 0, | 386 | nlh = nlmsg_put(inst->skb, 0, 0, |
| 386 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, | 387 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, |
| @@ -480,7 +481,7 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
| 480 | } | 481 | } |
| 481 | 482 | ||
| 482 | if (indev && skb_mac_header_was_set(skb)) { | 483 | if (indev && skb_mac_header_was_set(skb)) { |
| 483 | if (nla_put_be32(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || | 484 | if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || |
| 484 | nla_put_be16(inst->skb, NFULA_HWLEN, | 485 | nla_put_be16(inst->skb, NFULA_HWLEN, |
| 485 | htons(skb->dev->hard_header_len)) || | 486 | htons(skb->dev->hard_header_len)) || |
| 486 | nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len, | 487 | nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len, |
| @@ -499,18 +500,19 @@ __build_packet_message(struct nfulnl_instance *inst, | |||
| 499 | } | 500 | } |
| 500 | 501 | ||
| 501 | /* UID */ | 502 | /* UID */ |
| 502 | if (skb->sk) { | 503 | sk = skb->sk; |
| 503 | read_lock_bh(&skb->sk->sk_callback_lock); | 504 | if (sk && sk->sk_state != TCP_TIME_WAIT) { |
| 504 | if (skb->sk->sk_socket && skb->sk->sk_socket->file) { | 505 | read_lock_bh(&sk->sk_callback_lock); |
| 505 | struct file *file = skb->sk->sk_socket->file; | 506 | if (sk->sk_socket && sk->sk_socket->file) { |
| 507 | struct file *file = sk->sk_socket->file; | ||
| 506 | __be32 uid = htonl(file->f_cred->fsuid); | 508 | __be32 uid = htonl(file->f_cred->fsuid); |
| 507 | __be32 gid = htonl(file->f_cred->fsgid); | 509 | __be32 gid = htonl(file->f_cred->fsgid); |
| 508 | read_unlock_bh(&skb->sk->sk_callback_lock); | 510 | read_unlock_bh(&sk->sk_callback_lock); |
| 509 | if (nla_put_be32(inst->skb, NFULA_UID, uid) || | 511 | if (nla_put_be32(inst->skb, NFULA_UID, uid) || |
| 510 | nla_put_be32(inst->skb, NFULA_GID, gid)) | 512 | nla_put_be32(inst->skb, NFULA_GID, gid)) |
| 511 | goto nla_put_failure; | 513 | goto nla_put_failure; |
| 512 | } else | 514 | } else |
| 513 | read_unlock_bh(&skb->sk->sk_callback_lock); | 515 | read_unlock_bh(&sk->sk_callback_lock); |
| 514 | } | 516 | } |
| 515 | 517 | ||
| 516 | /* local sequence number */ | 518 | /* local sequence number */ |
| @@ -996,8 +998,10 @@ static int __init nfnetlink_log_init(void) | |||
| 996 | 998 | ||
| 997 | #ifdef CONFIG_PROC_FS | 999 | #ifdef CONFIG_PROC_FS |
| 998 | if (!proc_create("nfnetlink_log", 0440, | 1000 | if (!proc_create("nfnetlink_log", 0440, |
| 999 | proc_net_netfilter, &nful_file_ops)) | 1001 | proc_net_netfilter, &nful_file_ops)) { |
| 1002 | status = -ENOMEM; | ||
| 1000 | goto cleanup_logger; | 1003 | goto cleanup_logger; |
| 1004 | } | ||
| 1001 | #endif | 1005 | #endif |
| 1002 | return status; | 1006 | return status; |
| 1003 | 1007 | ||
diff --git a/net/netfilter/xt_LOG.c b/net/netfilter/xt_LOG.c index ff5f75fddb15..91e9af4d1f42 100644 --- a/net/netfilter/xt_LOG.c +++ b/net/netfilter/xt_LOG.c | |||
| @@ -145,6 +145,19 @@ static int dump_tcp_header(struct sbuff *m, const struct sk_buff *skb, | |||
| 145 | return 0; | 145 | return 0; |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | static void dump_sk_uid_gid(struct sbuff *m, struct sock *sk) | ||
| 149 | { | ||
| 150 | if (!sk || sk->sk_state == TCP_TIME_WAIT) | ||
| 151 | return; | ||
| 152 | |||
| 153 | read_lock_bh(&sk->sk_callback_lock); | ||
| 154 | if (sk->sk_socket && sk->sk_socket->file) | ||
| 155 | sb_add(m, "UID=%u GID=%u ", | ||
| 156 | sk->sk_socket->file->f_cred->fsuid, | ||
| 157 | sk->sk_socket->file->f_cred->fsgid); | ||
| 158 | read_unlock_bh(&sk->sk_callback_lock); | ||
| 159 | } | ||
| 160 | |||
| 148 | /* One level of recursion won't kill us */ | 161 | /* One level of recursion won't kill us */ |
| 149 | static void dump_ipv4_packet(struct sbuff *m, | 162 | static void dump_ipv4_packet(struct sbuff *m, |
| 150 | const struct nf_loginfo *info, | 163 | const struct nf_loginfo *info, |
| @@ -361,14 +374,8 @@ static void dump_ipv4_packet(struct sbuff *m, | |||
| 361 | } | 374 | } |
| 362 | 375 | ||
| 363 | /* Max length: 15 "UID=4294967295 " */ | 376 | /* Max length: 15 "UID=4294967295 " */ |
| 364 | if ((logflags & XT_LOG_UID) && !iphoff && skb->sk) { | 377 | if ((logflags & XT_LOG_UID) && !iphoff) |
| 365 | read_lock_bh(&skb->sk->sk_callback_lock); | 378 | dump_sk_uid_gid(m, skb->sk); |
| 366 | if (skb->sk->sk_socket && skb->sk->sk_socket->file) | ||
| 367 | sb_add(m, "UID=%u GID=%u ", | ||
| 368 | skb->sk->sk_socket->file->f_cred->fsuid, | ||
| 369 | skb->sk->sk_socket->file->f_cred->fsgid); | ||
| 370 | read_unlock_bh(&skb->sk->sk_callback_lock); | ||
| 371 | } | ||
| 372 | 379 | ||
| 373 | /* Max length: 16 "MARK=0xFFFFFFFF " */ | 380 | /* Max length: 16 "MARK=0xFFFFFFFF " */ |
| 374 | if (!iphoff && skb->mark) | 381 | if (!iphoff && skb->mark) |
| @@ -436,8 +443,8 @@ log_packet_common(struct sbuff *m, | |||
| 436 | const struct nf_loginfo *loginfo, | 443 | const struct nf_loginfo *loginfo, |
| 437 | const char *prefix) | 444 | const char *prefix) |
| 438 | { | 445 | { |
| 439 | sb_add(m, "<%d>%sIN=%s OUT=%s ", loginfo->u.log.level, | 446 | sb_add(m, KERN_SOH "%c%sIN=%s OUT=%s ", |
| 440 | prefix, | 447 | '0' + loginfo->u.log.level, prefix, |
| 441 | in ? in->name : "", | 448 | in ? in->name : "", |
| 442 | out ? out->name : ""); | 449 | out ? out->name : ""); |
| 443 | #ifdef CONFIG_BRIDGE_NETFILTER | 450 | #ifdef CONFIG_BRIDGE_NETFILTER |
| @@ -717,14 +724,8 @@ static void dump_ipv6_packet(struct sbuff *m, | |||
| 717 | } | 724 | } |
| 718 | 725 | ||
| 719 | /* Max length: 15 "UID=4294967295 " */ | 726 | /* Max length: 15 "UID=4294967295 " */ |
| 720 | if ((logflags & XT_LOG_UID) && recurse && skb->sk) { | 727 | if ((logflags & XT_LOG_UID) && recurse) |
| 721 | read_lock_bh(&skb->sk->sk_callback_lock); | 728 | dump_sk_uid_gid(m, skb->sk); |
| 722 | if (skb->sk->sk_socket && skb->sk->sk_socket->file) | ||
| 723 | sb_add(m, "UID=%u GID=%u ", | ||
| 724 | skb->sk->sk_socket->file->f_cred->fsuid, | ||
| 725 | skb->sk->sk_socket->file->f_cred->fsgid); | ||
| 726 | read_unlock_bh(&skb->sk->sk_callback_lock); | ||
| 727 | } | ||
| 728 | 729 | ||
| 729 | /* Max length: 16 "MARK=0xFFFFFFFF " */ | 730 | /* Max length: 16 "MARK=0xFFFFFFFF " */ |
| 730 | if (!recurse && skb->mark) | 731 | if (!recurse && skb->mark) |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 1445d73533ed..527023823b5c 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -1373,7 +1373,8 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
| 1373 | dst_pid = addr->nl_pid; | 1373 | dst_pid = addr->nl_pid; |
| 1374 | dst_group = ffs(addr->nl_groups); | 1374 | dst_group = ffs(addr->nl_groups); |
| 1375 | err = -EPERM; | 1375 | err = -EPERM; |
| 1376 | if (dst_group && !netlink_capable(sock, NL_NONROOT_SEND)) | 1376 | if ((dst_group || dst_pid) && |
| 1377 | !netlink_capable(sock, NL_NONROOT_SEND)) | ||
| 1377 | goto out; | 1378 | goto out; |
| 1378 | } else { | 1379 | } else { |
| 1379 | dst_pid = nlk->dst_pid; | 1380 | dst_pid = nlk->dst_pid; |
| @@ -2147,6 +2148,7 @@ static void __init netlink_add_usersock_entry(void) | |||
| 2147 | rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners); | 2148 | rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners); |
| 2148 | nl_table[NETLINK_USERSOCK].module = THIS_MODULE; | 2149 | nl_table[NETLINK_USERSOCK].module = THIS_MODULE; |
| 2149 | nl_table[NETLINK_USERSOCK].registered = 1; | 2150 | nl_table[NETLINK_USERSOCK].registered = 1; |
| 2151 | nl_table[NETLINK_USERSOCK].nl_nonroot = NL_NONROOT_SEND; | ||
| 2150 | 2152 | ||
| 2151 | netlink_table_ungrab(); | 2153 | netlink_table_ungrab(); |
| 2152 | } | 2154 | } |
diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c index 06592d8b4a2b..7261eb81974f 100644 --- a/net/netrom/af_netrom.c +++ b/net/netrom/af_netrom.c | |||
| @@ -601,7 +601,7 @@ static int nr_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | |||
| 601 | if (!capable(CAP_NET_BIND_SERVICE)) { | 601 | if (!capable(CAP_NET_BIND_SERVICE)) { |
| 602 | dev_put(dev); | 602 | dev_put(dev); |
| 603 | release_sock(sk); | 603 | release_sock(sk); |
| 604 | return -EACCES; | 604 | return -EPERM; |
| 605 | } | 605 | } |
| 606 | nr->user_addr = addr->fsa_digipeater[0]; | 606 | nr->user_addr = addr->fsa_digipeater[0]; |
| 607 | nr->source_addr = addr->fsa_ax25.sax25_call; | 607 | nr->source_addr = addr->fsa_ax25.sax25_call; |
| @@ -1169,7 +1169,12 @@ static int nr_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1169 | msg->msg_flags |= MSG_TRUNC; | 1169 | msg->msg_flags |= MSG_TRUNC; |
| 1170 | } | 1170 | } |
| 1171 | 1171 | ||
| 1172 | skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | 1172 | er = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); |
| 1173 | if (er < 0) { | ||
| 1174 | skb_free_datagram(sk, skb); | ||
| 1175 | release_sock(sk); | ||
| 1176 | return er; | ||
| 1177 | } | ||
| 1173 | 1178 | ||
| 1174 | if (sax != NULL) { | 1179 | if (sax != NULL) { |
| 1175 | sax->sax25_family = AF_NETROM; | 1180 | sax->sax25_family = AF_NETROM; |
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c index f3f96badf5aa..954405ceae9e 100644 --- a/net/openvswitch/actions.c +++ b/net/openvswitch/actions.c | |||
| @@ -45,7 +45,7 @@ static int make_writable(struct sk_buff *skb, int write_len) | |||
| 45 | return pskb_expand_head(skb, 0, 0, GFP_ATOMIC); | 45 | return pskb_expand_head(skb, 0, 0, GFP_ATOMIC); |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | /* remove VLAN header from packet and update csum accrodingly. */ | 48 | /* remove VLAN header from packet and update csum accordingly. */ |
| 49 | static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci) | 49 | static int __pop_vlan_tci(struct sk_buff *skb, __be16 *current_tci) |
| 50 | { | 50 | { |
| 51 | struct vlan_hdr *vhdr; | 51 | struct vlan_hdr *vhdr; |
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c index d8277d29e710..cf58cedad083 100644 --- a/net/openvswitch/datapath.c +++ b/net/openvswitch/datapath.c | |||
| @@ -425,10 +425,10 @@ static int validate_sample(const struct nlattr *attr, | |||
| 425 | static int validate_tp_port(const struct sw_flow_key *flow_key) | 425 | static int validate_tp_port(const struct sw_flow_key *flow_key) |
| 426 | { | 426 | { |
| 427 | if (flow_key->eth.type == htons(ETH_P_IP)) { | 427 | if (flow_key->eth.type == htons(ETH_P_IP)) { |
| 428 | if (flow_key->ipv4.tp.src && flow_key->ipv4.tp.dst) | 428 | if (flow_key->ipv4.tp.src || flow_key->ipv4.tp.dst) |
| 429 | return 0; | 429 | return 0; |
| 430 | } else if (flow_key->eth.type == htons(ETH_P_IPV6)) { | 430 | } else if (flow_key->eth.type == htons(ETH_P_IPV6)) { |
| 431 | if (flow_key->ipv6.tp.src && flow_key->ipv6.tp.dst) | 431 | if (flow_key->ipv6.tp.src || flow_key->ipv6.tp.dst) |
| 432 | return 0; | 432 | return 0; |
| 433 | } | 433 | } |
| 434 | 434 | ||
| @@ -460,7 +460,7 @@ static int validate_set(const struct nlattr *a, | |||
| 460 | if (flow_key->eth.type != htons(ETH_P_IP)) | 460 | if (flow_key->eth.type != htons(ETH_P_IP)) |
| 461 | return -EINVAL; | 461 | return -EINVAL; |
| 462 | 462 | ||
| 463 | if (!flow_key->ipv4.addr.src || !flow_key->ipv4.addr.dst) | 463 | if (!flow_key->ip.proto) |
| 464 | return -EINVAL; | 464 | return -EINVAL; |
| 465 | 465 | ||
| 466 | ipv4_key = nla_data(ovs_key); | 466 | ipv4_key = nla_data(ovs_key); |
diff --git a/net/openvswitch/flow.h b/net/openvswitch/flow.h index 9b75617ca4e0..c30df1a10c67 100644 --- a/net/openvswitch/flow.h +++ b/net/openvswitch/flow.h | |||
| @@ -145,15 +145,17 @@ u64 ovs_flow_used_time(unsigned long flow_jiffies); | |||
| 145 | * OVS_KEY_ATTR_PRIORITY 4 -- 4 8 | 145 | * OVS_KEY_ATTR_PRIORITY 4 -- 4 8 |
| 146 | * OVS_KEY_ATTR_IN_PORT 4 -- 4 8 | 146 | * OVS_KEY_ATTR_IN_PORT 4 -- 4 8 |
| 147 | * OVS_KEY_ATTR_ETHERNET 12 -- 4 16 | 147 | * OVS_KEY_ATTR_ETHERNET 12 -- 4 16 |
| 148 | * OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 (outer VLAN ethertype) | ||
| 148 | * OVS_KEY_ATTR_8021Q 4 -- 4 8 | 149 | * OVS_KEY_ATTR_8021Q 4 -- 4 8 |
| 149 | * OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 | 150 | * OVS_KEY_ATTR_ENCAP 0 -- 4 4 (VLAN encapsulation) |
| 151 | * OVS_KEY_ATTR_ETHERTYPE 2 2 4 8 (inner VLAN ethertype) | ||
| 150 | * OVS_KEY_ATTR_IPV6 40 -- 4 44 | 152 | * OVS_KEY_ATTR_IPV6 40 -- 4 44 |
| 151 | * OVS_KEY_ATTR_ICMPV6 2 2 4 8 | 153 | * OVS_KEY_ATTR_ICMPV6 2 2 4 8 |
| 152 | * OVS_KEY_ATTR_ND 28 -- 4 32 | 154 | * OVS_KEY_ATTR_ND 28 -- 4 32 |
| 153 | * ------------------------------------------------- | 155 | * ------------------------------------------------- |
| 154 | * total 132 | 156 | * total 144 |
| 155 | */ | 157 | */ |
| 156 | #define FLOW_BUFSIZE 132 | 158 | #define FLOW_BUFSIZE 144 |
| 157 | 159 | ||
| 158 | int ovs_flow_to_nlattrs(const struct sw_flow_key *, struct sk_buff *); | 160 | int ovs_flow_to_nlattrs(const struct sw_flow_key *, struct sk_buff *); |
| 159 | int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, | 161 | int ovs_flow_from_nlattrs(struct sw_flow_key *swkey, int *key_lenp, |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index aee7196aac36..c5c9e2a54218 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -1273,7 +1273,7 @@ static void __fanout_unlink(struct sock *sk, struct packet_sock *po) | |||
| 1273 | spin_unlock(&f->lock); | 1273 | spin_unlock(&f->lock); |
| 1274 | } | 1274 | } |
| 1275 | 1275 | ||
| 1276 | bool match_fanout_group(struct packet_type *ptype, struct sock * sk) | 1276 | static bool match_fanout_group(struct packet_type *ptype, struct sock * sk) |
| 1277 | { | 1277 | { |
| 1278 | if (ptype->af_packet_priv == (void*)((struct packet_sock *)sk)->fanout) | 1278 | if (ptype->af_packet_priv == (void*)((struct packet_sock *)sk)->fanout) |
| 1279 | return true; | 1279 | return true; |
diff --git a/net/sched/sch_cbq.c b/net/sched/sch_cbq.c index 6aabd77d1cfd..564b9fc8efd3 100644 --- a/net/sched/sch_cbq.c +++ b/net/sched/sch_cbq.c | |||
| @@ -250,10 +250,11 @@ cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr) | |||
| 250 | else if ((cl = defmap[res.classid & TC_PRIO_MAX]) == NULL) | 250 | else if ((cl = defmap[res.classid & TC_PRIO_MAX]) == NULL) |
| 251 | cl = defmap[TC_PRIO_BESTEFFORT]; | 251 | cl = defmap[TC_PRIO_BESTEFFORT]; |
| 252 | 252 | ||
| 253 | if (cl == NULL || cl->level >= head->level) | 253 | if (cl == NULL) |
| 254 | goto fallback; | 254 | goto fallback; |
| 255 | } | 255 | } |
| 256 | 256 | if (cl->level >= head->level) | |
| 257 | goto fallback; | ||
| 257 | #ifdef CONFIG_NET_CLS_ACT | 258 | #ifdef CONFIG_NET_CLS_ACT |
| 258 | switch (result) { | 259 | switch (result) { |
| 259 | case TC_ACT_QUEUED: | 260 | case TC_ACT_QUEUED: |
diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c index 9fc1c62ec80e..4e606fcb2534 100644 --- a/net/sched/sch_fq_codel.c +++ b/net/sched/sch_fq_codel.c | |||
| @@ -191,7 +191,6 @@ static int fq_codel_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 191 | 191 | ||
| 192 | if (list_empty(&flow->flowchain)) { | 192 | if (list_empty(&flow->flowchain)) { |
| 193 | list_add_tail(&flow->flowchain, &q->new_flows); | 193 | list_add_tail(&flow->flowchain, &q->new_flows); |
| 194 | codel_vars_init(&flow->cvars); | ||
| 195 | q->new_flow_count++; | 194 | q->new_flow_count++; |
| 196 | flow->deficit = q->quantum; | 195 | flow->deficit = q->quantum; |
| 197 | flow->dropped = 0; | 196 | flow->dropped = 0; |
| @@ -418,6 +417,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt) | |||
| 418 | struct fq_codel_flow *flow = q->flows + i; | 417 | struct fq_codel_flow *flow = q->flows + i; |
| 419 | 418 | ||
| 420 | INIT_LIST_HEAD(&flow->flowchain); | 419 | INIT_LIST_HEAD(&flow->flowchain); |
| 420 | codel_vars_init(&flow->cvars); | ||
| 421 | } | 421 | } |
| 422 | } | 422 | } |
| 423 | if (sch->limit >= 1) | 423 | if (sch->limit >= 1) |
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index e901583e4ea5..d42234c0f13b 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c | |||
| @@ -102,9 +102,8 @@ static inline int gred_wred_mode_check(struct Qdisc *sch) | |||
| 102 | if (q == NULL) | 102 | if (q == NULL) |
| 103 | continue; | 103 | continue; |
| 104 | 104 | ||
| 105 | for (n = 0; n < table->DPs; n++) | 105 | for (n = i + 1; n < table->DPs; n++) |
| 106 | if (table->tab[n] && table->tab[n] != q && | 106 | if (table->tab[n] && table->tab[n]->prio == q->prio) |
| 107 | table->tab[n]->prio == q->prio) | ||
| 108 | return 1; | 107 | return 1; |
| 109 | } | 108 | } |
| 110 | 109 | ||
| @@ -137,6 +136,7 @@ static inline void gred_store_wred_set(struct gred_sched *table, | |||
| 137 | struct gred_sched_data *q) | 136 | struct gred_sched_data *q) |
| 138 | { | 137 | { |
| 139 | table->wred_set.qavg = q->vars.qavg; | 138 | table->wred_set.qavg = q->vars.qavg; |
| 139 | table->wred_set.qidlestart = q->vars.qidlestart; | ||
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | static inline int gred_use_ecn(struct gred_sched *t) | 142 | static inline int gred_use_ecn(struct gred_sched *t) |
| @@ -176,7 +176,7 @@ static int gred_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
| 176 | skb->tc_index = (skb->tc_index & ~GRED_VQ_MASK) | dp; | 176 | skb->tc_index = (skb->tc_index & ~GRED_VQ_MASK) | dp; |
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | /* sum up all the qaves of prios <= to ours to get the new qave */ | 179 | /* sum up all the qaves of prios < ours to get the new qave */ |
| 180 | if (!gred_wred_mode(t) && gred_rio_mode(t)) { | 180 | if (!gred_wred_mode(t) && gred_rio_mode(t)) { |
| 181 | int i; | 181 | int i; |
| 182 | 182 | ||
| @@ -260,16 +260,18 @@ static struct sk_buff *gred_dequeue(struct Qdisc *sch) | |||
| 260 | } else { | 260 | } else { |
| 261 | q->backlog -= qdisc_pkt_len(skb); | 261 | q->backlog -= qdisc_pkt_len(skb); |
| 262 | 262 | ||
| 263 | if (!q->backlog && !gred_wred_mode(t)) | 263 | if (gred_wred_mode(t)) { |
| 264 | red_start_of_idle_period(&q->vars); | 264 | if (!sch->qstats.backlog) |
| 265 | red_start_of_idle_period(&t->wred_set); | ||
| 266 | } else { | ||
| 267 | if (!q->backlog) | ||
| 268 | red_start_of_idle_period(&q->vars); | ||
| 269 | } | ||
| 265 | } | 270 | } |
| 266 | 271 | ||
| 267 | return skb; | 272 | return skb; |
| 268 | } | 273 | } |
| 269 | 274 | ||
| 270 | if (gred_wred_mode(t) && !red_is_idling(&t->wred_set)) | ||
| 271 | red_start_of_idle_period(&t->wred_set); | ||
| 272 | |||
| 273 | return NULL; | 275 | return NULL; |
| 274 | } | 276 | } |
| 275 | 277 | ||
| @@ -291,19 +293,20 @@ static unsigned int gred_drop(struct Qdisc *sch) | |||
| 291 | q->backlog -= len; | 293 | q->backlog -= len; |
| 292 | q->stats.other++; | 294 | q->stats.other++; |
| 293 | 295 | ||
| 294 | if (!q->backlog && !gred_wred_mode(t)) | 296 | if (gred_wred_mode(t)) { |
| 295 | red_start_of_idle_period(&q->vars); | 297 | if (!sch->qstats.backlog) |
| 298 | red_start_of_idle_period(&t->wred_set); | ||
| 299 | } else { | ||
| 300 | if (!q->backlog) | ||
| 301 | red_start_of_idle_period(&q->vars); | ||
| 302 | } | ||
| 296 | } | 303 | } |
| 297 | 304 | ||
| 298 | qdisc_drop(skb, sch); | 305 | qdisc_drop(skb, sch); |
| 299 | return len; | 306 | return len; |
| 300 | } | 307 | } |
| 301 | 308 | ||
| 302 | if (gred_wred_mode(t) && !red_is_idling(&t->wred_set)) | ||
| 303 | red_start_of_idle_period(&t->wred_set); | ||
| 304 | |||
| 305 | return 0; | 309 | return 0; |
| 306 | |||
| 307 | } | 310 | } |
| 308 | 311 | ||
| 309 | static void gred_reset(struct Qdisc *sch) | 312 | static void gred_reset(struct Qdisc *sch) |
| @@ -535,6 +538,7 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb) | |||
| 535 | for (i = 0; i < MAX_DPs; i++) { | 538 | for (i = 0; i < MAX_DPs; i++) { |
| 536 | struct gred_sched_data *q = table->tab[i]; | 539 | struct gred_sched_data *q = table->tab[i]; |
| 537 | struct tc_gred_qopt opt; | 540 | struct tc_gred_qopt opt; |
| 541 | unsigned long qavg; | ||
| 538 | 542 | ||
| 539 | memset(&opt, 0, sizeof(opt)); | 543 | memset(&opt, 0, sizeof(opt)); |
| 540 | 544 | ||
| @@ -566,7 +570,9 @@ static int gred_dump(struct Qdisc *sch, struct sk_buff *skb) | |||
| 566 | if (gred_wred_mode(table)) | 570 | if (gred_wred_mode(table)) |
| 567 | gred_load_wred_set(table, q); | 571 | gred_load_wred_set(table, q); |
| 568 | 572 | ||
| 569 | opt.qave = red_calc_qavg(&q->parms, &q->vars, q->vars.qavg); | 573 | qavg = red_calc_qavg(&q->parms, &q->vars, |
| 574 | q->vars.qavg >> q->parms.Wlog); | ||
| 575 | opt.qave = qavg >> q->parms.Wlog; | ||
| 570 | 576 | ||
| 571 | append_opt: | 577 | append_opt: |
| 572 | if (nla_append(skb, sizeof(opt), &opt) < 0) | 578 | if (nla_append(skb, sizeof(opt), &opt) < 0) |
diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c index e4723d31fdd5..211a21217045 100644 --- a/net/sched/sch_qfq.c +++ b/net/sched/sch_qfq.c | |||
| @@ -865,7 +865,10 @@ static void qfq_update_start(struct qfq_sched *q, struct qfq_class *cl) | |||
| 865 | if (mask) { | 865 | if (mask) { |
| 866 | struct qfq_group *next = qfq_ffs(q, mask); | 866 | struct qfq_group *next = qfq_ffs(q, mask); |
| 867 | if (qfq_gt(roundedF, next->F)) { | 867 | if (qfq_gt(roundedF, next->F)) { |
| 868 | cl->S = next->F; | 868 | if (qfq_gt(limit, next->F)) |
| 869 | cl->S = next->F; | ||
| 870 | else /* preserve timestamp correctness */ | ||
| 871 | cl->S = limit; | ||
| 869 | return; | 872 | return; |
| 870 | } | 873 | } |
| 871 | } | 874 | } |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 838e18b4d7ea..be50aa234dcd 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
| @@ -364,6 +364,25 @@ finish: | |||
| 364 | return retval; | 364 | return retval; |
| 365 | } | 365 | } |
| 366 | 366 | ||
| 367 | static void sctp_packet_release_owner(struct sk_buff *skb) | ||
| 368 | { | ||
| 369 | sk_free(skb->sk); | ||
| 370 | } | ||
| 371 | |||
| 372 | static void sctp_packet_set_owner_w(struct sk_buff *skb, struct sock *sk) | ||
| 373 | { | ||
| 374 | skb_orphan(skb); | ||
| 375 | skb->sk = sk; | ||
| 376 | skb->destructor = sctp_packet_release_owner; | ||
| 377 | |||
| 378 | /* | ||
| 379 | * The data chunks have already been accounted for in sctp_sendmsg(), | ||
| 380 | * therefore only reserve a single byte to keep socket around until | ||
| 381 | * the packet has been transmitted. | ||
| 382 | */ | ||
| 383 | atomic_inc(&sk->sk_wmem_alloc); | ||
| 384 | } | ||
| 385 | |||
| 367 | /* All packets are sent to the network through this function from | 386 | /* All packets are sent to the network through this function from |
| 368 | * sctp_outq_tail(). | 387 | * sctp_outq_tail(). |
| 369 | * | 388 | * |
| @@ -405,7 +424,7 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
| 405 | /* Set the owning socket so that we know where to get the | 424 | /* Set the owning socket so that we know where to get the |
| 406 | * destination IP address. | 425 | * destination IP address. |
| 407 | */ | 426 | */ |
| 408 | skb_set_owner_w(nskb, sk); | 427 | sctp_packet_set_owner_w(nskb, sk); |
| 409 | 428 | ||
| 410 | if (!sctp_transport_dst_check(tp)) { | 429 | if (!sctp_transport_dst_check(tp)) { |
| 411 | sctp_transport_route(tp, NULL, sctp_sk(sk)); | 430 | sctp_transport_route(tp, NULL, sctp_sk(sk)); |
diff --git a/net/socket.c b/net/socket.c index a5471f804d99..edc3c4af9085 100644 --- a/net/socket.c +++ b/net/socket.c | |||
| @@ -2604,7 +2604,7 @@ static int do_siocgstamp(struct net *net, struct socket *sock, | |||
| 2604 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); | 2604 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); |
| 2605 | set_fs(old_fs); | 2605 | set_fs(old_fs); |
| 2606 | if (!err) | 2606 | if (!err) |
| 2607 | err = compat_put_timeval(up, &ktv); | 2607 | err = compat_put_timeval(&ktv, up); |
| 2608 | 2608 | ||
| 2609 | return err; | 2609 | return err; |
| 2610 | } | 2610 | } |
| @@ -2620,7 +2620,7 @@ static int do_siocgstampns(struct net *net, struct socket *sock, | |||
| 2620 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); | 2620 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); |
| 2621 | set_fs(old_fs); | 2621 | set_fs(old_fs); |
| 2622 | if (!err) | 2622 | if (!err) |
| 2623 | err = compat_put_timespec(up, &kts); | 2623 | err = compat_put_timespec(&kts, up); |
| 2624 | 2624 | ||
| 2625 | return err; | 2625 | return err; |
| 2626 | } | 2626 | } |
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index 88f2bf671960..bac973a31367 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c | |||
| @@ -316,7 +316,6 @@ static bool svc_xprt_has_something_to_do(struct svc_xprt *xprt) | |||
| 316 | */ | 316 | */ |
| 317 | void svc_xprt_enqueue(struct svc_xprt *xprt) | 317 | void svc_xprt_enqueue(struct svc_xprt *xprt) |
| 318 | { | 318 | { |
| 319 | struct svc_serv *serv = xprt->xpt_server; | ||
| 320 | struct svc_pool *pool; | 319 | struct svc_pool *pool; |
| 321 | struct svc_rqst *rqstp; | 320 | struct svc_rqst *rqstp; |
| 322 | int cpu; | 321 | int cpu; |
| @@ -362,8 +361,6 @@ void svc_xprt_enqueue(struct svc_xprt *xprt) | |||
| 362 | rqstp, rqstp->rq_xprt); | 361 | rqstp, rqstp->rq_xprt); |
| 363 | rqstp->rq_xprt = xprt; | 362 | rqstp->rq_xprt = xprt; |
| 364 | svc_xprt_get(xprt); | 363 | svc_xprt_get(xprt); |
| 365 | rqstp->rq_reserved = serv->sv_max_mesg; | ||
| 366 | atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved); | ||
| 367 | pool->sp_stats.threads_woken++; | 364 | pool->sp_stats.threads_woken++; |
| 368 | wake_up(&rqstp->rq_wait); | 365 | wake_up(&rqstp->rq_wait); |
| 369 | } else { | 366 | } else { |
| @@ -640,8 +637,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) | |||
| 640 | if (xprt) { | 637 | if (xprt) { |
| 641 | rqstp->rq_xprt = xprt; | 638 | rqstp->rq_xprt = xprt; |
| 642 | svc_xprt_get(xprt); | 639 | svc_xprt_get(xprt); |
| 643 | rqstp->rq_reserved = serv->sv_max_mesg; | ||
| 644 | atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved); | ||
| 645 | 640 | ||
| 646 | /* As there is a shortage of threads and this request | 641 | /* As there is a shortage of threads and this request |
| 647 | * had to be queued, don't allow the thread to wait so | 642 | * had to be queued, don't allow the thread to wait so |
| @@ -738,6 +733,8 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) | |||
| 738 | else | 733 | else |
| 739 | len = xprt->xpt_ops->xpo_recvfrom(rqstp); | 734 | len = xprt->xpt_ops->xpo_recvfrom(rqstp); |
| 740 | dprintk("svc: got len=%d\n", len); | 735 | dprintk("svc: got len=%d\n", len); |
| 736 | rqstp->rq_reserved = serv->sv_max_mesg; | ||
| 737 | atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved); | ||
| 741 | } | 738 | } |
| 742 | svc_xprt_received(xprt); | 739 | svc_xprt_received(xprt); |
| 743 | 740 | ||
| @@ -794,7 +791,8 @@ int svc_send(struct svc_rqst *rqstp) | |||
| 794 | 791 | ||
| 795 | /* Grab mutex to serialize outgoing data. */ | 792 | /* Grab mutex to serialize outgoing data. */ |
| 796 | mutex_lock(&xprt->xpt_mutex); | 793 | mutex_lock(&xprt->xpt_mutex); |
| 797 | if (test_bit(XPT_DEAD, &xprt->xpt_flags)) | 794 | if (test_bit(XPT_DEAD, &xprt->xpt_flags) |
| 795 | || test_bit(XPT_CLOSE, &xprt->xpt_flags)) | ||
| 798 | len = -ENOTCONN; | 796 | len = -ENOTCONN; |
| 799 | else | 797 | else |
| 800 | len = xprt->xpt_ops->xpo_sendto(rqstp); | 798 | len = xprt->xpt_ops->xpo_sendto(rqstp); |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 18bc130255a7..998aa8c1807c 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
| @@ -1129,9 +1129,9 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) | |||
| 1129 | if (len >= 0) | 1129 | if (len >= 0) |
| 1130 | svsk->sk_tcplen += len; | 1130 | svsk->sk_tcplen += len; |
| 1131 | if (len != want) { | 1131 | if (len != want) { |
| 1132 | svc_tcp_save_pages(svsk, rqstp); | ||
| 1132 | if (len < 0 && len != -EAGAIN) | 1133 | if (len < 0 && len != -EAGAIN) |
| 1133 | goto err_other; | 1134 | goto err_other; |
| 1134 | svc_tcp_save_pages(svsk, rqstp); | ||
| 1135 | dprintk("svc: incomplete TCP record (%d of %d)\n", | 1135 | dprintk("svc: incomplete TCP record (%d of %d)\n", |
| 1136 | svsk->sk_tcplen, svsk->sk_reclen); | 1136 | svsk->sk_tcplen, svsk->sk_reclen); |
| 1137 | goto err_noclose; | 1137 | goto err_noclose; |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index a5a402a7d21f..5d7f61d7559c 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -969,11 +969,11 @@ static bool xprt_dynamic_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) | |||
| 969 | return false; | 969 | return false; |
| 970 | } | 970 | } |
| 971 | 971 | ||
| 972 | static void xprt_alloc_slot(struct rpc_task *task) | 972 | void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) |
| 973 | { | 973 | { |
| 974 | struct rpc_xprt *xprt = task->tk_xprt; | ||
| 975 | struct rpc_rqst *req; | 974 | struct rpc_rqst *req; |
| 976 | 975 | ||
| 976 | spin_lock(&xprt->reserve_lock); | ||
| 977 | if (!list_empty(&xprt->free)) { | 977 | if (!list_empty(&xprt->free)) { |
| 978 | req = list_entry(xprt->free.next, struct rpc_rqst, rq_list); | 978 | req = list_entry(xprt->free.next, struct rpc_rqst, rq_list); |
| 979 | list_del(&req->rq_list); | 979 | list_del(&req->rq_list); |
| @@ -994,12 +994,29 @@ static void xprt_alloc_slot(struct rpc_task *task) | |||
| 994 | default: | 994 | default: |
| 995 | task->tk_status = -EAGAIN; | 995 | task->tk_status = -EAGAIN; |
| 996 | } | 996 | } |
| 997 | spin_unlock(&xprt->reserve_lock); | ||
| 997 | return; | 998 | return; |
| 998 | out_init_req: | 999 | out_init_req: |
| 999 | task->tk_status = 0; | 1000 | task->tk_status = 0; |
| 1000 | task->tk_rqstp = req; | 1001 | task->tk_rqstp = req; |
| 1001 | xprt_request_init(task, xprt); | 1002 | xprt_request_init(task, xprt); |
| 1003 | spin_unlock(&xprt->reserve_lock); | ||
| 1004 | } | ||
| 1005 | EXPORT_SYMBOL_GPL(xprt_alloc_slot); | ||
| 1006 | |||
| 1007 | void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task) | ||
| 1008 | { | ||
| 1009 | /* Note: grabbing the xprt_lock_write() ensures that we throttle | ||
| 1010 | * new slot allocation if the transport is congested (i.e. when | ||
| 1011 | * reconnecting a stream transport or when out of socket write | ||
| 1012 | * buffer space). | ||
| 1013 | */ | ||
| 1014 | if (xprt_lock_write(xprt, task)) { | ||
| 1015 | xprt_alloc_slot(xprt, task); | ||
| 1016 | xprt_release_write(xprt, task); | ||
| 1017 | } | ||
| 1002 | } | 1018 | } |
| 1019 | EXPORT_SYMBOL_GPL(xprt_lock_and_alloc_slot); | ||
| 1003 | 1020 | ||
| 1004 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) | 1021 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) |
| 1005 | { | 1022 | { |
| @@ -1083,20 +1100,9 @@ void xprt_reserve(struct rpc_task *task) | |||
| 1083 | if (task->tk_rqstp != NULL) | 1100 | if (task->tk_rqstp != NULL) |
| 1084 | return; | 1101 | return; |
| 1085 | 1102 | ||
| 1086 | /* Note: grabbing the xprt_lock_write() here is not strictly needed, | ||
| 1087 | * but ensures that we throttle new slot allocation if the transport | ||
| 1088 | * is congested (e.g. if reconnecting or if we're out of socket | ||
| 1089 | * write buffer space). | ||
| 1090 | */ | ||
| 1091 | task->tk_timeout = 0; | 1103 | task->tk_timeout = 0; |
| 1092 | task->tk_status = -EAGAIN; | 1104 | task->tk_status = -EAGAIN; |
| 1093 | if (!xprt_lock_write(xprt, task)) | 1105 | xprt->ops->alloc_slot(xprt, task); |
| 1094 | return; | ||
| 1095 | |||
| 1096 | spin_lock(&xprt->reserve_lock); | ||
| 1097 | xprt_alloc_slot(task); | ||
| 1098 | spin_unlock(&xprt->reserve_lock); | ||
| 1099 | xprt_release_write(xprt, task); | ||
| 1100 | } | 1106 | } |
| 1101 | 1107 | ||
| 1102 | static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) | 1108 | static inline __be32 xprt_alloc_xid(struct rpc_xprt *xprt) |
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 06cdbff79e4a..5d9202dc7cb1 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
| @@ -713,6 +713,7 @@ static void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq) | |||
| 713 | static struct rpc_xprt_ops xprt_rdma_procs = { | 713 | static struct rpc_xprt_ops xprt_rdma_procs = { |
| 714 | .reserve_xprt = xprt_rdma_reserve_xprt, | 714 | .reserve_xprt = xprt_rdma_reserve_xprt, |
| 715 | .release_xprt = xprt_release_xprt_cong, /* sunrpc/xprt.c */ | 715 | .release_xprt = xprt_release_xprt_cong, /* sunrpc/xprt.c */ |
| 716 | .alloc_slot = xprt_alloc_slot, | ||
| 716 | .release_request = xprt_release_rqst_cong, /* ditto */ | 717 | .release_request = xprt_release_rqst_cong, /* ditto */ |
| 717 | .set_retrans_timeout = xprt_set_retrans_timeout_def, /* ditto */ | 718 | .set_retrans_timeout = xprt_set_retrans_timeout_def, /* ditto */ |
| 718 | .rpcbind = rpcb_getport_async, /* sunrpc/rpcb_clnt.c */ | 719 | .rpcbind = rpcb_getport_async, /* sunrpc/rpcb_clnt.c */ |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 400567243f84..a35b8e52e551 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -2473,6 +2473,7 @@ static void bc_destroy(struct rpc_xprt *xprt) | |||
| 2473 | static struct rpc_xprt_ops xs_local_ops = { | 2473 | static struct rpc_xprt_ops xs_local_ops = { |
| 2474 | .reserve_xprt = xprt_reserve_xprt, | 2474 | .reserve_xprt = xprt_reserve_xprt, |
| 2475 | .release_xprt = xs_tcp_release_xprt, | 2475 | .release_xprt = xs_tcp_release_xprt, |
| 2476 | .alloc_slot = xprt_alloc_slot, | ||
| 2476 | .rpcbind = xs_local_rpcbind, | 2477 | .rpcbind = xs_local_rpcbind, |
| 2477 | .set_port = xs_local_set_port, | 2478 | .set_port = xs_local_set_port, |
| 2478 | .connect = xs_connect, | 2479 | .connect = xs_connect, |
| @@ -2489,6 +2490,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
| 2489 | .set_buffer_size = xs_udp_set_buffer_size, | 2490 | .set_buffer_size = xs_udp_set_buffer_size, |
| 2490 | .reserve_xprt = xprt_reserve_xprt_cong, | 2491 | .reserve_xprt = xprt_reserve_xprt_cong, |
| 2491 | .release_xprt = xprt_release_xprt_cong, | 2492 | .release_xprt = xprt_release_xprt_cong, |
| 2493 | .alloc_slot = xprt_alloc_slot, | ||
| 2492 | .rpcbind = rpcb_getport_async, | 2494 | .rpcbind = rpcb_getport_async, |
| 2493 | .set_port = xs_set_port, | 2495 | .set_port = xs_set_port, |
| 2494 | .connect = xs_connect, | 2496 | .connect = xs_connect, |
| @@ -2506,6 +2508,7 @@ static struct rpc_xprt_ops xs_udp_ops = { | |||
| 2506 | static struct rpc_xprt_ops xs_tcp_ops = { | 2508 | static struct rpc_xprt_ops xs_tcp_ops = { |
| 2507 | .reserve_xprt = xprt_reserve_xprt, | 2509 | .reserve_xprt = xprt_reserve_xprt, |
| 2508 | .release_xprt = xs_tcp_release_xprt, | 2510 | .release_xprt = xs_tcp_release_xprt, |
| 2511 | .alloc_slot = xprt_lock_and_alloc_slot, | ||
| 2509 | .rpcbind = rpcb_getport_async, | 2512 | .rpcbind = rpcb_getport_async, |
| 2510 | .set_port = xs_set_port, | 2513 | .set_port = xs_set_port, |
| 2511 | .connect = xs_connect, | 2514 | .connect = xs_connect, |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 97026f3b215a..1e37dbf00cb3 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -5633,8 +5633,10 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) | |||
| 5633 | sizeof(connect.ht_capa_mask)); | 5633 | sizeof(connect.ht_capa_mask)); |
| 5634 | 5634 | ||
| 5635 | if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { | 5635 | if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) { |
| 5636 | if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) | 5636 | if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) { |
| 5637 | kfree(connkeys); | ||
| 5637 | return -EINVAL; | 5638 | return -EINVAL; |
| 5639 | } | ||
| 5638 | memcpy(&connect.ht_capa, | 5640 | memcpy(&connect.ht_capa, |
| 5639 | nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), | 5641 | nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]), |
| 5640 | sizeof(connect.ht_capa)); | 5642 | sizeof(connect.ht_capa)); |
diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c index 54a0dc2e2f8d..ab2bb42fe094 100644 --- a/net/xfrm/xfrm_input.c +++ b/net/xfrm/xfrm_input.c | |||
| @@ -212,7 +212,7 @@ resume: | |||
| 212 | /* only the first xfrm gets the encap type */ | 212 | /* only the first xfrm gets the encap type */ |
| 213 | encap_type = 0; | 213 | encap_type = 0; |
| 214 | 214 | ||
| 215 | if (async && x->repl->check(x, skb, seq)) { | 215 | if (async && x->repl->recheck(x, skb, seq)) { |
| 216 | XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR); | 216 | XFRM_INC_STATS(net, LINUX_MIB_XFRMINSTATESEQERROR); |
| 217 | goto drop_unlock; | 217 | goto drop_unlock; |
| 218 | } | 218 | } |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 5a2aa17e4d3c..387848e90078 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
| @@ -585,6 +585,7 @@ int xfrm_policy_insert(int dir, struct xfrm_policy *policy, int excl) | |||
| 585 | xfrm_pol_hold(policy); | 585 | xfrm_pol_hold(policy); |
| 586 | net->xfrm.policy_count[dir]++; | 586 | net->xfrm.policy_count[dir]++; |
| 587 | atomic_inc(&flow_cache_genid); | 587 | atomic_inc(&flow_cache_genid); |
| 588 | rt_genid_bump(net); | ||
| 588 | if (delpol) | 589 | if (delpol) |
| 589 | __xfrm_policy_unlink(delpol, dir); | 590 | __xfrm_policy_unlink(delpol, dir); |
| 590 | policy->index = delpol ? delpol->index : xfrm_gen_index(net, dir); | 591 | policy->index = delpol ? delpol->index : xfrm_gen_index(net, dir); |
| @@ -1763,7 +1764,7 @@ static struct dst_entry *make_blackhole(struct net *net, u16 family, | |||
| 1763 | 1764 | ||
| 1764 | if (!afinfo) { | 1765 | if (!afinfo) { |
| 1765 | dst_release(dst_orig); | 1766 | dst_release(dst_orig); |
| 1766 | ret = ERR_PTR(-EINVAL); | 1767 | return ERR_PTR(-EINVAL); |
| 1767 | } else { | 1768 | } else { |
| 1768 | ret = afinfo->blackhole_route(net, dst_orig); | 1769 | ret = afinfo->blackhole_route(net, dst_orig); |
| 1769 | } | 1770 | } |
diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c index 2f6d11d04a2b..3efb07d3eb27 100644 --- a/net/xfrm/xfrm_replay.c +++ b/net/xfrm/xfrm_replay.c | |||
| @@ -420,6 +420,18 @@ err: | |||
| 420 | return -EINVAL; | 420 | return -EINVAL; |
| 421 | } | 421 | } |
| 422 | 422 | ||
| 423 | static int xfrm_replay_recheck_esn(struct xfrm_state *x, | ||
| 424 | struct sk_buff *skb, __be32 net_seq) | ||
| 425 | { | ||
| 426 | if (unlikely(XFRM_SKB_CB(skb)->seq.input.hi != | ||
| 427 | htonl(xfrm_replay_seqhi(x, net_seq)))) { | ||
| 428 | x->stats.replay_window++; | ||
| 429 | return -EINVAL; | ||
| 430 | } | ||
| 431 | |||
| 432 | return xfrm_replay_check_esn(x, skb, net_seq); | ||
| 433 | } | ||
| 434 | |||
| 423 | static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) | 435 | static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) |
| 424 | { | 436 | { |
| 425 | unsigned int bitnr, nr, i; | 437 | unsigned int bitnr, nr, i; |
| @@ -479,6 +491,7 @@ static void xfrm_replay_advance_esn(struct xfrm_state *x, __be32 net_seq) | |||
| 479 | static struct xfrm_replay xfrm_replay_legacy = { | 491 | static struct xfrm_replay xfrm_replay_legacy = { |
| 480 | .advance = xfrm_replay_advance, | 492 | .advance = xfrm_replay_advance, |
| 481 | .check = xfrm_replay_check, | 493 | .check = xfrm_replay_check, |
| 494 | .recheck = xfrm_replay_check, | ||
| 482 | .notify = xfrm_replay_notify, | 495 | .notify = xfrm_replay_notify, |
| 483 | .overflow = xfrm_replay_overflow, | 496 | .overflow = xfrm_replay_overflow, |
| 484 | }; | 497 | }; |
| @@ -486,6 +499,7 @@ static struct xfrm_replay xfrm_replay_legacy = { | |||
| 486 | static struct xfrm_replay xfrm_replay_bmp = { | 499 | static struct xfrm_replay xfrm_replay_bmp = { |
| 487 | .advance = xfrm_replay_advance_bmp, | 500 | .advance = xfrm_replay_advance_bmp, |
| 488 | .check = xfrm_replay_check_bmp, | 501 | .check = xfrm_replay_check_bmp, |
| 502 | .recheck = xfrm_replay_check_bmp, | ||
| 489 | .notify = xfrm_replay_notify_bmp, | 503 | .notify = xfrm_replay_notify_bmp, |
| 490 | .overflow = xfrm_replay_overflow_bmp, | 504 | .overflow = xfrm_replay_overflow_bmp, |
| 491 | }; | 505 | }; |
| @@ -493,6 +507,7 @@ static struct xfrm_replay xfrm_replay_bmp = { | |||
| 493 | static struct xfrm_replay xfrm_replay_esn = { | 507 | static struct xfrm_replay xfrm_replay_esn = { |
| 494 | .advance = xfrm_replay_advance_esn, | 508 | .advance = xfrm_replay_advance_esn, |
| 495 | .check = xfrm_replay_check_esn, | 509 | .check = xfrm_replay_check_esn, |
| 510 | .recheck = xfrm_replay_recheck_esn, | ||
| 496 | .notify = xfrm_replay_notify_bmp, | 511 | .notify = xfrm_replay_notify_bmp, |
| 497 | .overflow = xfrm_replay_overflow_esn, | 512 | .overflow = xfrm_replay_overflow_esn, |
| 498 | }; | 513 | }; |
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 87cd0e4d4282..210be48d8ae3 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c | |||
| @@ -1994,8 +1994,10 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay) | |||
| 1994 | goto error; | 1994 | goto error; |
| 1995 | 1995 | ||
| 1996 | x->outer_mode = xfrm_get_mode(x->props.mode, family); | 1996 | x->outer_mode = xfrm_get_mode(x->props.mode, family); |
| 1997 | if (x->outer_mode == NULL) | 1997 | if (x->outer_mode == NULL) { |
| 1998 | err = -EPROTONOSUPPORT; | ||
| 1998 | goto error; | 1999 | goto error; |
| 2000 | } | ||
| 1999 | 2001 | ||
| 2000 | if (init_replay) { | 2002 | if (init_replay) { |
| 2001 | err = xfrm_init_replay(x); | 2003 | err = xfrm_init_replay(x); |
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index e75d8e47f35c..289f4bf18ff0 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -123,9 +123,21 @@ static inline int verify_replay(struct xfrm_usersa_info *p, | |||
| 123 | struct nlattr **attrs) | 123 | struct nlattr **attrs) |
| 124 | { | 124 | { |
| 125 | struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; | 125 | struct nlattr *rt = attrs[XFRMA_REPLAY_ESN_VAL]; |
| 126 | struct xfrm_replay_state_esn *rs; | ||
| 126 | 127 | ||
| 127 | if ((p->flags & XFRM_STATE_ESN) && !rt) | 128 | if (p->flags & XFRM_STATE_ESN) { |
| 128 | return -EINVAL; | 129 | if (!rt) |
| 130 | return -EINVAL; | ||
| 131 | |||
| 132 | rs = nla_data(rt); | ||
| 133 | |||
| 134 | if (rs->bmp_len > XFRMA_REPLAY_ESN_MAX / sizeof(rs->bmp[0]) / 8) | ||
| 135 | return -EINVAL; | ||
| 136 | |||
| 137 | if (nla_len(rt) < xfrm_replay_state_esn_len(rs) && | ||
| 138 | nla_len(rt) != sizeof(*rs)) | ||
| 139 | return -EINVAL; | ||
| 140 | } | ||
| 129 | 141 | ||
| 130 | if (!rt) | 142 | if (!rt) |
| 131 | return 0; | 143 | return 0; |
| @@ -370,14 +382,15 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es | |||
| 370 | struct nlattr *rp) | 382 | struct nlattr *rp) |
| 371 | { | 383 | { |
| 372 | struct xfrm_replay_state_esn *up; | 384 | struct xfrm_replay_state_esn *up; |
| 385 | int ulen; | ||
| 373 | 386 | ||
| 374 | if (!replay_esn || !rp) | 387 | if (!replay_esn || !rp) |
| 375 | return 0; | 388 | return 0; |
| 376 | 389 | ||
| 377 | up = nla_data(rp); | 390 | up = nla_data(rp); |
| 391 | ulen = xfrm_replay_state_esn_len(up); | ||
| 378 | 392 | ||
| 379 | if (xfrm_replay_state_esn_len(replay_esn) != | 393 | if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen) |
| 380 | xfrm_replay_state_esn_len(up)) | ||
| 381 | return -EINVAL; | 394 | return -EINVAL; |
| 382 | 395 | ||
| 383 | return 0; | 396 | return 0; |
| @@ -388,22 +401,28 @@ static int xfrm_alloc_replay_state_esn(struct xfrm_replay_state_esn **replay_esn | |||
| 388 | struct nlattr *rta) | 401 | struct nlattr *rta) |
| 389 | { | 402 | { |
| 390 | struct xfrm_replay_state_esn *p, *pp, *up; | 403 | struct xfrm_replay_state_esn *p, *pp, *up; |
| 404 | int klen, ulen; | ||
| 391 | 405 | ||
| 392 | if (!rta) | 406 | if (!rta) |
| 393 | return 0; | 407 | return 0; |
| 394 | 408 | ||
| 395 | up = nla_data(rta); | 409 | up = nla_data(rta); |
| 410 | klen = xfrm_replay_state_esn_len(up); | ||
| 411 | ulen = nla_len(rta) >= klen ? klen : sizeof(*up); | ||
| 396 | 412 | ||
| 397 | p = kmemdup(up, xfrm_replay_state_esn_len(up), GFP_KERNEL); | 413 | p = kzalloc(klen, GFP_KERNEL); |
| 398 | if (!p) | 414 | if (!p) |
| 399 | return -ENOMEM; | 415 | return -ENOMEM; |
| 400 | 416 | ||
| 401 | pp = kmemdup(up, xfrm_replay_state_esn_len(up), GFP_KERNEL); | 417 | pp = kzalloc(klen, GFP_KERNEL); |
| 402 | if (!pp) { | 418 | if (!pp) { |
| 403 | kfree(p); | 419 | kfree(p); |
| 404 | return -ENOMEM; | 420 | return -ENOMEM; |
| 405 | } | 421 | } |
| 406 | 422 | ||
| 423 | memcpy(p, up, ulen); | ||
| 424 | memcpy(pp, up, ulen); | ||
| 425 | |||
| 407 | *replay_esn = p; | 426 | *replay_esn = p; |
| 408 | *preplay_esn = pp; | 427 | *preplay_esn = pp; |
| 409 | 428 | ||
| @@ -442,10 +461,11 @@ static void copy_from_user_state(struct xfrm_state *x, struct xfrm_usersa_info * | |||
| 442 | * somehow made shareable and move it to xfrm_state.c - JHS | 461 | * somehow made shareable and move it to xfrm_state.c - JHS |
| 443 | * | 462 | * |
| 444 | */ | 463 | */ |
| 445 | static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs) | 464 | static void xfrm_update_ae_params(struct xfrm_state *x, struct nlattr **attrs, |
| 465 | int update_esn) | ||
| 446 | { | 466 | { |
| 447 | struct nlattr *rp = attrs[XFRMA_REPLAY_VAL]; | 467 | struct nlattr *rp = attrs[XFRMA_REPLAY_VAL]; |
| 448 | struct nlattr *re = attrs[XFRMA_REPLAY_ESN_VAL]; | 468 | struct nlattr *re = update_esn ? attrs[XFRMA_REPLAY_ESN_VAL] : NULL; |
| 449 | struct nlattr *lt = attrs[XFRMA_LTIME_VAL]; | 469 | struct nlattr *lt = attrs[XFRMA_LTIME_VAL]; |
| 450 | struct nlattr *et = attrs[XFRMA_ETIMER_THRESH]; | 470 | struct nlattr *et = attrs[XFRMA_ETIMER_THRESH]; |
| 451 | struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH]; | 471 | struct nlattr *rt = attrs[XFRMA_REPLAY_THRESH]; |
| @@ -555,7 +575,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net, | |||
| 555 | goto error; | 575 | goto error; |
| 556 | 576 | ||
| 557 | /* override default values from above */ | 577 | /* override default values from above */ |
| 558 | xfrm_update_ae_params(x, attrs); | 578 | xfrm_update_ae_params(x, attrs, 0); |
| 559 | 579 | ||
| 560 | return x; | 580 | return x; |
| 561 | 581 | ||
| @@ -689,6 +709,7 @@ out: | |||
| 689 | 709 | ||
| 690 | static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p) | 710 | static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p) |
| 691 | { | 711 | { |
| 712 | memset(p, 0, sizeof(*p)); | ||
| 692 | memcpy(&p->id, &x->id, sizeof(p->id)); | 713 | memcpy(&p->id, &x->id, sizeof(p->id)); |
| 693 | memcpy(&p->sel, &x->sel, sizeof(p->sel)); | 714 | memcpy(&p->sel, &x->sel, sizeof(p->sel)); |
| 694 | memcpy(&p->lft, &x->lft, sizeof(p->lft)); | 715 | memcpy(&p->lft, &x->lft, sizeof(p->lft)); |
| @@ -742,7 +763,7 @@ static int copy_to_user_auth(struct xfrm_algo_auth *auth, struct sk_buff *skb) | |||
| 742 | return -EMSGSIZE; | 763 | return -EMSGSIZE; |
| 743 | 764 | ||
| 744 | algo = nla_data(nla); | 765 | algo = nla_data(nla); |
| 745 | strcpy(algo->alg_name, auth->alg_name); | 766 | strncpy(algo->alg_name, auth->alg_name, sizeof(algo->alg_name)); |
| 746 | memcpy(algo->alg_key, auth->alg_key, (auth->alg_key_len + 7) / 8); | 767 | memcpy(algo->alg_key, auth->alg_key, (auth->alg_key_len + 7) / 8); |
| 747 | algo->alg_key_len = auth->alg_key_len; | 768 | algo->alg_key_len = auth->alg_key_len; |
| 748 | 769 | ||
| @@ -878,6 +899,7 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb, | |||
| 878 | { | 899 | { |
| 879 | struct xfrm_dump_info info; | 900 | struct xfrm_dump_info info; |
| 880 | struct sk_buff *skb; | 901 | struct sk_buff *skb; |
| 902 | int err; | ||
| 881 | 903 | ||
| 882 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); | 904 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); |
| 883 | if (!skb) | 905 | if (!skb) |
| @@ -888,9 +910,10 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb, | |||
| 888 | info.nlmsg_seq = seq; | 910 | info.nlmsg_seq = seq; |
| 889 | info.nlmsg_flags = 0; | 911 | info.nlmsg_flags = 0; |
| 890 | 912 | ||
| 891 | if (dump_one_state(x, 0, &info)) { | 913 | err = dump_one_state(x, 0, &info); |
| 914 | if (err) { | ||
| 892 | kfree_skb(skb); | 915 | kfree_skb(skb); |
| 893 | return NULL; | 916 | return ERR_PTR(err); |
| 894 | } | 917 | } |
| 895 | 918 | ||
| 896 | return skb; | 919 | return skb; |
| @@ -1317,6 +1340,7 @@ static void copy_from_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy | |||
| 1317 | 1340 | ||
| 1318 | static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir) | 1341 | static void copy_to_user_policy(struct xfrm_policy *xp, struct xfrm_userpolicy_info *p, int dir) |
| 1319 | { | 1342 | { |
| 1343 | memset(p, 0, sizeof(*p)); | ||
| 1320 | memcpy(&p->sel, &xp->selector, sizeof(p->sel)); | 1344 | memcpy(&p->sel, &xp->selector, sizeof(p->sel)); |
| 1321 | memcpy(&p->lft, &xp->lft, sizeof(p->lft)); | 1345 | memcpy(&p->lft, &xp->lft, sizeof(p->lft)); |
| 1322 | memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft)); | 1346 | memcpy(&p->curlft, &xp->curlft, sizeof(p->curlft)); |
| @@ -1421,6 +1445,7 @@ static int copy_to_user_tmpl(struct xfrm_policy *xp, struct sk_buff *skb) | |||
| 1421 | struct xfrm_user_tmpl *up = &vec[i]; | 1445 | struct xfrm_user_tmpl *up = &vec[i]; |
| 1422 | struct xfrm_tmpl *kp = &xp->xfrm_vec[i]; | 1446 | struct xfrm_tmpl *kp = &xp->xfrm_vec[i]; |
| 1423 | 1447 | ||
| 1448 | memset(up, 0, sizeof(*up)); | ||
| 1424 | memcpy(&up->id, &kp->id, sizeof(up->id)); | 1449 | memcpy(&up->id, &kp->id, sizeof(up->id)); |
| 1425 | up->family = kp->encap_family; | 1450 | up->family = kp->encap_family; |
| 1426 | memcpy(&up->saddr, &kp->saddr, sizeof(up->saddr)); | 1451 | memcpy(&up->saddr, &kp->saddr, sizeof(up->saddr)); |
| @@ -1546,6 +1571,7 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb, | |||
| 1546 | { | 1571 | { |
| 1547 | struct xfrm_dump_info info; | 1572 | struct xfrm_dump_info info; |
| 1548 | struct sk_buff *skb; | 1573 | struct sk_buff *skb; |
| 1574 | int err; | ||
| 1549 | 1575 | ||
| 1550 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); | 1576 | skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
| 1551 | if (!skb) | 1577 | if (!skb) |
| @@ -1556,9 +1582,10 @@ static struct sk_buff *xfrm_policy_netlink(struct sk_buff *in_skb, | |||
| 1556 | info.nlmsg_seq = seq; | 1582 | info.nlmsg_seq = seq; |
| 1557 | info.nlmsg_flags = 0; | 1583 | info.nlmsg_flags = 0; |
| 1558 | 1584 | ||
| 1559 | if (dump_one_policy(xp, dir, 0, &info) < 0) { | 1585 | err = dump_one_policy(xp, dir, 0, &info); |
| 1586 | if (err) { | ||
| 1560 | kfree_skb(skb); | 1587 | kfree_skb(skb); |
| 1561 | return NULL; | 1588 | return ERR_PTR(err); |
| 1562 | } | 1589 | } |
| 1563 | 1590 | ||
| 1564 | return skb; | 1591 | return skb; |
| @@ -1822,7 +1849,7 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh, | |||
| 1822 | goto out; | 1849 | goto out; |
| 1823 | 1850 | ||
| 1824 | spin_lock_bh(&x->lock); | 1851 | spin_lock_bh(&x->lock); |
| 1825 | xfrm_update_ae_params(x, attrs); | 1852 | xfrm_update_ae_params(x, attrs, 1); |
| 1826 | spin_unlock_bh(&x->lock); | 1853 | spin_unlock_bh(&x->lock); |
| 1827 | 1854 | ||
| 1828 | c.event = nlh->nlmsg_type; | 1855 | c.event = nlh->nlmsg_type; |
diff --git a/scripts/Makefile.fwinst b/scripts/Makefile.fwinst index 6bf8e87f1dcf..c3f69ae275d1 100644 --- a/scripts/Makefile.fwinst +++ b/scripts/Makefile.fwinst | |||
| @@ -42,7 +42,7 @@ quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@) | |||
| 42 | $(installed-fw-dirs): | 42 | $(installed-fw-dirs): |
| 43 | $(call cmd,mkdir) | 43 | $(call cmd,mkdir) |
| 44 | 44 | ||
| 45 | $(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $(INSTALL_FW_PATH)/$$(dir %) | 45 | $(installed-fw): $(INSTALL_FW_PATH)/%: $(obj)/% | $$(dir $(INSTALL_FW_PATH)/%) |
| 46 | $(call cmd,install) | 46 | $(call cmd,install) |
| 47 | 47 | ||
| 48 | PHONY += __fw_install __fw_modinst FORCE | 48 | PHONY += __fw_install __fw_modinst FORCE |
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index 4629038c9e5a..b3d907eb93a9 100644 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh | |||
| @@ -74,8 +74,13 @@ kallsyms() | |||
| 74 | info KSYM ${2} | 74 | info KSYM ${2} |
| 75 | local kallsymopt; | 75 | local kallsymopt; |
| 76 | 76 | ||
| 77 | if [ -n "${CONFIG_SYMBOL_PREFIX}" ]; then | ||
| 78 | kallsymopt="${kallsymopt} \ | ||
| 79 | --symbol-prefix=${CONFIG_SYMBOL_PREFIX}" | ||
| 80 | fi | ||
| 81 | |||
| 77 | if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then | 82 | if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then |
| 78 | kallsymopt=--all-symbols | 83 | kallsymopt="${kallsymopt} --all-symbols" |
| 79 | fi | 84 | fi |
| 80 | 85 | ||
| 81 | local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ | 86 | local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \ |
| @@ -211,7 +216,7 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then | |||
| 211 | 216 | ||
| 212 | if ! cmp -s System.map .tmp_System.map; then | 217 | if ! cmp -s System.map .tmp_System.map; then |
| 213 | echo >&2 Inconsistent kallsyms data | 218 | echo >&2 Inconsistent kallsyms data |
| 214 | echo >&2 echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround | 219 | echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround |
| 215 | cleanup | 220 | cleanup |
| 216 | exit 1 | 221 | exit 1 |
| 217 | fi | 222 | fi |
diff --git a/security/selinux/include/xfrm.h b/security/selinux/include/xfrm.h index c220f314709c..65f67cb0aefb 100644 --- a/security/selinux/include/xfrm.h +++ b/security/selinux/include/xfrm.h | |||
| @@ -51,6 +51,7 @@ int selinux_xfrm_decode_session(struct sk_buff *skb, u32 *sid, int ckall); | |||
| 51 | static inline void selinux_xfrm_notify_policyload(void) | 51 | static inline void selinux_xfrm_notify_policyload(void) |
| 52 | { | 52 | { |
| 53 | atomic_inc(&flow_cache_genid); | 53 | atomic_inc(&flow_cache_genid); |
| 54 | rt_genid_bump(&init_net); | ||
| 54 | } | 55 | } |
| 55 | #else | 56 | #else |
| 56 | static inline int selinux_xfrm_enabled(void) | 57 | static inline int selinux_xfrm_enabled(void) |
diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c index ec2118d0e27a..eb60cb8dbb8a 100644 --- a/sound/core/compress_offload.c +++ b/sound/core/compress_offload.c | |||
| @@ -80,14 +80,12 @@ static int snd_compr_open(struct inode *inode, struct file *f) | |||
| 80 | int maj = imajor(inode); | 80 | int maj = imajor(inode); |
| 81 | int ret; | 81 | int ret; |
| 82 | 82 | ||
| 83 | if (f->f_flags & O_WRONLY) | 83 | if ((f->f_flags & O_ACCMODE) == O_WRONLY) |
| 84 | dirn = SND_COMPRESS_PLAYBACK; | 84 | dirn = SND_COMPRESS_PLAYBACK; |
| 85 | else if (f->f_flags & O_RDONLY) | 85 | else if ((f->f_flags & O_ACCMODE) == O_RDONLY) |
| 86 | dirn = SND_COMPRESS_CAPTURE; | 86 | dirn = SND_COMPRESS_CAPTURE; |
| 87 | else { | 87 | else |
| 88 | pr_err("invalid direction\n"); | ||
| 89 | return -EINVAL; | 88 | return -EINVAL; |
| 90 | } | ||
| 91 | 89 | ||
| 92 | if (maj == snd_major) | 90 | if (maj == snd_major) |
| 93 | compr = snd_lookup_minor_data(iminor(inode), | 91 | compr = snd_lookup_minor_data(iminor(inode), |
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c index f560051a949e..1c65cc5e3a31 100644 --- a/sound/pci/hda/hda_codec.c +++ b/sound/pci/hda/hda_codec.c | |||
| @@ -1209,6 +1209,9 @@ static void snd_hda_codec_free(struct hda_codec *codec) | |||
| 1209 | kfree(codec); | 1209 | kfree(codec); |
| 1210 | } | 1210 | } |
| 1211 | 1211 | ||
| 1212 | static bool snd_hda_codec_get_supported_ps(struct hda_codec *codec, | ||
| 1213 | hda_nid_t fg, unsigned int power_state); | ||
| 1214 | |||
| 1212 | static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | 1215 | static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, |
| 1213 | unsigned int power_state); | 1216 | unsigned int power_state); |
| 1214 | 1217 | ||
| @@ -1317,6 +1320,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, | |||
| 1317 | AC_VERB_GET_SUBSYSTEM_ID, 0); | 1320 | AC_VERB_GET_SUBSYSTEM_ID, 0); |
| 1318 | } | 1321 | } |
| 1319 | 1322 | ||
| 1323 | codec->epss = snd_hda_codec_get_supported_ps(codec, | ||
| 1324 | codec->afg ? codec->afg : codec->mfg, | ||
| 1325 | AC_PWRST_EPSS); | ||
| 1326 | |||
| 1320 | /* power-up all before initialization */ | 1327 | /* power-up all before initialization */ |
| 1321 | hda_set_power_state(codec, | 1328 | hda_set_power_state(codec, |
| 1322 | codec->afg ? codec->afg : codec->mfg, | 1329 | codec->afg ? codec->afg : codec->mfg, |
| @@ -2346,6 +2353,7 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
| 2346 | } | 2353 | } |
| 2347 | if (codec->patch_ops.free) | 2354 | if (codec->patch_ops.free) |
| 2348 | codec->patch_ops.free(codec); | 2355 | codec->patch_ops.free(codec); |
| 2356 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); | ||
| 2349 | snd_hda_jack_tbl_clear(codec); | 2357 | snd_hda_jack_tbl_clear(codec); |
| 2350 | codec->proc_widget_hook = NULL; | 2358 | codec->proc_widget_hook = NULL; |
| 2351 | codec->spec = NULL; | 2359 | codec->spec = NULL; |
| @@ -2361,7 +2369,6 @@ int snd_hda_codec_reset(struct hda_codec *codec) | |||
| 2361 | codec->num_pcms = 0; | 2369 | codec->num_pcms = 0; |
| 2362 | codec->pcm_info = NULL; | 2370 | codec->pcm_info = NULL; |
| 2363 | codec->preset = NULL; | 2371 | codec->preset = NULL; |
| 2364 | memset(&codec->patch_ops, 0, sizeof(codec->patch_ops)); | ||
| 2365 | codec->slave_dig_outs = NULL; | 2372 | codec->slave_dig_outs = NULL; |
| 2366 | codec->spdif_status_reset = 0; | 2373 | codec->spdif_status_reset = 0; |
| 2367 | module_put(codec->owner); | 2374 | module_put(codec->owner); |
| @@ -3543,8 +3550,7 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, | |||
| 3543 | /* this delay seems necessary to avoid click noise at power-down */ | 3550 | /* this delay seems necessary to avoid click noise at power-down */ |
| 3544 | if (power_state == AC_PWRST_D3) { | 3551 | if (power_state == AC_PWRST_D3) { |
| 3545 | /* transition time less than 10ms for power down */ | 3552 | /* transition time less than 10ms for power down */ |
| 3546 | bool epss = snd_hda_codec_get_supported_ps(codec, fg, AC_PWRST_EPSS); | 3553 | msleep(codec->epss ? 10 : 100); |
| 3547 | msleep(epss ? 10 : 100); | ||
| 3548 | } | 3554 | } |
| 3549 | 3555 | ||
| 3550 | /* repeat power states setting at most 10 times*/ | 3556 | /* repeat power states setting at most 10 times*/ |
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h index 7fbc1bcaf1a9..e5a7e19a8071 100644 --- a/sound/pci/hda/hda_codec.h +++ b/sound/pci/hda/hda_codec.h | |||
| @@ -862,6 +862,7 @@ struct hda_codec { | |||
| 862 | unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */ | 862 | unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */ |
| 863 | unsigned int no_jack_detect:1; /* Machine has no jack-detection */ | 863 | unsigned int no_jack_detect:1; /* Machine has no jack-detection */ |
| 864 | unsigned int pcm_format_first:1; /* PCM format must be set first */ | 864 | unsigned int pcm_format_first:1; /* PCM format must be set first */ |
| 865 | unsigned int epss:1; /* supporting EPSS? */ | ||
| 865 | #ifdef CONFIG_SND_HDA_POWER_SAVE | 866 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 866 | unsigned int power_on :1; /* current (global) power-state */ | 867 | unsigned int power_on :1; /* current (global) power-state */ |
| 867 | int power_transition; /* power-state in transition */ | 868 | int power_transition; /* power-state in transition */ |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 60882c62f180..c4763c52eaf6 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
| @@ -2701,6 +2701,8 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { | |||
| 2701 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), | 2701 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
| 2702 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), | 2702 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), |
| 2703 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB), | 2703 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB), |
| 2704 | SND_PCI_QUIRK(0x1043, 0x1ac3, "ASUS X53S", POS_FIX_POSBUF), | ||
| 2705 | SND_PCI_QUIRK(0x1043, 0x1b43, "ASUS K53E", POS_FIX_POSBUF), | ||
| 2704 | SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB), | 2706 | SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB), |
| 2705 | SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB), | 2707 | SND_PCI_QUIRK(0x10de, 0xcb89, "Macbook Pro 7,1", POS_FIX_LPIB), |
| 2706 | SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB), | 2708 | SND_PCI_QUIRK(0x1297, 0x3166, "Shuttle", POS_FIX_LPIB), |
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index ea5775a1a7db..3d4722f0a1ca 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c | |||
| @@ -1075,7 +1075,7 @@ static struct snd_kcontrol_new stac_smux_mixer = { | |||
| 1075 | 1075 | ||
| 1076 | static const char * const slave_pfxs[] = { | 1076 | static const char * const slave_pfxs[] = { |
| 1077 | "Front", "Surround", "Center", "LFE", "Side", | 1077 | "Front", "Surround", "Center", "LFE", "Side", |
| 1078 | "Headphone", "Speaker", "IEC958", | 1078 | "Headphone", "Speaker", "IEC958", "PCM", |
| 1079 | NULL | 1079 | NULL |
| 1080 | }; | 1080 | }; |
| 1081 | 1081 | ||
| @@ -4543,6 +4543,9 @@ static void stac92xx_line_out_detect(struct hda_codec *codec, | |||
| 4543 | struct auto_pin_cfg *cfg = &spec->autocfg; | 4543 | struct auto_pin_cfg *cfg = &spec->autocfg; |
| 4544 | int i; | 4544 | int i; |
| 4545 | 4545 | ||
| 4546 | if (cfg->speaker_outs == 0) | ||
| 4547 | return; | ||
| 4548 | |||
| 4546 | for (i = 0; i < cfg->line_outs; i++) { | 4549 | for (i = 0; i < cfg->line_outs; i++) { |
| 4547 | if (presence) | 4550 | if (presence) |
| 4548 | break; | 4551 | break; |
| @@ -5531,6 +5534,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) | |||
| 5531 | snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); | 5534 | snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); |
| 5532 | } | 5535 | } |
| 5533 | 5536 | ||
| 5537 | codec->epss = 0; /* longer delay needed for D3 */ | ||
| 5534 | codec->no_trigger_sense = 1; | 5538 | codec->no_trigger_sense = 1; |
| 5535 | codec->spec = spec; | 5539 | codec->spec = spec; |
| 5536 | 5540 | ||
diff --git a/sound/pci/ice1712/prodigy_hifi.c b/sound/pci/ice1712/prodigy_hifi.c index 764cc93dbca4..075d5aa1fee0 100644 --- a/sound/pci/ice1712/prodigy_hifi.c +++ b/sound/pci/ice1712/prodigy_hifi.c | |||
| @@ -297,6 +297,7 @@ static int ak4396_dac_vol_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem | |||
| 297 | } | 297 | } |
| 298 | 298 | ||
| 299 | static const DECLARE_TLV_DB_SCALE(db_scale_wm_dac, -12700, 100, 1); | 299 | static const DECLARE_TLV_DB_SCALE(db_scale_wm_dac, -12700, 100, 1); |
| 300 | static const DECLARE_TLV_DB_LINEAR(ak4396_db_scale, TLV_DB_GAIN_MUTE, 0); | ||
| 300 | 301 | ||
| 301 | static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = { | 302 | static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = { |
| 302 | { | 303 | { |
| @@ -307,7 +308,7 @@ static struct snd_kcontrol_new prodigy_hd2_controls[] __devinitdata = { | |||
| 307 | .info = ak4396_dac_vol_info, | 308 | .info = ak4396_dac_vol_info, |
| 308 | .get = ak4396_dac_vol_get, | 309 | .get = ak4396_dac_vol_get, |
| 309 | .put = ak4396_dac_vol_put, | 310 | .put = ak4396_dac_vol_put, |
| 310 | .tlv = { .p = db_scale_wm_dac }, | 311 | .tlv = { .p = ak4396_db_scale }, |
| 311 | }, | 312 | }, |
| 312 | }; | 313 | }; |
| 313 | 314 | ||
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c index 5c9cacaf2d52..1cf7a32d1b21 100644 --- a/sound/soc/codecs/arizona.c +++ b/sound/soc/codecs/arizona.c | |||
| @@ -426,7 +426,7 @@ static const int arizona_44k1_bclk_rates[] = { | |||
| 426 | 940800, | 426 | 940800, |
| 427 | 1411200, | 427 | 1411200, |
| 428 | 1881600, | 428 | 1881600, |
| 429 | 2882400, | 429 | 2822400, |
| 430 | 3763200, | 430 | 3763200, |
| 431 | 5644800, | 431 | 5644800, |
| 432 | 7526400, | 432 | 7526400, |
diff --git a/sound/soc/codecs/mc13783.c b/sound/soc/codecs/mc13783.c index 8f726c063f42..115a40301810 100644 --- a/sound/soc/codecs/mc13783.c +++ b/sound/soc/codecs/mc13783.c | |||
| @@ -659,7 +659,7 @@ static struct snd_soc_dai_driver mc13783_dai_async[] = { | |||
| 659 | .id = MC13783_ID_STEREO_DAC, | 659 | .id = MC13783_ID_STEREO_DAC, |
| 660 | .playback = { | 660 | .playback = { |
| 661 | .stream_name = "Playback", | 661 | .stream_name = "Playback", |
| 662 | .channels_min = 1, | 662 | .channels_min = 2, |
| 663 | .channels_max = 2, | 663 | .channels_max = 2, |
| 664 | .rates = SNDRV_PCM_RATE_8000_96000, | 664 | .rates = SNDRV_PCM_RATE_8000_96000, |
| 665 | .formats = MC13783_FORMATS, | 665 | .formats = MC13783_FORMATS, |
| @@ -670,7 +670,7 @@ static struct snd_soc_dai_driver mc13783_dai_async[] = { | |||
| 670 | .id = MC13783_ID_STEREO_CODEC, | 670 | .id = MC13783_ID_STEREO_CODEC, |
| 671 | .capture = { | 671 | .capture = { |
| 672 | .stream_name = "Capture", | 672 | .stream_name = "Capture", |
| 673 | .channels_min = 1, | 673 | .channels_min = 2, |
| 674 | .channels_max = 2, | 674 | .channels_max = 2, |
| 675 | .rates = MC13783_RATES_RECORD, | 675 | .rates = MC13783_RATES_RECORD, |
| 676 | .formats = MC13783_FORMATS, | 676 | .formats = MC13783_FORMATS, |
| @@ -692,14 +692,14 @@ static struct snd_soc_dai_driver mc13783_dai_sync[] = { | |||
| 692 | .id = MC13783_ID_SYNC, | 692 | .id = MC13783_ID_SYNC, |
| 693 | .playback = { | 693 | .playback = { |
| 694 | .stream_name = "Playback", | 694 | .stream_name = "Playback", |
| 695 | .channels_min = 1, | 695 | .channels_min = 2, |
| 696 | .channels_max = 2, | 696 | .channels_max = 2, |
| 697 | .rates = SNDRV_PCM_RATE_8000_96000, | 697 | .rates = SNDRV_PCM_RATE_8000_96000, |
| 698 | .formats = MC13783_FORMATS, | 698 | .formats = MC13783_FORMATS, |
| 699 | }, | 699 | }, |
| 700 | .capture = { | 700 | .capture = { |
| 701 | .stream_name = "Capture", | 701 | .stream_name = "Capture", |
| 702 | .channels_min = 1, | 702 | .channels_min = 2, |
| 703 | .channels_max = 2, | 703 | .channels_max = 2, |
| 704 | .rates = MC13783_RATES_RECORD, | 704 | .rates = MC13783_RATES_RECORD, |
| 705 | .formats = MC13783_FORMATS, | 705 | .formats = MC13783_FORMATS, |
diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c index 0013afe48e66..dc4262eea4b7 100644 --- a/sound/soc/codecs/wm8904.c +++ b/sound/soc/codecs/wm8904.c | |||
| @@ -100,7 +100,7 @@ static const struct reg_default wm8904_reg_defaults[] = { | |||
| 100 | { 14, 0x0000 }, /* R14 - Power Management 2 */ | 100 | { 14, 0x0000 }, /* R14 - Power Management 2 */ |
| 101 | { 15, 0x0000 }, /* R15 - Power Management 3 */ | 101 | { 15, 0x0000 }, /* R15 - Power Management 3 */ |
| 102 | { 18, 0x0000 }, /* R18 - Power Management 6 */ | 102 | { 18, 0x0000 }, /* R18 - Power Management 6 */ |
| 103 | { 19, 0x945E }, /* R20 - Clock Rates 0 */ | 103 | { 20, 0x945E }, /* R20 - Clock Rates 0 */ |
| 104 | { 21, 0x0C05 }, /* R21 - Clock Rates 1 */ | 104 | { 21, 0x0C05 }, /* R21 - Clock Rates 1 */ |
| 105 | { 22, 0x0006 }, /* R22 - Clock Rates 2 */ | 105 | { 22, 0x0006 }, /* R22 - Clock Rates 2 */ |
| 106 | { 24, 0x0050 }, /* R24 - Audio Interface 0 */ | 106 | { 24, 0x0050 }, /* R24 - Audio Interface 0 */ |
diff --git a/sound/soc/fsl/imx-sgtl5000.c b/sound/soc/fsl/imx-sgtl5000.c index fb21b17f17f5..199408ec4261 100644 --- a/sound/soc/fsl/imx-sgtl5000.c +++ b/sound/soc/fsl/imx-sgtl5000.c | |||
| @@ -94,7 +94,7 @@ static int __devinit imx_sgtl5000_probe(struct platform_device *pdev) | |||
| 94 | dev_err(&pdev->dev, "audmux internal port setup failed\n"); | 94 | dev_err(&pdev->dev, "audmux internal port setup failed\n"); |
| 95 | return ret; | 95 | return ret; |
| 96 | } | 96 | } |
| 97 | imx_audmux_v2_configure_port(ext_port, | 97 | ret = imx_audmux_v2_configure_port(ext_port, |
| 98 | IMX_AUDMUX_V2_PTCR_SYN, | 98 | IMX_AUDMUX_V2_PTCR_SYN, |
| 99 | IMX_AUDMUX_V2_PDCR_RXDSEL(int_port)); | 99 | IMX_AUDMUX_V2_PDCR_RXDSEL(int_port)); |
| 100 | if (ret) { | 100 | if (ret) { |
diff --git a/sound/soc/omap/am3517evm.c b/sound/soc/omap/am3517evm.c index 009533ab8d18..df65f98211ec 100644 --- a/sound/soc/omap/am3517evm.c +++ b/sound/soc/omap/am3517evm.c | |||
| @@ -59,7 +59,7 @@ static int am3517evm_hw_params(struct snd_pcm_substream *substream, | |||
| 59 | return ret; | 59 | return ret; |
| 60 | } | 60 | } |
| 61 | 61 | ||
| 62 | snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_FSR_SRC_FSX, 0, | 62 | ret = snd_soc_dai_set_sysclk(cpu_dai, OMAP_MCBSP_FSR_SRC_FSX, 0, |
| 63 | SND_SOC_CLOCK_IN); | 63 | SND_SOC_CLOCK_IN); |
| 64 | if (ret < 0) { | 64 | if (ret < 0) { |
| 65 | printk(KERN_ERR "can't set CPU system clock OMAP_MCBSP_FSR_SRC_FSX\n"); | 65 | printk(KERN_ERR "can't set CPU system clock OMAP_MCBSP_FSR_SRC_FSX\n"); |
diff --git a/sound/soc/samsung/dma.c b/sound/soc/samsung/dma.c index f3ebc38c10fe..b70964ea448c 100644 --- a/sound/soc/samsung/dma.c +++ b/sound/soc/samsung/dma.c | |||
| @@ -34,9 +34,7 @@ static const struct snd_pcm_hardware dma_hardware = { | |||
| 34 | .info = SNDRV_PCM_INFO_INTERLEAVED | | 34 | .info = SNDRV_PCM_INFO_INTERLEAVED | |
| 35 | SNDRV_PCM_INFO_BLOCK_TRANSFER | | 35 | SNDRV_PCM_INFO_BLOCK_TRANSFER | |
| 36 | SNDRV_PCM_INFO_MMAP | | 36 | SNDRV_PCM_INFO_MMAP | |
| 37 | SNDRV_PCM_INFO_MMAP_VALID | | 37 | SNDRV_PCM_INFO_MMAP_VALID, |
| 38 | SNDRV_PCM_INFO_PAUSE | | ||
| 39 | SNDRV_PCM_INFO_RESUME, | ||
| 40 | .formats = SNDRV_PCM_FMTBIT_S16_LE | | 38 | .formats = SNDRV_PCM_FMTBIT_S16_LE | |
| 41 | SNDRV_PCM_FMTBIT_U16_LE | | 39 | SNDRV_PCM_FMTBIT_U16_LE | |
| 42 | SNDRV_PCM_FMTBIT_U8 | | 40 | SNDRV_PCM_FMTBIT_U8 | |
| @@ -248,15 +246,11 @@ static int dma_trigger(struct snd_pcm_substream *substream, int cmd) | |||
| 248 | 246 | ||
| 249 | switch (cmd) { | 247 | switch (cmd) { |
| 250 | case SNDRV_PCM_TRIGGER_START: | 248 | case SNDRV_PCM_TRIGGER_START: |
| 251 | case SNDRV_PCM_TRIGGER_RESUME: | ||
| 252 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | ||
| 253 | prtd->state |= ST_RUNNING; | 249 | prtd->state |= ST_RUNNING; |
| 254 | prtd->params->ops->trigger(prtd->params->ch); | 250 | prtd->params->ops->trigger(prtd->params->ch); |
| 255 | break; | 251 | break; |
| 256 | 252 | ||
| 257 | case SNDRV_PCM_TRIGGER_STOP: | 253 | case SNDRV_PCM_TRIGGER_STOP: |
| 258 | case SNDRV_PCM_TRIGGER_SUSPEND: | ||
| 259 | case SNDRV_PCM_TRIGGER_PAUSE_PUSH: | ||
| 260 | prtd->state &= ~ST_RUNNING; | 254 | prtd->state &= ~ST_RUNNING; |
| 261 | prtd->params->ops->stop(prtd->params->ch); | 255 | prtd->params->ops->stop(prtd->params->ch); |
| 262 | break; | 256 | break; |
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index dd7c49fafd75..f90139b5f50d 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c | |||
| @@ -291,8 +291,11 @@ static int snd_soc_dapm_set_bias_level(struct snd_soc_dapm_context *dapm, | |||
| 291 | if (dapm->codec->driver->set_bias_level) | 291 | if (dapm->codec->driver->set_bias_level) |
| 292 | ret = dapm->codec->driver->set_bias_level(dapm->codec, | 292 | ret = dapm->codec->driver->set_bias_level(dapm->codec, |
| 293 | level); | 293 | level); |
| 294 | } else | 294 | else |
| 295 | dapm->bias_level = level; | ||
| 296 | } else if (!card || dapm != &card->dapm) { | ||
| 295 | dapm->bias_level = level; | 297 | dapm->bias_level = level; |
| 298 | } | ||
| 296 | 299 | ||
| 297 | if (ret != 0) | 300 | if (ret != 0) |
| 298 | goto out; | 301 | goto out; |
diff --git a/sound/soc/spear/spear_pcm.c b/sound/soc/spear/spear_pcm.c index 97c2cac8e92c..8c7f23729446 100644 --- a/sound/soc/spear/spear_pcm.c +++ b/sound/soc/spear/spear_pcm.c | |||
| @@ -138,7 +138,7 @@ static void spear_pcm_free(struct snd_pcm *pcm) | |||
| 138 | continue; | 138 | continue; |
| 139 | 139 | ||
| 140 | buf = &substream->dma_buffer; | 140 | buf = &substream->dma_buffer; |
| 141 | if (!buf && !buf->area) | 141 | if (!buf || !buf->area) |
| 142 | continue; | 142 | continue; |
| 143 | 143 | ||
| 144 | dma_free_writecombine(pcm->card->dev, buf->bytes, | 144 | dma_free_writecombine(pcm->card->dev, buf->bytes, |
diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c index e463529b38bb..76cb1b363b71 100644 --- a/sound/soc/tegra/tegra_alc5632.c +++ b/sound/soc/tegra/tegra_alc5632.c | |||
| @@ -89,7 +89,6 @@ static struct snd_soc_jack_gpio tegra_alc5632_hp_jack_gpio = { | |||
| 89 | .name = "Headset detection", | 89 | .name = "Headset detection", |
| 90 | .report = SND_JACK_HEADSET, | 90 | .report = SND_JACK_HEADSET, |
| 91 | .debounce_time = 150, | 91 | .debounce_time = 150, |
| 92 | .invert = 1, | ||
| 93 | }; | 92 | }; |
| 94 | 93 | ||
| 95 | static const struct snd_soc_dapm_widget tegra_alc5632_dapm_widgets[] = { | 94 | static const struct snd_soc_dapm_widget tegra_alc5632_dapm_widgets[] = { |
diff --git a/sound/soc/tegra/tegra_pcm.c b/sound/soc/tegra/tegra_pcm.c index 5658bcec1931..8d6900c1ee47 100644 --- a/sound/soc/tegra/tegra_pcm.c +++ b/sound/soc/tegra/tegra_pcm.c | |||
| @@ -334,11 +334,11 @@ static int tegra_pcm_hw_params(struct snd_pcm_substream *substream, | |||
| 334 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 334 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
| 335 | slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | 335 | slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
| 336 | slave_config.dst_addr = dmap->addr; | 336 | slave_config.dst_addr = dmap->addr; |
| 337 | slave_config.src_maxburst = 0; | 337 | slave_config.dst_maxburst = 4; |
| 338 | } else { | 338 | } else { |
| 339 | slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | 339 | slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; |
| 340 | slave_config.src_addr = dmap->addr; | 340 | slave_config.src_addr = dmap->addr; |
| 341 | slave_config.dst_maxburst = 0; | 341 | slave_config.src_maxburst = 4; |
| 342 | } | 342 | } |
| 343 | slave_config.slave_id = dmap->req_sel; | 343 | slave_config.slave_id = dmap->req_sel; |
| 344 | 344 | ||
diff --git a/sound/soc/ux500/ux500_msp_i2s.c b/sound/soc/ux500/ux500_msp_i2s.c index 5c472f335a64..eb85113d472a 100644 --- a/sound/soc/ux500/ux500_msp_i2s.c +++ b/sound/soc/ux500/ux500_msp_i2s.c | |||
| @@ -663,7 +663,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, | |||
| 663 | struct ux500_msp **msp_p, | 663 | struct ux500_msp **msp_p, |
| 664 | struct msp_i2s_platform_data *platform_data) | 664 | struct msp_i2s_platform_data *platform_data) |
| 665 | { | 665 | { |
| 666 | int ret = 0; | ||
| 667 | struct resource *res = NULL; | 666 | struct resource *res = NULL; |
| 668 | struct i2s_controller *i2s_cont; | 667 | struct i2s_controller *i2s_cont; |
| 669 | struct ux500_msp *msp; | 668 | struct ux500_msp *msp; |
| @@ -685,15 +684,14 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, | |||
| 685 | if (res == NULL) { | 684 | if (res == NULL) { |
| 686 | dev_err(&pdev->dev, "%s: ERROR: Unable to get resource!\n", | 685 | dev_err(&pdev->dev, "%s: ERROR: Unable to get resource!\n", |
| 687 | __func__); | 686 | __func__); |
| 688 | ret = -ENOMEM; | 687 | return -ENOMEM; |
| 689 | goto err_res; | ||
| 690 | } | 688 | } |
| 691 | 689 | ||
| 692 | msp->registers = ioremap(res->start, (res->end - res->start + 1)); | 690 | msp->registers = devm_ioremap(&pdev->dev, res->start, |
| 691 | resource_size(res)); | ||
| 693 | if (msp->registers == NULL) { | 692 | if (msp->registers == NULL) { |
| 694 | dev_err(&pdev->dev, "%s: ERROR: ioremap failed!\n", __func__); | 693 | dev_err(&pdev->dev, "%s: ERROR: ioremap failed!\n", __func__); |
| 695 | ret = -ENOMEM; | 694 | return -ENOMEM; |
| 696 | goto err_res; | ||
| 697 | } | 695 | } |
| 698 | 696 | ||
| 699 | msp->msp_state = MSP_STATE_IDLE; | 697 | msp->msp_state = MSP_STATE_IDLE; |
| @@ -705,7 +703,7 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, | |||
| 705 | dev_err(&pdev->dev, | 703 | dev_err(&pdev->dev, |
| 706 | "%s: ERROR: Failed to allocate I2S-controller!\n", | 704 | "%s: ERROR: Failed to allocate I2S-controller!\n", |
| 707 | __func__); | 705 | __func__); |
| 708 | goto err_i2s_cont; | 706 | return -ENOMEM; |
| 709 | } | 707 | } |
| 710 | i2s_cont->dev.parent = &pdev->dev; | 708 | i2s_cont->dev.parent = &pdev->dev; |
| 711 | i2s_cont->data = (void *)msp; | 709 | i2s_cont->data = (void *)msp; |
| @@ -716,14 +714,6 @@ int ux500_msp_i2s_init_msp(struct platform_device *pdev, | |||
| 716 | msp->i2s_cont = i2s_cont; | 714 | msp->i2s_cont = i2s_cont; |
| 717 | 715 | ||
| 718 | return 0; | 716 | return 0; |
| 719 | |||
| 720 | err_i2s_cont: | ||
| 721 | iounmap(msp->registers); | ||
| 722 | |||
| 723 | err_res: | ||
| 724 | devm_kfree(&pdev->dev, msp); | ||
| 725 | |||
| 726 | return ret; | ||
| 727 | } | 717 | } |
| 728 | 718 | ||
| 729 | void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev, | 719 | void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev, |
| @@ -732,11 +722,6 @@ void ux500_msp_i2s_cleanup_msp(struct platform_device *pdev, | |||
| 732 | dev_dbg(msp->dev, "%s: Enter (id = %d).\n", __func__, msp->id); | 722 | dev_dbg(msp->dev, "%s: Enter (id = %d).\n", __func__, msp->id); |
| 733 | 723 | ||
| 734 | device_unregister(&msp->i2s_cont->dev); | 724 | device_unregister(&msp->i2s_cont->dev); |
| 735 | devm_kfree(&pdev->dev, msp->i2s_cont); | ||
| 736 | |||
| 737 | iounmap(msp->registers); | ||
| 738 | |||
| 739 | devm_kfree(&pdev->dev, msp); | ||
| 740 | } | 725 | } |
| 741 | 726 | ||
| 742 | MODULE_LICENSE("GPL v2"); | 727 | MODULE_LICENSE("GPL v2"); |
diff --git a/sound/usb/card.c b/sound/usb/card.c index d5b5c3388e28..4a469f0cb6d4 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
| @@ -553,7 +553,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
| 553 | struct snd_usb_audio *chip) | 553 | struct snd_usb_audio *chip) |
| 554 | { | 554 | { |
| 555 | struct snd_card *card; | 555 | struct snd_card *card; |
| 556 | struct list_head *p; | 556 | struct list_head *p, *n; |
| 557 | 557 | ||
| 558 | if (chip == (void *)-1L) | 558 | if (chip == (void *)-1L) |
| 559 | return; | 559 | return; |
| @@ -570,7 +570,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
| 570 | snd_usb_stream_disconnect(p); | 570 | snd_usb_stream_disconnect(p); |
| 571 | } | 571 | } |
| 572 | /* release the endpoint resources */ | 572 | /* release the endpoint resources */ |
| 573 | list_for_each(p, &chip->ep_list) { | 573 | list_for_each_safe(p, n, &chip->ep_list) { |
| 574 | snd_usb_endpoint_free(p); | 574 | snd_usb_endpoint_free(p); |
| 575 | } | 575 | } |
| 576 | /* release the midi resources */ | 576 | /* release the midi resources */ |
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index c41181202688..d6e2bb49c59c 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c | |||
| @@ -141,7 +141,7 @@ int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep) | |||
| 141 | * | 141 | * |
| 142 | * For implicit feedback, next_packet_size() is unused. | 142 | * For implicit feedback, next_packet_size() is unused. |
| 143 | */ | 143 | */ |
| 144 | static int next_packet_size(struct snd_usb_endpoint *ep) | 144 | int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep) |
| 145 | { | 145 | { |
| 146 | unsigned long flags; | 146 | unsigned long flags; |
| 147 | int ret; | 147 | int ret; |
| @@ -177,15 +177,6 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep, | |||
| 177 | ep->retire_data_urb(ep->data_subs, urb); | 177 | ep->retire_data_urb(ep->data_subs, urb); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static void prepare_outbound_urb_sizes(struct snd_usb_endpoint *ep, | ||
| 181 | struct snd_urb_ctx *ctx) | ||
| 182 | { | ||
| 183 | int i; | ||
| 184 | |||
| 185 | for (i = 0; i < ctx->packets; ++i) | ||
| 186 | ctx->packet_size[i] = next_packet_size(ep); | ||
| 187 | } | ||
| 188 | |||
| 189 | /* | 180 | /* |
| 190 | * Prepare a PLAYBACK urb for submission to the bus. | 181 | * Prepare a PLAYBACK urb for submission to the bus. |
| 191 | */ | 182 | */ |
| @@ -370,7 +361,6 @@ static void snd_complete_urb(struct urb *urb) | |||
| 370 | goto exit_clear; | 361 | goto exit_clear; |
| 371 | } | 362 | } |
| 372 | 363 | ||
| 373 | prepare_outbound_urb_sizes(ep, ctx); | ||
| 374 | prepare_outbound_urb(ep, ctx); | 364 | prepare_outbound_urb(ep, ctx); |
| 375 | } else { | 365 | } else { |
| 376 | retire_inbound_urb(ep, ctx); | 366 | retire_inbound_urb(ep, ctx); |
| @@ -799,7 +789,9 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, | |||
| 799 | /** | 789 | /** |
| 800 | * snd_usb_endpoint_start: start an snd_usb_endpoint | 790 | * snd_usb_endpoint_start: start an snd_usb_endpoint |
| 801 | * | 791 | * |
| 802 | * @ep: the endpoint to start | 792 | * @ep: the endpoint to start |
| 793 | * @can_sleep: flag indicating whether the operation is executed in | ||
| 794 | * non-atomic context | ||
| 803 | * | 795 | * |
| 804 | * A call to this function will increment the use count of the endpoint. | 796 | * A call to this function will increment the use count of the endpoint. |
| 805 | * In case it is not already running, the URBs for this endpoint will be | 797 | * In case it is not already running, the URBs for this endpoint will be |
| @@ -809,7 +801,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, | |||
| 809 | * | 801 | * |
| 810 | * Returns an error if the URB submission failed, 0 in all other cases. | 802 | * Returns an error if the URB submission failed, 0 in all other cases. |
| 811 | */ | 803 | */ |
| 812 | int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) | 804 | int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep) |
| 813 | { | 805 | { |
| 814 | int err; | 806 | int err; |
| 815 | unsigned int i; | 807 | unsigned int i; |
| @@ -821,6 +813,11 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) | |||
| 821 | if (++ep->use_count != 1) | 813 | if (++ep->use_count != 1) |
| 822 | return 0; | 814 | return 0; |
| 823 | 815 | ||
| 816 | /* just to be sure */ | ||
| 817 | deactivate_urbs(ep, 0, can_sleep); | ||
| 818 | if (can_sleep) | ||
| 819 | wait_clear_urbs(ep); | ||
| 820 | |||
| 824 | ep->active_mask = 0; | 821 | ep->active_mask = 0; |
| 825 | ep->unlink_mask = 0; | 822 | ep->unlink_mask = 0; |
| 826 | ep->phase = 0; | 823 | ep->phase = 0; |
| @@ -850,7 +847,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) | |||
| 850 | goto __error; | 847 | goto __error; |
| 851 | 848 | ||
| 852 | if (usb_pipeout(ep->pipe)) { | 849 | if (usb_pipeout(ep->pipe)) { |
| 853 | prepare_outbound_urb_sizes(ep, urb->context); | ||
| 854 | prepare_outbound_urb(ep, urb->context); | 850 | prepare_outbound_urb(ep, urb->context); |
| 855 | } else { | 851 | } else { |
| 856 | prepare_inbound_urb(ep, urb->context); | 852 | prepare_inbound_urb(ep, urb->context); |
diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h index ee2723fb174f..cbbbdf226d66 100644 --- a/sound/usb/endpoint.h +++ b/sound/usb/endpoint.h | |||
| @@ -13,7 +13,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, | |||
| 13 | struct audioformat *fmt, | 13 | struct audioformat *fmt, |
| 14 | struct snd_usb_endpoint *sync_ep); | 14 | struct snd_usb_endpoint *sync_ep); |
| 15 | 15 | ||
| 16 | int snd_usb_endpoint_start(struct snd_usb_endpoint *ep); | 16 | int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, int can_sleep); |
| 17 | void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, | 17 | void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, |
| 18 | int force, int can_sleep, int wait); | 18 | int force, int can_sleep, int wait); |
| 19 | int snd_usb_endpoint_activate(struct snd_usb_endpoint *ep); | 19 | int snd_usb_endpoint_activate(struct snd_usb_endpoint *ep); |
| @@ -21,6 +21,7 @@ int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep); | |||
| 21 | void snd_usb_endpoint_free(struct list_head *head); | 21 | void snd_usb_endpoint_free(struct list_head *head); |
| 22 | 22 | ||
| 23 | int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep); | 23 | int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep); |
| 24 | int snd_usb_endpoint_next_packet_size(struct snd_usb_endpoint *ep); | ||
| 24 | 25 | ||
| 25 | void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, | 26 | void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, |
| 26 | struct snd_usb_endpoint *sender, | 27 | struct snd_usb_endpoint *sender, |
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 62ec808ed792..f782ce19bf5a 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c | |||
| @@ -212,7 +212,7 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface, | |||
| 212 | } | 212 | } |
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | static int start_endpoints(struct snd_usb_substream *subs) | 215 | static int start_endpoints(struct snd_usb_substream *subs, int can_sleep) |
| 216 | { | 216 | { |
| 217 | int err; | 217 | int err; |
| 218 | 218 | ||
| @@ -225,7 +225,7 @@ static int start_endpoints(struct snd_usb_substream *subs) | |||
| 225 | snd_printdd(KERN_DEBUG "Starting data EP @%p\n", ep); | 225 | snd_printdd(KERN_DEBUG "Starting data EP @%p\n", ep); |
| 226 | 226 | ||
| 227 | ep->data_subs = subs; | 227 | ep->data_subs = subs; |
| 228 | err = snd_usb_endpoint_start(ep); | 228 | err = snd_usb_endpoint_start(ep, can_sleep); |
| 229 | if (err < 0) { | 229 | if (err < 0) { |
| 230 | clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags); | 230 | clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags); |
| 231 | return err; | 231 | return err; |
| @@ -236,10 +236,25 @@ static int start_endpoints(struct snd_usb_substream *subs) | |||
| 236 | !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { | 236 | !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { |
| 237 | struct snd_usb_endpoint *ep = subs->sync_endpoint; | 237 | struct snd_usb_endpoint *ep = subs->sync_endpoint; |
| 238 | 238 | ||
| 239 | if (subs->data_endpoint->iface != subs->sync_endpoint->iface || | ||
| 240 | subs->data_endpoint->alt_idx != subs->sync_endpoint->alt_idx) { | ||
| 241 | err = usb_set_interface(subs->dev, | ||
| 242 | subs->sync_endpoint->iface, | ||
| 243 | subs->sync_endpoint->alt_idx); | ||
| 244 | if (err < 0) { | ||
| 245 | snd_printk(KERN_ERR | ||
| 246 | "%d:%d:%d: cannot set interface (%d)\n", | ||
| 247 | subs->dev->devnum, | ||
| 248 | subs->sync_endpoint->iface, | ||
| 249 | subs->sync_endpoint->alt_idx, err); | ||
| 250 | return -EIO; | ||
| 251 | } | ||
| 252 | } | ||
| 253 | |||
| 239 | snd_printdd(KERN_DEBUG "Starting sync EP @%p\n", ep); | 254 | snd_printdd(KERN_DEBUG "Starting sync EP @%p\n", ep); |
| 240 | 255 | ||
| 241 | ep->sync_slave = subs->data_endpoint; | 256 | ep->sync_slave = subs->data_endpoint; |
| 242 | err = snd_usb_endpoint_start(ep); | 257 | err = snd_usb_endpoint_start(ep, can_sleep); |
| 243 | if (err < 0) { | 258 | if (err < 0) { |
| 244 | clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); | 259 | clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); |
| 245 | return err; | 260 | return err; |
| @@ -544,13 +559,10 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) | |||
| 544 | subs->last_frame_number = 0; | 559 | subs->last_frame_number = 0; |
| 545 | runtime->delay = 0; | 560 | runtime->delay = 0; |
| 546 | 561 | ||
| 547 | /* clear the pending deactivation on the target EPs */ | ||
| 548 | deactivate_endpoints(subs); | ||
| 549 | |||
| 550 | /* for playback, submit the URBs now; otherwise, the first hwptr_done | 562 | /* for playback, submit the URBs now; otherwise, the first hwptr_done |
| 551 | * updates for all URBs would happen at the same time when starting */ | 563 | * updates for all URBs would happen at the same time when starting */ |
| 552 | if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) | 564 | if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) |
| 553 | return start_endpoints(subs); | 565 | return start_endpoints(subs, 1); |
| 554 | 566 | ||
| 555 | return 0; | 567 | return 0; |
| 556 | } | 568 | } |
| @@ -1032,6 +1044,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, | |||
| 1032 | struct urb *urb) | 1044 | struct urb *urb) |
| 1033 | { | 1045 | { |
| 1034 | struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; | 1046 | struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; |
| 1047 | struct snd_usb_endpoint *ep = subs->data_endpoint; | ||
| 1035 | struct snd_urb_ctx *ctx = urb->context; | 1048 | struct snd_urb_ctx *ctx = urb->context; |
| 1036 | unsigned int counts, frames, bytes; | 1049 | unsigned int counts, frames, bytes; |
| 1037 | int i, stride, period_elapsed = 0; | 1050 | int i, stride, period_elapsed = 0; |
| @@ -1043,7 +1056,11 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, | |||
| 1043 | urb->number_of_packets = 0; | 1056 | urb->number_of_packets = 0; |
| 1044 | spin_lock_irqsave(&subs->lock, flags); | 1057 | spin_lock_irqsave(&subs->lock, flags); |
| 1045 | for (i = 0; i < ctx->packets; i++) { | 1058 | for (i = 0; i < ctx->packets; i++) { |
| 1046 | counts = ctx->packet_size[i]; | 1059 | if (ctx->packet_size[i]) |
| 1060 | counts = ctx->packet_size[i]; | ||
| 1061 | else | ||
| 1062 | counts = snd_usb_endpoint_next_packet_size(ep); | ||
| 1063 | |||
| 1047 | /* set up descriptor */ | 1064 | /* set up descriptor */ |
| 1048 | urb->iso_frame_desc[i].offset = frames * stride; | 1065 | urb->iso_frame_desc[i].offset = frames * stride; |
| 1049 | urb->iso_frame_desc[i].length = counts * stride; | 1066 | urb->iso_frame_desc[i].length = counts * stride; |
| @@ -1094,7 +1111,16 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, | |||
| 1094 | subs->hwptr_done += bytes; | 1111 | subs->hwptr_done += bytes; |
| 1095 | if (subs->hwptr_done >= runtime->buffer_size * stride) | 1112 | if (subs->hwptr_done >= runtime->buffer_size * stride) |
| 1096 | subs->hwptr_done -= runtime->buffer_size * stride; | 1113 | subs->hwptr_done -= runtime->buffer_size * stride; |
| 1114 | |||
| 1115 | /* update delay with exact number of samples queued */ | ||
| 1116 | runtime->delay = subs->last_delay; | ||
| 1097 | runtime->delay += frames; | 1117 | runtime->delay += frames; |
| 1118 | subs->last_delay = runtime->delay; | ||
| 1119 | |||
| 1120 | /* realign last_frame_number */ | ||
| 1121 | subs->last_frame_number = usb_get_current_frame_number(subs->dev); | ||
| 1122 | subs->last_frame_number &= 0xFF; /* keep 8 LSBs */ | ||
| 1123 | |||
| 1098 | spin_unlock_irqrestore(&subs->lock, flags); | 1124 | spin_unlock_irqrestore(&subs->lock, flags); |
| 1099 | urb->transfer_buffer_length = bytes; | 1125 | urb->transfer_buffer_length = bytes; |
| 1100 | if (period_elapsed) | 1126 | if (period_elapsed) |
| @@ -1112,12 +1138,32 @@ static void retire_playback_urb(struct snd_usb_substream *subs, | |||
| 1112 | struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; | 1138 | struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; |
| 1113 | int stride = runtime->frame_bits >> 3; | 1139 | int stride = runtime->frame_bits >> 3; |
| 1114 | int processed = urb->transfer_buffer_length / stride; | 1140 | int processed = urb->transfer_buffer_length / stride; |
| 1141 | int est_delay; | ||
| 1142 | |||
| 1143 | /* ignore the delay accounting when procssed=0 is given, i.e. | ||
| 1144 | * silent payloads are procssed before handling the actual data | ||
| 1145 | */ | ||
| 1146 | if (!processed) | ||
| 1147 | return; | ||
| 1115 | 1148 | ||
| 1116 | spin_lock_irqsave(&subs->lock, flags); | 1149 | spin_lock_irqsave(&subs->lock, flags); |
| 1117 | if (processed > runtime->delay) | 1150 | est_delay = snd_usb_pcm_delay(subs, runtime->rate); |
| 1118 | runtime->delay = 0; | 1151 | /* update delay with exact number of samples played */ |
| 1152 | if (processed > subs->last_delay) | ||
| 1153 | subs->last_delay = 0; | ||
| 1119 | else | 1154 | else |
| 1120 | runtime->delay -= processed; | 1155 | subs->last_delay -= processed; |
| 1156 | runtime->delay = subs->last_delay; | ||
| 1157 | |||
| 1158 | /* | ||
| 1159 | * Report when delay estimate is off by more than 2ms. | ||
| 1160 | * The error should be lower than 2ms since the estimate relies | ||
| 1161 | * on two reads of a counter updated every ms. | ||
| 1162 | */ | ||
| 1163 | if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2) | ||
| 1164 | snd_printk(KERN_DEBUG "delay: estimated %d, actual %d\n", | ||
| 1165 | est_delay, subs->last_delay); | ||
| 1166 | |||
| 1121 | spin_unlock_irqrestore(&subs->lock, flags); | 1167 | spin_unlock_irqrestore(&subs->lock, flags); |
| 1122 | } | 1168 | } |
| 1123 | 1169 | ||
| @@ -1175,7 +1221,7 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream | |||
| 1175 | 1221 | ||
| 1176 | switch (cmd) { | 1222 | switch (cmd) { |
| 1177 | case SNDRV_PCM_TRIGGER_START: | 1223 | case SNDRV_PCM_TRIGGER_START: |
| 1178 | err = start_endpoints(subs); | 1224 | err = start_endpoints(subs, 0); |
| 1179 | if (err < 0) | 1225 | if (err < 0) |
| 1180 | return err; | 1226 | return err; |
| 1181 | 1227 | ||
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources index 2884e67ee625..213362850abd 100644 --- a/tools/perf/util/python-ext-sources +++ b/tools/perf/util/python-ext-sources | |||
| @@ -10,10 +10,12 @@ util/ctype.c | |||
| 10 | util/evlist.c | 10 | util/evlist.c |
| 11 | util/evsel.c | 11 | util/evsel.c |
| 12 | util/cpumap.c | 12 | util/cpumap.c |
| 13 | util/hweight.c | ||
| 13 | util/thread_map.c | 14 | util/thread_map.c |
| 14 | util/util.c | 15 | util/util.c |
| 15 | util/xyarray.c | 16 | util/xyarray.c |
| 16 | util/cgroup.c | 17 | util/cgroup.c |
| 17 | util/debugfs.c | 18 | util/debugfs.c |
| 19 | util/rblist.c | ||
| 18 | util/strlist.c | 20 | util/strlist.c |
| 19 | ../../lib/rbtree.c | 21 | ../../lib/rbtree.c |
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 246852397e30..d617f69131d7 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -1976,9 +1976,10 @@ static long kvm_vcpu_compat_ioctl(struct file *filp, | |||
| 1976 | if (copy_from_user(&csigset, sigmask_arg->sigset, | 1976 | if (copy_from_user(&csigset, sigmask_arg->sigset, |
| 1977 | sizeof csigset)) | 1977 | sizeof csigset)) |
| 1978 | goto out; | 1978 | goto out; |
| 1979 | } | 1979 | sigset_from_compat(&sigset, &csigset); |
| 1980 | sigset_from_compat(&sigset, &csigset); | 1980 | r = kvm_vcpu_ioctl_set_sigmask(vcpu, &sigset); |
| 1981 | r = kvm_vcpu_ioctl_set_sigmask(vcpu, &sigset); | 1981 | } else |
| 1982 | r = kvm_vcpu_ioctl_set_sigmask(vcpu, NULL); | ||
| 1982 | break; | 1983 | break; |
| 1983 | } | 1984 | } |
| 1984 | default: | 1985 | default: |
