Changes for GPMC (General Purpose Memory Controller) that take it closer for being just a regular device driver. Remove the ancient omap specific atags that are no longer needed. At some point we were planning to pass the bootloader information with custom atags that did not work out too well. There's no need for these any longer as the kernel has been booting fine without them for quite some time. And Now we have device tree support that can be used instead.
Unified · Split
| @@ -210,3 +210,15 @@ Users: · 209 unmodified lines | ||
| 210 | 210 | firmware assigned instance number of the PCI |
| 211 | 211 | device that can help in understanding the firmware |
| 212 | 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. | |
| @@ -3,15 +3,21 @@ · 2 unmodified lines | ||
| 3 | 3 | biodoc.txt |
| 4 | 4 | - Notes on the Generic Block Layer Rewrite in Linux 2.5 |
| 5 | 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 | 11 | deadline-iosched.txt |
| 8 | 12 | - Deadline IO scheduler tunables |
| 9 | 13 | ioprio.txt |
| 10 | 14 | - Block io priorities (in CFQ scheduler) |
| 15 | +queue-sysfs.txt | |
| 16 | + - Queue's sysfs entries | |
| 11 | 17 | request.txt |
| 12 | 18 | - The members of struct request (in include/linux/blkdev.h) |
| 13 | 19 | stat.txt |
| 14 | − - Block layer statistics in /sys/block/<dev>/stat | |
| 20 | + - Block layer statistics in /sys/block/<device>/stat | |
| 15 | 21 | switching-sched.txt |
| 16 | 22 | - Switching I/O schedulers at runtime |
| 17 | 23 | writeback_cache_control.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 | 12 | CFQ ioscheduler tunables |
| 2 | 13 | ======================== |
| 3 | 14 | |
| @@ -25,6 +36,72 @@ there are multiple spindles behind single LUN (Host based hardware RAID · 21 unmodified lines | ||
| 25 | 36 | controller or for storage arrays), setting slice_idle=0 might end up in better |
| 26 | 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 | 105 | CFQ IOPS Mode for group scheduling |
| 29 | 106 | =================================== |
| 30 | 107 | Basic CFQ design is to provide priority based time slices. Higher priority |
| @@ -9,20 +9,71 @@ These files are the ones found in the /sys/block/xxx/queue/ directory. · 8 unmodified lines | ||
| 9 | 9 | Files denoted with a RO postfix are readonly and the RW postfix means |
| 10 | 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 | 37 | hw_sector_size (RO) |
| 13 | 38 | ------------------- |
| 14 | 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 | 50 | max_hw_sectors_kb (RO) |
| 17 | 51 | ---------------------- |
| 18 | 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 | 59 | max_sectors_kb (RW) |
| 21 | 60 | ------------------- |
| 22 | 61 | This is the maximum number of kilobytes that the block layer will allow |
| 23 | 62 | for a filesystem request. Must be smaller than or equal to the maximum |
| 24 | 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 | 77 | nomerges (RW) |
| 27 | 78 | ------------- |
| 28 | 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, · 16 unmodified lines | ||
| 45 | 96 | each request queue may have upto N request pools, each independently |
| 46 | 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 | 107 | read_ahead_kb (RW) |
| 49 | 108 | ------------------ |
| 50 | 109 | Maximum number of kilobytes to read-ahead for filesystems on this block |
| 51 | 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 | 117 | rq_affinity (RW) |
| 54 | 118 | ---------------- |
| 55 | 119 | If this option is '1', the block layer will migrate request completions to the |
| @@ -10,8 +10,8 @@ Required properties: · 9 unmodified lines | ||
| 10 | 10 | - compatible : Should be "fsl,<chip>-esdhc" |
| 11 | 11 | |
| 12 | 12 | Optional properties: |
| 13 | −- fsl,cd-internal : Indicate to use controller internal card detection | |
| 14 | −- fsl,wp-internal : Indicate to use controller internal write protection | |
| 13 | +- fsl,cd-controller : Indicate to use controller internal card detection | |
| 14 | +- fsl,wp-controller : Indicate to use controller internal write protection | |
| 15 | 15 | |
| 16 | 16 | Examples: |
| 17 | 17 | |
| @@ -19,8 +19,8 @@ esdhc@70004000 { · 1 unmodified line | ||
| 19 | 19 | compatible = "fsl,imx51-esdhc"; |
| 20 | 20 | reg = <0x70004000 0x4000>; |
| 21 | 21 | interrupts = <1>; |
| 22 | − fsl,cd-internal; | |
| 23 | − fsl,wp-internal; | |
| 22 | + fsl,cd-controller; | |
| 23 | + fsl,wp-controller; | |
| 24 | 24 | }; |
| 25 | 25 | |
| 26 | 26 | esdhc@70008000 { |
| @@ -579,7 +579,7 @@ Why: KVM tracepoints provide mostly equivalent information in a much more · 578 unmodified lines | ||
| 579 | 579 | ---------------------------- |
| 580 | 580 | |
| 581 | 581 | What: at91-mci driver ("CONFIG_MMC_AT91") |
| 582 | −When: 3.7 | |
| 582 | +When: 3.8 | |
| 583 | 583 | Why: There are two mci drivers: at91-mci and atmel-mci. The PDC support |
| 584 | 584 | was added to atmel-mci as a first step to support more chips. |
| 585 | 585 | Then at91-mci was kept only for old IP versions (on at91rm9200 and |
| @@ -31,7 +31,7 @@ static void keep_alive(void) · 30 unmodified lines | ||
| 31 | 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 | 36 | close(fd); |
| 37 | 37 | fprintf(stderr, "Stopping watchdog ticks...\n"); |
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | VERSION = 3 |
| 2 | 2 | PATCHLEVEL = 6 |
| 3 | 3 | SUBLEVEL = 0 |
| 4 | −EXTRAVERSION = -rc3 | |
| 4 | +EXTRAVERSION = -rc5 | |
| 5 | 5 | NAME = Saber-toothed Squirrel |
| 6 | 6 | |
| 7 | 7 | # *DOCUMENTATION* |
| @@ -6,7 +6,7 @@ config ARM · 5 unmodified lines | ||
| 6 | 6 | select HAVE_DMA_API_DEBUG |
| 7 | 7 | select HAVE_IDE if PCI || ISA || PCMCIA |
| 8 | 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 | 10 | select HAVE_MEMBLOCK |
| 11 | 11 | select RTC_LIB |
| 12 | 12 | select SYS_SUPPORTS_APM_EMULATION |
| @@ -2144,6 +2144,7 @@ source "drivers/cpufreq/Kconfig" · 2131 unmodified lines | ||
| 2144 | 2144 | config CPU_FREQ_IMX |
| 2145 | 2145 | tristate "CPUfreq driver for i.MX CPUs" |
| 2146 | 2146 | depends on ARCH_MXC && CPU_FREQ |
| 2147 | + select CPU_FREQ_TABLE | |
| 2147 | 2148 | help |
| 2148 | 2149 | This enables the CPUfreq driver for i.MX CPUs. |
| 2149 | 2150 | |
| @@ -154,5 +154,10 @@ · 153 unmodified lines | ||
| 154 | 154 | #size-cells = <0>; |
| 155 | 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 | }; |
| @@ -15,7 +15,7 @@ · 14 unmodified lines | ||
| 15 | 15 | compatible = "atmel,at91sam9g25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9"; |
| 16 | 16 | |
| 17 | 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 | 21 | ahb { |
| @@ -25,8 +25,8 @@ · 24 unmodified lines | ||
| 25 | 25 | aips@70000000 { /* aips-1 */ |
| 26 | 26 | spba@70000000 { |
| 27 | 27 | esdhc@70004000 { /* ESDHC1 */ |
| 28 | − fsl,cd-internal; | |
| 29 | − fsl,wp-internal; | |
| 28 | + fsl,cd-controller; | |
| 29 | + fsl,wp-controller; | |
| 30 | 30 | status = "okay"; |
| 31 | 31 | }; |
| 32 | 32 | |
| @@ -41,9 +41,13 @@ · 40 unmodified lines | ||
| 41 | 41 | }; |
| 42 | 42 | power-blue { |
| 43 | 43 | label = "power:blue"; |
| 44 | − gpios = <&gpio1 11 0>; | |
| 44 | + gpios = <&gpio1 10 0>; | |
| 45 | 45 | linux,default-trigger = "timer"; |
| 46 | 46 | }; |
| 47 | + power-red { | |
| 48 | + label = "power:red"; | |
| 49 | + gpios = <&gpio1 11 0>; | |
| 50 | + }; | |
| 47 | 51 | usb1 { |
| 48 | 52 | label = "usb1:blue"; |
| 49 | 53 | gpios = <&gpio1 12 0>; |
| @@ -66,6 +66,7 @@ · 65 unmodified lines | ||
| 66 | 66 | |
| 67 | 67 | vcxio: regulator@8 { |
| 68 | 68 | compatible = "ti,twl6030-vcxio"; |
| 69 | + regulator-always-on; | |
| 69 | 70 | }; |
| 70 | 71 | |
| 71 | 72 | vusb: regulator@9 { |
| @@ -74,10 +75,12 @@ · 2 unmodified lines | ||
| 74 | 75 | |
| 75 | 76 | v1v8: regulator@10 { |
| 76 | 77 | compatible = "ti,twl6030-v1v8"; |
| 78 | + regulator-always-on; | |
| 77 | 79 | }; |
| 78 | 80 | |
| 79 | 81 | v2v1: regulator@11 { |
| 80 | 82 | compatible = "ti,twl6030-v2v1"; |
| 83 | + regulator-always-on; | |
| 81 | 84 | }; |
| 82 | 85 | |
| 83 | 86 | clk32kg: regulator@12 { |
| @@ -33,7 +33,7 @@ CONFIG_AEABI=y · 32 unmodified lines | ||
| 33 | 33 | CONFIG_FORCE_MAX_ZONEORDER=13 |
| 34 | 34 | CONFIG_ZBOOT_ROM_TEXT=0x0 |
| 35 | 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 | 37 | CONFIG_CMDLINE_FORCE=y |
| 38 | 38 | CONFIG_KEXEC=y |
| 39 | 39 | CONFIG_VFP=y |
| @@ -86,6 +86,7 @@ CONFIG_NEW_LEDS=y · 85 unmodified lines | ||
| 86 | 86 | CONFIG_LEDS_CLASS=y |
| 87 | 87 | CONFIG_LEDS_LM3530=y |
| 88 | 88 | CONFIG_LEDS_LP5521=y |
| 89 | +CONFIG_LEDS_GPIO=y | |
| 89 | 90 | CONFIG_RTC_CLASS=y |
| 90 | 91 | CONFIG_RTC_DRV_AB8500=y |
| 91 | 92 | CONFIG_RTC_DRV_PL031=y |
| @@ -202,6 +202,13 @@ static inline void dma_free_writecombine(struct device *dev, size_t size, · 201 unmodified lines | ||
| 202 | 202 | return dma_free_attrs(dev, size, cpu_addr, dma_handle, &attrs); |
| 203 | 203 | } |
| 204 | 204 | |
| 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 | + | |
| 205 | 212 | /* |
| 206 | 213 | * This can be called during boot to increase the size of the consistent |
| 207 | 214 | * DMA region above it's default value of 2MB. It must be called before the |
| @@ -197,7 +197,7 @@ void __init at91rm9200_timer_init(void) · 196 unmodified lines | ||
| 197 | 197 | at91_st_read(AT91_ST_SR); |
| 198 | 198 | |
| 199 | 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 | 202 | /* The 32KiHz "Slow Clock" (tick every 30517.58 nanoseconds) is used |
| 203 | 203 | * directly for the clocksource and all clockevents, after adjusting |
| @@ -726,6 +726,8 @@ static struct resource rtt_resources[] = { · 725 unmodified lines | ||
| 726 | 726 | .flags = IORESOURCE_MEM, |
| 727 | 727 | }, { |
| 728 | 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) · 12 unmodified lines | ||
| 744 | 746 | * The second resource is needed: |
| 745 | 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 | 750 | rtt_resources[1].start = AT91SAM9260_BASE_GPBR + |
| 749 | 751 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 750 | 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 | 756 | #else |
| 753 | 757 | static void __init at91_add_device_rtt_rtc(void) |
| @@ -609,6 +609,8 @@ static struct resource rtt_resources[] = { · 608 unmodified lines | ||
| 609 | 609 | .flags = IORESOURCE_MEM, |
| 610 | 610 | }, { |
| 611 | 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) · 11 unmodified lines | ||
| 626 | 628 | * The second resource is needed: |
| 627 | 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 | 632 | rtt_resources[1].start = AT91SAM9261_BASE_GPBR + |
| 631 | 633 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 632 | 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 | 638 | #else |
| 635 | 639 | static void __init at91_add_device_rtt_rtc(void) |
| @@ -990,6 +990,8 @@ static struct resource rtt0_resources[] = { · 989 unmodified lines | ||
| 990 | 990 | .flags = IORESOURCE_MEM, |
| 991 | 991 | }, { |
| 992 | 992 | .flags = IORESOURCE_MEM, |
| 993 | + }, { | |
| 994 | + .flags = IORESOURCE_IRQ, | |
| 993 | 995 | } |
| 994 | 996 | }; |
| 995 | 997 | |
| @@ -1006,6 +1008,8 @@ static struct resource rtt1_resources[] = { · 10 unmodified lines | ||
| 1006 | 1008 | .flags = IORESOURCE_MEM, |
| 1007 | 1009 | }, { |
| 1008 | 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) · 15 unmodified lines | ||
| 1027 | 1031 | * The second resource is needed only for the chosen RTT: |
| 1028 | 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 | 1035 | at91sam9263_rtt1_device.num_resources = 1; |
| 1032 | 1036 | pdev = &at91sam9263_rtt0_device; |
| 1033 | 1037 | r = rtt0_resources; |
| 1034 | 1038 | break; |
| 1035 | 1039 | case 1: |
| 1036 | 1040 | at91sam9263_rtt0_device.num_resources = 1; |
| 1037 | − at91sam9263_rtt1_device.num_resources = 2; | |
| 1041 | + at91sam9263_rtt1_device.num_resources = 3; | |
| 1038 | 1042 | pdev = &at91sam9263_rtt1_device; |
| 1039 | 1043 | r = rtt1_resources; |
| 1040 | 1044 | break; |
| @@ -1047,6 +1051,8 @@ static void __init at91_add_device_rtt_rtc(void) · 6 unmodified lines | ||
| 1047 | 1051 | pdev->name = "rtc-at91sam9"; |
| 1048 | 1052 | r[1].start = AT91SAM9263_BASE_GPBR + 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 1049 | 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 | 1057 | #else |
| 1052 | 1058 | static void __init at91_add_device_rtt_rtc(void) |
| @@ -1293,6 +1293,8 @@ static struct resource rtt_resources[] = { · 1292 unmodified lines | ||
| 1293 | 1293 | .flags = IORESOURCE_MEM, |
| 1294 | 1294 | }, { |
| 1295 | 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) · 11 unmodified lines | ||
| 1310 | 1312 | * The second resource is needed: |
| 1311 | 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 | 1316 | rtt_resources[1].start = AT91SAM9G45_BASE_GPBR + |
| 1315 | 1317 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 1316 | 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 | 1322 | #else |
| 1319 | 1323 | static void __init at91_add_device_rtt_rtc(void) |
| @@ -688,6 +688,8 @@ static struct resource rtt_resources[] = { · 687 unmodified lines | ||
| 688 | 688 | .flags = IORESOURCE_MEM, |
| 689 | 689 | }, { |
| 690 | 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) · 11 unmodified lines | ||
| 705 | 707 | * The second resource is needed: |
| 706 | 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 | 711 | rtt_resources[1].start = AT91SAM9RL_BASE_GPBR + |
| 710 | 712 | 4 * CONFIG_RTC_DRV_AT91SAM9_GPBR; |
| 711 | 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 | 717 | #else |
| 714 | 718 | static void __init at91_add_device_rtt_rtc(void) |
| @@ -63,6 +63,12 @@ EXPORT_SYMBOL_GPL(at91_pmc_base); · 62 unmodified lines | ||
| 63 | 63 | |
| 64 | 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 | 72 | #define cpu_has_pllb() (!(cpu_is_at91sam9rl() \ |
| 67 | 73 | || cpu_is_at91sam9g45() \ |
| 68 | 74 | || cpu_is_at91sam9x5() \ |
| @@ -706,6 +712,12 @@ static int __init at91_pmc_init(unsigned long main_clock) · 637 unmodified lines | ||
| 706 | 712 | } else if (cpu_has_800M_plla()) { |
| 707 | 713 | if (plla.rate_hz > 800000000) |
| 708 | 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 | 721 | } else { |
| 710 | 722 | if (plla.rate_hz > 209000000) |
| 711 | 723 | pll_overclock = true; |
| @@ -102,7 +102,8 @@ void __init dove_ehci1_init(void) · 101 unmodified lines | ||
| 102 | 102 | void __init dove_ge00_init(struct mv643xx_eth_platform_data *eth_data) |
| 103 | 103 | { |
| 104 | 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 | /***************************************************************************** |
| @@ -42,6 +42,7 @@ · 41 unmodified lines | ||
| 42 | 42 | #include <plat/backlight.h> |
| 43 | 43 | #include <plat/fb.h> |
| 44 | 44 | #include <plat/mfc.h> |
| 45 | +#include <plat/hdmi.h> | |
| 45 | 46 | |
| 46 | 47 | #include <mach/ohci.h> |
| 47 | 48 | #include <mach/map.h> |
| @@ -734,6 +735,11 @@ static void __init origen_bt_setup(void) · 686 unmodified lines | ||
| 734 | 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 | 743 | static void s5p_tv_setup(void) |
| 738 | 744 | { |
| 739 | 745 | /* Direct HPD to HDMI chip */ |
| @@ -781,6 +787,7 @@ static void __init origen_machine_init(void) · 41 unmodified lines | ||
| 781 | 787 | |
| 782 | 788 | s5p_tv_setup(); |
| 783 | 789 | s5p_i2c_hdmiphy_set_platdata(NULL); |
| 790 | + s5p_hdmi_set_platdata(&hdmiphy_info, NULL, 0); | |
| 784 | 791 | |
| 785 | 792 | #ifdef CONFIG_DRM_EXYNOS |
| 786 | 793 | s5p_device_fimd0.dev.platform_data = &drm_fimd_pdata; |
| @@ -40,6 +40,7 @@ · 39 unmodified lines | ||
| 40 | 40 | #include <plat/mfc.h> |
| 41 | 41 | #include <plat/ehci.h> |
| 42 | 42 | #include <plat/clock.h> |
| 43 | +#include <plat/hdmi.h> | |
| 43 | 44 | |
| 44 | 45 | #include <mach/map.h> |
| 45 | 46 | #include <mach/ohci.h> |
| @@ -354,6 +355,11 @@ static struct platform_pwm_backlight_data smdkv310_bl_data = { · 308 unmodified lines | ||
| 354 | 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 | 363 | static void s5p_tv_setup(void) |
| 358 | 364 | { |
| 359 | 365 | /* direct HPD to HDMI chip */ |
| @@ -388,6 +394,7 @@ static void __init smdkv310_machine_init(void) · 28 unmodified lines | ||
| 388 | 394 | |
| 389 | 395 | s5p_tv_setup(); |
| 390 | 396 | s5p_i2c_hdmiphy_set_platdata(NULL); |
| 397 | + s5p_hdmi_set_platdata(&hdmiphy_info, NULL, 0); | |
| 391 | 398 | |
| 392 | 399 | samsung_keypad_set_platdata(&smdkv310_keypad_data); |
| 393 | 400 | |
| @@ -17,6 +17,7 @@ · 16 unmodified lines | ||
| 17 | 17 | #include <linux/sched.h> |
| 18 | 18 | #include <asm/irq.h> |
| 19 | 19 | #include <asm/mach/irq.h> |
| 20 | +#include <asm/system_misc.h> | |
| 20 | 21 | #include <mach/hardware.h> |
| 21 | 22 | |
| 22 | 23 | #define IRQ_SOURCE(base_addr) (base_addr + 0x00) |
| @@ -9,7 +9,8 @@ obj-$(CONFIG_SOC_IMX27) += clk-imx27.o mm-imx27.o ehci-imx27.o · 8 unmodified lines | ||
| 9 | 9 | obj-$(CONFIG_SOC_IMX31) += mm-imx3.o cpu-imx31.o clk-imx31.o iomux-imx31.o ehci-imx31.o pm-imx3.o |
| 10 | 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 | 15 | obj-$(CONFIG_COMMON_CLK) += clk-pllv1.o clk-pllv2.o clk-pllv3.o clk-gate2.o \ |
| 15 | 16 | clk-pfd.o clk-busy.o |
| @@ -70,14 +71,13 @@ obj-$(CONFIG_DEBUG_LL) += lluart.o · 54 unmodified lines | ||
| 70 | 71 | obj-$(CONFIG_HAVE_IMX_GPC) += gpc.o |
| 71 | 72 | obj-$(CONFIG_HAVE_IMX_MMDC) += mmdc.o |
| 72 | 73 | obj-$(CONFIG_HAVE_IMX_SRC) += src.o |
| 73 | −obj-$(CONFIG_CPU_V7) += head-v7.o | |
| 74 | −AFLAGS_head-v7.o :=-Wa,-march=armv7-a | |
| 75 | −obj-$(CONFIG_SMP) += platsmp.o | |
| 74 | +AFLAGS_headsmp.o :=-Wa,-march=armv7-a | |
| 75 | +obj-$(CONFIG_SMP) += headsmp.o platsmp.o | |
| 76 | 76 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
| 77 | 77 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o |
| 78 | 78 | |
| 79 | 79 | ifeq ($(CONFIG_PM),y) |
| 80 | −obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o | |
| 80 | +obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o | |
| 81 | 81 | endif |
| 82 | 82 | |
| 83 | 83 | # i.MX5 based machines |
| @@ -152,7 +152,7 @@ enum mx6q_clks { · 151 unmodified lines | ||
| 152 | 152 | ssi2, ssi3, uart_ipg, uart_serial, usboh3, usdhc1, usdhc2, usdhc3, |
| 153 | 153 | usdhc4, vdo_axi, vpu_axi, cko1, pll1_sys, pll2_bus, pll3_usb_otg, |
| 154 | 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 | 156 | clk_max |
| 157 | 157 | }; |
| 158 | 158 | |
| @@ -288,8 +288,10 @@ int __init mx6q_clocks_init(void) · 129 unmodified lines | ||
| 288 | 288 | clk[gpu3d_shader] = imx_clk_divider("gpu3d_shader", "gpu3d_shader_sel", base + 0x18, 29, 3); |
| 289 | 289 | clk[ipu1_podf] = imx_clk_divider("ipu1_podf", "ipu1_sel", base + 0x3c, 11, 3); |
| 290 | 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); | |
| 292 | − clk[ldb_di1_podf] = imx_clk_divider("ldb_di1_podf", "ldb_di1_sel", base + 0x20, 11, 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_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 | 295 | clk[ipu1_di0_pre] = imx_clk_divider("ipu1_di0_pre", "ipu1_di0_pre_sel", base + 0x34, 3, 3); |
| 294 | 296 | clk[ipu1_di1_pre] = imx_clk_divider("ipu1_di1_pre", "ipu1_di1_pre_sel", base + 0x34, 12, 3); |
| 295 | 297 | clk[ipu2_di0_pre] = imx_clk_divider("ipu2_di0_pre", "ipu2_di0_pre_sel", base + 0x38, 3, 3); |
File renamed without changes.
| @@ -42,22 +42,6 @@ static inline void cpu_enter_lowpower(void) · 41 unmodified lines | ||
| 42 | 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 | 46 | * platform-specific code to shutdown a CPU |
| 63 | 47 | * |
| @@ -67,11 +51,10 @@ void platform_cpu_die(unsigned int cpu) · 3 unmodified lines | ||
| 67 | 51 | { |
| 68 | 52 | cpu_enter_lowpower(); |
| 69 | 53 | imx_enable_cpu(cpu, false); |
| 70 | − cpu_do_idle(); | |
| 71 | − cpu_leave_lowpower(); | |
| 72 | 54 | |
| 73 | − /* We should never return from idle */ | |
| 74 | − panic("cpu %d unexpectedly exit from shutdown\n", cpu); | |
| 55 | + /* spin here until hardware takes it down */ | |
| 56 | + while (1) | |
| 57 | + ; | |
| 75 | 58 | } |
| 76 | 59 | |
| 77 | 60 | int platform_cpu_disable(unsigned int cpu) |
| @@ -71,7 +71,7 @@ soft: · 70 unmodified lines | ||
| 71 | 71 | /* For imx6q sabrelite board: set KSZ9021RN RGMII pad skew */ |
| 72 | 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 | 75 | /* min rx data delay */ |
| 76 | 76 | phy_write(phydev, 0x0b, 0x8105); |
| 77 | 77 | phy_write(phydev, 0x0c, 0x0000); |
| @@ -112,7 +112,7 @@ put_clk: · 34 unmodified lines | ||
| 112 | 112 | |
| 113 | 113 | static void __init imx6q_sabrelite_init(void) |
| 114 | 114 | { |
| 115 | − if (IS_ENABLED(CONFIG_PHYLIB)) | |
| 115 | + if (IS_BUILTIN(CONFIG_PHYLIB)) | |
| 116 | 116 | phy_register_fixup_for_uid(PHY_ID_KSZ9021, MICREL_PHY_ID_MASK, |
| 117 | 117 | ksz9021rn_phy_fixup); |
| 118 | 118 | imx6q_sabrelite_cko1_setup(); |
| @@ -7,7 +7,8 @@ dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns320.dtb · 6 unmodified lines | ||
| 7 | 7 | dtb-$(CONFIG_MACH_DLINK_KIRKWOOD_DT) += kirkwood-dns325.dtb |
| 8 | 8 | dtb-$(CONFIG_MACH_ICONNECT_DT) += kirkwood-iconnect.dtb |
| 9 | 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 | 12 | dtb-$(CONFIG_MACH_GOFLEXNET_DT) += kirkwood-goflexnet.dtb |
| 12 | 13 | dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lschlv2.dtb |
| 13 | 14 | dtb-$(CONFIG_MACH_LSXL_DT) += kirkwood-lsxhl.dtb |
| @@ -301,7 +301,7 @@ void __init kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data) · 300 unmodified lines | ||
| 301 | 301 | { |
| 302 | 302 | orion_ge00_init(eth_data, |
| 303 | 303 | GE00_PHYS_BASE, IRQ_KIRKWOOD_GE00_SUM, |
| 304 | − IRQ_KIRKWOOD_GE00_ERR); | |
| 304 | + IRQ_KIRKWOOD_GE00_ERR, 1600); | |
| 305 | 305 | /* The interface forgets the MAC address assigned by u-boot if |
| 306 | 306 | the clock is turned off, so claim the clk now. */ |
| 307 | 307 | clk_prepare_enable(ge0); |
| @@ -315,7 +315,7 @@ void __init kirkwood_ge01_init(struct mv643xx_eth_platform_data *eth_data) · 7 unmodified lines | ||
| 315 | 315 | { |
| 316 | 316 | orion_ge01_init(eth_data, |
| 317 | 317 | GE01_PHYS_BASE, IRQ_KIRKWOOD_GE01_SUM, |
| 318 | − IRQ_KIRKWOOD_GE01_ERR); | |
| 318 | + IRQ_KIRKWOOD_GE01_ERR, 1600); | |
| 319 | 319 | clk_prepare_enable(ge1); |
| 320 | 320 | } |
| 321 | 321 | |
| @@ -517,6 +517,13 @@ void __init kirkwood_wdt_init(void) · 195 unmodified lines | ||
| 517 | 517 | void __init kirkwood_init_early(void) |
| 518 | 518 | { |
| 519 | 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 | 529 | int kirkwood_tclk; |
| @@ -10,6 +10,7 @@ · 9 unmodified lines | ||
| 10 | 10 | |
| 11 | 11 | #include <linux/kernel.h> |
| 12 | 12 | #include <linux/init.h> |
| 13 | +#include <linux/sizes.h> | |
| 13 | 14 | #include <linux/platform_device.h> |
| 14 | 15 | #include <linux/mtd/partitions.h> |
| 15 | 16 | #include <linux/ata_platform.h> |
| @@ -68,7 +68,7 @@ static int __devinit sram_probe(struct platform_device *pdev) · 67 unmodified lines | ||
| 68 | 68 | struct resource *res; |
| 69 | 69 | int ret = 0; |
| 70 | 70 | |
| 71 | − if (!pdata && !pdata->pool_name) | |
| 71 | + if (!pdata || !pdata->pool_name) | |
| 72 | 72 | return -ENODEV; |
| 73 | 73 | |
| 74 | 74 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
| @@ -37,7 +37,7 @@ · 36 unmodified lines | ||
| 37 | 37 | #define WIN0_OFF(n) (BRIDGE_VIRT_BASE + 0x0000 + ((n) << 4)) |
| 38 | 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 | 43 | * Find the control register base address for this window. |
| @@ -213,7 +213,8 @@ void __init mv78xx0_ge00_init(struct mv643xx_eth_platform_data *eth_data) · 212 unmodified lines | ||
| 213 | 213 | { |
| 214 | 214 | orion_ge00_init(eth_data, |
| 215 | 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) · 4 unmodified lines | ||
| 224 | 225 | { |
| 225 | 226 | orion_ge01_init(eth_data, |
| 226 | 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 | |
| @@ -37,7 +37,6 @@ · 36 unmodified lines | ||
| 37 | 37 | #include <plat/board-ams-delta.h> |
| 38 | 38 | #include <plat/keypad.h> |
| 39 | 39 | #include <plat/mux.h> |
| 40 | −#include <plat/board.h> | |
| 41 | 40 | |
| 42 | 41 | #include <mach/hardware.h> |
| 43 | 42 | #include <mach/ams-delta-fiq.h> |
| @@ -32,7 +32,6 @@ · 31 unmodified lines | ||
| 32 | 32 | #include <plat/flash.h> |
| 33 | 33 | #include <plat/fpga.h> |
| 34 | 34 | #include <plat/keypad.h> |
| 35 | −#include <plat/board.h> | |
| 36 | 35 | |
| 37 | 36 | #include <mach/hardware.h> |
| 38 | 37 | |
| @@ -23,7 +23,6 @@ · 22 unmodified lines | ||
| 23 | 23 | #include <asm/mach/map.h> |
| 24 | 24 | |
| 25 | 25 | #include <plat/mux.h> |
| 26 | −#include <plat/board.h> | |
| 27 | 26 | |
| 28 | 27 | #include <mach/usb.h> |
| 29 | 28 | |
| @@ -52,9 +51,6 @@ static struct omap_usb_config generic1610_usb_config __initdata = { · 22 unmodified lines | ||
| 52 | 51 | }; |
| 53 | 52 | #endif |
| 54 | 53 | |
| 55 | −static struct omap_board_config_kernel generic_config[] __initdata = { | |
| 56 | −}; | |
| 57 | − | |
| 58 | 54 | static void __init omap_generic_init(void) |
| 59 | 55 | { |
| 60 | 56 | #ifdef CONFIG_ARCH_OMAP15XX |
| @@ -76,8 +72,6 @@ static void __init omap_generic_init(void) · 15 unmodified lines | ||
| 76 | 72 | } |
| 77 | 73 | #endif |
| 78 | 74 | |
| 79 | − omap_board_config = generic_config; | |
| 80 | − omap_board_config_size = ARRAY_SIZE(generic_config); | |
| 81 | 75 | omap_serial_init(); |
| 82 | 76 | omap_register_i2c_bus(1, 100, NULL, 0); |
| 83 | 77 | } |
| @@ -42,7 +42,6 @@ · 41 unmodified lines | ||
| 42 | 42 | #include <asm/mach/arch.h> |
| 43 | 43 | |
| 44 | 44 | #include <plat/omap7xx.h> |
| 45 | −#include <plat/board.h> | |
| 46 | 45 | #include <plat/keypad.h> |
| 47 | 46 | #include <plat/mmc.h> |
| 48 | 47 | |
| @@ -26,7 +26,6 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <asm/mach/map.h> |
| 27 | 27 | |
| 28 | 28 | #include <plat/mux.h> |
| 29 | −#include <plat/board.h> | |
| 30 | 29 | #include <plat/keypad.h> |
| 31 | 30 | #include <plat/lcd_mipid.h> |
| 32 | 31 | #include <plat/mmc.h> |
| @@ -39,6 +39,7 @@ · 38 unmodified lines | ||
| 39 | 39 | #include <linux/mtd/partitions.h> |
| 40 | 40 | #include <linux/mtd/physmap.h> |
| 41 | 41 | #include <linux/i2c/tps65010.h> |
| 42 | +#include <linux/platform_data/omap1_bl.h> | |
| 42 | 43 | |
| 43 | 44 | #include <asm/mach-types.h> |
| 44 | 45 | #include <asm/mach/arch.h> |
| @@ -28,6 +28,7 @@ · 27 unmodified lines | ||
| 28 | 28 | #include <linux/interrupt.h> |
| 29 | 29 | #include <linux/apm-emulation.h> |
| 30 | 30 | #include <linux/omapfb.h> |
| 31 | +#include <linux/platform_data/omap1_bl.h> | |
| 31 | 32 | |
| 32 | 33 | #include <asm/mach-types.h> |
| 33 | 34 | #include <asm/mach/arch.h> |
| @@ -37,7 +38,6 @@ · 3 unmodified lines | ||
| 37 | 38 | #include <plat/mux.h> |
| 38 | 39 | #include <plat/tc.h> |
| 39 | 40 | #include <plat/dma.h> |
| 40 | −#include <plat/board.h> | |
| 41 | 41 | #include <plat/irda.h> |
| 42 | 42 | #include <plat/keypad.h> |
| 43 | 43 | |
| @@ -27,6 +27,7 @@ · 26 unmodified lines | ||
| 27 | 27 | #include <linux/omapfb.h> |
| 28 | 28 | #include <linux/spi/spi.h> |
| 29 | 29 | #include <linux/spi/ads7846.h> |
| 30 | +#include <linux/platform_data/omap1_bl.h> | |
| 30 | 31 | |
| 31 | 32 | #include <asm/mach-types.h> |
| 32 | 33 | #include <asm/mach/arch.h> |
| @@ -37,7 +38,6 @@ · 4 unmodified lines | ||
| 37 | 38 | #include <plat/mux.h> |
| 38 | 39 | #include <plat/dma.h> |
| 39 | 40 | #include <plat/tc.h> |
| 40 | −#include <plat/board.h> | |
| 41 | 41 | #include <plat/irda.h> |
| 42 | 42 | #include <plat/keypad.h> |
| 43 | 43 | |
| @@ -30,6 +30,7 @@ · 29 unmodified lines | ||
| 30 | 30 | #include <linux/omapfb.h> |
| 31 | 31 | #include <linux/spi/spi.h> |
| 32 | 32 | #include <linux/spi/ads7846.h> |
| 33 | +#include <linux/platform_data/omap1_bl.h> | |
| 33 | 34 | |
| 34 | 35 | #include <asm/mach-types.h> |
| 35 | 36 | #include <asm/mach/arch.h> |
| @@ -39,7 +40,6 @@ · 3 unmodified lines | ||
| 39 | 40 | #include <plat/mux.h> |
| 40 | 41 | #include <plat/dma.h> |
| 41 | 42 | #include <plat/tc.h> |
| 42 | −#include <plat/board.h> | |
| 43 | 43 | #include <plat/irda.h> |
| 44 | 44 | #include <plat/keypad.h> |
| 45 | 45 | |
| @@ -32,7 +32,6 @@ · 31 unmodified lines | ||
| 32 | 32 | #include <plat/fpga.h> |
| 33 | 33 | #include <plat/flash.h> |
| 34 | 34 | #include <plat/keypad.h> |
| 35 | −#include <plat/board.h> | |
| 36 | 35 | |
| 37 | 36 | #include <mach/hardware.h> |
| 38 | 37 | |
| @@ -38,7 +38,6 @@ · 37 unmodified lines | ||
| 38 | 38 | #include <plat/dma.h> |
| 39 | 39 | #include <plat/irda.h> |
| 40 | 40 | #include <plat/tc.h> |
| 41 | −#include <plat/board.h> | |
| 42 | 41 | #include <plat/keypad.h> |
| 43 | 42 | #include <plat/board-sx1.h> |
| 44 | 43 | |
| @@ -35,7 +35,6 @@ · 34 unmodified lines | ||
| 35 | 35 | #include <plat/flash.h> |
| 36 | 36 | #include <plat/mux.h> |
| 37 | 37 | #include <plat/tc.h> |
| 38 | −#include <plat/board.h> | |
| 39 | 38 | |
| 40 | 39 | #include <mach/hardware.h> |
| 41 | 40 | #include <mach/usb.h> |
| @@ -155,9 +154,6 @@ static struct omap_usb_config voiceblue_usb_config __initdata = { · 113 unmodified lines | ||
| 155 | 154 | .pins[2] = 6, |
| 156 | 155 | }; |
| 157 | 156 | |
| 158 | −static struct omap_board_config_kernel voiceblue_config[] = { | |
| 159 | −}; | |
| 160 | − | |
| 161 | 157 | #define MACHINE_PANICED 1 |
| 162 | 158 | #define MACHINE_REBOOTING 2 |
| 163 | 159 | #define MACHINE_REBOOT 4 |
| @@ -275,8 +271,6 @@ static void __init voiceblue_init(void) · 111 unmodified lines | ||
| 275 | 271 | voiceblue_smc91x_resources[1].start = gpio_to_irq(8); |
| 276 | 272 | voiceblue_smc91x_resources[1].end = gpio_to_irq(8); |
| 277 | 273 | platform_add_devices(voiceblue_devices, ARRAY_SIZE(voiceblue_devices)); |
| 278 | − omap_board_config = voiceblue_config; | |
| 279 | − omap_board_config_size = ARRAY_SIZE(voiceblue_config); | |
| 280 | 274 | omap_serial_init(); |
| 281 | 275 | omap1_usb_init(&voiceblue_usb_config); |
| 282 | 276 | omap_register_i2c_bus(1, 100, NULL, 0); |
| @@ -25,7 +25,6 @@ · 24 unmodified lines | ||
| 25 | 25 | #include <plat/clock.h> |
| 26 | 26 | #include <plat/cpu.h> |
| 27 | 27 | #include <plat/clkdev_omap.h> |
| 28 | −#include <plat/board.h> | |
| 29 | 28 | #include <plat/sram.h> /* for omap_sram_reprogram_clock() */ |
| 30 | 29 | |
| 31 | 30 | #include <mach/hardware.h> |
| @@ -788,7 +787,6 @@ u32 cpu_mask; · 756 unmodified lines | ||
| 788 | 787 | int __init omap1_clk_init(void) |
| 789 | 788 | { |
| 790 | 789 | struct omap_clk *c; |
| 791 | − const struct omap_clock_config *info; | |
| 792 | 790 | int crystal_type = 0; /* Default 12 MHz */ |
| 793 | 791 | u32 reg; |
| 794 | 792 | |
| @@ -837,12 +835,6 @@ int __init omap1_clk_init(void) · 42 unmodified lines | ||
| 837 | 835 | ck_dpll1_p = clk_get(NULL, "ck_dpll1"); |
| 838 | 836 | ck_ref_p = clk_get(NULL, "ck_ref"); |
| 839 | 837 | |
| 840 | − info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config); | |
| 841 | − if (info != NULL) { | |
| 842 | − if (!cpu_is_omap15xx()) | |
| 843 | − crystal_type = info->system_clock_type; | |
| 844 | − } | |
| 845 | − | |
| 846 | 838 | if (cpu_is_omap7xx()) |
| 847 | 839 | ck_ref.rate = 13000000; |
| 848 | 840 | if (cpu_is_omap16xx() && crystal_type == 2) |
| @@ -20,7 +20,6 @@ · 19 unmodified lines | ||
| 20 | 20 | #include <asm/mach/map.h> |
| 21 | 21 | |
| 22 | 22 | #include <plat/tc.h> |
| 23 | −#include <plat/board.h> | |
| 24 | 23 | #include <plat/mux.h> |
| 25 | 24 | #include <plat/dma.h> |
| 26 | 25 | #include <plat/mmc.h> |
| @@ -22,7 +22,6 @@ · 21 unmodified lines | ||
| 22 | 22 | |
| 23 | 23 | #include <asm/mach-types.h> |
| 24 | 24 | |
| 25 | −#include <plat/board.h> | |
| 26 | 25 | #include <plat/mux.h> |
| 27 | 26 | #include <plat/fpga.h> |
| 28 | 27 | |
| @@ -62,13 +62,14 @@ config ARCH_OMAP4 · 61 unmodified lines | ||
| 62 | 62 | select PM_OPP if PM |
| 63 | 63 | select USB_ARCH_HAS_EHCI if USB_SUPPORT |
| 64 | 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 | 67 | config SOC_OMAP5 |
| 68 | 68 | bool "TI OMAP5" |
| 69 | 69 | select CPU_V7 |
| 70 | 70 | select ARM_GIC |
| 71 | 71 | select HAVE_SMP |
| 72 | + select ARM_CPU_SUSPEND if PM | |
| 72 | 73 | |
| 73 | 74 | comment "OMAP Core Type" |
| 74 | 75 | depends on ARCH_OMAP2 |
| @@ -33,7 +33,6 @@ · 32 unmodified lines | ||
| 33 | 33 | #include <asm/mach/arch.h> |
| 34 | 34 | #include <asm/mach/map.h> |
| 35 | 35 | |
| 36 | −#include <plat/board.h> | |
| 37 | 36 | #include "common.h" |
| 38 | 37 | #include <plat/gpmc.h> |
| 39 | 38 | #include <plat/usb.h> |
| @@ -31,7 +31,6 @@ · 30 unmodified lines | ||
| 31 | 31 | #include <asm/mach/map.h> |
| 32 | 32 | |
| 33 | 33 | #include <plat/mcspi.h> |
| 34 | −#include <plat/board.h> | |
| 35 | 34 | #include <plat/usb.h> |
| 36 | 35 | #include "common.h" |
| 37 | 36 | #include <plat/dma.h> |
| @@ -191,9 +190,6 @@ static struct omap_dss_board_info sdp3430_dss_data = { · 153 unmodified lines | ||
| 191 | 190 | .default_device = &sdp3430_lcd_device, |
| 192 | 191 | }; |
| 193 | 192 | |
| 194 | −static struct omap_board_config_kernel sdp3430_config[] __initdata = { | |
| 195 | −}; | |
| 196 | − | |
| 197 | 193 | static struct omap2_hsmmc_info mmc[] = { |
| 198 | 194 | { |
| 199 | 195 | .mmc = 1, |
| @@ -576,8 +572,6 @@ static void __init omap_3430sdp_init(void) · 376 unmodified lines | ||
| 576 | 572 | int gpio_pendown; |
| 577 | 573 | |
| 578 | 574 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 579 | − omap_board_config = sdp3430_config; | |
| 580 | − omap_board_config_size = ARRAY_SIZE(sdp3430_config); | |
| 581 | 575 | omap_hsmmc_init(mmc); |
| 582 | 576 | omap3430_i2c_init(); |
| 583 | 577 | omap_display_init(&sdp3430_dss_data); |
| @@ -17,7 +17,6 @@ · 16 unmodified lines | ||
| 17 | 17 | #include <asm/mach/arch.h> |
| 18 | 18 | |
| 19 | 19 | #include "common.h" |
| 20 | −#include <plat/board.h> | |
| 21 | 20 | #include <plat/gpmc-smc91x.h> |
| 22 | 21 | #include <plat/usb.h> |
| 23 | 22 | |
| @@ -67,9 +66,6 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { · 43 unmodified lines | ||
| 67 | 66 | .reset_gpio_port[2] = -EINVAL |
| 68 | 67 | }; |
| 69 | 68 | |
| 70 | −static struct omap_board_config_kernel sdp_config[] __initdata = { | |
| 71 | −}; | |
| 72 | − | |
| 73 | 69 | #ifdef CONFIG_OMAP_MUX |
| 74 | 70 | static struct omap_board_mux board_mux[] __initdata = { |
| 75 | 71 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| @@ -197,8 +193,6 @@ static struct flash_partitions sdp_flash_partitions[] = { · 121 unmodified lines | ||
| 197 | 193 | static void __init omap_sdp_init(void) |
| 198 | 194 | { |
| 199 | 195 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBP); |
| 200 | − omap_board_config = sdp_config; | |
| 201 | − omap_board_config_size = ARRAY_SIZE(sdp_config); | |
| 202 | 196 | zoom_peripherals_init(); |
| 203 | 197 | omap_sdrc_init(h8mbx00u0mer0em_sdrc_params, |
| 204 | 198 | h8mbx00u0mer0em_sdrc_params); |
| @@ -34,7 +34,6 @@ · 33 unmodified lines | ||
| 34 | 34 | #include <asm/mach/arch.h> |
| 35 | 35 | #include <asm/mach/map.h> |
| 36 | 36 | |
| 37 | −#include <plat/board.h> | |
| 38 | 37 | #include "common.h" |
| 39 | 38 | #include <plat/usb.h> |
| 40 | 39 | #include <plat/mmc.h> |
| @@ -26,7 +26,6 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <asm/mach/arch.h> |
| 27 | 27 | #include <asm/mach/map.h> |
| 28 | 28 | |
| 29 | −#include <plat/board.h> | |
| 30 | 29 | #include "common.h" |
| 31 | 30 | #include <plat/usb.h> |
| 32 | 31 | |
| @@ -37,11 +36,6 @@ · 4 unmodified lines | ||
| 37 | 36 | #define GPIO_USB_POWER 35 |
| 38 | 37 | #define GPIO_USB_NRESET 38 |
| 39 | 38 | |
| 40 | − | |
| 41 | −/* Board initialization */ | |
| 42 | −static struct omap_board_config_kernel am3517_crane_config[] __initdata = { | |
| 43 | −}; | |
| 44 | − | |
| 45 | 39 | #ifdef CONFIG_OMAP_MUX |
| 46 | 40 | static struct omap_board_mux board_mux[] __initdata = { |
| 47 | 41 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| @@ -67,9 +61,6 @@ static void __init am3517_crane_init(void) · 19 unmodified lines | ||
| 67 | 61 | omap_serial_init(); |
| 68 | 62 | omap_sdrc_init(NULL, NULL); |
| 69 | 63 | |
| 70 | − omap_board_config = am3517_crane_config; | |
| 71 | − omap_board_config_size = ARRAY_SIZE(am3517_crane_config); | |
| 72 | − | |
| 73 | 64 | /* Configure GPIO for EHCI port */ |
| 74 | 65 | if (omap_mux_init_gpio(GPIO_USB_NRESET, OMAP_PIN_OUTPUT)) { |
| 75 | 66 | pr_err("Can not configure mux for GPIO_USB_NRESET %d\n", |
| @@ -32,7 +32,6 @@ · 31 unmodified lines | ||
| 32 | 32 | #include <asm/mach/arch.h> |
| 33 | 33 | #include <asm/mach/map.h> |
| 34 | 34 | |
| 35 | −#include <plat/board.h> | |
| 36 | 35 | #include "common.h" |
| 37 | 36 | #include <plat/usb.h> |
| 38 | 37 | #include <video/omapdss.h> |
| @@ -324,9 +323,6 @@ static void am3517_evm_hecc_init(struct ti_hecc_platform_data *pdata) · 285 unmodified lines | ||
| 324 | 323 | platform_device_register(&am3517_hecc_device); |
| 325 | 324 | } |
| 326 | 325 | |
| 327 | −static struct omap_board_config_kernel am3517_evm_config[] __initdata = { | |
| 328 | −}; | |
| 329 | − | |
| 330 | 326 | static struct omap2_hsmmc_info mmc[] = { |
| 331 | 327 | { |
| 332 | 328 | .mmc = 1, |
| @@ -346,8 +342,6 @@ static struct omap2_hsmmc_info mmc[] = { · 13 unmodified lines | ||
| 346 | 342 | |
| 347 | 343 | static void __init am3517_evm_init(void) |
| 348 | 344 | { |
| 349 | − omap_board_config = am3517_evm_config; | |
| 350 | − omap_board_config_size = ARRAY_SIZE(am3517_evm_config); | |
| 351 | 345 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 352 | 346 | |
| 353 | 347 | am3517_evm_i2c_init(); |
| @@ -35,7 +35,6 @@ · 34 unmodified lines | ||
| 35 | 35 | #include <asm/mach/flash.h> |
| 36 | 36 | |
| 37 | 37 | #include <plat/led.h> |
| 38 | −#include <plat/board.h> | |
| 39 | 38 | #include "common.h" |
| 40 | 39 | #include <plat/gpmc.h> |
| 41 | 40 | |
| @@ -37,7 +37,6 @@ · 36 unmodified lines | ||
| 37 | 37 | #include <asm/mach/arch.h> |
| 38 | 38 | #include <asm/mach/map.h> |
| 39 | 39 | |
| 40 | −#include <plat/board.h> | |
| 41 | 40 | #include "common.h" |
| 42 | 41 | #include <plat/nand.h> |
| 43 | 42 | #include <plat/gpmc.h> |
| @@ -714,13 +713,8 @@ static inline void cm_t35_init_mux(void) {} · 670 unmodified lines | ||
| 714 | 713 | static inline void cm_t3730_init_mux(void) {} |
| 715 | 714 | #endif |
| 716 | 715 | |
| 717 | −static struct omap_board_config_kernel cm_t35_config[] __initdata = { | |
| 718 | −}; | |
| 719 | − | |
| 720 | 716 | static void __init cm_t3x_common_init(void) |
| 721 | 717 | { |
| 722 | − omap_board_config = cm_t35_config; | |
| 723 | − omap_board_config_size = ARRAY_SIZE(cm_t35_config); | |
| 724 | 718 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); |
| 725 | 719 | omap_serial_init(); |
| 726 | 720 | omap_sdrc_init(mt46h32m32lf6_sdrc_params, |
| @@ -38,7 +38,6 @@ · 37 unmodified lines | ||
| 38 | 38 | #include <asm/mach/arch.h> |
| 39 | 39 | #include <asm/mach/map.h> |
| 40 | 40 | |
| 41 | −#include <plat/board.h> | |
| 42 | 41 | #include "common.h" |
| 43 | 42 | #include <plat/usb.h> |
| 44 | 43 | #include <plat/nand.h> |
| @@ -249,9 +248,6 @@ static void __init cm_t3517_init_nand(void) · 204 unmodified lines | ||
| 249 | 248 | static inline void cm_t3517_init_nand(void) {} |
| 250 | 249 | #endif |
| 251 | 250 | |
| 252 | −static struct omap_board_config_kernel cm_t3517_config[] __initdata = { | |
| 253 | −}; | |
| 254 | − | |
| 255 | 251 | #ifdef CONFIG_OMAP_MUX |
| 256 | 252 | static struct omap_board_mux board_mux[] __initdata = { |
| 257 | 253 | /* GPIO186 - Green LED */ |
| @@ -285,8 +281,6 @@ static void __init cm_t3517_init(void) · 27 unmodified lines | ||
| 285 | 281 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
| 286 | 282 | omap_serial_init(); |
| 287 | 283 | omap_sdrc_init(NULL, NULL); |
| 288 | − omap_board_config = cm_t3517_config; | |
| 289 | − omap_board_config_size = ARRAY_SIZE(cm_t3517_config); | |
| 290 | 284 | cm_t3517_init_leds(); |
| 291 | 285 | cm_t3517_init_nand(); |
| 292 | 286 | cm_t3517_init_rtc(); |
| @@ -40,7 +40,6 @@ · 39 unmodified lines | ||
| 40 | 40 | #include <asm/mach/map.h> |
| 41 | 41 | #include <asm/mach/flash.h> |
| 42 | 42 | |
| 43 | −#include <plat/board.h> | |
| 44 | 43 | #include "common.h" |
| 45 | 44 | #include <plat/gpmc.h> |
| 46 | 45 | #include <plat/nand.h> |
| @@ -20,7 +20,6 @@ · 19 unmodified lines | ||
| 20 | 20 | #include <asm/hardware/gic.h> |
| 21 | 21 | #include <asm/mach/arch.h> |
| 22 | 22 | |
| 23 | −#include <plat/board.h> | |
| 24 | 23 | #include "common.h" |
| 25 | 24 | #include "common-board-devices.h" |
| 26 | 25 | |
| @@ -32,11 +32,11 @@ · 31 unmodified lines | ||
| 32 | 32 | #include <asm/mach/arch.h> |
| 33 | 33 | #include <asm/mach/map.h> |
| 34 | 34 | |
| 35 | −#include <plat/board.h> | |
| 36 | 35 | #include "common.h" |
| 37 | 36 | #include <plat/menelaus.h> |
| 38 | 37 | #include <plat/dma.h> |
| 39 | 38 | #include <plat/gpmc.h> |
| 39 | +#include <plat/debug-devices.h> | |
| 40 | 40 | |
| 41 | 41 | #include <video/omapdss.h> |
| 42 | 42 | #include <video/omap-panel-generic-dpi.h> |
| @@ -29,7 +29,6 @@ · 28 unmodified lines | ||
| 29 | 29 | #include <asm/mach-types.h> |
| 30 | 30 | #include <asm/mach/arch.h> |
| 31 | 31 | |
| 32 | −#include <plat/board.h> | |
| 33 | 32 | #include "common.h" |
| 34 | 33 | #include <plat/gpmc.h> |
| 35 | 34 | #include <plat/usb.h> |
| @@ -554,6 +553,8 @@ static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = { · 518 unmodified lines | ||
| 554 | 553 | |
| 555 | 554 | #ifdef CONFIG_OMAP_MUX |
| 556 | 555 | static struct omap_board_mux board_mux[] __initdata = { |
| 556 | + /* SMSC9221 LAN Controller ETH IRQ (GPIO_176) */ | |
| 557 | + OMAP3_MUX(MCSPI1_CS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), | |
| 557 | 558 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
| 558 | 559 | }; |
| 559 | 560 | #endif |
| @@ -35,7 +35,6 @@ · 34 unmodified lines | ||
| 35 | 35 | #include <asm/mach/map.h> |
| 36 | 36 | |
| 37 | 37 | #include <plat/mcspi.h> |
| 38 | −#include <plat/board.h> | |
| 39 | 38 | #include "common.h" |
| 40 | 39 | #include <plat/gpmc.h> |
| 41 | 40 | #include <mach/board-zoom.h> |
| @@ -25,7 +25,6 @@ · 24 unmodified lines | ||
| 25 | 25 | #include <asm/mach/arch.h> |
| 26 | 26 | #include <asm/mach-types.h> |
| 27 | 27 | |
| 28 | −#include <plat/board.h> | |
| 29 | 28 | #include "common.h" |
| 30 | 29 | #include <plat/menelaus.h> |
| 31 | 30 | #include <mach/irqs.h> |
| @@ -39,7 +39,6 @@ · 38 unmodified lines | ||
| 39 | 39 | #include <asm/mach/map.h> |
| 40 | 40 | #include <asm/mach/flash.h> |
| 41 | 41 | |
| 42 | −#include <plat/board.h> | |
| 43 | 42 | #include "common.h" |
| 44 | 43 | #include <video/omapdss.h> |
| 45 | 44 | #include <video/omap-panel-tfp410.h> |
| @@ -45,7 +45,6 @@ · 44 unmodified lines | ||
| 45 | 45 | #include <asm/mach/arch.h> |
| 46 | 46 | #include <asm/mach/map.h> |
| 47 | 47 | |
| 48 | −#include <plat/board.h> | |
| 49 | 48 | #include <plat/usb.h> |
| 50 | 49 | #include <plat/nand.h> |
| 51 | 50 | #include "common.h" |
| @@ -58,6 +57,7 @@ · 6 unmodified lines | ||
| 58 | 57 | #include "hsmmc.h" |
| 59 | 58 | #include "common-board-devices.h" |
| 60 | 59 | |
| 60 | +#define OMAP3_EVM_TS_GPIO 175 | |
| 61 | 61 | #define OMAP3_EVM_EHCI_VBUS 22 |
| 62 | 62 | #define OMAP3_EVM_EHCI_SELECT 61 |
| 63 | 63 | |
| @@ -74,6 +74,18 @@ · 10 unmodified lines | ||
| 74 | 74 | #define OMAP3EVM_GEN1_ETHR_GPIO_RST 64 |
| 75 | 75 | #define OMAP3EVM_GEN2_ETHR_GPIO_RST 7 |
| 76 | 76 | |
| 77 | +/* | |
| 78 | + * OMAP35x EVM revision | |
| 79 | + * Run time detection of EVM revision is done by reading Ethernet | |
| 80 | + * PHY ID - | |
| 81 | + * GEN_1 = 0x01150000 | |
| 82 | + * GEN_2 = 0x92200000 | |
| 83 | + */ | |
| 84 | +enum { | |
| 85 | + OMAP3EVM_BOARD_GEN_1 = 0, /* EVM Rev between A - D */ | |
| 86 | + OMAP3EVM_BOARD_GEN_2, /* EVM Rev >= Rev E */ | |
| 87 | +}; | |
| 88 | + | |
| 77 | 89 | static u8 omap3_evm_version; |
| 78 | 90 | |
| 79 | 91 | u8 get_omap3_evm_rev(void) |
| @@ -525,9 +537,6 @@ static int __init omap3_evm_i2c_init(void) · 445 unmodified lines | ||
| 525 | 537 | return 0; |
| 526 | 538 | } |
| 527 | 539 | |
| 528 | −static struct omap_board_config_kernel omap3_evm_config[] __initdata = { | |
| 529 | −}; | |
| 530 | − | |
| 531 | 540 | static struct usbhs_omap_board_data usbhs_bdata __initdata = { |
| 532 | 541 | |
| 533 | 542 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
| @@ -687,9 +696,6 @@ static void __init omap3_evm_init(void) · 153 unmodified lines | ||
| 687 | 696 | obm = (cpu_is_omap3630()) ? omap36x_board_mux : omap35x_board_mux; |
| 688 | 697 | omap3_mux_init(obm, OMAP_PACKAGE_CBB); |
| 689 | 698 | |
| 690 | − omap_board_config = omap3_evm_config; | |
| 691 | − omap_board_config_size = ARRAY_SIZE(omap3_evm_config); | |
| 692 | − | |
| 693 | 699 | omap_mux_init_gpio(63, OMAP_PIN_INPUT); |
| 694 | 700 | omap_hsmmc_init(mmc); |
| 695 | 701 | |
| @@ -41,7 +41,6 @@ · 40 unmodified lines | ||
| 41 | 41 | #include "common-board-devices.h" |
| 42 | 42 | |
| 43 | 43 | #include <plat/mux.h> |
| 44 | −#include <plat/board.h> | |
| 45 | 44 | #include "common.h" |
| 46 | 45 | #include <plat/gpmc-smsc911x.h> |
| 47 | 46 | #include <plat/gpmc.h> |
| @@ -40,7 +40,6 @@ · 39 unmodified lines | ||
| 40 | 40 | #include <asm/mach/arch.h> |
| 41 | 41 | #include <asm/mach/map.h> |
| 42 | 42 | |
| 43 | −#include <plat/board.h> | |
| 44 | 43 | #include "common.h" |
| 45 | 44 | #include <mach/hardware.h> |
| 46 | 45 | #include <plat/mcspi.h> |
| @@ -35,7 +35,6 @@ · 34 unmodified lines | ||
| 35 | 35 | #include <asm/mach/map.h> |
| 36 | 36 | #include <asm/mach/flash.h> |
| 37 | 37 | |
| 38 | −#include <plat/board.h> | |
| 39 | 38 | #include "common.h" |
| 40 | 39 | #include <plat/gpmc.h> |
| 41 | 40 | #include <plat/nand.h> |
| @@ -362,9 +361,6 @@ static int __init omap3_stalker_i2c_init(void) · 320 unmodified lines | ||
| 362 | 361 | |
| 363 | 362 | #define OMAP3_STALKER_TS_GPIO 175 |
| 364 | 363 | |
| 365 | −static struct omap_board_config_kernel omap3_stalker_config[] __initdata = { | |
| 366 | −}; | |
| 367 | − | |
| 368 | 364 | static struct platform_device *omap3_stalker_devices[] __initdata = { |
| 369 | 365 | &keys_gpio, |
| 370 | 366 | }; |
| @@ -399,8 +395,6 @@ static void __init omap3_stalker_init(void) · 28 unmodified lines | ||
| 399 | 395 | { |
| 400 | 396 | regulator_register_fixed(0, dummy_supplies, ARRAY_SIZE(dummy_supplies)); |
| 401 | 397 | omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); |
| 402 | − omap_board_config = omap3_stalker_config; | |
| 403 | − omap_board_config_size = ARRAY_SIZE(omap3_stalker_config); | |
| 404 | 398 | |
| 405 | 399 | omap_mux_init_gpio(23, OMAP_PIN_INPUT); |
| 406 | 400 | omap_hsmmc_init(mmc); |
| @@ -44,7 +44,6 @@ · 43 unmodified lines | ||
| 44 | 44 | #include <asm/mach/flash.h> |
| 45 | 45 | #include <asm/system_info.h> |
| 46 | 46 | |
| 47 | −#include <plat/board.h> | |
| 48 | 47 | #include "common.h" |
| 49 | 48 | #include <plat/gpmc.h> |
| 50 | 49 | #include <plat/nand.h> |
| @@ -39,7 +39,6 @@ · 38 unmodified lines | ||
| 39 | 39 | #include <asm/mach/map.h> |
| 40 | 40 | #include <video/omapdss.h> |
| 41 | 41 | |
| 42 | −#include <plat/board.h> | |
| 43 | 42 | #include "common.h" |
| 44 | 43 | #include <plat/usb.h> |
| 45 | 44 | #include <plat/mmc.h> |
| @@ -42,7 +42,6 @@ · 41 unmodified lines | ||
| 42 | 42 | #include <asm/mach/flash.h> |
| 43 | 43 | #include <asm/mach/map.h> |
| 44 | 44 | |
| 45 | −#include <plat/board.h> | |
| 46 | 45 | #include "common.h" |
| 47 | 46 | #include <video/omapdss.h> |
| 48 | 47 | #include <video/omap-panel-generic-dpi.h> |
| @@ -28,7 +28,6 @@ · 27 unmodified lines | ||
| 28 | 28 | #include <asm/system_info.h> |
| 29 | 29 | |
| 30 | 30 | #include <plat/mcspi.h> |
| 31 | −#include <plat/board.h> | |
| 32 | 31 | #include "common.h" |
| 33 | 32 | #include <plat/dma.h> |
| 34 | 33 | #include <plat/gpmc.h> |
| @@ -24,7 +24,6 @@ · 23 unmodified lines | ||
| 24 | 24 | #include <asm/mach/map.h> |
| 25 | 25 | |
| 26 | 26 | #include <plat/mcspi.h> |
| 27 | −#include <plat/board.h> | |
| 28 | 27 | #include "common.h" |
| 29 | 28 | #include <plat/dma.h> |
| 30 | 29 | #include <plat/gpmc.h> |
| @@ -21,7 +21,6 @@ · 20 unmodified lines | ||
| 21 | 21 | #include <asm/mach/map.h> |
| 22 | 22 | |
| 23 | 23 | #include <plat/irqs.h> |
| 24 | −#include <plat/board.h> | |
| 25 | 24 | #include "common.h" |
| 26 | 25 | #include <plat/usb.h> |
| 27 | 26 | |
| @@ -32,15 +31,10 @@ static struct omap_musb_board_data musb_board_data = { · 4 unmodified lines | ||
| 32 | 31 | .power = 500, |
| 33 | 32 | }; |
| 34 | 33 | |
| 35 | −static struct omap_board_config_kernel ti81xx_evm_config[] __initdata = { | |
| 36 | −}; | |
| 37 | − | |
| 38 | 34 | static void __init ti81xx_evm_init(void) |
| 39 | 35 | { |
| 40 | 36 | omap_serial_init(); |
| 41 | 37 | omap_sdrc_init(NULL, NULL); |
| 42 | − omap_board_config = ti81xx_evm_config; | |
| 43 | − omap_board_config_size = ARRAY_SIZE(ti81xx_evm_config); | |
| 44 | 38 | usb_musb_init(&musb_board_data); |
| 45 | 39 | } |
| 46 | 40 | |
| @@ -22,7 +22,6 @@ · 21 unmodified lines | ||
| 22 | 22 | #include <asm/mach/arch.h> |
| 23 | 23 | |
| 24 | 24 | #include "common.h" |
| 25 | −#include <plat/board.h> | |
| 26 | 25 | #include <plat/usb.h> |
| 27 | 26 | |
| 28 | 27 | #include <mach/board-zoom.h> |
| @@ -35,16 +35,6 @@ static struct omap2_mcspi_device_config ads7846_mcspi_config = { · 34 unmodified lines | ||
| 35 | 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 | 38 | static struct ads7846_platform_data ads7846_config = { |
| 49 | 39 | .x_max = 0x0fff, |
| 50 | 40 | .y_max = 0x0fff, |
| @@ -55,7 +45,6 @@ static struct ads7846_platform_data ads7846_config = { · 4 unmodified lines | ||
| 55 | 45 | .debounce_rep = 1, |
| 56 | 46 | .gpio_pendown = -EINVAL, |
| 57 | 47 | .keep_vref_on = 1, |
| 58 | − .get_pendown_state = &omap3_get_pendown_state, | |
| 59 | 48 | }; |
| 60 | 49 | |
| 61 | 50 | static struct spi_board_info ads7846_spi_board_info __initdata = { |
| @@ -4,7 +4,6 @@ · 3 unmodified lines | ||
| 4 | 4 | #include "twl-common.h" |
| 5 | 5 | |
| 6 | 6 | #define NAND_BLOCK_SIZE SZ_128K |
| 7 | −#define OMAP3_EVM_TS_GPIO 175 | |
| 8 | 7 | |
| 9 | 8 | struct mtd_partition; |
| 10 | 9 | struct ads7846_platform_data; |
| @@ -18,7 +18,6 @@ · 17 unmodified lines | ||
| 18 | 18 | #include <linux/io.h> |
| 19 | 19 | |
| 20 | 20 | #include <plat/hardware.h> |
| 21 | −#include <plat/board.h> | |
| 22 | 21 | #include <plat/mux.h> |
| 23 | 22 | #include <plat/clock.h> |
| 24 | 23 | |
| @@ -238,8 +238,9 @@ int __init omap4_idle_init(void) · 237 unmodified lines | ||
| 238 | 238 | for_each_cpu(cpu_id, cpu_online_mask) { |
| 239 | 239 | dev = &per_cpu(omap4_idle_dev, cpu_id); |
| 240 | 240 | dev->cpu = cpu_id; |
| 241 | +#ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED | |
| 241 | 242 | dev->coupled_cpus = *cpu_online_mask; |
| 242 | − | |
| 243 | +#endif | |
| 243 | 244 | cpuidle_register_driver(&omap4_idle_driver); |
| 244 | 245 | |
| 245 | 246 | if (cpuidle_register_device(dev)) { |
| @@ -26,7 +26,6 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <asm/pmu.h> |
| 27 | 27 | |
| 28 | 28 | #include "iomap.h" |
| 29 | −#include <plat/board.h> | |
| 30 | 29 | #include <plat/dma.h> |
| 31 | 30 | #include <plat/omap_hwmod.h> |
| 32 | 31 | #include <plat/omap_device.h> |
| @@ -18,18 +18,25 @@ · 17 unmodified lines | ||
| 18 | 18 | |
| 19 | 19 | #include <plat/cpu.h> |
| 20 | 20 | #include <plat/nand.h> |
| 21 | −#include <plat/board.h> | |
| 22 | 21 | #include <plat/gpmc.h> |
| 23 | 22 | |
| 24 | −static struct resource gpmc_nand_resource = { | |
| 25 | − .flags = IORESOURCE_MEM, | |
| 23 | +static struct resource gpmc_nand_resource[] = { | |
| 24 | + { | |
| 25 | + .flags = IORESOURCE_MEM, | |
| 26 | + }, | |
| 27 | + { | |
| 28 | + .flags = IORESOURCE_IRQ, | |
| 29 | + }, | |
| 30 | + { | |
| 31 | + .flags = IORESOURCE_IRQ, | |
| 32 | + }, | |
| 26 | 33 | }; |
| 27 | 34 | |
| 28 | 35 | static struct platform_device gpmc_nand_device = { |
| 29 | 36 | .name = "omap2-nand", |
| 30 | 37 | .id = 0, |
| 31 | − .num_resources = 1, | |
| 32 | − .resource = &gpmc_nand_resource, | |
| 38 | + .num_resources = ARRAY_SIZE(gpmc_nand_resource), | |
| 39 | + .resource = gpmc_nand_resource, | |
| 33 | 40 | }; |
| 34 | 41 | |
| 35 | 42 | static int omap2_nand_gpmc_retime(struct omap_nand_platform_data *gpmc_nand_data) |
| @@ -75,6 +82,7 @@ static int omap2_nand_gpmc_retime(struct omap_nand_platform_data *gpmc_nand_data · 39 unmodified lines | ||
| 75 | 82 | gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_DEV_SIZE, 0); |
| 76 | 83 | gpmc_cs_configure(gpmc_nand_data->cs, |
| 77 | 84 | GPMC_CONFIG_DEV_TYPE, GPMC_DEVICETYPE_NAND); |
| 85 | + gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_WP, 0); | |
| 78 | 86 | err = gpmc_cs_set_timings(gpmc_nand_data->cs, &t); |
| 79 | 87 | if (err) |
| 80 | 88 | return err; |
| @@ -90,12 +98,19 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data) · 9 unmodified lines | ||
| 90 | 98 | gpmc_nand_device.dev.platform_data = gpmc_nand_data; |
| 91 | 99 | |
| 92 | 100 | err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE, |
| 93 | − &gpmc_nand_data->phys_base); | |
| 101 | + (unsigned long *)&gpmc_nand_resource[0].start); | |
| 94 | 102 | if (err < 0) { |
| 95 | 103 | dev_err(dev, "Cannot request GPMC CS\n"); |
| 96 | 104 | return err; |
| 97 | 105 | } |
| 98 | 106 | |
| 107 | + gpmc_nand_resource[0].end = gpmc_nand_resource[0].start + | |
| 108 | + NAND_IO_SIZE - 1; | |
| 109 | + | |
| 110 | + gpmc_nand_resource[1].start = | |
| 111 | + gpmc_get_client_irq(GPMC_IRQ_FIFOEVENTENABLE); | |
| 112 | + gpmc_nand_resource[2].start = | |
| 113 | + gpmc_get_client_irq(GPMC_IRQ_COUNT_EVENT); | |
| 99 | 114 | /* Set timings in GPMC */ |
| 100 | 115 | err = omap2_nand_gpmc_retime(gpmc_nand_data); |
| 101 | 116 | if (err < 0) { |
| @@ -108,6 +123,8 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data) · 6 unmodified lines | ||
| 108 | 123 | gpmc_cs_configure(gpmc_nand_data->cs, GPMC_CONFIG_RDY_BSY, 1); |
| 109 | 124 | } |
| 110 | 125 | |
| 126 | + gpmc_update_nand_reg(&gpmc_nand_data->reg, gpmc_nand_data->cs); | |
| 127 | + | |
| 111 | 128 | err = platform_device_register(&gpmc_nand_device); |
| 112 | 129 | if (err < 0) { |
| 113 | 130 | dev_err(dev, "Unable to register NAND device\n"); |
| @@ -20,14 +20,21 @@ · 19 unmodified lines | ||
| 20 | 20 | |
| 21 | 21 | #include <plat/cpu.h> |
| 22 | 22 | #include <plat/onenand.h> |
| 23 | −#include <plat/board.h> | |
| 24 | 23 | #include <plat/gpmc.h> |
| 25 | 24 | |
| 25 | +#define ONENAND_IO_SIZE SZ_128K | |
| 26 | + | |
| 26 | 27 | static struct omap_onenand_platform_data *gpmc_onenand_data; |
| 27 | 28 | |
| 29 | +static struct resource gpmc_onenand_resource = { | |
| 30 | + .flags = IORESOURCE_MEM, | |
| 31 | +}; | |
| 32 | + | |
| 28 | 33 | static struct platform_device gpmc_onenand_device = { |
| 29 | 34 | .name = "omap2-onenand", |
| 30 | 35 | .id = -1, |
| 36 | + .num_resources = 1, | |
| 37 | + .resource = &gpmc_onenand_resource, | |
| 31 | 38 | }; |
| 32 | 39 | |
| 33 | 40 | static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base) |
| @@ -390,6 +397,8 @@ static int gpmc_onenand_setup(void __iomem *onenand_base, int *freq_ptr) · 356 unmodified lines | ||
| 390 | 397 | |
| 391 | 398 | void __init gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data) |
| 392 | 399 | { |
| 400 | + int err; | |
| 401 | + | |
| 393 | 402 | gpmc_onenand_data = _onenand_data; |
| 394 | 403 | gpmc_onenand_data->onenand_setup = gpmc_onenand_setup; |
| 395 | 404 | gpmc_onenand_device.dev.platform_data = gpmc_onenand_data; |
| @@ -401,8 +410,19 @@ void __init gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data) · 5 unmodified lines | ||
| 401 | 410 | gpmc_onenand_data->flags |= ONENAND_SYNC_READ; |
| 402 | 411 | } |
| 403 | 412 | |
| 413 | + err = gpmc_cs_request(gpmc_onenand_data->cs, ONENAND_IO_SIZE, | |
| 414 | + (unsigned long *)&gpmc_onenand_resource.start); | |
| 415 | + if (err < 0) { | |
| 416 | + pr_err("%s: Cannot request GPMC CS\n", __func__); | |
| 417 | + return; | |
| 418 | + } | |
| 419 | + | |
| 420 | + gpmc_onenand_resource.end = gpmc_onenand_resource.start + | |
| 421 | + ONENAND_IO_SIZE - 1; | |
| 422 | + | |
| 404 | 423 | if (platform_device_register(&gpmc_onenand_device) < 0) { |
| 405 | − printk(KERN_ERR "Unable to register OneNAND device\n"); | |
| 424 | + pr_err("%s: Unable to register OneNAND device\n", __func__); | |
| 425 | + gpmc_cs_free(gpmc_onenand_data->cs); | |
| 406 | 426 | return; |
| 407 | 427 | } |
| 408 | 428 | } |
| @@ -17,7 +17,6 @@ · 16 unmodified lines | ||
| 17 | 17 | #include <linux/io.h> |
| 18 | 18 | #include <linux/smc91x.h> |
| 19 | 19 | |
| 20 | −#include <plat/board.h> | |
| 21 | 20 | #include <plat/gpmc.h> |
| 22 | 21 | #include <plat/gpmc-smc91x.h> |
| 23 | 22 | |
| @@ -20,7 +20,6 @@ · 19 unmodified lines | ||
| 20 | 20 | #include <linux/io.h> |
| 21 | 21 | #include <linux/smsc911x.h> |
| 22 | 22 | |
| 23 | −#include <plat/board.h> | |
| 24 | 23 | #include <plat/gpmc.h> |
| 25 | 24 | #include <plat/gpmc-smsc911x.h> |
| 26 | 25 | |
| @@ -78,6 +78,15 @@ · 77 unmodified lines | ||
| 78 | 78 | #define ENABLE_PREFETCH (0x1 << 7) |
| 79 | 79 | #define DMA_MPU_MODE 2 |
| 80 | 80 | |
| 81 | +/* XXX: Only NAND irq has been considered,currently these are the only ones used | |
| 82 | + */ | |
| 83 | +#define GPMC_NR_IRQ 2 | |
| 84 | + | |
| 85 | +struct gpmc_client_irq { | |
| 86 | + unsigned irq; | |
| 87 | + u32 bitmask; | |
| 88 | +}; | |
| 89 | + | |
| 81 | 90 | /* Structure to save gpmc cs context */ |
| 82 | 91 | struct gpmc_cs_config { |
| 83 | 92 | u32 config1; |
| @@ -105,6 +114,10 @@ struct omap3_gpmc_regs { · 21 unmodified lines | ||
| 105 | 114 | struct gpmc_cs_config cs_context[GPMC_CS_NUM]; |
| 106 | 115 | }; |
| 107 | 116 | |
| 117 | +static struct gpmc_client_irq gpmc_client_irq[GPMC_NR_IRQ]; | |
| 118 | +static struct irq_chip gpmc_irq_chip; | |
| 119 | +static unsigned gpmc_irq_start; | |
| 120 | + | |
| 108 | 121 | static struct resource gpmc_mem_root; |
| 109 | 122 | static struct resource gpmc_cs_mem[GPMC_CS_NUM]; |
| 110 | 123 | static DEFINE_SPINLOCK(gpmc_mem_lock); |
| @@ -682,6 +695,117 @@ int gpmc_prefetch_reset(int cs) · 571 unmodified lines | ||
| 682 | 695 | } |
| 683 | 696 | EXPORT_SYMBOL(gpmc_prefetch_reset); |
| 684 | 697 | |
| 698 | +void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs) | |
| 699 | +{ | |
| 700 | + reg->gpmc_status = gpmc_base + GPMC_STATUS; | |
| 701 | + reg->gpmc_nand_command = gpmc_base + GPMC_CS0_OFFSET + | |
| 702 | + GPMC_CS_NAND_COMMAND + GPMC_CS_SIZE * cs; | |
| 703 | + reg->gpmc_nand_address = gpmc_base + GPMC_CS0_OFFSET + | |
| 704 | + GPMC_CS_NAND_ADDRESS + GPMC_CS_SIZE * cs; | |
| 705 | + reg->gpmc_nand_data = gpmc_base + GPMC_CS0_OFFSET + | |
| 706 | + GPMC_CS_NAND_DATA + GPMC_CS_SIZE * cs; | |
| 707 | + reg->gpmc_prefetch_config1 = gpmc_base + GPMC_PREFETCH_CONFIG1; | |
| 708 | + reg->gpmc_prefetch_config2 = gpmc_base + GPMC_PREFETCH_CONFIG2; | |
| 709 | + reg->gpmc_prefetch_control = gpmc_base + GPMC_PREFETCH_CONTROL; | |
| 710 | + reg->gpmc_prefetch_status = gpmc_base + GPMC_PREFETCH_STATUS; | |
| 711 | + reg->gpmc_ecc_config = gpmc_base + GPMC_ECC_CONFIG; | |
| 712 | + reg->gpmc_ecc_control = gpmc_base + GPMC_ECC_CONTROL; | |
| 713 | + reg->gpmc_ecc_size_config = gpmc_base + GPMC_ECC_SIZE_CONFIG; | |
| 714 | + reg->gpmc_ecc1_result = gpmc_base + GPMC_ECC1_RESULT; | |
| 715 | + reg->gpmc_bch_result0 = gpmc_base + GPMC_ECC_BCH_RESULT_0; | |
| 716 | +} | |
| 717 | + | |
| 718 | +int gpmc_get_client_irq(unsigned irq_config) | |
| 719 | +{ | |
| 720 | + int i; | |
| 721 | + | |
| 722 | + if (hweight32(irq_config) > 1) | |
| 723 | + return 0; | |
| 724 | + | |
| 725 | + for (i = 0; i < GPMC_NR_IRQ; i++) | |
| 726 | + if (gpmc_client_irq[i].bitmask & irq_config) | |
| 727 | + return gpmc_client_irq[i].irq; | |
| 728 | + | |
| 729 | + return 0; | |
| 730 | +} | |
| 731 | + | |
| 732 | +static int gpmc_irq_endis(unsigned irq, bool endis) | |
| 733 | +{ | |
| 734 | + int i; | |
| 735 | + u32 regval; | |
| 736 | + | |
| 737 | + for (i = 0; i < GPMC_NR_IRQ; i++) | |
| 738 | + if (irq == gpmc_client_irq[i].irq) { | |
| 739 | + regval = gpmc_read_reg(GPMC_IRQENABLE); | |
| 740 | + if (endis) | |
| 741 | + regval |= gpmc_client_irq[i].bitmask; | |
| 742 | + else | |
| 743 | + regval &= ~gpmc_client_irq[i].bitmask; | |
| 744 | + gpmc_write_reg(GPMC_IRQENABLE, regval); | |
| 745 | + break; | |
| 746 | + } | |
| 747 | + | |
| 748 | + return 0; | |
| 749 | +} | |
| 750 | + | |
| 751 | +static void gpmc_irq_disable(struct irq_data *p) | |
| 752 | +{ | |
| 753 | + gpmc_irq_endis(p->irq, false); | |
| 754 | +} | |
| 755 | + | |
| 756 | +static void gpmc_irq_enable(struct irq_data *p) | |
| 757 | +{ | |
| 758 | + gpmc_irq_endis(p->irq, true); | |
| 759 | +} | |
| 760 | + | |
| 761 | +static void gpmc_irq_noop(struct irq_data *data) { } | |
| 762 | + | |
| 763 | +static unsigned int gpmc_irq_noop_ret(struct irq_data *data) { return 0; } | |
| 764 | + | |
| 765 | +static int gpmc_setup_irq(int gpmc_irq) | |
| 766 | +{ | |
| 767 | + int i; | |
| 768 | + u32 regval; | |
| 769 | + | |
| 770 | + if (!gpmc_irq) | |
| 771 | + return -EINVAL; | |
| 772 | + | |
| 773 | + gpmc_irq_start = irq_alloc_descs(-1, 0, GPMC_NR_IRQ, 0); | |
| 774 | + if (IS_ERR_VALUE(gpmc_irq_start)) { | |
| 775 | + pr_err("irq_alloc_descs failed\n"); | |
| 776 | + return gpmc_irq_start; | |
| 777 | + } | |
| 778 | + | |
| 779 | + gpmc_irq_chip.name = "gpmc"; | |
| 780 | + gpmc_irq_chip.irq_startup = gpmc_irq_noop_ret; | |
| 781 | + gpmc_irq_chip.irq_enable = gpmc_irq_enable; | |
| 782 | + gpmc_irq_chip.irq_disable = gpmc_irq_disable; | |
| 783 | + gpmc_irq_chip.irq_shutdown = gpmc_irq_noop; | |
| 784 | + gpmc_irq_chip.irq_ack = gpmc_irq_noop; | |
| 785 | + gpmc_irq_chip.irq_mask = gpmc_irq_noop; | |
| 786 | + gpmc_irq_chip.irq_unmask = gpmc_irq_noop; | |
| 787 | + | |
| 788 | + gpmc_client_irq[0].bitmask = GPMC_IRQ_FIFOEVENTENABLE; | |
| 789 | + gpmc_client_irq[1].bitmask = GPMC_IRQ_COUNT_EVENT; | |
| 790 | + | |
| 791 | + for (i = 0; i < GPMC_NR_IRQ; i++) { | |
| 792 | + gpmc_client_irq[i].irq = gpmc_irq_start + i; | |
| 793 | + irq_set_chip_and_handler(gpmc_client_irq[i].irq, | |
| 794 | + &gpmc_irq_chip, handle_simple_irq); | |
| 795 | + set_irq_flags(gpmc_client_irq[i].irq, | |
| 796 | + IRQF_VALID | IRQF_NOAUTOEN); | |
| 797 | + } | |
| 798 | + | |
| 799 | + /* Disable interrupts */ | |
| 800 | + gpmc_write_reg(GPMC_IRQENABLE, 0); | |
| 801 | + | |
| 802 | + /* clear interrupts */ | |
| 803 | + regval = gpmc_read_reg(GPMC_IRQSTATUS); | |
| 804 | + gpmc_write_reg(GPMC_IRQSTATUS, regval); | |
| 805 | + | |
| 806 | + return request_irq(gpmc_irq, gpmc_handle_irq, 0, "gpmc", NULL); | |
| 807 | +} | |
| 808 | + | |
| 685 | 809 | static void __init gpmc_mem_init(void) |
| 686 | 810 | { |
| 687 | 811 | int cs; |
| @@ -711,8 +835,8 @@ static void __init gpmc_mem_init(void) · 23 unmodified lines | ||
| 711 | 835 | |
| 712 | 836 | static int __init gpmc_init(void) |
| 713 | 837 | { |
| 714 | − u32 l, irq; | |
| 715 | − int cs, ret = -EINVAL; | |
| 838 | + u32 l; | |
| 839 | + int ret = -EINVAL; | |
| 716 | 840 | int gpmc_irq; |
| 717 | 841 | char *ck = NULL; |
| 718 | 842 | |
| @@ -761,16 +885,7 @@ static int __init gpmc_init(void) · 42 unmodified lines | ||
| 761 | 885 | gpmc_write_reg(GPMC_SYSCONFIG, l); |
| 762 | 886 | gpmc_mem_init(); |
| 763 | 887 | |
| 764 | − /* initalize the irq_chained */ | |
| 765 | − irq = OMAP_GPMC_IRQ_BASE; | |
| 766 | − for (cs = 0; cs < GPMC_CS_NUM; cs++) { | |
| 767 | − irq_set_chip_and_handler(irq, &dummy_irq_chip, | |
| 768 | − handle_simple_irq); | |
| 769 | − set_irq_flags(irq, IRQF_VALID); | |
| 770 | − irq++; | |
| 771 | − } | |
| 772 | − | |
| 773 | − ret = request_irq(gpmc_irq, gpmc_handle_irq, IRQF_SHARED, "gpmc", NULL); | |
| 888 | + ret = gpmc_setup_irq(gpmc_irq); | |
| 774 | 889 | if (ret) |
| 775 | 890 | pr_err("gpmc: irq-%d could not claim: err %d\n", |
| 776 | 891 | gpmc_irq, ret); |
| @@ -780,12 +895,19 @@ postcore_initcall(gpmc_init); · 3 unmodified lines | ||
| 780 | 895 | |
| 781 | 896 | static irqreturn_t gpmc_handle_irq(int irq, void *dev) |
| 782 | 897 | { |
| 783 | − u8 cs; | |
| 898 | + int i; | |
| 899 | + u32 regval; | |
| 900 | + | |
| 901 | + regval = gpmc_read_reg(GPMC_IRQSTATUS); | |
| 902 | + | |
| 903 | + if (!regval) | |
| 904 | + return IRQ_NONE; | |
| 905 | + | |
| 906 | + for (i = 0; i < GPMC_NR_IRQ; i++) | |
| 907 | + if (regval & gpmc_client_irq[i].bitmask) | |
| 908 | + generic_handle_irq(gpmc_client_irq[i].irq); | |
| 784 | 909 | |
| 785 | − /* check cs to invoke the irq */ | |
| 786 | − cs = ((gpmc_read_reg(GPMC_PREFETCH_CONFIG1)) >> CS_NUM_SHIFT) & 0x7; | |
| 787 | − if (OMAP_GPMC_IRQ_BASE+cs <= OMAP_GPMC_IRQ_END) | |
| 788 | − generic_handle_irq(OMAP_GPMC_IRQ_BASE+cs); | |
| 910 | + gpmc_write_reg(GPMC_IRQSTATUS, regval); | |
| 789 | 911 | |
| 790 | 912 | return IRQ_HANDLED; |
| 791 | 913 | } |
| @@ -127,7 +127,6 @@ struct omap_mux_partition { · 126 unmodified lines | ||
| 127 | 127 | * @gpio: GPIO number |
| 128 | 128 | * @muxnames: available signal modes for a ball |
| 129 | 129 | * @balls: available balls on the package |
| 130 | − * @partition: mux partition | |
| 131 | 130 | */ |
| 132 | 131 | struct omap_mux { |
| 133 | 132 | u16 reg_offset; |
| @@ -94,7 +94,7 @@ int __init omap4_opp_init(void) · 93 unmodified lines | ||
| 94 | 94 | { |
| 95 | 95 | int r = -ENODEV; |
| 96 | 96 | |
| 97 | − if (!cpu_is_omap44xx()) | |
| 97 | + if (!cpu_is_omap443x()) | |
| 98 | 98 | return r; |
| 99 | 99 | |
| 100 | 100 | r = omap_init_opp_table(omap44xx_opp_def_list, |
| @@ -28,7 +28,6 @@ · 27 unmodified lines | ||
| 28 | 28 | #include <linux/slab.h> |
| 29 | 29 | |
| 30 | 30 | #include <plat/clock.h> |
| 31 | −#include <plat/board.h> | |
| 32 | 31 | #include "powerdomain.h" |
| 33 | 32 | #include "clockdomain.h" |
| 34 | 33 | #include <plat/dmtimer.h> |
| @@ -38,7 +38,6 @@ · 37 unmodified lines | ||
| 38 | 38 | #include <plat/clock.h> |
| 39 | 39 | #include <plat/sram.h> |
| 40 | 40 | #include <plat/dma.h> |
| 41 | −#include <plat/board.h> | |
| 42 | 41 | |
| 43 | 42 | #include <mach/irqs.h> |
| 44 | 43 | |
| @@ -352,16 +351,6 @@ int __init omap2_pm_init(void) · 307 unmodified lines | ||
| 352 | 351 | |
| 353 | 352 | prcm_setup_regs(); |
| 354 | 353 | |
| 355 | − /* Hack to prevent MPU retention when STI console is enabled. */ | |
| 356 | − { | |
| 357 | − const struct omap_sti_console_config *sti; | |
| 358 | − | |
| 359 | − sti = omap_get_config(OMAP_TAG_STI_CONSOLE, | |
| 360 | − struct omap_sti_console_config); | |
| 361 | − if (sti != NULL && sti->enable) | |
| 362 | − sti_console_enabled = 1; | |
| 363 | − } | |
| 364 | − | |
| 365 | 354 | /* |
| 366 | 355 | * We copy the assembler sleep/wakeup routines to SRAM. |
| 367 | 356 | * These routines need to be in SRAM as that's the only |
| @@ -272,21 +272,16 @@ void omap_sram_idle(void) · 271 unmodified lines | ||
| 272 | 272 | per_next_state = pwrdm_read_next_pwrst(per_pwrdm); |
| 273 | 273 | core_next_state = pwrdm_read_next_pwrst(core_pwrdm); |
| 274 | 274 | |
| 275 | − if (mpu_next_state < PWRDM_POWER_ON) { | |
| 276 | − pwrdm_pre_transition(mpu_pwrdm); | |
| 277 | − pwrdm_pre_transition(neon_pwrdm); | |
| 278 | − } | |
| 275 | + pwrdm_pre_transition(NULL); | |
| 279 | 276 | |
| 280 | 277 | /* PER */ |
| 281 | 278 | if (per_next_state < PWRDM_POWER_ON) { |
| 282 | − pwrdm_pre_transition(per_pwrdm); | |
| 283 | 279 | per_going_off = (per_next_state == PWRDM_POWER_OFF) ? 1 : 0; |
| 284 | 280 | omap2_gpio_prepare_for_idle(per_going_off); |
| 285 | 281 | } |
| 286 | 282 | |
| 287 | 283 | /* CORE */ |
| 288 | 284 | if (core_next_state < PWRDM_POWER_ON) { |
| 289 | − pwrdm_pre_transition(core_pwrdm); | |
| 290 | 285 | if (core_next_state == PWRDM_POWER_OFF) { |
| 291 | 286 | omap3_core_save_context(); |
| 292 | 287 | omap3_cm_save_context(); |
| @@ -339,20 +334,14 @@ void omap_sram_idle(void) · 46 unmodified lines | ||
| 339 | 334 | omap2_prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF_MASK, |
| 340 | 335 | OMAP3430_GR_MOD, |
| 341 | 336 | OMAP3_PRM_VOLTCTRL_OFFSET); |
| 342 | − pwrdm_post_transition(core_pwrdm); | |
| 343 | 337 | } |
| 344 | 338 | omap3_intc_resume_idle(); |
| 345 | 339 | |
| 340 | + pwrdm_post_transition(NULL); | |
| 341 | + | |
| 346 | 342 | /* PER */ |
| 347 | − if (per_next_state < PWRDM_POWER_ON) { | |
| 343 | + if (per_next_state < PWRDM_POWER_ON) | |
| 348 | 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 | 347 | static void omap3_pm_idle(void) |
| @@ -29,7 +29,6 @@ · 28 unmodified lines | ||
| 29 | 29 | |
| 30 | 30 | #include <plat/omap-serial.h> |
| 31 | 31 | #include "common.h" |
| 32 | −#include <plat/board.h> | |
| 33 | 32 | #include <plat/dma.h> |
| 34 | 33 | #include <plat/omap_hwmod.h> |
| 35 | 34 | #include <plat/omap_device.h> |
| @@ -56,9 +56,13 @@ ppa_por_params: · 55 unmodified lines | ||
| 56 | 56 | * The restore function pointer is stored at CPUx_WAKEUP_NS_PA_ADDR_OFFSET. |
| 57 | 57 | * It returns to the caller for CPU INACTIVE and ON power states or in case |
| 58 | 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 | 64 | ENTRY(omap4_finish_suspend) |
| 61 | − stmfd sp!, {lr} | |
| 65 | + stmfd sp!, {r4-r12, lr} | |
| 62 | 66 | cmp r0, #0x0 |
| 63 | 67 | beq do_WFI @ No lowpower state, jump to WFI |
| 64 | 68 | |
| @@ -226,7 +230,7 @@ scu_gp_clear: · 161 unmodified lines | ||
| 226 | 230 | skip_scu_gp_clear: |
| 227 | 231 | isb |
| 228 | 232 | dsb |
| 229 | − ldmfd sp!, {pc} | |
| 233 | + ldmfd sp!, {r4-r12, pc} | |
| 230 | 234 | ENDPROC(omap4_finish_suspend) |
| 231 | 235 | |
| 232 | 236 | /* |
| @@ -67,6 +67,7 @@ void __init omap_pmic_init(int bus, u32 clkrate, · 66 unmodified lines | ||
| 67 | 67 | const char *pmic_type, int pmic_irq, |
| 68 | 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 | 71 | strncpy(pmic_i2c_board_info.type, pmic_type, |
| 71 | 72 | sizeof(pmic_i2c_board_info.type)); |
| 72 | 73 | pmic_i2c_board_info.irq = pmic_irq; |
| @@ -109,7 +109,8 @@ void __init orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data) · 108 unmodified lines | ||
| 109 | 109 | { |
| 110 | 110 | orion_ge00_init(eth_data, |
| 111 | 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 | |
| @@ -24,7 +24,8 @@ · 23 unmodified lines | ||
| 24 | 24 | */ |
| 25 | 25 | |
| 26 | 26 | enum dma_ch { |
| 27 | − DMACH_XD0, | |
| 27 | + DMACH_DT_PROP = -1, /* not yet supported, do not use */ | |
| 28 | + DMACH_XD0 = 0, | |
| 28 | 29 | DMACH_XD1, |
| 29 | 30 | DMACH_SDI, |
| 30 | 31 | DMACH_SPI0, |
| @@ -520,13 +520,14 @@ static struct platform_device hdmi_lcdc_device = { · 519 unmodified lines | ||
| 520 | 520 | }; |
| 521 | 521 | |
| 522 | 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 | 526 | static struct gpio_keys_button gpio_buttons[] = { |
| 526 | − GPIO_KEY(KEY_POWER, GPIO_PORT99, "SW1"), | |
| 527 | − GPIO_KEY(KEY_BACK, GPIO_PORT100, "SW2"), | |
| 528 | − GPIO_KEY(KEY_MENU, GPIO_PORT97, "SW3"), | |
| 529 | − GPIO_KEY(KEY_HOME, GPIO_PORT98, "SW4"), | |
| 527 | + GPIO_KEY(KEY_POWER, GPIO_PORT99, "SW3", .wakeup = 1), | |
| 528 | + GPIO_KEY(KEY_BACK, GPIO_PORT100, "SW4"), | |
| 529 | + GPIO_KEY(KEY_MENU, GPIO_PORT97, "SW5"), | |
| 530 | + GPIO_KEY(KEY_HOME, GPIO_PORT98, "SW6"), | |
| 530 | 531 | }; |
| 531 | 532 | |
| 532 | 533 | static struct gpio_keys_platform_data gpio_key_info = { |
| @@ -901,8 +902,8 @@ static struct platform_device *eva_devices[] __initdata = { · 368 unmodified lines | ||
| 901 | 902 | &camera_device, |
| 902 | 903 | &ceu0_device, |
| 903 | 904 | &fsi_device, |
| 904 | − &fsi_hdmi_device, | |
| 905 | 905 | &fsi_wm8978_device, |
| 906 | + &fsi_hdmi_device, | |
| 906 | 907 | }; |
| 907 | 908 | |
| 908 | 909 | static void __init eva_clock_init(void) |
| @@ -695,6 +695,7 @@ static struct platform_device usbhs0_device = { · 694 unmodified lines | ||
| 695 | 695 | * - J30 "open" |
| 696 | 696 | * - modify usbhs1_get_id() USBHS_HOST -> USBHS_GADGET |
| 697 | 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 | 700 | #define IRQ8 evt2irq(0x0300) |
| 700 | 701 | #define USB_PHY_MODE (1 << 4) |
| @@ -1325,8 +1326,8 @@ static struct platform_device *mackerel_devices[] __initdata = { · 624 unmodified lines | ||
| 1325 | 1326 | &nor_flash_device, |
| 1326 | 1327 | &smc911x_device, |
| 1327 | 1328 | &lcdc_device, |
| 1328 | − &usbhs1_device, | |
| 1329 | 1329 | &usbhs0_device, |
| 1330 | + &usbhs1_device, | |
| 1330 | 1331 | &leds_device, |
| 1331 | 1332 | &fsi_device, |
| 1332 | 1333 | &fsi_ak4643_device, |
| @@ -67,7 +67,7 @@ static struct smsc911x_platform_config smsc911x_platdata = { · 66 unmodified lines | ||
| 67 | 67 | |
| 68 | 68 | static struct platform_device eth_device = { |
| 69 | 69 | .name = "smsc911x", |
| 70 | − .id = 0, | |
| 70 | + .id = -1, | |
| 71 | 71 | .dev = { |
| 72 | 72 | .platform_data = &smsc911x_platdata, |
| 73 | 73 | }, |
| @@ -259,9 +259,9 @@ static int sh73a0_set_wake(struct irq_data *data, unsigned int on) · 258 unmodified lines | ||
| 259 | 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 | 265 | #define INTCS_VECT_RELOC(n, vect) INTCS_VECT((n), (vect) + RELOC_BASE) |
| 266 | 266 | |
| 267 | 267 | INTC_IRQ_PINS_32(intca_irq_pins, 0xe6900000, |
| @@ -41,7 +41,6 @@ config MACH_HREFV60 · 40 unmodified lines | ||
| 41 | 41 | config MACH_SNOWBALL |
| 42 | 42 | bool "U8500 Snowball platform" |
| 43 | 43 | select MACH_MOP500 |
| 44 | − select LEDS_GPIO | |
| 45 | 44 | help |
| 46 | 45 | Include support for the snowball development platform. |
| 47 | 46 | |
| @@ -191,9 +191,9 @@ static struct platform_device *db8500_add_msp_i2s(struct device *parent, · 190 unmodified lines | ||
| 191 | 191 | return pdev; |
| 192 | 192 | } |
| 193 | 193 | |
| 194 | −/* Platform device for ASoC U8500 machine */ | |
| 195 | −static struct platform_device snd_soc_u8500 = { | |
| 196 | − .name = "snd-soc-u8500", | |
| 194 | +/* Platform device for ASoC MOP500 machine */ | |
| 195 | +static struct platform_device snd_soc_mop500 = { | |
| 196 | + .name = "snd-soc-mop500", | |
| 197 | 197 | .id = 0, |
| 198 | 198 | .dev = { |
| 199 | 199 | .platform_data = NULL, |
| @@ -227,8 +227,8 @@ int mop500_msp_init(struct device *parent) · 27 unmodified lines | ||
| 227 | 227 | { |
| 228 | 228 | struct platform_device *msp1; |
| 229 | 229 | |
| 230 | − pr_info("%s: Register platform-device 'snd-soc-u8500'.\n", __func__); | |
| 231 | − platform_device_register(&snd_soc_u8500); | |
| 230 | + pr_info("%s: Register platform-device 'snd-soc-mop500'.\n", __func__); | |
| 231 | + platform_device_register(&snd_soc_mop500); | |
| 232 | 232 | |
| 233 | 233 | pr_info("Initialize MSP I2S-devices.\n"); |
| 234 | 234 | db8500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, |
| @@ -776,6 +776,7 @@ static void __init u8500_init_machine(void) · 775 unmodified lines | ||
| 776 | 776 | ARRAY_SIZE(mop500_platform_devs)); |
| 777 | 777 | |
| 778 | 778 | mop500_sdi_init(parent); |
| 779 | + mop500_msp_init(parent); | |
| 779 | 780 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
| 780 | 781 | i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); |
| 781 | 782 | i2c_register_board_info(2, mop500_i2c2_devices, |
| @@ -783,6 +784,8 @@ static void __init u8500_init_machine(void) · 1 unmodified line | ||
| 783 | 784 | |
| 784 | 785 | mop500_uib_init(); |
| 785 | 786 | |
| 787 | + } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) { | |
| 788 | + mop500_msp_init(parent); | |
| 786 | 789 | } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) { |
| 787 | 790 | /* |
| 788 | 791 | * The HREFv60 board removed a GPIO expander and routed |
| @@ -794,6 +797,7 @@ static void __init u8500_init_machine(void) · 5 unmodified lines | ||
| 794 | 797 | ARRAY_SIZE(mop500_platform_devs)); |
| 795 | 798 | |
| 796 | 799 | hrefv60_sdi_init(parent); |
| 800 | + mop500_msp_init(parent); | |
| 797 | 801 | |
| 798 | 802 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
| 799 | 803 | i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES; |
| @@ -267,17 +267,19 @@ static void __dma_free_remap(void *cpu_addr, size_t size) · 266 unmodified lines | ||
| 267 | 267 | vunmap(cpu_addr); |
| 268 | 268 | } |
| 269 | 269 | |
| 270 | +#define DEFAULT_DMA_COHERENT_POOL_SIZE SZ_256K | |
| 271 | + | |
| 270 | 272 | struct dma_pool { |
| 271 | 273 | size_t size; |
| 272 | 274 | spinlock_t lock; |
| 273 | 275 | unsigned long *bitmap; |
| 274 | 276 | unsigned long nr_pages; |
| 275 | 277 | void *vaddr; |
| 276 | − struct page *page; | |
| 278 | + struct page **pages; | |
| 277 | 279 | }; |
| 278 | 280 | |
| 279 | 281 | static struct dma_pool atomic_pool = { |
| 280 | − .size = SZ_256K, | |
| 282 | + .size = DEFAULT_DMA_COHERENT_POOL_SIZE, | |
| 281 | 283 | }; |
| 282 | 284 | |
| 283 | 285 | static int __init early_coherent_pool(char *p) |
| @@ -287,6 +289,21 @@ static int __init early_coherent_pool(char *p) · 3 unmodified lines | ||
| 287 | 289 | } |
| 288 | 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 | 308 | * Initialise the coherent pool for atomic allocations. |
| 292 | 309 | */ |
| @@ -297,6 +314,7 @@ static int __init atomic_pool_init(void) · 4 unmodified lines | ||
| 297 | 314 | unsigned long nr_pages = pool->size >> PAGE_SHIFT; |
| 298 | 315 | unsigned long *bitmap; |
| 299 | 316 | struct page *page; |
| 317 | + struct page **pages; | |
| 300 | 318 | void *ptr; |
| 301 | 319 | int bitmap_size = BITS_TO_LONGS(nr_pages) * sizeof(long); |
| 302 | 320 | |
| @@ -304,21 +322,31 @@ static int __init atomic_pool_init(void) · 1 unmodified line | ||
| 304 | 322 | if (!bitmap) |
| 305 | 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 | 329 | if (IS_ENABLED(CONFIG_CMA)) |
| 308 | 330 | ptr = __alloc_from_contiguous(NULL, pool->size, prot, &page); |
| 309 | 331 | else |
| 310 | 332 | ptr = __alloc_remap_buffer(NULL, pool->size, GFP_KERNEL, prot, |
| 311 | 333 | &page, NULL); |
| 312 | 334 | if (ptr) { |
| 335 | + int i; | |
| 336 | + | |
| 337 | + for (i = 0; i < nr_pages; i++) | |
| 338 | + pages[i] = page + i; | |
| 339 | + | |
| 313 | 340 | spin_lock_init(&pool->lock); |
| 314 | 341 | pool->vaddr = ptr; |
| 315 | − pool->page = page; | |
| 342 | + pool->pages = pages; | |
| 316 | 343 | pool->bitmap = bitmap; |
| 317 | 344 | pool->nr_pages = nr_pages; |
| 318 | 345 | pr_info("DMA: preallocated %u KiB pool for atomic coherent allocations\n", |
| 319 | 346 | (unsigned)pool->size / 1024); |
| 320 | 347 | return 0; |
| 321 | 348 | } |
| 349 | +no_pages: | |
| 322 | 350 | kfree(bitmap); |
| 323 | 351 | no_bitmap: |
| 324 | 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) · 118 unmodified lines | ||
| 443 | 471 | if (pageno < pool->nr_pages) { |
| 444 | 472 | bitmap_set(pool->bitmap, pageno, count); |
| 445 | 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 | 480 | spin_unlock_irqrestore(&pool->lock, flags); |
| 449 | 481 | |
| 450 | 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 | 504 | static int __free_from_pool(void *start, size_t size) |
| 454 | 505 | { |
| 455 | 506 | struct dma_pool *pool = &atomic_pool; |
| 456 | 507 | unsigned long pageno, count; |
| 457 | 508 | unsigned long flags; |
| 458 | 509 | |
| 459 | − if (start < pool->vaddr || start > pool->vaddr + pool->size) | |
| 510 | + if (!__in_atomic_pool(start, size)) | |
| 460 | 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 | 513 | pageno = (start - pool->vaddr) >> PAGE_SHIFT; |
| 468 | 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 · 620 unmodified lines | ||
| 1090 | 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 | 1148 | static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs) |
| 1094 | 1149 | { |
| 1095 | 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 | 1155 | if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) |
| 1098 | 1156 | return cpu_addr; |
| 1099 | 1157 | |
| @@ -1103,6 +1161,34 @@ static struct page **__iommu_get_pages(void *cpu_addr, struct dma_attrs *attrs) · 3 unmodified lines | ||
| 1103 | 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 | 1192 | static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, |
| 1107 | 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, · 4 unmodified lines | ||
| 1113 | 1199 | *handle = DMA_ERROR_CODE; |
| 1114 | 1200 | size = PAGE_ALIGN(size); |
| 1115 | 1201 | |
| 1202 | + if (gfp & GFP_ATOMIC) | |
| 1203 | + return __iommu_alloc_atomic(dev, size, handle); | |
| 1204 | + | |
| 1116 | 1205 | pages = __iommu_alloc_buffer(dev, size, gfp); |
| 1117 | 1206 | if (!pages) |
| 1118 | 1207 | return NULL; |
| @@ -1179,6 +1268,11 @@ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, · 60 unmodified lines | ||
| 1179 | 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 | 1276 | if (!dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, attrs)) { |
| 1183 | 1277 | unmap_kernel_range((unsigned long)cpu_addr, size); |
| 1184 | 1278 | vunmap(cpu_addr); |
| @@ -17,52 +17,12 @@ · 16 unmodified lines | ||
| 17 | 17 | #include <linux/dma-mapping.h> |
| 18 | 18 | |
| 19 | 19 | #include <plat/common.h> |
| 20 | −#include <plat/board.h> | |
| 21 | 20 | #include <plat/vram.h> |
| 22 | 21 | #include <plat/dsp.h> |
| 23 | 22 | #include <plat/dma.h> |
| 24 | 23 | |
| 25 | 24 | #include <plat/omap-secure.h> |
| 26 | 25 | |
| 27 | − | |
| 28 | −#define NO_LENGTH_CHECK 0xffffffff | |
| 29 | − | |
| 30 | −struct omap_board_config_kernel *omap_board_config __initdata; | |
| 31 | −int omap_board_config_size; | |
| 32 | − | |
| 33 | −static const void *__init get_config(u16 tag, size_t len, | |
| 34 | − int skip, size_t *len_out) | |
| 35 | −{ | |
| 36 | − struct omap_board_config_kernel *kinfo = NULL; | |
| 37 | − int i; | |
| 38 | − | |
| 39 | − /* Try to find the config from the board-specific structures | |
| 40 | − * in the kernel. */ | |
| 41 | − for (i = 0; i < omap_board_config_size; i++) { | |
| 42 | − if (omap_board_config[i].tag == tag) { | |
| 43 | − if (skip == 0) { | |
| 44 | − kinfo = &omap_board_config[i]; | |
| 45 | − break; | |
| 46 | − } else { | |
| 47 | − skip--; | |
| 48 | − } | |
| 49 | − } | |
| 50 | − } | |
| 51 | − if (kinfo == NULL) | |
| 52 | − return NULL; | |
| 53 | − return kinfo->data; | |
| 54 | −} | |
| 55 | − | |
| 56 | −const void *__init __omap_get_config(u16 tag, size_t len, int nr) | |
| 57 | −{ | |
| 58 | − return get_config(tag, len, nr, NULL); | |
| 59 | −} | |
| 60 | − | |
| 61 | −const void *__init omap_get_var_config(u16 tag, size_t *len) | |
| 62 | −{ | |
| 63 | − return get_config(tag, NO_LENGTH_CHECK, 0, len); | |
| 64 | −} | |
| 65 | − | |
| 66 | 26 | void __init omap_reserve(void) |
| 67 | 27 | { |
| 68 | 28 | omap_vram_reserve_sdram_memblock(); |
| @@ -24,7 +24,6 @@ · 23 unmodified lines | ||
| 24 | 24 | |
| 25 | 25 | #include <plat/hardware.h> |
| 26 | 26 | #include <plat/common.h> |
| 27 | −#include <plat/board.h> | |
| 28 | 27 | |
| 29 | 28 | #include <plat/clock.h> |
| 30 | 29 | |
| @@ -17,9 +17,6 @@ · 16 unmodified lines | ||
| 17 | 17 | |
| 18 | 18 | #include <mach/hardware.h> |
| 19 | 19 | |
| 20 | −#include <plat/board.h> | |
| 21 | − | |
| 22 | − | |
| 23 | 20 | /* Many OMAP development platforms reuse the same "debug board"; these |
| 24 | 21 | * platforms include H2, H3, H4, and Perseus2. |
| 25 | 22 | */ |
| @@ -23,7 +23,6 @@ · 22 unmodified lines | ||
| 23 | 23 | #include <asm/memblock.h> |
| 24 | 24 | |
| 25 | 25 | #include <plat/tc.h> |
| 26 | −#include <plat/board.h> | |
| 27 | 26 | #include <plat/mmc.h> |
| 28 | 27 | #include <plat/menelaus.h> |
| 29 | 28 | #include <plat/omap44xx.h> |
| @@ -189,6 +189,7 @@ struct omap_dm_timer *omap_dm_timer_request(void) · 188 unmodified lines | ||
| 189 | 189 | timer->reserved = 1; |
| 190 | 190 | break; |
| 191 | 191 | } |
| 192 | + spin_unlock_irqrestore(&dm_timer_lock, flags); | |
| 192 | 193 | |
| 193 | 194 | if (timer) { |
| 194 | 195 | ret = omap_dm_timer_prepare(timer); |
| @@ -197,7 +198,6 @@ struct omap_dm_timer *omap_dm_timer_request(void) · 2 unmodified lines | ||
| 197 | 198 | timer = NULL; |
| 198 | 199 | } |
| 199 | 200 | } |
| 200 | − spin_unlock_irqrestore(&dm_timer_lock, flags); | |
| 201 | 201 | |
| 202 | 202 | if (!timer) |
| 203 | 203 | pr_debug("%s: timer request failed!\n", __func__); |
| @@ -220,6 +220,7 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) · 16 unmodified lines | ||
| 220 | 220 | break; |
| 221 | 221 | } |
| 222 | 222 | } |
| 223 | + spin_unlock_irqrestore(&dm_timer_lock, flags); | |
| 223 | 224 | |
| 224 | 225 | if (timer) { |
| 225 | 226 | ret = omap_dm_timer_prepare(timer); |
| @@ -228,7 +229,6 @@ struct omap_dm_timer *omap_dm_timer_request_specific(int id) · 2 unmodified lines | ||
| 228 | 229 | timer = NULL; |
| 229 | 230 | } |
| 230 | 231 | } |
| 231 | − spin_unlock_irqrestore(&dm_timer_lock, flags); | |
| 232 | 232 | |
| 233 | 233 | if (!timer) |
| 234 | 234 | pr_debug("%s: timer%d request failed!\n", __func__, id); |
| @@ -258,7 +258,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_enable); · 23 unmodified lines | ||
| 258 | 258 | |
| 259 | 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 | 263 | EXPORT_SYMBOL_GPL(omap_dm_timer_disable); |
| 264 | 264 | |
| @@ -33,8 +33,6 @@ · 32 unmodified lines | ||
| 33 | 33 | #include <mach/hardware.h> |
| 34 | 34 | #include <asm/mach/map.h> |
| 35 | 35 | |
| 36 | −#include <plat/board.h> | |
| 37 | − | |
| 38 | 36 | #if defined(CONFIG_FB_OMAP) || defined(CONFIG_FB_OMAP_MODULE) |
| 39 | 37 | |
| 40 | 38 | static bool omapfb_lcd_configured; |
| @@ -1,138 +0,0 @@ | ||
| 1 | −/* | |
| 2 | − * arch/arm/plat-omap/include/mach/board.h | |
| 3 | − * | |
| 4 | − * Information structures for board-specific data | |
| 5 | − * | |
| 6 | − * Copyright (C) 2004 Nokia Corporation | |
| 7 | − * Written by Juha Yrjölä <juha.yrjola@nokia.com> | |
| 8 | − */ | |
| 9 | − | |
| 10 | −#ifndef _OMAP_BOARD_H | |
| 11 | −#define _OMAP_BOARD_H | |
| 12 | − | |
| 13 | −#include <linux/types.h> | |
| 14 | − | |
| 15 | −#include <plat/gpio-switch.h> | |
| 16 | − | |
| 17 | −/* | |
| 18 | − * OMAP35x EVM revision | |
| 19 | − * Run time detection of EVM revision is done by reading Ethernet | |
| 20 | − * PHY ID - | |
| 21 | − * GEN_1 = 0x01150000 | |
| 22 | − * GEN_2 = 0x92200000 | |
| 23 | − */ | |
| 24 | −enum { | |
| 25 | − OMAP3EVM_BOARD_GEN_1 = 0, /* EVM Rev between A - D */ | |
| 26 | − OMAP3EVM_BOARD_GEN_2, /* EVM Rev >= Rev E */ | |
| 27 | −}; | |
| 28 | − | |
| 29 | −/* Different peripheral ids */ | |
| 30 | −#define OMAP_TAG_CLOCK 0x4f01 | |
| 31 | −#define OMAP_TAG_GPIO_SWITCH 0x4f06 | |
| 32 | −#define OMAP_TAG_STI_CONSOLE 0x4f09 | |
| 33 | −#define OMAP_TAG_CAMERA_SENSOR 0x4f0a | |
| 34 | − | |
| 35 | −#define OMAP_TAG_BOOT_REASON 0x4f80 | |
| 36 | −#define OMAP_TAG_FLASH_PART 0x4f81 | |
| 37 | −#define OMAP_TAG_VERSION_STR 0x4f82 | |
| 38 | − | |
| 39 | −struct omap_clock_config { | |
| 40 | − /* 0 for 12 MHz, 1 for 13 MHz and 2 for 19.2 MHz */ | |
| 41 | − u8 system_clock_type; | |
| 42 | −}; | |
| 43 | − | |
| 44 | −struct omap_serial_console_config { | |
| 45 | − u8 console_uart; | |
| 46 | − u32 console_speed; | |
| 47 | −}; | |
| 48 | − | |
| 49 | −struct omap_sti_console_config { | |
| 50 | − unsigned enable:1; | |
| 51 | − u8 channel; | |
| 52 | −}; | |
| 53 | − | |
| 54 | −struct omap_camera_sensor_config { | |
| 55 | − u16 reset_gpio; | |
| 56 | − int (*power_on)(void * data); | |
| 57 | − int (*power_off)(void * data); | |
| 58 | −}; | |
| 59 | − | |
| 60 | −struct omap_lcd_config { | |
| 61 | − char panel_name[16]; | |
| 62 | − char ctrl_name[16]; | |
| 63 | − s16 nreset_gpio; | |
| 64 | − u8 data_lines; | |
| 65 | −}; | |
| 66 | − | |
| 67 | −struct device; | |
| 68 | −struct fb_info; | |
| 69 | −struct omap_backlight_config { | |
| 70 | − int default_intensity; | |
| 71 | − int (*set_power)(struct device *dev, int state); | |
| 72 | −}; | |
| 73 | − | |
| 74 | −struct omap_fbmem_config { | |
| 75 | − u32 start; | |
| 76 | − u32 size; | |
| 77 | −}; | |
| 78 | − | |
| 79 | −struct omap_pwm_led_platform_data { | |
| 80 | − const char *name; | |
| 81 | − int intensity_timer; | |
| 82 | − int blink_timer; | |
| 83 | − void (*set_power)(struct omap_pwm_led_platform_data *self, int on_off); | |
| 84 | −}; | |
| 85 | − | |
| 86 | −struct omap_uart_config { | |
| 87 | − /* Bit field of UARTs present; bit 0 --> UART1 */ | |
| 88 | − unsigned int enabled_uarts; | |
| 89 | −}; | |
| 90 | − | |
| 91 | − | |
| 92 | −struct omap_flash_part_config { | |
| 93 | − char part_table[0]; | |
| 94 | −}; | |
| 95 | − | |
| 96 | −struct omap_boot_reason_config { | |
| 97 | − char reason_str[12]; | |
| 98 | −}; | |
| 99 | − | |
| 100 | −struct omap_version_config { | |
| 101 | − char component[12]; | |
| 102 | − char version[12]; | |
| 103 | −}; | |
| 104 | − | |
| 105 | −struct omap_board_config_entry { | |
| 106 | − u16 tag; | |
| 107 | − u16 len; | |
| 108 | − u8 data[0]; | |
| 109 | −}; | |
| 110 | − | |
| 111 | −struct omap_board_config_kernel { | |
| 112 | − u16 tag; | |
| 113 | − const void *data; | |
| 114 | −}; | |
| 115 | − | |
| 116 | −extern const void *__init __omap_get_config(u16 tag, size_t len, int nr); | |
| 117 | − | |
| 118 | −#define omap_get_config(tag, type) \ | |
| 119 | − ((const type *) __omap_get_config((tag), sizeof(type), 0)) | |
| 120 | −#define omap_get_nr_config(tag, type, nr) \ | |
| 121 | − ((const type *) __omap_get_config((tag), sizeof(type), (nr))) | |
| 122 | − | |
| 123 | −extern const void *__init omap_get_var_config(u16 tag, size_t *len); | |
| 124 | − | |
| 125 | −extern struct omap_board_config_kernel *omap_board_config; | |
| 126 | −extern int omap_board_config_size; | |
| 127 | − | |
| 128 | − | |
| 129 | −/* for TI reference platforms sharing the same debug card */ | |
| 130 | −extern int debug_card_init(u32 addr, unsigned gpio); | |
| 131 | − | |
| 132 | −/* OMAP3EVM revision */ | |
| 133 | −#if defined(CONFIG_MACH_OMAP3EVM) | |
| 134 | −u8 get_omap3_evm_rev(void); | |
| 135 | −#else | |
| 136 | −#define get_omap3_evm_rev() (-EINVAL) | |
| 137 | −#endif | |
| 138 | −#endif | |
| @@ -372,7 +372,8 @@ IS_OMAP_TYPE(3430, 0x3430) · 371 unmodified lines | ||
| 372 | 372 | #define cpu_class_is_omap1() (cpu_is_omap7xx() || cpu_is_omap15xx() || \ |
| 373 | 373 | cpu_is_omap16xx()) |
| 374 | 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 | 378 | /* Various silicon revisions for omap2 */ |
| 378 | 379 | #define OMAP242X_CLASS 0x24200024 |
| @@ -0,0 +1,9 @@ | ||
| 1 | +#ifndef _OMAP_DEBUG_DEVICES_H | |
| 2 | +#define _OMAP_DEBUG_DEVICES_H | |
| 3 | + | |
| 4 | +#include <linux/types.h> | |
| 5 | + | |
| 6 | +/* for TI reference platforms sharing the same debug card */ | |
| 7 | +extern int debug_card_init(u32 addr, unsigned gpio); | |
| 8 | + | |
| 9 | +#endif | |
| @@ -133,6 +133,25 @@ struct gpmc_timings { · 132 unmodified lines | ||
| 133 | 133 | u16 wr_data_mux_bus; /* WRDATAONADMUXBUS */ |
| 134 | 134 | }; |
| 135 | 135 | |
| 136 | +struct gpmc_nand_regs { | |
| 137 | + void __iomem *gpmc_status; | |
| 138 | + void __iomem *gpmc_nand_command; | |
| 139 | + void __iomem *gpmc_nand_address; | |
| 140 | + void __iomem *gpmc_nand_data; | |
| 141 | + void __iomem *gpmc_prefetch_config1; | |
| 142 | + void __iomem *gpmc_prefetch_config2; | |
| 143 | + void __iomem *gpmc_prefetch_control; | |
| 144 | + void __iomem *gpmc_prefetch_status; | |
| 145 | + void __iomem *gpmc_ecc_config; | |
| 146 | + void __iomem *gpmc_ecc_control; | |
| 147 | + void __iomem *gpmc_ecc_size_config; | |
| 148 | + void __iomem *gpmc_ecc1_result; | |
| 149 | + void __iomem *gpmc_bch_result0; | |
| 150 | +}; | |
| 151 | + | |
| 152 | +extern void gpmc_update_nand_reg(struct gpmc_nand_regs *reg, int cs); | |
| 153 | +extern int gpmc_get_client_irq(unsigned irq_config); | |
| 154 | + | |
| 136 | 155 | extern unsigned int gpmc_ns_to_ticks(unsigned int time_ns); |
| 137 | 156 | extern unsigned int gpmc_ps_to_ticks(unsigned int time_ps); |
| 138 | 157 | extern unsigned int gpmc_ticks_to_ns(unsigned int ticks); |
| @@ -15,7 +15,6 @@ · 14 unmodified lines | ||
| 15 | 15 | #include <linux/device.h> |
| 16 | 16 | #include <linux/mmc/host.h> |
| 17 | 17 | |
| 18 | −#include <plat/board.h> | |
| 19 | 18 | #include <plat/omap_hwmod.h> |
| 20 | 19 | |
| 21 | 20 | #define OMAP15XX_NR_MMC 1 |
| @@ -108,4 +108,13 @@ · 107 unmodified lines | ||
| 108 | 108 | # endif |
| 109 | 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 | 120 | #endif /* __PLAT_OMAP_MULTI_H */ |
| @@ -26,9 +26,9 @@ struct omap_nand_platform_data { · 25 unmodified lines | ||
| 26 | 26 | bool dev_ready; |
| 27 | 27 | int gpmc_irq; |
| 28 | 28 | enum nand_io xfer_type; |
| 29 | − unsigned long phys_base; | |
| 30 | 29 | int devsize; |
| 31 | 30 | enum omap_ecc ecc_opt; |
| 31 | + struct gpmc_nand_regs reg; | |
| 32 | 32 | }; |
| 33 | 33 | |
| 34 | 34 | /* minimum size for IO mapping */ |
| @@ -110,7 +110,7 @@ static inline void flush(void) · 109 unmodified lines | ||
| 110 | 110 | _DEBUG_LL_ENTRY(mach, AM33XX_UART##p##_BASE, OMAP_PORT_SHIFT, \ |
| 111 | 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 | 115 | int port = 0; |
| 116 | 116 | |
| @@ -198,8 +198,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id) · 81 unmodified lines | ||
| 198 | 198 | } while (0); |
| 199 | 199 | } |
| 200 | 200 | |
| 201 | −#define arch_decomp_setup() __arch_decomp_setup(arch_id) | |
| 202 | − | |
| 203 | 201 | /* |
| 204 | 202 | * nothing to do |
| 205 | 203 | */ |
| @@ -5,7 +5,6 @@ · 4 unmodified lines | ||
| 5 | 5 | |
| 6 | 6 | #include <linux/io.h> |
| 7 | 7 | #include <linux/usb/musb.h> |
| 8 | −#include <plat/board.h> | |
| 9 | 8 | |
| 10 | 9 | #define OMAP3_HS_USB_PORTS 3 |
| 11 | 10 | |
| @@ -26,7 +26,6 @@ · 25 unmodified lines | ||
| 26 | 26 | #include <asm/mach/map.h> |
| 27 | 27 | |
| 28 | 28 | #include <plat/sram.h> |
| 29 | −#include <plat/board.h> | |
| 30 | 29 | #include <plat/cpu.h> |
| 31 | 30 | |
| 32 | 31 | #include "sram.h" |
| @@ -291,10 +291,12 @@ static struct platform_device orion_ge00 = { · 290 unmodified lines | ||
| 291 | 291 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, |
| 292 | 292 | unsigned long mapbase, |
| 293 | 293 | unsigned long irq, |
| 294 | − unsigned long irq_err) | |
| 294 | + unsigned long irq_err, | |
| 295 | + unsigned int tx_csum_limit) | |
| 295 | 296 | { |
| 296 | 297 | fill_resources(&orion_ge00_shared, orion_ge00_shared_resources, |
| 297 | 298 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
| 299 | + orion_ge00_shared_data.tx_csum_limit = tx_csum_limit; | |
| 298 | 300 | ge_complete(&orion_ge00_shared_data, |
| 299 | 301 | orion_ge00_resources, irq, &orion_ge00_shared, |
| 300 | 302 | eth_data, &orion_ge00); |
| @@ -343,10 +345,12 @@ static struct platform_device orion_ge01 = { · 42 unmodified lines | ||
| 343 | 345 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, |
| 344 | 346 | unsigned long mapbase, |
| 345 | 347 | unsigned long irq, |
| 346 | − unsigned long irq_err) | |
| 348 | + unsigned long irq_err, | |
| 349 | + unsigned int tx_csum_limit) | |
| 347 | 350 | { |
| 348 | 351 | fill_resources(&orion_ge01_shared, orion_ge01_shared_resources, |
| 349 | 352 | mapbase + 0x2000, SZ_16K - 1, irq_err); |
| 353 | + orion_ge01_shared_data.tx_csum_limit = tx_csum_limit; | |
| 350 | 354 | ge_complete(&orion_ge01_shared_data, |
| 351 | 355 | orion_ge01_resources, irq, &orion_ge01_shared, |
| 352 | 356 | eth_data, &orion_ge01); |
| @@ -39,12 +39,14 @@ void __init orion_rtc_init(unsigned long mapbase, · 38 unmodified lines | ||
| 39 | 39 | void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data, |
| 40 | 40 | unsigned long mapbase, |
| 41 | 41 | unsigned long irq, |
| 42 | − unsigned long irq_err); | |
| 42 | + unsigned long irq_err, | |
| 43 | + unsigned int tx_csum_limit); | |
| 43 | 44 | |
| 44 | 45 | void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data, |
| 45 | 46 | unsigned long mapbase, |
| 46 | 47 | unsigned long irq, |
| 47 | − unsigned long irq_err); | |
| 48 | + unsigned long irq_err, | |
| 49 | + unsigned int tx_csum_limit); | |
| 48 | 50 | |
| 49 | 51 | void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data, |
| 50 | 52 | unsigned long mapbase, |
| @@ -430,7 +430,7 @@ s3c2410_dma_canload(struct s3c2410_dma_chan *chan) · 429 unmodified lines | ||
| 430 | 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 | 434 | dma_addr_t data, int size) |
| 435 | 435 | { |
| 436 | 436 | struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel); |
| @@ -32,6 +32,8 @@ · 31 unmodified lines | ||
| 32 | 32 | #include <linux/platform_data/s3c-hsudc.h> |
| 33 | 33 | #include <linux/platform_data/s3c-hsotg.h> |
| 34 | 34 | |
| 35 | +#include <media/s5p_hdmi.h> | |
| 36 | + | |
| 35 | 37 | #include <asm/irq.h> |
| 36 | 38 | #include <asm/pmu.h> |
| 37 | 39 | #include <asm/mach/arch.h> |
| @@ -748,7 +750,8 @@ void __init s5p_i2c_hdmiphy_set_platdata(struct s3c2410_platform_i2c *pd) · 710 unmodified lines | ||
| 748 | 750 | if (!pd) { |
| 749 | 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 | 755 | pd->bus_num = 8; |
| 753 | 756 | else if (soc_is_s5pv210()) |
| 754 | 757 | pd->bus_num = 3; |
| @@ -759,6 +762,30 @@ void __init s5p_i2c_hdmiphy_set_platdata(struct s3c2410_platform_i2c *pd) · 4 unmodified lines | ||
| 759 | 762 | npd = s3c_set_platdata(pd, sizeof(struct s3c2410_platform_i2c), |
| 760 | 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 | 789 | #endif /* CONFIG_S5P_DEV_I2C_HDMIPHY */ |
| 763 | 790 | |
| 764 | 791 | /* I2S */ |
| @@ -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 */ | |
| @@ -74,7 +74,7 @@ unsigned char pm_uart_udivslot; · 73 unmodified lines | ||
| 74 | 74 | |
| 75 | 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 | 79 | static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save) |
| 80 | 80 | { |
| @@ -89,6 +89,7 @@ config ATH79 · 88 unmodified lines | ||
| 89 | 89 | select CEVT_R4K |
| 90 | 90 | select CSRC_R4K |
| 91 | 91 | select DMA_NONCOHERENT |
| 92 | + select HAVE_CLK | |
| 92 | 93 | select IRQ_CPU |
| 93 | 94 | select MIPS_MACHINE |
| 94 | 95 | select SYS_HAS_CPU_MIPS32_R2 |
| @@ -228,6 +228,8 @@ static int mtx1_pci_idsel(unsigned int devsel, int assert) · 227 unmodified lines | ||
| 228 | 228 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom |
| 229 | 229 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. |
| 230 | 230 | */ |
| 231 | + udelay(1); | |
| 232 | + | |
| 231 | 233 | if (assert && devsel != 0) |
| 232 | 234 | /* Suppress signal to Cardbus */ |
| 233 | 235 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ |
| @@ -145,6 +145,8 @@ static void __init ar7240_usb_setup(void) · 144 unmodified lines | ||
| 145 | 145 | |
| 146 | 146 | ath79_ohci_resources[0].start = AR7240_OHCI_BASE; |
| 147 | 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 | 150 | platform_device_register(&ath79_ohci_device); |
| 149 | 151 | } |
| 150 | 152 | |
| @@ -188,8 +188,10 @@ void __init ath79_gpio_init(void) · 187 unmodified lines | ||
| 188 | 188 | |
| 189 | 189 | if (soc_is_ar71xx()) |
| 190 | 190 | ath79_gpio_count = AR71XX_GPIO_COUNT; |
| 191 | − else if (soc_is_ar724x()) | |
| 192 | − ath79_gpio_count = AR724X_GPIO_COUNT; | |
| 191 | + else if (soc_is_ar7240()) | |
| 192 | + ath79_gpio_count = AR7240_GPIO_COUNT; | |
| 193 | + else if (soc_is_ar7241() || soc_is_ar7242()) | |
| 194 | + ath79_gpio_count = AR7241_GPIO_COUNT; | |
| 193 | 195 | else if (soc_is_ar913x()) |
| 194 | 196 | ath79_gpio_count = AR913X_GPIO_COUNT; |
| 195 | 197 | else if (soc_is_ar933x()) |
| @@ -106,11 +106,15 @@ int __init bcm63xx_spi_register(void) · 105 unmodified lines | ||
| 106 | 106 | if (BCMCPU_IS_6338() || BCMCPU_IS_6348()) { |
| 107 | 107 | spi_resources[0].end += BCM_6338_RSET_SPI_SIZE - 1; |
| 108 | 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 | 113 | if (BCMCPU_IS_6358() || BCMCPU_IS_6368()) { |
| 112 | 114 | spi_resources[0].end += BCM_6358_RSET_SPI_SIZE - 1; |
| 113 | 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 | 120 | bcm63xx_spi_regs_init(); |
| @@ -61,6 +61,12 @@ static void octeon_irq_set_ciu_mapping(int irq, int line, int bit, · 60 unmodified lines | ||
| 61 | 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 | 70 | static int octeon_coreid_for_cpu(int cpu) |
| 65 | 71 | { |
| 66 | 72 | #ifdef CONFIG_SMP |
| @@ -183,19 +189,9 @@ static void __init octeon_irq_init_core(void) · 116 unmodified lines | ||
| 183 | 189 | mutex_init(&cd->core_irq_mutex); |
| 184 | 190 | |
| 185 | 191 | irq = OCTEON_IRQ_SW0 + i; |
| 186 | − switch (irq) { | |
| 187 | − case OCTEON_IRQ_TIMER: | |
| 188 | − case OCTEON_IRQ_SW0: | |
| 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 | − } | |
| 192 | + irq_set_chip_data(irq, cd); | |
| 193 | + irq_set_chip_and_handler(irq, &octeon_irq_chip_core, | |
| 194 | + handle_percpu_irq); | |
| 199 | 195 | } |
| 200 | 196 | } |
| 201 | 197 | |
| @@ -890,7 +886,6 @@ static int octeon_irq_gpio_xlat(struct irq_domain *d, · 688 unmodified lines | ||
| 890 | 886 | unsigned int type; |
| 891 | 887 | unsigned int pin; |
| 892 | 888 | unsigned int trigger; |
| 893 | − struct octeon_irq_gpio_domain_data *gpiod; | |
| 894 | 889 | |
| 895 | 890 | if (d->of_node != node) |
| 896 | 891 | return -EINVAL; |
| @@ -925,8 +920,7 @@ static int octeon_irq_gpio_xlat(struct irq_domain *d, · 28 unmodified lines | ||
| 925 | 920 | break; |
| 926 | 921 | } |
| 927 | 922 | *out_type = type; |
| 928 | − gpiod = d->host_data; | |
| 929 | − *out_hwirq = gpiod->base_hwirq + pin; | |
| 923 | + *out_hwirq = pin; | |
| 930 | 924 | |
| 931 | 925 | return 0; |
| 932 | 926 | } |
| @@ -996,19 +990,21 @@ static int octeon_irq_ciu_map(struct irq_domain *d, · 63 unmodified lines | ||
| 996 | 990 | static int octeon_irq_gpio_map(struct irq_domain *d, |
| 997 | 991 | unsigned int virq, irq_hw_number_t hw) |
| 998 | 992 | { |
| 999 | − unsigned int line = hw >> 6; | |
| 1000 | − unsigned int bit = hw & 63; | |
| 993 | + struct octeon_irq_gpio_domain_data *gpiod = d->host_data; | |
| 994 | + unsigned int line, bit; | |
| 1001 | 995 | |
| 1002 | 996 | if (!octeon_irq_virq_in_range(virq)) |
| 1003 | 997 | return -EINVAL; |
| 1004 | 998 | |
| 999 | + hw += gpiod->base_hwirq; | |
| 1000 | + line = hw >> 6; | |
| 1001 | + bit = hw & 63; | |
| 1005 | 1002 | if (line > 1 || octeon_irq_ciu_to_irq[line][bit] != 0) |
| 1006 | 1003 | return -EINVAL; |
| 1007 | 1004 | |
| 1008 | 1005 | octeon_irq_set_ciu_mapping(virq, line, bit, |
| 1009 | 1006 | octeon_irq_gpio_chip, |
| 1010 | 1007 | octeon_irq_handle_gpio); |
| 1011 | − | |
| 1012 | 1008 | return 0; |
| 1013 | 1009 | } |
| 1014 | 1010 | |
| @@ -1149,6 +1145,7 @@ static void __init octeon_irq_init_ciu(void) · 134 unmodified lines | ||
| 1149 | 1145 | struct irq_chip *chip_wd; |
| 1150 | 1146 | struct device_node *gpio_node; |
| 1151 | 1147 | struct device_node *ciu_node; |
| 1148 | + struct irq_domain *ciu_domain = NULL; | |
| 1152 | 1149 | |
| 1153 | 1150 | octeon_irq_init_ciu_percpu(); |
| 1154 | 1151 | octeon_irq_setup_secondary = octeon_irq_setup_secondary_ciu; |
| @@ -1177,31 +1174,6 @@ static void __init octeon_irq_init_ciu(void) · 22 unmodified lines | ||
| 1177 | 1174 | /* Mips internal */ |
| 1178 | 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 | 1177 | gpio_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-gpio"); |
| 1206 | 1178 | if (gpio_node) { |
| 1207 | 1179 | struct octeon_irq_gpio_domain_data *gpiod; |
| @@ -1219,10 +1191,35 @@ static void __init octeon_irq_init_ciu(void) · 11 unmodified lines | ||
| 1219 | 1191 | |
| 1220 | 1192 | ciu_node = of_find_compatible_node(NULL, NULL, "cavium,octeon-3860-ciu"); |
| 1221 | 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 | 1195 | of_node_put(ciu_node); |
| 1224 | 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 | 1224 | /* Enable the CIU lines */ |
| 1228 | 1225 | set_c0_status(STATUSF_IP3 | STATUSF_IP2); |
| @@ -393,7 +393,8 @@ · 392 unmodified lines | ||
| 393 | 393 | #define AR71XX_GPIO_REG_FUNC 0x28 |
| 394 | 394 | |
| 395 | 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 | 398 | #define AR913X_GPIO_COUNT 22 |
| 398 | 399 | #define AR933X_GPIO_COUNT 30 |
| 399 | 400 | #define AR934X_GPIO_COUNT 23 |
| @@ -42,7 +42,6 @@ · 41 unmodified lines | ||
| 42 | 42 | #define cpu_has_mips64r1 0 |
| 43 | 43 | #define cpu_has_mips64r2 0 |
| 44 | 44 | |
| 45 | −#define cpu_has_dsp 0 | |
| 46 | 45 | #define cpu_has_mipsmt 0 |
| 47 | 46 | |
| 48 | 47 | #define cpu_has_64bits 0 |
| @@ -9,6 +9,8 @@ int __init bcm63xx_spi_register(void); · 8 unmodified lines | ||
| 9 | 9 | |
| 10 | 10 | struct bcm63xx_spi_pdata { |
| 11 | 11 | unsigned int fifo_size; |
| 12 | + unsigned int msg_type_shift; | |
| 13 | + unsigned int msg_ctl_width; | |
| 12 | 14 | int bus_num; |
| 13 | 15 | int num_chipselect; |
| 14 | 16 | u32 speed_hz; |
| @@ -1054,7 +1054,8 @@ · 1053 unmodified lines | ||
| 1054 | 1054 | #define SPI_6338_FILL_BYTE 0x07 |
| 1055 | 1055 | #define SPI_6338_MSG_TAIL 0x09 |
| 1056 | 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 | 1059 | #define SPI_6338_MSG_DATA 0x41 |
| 1059 | 1060 | #define SPI_6338_MSG_DATA_SIZE 0x3f |
| 1060 | 1061 | #define SPI_6338_RX_DATA 0x80 |
| @@ -1070,7 +1071,8 @@ · 9 unmodified lines | ||
| 1070 | 1071 | #define SPI_6348_FILL_BYTE 0x07 |
| 1071 | 1072 | #define SPI_6348_MSG_TAIL 0x09 |
| 1072 | 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 | 1076 | #define SPI_6348_MSG_DATA 0x41 |
| 1075 | 1077 | #define SPI_6348_MSG_DATA_SIZE 0x3f |
| 1076 | 1078 | #define SPI_6348_RX_DATA 0x80 |
| @@ -1078,6 +1080,7 @@ · 1 unmodified line | ||
| 1078 | 1080 | |
| 1079 | 1081 | /* BCM 6358 SPI core */ |
| 1080 | 1082 | #define SPI_6358_MSG_CTL 0x00 /* 16-bits register */ |
| 1083 | +#define SPI_6358_MSG_CTL_WIDTH 16 | |
| 1081 | 1084 | #define SPI_6358_MSG_DATA 0x02 |
| 1082 | 1085 | #define SPI_6358_MSG_DATA_SIZE 0x21e |
| 1083 | 1086 | #define SPI_6358_RX_DATA 0x400 |
| @@ -1094,6 +1097,7 @@ · 10 unmodified lines | ||
| 1094 | 1097 | |
| 1095 | 1098 | /* BCM 6358 SPI core */ |
| 1096 | 1099 | #define SPI_6368_MSG_CTL 0x00 /* 16-bits register */ |
| 1100 | +#define SPI_6368_MSG_CTL_WIDTH 16 | |
| 1097 | 1101 | #define SPI_6368_MSG_DATA 0x02 |
| 1098 | 1102 | #define SPI_6368_MSG_DATA_SIZE 0x21e |
| 1099 | 1103 | #define SPI_6368_RX_DATA 0x400 |
| @@ -1115,7 +1119,10 @@ · 15 unmodified lines | ||
| 1115 | 1119 | #define SPI_HD_W 0x01 |
| 1116 | 1120 | #define SPI_HD_R 0x02 |
| 1117 | 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 | 1127 | /* Command */ |
| 1121 | 1128 | #define SPI_CMD_NOOP 0x00 |
| @@ -21,14 +21,10 @@ enum octeon_irq { · 20 unmodified lines | ||
| 21 | 21 | OCTEON_IRQ_TIMER, |
| 22 | 22 | /* sources in CIU_INTX_EN0 */ |
| 23 | 23 | OCTEON_IRQ_WORKQ0, |
| 24 | − OCTEON_IRQ_GPIO0 = OCTEON_IRQ_WORKQ0 + 16, | |
| 25 | − OCTEON_IRQ_WDOG0 = OCTEON_IRQ_GPIO0 + 16, | |
| 24 | + OCTEON_IRQ_WDOG0 = OCTEON_IRQ_WORKQ0 + 16, | |
| 26 | 25 | OCTEON_IRQ_WDOG15 = OCTEON_IRQ_WDOG0 + 15, |
| 27 | 26 | OCTEON_IRQ_MBOX0 = OCTEON_IRQ_WDOG0 + 16, |
| 28 | 27 | OCTEON_IRQ_MBOX1, |
| 29 | − OCTEON_IRQ_UART0, | |
| 30 | − OCTEON_IRQ_UART1, | |
| 31 | − OCTEON_IRQ_UART2, | |
| 32 | 28 | OCTEON_IRQ_PCI_INT0, |
| 33 | 29 | OCTEON_IRQ_PCI_INT1, |
| 34 | 30 | OCTEON_IRQ_PCI_INT2, |
| @@ -38,8 +34,6 @@ enum octeon_irq { · 3 unmodified lines | ||
| 38 | 34 | OCTEON_IRQ_PCI_MSI2, |
| 39 | 35 | OCTEON_IRQ_PCI_MSI3, |
| 40 | 36 | |
| 41 | − OCTEON_IRQ_TWSI, | |
| 42 | − OCTEON_IRQ_TWSI2, | |
| 43 | 37 | OCTEON_IRQ_RML, |
| 44 | 38 | OCTEON_IRQ_TIMER0, |
| 45 | 39 | OCTEON_IRQ_TIMER1, |
| @@ -47,8 +41,6 @@ enum octeon_irq { · 1 unmodified line | ||
| 47 | 41 | OCTEON_IRQ_TIMER3, |
| 48 | 42 | OCTEON_IRQ_USB0, |
| 49 | 43 | OCTEON_IRQ_USB1, |
| 50 | − OCTEON_IRQ_MII0, | |
| 51 | − OCTEON_IRQ_MII1, | |
| 52 | 44 | OCTEON_IRQ_BOOTDMA, |
| 53 | 45 | #ifndef CONFIG_PCI_MSI |
| 54 | 46 | OCTEON_IRQ_LAST = 127 |
| @@ -10,6 +10,7 @@ struct mod_arch_specific { · 9 unmodified lines | ||
| 10 | 10 | struct list_head dbe_list; |
| 11 | 11 | const struct exception_table_entry *dbe_start; |
| 12 | 12 | const struct exception_table_entry *dbe_end; |
| 13 | + struct mips_hi16 *r_mips_hi16_list; | |
| 13 | 14 | }; |
| 14 | 15 | |
| 15 | 16 | typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */ |
| @@ -12,16 +12,16 @@ · 11 unmodified lines | ||
| 12 | 12 | |
| 13 | 13 | #ifdef CONFIG_SYNC_R4K |
| 14 | 14 | |
| 15 | −extern void synchronise_count_master(void); | |
| 16 | −extern void synchronise_count_slave(void); | |
| 15 | +extern void synchronise_count_master(int cpu); | |
| 16 | +extern void synchronise_count_slave(int cpu); | |
| 17 | 17 | |
| 18 | 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 | |
| @@ -39,8 +39,6 @@ struct mips_hi16 { · 38 unmodified lines | ||
| 39 | 39 | Elf_Addr value; |
| 40 | 40 | }; |
| 41 | 41 | |
| 42 | −static struct mips_hi16 *mips_hi16_list; | |
| 43 | − | |
| 44 | 42 | static LIST_HEAD(dbe_list); |
| 45 | 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) · 81 unmodified lines | ||
| 128 | 126 | |
| 129 | 127 | n->addr = (Elf_Addr *)location; |
| 130 | 128 | n->value = v; |
| 131 | − n->next = mips_hi16_list; | |
| 132 | − mips_hi16_list = n; | |
| 129 | + n->next = me->arch.r_mips_hi16_list; | |
| 130 | + me->arch.r_mips_hi16_list = n; | |
| 133 | 131 | |
| 134 | 132 | return 0; |
| 135 | 133 | } |
| @@ -142,18 +140,28 @@ static int apply_r_mips_hi16_rela(struct module *me, u32 *location, Elf_Addr v) · 6 unmodified lines | ||
| 142 | 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 | 154 | static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) |
| 146 | 155 | { |
| 147 | 156 | unsigned long insnlo = *location; |
| 157 | + struct mips_hi16 *l; | |
| 148 | 158 | Elf_Addr val, vallo; |
| 149 | 159 | |
| 150 | 160 | /* Sign extend the addend we extract from the lo insn. */ |
| 151 | 161 | vallo = ((insnlo & 0xffff) ^ 0x8000) - 0x8000; |
| 152 | 162 | |
| 153 | − if (mips_hi16_list != NULL) { | |
| 154 | − struct mips_hi16 *l; | |
| 155 | − | |
| 156 | − l = mips_hi16_list; | |
| 163 | + if (me->arch.r_mips_hi16_list != NULL) { | |
| 164 | + l = me->arch.r_mips_hi16_list; | |
| 157 | 165 | while (l != NULL) { |
| 158 | 166 | struct mips_hi16 *next; |
| 159 | 167 | unsigned long insn; |
| @@ -188,7 +196,7 @@ static int apply_r_mips_lo16_rel(struct module *me, u32 *location, Elf_Addr v) · 28 unmodified lines | ||
| 188 | 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) · 6 unmodified lines | ||
| 201 | 209 | return 0; |
| 202 | 210 | |
| 203 | 211 | out_danger: |
| 212 | + free_relocation_chain(l); | |
| 213 | + me->arch.r_mips_hi16_list = NULL; | |
| 214 | + | |
| 204 | 215 | pr_err("module %s: dangerous R_MIPS_LO16 REL relocation\n", me->name); |
| 205 | 216 | |
| 206 | 217 | return -ENOEXEC; |
| @@ -273,6 +284,7 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, · 66 unmodified lines | ||
| 273 | 284 | pr_debug("Applying relocate section %u to %u\n", relsec, |
| 274 | 285 | sechdrs[relsec].sh_info); |
| 275 | 286 | |
| 287 | + me->arch.r_mips_hi16_list = NULL; | |
| 276 | 288 | for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rel); i++) { |
| 277 | 289 | /* This is where to make the change */ |
| 278 | 290 | location = (void *)sechdrs[sechdrs[relsec].sh_info].sh_addr |
| @@ -296,6 +308,19 @@ int apply_relocate(Elf_Shdr *sechdrs, const char *strtab, · 17 unmodified lines | ||
| 296 | 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 | 324 | return 0; |
| 300 | 325 | } |
| 301 | 326 | |
| @@ -130,7 +130,7 @@ asmlinkage __cpuinit void start_secondary(void) · 129 unmodified lines | ||
| 130 | 130 | |
| 131 | 131 | cpu_set(cpu, cpu_callin_map); |
| 132 | 132 | |
| 133 | − synchronise_count_slave(); | |
| 133 | + synchronise_count_slave(cpu); | |
| 134 | 134 | |
| 135 | 135 | /* |
| 136 | 136 | * irq will be enabled in ->smp_finish(), enabling it too early |
| @@ -173,7 +173,6 @@ void smp_send_stop(void) · 36 unmodified lines | ||
| 173 | 173 | void __init smp_cpus_done(unsigned int max_cpus) |
| 174 | 174 | { |
| 175 | 175 | mp_ops->cpus_done(); |
| 176 | − synchronise_count_master(); | |
| 177 | 176 | } |
| 178 | 177 | |
| 179 | 178 | /* called from main before smp_init() */ |
| @@ -206,6 +205,7 @@ int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle) · 26 unmodified lines | ||
| 206 | 205 | while (!cpu_isset(cpu, cpu_callin_map)) |
| 207 | 206 | udelay(100); |
| 208 | 207 | |
| 208 | + synchronise_count_master(cpu); | |
| 209 | 209 | return 0; |
| 210 | 210 | } |
| 211 | 211 | |
| @@ -28,12 +28,11 @@ static atomic_t __cpuinitdata count_reference = ATOMIC_INIT(0); · 27 unmodified lines | ||
| 28 | 28 | #define COUNTON 100 |
| 29 | 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 | 33 | int i; |
| 34 | 34 | unsigned long flags; |
| 35 | 35 | unsigned int initcount; |
| 36 | − int nslaves; | |
| 37 | 36 | |
| 38 | 37 | #ifdef CONFIG_MIPS_MT_SMTC |
| 39 | 38 | /* |
| @@ -43,8 +42,7 @@ void __cpuinit synchronise_count_master(void) · 3 unmodified lines | ||
| 43 | 42 | return; |
| 44 | 43 | #endif |
| 45 | 44 | |
| 46 | − printk(KERN_INFO "Synchronize counters across %u CPUs: ", | |
| 47 | − num_online_cpus()); | |
| 45 | + printk(KERN_INFO "Synchronize counters for CPU %u: ", cpu); | |
| 48 | 46 | |
| 49 | 47 | local_irq_save(flags); |
| 50 | 48 | |
| @@ -52,7 +50,7 @@ void __cpuinit synchronise_count_master(void) · 1 unmodified line | ||
| 52 | 50 | * Notify the slaves that it's time to start |
| 53 | 51 | */ |
| 54 | 52 | atomic_set(&count_reference, read_c0_count()); |
| 55 | − atomic_set(&count_start_flag, 1); | |
| 53 | + atomic_set(&count_start_flag, cpu); | |
| 56 | 54 | smp_wmb(); |
| 57 | 55 | |
| 58 | 56 | /* Count will be initialised to current timer for all CPU's */ |
| @@ -69,10 +67,9 @@ void __cpuinit synchronise_count_master(void) · 10 unmodified lines | ||
| 69 | 67 | * two CPUs. |
| 70 | 68 | */ |
| 71 | 69 | |
| 72 | − nslaves = num_online_cpus()-1; | |
| 73 | 70 | for (i = 0; i < NR_LOOPS; i++) { |
| 74 | − /* slaves loop on '!= ncpus' */ | |
| 75 | − while (atomic_read(&count_count_start) != nslaves) | |
| 71 | + /* slaves loop on '!= 2' */ | |
| 72 | + while (atomic_read(&count_count_start) != 1) | |
| 76 | 73 | mb(); |
| 77 | 74 | atomic_set(&count_count_stop, 0); |
| 78 | 75 | smp_wmb(); |
| @@ -89,7 +86,7 @@ void __cpuinit synchronise_count_master(void) · 10 unmodified lines | ||
| 89 | 86 | /* |
| 90 | 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 | 90 | mb(); |
| 94 | 91 | atomic_set(&count_count_start, 0); |
| 95 | 92 | smp_wmb(); |
| @@ -97,6 +94,7 @@ void __cpuinit synchronise_count_master(void) · 1 unmodified line | ||
| 97 | 94 | } |
| 98 | 95 | /* Arrange for an interrupt in a short while */ |
| 99 | 96 | write_c0_compare(read_c0_count() + COUNTON); |
| 97 | + atomic_set(&count_start_flag, 0); | |
| 100 | 98 | |
| 101 | 99 | local_irq_restore(flags); |
| 102 | 100 | |
| @@ -108,11 +106,10 @@ void __cpuinit synchronise_count_master(void) · 5 unmodified lines | ||
| 108 | 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 | 111 | int i; |
| 114 | 112 | unsigned int initcount; |
| 115 | − int ncpus; | |
| 116 | 113 | |
| 117 | 114 | #ifdef CONFIG_MIPS_MT_SMTC |
| 118 | 115 | /* |
| @@ -127,16 +124,15 @@ void __cpuinit synchronise_count_slave(void) · 8 unmodified lines | ||
| 127 | 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 | 128 | mb(); |
| 132 | 129 | |
| 133 | 130 | /* Count will be initialised to next expire for all CPU's */ |
| 134 | 131 | initcount = atomic_read(&count_reference); |
| 135 | 132 | |
| 136 | − ncpus = num_online_cpus(); | |
| 137 | 133 | for (i = 0; i < NR_LOOPS; i++) { |
| 138 | 134 | atomic_inc(&count_count_start); |
| 139 | − while (atomic_read(&count_count_start) != ncpus) | |
| 135 | + while (atomic_read(&count_count_start) != 2) | |
| 140 | 136 | mb(); |
| 141 | 137 | |
| 142 | 138 | /* |
| @@ -146,7 +142,7 @@ void __cpuinit synchronise_count_slave(void) · 3 unmodified lines | ||
| 146 | 142 | write_c0_count(initcount); |
| 147 | 143 | |
| 148 | 144 | atomic_inc(&count_count_stop); |
| 149 | − while (atomic_read(&count_count_stop) != ncpus) | |
| 145 | + while (atomic_read(&count_count_stop) != 2) | |
| 150 | 146 | mb(); |
| 151 | 147 | } |
| 152 | 148 | /* Arrange for an interrupt in a short while */ |
| @@ -252,16 +252,3 @@ void __init mips_pcibios_init(void) · 251 unmodified lines | ||
| 252 | 252 | |
| 253 | 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); | |
| @@ -23,9 +23,12 @@ · 22 unmodified lines | ||
| 23 | 23 | #define AR724X_PCI_MEM_BASE 0x10000000 |
| 24 | 24 | #define AR724X_PCI_MEM_SIZE 0x08000000 |
| 25 | 25 | |
| 26 | +#define AR724X_PCI_REG_RESET 0x18 | |
| 26 | 27 | #define AR724X_PCI_REG_INT_STATUS 0x4c |
| 27 | 28 | #define AR724X_PCI_REG_INT_MASK 0x50 |
| 28 | 29 | |
| 30 | +#define AR724X_PCI_RESET_LINK_UP BIT(0) | |
| 31 | + | |
| 29 | 32 | #define AR724X_PCI_INT_DEV0 BIT(14) |
| 30 | 33 | |
| 31 | 34 | #define AR724X_PCI_IRQ_COUNT 1 |
| @@ -38,6 +41,15 @@ static void __iomem *ar724x_pci_ctrl_base; · 6 unmodified lines | ||
| 38 | 41 | |
| 39 | 42 | static u32 ar724x_pci_bar0_value; |
| 40 | 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 | 54 | static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, |
| 43 | 55 | int size, uint32_t *value) |
| @@ -46,6 +58,9 @@ static int ar724x_pci_read(struct pci_bus *bus, unsigned int devfn, int where, · 2 unmodified lines | ||
| 46 | 58 | void __iomem *base; |
| 47 | 59 | u32 data; |
| 48 | 60 | |
| 61 | + if (!ar724x_pci_link_up) | |
| 62 | + return PCIBIOS_DEVICE_NOT_FOUND; | |
| 63 | + | |
| 49 | 64 | if (devfn) |
| 50 | 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, · 44 unmodified lines | ||
| 96 | 111 | u32 data; |
| 97 | 112 | int s; |
| 98 | 113 | |
| 114 | + if (!ar724x_pci_link_up) | |
| 115 | + return PCIBIOS_DEVICE_NOT_FOUND; | |
| 116 | + | |
| 99 | 117 | if (devfn) |
| 100 | 118 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 101 | 119 | |
| @@ -280,6 +298,10 @@ int __init ar724x_pcibios_init(int irq) · 178 unmodified lines | ||
| 280 | 298 | if (ar724x_pci_ctrl_base == NULL) |
| 281 | 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 | 305 | ar724x_pci_irq_init(irq); |
| 284 | 306 | register_pci_controller(&ar724x_pci_controller); |
| 285 | 307 | |
| @@ -141,7 +141,7 @@ static __inline__ int __atomic_add_unless(atomic_t *v, int a, int u) · 140 unmodified lines | ||
| 141 | 141 | |
| 142 | 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 | 146 | #define smp_mb__before_atomic_dec() smp_mb() |
| 147 | 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) · 2 unmodified lines | ||
| 150 | 150 | |
| 151 | 151 | #ifdef CONFIG_64BIT |
| 152 | 152 | |
| 153 | −#define ATOMIC64_INIT(i) ((atomic64_t) { (i) }) | |
| 153 | +#define ATOMIC64_INIT(i) { (i) } | |
| 154 | 154 | |
| 155 | 155 | static __inline__ s64 |
| 156 | 156 | __atomic64_add_return(s64 i, atomic64_t *v) |
| @@ -309,7 +309,7 @@ copy_thread(unsigned long clone_flags, unsigned long usp, · 308 unmodified lines | ||
| 309 | 309 | cregs->ksp = (unsigned long)stack |
| 310 | 310 | + (pregs->gr[21] & (THREAD_SIZE - 1)); |
| 311 | 311 | cregs->gr[30] = usp; |
| 312 | − if (p->personality == PER_HPUX) { | |
| 312 | + if (personality(p->personality) == PER_HPUX) { | |
| 313 | 313 | #ifdef CONFIG_HPUX |
| 314 | 314 | cregs->kpc = (unsigned long) &hpux_child_return; |
| 315 | 315 | #else |
| @@ -225,12 +225,12 @@ long parisc_personality(unsigned long personality) · 224 unmodified lines | ||
| 225 | 225 | long err; |
| 226 | 226 | |
| 227 | 227 | if (personality(current->personality) == PER_LINUX32 |
| 228 | − && personality == PER_LINUX) | |
| 229 | − personality = PER_LINUX32; | |
| 228 | + && personality(personality) == PER_LINUX) | |
| 229 | + personality = (personality & ~PER_MASK) | PER_LINUX32; | |
| 230 | 230 | |
| 231 | 231 | err = sys_personality(personality); |
| 232 | − if (err == PER_LINUX32) | |
| 233 | − err = PER_LINUX; | |
| 232 | + if (personality(err) == PER_LINUX32) | |
| 233 | + err = (err & ~PER_MASK) | PER_LINUX; | |
| 234 | 234 | |
| 235 | 235 | return err; |
| 236 | 236 | } |
| @@ -345,6 +345,13 @@ · 344 unmodified lines | ||
| 345 | 345 | /include/ "qoriq-duart-1.dtsi" |
| 346 | 346 | /include/ "qoriq-gpio-0.dtsi" |
| 347 | 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 | 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 | 356 | /include/ "qoriq-sec4.0-0.dtsi" |
| 350 | 357 | }; |
| @@ -6,28 +6,27 @@ CONFIG_SYSVIPC=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_POSIX_MQUEUE=y |
| 7 | 7 | CONFIG_BSD_PROCESS_ACCT=y |
| 8 | 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 | 12 | CONFIG_IKCONFIG=y |
| 11 | 13 | CONFIG_IKCONFIG_PROC=y |
| 12 | 14 | CONFIG_LOG_BUF_SHIFT=14 |
| 13 | 15 | CONFIG_BLK_DEV_INITRD=y |
| 14 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 15 | 16 | CONFIG_KALLSYMS_ALL=y |
| 16 | −CONFIG_KALLSYMS_EXTRA_PASS=y | |
| 17 | 17 | CONFIG_EMBEDDED=y |
| 18 | 18 | CONFIG_MODULES=y |
| 19 | 19 | CONFIG_MODULE_UNLOAD=y |
| 20 | 20 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 21 | 21 | CONFIG_MODVERSIONS=y |
| 22 | 22 | # CONFIG_BLK_DEV_BSG is not set |
| 23 | +CONFIG_PARTITION_ADVANCED=y | |
| 24 | +CONFIG_MAC_PARTITION=y | |
| 23 | 25 | CONFIG_P1023_RDS=y |
| 24 | 26 | CONFIG_QUICC_ENGINE=y |
| 25 | 27 | CONFIG_QE_GPIO=y |
| 26 | 28 | CONFIG_CPM2=y |
| 27 | −CONFIG_GPIO_MPC8XXX=y | |
| 28 | 29 | CONFIG_HIGHMEM=y |
| 29 | −CONFIG_NO_HZ=y | |
| 30 | −CONFIG_HIGH_RES_TIMERS=y | |
| 31 | 30 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
| 32 | 31 | CONFIG_BINFMT_MISC=m |
| 33 | 32 | CONFIG_MATH_EMULATION=y |
| @@ -63,11 +62,11 @@ CONFIG_INET_ESP=y · 29 unmodified lines | ||
| 63 | 62 | CONFIG_IPV6=y |
| 64 | 63 | CONFIG_IP_SCTP=m |
| 65 | 64 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 65 | +CONFIG_DEVTMPFS=y | |
| 66 | 66 | CONFIG_PROC_DEVICETREE=y |
| 67 | 67 | CONFIG_BLK_DEV_LOOP=y |
| 68 | 68 | CONFIG_BLK_DEV_RAM=y |
| 69 | 69 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 70 | −CONFIG_MISC_DEVICES=y | |
| 71 | 70 | CONFIG_EEPROM_LEGACY=y |
| 72 | 71 | CONFIG_BLK_DEV_SD=y |
| 73 | 72 | CONFIG_CHR_DEV_ST=y |
| @@ -80,15 +79,14 @@ CONFIG_SATA_FSL=y · 6 unmodified lines | ||
| 80 | 79 | CONFIG_SATA_SIL24=y |
| 81 | 80 | CONFIG_NETDEVICES=y |
| 82 | 81 | CONFIG_DUMMY=y |
| 82 | +CONFIG_FS_ENET=y | |
| 83 | +CONFIG_FSL_PQ_MDIO=y | |
| 84 | +CONFIG_E1000E=y | |
| 83 | 85 | CONFIG_MARVELL_PHY=y |
| 84 | 86 | CONFIG_DAVICOM_PHY=y |
| 85 | 87 | CONFIG_CICADA_PHY=y |
| 86 | 88 | CONFIG_VITESSE_PHY=y |
| 87 | 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 | 90 | CONFIG_INPUT_FF_MEMLESS=m |
| 93 | 91 | # CONFIG_INPUT_MOUSEDEV is not set |
| 94 | 92 | # CONFIG_INPUT_KEYBOARD is not set |
| @@ -98,16 +96,15 @@ CONFIG_SERIAL_8250=y · 3 unmodified lines | ||
| 98 | 96 | CONFIG_SERIAL_8250_CONSOLE=y |
| 99 | 97 | CONFIG_SERIAL_8250_NR_UARTS=2 |
| 100 | 98 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
| 101 | −CONFIG_SERIAL_8250_EXTENDED=y | |
| 102 | 99 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 103 | 100 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 104 | 101 | CONFIG_SERIAL_8250_RSA=y |
| 105 | 102 | CONFIG_SERIAL_QE=m |
| 106 | −CONFIG_HW_RANDOM=y | |
| 107 | 103 | CONFIG_NVRAM=y |
| 108 | 104 | CONFIG_I2C=y |
| 109 | 105 | CONFIG_I2C_CPM=m |
| 110 | 106 | CONFIG_I2C_MPC=y |
| 107 | +CONFIG_GPIO_MPC8XXX=y | |
| 111 | 108 | # CONFIG_HWMON is not set |
| 112 | 109 | CONFIG_VIDEO_OUTPUT_CONTROL=y |
| 113 | 110 | CONFIG_SOUND=y |
| @@ -123,7 +120,6 @@ CONFIG_DMADEVICES=y · 9 unmodified lines | ||
| 123 | 120 | CONFIG_FSL_DMA=y |
| 124 | 121 | # CONFIG_NET_DMA is not set |
| 125 | 122 | CONFIG_STAGING=y |
| 126 | −# CONFIG_STAGING_EXCLUDE_BUILD is not set | |
| 127 | 123 | CONFIG_EXT2_FS=y |
| 128 | 124 | CONFIG_EXT3_FS=y |
| 129 | 125 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
| @@ -150,22 +146,15 @@ CONFIG_QNX4FS_FS=m · 20 unmodified lines | ||
| 150 | 146 | CONFIG_SYSV_FS=m |
| 151 | 147 | CONFIG_UFS_FS=m |
| 152 | 148 | CONFIG_NFS_FS=y |
| 153 | −CONFIG_NFS_V3=y | |
| 154 | 149 | CONFIG_NFS_V4=y |
| 155 | 150 | CONFIG_ROOT_NFS=y |
| 156 | 151 | CONFIG_NFSD=y |
| 157 | −CONFIG_PARTITION_ADVANCED=y | |
| 158 | −CONFIG_MAC_PARTITION=y | |
| 159 | 152 | CONFIG_CRC_T10DIF=y |
| 160 | 153 | CONFIG_FRAME_WARN=8092 |
| 161 | 154 | CONFIG_DEBUG_FS=y |
| 162 | −CONFIG_DEBUG_KERNEL=y | |
| 163 | 155 | CONFIG_DETECT_HUNG_TASK=y |
| 164 | 156 | # CONFIG_DEBUG_BUGVERBOSE is not set |
| 165 | 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 | 158 | CONFIG_CRYPTO_PCBC=m |
| 170 | 159 | CONFIG_CRYPTO_SHA256=y |
| 171 | 160 | CONFIG_CRYPTO_SHA512=y |
| @@ -6,8 +6,8 @@ CONFIG_SYSVIPC=y · 5 unmodified lines | ||
| 6 | 6 | CONFIG_POSIX_MQUEUE=y |
| 7 | 7 | CONFIG_BSD_PROCESS_ACCT=y |
| 8 | 8 | CONFIG_AUDIT=y |
| 9 | −CONFIG_SPARSE_IRQ=y | |
| 10 | −CONFIG_RCU_TRACE=y | |
| 9 | +CONFIG_NO_HZ=y | |
| 10 | +CONFIG_HIGH_RES_TIMERS=y | |
| 11 | 11 | CONFIG_IKCONFIG=y |
| 12 | 12 | CONFIG_IKCONFIG_PROC=y |
| 13 | 13 | CONFIG_LOG_BUF_SHIFT=14 |
| @@ -21,23 +21,22 @@ CONFIG_MODULE_UNLOAD=y · 7 unmodified lines | ||
| 21 | 21 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 22 | 22 | CONFIG_MODVERSIONS=y |
| 23 | 23 | # CONFIG_BLK_DEV_BSG is not set |
| 24 | +CONFIG_PARTITION_ADVANCED=y | |
| 25 | +CONFIG_MAC_PARTITION=y | |
| 24 | 26 | CONFIG_P2041_RDB=y |
| 25 | 27 | CONFIG_P3041_DS=y |
| 26 | 28 | CONFIG_P4080_DS=y |
| 27 | 29 | CONFIG_P5020_DS=y |
| 28 | 30 | CONFIG_HIGHMEM=y |
| 29 | −CONFIG_NO_HZ=y | |
| 30 | −CONFIG_HIGH_RES_TIMERS=y | |
| 31 | 31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set |
| 32 | 32 | CONFIG_BINFMT_MISC=m |
| 33 | 33 | CONFIG_KEXEC=y |
| 34 | 34 | CONFIG_IRQ_ALL_CPUS=y |
| 35 | 35 | CONFIG_FORCE_MAX_ZONEORDER=13 |
| 36 | −CONFIG_FSL_LBC=y | |
| 37 | 36 | CONFIG_PCI=y |
| 38 | 37 | CONFIG_PCIEPORTBUS=y |
| 39 | −CONFIG_PCI_MSI=y | |
| 40 | 38 | # CONFIG_PCIEASPM is not set |
| 39 | +CONFIG_PCI_MSI=y | |
| 41 | 40 | CONFIG_RAPIDIO=y |
| 42 | 41 | CONFIG_FSL_RIO=y |
| 43 | 42 | CONFIG_NET=y |
| @@ -70,6 +69,7 @@ CONFIG_INET_IPCOMP=y · 26 unmodified lines | ||
| 70 | 69 | CONFIG_IPV6=y |
| 71 | 70 | CONFIG_IP_SCTP=m |
| 72 | 71 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 72 | +CONFIG_DEVTMPFS=y | |
| 73 | 73 | CONFIG_MTD=y |
| 74 | 74 | CONFIG_MTD_CMDLINE_PARTS=y |
| 75 | 75 | CONFIG_MTD_CHAR=y |
| @@ -77,17 +77,14 @@ CONFIG_MTD_BLOCK=y · 1 unmodified line | ||
| 77 | 77 | CONFIG_MTD_CFI=y |
| 78 | 78 | CONFIG_MTD_CFI_AMDSTD=y |
| 79 | 79 | CONFIG_MTD_PHYSMAP_OF=y |
| 80 | +CONFIG_MTD_M25P80=y | |
| 80 | 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 | 82 | CONFIG_MTD_NAND_FSL_ELBC=y |
| 85 | −CONFIG_MTD_M25P80=y | |
| 83 | +CONFIG_MTD_NAND_FSL_IFC=y | |
| 86 | 84 | CONFIG_PROC_DEVICETREE=y |
| 87 | 85 | CONFIG_BLK_DEV_LOOP=y |
| 88 | 86 | CONFIG_BLK_DEV_RAM=y |
| 89 | 87 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 90 | −CONFIG_MISC_DEVICES=y | |
| 91 | 88 | CONFIG_BLK_DEV_SD=y |
| 92 | 89 | CONFIG_CHR_DEV_ST=y |
| 93 | 90 | CONFIG_BLK_DEV_SR=y |
| @@ -115,11 +112,9 @@ CONFIG_SERIO_LIBPS2=y · 21 unmodified lines | ||
| 115 | 112 | CONFIG_PPC_EPAPR_HV_BYTECHAN=y |
| 116 | 113 | CONFIG_SERIAL_8250=y |
| 117 | 114 | CONFIG_SERIAL_8250_CONSOLE=y |
| 118 | −CONFIG_SERIAL_8250_EXTENDED=y | |
| 119 | 115 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 120 | 116 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 121 | 117 | CONFIG_SERIAL_8250_RSA=y |
| 122 | −CONFIG_HW_RANDOM=y | |
| 123 | 118 | CONFIG_NVRAM=y |
| 124 | 119 | CONFIG_I2C=y |
| 125 | 120 | CONFIG_I2C_CHARDEV=y |
| @@ -132,7 +127,6 @@ CONFIG_SPI_FSL_ESPI=y · 6 unmodified lines | ||
| 132 | 127 | CONFIG_VIDEO_OUTPUT_CONTROL=y |
| 133 | 128 | CONFIG_USB_HID=m |
| 134 | 129 | CONFIG_USB=y |
| 135 | −CONFIG_USB_DEVICEFS=y | |
| 136 | 130 | CONFIG_USB_MON=y |
| 137 | 131 | CONFIG_USB_EHCI_HCD=y |
| 138 | 132 | CONFIG_USB_EHCI_FSL=y |
| @@ -142,8 +136,6 @@ CONFIG_USB_OHCI_HCD_PPC_OF_LE=y · 3 unmodified lines | ||
| 142 | 136 | CONFIG_USB_STORAGE=y |
| 143 | 137 | CONFIG_MMC=y |
| 144 | 138 | CONFIG_MMC_SDHCI=y |
| 145 | −CONFIG_MMC_SDHCI_OF=y | |
| 146 | −CONFIG_MMC_SDHCI_OF_ESDHC=y | |
| 147 | 139 | CONFIG_EDAC=y |
| 148 | 140 | CONFIG_EDAC_MM_EDAC=y |
| 149 | 141 | CONFIG_EDAC_MPC85XX=y |
| @@ -170,19 +162,16 @@ CONFIG_HUGETLBFS=y · 20 unmodified lines | ||
| 170 | 162 | CONFIG_JFFS2_FS=y |
| 171 | 163 | CONFIG_CRAMFS=y |
| 172 | 164 | CONFIG_NFS_FS=y |
| 173 | −CONFIG_NFS_V3=y | |
| 174 | 165 | CONFIG_NFS_V4=y |
| 175 | 166 | CONFIG_ROOT_NFS=y |
| 176 | 167 | CONFIG_NFSD=m |
| 177 | −CONFIG_PARTITION_ADVANCED=y | |
| 178 | −CONFIG_MAC_PARTITION=y | |
| 179 | 168 | CONFIG_NLS_ISO8859_1=y |
| 180 | 169 | CONFIG_NLS_UTF8=m |
| 181 | 170 | CONFIG_MAGIC_SYSRQ=y |
| 182 | 171 | CONFIG_DEBUG_SHIRQ=y |
| 183 | 172 | CONFIG_DETECT_HUNG_TASK=y |
| 184 | 173 | CONFIG_DEBUG_INFO=y |
| 185 | −CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 174 | +CONFIG_RCU_TRACE=y | |
| 186 | 175 | CONFIG_CRYPTO_NULL=y |
| 187 | 176 | CONFIG_CRYPTO_PCBC=m |
| 188 | 177 | CONFIG_CRYPTO_MD4=y |
| @@ -56,6 +56,7 @@ CONFIG_INET_ESP=y · 55 unmodified lines | ||
| 56 | 56 | CONFIG_IPV6=y |
| 57 | 57 | CONFIG_IP_SCTP=m |
| 58 | 58 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 59 | +CONFIG_DEVTMPFS=y | |
| 59 | 60 | CONFIG_MTD=y |
| 60 | 61 | CONFIG_MTD_CMDLINE_PARTS=y |
| 61 | 62 | CONFIG_MTD_CHAR=y |
| @@ -1,8 +1,10 @@ | ||
| 1 | +CONFIG_PPC64=y | |
| 2 | +CONFIG_ALTIVEC=y | |
| 3 | +CONFIG_SMP=y | |
| 4 | +CONFIG_NR_CPUS=4 | |
| 1 | 5 | CONFIG_EXPERIMENTAL=y |
| 2 | 6 | CONFIG_SYSVIPC=y |
| 3 | 7 | CONFIG_POSIX_MQUEUE=y |
| 4 | −CONFIG_NO_HZ=y | |
| 5 | −CONFIG_HIGH_RES_TIMERS=y | |
| 6 | 8 | CONFIG_IKCONFIG=y |
| 7 | 9 | CONFIG_IKCONFIG_PROC=y |
| 8 | 10 | CONFIG_BLK_DEV_INITRD=y |
| @@ -13,15 +15,16 @@ CONFIG_MODULES=y · 4 unmodified lines | ||
| 13 | 15 | CONFIG_MODULE_UNLOAD=y |
| 14 | 16 | CONFIG_MODVERSIONS=y |
| 15 | 17 | CONFIG_MODULE_SRCVERSION_ALL=y |
| 16 | −CONFIG_PARTITION_ADVANCED=y | |
| 17 | −CONFIG_MAC_PARTITION=y | |
| 18 | −CONFIG_SMP=y | |
| 19 | −CONFIG_NR_CPUS=4 | |
| 20 | −CONFIG_KEXEC=y | |
| 21 | −# CONFIG_RELOCATABLE is not set | |
| 18 | +# CONFIG_PPC_PSERIES is not set | |
| 22 | 19 | CONFIG_CPU_FREQ=y |
| 23 | 20 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
| 24 | 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 | 28 | CONFIG_PCI_MSI=y |
| 26 | 29 | CONFIG_NET=y |
| 27 | 30 | CONFIG_PACKET=y |
| @@ -49,6 +52,7 @@ CONFIG_NF_CT_NETLINK=m · 21 unmodified lines | ||
| 49 | 52 | CONFIG_NF_CONNTRACK_IPV4=m |
| 50 | 53 | CONFIG_IP_NF_QUEUE=m |
| 51 | 54 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 55 | +CONFIG_PROC_DEVICETREE=y | |
| 52 | 56 | CONFIG_BLK_DEV_LOOP=y |
| 53 | 57 | CONFIG_BLK_DEV_NBD=m |
| 54 | 58 | CONFIG_BLK_DEV_RAM=y |
| @@ -56,6 +60,8 @@ CONFIG_BLK_DEV_RAM_SIZE=65536 · 1 unmodified line | ||
| 56 | 60 | CONFIG_CDROM_PKTCDVD=m |
| 57 | 61 | CONFIG_IDE=y |
| 58 | 62 | CONFIG_BLK_DEV_IDECD=y |
| 63 | +CONFIG_BLK_DEV_IDE_PMAC=y | |
| 64 | +CONFIG_BLK_DEV_IDE_PMAC_ATA100FIRST=y | |
| 59 | 65 | CONFIG_BLK_DEV_SD=y |
| 60 | 66 | CONFIG_CHR_DEV_ST=y |
| 61 | 67 | CONFIG_BLK_DEV_SR=y |
| @@ -79,24 +85,33 @@ CONFIG_DM_CRYPT=m · 17 unmodified lines | ||
| 79 | 85 | CONFIG_DM_SNAPSHOT=m |
| 80 | 86 | CONFIG_DM_MIRROR=m |
| 81 | 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 | 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 | 104 | CONFIG_NETDEVICES=y |
| 85 | −CONFIG_BONDING=m | |
| 86 | 105 | CONFIG_DUMMY=m |
| 87 | −CONFIG_MII=y | |
| 106 | +CONFIG_BONDING=m | |
| 88 | 107 | CONFIG_TUN=m |
| 108 | +CONFIG_NET_ETHERNET=y | |
| 109 | +CONFIG_MII=y | |
| 110 | +CONFIG_SUNGEM=y | |
| 89 | 111 | CONFIG_ACENIC=m |
| 90 | 112 | CONFIG_ACENIC_OMIT_TIGON_I=y |
| 91 | −CONFIG_TIGON3=y | |
| 92 | 113 | CONFIG_E1000=y |
| 93 | −CONFIG_SUNGEM=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 | |
| 114 | +CONFIG_TIGON3=y | |
| 100 | 115 | CONFIG_USB_CATC=m |
| 101 | 116 | CONFIG_USB_KAWETH=m |
| 102 | 117 | CONFIG_USB_PEGASUS=m |
| @@ -106,24 +121,36 @@ CONFIG_USB_USBNET=m · 3 unmodified lines | ||
| 106 | 121 | # CONFIG_USB_NET_NET1080 is not set |
| 107 | 122 | # CONFIG_USB_NET_CDC_SUBSET is not set |
| 108 | 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 | 130 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set |
| 110 | 131 | CONFIG_INPUT_JOYDEV=m |
| 111 | 132 | CONFIG_INPUT_EVDEV=y |
| 133 | +# CONFIG_KEYBOARD_ATKBD is not set | |
| 112 | 134 | # CONFIG_MOUSE_PS2 is not set |
| 135 | +# CONFIG_SERIO_I8042 is not set | |
| 113 | 136 | # CONFIG_SERIO_SERPORT is not set |
| 114 | −CONFIG_VT_HW_CONSOLE_BINDING=y | |
| 115 | 137 | # CONFIG_HW_RANDOM is not set |
| 116 | 138 | CONFIG_GEN_RTC=y |
| 117 | 139 | CONFIG_RAW_DRIVER=y |
| 118 | 140 | CONFIG_I2C_CHARDEV=y |
| 119 | 141 | # CONFIG_HWMON is not set |
| 120 | −CONFIG_AGP=y | |
| 121 | −CONFIG_DRM=y | |
| 122 | −CONFIG_DRM_NOUVEAU=y | |
| 142 | +CONFIG_AGP=m | |
| 143 | +CONFIG_AGP_UNINORTH=m | |
| 123 | 144 | CONFIG_VIDEO_OUTPUT_CONTROL=m |
| 145 | +CONFIG_FB=y | |
| 124 | 146 | CONFIG_FIRMWARE_EDID=y |
| 125 | 147 | CONFIG_FB_TILEBLITTING=y |
| 148 | +CONFIG_FB_OF=y | |
| 149 | +CONFIG_FB_NVIDIA=y | |
| 150 | +CONFIG_FB_NVIDIA_I2C=y | |
| 126 | 151 | CONFIG_FB_RADEON=y |
| 152 | +# CONFIG_VGA_CONSOLE is not set | |
| 153 | +CONFIG_FRAMEBUFFER_CONSOLE=y | |
| 127 | 154 | CONFIG_LOGO=y |
| 128 | 155 | CONFIG_SOUND=m |
| 129 | 156 | CONFIG_SND=m |
| @@ -131,7 +158,15 @@ CONFIG_SND_SEQUENCER=m · 1 unmodified line | ||
| 131 | 158 | CONFIG_SND_MIXER_OSS=m |
| 132 | 159 | CONFIG_SND_PCM_OSS=m |
| 133 | 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 | 167 | CONFIG_SND_USB_AUDIO=m |
| 168 | +CONFIG_HID_PID=y | |
| 169 | +CONFIG_USB_HIDDEV=y | |
| 135 | 170 | CONFIG_HID_GYRATION=y |
| 136 | 171 | CONFIG_LOGITECH_FF=y |
| 137 | 172 | CONFIG_HID_PANTHERLORD=y |
| @@ -139,12 +174,13 @@ CONFIG_HID_PETALYNX=y · 1 unmodified line | ||
| 139 | 174 | CONFIG_HID_SAMSUNG=y |
| 140 | 175 | CONFIG_HID_SONY=y |
| 141 | 176 | CONFIG_HID_SUNPLUS=y |
| 142 | −CONFIG_HID_PID=y | |
| 143 | −CONFIG_USB_HIDDEV=y | |
| 144 | 177 | CONFIG_USB=y |
| 178 | +CONFIG_USB_DEVICEFS=y | |
| 145 | 179 | CONFIG_USB_MON=y |
| 146 | 180 | CONFIG_USB_EHCI_HCD=y |
| 181 | +# CONFIG_USB_EHCI_HCD_PPC_OF is not set | |
| 147 | 182 | CONFIG_USB_OHCI_HCD=y |
| 183 | +CONFIG_USB_OHCI_HCD_PPC_OF_BE=y | |
| 148 | 184 | CONFIG_USB_ACM=m |
| 149 | 185 | CONFIG_USB_PRINTER=y |
| 150 | 186 | CONFIG_USB_STORAGE=y |
| @@ -208,6 +244,8 @@ CONFIG_REISERFS_FS_POSIX_ACL=y · 57 unmodified lines | ||
| 208 | 244 | CONFIG_REISERFS_FS_SECURITY=y |
| 209 | 245 | CONFIG_XFS_FS=m |
| 210 | 246 | CONFIG_XFS_POSIX_ACL=y |
| 247 | +CONFIG_INOTIFY=y | |
| 248 | +CONFIG_AUTOFS_FS=m | |
| 211 | 249 | CONFIG_ISO9660_FS=y |
| 212 | 250 | CONFIG_JOLIET=y |
| 213 | 251 | CONFIG_ZISOFS=y |
| @@ -221,12 +259,14 @@ CONFIG_HFS_FS=m · 7 unmodified lines | ||
| 221 | 259 | CONFIG_HFSPLUS_FS=m |
| 222 | 260 | CONFIG_CRAMFS=y |
| 223 | 261 | CONFIG_NFS_FS=y |
| 262 | +CONFIG_NFS_V3=y | |
| 224 | 263 | CONFIG_NFS_V3_ACL=y |
| 225 | 264 | CONFIG_NFS_V4=y |
| 226 | 265 | CONFIG_NFSD=y |
| 227 | 266 | CONFIG_NFSD_V3_ACL=y |
| 228 | 267 | CONFIG_NFSD_V4=y |
| 229 | 268 | CONFIG_CIFS=m |
| 269 | +CONFIG_PARTITION_ADVANCED=y | |
| 230 | 270 | CONFIG_NLS_CODEPAGE_437=y |
| 231 | 271 | CONFIG_NLS_CODEPAGE_1250=y |
| 232 | 272 | CONFIG_NLS_CODEPAGE_1251=y |
| @@ -234,23 +274,29 @@ CONFIG_NLS_ASCII=y · 1 unmodified line | ||
| 234 | 274 | CONFIG_NLS_ISO8859_1=y |
| 235 | 275 | CONFIG_NLS_ISO8859_15=y |
| 236 | 276 | CONFIG_NLS_UTF8=y |
| 277 | +CONFIG_CRC_T10DIF=y | |
| 278 | +CONFIG_LIBCRC32C=m | |
| 237 | 279 | CONFIG_MAGIC_SYSRQ=y |
| 238 | −# CONFIG_UNUSED_SYMBOLS is not set | |
| 239 | 280 | CONFIG_DEBUG_FS=y |
| 240 | 281 | CONFIG_DEBUG_KERNEL=y |
| 241 | 282 | CONFIG_DEBUG_MUTEXES=y |
| 283 | +# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 242 | 284 | CONFIG_LATENCYTOP=y |
| 243 | −CONFIG_STRICT_DEVMEM=y | |
| 285 | +CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 286 | +CONFIG_BOOTX_TEXT=y | |
| 244 | 287 | CONFIG_CRYPTO_NULL=m |
| 245 | 288 | CONFIG_CRYPTO_TEST=m |
| 289 | +CONFIG_CRYPTO_ECB=m | |
| 246 | 290 | CONFIG_CRYPTO_PCBC=m |
| 247 | 291 | CONFIG_CRYPTO_HMAC=y |
| 292 | +CONFIG_CRYPTO_MD4=m | |
| 248 | 293 | CONFIG_CRYPTO_MICHAEL_MIC=m |
| 249 | 294 | CONFIG_CRYPTO_SHA256=m |
| 250 | 295 | CONFIG_CRYPTO_SHA512=m |
| 251 | 296 | CONFIG_CRYPTO_WP512=m |
| 252 | 297 | CONFIG_CRYPTO_AES=m |
| 253 | 298 | CONFIG_CRYPTO_ANUBIS=m |
| 299 | +CONFIG_CRYPTO_ARC4=m | |
| 254 | 300 | CONFIG_CRYPTO_BLOWFISH=m |
| 255 | 301 | CONFIG_CRYPTO_CAST5=m |
| 256 | 302 | CONFIG_CRYPTO_CAST6=m |
| @@ -260,6 +306,3 @@ CONFIG_CRYPTO_TEA=m · 3 unmodified lines | ||
| 260 | 306 | CONFIG_CRYPTO_TWOFISH=m |
| 261 | 307 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
| 262 | 308 | # CONFIG_CRYPTO_HW is not set |
| 263 | −# CONFIG_VIRTUALIZATION is not set | |
| 264 | −CONFIG_CRC_T10DIF=y | |
| 265 | −CONFIG_LIBCRC32C=m | |
| @@ -2,12 +2,12 @@ CONFIG_EXPERIMENTAL=y · 1 unmodified line | ||
| 2 | 2 | CONFIG_SYSVIPC=y |
| 3 | 3 | CONFIG_LOG_BUF_SHIFT=14 |
| 4 | 4 | CONFIG_BLK_DEV_INITRD=y |
| 5 | −# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set | |
| 6 | 5 | CONFIG_EXPERT=y |
| 7 | 6 | CONFIG_SLAB=y |
| 8 | 7 | CONFIG_MODULES=y |
| 9 | 8 | CONFIG_MODULE_UNLOAD=y |
| 10 | 9 | # CONFIG_BLK_DEV_BSG is not set |
| 10 | +CONFIG_PARTITION_ADVANCED=y | |
| 11 | 11 | # CONFIG_PPC_CHRP is not set |
| 12 | 12 | # CONFIG_PPC_PMAC is not set |
| 13 | 13 | CONFIG_PPC_83xx=y |
| @@ -25,7 +25,6 @@ CONFIG_ASP834x=y · 11 unmodified lines | ||
| 25 | 25 | CONFIG_QUICC_ENGINE=y |
| 26 | 26 | CONFIG_QE_GPIO=y |
| 27 | 27 | CONFIG_MATH_EMULATION=y |
| 28 | −CONFIG_SPARSE_IRQ=y | |
| 29 | 28 | CONFIG_PCI=y |
| 30 | 29 | CONFIG_NET=y |
| 31 | 30 | CONFIG_PACKET=y |
| @@ -42,10 +41,9 @@ CONFIG_INET_ESP=y · 10 unmodified lines | ||
| 42 | 41 | # CONFIG_INET_LRO is not set |
| 43 | 42 | # CONFIG_IPV6 is not set |
| 44 | 43 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 44 | +CONFIG_DEVTMPFS=y | |
| 45 | 45 | # CONFIG_FW_LOADER is not set |
| 46 | 46 | CONFIG_MTD=y |
| 47 | −CONFIG_MTD_PARTITIONS=y | |
| 48 | −CONFIG_MTD_OF_PARTS=y | |
| 49 | 47 | CONFIG_MTD_CHAR=y |
| 50 | 48 | CONFIG_MTD_BLOCK=y |
| 51 | 49 | CONFIG_MTD_CFI=y |
| @@ -64,15 +62,14 @@ CONFIG_ATA=y · 12 unmodified lines | ||
| 64 | 62 | CONFIG_SATA_FSL=y |
| 65 | 63 | CONFIG_SATA_SIL=y |
| 66 | 64 | CONFIG_NETDEVICES=y |
| 65 | +CONFIG_MII=y | |
| 66 | +CONFIG_UCC_GETH=y | |
| 67 | +CONFIG_GIANFAR=y | |
| 67 | 68 | CONFIG_MARVELL_PHY=y |
| 68 | 69 | CONFIG_DAVICOM_PHY=y |
| 69 | 70 | CONFIG_VITESSE_PHY=y |
| 70 | 71 | CONFIG_ICPLUS_PHY=y |
| 71 | 72 | CONFIG_FIXED_PHY=y |
| 72 | −CONFIG_NET_ETHERNET=y | |
| 73 | −CONFIG_MII=y | |
| 74 | −CONFIG_GIANFAR=y | |
| 75 | −CONFIG_UCC_GETH=y | |
| 76 | 73 | CONFIG_INPUT_FF_MEMLESS=m |
| 77 | 74 | # CONFIG_INPUT_MOUSEDEV is not set |
| 78 | 75 | # CONFIG_INPUT_KEYBOARD is not set |
| @@ -112,17 +109,12 @@ CONFIG_RTC_DRV_DS1374=y · 33 unmodified lines | ||
| 112 | 109 | CONFIG_EXT2_FS=y |
| 113 | 110 | CONFIG_EXT3_FS=y |
| 114 | 111 | # CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set |
| 115 | −CONFIG_INOTIFY=y | |
| 116 | 112 | CONFIG_PROC_KCORE=y |
| 117 | 113 | CONFIG_TMPFS=y |
| 118 | 114 | CONFIG_NFS_FS=y |
| 119 | −CONFIG_NFS_V3=y | |
| 120 | 115 | CONFIG_NFS_V4=y |
| 121 | 116 | CONFIG_ROOT_NFS=y |
| 122 | −CONFIG_PARTITION_ADVANCED=y | |
| 123 | 117 | CONFIG_CRC_T10DIF=y |
| 124 | −# CONFIG_RCU_CPU_STALL_DETECTOR is not set | |
| 125 | −CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 126 | 118 | CONFIG_CRYPTO_ECB=m |
| 127 | 119 | CONFIG_CRYPTO_PCBC=m |
| 128 | 120 | CONFIG_CRYPTO_SHA256=y |
| @@ -5,7 +5,9 @@ CONFIG_SYSVIPC=y · 4 unmodified lines | ||
| 5 | 5 | CONFIG_POSIX_MQUEUE=y |
| 6 | 6 | CONFIG_BSD_PROCESS_ACCT=y |
| 7 | 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 | 11 | CONFIG_IKCONFIG=y |
| 10 | 12 | CONFIG_IKCONFIG_PROC=y |
| 11 | 13 | CONFIG_LOG_BUF_SHIFT=14 |
| @@ -17,6 +19,8 @@ CONFIG_MODULE_UNLOAD=y · 5 unmodified lines | ||
| 17 | 19 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 18 | 20 | CONFIG_MODVERSIONS=y |
| 19 | 21 | # CONFIG_BLK_DEV_BSG is not set |
| 22 | +CONFIG_PARTITION_ADVANCED=y | |
| 23 | +CONFIG_MAC_PARTITION=y | |
| 20 | 24 | CONFIG_MPC8540_ADS=y |
| 21 | 25 | CONFIG_MPC8560_ADS=y |
| 22 | 26 | CONFIG_MPC85xx_CDS=y |
| @@ -40,8 +44,6 @@ CONFIG_SBC8548=y · 17 unmodified lines | ||
| 40 | 44 | CONFIG_QUICC_ENGINE=y |
| 41 | 45 | CONFIG_QE_GPIO=y |
| 42 | 46 | CONFIG_HIGHMEM=y |
| 43 | −CONFIG_NO_HZ=y | |
| 44 | −CONFIG_HIGH_RES_TIMERS=y | |
| 45 | 47 | CONFIG_BINFMT_MISC=m |
| 46 | 48 | CONFIG_MATH_EMULATION=y |
| 47 | 49 | CONFIG_FORCE_MAX_ZONEORDER=12 |
| @@ -74,36 +76,25 @@ CONFIG_INET_ESP=y · 26 unmodified lines | ||
| 74 | 76 | CONFIG_IPV6=y |
| 75 | 77 | CONFIG_IP_SCTP=m |
| 76 | 78 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 79 | +CONFIG_DEVTMPFS=y | |
| 77 | 80 | CONFIG_MTD=y |
| 78 | 81 | CONFIG_MTD_CMDLINE_PARTS=y |
| 79 | 82 | CONFIG_MTD_CHAR=y |
| 80 | 83 | CONFIG_MTD_BLOCK=y |
| 81 | −CONFIG_MTD_CFI=y | |
| 82 | 84 | CONFIG_FTL=y |
| 83 | −CONFIG_MTD_GEN_PROBE=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 | |
| 85 | +CONFIG_MTD_CFI=y | |
| 89 | 86 | CONFIG_MTD_CFI_INTELEXT=y |
| 90 | 87 | CONFIG_MTD_CFI_AMDSTD=y |
| 91 | −CONFIG_MTD_CFI_UTIL=y | |
| 92 | 88 | CONFIG_MTD_PHYSMAP_OF=y |
| 93 | −CONFIG_MTD_PARTITIONS=y | |
| 94 | −CONFIG_MTD_OF_PARTS=y | |
| 89 | +CONFIG_MTD_M25P80=y | |
| 95 | 90 | CONFIG_MTD_NAND=y |
| 96 | 91 | CONFIG_MTD_NAND_FSL_ELBC=y |
| 97 | 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 | 93 | CONFIG_PROC_DEVICETREE=y |
| 102 | 94 | CONFIG_BLK_DEV_LOOP=y |
| 103 | 95 | CONFIG_BLK_DEV_NBD=y |
| 104 | 96 | CONFIG_BLK_DEV_RAM=y |
| 105 | 97 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 106 | −CONFIG_MISC_DEVICES=y | |
| 107 | 98 | CONFIG_EEPROM_LEGACY=y |
| 108 | 99 | CONFIG_BLK_DEV_SD=y |
| 109 | 100 | CONFIG_CHR_DEV_ST=y |
| @@ -115,6 +106,7 @@ CONFIG_ATA=y · 5 unmodified lines | ||
| 115 | 106 | CONFIG_SATA_AHCI=y |
| 116 | 107 | CONFIG_SATA_FSL=y |
| 117 | 108 | CONFIG_PATA_ALI=y |
| 109 | +CONFIG_PATA_VIA=y | |
| 118 | 110 | CONFIG_NETDEVICES=y |
| 119 | 111 | CONFIG_DUMMY=y |
| 120 | 112 | CONFIG_FS_ENET=y |
| @@ -134,7 +126,6 @@ CONFIG_SERIAL_8250=y · 13 unmodified lines | ||
| 134 | 126 | CONFIG_SERIAL_8250_CONSOLE=y |
| 135 | 127 | CONFIG_SERIAL_8250_NR_UARTS=2 |
| 136 | 128 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
| 137 | −CONFIG_SERIAL_8250_EXTENDED=y | |
| 138 | 129 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 139 | 130 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 140 | 131 | CONFIG_SERIAL_8250_RSA=y |
| @@ -183,7 +174,6 @@ CONFIG_HID_SAMSUNG=y · 42 unmodified lines | ||
| 183 | 174 | CONFIG_HID_SONY=y |
| 184 | 175 | CONFIG_HID_SUNPLUS=y |
| 185 | 176 | CONFIG_USB=y |
| 186 | −CONFIG_USB_DEVICEFS=y | |
| 187 | 177 | CONFIG_USB_MON=y |
| 188 | 178 | CONFIG_USB_EHCI_HCD=y |
| 189 | 179 | CONFIG_USB_EHCI_FSL=y |
| @@ -229,18 +219,13 @@ CONFIG_QNX4FS_FS=m · 39 unmodified lines | ||
| 229 | 219 | CONFIG_SYSV_FS=m |
| 230 | 220 | CONFIG_UFS_FS=m |
| 231 | 221 | CONFIG_NFS_FS=y |
| 232 | −CONFIG_NFS_V3=y | |
| 233 | 222 | CONFIG_NFS_V4=y |
| 234 | 223 | CONFIG_ROOT_NFS=y |
| 235 | 224 | CONFIG_NFSD=y |
| 236 | −CONFIG_PARTITION_ADVANCED=y | |
| 237 | −CONFIG_MAC_PARTITION=y | |
| 238 | 225 | CONFIG_CRC_T10DIF=y |
| 239 | 226 | CONFIG_DEBUG_FS=y |
| 240 | 227 | CONFIG_DETECT_HUNG_TASK=y |
| 241 | 228 | CONFIG_DEBUG_INFO=y |
| 242 | −CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 243 | −CONFIG_IRQ_DOMAIN_DEBUG=y | |
| 244 | 229 | CONFIG_CRYPTO_PCBC=m |
| 245 | 230 | CONFIG_CRYPTO_SHA256=y |
| 246 | 231 | CONFIG_CRYPTO_SHA512=y |
| @@ -7,7 +7,9 @@ CONFIG_SYSVIPC=y · 6 unmodified lines | ||
| 7 | 7 | CONFIG_POSIX_MQUEUE=y |
| 8 | 8 | CONFIG_BSD_PROCESS_ACCT=y |
| 9 | 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 | 13 | CONFIG_IKCONFIG=y |
| 12 | 14 | CONFIG_IKCONFIG_PROC=y |
| 13 | 15 | CONFIG_LOG_BUF_SHIFT=14 |
| @@ -19,6 +21,8 @@ CONFIG_MODULE_UNLOAD=y · 5 unmodified lines | ||
| 19 | 21 | CONFIG_MODULE_FORCE_UNLOAD=y |
| 20 | 22 | CONFIG_MODVERSIONS=y |
| 21 | 23 | # CONFIG_BLK_DEV_BSG is not set |
| 24 | +CONFIG_PARTITION_ADVANCED=y | |
| 25 | +CONFIG_MAC_PARTITION=y | |
| 22 | 26 | CONFIG_MPC8540_ADS=y |
| 23 | 27 | CONFIG_MPC8560_ADS=y |
| 24 | 28 | CONFIG_MPC85xx_CDS=y |
| @@ -42,8 +46,6 @@ CONFIG_SBC8548=y · 17 unmodified lines | ||
| 42 | 46 | CONFIG_QUICC_ENGINE=y |
| 43 | 47 | CONFIG_QE_GPIO=y |
| 44 | 48 | CONFIG_HIGHMEM=y |
| 45 | −CONFIG_NO_HZ=y | |
| 46 | −CONFIG_HIGH_RES_TIMERS=y | |
| 47 | 49 | CONFIG_BINFMT_MISC=m |
| 48 | 50 | CONFIG_MATH_EMULATION=y |
| 49 | 51 | CONFIG_IRQ_ALL_CPUS=y |
| @@ -77,36 +79,25 @@ CONFIG_INET_ESP=y · 27 unmodified lines | ||
| 77 | 79 | CONFIG_IPV6=y |
| 78 | 80 | CONFIG_IP_SCTP=m |
| 79 | 81 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" |
| 82 | +CONFIG_DEVTMPFS=y | |
| 80 | 83 | CONFIG_MTD=y |
| 81 | 84 | CONFIG_MTD_CMDLINE_PARTS=y |
| 82 | 85 | CONFIG_MTD_CHAR=y |
| 83 | 86 | CONFIG_MTD_BLOCK=y |
| 84 | −CONFIG_MTD_CFI=y | |
| 85 | 87 | CONFIG_FTL=y |
| 86 | −CONFIG_MTD_GEN_PROBE=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 | |
| 88 | +CONFIG_MTD_CFI=y | |
| 92 | 89 | CONFIG_MTD_CFI_INTELEXT=y |
| 93 | 90 | CONFIG_MTD_CFI_AMDSTD=y |
| 94 | −CONFIG_MTD_CFI_UTIL=y | |
| 95 | 91 | CONFIG_MTD_PHYSMAP_OF=y |
| 96 | −CONFIG_MTD_PARTITIONS=y | |
| 97 | −CONFIG_MTD_OF_PARTS=y | |
| 92 | +CONFIG_MTD_M25P80=y | |
| 98 | 93 | CONFIG_MTD_NAND=y |
| 99 | 94 | CONFIG_MTD_NAND_FSL_ELBC=y |
| 100 | 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 | 96 | CONFIG_PROC_DEVICETREE=y |
| 105 | 97 | CONFIG_BLK_DEV_LOOP=y |
| 106 | 98 | CONFIG_BLK_DEV_NBD=y |
| 107 | 99 | CONFIG_BLK_DEV_RAM=y |
| 108 | 100 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
| 109 | −CONFIG_MISC_DEVICES=y | |
| 110 | 101 | CONFIG_EEPROM_LEGACY=y |
| 111 | 102 | CONFIG_BLK_DEV_SD=y |
| 112 | 103 | CONFIG_CHR_DEV_ST=y |
| @@ -137,7 +128,6 @@ CONFIG_SERIAL_8250=y · 24 unmodified lines | ||
| 137 | 128 | CONFIG_SERIAL_8250_CONSOLE=y |
| 138 | 129 | CONFIG_SERIAL_8250_NR_UARTS=2 |
| 139 | 130 | CONFIG_SERIAL_8250_RUNTIME_UARTS=2 |
| 140 | −CONFIG_SERIAL_8250_EXTENDED=y | |
| 141 | 131 | CONFIG_SERIAL_8250_MANY_PORTS=y |
| 142 | 132 | CONFIG_SERIAL_8250_DETECT_IRQ=y |
| 143 | 133 | CONFIG_SERIAL_8250_RSA=y |
| @@ -186,7 +176,6 @@ CONFIG_HID_SAMSUNG=y · 42 unmodified lines | ||
| 186 | 176 | CONFIG_HID_SONY=y |
| 187 | 177 | CONFIG_HID_SUNPLUS=y |
| 188 | 178 | CONFIG_USB=y |
| 189 | −CONFIG_USB_DEVICEFS=y | |
| 190 | 179 | CONFIG_USB_MON=y |
| 191 | 180 | CONFIG_USB_EHCI_HCD=y |
| 192 | 181 | CONFIG_USB_EHCI_FSL=y |
| @@ -232,18 +221,13 @@ CONFIG_QNX4FS_FS=m · 39 unmodified lines | ||
| 232 | 221 | CONFIG_SYSV_FS=m |
| 233 | 222 | CONFIG_UFS_FS=m |
| 234 | 223 | CONFIG_NFS_FS=y |
| 235 | −CONFIG_NFS_V3=y | |
| 236 | 224 | CONFIG_NFS_V4=y |
| 237 | 225 | CONFIG_ROOT_NFS=y |
| 238 | 226 | CONFIG_NFSD=y |
| 239 | −CONFIG_PARTITION_ADVANCED=y | |
| 240 | −CONFIG_MAC_PARTITION=y | |
| 241 | 227 | CONFIG_CRC_T10DIF=y |
| 242 | 228 | CONFIG_DEBUG_FS=y |
| 243 | 229 | CONFIG_DETECT_HUNG_TASK=y |
| 244 | 230 | CONFIG_DEBUG_INFO=y |
| 245 | −CONFIG_SYSCTL_SYSCALL_CHECK=y | |
| 246 | −CONFIG_IRQ_DOMAIN_DEBUG=y | |
| 247 | 231 | CONFIG_CRYPTO_PCBC=m |
| 248 | 232 | CONFIG_CRYPTO_SHA256=y |
| 249 | 233 | CONFIG_CRYPTO_SHA512=y |
| @@ -553,9 +553,7 @@ static inline int cpu_has_feature(unsigned long feature) · 552 unmodified lines | ||
| 553 | 553 | & feature); |
| 554 | 554 | } |
| 555 | 555 | |
| 556 | −#ifdef CONFIG_HAVE_HW_BREAKPOINT | |
| 557 | 556 | #define HBP_NUM 1 |
| 558 | −#endif /* CONFIG_HAVE_HW_BREAKPOINT */ | |
| 559 | 557 | |
| 560 | 558 | #endif /* !__ASSEMBLY__ */ |
| 561 | 559 | |
| @@ -33,6 +33,7 @@ · 32 unmodified lines | ||
| 33 | 33 | #include <asm/kvm_asm.h> |
| 34 | 34 | #include <asm/processor.h> |
| 35 | 35 | #include <asm/page.h> |
| 36 | +#include <asm/cacheflush.h> | |
| 36 | 37 | |
| 37 | 38 | #define KVM_MAX_VCPUS NR_CPUS |
| 38 | 39 | #define KVM_MAX_VCORES NR_CPUS |
| @@ -219,4 +219,16 @@ void kvmppc_claim_lpid(long lpid); · 218 unmodified lines | ||
| 219 | 219 | void kvmppc_free_lpid(long lpid); |
| 220 | 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 | 234 | #endif /* __POWERPC_KVM_PPC_H__ */ |
| @@ -14,6 +14,7 @@ · 13 unmodified lines | ||
| 14 | 14 | #include <linux/types.h> |
| 15 | 15 | #include <linux/spinlock.h> |
| 16 | 16 | #include <asm/smp.h> |
| 17 | +#include <asm/io.h> | |
| 17 | 18 | |
| 18 | 19 | struct mpic_msgr { |
| 19 | 20 | u32 __iomem *base; |
| @@ -386,6 +386,7 @@ extern unsigned long cpuidle_disable; · 385 unmodified lines | ||
| 386 | 386 | enum idle_boot_override {IDLE_NO_OVERRIDE = 0, IDLE_POWERSAVE_OFF}; |
| 387 | 387 | |
| 388 | 388 | extern int powersave_nap; /* set if nap mode can be used in idle loop */ |
| 389 | +extern void power7_nap(void); | |
| 389 | 390 | |
| 390 | 391 | #ifdef CONFIG_PSERIES_IDLE |
| 391 | 392 | extern void update_smt_snooze_delay(int snooze); |
| @@ -76,6 +76,7 @@ int main(void) · 75 unmodified lines | ||
| 76 | 76 | DEFINE(SIGSEGV, SIGSEGV); |
| 77 | 77 | DEFINE(NMI_MASK, NMI_MASK); |
| 78 | 78 | DEFINE(THREAD_DSCR, offsetof(struct thread_struct, dscr)); |
| 79 | + DEFINE(THREAD_DSCR_INHERIT, offsetof(struct thread_struct, dscr_inherit)); | |
| 79 | 80 | #else |
| 80 | 81 | DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); |
| 81 | 82 | #endif /* CONFIG_PPC64 */ |
| @@ -28,6 +28,8 @@ void doorbell_setup_this_cpu(void) · 27 unmodified lines | ||
| 28 | 28 | |
| 29 | 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 | 33 | ppc_msgsnd(PPC_DBELL, 0, data); |
| 32 | 34 | } |
| 33 | 35 | |
| @@ -83,11 +83,10 @@ static int dma_iommu_dma_supported(struct device *dev, u64 mask) · 82 unmodified lines | ||
| 83 | 83 | return 0; |
| 84 | 84 | } |
| 85 | 85 | |
| 86 | − if ((tbl->it_offset + tbl->it_size) > (mask >> IOMMU_PAGE_SHIFT)) { | |
| 87 | − dev_info(dev, "Warning: IOMMU window too big for device mask\n"); | |
| 88 | − dev_info(dev, "mask: 0x%08llx, table end: 0x%08lx\n", | |
| 89 | − mask, (tbl->it_offset + tbl->it_size) << | |
| 90 | − IOMMU_PAGE_SHIFT); | |
| 86 | + if (tbl->it_offset > (mask >> IOMMU_PAGE_SHIFT)) { | |
| 87 | + dev_info(dev, "Warning: IOMMU offset too big for device mask\n"); | |
| 88 | + dev_info(dev, "mask: 0x%08llx, table offset: 0x%08lx\n", | |
| 89 | + mask, tbl->it_offset << IOMMU_PAGE_SHIFT); | |
| 91 | 90 | return 0; |
| 92 | 91 | } else |
| 93 | 92 | return 1; |
| @@ -370,6 +370,12 @@ _GLOBAL(ret_from_fork) · 369 unmodified lines | ||
| 370 | 370 | li r3,0 |
| 371 | 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 | 380 | * This routine switches between two different tasks. The process |
| 375 | 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) · 133 unmodified lines | ||
| 509 | 515 | mr r1,r8 /* start using new stack pointer */ |
| 510 | 516 | std r7,PACAKSAVE(r13) |
| 511 | 517 | |
| 512 | − ld r6,_CCR(r1) | |
| 513 | − mtcrf 0xFF,r6 | |
| 514 | − | |
| 515 | 518 | #ifdef CONFIG_ALTIVEC |
| 516 | 519 | BEGIN_FTR_SECTION |
| 517 | 520 | ld r0,THREAD_VRSAVE(r4) |
| @@ -520,14 +523,22 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) · 2 unmodified lines | ||
| 520 | 523 | #endif /* CONFIG_ALTIVEC */ |
| 521 | 524 | #ifdef CONFIG_PPC64 |
| 522 | 525 | BEGIN_FTR_SECTION |
| 526 | + lwz r6,THREAD_DSCR_INHERIT(r4) | |
| 527 | + ld r7,DSCR_DEFAULT@toc(2) | |
| 523 | 528 | ld r0,THREAD_DSCR(r4) |
| 524 | − cmpd r0,r25 | |
| 525 | − beq 1f | |
| 529 | + cmpwi r6,0 | |
| 530 | + bne 1f | |
| 531 | + ld r0,0(r7) | |
| 532 | +1: cmpd r0,r25 | |
| 533 | + beq 2f | |
| 526 | 534 | mtspr SPRN_DSCR,r0 |
| 527 | −1: | |
| 535 | +2: | |
| 528 | 536 | END_FTR_SECTION_IFSET(CPU_FTR_DSCR) |
| 529 | 537 | #endif |
| 530 | 538 | |
| 539 | + ld r6,_CCR(r1) | |
| 540 | + mtcrf 0xFF,r6 | |
| 541 | + | |
| 531 | 542 | /* r3-r13 are destroyed -- Cort */ |
| 532 | 543 | REST_8GPRS(14, r1) |
| 533 | 544 | REST_10GPRS(22, r1) |
| @@ -186,7 +186,7 @@ hardware_interrupt_hv: · 185 unmodified lines | ||
| 186 | 186 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800) |
| 187 | 187 | |
| 188 | 188 | MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) |
| 189 | − MASKABLE_EXCEPTION_HV(0x980, 0x982, decrementer) | |
| 189 | + STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) | |
| 190 | 190 | |
| 191 | 191 | STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a) |
| 192 | 192 | KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) |
| @@ -486,6 +486,7 @@ machine_check_common: · 293 unmodified lines | ||
| 486 | 486 | |
| 487 | 487 | STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) |
| 488 | 488 | STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt) |
| 489 | + STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt) | |
| 489 | 490 | STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception) |
| 490 | 491 | STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) |
| 491 | 492 | STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) |
| @@ -253,7 +253,7 @@ int __kprobes hw_breakpoint_handler(struct die_args *args) · 252 unmodified lines | ||
| 253 | 253 | |
| 254 | 254 | /* Do not emulate user-space instructions, instead single-step them */ |
| 255 | 255 | if (user_mode(regs)) { |
| 256 | − bp->ctx->task->thread.last_hit_ubp = bp; | |
| 256 | + current->thread.last_hit_ubp = bp; | |
| 257 | 257 | regs->msr |= MSR_SE; |
| 258 | 258 | goto out; |
| 259 | 259 | } |
| @@ -28,7 +28,9 @@ _GLOBAL(power7_idle) · 27 unmodified lines | ||
| 28 | 28 | lwz r4,ADDROFF(powersave_nap)(r3) |
| 29 | 29 | cmpwi 0,r4,0 |
| 30 | 30 | beqlr |
| 31 | + /* fall through */ | |
| 31 | 32 | |
| 33 | +_GLOBAL(power7_nap) | |
| 32 | 34 | /* NAP is a state loss, we create a regs frame on the |
| 33 | 35 | * stack, fill it up with the state we care about and |
| 34 | 36 | * stick a pointer to it in PACAR1. We really only |
| @@ -25,6 +25,7 @@ · 24 unmodified lines | ||
| 25 | 25 | #include <asm/processor.h> |
| 26 | 26 | #include <asm/machdep.h> |
| 27 | 27 | #include <asm/debug.h> |
| 28 | +#include <linux/slab.h> | |
| 28 | 29 | |
| 29 | 30 | /* |
| 30 | 31 | * This table contains the mapping between PowerPC hardware trap types, and |
| @@ -101,6 +102,21 @@ static int computeSignal(unsigned int tt) · 70 unmodified lines | ||
| 101 | 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 | 120 | static int kgdb_call_nmi_hook(struct pt_regs *regs) |
| 105 | 121 | { |
| 106 | 122 | kgdb_nmicallback(raw_smp_processor_id(), regs); |
| @@ -138,6 +154,8 @@ static int kgdb_handle_breakpoint(struct pt_regs *regs) · 31 unmodified lines | ||
| 138 | 154 | static int kgdb_singlestep(struct pt_regs *regs) |
| 139 | 155 | { |
| 140 | 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 | 160 | if (user_mode(regs)) |
| 143 | 161 | return 0; |
| @@ -155,13 +173,17 @@ static int kgdb_singlestep(struct pt_regs *regs) · 11 unmodified lines | ||
| 155 | 173 | thread_info = (struct thread_info *)(regs->gpr[1] & ~(THREAD_SIZE-1)); |
| 156 | 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 | 179 | memcpy(exception_thread_info, thread_info, sizeof *thread_info); |
| 180 | + } | |
| 160 | 181 | |
| 161 | 182 | kgdb_handle_exception(0, SIGTRAP, 0, regs); |
| 162 | 183 | |
| 163 | 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 | 188 | return 1; |
| 167 | 189 | } |
| @@ -410,7 +432,6 @@ int kgdb_arch_handle_exception(int vector, int signo, int err_code, · 242 unmodified lines | ||
| 410 | 432 | #else |
| 411 | 433 | linux_regs->msr |= MSR_SE; |
| 412 | 434 | #endif |
| 413 | − kgdb_single_step = 1; | |
| 414 | 435 | atomic_set(&kgdb_cpu_doing_single_step, |
| 415 | 436 | raw_smp_processor_id()); |
| 416 | 437 | } |
| @@ -802,16 +802,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, · 801 unmodified lines | ||
| 802 | 802 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
| 803 | 803 | #ifdef CONFIG_PPC64 |
| 804 | 804 | if (cpu_has_feature(CPU_FTR_DSCR)) { |
| 805 | − if (current->thread.dscr_inherit) { | |
| 806 | − p->thread.dscr_inherit = 1; | |
| 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 | − } | |
| 805 | + p->thread.dscr_inherit = current->thread.dscr_inherit; | |
| 806 | + p->thread.dscr = current->thread.dscr; | |
| 815 | 807 | } |
| 816 | 808 | #endif |
| 817 | 809 | |
| @@ -198,8 +198,15 @@ void smp_muxed_ipi_message_pass(int cpu, int msg) · 197 unmodified lines | ||
| 198 | 198 | struct cpu_messages *info = &per_cpu(ipi_message, cpu); |
| 199 | 199 | char *message = (char *)&info->messages; |
| 200 | 200 | |
| 201 | + /* | |
| 202 | + * Order previous accesses before accesses in the IPI handler. | |
| 203 | + */ | |
| 204 | + smp_mb(); | |
| 201 | 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 | 210 | smp_ops->cause_ipi(cpu, info->data); |
| 204 | 211 | } |
| 205 | 212 | |
| @@ -211,7 +218,7 @@ irqreturn_t smp_ipi_demux(void) · 5 unmodified lines | ||
| 211 | 218 | mb(); /* order any irq clear */ |
| 212 | 219 | |
| 213 | 220 | do { |
| 214 | − all = xchg_local(&info->messages, 0); | |
| 221 | + all = xchg(&info->messages, 0); | |
| 215 | 222 | |
| 216 | 223 | #ifdef __BIG_ENDIAN |
| 217 | 224 | if (all & (1 << (24 - 8 * PPC_MSG_CALL_FUNCTION))) |
| @@ -107,11 +107,11 @@ long ppc64_personality(unsigned long personality) · 106 unmodified lines | ||
| 107 | 107 | long ret; |
| 108 | 108 | |
| 109 | 109 | if (personality(current->personality) == PER_LINUX32 |
| 110 | − && personality == PER_LINUX) | |
| 111 | − personality = PER_LINUX32; | |
| 110 | + && personality(personality) == PER_LINUX) | |
| 111 | + personality = (personality & ~PER_MASK) | PER_LINUX32; | |
| 112 | 112 | ret = sys_personality(personality); |
| 113 | − if (ret == PER_LINUX32) | |
| 114 | − ret = PER_LINUX; | |
| 113 | + if (personality(ret) == PER_LINUX32) | |
| 114 | + ret = (ret & ~PER_MASK) | PER_LINUX; | |
| 115 | 115 | return ret; |
| 116 | 116 | } |
| 117 | 117 | #endif |
| @@ -194,6 +194,14 @@ static ssize_t show_dscr_default(struct device *dev, · 193 unmodified lines | ||
| 194 | 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 | 205 | static ssize_t __used store_dscr_default(struct device *dev, |
| 198 | 206 | struct device_attribute *attr, const char *buf, |
| 199 | 207 | size_t count) |
| @@ -206,6 +214,8 @@ static ssize_t __used store_dscr_default(struct device *dev, · 6 unmodified lines | ||
| 206 | 214 | return -EINVAL; |
| 207 | 215 | dscr_default = val; |
| 208 | 216 | |
| 217 | + on_each_cpu(update_dscr, NULL, 1); | |
| 218 | + | |
| 209 | 219 | return count; |
| 210 | 220 | } |
| 211 | 221 | |
| @@ -535,6 +535,15 @@ void timer_interrupt(struct pt_regs * regs) · 534 unmodified lines | ||
| 535 | 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 | 547 | #ifdef CONFIG_SUSPEND |
| 539 | 548 | static void generic_suspend_disable_irqs(void) |
| 540 | 549 | { |
| @@ -972,8 +972,9 @@ static int emulate_instruction(struct pt_regs *regs) · 971 unmodified lines | ||
| 972 | 972 | cpu_has_feature(CPU_FTR_DSCR)) { |
| 973 | 973 | PPC_WARN_EMULATED(mtdscr, regs); |
| 974 | 974 | rd = (instword >> 21) & 0x1f; |
| 975 | − mtspr(SPRN_DSCR, regs->gpr[rd]); | |
| 975 | + current->thread.dscr = regs->gpr[rd]; | |
| 976 | 976 | current->thread.dscr_inherit = 1; |
| 977 | + mtspr(SPRN_DSCR, current->thread.dscr); | |
| 977 | 978 | return 0; |
| 978 | 979 | } |
| 979 | 980 | #endif |
| @@ -211,6 +211,9 @@ next_pteg: · 210 unmodified lines | ||
| 211 | 211 | pteg1 |= PP_RWRX; |
| 212 | 212 | } |
| 213 | 213 | |
| 214 | + if (orig_pte->may_execute) | |
| 215 | + kvmppc_mmu_flush_icache(hpaddr >> PAGE_SHIFT); | |
| 216 | + | |
| 214 | 217 | local_irq_disable(); |
| 215 | 218 | |
| 216 | 219 | if (pteg[rr]) { |
| @@ -126,6 +126,8 @@ int kvmppc_mmu_map_page(struct kvm_vcpu *vcpu, struct kvmppc_pte *orig_pte) · 125 unmodified lines | ||
| 126 | 126 | |
| 127 | 127 | if (!orig_pte->may_execute) |
| 128 | 128 | rflags |= HPTE_R_N; |
| 129 | + else | |
| 130 | + kvmppc_mmu_flush_icache(hpaddr >> PAGE_SHIFT); | |
| 129 | 131 | |
| 130 | 132 | hash = hpt_hash(va, PTE_SIZE, MMU_SEGSIZE_256M); |
| 131 | 133 | |
| @@ -1421,13 +1421,13 @@ _GLOBAL(kvmppc_h_cede) · 1420 unmodified lines | ||
| 1421 | 1421 | sync /* order setting ceded vs. testing prodded */ |
| 1422 | 1422 | lbz r5,VCPU_PRODDED(r3) |
| 1423 | 1423 | cmpwi r5,0 |
| 1424 | − bne 1f | |
| 1424 | + bne kvm_cede_prodded | |
| 1425 | 1425 | li r0,0 /* set trap to 0 to say hcall is handled */ |
| 1426 | 1426 | stw r0,VCPU_TRAP(r3) |
| 1427 | 1427 | li r0,H_SUCCESS |
| 1428 | 1428 | std r0,VCPU_GPR(R3)(r3) |
| 1429 | 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 | 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) · 12 unmodified lines | ||
| 1446 | 1446 | or r4,r4,r0 |
| 1447 | 1447 | PPC_POPCNTW(R7,R4) |
| 1448 | 1448 | cmpw r7,r8 |
| 1449 | − bge 2f | |
| 1449 | + bge kvm_cede_exit | |
| 1450 | 1450 | stwcx. r4,0,r6 |
| 1451 | 1451 | bne 31b |
| 1452 | 1452 | li r0,1 |
| @@ -1555,7 +1555,8 @@ kvm_end_cede: · 102 unmodified lines | ||
| 1555 | 1555 | b hcall_real_fallback |
| 1556 | 1556 | |
| 1557 | 1557 | /* cede when already previously prodded case */ |
| 1558 | −1: li r0,0 | |
| 1558 | +kvm_cede_prodded: | |
| 1559 | + li r0,0 | |
| 1559 | 1560 | stb r0,VCPU_PRODDED(r3) |
| 1560 | 1561 | sync /* order testing prodded vs. clearing ceded */ |
| 1561 | 1562 | stb r0,VCPU_CEDED(r3) |
| @@ -1563,7 +1564,8 @@ kvm_end_cede: · 1 unmodified line | ||
| 1563 | 1564 | blr |
| 1564 | 1565 | |
| 1565 | 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 | 1569 | blr |
| 1568 | 1570 | |
| 1569 | 1571 | secondary_too_late: |
| @@ -322,11 +322,11 @@ static inline void kvmppc_e500_ref_release(struct tlbe_ref *ref) · 321 unmodified lines | ||
| 322 | 322 | static void clear_tlb1_bitmap(struct kvmppc_vcpu_e500 *vcpu_e500) |
| 323 | 323 | { |
| 324 | 324 | if (vcpu_e500->g2h_tlb1_map) |
| 325 | − memset(vcpu_e500->g2h_tlb1_map, | |
| 326 | − sizeof(u64) * vcpu_e500->gtlb_params[1].entries, 0); | |
| 325 | + memset(vcpu_e500->g2h_tlb1_map, 0, | |
| 326 | + sizeof(u64) * vcpu_e500->gtlb_params[1].entries); | |
| 327 | 327 | if (vcpu_e500->h2g_tlb1_rmap) |
| 328 | − memset(vcpu_e500->h2g_tlb1_rmap, | |
| 329 | − sizeof(unsigned int) * host_tlb_params[1].entries, 0); | |
| 328 | + memset(vcpu_e500->h2g_tlb1_rmap, 0, | |
| 329 | + sizeof(unsigned int) * host_tlb_params[1].entries); | |
| 330 | 330 | } |
| 331 | 331 | |
| 332 | 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, · 206 unmodified lines | ||
| 539 | 539 | |
| 540 | 540 | kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize, |
| 541 | 541 | ref, gvaddr, stlbe); |
| 542 | + | |
| 543 | + /* Clear i-cache for new pages */ | |
| 544 | + kvmppc_mmu_flush_icache(pfn); | |
| 542 | 545 | } |
| 543 | 546 | |
| 544 | 547 | /* XXX only map the one-one case, for now use TLB0 */ |
| @@ -20,7 +20,7 @@ int patch_instruction(unsigned int *addr, unsigned int instr) · 19 unmodified lines | ||
| 20 | 20 | { |
| 21 | 21 | int err; |
| 22 | 22 | |
| 23 | − err = __put_user(instr, addr); | |
| 23 | + __put_user_size(instr, addr, 4, err); | |
| 24 | 24 | if (err) |
| 25 | 25 | return err; |
| 26 | 26 | asm ("dcbst 0, %0; sync; icbi 0,%0; sync; isync" : : "r" (addr)); |
| @@ -288,7 +288,7 @@ err1; stb r0,0(r3) · 287 unmodified lines | ||
| 288 | 288 | std r0,16(r1) |
| 289 | 289 | stdu r1,-STACKFRAMESIZE(r1) |
| 290 | 290 | bl .enter_vmx_usercopy |
| 291 | − cmpwi r3,0 | |
| 291 | + cmpwi cr1,r3,0 | |
| 292 | 292 | ld r0,STACKFRAMESIZE+16(r1) |
| 293 | 293 | ld r3,STACKFRAMESIZE+48(r1) |
| 294 | 294 | ld r4,STACKFRAMESIZE+56(r1) |
| @@ -326,38 +326,7 @@ err1; stb r0,0(r3) · 31 unmodified lines | ||
| 326 | 326 | dcbt r0,r8,0b01010 /* GO */ |
| 327 | 327 | .machine pop |
| 328 | 328 | |
| 329 | − /* | |
| 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 | |
| 329 | + beq cr1,.Lunwind_stack_nonvmx_copy | |
| 361 | 330 | |
| 362 | 331 | /* |
| 363 | 332 | * If source and destination are not relatively aligned we use a |
| @@ -222,7 +222,7 @@ _GLOBAL(memcpy_power7) · 221 unmodified lines | ||
| 222 | 222 | std r0,16(r1) |
| 223 | 223 | stdu r1,-STACKFRAMESIZE(r1) |
| 224 | 224 | bl .enter_vmx_copy |
| 225 | − cmpwi r3,0 | |
| 225 | + cmpwi cr1,r3,0 | |
| 226 | 226 | ld r0,STACKFRAMESIZE+16(r1) |
| 227 | 227 | ld r3,STACKFRAMESIZE+48(r1) |
| 228 | 228 | ld r4,STACKFRAMESIZE+56(r1) |
| @@ -260,7 +260,7 @@ _GLOBAL(memcpy_power7) · 31 unmodified lines | ||
| 260 | 260 | dcbt r0,r8,0b01010 /* GO */ |
| 261 | 261 | .machine pop |
| 262 | 262 | |
| 263 | − beq .Lunwind_stack_nonvmx_copy | |
| 263 | + beq cr1,.Lunwind_stack_nonvmx_copy | |
| 264 | 264 | |
| 265 | 265 | /* |
| 266 | 266 | * If source and destination are not relatively aligned we use a |
| @@ -469,6 +469,7 @@ void flush_dcache_icache_page(struct page *page) · 468 unmodified lines | ||
| 469 | 469 | __flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT); |
| 470 | 470 | #endif |
| 471 | 471 | } |
| 472 | +EXPORT_SYMBOL(flush_dcache_icache_page); | |
| 472 | 473 | |
| 473 | 474 | void clear_user_page(void *page, unsigned long vaddr, struct page *pg) |
| 474 | 475 | { |
| @@ -1436,11 +1436,11 @@ static long vphn_get_associativity(unsigned long cpu, · 1435 unmodified lines | ||
| 1436 | 1436 | |
| 1437 | 1437 | /* |
| 1438 | 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 | 1441 | int arch_update_cpu_topology(void) |
| 1442 | 1442 | { |
| 1443 | − int cpu, nid, old_nid; | |
| 1443 | + int cpu, nid, old_nid, changed = 0; | |
| 1444 | 1444 | unsigned int associativity[VPHN_ASSOC_BUFSIZE] = {0}; |
| 1445 | 1445 | struct device *dev; |
| 1446 | 1446 | |
| @@ -1466,9 +1466,10 @@ int arch_update_cpu_topology(void) · 19 unmodified lines | ||
| 1466 | 1466 | dev = get_cpu_device(cpu); |
| 1467 | 1467 | if (dev) |
| 1468 | 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 | 1475 | static void topology_work_fn(struct work_struct *work) |
| @@ -1431,7 +1431,7 @@ static void perf_event_interrupt(struct pt_regs *regs) · 1430 unmodified lines | ||
| 1431 | 1431 | if (!event->hw.idx || is_limited_pmc(event->hw.idx)) |
| 1432 | 1432 | continue; |
| 1433 | 1433 | val = read_pmc(event->hw.idx); |
| 1434 | − if ((int)val < 0) { | |
| 1434 | + if (pmc_overflow(val)) { | |
| 1435 | 1435 | /* event has overflowed */ |
| 1436 | 1436 | found = 1; |
| 1437 | 1437 | record_and_restart(event, val, regs); |
| @@ -106,14 +106,6 @@ static void pnv_smp_cpu_kill_self(void) · 105 unmodified lines | ||
| 106 | 106 | { |
| 107 | 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 | 109 | /* Standard hot unplug procedure */ |
| 118 | 110 | local_irq_disable(); |
| 119 | 111 | idle_task_exit(); |
| @@ -128,7 +120,7 @@ static void pnv_smp_cpu_kill_self(void) · 8 unmodified lines | ||
| 128 | 120 | */ |
| 129 | 121 | mtspr(SPRN_LPCR, mfspr(SPRN_LPCR) & ~(u64)LPCR_PECE1); |
| 130 | 122 | while (!generic_check_cpu_restart(cpu)) { |
| 131 | − power7_idle(); | |
| 123 | + power7_nap(); | |
| 132 | 124 | if (!generic_check_cpu_restart(cpu)) { |
| 133 | 125 | DBG("CPU%d Unexpected exit while offline !\n", cpu); |
| 134 | 126 | /* We may be getting an IPI, so we re-enable |
| @@ -465,7 +465,7 @@ int __init fsl_add_bridge(struct device_node *dev, int is_primary) · 464 unmodified lines | ||
| 465 | 465 | iounmap(hose->cfg_data); |
| 466 | 466 | iounmap(hose->cfg_addr); |
| 467 | 467 | pcibios_free_controller(hose); |
| 468 | − return 0; | |
| 468 | + return -ENODEV; | |
| 469 | 469 | } |
| 470 | 470 | |
| 471 | 471 | setup_pci_cmd(hose); |
| @@ -827,6 +827,7 @@ struct device_node *fsl_pci_primary; · 355 unmodified lines | ||
| 827 | 827 | |
| 828 | 828 | void __devinit fsl_pci_init(void) |
| 829 | 829 | { |
| 830 | + int ret; | |
| 830 | 831 | struct device_node *node; |
| 831 | 832 | struct pci_controller *hose; |
| 832 | 833 | dma_addr_t max = 0xffffffff; |
| @@ -855,10 +856,12 @@ void __devinit fsl_pci_init(void) · 22 unmodified lines | ||
| 855 | 856 | if (!fsl_pci_primary) |
| 856 | 857 | fsl_pci_primary = node; |
| 857 | 858 | |
| 858 | − fsl_add_bridge(node, fsl_pci_primary == node); | |
| 859 | − hose = pci_find_hose_for_OF_device(node); | |
| 860 | − max = min(max, hose->dma_window_base_cur + | |
| 861 | − hose->dma_window_size); | |
| 859 | + ret = fsl_add_bridge(node, fsl_pci_primary == node); | |
| 860 | + if (ret == 0) { | |
| 861 | + hose = pci_find_hose_for_OF_device(node); | |
| 862 | + max = min(max, hose->dma_window_base_cur + | |
| 863 | + hose->dma_window_size); | |
| 864 | + } | |
| 862 | 865 | } |
| 863 | 866 | } |
| 864 | 867 | |
| @@ -14,6 +14,9 @@ · 13 unmodified lines | ||
| 14 | 14 | #include <linux/list.h> |
| 15 | 15 | #include <linux/of_platform.h> |
| 16 | 16 | #include <linux/errno.h> |
| 17 | +#include <linux/err.h> | |
| 18 | +#include <linux/export.h> | |
| 19 | +#include <linux/slab.h> | |
| 17 | 20 | #include <asm/prom.h> |
| 18 | 21 | #include <asm/hw_irq.h> |
| 19 | 22 | #include <asm/ppc-pci.h> |
| @@ -65,7 +65,11 @@ static inline void icp_hv_set_xirr(unsigned int value) · 64 unmodified lines | ||
| 65 | 65 | static inline void icp_hv_set_qirr(int n_cpu , u8 value) |
| 66 | 66 | { |
| 67 | 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 | 73 | if (rc != H_SUCCESS) { |
| 70 | 74 | pr_err("%s: bad return code qirr cpu=%d hw_cpu=%d mfrr=0x%x " |
| 71 | 75 | "returned %ld\n", __func__, n_cpu, hw_cpu, value, rc); |
| @@ -17,6 +17,7 @@ · 16 unmodified lines | ||
| 17 | 17 | #include <linux/reboot.h> |
| 18 | 18 | #include <linux/delay.h> |
| 19 | 19 | #include <linux/kallsyms.h> |
| 20 | +#include <linux/kmsg_dump.h> | |
| 20 | 21 | #include <linux/cpumask.h> |
| 21 | 22 | #include <linux/export.h> |
| 22 | 23 | #include <linux/sysrq.h> |
| @@ -894,13 +895,13 @@ cmds(struct pt_regs *excp) · 871 unmodified lines | ||
| 894 | 895 | #endif |
| 895 | 896 | default: |
| 896 | 897 | printf("Unrecognized command: "); |
| 897 | − do { | |
| 898 | + do { | |
| 898 | 899 | if (' ' < cmd && cmd <= '~') |
| 899 | 900 | putchar(cmd); |
| 900 | 901 | else |
| 901 | 902 | printf("\\x%x", cmd); |
| 902 | 903 | cmd = inchar(); |
| 903 | − } while (cmd != '\n'); | |
| 904 | + } while (cmd != '\n'); | |
| 904 | 905 | printf(" (type ? for help)\n"); |
| 905 | 906 | break; |
| 906 | 907 | } |
| @@ -1097,7 +1098,7 @@ static long check_bp_loc(unsigned long addr) · 190 unmodified lines | ||
| 1097 | 1098 | return 1; |
| 1098 | 1099 | } |
| 1099 | 1100 | |
| 1100 | −static char *breakpoint_help_string = | |
| 1101 | +static char *breakpoint_help_string = | |
| 1101 | 1102 | "Breakpoint command usage:\n" |
| 1102 | 1103 | "b show breakpoints\n" |
| 1103 | 1104 | "b <addr> [cnt] set breakpoint at given instr addr\n" |
| @@ -1193,7 +1194,7 @@ bpt_cmds(void) · 89 unmodified lines | ||
| 1193 | 1194 | |
| 1194 | 1195 | default: |
| 1195 | 1196 | termch = cmd; |
| 1196 | − cmd = skipbl(); | |
| 1197 | + cmd = skipbl(); | |
| 1197 | 1198 | if (cmd == '?') { |
| 1198 | 1199 | printf(breakpoint_help_string); |
| 1199 | 1200 | break; |
| @@ -1359,7 +1360,7 @@ static void xmon_show_stack(unsigned long sp, unsigned long lr, · 159 unmodified lines | ||
| 1359 | 1360 | sp + REGS_OFFSET); |
| 1360 | 1361 | break; |
| 1361 | 1362 | } |
| 1362 | − printf("--- Exception: %lx %s at ", regs.trap, | |
| 1363 | + printf("--- Exception: %lx %s at ", regs.trap, | |
| 1363 | 1364 | getvecname(TRAP(®s))); |
| 1364 | 1365 | pc = regs.nip; |
| 1365 | 1366 | lr = regs.link; |
| @@ -1623,14 +1624,14 @@ static void super_regs(void) · 257 unmodified lines | ||
| 1623 | 1624 | |
| 1624 | 1625 | cmd = skipbl(); |
| 1625 | 1626 | if (cmd == '\n') { |
| 1626 | − unsigned long sp, toc; | |
| 1627 | + unsigned long sp, toc; | |
| 1627 | 1628 | asm("mr %0,1" : "=r" (sp) :); |
| 1628 | 1629 | asm("mr %0,2" : "=r" (toc) :); |
| 1629 | 1630 | |
| 1630 | 1631 | printf("msr = "REG" sprg0= "REG"\n", |
| 1631 | 1632 | mfmsr(), mfspr(SPRN_SPRG0)); |
| 1632 | 1633 | printf("pvr = "REG" sprg1= "REG"\n", |
| 1633 | − mfspr(SPRN_PVR), mfspr(SPRN_SPRG1)); | |
| 1634 | + mfspr(SPRN_PVR), mfspr(SPRN_SPRG1)); | |
| 1634 | 1635 | printf("dec = "REG" sprg2= "REG"\n", |
| 1635 | 1636 | mfspr(SPRN_DEC), mfspr(SPRN_SPRG2)); |
| 1636 | 1637 | printf("sp = "REG" sprg3= "REG"\n", sp, mfspr(SPRN_SPRG3)); |
| @@ -1783,7 +1784,7 @@ byterev(unsigned char *val, int size) · 146 unmodified lines | ||
| 1783 | 1784 | static int brev; |
| 1784 | 1785 | static int mnoread; |
| 1785 | 1786 | |
| 1786 | −static char *memex_help_string = | |
| 1787 | +static char *memex_help_string = | |
| 1787 | 1788 | "Memory examine command usage:\n" |
| 1788 | 1789 | "m [addr] [flags] examine/change memory\n" |
| 1789 | 1790 | " addr is optional. will start where left off.\n" |
| @@ -1798,7 +1799,7 @@ static char *memex_help_string = · 8 unmodified lines | ||
| 1798 | 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 | 1803 | "Memory examine subcommands:\n" |
| 1803 | 1804 | " hexval write this val to current location\n" |
| 1804 | 1805 | " 'string' write chars from string to this location\n" |
| @@ -2064,7 +2065,7 @@ prdump(unsigned long adrs, long ndump) · 259 unmodified lines | ||
| 2064 | 2065 | nr = mread(adrs, temp, r); |
| 2065 | 2066 | adrs += nr; |
| 2066 | 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 | 2069 | putchar(' '); |
| 2069 | 2070 | if (m < nr) |
| 2070 | 2071 | printf("%.2x", temp[m]); |
| @@ -2072,7 +2073,7 @@ prdump(unsigned long adrs, long ndump) · 1 unmodified line | ||
| 2072 | 2073 | printf("%s", fault_chars[fault_type]); |
| 2073 | 2074 | } |
| 2074 | 2075 | for (; m < 16; ++m) { |
| 2075 | − if ((m & (sizeof(long) - 1)) == 0) | |
| 2076 | + if ((m & (sizeof(long) - 1)) == 0) | |
| 2076 | 2077 | putchar(' '); |
| 2077 | 2078 | printf(" "); |
| 2078 | 2079 | } |
| @@ -2148,45 +2149,28 @@ print_address(unsigned long addr) · 69 unmodified lines | ||
| 2148 | 2149 | void |
| 2149 | 2150 | dump_log_buf(void) |
| 2150 | 2151 | { |
| 2151 | − const unsigned long size = 128; | |
| 2152 | − unsigned long end, addr; | |
| 2153 | − unsigned char buf[size + 1]; | |
| 2154 | − | |
| 2155 | − addr = 0; | |
| 2156 | − buf[size] = '\0'; | |
| 2157 | − | |
| 2158 | − if (setjmp(bus_error_jmp) != 0) { | |
| 2159 | − printf("Unable to lookup symbol __log_buf!\n"); | |
| 2160 | − return; | |
| 2161 | − } | |
| 2162 | − | |
| 2163 | − catch_memory_errors = 1; | |
| 2164 | − sync(); | |
| 2165 | − addr = kallsyms_lookup_name("__log_buf"); | |
| 2166 | − | |
| 2167 | − if (! addr) | |
| 2168 | − printf("Symbol __log_buf not found!\n"); | |
| 2169 | − else { | |
| 2170 | − end = addr + (1 << CONFIG_LOG_BUF_SHIFT); | |
| 2171 | − while (addr < end) { | |
| 2172 | − if (! mread(addr, buf, size)) { | |
| 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; | |
| 2152 | + struct kmsg_dumper dumper = { .active = 1 }; | |
| 2153 | + unsigned char buf[128]; | |
| 2154 | + size_t len; | |
| 2155 | + | |
| 2156 | + if (setjmp(bus_error_jmp) != 0) { | |
| 2157 | + printf("Error dumping printk buffer!\n"); | |
| 2158 | + return; | |
| 2159 | + } | |
| 2160 | + | |
| 2161 | + catch_memory_errors = 1; | |
| 2162 | + sync(); | |
| 2163 | + | |
| 2164 | + kmsg_dump_rewind_nolock(&dumper); | |
| 2165 | + while (kmsg_dump_get_line_nolock(&dumper, false, buf, sizeof(buf), &len)) { | |
| 2166 | + buf[len] = '\0'; | |
| 2167 | + printf("%s", buf); | |
| 2168 | + } | |
| 2169 | + | |
| 2170 | + sync(); | |
| 2171 | + /* wait a little while to see if we get a machine check */ | |
| 2172 | + __delay(200); | |
| 2173 | + catch_memory_errors = 0; | |
| 2190 | 2174 | } |
| 2191 | 2175 | |
| 2192 | 2176 | /* |
| @@ -180,7 +180,8 @@ extern char elf_platform[]; · 179 unmodified lines | ||
| 180 | 180 | #define ELF_PLATFORM (elf_platform) |
| 181 | 181 | |
| 182 | 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 | 185 | #else /* CONFIG_64BIT */ |
| 185 | 186 | #define SET_PERSONALITY(ex) \ |
| 186 | 187 | do { \ |
| @@ -13,6 +13,7 @@ · 12 unmodified lines | ||
| 13 | 13 | */ |
| 14 | 14 | |
| 15 | 15 | typedef unsigned long __kernel_size_t; |
| 16 | +typedef long __kernel_ssize_t; | |
| 16 | 17 | #define __kernel_size_t __kernel_size_t |
| 17 | 18 | |
| 18 | 19 | typedef unsigned short __kernel_old_dev_t; |
| @@ -25,7 +26,6 @@ typedef unsigned short __kernel_mode_t; · 6 unmodified lines | ||
| 25 | 26 | typedef unsigned short __kernel_ipc_pid_t; |
| 26 | 27 | typedef unsigned short __kernel_uid_t; |
| 27 | 28 | typedef unsigned short __kernel_gid_t; |
| 28 | −typedef int __kernel_ssize_t; | |
| 29 | 29 | typedef int __kernel_ptrdiff_t; |
| 30 | 30 | |
| 31 | 31 | #else /* __s390x__ */ |
| @@ -35,7 +35,6 @@ typedef unsigned int __kernel_mode_t; · 3 unmodified lines | ||
| 35 | 35 | typedef int __kernel_ipc_pid_t; |
| 36 | 36 | typedef unsigned int __kernel_uid_t; |
| 37 | 37 | typedef unsigned int __kernel_gid_t; |
| 38 | −typedef long __kernel_ssize_t; | |
| 39 | 38 | typedef long __kernel_ptrdiff_t; |
| 40 | 39 | typedef unsigned long __kernel_sigset_t; /* at least 32 bits */ |
| 41 | 40 | |
| @@ -44,6 +44,7 @@ static inline void smp_call_online_cpu(void (*func)(void *), void *data) · 43 unmodified lines | ||
| 44 | 44 | } |
| 45 | 45 | |
| 46 | 46 | static inline int smp_find_processor_id(int address) { return 0; } |
| 47 | +static inline int smp_store_status(int cpu) { return 0; } | |
| 47 | 48 | static inline int smp_vcpu_scheduled(int cpu) { return 1; } |
| 48 | 49 | static inline void smp_yield_cpu(int cpu) { } |
| 49 | 50 | static inline void smp_yield(void) { } |
| @@ -114,7 +114,7 @@ static void deliver_alarm(void) · 113 unmodified lines | ||
| 114 | 114 | skew += this_tick - last_tick; |
| 115 | 115 | |
| 116 | 116 | while (skew >= one_tick) { |
| 117 | − alarm_handler(SIGVTALRM, NULL); | |
| 117 | + alarm_handler(SIGVTALRM, NULL, NULL); | |
| 118 | 118 | skew -= one_tick; |
| 119 | 119 | } |
| 120 | 120 | |
| @@ -12,8 +12,7 @@ · 11 unmodified lines | ||
| 12 | 12 | * Simple spin lock operations. There are two variants, one clears IRQ's |
| 13 | 13 | * on the local processor, one does not. |
| 14 | 14 | * |
| 15 | − * These are fair FIFO ticket locks, which are currently limited to 256 | |
| 16 | − * CPUs. | |
| 15 | + * These are fair FIFO ticket locks, which support up to 2^16 CPUs. | |
| 17 | 16 | * |
| 18 | 17 | * (the type definitions are in asm/spinlock_types.h) |
| 19 | 18 | */ |
| @@ -165,7 +165,7 @@ static const unsigned char * const k7_nops[ASM_NOP_MAX+2] = · 164 unmodified lines | ||
| 165 | 165 | #endif |
| 166 | 166 | |
| 167 | 167 | #ifdef P6_NOP1 |
| 168 | −static const unsigned char __initconst_or_module p6nops[] = | |
| 168 | +static const unsigned char p6nops[] = | |
| 169 | 169 | { |
| 170 | 170 | P6_NOP1, |
| 171 | 171 | P6_NOP2, |
| @@ -270,7 +270,7 @@ void fixup_irqs(void) · 269 unmodified lines | ||
| 270 | 270 | |
| 271 | 271 | if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { |
| 272 | 272 | break_affinity = 1; |
| 273 | − affinity = cpu_all_mask; | |
| 273 | + affinity = cpu_online_mask; | |
| 274 | 274 | } |
| 275 | 275 | |
| 276 | 276 | chip = irq_data_get_irq_chip(data); |
| @@ -143,11 +143,12 @@ static int get_matching_microcode(int cpu, const u8 *ucode_ptr, · 142 unmodified lines | ||
| 143 | 143 | unsigned int *current_size) |
| 144 | 144 | { |
| 145 | 145 | struct microcode_header_amd *mc_hdr; |
| 146 | − unsigned int actual_size; | |
| 146 | + unsigned int actual_size, patch_size; | |
| 147 | 147 | u16 equiv_cpu_id; |
| 148 | 148 | |
| 149 | 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 | 153 | equiv_cpu_id = find_equiv_id(); |
| 153 | 154 | if (!equiv_cpu_id) |
| @@ -174,7 +175,7 @@ static int get_matching_microcode(int cpu, const u8 *ucode_ptr, · 20 unmodified lines | ||
| 174 | 175 | /* |
| 175 | 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 | 179 | if (!actual_size) |
| 179 | 180 | return 0; |
| 180 | 181 | |
| @@ -475,13 +475,26 @@ register_address(struct x86_emulate_ctxt *ctxt, unsigned long reg) · 474 unmodified lines | ||
| 475 | 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 | 483 | static inline void |
| 479 | 484 | register_address_increment(struct x86_emulate_ctxt *ctxt, unsigned long *reg, int inc) |
| 480 | 485 | { |
| 486 | + ulong mask; | |
| 487 | + | |
| 481 | 488 | if (ctxt->ad_bytes == sizeof(unsigned long)) |
| 482 | − *reg += inc; | |
| 489 | + mask = ~0UL; | |
| 483 | 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 | 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) · 1034 unmodified lines | ||
| 1522 | 1535 | { |
| 1523 | 1536 | struct segmented_address addr; |
| 1524 | 1537 | |
| 1525 | − register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], -bytes); | |
| 1526 | − addr.ea = register_address(ctxt, ctxt->regs[VCPU_REGS_RSP]); | |
| 1538 | + rsp_increment(ctxt, -bytes); | |
| 1539 | + addr.ea = ctxt->regs[VCPU_REGS_RSP] & stack_mask(ctxt); | |
| 1527 | 1540 | addr.seg = VCPU_SREG_SS; |
| 1528 | 1541 | |
| 1529 | 1542 | return segmented_write(ctxt, addr, data, bytes); |
| @@ -1542,13 +1555,13 @@ static int emulate_pop(struct x86_emulate_ctxt *ctxt, · 12 unmodified lines | ||
| 1542 | 1555 | int rc; |
| 1543 | 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 | 1559 | addr.seg = VCPU_SREG_SS; |
| 1547 | 1560 | rc = segmented_read(ctxt, addr, dest, len); |
| 1548 | 1561 | if (rc != X86EMUL_CONTINUE) |
| 1549 | 1562 | return rc; |
| 1550 | 1563 | |
| 1551 | − register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], len); | |
| 1564 | + rsp_increment(ctxt, len); | |
| 1552 | 1565 | return rc; |
| 1553 | 1566 | } |
| 1554 | 1567 | |
| @@ -1688,8 +1701,7 @@ static int em_popa(struct x86_emulate_ctxt *ctxt) · 133 unmodified lines | ||
| 1688 | 1701 | |
| 1689 | 1702 | while (reg >= VCPU_REGS_RAX) { |
| 1690 | 1703 | if (reg == VCPU_REGS_RSP) { |
| 1691 | − register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], | |
| 1692 | − ctxt->op_bytes); | |
| 1704 | + rsp_increment(ctxt, ctxt->op_bytes); | |
| 1693 | 1705 | --reg; |
| 1694 | 1706 | } |
| 1695 | 1707 | |
| @@ -2825,7 +2837,7 @@ static int em_ret_near_imm(struct x86_emulate_ctxt *ctxt) · 1129 unmodified lines | ||
| 2825 | 2837 | rc = emulate_pop(ctxt, &ctxt->dst.val, ctxt->op_bytes); |
| 2826 | 2838 | if (rc != X86EMUL_CONTINUE) |
| 2827 | 2839 | return rc; |
| 2828 | − register_address_increment(ctxt, &ctxt->regs[VCPU_REGS_RSP], ctxt->src.val); | |
| 2840 | + rsp_increment(ctxt, ctxt->src.val); | |
| 2829 | 2841 | return X86EMUL_CONTINUE; |
| 2830 | 2842 | } |
| 2831 | 2843 | |
| @@ -4112,17 +4112,22 @@ static int mmu_shrink(struct shrinker *shrink, struct shrink_control *sc) · 4111 unmodified lines | ||
| 4112 | 4112 | int idx; |
| 4113 | 4113 | LIST_HEAD(invalid_list); |
| 4114 | 4114 | |
| 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; | |
| 4115 | 4123 | /* |
| 4116 | 4124 | * n_used_mmu_pages is accessed without holding kvm->mmu_lock |
| 4117 | 4125 | * here. We may skip a VM instance errorneosly, but we do not |
| 4118 | 4126 | * want to shrink a VM that only started to populate its MMU |
| 4119 | 4127 | * anyway. |
| 4120 | 4128 | */ |
| 4121 | − if (kvm->arch.n_used_mmu_pages > 0) { | |
| 4122 | − if (!nr_to_scan--) | |
| 4123 | − break; | |
| 4129 | + if (!kvm->arch.n_used_mmu_pages) | |
| 4124 | 4130 | continue; |
| 4125 | − } | |
| 4126 | 4131 | |
| 4127 | 4132 | idx = srcu_read_lock(&kvm->srcu); |
| 4128 | 4133 | spin_lock(&kvm->mmu_lock); |
| @@ -806,7 +806,7 @@ EXPORT_SYMBOL_GPL(kvm_rdpmc); · 805 unmodified lines | ||
| 806 | 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 | 810 | static u32 msrs_to_save[] = { |
| 811 | 811 | MSR_KVM_SYSTEM_TIME, MSR_KVM_WALL_CLOCK, |
| 812 | 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) · 1187 unmodified lines | ||
| 2000 | 2000 | case MSR_KVM_STEAL_TIME: |
| 2001 | 2001 | data = vcpu->arch.st.msr_val; |
| 2002 | 2002 | break; |
| 2003 | + case MSR_KVM_PV_EOI_EN: | |
| 2004 | + data = vcpu->arch.pv_eoi.msr_val; | |
| 2005 | + break; | |
| 2003 | 2006 | case MSR_IA32_P5_MC_ADDR: |
| 2004 | 2007 | case MSR_IA32_P5_MC_TYPE: |
| 2005 | 2008 | case MSR_IA32_MCG_CAP: |
| @@ -31,7 +31,6 @@ · 30 unmodified lines | ||
| 31 | 31 | #include <linux/pci.h> |
| 32 | 32 | #include <linux/gfp.h> |
| 33 | 33 | #include <linux/memblock.h> |
| 34 | −#include <linux/syscore_ops.h> | |
| 35 | 34 | |
| 36 | 35 | #include <xen/xen.h> |
| 37 | 36 | #include <xen/interface/xen.h> |
| @@ -1470,130 +1469,38 @@ asmlinkage void __init xen_start_kernel(void) · 1432 unmodified lines | ||
| 1470 | 1469 | #endif |
| 1471 | 1470 | } |
| 1472 | 1471 | |
| 1473 | −#ifdef CONFIG_XEN_PVHVM | |
| 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) | |
| 1472 | +void __ref xen_hvm_init_shared_info(void) | |
| 1504 | 1473 | { |
| 1474 | + int cpu; | |
| 1505 | 1475 | struct xen_add_to_physmap xatp; |
| 1476 | + static struct shared_info *shared_info_page = 0; | |
| 1506 | 1477 | |
| 1478 | + if (!shared_info_page) | |
| 1479 | + shared_info_page = (struct shared_info *) | |
| 1480 | + extend_brk(PAGE_SIZE, PAGE_SIZE); | |
| 1507 | 1481 | xatp.domid = DOMID_SELF; |
| 1508 | 1482 | xatp.idx = 0; |
| 1509 | 1483 | xatp.space = XENMAPSPACE_shared_info; |
| 1510 | − xatp.gpfn = pfn; | |
| 1484 | + xatp.gpfn = __pa(shared_info_page) >> PAGE_SHIFT; | |
| 1511 | 1485 | if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp)) |
| 1512 | 1486 | BUG(); |
| 1513 | 1487 | |
| 1514 | −} | |
| 1515 | −static void xen_hvm_set_shared_info(struct shared_info *sip) | |
| 1516 | −{ | |
| 1517 | − int cpu; | |
| 1518 | − | |
| 1519 | − HYPERVISOR_shared_info = sip; | |
| 1488 | + HYPERVISOR_shared_info = (struct shared_info *)shared_info_page; | |
| 1520 | 1489 | |
| 1521 | 1490 | /* xen_vcpu is a pointer to the vcpu_info struct in the shared_info |
| 1522 | 1491 | * page, we use it in the event channel upcall and in some pvclock |
| 1523 | 1492 | * related functions. We don't need the vcpu_info placement |
| 1524 | 1493 | * optimizations because we don't use any pv_mmu or pv_irq op on |
| 1525 | 1494 | * HVM. |
| 1526 | − * When xen_hvm_set_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 | |
| 1495 | + * When xen_hvm_init_shared_info is run at boot time only vcpu 0 is | |
| 1496 | + * online but xen_hvm_init_shared_info is run at resume time too and | |
| 1528 | 1497 | * in that case multiple vcpus might be online. */ |
| 1529 | 1498 | for_each_online_cpu(cpu) { |
| 1530 | 1499 | per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; |
| 1531 | 1500 | } |
| 1532 | 1501 | } |
| 1533 | 1502 | |
| 1534 | −/* Reconnect the shared_info pfn to a mfn */ | |
| 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 | − | |
| 1503 | +#ifdef CONFIG_XEN_PVHVM | |
| 1597 | 1504 | static void __init init_hvm_pv_info(void) |
| 1598 | 1505 | { |
| 1599 | 1506 | int major, minor; |
| @@ -1644,9 +1551,6 @@ static void __init xen_hvm_guest_init(void) · 44 unmodified lines | ||
| 1644 | 1551 | init_hvm_pv_info(); |
| 1645 | 1552 | |
| 1646 | 1553 | xen_hvm_init_shared_info(); |
| 1647 | −#ifdef CONFIG_KEXEC | |
| 1648 | − register_syscore_ops(&xen_hvm_syscore_ops); | |
| 1649 | −#endif | |
| 1650 | 1554 | |
| 1651 | 1555 | if (xen_feature(XENFEAT_hvm_callback_vector)) |
| 1652 | 1556 | xen_have_vector_callback = 1; |
| @@ -1283,7 +1283,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, · 1282 unmodified lines | ||
| 1283 | 1283 | cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); |
| 1284 | 1284 | |
| 1285 | 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 | 1287 | args->op.cmd = MMUEXT_INVLPG_MULTI; |
| 1288 | 1288 | args->op.arg1.linear_addr = start; |
| 1289 | 1289 | } |
| @@ -196,9 +196,11 @@ RESERVE_BRK(p2m_mid_identity, PAGE_SIZE * 2 * 3); · 195 unmodified lines | ||
| 196 | 196 | |
| 197 | 197 | /* When we populate back during bootup, the amount of pages can vary. The |
| 198 | 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 | |
| 200 | − * for 4GB of I/O and E820 holes. */ | |
| 201 | −RESERVE_BRK(p2m_populated, PMD_SIZE * 4); | |
| 199 | + * Some machines can have 3GB I/O holes even. With early_can_reuse_p2m_middle | |
| 200 | + * it can re-use Xen provided mfn_list array, so we only need to allocate at | |
| 201 | + * most three P2M top nodes. */ | |
| 202 | +RESERVE_BRK(p2m_populated, PAGE_SIZE * 3); | |
| 203 | + | |
| 202 | 204 | static inline unsigned p2m_top_index(unsigned long pfn) |
| 203 | 205 | { |
| 204 | 206 | BUG_ON(pfn >= MAX_P2M_PFN); |
| @@ -575,12 +577,99 @@ static bool __init early_alloc_p2m(unsigned long pfn) · 370 unmodified lines | ||
| 575 | 577 | } |
| 576 | 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 | 664 | bool __init early_set_phys_to_machine(unsigned long pfn, unsigned long mfn) |
| 579 | 665 | { |
| 580 | 666 | if (unlikely(!__set_phys_to_machine(pfn, mfn))) { |
| 581 | 667 | if (!early_alloc_p2m(pfn)) |
| 582 | 668 | return false; |
| 583 | 669 | |
| 670 | + if (early_can_reuse_p2m_middle(pfn, mfn)) | |
| 671 | + return __set_phys_to_machine(pfn, mfn); | |
| 672 | + | |
| 584 | 673 | if (!early_alloc_p2m_middle(pfn, false /* boundary crossover OK!*/)) |
| 585 | 674 | return false; |
| 586 | 675 | |
| @@ -78,9 +78,16 @@ static void __init xen_add_extra_mem(u64 start, u64 size) · 77 unmodified lines | ||
| 78 | 78 | memblock_reserve(start, size); |
| 79 | 79 | |
| 80 | 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 | 89 | __set_phys_to_machine(pfn, INVALID_P2M_ENTRY); |
| 90 | + } | |
| 84 | 91 | } |
| 85 | 92 | |
| 86 | 93 | static unsigned long __init xen_do_chunk(unsigned long start, |
| @@ -30,7 +30,7 @@ void xen_arch_hvm_post_suspend(int suspend_cancelled) · 29 unmodified lines | ||
| 30 | 30 | { |
| 31 | 31 | #ifdef CONFIG_XEN_PVHVM |
| 32 | 32 | int cpu; |
| 33 | − xen_hvm_resume_shared_info(); | |
| 33 | + xen_hvm_init_shared_info(); | |
| 34 | 34 | xen_callback_vector(); |
| 35 | 35 | xen_unplug_emulated_devices(); |
| 36 | 36 | if (xen_feature(XENFEAT_hvm_safe_pvclock)) { |
| @@ -41,7 +41,7 @@ void xen_enable_syscall(void); · 40 unmodified lines | ||
| 41 | 41 | void xen_vcpu_restore(void); |
| 42 | 42 | |
| 43 | 43 | void xen_callback_vector(void); |
| 44 | −void xen_hvm_resume_shared_info(void); | |
| 44 | +void xen_hvm_init_shared_info(void); | |
| 45 | 45 | void xen_unplug_emulated_devices(void); |
| 46 | 46 | |
| 47 | 47 | void __init xen_build_dynamic_phys_to_machine(void); |
| @@ -44,6 +44,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, · 43 unmodified lines | ||
| 44 | 44 | struct request_queue *q = bdev_get_queue(bdev); |
| 45 | 45 | int type = REQ_WRITE | REQ_DISCARD; |
| 46 | 46 | unsigned int max_discard_sectors; |
| 47 | + unsigned int granularity, alignment, mask; | |
| 47 | 48 | struct bio_batch bb; |
| 48 | 49 | struct bio *bio; |
| 49 | 50 | int ret = 0; |
| @@ -54,18 +55,20 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, · 4 unmodified lines | ||
| 54 | 55 | if (!blk_queue_discard(q)) |
| 55 | 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 | 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 | 67 | max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9); |
| 68 | + max_discard_sectors = round_down(max_discard_sectors, granularity); | |
| 62 | 69 | if (unlikely(!max_discard_sectors)) { |
| 63 | 70 | /* Avoid infinite loop below. Being cautious never hurts. */ |
| 64 | 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 | 74 | if (flags & BLKDEV_DISCARD_SECURE) { |
| @@ -79,25 +82,37 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, · 7 unmodified lines | ||
| 79 | 82 | bb.wait = &wait; |
| 80 | 83 | |
| 81 | 84 | while (nr_sects) { |
| 85 | + unsigned int req_sects; | |
| 86 | + sector_t end_sect; | |
| 87 | + | |
| 82 | 88 | bio = bio_alloc(gfp_mask, 1); |
| 83 | 89 | if (!bio) { |
| 84 | 90 | ret = -ENOMEM; |
| 85 | 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 | 108 | bio->bi_sector = sector; |
| 89 | 109 | bio->bi_end_io = bio_batch_end_io; |
| 90 | 110 | bio->bi_bdev = bdev; |
| 91 | 111 | bio->bi_private = &bb; |
| 92 | 112 | |
| 93 | − if (nr_sects > max_discard_sectors) { | |
| 94 | − bio->bi_size = max_discard_sectors << 9; | |
| 95 | − nr_sects -= max_discard_sectors; | |
| 96 | − sector += max_discard_sectors; | |
| 97 | − } else { | |
| 98 | − bio->bi_size = nr_sects << 9; | |
| 99 | − nr_sects = 0; | |
| 100 | − } | |
| 113 | + bio->bi_size = req_sects << 9; | |
| 114 | + nr_sects -= req_sects; | |
| 115 | + sector = end_sect; | |
| 101 | 116 | |
| 102 | 117 | atomic_inc(&bb.done); |
| 103 | 118 | submit_bio(type, bio); |
| @@ -110,6 +110,49 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio, · 109 unmodified lines | ||
| 110 | 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 | 157 | * map a request to scatterlist, return number of sg entries setup. Caller |
| 115 | 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, · 15 unmodified lines | ||
| 131 | 174 | bvprv = NULL; |
| 132 | 175 | sg = NULL; |
| 133 | 176 | rq_for_each_segment(bvec, rq, iter) { |
| 134 | − int nbytes = bvec->bv_len; | |
| 135 | − | |
| 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; | |
| 177 | + __blk_segment_map_sg(q, bvec, sglist, &bvprv, &sg, | |
| 178 | + &nsegs, &cluster); | |
| 169 | 179 | } /* segments in rq */ |
| 170 | 180 | |
| 171 | 181 | |
| @@ -199,6 +209,43 @@ new_segment: · 27 unmodified lines | ||
| 199 | 209 | } |
| 200 | 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 | 249 | static inline int ll_new_hw_segment(struct request_queue *q, |
| 203 | 250 | struct request *req, |
| 204 | 251 | struct bio *bio) |
| @@ -835,7 +835,7 @@ static void disk_seqf_stop(struct seq_file *seqf, void *v) · 834 unmodified lines | ||
| 835 | 835 | |
| 836 | 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 | 840 | p = disk_seqf_start(seqf, pos); |
| 841 | 841 | if (!IS_ERR_OR_NULL(p) && !*pos) |
| @@ -115,7 +115,7 @@ config SATA_SIL24 · 114 unmodified lines | ||
| 115 | 115 | If unsure, say N. |
| 116 | 116 | |
| 117 | 117 | config ATA_SFF |
| 118 | − bool "ATA SFF support" | |
| 118 | + bool "ATA SFF support (for legacy IDE and PATA)" | |
| 119 | 119 | default y |
| 120 | 120 | help |
| 121 | 121 | This option adds support for ATA controllers with SFF |
| @@ -256,6 +256,14 @@ static const struct pci_device_id ahci_pci_tbl[] = { · 255 unmodified lines | ||
| 256 | 256 | { PCI_VDEVICE(INTEL, 0x8c07), board_ahci }, /* Lynx Point RAID */ |
| 257 | 257 | { PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */ |
| 258 | 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 | 268 | /* JMicron 360/1/3/5/6, match class to avoid IDE function */ |
| 261 | 269 | { PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
| @@ -320,6 +320,7 @@ extern struct device_attribute *ahci_sdev_attrs[]; · 319 unmodified lines | ||
| 320 | 320 | extern struct ata_port_operations ahci_ops; |
| 321 | 321 | extern struct ata_port_operations ahci_pmp_retry_srst_ops; |
| 322 | 322 | |
| 323 | +unsigned int ahci_dev_classify(struct ata_port *ap); | |
| 323 | 324 | void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, |
| 324 | 325 | u32 opts); |
| 325 | 326 | void ahci_save_initial_config(struct device *dev, |
| @@ -329,6 +329,14 @@ static const struct pci_device_id piix_pci_tbl[] = { · 328 unmodified lines | ||
| 329 | 329 | { 0x8086, 0x8c08, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 330 | 330 | /* SATA Controller IDE (Lynx Point) */ |
| 331 | 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 | 340 | /* SATA Controller IDE (DH89xxCC) */ |
| 333 | 341 | { 0x8086, 0x2326, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 334 | 342 | { } /* terminate list */ |
| @@ -1139,7 +1139,7 @@ static void ahci_dev_config(struct ata_device *dev) · 1138 unmodified lines | ||
| 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 | 1144 | void __iomem *port_mmio = ahci_port_base(ap); |
| 1145 | 1145 | struct ata_taskfile tf; |
| @@ -1153,6 +1153,7 @@ static unsigned int ahci_dev_classify(struct ata_port *ap) · 7 unmodified lines | ||
| 1153 | 1153 | |
| 1154 | 1154 | return ata_dev_classify(&tf); |
| 1155 | 1155 | } |
| 1156 | +EXPORT_SYMBOL_GPL(ahci_dev_classify); | |
| 1156 | 1157 | |
| 1157 | 1158 | void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag, |
| 1158 | 1159 | u32 opts) |
| @@ -60,17 +60,7 @@ acpi_handle ata_ap_acpi_handle(struct ata_port *ap) · 59 unmodified lines | ||
| 60 | 60 | if (ap->flags & ATA_FLAG_ACPI_SATA) |
| 61 | 61 | return NULL; |
| 62 | 62 | |
| 63 | − /* | |
| 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); | |
| 63 | + return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), ap->port_no); | |
| 74 | 64 | } |
| 75 | 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) · 1024 unmodified lines | ||
| 1101 | 1091 | if (!*handle) |
| 1102 | 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 | 1097 | return 0; |
| 1105 | 1098 | } |
| 1106 | 1099 | |
| @@ -4062,7 +4062,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { · 4061 unmodified lines | ||
| 4062 | 4062 | { "_NEC DV5800A", NULL, ATA_HORKAGE_NODMA }, |
| 4063 | 4063 | { "SAMSUNG CD-ROM SN-124", "N001", ATA_HORKAGE_NODMA }, |
| 4064 | 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 | 4066 | /* Odd clown on sil3726/4726 PMPs */ |
| 4067 | 4067 | { "Config Disk", NULL, ATA_HORKAGE_DISABLE }, |
| 4068 | 4068 | |
| @@ -4128,6 +4128,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { · 59 unmodified lines | ||
| 4128 | 4128 | |
| 4129 | 4129 | /* Devices that do not need bridging limits applied */ |
| 4130 | 4130 | { "MTRON MSP-SATA*", NULL, ATA_HORKAGE_BRIDGE_OK, }, |
| 4131 | + { "BUFFALO HD-QSU2/R5", NULL, ATA_HORKAGE_BRIDGE_OK, }, | |
| 4131 | 4132 | |
| 4132 | 4133 | /* Devices which aren't very happy with higher link speeds */ |
| 4133 | 4134 | { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, }, |
| @@ -20,6 +20,7 @@ · 19 unmodified lines | ||
| 20 | 20 | #include <linux/delay.h> |
| 21 | 21 | #include <scsi/scsi_host.h> |
| 22 | 22 | #include <linux/libata.h> |
| 23 | +#include <linux/dmi.h> | |
| 23 | 24 | |
| 24 | 25 | #define DRV_NAME "pata_atiixp" |
| 25 | 26 | #define DRV_VERSION "0.4.6" |
| @@ -33,11 +34,26 @@ enum { · 7 unmodified lines | ||
| 33 | 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 | 49 | static int atiixp_cable_detect(struct ata_port *ap) |
| 37 | 50 | { |
| 38 | 51 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); |
| 39 | 52 | u8 udma; |
| 40 | 53 | |
| 54 | + if (dmi_check_system(attixp_cable_override_dmi_table)) | |
| 55 | + return ATA_CBL_PATA40_SHORT; | |
| 56 | + | |
| 41 | 57 | /* Hack from drivers/ide/pci. Really we want to know how to do the |
| 42 | 58 | raw detection not play follow the bios mode guess */ |
| 43 | 59 | pci_read_config_byte(pdev, ATIIXP_IDE_UDMA_MODE + ap->port_no, &udma); |
| @@ -250,7 +250,7 @@ int __init dma_declare_contiguous(struct device *dev, unsigned long size, · 249 unmodified lines | ||
| 250 | 250 | return -EINVAL; |
| 251 | 251 | |
| 252 | 252 | /* Sanitise input arguments */ |
| 253 | − alignment = PAGE_SIZE << max(MAX_ORDER, pageblock_order); | |
| 253 | + alignment = PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order); | |
| 254 | 254 | base = ALIGN(base, alignment); |
| 255 | 255 | size = ALIGN(size, alignment); |
| 256 | 256 | limit &= ~(alignment - 1); |
| @@ -889,6 +889,7 @@ struct bm_aio_ctx { · 888 unmodified lines | ||
| 889 | 889 | unsigned int done; |
| 890 | 890 | unsigned flags; |
| 891 | 891 | #define BM_AIO_COPY_PAGES 1 |
| 892 | +#define BM_WRITE_ALL_PAGES 2 | |
| 892 | 893 | int error; |
| 893 | 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 · 164 unmodified lines | ||
| 1059 | 1060 | if (lazy_writeout_upper_idx && i == lazy_writeout_upper_idx) |
| 1060 | 1061 | break; |
| 1061 | 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 | 1065 | dynamic_dev_dbg(DEV, "skipped bm write for idx %u\n", i); |
| 1064 | 1066 | continue; |
| 1065 | 1067 | } |
| @@ -1140,6 +1142,17 @@ int drbd_bm_write(struct drbd_conf *mdev) __must_hold(local) · 74 unmodified lines | ||
| 1140 | 1142 | return bm_rw(mdev, WRITE, 0, 0); |
| 1141 | 1143 | } |
| 1142 | 1144 | |
| 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 | + | |
| 1143 | 1156 | /** |
| 1144 | 1157 | * drbd_bm_lazy_write_out() - Write bitmap pages 0 to @upper_idx-1, if they have changed. |
| 1145 | 1158 | * @mdev: DRBD device. |
| @@ -1469,6 +1469,7 @@ extern int drbd_bm_e_weight(struct drbd_conf *mdev, unsigned long enr); · 1468 unmodified lines | ||
| 1469 | 1469 | extern int drbd_bm_write_page(struct drbd_conf *mdev, unsigned int idx) __must_hold(local); |
| 1470 | 1470 | extern int drbd_bm_read(struct drbd_conf *mdev) __must_hold(local); |
| 1471 | 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 | 1473 | extern int drbd_bm_write_copy_pages(struct drbd_conf *mdev) __must_hold(local); |
| 1473 | 1474 | extern unsigned long drbd_bm_ALe_set_all(struct drbd_conf *mdev, |
| 1474 | 1475 | unsigned long al_enr); |
| @@ -79,6 +79,7 @@ static int w_md_sync(struct drbd_conf *mdev, struct drbd_work *w, int unused); · 78 unmodified lines | ||
| 79 | 79 | static void md_sync_timer_fn(unsigned long data); |
| 80 | 80 | static int w_bitmap_io(struct drbd_conf *mdev, struct drbd_work *w, int unused); |
| 81 | 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 | 84 | MODULE_AUTHOR("Philipp Reisner <phil@linbit.com>, " |
| 84 | 85 | "Lars Ellenberg <lars@linbit.com>"); |
| @@ -432,19 +433,10 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) · 347 unmodified lines | ||
| 432 | 433 | |
| 433 | 434 | /* Actions operating on the disk state, also want to work on |
| 434 | 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: | |
| 444 | − case resend: | |
| 445 | − break; | |
| 446 | − default: | |
| 447 | − dev_err(DEV, "what = %d in _tl_restart()\n", what); | |
| 437 | + list_for_each_safe(le, tle, &mdev->barrier_acked_requests) { | |
| 438 | + req = list_entry(le, struct drbd_request, tl_requests); | |
| 439 | + _req_mod(req, what); | |
| 448 | 440 | } |
| 449 | 441 | } |
| 450 | 442 | |
| @@ -458,12 +450,17 @@ static void _tl_restart(struct drbd_conf *mdev, enum drbd_req_event what) · 7 unmodified lines | ||
| 458 | 450 | * receiver thread and the worker thread. |
| 459 | 451 | */ |
| 460 | 452 | void tl_clear(struct drbd_conf *mdev) |
| 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) | |
| 461 | 460 | { |
| 462 | 461 | struct list_head *le, *tle; |
| 463 | 462 | struct drbd_request *r; |
| 464 | 463 | |
| 465 | − spin_lock_irq(&mdev->req_lock); | |
| 466 | − | |
| 467 | 464 | _tl_restart(mdev, connection_lost_while_pending); |
| 468 | 465 | |
| 469 | 466 | /* we expect this list to be empty. */ |
| @@ -482,7 +479,6 @@ void tl_clear(struct drbd_conf *mdev) · 12 unmodified lines | ||
| 482 | 479 | |
| 483 | 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 | 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, · 987 unmodified lines | ||
| 1476 | 1472 | if (ns.susp_fen) { |
| 1477 | 1473 | /* case1: The outdate peer handler is successful: */ |
| 1478 | 1474 | if (os.pdsk > D_OUTDATED && ns.pdsk <= D_OUTDATED) { |
| 1479 | − tl_clear(mdev); | |
| 1480 | 1475 | if (test_bit(NEW_CUR_UUID, &mdev->flags)) { |
| 1481 | 1476 | drbd_uuid_new_current(mdev); |
| 1482 | 1477 | clear_bit(NEW_CUR_UUID, &mdev->flags); |
| 1483 | 1478 | } |
| 1484 | 1479 | spin_lock_irq(&mdev->req_lock); |
| 1480 | + _tl_clear(mdev); | |
| 1485 | 1481 | _drbd_set_state(_NS(mdev, susp_fen, 0), CS_VERBOSE, NULL); |
| 1486 | 1482 | spin_unlock_irq(&mdev->req_lock); |
| 1487 | 1483 | } |
| @@ -674,8 +674,8 @@ enum determine_dev_size drbd_determine_dev_size(struct drbd_conf *mdev, enum dds · 673 unmodified lines | ||
| 674 | 674 | la_size_changed && md_moved ? "size changed and md moved" : |
| 675 | 675 | la_size_changed ? "size changed" : "md moved"); |
| 676 | 676 | /* next line implicitly does drbd_suspend_io()+drbd_resume_io() */ |
| 677 | − err = drbd_bitmap_io(mdev, &drbd_bm_write, | |
| 678 | − "size changed", BM_LOCKED_MASK); | |
| 677 | + err = drbd_bitmap_io(mdev, md_moved ? &drbd_bm_write_all : &drbd_bm_write, | |
| 678 | + "size changed", BM_LOCKED_MASK); | |
| 679 | 679 | if (err) { |
| 680 | 680 | rv = dev_size_error; |
| 681 | 681 | goto out; |
| @@ -695,6 +695,12 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what, · 694 unmodified lines | ||
| 695 | 695 | break; |
| 696 | 696 | |
| 697 | 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 | 704 | /* If RQ_NET_OK is already set, we got a P_WRITE_ACK or P_RECV_ACK |
| 699 | 705 | before the connection loss (B&C only); only P_BARRIER_ACK was missing. |
| 700 | 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 · 133 unmodified lines | ||
| 834 | 840 | req->private_bio = NULL; |
| 835 | 841 | } |
| 836 | 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 | 852 | } else { |
| 839 | 853 | /* READ || READA */ |
| 840 | 854 | if (local) { |
| @@ -870,8 +884,11 @@ static int drbd_make_request_common(struct drbd_conf *mdev, struct bio *bio, uns · 29 unmodified lines | ||
| 870 | 884 | * extent. This waits for any resync activity in the corresponding |
| 871 | 885 | * resync extent to finish, and, if necessary, pulls in the target |
| 872 | 886 | * extent into the activity log, which involves further disk io because |
| 873 | − * of transactional on-disk meta data updates. */ | |
| 874 | − if (rw == WRITE && local && !test_bit(AL_SUSPENDED, &mdev->flags)) { | |
| 887 | + * of transactional on-disk meta data updates. | |
| 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 | 892 | req->rq_state |= RQ_IN_ACT_LOG; |
| 876 | 893 | drbd_al_begin_io(mdev, sector); |
| 877 | 894 | } |
| @@ -994,7 +1011,10 @@ allocate_barrier: · 116 unmodified lines | ||
| 994 | 1011 | if (rw == WRITE && _req_conflicts(req)) |
| 995 | 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 | 1019 | /* NOTE remote first: to get the concurrent write detection right, |
| 1000 | 1020 | * we must register the request before start of local IO. */ |
| @@ -1014,6 +1034,14 @@ allocate_barrier: · 13 unmodified lines | ||
| 1014 | 1034 | mdev->net_conf->on_congestion != OC_BLOCK && mdev->agreed_pro_version >= 96) |
| 1015 | 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 | 1045 | spin_unlock_irq(&mdev->req_lock); |
| 1018 | 1046 | kfree(b); /* if someone else has beaten us to it... */ |
| 1019 | 1047 | |
| @@ -218,7 +218,7 @@ static int __cpuinit omap_cpu_init(struct cpufreq_policy *policy) · 217 unmodified lines | ||
| 218 | 218 | |
| 219 | 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 | 222 | result = opp_init_cpufreq_table(mpu_dev, &freq_table); |
| 223 | 223 | |
| 224 | 224 | if (result) { |
| @@ -227,6 +227,8 @@ static int __cpuinit omap_cpu_init(struct cpufreq_policy *policy) · 2 unmodified lines | ||
| 227 | 227 | goto fail_ck; |
| 228 | 228 | } |
| 229 | 229 | |
| 230 | + atomic_inc_return(&freq_table_users); | |
| 231 | + | |
| 230 | 232 | result = cpufreq_frequency_table_cpuinfo(policy, freq_table); |
| 231 | 233 | if (result) |
| 232 | 234 | goto fail_table; |
| @@ -63,7 +63,7 @@ static void caam_jr_dequeue(unsigned long devarg) · 62 unmodified lines | ||
| 63 | 63 | |
| 64 | 64 | head = ACCESS_ONCE(jrp->head); |
| 65 | 65 | |
| 66 | − spin_lock_bh(&jrp->outlock); | |
| 66 | + spin_lock(&jrp->outlock); | |
| 67 | 67 | |
| 68 | 68 | sw_idx = tail = jrp->tail; |
| 69 | 69 | hw_idx = jrp->out_ring_read_index; |
| @@ -115,7 +115,7 @@ static void caam_jr_dequeue(unsigned long devarg) · 45 unmodified lines | ||
| 115 | 115 | jrp->tail = tail; |
| 116 | 116 | } |
| 117 | 117 | |
| 118 | − spin_unlock_bh(&jrp->outlock); | |
| 118 | + spin_unlock(&jrp->outlock); | |
| 119 | 119 | |
| 120 | 120 | /* Finally, execute user's callback */ |
| 121 | 121 | usercall(dev, userdesc, userstatus, userarg); |
| @@ -236,14 +236,14 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, · 114 unmodified lines | ||
| 236 | 236 | return -EIO; |
| 237 | 237 | } |
| 238 | 238 | |
| 239 | − spin_lock(&jrp->inplock); | |
| 239 | + spin_lock_bh(&jrp->inplock); | |
| 240 | 240 | |
| 241 | 241 | head = jrp->head; |
| 242 | 242 | tail = ACCESS_ONCE(jrp->tail); |
| 243 | 243 | |
| 244 | 244 | if (!rd_reg32(&jrp->rregs->inpring_avail) || |
| 245 | 245 | CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { |
| 246 | − spin_unlock(&jrp->inplock); | |
| 246 | + spin_unlock_bh(&jrp->inplock); | |
| 247 | 247 | dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); |
| 248 | 248 | return -EBUSY; |
| 249 | 249 | } |
| @@ -265,7 +265,7 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, · 15 unmodified lines | ||
| 265 | 265 | |
| 266 | 266 | wr_reg32(&jrp->rregs->inpring_jobadd, 1); |
| 267 | 267 | |
| 268 | − spin_unlock(&jrp->inplock); | |
| 268 | + spin_unlock_bh(&jrp->inplock); | |
| 269 | 269 | |
| 270 | 270 | return 0; |
| 271 | 271 | } |
| @@ -821,8 +821,8 @@ static int hifn_register_rng(struct hifn_device *dev) · 820 unmodified lines | ||
| 821 | 821 | /* |
| 822 | 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) * | |
| 825 | − 256; | |
| 824 | + dev->rng_wait_time = DIV_ROUND_UP_ULL(NSEC_PER_SEC, | |
| 825 | + dev->pk_clk_freq) * 256; | |
| 826 | 826 | |
| 827 | 827 | dev->rng.name = dev->name; |
| 828 | 828 | dev->rng.data_present = hifn_rng_data_present, |
| @@ -294,7 +294,7 @@ config GPIO_MAX732X_IRQ · 293 unmodified lines | ||
| 294 | 294 | |
| 295 | 295 | config GPIO_MC9S08DZ60 |
| 296 | 296 | bool "MX35 3DS BOARD MC9S08DZ60 GPIO functions" |
| 297 | − depends on I2C && MACH_MX35_3DS | |
| 297 | + depends on I2C=y && MACH_MX35_3DS | |
| 298 | 298 | help |
| 299 | 299 | Select this to enable the MC9S08DZ60 GPIO driver |
| 300 | 300 | |
| @@ -247,9 +247,9 @@ static int __devinit em_gio_irq_domain_init(struct em_gio_priv *p) · 246 unmodified lines | ||
| 247 | 247 | |
| 248 | 248 | p->irq_base = irq_alloc_descs(pdata->irq_base, 0, |
| 249 | 249 | pdata->number_of_pins, numa_node_id()); |
| 250 | − if (IS_ERR_VALUE(p->irq_base)) { | |
| 250 | + if (p->irq_base < 0) { | |
| 251 | 251 | dev_err(&pdev->dev, "cannot get irq_desc\n"); |
| 252 | − return -ENXIO; | |
| 252 | + return p->irq_base; | |
| 253 | 253 | } |
| 254 | 254 | pr_debug("gio: hw base = %d, nr = %d, sw base = %d\n", |
| 255 | 255 | pdata->gpio_base, pdata->number_of_pins, p->irq_base); |
| @@ -170,6 +170,7 @@ static int __devinit rdc321x_gpio_probe(struct platform_device *pdev) · 169 unmodified lines | ||
| 170 | 170 | rdc321x_gpio_dev->reg2_data_base = r->start + 0x4; |
| 171 | 171 | |
| 172 | 172 | rdc321x_gpio_dev->chip.label = "rdc321x-gpio"; |
| 173 | + rdc321x_gpio_dev->chip.owner = THIS_MODULE; | |
| 173 | 174 | rdc321x_gpio_dev->chip.direction_input = rdc_gpio_direction_input; |
| 174 | 175 | rdc321x_gpio_dev->chip.direction_output = rdc_gpio_config; |
| 175 | 176 | rdc321x_gpio_dev->chip.get = rdc_gpio_get_value; |
| @@ -82,7 +82,7 @@ int of_get_named_gpio_flags(struct device_node *np, const char *propname, · 81 unmodified lines | ||
| 82 | 82 | gpiochip_find(&gg_data, of_gpiochip_find_and_xlate); |
| 83 | 83 | |
| 84 | 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 | 86 | return gg_data.out_gpio; |
| 87 | 87 | } |
| 88 | 88 | EXPORT_SYMBOL(of_get_named_gpio_flags); |
| @@ -1981,7 +1981,7 @@ int drm_mode_cursor_ioctl(struct drm_device *dev, · 1980 unmodified lines | ||
| 1981 | 1981 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) |
| 1982 | 1982 | return -EINVAL; |
| 1983 | 1983 | |
| 1984 | − if (!req->flags) | |
| 1984 | + if (!req->flags || (~DRM_MODE_CURSOR_FLAGS & req->flags)) | |
| 1985 | 1985 | return -EINVAL; |
| 1986 | 1986 | |
| 1987 | 1987 | mutex_lock(&dev->mode_config.mutex); |
| @@ -87,6 +87,9 @@ static struct edid_quirk { · 86 unmodified lines | ||
| 87 | 87 | int product_id; |
| 88 | 88 | u32 quirks; |
| 89 | 89 | } edid_quirk_list[] = { |
| 90 | + /* ASUS VW222S */ | |
| 91 | + { "ACI", 0x22a2, EDID_QUIRK_FORCE_REDUCED_BLANKING }, | |
| 92 | + | |
| 90 | 93 | /* Acer AL1706 */ |
| 91 | 94 | { "ACR", 44358, EDID_QUIRK_PREFER_LARGE_60 }, |
| 92 | 95 | /* Acer F51 */ |
| @@ -1362,6 +1362,9 @@ void psb_intel_crtc_init(struct drm_device *dev, int pipe, · 1361 unmodified lines | ||
| 1362 | 1362 | (struct drm_connector **) (psb_intel_crtc + 1); |
| 1363 | 1363 | psb_intel_crtc->mode_set.num_connectors = 0; |
| 1364 | 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 | 1370 | int psb_intel_get_pipe_from_crtc_id(struct drm_device *dev, void *data, |
| @@ -72,7 +72,7 @@ int i915_gem_init_aliasing_ppgtt(struct drm_device *dev) · 71 unmodified lines | ||
| 72 | 72 | /* ppgtt PDEs reside in the global gtt pagetable, which has 512*1024 |
| 73 | 73 | * entries. For aliasing ppgtt support we just steal them at the end for |
| 74 | 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 | 77 | ppgtt = kzalloc(sizeof(*ppgtt), GFP_KERNEL); |
| 78 | 78 | if (!ppgtt) |
| @@ -1384,7 +1384,7 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, · 1383 unmodified lines | ||
| 1384 | 1384 | enum pipe pipe, int reg) |
| 1385 | 1385 | { |
| 1386 | 1386 | u32 val = I915_READ(reg); |
| 1387 | − WARN(hdmi_pipe_enabled(dev_priv, val, pipe), | |
| 1387 | + WARN(hdmi_pipe_enabled(dev_priv, pipe, val), | |
| 1388 | 1388 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1389 | 1389 | reg, pipe_name(pipe)); |
| 1390 | 1390 | |
| @@ -1404,13 +1404,13 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv, · 13 unmodified lines | ||
| 1404 | 1404 | |
| 1405 | 1405 | reg = PCH_ADPA; |
| 1406 | 1406 | val = I915_READ(reg); |
| 1407 | − WARN(adpa_pipe_enabled(dev_priv, val, pipe), | |
| 1407 | + WARN(adpa_pipe_enabled(dev_priv, pipe, val), | |
| 1408 | 1408 | "PCH VGA enabled on transcoder %c, should be disabled\n", |
| 1409 | 1409 | pipe_name(pipe)); |
| 1410 | 1410 | |
| 1411 | 1411 | reg = PCH_LVDS; |
| 1412 | 1412 | val = I915_READ(reg); |
| 1413 | − WARN(lvds_pipe_enabled(dev_priv, val, pipe), | |
| 1413 | + WARN(lvds_pipe_enabled(dev_priv, pipe, val), | |
| 1414 | 1414 | "PCH LVDS enabled on transcoder %c, should be disabled\n", |
| 1415 | 1415 | pipe_name(pipe)); |
| 1416 | 1416 | |
| @@ -1872,7 +1872,7 @@ static void disable_pch_hdmi(struct drm_i915_private *dev_priv, · 455 unmodified lines | ||
| 1872 | 1872 | enum pipe pipe, int reg) |
| 1873 | 1873 | { |
| 1874 | 1874 | u32 val = I915_READ(reg); |
| 1875 | − if (hdmi_pipe_enabled(dev_priv, val, pipe)) { | |
| 1875 | + if (hdmi_pipe_enabled(dev_priv, pipe, val)) { | |
| 1876 | 1876 | DRM_DEBUG_KMS("Disabling pch HDMI %x on pipe %d\n", |
| 1877 | 1877 | reg, pipe); |
| 1878 | 1878 | I915_WRITE(reg, val & ~PORT_ENABLE); |
| @@ -1894,12 +1894,12 @@ static void intel_disable_pch_ports(struct drm_i915_private *dev_priv, · 15 unmodified lines | ||
| 1894 | 1894 | |
| 1895 | 1895 | reg = PCH_ADPA; |
| 1896 | 1896 | val = I915_READ(reg); |
| 1897 | − if (adpa_pipe_enabled(dev_priv, val, pipe)) | |
| 1897 | + if (adpa_pipe_enabled(dev_priv, pipe, val)) | |
| 1898 | 1898 | I915_WRITE(reg, val & ~ADPA_DAC_ENABLE); |
| 1899 | 1899 | |
| 1900 | 1900 | reg = PCH_LVDS; |
| 1901 | 1901 | val = I915_READ(reg); |
| 1902 | − if (lvds_pipe_enabled(dev_priv, val, pipe)) { | |
| 1902 | + if (lvds_pipe_enabled(dev_priv, pipe, val)) { | |
| 1903 | 1903 | DRM_DEBUG_KMS("disable lvds on pipe %d val 0x%08x\n", pipe, val); |
| 1904 | 1904 | I915_WRITE(reg, val & ~LVDS_PORT_EN); |
| 1905 | 1905 | POSTING_READ(reg); |
| @@ -780,6 +780,14 @@ static const struct dmi_system_id intel_no_lvds[] = { · 779 unmodified lines | ||
| 780 | 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 | 792 | { } /* terminating entry */ |
| 785 | 793 | }; |
| @@ -60,11 +60,11 @@ ivb_update_plane(struct drm_plane *plane, struct drm_framebuffer *fb, · 59 unmodified lines | ||
| 60 | 60 | |
| 61 | 61 | switch (fb->pixel_format) { |
| 62 | 62 | case DRM_FORMAT_XBGR8888: |
| 63 | − sprctl |= SPRITE_FORMAT_RGBX888; | |
| 63 | + sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX; | |
| 64 | 64 | pixel_size = 4; |
| 65 | 65 | break; |
| 66 | 66 | case DRM_FORMAT_XRGB8888: |
| 67 | − sprctl |= SPRITE_FORMAT_RGBX888 | SPRITE_RGB_ORDER_RGBX; | |
| 67 | + sprctl |= SPRITE_FORMAT_RGBX888; | |
| 68 | 68 | pixel_size = 4; |
| 69 | 69 | break; |
| 70 | 70 | case DRM_FORMAT_YUYV: |
| @@ -736,9 +736,11 @@ nouveau_card_init(struct drm_device *dev) · 735 unmodified lines | ||
| 736 | 736 | } |
| 737 | 737 | break; |
| 738 | 738 | case NV_C0: |
| 739 | − nvc0_copy_create(dev, 1); | |
| 739 | + if (!(nv_rd32(dev, 0x022500) & 0x00000200)) | |
| 740 | + nvc0_copy_create(dev, 1); | |
| 740 | 741 | case NV_D0: |
| 741 | − nvc0_copy_create(dev, 0); | |
| 742 | + if (!(nv_rd32(dev, 0x022500) & 0x00000100)) | |
| 743 | + nvc0_copy_create(dev, 0); | |
| 742 | 744 | break; |
| 743 | 745 | default: |
| 744 | 746 | break; |
| @@ -258,7 +258,6 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) · 257 unmodified lines | ||
| 258 | 258 | radeon_crtc->enabled = true; |
| 259 | 259 | /* adjust pm to dpms changes BEFORE enabling crtcs */ |
| 260 | 260 | radeon_pm_compute_clocks(rdev); |
| 261 | − /* disable crtc pair power gating before programming */ | |
| 262 | 261 | if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) |
| 263 | 262 | atombios_powergate_crtc(crtc, ATOM_DISABLE); |
| 264 | 263 | atombios_enable_crtc(crtc, ATOM_ENABLE); |
| @@ -278,25 +277,8 @@ void atombios_crtc_dpms(struct drm_crtc *crtc, int mode) · 13 unmodified lines | ||
| 278 | 277 | atombios_enable_crtc_memreq(crtc, ATOM_DISABLE); |
| 279 | 278 | atombios_enable_crtc(crtc, ATOM_DISABLE); |
| 280 | 279 | radeon_crtc->enabled = false; |
| 281 | − /* power gating is per-pair */ | |
| 282 | − if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) { | |
| 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 | − } | |
| 280 | + if (ASIC_IS_DCE6(rdev) && !radeon_crtc->in_mode_set) | |
| 281 | + atombios_powergate_crtc(crtc, ATOM_ENABLE); | |
| 300 | 282 | /* adjust pm to dpms changes AFTER disabling crtcs */ |
| 301 | 283 | radeon_pm_compute_clocks(rdev); |
| 302 | 284 | break; |
| @@ -1682,9 +1664,22 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) · 1379 unmodified lines | ||
| 1682 | 1664 | struct drm_device *dev = crtc->dev; |
| 1683 | 1665 | struct radeon_device *rdev = dev->dev_private; |
| 1684 | 1666 | struct radeon_atom_ss ss; |
| 1667 | + int i; | |
| 1685 | 1668 | |
| 1686 | 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 | 1683 | switch (radeon_crtc->pll_id) { |
| 1689 | 1684 | case ATOM_PPLL1: |
| 1690 | 1685 | case ATOM_PPLL2: |
| @@ -1701,6 +1696,7 @@ static void atombios_crtc_disable(struct drm_crtc *crtc) · 10 unmodified lines | ||
| 1701 | 1696 | default: |
| 1702 | 1697 | break; |
| 1703 | 1698 | } |
| 1699 | +done: | |
| 1704 | 1700 | radeon_crtc->pll_id = -1; |
| 1705 | 1701 | } |
| 1706 | 1702 | |
| @@ -577,30 +577,25 @@ int radeon_dp_get_panel_mode(struct drm_encoder *encoder, · 576 unmodified lines | ||
| 577 | 577 | struct radeon_device *rdev = dev->dev_private; |
| 578 | 578 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 579 | 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 | 583 | if (!ASIC_IS_DCE4(rdev)) |
| 582 | 584 | return panel_mode; |
| 583 | 585 | |
| 584 | − if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | |
| 585 | − ENCODER_OBJECT_ID_NUTMEG) | |
| 586 | − panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; | |
| 587 | − else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == | |
| 588 | − ENCODER_OBJECT_ID_TRAVIS) { | |
| 589 | − u8 id[6]; | |
| 590 | − int i; | |
| 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) | |
| 586 | + if (dp_bridge != ENCODER_OBJECT_ID_NONE) { | |
| 587 | + /* DP bridge chips */ | |
| 588 | + tmp = radeon_read_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_CAP); | |
| 589 | + if (tmp & 1) | |
| 590 | + panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | |
| 591 | + else if ((dp_bridge == ENCODER_OBJECT_ID_NUTMEG) || | |
| 592 | + (dp_bridge == ENCODER_OBJECT_ID_TRAVIS)) | |
| 599 | 593 | panel_mode = DP_PANEL_MODE_INTERNAL_DP1_MODE; |
| 600 | 594 | else |
| 601 | − panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; | |
| 595 | + panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | |
| 602 | 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 | 599 | if (tmp & 1) |
| 605 | 600 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
| 606 | 601 | } |
| @@ -1379,6 +1379,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) · 1378 unmodified lines | ||
| 1379 | 1379 | struct drm_device *dev = encoder->dev; |
| 1380 | 1380 | struct radeon_device *rdev = dev->dev_private; |
| 1381 | 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 | 1384 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1383 | 1385 | struct radeon_connector *radeon_connector = NULL; |
| 1384 | 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) · 5 unmodified lines | ||
| 1390 | 1392 | |
| 1391 | 1393 | switch (mode) { |
| 1392 | 1394 | case DRM_MODE_DPMS_ON: |
| 1393 | − /* some early dce3.2 boards have a bug in their transmitter control table */ | |
| 1394 | − if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || | |
| 1395 | − ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | |
| 1396 | − if (ASIC_IS_DCE6(rdev)) { | |
| 1397 | − /* It seems we need to call ATOM_ENCODER_CMD_SETUP again | |
| 1398 | − * before reenabling encoder on DPMS ON, otherwise we never | |
| 1399 | − * get picture | |
| 1400 | − */ | |
| 1401 | − atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); | |
| 1395 | + if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | |
| 1396 | + if (!connector) | |
| 1397 | + dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; | |
| 1398 | + else | |
| 1399 | + dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); | |
| 1400 | + | |
| 1401 | + /* setup and enable the encoder */ | |
| 1402 | + 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 | 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 | 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 | 1427 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
| 1408 | 1428 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
| @@ -1420,10 +1440,19 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) · 11 unmodified lines | ||
| 1420 | 1440 | case DRM_MODE_DPMS_STANDBY: |
| 1421 | 1441 | case DRM_MODE_DPMS_SUSPEND: |
| 1422 | 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 | 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 | 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 | 1456 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
| 1428 | 1457 | if (ASIC_IS_DCE4(rdev)) |
| 1429 | 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) · 310 unmodified lines | ||
| 1740 | 1769 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); |
| 1741 | 1770 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1742 | 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 | 1773 | uint32_t dig_enc_in_use = 0; |
| 1745 | 1774 | |
| 1746 | − /* DCE4/5 */ | |
| 1747 | − if (ASIC_IS_DCE4(rdev)) { | |
| 1748 | − dig = radeon_encoder->enc_priv; | |
| 1749 | − if (ASIC_IS_DCE41(rdev)) { | |
| 1775 | + if (ASIC_IS_DCE6(rdev)) { | |
| 1776 | + /* DCE6 */ | |
| 1777 | + switch (radeon_encoder->encoder_id) { | |
| 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 | 1800 | /* ontario follows DCE4 */ |
| 1751 | 1801 | if (rdev->family == CHIP_PALM) { |
| 1752 | 1802 | if (dig->linkb) |
| @@ -1848,10 +1898,12 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, · 95 unmodified lines | ||
| 1848 | 1898 | struct drm_device *dev = encoder->dev; |
| 1849 | 1899 | struct radeon_device *rdev = dev->dev_private; |
| 1850 | 1900 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1851 | − struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); | |
| 1852 | 1901 | |
| 1853 | 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 | 1907 | if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) { |
| 1856 | 1908 | if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) |
| 1857 | 1909 | atombios_yuv_setup(encoder, true); |
| @@ -1870,38 +1922,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, · 12 unmodified lines | ||
| 1870 | 1922 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
| 1871 | 1923 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
| 1872 | 1924 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 1873 | − if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { | |
| 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 | − } | |
| 1925 | + /* handled in dpms */ | |
| 1905 | 1926 | break; |
| 1906 | 1927 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
| 1907 | 1928 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
| @@ -1922,14 +1943,6 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, · 14 unmodified lines | ||
| 1922 | 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 | 1946 | atombios_apply_encoder_quirks(encoder, adjusted_mode); |
| 1934 | 1947 | |
| 1935 | 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) · 180 unmodified lines | ||
| 2116 | 2129 | } |
| 2117 | 2130 | |
| 2118 | 2131 | radeon_atom_output_lock(encoder, true); |
| 2119 | − radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); | |
| 2120 | 2132 | |
| 2121 | 2133 | if (connector) { |
| 2122 | 2134 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| @@ -2137,6 +2149,7 @@ static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) · 14 unmodified lines | ||
| 2137 | 2149 | |
| 2138 | 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 | 2153 | radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON); |
| 2141 | 2154 | radeon_atom_output_lock(encoder, false); |
| 2142 | 2155 | } |
| @@ -2177,14 +2190,7 @@ static void radeon_atom_encoder_disable(struct drm_encoder *encoder) · 34 unmodified lines | ||
| 2177 | 2190 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
| 2178 | 2191 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
| 2179 | 2192 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 2180 | − if (ASIC_IS_DCE4(rdev)) | |
| 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 | − } | |
| 2193 | + /* handled in dpms */ | |
| 2188 | 2194 | break; |
| 2189 | 2195 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
| 2190 | 2196 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
| @@ -63,6 +63,7 @@ struct r600_cs_track { · 62 unmodified lines | ||
| 63 | 63 | u32 cb_color_size_idx[8]; /* unused */ |
| 64 | 64 | u32 cb_target_mask; |
| 65 | 65 | u32 cb_shader_mask; /* unused */ |
| 66 | + bool is_resolve; | |
| 66 | 67 | u32 cb_color_size[8]; |
| 67 | 68 | u32 vgt_strmout_en; |
| 68 | 69 | u32 vgt_strmout_buffer_en; |
| @@ -315,7 +316,15 @@ static void r600_cs_track_init(struct r600_cs_track *track) · 246 unmodified lines | ||
| 315 | 316 | track->cb_color_bo[i] = NULL; |
| 316 | 317 | track->cb_color_bo_offset[i] = 0xFFFFFFFF; |
| 317 | 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 | 328 | track->cb_target_mask = 0xFFFFFFFF; |
| 320 | 329 | track->cb_shader_mask = 0xFFFFFFFF; |
| 321 | 330 | track->cb_dirty = true; |
| @@ -352,6 +361,8 @@ static int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) · 30 unmodified lines | ||
| 352 | 361 | volatile u32 *ib = p->ib.ptr; |
| 353 | 362 | unsigned array_mode; |
| 354 | 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 | 367 | size = radeon_bo_size(track->cb_color_bo[i]) - track->cb_color_bo_offset[i]; |
| 357 | 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) · 17 unmodified lines | ||
| 375 | 386 | array_check.group_size = track->group_size; |
| 376 | 387 | array_check.nbanks = track->nbanks; |
| 377 | 388 | array_check.npipes = track->npipes; |
| 378 | − array_check.nsamples = track->nsamples; | |
| 389 | + array_check.nsamples = nsamples; | |
| 379 | 390 | array_check.blocksize = r600_fmt_get_blocksize(format); |
| 380 | 391 | if (r600_get_array_mode_alignment(&array_check, |
| 381 | 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) · 39 unmodified lines | ||
| 421 | 432 | |
| 422 | 433 | /* check offset */ |
| 423 | 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 | 436 | switch (array_mode) { |
| 426 | 437 | default: |
| 427 | 438 | case V_0280A0_ARRAY_LINEAR_GENERAL: |
| @@ -792,6 +803,12 @@ static int r600_cs_track_check(struct radeon_cs_parser *p) · 364 unmodified lines | ||
| 792 | 803 | */ |
| 793 | 804 | if (track->cb_dirty) { |
| 794 | 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 | 812 | for (i = 0; i < 8; i++) { |
| 796 | 813 | if ((tmp >> (i * 4)) & 0xF) { |
| 797 | 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) · 483 unmodified lines | ||
| 1281 | 1298 | track->nsamples = 1 << tmp; |
| 1282 | 1299 | track->cb_dirty = true; |
| 1283 | 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 | 1306 | case R_0280A0_CB_COLOR0_INFO: |
| 1285 | 1307 | case R_0280A4_CB_COLOR1_INFO: |
| 1286 | 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) · 129 unmodified lines | ||
| 1416 | 1438 | case R_028118_CB_COLOR6_MASK: |
| 1417 | 1439 | case R_02811C_CB_COLOR7_MASK: |
| 1418 | 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 | 1442 | if (G_0280A0_TILE_MODE(track->cb_color_info[tmp])) { |
| 1421 | 1443 | track->cb_dirty = true; |
| 1422 | 1444 | } |
| @@ -66,6 +66,14 @@ · 65 unmodified lines | ||
| 66 | 66 | #define CC_RB_BACKEND_DISABLE 0x98F4 |
| 67 | 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 | 77 | #define CB_COLOR0_BASE 0x28040 |
| 70 | 78 | #define CB_COLOR1_BASE 0x28044 |
| 71 | 79 | #define CB_COLOR2_BASE 0x28048 |
| @@ -1051,7 +1051,7 @@ int radeon_device_init(struct radeon_device *rdev, · 1050 unmodified lines | ||
| 1051 | 1051 | if (rdev->flags & RADEON_IS_AGP) |
| 1052 | 1052 | rdev->need_dma32 = true; |
| 1053 | 1053 | if ((rdev->flags & RADEON_IS_PCI) && |
| 1054 | − (rdev->family < CHIP_RS400)) | |
| 1054 | + (rdev->family <= CHIP_RS740)) | |
| 1055 | 1055 | rdev->need_dma32 = true; |
| 1056 | 1056 | |
| 1057 | 1057 | dma_bits = rdev->need_dma32 ? 32 : 40; |
| @@ -1346,12 +1346,15 @@ retry: · 288 unmodified lines | ||
| 1346 | 1346 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { |
| 1347 | 1347 | radeon_ring_restore(rdev, &rdev->ring[i], |
| 1348 | 1348 | ring_sizes[i], ring_data[i]); |
| 1349 | + ring_sizes[i] = 0; | |
| 1350 | + ring_data[i] = NULL; | |
| 1349 | 1351 | } |
| 1350 | 1352 | |
| 1351 | 1353 | r = radeon_ib_ring_tests(rdev); |
| 1352 | 1354 | if (r) { |
| 1353 | 1355 | dev_err(rdev->dev, "ib ring test failed (%d).\n", r); |
| 1354 | 1356 | if (saved) { |
| 1357 | + saved = false; | |
| 1355 | 1358 | radeon_suspend(rdev); |
| 1356 | 1359 | goto retry; |
| 1357 | 1360 | } |
| @@ -63,9 +63,10 @@ · 62 unmodified lines | ||
| 63 | 63 | * 2.19.0 - r600-eg: MSAA textures |
| 64 | 64 | * 2.20.0 - r600-si: RADEON_INFO_TIMESTAMP query |
| 65 | 65 | * 2.21.0 - r600-r700: FMASK and CMASK |
| 66 | + * 2.22.0 - r600 only: RESOLVE_BOX allowed | |
| 66 | 67 | */ |
| 67 | 68 | #define KMS_DRIVER_MAJOR 2 |
| 68 | −#define KMS_DRIVER_MINOR 21 | |
| 69 | +#define KMS_DRIVER_MINOR 22 | |
| 69 | 70 | #define KMS_DRIVER_PATCHLEVEL 0 |
| 70 | 71 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); |
| 71 | 72 | int radeon_driver_unload_kms(struct drm_device *dev); |
| @@ -744,7 +744,6 @@ r600 0x9400 · 743 unmodified lines | ||
| 744 | 744 | 0x00028C38 CB_CLRCMP_DST |
| 745 | 745 | 0x00028C3C CB_CLRCMP_MSK |
| 746 | 746 | 0x00028C34 CB_CLRCMP_SRC |
| 747 | −0x00028808 CB_COLOR_CONTROL | |
| 748 | 747 | 0x0002842C CB_FOG_BLUE |
| 749 | 748 | 0x00028428 CB_FOG_GREEN |
| 750 | 749 | 0x00028424 CB_FOG_RED |
| @@ -996,7 +996,8 @@ static void hid_process_event(struct hid_device *hid, struct hid_field *field, · 995 unmodified lines | ||
| 996 | 996 | struct hid_driver *hdrv = hid->driver; |
| 997 | 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 | 1002 | if (hdrv && hdrv->event && hid_match_usage(hid, usage)) { |
| 1002 | 1003 | ret = hdrv->event(hid, field, usage, value); |
| @@ -1558,7 +1559,9 @@ static const struct hid_device_id hid_have_special_driver[] = { · 555 unmodified lines | ||
| 1558 | 1559 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
| 1559 | 1560 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
| 1560 | 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 | 1565 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, |
| 1563 | 1566 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER) }, |
| 1564 | 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[] = { · 59 unmodified lines | ||
| 1624 | 1627 | { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) }, |
| 1625 | 1628 | { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) }, |
| 1626 | 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 | 1630 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_KONE) }, |
| 1629 | 1631 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ARVO) }, |
| 1630 | 1632 | { HID_USB_DEVICE(USB_VENDOR_ID_ROCCAT, USB_DEVICE_ID_ROCCAT_ISKU) }, |
| @@ -439,7 +439,7 @@ static int logi_dj_recv_query_paired_devices(struct dj_receiver_dev *djrcv_dev) · 438 unmodified lines | ||
| 439 | 439 | struct dj_report *dj_report; |
| 440 | 440 | int retval; |
| 441 | 441 | |
| 442 | − dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL); | |
| 442 | + dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); | |
| 443 | 443 | if (!dj_report) |
| 444 | 444 | return -ENOMEM; |
| 445 | 445 | dj_report->report_id = REPORT_ID_DJ_SHORT; |
| @@ -456,7 +456,7 @@ static int logi_dj_recv_switch_to_dj_mode(struct dj_receiver_dev *djrcv_dev, · 10 unmodified lines | ||
| 456 | 456 | struct dj_report *dj_report; |
| 457 | 457 | int retval; |
| 458 | 458 | |
| 459 | − dj_report = kzalloc(sizeof(dj_report), GFP_KERNEL); | |
| 459 | + dj_report = kzalloc(sizeof(struct dj_report), GFP_KERNEL); | |
| 460 | 460 | if (!dj_report) |
| 461 | 461 | return -ENOMEM; |
| 462 | 462 | dj_report->report_id = REPORT_ID_DJ_SHORT; |
| @@ -70,6 +70,7 @@ static const struct hid_blacklist { · 69 unmodified lines | ||
| 70 | 70 | { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, |
| 71 | 71 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, |
| 72 | 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 | 74 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS }, |
| 74 | 75 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN1, HID_QUIRK_NO_INIT_REPORTS }, |
| 75 | 76 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN2, HID_QUIRK_NO_INIT_REPORTS }, |
| @@ -34,6 +34,12 @@ static const struct dmi_system_id __initconst atk_force_new_if[] = { · 33 unmodified lines | ||
| 34 | 34 | .matches = { |
| 35 | 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 | }; |
| @@ -4,7 +4,7 @@ · 3 unmodified lines | ||
| 4 | 4 | |
| 5 | 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 | 8 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 9 | 9 | ide_hwif_t *hwif = drive->hwif; |
| 10 | 10 | struct request *rq; |
| @@ -40,7 +40,7 @@ int generic_ide_suspend(struct device *dev, pm_message_t mesg) · 29 unmodified lines | ||
| 40 | 40 | |
| 41 | 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 | 44 | ide_drive_t *pair = ide_get_pair_dev(drive); |
| 45 | 45 | ide_hwif_t *hwif = drive->hwif; |
| 46 | 46 | struct request *rq; |
| @@ -358,6 +358,7 @@ static void imx_keypad_inhibit(struct imx_keypad *keypad) · 357 unmodified lines | ||
| 358 | 358 | /* Inhibit KDI and KRI interrupts. */ |
| 359 | 359 | reg_val = readw(keypad->mmio_base + KPSR); |
| 360 | 360 | reg_val &= ~(KBD_STAT_KRIE | KBD_STAT_KDIE); |
| 361 | + reg_val |= KBD_STAT_KPKR | KBD_STAT_KPKD; | |
| 361 | 362 | writew(reg_val, keypad->mmio_base + KPSR); |
| 362 | 363 | |
| 363 | 364 | /* Colums as open drain and disable all rows */ |
| @@ -515,7 +516,9 @@ static int __devinit imx_keypad_probe(struct platform_device *pdev) · 151 unmodified lines | ||
| 515 | 516 | input_set_drvdata(input_dev, keypad); |
| 516 | 517 | |
| 517 | 518 | /* Ensure that the keypad will stay dormant until opened */ |
| 519 | + clk_enable(keypad->clk); | |
| 518 | 520 | imx_keypad_inhibit(keypad); |
| 521 | + clk_disable(keypad->clk); | |
| 519 | 522 | |
| 520 | 523 | error = request_irq(irq, imx_keypad_irq_handler, 0, |
| 521 | 524 | pdev->name, keypad); |
| @@ -176,6 +176,20 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { · 175 unmodified lines | ||
| 176 | 176 | DMI_MATCH(DMI_PRODUCT_NAME, "Spring Peak"), |
| 177 | 177 | }, |
| 178 | 178 | }, |
| 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 | + }, | |
| 179 | 193 | { |
| 180 | 194 | .matches = { |
| 181 | 195 | DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"), |
| @@ -1848,7 +1848,10 @@ static const struct wacom_features wacom_features_0x2A = · 1847 unmodified lines | ||
| 1848 | 1848 | { "Wacom Intuos5 M", WACOM_PKGLEN_INTUOS, 44704, 27940, 2047, |
| 1849 | 1849 | 63, INTUOS5, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; |
| 1850 | 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 | 1855 | 63, WACOM_24HD, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES }; |
| 1853 | 1856 | static const struct wacom_features wacom_features_0x3F = |
| 1854 | 1857 | { "Wacom Cintiq 21UX", WACOM_PKGLEN_INTUOS, 87200, 65600, 1023, |
| @@ -2091,6 +2094,7 @@ const struct usb_device_id wacom_ids[] = { · 236 unmodified lines | ||
| 2091 | 2094 | { USB_DEVICE_WACOM(0xEF) }, |
| 2092 | 2095 | { USB_DEVICE_WACOM(0x47) }, |
| 2093 | 2096 | { USB_DEVICE_WACOM(0xF4) }, |
| 2097 | + { USB_DEVICE_WACOM(0xF8) }, | |
| 2094 | 2098 | { USB_DEVICE_WACOM(0xFA) }, |
| 2095 | 2099 | { USB_DEVICE_LENOVO(0x6004) }, |
| 2096 | 2100 | { } |
| @@ -602,6 +602,7 @@ edt_ft5x06_ts_teardown_debugfs(struct edt_ft5x06_ts_data *tsdata) · 601 unmodified lines | ||
| 602 | 602 | { |
| 603 | 603 | if (tsdata->debug_dir) |
| 604 | 604 | debugfs_remove_recursive(tsdata->debug_dir); |
| 605 | + kfree(tsdata->raw_buffer); | |
| 605 | 606 | } |
| 606 | 607 | |
| 607 | 608 | #else |
| @@ -843,7 +844,6 @@ static int __devexit edt_ft5x06_ts_remove(struct i2c_client *client) · 235 unmodified lines | ||
| 843 | 844 | if (gpio_is_valid(pdata->reset_pin)) |
| 844 | 845 | gpio_free(pdata->reset_pin); |
| 845 | 846 | |
| 846 | − kfree(tsdata->raw_buffer); | |
| 847 | 847 | kfree(tsdata); |
| 848 | 848 | |
| 849 | 849 | return 0; |
| @@ -1411,7 +1411,8 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) · 1410 unmodified lines | ||
| 1411 | 1411 | /* complete ongoing async transfer before issuing discard */ |
| 1412 | 1412 | if (card->host->areq) |
| 1413 | 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 | 1416 | ret = mmc_blk_issue_secdiscard_rq(mq, req); |
| 1416 | 1417 | else |
| 1417 | 1418 | ret = mmc_blk_issue_discard_rq(mq, req); |
| @@ -1716,6 +1717,7 @@ force_ro_fail: · 298 unmodified lines | ||
| 1716 | 1717 | #define CID_MANFID_SANDISK 0x2 |
| 1717 | 1718 | #define CID_MANFID_TOSHIBA 0x11 |
| 1718 | 1719 | #define CID_MANFID_MICRON 0x13 |
| 1720 | +#define CID_MANFID_SAMSUNG 0x15 | |
| 1719 | 1721 | |
| 1720 | 1722 | static const struct mmc_fixup blk_fixups[] = |
| 1721 | 1723 | { |
| @@ -1752,6 +1754,28 @@ static const struct mmc_fixup blk_fixups[] = · 30 unmodified lines | ||
| 1752 | 1754 | MMC_FIXUP(CID_NAME_ANY, CID_MANFID_MICRON, 0x200, add_quirk_mmc, |
| 1753 | 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 | 1779 | END_FIXUP |
| 1756 | 1780 | }; |
| 1757 | 1781 | |
| @@ -81,6 +81,7 @@ struct atmel_mci_caps { · 80 unmodified lines | ||
| 81 | 81 | bool has_bad_data_ordering; |
| 82 | 82 | bool need_reset_after_xfer; |
| 83 | 83 | bool need_blksz_mul_4; |
| 84 | + bool need_notbusy_for_read_ops; | |
| 84 | 85 | }; |
| 85 | 86 | |
| 86 | 87 | struct atmel_mci_dma { |
| @@ -1625,7 +1626,8 @@ static void atmci_tasklet_func(unsigned long priv) · 1538 unmodified lines | ||
| 1625 | 1626 | __func__); |
| 1626 | 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 | 1631 | atmci_writel(host, ATMCI_IER, ATMCI_NOTBUSY); |
| 1630 | 1632 | state = STATE_WAITING_NOTBUSY; |
| 1631 | 1633 | } else if (host->mrq->stop) { |
| @@ -2218,6 +2220,7 @@ static void __init atmci_get_cap(struct atmel_mci *host) · 586 unmodified lines | ||
| 2218 | 2220 | host->caps.has_bad_data_ordering = 1; |
| 2219 | 2221 | host->caps.need_reset_after_xfer = 1; |
| 2220 | 2222 | host->caps.need_blksz_mul_4 = 1; |
| 2223 | + host->caps.need_notbusy_for_read_ops = 0; | |
| 2221 | 2224 | |
| 2222 | 2225 | /* keep only major version number */ |
| 2223 | 2226 | switch (version & 0xf00) { |
| @@ -2238,6 +2241,7 @@ static void __init atmci_get_cap(struct atmel_mci *host) · 14 unmodified lines | ||
| 2238 | 2241 | case 0x200: |
| 2239 | 2242 | host->caps.has_rwproof = 1; |
| 2240 | 2243 | host->caps.need_blksz_mul_4 = 0; |
| 2244 | + host->caps.need_notbusy_for_read_ops = 1; | |
| 2241 | 2245 | case 0x100: |
| 2242 | 2246 | host->caps.has_bad_data_ordering = 0; |
| 2243 | 2247 | host->caps.need_reset_after_xfer = 0; |
| @@ -49,13 +49,6 @@ · 48 unmodified lines | ||
| 49 | 49 | #define bfin_write_SDH_CFG bfin_write_RSI_CFG |
| 50 | 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 | 52 | struct sdh_host { |
| 60 | 53 | struct mmc_host *mmc; |
| 61 | 54 | spinlock_t lock; |
| @@ -627,6 +627,7 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot) · 626 unmodified lines | ||
| 627 | 627 | { |
| 628 | 628 | struct dw_mci *host = slot->host; |
| 629 | 629 | u32 div; |
| 630 | + u32 clk_en_a; | |
| 630 | 631 | |
| 631 | 632 | if (slot->clock != host->current_speed) { |
| 632 | 633 | div = host->bus_hz / slot->clock; |
| @@ -659,9 +660,11 @@ static void dw_mci_setup_bus(struct dw_mci_slot *slot) · 26 unmodified lines | ||
| 659 | 660 | mci_send_cmd(slot, |
| 660 | 661 | SDMMC_CMD_UPD_CLK | SDMMC_CMD_PRV_DAT_WAIT, 0); |
| 661 | 662 | |
| 662 | − /* enable clock */ | |
| 663 | − mci_writel(host, CLKENA, ((SDMMC_CLKEN_ENABLE | | |
| 664 | − SDMMC_CLKEN_LOW_PWR) << slot->id)); | |
| 663 | + /* enable clock; only low power if no SDIO */ | |
| 664 | + clk_en_a = SDMMC_CLKEN_ENABLE << 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 | 669 | /* inform CIU */ |
| 667 | 670 | mci_send_cmd(slot, |
| @@ -862,6 +865,30 @@ static int dw_mci_get_cd(struct mmc_host *mmc) · 194 unmodified lines | ||
| 862 | 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 | 892 | static void dw_mci_enable_sdio_irq(struct mmc_host *mmc, int enb) |
| 866 | 893 | { |
| 867 | 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) · 3 unmodified lines | ||
| 871 | 898 | /* Enable/disable Slot Specific SDIO interrupt */ |
| 872 | 899 | int_mask = mci_readl(host, INTMASK); |
| 873 | 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 | 909 | mci_writel(host, INTMASK, |
| 875 | 910 | (int_mask | SDMMC_INT_SDIO(slot->id))); |
| 876 | 911 | } else { |
| @@ -1429,22 +1464,10 @@ static void dw_mci_read_data_pio(struct dw_mci *host) · 552 unmodified lines | ||
| 1429 | 1464 | nbytes += len; |
| 1430 | 1465 | remain -= len; |
| 1431 | 1466 | } while (remain); |
| 1432 | − sg_miter->consumed = offset; | |
| 1433 | 1467 | |
| 1468 | + sg_miter->consumed = offset; | |
| 1434 | 1469 | status = mci_readl(host, MINTSTS); |
| 1435 | 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 | 1471 | } while (status & SDMMC_INT_RXDR); /*if the RXDR is ready read again*/ |
| 1449 | 1472 | data->bytes_xfered += nbytes; |
| 1450 | 1473 | |
| @@ -1497,23 +1520,10 @@ static void dw_mci_write_data_pio(struct dw_mci *host) · 46 unmodified lines | ||
| 1497 | 1520 | nbytes += len; |
| 1498 | 1521 | remain -= len; |
| 1499 | 1522 | } while (remain); |
| 1500 | − sg_miter->consumed = offset; | |
| 1501 | 1523 | |
| 1524 | + sg_miter->consumed = offset; | |
| 1502 | 1525 | status = mci_readl(host, MINTSTS); |
| 1503 | 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 | 1527 | } while (status & SDMMC_INT_TXDR); /* if TXDR write again */ |
| 1518 | 1528 | data->bytes_xfered += nbytes; |
| 1519 | 1529 | |
| @@ -1547,12 +1557,11 @@ static void dw_mci_cmd_interrupt(struct dw_mci *host, u32 status) · 27 unmodified lines | ||
| 1547 | 1557 | static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) |
| 1548 | 1558 | { |
| 1549 | 1559 | struct dw_mci *host = dev_id; |
| 1550 | − u32 status, pending; | |
| 1560 | + u32 pending; | |
| 1551 | 1561 | unsigned int pass_count = 0; |
| 1552 | 1562 | int i; |
| 1553 | 1563 | |
| 1554 | 1564 | do { |
| 1555 | − status = mci_readl(host, RINTSTS); | |
| 1556 | 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) · 11 unmodified lines | ||
| 1570 | 1579 | |
| 1571 | 1580 | if (pending & DW_MCI_CMD_ERROR_FLAGS) { |
| 1572 | 1581 | mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS); |
| 1573 | − host->cmd_status = status; | |
| 1582 | + host->cmd_status = pending; | |
| 1574 | 1583 | smp_wmb(); |
| 1575 | 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) · 1 unmodified line | ||
| 1578 | 1587 | if (pending & DW_MCI_DATA_ERROR_FLAGS) { |
| 1579 | 1588 | /* if there is an error report DATA_ERROR */ |
| 1580 | 1589 | mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS); |
| 1581 | − host->data_status = status; | |
| 1590 | + host->data_status = pending; | |
| 1582 | 1591 | smp_wmb(); |
| 1583 | 1592 | set_bit(EVENT_DATA_ERROR, &host->pending_events); |
| 1584 | − if (!(pending & (SDMMC_INT_DTO | SDMMC_INT_DCRC | | |
| 1585 | − SDMMC_INT_SBE | SDMMC_INT_EBE))) | |
| 1586 | − tasklet_schedule(&host->tasklet); | |
| 1593 | + tasklet_schedule(&host->tasklet); | |
| 1587 | 1594 | } |
| 1588 | 1595 | |
| 1589 | 1596 | if (pending & SDMMC_INT_DATA_OVER) { |
| 1590 | 1597 | mci_writel(host, RINTSTS, SDMMC_INT_DATA_OVER); |
| 1591 | 1598 | if (!host->data_status) |
| 1592 | − host->data_status = status; | |
| 1599 | + host->data_status = pending; | |
| 1593 | 1600 | smp_wmb(); |
| 1594 | 1601 | if (host->dir_status == DW_MCI_RECV_STATUS) { |
| 1595 | 1602 | if (host->sg != NULL) |
| @@ -1613,7 +1620,7 @@ static irqreturn_t dw_mci_interrupt(int irq, void *dev_id) · 17 unmodified lines | ||
| 1613 | 1620 | |
| 1614 | 1621 | if (pending & SDMMC_INT_CMD_DONE) { |
| 1615 | 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 | 1626 | if (pending & SDMMC_INT_CD) { |
| @@ -285,11 +285,11 @@ static irqreturn_t mxs_mmc_irq_handler(int irq, void *dev_id) · 284 unmodified lines | ||
| 285 | 285 | writel(stat & MXS_MMC_IRQ_BITS, |
| 286 | 286 | host->base + HW_SSP_CTRL1(host) + STMP_OFFSET_REG_CLR); |
| 287 | 287 | |
| 288 | + spin_unlock(&host->lock); | |
| 289 | + | |
| 288 | 290 | if ((stat & BM_SSP_CTRL1_SDIO_IRQ) && (stat & BM_SSP_CTRL1_SDIO_IRQ_EN)) |
| 289 | 291 | mmc_signal_sdio_irq(host->mmc); |
| 290 | 292 | |
| 291 | − spin_unlock(&host->lock); | |
| 292 | − | |
| 293 | 293 | if (stat & BM_SSP_CTRL1_RESP_TIMEOUT_IRQ) |
| 294 | 294 | cmd->error = -ETIMEDOUT; |
| 295 | 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) · 348 unmodified lines | ||
| 644 | 644 | host->base + HW_SSP_CTRL0 + STMP_OFFSET_REG_SET); |
| 645 | 645 | writel(BM_SSP_CTRL1_SDIO_IRQ_EN, |
| 646 | 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 | 647 | } else { |
| 653 | 648 | writel(BM_SSP_CTRL0_SDIO_IRQ_CHECK, |
| 654 | 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) · 2 unmodified lines | ||
| 657 | 652 | } |
| 658 | 653 | |
| 659 | 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 | 662 | static const struct mmc_host_ops mxs_mmc_ops = { |
| @@ -33,7 +33,6 @@ · 32 unmodified lines | ||
| 33 | 33 | #include <asm/io.h> |
| 34 | 34 | #include <asm/irq.h> |
| 35 | 35 | |
| 36 | −#include <plat/board.h> | |
| 37 | 36 | #include <plat/mmc.h> |
| 38 | 37 | #include <asm/gpio.h> |
| 39 | 38 | #include <plat/dma.h> |
| @@ -668,7 +667,7 @@ mmc_omap_clk_timer(unsigned long data) · 628 unmodified lines | ||
| 668 | 667 | static void |
| 669 | 668 | mmc_omap_xfer_data(struct mmc_omap_host *host, int write) |
| 670 | 669 | { |
| 671 | − int n; | |
| 670 | + int n, nwords; | |
| 672 | 671 | |
| 673 | 672 | if (host->buffer_bytes_left == 0) { |
| 674 | 673 | host->sg_idx++; |
| @@ -678,15 +677,23 @@ mmc_omap_xfer_data(struct mmc_omap_host *host, int write) · 3 unmodified lines | ||
| 678 | 677 | n = 64; |
| 679 | 678 | if (n > host->buffer_bytes_left) |
| 680 | 679 | n = host->buffer_bytes_left; |
| 680 | + | |
| 681 | + nwords = n / 2; | |
| 682 | + nwords += n & 1; /* handle odd number of bytes to transfer */ | |
| 683 | + | |
| 681 | 684 | host->buffer_bytes_left -= n; |
| 682 | 685 | host->total_bytes_left -= n; |
| 683 | 686 | host->data->bytes_xfered += n; |
| 684 | 687 | |
| 685 | 688 | if (write) { |
| 686 | − __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA), host->buffer, n); | |
| 689 | + __raw_writesw(host->virt_base + OMAP_MMC_REG(host, DATA), | |
| 690 | + host->buffer, nwords); | |
| 687 | 691 | } else { |
| 688 | − __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA), host->buffer, n); | |
| 692 | + __raw_readsw(host->virt_base + OMAP_MMC_REG(host, DATA), | |
| 693 | + host->buffer, nwords); | |
| 689 | 694 | } |
| 695 | + | |
| 696 | + host->buffer += nwords; | |
| 690 | 697 | } |
| 691 | 698 | |
| 692 | 699 | static inline void mmc_omap_report_irq(u16 status) |
| @@ -40,7 +40,6 @@ · 39 unmodified lines | ||
| 40 | 40 | #include <linux/regulator/consumer.h> |
| 41 | 41 | #include <linux/pm_runtime.h> |
| 42 | 42 | #include <mach/hardware.h> |
| 43 | −#include <plat/board.h> | |
| 44 | 43 | #include <plat/mmc.h> |
| 45 | 44 | #include <plat/cpu.h> |
| 46 | 45 | |
| @@ -48,14 +48,14 @@ static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock) · 47 unmodified lines | ||
| 48 | 48 | int div = 1; |
| 49 | 49 | u32 temp; |
| 50 | 50 | |
| 51 | + if (clock == 0) | |
| 52 | + goto out; | |
| 53 | + | |
| 51 | 54 | temp = sdhci_readl(host, ESDHC_SYSTEM_CONTROL); |
| 52 | 55 | temp &= ~(ESDHC_CLOCK_IPGEN | ESDHC_CLOCK_HCKEN | ESDHC_CLOCK_PEREN |
| 53 | 56 | | ESDHC_CLOCK_MASK); |
| 54 | 57 | sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL); |
| 55 | 58 | |
| 56 | − if (clock == 0) | |
| 57 | − goto out; | |
| 58 | − | |
| 59 | 59 | while (host->max_clk / pre_div / 16 > clock && pre_div < 256) |
| 60 | 60 | pre_div *= 2; |
| 61 | 61 | |
| @@ -101,6 +101,16 @@ · 100 unmodified lines | ||
| 101 | 101 | #define P4e_s(a) (TF(a & NAND_Ecc_P4e) << 0) |
| 102 | 102 | #define P4o_s(a) (TF(a & NAND_Ecc_P4o) << 1) |
| 103 | 103 | |
| 104 | +#define PREFETCH_CONFIG1_CS_SHIFT 24 | |
| 105 | +#define ECC_CONFIG_CS_SHIFT 1 | |
| 106 | +#define CS_MASK 0x7 | |
| 107 | +#define ENABLE_PREFETCH (0x1 << 7) | |
| 108 | +#define DMA_MPU_MODE_SHIFT 2 | |
| 109 | +#define ECCSIZE1_SHIFT 22 | |
| 110 | +#define ECC1RESULTSIZE 0x1 | |
| 111 | +#define ECCCLEAR 0x100 | |
| 112 | +#define ECC1 0x1 | |
| 113 | + | |
| 104 | 114 | /* oob info generated runtime depending on ecc algorithm and layout selected */ |
| 105 | 115 | static struct nand_ecclayout omap_oobinfo; |
| 106 | 116 | /* Define some generic bad / good block scan pattern which are used |
| @@ -124,15 +134,18 @@ struct omap_nand_info { · 17 unmodified lines | ||
| 124 | 134 | |
| 125 | 135 | int gpmc_cs; |
| 126 | 136 | unsigned long phys_base; |
| 137 | + unsigned long mem_size; | |
| 127 | 138 | struct completion comp; |
| 128 | 139 | struct dma_chan *dma; |
| 129 | − int gpmc_irq; | |
| 140 | + int gpmc_irq_fifo; | |
| 141 | + int gpmc_irq_count; | |
| 130 | 142 | enum { |
| 131 | 143 | OMAP_NAND_IO_READ = 0, /* read */ |
| 132 | 144 | OMAP_NAND_IO_WRITE, /* write */ |
| 133 | 145 | } iomode; |
| 134 | 146 | u_char *buf; |
| 135 | 147 | int buf_len; |
| 148 | + struct gpmc_nand_regs reg; | |
| 136 | 149 | |
| 137 | 150 | #ifdef CONFIG_MTD_NAND_OMAP_BCH |
| 138 | 151 | struct bch_control *bch; |
| @@ -140,6 +153,63 @@ struct omap_nand_info { · 1 unmodified line | ||
| 140 | 153 | #endif |
| 141 | 154 | }; |
| 142 | 155 | |
| 156 | +/** | |
| 157 | + * omap_prefetch_enable - configures and starts prefetch transfer | |
| 158 | + * @cs: cs (chip select) number | |
| 159 | + * @fifo_th: fifo threshold to be used for read/ write | |
| 160 | + * @dma_mode: dma mode enable (1) or disable (0) | |
| 161 | + * @u32_count: number of bytes to be transferred | |
| 162 | + * @is_write: prefetch read(0) or write post(1) mode | |
| 163 | + */ | |
| 164 | +static int omap_prefetch_enable(int cs, int fifo_th, int dma_mode, | |
| 165 | + unsigned int u32_count, int is_write, struct omap_nand_info *info) | |
| 166 | +{ | |
| 167 | + u32 val; | |
| 168 | + | |
| 169 | + if (fifo_th > PREFETCH_FIFOTHRESHOLD_MAX) | |
| 170 | + return -1; | |
| 171 | + | |
| 172 | + if (readl(info->reg.gpmc_prefetch_control)) | |
| 173 | + return -EBUSY; | |
| 174 | + | |
| 175 | + /* Set the amount of bytes to be prefetched */ | |
| 176 | + writel(u32_count, info->reg.gpmc_prefetch_config2); | |
| 177 | + | |
| 178 | + /* Set dma/mpu mode, the prefetch read / post write and | |
| 179 | + * enable the engine. Set which cs is has requested for. | |
| 180 | + */ | |
| 181 | + val = ((cs << PREFETCH_CONFIG1_CS_SHIFT) | | |
| 182 | + PREFETCH_FIFOTHRESHOLD(fifo_th) | ENABLE_PREFETCH | | |
| 183 | + (dma_mode << DMA_MPU_MODE_SHIFT) | (0x1 & is_write)); | |
| 184 | + writel(val, info->reg.gpmc_prefetch_config1); | |
| 185 | + | |
| 186 | + /* Start the prefetch engine */ | |
| 187 | + writel(0x1, info->reg.gpmc_prefetch_control); | |
| 188 | + | |
| 189 | + return 0; | |
| 190 | +} | |
| 191 | + | |
| 192 | +/** | |
| 193 | + * omap_prefetch_reset - disables and stops the prefetch engine | |
| 194 | + */ | |
| 195 | +static int omap_prefetch_reset(int cs, struct omap_nand_info *info) | |
| 196 | +{ | |
| 197 | + u32 config1; | |
| 198 | + | |
| 199 | + /* check if the same module/cs is trying to reset */ | |
| 200 | + config1 = readl(info->reg.gpmc_prefetch_config1); | |
| 201 | + if (((config1 >> PREFETCH_CONFIG1_CS_SHIFT) & CS_MASK) != cs) | |
| 202 | + return -EINVAL; | |
| 203 | + | |
| 204 | + /* Stop the PFPW engine */ | |
| 205 | + writel(0x0, info->reg.gpmc_prefetch_control); | |
| 206 | + | |
| 207 | + /* Reset/disable the PFPW engine */ | |
| 208 | + writel(0x0, info->reg.gpmc_prefetch_config1); | |
| 209 | + | |
| 210 | + return 0; | |
| 211 | +} | |
| 212 | + | |
| 143 | 213 | /** |
| 144 | 214 | * omap_hwcontrol - hardware specific access to control-lines |
| 145 | 215 | * @mtd: MTD device structure |
| @@ -158,13 +228,13 @@ static void omap_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl) · 12 unmodified lines | ||
| 158 | 228 | |
| 159 | 229 | if (cmd != NAND_CMD_NONE) { |
| 160 | 230 | if (ctrl & NAND_CLE) |
| 161 | − gpmc_nand_write(info->gpmc_cs, GPMC_NAND_COMMAND, cmd); | |
| 231 | + writeb(cmd, info->reg.gpmc_nand_command); | |
| 162 | 232 | |
| 163 | 233 | else if (ctrl & NAND_ALE) |
| 164 | − gpmc_nand_write(info->gpmc_cs, GPMC_NAND_ADDRESS, cmd); | |
| 234 | + writeb(cmd, info->reg.gpmc_nand_address); | |
| 165 | 235 | |
| 166 | 236 | else /* NAND_NCE */ |
| 167 | − gpmc_nand_write(info->gpmc_cs, GPMC_NAND_DATA, cmd); | |
| 237 | + writeb(cmd, info->reg.gpmc_nand_data); | |
| 168 | 238 | } |
| 169 | 239 | } |
| 170 | 240 | |
| @@ -198,7 +268,8 @@ static void omap_write_buf8(struct mtd_info *mtd, const u_char *buf, int len) · 27 unmodified lines | ||
| 198 | 268 | iowrite8(*p++, info->nand.IO_ADDR_W); |
| 199 | 269 | /* wait until buffer is available for write */ |
| 200 | 270 | do { |
| 201 | − status = gpmc_read_status(GPMC_STATUS_BUFFER); | |
| 271 | + status = readl(info->reg.gpmc_status) & | |
| 272 | + GPMC_STATUS_BUFF_EMPTY; | |
| 202 | 273 | } while (!status); |
| 203 | 274 | } |
| 204 | 275 | } |
| @@ -235,7 +306,8 @@ static void omap_write_buf16(struct mtd_info *mtd, const u_char * buf, int len) · 30 unmodified lines | ||
| 235 | 306 | iowrite16(*p++, info->nand.IO_ADDR_W); |
| 236 | 307 | /* wait until buffer is available for write */ |
| 237 | 308 | do { |
| 238 | − status = gpmc_read_status(GPMC_STATUS_BUFFER); | |
| 309 | + status = readl(info->reg.gpmc_status) & | |
| 310 | + GPMC_STATUS_BUFF_EMPTY; | |
| 239 | 311 | } while (!status); |
| 240 | 312 | } |
| 241 | 313 | } |
| @@ -265,8 +337,8 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len) · 23 unmodified lines | ||
| 265 | 337 | } |
| 266 | 338 | |
| 267 | 339 | /* configure and start prefetch transfer */ |
| 268 | − ret = gpmc_prefetch_enable(info->gpmc_cs, | |
| 269 | − PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0); | |
| 340 | + ret = omap_prefetch_enable(info->gpmc_cs, | |
| 341 | + PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x0, info); | |
| 270 | 342 | if (ret) { |
| 271 | 343 | /* PFPW engine is busy, use cpu copy method */ |
| 272 | 344 | if (info->nand.options & NAND_BUSWIDTH_16) |
| @@ -275,14 +347,15 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len) · 2 unmodified lines | ||
| 275 | 347 | omap_read_buf8(mtd, (u_char *)p, len); |
| 276 | 348 | } else { |
| 277 | 349 | do { |
| 278 | − r_count = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT); | |
| 350 | + r_count = readl(info->reg.gpmc_prefetch_status); | |
| 351 | + r_count = GPMC_PREFETCH_STATUS_FIFO_CNT(r_count); | |
| 279 | 352 | r_count = r_count >> 2; |
| 280 | 353 | ioread32_rep(info->nand.IO_ADDR_R, p, r_count); |
| 281 | 354 | p += r_count; |
| 282 | 355 | len -= r_count << 2; |
| 283 | 356 | } while (len); |
| 284 | 357 | /* disable and stop the PFPW engine */ |
| 285 | − gpmc_prefetch_reset(info->gpmc_cs); | |
| 358 | + omap_prefetch_reset(info->gpmc_cs, info); | |
| 286 | 359 | } |
| 287 | 360 | } |
| 288 | 361 | |
| @@ -301,6 +374,7 @@ static void omap_write_buf_pref(struct mtd_info *mtd, · 12 unmodified lines | ||
| 301 | 374 | int i = 0, ret = 0; |
| 302 | 375 | u16 *p = (u16 *)buf; |
| 303 | 376 | unsigned long tim, limit; |
| 377 | + u32 val; | |
| 304 | 378 | |
| 305 | 379 | /* take care of subpage writes */ |
| 306 | 380 | if (len % 2 != 0) { |
| @@ -310,8 +384,8 @@ static void omap_write_buf_pref(struct mtd_info *mtd, · 3 unmodified lines | ||
| 310 | 384 | } |
| 311 | 385 | |
| 312 | 386 | /* configure and start prefetch transfer */ |
| 313 | − ret = gpmc_prefetch_enable(info->gpmc_cs, | |
| 314 | − PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1); | |
| 387 | + ret = omap_prefetch_enable(info->gpmc_cs, | |
| 388 | + PREFETCH_FIFOTHRESHOLD_MAX, 0x0, len, 0x1, info); | |
| 315 | 389 | if (ret) { |
| 316 | 390 | /* PFPW engine is busy, use cpu copy method */ |
| 317 | 391 | if (info->nand.options & NAND_BUSWIDTH_16) |
| @@ -320,7 +394,8 @@ static void omap_write_buf_pref(struct mtd_info *mtd, · 2 unmodified lines | ||
| 320 | 394 | omap_write_buf8(mtd, (u_char *)p, len); |
| 321 | 395 | } else { |
| 322 | 396 | while (len) { |
| 323 | − w_count = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT); | |
| 397 | + w_count = readl(info->reg.gpmc_prefetch_status); | |
| 398 | + w_count = GPMC_PREFETCH_STATUS_FIFO_CNT(w_count); | |
| 324 | 399 | w_count = w_count >> 1; |
| 325 | 400 | for (i = 0; (i < w_count) && len; i++, len -= 2) |
| 326 | 401 | iowrite16(*p++, info->nand.IO_ADDR_W); |
| @@ -329,11 +404,14 @@ static void omap_write_buf_pref(struct mtd_info *mtd, · 2 unmodified lines | ||
| 329 | 404 | tim = 0; |
| 330 | 405 | limit = (loops_per_jiffy * |
| 331 | 406 | msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS)); |
| 332 | − while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit)) | |
| 407 | + do { | |
| 333 | 408 | cpu_relax(); |
| 409 | + val = readl(info->reg.gpmc_prefetch_status); | |
| 410 | + val = GPMC_PREFETCH_STATUS_COUNT(val); | |
| 411 | + } while (val && (tim++ < limit)); | |
| 334 | 412 | |
| 335 | 413 | /* disable and stop the PFPW engine */ |
| 336 | − gpmc_prefetch_reset(info->gpmc_cs); | |
| 414 | + omap_prefetch_reset(info->gpmc_cs, info); | |
| 337 | 415 | } |
| 338 | 416 | } |
| 339 | 417 | |
| @@ -365,6 +443,7 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr, · 25 unmodified lines | ||
| 365 | 443 | unsigned long tim, limit; |
| 366 | 444 | unsigned n; |
| 367 | 445 | int ret; |
| 446 | + u32 val; | |
| 368 | 447 | |
| 369 | 448 | if (addr >= high_memory) { |
| 370 | 449 | struct page *p1; |
| @@ -396,9 +475,9 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr, · 25 unmodified lines | ||
| 396 | 475 | tx->callback_param = &info->comp; |
| 397 | 476 | dmaengine_submit(tx); |
| 398 | 477 | |
| 399 | − /* configure and start prefetch transfer */ | |
| 400 | − ret = gpmc_prefetch_enable(info->gpmc_cs, | |
| 401 | − PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write); | |
| 478 | + /* configure and start prefetch transfer */ | |
| 479 | + ret = omap_prefetch_enable(info->gpmc_cs, | |
| 480 | + PREFETCH_FIFOTHRESHOLD_MAX, 0x1, len, is_write, info); | |
| 402 | 481 | if (ret) |
| 403 | 482 | /* PFPW engine is busy, use cpu copy method */ |
| 404 | 483 | goto out_copy_unmap; |
| @@ -410,11 +489,15 @@ static inline int omap_nand_dma_transfer(struct mtd_info *mtd, void *addr, · 5 unmodified lines | ||
| 410 | 489 | wait_for_completion(&info->comp); |
| 411 | 490 | tim = 0; |
| 412 | 491 | limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS)); |
| 413 | − while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit)) | |
| 492 | + | |
| 493 | + do { | |
| 414 | 494 | cpu_relax(); |
| 495 | + val = readl(info->reg.gpmc_prefetch_status); | |
| 496 | + val = GPMC_PREFETCH_STATUS_COUNT(val); | |
| 497 | + } while (val && (tim++ < limit)); | |
| 415 | 498 | |
| 416 | 499 | /* disable and stop the PFPW engine */ |
| 417 | − gpmc_prefetch_reset(info->gpmc_cs); | |
| 500 | + omap_prefetch_reset(info->gpmc_cs, info); | |
| 418 | 501 | |
| 419 | 502 | dma_unmap_sg(info->dma->device->dev, &sg, 1, dir); |
| 420 | 503 | return 0; |
| @@ -471,13 +554,12 @@ static irqreturn_t omap_nand_irq(int this_irq, void *dev) · 50 unmodified lines | ||
| 471 | 554 | { |
| 472 | 555 | struct omap_nand_info *info = (struct omap_nand_info *) dev; |
| 473 | 556 | u32 bytes; |
| 474 | − u32 irq_stat; | |
| 475 | 557 | |
| 476 | − irq_stat = gpmc_read_status(GPMC_GET_IRQ_STATUS); | |
| 477 | − bytes = gpmc_read_status(GPMC_PREFETCH_FIFO_CNT); | |
| 558 | + bytes = readl(info->reg.gpmc_prefetch_status); | |
| 559 | + bytes = GPMC_PREFETCH_STATUS_FIFO_CNT(bytes); | |
| 478 | 560 | bytes = bytes & 0xFFFC; /* io in multiple of 4 bytes */ |
| 479 | 561 | if (info->iomode == OMAP_NAND_IO_WRITE) { /* checks for write io */ |
| 480 | − if (irq_stat & 0x2) | |
| 562 | + if (this_irq == info->gpmc_irq_count) | |
| 481 | 563 | goto done; |
| 482 | 564 | |
| 483 | 565 | if (info->buf_len && (info->buf_len < bytes)) |
| @@ -494,20 +576,17 @@ static irqreturn_t omap_nand_irq(int this_irq, void *dev) · 10 unmodified lines | ||
| 494 | 576 | (u32 *)info->buf, bytes >> 2); |
| 495 | 577 | info->buf = info->buf + bytes; |
| 496 | 578 | |
| 497 | − if (irq_stat & 0x2) | |
| 579 | + if (this_irq == info->gpmc_irq_count) | |
| 498 | 580 | goto done; |
| 499 | 581 | } |
| 500 | − gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, irq_stat); | |
| 501 | 582 | |
| 502 | 583 | return IRQ_HANDLED; |
| 503 | 584 | |
| 504 | 585 | done: |
| 505 | 586 | complete(&info->comp); |
| 506 | − /* disable irq */ | |
| 507 | − gpmc_cs_configure(info->gpmc_cs, GPMC_ENABLE_IRQ, 0); | |
| 508 | 587 | |
| 509 | − /* clear status */ | |
| 510 | − gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, irq_stat); | |
| 588 | + disable_irq_nosync(info->gpmc_irq_fifo); | |
| 589 | + disable_irq_nosync(info->gpmc_irq_count); | |
| 511 | 590 | |
| 512 | 591 | return IRQ_HANDLED; |
| 513 | 592 | } |
| @@ -534,22 +613,22 @@ static void omap_read_buf_irq_pref(struct mtd_info *mtd, u_char *buf, int len) · 20 unmodified lines | ||
| 534 | 613 | init_completion(&info->comp); |
| 535 | 614 | |
| 536 | 615 | /* configure and start prefetch transfer */ |
| 537 | − ret = gpmc_prefetch_enable(info->gpmc_cs, | |
| 538 | − PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0); | |
| 616 | + ret = omap_prefetch_enable(info->gpmc_cs, | |
| 617 | + PREFETCH_FIFOTHRESHOLD_MAX/2, 0x0, len, 0x0, info); | |
| 539 | 618 | if (ret) |
| 540 | 619 | /* PFPW engine is busy, use cpu copy method */ |
| 541 | 620 | goto out_copy; |
| 542 | 621 | |
| 543 | 622 | info->buf_len = len; |
| 544 | − /* enable irq */ | |
| 545 | − gpmc_cs_configure(info->gpmc_cs, GPMC_ENABLE_IRQ, | |
| 546 | − (GPMC_IRQ_FIFOEVENTENABLE | GPMC_IRQ_COUNT_EVENT)); | |
| 623 | + | |
| 624 | + enable_irq(info->gpmc_irq_count); | |
| 625 | + enable_irq(info->gpmc_irq_fifo); | |
| 547 | 626 | |
| 548 | 627 | /* waiting for read to complete */ |
| 549 | 628 | wait_for_completion(&info->comp); |
| 550 | 629 | |
| 551 | 630 | /* disable and stop the PFPW engine */ |
| 552 | − gpmc_prefetch_reset(info->gpmc_cs); | |
| 631 | + omap_prefetch_reset(info->gpmc_cs, info); | |
| 553 | 632 | return; |
| 554 | 633 | |
| 555 | 634 | out_copy: |
| @@ -572,6 +651,7 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd, · 16 unmodified lines | ||
| 572 | 651 | struct omap_nand_info, mtd); |
| 573 | 652 | int ret = 0; |
| 574 | 653 | unsigned long tim, limit; |
| 654 | + u32 val; | |
| 575 | 655 | |
| 576 | 656 | if (len <= mtd->oobsize) { |
| 577 | 657 | omap_write_buf_pref(mtd, buf, len); |
| @@ -583,27 +663,31 @@ static void omap_write_buf_irq_pref(struct mtd_info *mtd, · 5 unmodified lines | ||
| 583 | 663 | init_completion(&info->comp); |
| 584 | 664 | |
| 585 | 665 | /* configure and start prefetch transfer : size=24 */ |
| 586 | − ret = gpmc_prefetch_enable(info->gpmc_cs, | |
| 587 | − (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1); | |
| 666 | + ret = omap_prefetch_enable(info->gpmc_cs, | |
| 667 | + (PREFETCH_FIFOTHRESHOLD_MAX * 3) / 8, 0x0, len, 0x1, info); | |
| 588 | 668 | if (ret) |
| 589 | 669 | /* PFPW engine is busy, use cpu copy method */ |
| 590 | 670 | goto out_copy; |
| 591 | 671 | |
| 592 | 672 | info->buf_len = len; |
| 593 | − /* enable irq */ | |
| 594 | − gpmc_cs_configure(info->gpmc_cs, GPMC_ENABLE_IRQ, | |
| 595 | − (GPMC_IRQ_FIFOEVENTENABLE | GPMC_IRQ_COUNT_EVENT)); | |
| 673 | + | |
| 674 | + enable_irq(info->gpmc_irq_count); | |
| 675 | + enable_irq(info->gpmc_irq_fifo); | |
| 596 | 676 | |
| 597 | 677 | /* waiting for write to complete */ |
| 598 | 678 | wait_for_completion(&info->comp); |
| 679 | + | |
| 599 | 680 | /* wait for data to flushed-out before reset the prefetch */ |
| 600 | 681 | tim = 0; |
| 601 | 682 | limit = (loops_per_jiffy * msecs_to_jiffies(OMAP_NAND_TIMEOUT_MS)); |
| 602 | − while (gpmc_read_status(GPMC_PREFETCH_COUNT) && (tim++ < limit)) | |
| 683 | + do { | |
| 684 | + val = readl(info->reg.gpmc_prefetch_status); | |
| 685 | + val = GPMC_PREFETCH_STATUS_COUNT(val); | |
| 603 | 686 | cpu_relax(); |
| 687 | + } while (val && (tim++ < limit)); | |
| 604 | 688 | |
| 605 | 689 | /* disable and stop the PFPW engine */ |
| 606 | − gpmc_prefetch_reset(info->gpmc_cs); | |
| 690 | + omap_prefetch_reset(info->gpmc_cs, info); | |
| 607 | 691 | return; |
| 608 | 692 | |
| 609 | 693 | out_copy: |
| @@ -843,7 +927,20 @@ static int omap_calculate_ecc(struct mtd_info *mtd, const u_char *dat, · 233 unmodified lines | ||
| 843 | 927 | { |
| 844 | 928 | struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, |
| 845 | 929 | mtd); |
| 846 | − return gpmc_calculate_ecc(info->gpmc_cs, dat, ecc_code); | |
| 930 | + u32 val; | |
| 931 | + | |
| 932 | + val = readl(info->reg.gpmc_ecc_config); | |
| 933 | + if (((val >> ECC_CONFIG_CS_SHIFT) & ~CS_MASK) != info->gpmc_cs) | |
| 934 | + return -EINVAL; | |
| 935 | + | |
| 936 | + /* read ecc result */ | |
| 937 | + val = readl(info->reg.gpmc_ecc1_result); | |
| 938 | + *ecc_code++ = val; /* P128e, ..., P1e */ | |
| 939 | + *ecc_code++ = val >> 16; /* P128o, ..., P1o */ | |
| 940 | + /* P2048o, P1024o, P512o, P256o, P2048e, P1024e, P512e, P256e */ | |
| 941 | + *ecc_code++ = ((val >> 8) & 0x0f) | ((val >> 20) & 0xf0); | |
| 942 | + | |
| 943 | + return 0; | |
| 847 | 944 | } |
| 848 | 945 | |
| 849 | 946 | /** |
| @@ -857,8 +954,34 @@ static void omap_enable_hwecc(struct mtd_info *mtd, int mode) · 7 unmodified lines | ||
| 857 | 954 | mtd); |
| 858 | 955 | struct nand_chip *chip = mtd->priv; |
| 859 | 956 | unsigned int dev_width = (chip->options & NAND_BUSWIDTH_16) ? 1 : 0; |
| 957 | + u32 val; | |
| 958 | + | |
| 959 | + /* clear ecc and enable bits */ | |
| 960 | + val = ECCCLEAR | ECC1; | |
| 961 | + writel(val, info->reg.gpmc_ecc_control); | |
| 962 | + | |
| 963 | + /* program ecc and result sizes */ | |
| 964 | + val = ((((info->nand.ecc.size >> 1) - 1) << ECCSIZE1_SHIFT) | | |
| 965 | + ECC1RESULTSIZE); | |
| 966 | + writel(val, info->reg.gpmc_ecc_size_config); | |
| 860 | 967 | |
| 861 | − gpmc_enable_hwecc(info->gpmc_cs, mode, dev_width, info->nand.ecc.size); | |
| 968 | + switch (mode) { | |
| 969 | + case NAND_ECC_READ: | |
| 970 | + case NAND_ECC_WRITE: | |
| 971 | + writel(ECCCLEAR | ECC1, info->reg.gpmc_ecc_control); | |
| 972 | + break; | |
| 973 | + case NAND_ECC_READSYN: | |
| 974 | + writel(ECCCLEAR, info->reg.gpmc_ecc_control); | |
| 975 | + break; | |
| 976 | + default: | |
| 977 | + dev_info(&info->pdev->dev, | |
| 978 | + "error: unrecognized Mode[%d]!\n", mode); | |
| 979 | + break; | |
| 980 | + } | |
| 981 | + | |
| 982 | + /* (ECC 16 or 8 bit col) | ( CS ) | ECC Enable */ | |
| 983 | + val = (dev_width << 7) | (info->gpmc_cs << 1) | (0x1); | |
| 984 | + writel(val, info->reg.gpmc_ecc_config); | |
| 862 | 985 | } |
| 863 | 986 | |
| 864 | 987 | /** |
| @@ -886,10 +1009,9 @@ static int omap_wait(struct mtd_info *mtd, struct nand_chip *chip) · 21 unmodified lines | ||
| 886 | 1009 | else |
| 887 | 1010 | timeo += (HZ * 20) / 1000; |
| 888 | 1011 | |
| 889 | − gpmc_nand_write(info->gpmc_cs, | |
| 890 | − GPMC_NAND_COMMAND, (NAND_CMD_STATUS & 0xFF)); | |
| 1012 | + writeb(NAND_CMD_STATUS & 0xFF, info->reg.gpmc_nand_command); | |
| 891 | 1013 | while (time_before(jiffies, timeo)) { |
| 892 | − status = gpmc_nand_read(info->gpmc_cs, GPMC_NAND_DATA); | |
| 1014 | + status = readb(info->reg.gpmc_nand_data); | |
| 893 | 1015 | if (status & NAND_STATUS_READY) |
| 894 | 1016 | break; |
| 895 | 1017 | cond_resched(); |
| @@ -909,22 +1031,13 @@ static int omap_dev_ready(struct mtd_info *mtd) · 13 unmodified lines | ||
| 909 | 1031 | struct omap_nand_info *info = container_of(mtd, struct omap_nand_info, |
| 910 | 1032 | mtd); |
| 911 | 1033 | |
| 912 | − val = gpmc_read_status(GPMC_GET_IRQ_STATUS); | |
| 1034 | + val = readl(info->reg.gpmc_status); | |
| 1035 | + | |
| 913 | 1036 | if ((val & 0x100) == 0x100) { |
| 914 | − /* Clear IRQ Interrupt */ | |
| 915 | − val |= 0x100; | |
| 916 | − val &= ~(0x0); | |
| 917 | − gpmc_cs_configure(info->gpmc_cs, GPMC_SET_IRQ_STATUS, val); | |
| 1037 | + return 1; | |
| 918 | 1038 | } else { |
| 919 | − unsigned int cnt = 0; | |
| 920 | − while (cnt++ < 0x1FF) { | |
| 921 | − if ((val & 0x100) == 0x100) | |
| 922 | − return 0; | |
| 923 | − val = gpmc_read_status(GPMC_GET_IRQ_STATUS); | |
| 924 | − } | |
| 1039 | + return 0; | |
| 925 | 1040 | } |
| 926 | − | |
| 927 | − return 1; | |
| 928 | 1041 | } |
| 929 | 1042 | |
| 930 | 1043 | #ifdef CONFIG_MTD_NAND_OMAP_BCH |
| @@ -1155,6 +1268,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) · 224 unmodified lines | ||
| 1155 | 1268 | int i, offset; |
| 1156 | 1269 | dma_cap_mask_t mask; |
| 1157 | 1270 | unsigned sig; |
| 1271 | + struct resource *res; | |
| 1158 | 1272 | |
| 1159 | 1273 | pdata = pdev->dev.platform_data; |
| 1160 | 1274 | if (pdata == NULL) { |
| @@ -1174,7 +1288,7 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) · 13 unmodified lines | ||
| 1174 | 1288 | info->pdev = pdev; |
| 1175 | 1289 | |
| 1176 | 1290 | info->gpmc_cs = pdata->cs; |
| 1177 | − info->phys_base = pdata->phys_base; | |
| 1291 | + info->reg = pdata->reg; | |
| 1178 | 1292 | |
| 1179 | 1293 | info->mtd.priv = &info->nand; |
| 1180 | 1294 | info->mtd.name = dev_name(&pdev->dev); |
| @@ -1183,16 +1297,23 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) · 2 unmodified lines | ||
| 1183 | 1297 | info->nand.options = pdata->devsize; |
| 1184 | 1298 | info->nand.options |= NAND_SKIP_BBTSCAN; |
| 1185 | 1299 | |
| 1186 | − /* NAND write protect off */ | |
| 1187 | − gpmc_cs_configure(info->gpmc_cs, GPMC_CONFIG_WP, 0); | |
| 1300 | + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
| 1301 | + if (res == NULL) { | |
| 1302 | + err = -EINVAL; | |
| 1303 | + dev_err(&pdev->dev, "error getting memory resource\n"); | |
| 1304 | + goto out_free_info; | |
| 1305 | + } | |
| 1306 | + | |
| 1307 | + info->phys_base = res->start; | |
| 1308 | + info->mem_size = resource_size(res); | |
| 1188 | 1309 | |
| 1189 | − if (!request_mem_region(info->phys_base, NAND_IO_SIZE, | |
| 1310 | + if (!request_mem_region(info->phys_base, info->mem_size, | |
| 1190 | 1311 | pdev->dev.driver->name)) { |
| 1191 | 1312 | err = -EBUSY; |
| 1192 | 1313 | goto out_free_info; |
| 1193 | 1314 | } |
| 1194 | 1315 | |
| 1195 | − info->nand.IO_ADDR_R = ioremap(info->phys_base, NAND_IO_SIZE); | |
| 1316 | + info->nand.IO_ADDR_R = ioremap(info->phys_base, info->mem_size); | |
| 1196 | 1317 | if (!info->nand.IO_ADDR_R) { |
| 1197 | 1318 | err = -ENOMEM; |
| 1198 | 1319 | goto out_release_mem_region; |
| @@ -1265,17 +1386,39 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) · 66 unmodified lines | ||
| 1265 | 1386 | break; |
| 1266 | 1387 | |
| 1267 | 1388 | case NAND_OMAP_PREFETCH_IRQ: |
| 1268 | − err = request_irq(pdata->gpmc_irq, | |
| 1269 | − omap_nand_irq, IRQF_SHARED, "gpmc-nand", info); | |
| 1389 | + info->gpmc_irq_fifo = platform_get_irq(pdev, 0); | |
| 1390 | + if (info->gpmc_irq_fifo <= 0) { | |
| 1391 | + dev_err(&pdev->dev, "error getting fifo irq\n"); | |
| 1392 | + err = -ENODEV; | |
| 1393 | + goto out_release_mem_region; | |
| 1394 | + } | |
| 1395 | + err = request_irq(info->gpmc_irq_fifo, omap_nand_irq, | |
| 1396 | + IRQF_SHARED, "gpmc-nand-fifo", info); | |
| 1270 | 1397 | if (err) { |
| 1271 | 1398 | dev_err(&pdev->dev, "requesting irq(%d) error:%d", |
| 1272 | − pdata->gpmc_irq, err); | |
| 1399 | + info->gpmc_irq_fifo, err); | |
| 1400 | + info->gpmc_irq_fifo = 0; | |
| 1401 | + goto out_release_mem_region; | |
| 1402 | + } | |
| 1403 | + | |
| 1404 | + info->gpmc_irq_count = platform_get_irq(pdev, 1); | |
| 1405 | + if (info->gpmc_irq_count <= 0) { | |
| 1406 | + dev_err(&pdev->dev, "error getting count irq\n"); | |
| 1407 | + err = -ENODEV; | |
| 1408 | + goto out_release_mem_region; | |
| 1409 | + } | |
| 1410 | + err = request_irq(info->gpmc_irq_count, omap_nand_irq, | |
| 1411 | + IRQF_SHARED, "gpmc-nand-count", info); | |
| 1412 | + if (err) { | |
| 1413 | + dev_err(&pdev->dev, "requesting irq(%d) error:%d", | |
| 1414 | + info->gpmc_irq_count, err); | |
| 1415 | + info->gpmc_irq_count = 0; | |
| 1273 | 1416 | goto out_release_mem_region; |
| 1274 | − } else { | |
| 1275 | − info->gpmc_irq = pdata->gpmc_irq; | |
| 1276 | − info->nand.read_buf = omap_read_buf_irq_pref; | |
| 1277 | − info->nand.write_buf = omap_write_buf_irq_pref; | |
| 1278 | 1417 | } |
| 1418 | + | |
| 1419 | + info->nand.read_buf = omap_read_buf_irq_pref; | |
| 1420 | + info->nand.write_buf = omap_write_buf_irq_pref; | |
| 1421 | + | |
| 1279 | 1422 | break; |
| 1280 | 1423 | |
| 1281 | 1424 | default: |
| @@ -1363,7 +1506,11 @@ static int __devinit omap_nand_probe(struct platform_device *pdev) · 81 unmodified lines | ||
| 1363 | 1506 | out_release_mem_region: |
| 1364 | 1507 | if (info->dma) |
| 1365 | 1508 | dma_release_channel(info->dma); |
| 1366 | − release_mem_region(info->phys_base, NAND_IO_SIZE); | |
| 1509 | + if (info->gpmc_irq_count > 0) | |
| 1510 | + free_irq(info->gpmc_irq_count, info); | |
| 1511 | + if (info->gpmc_irq_fifo > 0) | |
| 1512 | + free_irq(info->gpmc_irq_fifo, info); | |
| 1513 | + release_mem_region(info->phys_base, info->mem_size); | |
| 1367 | 1514 | out_free_info: |
| 1368 | 1515 | kfree(info); |
| 1369 | 1516 | |
| @@ -1381,8 +1528,10 @@ static int omap_nand_remove(struct platform_device *pdev) · 11 unmodified lines | ||
| 1381 | 1528 | if (info->dma) |
| 1382 | 1529 | dma_release_channel(info->dma); |
| 1383 | 1530 | |
| 1384 | − if (info->gpmc_irq) | |
| 1385 | − free_irq(info->gpmc_irq, info); | |
| 1531 | + if (info->gpmc_irq_count > 0) | |
| 1532 | + free_irq(info->gpmc_irq_count, info); | |
| 1533 | + if (info->gpmc_irq_fifo > 0) | |
| 1534 | + free_irq(info->gpmc_irq_fifo, info); | |
| 1386 | 1535 | |
| 1387 | 1536 | /* Release NAND device, its internal structures and partitions */ |
| 1388 | 1537 | nand_release(&info->mtd); |
| @@ -44,17 +44,15 @@ · 43 unmodified lines | ||
| 44 | 44 | |
| 45 | 45 | #include <plat/dma.h> |
| 46 | 46 | |
| 47 | −#include <plat/board.h> | |
| 48 | − | |
| 49 | 47 | #define DRIVER_NAME "omap2-onenand" |
| 50 | 48 | |
| 51 | −#define ONENAND_IO_SIZE SZ_128K | |
| 52 | 49 | #define ONENAND_BUFRAM_SIZE (1024 * 5) |
| 53 | 50 | |
| 54 | 51 | struct omap2_onenand { |
| 55 | 52 | struct platform_device *pdev; |
| 56 | 53 | int gpmc_cs; |
| 57 | 54 | unsigned long phys_base; |
| 55 | + unsigned int mem_size; | |
| 58 | 56 | int gpio_irq; |
| 59 | 57 | struct mtd_info mtd; |
| 60 | 58 | struct onenand_chip onenand; |
| @@ -626,6 +624,7 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) · 565 unmodified lines | ||
| 626 | 624 | struct omap2_onenand *c; |
| 627 | 625 | struct onenand_chip *this; |
| 628 | 626 | int r; |
| 627 | + struct resource *res; | |
| 629 | 628 | |
| 630 | 629 | pdata = pdev->dev.platform_data; |
| 631 | 630 | if (pdata == NULL) { |
| @@ -647,20 +646,24 @@ static int __devinit omap2_onenand_probe(struct platform_device *pdev) · 15 unmodified lines | ||
| 647 | 646 | c->gpio_irq = 0; |
| 648 | 647 | } |
| 649 | 648 | |
| 650 | − r = gpmc_cs_request(c->gpmc_cs, ONENAND_IO_SIZE, &c->phys_base); | |
| 651 | − if (r < 0) { | |
| 652 | − dev_err(&pdev->dev, "Cannot request GPMC CS\n"); | |
| 649 | + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | |
| 650 | + if (res == NULL) { | |
| 651 | + r = -EINVAL; | |
| 652 | + dev_err(&pdev->dev, "error getting memory resource\n"); | |
| 653 | 653 | goto err_kfree; |
| 654 | 654 | } |
| 655 | 655 | |
| 656 | − if (request_mem_region(c->phys_base, ONENAND_IO_SIZE, | |
| 656 | + c->phys_base = res->start; | |
| 657 | + c->mem_size = resource_size(res); | |
| 658 | + | |
| 659 | + if (request_mem_region(c->phys_base, c->mem_size, | |
| 657 | 660 | pdev->dev.driver->name) == NULL) { |
| 658 | − dev_err(&pdev->dev, "Cannot reserve memory region at 0x%08lx, " | |
| 659 | − "size: 0x%x\n", c->phys_base, ONENAND_IO_SIZE); | |
| 661 | + dev_err(&pdev->dev, "Cannot reserve memory region at 0x%08lx, size: 0x%x\n", | |
| 662 | + c->phys_base, c->mem_size); | |
| 660 | 663 | r = -EBUSY; |
| 661 | − goto err_free_cs; | |
| 664 | + goto err_kfree; | |
| 662 | 665 | } |
| 663 | − c->onenand.base = ioremap(c->phys_base, ONENAND_IO_SIZE); | |
| 666 | + c->onenand.base = ioremap(c->phys_base, c->mem_size); | |
| 664 | 667 | if (c->onenand.base == NULL) { |
| 665 | 668 | r = -ENOMEM; |
| 666 | 669 | goto err_release_mem_region; |
| @@ -776,9 +779,7 @@ err_release_gpio: · 109 unmodified lines | ||
| 776 | 779 | err_iounmap: |
| 777 | 780 | iounmap(c->onenand.base); |
| 778 | 781 | err_release_mem_region: |
| 779 | − release_mem_region(c->phys_base, ONENAND_IO_SIZE); | |
| 780 | −err_free_cs: | |
| 781 | − gpmc_cs_free(c->gpmc_cs); | |
| 782 | + release_mem_region(c->phys_base, c->mem_size); | |
| 782 | 783 | err_kfree: |
| 783 | 784 | kfree(c); |
| 784 | 785 | |
| @@ -800,7 +801,7 @@ static int __devexit omap2_onenand_remove(struct platform_device *pdev) · 15 unmodified lines | ||
| 800 | 801 | gpio_free(c->gpio_irq); |
| 801 | 802 | } |
| 802 | 803 | iounmap(c->onenand.base); |
| 803 | − release_mem_region(c->phys_base, ONENAND_IO_SIZE); | |
| 804 | + release_mem_region(c->phys_base, c->mem_size); | |
| 804 | 805 | gpmc_cs_free(c->gpmc_cs); |
| 805 | 806 | kfree(c); |
| 806 | 807 | |
| @@ -340,7 +340,7 @@ retry: · 339 unmodified lines | ||
| 340 | 340 | * of this LEB as it will be deleted and freed in 'ubi_add_to_av()'. |
| 341 | 341 | */ |
| 342 | 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 | 344 | ubi_free_vid_hdr(ubi, vid_hdr); |
| 345 | 345 | return err; |
| 346 | 346 | |
| @@ -353,7 +353,7 @@ write_error: · 6 unmodified lines | ||
| 353 | 353 | list_add(&new_aeb->u.list, &ai->erase); |
| 354 | 354 | goto retry; |
| 355 | 355 | } |
| 356 | − kfree(new_aeb); | |
| 356 | + kmem_cache_free(ai->aeb_slab_cache, new_aeb); | |
| 357 | 357 | out_free: |
| 358 | 358 | ubi_free_vid_hdr(ubi, vid_hdr); |
| 359 | 359 | return err; |
| @@ -109,7 +109,9 @@ static int sp_probe(struct platform_device *pdev) · 108 unmodified lines | ||
| 109 | 109 | priv = netdev_priv(dev); |
| 110 | 110 | |
| 111 | 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 | 115 | priv->reg_base = addr; |
| 114 | 116 | /* The CAN clock frequency is half the oscillator clock frequency */ |
| 115 | 117 | priv->can.clock.freq = pdata->osc_freq / 2; |
| @@ -150,7 +150,7 @@ int softing_load_fw(const char *file, struct softing *card, · 149 unmodified lines | ||
| 150 | 150 | const uint8_t *mem, *end, *dat; |
| 151 | 151 | uint16_t type, len; |
| 152 | 152 | uint32_t addr; |
| 153 | − uint8_t *buf = NULL; | |
| 153 | + uint8_t *buf = NULL, *new_buf; | |
| 154 | 154 | int buflen = 0; |
| 155 | 155 | int8_t type_end = 0; |
| 156 | 156 | |
| @@ -199,11 +199,12 @@ int softing_load_fw(const char *file, struct softing *card, · 42 unmodified lines | ||
| 199 | 199 | if (len > buflen) { |
| 200 | 200 | /* align buflen */ |
| 201 | 201 | buflen = (len + (1024-1)) & ~(1024-1); |
| 202 | − buf = krealloc(buf, buflen, GFP_KERNEL); | |
| 203 | − if (!buf) { | |
| 202 | + new_buf = krealloc(buf, buflen, GFP_KERNEL); | |
| 203 | + if (!new_buf) { | |
| 204 | 204 | ret = -ENOMEM; |
| 205 | 205 | goto failed; |
| 206 | 206 | } |
| 207 | + buf = new_buf; | |
| 207 | 208 | } |
| 208 | 209 | /* verify record data */ |
| 209 | 210 | memcpy_fromio(buf, &dpram[addr + offset], len); |
| @@ -1708,9 +1708,6 @@ struct bnx2x_func_init_params { · 1707 unmodified lines | ||
| 1708 | 1708 | continue; \ |
| 1709 | 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 | 1711 | /* Skip OOO FP */ |
| 1715 | 1712 | #define for_each_tx_queue(bp, var) \ |
| 1716 | 1713 | for ((var) = 0; (var) < BNX2X_NUM_QUEUES(bp); (var)++) \ |
| @@ -2046,6 +2046,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) · 2045 unmodified lines | ||
| 2046 | 2046 | */ |
| 2047 | 2047 | bnx2x_setup_tc(bp->dev, bp->max_cos); |
| 2048 | 2048 | |
| 2049 | + /* Add all NAPI objects */ | |
| 2050 | + bnx2x_add_all_napi(bp); | |
| 2049 | 2051 | bnx2x_napi_enable(bp); |
| 2050 | 2052 | |
| 2051 | 2053 | /* set pf load just before approaching the MCP */ |
| @@ -2408,6 +2410,8 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode) · 356 unmodified lines | ||
| 2408 | 2410 | |
| 2409 | 2411 | /* Disable HW interrupts, NAPI */ |
| 2410 | 2412 | bnx2x_netif_stop(bp, 1); |
| 2413 | + /* Delete all NAPI objects */ | |
| 2414 | + bnx2x_del_all_napi(bp); | |
| 2411 | 2415 | |
| 2412 | 2416 | /* Release IRQs */ |
| 2413 | 2417 | bnx2x_free_irq(bp); |
| @@ -792,7 +792,7 @@ static inline void bnx2x_add_all_napi(struct bnx2x *bp) · 791 unmodified lines | ||
| 792 | 792 | bp->num_napi_queues = bp->num_queues; |
| 793 | 793 | |
| 794 | 794 | /* Add NAPI objects */ |
| 795 | − for_each_napi_rx_queue(bp, i) | |
| 795 | + for_each_rx_queue(bp, i) | |
| 796 | 796 | netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi), |
| 797 | 797 | bnx2x_poll, BNX2X_NAPI_WEIGHT); |
| 798 | 798 | } |
| @@ -801,7 +801,7 @@ static inline void bnx2x_del_all_napi(struct bnx2x *bp) · 2 unmodified lines | ||
| 801 | 801 | { |
| 802 | 802 | int i; |
| 803 | 803 | |
| 804 | − for_each_napi_rx_queue(bp, i) | |
| 804 | + for_each_rx_queue(bp, i) | |
| 805 | 805 | netif_napi_del(&bnx2x_fp(bp, i, napi)); |
| 806 | 806 | } |
| 807 | 807 | |
| @@ -2888,11 +2888,9 @@ static void bnx2x_get_channels(struct net_device *dev, · 2887 unmodified lines | ||
| 2888 | 2888 | */ |
| 2889 | 2889 | static void bnx2x_change_num_queues(struct bnx2x *bp, int num_rss) |
| 2890 | 2890 | { |
| 2891 | − bnx2x_del_all_napi(bp); | |
| 2892 | 2891 | bnx2x_disable_msi(bp); |
| 2893 | 2892 | BNX2X_NUM_QUEUES(bp) = num_rss + NON_ETH_CONTEXT_USE; |
| 2894 | 2893 | bnx2x_set_int_mode(bp); |
| 2895 | − bnx2x_add_all_napi(bp); | |
| 2896 | 2894 | } |
| 2897 | 2895 | |
| 2898 | 2896 | /** |
| @@ -8427,6 +8427,8 @@ unload_error: · 8426 unmodified lines | ||
| 8427 | 8427 | |
| 8428 | 8428 | /* Disable HW interrupts, NAPI */ |
| 8429 | 8429 | bnx2x_netif_stop(bp, 1); |
| 8430 | + /* Delete all NAPI objects */ | |
| 8431 | + bnx2x_del_all_napi(bp); | |
| 8430 | 8432 | |
| 8431 | 8433 | /* Release IRQs */ |
| 8432 | 8434 | bnx2x_free_irq(bp); |
| @@ -11229,10 +11231,12 @@ static int bnx2x_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) · 2796 unmodified lines | ||
| 11229 | 11231 | static void poll_bnx2x(struct net_device *dev) |
| 11230 | 11232 | { |
| 11231 | 11233 | struct bnx2x *bp = netdev_priv(dev); |
| 11234 | + int i; | |
| 11232 | 11235 | |
| 11233 | − disable_irq(bp->pdev->irq); | |
| 11234 | − bnx2x_interrupt(bp->pdev->irq, dev); | |
| 11235 | − enable_irq(bp->pdev->irq); | |
| 11236 | + for_each_eth_queue(bp, i) { | |
| 11237 | + struct bnx2x_fastpath *fp = &bp->fp[i]; | |
| 11238 | + napi_schedule(&bnx2x_fp(bp, fp->index, napi)); | |
| 11239 | + } | |
| 11236 | 11240 | } |
| 11237 | 11241 | #endif |
| 11238 | 11242 | |
| @@ -11899,9 +11903,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev, · 660 unmodified lines | ||
| 11899 | 11903 | */ |
| 11900 | 11904 | bnx2x_set_int_mode(bp); |
| 11901 | 11905 | |
| 11902 | − /* Add all NAPI objects */ | |
| 11903 | − bnx2x_add_all_napi(bp); | |
| 11904 | − | |
| 11905 | 11906 | rc = register_netdev(dev); |
| 11906 | 11907 | if (rc) { |
| 11907 | 11908 | dev_err(&pdev->dev, "Cannot register net device\n"); |
| @@ -11976,9 +11977,6 @@ static void __devexit bnx2x_remove_one(struct pci_dev *pdev) · 68 unmodified lines | ||
| 11976 | 11977 | |
| 11977 | 11978 | unregister_netdev(dev); |
| 11978 | 11979 | |
| 11979 | − /* Delete all NAPI objects */ | |
| 11980 | − bnx2x_del_all_napi(bp); | |
| 11981 | − | |
| 11982 | 11980 | /* Power on: we can't let PCI layer write to us while we are in D3 */ |
| 11983 | 11981 | bnx2x_set_power_state(bp, PCI_D0); |
| 11984 | 11982 | |
| @@ -12025,6 +12023,8 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp) · 40 unmodified lines | ||
| 12025 | 12023 | bnx2x_tx_disable(bp); |
| 12026 | 12024 | |
| 12027 | 12025 | bnx2x_netif_stop(bp, 0); |
| 12026 | + /* Delete all NAPI objects */ | |
| 12027 | + bnx2x_del_all_napi(bp); | |
| 12028 | 12028 | |
| 12029 | 12029 | del_timer_sync(&bp->timer); |
| 12030 | 12030 | |
| @@ -1243,6 +1243,7 @@ static void set_multicast_list(struct net_device *dev) · 1242 unmodified lines | ||
| 1243 | 1243 | { |
| 1244 | 1244 | struct net_local *lp = netdev_priv(dev); |
| 1245 | 1245 | unsigned long flags; |
| 1246 | + u16 cfg; | |
| 1246 | 1247 | |
| 1247 | 1248 | spin_lock_irqsave(&lp->lock, flags); |
| 1248 | 1249 | if (dev->flags & IFF_PROMISC) |
| @@ -1260,11 +1261,10 @@ static void set_multicast_list(struct net_device *dev) · 11 unmodified lines | ||
| 1260 | 1261 | /* in promiscuous mode, we accept errored packets, |
| 1261 | 1262 | * so we have to enable interrupts on them also |
| 1262 | 1263 | */ |
| 1263 | − writereg(dev, PP_RxCFG, | |
| 1264 | − (lp->curr_rx_cfg | | |
| 1265 | − (lp->rx_mode == RX_ALL_ACCEPT) | |
| 1266 | − ? (RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL) | |
| 1267 | − : 0)); | |
| 1264 | + cfg = lp->curr_rx_cfg; | |
| 1265 | + if (lp->rx_mode == RX_ALL_ACCEPT) | |
| 1266 | + cfg |= RX_CRC_ERROR_ENBL | RX_RUNT_ENBL | RX_EXTRA_DATA_ENBL; | |
| 1267 | + writereg(dev, PP_RxCFG, cfg); | |
| 1268 | 1268 | spin_unlock_irqrestore(&lp->lock, flags); |
| 1269 | 1269 | } |
| 1270 | 1270 | |
| @@ -259,7 +259,7 @@ int be_process_mcc(struct be_adapter *adapter) · 258 unmodified lines | ||
| 259 | 259 | int num = 0, status = 0; |
| 260 | 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 | 263 | while ((compl = be_mcc_compl_get(adapter))) { |
| 264 | 264 | if (compl->flags & CQE_FLAGS_ASYNC_MASK) { |
| 265 | 265 | /* Interpret flags as an async trailer */ |
| @@ -280,7 +280,7 @@ int be_process_mcc(struct be_adapter *adapter) · 14 unmodified lines | ||
| 280 | 280 | if (num) |
| 281 | 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 | 284 | return status; |
| 285 | 285 | } |
| 286 | 286 | |
| @@ -295,7 +295,9 @@ static int be_mcc_wait_compl(struct be_adapter *adapter) · 8 unmodified lines | ||
| 295 | 295 | if (be_error(adapter)) |
| 296 | 296 | return -EIO; |
| 297 | 297 | |
| 298 | + local_bh_disable(); | |
| 298 | 299 | status = be_process_mcc(adapter); |
| 300 | + local_bh_enable(); | |
| 299 | 301 | |
| 300 | 302 | if (atomic_read(&mcc_obj->q.used) == 0) |
| 301 | 303 | break; |
| @@ -3763,7 +3763,9 @@ static void be_worker(struct work_struct *work) · 3762 unmodified lines | ||
| 3763 | 3763 | /* when interrupts are not yet enabled, just reap any pending |
| 3764 | 3764 | * mcc completions */ |
| 3765 | 3765 | if (!netif_running(adapter->netdev)) { |
| 3766 | + local_bh_disable(); | |
| 3766 | 3767 | be_process_mcc(adapter); |
| 3768 | + local_bh_enable(); | |
| 3767 | 3769 | goto reschedule; |
| 3768 | 3770 | } |
| 3769 | 3771 | |
| @@ -1041,7 +1041,7 @@ static int gfar_probe(struct platform_device *ofdev) · 1040 unmodified lines | ||
| 1041 | 1041 | |
| 1042 | 1042 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_VLAN) { |
| 1043 | 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 | 1047 | if (priv->device_flags & FSL_GIANFAR_DEV_HAS_EXTENDED_HASH) { |
| @@ -310,6 +310,7 @@ struct e1000_adapter { · 309 unmodified lines | ||
| 310 | 310 | */ |
| 311 | 311 | struct e1000_ring *tx_ring /* One per active queue */ |
| 312 | 312 | ____cacheline_aligned_in_smp; |
| 313 | + u32 tx_fifo_limit; | |
| 313 | 314 | |
| 314 | 315 | struct napi_struct napi; |
| 315 | 316 | |
| @@ -3516,6 +3516,15 @@ void e1000e_reset(struct e1000_adapter *adapter) · 3515 unmodified lines | ||
| 3516 | 3516 | break; |
| 3517 | 3517 | } |
| 3518 | 3518 | |
| 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 | + | |
| 3519 | 3528 | /* |
| 3520 | 3529 | * Disable Adaptive Interrupt Moderation if 2 full packets cannot |
| 3521 | 3530 | * fit in receive buffer. |
| @@ -4785,12 +4794,9 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb) · 1263 unmodified lines | ||
| 4785 | 4794 | return 1; |
| 4786 | 4795 | } |
| 4787 | 4796 | |
| 4788 | −#define E1000_MAX_PER_TXD 8192 | |
| 4789 | −#define E1000_MAX_TXD_PWR 12 | |
| 4790 | − | |
| 4791 | 4797 | static int e1000_tx_map(struct e1000_ring *tx_ring, struct sk_buff *skb, |
| 4792 | 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 | 4801 | struct e1000_adapter *adapter = tx_ring->adapter; |
| 4796 | 4802 | struct pci_dev *pdev = adapter->pdev; |
| @@ -5023,20 +5029,19 @@ static int __e1000_maybe_stop_tx(struct e1000_ring *tx_ring, int size) · 226 unmodified lines | ||
| 5023 | 5029 | |
| 5024 | 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 | 5034 | if (e1000_desc_unused(tx_ring) >= size) |
| 5027 | 5035 | return 0; |
| 5028 | 5036 | return __e1000_maybe_stop_tx(tx_ring, size); |
| 5029 | 5037 | } |
| 5030 | 5038 | |
| 5031 | −#define TXD_USE_COUNT(S, X) (((S) >> (X)) + 1) | |
| 5032 | 5039 | static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, |
| 5033 | 5040 | struct net_device *netdev) |
| 5034 | 5041 | { |
| 5035 | 5042 | struct e1000_adapter *adapter = netdev_priv(netdev); |
| 5036 | 5043 | struct e1000_ring *tx_ring = adapter->tx_ring; |
| 5037 | 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 | 5045 | unsigned int tx_flags = 0; |
| 5041 | 5046 | unsigned int len = skb_headlen(skb); |
| 5042 | 5047 | unsigned int nr_frags; |
| @@ -5056,18 +5061,8 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, · 13 unmodified lines | ||
| 5056 | 5061 | } |
| 5057 | 5062 | |
| 5058 | 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 | 5064 | if (mss) { |
| 5068 | 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 | 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, · 23 unmodified lines | ||
| 5097 | 5092 | count++; |
| 5098 | 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 | 5097 | nr_frags = skb_shinfo(skb)->nr_frags; |
| 5103 | 5098 | for (f = 0; f < nr_frags; f++) |
| 5104 | − count += TXD_USE_COUNT(skb_frag_size(&skb_shinfo(skb)->frags[f]), | |
| 5105 | − max_txd_pwr); | |
| 5099 | + count += DIV_ROUND_UP(skb_frag_size(&skb_shinfo(skb)->frags[f]), | |
| 5100 | + adapter->tx_fifo_limit); | |
| 5106 | 5101 | |
| 5107 | 5102 | if (adapter->hw.mac.tx_pkt_filtering) |
| 5108 | 5103 | e1000_transfer_dhcp_info(adapter, skb); |
| @@ -5144,15 +5139,18 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb, · 35 unmodified lines | ||
| 5144 | 5139 | tx_flags |= E1000_TX_FLAGS_NO_FCS; |
| 5145 | 5140 | |
| 5146 | 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 | 5144 | if (count) { |
| 5149 | 5145 | skb_tx_timestamp(skb); |
| 5150 | 5146 | |
| 5151 | 5147 | netdev_sent_queue(netdev, skb->len); |
| 5152 | 5148 | e1000_tx_queue(tx_ring, tx_flags, count); |
| 5153 | 5149 | /* Make sure there is space in the ring for the next send. */ |
| 5154 | − e1000_maybe_stop_tx(tx_ring, MAX_SKB_FRAGS + 2); | |
| 5155 | − | |
| 5150 | + e1000_maybe_stop_tx(tx_ring, | |
| 5151 | + (MAX_SKB_FRAGS * | |
| 5152 | + DIV_ROUND_UP(PAGE_SIZE, | |
| 5153 | + adapter->tx_fifo_limit) + 2)); | |
| 5156 | 5154 | } else { |
| 5157 | 5155 | dev_kfree_skb_any(skb); |
| 5158 | 5156 | tx_ring->buffer_info[first].time_stamp = 0; |
| @@ -6327,8 +6325,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev, · 1168 unmodified lines | ||
| 6327 | 6325 | adapter->hw.phy.autoneg_advertised = 0x2f; |
| 6328 | 6326 | |
| 6329 | 6327 | /* ring size defaults */ |
| 6330 | − adapter->rx_ring->count = 256; | |
| 6331 | − adapter->tx_ring->count = 256; | |
| 6328 | + adapter->rx_ring->count = E1000_DEFAULT_RXD; | |
| 6329 | + adapter->tx_ring->count = E1000_DEFAULT_TXD; | |
| 6332 | 6330 | |
| 6333 | 6331 | /* |
| 6334 | 6332 | * Initial Wake on LAN setting - If APM wake is enabled in |
| @@ -863,8 +863,8 @@ static int efx_ethtool_get_class_rule(struct efx_nic *efx, · 862 unmodified lines | ||
| 863 | 863 | &ip_entry->ip4dst, &ip_entry->pdst); |
| 864 | 864 | if (rc != 0) { |
| 865 | 865 | rc = efx_filter_get_ipv4_full( |
| 866 | − &spec, &proto, &ip_entry->ip4src, &ip_entry->psrc, | |
| 867 | − &ip_entry->ip4dst, &ip_entry->pdst); | |
| 866 | + &spec, &proto, &ip_entry->ip4dst, &ip_entry->pdst, | |
| 867 | + &ip_entry->ip4src, &ip_entry->psrc); | |
| 868 | 868 | EFX_WARN_ON_PARANOID(rc); |
| 869 | 869 | ip_mask->ip4src = ~0; |
| 870 | 870 | ip_mask->psrc = ~0; |
| @@ -22,6 +22,9 @@ · 21 unmodified lines | ||
| 22 | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | 23 | *******************************************************************************/ |
| 24 | 24 | |
| 25 | +#ifndef __COMMON_H__ | |
| 26 | +#define __COMMON_H__ | |
| 27 | + | |
| 25 | 28 | #include <linux/etherdevice.h> |
| 26 | 29 | #include <linux/netdevice.h> |
| 27 | 30 | #include <linux/phy.h> |
| @@ -366,3 +369,5 @@ extern void stmmac_set_mac(void __iomem *ioaddr, bool enable); · 338 unmodified lines | ||
| 366 | 369 | |
| 367 | 370 | extern void dwmac_dma_flush_tx_fifo(void __iomem *ioaddr); |
| 368 | 371 | extern const struct stmmac_ring_mode_ops ring_mode_ops; |
| 372 | + | |
| 373 | +#endif /* __COMMON_H__ */ | |
| @@ -20,6 +20,10 @@ · 19 unmodified lines | ||
| 20 | 20 | |
| 21 | 21 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 22 | 22 | *******************************************************************************/ |
| 23 | + | |
| 24 | +#ifndef __DESCS_H__ | |
| 25 | +#define __DESCS_H__ | |
| 26 | + | |
| 23 | 27 | struct dma_desc { |
| 24 | 28 | /* Receive descriptor */ |
| 25 | 29 | union { |
| @@ -166,3 +170,5 @@ enum tdes_csum_insertion { · 140 unmodified lines | ||
| 166 | 170 | * is not calculated */ |
| 167 | 171 | cic_full = 3, /* IP header and pseudoheader */ |
| 168 | 172 | }; |
| 173 | + | |
| 174 | +#endif /* __DESCS_H__ */ | |
| @@ -27,6 +27,9 @@ · 26 unmodified lines | ||
| 27 | 27 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 28 | 28 | *******************************************************************************/ |
| 29 | 29 | |
| 30 | +#ifndef __DESC_COM_H__ | |
| 31 | +#define __DESC_COM_H__ | |
| 32 | + | |
| 30 | 33 | #if defined(CONFIG_STMMAC_RING) |
| 31 | 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) · 91 unmodified lines | ||
| 124 | 127 | p->des01.tx.buffer1_size = len; |
| 125 | 128 | } |
| 126 | 129 | #endif |
| 130 | + | |
| 131 | +#endif /* __DESC_COM_H__ */ | |
| @@ -22,6 +22,9 @@ · 21 unmodified lines | ||
| 22 | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | 23 | *******************************************************************************/ |
| 24 | 24 | |
| 25 | +#ifndef __DWMAC100_H__ | |
| 26 | +#define __DWMAC100_H__ | |
| 27 | + | |
| 25 | 28 | #include <linux/phy.h> |
| 26 | 29 | #include "common.h" |
| 27 | 30 | |
| @@ -119,3 +122,5 @@ enum ttc_control { · 91 unmodified lines | ||
| 119 | 122 | #define DMA_MISSED_FRAME_M_CNTR 0x0000ffff /* Missed Frame Couinter */ |
| 120 | 123 | |
| 121 | 124 | extern const struct stmmac_dma_ops dwmac100_dma_ops; |
| 125 | + | |
| 126 | +#endif /* __DWMAC100_H__ */ | |
| @@ -19,6 +19,8 @@ · 18 unmodified lines | ||
| 19 | 19 | |
| 20 | 20 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 21 | 21 | *******************************************************************************/ |
| 22 | +#ifndef __DWMAC1000_H__ | |
| 23 | +#define __DWMAC1000_H__ | |
| 22 | 24 | |
| 23 | 25 | #include <linux/phy.h> |
| 24 | 26 | #include "common.h" |
| @@ -229,6 +231,7 @@ enum rtc_control { · 204 unmodified lines | ||
| 229 | 231 | #define GMAC_MMC_RX_CSUM_OFFLOAD 0x208 |
| 230 | 232 | |
| 231 | 233 | /* Synopsys Core versions */ |
| 232 | −#define DWMAC_CORE_3_40 34 | |
| 234 | +#define DWMAC_CORE_3_40 0x34 | |
| 233 | 235 | |
| 234 | 236 | extern const struct stmmac_dma_ops dwmac1000_dma_ops; |
| 237 | +#endif /* __DWMAC1000_H__ */ | |
| @@ -22,6 +22,9 @@ · 21 unmodified lines | ||
| 22 | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | 23 | *******************************************************************************/ |
| 24 | 24 | |
| 25 | +#ifndef __DWMAC_DMA_H__ | |
| 26 | +#define __DWMAC_DMA_H__ | |
| 27 | + | |
| 25 | 28 | /* DMA CRS Control and Status Register Mapping */ |
| 26 | 29 | #define DMA_BUS_MODE 0x00001000 /* Bus Mode */ |
| 27 | 30 | #define DMA_XMT_POLL_DEMAND 0x00001004 /* Transmit Poll Demand */ |
| @@ -109,3 +112,5 @@ extern void dwmac_dma_start_rx(void __iomem *ioaddr); · 81 unmodified lines | ||
| 109 | 112 | extern void dwmac_dma_stop_rx(void __iomem *ioaddr); |
| 110 | 113 | extern int dwmac_dma_interrupt(void __iomem *ioaddr, |
| 111 | 114 | struct stmmac_extra_stats *x); |
| 115 | + | |
| 116 | +#endif /* __DWMAC_DMA_H__ */ | |
| @@ -22,6 +22,9 @@ · 21 unmodified lines | ||
| 22 | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | 23 | *******************************************************************************/ |
| 24 | 24 | |
| 25 | +#ifndef __MMC_H__ | |
| 26 | +#define __MMC_H__ | |
| 27 | + | |
| 25 | 28 | /* MMC control register */ |
| 26 | 29 | /* When set, all counter are reset */ |
| 27 | 30 | #define MMC_CNTRL_COUNTER_RESET 0x1 |
| @@ -129,3 +132,5 @@ struct stmmac_counters { · 101 unmodified lines | ||
| 129 | 132 | extern void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode); |
| 130 | 133 | extern void dwmac_mmc_intr_all_mask(void __iomem *ioaddr); |
| 131 | 134 | extern void dwmac_mmc_read(void __iomem *ioaddr, struct stmmac_counters *mmc); |
| 135 | + | |
| 136 | +#endif /* __MMC_H__ */ | |
| @@ -33,7 +33,7 @@ · 32 unmodified lines | ||
| 33 | 33 | #define MMC_TX_INTR 0x00000108 /* MMC TX Interrupt */ |
| 34 | 34 | #define MMC_RX_INTR_MASK 0x0000010c /* MMC Interrupt Mask */ |
| 35 | 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 | 38 | /* MMC TX counter registers */ |
| 39 | 39 | |
| @@ -147,8 +147,8 @@ void dwmac_mmc_ctrl(void __iomem *ioaddr, unsigned int mode) · 107 unmodified lines | ||
| 147 | 147 | /* To mask all all interrupts.*/ |
| 148 | 148 | void dwmac_mmc_intr_all_mask(void __iomem *ioaddr) |
| 149 | 149 | { |
| 150 | − writel(MMC_DEFAUL_MASK, ioaddr + MMC_RX_INTR_MASK); | |
| 151 | − writel(MMC_DEFAUL_MASK, ioaddr + MMC_TX_INTR_MASK); | |
| 150 | + writel(MMC_DEFAULT_MASK, ioaddr + MMC_RX_INTR_MASK); | |
| 151 | + writel(MMC_DEFAULT_MASK, ioaddr + MMC_TX_INTR_MASK); | |
| 152 | 152 | } |
| 153 | 153 | |
| 154 | 154 | /* This reads the MAC core counters (if actaully supported). |
| @@ -20,6 +20,9 @@ · 19 unmodified lines | ||
| 20 | 20 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 21 | 21 | *******************************************************************************/ |
| 22 | 22 | |
| 23 | +#ifndef __STMMAC_H__ | |
| 24 | +#define __STMMAC_H__ | |
| 25 | + | |
| 23 | 26 | #define STMMAC_RESOURCE_NAME "stmmaceth" |
| 24 | 27 | #define DRV_MODULE_VERSION "March_2012" |
| 25 | 28 | |
| @@ -166,3 +169,5 @@ static inline void stmmac_unregister_pci(void) · 140 unmodified lines | ||
| 166 | 169 | { |
| 167 | 170 | } |
| 168 | 171 | #endif /* CONFIG_STMMAC_PCI */ |
| 172 | + | |
| 173 | +#endif /* __STMMAC_H__ */ | |
| @@ -21,6 +21,8 @@ · 20 unmodified lines | ||
| 21 | 21 | |
| 22 | 22 | Author: Giuseppe Cavallaro <peppe.cavallaro@st.com> |
| 23 | 23 | *******************************************************************************/ |
| 24 | +#ifndef __STMMAC_TIMER_H__ | |
| 25 | +#define __STMMAC_TIMER_H__ | |
| 24 | 26 | |
| 25 | 27 | struct stmmac_timer { |
| 26 | 28 | void (*timer_start) (unsigned int new_freq); |
| @@ -40,3 +42,5 @@ void stmmac_schedule(struct net_device *dev); · 13 unmodified lines | ||
| 40 | 42 | extern int tmu2_register_user(void *fnt, void *data); |
| 41 | 43 | extern void tmu2_unregister_user(void); |
| 42 | 44 | #endif |
| 45 | + | |
| 46 | +#endif /* __STMMAC_TIMER_H__ */ | |
| @@ -394,8 +394,10 @@ static int __devexit davinci_mdio_remove(struct platform_device *pdev) · 393 unmodified lines | ||
| 394 | 394 | struct device *dev = &pdev->dev; |
| 395 | 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 | 399 | mdiobus_free(data->bus); |
| 400 | + } | |
| 399 | 401 | |
| 400 | 402 | if (data->clk) |
| 401 | 403 | clk_put(data->clk); |
| @@ -673,7 +673,7 @@ void smt_add_para(struct s_smc *smc, struct s_pcon *pcon, u_short para, · 672 unmodified lines | ||
| 673 | 673 | sm_pm_get_ls(smc,port_to_mib(smc,port))) ; |
| 674 | 674 | break ; |
| 675 | 675 | case SMT_P_REASON : |
| 676 | − * (u_long *) to = 0 ; | |
| 676 | + *(u32 *)to = 0 ; | |
| 677 | 677 | sp_len = 4 ; |
| 678 | 678 | goto sp_done ; |
| 679 | 679 | case SMT_P1033 : /* time stamp */ |
| @@ -413,7 +413,9 @@ static const struct usb_device_id products[] = { · 412 unmodified lines | ||
| 413 | 413 | |
| 414 | 414 | /* 5. Gobi 2000 and 3000 devices */ |
| 415 | 415 | {QMI_GOBI_DEVICE(0x413c, 0x8186)}, /* Dell Gobi 2000 Modem device (N0218, VU936) */ |
| 416 | + {QMI_GOBI_DEVICE(0x413c, 0x8194)}, /* Dell Gobi 3000 Composite */ | |
| 416 | 417 | {QMI_GOBI_DEVICE(0x05c6, 0x920b)}, /* Generic Gobi 2000 Modem device */ |
| 418 | + {QMI_GOBI_DEVICE(0x05c6, 0x920d)}, /* Gobi 3000 Composite */ | |
| 417 | 419 | {QMI_GOBI_DEVICE(0x05c6, 0x9225)}, /* Sony Gobi 2000 Modem device (N0279, VU730) */ |
| 418 | 420 | {QMI_GOBI_DEVICE(0x05c6, 0x9245)}, /* Samsung Gobi 2000 Modem device (VL176) */ |
| 419 | 421 | {QMI_GOBI_DEVICE(0x03f0, 0x251d)}, /* HP Gobi 2000 Modem device (VP412) */ |
| @@ -441,6 +443,8 @@ static const struct usb_device_id products[] = { · 21 unmodified lines | ||
| 441 | 443 | {QMI_GOBI_DEVICE(0x1199, 0x9015)}, /* Sierra Wireless Gobi 3000 Modem device */ |
| 442 | 444 | {QMI_GOBI_DEVICE(0x1199, 0x9019)}, /* Sierra Wireless Gobi 3000 Modem device */ |
| 443 | 445 | {QMI_GOBI_DEVICE(0x1199, 0x901b)}, /* Sierra Wireless MC7770 */ |
| 446 | + {QMI_GOBI_DEVICE(0x12d1, 0x14f1)}, /* Sony Gobi 3000 Composite */ | |
| 447 | + {QMI_GOBI_DEVICE(0x1410, 0xa021)}, /* Foxconn Gobi 3000 Modem device (Novatel E396) */ | |
| 444 | 448 | |
| 445 | 449 | { } /* END */ |
| 446 | 450 | }; |
| @@ -1573,7 +1573,7 @@ int usbnet_resume (struct usb_interface *intf) · 1572 unmodified lines | ||
| 1573 | 1573 | netif_device_present(dev->net) && |
| 1574 | 1574 | !timer_pending(&dev->delay) && |
| 1575 | 1575 | !test_bit(EVENT_RX_HALT, &dev->flags)) |
| 1576 | − rx_alloc_submit(dev, GFP_KERNEL); | |
| 1576 | + rx_alloc_submit(dev, GFP_NOIO); | |
| 1577 | 1577 | |
| 1578 | 1578 | if (!(dev->txq.qlen >= TX_QLEN(dev))) |
| 1579 | 1579 | netif_tx_wake_all_queues(dev->net); |
| @@ -1482,7 +1482,7 @@ ath5k_eeprom_read_target_rate_pwr_info(struct ath5k_hw *ah, unsigned int mode) · 1481 unmodified lines | ||
| 1482 | 1482 | case AR5K_EEPROM_MODE_11A: |
| 1483 | 1483 | offset += AR5K_EEPROM_TARGET_PWR_OFF_11A(ee->ee_version); |
| 1484 | 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 | 1486 | break; |
| 1487 | 1487 | case AR5K_EEPROM_MODE_11B: |
| 1488 | 1488 | offset += AR5K_EEPROM_TARGET_PWR_OFF_11B(ee->ee_version); |
| @@ -182,6 +182,7 @@ · 181 unmodified lines | ||
| 182 | 182 | #define AR5K_EEPROM_EEP_DELTA 10 |
| 183 | 183 | #define AR5K_EEPROM_N_MODES 3 |
| 184 | 184 | #define AR5K_EEPROM_N_5GHZ_CHAN 10 |
| 185 | +#define AR5K_EEPROM_N_5GHZ_RATE_CHAN 8 | |
| 185 | 186 | #define AR5K_EEPROM_N_2GHZ_CHAN 3 |
| 186 | 187 | #define AR5K_EEPROM_N_2GHZ_CHAN_2413 4 |
| 187 | 188 | #define AR5K_EEPROM_N_2GHZ_CHAN_MAX 4 |
| @@ -1233,6 +1233,9 @@ uint brcms_reset(struct brcms_info *wl) · 1232 unmodified lines | ||
| 1233 | 1233 | /* dpc will not be rescheduled */ |
| 1234 | 1234 | wl->resched = false; |
| 1235 | 1235 | |
| 1236 | + /* inform publicly that interface is down */ | |
| 1237 | + wl->pub->up = false; | |
| 1238 | + | |
| 1236 | 1239 | return 0; |
| 1237 | 1240 | } |
| 1238 | 1241 | |
| @@ -2042,7 +2042,8 @@ static void isr_indicate_associated(struct ipw2100_priv *priv, u32 status) · 2041 unmodified lines | ||
| 2042 | 2042 | return; |
| 2043 | 2043 | } |
| 2044 | 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 | 2047 | if (ret) { |
| 2047 | 2048 | IPW_DEBUG_INFO("failed querying ordinals at line %d\n", |
| 2048 | 2049 | __LINE__); |
| @@ -124,6 +124,9 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, · 123 unmodified lines | ||
| 124 | 124 | const struct fw_img *img; |
| 125 | 125 | size_t bufsz; |
| 126 | 126 | |
| 127 | + if (!iwl_is_ready_rf(priv)) | |
| 128 | + return -EAGAIN; | |
| 129 | + | |
| 127 | 130 | /* default is to dump the entire data segment */ |
| 128 | 131 | if (!priv->dbgfs_sram_offset && !priv->dbgfs_sram_len) { |
| 129 | 132 | priv->dbgfs_sram_offset = 0x800000; |
| @@ -350,7 +350,7 @@ int iwl_queue_space(const struct iwl_queue *q); · 349 unmodified lines | ||
| 350 | 350 | /***************************************************** |
| 351 | 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 | 354 | void iwl_dump_csr(struct iwl_trans *trans); |
| 355 | 355 | |
| 356 | 356 | /***************************************************** |
| @@ -555,7 +555,7 @@ static void iwl_irq_handle_error(struct iwl_trans *trans) · 554 unmodified lines | ||
| 555 | 555 | } |
| 556 | 556 | |
| 557 | 557 | iwl_dump_csr(trans); |
| 558 | − iwl_dump_fh(trans, NULL, false); | |
| 558 | + iwl_dump_fh(trans, NULL); | |
| 559 | 559 | |
| 560 | 560 | iwl_op_mode_nic_error(trans->op_mode); |
| 561 | 561 | } |
| @@ -1649,13 +1649,9 @@ static const char *get_fh_string(int cmd) · 1648 unmodified lines | ||
| 1649 | 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 | 1654 | int i; |
| 1655 | −#ifdef CONFIG_IWLWIFI_DEBUG | |
| 1656 | − int pos = 0; | |
| 1657 | − size_t bufsz = 0; | |
| 1658 | −#endif | |
| 1659 | 1655 | static const u32 fh_tbl[] = { |
| 1660 | 1656 | FH_RSCSR_CHNL0_STTS_WPTR_REG, |
| 1661 | 1657 | FH_RSCSR_CHNL0_RBDCB_BASE_REG, |
| @@ -1667,29 +1663,35 @@ int iwl_dump_fh(struct iwl_trans *trans, char **buf, bool display) · 5 unmodified lines | ||
| 1667 | 1663 | FH_TSSR_TX_STATUS_REG, |
| 1668 | 1664 | FH_TSSR_TX_ERROR_REG |
| 1669 | 1665 | }; |
| 1670 | −#ifdef CONFIG_IWLWIFI_DEBUG | |
| 1671 | − if (display) { | |
| 1672 | − bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; | |
| 1666 | + | |
| 1667 | +#ifdef CONFIG_IWLWIFI_DEBUGFS | |
| 1668 | + if (buf) { | |
| 1669 | + int pos = 0; | |
| 1670 | + size_t bufsz = ARRAY_SIZE(fh_tbl) * 48 + 40; | |
| 1671 | + | |
| 1673 | 1672 | *buf = kmalloc(bufsz, GFP_KERNEL); |
| 1674 | 1673 | if (!*buf) |
| 1675 | 1674 | return -ENOMEM; |
| 1675 | + | |
| 1676 | 1676 | pos += scnprintf(*buf + pos, bufsz - pos, |
| 1677 | 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 | 1680 | pos += scnprintf(*buf + pos, bufsz - pos, |
| 1680 | 1681 | " %34s: 0X%08x\n", |
| 1681 | 1682 | get_fh_string(fh_tbl[i]), |
| 1682 | 1683 | iwl_read_direct32(trans, fh_tbl[i])); |
| 1683 | − } | |
| 1684 | + | |
| 1684 | 1685 | return pos; |
| 1685 | 1686 | } |
| 1686 | 1687 | #endif |
| 1688 | + | |
| 1687 | 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 | 1691 | IWL_ERR(trans, " %34s: 0X%08x\n", |
| 1690 | 1692 | get_fh_string(fh_tbl[i]), |
| 1691 | 1693 | iwl_read_direct32(trans, fh_tbl[i])); |
| 1692 | − } | |
| 1694 | + | |
| 1693 | 1695 | return 0; |
| 1694 | 1696 | } |
| 1695 | 1697 | |
| @@ -1982,11 +1984,11 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file, · 286 unmodified lines | ||
| 1982 | 1984 | size_t count, loff_t *ppos) |
| 1983 | 1985 | { |
| 1984 | 1986 | struct iwl_trans *trans = file->private_data; |
| 1985 | − char *buf; | |
| 1987 | + char *buf = NULL; | |
| 1986 | 1988 | int pos = 0; |
| 1987 | 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 | 1992 | if (buf) { |
| 1991 | 1993 | ret = simple_read_from_buffer(user_buf, |
| 1992 | 1994 | count, ppos, buf, pos); |
| @@ -57,8 +57,7 @@ · 56 unmodified lines | ||
| 57 | 57 | static const struct ethtool_ops xennet_ethtool_ops; |
| 58 | 58 | |
| 59 | 59 | struct netfront_cb { |
| 60 | − struct page *page; | |
| 61 | − unsigned offset; | |
| 60 | + int pull_to; | |
| 62 | 61 | }; |
| 63 | 62 | |
| 64 | 63 | #define NETFRONT_SKB_CB(skb) ((struct netfront_cb *)((skb)->cb)) |
| @@ -867,15 +866,9 @@ static int handle_incoming_queue(struct net_device *dev, · 802 unmodified lines | ||
| 867 | 866 | struct sk_buff *skb; |
| 868 | 867 | |
| 869 | 868 | while ((skb = __skb_dequeue(rxq)) != NULL) { |
| 870 | − struct page *page = NETFRONT_SKB_CB(skb)->page; | |
| 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)); | |
| 869 | + int pull_to = NETFRONT_SKB_CB(skb)->pull_to; | |
| 876 | 870 | |
| 877 | − if (page != skb_frag_page(&skb_shinfo(skb)->frags[0])) | |
| 878 | − __free_page(page); | |
| 871 | + __pskb_pull_tail(skb, pull_to - skb_headlen(skb)); | |
| 879 | 872 | |
| 880 | 873 | /* Ethernet work: Delayed to here as it peeks the header. */ |
| 881 | 874 | skb->protocol = eth_type_trans(skb, dev); |
| @@ -913,7 +906,6 @@ static int xennet_poll(struct napi_struct *napi, int budget) · 31 unmodified lines | ||
| 913 | 906 | struct sk_buff_head errq; |
| 914 | 907 | struct sk_buff_head tmpq; |
| 915 | 908 | unsigned long flags; |
| 916 | − unsigned int len; | |
| 917 | 909 | int err; |
| 918 | 910 | |
| 919 | 911 | spin_lock(&np->rx_lock); |
| @@ -955,24 +947,13 @@ err: · 35 unmodified lines | ||
| 955 | 947 | } |
| 956 | 948 | } |
| 957 | 949 | |
| 958 | − NETFRONT_SKB_CB(skb)->page = | |
| 959 | − skb_frag_page(&skb_shinfo(skb)->frags[0]); | |
| 960 | − NETFRONT_SKB_CB(skb)->offset = rx->offset; | |
| 961 | − | |
| 962 | − len = rx->status; | |
| 963 | − if (len > RX_COPY_THRESHOLD) | |
| 964 | − len = RX_COPY_THRESHOLD; | |
| 965 | − skb_put(skb, len); | |
| 950 | + NETFRONT_SKB_CB(skb)->pull_to = rx->status; | |
| 951 | + if (NETFRONT_SKB_CB(skb)->pull_to > RX_COPY_THRESHOLD) | |
| 952 | + NETFRONT_SKB_CB(skb)->pull_to = RX_COPY_THRESHOLD; | |
| 966 | 953 | |
| 967 | − if (rx->status > len) { | |
| 968 | − skb_shinfo(skb)->frags[0].page_offset = | |
| 969 | − rx->offset + len; | |
| 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 | − } | |
| 954 | + skb_shinfo(skb)->frags[0].page_offset = rx->offset; | |
| 955 | + skb_frag_size_set(&skb_shinfo(skb)->frags[0], rx->status); | |
| 956 | + skb->data_len = rx->status; | |
| 976 | 957 | |
| 977 | 958 | i = xennet_fill_frags(np, skb, &tmpq); |
| 978 | 959 | |
| @@ -999,7 +980,7 @@ err: · 20 unmodified lines | ||
| 999 | 980 | * receive throughout using the standard receive |
| 1000 | 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 | 984 | skb->len += skb->data_len; |
| 1004 | 985 | |
| 1005 | 986 | if (rx->flags & XEN_NETRXF_csum_blank) |
| @@ -280,8 +280,12 @@ static long local_pci_probe(void *_ddi) · 279 unmodified lines | ||
| 280 | 280 | { |
| 281 | 281 | struct drv_dev_and_id *ddi = _ddi; |
| 282 | 282 | struct device *dev = &ddi->dev->dev; |
| 283 | + struct device *parent = dev->parent; | |
| 283 | 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 | 289 | /* Unbound PCI devices are always set to disabled and suspended. |
| 286 | 290 | * During probe, the device is set to enabled and active and the |
| 287 | 291 | * usage count is incremented. If the driver supports runtime PM, |
| @@ -298,6 +302,8 @@ static long local_pci_probe(void *_ddi) · 10 unmodified lines | ||
| 298 | 302 | pm_runtime_set_suspended(dev); |
| 299 | 303 | pm_runtime_put_noidle(dev); |
| 300 | 304 | } |
| 305 | + if (parent) | |
| 306 | + pm_runtime_put(parent); | |
| 301 | 307 | return rc; |
| 302 | 308 | } |
| 303 | 309 | |
| @@ -458,6 +458,40 @@ boot_vga_show(struct device *dev, struct device_attribute *attr, char *buf) · 457 unmodified lines | ||
| 458 | 458 | } |
| 459 | 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 | 495 | static ssize_t |
| 462 | 496 | pci_read_config(struct file *filp, struct kobject *kobj, |
| 463 | 497 | struct bin_attribute *bin_attr, |
| @@ -484,6 +518,8 @@ pci_read_config(struct file *filp, struct kobject *kobj, · 20 unmodified lines | ||
| 484 | 518 | size = count; |
| 485 | 519 | } |
| 486 | 520 | |
| 521 | + pci_config_pm_runtime_get(dev); | |
| 522 | + | |
| 487 | 523 | if ((off & 1) && size) { |
| 488 | 524 | u8 val; |
| 489 | 525 | pci_user_read_config_byte(dev, off, &val); |
| @@ -529,6 +565,8 @@ pci_read_config(struct file *filp, struct kobject *kobj, · 39 unmodified lines | ||
| 529 | 565 | --size; |
| 530 | 566 | } |
| 531 | 567 | |
| 568 | + pci_config_pm_runtime_put(dev); | |
| 569 | + | |
| 532 | 570 | return count; |
| 533 | 571 | } |
| 534 | 572 | |
| @@ -549,6 +587,8 @@ pci_write_config(struct file* filp, struct kobject *kobj, · 14 unmodified lines | ||
| 549 | 587 | count = size; |
| 550 | 588 | } |
| 551 | 589 | |
| 590 | + pci_config_pm_runtime_get(dev); | |
| 591 | + | |
| 552 | 592 | if ((off & 1) && size) { |
| 553 | 593 | pci_user_write_config_byte(dev, off, data[off - init_off]); |
| 554 | 594 | off++; |
| @@ -587,6 +627,8 @@ pci_write_config(struct file* filp, struct kobject *kobj, · 32 unmodified lines | ||
| 587 | 627 | --size; |
| 588 | 628 | } |
| 589 | 629 | |
| 630 | + pci_config_pm_runtime_put(dev); | |
| 631 | + | |
| 590 | 632 | return count; |
| 591 | 633 | } |
| 592 | 634 | |
| @@ -1941,6 +1941,7 @@ void pci_pm_init(struct pci_dev *dev) · 1940 unmodified lines | ||
| 1941 | 1941 | dev->pm_cap = pm; |
| 1942 | 1942 | dev->d3_delay = PCI_PM_D3_WAIT; |
| 1943 | 1943 | dev->d3cold_delay = PCI_PM_D3COLD_WAIT; |
| 1944 | + dev->d3cold_allowed = true; | |
| 1944 | 1945 | |
| 1945 | 1946 | dev->d1_support = false; |
| 1946 | 1947 | dev->d2_support = false; |
| @@ -140,9 +140,17 @@ static int pcie_port_runtime_resume(struct device *dev) · 139 unmodified lines | ||
| 140 | 140 | { |
| 141 | 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 | 150 | #else |
| 144 | 151 | #define pcie_port_runtime_suspend NULL |
| 145 | 152 | #define pcie_port_runtime_resume NULL |
| 153 | +#define pcie_port_runtime_idle NULL | |
| 146 | 154 | #endif |
| 147 | 155 | |
| 148 | 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 = { · 6 unmodified lines | ||
| 155 | 163 | .resume_noirq = pcie_port_resume_noirq, |
| 156 | 164 | .runtime_suspend = pcie_port_runtime_suspend, |
| 157 | 165 | .runtime_resume = pcie_port_runtime_resume, |
| 166 | + .runtime_idle = pcie_port_runtime_idle, | |
| 158 | 167 | }; |
| 159 | 168 | |
| 160 | 169 | #define PCIE_PORTDRV_PM_OPS (&pcie_portdrv_pm_ops) |
| @@ -200,6 +209,11 @@ static int __devinit pcie_portdrv_probe(struct pci_dev *dev, · 39 unmodified lines | ||
| 200 | 209 | return status; |
| 201 | 210 | |
| 202 | 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 | 217 | if (!pci_match_id(port_runtime_pm_black_list, dev)) |
| 204 | 218 | pm_runtime_put_noidle(&dev->dev); |
| 205 | 219 | |
| @@ -144,15 +144,13 @@ static inline unsigned long decode_bar(struct pci_dev *dev, u32 bar) · 143 unmodified lines | ||
| 144 | 144 | case PCI_BASE_ADDRESS_MEM_TYPE_32: |
| 145 | 145 | break; |
| 146 | 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 | 148 | break; |
| 149 | 149 | case PCI_BASE_ADDRESS_MEM_TYPE_64: |
| 150 | 150 | flags |= IORESOURCE_MEM_64; |
| 151 | 151 | break; |
| 152 | 152 | default: |
| 153 | − dev_warn(&dev->dev, | |
| 154 | − "mem unknown type %x treated as 32-bit BAR\n", | |
| 155 | − mem_type); | |
| 153 | + /* mem unknown type treated as 32-bit BAR */ | |
| 156 | 154 | break; |
| 157 | 155 | } |
| 158 | 156 | return flags; |
| @@ -173,9 +171,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, · 14 unmodified lines | ||
| 173 | 171 | u32 l, sz, mask; |
| 174 | 172 | u16 orig_cmd; |
| 175 | 173 | struct pci_bus_region region; |
| 174 | + bool bar_too_big = false, bar_disabled = false; | |
| 176 | 175 | |
| 177 | 176 | mask = type ? PCI_ROM_ADDRESS_MASK : ~0; |
| 178 | 177 | |
| 178 | + /* No printks while decoding is disabled! */ | |
| 179 | 179 | if (!dev->mmio_always_on) { |
| 180 | 180 | pci_read_config_word(dev, PCI_COMMAND, &orig_cmd); |
| 181 | 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, · 58 unmodified lines | ||
| 240 | 240 | goto fail; |
| 241 | 241 | |
| 242 | 242 | if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) { |
| 243 | − dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n", | |
| 244 | − pos); | |
| 243 | + bar_too_big = true; | |
| 245 | 244 | goto fail; |
| 246 | 245 | } |
| 247 | 246 | |
| @@ -252,12 +251,11 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, · 4 unmodified lines | ||
| 252 | 251 | region.start = 0; |
| 253 | 252 | region.end = sz64; |
| 254 | 253 | pcibios_bus_to_resource(dev, res, ®ion); |
| 254 | + bar_disabled = true; | |
| 255 | 255 | } else { |
| 256 | 256 | region.start = l64; |
| 257 | 257 | region.end = l64 + sz64; |
| 258 | 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 | 260 | } else { |
| 263 | 261 | sz = pci_size(l, sz, mask); |
| @@ -268,18 +266,23 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, · 4 unmodified lines | ||
| 268 | 266 | region.start = l; |
| 269 | 267 | region.end = l + sz; |
| 270 | 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 | 277 | if (!dev->mmio_always_on) |
| 277 | 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 | 285 | return (res->flags & IORESOURCE_MEM_64) ? 1 : 0; |
| 280 | − fail: | |
| 281 | − res->flags = 0; | |
| 282 | − goto out; | |
| 283 | 286 | } |
| 284 | 287 | |
| 285 | 288 | static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom) |
| @@ -58,6 +58,7 @@ struct sam9_rtc { · 57 unmodified lines | ||
| 58 | 58 | struct rtc_device *rtcdev; |
| 59 | 59 | u32 imr; |
| 60 | 60 | void __iomem *gpbr; |
| 61 | + int irq; | |
| 61 | 62 | }; |
| 62 | 63 | |
| 63 | 64 | #define rtt_readl(rtc, field) \ |
| @@ -292,7 +293,7 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) · 228 unmodified lines | ||
| 292 | 293 | { |
| 293 | 294 | struct resource *r, *r_gpbr; |
| 294 | 295 | struct sam9_rtc *rtc; |
| 295 | − int ret; | |
| 296 | + int ret, irq; | |
| 296 | 297 | u32 mr; |
| 297 | 298 | |
| 298 | 299 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| @@ -302,10 +303,18 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) · 3 unmodified lines | ||
| 302 | 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 | 312 | rtc = kzalloc(sizeof *rtc, GFP_KERNEL); |
| 306 | 313 | if (!rtc) |
| 307 | 314 | return -ENOMEM; |
| 308 | 315 | |
| 316 | + rtc->irq = irq; | |
| 317 | + | |
| 309 | 318 | /* platform setup code should have handled this; sigh */ |
| 310 | 319 | if (!device_can_wakeup(&pdev->dev)) |
| 311 | 320 | device_init_wakeup(&pdev->dev, 1); |
| @@ -345,11 +354,10 @@ static int __devinit at91_rtc_probe(struct platform_device *pdev) · 33 unmodified lines | ||
| 345 | 354 | } |
| 346 | 355 | |
| 347 | 356 | /* register irq handler after we know what name we'll use */ |
| 348 | − ret = request_irq(AT91_ID_SYS, at91_rtc_interrupt, | |
| 349 | − IRQF_SHARED, | |
| 357 | + ret = request_irq(rtc->irq, at91_rtc_interrupt, IRQF_SHARED, | |
| 350 | 358 | dev_name(&rtc->rtcdev->dev), rtc); |
| 351 | 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 | 361 | rtc_device_unregister(rtc->rtcdev); |
| 354 | 362 | goto fail_register; |
| 355 | 363 | } |
| @@ -386,7 +394,7 @@ static int __devexit at91_rtc_remove(struct platform_device *pdev) · 30 unmodified lines | ||
| 386 | 394 | |
| 387 | 395 | /* disable all interrupts */ |
| 388 | 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 | 399 | rtc_device_unregister(rtc->rtcdev); |
| 392 | 400 | |
| @@ -423,7 +431,7 @@ static int at91_rtc_suspend(struct platform_device *pdev, · 30 unmodified lines | ||
| 423 | 431 | rtc->imr = mr & (AT91_RTT_ALMIEN | AT91_RTT_RTTINCIEN); |
| 424 | 432 | if (rtc->imr) { |
| 425 | 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 | 435 | /* don't let RTTINC cause wakeups */ |
| 428 | 436 | if (mr & AT91_RTT_RTTINCIEN) |
| 429 | 437 | rtt_writel(rtc, MR, mr & ~AT91_RTT_RTTINCIEN); |
| @@ -441,7 +449,7 @@ static int at91_rtc_resume(struct platform_device *pdev) · 11 unmodified lines | ||
| 441 | 449 | |
| 442 | 450 | if (rtc->imr) { |
| 443 | 451 | if (device_may_wakeup(&pdev->dev)) |
| 444 | − disable_irq_wake(AT91_ID_SYS); | |
| 452 | + disable_irq_wake(rtc->irq); | |
| 445 | 453 | mr = rtt_readl(rtc, MR); |
| 446 | 454 | rtt_writel(rtc, MR, mr | rtc->imr); |
| 447 | 455 | } |
| @@ -3804,7 +3804,7 @@ dasd_eckd_ioctl(struct dasd_block *block, unsigned int cmd, void __user *argp) · 3803 unmodified lines | ||
| 3804 | 3804 | case BIODASDSYMMIO: |
| 3805 | 3805 | return dasd_symm_io(device, argp); |
| 3806 | 3806 | default: |
| 3807 | − return -ENOIOCTLCMD; | |
| 3807 | + return -ENOTTY; | |
| 3808 | 3808 | } |
| 3809 | 3809 | } |
| 3810 | 3810 | |
| @@ -498,12 +498,9 @@ int dasd_ioctl(struct block_device *bdev, fmode_t mode, · 497 unmodified lines | ||
| 498 | 498 | break; |
| 499 | 499 | default: |
| 500 | 500 | /* if the discipline has an ioctl method try it. */ |
| 501 | − if (base->discipline->ioctl) { | |
| 501 | + rc = -ENOTTY; | |
| 502 | + if (base->discipline->ioctl) | |
| 502 | 503 | rc = base->discipline->ioctl(block, cmd, argp); |
| 503 | − if (rc == -ENOIOCTLCMD) | |
| 504 | − rc = -EINVAL; | |
| 505 | − } else | |
| 506 | − rc = -EINVAL; | |
| 507 | 504 | } |
| 508 | 505 | dasd_put_device(base); |
| 509 | 506 | return rc; |
| @@ -47,6 +47,8 @@ struct bcm63xx_spi { · 46 unmodified lines | ||
| 47 | 47 | /* Platform data */ |
| 48 | 48 | u32 speed_hz; |
| 49 | 49 | unsigned fifo_size; |
| 50 | + unsigned int msg_type_shift; | |
| 51 | + unsigned int msg_ctl_width; | |
| 50 | 52 | |
| 51 | 53 | /* Data buffers */ |
| 52 | 54 | const unsigned char *tx_ptr; |
| @@ -221,13 +223,20 @@ static unsigned int bcm63xx_txrx_bufs(struct spi_device *spi, · 168 unmodified lines | ||
| 221 | 223 | msg_ctl = (t->len << SPI_BYTE_CNT_SHIFT); |
| 222 | 224 | |
| 223 | 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 | 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 | 229 | else if (t->tx_buf) |
| 228 | − msg_ctl |= (SPI_HD_W << SPI_MSG_TYPE_SHIFT); | |
| 229 | − | |
| 230 | − bcm_spi_writew(bs, msg_ctl, SPI_MSG_CTL); | |
| 230 | + msg_ctl |= (SPI_HD_W << bs->msg_type_shift); | |
| 231 | + | |
| 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 | 241 | /* Issue the transfer */ |
| 233 | 242 | cmd = SPI_CMD_START_IMMEDIATE; |
| @@ -406,9 +415,21 @@ static int __devinit bcm63xx_spi_probe(struct platform_device *pdev) · 172 unmodified lines | ||
| 406 | 415 | master->transfer_one_message = bcm63xx_spi_transfer_one; |
| 407 | 416 | master->mode_bits = MODEBITS; |
| 408 | 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 | 420 | bs->tx_io = (u8 *)(bs->regs + bcm63xx_spireg(SPI_MSG_DATA)); |
| 410 | 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 | 433 | /* Initialize hardware */ |
| 413 | 434 | clk_enable(bs->clk); |
| 414 | 435 | bcm_spi_writeb(bs, SPI_INTR_CLEAR_ALL, SPI_INT_STATUS); |
| @@ -987,7 +987,6 @@ err_regfb: · 986 unmodified lines | ||
| 987 | 987 | fb_dealloc_cmap(&info->cmap); |
| 988 | 988 | err_cmap: |
| 989 | 989 | fb_deferred_io_cleanup(info); |
| 990 | − kfree(info->fbdefio); | |
| 991 | 990 | err_defio: |
| 992 | 991 | vfree((void *)info->screen_base); |
| 993 | 992 | err_irq: |
| @@ -1022,7 +1021,6 @@ int __devexit auok190x_common_remove(struct platform_device *pdev) · 28 unmodified lines | ||
| 1022 | 1021 | fb_dealloc_cmap(&info->cmap); |
| 1023 | 1022 | |
| 1024 | 1023 | fb_deferred_io_cleanup(info); |
| 1025 | − kfree(info->fbdefio); | |
| 1026 | 1024 | |
| 1027 | 1025 | vfree((void *)info->screen_base); |
| 1028 | 1026 | |
| @@ -27,9 +27,9 @@ · 26 unmodified lines | ||
| 27 | 27 | #include <linux/fb.h> |
| 28 | 28 | #include <linux/backlight.h> |
| 29 | 29 | #include <linux/slab.h> |
| 30 | +#include <linux/platform_data/omap1_bl.h> | |
| 30 | 31 | |
| 31 | 32 | #include <mach/hardware.h> |
| 32 | −#include <plat/board.h> | |
| 33 | 33 | #include <plat/mux.h> |
| 34 | 34 | |
| 35 | 35 | #define OMAPBL_MAX_INTENSITY 0xff |
| @@ -162,7 +162,7 @@ static void bit_putcs(struct vc_data *vc, struct fb_info *info, · 161 unmodified lines | ||
| 162 | 162 | image.depth = 1; |
| 163 | 163 | |
| 164 | 164 | if (attribute) { |
| 165 | − buf = kmalloc(cellsize, GFP_KERNEL); | |
| 165 | + buf = kmalloc(cellsize, GFP_ATOMIC); | |
| 166 | 166 | if (!buf) |
| 167 | 167 | return; |
| 168 | 168 | } |
| @@ -449,7 +449,7 @@ static int __init fb_console_setup(char *this_opt) · 448 unmodified lines | ||
| 449 | 449 | |
| 450 | 450 | while ((options = strsep(&this_opt, ",")) != NULL) { |
| 451 | 451 | if (!strncmp(options, "font:", 5)) |
| 452 | − strcpy(fontname, options + 5); | |
| 452 | + strlcpy(fontname, options + 5, sizeof(fontname)); | |
| 453 | 453 | |
| 454 | 454 | if (!strncmp(options, "scrollback:", 11)) { |
| 455 | 455 | options += 11; |
| @@ -328,6 +328,8 @@ static int mb862xxfb_ioctl(struct fb_info *fbi, unsigned int cmd, · 327 unmodified lines | ||
| 328 | 328 | case MB862XX_L1_SET_CFG: |
| 329 | 329 | if (copy_from_user(l1_cfg, argp, sizeof(*l1_cfg))) |
| 330 | 330 | return -EFAULT; |
| 331 | + if (l1_cfg->dh == 0 || l1_cfg->dw == 0) | |
| 332 | + return -EINVAL; | |
| 331 | 333 | if ((l1_cfg->sw >= l1_cfg->dw) && (l1_cfg->sh >= l1_cfg->dh)) { |
| 332 | 334 | /* downscaling */ |
| 333 | 335 | outreg(cap, GC_CAP_CSC, |
| @@ -105,6 +105,20 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev) · 104 unmodified lines | ||
| 105 | 105 | |
| 106 | 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 | 122 | dss_sdi_init(dssdev->phy.sdi.datapairs); |
| 109 | 123 | r = dss_sdi_enable(); |
| 110 | 124 | if (r) |
| @@ -1192,7 +1192,7 @@ static int _setcolreg(struct fb_info *fbi, u_int regno, u_int red, u_int green, · 1191 unmodified lines | ||
| 1192 | 1192 | break; |
| 1193 | 1193 | |
| 1194 | 1194 | if (regno < 16) { |
| 1195 | − u16 pal; | |
| 1195 | + u32 pal; | |
| 1196 | 1196 | pal = ((red >> (16 - var->red.length)) << |
| 1197 | 1197 | var->red.offset) | |
| 1198 | 1198 | ((green >> (16 - var->green.length)) << |
| @@ -166,18 +166,17 @@ static long booke_wdt_ioctl(struct file *file, · 165 unmodified lines | ||
| 166 | 166 | |
| 167 | 167 | switch (cmd) { |
| 168 | 168 | case WDIOC_GETSUPPORT: |
| 169 | − if (copy_to_user((void *)arg, &ident, sizeof(ident))) | |
| 170 | − return -EFAULT; | |
| 169 | + return copy_to_user(p, &ident, sizeof(ident)) ? -EFAULT : 0; | |
| 171 | 170 | case WDIOC_GETSTATUS: |
| 172 | 171 | return put_user(0, p); |
| 173 | 172 | case WDIOC_GETBOOTSTATUS: |
| 174 | 173 | /* XXX: something is clearing TSR */ |
| 175 | 174 | tmp = mfspr(SPRN_TSR) & TSR_WRS(3); |
| 176 | 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 | 177 | case WDIOC_SETOPTIONS: |
| 179 | 178 | if (get_user(tmp, p)) |
| 180 | − return -EINVAL; | |
| 179 | + return -EFAULT; | |
| 181 | 180 | if (tmp == WDIOS_ENABLECARD) { |
| 182 | 181 | booke_wdt_ping(); |
| 183 | 182 | break; |
| @@ -21,7 +21,6 @@ · 20 unmodified lines | ||
| 21 | 21 | #include <linux/types.h> |
| 22 | 22 | #include <linux/kernel.h> |
| 23 | 23 | #include <linux/jiffies.h> |
| 24 | −#include <linux/delay.h> | |
| 25 | 24 | |
| 26 | 25 | #include <linux/mfd/da9052/reg.h> |
| 27 | 26 | #include <linux/mfd/da9052/da9052.h> |
| @@ -101,19 +101,6 @@ static int platform_pci_resume(struct pci_dev *pdev) · 100 unmodified lines | ||
| 101 | 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 | 104 | static int __devinit platform_pci_init(struct pci_dev *pdev, |
| 118 | 105 | const struct pci_device_id *ent) |
| 119 | 106 | { |
| @@ -151,8 +138,6 @@ static int __devinit platform_pci_init(struct pci_dev *pdev, · 31 unmodified lines | ||
| 151 | 138 | platform_mmio = mmio_addr; |
| 152 | 139 | platform_mmiolen = mmio_len; |
| 153 | 140 | |
| 154 | − prepare_shared_info(); | |
| 155 | − | |
| 156 | 141 | if (!xen_have_vector_callback) { |
| 157 | 142 | ret = xen_allocate_irq(pdev); |
| 158 | 143 | if (ret) { |
| @@ -232,7 +232,7 @@ xen_swiotlb_alloc_coherent(struct device *hwdev, size_t size, · 231 unmodified lines | ||
| 232 | 232 | return ret; |
| 233 | 233 | |
| 234 | 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 | 237 | phys = virt_to_phys(ret); |
| 238 | 238 | dev_addr = xen_phys_to_bus(phys); |
| @@ -353,16 +353,16 @@ static int __devinit pcistub_init_device(struct pci_dev *dev) · 352 unmodified lines | ||
| 353 | 353 | if (err) |
| 354 | 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 | 356 | /* We need the device active to save the state. */ |
| 360 | 357 | dev_dbg(&dev->dev, "save state of device\n"); |
| 361 | 358 | pci_save_state(dev); |
| 362 | 359 | dev_data->pci_saved_state = pci_store_saved_state(dev); |
| 363 | 360 | if (!dev_data->pci_saved_state) |
| 364 | 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 | 366 | /* Now disable the device (this also ensures some private device |
| 367 | 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) · 72 unmodified lines | ||
| 73 | 73 | { |
| 74 | 74 | unsigned int sz = sizeof(struct bio) + extra_size; |
| 75 | 75 | struct kmem_cache *slab = NULL; |
| 76 | − struct bio_slab *bslab; | |
| 76 | + struct bio_slab *bslab, *new_bio_slabs; | |
| 77 | 77 | unsigned int i, entry = -1; |
| 78 | 78 | |
| 79 | 79 | mutex_lock(&bio_slab_lock); |
| @@ -97,11 +97,12 @@ static struct kmem_cache *bio_find_or_create_slab(unsigned int extra_size) · 17 unmodified lines | ||
| 97 | 97 | |
| 98 | 98 | if (bio_slab_nr == bio_slab_max && entry == -1) { |
| 99 | 99 | bio_slab_max <<= 1; |
| 100 | − bio_slabs = krealloc(bio_slabs, | |
| 101 | − bio_slab_max * sizeof(struct bio_slab), | |
| 102 | − GFP_KERNEL); | |
| 103 | − if (!bio_slabs) | |
| 100 | + new_bio_slabs = krealloc(bio_slabs, | |
| 101 | + bio_slab_max * sizeof(struct bio_slab), | |
| 102 | + GFP_KERNEL); | |
| 103 | + if (!new_bio_slabs) | |
| 104 | 104 | goto out_unlock; |
| 105 | + bio_slabs = new_bio_slabs; | |
| 105 | 106 | } |
| 106 | 107 | if (entry == -1) |
| 107 | 108 | entry = bio_slab_nr++; |
| @@ -1578,10 +1578,12 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, · 1577 unmodified lines | ||
| 1578 | 1578 | unsigned long nr_segs, loff_t pos) |
| 1579 | 1579 | { |
| 1580 | 1580 | struct file *file = iocb->ki_filp; |
| 1581 | + struct blk_plug plug; | |
| 1581 | 1582 | ssize_t ret; |
| 1582 | 1583 | |
| 1583 | 1584 | BUG_ON(iocb->ki_pos != pos); |
| 1584 | 1585 | |
| 1586 | + blk_start_plug(&plug); | |
| 1585 | 1587 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 1586 | 1588 | if (ret > 0 || ret == -EIOCBQUEUED) { |
| 1587 | 1589 | ssize_t err; |
| @@ -1590,6 +1592,7 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov, · 2 unmodified lines | ||
| 1590 | 1592 | if (err < 0 && ret > 0) |
| 1591 | 1593 | ret = err; |
| 1592 | 1594 | } |
| 1595 | + blk_finish_plug(&plug); | |
| 1593 | 1596 | return ret; |
| 1594 | 1597 | } |
| 1595 | 1598 | EXPORT_SYMBOL_GPL(blkdev_aio_write); |
| @@ -1438,10 +1438,10 @@ int iterate_inodes_from_logical(u64 logical, struct btrfs_fs_info *fs_info, · 1437 unmodified lines | ||
| 1438 | 1438 | ret = extent_from_logical(fs_info, logical, path, |
| 1439 | 1439 | &found_key); |
| 1440 | 1440 | btrfs_release_path(path); |
| 1441 | − if (ret & BTRFS_EXTENT_FLAG_TREE_BLOCK) | |
| 1442 | − ret = -EINVAL; | |
| 1443 | 1441 | if (ret < 0) |
| 1444 | 1442 | return ret; |
| 1443 | + if (ret & BTRFS_EXTENT_FLAG_TREE_BLOCK) | |
| 1444 | + return -EINVAL; | |
| 1445 | 1445 | |
| 1446 | 1446 | extent_item_pos = logical - found_key.objectid; |
| 1447 | 1447 | ret = iterate_extent_inodes(fs_info, found_key.objectid, |
| @@ -818,6 +818,7 @@ static void free_workspace(int type, struct list_head *workspace) · 817 unmodified lines | ||
| 818 | 818 | btrfs_compress_op[idx]->free_workspace(workspace); |
| 819 | 819 | atomic_dec(alloc_workspace); |
| 820 | 820 | wake: |
| 821 | + smp_mb(); | |
| 821 | 822 | if (waitqueue_active(workspace_wait)) |
| 822 | 823 | wake_up(workspace_wait); |
| 823 | 824 | } |
| @@ -420,12 +420,6 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, · 419 unmodified lines | ||
| 420 | 420 | } |
| 421 | 421 | spin_unlock(&fs_info->tree_mod_seq_lock); |
| 422 | 422 | |
| 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 | 423 | /* |
| 430 | 424 | * anything that's lower than the lowest existing (read: blocked) |
| 431 | 425 | * sequence number can be removed from the tree. |
| @@ -631,6 +625,9 @@ __tree_mod_log_free_eb(struct btrfs_fs_info *fs_info, struct extent_buffer *eb) · 199 unmodified lines | ||
| 631 | 625 | u32 nritems; |
| 632 | 626 | int ret; |
| 633 | 627 | |
| 628 | + if (btrfs_header_level(eb) == 0) | |
| 629 | + return; | |
| 630 | + | |
| 634 | 631 | nritems = btrfs_header_nritems(eb); |
| 635 | 632 | for (i = nritems - 1; i >= 0; i--) { |
| 636 | 633 | ret = tree_mod_log_insert_key_locked(fs_info, eb, i, |
| @@ -1252,7 +1252,6 @@ struct btrfs_fs_info { · 1251 unmodified lines | ||
| 1252 | 1252 | atomic_t tree_mod_seq; |
| 1253 | 1253 | struct list_head tree_mod_seq_list; |
| 1254 | 1254 | struct seq_list tree_mod_seq_elem; |
| 1255 | − wait_queue_head_t tree_mod_seq_wait; | |
| 1256 | 1255 | |
| 1257 | 1256 | /* this protects tree_mod_log */ |
| 1258 | 1257 | rwlock_t tree_mod_log_lock; |
| @@ -3192,7 +3191,7 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, · 1933 unmodified lines | ||
| 3192 | 3191 | int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode, |
| 3193 | 3192 | struct bio *bio, u32 *dst); |
| 3194 | 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 | 3195 | int btrfs_insert_file_extent(struct btrfs_trans_handle *trans, |
| 3197 | 3196 | struct btrfs_root *root, |
| 3198 | 3197 | u64 objectid, u64 pos, |
| @@ -512,8 +512,8 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item) · 511 unmodified lines | ||
| 512 | 512 | |
| 513 | 513 | rb_erase(&delayed_item->rb_node, root); |
| 514 | 514 | delayed_item->delayed_node->count--; |
| 515 | − atomic_dec(&delayed_root->items); | |
| 516 | − if (atomic_read(&delayed_root->items) < BTRFS_DELAYED_BACKGROUND && | |
| 515 | + if (atomic_dec_return(&delayed_root->items) < | |
| 516 | + BTRFS_DELAYED_BACKGROUND && | |
| 517 | 517 | waitqueue_active(&delayed_root->wait)) |
| 518 | 518 | wake_up(&delayed_root->wait); |
| 519 | 519 | } |
| @@ -1028,9 +1028,10 @@ do_again: · 508 unmodified lines | ||
| 1028 | 1028 | btrfs_release_delayed_item(prev); |
| 1029 | 1029 | ret = 0; |
| 1030 | 1030 | btrfs_release_path(path); |
| 1031 | − if (curr) | |
| 1031 | + if (curr) { | |
| 1032 | + mutex_unlock(&node->mutex); | |
| 1032 | 1033 | goto do_again; |
| 1033 | − else | |
| 1034 | + } else | |
| 1034 | 1035 | goto delete_fail; |
| 1035 | 1036 | } |
| 1036 | 1037 | |
| @@ -1055,8 +1056,7 @@ static void btrfs_release_delayed_inode(struct btrfs_delayed_node *delayed_node) · 18 unmodified lines | ||
| 1055 | 1056 | delayed_node->count--; |
| 1056 | 1057 | |
| 1057 | 1058 | delayed_root = delayed_node->root->fs_info->delayed_root; |
| 1058 | − atomic_dec(&delayed_root->items); | |
| 1059 | − if (atomic_read(&delayed_root->items) < | |
| 1059 | + if (atomic_dec_return(&delayed_root->items) < | |
| 1060 | 1060 | BTRFS_DELAYED_BACKGROUND && |
| 1061 | 1061 | waitqueue_active(&delayed_root->wait)) |
| 1062 | 1062 | wake_up(&delayed_root->wait); |
| @@ -38,17 +38,14 @@ · 37 unmodified lines | ||
| 38 | 38 | static int comp_tree_refs(struct btrfs_delayed_tree_ref *ref2, |
| 39 | 39 | struct btrfs_delayed_tree_ref *ref1) |
| 40 | 40 | { |
| 41 | − if (ref1->node.type == BTRFS_TREE_BLOCK_REF_KEY) { | |
| 42 | − if (ref1->root < ref2->root) | |
| 43 | − return -1; | |
| 44 | − if (ref1->root > ref2->root) | |
| 45 | − return 1; | |
| 46 | − } else { | |
| 47 | − if (ref1->parent < ref2->parent) | |
| 48 | − return -1; | |
| 49 | − if (ref1->parent > ref2->parent) | |
| 50 | − return 1; | |
| 51 | − } | |
| 41 | + if (ref1->root < ref2->root) | |
| 42 | + return -1; | |
| 43 | + if (ref1->root > ref2->root) | |
| 44 | + return 1; | |
| 45 | + if (ref1->parent < ref2->parent) | |
| 46 | + return -1; | |
| 47 | + if (ref1->parent > ref2->parent) | |
| 48 | + return 1; | |
| 52 | 49 | return 0; |
| 53 | 50 | } |
| 54 | 51 | |
| @@ -85,7 +82,8 @@ static int comp_data_refs(struct btrfs_delayed_data_ref *ref2, · 30 unmodified lines | ||
| 85 | 82 | * type of the delayed backrefs and content of delayed backrefs. |
| 86 | 83 | */ |
| 87 | 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 | 88 | if (ref1->bytenr < ref2->bytenr) |
| 91 | 89 | return -1; |
| @@ -102,10 +100,12 @@ static int comp_entry(struct btrfs_delayed_ref_node *ref2, · 10 unmodified lines | ||
| 102 | 100 | if (ref1->type > ref2->type) |
| 103 | 101 | return 1; |
| 104 | 102 | /* merging of sequenced refs is not allowed */ |
| 105 | − if (ref1->seq < ref2->seq) | |
| 106 | − return -1; | |
| 107 | − if (ref1->seq > ref2->seq) | |
| 108 | − return 1; | |
| 103 | + if (compare_seq) { | |
| 104 | + if (ref1->seq < ref2->seq) | |
| 105 | + return -1; | |
| 106 | + if (ref1->seq > ref2->seq) | |
| 107 | + return 1; | |
| 108 | + } | |
| 109 | 109 | if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY || |
| 110 | 110 | ref1->type == BTRFS_SHARED_BLOCK_REF_KEY) { |
| 111 | 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, · 27 unmodified lines | ||
| 139 | 139 | entry = rb_entry(parent_node, struct btrfs_delayed_ref_node, |
| 140 | 140 | rb_node); |
| 141 | 141 | |
| 142 | − cmp = comp_entry(entry, ins); | |
| 142 | + cmp = comp_entry(entry, ins, 1); | |
| 143 | 143 | if (cmp < 0) |
| 144 | 144 | p = &(*p)->rb_left; |
| 145 | 145 | else if (cmp > 0) |
| @@ -233,6 +233,114 @@ int btrfs_delayed_ref_lock(struct btrfs_trans_handle *trans, · 87 unmodified lines | ||
| 233 | 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 | 344 | int btrfs_check_delayed_seq(struct btrfs_fs_info *fs_info, |
| 237 | 345 | struct btrfs_delayed_ref_root *delayed_refs, |
| 238 | 346 | u64 seq) |
| @@ -336,18 +444,11 @@ update_existing_ref(struct btrfs_trans_handle *trans, · 97 unmodified lines | ||
| 336 | 444 | * every changing the extent allocation tree. |
| 337 | 445 | */ |
| 338 | 446 | existing->ref_mod--; |
| 339 | − if (existing->ref_mod == 0) { | |
| 340 | − rb_erase(&existing->rb_node, | |
| 341 | − &delayed_refs->root); | |
| 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 { | |
| 447 | + if (existing->ref_mod == 0) | |
| 448 | + drop_delayed_ref(trans, delayed_refs, existing); | |
| 449 | + else | |
| 348 | 450 | WARN_ON(existing->type == BTRFS_TREE_BLOCK_REF_KEY || |
| 349 | 451 | existing->type == BTRFS_SHARED_BLOCK_REF_KEY); |
| 350 | − } | |
| 351 | 452 | } else { |
| 352 | 453 | WARN_ON(existing->type == BTRFS_TREE_BLOCK_REF_KEY || |
| 353 | 454 | existing->type == BTRFS_SHARED_BLOCK_REF_KEY); |
| @@ -662,9 +763,6 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info, · 308 unmodified lines | ||
| 662 | 763 | add_delayed_tree_ref(fs_info, trans, &ref->node, bytenr, |
| 663 | 764 | num_bytes, parent, ref_root, level, action, |
| 664 | 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 | 766 | spin_unlock(&delayed_refs->lock); |
| 669 | 767 | if (need_ref_seq(for_cow, ref_root)) |
| 670 | 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, · 42 unmodified lines | ||
| 713 | 811 | add_delayed_data_ref(fs_info, trans, &ref->node, bytenr, |
| 714 | 812 | num_bytes, parent, ref_root, owner, offset, |
| 715 | 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 | 814 | spin_unlock(&delayed_refs->lock); |
| 720 | 815 | if (need_ref_seq(for_cow, ref_root)) |
| 721 | 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, · 22 unmodified lines | ||
| 744 | 839 | num_bytes, BTRFS_UPDATE_DELAYED_HEAD, |
| 745 | 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 | 842 | spin_unlock(&delayed_refs->lock); |
| 750 | 843 | return 0; |
| 751 | 844 | } |
| @@ -167,6 +167,10 @@ int btrfs_add_delayed_extent_op(struct btrfs_fs_info *fs_info, · 166 unmodified lines | ||
| 167 | 167 | struct btrfs_trans_handle *trans, |
| 168 | 168 | u64 bytenr, u64 num_bytes, |
| 169 | 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 | 175 | struct btrfs_delayed_ref_head * |
| 172 | 176 | btrfs_find_delayed_ref_head(struct btrfs_trans_handle *trans, u64 bytenr); |
| @@ -377,9 +377,13 @@ static int btree_read_extent_buffer_pages(struct btrfs_root *root, · 376 unmodified lines | ||
| 377 | 377 | ret = read_extent_buffer_pages(io_tree, eb, start, |
| 378 | 378 | WAIT_COMPLETE, |
| 379 | 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 | 382 | parent_transid, 0)) |
| 382 | − break; | |
| 383 | + break; | |
| 384 | + else | |
| 385 | + ret = -EIO; | |
| 386 | + } | |
| 383 | 387 | |
| 384 | 388 | /* |
| 385 | 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) · 368 unmodified lines | ||
| 754 | 758 | limit = btrfs_async_submit_limit(fs_info); |
| 755 | 759 | limit = limit * 2 / 3; |
| 756 | 760 | |
| 757 | − atomic_dec(&fs_info->nr_async_submits); | |
| 758 | − | |
| 759 | − if (atomic_read(&fs_info->nr_async_submits) < limit && | |
| 761 | + if (atomic_dec_return(&fs_info->nr_async_submits) < limit && | |
| 760 | 762 | waitqueue_active(&fs_info->async_submit_wait)) |
| 761 | 763 | wake_up(&fs_info->async_submit_wait); |
| 762 | 764 | |
| @@ -2032,8 +2034,6 @@ int open_ctree(struct super_block *sb, · 1269 unmodified lines | ||
| 2032 | 2034 | fs_info->free_chunk_space = 0; |
| 2033 | 2035 | fs_info->tree_mod_log = RB_ROOT; |
| 2034 | 2036 | |
| 2035 | − init_waitqueue_head(&fs_info->tree_mod_seq_wait); | |
| 2036 | − | |
| 2037 | 2037 | /* readahead state */ |
| 2038 | 2038 | INIT_RADIX_TREE(&fs_info->reada_tree, GFP_NOFS & ~__GFP_WAIT); |
| 2039 | 2039 | spin_lock_init(&fs_info->reada_lock); |
| @@ -2528,8 +2528,7 @@ retry_root_backup: · 488 unmodified lines | ||
| 2528 | 2528 | goto fail_trans_kthread; |
| 2529 | 2529 | |
| 2530 | 2530 | /* do not make disk changes in broken FS */ |
| 2531 | − if (btrfs_super_log_root(disk_super) != 0 && | |
| 2532 | − !(fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR)) { | |
| 2531 | + if (btrfs_super_log_root(disk_super) != 0) { | |
| 2533 | 2532 | u64 bytenr = btrfs_super_log_root(disk_super); |
| 2534 | 2533 | |
| 2535 | 2534 | if (fs_devices->rw_devices == 0) { |
| @@ -3189,30 +3188,14 @@ int close_ctree(struct btrfs_root *root) · 653 unmodified lines | ||
| 3189 | 3188 | /* clear out the rbtree of defraggable inodes */ |
| 3190 | 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 | 3191 | if (!(fs_info->sb->s_flags & MS_RDONLY)) { |
| 3206 | 3192 | ret = btrfs_commit_super(root); |
| 3207 | 3193 | if (ret) |
| 3208 | 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) { | |
| 3212 | − ret = btrfs_error_commit_super(root); | |
| 3213 | − if (ret) | |
| 3214 | − printk(KERN_ERR "btrfs: commit super ret %d\n", ret); | |
| 3215 | − } | |
| 3197 | + if (fs_info->fs_state & BTRFS_SUPER_FLAG_ERROR) | |
| 3198 | + btrfs_error_commit_super(root); | |
| 3216 | 3199 | |
| 3217 | 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, · 215 unmodified lines | ||
| 3434 | 3417 | if (read_only) |
| 3435 | 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 | 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 | 3425 | mutex_lock(&root->fs_info->cleaner_mutex); |
| 3450 | 3426 | btrfs_run_delayed_iputs(root); |
| 3451 | 3427 | mutex_unlock(&root->fs_info->cleaner_mutex); |
| @@ -3455,10 +3431,6 @@ int btrfs_error_commit_super(struct btrfs_root *root) · 3 unmodified lines | ||
| 3455 | 3431 | |
| 3456 | 3432 | /* cleanup FS via transaction */ |
| 3457 | 3433 | btrfs_cleanup_transaction(root); |
| 3458 | − | |
| 3459 | − ret = write_ctree_super(NULL, root, 0); | |
| 3460 | − | |
| 3461 | − return ret; | |
| 3462 | 3434 | } |
| 3463 | 3435 | |
| 3464 | 3436 | static void btrfs_destroy_ordered_operations(struct btrfs_root *root) |
| @@ -3782,14 +3754,17 @@ int btrfs_cleanup_transaction(struct btrfs_root *root) · 317 unmodified lines | ||
| 3782 | 3754 | /* FIXME: cleanup wait for commit */ |
| 3783 | 3755 | t->in_commit = 1; |
| 3784 | 3756 | t->blocked = 1; |
| 3757 | + smp_mb(); | |
| 3785 | 3758 | if (waitqueue_active(&root->fs_info->transaction_blocked_wait)) |
| 3786 | 3759 | wake_up(&root->fs_info->transaction_blocked_wait); |
| 3787 | 3760 | |
| 3788 | 3761 | t->blocked = 0; |
| 3762 | + smp_mb(); | |
| 3789 | 3763 | if (waitqueue_active(&root->fs_info->transaction_wait)) |
| 3790 | 3764 | wake_up(&root->fs_info->transaction_wait); |
| 3791 | 3765 | |
| 3792 | 3766 | t->commit_done = 1; |
| 3767 | + smp_mb(); | |
| 3793 | 3768 | if (waitqueue_active(&t->commit_wait)) |
| 3794 | 3769 | wake_up(&t->commit_wait); |
| 3795 | 3770 | |
| @@ -54,7 +54,7 @@ int write_ctree_super(struct btrfs_trans_handle *trans, · 53 unmodified lines | ||
| 54 | 54 | struct btrfs_root *root, int max_mirrors); |
| 55 | 55 | struct buffer_head *btrfs_read_dev_super(struct block_device *bdev); |
| 56 | 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 | 58 | struct extent_buffer *btrfs_find_tree_block(struct btrfs_root *root, |
| 59 | 59 | u64 bytenr, u32 blocksize); |
| 60 | 60 | struct btrfs_root *btrfs_read_fs_root_no_radix(struct btrfs_root *tree_root, |
| @@ -2251,6 +2251,16 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, · 2250 unmodified lines | ||
| 2251 | 2251 | } |
| 2252 | 2252 | } |
| 2253 | 2253 | |
| 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 | + | |
| 2254 | 2264 | /* |
| 2255 | 2265 | * locked_ref is the head node, so we have to go one |
| 2256 | 2266 | * node back for any delayed ref updates |
| @@ -2318,12 +2328,23 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, · 61 unmodified lines | ||
| 2318 | 2328 | ref->in_tree = 0; |
| 2319 | 2329 | rb_erase(&ref->rb_node, &delayed_refs->root); |
| 2320 | 2330 | delayed_refs->num_entries--; |
| 2321 | − /* | |
| 2322 | − * we modified num_entries, but as we're currently running | |
| 2323 | − * delayed refs, skip | |
| 2324 | − * wake_up(&delayed_refs->seq_wait); | |
| 2325 | − * here. | |
| 2326 | − */ | |
| 2331 | + if (locked_ref) { | |
| 2332 | + /* | |
| 2333 | + * when we play the delayed ref, also correct the | |
| 2334 | + * ref_mod on head | |
| 2335 | + */ | |
| 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 | 2348 | spin_unlock(&delayed_refs->lock); |
| 2328 | 2349 | |
| 2329 | 2350 | ret = run_one_delayed_ref(trans, root, ref, extent_op, |
| @@ -2350,22 +2371,6 @@ next: · 20 unmodified lines | ||
| 2350 | 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 | 2374 | #ifdef SCRAMBLE_DELAYED_REFS |
| 2370 | 2375 | /* |
| 2371 | 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, · 88 unmodified lines | ||
| 2460 | 2465 | struct btrfs_delayed_ref_root *delayed_refs; |
| 2461 | 2466 | struct btrfs_delayed_ref_node *ref; |
| 2462 | 2467 | struct list_head cluster; |
| 2463 | − struct list_head *first_seq = NULL; | |
| 2464 | 2468 | int ret; |
| 2465 | 2469 | u64 delayed_start; |
| 2466 | 2470 | int run_all = count == (unsigned long)-1; |
| 2467 | 2471 | int run_most = 0; |
| 2468 | − unsigned long num_refs = 0; | |
| 2469 | − int consider_waiting; | |
| 2472 | + int loops; | |
| 2470 | 2473 | |
| 2471 | 2474 | /* We'll clean this up in btrfs_cleanup_transaction */ |
| 2472 | 2475 | if (trans->aborted) |
| @@ -2484,7 +2487,7 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, · 11 unmodified lines | ||
| 2484 | 2487 | delayed_refs = &trans->transaction->delayed_refs; |
| 2485 | 2488 | INIT_LIST_HEAD(&cluster); |
| 2486 | 2489 | again: |
| 2487 | − consider_waiting = 0; | |
| 2490 | + loops = 0; | |
| 2488 | 2491 | spin_lock(&delayed_refs->lock); |
| 2489 | 2492 | |
| 2490 | 2493 | #ifdef SCRAMBLE_DELAYED_REFS |
| @@ -2512,31 +2515,6 @@ again: · 21 unmodified lines | ||
| 2512 | 2515 | if (ret) |
| 2513 | 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 | 2518 | ret = run_clustered_refs(trans, root, &cluster); |
| 2541 | 2519 | if (ret < 0) { |
| 2542 | 2520 | spin_unlock(&delayed_refs->lock); |
| @@ -2549,9 +2527,26 @@ again: · 6 unmodified lines | ||
| 2549 | 2527 | if (count == 0) |
| 2550 | 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 | 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: · 449 unmodified lines | ||
| 3007 | 3002 | } |
| 3008 | 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 | 3012 | if (!num_pages) |
| 3012 | 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 | 3015 | num_pages *= 16; |
| 3022 | 3016 | num_pages *= PAGE_CACHE_SIZE; |
| 3023 | 3017 | |
| @@ -4571,8 +4565,10 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) · 1547 unmodified lines | ||
| 4571 | 4565 | if (root->fs_info->quota_enabled) { |
| 4572 | 4566 | ret = btrfs_qgroup_reserve(root, num_bytes + |
| 4573 | 4567 | nr_extents * root->leafsize); |
| 4574 | − if (ret) | |
| 4568 | + if (ret) { | |
| 4569 | + mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | |
| 4575 | 4570 | return ret; |
| 4571 | + } | |
| 4576 | 4572 | } |
| 4577 | 4573 | |
| 4578 | 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, · 715 unmodified lines | ||
| 5294 | 5290 | rb_erase(&head->node.rb_node, &delayed_refs->root); |
| 5295 | 5291 | |
| 5296 | 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 | 5295 | * we don't take a ref on the node because we're removing it from the |
| @@ -2330,23 +2330,10 @@ static void end_bio_extent_readpage(struct bio *bio, int err) · 2329 unmodified lines | ||
| 2330 | 2330 | if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) { |
| 2331 | 2331 | ret = tree->ops->readpage_end_io_hook(page, start, end, |
| 2332 | 2332 | state, mirror); |
| 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 | − | |
| 2333 | + if (ret) | |
| 2341 | 2334 | uptodate = 0; |
| 2342 | − device = btrfs_find_device_for_logical( | |
| 2343 | − root, start, mirror); | |
| 2344 | − if (device) | |
| 2345 | − btrfs_dev_stat_inc_and_print(device, | |
| 2346 | − BTRFS_DEV_STAT_CORRUPTION_ERRS); | |
| 2347 | − } else { | |
| 2335 | + else | |
| 2348 | 2336 | clean_io_failure(start, page); |
| 2349 | − } | |
| 2350 | 2337 | } |
| 2351 | 2338 | |
| 2352 | 2339 | if (!uptodate && tree->ops && tree->ops->readpage_io_failed_hook) { |
| @@ -272,9 +272,9 @@ int btrfs_lookup_bio_sums(struct btrfs_root *root, struct inode *inode, · 271 unmodified lines | ||
| 272 | 272 | } |
| 273 | 273 | |
| 274 | 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 | 280 | int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end, |
| @@ -1008,9 +1008,7 @@ static noinline void async_cow_submit(struct btrfs_work *work) · 1007 unmodified lines | ||
| 1008 | 1008 | nr_pages = (async_cow->end - async_cow->start + PAGE_CACHE_SIZE) >> |
| 1009 | 1009 | PAGE_CACHE_SHIFT; |
| 1010 | 1010 | |
| 1011 | − atomic_sub(nr_pages, &root->fs_info->async_delalloc_pages); | |
| 1012 | − | |
| 1013 | − if (atomic_read(&root->fs_info->async_delalloc_pages) < | |
| 1011 | + if (atomic_sub_return(nr_pages, &root->fs_info->async_delalloc_pages) < | |
| 1014 | 1012 | 5 * 1024 * 1024 && |
| 1015 | 1013 | waitqueue_active(&root->fs_info->async_submit_wait)) |
| 1016 | 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) · 868 unmodified lines | ||
| 1885 | 1883 | trans = btrfs_join_transaction_nolock(root); |
| 1886 | 1884 | else |
| 1887 | 1885 | trans = btrfs_join_transaction(root); |
| 1888 | − if (IS_ERR(trans)) | |
| 1889 | − return PTR_ERR(trans); | |
| 1886 | + if (IS_ERR(trans)) { | |
| 1887 | + ret = PTR_ERR(trans); | |
| 1888 | + trans = NULL; | |
| 1889 | + goto out; | |
| 1890 | + } | |
| 1890 | 1891 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
| 1891 | 1892 | ret = btrfs_update_inode_fallback(trans, root, inode); |
| 1892 | 1893 | if (ret) /* -ENOMEM or corruption */ |
| @@ -3174,7 +3175,7 @@ int btrfs_unlink_subvol(struct btrfs_trans_handle *trans, · 1281 unmodified lines | ||
| 3174 | 3175 | btrfs_i_size_write(dir, dir->i_size - name_len * 2); |
| 3175 | 3176 | inode_inc_iversion(dir); |
| 3176 | 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 | 3179 | if (ret) |
| 3179 | 3180 | btrfs_abort_transaction(trans, root, ret); |
| 3180 | 3181 | out: |
| @@ -5774,18 +5775,112 @@ out: · 2593 unmodified lines | ||
| 5774 | 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 | 5839 | static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, |
| 5778 | 5840 | struct buffer_head *bh_result, int create) |
| 5779 | 5841 | { |
| 5780 | 5842 | struct extent_map *em; |
| 5781 | 5843 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5844 | + struct extent_state *cached_state = NULL; | |
| 5782 | 5845 | u64 start = iblock << inode->i_blkbits; |
| 5846 | + u64 lockstart, lockend; | |
| 5783 | 5847 | u64 len = bh_result->b_size; |
| 5784 | 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 | 5879 | em = btrfs_get_extent(inode, NULL, 0, start, len, 0); |
| 5787 | − if (IS_ERR(em)) | |
| 5788 | − return PTR_ERR(em); | |
| 5880 | + if (IS_ERR(em)) { | |
| 5881 | + ret = PTR_ERR(em); | |
| 5882 | + goto unlock_err; | |
| 5883 | + } | |
| 5789 | 5884 | |
| 5790 | 5885 | /* |
| 5791 | 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, · 12 unmodified lines | ||
| 5804 | 5899 | if (test_bit(EXTENT_FLAG_COMPRESSED, &em->flags) || |
| 5805 | 5900 | em->block_start == EXTENT_MAP_INLINE) { |
| 5806 | 5901 | free_extent_map(em); |
| 5807 | − return -ENOTBLK; | |
| 5902 | + ret = -ENOTBLK; | |
| 5903 | + goto unlock_err; | |
| 5808 | 5904 | } |
| 5809 | 5905 | |
| 5810 | 5906 | /* Just a good old fashioned hole, return */ |
| 5811 | 5907 | if (!create && (em->block_start == EXTENT_MAP_HOLE || |
| 5812 | 5908 | test_bit(EXTENT_FLAG_PREALLOC, &em->flags))) { |
| 5813 | 5909 | free_extent_map(em); |
| 5814 | − /* DIO will do one hole at a time, so just unlock a sector */ | |
| 5815 | − unlock_extent(&BTRFS_I(inode)->io_tree, start, | |
| 5816 | − start + root->sectorsize - 1); | |
| 5817 | − return 0; | |
| 5910 | + ret = 0; | |
| 5911 | + goto unlock_err; | |
| 5818 | 5912 | } |
| 5819 | 5913 | |
| 5820 | 5914 | /* |
| @@ -5827,8 +5921,9 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock, · 6 unmodified lines | ||
| 5827 | 5921 | * |
| 5828 | 5922 | */ |
| 5829 | 5923 | if (!create) { |
| 5830 | − len = em->len - (start - em->start); | |
| 5831 | − goto map; | |
| 5924 | + len = min(len, em->len - (start - em->start)); | |
| 5925 | + lockstart = start + len; | |
| 5926 | + goto unlock; | |
| 5832 | 5927 | } |
| 5833 | 5928 | |
| 5834 | 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, · 25 unmodified lines | ||
| 5860 | 5955 | btrfs_end_transaction(trans, root); |
| 5861 | 5956 | if (ret) { |
| 5862 | 5957 | free_extent_map(em); |
| 5863 | − return ret; | |
| 5958 | + goto unlock_err; | |
| 5864 | 5959 | } |
| 5865 | 5960 | goto unlock; |
| 5866 | 5961 | } |
| @@ -5873,14 +5968,12 @@ must_cow: · 6 unmodified lines | ||
| 5873 | 5968 | */ |
| 5874 | 5969 | len = bh_result->b_size; |
| 5875 | 5970 | em = btrfs_new_extent_direct(inode, em, start, len); |
| 5876 | − if (IS_ERR(em)) | |
| 5877 | − return PTR_ERR(em); | |
| 5971 | + if (IS_ERR(em)) { | |
| 5972 | + ret = PTR_ERR(em); | |
| 5973 | + goto unlock_err; | |
| 5974 | + } | |
| 5878 | 5975 | len = min(len, em->len - (start - em->start)); |
| 5879 | 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 | 5977 | bh_result->b_blocknr = (em->block_start + (start - em->start)) >> |
| 5885 | 5978 | inode->i_blkbits; |
| 5886 | 5979 | bh_result->b_size = len; |
| @@ -5898,9 +5991,44 @@ map: · 11 unmodified lines | ||
| 5898 | 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 | 6021 | free_extent_map(em); |
| 5902 | 6022 | |
| 5903 | 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 | 6034 | struct btrfs_dio_private { |
| @@ -5908,7 +6036,6 @@ struct btrfs_dio_private { · 1 unmodified line | ||
| 5908 | 6036 | u64 logical_offset; |
| 5909 | 6037 | u64 disk_bytenr; |
| 5910 | 6038 | u64 bytes; |
| 5911 | − u32 *csums; | |
| 5912 | 6039 | void *private; |
| 5913 | 6040 | |
| 5914 | 6041 | /* number of bios pending for this dio */ |
| @@ -5928,7 +6055,6 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) · 13 unmodified lines | ||
| 5928 | 6055 | struct inode *inode = dip->inode; |
| 5929 | 6056 | struct btrfs_root *root = BTRFS_I(inode)->root; |
| 5930 | 6057 | u64 start; |
| 5931 | − u32 *private = dip->csums; | |
| 5932 | 6058 | |
| 5933 | 6059 | start = dip->logical_offset; |
| 5934 | 6060 | do { |
| @@ -5936,8 +6062,12 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) · 1 unmodified line | ||
| 5936 | 6062 | struct page *page = bvec->bv_page; |
| 5937 | 6063 | char *kaddr; |
| 5938 | 6064 | u32 csum = ~(u32)0; |
| 6065 | + u64 private = ~(u32)0; | |
| 5939 | 6066 | unsigned long flags; |
| 5940 | 6067 | |
| 6068 | + if (get_state_private(&BTRFS_I(inode)->io_tree, | |
| 6069 | + start, &private)) | |
| 6070 | + goto failed; | |
| 5941 | 6071 | local_irq_save(flags); |
| 5942 | 6072 | kaddr = kmap_atomic(page); |
| 5943 | 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) · 3 unmodified lines | ||
| 5947 | 6077 | local_irq_restore(flags); |
| 5948 | 6078 | |
| 5949 | 6079 | flush_dcache_page(bvec->bv_page); |
| 5950 | − if (csum != *private) { | |
| 6080 | + if (csum != private) { | |
| 6081 | +failed: | |
| 5951 | 6082 | printk(KERN_ERR "btrfs csum failed ino %llu off" |
| 5952 | 6083 | " %llu csum %u private %u\n", |
| 5953 | 6084 | (unsigned long long)btrfs_ino(inode), |
| 5954 | 6085 | (unsigned long long)start, |
| 5955 | − csum, *private); | |
| 6086 | + csum, (unsigned)private); | |
| 5956 | 6087 | err = -EIO; |
| 5957 | 6088 | } |
| 5958 | 6089 | } |
| 5959 | 6090 | |
| 5960 | 6091 | start += bvec->bv_len; |
| 5961 | − private++; | |
| 5962 | 6092 | bvec++; |
| 5963 | 6093 | } while (bvec <= bvec_end); |
| 5964 | 6094 | |
| @@ -5966,7 +6096,6 @@ static void btrfs_endio_direct_read(struct bio *bio, int err) · 1 unmodified line | ||
| 5966 | 6096 | dip->logical_offset + dip->bytes - 1); |
| 5967 | 6097 | bio->bi_private = dip->private; |
| 5968 | 6098 | |
| 5969 | − kfree(dip->csums); | |
| 5970 | 6099 | kfree(dip); |
| 5971 | 6100 | |
| 5972 | 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, · 99 unmodified lines | ||
| 6072 | 6201 | |
| 6073 | 6202 | static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, |
| 6074 | 6203 | int rw, u64 file_offset, int skip_sum, |
| 6075 | − u32 *csums, int async_submit) | |
| 6204 | + int async_submit) | |
| 6076 | 6205 | { |
| 6077 | 6206 | int write = rw & REQ_WRITE; |
| 6078 | 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, · 26 unmodified lines | ||
| 6105 | 6234 | if (ret) |
| 6106 | 6235 | goto err; |
| 6107 | 6236 | } else if (!skip_sum) { |
| 6108 | − ret = btrfs_lookup_bio_sums_dio(root, inode, bio, | |
| 6109 | − file_offset, csums); | |
| 6237 | + ret = btrfs_lookup_bio_sums_dio(root, inode, bio, file_offset); | |
| 6110 | 6238 | if (ret) |
| 6111 | 6239 | goto err; |
| 6112 | 6240 | } |
| @@ -6132,10 +6260,8 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, · 19 unmodified lines | ||
| 6132 | 6260 | u64 submit_len = 0; |
| 6133 | 6261 | u64 map_length; |
| 6134 | 6262 | int nr_pages = 0; |
| 6135 | − u32 *csums = dip->csums; | |
| 6136 | 6263 | int ret = 0; |
| 6137 | 6264 | int async_submit = 0; |
| 6138 | − int write = rw & REQ_WRITE; | |
| 6139 | 6265 | |
| 6140 | 6266 | map_length = orig_bio->bi_size; |
| 6141 | 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, · 29 unmodified lines | ||
| 6171 | 6297 | atomic_inc(&dip->pending_bios); |
| 6172 | 6298 | ret = __btrfs_submit_dio_bio(bio, inode, rw, |
| 6173 | 6299 | file_offset, skip_sum, |
| 6174 | − csums, async_submit); | |
| 6300 | + async_submit); | |
| 6175 | 6301 | if (ret) { |
| 6176 | 6302 | bio_put(bio); |
| 6177 | 6303 | atomic_dec(&dip->pending_bios); |
| 6178 | 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 | 6307 | start_sector += submit_len >> 9; |
| 6185 | 6308 | file_offset += submit_len; |
| 6186 | 6309 | |
| @@ -6210,7 +6333,7 @@ static int btrfs_submit_direct_hook(int rw, struct btrfs_dio_private *dip, · 23 unmodified lines | ||
| 6210 | 6333 | |
| 6211 | 6334 | submit: |
| 6212 | 6335 | ret = __btrfs_submit_dio_bio(bio, inode, rw, file_offset, skip_sum, |
| 6213 | − csums, async_submit); | |
| 6336 | + async_submit); | |
| 6214 | 6337 | if (!ret) |
| 6215 | 6338 | return 0; |
| 6216 | 6339 | |
| @@ -6246,17 +6369,6 @@ static void btrfs_submit_direct(int rw, struct bio *bio, struct inode *inode, · 29 unmodified lines | ||
| 6246 | 6369 | ret = -ENOMEM; |
| 6247 | 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 | 6373 | dip->private = bio->bi_private; |
| 6262 | 6374 | dip->inode = inode; |
| @@ -6341,132 +6453,22 @@ static ssize_t check_direct_IO(struct btrfs_root *root, int rw, struct kiocb *io · 78 unmodified lines | ||
| 6341 | 6453 | out: |
| 6342 | 6454 | return retval; |
| 6343 | 6455 | } |
| 6456 | + | |
| 6344 | 6457 | static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, |
| 6345 | 6458 | const struct iovec *iov, loff_t offset, |
| 6346 | 6459 | unsigned long nr_segs) |
| 6347 | 6460 | { |
| 6348 | 6461 | struct file *file = iocb->ki_filp; |
| 6349 | 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 | 6464 | if (check_direct_IO(BTRFS_I(inode)->root, rw, iocb, iov, |
| 6359 | − offset, nr_segs)) { | |
| 6465 | + offset, nr_segs)) | |
| 6360 | 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 | − /* | |
| 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, | |
| 6468 | + return __blockdev_direct_IO(rw, iocb, inode, | |
| 6448 | 6469 | BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, |
| 6449 | 6470 | iov, offset, nr_segs, btrfs_get_blocks_direct, NULL, |
| 6450 | 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 | 6474 | static int btrfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
| @@ -424,7 +424,7 @@ static noinline int create_subvol(struct btrfs_root *root, · 423 unmodified lines | ||
| 424 | 424 | uuid_le_gen(&new_uuid); |
| 425 | 425 | memcpy(root_item.uuid, new_uuid.b, BTRFS_UUID_SIZE); |
| 426 | 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 | 428 | root_item.ctime = root_item.otime; |
| 429 | 429 | btrfs_set_root_ctransid(&root_item, trans->transid); |
| 430 | 430 | btrfs_set_root_otransid(&root_item, trans->transid); |
| @@ -67,7 +67,7 @@ void btrfs_clear_lock_blocking_rw(struct extent_buffer *eb, int rw) · 66 unmodified lines | ||
| 67 | 67 | { |
| 68 | 68 | if (eb->lock_nested) { |
| 69 | 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 | 71 | read_unlock(&eb->lock); |
| 72 | 72 | return; |
| 73 | 73 | } |
| @@ -1364,13 +1364,17 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, · 1363 unmodified lines | ||
| 1364 | 1364 | spin_lock(&fs_info->qgroup_lock); |
| 1365 | 1365 | |
| 1366 | 1366 | dstgroup = add_qgroup_rb(fs_info, objectid); |
| 1367 | − if (!dstgroup) | |
| 1367 | + if (IS_ERR(dstgroup)) { | |
| 1368 | + ret = PTR_ERR(dstgroup); | |
| 1368 | 1369 | goto unlock; |
| 1370 | + } | |
| 1369 | 1371 | |
| 1370 | 1372 | if (srcid) { |
| 1371 | 1373 | srcgroup = find_qgroup_rb(fs_info, srcid); |
| 1372 | − if (!srcgroup) | |
| 1374 | + if (!srcgroup) { | |
| 1375 | + ret = -EINVAL; | |
| 1373 | 1376 | goto unlock; |
| 1377 | + } | |
| 1374 | 1378 | dstgroup->rfer = srcgroup->rfer - level_size; |
| 1375 | 1379 | dstgroup->rfer_cmpr = srcgroup->rfer_cmpr - level_size; |
| 1376 | 1380 | srcgroup->excl = level_size; |
| @@ -1379,8 +1383,10 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, · 2 unmodified lines | ||
| 1379 | 1383 | qgroup_dirty(fs_info, srcgroup); |
| 1380 | 1384 | } |
| 1381 | 1385 | |
| 1382 | − if (!inherit) | |
| 1386 | + if (!inherit) { | |
| 1387 | + ret = -EINVAL; | |
| 1383 | 1388 | goto unlock; |
| 1389 | + } | |
| 1384 | 1390 | |
| 1385 | 1391 | i_qgroups = (u64 *)(inherit + 1); |
| 1386 | 1392 | for (i = 0; i < inherit->num_qgroups; ++i) { |
| @@ -544,8 +544,8 @@ void btrfs_update_root_times(struct btrfs_trans_handle *trans, · 543 unmodified lines | ||
| 544 | 544 | struct timespec ct = CURRENT_TIME; |
| 545 | 545 | |
| 546 | 546 | spin_lock(&root->root_times_lock); |
| 547 | − item->ctransid = trans->transid; | |
| 547 | + item->ctransid = cpu_to_le64(trans->transid); | |
| 548 | 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 | 550 | spin_unlock(&root->root_times_lock); |
| 551 | 551 | } |
| @@ -838,7 +838,6 @@ int btrfs_sync_fs(struct super_block *sb, int wait) · 837 unmodified lines | ||
| 838 | 838 | struct btrfs_trans_handle *trans; |
| 839 | 839 | struct btrfs_fs_info *fs_info = btrfs_sb(sb); |
| 840 | 840 | struct btrfs_root *root = fs_info->tree_root; |
| 841 | − int ret; | |
| 842 | 841 | |
| 843 | 842 | trace_btrfs_sync_fs(wait); |
| 844 | 843 | |
| @@ -849,11 +848,17 @@ int btrfs_sync_fs(struct super_block *sb, int wait) · 4 unmodified lines | ||
| 849 | 848 | |
| 850 | 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 | 859 | if (IS_ERR(trans)) |
| 854 | 860 | return PTR_ERR(trans); |
| 855 | − ret = btrfs_commit_transaction(trans, root); | |
| 856 | − return ret; | |
| 861 | + return btrfs_commit_transaction(trans, root); | |
| 857 | 862 | } |
| 858 | 863 | |
| 859 | 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) · 670 unmodified lines | ||
| 1530 | 1535 | while (cur_devices) { |
| 1531 | 1536 | head = &cur_devices->devices; |
| 1532 | 1537 | list_for_each_entry(dev, head, dev_list) { |
| 1538 | + if (dev->missing) | |
| 1539 | + continue; | |
| 1533 | 1540 | if (!first_dev || dev->devid < first_dev->devid) |
| 1534 | 1541 | first_dev = dev; |
| 1535 | 1542 | } |
| @@ -1031,6 +1031,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, · 1030 unmodified lines | ||
| 1031 | 1031 | |
| 1032 | 1032 | btrfs_i_size_write(parent_inode, parent_inode->i_size + |
| 1033 | 1033 | dentry->d_name.len * 2); |
| 1034 | + parent_inode->i_mtime = parent_inode->i_ctime = CURRENT_TIME; | |
| 1034 | 1035 | ret = btrfs_update_inode(trans, parent_root, parent_inode); |
| 1035 | 1036 | if (ret) |
| 1036 | 1037 | goto abort_trans_dput; |
| @@ -1066,7 +1067,7 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, · 29 unmodified lines | ||
| 1066 | 1067 | memcpy(new_root_item->parent_uuid, root->root_item.uuid, |
| 1067 | 1068 | BTRFS_UUID_SIZE); |
| 1068 | 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 | 1071 | btrfs_set_root_otransid(new_root_item, trans->transid); |
| 1071 | 1072 | memset(&new_root_item->stime, 0, sizeof(new_root_item->stime)); |
| 1072 | 1073 | memset(&new_root_item->rtime, 0, sizeof(new_root_item->rtime)); |
| @@ -227,9 +227,8 @@ loop_lock: · 226 unmodified lines | ||
| 227 | 227 | cur = pending; |
| 228 | 228 | pending = pending->bi_next; |
| 229 | 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 | 232 | waitqueue_active(&fs_info->async_submit_wait)) |
| 234 | 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) · 333 unmodified lines | ||
| 569 | 568 | memcpy(new_device, device, sizeof(*new_device)); |
| 570 | 569 | |
| 571 | 570 | /* Safe because we are under uuid_mutex */ |
| 572 | − name = rcu_string_strdup(device->name->str, GFP_NOFS); | |
| 573 | − BUG_ON(device->name && !name); /* -ENOMEM */ | |
| 574 | − rcu_assign_pointer(new_device->name, name); | |
| 571 | + if (device->name) { | |
| 572 | + name = rcu_string_strdup(device->name->str, GFP_NOFS); | |
| 573 | + BUG_ON(device->name && !name); /* -ENOMEM */ | |
| 574 | + rcu_assign_pointer(new_device->name, name); | |
| 575 | + } | |
| 575 | 576 | new_device->bdev = NULL; |
| 576 | 577 | new_device->writeable = 0; |
| 577 | 578 | new_device->in_fs_metadata = 0; |
| @@ -4605,28 +4606,6 @@ int btrfs_read_sys_array(struct btrfs_root *root) · 4027 unmodified lines | ||
| 4605 | 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 | 4609 | int btrfs_read_chunk_tree(struct btrfs_root *root) |
| 4631 | 4610 | { |
| 4632 | 4611 | struct btrfs_path *path; |
| @@ -289,8 +289,6 @@ int btrfs_cancel_balance(struct btrfs_fs_info *fs_info); · 288 unmodified lines | ||
| 289 | 289 | int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset); |
| 290 | 290 | int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes, |
| 291 | 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 | 292 | void btrfs_dev_stat_print_on_error(struct btrfs_device *device); |
| 295 | 293 | void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); |
| 296 | 294 | int btrfs_get_dev_stats(struct btrfs_root *root, |
| @@ -914,7 +914,7 @@ link_dev_buffers(struct page *page, struct buffer_head *head) · 913 unmodified lines | ||
| 914 | 914 | /* |
| 915 | 915 | * Initialise the state of a blockdev page's buffers. |
| 916 | 916 | */ |
| 917 | −static void | |
| 917 | +static sector_t | |
| 918 | 918 | init_page_buffers(struct page *page, struct block_device *bdev, |
| 919 | 919 | sector_t block, int size) |
| 920 | 920 | { |
| @@ -936,33 +936,41 @@ init_page_buffers(struct page *page, struct block_device *bdev, · 15 unmodified lines | ||
| 936 | 936 | block++; |
| 937 | 937 | bh = bh->b_this_page; |
| 938 | 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 | 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 | 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 | 955 | struct inode *inode = bdev->bd_inode; |
| 951 | 956 | struct page *page; |
| 952 | 957 | struct buffer_head *bh; |
| 958 | + sector_t end_block; | |
| 959 | + int ret = 0; /* Will call free_more_memory() */ | |
| 953 | 960 | |
| 954 | 961 | page = find_or_create_page(inode->i_mapping, index, |
| 955 | 962 | (mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS)|__GFP_MOVABLE); |
| 956 | 963 | if (!page) |
| 957 | − return NULL; | |
| 964 | + return ret; | |
| 958 | 965 | |
| 959 | 966 | BUG_ON(!PageLocked(page)); |
| 960 | 967 | |
| 961 | 968 | if (page_has_buffers(page)) { |
| 962 | 969 | bh = page_buffers(page); |
| 963 | 970 | if (bh->b_size == size) { |
| 964 | − init_page_buffers(page, bdev, block, size); | |
| 965 | − return page; | |
| 971 | + end_block = init_page_buffers(page, bdev, | |
| 972 | + index << sizebits, size); | |
| 973 | + goto done; | |
| 966 | 974 | } |
| 967 | 975 | if (!try_to_free_buffers(page)) |
| 968 | 976 | goto failed; |
| @@ -982,14 +990,14 @@ grow_dev_page(struct block_device *bdev, sector_t block, · 13 unmodified lines | ||
| 982 | 990 | */ |
| 983 | 991 | spin_lock(&inode->i_mapping->private_lock); |
| 984 | 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 | 994 | spin_unlock(&inode->i_mapping->private_lock); |
| 987 | − return page; | |
| 988 | − | |
| 995 | +done: | |
| 996 | + ret = (block < end_block) ? 1 : -ENXIO; | |
| 989 | 997 | failed: |
| 990 | 998 | unlock_page(page); |
| 991 | 999 | page_cache_release(page); |
| 992 | − return NULL; | |
| 1000 | + return ret; | |
| 993 | 1001 | } |
| 994 | 1002 | |
| 995 | 1003 | /* |
| @@ -999,7 +1007,6 @@ failed: · 3 unmodified lines | ||
| 999 | 1007 | static int |
| 1000 | 1008 | grow_buffers(struct block_device *bdev, sector_t block, int size) |
| 1001 | 1009 | { |
| 1002 | − struct page *page; | |
| 1003 | 1010 | pgoff_t index; |
| 1004 | 1011 | int sizebits; |
| 1005 | 1012 | |
| @@ -1023,22 +1030,14 @@ grow_buffers(struct block_device *bdev, sector_t block, int size) · 17 unmodified lines | ||
| 1023 | 1030 | bdevname(bdev, b)); |
| 1024 | 1031 | return -EIO; |
| 1025 | 1032 | } |
| 1026 | − block = index << sizebits; | |
| 1033 | + | |
| 1027 | 1034 | /* Create a page with the proper size buffers.. */ |
| 1028 | − page = grow_dev_page(bdev, block, index, size); | |
| 1029 | − if (!page) | |
| 1030 | − return 0; | |
| 1031 | − unlock_page(page); | |
| 1032 | − page_cache_release(page); | |
| 1033 | − return 1; | |
| 1035 | + return grow_dev_page(bdev, block, index, size, sizebits); | |
| 1034 | 1036 | } |
| 1035 | 1037 | |
| 1036 | 1038 | static struct buffer_head * |
| 1037 | 1039 | __getblk_slow(struct block_device *bdev, sector_t block, int size) |
| 1038 | 1040 | { |
| 1039 | − int ret; | |
| 1040 | − struct buffer_head *bh; | |
| 1041 | − | |
| 1042 | 1041 | /* Size must be multiple of hard sectorsize */ |
| 1043 | 1042 | if (unlikely(size & (bdev_logical_block_size(bdev)-1) || |
| 1044 | 1043 | (size < 512 || size > PAGE_SIZE))) { |
| @@ -1051,21 +1050,20 @@ __getblk_slow(struct block_device *bdev, sector_t block, int size) · 6 unmodified lines | ||
| 1051 | 1050 | return NULL; |
| 1052 | 1051 | } |
| 1053 | 1052 | |
| 1054 | −retry: | |
| 1055 | − bh = __find_get_block(bdev, block, size); | |
| 1056 | − if (bh) | |
| 1057 | − return bh; | |
| 1053 | + for (;;) { | |
| 1054 | + struct buffer_head *bh; | |
| 1055 | + int ret; | |
| 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 | 1057 | bh = __find_get_block(bdev, block, size); |
| 1065 | 1058 | if (bh) |
| 1066 | 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); · 249 unmodified lines | ||
| 1321 | 1319 | * which corresponds to the passed block_device, block and size. The |
| 1322 | 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 | 1322 | * __getblk() will lock up the machine if grow_dev_page's try_to_free_buffers() |
| 1329 | 1323 | * attempt is failing. FIXME, perhaps? |
| 1330 | 1324 | */ |
| @@ -1576,9 +1576,14 @@ cifs_readv_callback(struct mid_q_entry *mid) · 1575 unmodified lines | ||
| 1576 | 1576 | /* result already set, check signature */ |
| 1577 | 1577 | if (server->sec_mode & |
| 1578 | 1578 | (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { |
| 1579 | − if (cifs_verify_signature(rdata->iov, rdata->nr_iov, | |
| 1580 | − server, mid->sequence_number + 1)) | |
| 1581 | − cERROR(1, "Unexpected SMB signature"); | |
| 1579 | + int rc = 0; | |
| 1580 | + | |
| 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 | 1588 | /* FIXME: should this be counted toward the initiating task? */ |
| 1584 | 1589 | task_io_account_read(rdata->bytes); |
| @@ -356,19 +356,12 @@ cifs_create_get_file_info: · 355 unmodified lines | ||
| 356 | 356 | cifs_create_set_dentry: |
| 357 | 357 | if (rc != 0) { |
| 358 | 358 | cFYI(1, "Create worked, get_inode_info failed rc = %d", rc); |
| 359 | + CIFSSMBClose(xid, tcon, *fileHandle); | |
| 359 | 360 | goto out; |
| 360 | 361 | } |
| 361 | 362 | d_drop(direntry); |
| 362 | 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 | 365 | out: |
| 373 | 366 | kfree(buf); |
| 374 | 367 | kfree(full_path); |
| @@ -124,10 +124,10 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) · 123 unmodified lines | ||
| 124 | 124 | { |
| 125 | 125 | struct cifsInodeInfo *cifs_i = CIFS_I(inode); |
| 126 | 126 | struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); |
| 127 | − unsigned long oldtime = cifs_i->time; | |
| 128 | 127 | |
| 129 | 128 | cifs_revalidate_cache(inode, fattr); |
| 130 | 129 | |
| 130 | + spin_lock(&inode->i_lock); | |
| 131 | 131 | inode->i_atime = fattr->cf_atime; |
| 132 | 132 | inode->i_mtime = fattr->cf_mtime; |
| 133 | 133 | inode->i_ctime = fattr->cf_ctime; |
| @@ -148,9 +148,6 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) · 14 unmodified lines | ||
| 148 | 148 | else |
| 149 | 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 | 151 | cifs_i->delete_pending = fattr->cf_flags & CIFS_FATTR_DELETE_PENDING; |
| 155 | 152 | |
| 156 | 153 | cifs_i->server_eof = fattr->cf_eof; |
| @@ -158,7 +155,6 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr) · 1 unmodified line | ||
| 158 | 155 | * Can't safely change the file size here if the client is writing to |
| 159 | 156 | * it due to potential races. |
| 160 | 157 | */ |
| 161 | − spin_lock(&inode->i_lock); | |
| 162 | 158 | if (is_size_safe_to_change(cifs_i, fattr->cf_eof)) { |
| 163 | 159 | i_size_write(inode, fattr->cf_eof); |
| 164 | 160 | |
| @@ -859,12 +855,14 @@ struct inode *cifs_root_iget(struct super_block *sb) · 694 unmodified lines | ||
| 859 | 855 | |
| 860 | 856 | if (rc && tcon->ipc) { |
| 861 | 857 | cFYI(1, "ipc connection - fake read inode"); |
| 858 | + spin_lock(&inode->i_lock); | |
| 862 | 859 | inode->i_mode |= S_IFDIR; |
| 863 | 860 | set_nlink(inode, 2); |
| 864 | 861 | inode->i_op = &cifs_ipc_inode_ops; |
| 865 | 862 | inode->i_fop = &simple_dir_operations; |
| 866 | 863 | inode->i_uid = cifs_sb->mnt_uid; |
| 867 | 864 | inode->i_gid = cifs_sb->mnt_gid; |
| 865 | + spin_unlock(&inode->i_lock); | |
| 868 | 866 | } else if (rc) { |
| 869 | 867 | iget_failed(inode); |
| 870 | 868 | inode = ERR_PTR(rc); |
| @@ -1110,6 +1108,15 @@ undo_setattr: · 239 unmodified lines | ||
| 1110 | 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 | 1122 | * If dentry->d_inode is null (usually meaning the cached dentry |
| @@ -1166,13 +1173,13 @@ retry_std_delete: · 50 unmodified lines | ||
| 1166 | 1173 | psx_del_no_retry: |
| 1167 | 1174 | if (!rc) { |
| 1168 | 1175 | if (inode) |
| 1169 | − drop_nlink(inode); | |
| 1176 | + cifs_drop_nlink(inode); | |
| 1170 | 1177 | } else if (rc == -ENOENT) { |
| 1171 | 1178 | d_drop(dentry); |
| 1172 | 1179 | } else if (rc == -ETXTBSY) { |
| 1173 | 1180 | rc = cifs_rename_pending_delete(full_path, dentry, xid); |
| 1174 | 1181 | if (rc == 0) |
| 1175 | − drop_nlink(inode); | |
| 1182 | + cifs_drop_nlink(inode); | |
| 1176 | 1183 | } else if ((rc == -EACCES) && (dosattr == 0) && inode) { |
| 1177 | 1184 | attrs = kzalloc(sizeof(*attrs), GFP_KERNEL); |
| 1178 | 1185 | if (attrs == NULL) { |
| @@ -1241,9 +1248,10 @@ cifs_mkdir_qinfo(struct inode *inode, struct dentry *dentry, umode_t mode, · 62 unmodified lines | ||
| 1241 | 1248 | * setting nlink not necessary except in cases where we failed to get it |
| 1242 | 1249 | * from the server or was set bogus |
| 1243 | 1250 | */ |
| 1251 | + spin_lock(&dentry->d_inode->i_lock); | |
| 1244 | 1252 | if ((dentry->d_inode) && (dentry->d_inode->i_nlink < 2)) |
| 1245 | 1253 | set_nlink(dentry->d_inode, 2); |
| 1246 | − | |
| 1254 | + spin_unlock(&dentry->d_inode->i_lock); | |
| 1247 | 1255 | mode &= ~current_umask(); |
| 1248 | 1256 | /* must turn on setgid bit if parent dir has it */ |
| 1249 | 1257 | if (inode->i_mode & S_ISGID) |
| @@ -433,7 +433,9 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode, · 432 unmodified lines | ||
| 433 | 433 | if (old_file->d_inode) { |
| 434 | 434 | cifsInode = CIFS_I(old_file->d_inode); |
| 435 | 435 | if (rc == 0) { |
| 436 | + spin_lock(&old_file->d_inode->i_lock); | |
| 436 | 437 | inc_nlink(old_file->d_inode); |
| 438 | + spin_unlock(&old_file->d_inode->i_lock); | |
| 437 | 439 | /* BB should we make this contingent on superblock flag NOATIME? */ |
| 438 | 440 | /* old_file->d_inode->i_ctime = CURRENT_TIME;*/ |
| 439 | 441 | /* parent dir timestamps will update from srv |
| @@ -52,7 +52,8 @@ check_smb2_hdr(struct smb2_hdr *hdr, __u64 mid) · 51 unmodified lines | ||
| 52 | 52 | cERROR(1, "Bad protocol string signature header %x", |
| 53 | 53 | *(unsigned int *) hdr->ProtocolId); |
| 54 | 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 | 58 | cERROR(1, "Bad SMB detected. The Mid=%llu", hdr->MessageId); |
| 58 | 59 | return 1; |
| @@ -107,7 +108,7 @@ smb2_check_message(char *buf, unsigned int length) · 48 unmodified lines | ||
| 107 | 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 | 112 | if ((length >= sizeof(struct smb2_hdr)) && (hdr->Status != 0)) { |
| 112 | 113 | pdu->StructureSize2 = 0; |
| 113 | 114 | /* |
| @@ -121,15 +122,15 @@ smb2_check_message(char *buf, unsigned int length) · 7 unmodified lines | ||
| 121 | 122 | return 1; |
| 122 | 123 | } |
| 123 | 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 | 126 | return 1; |
| 126 | 127 | } |
| 127 | 128 | |
| 128 | 129 | if (check_smb2_hdr(hdr, mid)) |
| 129 | 130 | return 1; |
| 130 | 131 | |
| 131 | − if (hdr->StructureSize != SMB2_HEADER_SIZE) { | |
| 132 | − cERROR(1, "Illegal structure size %d", | |
| 132 | + if (hdr->StructureSize != SMB2_HEADER_STRUCTURE_SIZE) { | |
| 133 | + cERROR(1, "Illegal structure size %u", | |
| 133 | 134 | le16_to_cpu(hdr->StructureSize)); |
| 134 | 135 | return 1; |
| 135 | 136 | } |
| @@ -161,8 +162,9 @@ smb2_check_message(char *buf, unsigned int length) · 25 unmodified lines | ||
| 161 | 162 | if (4 + len != clc_len) { |
| 162 | 163 | cFYI(1, "Calculated size %u length %u mismatch mid %llu", |
| 163 | 164 | clc_len, 4 + len, mid); |
| 164 | − if (clc_len == 4 + len + 1) /* BB FIXME (fix samba) */ | |
| 165 | − return 0; /* BB workaround Samba 3 bug SessSetup rsp */ | |
| 165 | + /* server can return one byte more */ | |
| 166 | + if (clc_len == 4 + len + 1) | |
| 167 | + return 0; | |
| 166 | 168 | return 1; |
| 167 | 169 | } |
| 168 | 170 | return 0; |
| @@ -87,10 +87,6 @@ · 86 unmodified lines | ||
| 87 | 87 | |
| 88 | 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 | 91 | * SMB2 Header Definition |
| 96 | 92 | * |
| @@ -99,6 +95,9 @@ · 2 unmodified lines | ||
| 99 | 95 | * "PDU" : "Protocol Data Unit" (ie a network "frame") |
| 100 | 96 | * |
| 101 | 97 | */ |
| 98 | + | |
| 99 | +#define SMB2_HEADER_STRUCTURE_SIZE __constant_le16_to_cpu(64) | |
| 100 | + | |
| 102 | 101 | struct smb2_hdr { |
| 103 | 102 | __be32 smb2_buf_length; /* big endian on wire */ |
| 104 | 103 | /* length is only two or three bytes - with |
| @@ -140,6 +139,9 @@ struct smb2_pdu { · 35 unmodified lines | ||
| 140 | 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_le16_to_cpu(9) | |
| 144 | + | |
| 143 | 145 | struct smb2_err_rsp { |
| 144 | 146 | struct smb2_hdr hdr; |
| 145 | 147 | __le16 StructureSize; |
| @@ -503,13 +503,16 @@ cifs_check_receive(struct mid_q_entry *mid, struct TCP_Server_Info *server, · 502 unmodified lines | ||
| 503 | 503 | /* convert the length into a more usable form */ |
| 504 | 504 | if (server->sec_mode & (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED)) { |
| 505 | 505 | struct kvec iov; |
| 506 | + int rc = 0; | |
| 506 | 507 | |
| 507 | 508 | iov.iov_base = mid->resp_buf; |
| 508 | 509 | iov.iov_len = len; |
| 509 | 510 | /* FIXME: add code to kill session */ |
| 510 | − if (cifs_verify_signature(&iov, 1, server, | |
| 511 | − mid->sequence_number + 1) != 0) | |
| 512 | − cERROR(1, "Unexpected SMB signature"); | |
| 511 | + rc = cifs_verify_signature(&iov, 1, server, | |
| 512 | + mid->sequence_number + 1); | |
| 513 | + if (rc) | |
| 514 | + cERROR(1, "SMB signature verification returned error = " | |
| 515 | + "%d", rc); | |
| 513 | 516 | } |
| 514 | 517 | |
| 515 | 518 | /* BB special case reconnect tid and uid here? */ |
| @@ -1062,6 +1062,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, · 1061 unmodified lines | ||
| 1062 | 1062 | unsigned long user_addr; |
| 1063 | 1063 | size_t bytes; |
| 1064 | 1064 | struct buffer_head map_bh = { 0, }; |
| 1065 | + struct blk_plug plug; | |
| 1065 | 1066 | |
| 1066 | 1067 | if (rw & WRITE) |
| 1067 | 1068 | rw = WRITE_ODIRECT; |
| @@ -1177,6 +1178,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, · 109 unmodified lines | ||
| 1177 | 1178 | PAGE_SIZE - user_addr / PAGE_SIZE); |
| 1178 | 1179 | } |
| 1179 | 1180 | |
| 1181 | + blk_start_plug(&plug); | |
| 1182 | + | |
| 1180 | 1183 | for (seg = 0; seg < nr_segs; seg++) { |
| 1181 | 1184 | user_addr = (unsigned long)iov[seg].iov_base; |
| 1182 | 1185 | sdio.size += bytes = iov[seg].iov_len; |
| @@ -1235,6 +1238,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, · 52 unmodified lines | ||
| 1235 | 1238 | if (sdio.bio) |
| 1236 | 1239 | dio_bio_submit(dio, &sdio); |
| 1237 | 1240 | |
| 1241 | + blk_finish_plug(&plug); | |
| 1242 | + | |
| 1238 | 1243 | /* |
| 1239 | 1244 | * It is possible that, we return short IO due to end of file. |
| 1240 | 1245 | * In that case, we need to release all the pages we got hold on. |
| @@ -1113,6 +1113,11 @@ static void mark_journal_empty(journal_t *journal) · 1112 unmodified lines | ||
| 1113 | 1113 | |
| 1114 | 1114 | BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex)); |
| 1115 | 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 | 1121 | jbd_debug(1, "JBD: Marking journal as empty (seq %d)\n", |
| 1117 | 1122 | journal->j_tail_sequence); |
| 1118 | 1123 | |
| @@ -26,6 +26,7 @@ static int sync_request(struct page *page, struct block_device *bdev, int rw) · 25 unmodified lines | ||
| 26 | 26 | struct completion complete; |
| 27 | 27 | |
| 28 | 28 | bio_init(&bio); |
| 29 | + bio.bi_max_vecs = 1; | |
| 29 | 30 | bio.bi_io_vec = &bio_vec; |
| 30 | 31 | bio_vec.bv_page = page; |
| 31 | 32 | bio_vec.bv_len = PAGE_SIZE; |
| @@ -95,12 +96,11 @@ static int __bdev_writeseg(struct super_block *sb, u64 ofs, pgoff_t index, · 63 unmodified lines | ||
| 95 | 96 | struct address_space *mapping = super->s_mapping_inode->i_mapping; |
| 96 | 97 | struct bio *bio; |
| 97 | 98 | struct page *page; |
| 98 | − struct request_queue *q = bdev_get_queue(sb->s_bdev); | |
| 99 | − unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); | |
| 99 | + unsigned int max_pages; | |
| 100 | 100 | int i; |
| 101 | 101 | |
| 102 | − if (max_pages > BIO_MAX_PAGES) | |
| 103 | − max_pages = BIO_MAX_PAGES; | |
| 102 | + max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev)); | |
| 103 | + | |
| 104 | 104 | bio = bio_alloc(GFP_NOFS, max_pages); |
| 105 | 105 | BUG_ON(!bio); |
| 106 | 106 | |
| @@ -190,12 +190,11 @@ static int do_erase(struct super_block *sb, u64 ofs, pgoff_t index, · 83 unmodified lines | ||
| 190 | 190 | { |
| 191 | 191 | struct logfs_super *super = logfs_super(sb); |
| 192 | 192 | struct bio *bio; |
| 193 | − struct request_queue *q = bdev_get_queue(sb->s_bdev); | |
| 194 | − unsigned int max_pages = queue_max_hw_sectors(q) >> (PAGE_SHIFT - 9); | |
| 193 | + unsigned int max_pages; | |
| 195 | 194 | int i; |
| 196 | 195 | |
| 197 | − if (max_pages > BIO_MAX_PAGES) | |
| 198 | − max_pages = BIO_MAX_PAGES; | |
| 196 | + max_pages = min(nr_pages, (size_t) bio_get_nr_vecs(super->s_bdev)); | |
| 197 | + | |
| 199 | 198 | bio = bio_alloc(GFP_NOFS, max_pages); |
| 200 | 199 | BUG_ON(!bio); |
| 201 | 200 | |
| @@ -156,10 +156,26 @@ static void __logfs_destroy_inode(struct inode *inode) · 155 unmodified lines | ||
| 156 | 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 | 166 | static void logfs_destroy_inode(struct inode *inode) |
| 160 | 167 | { |
| 161 | 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 | 179 | BUG_ON(list_empty(&li->li_freeing_list)); |
| 164 | 180 | spin_lock(&logfs_inode_lock); |
| 165 | 181 | li->li_refcount--; |
| @@ -373,8 +389,8 @@ static void logfs_put_super(struct super_block *sb) · 207 unmodified lines | ||
| 373 | 389 | { |
| 374 | 390 | struct logfs_super *super = logfs_super(sb); |
| 375 | 391 | /* kill the meta-inodes */ |
| 376 | − iput(super->s_master_inode); | |
| 377 | 392 | iput(super->s_segfile_inode); |
| 393 | + iput(super->s_master_inode); | |
| 378 | 394 | iput(super->s_mapping_inode); |
| 379 | 395 | } |
| 380 | 396 | |
| @@ -565,7 +565,7 @@ static void write_wbuf(struct super_block *sb, struct logfs_area *area, · 564 unmodified lines | ||
| 565 | 565 | index = ofs >> PAGE_SHIFT; |
| 566 | 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 | 569 | BUG_ON(!page); |
| 570 | 570 | memcpy(wbuf, page_address(page) + page_ofs, super->s_writesize); |
| 571 | 571 | unlock_page(page); |
| @@ -2189,7 +2189,6 @@ void logfs_evict_inode(struct inode *inode) · 2188 unmodified lines | ||
| 2189 | 2189 | return; |
| 2190 | 2190 | } |
| 2191 | 2191 | |
| 2192 | − BUG_ON(inode->i_ino < LOGFS_RESERVED_INOS); | |
| 2193 | 2192 | page = inode_to_page(inode); |
| 2194 | 2193 | BUG_ON(!page); /* FIXME: Use emergency page */ |
| 2195 | 2194 | logfs_put_write_page(page); |
| @@ -886,7 +886,7 @@ static struct logfs_area *alloc_area(struct super_block *sb) · 885 unmodified lines | ||
| 886 | 886 | |
| 887 | 887 | static void map_invalidatepage(struct page *page, unsigned long l) |
| 888 | 888 | { |
| 889 | − BUG(); | |
| 889 | + return; | |
| 890 | 890 | } |
| 891 | 891 | |
| 892 | 892 | static int map_releasepage(struct page *page, gfp_t g) |
| @@ -651,12 +651,12 @@ static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *c · 650 unmodified lines | ||
| 651 | 651 | |
| 652 | 652 | if (clp->cl_minorversion == 0) { |
| 653 | 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 | 655 | return -EINVAL; |
| 656 | 656 | args.client_name = clp->cl_cred.cr_principal; |
| 657 | 657 | args.prognumber = conn->cb_prog, |
| 658 | 658 | args.protocol = XPRT_TRANSPORT_TCP; |
| 659 | − args.authflavor = clp->cl_flavor; | |
| 659 | + args.authflavor = clp->cl_cred.cr_flavor; | |
| 660 | 660 | clp->cl_cb_ident = conn->cb_ident; |
| 661 | 661 | } else { |
| 662 | 662 | if (!conn->cb_xprt) |
| @@ -231,7 +231,6 @@ struct nfs4_client { · 230 unmodified lines | ||
| 231 | 231 | nfs4_verifier cl_verifier; /* generated by client */ |
| 232 | 232 | time_t cl_time; /* time of last lease renewal */ |
| 233 | 233 | struct sockaddr_storage cl_addr; /* client ipaddress */ |
| 234 | − u32 cl_flavor; /* setclientid pseudoflavor */ | |
| 235 | 234 | struct svc_cred cl_cred; /* setclientid principal */ |
| 236 | 235 | clientid_t cl_clientid; /* generated by server */ |
| 237 | 236 | nfs4_verifier cl_confirm; /* generated by server */ |
| @@ -1589,10 +1589,10 @@ int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags) · 1588 unmodified lines | ||
| 1589 | 1589 | goto out; |
| 1590 | 1590 | } |
| 1591 | 1591 | |
| 1592 | − down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | |
| 1593 | 1592 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) |
| 1594 | 1593 | warn[cnt].w_type = QUOTA_NL_NOWARN; |
| 1595 | 1594 | |
| 1595 | + down_read(&sb_dqopt(inode->i_sb)->dqptr_sem); | |
| 1596 | 1596 | spin_lock(&dq_data_lock); |
| 1597 | 1597 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
| 1598 | 1598 | if (!dquots[cnt]) |
| @@ -1334,9 +1334,7 @@ struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb, · 1333 unmodified lines | ||
| 1334 | 1334 | else if (bitmap == 0) |
| 1335 | 1335 | block = (REISERFS_DISK_OFFSET_IN_BYTES >> sb->s_blocksize_bits) + 1; |
| 1336 | 1336 | |
| 1337 | − reiserfs_write_unlock(sb); | |
| 1338 | 1337 | bh = sb_bread(sb, block); |
| 1339 | − reiserfs_write_lock(sb); | |
| 1340 | 1338 | if (bh == NULL) |
| 1341 | 1339 | reiserfs_warning(sb, "sh-2029: %s: bitmap block (#%u) " |
| 1342 | 1340 | "reading failed", __func__, block); |
| @@ -76,10 +76,10 @@ void reiserfs_evict_inode(struct inode *inode) · 75 unmodified lines | ||
| 76 | 76 | ; |
| 77 | 77 | } |
| 78 | 78 | out: |
| 79 | + reiserfs_write_unlock_once(inode->i_sb, depth); | |
| 79 | 80 | clear_inode(inode); /* note this must go after the journal_end to prevent deadlock */ |
| 80 | 81 | dquot_drop(inode); |
| 81 | 82 | inode->i_blocks = 0; |
| 82 | − reiserfs_write_unlock_once(inode->i_sb, depth); | |
| 83 | 83 | return; |
| 84 | 84 | |
| 85 | 85 | no_delete: |
| @@ -167,7 +167,7 @@ struct ubifs_global_debug_info { · 166 unmodified lines | ||
| 167 | 167 | #define ubifs_dbg_msg(type, fmt, ...) \ |
| 168 | 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 | 171 | #define ubifs_dbg_msg_key(type, key, fmt, ...) do { \ |
| 172 | 172 | char __tmp_key_buf[DBG_KEY_BUF_LEN]; \ |
| 173 | 173 | pr_debug("UBIFS DBG " type ": " fmt "%s\n", ##__VA_ARGS__, \ |
| @@ -1749,7 +1749,10 @@ int ubifs_lpt_init(struct ubifs_info *c, int rd, int wr) · 1748 unmodified lines | ||
| 1749 | 1749 | return 0; |
| 1750 | 1750 | |
| 1751 | 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 | 1756 | return err; |
| 1754 | 1757 | } |
| 1755 | 1758 | |
| @@ -788,7 +788,7 @@ struct ubifs_scan_leb *ubifs_recover_leb(struct ubifs_info *c, int lnum, · 787 unmodified lines | ||
| 788 | 788 | |
| 789 | 789 | corrupted_rescan: |
| 790 | 790 | /* Re-scan the corrupted data with verbose messages */ |
| 791 | − ubifs_err("corruptio %d", ret); | |
| 791 | + ubifs_err("corruption %d", ret); | |
| 792 | 792 | ubifs_scan_a_node(c, buf, len, lnum, offs, 1); |
| 793 | 793 | corrupted: |
| 794 | 794 | ubifs_scanned_corruption(c, lnum, offs, buf); |
| @@ -1026,7 +1026,6 @@ int ubifs_replay_journal(struct ubifs_info *c) · 1025 unmodified lines | ||
| 1026 | 1026 | c->replaying = 1; |
| 1027 | 1027 | lnum = c->ltail_lnum = c->lhead_lnum; |
| 1028 | 1028 | |
| 1029 | − lnum = UBIFS_LOG_LNUM; | |
| 1030 | 1029 | do { |
| 1031 | 1030 | err = replay_log_leb(c, lnum, 0, c->sbuf); |
| 1032 | 1031 | if (err == 1) |
| @@ -1035,7 +1034,7 @@ int ubifs_replay_journal(struct ubifs_info *c) · 2 unmodified lines | ||
| 1035 | 1034 | if (err) |
| 1036 | 1035 | goto out; |
| 1037 | 1036 | lnum = ubifs_next_log_lnum(c, lnum); |
| 1038 | − } while (lnum != UBIFS_LOG_LNUM); | |
| 1037 | + } while (lnum != c->ltail_lnum); | |
| 1039 | 1038 | |
| 1040 | 1039 | err = replay_buds(c); |
| 1041 | 1040 | if (err) |
| @@ -1157,9 +1157,6 @@ static int check_free_space(struct ubifs_info *c) · 1156 unmodified lines | ||
| 1157 | 1157 | * |
| 1158 | 1158 | * This function mounts UBIFS file system. Returns zero in case of success and |
| 1159 | 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 | 1161 | static int mount_ubifs(struct ubifs_info *c) |
| 1165 | 1162 | { |
| @@ -1124,14 +1124,17 @@ int udf_setsize(struct inode *inode, loff_t newsize) · 1123 unmodified lines | ||
| 1124 | 1124 | if (err) |
| 1125 | 1125 | return err; |
| 1126 | 1126 | down_write(&iinfo->i_data_sem); |
| 1127 | − } else | |
| 1127 | + } else { | |
| 1128 | 1128 | iinfo->i_lenAlloc = newsize; |
| 1129 | + goto set_size; | |
| 1130 | + } | |
| 1129 | 1131 | } |
| 1130 | 1132 | err = udf_extend_file(inode, newsize); |
| 1131 | 1133 | if (err) { |
| 1132 | 1134 | up_write(&iinfo->i_data_sem); |
| 1133 | 1135 | return err; |
| 1134 | 1136 | } |
| 1137 | +set_size: | |
| 1135 | 1138 | truncate_setsize(inode, newsize); |
| 1136 | 1139 | up_write(&iinfo->i_data_sem); |
| 1137 | 1140 | } else { |
| @@ -1344,6 +1344,7 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, · 1343 unmodified lines | ||
| 1344 | 1344 | udf_err(sb, "error loading logical volume descriptor: " |
| 1345 | 1345 | "Partition table too long (%u > %lu)\n", table_len, |
| 1346 | 1346 | sb->s_blocksize - sizeof(*lvd)); |
| 1347 | + ret = 1; | |
| 1347 | 1348 | goto out_bh; |
| 1348 | 1349 | } |
| 1349 | 1350 | |
| @@ -1388,8 +1389,10 @@ static int udf_load_logicalvol(struct super_block *sb, sector_t block, · 38 unmodified lines | ||
| 1388 | 1389 | UDF_ID_SPARABLE, |
| 1389 | 1390 | strlen(UDF_ID_SPARABLE))) { |
| 1390 | 1391 | if (udf_load_sparable_map(sb, map, |
| 1391 | − (struct sparablePartitionMap *)gpm) < 0) | |
| 1392 | + (struct sparablePartitionMap *)gpm) < 0) { | |
| 1393 | + ret = 1; | |
| 1392 | 1394 | goto out_bh; |
| 1395 | + } | |
| 1393 | 1396 | } else if (!strncmp(upm2->partIdent.ident, |
| 1394 | 1397 | UDF_ID_METADATA, |
| 1395 | 1398 | strlen(UDF_ID_METADATA))) { |
| @@ -2000,6 +2003,8 @@ static int udf_fill_super(struct super_block *sb, void *options, int silent) · 604 unmodified lines | ||
| 2000 | 2003 | if (!silent) |
| 2001 | 2004 | pr_notice("Rescanning with blocksize %d\n", |
| 2002 | 2005 | UDF_DEFAULT_BLOCKSIZE); |
| 2006 | + brelse(sbi->s_lvid_bh); | |
| 2007 | + sbi->s_lvid_bh = NULL; | |
| 2003 | 2008 | uopt.blocksize = UDF_DEFAULT_BLOCKSIZE; |
| 2004 | 2009 | ret = udf_load_vrs(sb, &uopt, silent, &fileset); |
| 2005 | 2010 | } |
| @@ -179,12 +179,14 @@ xfs_ioc_trim( · 178 unmodified lines | ||
| 179 | 179 | * used by the fstrim application. In the end it really doesn't |
| 180 | 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 | 186 | start = BTOBB(range.start); |
| 183 | 187 | end = start + BTOBBT(range.len) - 1; |
| 184 | 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 | 190 | if (end > XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks) - 1) |
| 189 | 191 | end = XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks)- 1; |
| 190 | 192 | |
| @@ -962,23 +962,22 @@ xfs_dialloc( · 961 unmodified lines | ||
| 962 | 962 | if (!pag->pagi_freecount && !okalloc) |
| 963 | 963 | goto nextag; |
| 964 | 964 | |
| 965 | + /* | |
| 966 | + * Then read in the AGI buffer and recheck with the AGI buffer | |
| 967 | + * lock held. | |
| 968 | + */ | |
| 965 | 969 | error = xfs_ialloc_read_agi(mp, tp, agno, &agbp); |
| 966 | 970 | if (error) |
| 967 | 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 | 973 | if (pag->pagi_freecount) { |
| 974 | 974 | xfs_perag_put(pag); |
| 975 | 975 | goto out_alloc; |
| 976 | 976 | } |
| 977 | 977 | |
| 978 | − if (!okalloc) { | |
| 979 | − xfs_trans_brelse(tp, agbp); | |
| 980 | − goto nextag; | |
| 981 | − } | |
| 978 | + if (!okalloc) | |
| 979 | + goto nextag_relse_buffer; | |
| 980 | + | |
| 982 | 981 | |
| 983 | 982 | error = xfs_ialloc_ag_alloc(tp, agbp, &ialloced); |
| 984 | 983 | if (error) { |
| @@ -1007,6 +1006,8 @@ xfs_dialloc( · 22 unmodified lines | ||
| 1007 | 1006 | return 0; |
| 1008 | 1007 | } |
| 1009 | 1008 | |
| 1009 | +nextag_relse_buffer: | |
| 1010 | + xfs_trans_brelse(tp, agbp); | |
| 1010 | 1011 | nextag: |
| 1011 | 1012 | xfs_perag_put(pag); |
| 1012 | 1013 | if (++agno == mp->m_sb.sb_agcount) |
| @@ -857,7 +857,7 @@ xfs_rtbuf_get( · 856 unmodified lines | ||
| 857 | 857 | xfs_buf_t *bp; /* block buffer, result */ |
| 858 | 858 | xfs_inode_t *ip; /* bitmap or summary inode */ |
| 859 | 859 | xfs_bmbt_irec_t map; |
| 860 | − int nmap; | |
| 860 | + int nmap = 1; | |
| 861 | 861 | int error; /* error value */ |
| 862 | 862 | |
| 863 | 863 | ip = issum ? mp->m_rsumip : mp->m_rbmip; |
| @@ -118,7 +118,8 @@ enum drm_mode_status { · 117 unmodified lines | ||
| 118 | 118 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ |
| 119 | 119 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ |
| 120 | 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 | 124 | #define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */ |
| 124 | 125 | |
| @@ -359,8 +359,9 @@ struct drm_mode_mode_cmd { · 358 unmodified lines | ||
| 359 | 359 | struct drm_mode_modeinfo mode; |
| 360 | 360 | }; |
| 361 | 361 | |
| 362 | −#define DRM_MODE_CURSOR_BO (1<<0) | |
| 363 | −#define DRM_MODE_CURSOR_MOVE (1<<1) | |
| 362 | +#define DRM_MODE_CURSOR_BO 0x01 | |
| 363 | +#define DRM_MODE_CURSOR_MOVE 0x02 | |
| 364 | +#define DRM_MODE_CURSOR_FLAGS 0x03 | |
| 364 | 365 | |
| 365 | 366 | /* |
| 366 | 367 | * depending on the value in flags different members are used. |
| @@ -601,7 +601,7 @@ static inline void blk_clear_rl_full(struct request_list *rl, bool sync) · 600 unmodified lines | ||
| 601 | 601 | * it already be started by driver. |
| 602 | 602 | */ |
| 603 | 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 | 605 | #define rq_mergeable(rq) \ |
| 606 | 606 | (!((rq)->cmd_flags & RQ_NOMERGE_FLAGS) && \ |
| 607 | 607 | (((rq)->cmd_flags & REQ_DISCARD) || \ |
| @@ -894,6 +894,8 @@ extern void blk_queue_flush_queueable(struct request_queue *q, bool queueable); · 286 unmodified lines | ||
| 894 | 894 | extern struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev); |
| 895 | 895 | |
| 896 | 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 | 899 | extern void blk_dump_rq_flags(struct request *, char *); |
| 898 | 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 · 239 unmodified lines | ||
| 1139 | 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 | 1154 | static inline unsigned int queue_discard_zeroes_data(struct request_queue *q) |
| 1143 | 1155 | { |
| 1144 | 1156 | if (q->limits.max_discard_sectors && q->limits.discard_zeroes_data == 1) |
| @@ -194,6 +194,10 @@ static inline int cpuidle_play_dead(void) {return -ENODEV; } · 193 unmodified lines | ||
| 194 | 194 | |
| 195 | 195 | #ifdef CONFIG_ARCH_NEEDS_CPU_IDLE_COUPLED |
| 196 | 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 | 201 | #endif |
| 198 | 202 | |
| 199 | 203 | /****************************** |
| @@ -82,10 +82,18 @@ · 81 unmodified lines | ||
| 82 | 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 | 90 | #define DIV_ROUND_CLOSEST(x, divisor)( \ |
| 86 | 91 | { \ |
| 87 | − typeof(divisor) __divisor = divisor; \ | |
| 88 | − (((x) + ((__divisor) / 2)) / (__divisor)); \ | |
| 92 | + typeof(x) __x = x; \ | |
| 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 | |
| @@ -58,13 +58,6 @@ union ktime { · 57 unmodified lines | ||
| 58 | 58 | |
| 59 | 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 | 62 | * ktime_t definitions when using the 64-bit scalar representation: |
| 70 | 63 | */ |
| @@ -239,6 +239,7 @@ struct mmc_card { · 238 unmodified lines | ||
| 239 | 239 | #define MMC_QUIRK_BLK_NO_CMD23 (1<<7) /* Avoid CMD23 for regular multiblock */ |
| 240 | 240 | #define MMC_QUIRK_BROKEN_BYTE_MODE_512 (1<<8) /* Avoid sending 512 bytes in */ |
| 241 | 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 | 243 | /* byte mode */ |
| 243 | 244 | unsigned int poweroff_notify_state; /* eMMC4.5 notify feature */ |
| 244 | 245 | #define MMC_NO_POWER_NOTIFICATION 0 |
| @@ -15,6 +15,8 @@ · 14 unmodified lines | ||
| 15 | 15 | #define MV643XX_ETH_SIZE_REG_4 0x2224 |
| 16 | 16 | #define MV643XX_ETH_BASE_ADDR_ENABLE_REG 0x2290 |
| 17 | 17 | |
| 18 | +#define MV643XX_TX_CSUM_DEFAULT_LIMIT 0 | |
| 19 | + | |
| 18 | 20 | struct mv643xx_eth_shared_platform_data { |
| 19 | 21 | struct mbus_dram_target_info *dram; |
| 20 | 22 | struct platform_device *shared_smi; |
| @@ -220,7 +220,12 @@ struct omapfb_display_info { · 219 unmodified lines | ||
| 220 | 220 | |
| 221 | 221 | #ifdef __KERNEL__ |
| 222 | 222 | |
| 223 | −#include <plat/board.h> | |
| 223 | +struct omap_lcd_config { | |
| 224 | + char panel_name[16]; | |
| 225 | + char ctrl_name[16]; | |
| 226 | + s16 nreset_gpio; | |
| 227 | + u8 data_lines; | |
| 228 | +}; | |
| 224 | 229 | |
| 225 | 230 | struct omapfb_platform_data { |
| 226 | 231 | struct omap_lcd_config lcd; |
| @@ -2149,7 +2149,7 @@ · 2148 unmodified lines | ||
| 2149 | 2149 | #define PCI_DEVICE_ID_TIGON3_5704S 0x16a8 |
| 2150 | 2150 | #define PCI_DEVICE_ID_NX2_57800_VF 0x16a9 |
| 2151 | 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 | 2153 | #define PCI_DEVICE_ID_NX2_5708S 0x16ac |
| 2154 | 2154 | #define PCI_DEVICE_ID_NX2_57840_VF 0x16ad |
| 2155 | 2155 | #define PCI_DEVICE_ID_NX2_57810_MF 0x16ae |
| @@ -0,0 +1,11 @@ | ||
| 1 | +#ifndef __OMAP1_BL_H__ | |
| 2 | +#define __OMAP1_BL_H__ | |
| 3 | + | |
| 4 | +#include <linux/device.h> | |
| 5 | + | |
| 6 | +struct omap_backlight_config { | |
| 7 | + int default_intensity; | |
| 8 | + int (*set_power)(struct device *dev, int state); | |
| 9 | +}; | |
| 10 | + | |
| 11 | +#endif | |
| @@ -107,11 +107,36 @@ static inline struct timespec timespec_sub(struct timespec lhs, · 106 unmodified lines | ||
| 107 | 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 | 118 | * Returns true if the timespec is norm, false if denorm: |
| 112 | 119 | */ |
| 113 | −#define timespec_valid(ts) \ | |
| 114 | − (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) | |
| 120 | +static inline bool timespec_valid(const struct timespec *ts) | |
| 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 | 141 | extern void read_persistent_clock(struct timespec *ts); |
| 117 | 142 | extern void read_boot_clock(struct timespec *ts); |
| @@ -18,6 +18,7 @@ struct nf_conntrack_ecache { · 17 unmodified lines | ||
| 18 | 18 | u16 ctmask; /* bitmask of ct events to be delivered */ |
| 19 | 19 | u16 expmask; /* bitmask of expect events to be delivered */ |
| 20 | 20 | u32 pid; /* netlink pid of destroyer */ |
| 21 | + struct timer_list timeout; | |
| 21 | 22 | }; |
| 22 | 23 | |
| 23 | 24 | static inline struct nf_conntrack_ecache * |
| @@ -58,8 +58,6 @@ void notify_remote_via_irq(int irq); · 57 unmodified lines | ||
| 58 | 58 | |
| 59 | 59 | void xen_irq_resume(void); |
| 60 | 60 | |
| 61 | −void xen_hvm_prepare_kexec(struct shared_info *sip, unsigned long pfn); | |
| 62 | − | |
| 63 | 61 | /* Clear an irq's pending state, in preparation for polling on it */ |
| 64 | 62 | void xen_clear_irq_pending(int irq); |
| 65 | 63 | void xen_set_irq_pending(int irq); |
| @@ -455,8 +455,8 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm) · 454 unmodified lines | ||
| 455 | 455 | if (retval) |
| 456 | 456 | goto out; |
| 457 | 457 | |
| 458 | − if (file && uprobe_mmap(tmp)) | |
| 459 | − goto out; | |
| 458 | + if (file) | |
| 459 | + uprobe_mmap(tmp); | |
| 460 | 460 | } |
| 461 | 461 | /* a new mm has just been created */ |
| 462 | 462 | arch_dup_mmap(oldmm, mm); |
| @@ -115,6 +115,7 @@ static void tk_xtime_add(struct timekeeper *tk, const struct timespec *ts) · 114 unmodified lines | ||
| 115 | 115 | { |
| 116 | 116 | tk->xtime_sec += ts->tv_sec; |
| 117 | 117 | tk->xtime_nsec += (u64)ts->tv_nsec << tk->shift; |
| 118 | + tk_normalize_xtime(tk); | |
| 118 | 119 | } |
| 119 | 120 | |
| 120 | 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) · 155 unmodified lines | ||
| 276 | 277 | tk->xtime_nsec += cycle_delta * tk->mult; |
| 277 | 278 | |
| 278 | 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 | 282 | tk_normalize_xtime(tk); |
| 282 | 283 | |
| @@ -427,7 +428,7 @@ int do_settimeofday(const struct timespec *tv) · 144 unmodified lines | ||
| 427 | 428 | struct timespec ts_delta, xt; |
| 428 | 429 | unsigned long flags; |
| 429 | 430 | |
| 430 | − if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) | |
| 431 | + if (!timespec_valid_strict(tv)) | |
| 431 | 432 | return -EINVAL; |
| 432 | 433 | |
| 433 | 434 | write_seqlock_irqsave(&tk->lock, flags); |
| @@ -463,6 +464,8 @@ int timekeeping_inject_offset(struct timespec *ts) · 29 unmodified lines | ||
| 463 | 464 | { |
| 464 | 465 | struct timekeeper *tk = &timekeeper; |
| 465 | 466 | unsigned long flags; |
| 467 | + struct timespec tmp; | |
| 468 | + int ret = 0; | |
| 466 | 469 | |
| 467 | 470 | if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) |
| 468 | 471 | return -EINVAL; |
| @@ -471,10 +474,17 @@ int timekeeping_inject_offset(struct timespec *ts) · 2 unmodified lines | ||
| 471 | 474 | |
| 472 | 475 | timekeeping_forward_now(tk); |
| 473 | 476 | |
| 477 | + /* Make sure the proposed value is valid */ | |
| 478 | + tmp = timespec_add(tk_xtime(tk), *ts); | |
| 479 | + if (!timespec_valid_strict(&tmp)) { | |
| 480 | + ret = -EINVAL; | |
| 481 | + goto error; | |
| 482 | + } | |
| 474 | 483 | |
| 475 | 484 | tk_xtime_add(tk, ts); |
| 476 | 485 | tk_set_wall_to_mono(tk, timespec_sub(tk->wall_to_monotonic, *ts)); |
| 477 | 486 | |
| 487 | +error: /* even if we error out, we forwarded the time, so call update */ | |
| 478 | 488 | timekeeping_update(tk, true); |
| 479 | 489 | |
| 480 | 490 | write_sequnlock_irqrestore(&tk->lock, flags); |
| @@ -482,7 +492,7 @@ int timekeeping_inject_offset(struct timespec *ts) · 1 unmodified line | ||
| 482 | 492 | /* signal hrtimers about time change */ |
| 483 | 493 | clock_was_set(); |
| 484 | 494 | |
| 485 | − return 0; | |
| 495 | + return ret; | |
| 486 | 496 | } |
| 487 | 497 | EXPORT_SYMBOL(timekeeping_inject_offset); |
| 488 | 498 | |
| @@ -649,7 +659,20 @@ void __init timekeeping_init(void) · 160 unmodified lines | ||
| 649 | 659 | struct timespec now, boot, tmp; |
| 650 | 660 | |
| 651 | 661 | read_persistent_clock(&now); |
| 662 | + if (!timespec_valid_strict(&now)) { | |
| 663 | + pr_warn("WARNING: Persistent clock returned invalid value!\n" | |
| 664 | + " Check your CMOS/BIOS settings.\n"); | |
| 665 | + now.tv_sec = 0; | |
| 666 | + now.tv_nsec = 0; | |
| 667 | + } | |
| 668 | + | |
| 652 | 669 | read_boot_clock(&boot); |
| 670 | + if (!timespec_valid_strict(&boot)) { | |
| 671 | + pr_warn("WARNING: Boot clock returned invalid value!\n" | |
| 672 | + " Check your CMOS/BIOS settings.\n"); | |
| 673 | + boot.tv_sec = 0; | |
| 674 | + boot.tv_nsec = 0; | |
| 675 | + } | |
| 653 | 676 | |
| 654 | 677 | seqlock_init(&tk->lock); |
| 655 | 678 | |
| @@ -690,7 +713,7 @@ static struct timespec timekeeping_suspend_time; · 34 unmodified lines | ||
| 690 | 713 | static void __timekeeping_inject_sleeptime(struct timekeeper *tk, |
| 691 | 714 | struct timespec *delta) |
| 692 | 715 | { |
| 693 | − if (!timespec_valid(delta)) { | |
| 716 | + if (!timespec_valid_strict(delta)) { | |
| 694 | 717 | printk(KERN_WARNING "__timekeeping_inject_sleeptime: Invalid " |
| 695 | 718 | "sleep delta value!\n"); |
| 696 | 719 | return; |
| @@ -1129,6 +1152,10 @@ static void update_wall_time(void) · 432 unmodified lines | ||
| 1129 | 1152 | offset = (clock->read(clock) - clock->cycle_last) & clock->mask; |
| 1130 | 1153 | #endif |
| 1131 | 1154 | |
| 1155 | + /* Check if there's really nothing to do */ | |
| 1156 | + if (offset < tk->cycle_interval) | |
| 1157 | + goto out; | |
| 1158 | + | |
| 1132 | 1159 | /* |
| 1133 | 1160 | * With NO_HZ we may have to accumulate many cycle_intervals |
| 1134 | 1161 | * (think "ticks") worth of time at once. To do this efficiently, |
| @@ -1161,9 +1188,9 @@ static void update_wall_time(void) · 26 unmodified lines | ||
| 1161 | 1188 | * the vsyscall implementations are converted to use xtime_nsec |
| 1162 | 1189 | * (shifted nanoseconds), this can be killed. |
| 1163 | 1190 | */ |
| 1164 | − remainder = tk->xtime_nsec & ((1 << tk->shift) - 1); | |
| 1191 | + remainder = tk->xtime_nsec & ((1ULL << tk->shift) - 1); | |
| 1165 | 1192 | tk->xtime_nsec -= remainder; |
| 1166 | − tk->xtime_nsec += 1 << tk->shift; | |
| 1193 | + tk->xtime_nsec += 1ULL << tk->shift; | |
| 1167 | 1194 | tk->ntp_error += remainder << tk->ntp_error_shift; |
| 1168 | 1195 | |
| 1169 | 1196 | /* |
| @@ -506,6 +506,8 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) · 505 unmodified lines | ||
| 506 | 506 | int size; |
| 507 | 507 | |
| 508 | 508 | syscall_nr = syscall_get_nr(current, regs); |
| 509 | + if (syscall_nr < 0) | |
| 510 | + return; | |
| 509 | 511 | if (!test_bit(syscall_nr, enabled_perf_enter_syscalls)) |
| 510 | 512 | return; |
| 511 | 513 | |
| @@ -580,6 +582,8 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) · 68 unmodified lines | ||
| 580 | 582 | int size; |
| 581 | 583 | |
| 582 | 584 | syscall_nr = syscall_get_nr(current, regs); |
| 585 | + if (syscall_nr < 0) | |
| 586 | + return; | |
| 583 | 587 | if (!test_bit(syscall_nr, enabled_perf_exit_syscalls)) |
| 584 | 588 | return; |
| 585 | 589 | |
| @@ -1412,12 +1412,8 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov, · 1411 unmodified lines | ||
| 1412 | 1412 | retval = filemap_write_and_wait_range(mapping, pos, |
| 1413 | 1413 | pos + iov_length(iov, nr_segs) - 1); |
| 1414 | 1414 | if (!retval) { |
| 1415 | − struct blk_plug plug; | |
| 1416 | − | |
| 1417 | − blk_start_plug(&plug); | |
| 1418 | 1415 | retval = mapping->a_ops->direct_IO(READ, iocb, |
| 1419 | 1416 | iov, pos, nr_segs); |
| 1420 | − blk_finish_plug(&plug); | |
| 1421 | 1417 | } |
| 1422 | 1418 | if (retval > 0) { |
| 1423 | 1419 | *ppos = pos + retval; |
| @@ -2527,14 +2523,12 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov, · 1103 unmodified lines | ||
| 2527 | 2523 | { |
| 2528 | 2524 | struct file *file = iocb->ki_filp; |
| 2529 | 2525 | struct inode *inode = file->f_mapping->host; |
| 2530 | − struct blk_plug plug; | |
| 2531 | 2526 | ssize_t ret; |
| 2532 | 2527 | |
| 2533 | 2528 | BUG_ON(iocb->ki_pos != pos); |
| 2534 | 2529 | |
| 2535 | 2530 | sb_start_write(inode->i_sb); |
| 2536 | 2531 | mutex_lock(&inode->i_mutex); |
| 2537 | − blk_start_plug(&plug); | |
| 2538 | 2532 | ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); |
| 2539 | 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, · 4 unmodified lines | ||
| 2545 | 2539 | if (err < 0 && ret > 0) |
| 2546 | 2540 | ret = err; |
| 2547 | 2541 | } |
| 2548 | − blk_finish_plug(&plug); | |
| 2549 | 2542 | sb_end_write(inode->i_sb); |
| 2550 | 2543 | return ret; |
| 2551 | 2544 | } |
| @@ -2562,7 +2562,7 @@ int mpol_to_str(char *buffer, int maxlen, struct mempolicy *pol, int no_context) · 2561 unmodified lines | ||
| 2562 | 2562 | break; |
| 2563 | 2563 | |
| 2564 | 2564 | default: |
| 2565 | − BUG(); | |
| 2565 | + return -EINVAL; | |
| 2566 | 2566 | } |
| 2567 | 2567 | |
| 2568 | 2568 | l = strlen(policy_modes[mode]); |
| @@ -1356,9 +1356,8 @@ out: · 1355 unmodified lines | ||
| 1356 | 1356 | } else if ((flags & MAP_POPULATE) && !(flags & MAP_NONBLOCK)) |
| 1357 | 1357 | make_pages_present(addr, addr + len); |
| 1358 | 1358 | |
| 1359 | − if (file && uprobe_mmap(vma)) | |
| 1360 | − /* matching probes but cannot insert */ | |
| 1361 | − goto unmap_and_free_vma; | |
| 1359 | + if (file) | |
| 1360 | + uprobe_mmap(vma); | |
| 1362 | 1361 | |
| 1363 | 1362 | return addr; |
| 1364 | 1363 | |
| @@ -3260,6 +3260,7 @@ force_grow: · 3259 unmodified lines | ||
| 3260 | 3260 | |
| 3261 | 3261 | /* cache_grow can reenable interrupts, then ac could change. */ |
| 3262 | 3262 | ac = cpu_cache_get(cachep); |
| 3263 | + node = numa_mem_id(); | |
| 3263 | 3264 | |
| 3264 | 3265 | /* no objects in sight? abort */ |
| 3265 | 3266 | if (!x && (ac->avail == 0 || force_refill)) |
| @@ -168,24 +168,16 @@ static void poll_napi(struct net_device *dev) · 167 unmodified lines | ||
| 168 | 168 | struct napi_struct *napi; |
| 169 | 169 | int budget = 16; |
| 170 | 170 | |
| 171 | − WARN_ON_ONCE(!irqs_disabled()); | |
| 172 | − | |
| 173 | 171 | list_for_each_entry(napi, &dev->napi_list, dev_list) { |
| 174 | − local_irq_enable(); | |
| 175 | 172 | if (napi->poll_owner != smp_processor_id() && |
| 176 | 173 | spin_trylock(&napi->poll_lock)) { |
| 177 | − rcu_read_lock_bh(); | |
| 178 | 174 | budget = poll_one_napi(rcu_dereference_bh(dev->npinfo), |
| 179 | 175 | napi, budget); |
| 180 | − rcu_read_unlock_bh(); | |
| 181 | 176 | spin_unlock(&napi->poll_lock); |
| 182 | 177 | |
| 183 | − if (!budget) { | |
| 184 | − local_irq_disable(); | |
| 178 | + if (!budget) | |
| 185 | 179 | break; |
| 186 | − } | |
| 187 | 180 | } |
| 188 | − local_irq_disable(); | |
| 189 | 181 | } |
| 190 | 182 | } |
| 191 | 183 | |
| @@ -124,6 +124,8 @@ static DEFINE_SPINLOCK(mfc_unres_lock); · 123 unmodified lines | ||
| 124 | 124 | static struct kmem_cache *mrt_cachep __read_mostly; |
| 125 | 125 | |
| 126 | 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 | 129 | static int ip_mr_forward(struct net *net, struct mr_table *mrt, |
| 128 | 130 | struct sk_buff *skb, struct mfc_cache *cache, |
| 129 | 131 | int local); |
| @@ -131,6 +133,7 @@ static int ipmr_cache_report(struct mr_table *mrt, · 1 unmodified line | ||
| 131 | 133 | struct sk_buff *pkt, vifi_t vifi, int assert); |
| 132 | 134 | static int __ipmr_fill_mroute(struct mr_table *mrt, struct sk_buff *skb, |
| 133 | 135 | struct mfc_cache *c, struct rtmsg *rtm); |
| 136 | +static void mroute_clean_tables(struct mr_table *mrt); | |
| 134 | 137 | static void ipmr_expire_process(unsigned long arg); |
| 135 | 138 | |
| 136 | 139 | #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES |
| @@ -271,7 +274,7 @@ static void __net_exit ipmr_rules_exit(struct net *net) · 134 unmodified lines | ||
| 271 | 274 | |
| 272 | 275 | list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) { |
| 273 | 276 | list_del(&mrt->list); |
| 274 | − kfree(mrt); | |
| 277 | + ipmr_free_table(mrt); | |
| 275 | 278 | } |
| 276 | 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) · 21 unmodified lines | ||
| 299 | 302 | |
| 300 | 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 | 307 | #endif |
| 305 | 308 | |
| @@ -336,6 +339,13 @@ static struct mr_table *ipmr_new_table(struct net *net, u32 id) · 30 unmodified lines | ||
| 336 | 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 | 349 | /* Service routines creating virtual interfaces: DVMRP tunnels and PIMREG */ |
| 340 | 350 | |
| 341 | 351 | static void ipmr_del_tunnel(struct net_device *dev, struct vifctl *v) |
| @@ -502,7 +502,10 @@ static unsigned int ip_nat_sdp_media(struct sk_buff *skb, unsigned int dataoff, · 501 unmodified lines | ||
| 502 | 502 | ret = nf_ct_expect_related(rtcp_exp); |
| 503 | 503 | if (ret == 0) |
| 504 | 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 | 509 | nf_ct_unexpect_related(rtp_exp); |
| 507 | 510 | port = 0; |
| 508 | 511 | break; |
| @@ -934,12 +934,14 @@ static u32 __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu) · 933 unmodified lines | ||
| 934 | 934 | if (mtu < ip_rt_min_pmtu) |
| 935 | 935 | mtu = ip_rt_min_pmtu; |
| 936 | 936 | |
| 937 | + rcu_read_lock(); | |
| 937 | 938 | if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) { |
| 938 | 939 | struct fib_nh *nh = &FIB_RES_NH(res); |
| 939 | 940 | |
| 940 | 941 | update_or_create_fnhe(nh, fl4->daddr, 0, mtu, |
| 941 | 942 | jiffies + ip_rt_mtu_expires); |
| 942 | 943 | } |
| 944 | + rcu_read_unlock(); | |
| 943 | 945 | return mtu; |
| 944 | 946 | } |
| 945 | 947 | |
| @@ -956,7 +958,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk, · 10 unmodified lines | ||
| 956 | 958 | dst->obsolete = DST_OBSOLETE_KILL; |
| 957 | 959 | } else { |
| 958 | 960 | rt->rt_pmtu = mtu; |
| 959 | − dst_set_expires(&rt->dst, ip_rt_mtu_expires); | |
| 961 | + rt->dst.expires = max(1UL, jiffies + ip_rt_mtu_expires); | |
| 960 | 962 | } |
| 961 | 963 | } |
| 962 | 964 | |
| @@ -1263,7 +1265,7 @@ static void ipv4_dst_destroy(struct dst_entry *dst) · 300 unmodified lines | ||
| 1263 | 1265 | { |
| 1264 | 1266 | struct rtable *rt = (struct rtable *) dst; |
| 1265 | 1267 | |
| 1266 | − if (dst->flags & DST_NOCACHE) { | |
| 1268 | + if (!list_empty(&rt->rt_uncached)) { | |
| 1267 | 1269 | spin_lock_bh(&rt_uncached_lock); |
| 1268 | 1270 | list_del(&rt->rt_uncached); |
| 1269 | 1271 | spin_unlock_bh(&rt_uncached_lock); |
| @@ -2926,13 +2926,14 @@ static void tcp_enter_recovery(struct sock *sk, bool ece_ack) · 2925 unmodified lines | ||
| 2926 | 2926 | * tcp_xmit_retransmit_queue(). |
| 2927 | 2927 | */ |
| 2928 | 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 | 2930 | int flag) |
| 2931 | 2931 | { |
| 2932 | 2932 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2933 | 2933 | struct tcp_sock *tp = tcp_sk(sk); |
| 2934 | 2934 | int do_lost = is_dupack || ((flag & FLAG_DATA_SACKED) && |
| 2935 | 2935 | (tcp_fackets_out(tp) > tp->reordering)); |
| 2936 | + int newly_acked_sacked = 0; | |
| 2936 | 2937 | int fast_rexmit = 0; |
| 2937 | 2938 | |
| 2938 | 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, · 53 unmodified lines | ||
| 2992 | 2993 | tcp_add_reno_sack(sk); |
| 2993 | 2994 | } else |
| 2994 | 2995 | do_lost = tcp_try_undo_partial(sk, pkts_acked); |
| 2996 | + newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | |
| 2995 | 2997 | break; |
| 2996 | 2998 | case TCP_CA_Loss: |
| 2997 | 2999 | if (flag & FLAG_DATA_ACKED) |
| @@ -3013,6 +3015,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, · 15 unmodified lines | ||
| 3013 | 3015 | if (is_dupack) |
| 3014 | 3016 | tcp_add_reno_sack(sk); |
| 3015 | 3017 | } |
| 3018 | + newly_acked_sacked = pkts_acked + tp->sacked_out - prior_sacked; | |
| 3016 | 3019 | |
| 3017 | 3020 | if (icsk->icsk_ca_state <= TCP_CA_Disorder) |
| 3018 | 3021 | tcp_try_undo_dsack(sk); |
| @@ -3590,7 +3593,6 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag) · 571 unmodified lines | ||
| 3590 | 3593 | int prior_packets; |
| 3591 | 3594 | int prior_sacked = tp->sacked_out; |
| 3592 | 3595 | int pkts_acked = 0; |
| 3593 | − int newly_acked_sacked = 0; | |
| 3594 | 3596 | bool frto_cwnd = false; |
| 3595 | 3597 | |
| 3596 | 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) · 69 unmodified lines | ||
| 3666 | 3668 | flag |= tcp_clean_rtx_queue(sk, prior_fackets, prior_snd_una); |
| 3667 | 3669 | |
| 3668 | 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 | 3672 | if (tp->frto_counter) |
| 3673 | 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) · 7 unmodified lines | ||
| 3681 | 3681 | tcp_may_raise_cwnd(sk, flag)) |
| 3682 | 3682 | tcp_cong_avoid(sk, ack, prior_in_flight); |
| 3683 | 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 | 3685 | is_dupack, flag); |
| 3686 | 3686 | } else { |
| 3687 | 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) · 10 unmodified lines | ||
| 3698 | 3698 | no_queue: |
| 3699 | 3699 | /* If data was DSACKed, see if we can undo a cwnd reduction. */ |
| 3700 | 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 | 3702 | is_dupack, flag); |
| 3703 | 3703 | /* If this ack opens up a zero window, clear backoff. It was |
| 3704 | 3704 | * being used to time the probes, and is probably far higher than |
| @@ -3718,8 +3718,7 @@ old_ack: · 13 unmodified lines | ||
| 3718 | 3718 | */ |
| 3719 | 3719 | if (TCP_SKB_CB(skb)->sacked) { |
| 3720 | 3720 | flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una); |
| 3721 | − newly_acked_sacked = tp->sacked_out - prior_sacked; | |
| 3722 | − tcp_fastretrans_alert(sk, pkts_acked, newly_acked_sacked, | |
| 3721 | + tcp_fastretrans_alert(sk, pkts_acked, prior_sacked, | |
| 3723 | 3722 | is_dupack, flag); |
| 3724 | 3723 | } |
| 3725 | 3724 | |
| @@ -167,8 +167,6 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) · 166 unmodified lines | ||
| 167 | 167 | struct esp_data *esp = x->data; |
| 168 | 168 | |
| 169 | 169 | /* skb is pure payload to encrypt */ |
| 170 | − err = -ENOMEM; | |
| 171 | − | |
| 172 | 170 | aead = esp->aead; |
| 173 | 171 | alen = crypto_aead_authsize(aead); |
| 174 | 172 | |
| @@ -203,8 +201,10 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb) · 28 unmodified lines | ||
| 203 | 201 | } |
| 204 | 202 | |
| 205 | 203 | tmp = esp_alloc_tmp(aead, nfrags + sglists, seqhilen); |
| 206 | − if (!tmp) | |
| 204 | + if (!tmp) { | |
| 205 | + err = -ENOMEM; | |
| 207 | 206 | goto error; |
| 207 | + } | |
| 208 | 208 | |
| 209 | 209 | seqhi = esp_tmp_seqhi(tmp); |
| 210 | 210 | iv = esp_tmp_iv(aead, tmp, seqhilen); |
| @@ -1347,11 +1347,10 @@ static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel) · 1346 unmodified lines | ||
| 1347 | 1347 | /* Remove from tunnel list */ |
| 1348 | 1348 | spin_lock_bh(&pn->l2tp_tunnel_list_lock); |
| 1349 | 1349 | list_del_rcu(&tunnel->list); |
| 1350 | + kfree_rcu(tunnel, rcu); | |
| 1350 | 1351 | spin_unlock_bh(&pn->l2tp_tunnel_list_lock); |
| 1351 | − synchronize_rcu(); | |
| 1352 | 1352 | |
| 1353 | 1353 | atomic_dec(&l2tp_tunnel_count); |
| 1354 | − kfree(tunnel); | |
| 1355 | 1354 | } |
| 1356 | 1355 | |
| 1357 | 1356 | /* Create a socket for the tunnel, if one isn't set up by |
| @@ -163,6 +163,7 @@ struct l2tp_tunnel_cfg { · 162 unmodified lines | ||
| 163 | 163 | |
| 164 | 164 | struct l2tp_tunnel { |
| 165 | 165 | int magic; /* Should be L2TP_TUNNEL_MAGIC */ |
| 166 | + struct rcu_head rcu; | |
| 166 | 167 | rwlock_t hlist_lock; /* protect session_hlist */ |
| 167 | 168 | struct hlist_head session_hlist[L2TP_HASH_SIZE]; |
| 168 | 169 | /* hashed list of sessions, |
| @@ -1811,37 +1811,31 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, · 1810 unmodified lines | ||
| 1811 | 1811 | meshhdrlen = ieee80211_new_mesh_header(&mesh_hdr, |
| 1812 | 1812 | sdata, NULL, NULL); |
| 1813 | 1813 | } else { |
| 1814 | − int is_mesh_mcast = 1; | |
| 1815 | − const u8 *mesh_da; | |
| 1814 | + /* DS -> MBSS (802.11-2012 13.11.3.3). | |
| 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 | 1828 | hdrlen = ieee80211_fill_mesh_addresses(&hdr, &fc, |
| 1836 | 1829 | mesh_da, sdata->vif.addr); |
| 1837 | − rcu_read_unlock(); | |
| 1838 | − if (is_mesh_mcast) | |
| 1830 | + if (is_multicast_ether_addr(mesh_da)) | |
| 1831 | + /* DA TA mSA AE:SA */ | |
| 1839 | 1832 | meshhdrlen = |
| 1840 | 1833 | ieee80211_new_mesh_header(&mesh_hdr, |
| 1841 | 1834 | sdata, |
| 1842 | 1835 | skb->data + ETH_ALEN, |
| 1843 | 1836 | NULL); |
| 1844 | 1837 | else |
| 1838 | + /* RA TA mDA mSA AE:DA SA */ | |
| 1845 | 1839 | meshhdrlen = |
| 1846 | 1840 | ieee80211_new_mesh_header(&mesh_hdr, |
| 1847 | 1841 | sdata, |
| @@ -1171,8 +1171,10 @@ ip_vs_add_service(struct net *net, struct ip_vs_service_user_kern *u, · 1170 unmodified lines | ||
| 1171 | 1171 | goto out_err; |
| 1172 | 1172 | } |
| 1173 | 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 | 1176 | goto out_err; |
| 1177 | + } | |
| 1176 | 1178 | |
| 1177 | 1179 | /* I'm the first user of the service */ |
| 1178 | 1180 | atomic_set(&svc->usecnt, 0); |
| @@ -249,12 +249,15 @@ static void death_by_event(unsigned long ul_conntrack) · 248 unmodified lines | ||
| 249 | 249 | { |
| 250 | 250 | struct nf_conn *ct = (void *)ul_conntrack; |
| 251 | 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 | 256 | if (nf_conntrack_event(IPCT_DESTROY, ct) < 0) { |
| 254 | 257 | /* bad luck, let's retry again */ |
| 255 | − ct->timeout.expires = jiffies + | |
| 258 | + ecache->timeout.expires = jiffies + | |
| 256 | 259 | (random32() % net->ct.sysctl_events_retry_timeout); |
| 257 | − add_timer(&ct->timeout); | |
| 260 | + add_timer(&ecache->timeout); | |
| 258 | 261 | return; |
| 259 | 262 | } |
| 260 | 263 | /* we've got the event delivered, now it's dying */ |
| @@ -268,6 +271,9 @@ static void death_by_event(unsigned long ul_conntrack) · 7 unmodified lines | ||
| 268 | 271 | void nf_ct_insert_dying_list(struct nf_conn *ct) |
| 269 | 272 | { |
| 270 | 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 | 278 | /* add this conntrack to the dying list */ |
| 273 | 279 | spin_lock_bh(&nf_conntrack_lock); |
| @@ -275,10 +281,10 @@ void nf_ct_insert_dying_list(struct nf_conn *ct) · 1 unmodified line | ||
| 275 | 281 | &net->ct.dying); |
| 276 | 282 | spin_unlock_bh(&nf_conntrack_lock); |
| 277 | 283 | /* set a new timer to retry event delivery */ |
| 278 | − setup_timer(&ct->timeout, death_by_event, (unsigned long)ct); | |
| 279 | − ct->timeout.expires = jiffies + | |
| 284 | + setup_timer(&ecache->timeout, death_by_event, (unsigned long)ct); | |
| 285 | + ecache->timeout.expires = jiffies + | |
| 280 | 286 | (random32() % net->ct.sysctl_events_retry_timeout); |
| 281 | − add_timer(&ct->timeout); | |
| 287 | + add_timer(&ecache->timeout); | |
| 282 | 288 | } |
| 283 | 289 | EXPORT_SYMBOL_GPL(nf_ct_insert_dying_list); |
| 284 | 290 | |
| @@ -2790,7 +2790,8 @@ static int __init ctnetlink_init(void) · 2789 unmodified lines | ||
| 2790 | 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 | 2795 | pr_err("ctnetlink_init: cannot register pernet operations\n"); |
| 2795 | 2796 | goto err_unreg_exp_subsys; |
| 2796 | 2797 | } |
| @@ -480,7 +480,7 @@ __build_packet_message(struct nfulnl_instance *inst, · 479 unmodified lines | ||
| 480 | 480 | } |
| 481 | 481 | |
| 482 | 482 | if (indev && skb_mac_header_was_set(skb)) { |
| 483 | − if (nla_put_be32(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || | |
| 483 | + if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || | |
| 484 | 484 | nla_put_be16(inst->skb, NFULA_HWLEN, |
| 485 | 485 | htons(skb->dev->hard_header_len)) || |
| 486 | 486 | nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len, |
| @@ -996,8 +996,10 @@ static int __init nfnetlink_log_init(void) · 509 unmodified lines | ||
| 996 | 996 | |
| 997 | 997 | #ifdef CONFIG_PROC_FS |
| 998 | 998 | if (!proc_create("nfnetlink_log", 0440, |
| 999 | − proc_net_netfilter, &nful_file_ops)) | |
| 999 | + proc_net_netfilter, &nful_file_ops)) { | |
| 1000 | + status = -ENOMEM; | |
| 1000 | 1001 | goto cleanup_logger; |
| 1002 | + } | |
| 1001 | 1003 | #endif |
| 1002 | 1004 | return status; |
| 1003 | 1005 | |
| @@ -1373,7 +1373,8 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, · 1372 unmodified lines | ||
| 1373 | 1373 | dst_pid = addr->nl_pid; |
| 1374 | 1374 | dst_group = ffs(addr->nl_groups); |
| 1375 | 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 | 1378 | goto out; |
| 1378 | 1379 | } else { |
| 1379 | 1380 | dst_pid = nlk->dst_pid; |
| @@ -2147,6 +2148,7 @@ static void __init netlink_add_usersock_entry(void) · 767 unmodified lines | ||
| 2147 | 2148 | rcu_assign_pointer(nl_table[NETLINK_USERSOCK].listeners, listeners); |
| 2148 | 2149 | nl_table[NETLINK_USERSOCK].module = THIS_MODULE; |
| 2149 | 2150 | nl_table[NETLINK_USERSOCK].registered = 1; |
| 2151 | + nl_table[NETLINK_USERSOCK].nl_nonroot = NL_NONROOT_SEND; | |
| 2150 | 2152 | |
| 2151 | 2153 | netlink_table_ungrab(); |
| 2152 | 2154 | } |
| @@ -1273,7 +1273,7 @@ static void __fanout_unlink(struct sock *sk, struct packet_sock *po) · 1272 unmodified lines | ||
| 1273 | 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 | 1278 | if (ptype->af_packet_priv == (void*)((struct packet_sock *)sk)->fanout) |
| 1279 | 1279 | return true; |
| @@ -2604,7 +2604,7 @@ static int do_siocgstamp(struct net *net, struct socket *sock, · 2603 unmodified lines | ||
| 2604 | 2604 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&ktv); |
| 2605 | 2605 | set_fs(old_fs); |
| 2606 | 2606 | if (!err) |
| 2607 | − err = compat_put_timeval(up, &ktv); | |
| 2607 | + err = compat_put_timeval(&ktv, up); | |
| 2608 | 2608 | |
| 2609 | 2609 | return err; |
| 2610 | 2610 | } |
| @@ -2620,7 +2620,7 @@ static int do_siocgstampns(struct net *net, struct socket *sock, · 9 unmodified lines | ||
| 2620 | 2620 | err = sock_do_ioctl(net, sock, cmd, (unsigned long)&kts); |
| 2621 | 2621 | set_fs(old_fs); |
| 2622 | 2622 | if (!err) |
| 2623 | − err = compat_put_timespec(up, &kts); | |
| 2623 | + err = compat_put_timespec(&kts, up); | |
| 2624 | 2624 | |
| 2625 | 2625 | return err; |
| 2626 | 2626 | } |
| @@ -316,7 +316,6 @@ static bool svc_xprt_has_something_to_do(struct svc_xprt *xprt) · 315 unmodified lines | ||
| 316 | 316 | */ |
| 317 | 317 | void svc_xprt_enqueue(struct svc_xprt *xprt) |
| 318 | 318 | { |
| 319 | − struct svc_serv *serv = xprt->xpt_server; | |
| 320 | 319 | struct svc_pool *pool; |
| 321 | 320 | struct svc_rqst *rqstp; |
| 322 | 321 | int cpu; |
| @@ -362,8 +361,6 @@ void svc_xprt_enqueue(struct svc_xprt *xprt) · 39 unmodified lines | ||
| 362 | 361 | rqstp, rqstp->rq_xprt); |
| 363 | 362 | rqstp->rq_xprt = xprt; |
| 364 | 363 | svc_xprt_get(xprt); |
| 365 | − rqstp->rq_reserved = serv->sv_max_mesg; | |
| 366 | − atomic_add(rqstp->rq_reserved, &xprt->xpt_reserved); | |
| 367 | 364 | pool->sp_stats.threads_woken++; |
| 368 | 365 | wake_up(&rqstp->rq_wait); |
| 369 | 366 | } else { |
| @@ -640,8 +637,6 @@ int svc_recv(struct svc_rqst *rqstp, long timeout) · 270 unmodified lines | ||
| 640 | 637 | if (xprt) { |
| 641 | 638 | rqstp->rq_xprt = xprt; |
| 642 | 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 | 641 | /* As there is a shortage of threads and this request |
| 647 | 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) · 90 unmodified lines | ||
| 738 | 733 | else |
| 739 | 734 | len = xprt->xpt_ops->xpo_recvfrom(rqstp); |
| 740 | 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 | 739 | svc_xprt_received(xprt); |
| 743 | 740 | |
| @@ -794,7 +791,8 @@ int svc_send(struct svc_rqst *rqstp) · 50 unmodified lines | ||
| 794 | 791 | |
| 795 | 792 | /* Grab mutex to serialize outgoing data. */ |
| 796 | 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 | 796 | len = -ENOTCONN; |
| 799 | 797 | else |
| 800 | 798 | len = xprt->xpt_ops->xpo_sendto(rqstp); |
| @@ -1129,9 +1129,9 @@ static int svc_tcp_recvfrom(struct svc_rqst *rqstp) · 1128 unmodified lines | ||
| 1129 | 1129 | if (len >= 0) |
| 1130 | 1130 | svsk->sk_tcplen += len; |
| 1131 | 1131 | if (len != want) { |
| 1132 | + svc_tcp_save_pages(svsk, rqstp); | |
| 1132 | 1133 | if (len < 0 && len != -EAGAIN) |
| 1133 | 1134 | goto err_other; |
| 1134 | − svc_tcp_save_pages(svsk, rqstp); | |
| 1135 | 1135 | dprintk("svc: incomplete TCP record (%d of %d)\n", |
| 1136 | 1136 | svsk->sk_tcplen, svsk->sk_reclen); |
| 1137 | 1137 | goto err_noclose; |
| @@ -1994,8 +1994,10 @@ int __xfrm_init_state(struct xfrm_state *x, bool init_replay) · 1993 unmodified lines | ||
| 1994 | 1994 | goto error; |
| 1995 | 1995 | |
| 1996 | 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 | 1999 | goto error; |
| 2000 | + } | |
| 1999 | 2001 | |
| 2000 | 2002 | if (init_replay) { |
| 2001 | 2003 | err = xfrm_init_replay(x); |
| @@ -42,7 +42,7 @@ quiet_cmd_install = INSTALL $(subst $(srctree)/,,$@) · 41 unmodified lines | ||
| 42 | 42 | $(installed-fw-dirs): |
| 43 | 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 | 46 | $(call cmd,install) |
| 47 | 47 | |
| 48 | 48 | PHONY += __fw_install __fw_modinst FORCE |
| @@ -211,7 +211,7 @@ if [ -n "${CONFIG_KALLSYMS}" ]; then · 210 unmodified lines | ||
| 211 | 211 | |
| 212 | 212 | if ! cmp -s System.map .tmp_System.map; then |
| 213 | 213 | echo >&2 Inconsistent kallsyms data |
| 214 | − echo >&2 echo Try "make KALLSYMS_EXTRA_PASS=1" as a workaround | |
| 214 | + echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround | |
| 215 | 215 | cleanup |
| 216 | 216 | exit 1 |
| 217 | 217 | fi |
| @@ -1209,6 +1209,9 @@ static void snd_hda_codec_free(struct hda_codec *codec) · 1208 unmodified lines | ||
| 1209 | 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 | 1215 | static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, |
| 1213 | 1216 | unsigned int power_state); |
| 1214 | 1217 | |
| @@ -1317,6 +1320,10 @@ int /*__devinit*/ snd_hda_codec_new(struct hda_bus *bus, · 102 unmodified lines | ||
| 1317 | 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 | 1327 | /* power-up all before initialization */ |
| 1321 | 1328 | hda_set_power_state(codec, |
| 1322 | 1329 | codec->afg ? codec->afg : codec->mfg, |
| @@ -3543,8 +3550,7 @@ static void hda_set_power_state(struct hda_codec *codec, hda_nid_t fg, · 2220 unmodified lines | ||
| 3543 | 3550 | /* this delay seems necessary to avoid click noise at power-down */ |
| 3544 | 3551 | if (power_state == AC_PWRST_D3) { |
| 3545 | 3552 | /* transition time less than 10ms for power down */ |
| 3546 | − bool epss = snd_hda_codec_get_supported_ps(codec, fg, AC_PWRST_EPSS); | |
| 3547 | − msleep(epss ? 10 : 100); | |
| 3553 | + msleep(codec->epss ? 10 : 100); | |
| 3548 | 3554 | } |
| 3549 | 3555 | |
| 3550 | 3556 | /* repeat power states setting at most 10 times*/ |
| @@ -862,6 +862,7 @@ struct hda_codec { · 861 unmodified lines | ||
| 862 | 862 | unsigned int ignore_misc_bit:1; /* ignore MISC_NO_PRESENCE bit */ |
| 863 | 863 | unsigned int no_jack_detect:1; /* Machine has no jack-detection */ |
| 864 | 864 | unsigned int pcm_format_first:1; /* PCM format must be set first */ |
| 865 | + unsigned int epss:1; /* supporting EPSS? */ | |
| 865 | 866 | #ifdef CONFIG_SND_HDA_POWER_SAVE |
| 866 | 867 | unsigned int power_on :1; /* current (global) power-state */ |
| 867 | 868 | int power_transition; /* power-state in transition */ |
| @@ -4543,6 +4543,9 @@ static void stac92xx_line_out_detect(struct hda_codec *codec, · 4542 unmodified lines | ||
| 4543 | 4543 | struct auto_pin_cfg *cfg = &spec->autocfg; |
| 4544 | 4544 | int i; |
| 4545 | 4545 | |
| 4546 | + if (cfg->speaker_outs == 0) | |
| 4547 | + return; | |
| 4548 | + | |
| 4546 | 4549 | for (i = 0; i < cfg->line_outs; i++) { |
| 4547 | 4550 | if (presence) |
| 4548 | 4551 | break; |
| @@ -5531,6 +5534,7 @@ static int patch_stac92hd83xxx(struct hda_codec *codec) · 982 unmodified lines | ||
| 5531 | 5534 | snd_hda_codec_set_pincfg(codec, 0xf, 0x2181205e); |
| 5532 | 5535 | } |
| 5533 | 5536 | |
| 5537 | + codec->epss = 0; /* longer delay needed for D3 */ | |
| 5534 | 5538 | codec->no_trigger_sense = 1; |
| 5535 | 5539 | codec->spec = spec; |
| 5536 | 5540 | |
| @@ -553,7 +553,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, · 552 unmodified lines | ||
| 553 | 553 | struct snd_usb_audio *chip) |
| 554 | 554 | { |
| 555 | 555 | struct snd_card *card; |
| 556 | − struct list_head *p; | |
| 556 | + struct list_head *p, *n; | |
| 557 | 557 | |
| 558 | 558 | if (chip == (void *)-1L) |
| 559 | 559 | return; |
| @@ -570,7 +570,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, · 10 unmodified lines | ||
| 570 | 570 | snd_usb_stream_disconnect(p); |
| 571 | 571 | } |
| 572 | 572 | /* release the endpoint resources */ |
| 573 | − list_for_each(p, &chip->ep_list) { | |
| 573 | + list_for_each_safe(p, n, &chip->ep_list) { | |
| 574 | 574 | snd_usb_endpoint_free(p); |
| 575 | 575 | } |
| 576 | 576 | /* release the midi resources */ |
| @@ -141,7 +141,7 @@ int snd_usb_endpoint_implict_feedback_sink(struct snd_usb_endpoint *ep) · 140 unmodified lines | ||
| 141 | 141 | * |
| 142 | 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 | 146 | unsigned long flags; |
| 147 | 147 | int ret; |
| @@ -177,15 +177,6 @@ static void retire_inbound_urb(struct snd_usb_endpoint *ep, · 29 unmodified lines | ||
| 177 | 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 | 181 | * Prepare a PLAYBACK urb for submission to the bus. |
| 191 | 182 | */ |
| @@ -370,7 +361,6 @@ static void snd_complete_urb(struct urb *urb) · 178 unmodified lines | ||
| 370 | 361 | goto exit_clear; |
| 371 | 362 | } |
| 372 | 363 | |
| 373 | − prepare_outbound_urb_sizes(ep, ctx); | |
| 374 | 364 | prepare_outbound_urb(ep, ctx); |
| 375 | 365 | } else { |
| 376 | 366 | retire_inbound_urb(ep, ctx); |
| @@ -799,7 +789,9 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, · 422 unmodified lines | ||
| 799 | 789 | /** |
| 800 | 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 | 796 | * A call to this function will increment the use count of the endpoint. |
| 805 | 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, · 3 unmodified lines | ||
| 809 | 801 | * |
| 810 | 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 | 806 | int err; |
| 815 | 807 | unsigned int i; |
| @@ -821,6 +813,11 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) · 5 unmodified lines | ||
| 821 | 813 | if (++ep->use_count != 1) |
| 822 | 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 | 821 | ep->active_mask = 0; |
| 825 | 822 | ep->unlink_mask = 0; |
| 826 | 823 | ep->phase = 0; |
| @@ -850,7 +847,6 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep) · 23 unmodified lines | ||
| 850 | 847 | goto __error; |
| 851 | 848 | |
| 852 | 849 | if (usb_pipeout(ep->pipe)) { |
| 853 | − prepare_outbound_urb_sizes(ep, urb->context); | |
| 854 | 850 | prepare_outbound_urb(ep, urb->context); |
| 855 | 851 | } else { |
| 856 | 852 | prepare_inbound_urb(ep, urb->context); |
| @@ -13,7 +13,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep, · 12 unmodified lines | ||
| 13 | 13 | struct audioformat *fmt, |
| 14 | 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 | 17 | void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, |
| 18 | 18 | int force, int can_sleep, int wait); |
| 19 | 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); · 1 unmodified line | ||
| 21 | 21 | void snd_usb_endpoint_free(struct list_head *head); |
| 22 | 22 | |
| 23 | 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 | 26 | void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, |
| 26 | 27 | struct snd_usb_endpoint *sender, |
| @@ -212,7 +212,7 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface, · 211 unmodified lines | ||
| 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 | 217 | int err; |
| 218 | 218 | |
| @@ -225,7 +225,7 @@ static int start_endpoints(struct snd_usb_substream *subs) · 6 unmodified lines | ||
| 225 | 225 | snd_printdd(KERN_DEBUG "Starting data EP @%p\n", ep); |
| 226 | 226 | |
| 227 | 227 | ep->data_subs = subs; |
| 228 | − err = snd_usb_endpoint_start(ep); | |
| 228 | + err = snd_usb_endpoint_start(ep, can_sleep); | |
| 229 | 229 | if (err < 0) { |
| 230 | 230 | clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags); |
| 231 | 231 | return err; |
| @@ -236,10 +236,25 @@ static int start_endpoints(struct snd_usb_substream *subs) · 4 unmodified lines | ||
| 236 | 236 | !test_and_set_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) { |
| 237 | 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 | 254 | snd_printdd(KERN_DEBUG "Starting sync EP @%p\n", ep); |
| 240 | 255 | |
| 241 | 256 | ep->sync_slave = subs->data_endpoint; |
| 242 | − err = snd_usb_endpoint_start(ep); | |
| 257 | + err = snd_usb_endpoint_start(ep, can_sleep); | |
| 243 | 258 | if (err < 0) { |
| 244 | 259 | clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags); |
| 245 | 260 | return err; |
| @@ -544,13 +559,10 @@ static int snd_usb_pcm_prepare(struct snd_pcm_substream *substream) · 298 unmodified lines | ||
| 544 | 559 | subs->last_frame_number = 0; |
| 545 | 560 | runtime->delay = 0; |
| 546 | 561 | |
| 547 | − /* clear the pending deactivation on the target EPs */ | |
| 548 | − deactivate_endpoints(subs); | |
| 549 | − | |
| 550 | 562 | /* for playback, submit the URBs now; otherwise, the first hwptr_done |
| 551 | 563 | * updates for all URBs would happen at the same time when starting */ |
| 552 | 564 | if (subs->direction == SNDRV_PCM_STREAM_PLAYBACK) |
| 553 | − return start_endpoints(subs); | |
| 565 | + return start_endpoints(subs, 1); | |
| 554 | 566 | |
| 555 | 567 | return 0; |
| 556 | 568 | } |
| @@ -1032,6 +1044,7 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, · 475 unmodified lines | ||
| 1032 | 1044 | struct urb *urb) |
| 1033 | 1045 | { |
| 1034 | 1046 | struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; |
| 1047 | + struct snd_usb_endpoint *ep = subs->data_endpoint; | |
| 1035 | 1048 | struct snd_urb_ctx *ctx = urb->context; |
| 1036 | 1049 | unsigned int counts, frames, bytes; |
| 1037 | 1050 | int i, stride, period_elapsed = 0; |
| @@ -1043,7 +1056,11 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, · 5 unmodified lines | ||
| 1043 | 1056 | urb->number_of_packets = 0; |
| 1044 | 1057 | spin_lock_irqsave(&subs->lock, flags); |
| 1045 | 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 | 1064 | /* set up descriptor */ |
| 1048 | 1065 | urb->iso_frame_desc[i].offset = frames * stride; |
| 1049 | 1066 | urb->iso_frame_desc[i].length = counts * stride; |
| @@ -1094,7 +1111,16 @@ static void prepare_playback_urb(struct snd_usb_substream *subs, · 44 unmodified lines | ||
| 1094 | 1111 | subs->hwptr_done += bytes; |
| 1095 | 1112 | if (subs->hwptr_done >= runtime->buffer_size * stride) |
| 1096 | 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 | 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 | 1124 | spin_unlock_irqrestore(&subs->lock, flags); |
| 1099 | 1125 | urb->transfer_buffer_length = bytes; |
| 1100 | 1126 | if (period_elapsed) |
| @@ -1112,12 +1138,26 @@ static void retire_playback_urb(struct snd_usb_substream *subs, · 11 unmodified lines | ||
| 1112 | 1138 | struct snd_pcm_runtime *runtime = subs->pcm_substream->runtime; |
| 1113 | 1139 | int stride = runtime->frame_bits >> 3; |
| 1114 | 1140 | int processed = urb->transfer_buffer_length / stride; |
| 1141 | + int est_delay; | |
| 1115 | 1142 | |
| 1116 | 1143 | spin_lock_irqsave(&subs->lock, flags); |
| 1117 | − if (processed > runtime->delay) | |
| 1118 | − runtime->delay = 0; | |
| 1144 | + est_delay = snd_usb_pcm_delay(subs, runtime->rate); | |
| 1145 | + /* update delay with exact number of samples played */ | |
| 1146 | + if (processed > subs->last_delay) | |
| 1147 | + subs->last_delay = 0; | |
| 1119 | 1148 | else |
| 1120 | − runtime->delay -= processed; | |
| 1149 | + subs->last_delay -= processed; | |
| 1150 | + runtime->delay = subs->last_delay; | |
| 1151 | + | |
| 1152 | + /* | |
| 1153 | + * Report when delay estimate is off by more than 2ms. | |
| 1154 | + * The error should be lower than 2ms since the estimate relies | |
| 1155 | + * on two reads of a counter updated every ms. | |
| 1156 | + */ | |
| 1157 | + if (abs(est_delay - subs->last_delay) * 1000 > runtime->rate * 2) | |
| 1158 | + snd_printk(KERN_DEBUG "delay: estimated %d, actual %d\n", | |
| 1159 | + est_delay, subs->last_delay); | |
| 1160 | + | |
| 1121 | 1161 | spin_unlock_irqrestore(&subs->lock, flags); |
| 1122 | 1162 | } |
| 1123 | 1163 | |
| @@ -1175,7 +1215,7 @@ static int snd_usb_substream_capture_trigger(struct snd_pcm_substream *substream · 51 unmodified lines | ||
| 1175 | 1215 | |
| 1176 | 1216 | switch (cmd) { |
| 1177 | 1217 | case SNDRV_PCM_TRIGGER_START: |
| 1178 | − err = start_endpoints(subs); | |
| 1218 | + err = start_endpoints(subs, 0); | |
| 1179 | 1219 | if (err < 0) |
| 1180 | 1220 | return err; |
| 1181 | 1221 | |
| @@ -10,10 +10,12 @@ util/ctype.c · 9 unmodified lines | ||
| 10 | 10 | util/evlist.c |
| 11 | 11 | util/evsel.c |
| 12 | 12 | util/cpumap.c |
| 13 | +util/hweight.c | |
| 13 | 14 | util/thread_map.c |
| 14 | 15 | util/util.c |
| 15 | 16 | util/xyarray.c |
| 16 | 17 | util/cgroup.c |
| 17 | 18 | util/debugfs.c |
| 19 | +util/rblist.c | |
| 18 | 20 | util/strlist.c |
| 19 | 21 | ../../lib/rbtree.c |
| @@ -1976,9 +1976,10 @@ static long kvm_vcpu_compat_ioctl(struct file *filp, · 1975 unmodified lines | ||
| 1976 | 1976 | if (copy_from_user(&csigset, sigmask_arg->sigset, |
| 1977 | 1977 | sizeof csigset)) |
| 1978 | 1978 | goto out; |
| 1979 | − } | |
| 1980 | − sigset_from_compat(&sigset, &csigset); | |
| 1981 | − r = kvm_vcpu_ioctl_set_sigmask(vcpu, &sigset); | |
| 1979 | + sigset_from_compat(&sigset, &csigset); | |
| 1980 | + r = kvm_vcpu_ioctl_set_sigmask(vcpu, &sigset); | |
| 1981 | + } else | |
| 1982 | + r = kvm_vcpu_ioctl_set_sigmask(vcpu, NULL); | |
| 1982 | 1983 | break; |
| 1983 | 1984 | } |
| 1984 | 1985 | default: |