Contents of /trunk/kernel-alx/patches-3.14/0105-3.14.6-all-fixes.patch
Parent Directory | Revision Log
Revision 2506 -
(show annotations)
(download)
Fri Oct 17 07:55:45 2014 UTC (9 years, 11 months ago) by niro
File size: 320683 byte(s)
Fri Oct 17 07:55:45 2014 UTC (9 years, 11 months ago) by niro
File size: 320683 byte(s)
-patches for 3.14
1 | diff --git a/Documentation/devicetree/bindings/dma/ti-edma.txt b/Documentation/devicetree/bindings/dma/ti-edma.txt |
2 | index 9fbbdb783a72..68ff2137bae7 100644 |
3 | --- a/Documentation/devicetree/bindings/dma/ti-edma.txt |
4 | +++ b/Documentation/devicetree/bindings/dma/ti-edma.txt |
5 | @@ -29,6 +29,6 @@ edma: edma@49000000 { |
6 | dma-channels = <64>; |
7 | ti,edma-regions = <4>; |
8 | ti,edma-slots = <256>; |
9 | - ti,edma-xbar-event-map = <1 12 |
10 | - 2 13>; |
11 | + ti,edma-xbar-event-map = /bits/ 16 <1 12 |
12 | + 2 13>; |
13 | }; |
14 | diff --git a/Documentation/i2c/busses/i2c-i801 b/Documentation/i2c/busses/i2c-i801 |
15 | index aaaf069306a3..adf5e33e8312 100644 |
16 | --- a/Documentation/i2c/busses/i2c-i801 |
17 | +++ b/Documentation/i2c/busses/i2c-i801 |
18 | @@ -26,6 +26,7 @@ Supported adapters: |
19 | * Intel Wellsburg (PCH) |
20 | * Intel Coleto Creek (PCH) |
21 | * Intel Wildcat Point-LP (PCH) |
22 | + * Intel BayTrail (SOC) |
23 | Datasheets: Publicly available at the Intel website |
24 | |
25 | On Intel Patsburg and later chipsets, both the normal host SMBus controller |
26 | diff --git a/Documentation/input/elantech.txt b/Documentation/input/elantech.txt |
27 | index 5602eb71ad5d..e1ae127ed099 100644 |
28 | --- a/Documentation/input/elantech.txt |
29 | +++ b/Documentation/input/elantech.txt |
30 | @@ -504,9 +504,12 @@ byte 5: |
31 | * reg_10 |
32 | |
33 | bit 7 6 5 4 3 2 1 0 |
34 | - 0 0 0 0 0 0 0 A |
35 | + 0 0 0 0 R F T A |
36 | |
37 | A: 1 = enable absolute tracking |
38 | + T: 1 = enable two finger mode auto correct |
39 | + F: 1 = disable ABS Position Filter |
40 | + R: 1 = enable real hardware resolution |
41 | |
42 | 6.2 Native absolute mode 6 byte packet format |
43 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
44 | diff --git a/Documentation/ja_JP/HOWTO b/Documentation/ja_JP/HOWTO |
45 | index 0091a8215ac1..b61885c35ce1 100644 |
46 | --- a/Documentation/ja_JP/HOWTO |
47 | +++ b/Documentation/ja_JP/HOWTO |
48 | @@ -315,7 +315,7 @@ Andrew Morton が Linux-kernel メーリングリストにカーネルリリー |
49 | もし、3.x.y カーネルが存在しない場合には、番号が一番大きい 3.x が |
50 | 最新の安定版カーネルです。 |
51 | |
52 | -3.x.y は "stable" チーム <stable@kernel.org> でメンテされており、必 |
53 | +3.x.y は "stable" チーム <stable@vger.kernel.org> でメンテされており、必 |
54 | 要に応じてリリースされます。通常のリリース期間は 2週間毎ですが、差し迫っ |
55 | た問題がなければもう少し長くなることもあります。セキュリティ関連の問題 |
56 | の場合はこれに対してだいたいの場合、すぐにリリースがされます。 |
57 | diff --git a/Documentation/ja_JP/stable_kernel_rules.txt b/Documentation/ja_JP/stable_kernel_rules.txt |
58 | index 14265837c4ce..9dbda9b5d21e 100644 |
59 | --- a/Documentation/ja_JP/stable_kernel_rules.txt |
60 | +++ b/Documentation/ja_JP/stable_kernel_rules.txt |
61 | @@ -50,16 +50,16 @@ linux-2.6.29/Documentation/stable_kernel_rules.txt |
62 | |
63 | -stable ツリーにパッチを送付する手続き- |
64 | |
65 | - - 上記の規則に従っているかを確認した後に、stable@kernel.org にパッチ |
66 | + - 上記の規則に従っているかを確認した後に、stable@vger.kernel.org にパッチ |
67 | を送る。 |
68 | - 送信者はパッチがキューに受け付けられた際には ACK を、却下された場合 |
69 | には NAK を受け取る。この反応は開発者たちのスケジュールによって、数 |
70 | 日かかる場合がある。 |
71 | - もし受け取られたら、パッチは他の開発者たちと関連するサブシステムの |
72 | メンテナーによるレビューのために -stable キューに追加される。 |
73 | - - パッチに stable@kernel.org のアドレスが付加されているときには、それ |
74 | + - パッチに stable@vger.kernel.org のアドレスが付加されているときには、それ |
75 | が Linus のツリーに入る時に自動的に stable チームに email される。 |
76 | - - セキュリティパッチはこのエイリアス (stable@kernel.org) に送られるべ |
77 | + - セキュリティパッチはこのエイリアス (stable@vger.kernel.org) に送られるべ |
78 | きではなく、代わりに security@kernel.org のアドレスに送られる。 |
79 | |
80 | レビューサイクル- |
81 | diff --git a/Documentation/zh_CN/HOWTO b/Documentation/zh_CN/HOWTO |
82 | index 6c914aa87e71..54ea24ff63c7 100644 |
83 | --- a/Documentation/zh_CN/HOWTO |
84 | +++ b/Documentation/zh_CN/HOWTO |
85 | @@ -237,7 +237,7 @@ kernel.org网站的pub/linux/kernel/v2.6/目录下找到它。它的开发遵循 |
86 | 如果没有2.6.x.y版本内核存在,那么最新的2.6.x版本内核就相当于是当前的稳定 |
87 | 版内核。 |
88 | |
89 | -2.6.x.y版本由“稳定版”小组(邮件地址<stable@kernel.org>)维护,一般隔周发 |
90 | +2.6.x.y版本由“稳定版”小组(邮件地址<stable@vger.kernel.org>)维护,一般隔周发 |
91 | 布新版本。 |
92 | |
93 | 内核源码中的Documentation/stable_kernel_rules.txt文件具体描述了可被稳定 |
94 | diff --git a/Documentation/zh_CN/stable_kernel_rules.txt b/Documentation/zh_CN/stable_kernel_rules.txt |
95 | index b5b9b0ab02fd..26ea5ed7cd9c 100644 |
96 | --- a/Documentation/zh_CN/stable_kernel_rules.txt |
97 | +++ b/Documentation/zh_CN/stable_kernel_rules.txt |
98 | @@ -42,7 +42,7 @@ Documentation/stable_kernel_rules.txt 的中文翻译 |
99 | |
100 | 向稳定版代码树提交补丁的过程: |
101 | |
102 | - - 在确认了补丁符合以上的规则后,将补丁发送到stable@kernel.org。 |
103 | + - 在确认了补丁符合以上的规则后,将补丁发送到stable@vger.kernel.org。 |
104 | - 如果补丁被接受到队列里,发送者会收到一个ACK回复,如果没有被接受,收 |
105 | 到的是NAK回复。回复需要几天的时间,这取决于开发者的时间安排。 |
106 | - 被接受的补丁会被加到稳定版本队列里,等待其他开发者的审查。 |
107 | diff --git a/Makefile b/Makefile |
108 | index fa77b0bed2a2..0d499e6896cd 100644 |
109 | --- a/Makefile |
110 | +++ b/Makefile |
111 | @@ -1,6 +1,6 @@ |
112 | VERSION = 3 |
113 | PATCHLEVEL = 14 |
114 | -SUBLEVEL = 5 |
115 | +SUBLEVEL = 6 |
116 | EXTRAVERSION = |
117 | NAME = Remembering Coco |
118 | |
119 | diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi |
120 | index 79087ccf64bc..ab01d0f98d1a 100644 |
121 | --- a/arch/arm/boot/dts/am33xx.dtsi |
122 | +++ b/arch/arm/boot/dts/am33xx.dtsi |
123 | @@ -140,7 +140,7 @@ |
124 | compatible = "ti,edma3"; |
125 | ti,hwmods = "tpcc", "tptc0", "tptc1", "tptc2"; |
126 | reg = <0x49000000 0x10000>, |
127 | - <0x44e10f90 0x10>; |
128 | + <0x44e10f90 0x40>; |
129 | interrupts = <12 13 14>; |
130 | #dma-cells = <1>; |
131 | dma-channels = <64>; |
132 | diff --git a/arch/arm/boot/dts/armada-xp-db.dts b/arch/arm/boot/dts/armada-xp-db.dts |
133 | index bcf6d79a57ec..8c2fe44e4dfe 100644 |
134 | --- a/arch/arm/boot/dts/armada-xp-db.dts |
135 | +++ b/arch/arm/boot/dts/armada-xp-db.dts |
136 | @@ -40,7 +40,7 @@ |
137 | /* Device Bus parameters are required */ |
138 | |
139 | /* Read parameters */ |
140 | - devbus,bus-width = <8>; |
141 | + devbus,bus-width = <16>; |
142 | devbus,turn-off-ps = <60000>; |
143 | devbus,badr-skew-ps = <0>; |
144 | devbus,acc-first-ps = <124000>; |
145 | diff --git a/arch/arm/boot/dts/armada-xp-gp.dts b/arch/arm/boot/dts/armada-xp-gp.dts |
146 | index 274e2ad5f51c..df5c34284dbd 100644 |
147 | --- a/arch/arm/boot/dts/armada-xp-gp.dts |
148 | +++ b/arch/arm/boot/dts/armada-xp-gp.dts |
149 | @@ -49,7 +49,7 @@ |
150 | /* Device Bus parameters are required */ |
151 | |
152 | /* Read parameters */ |
153 | - devbus,bus-width = <8>; |
154 | + devbus,bus-width = <16>; |
155 | devbus,turn-off-ps = <60000>; |
156 | devbus,badr-skew-ps = <0>; |
157 | devbus,acc-first-ps = <124000>; |
158 | diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts |
159 | index 99bcf76e6953..b33e10ea2ea0 100644 |
160 | --- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts |
161 | +++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts |
162 | @@ -37,7 +37,7 @@ |
163 | /* Device Bus parameters are required */ |
164 | |
165 | /* Read parameters */ |
166 | - devbus,bus-width = <8>; |
167 | + devbus,bus-width = <16>; |
168 | devbus,turn-off-ps = <60000>; |
169 | devbus,badr-skew-ps = <0>; |
170 | devbus,acc-first-ps = <124000>; |
171 | diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi |
172 | index 4307e80b2d2e..dc72353de0b3 100644 |
173 | --- a/arch/arm/boot/dts/imx53.dtsi |
174 | +++ b/arch/arm/boot/dts/imx53.dtsi |
175 | @@ -87,7 +87,7 @@ |
176 | ipu: ipu@18000000 { |
177 | #crtc-cells = <1>; |
178 | compatible = "fsl,imx53-ipu"; |
179 | - reg = <0x18000000 0x080000000>; |
180 | + reg = <0x18000000 0x08000000>; |
181 | interrupts = <11 10>; |
182 | clocks = <&clks 59>, <&clks 110>, <&clks 61>; |
183 | clock-names = "bus", "di0", "di1"; |
184 | diff --git a/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts b/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts |
185 | index dc86429756d7..4651672bda89 100644 |
186 | --- a/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts |
187 | +++ b/arch/arm/boot/dts/kirkwood-mv88f6281gtw-ge.dts |
188 | @@ -30,6 +30,16 @@ |
189 | bootargs = "console=ttyS0,115200n8 earlyprintk"; |
190 | }; |
191 | |
192 | + mbus { |
193 | + pcie-controller { |
194 | + status = "okay"; |
195 | + |
196 | + pcie@1,0 { |
197 | + status = "okay"; |
198 | + }; |
199 | + }; |
200 | + }; |
201 | + |
202 | ocp@f1000000 { |
203 | pinctrl@10000 { |
204 | pmx_usb_led: pmx-usb-led { |
205 | @@ -73,14 +83,6 @@ |
206 | ehci@50000 { |
207 | status = "okay"; |
208 | }; |
209 | - |
210 | - pcie-controller { |
211 | - status = "okay"; |
212 | - |
213 | - pcie@1,0 { |
214 | - status = "okay"; |
215 | - }; |
216 | - }; |
217 | }; |
218 | |
219 | gpio-leds { |
220 | diff --git a/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi b/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi |
221 | index aa78c2d11fe7..e2cc85cc3b87 100644 |
222 | --- a/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi |
223 | +++ b/arch/arm/boot/dts/kirkwood-nsa310-common.dtsi |
224 | @@ -4,6 +4,16 @@ |
225 | / { |
226 | model = "ZyXEL NSA310"; |
227 | |
228 | + mbus { |
229 | + pcie-controller { |
230 | + status = "okay"; |
231 | + |
232 | + pcie@1,0 { |
233 | + status = "okay"; |
234 | + }; |
235 | + }; |
236 | + }; |
237 | + |
238 | ocp@f1000000 { |
239 | pinctrl: pinctrl@10000 { |
240 | |
241 | @@ -26,14 +36,6 @@ |
242 | status = "okay"; |
243 | nr-ports = <2>; |
244 | }; |
245 | - |
246 | - pcie-controller { |
247 | - status = "okay"; |
248 | - |
249 | - pcie@1,0 { |
250 | - status = "okay"; |
251 | - }; |
252 | - }; |
253 | }; |
254 | |
255 | gpio_poweroff { |
256 | diff --git a/arch/arm/boot/dts/ste-ccu8540.dts b/arch/arm/boot/dts/ste-ccu8540.dts |
257 | index 7f3baf51a3a9..32dd55e5f4e6 100644 |
258 | --- a/arch/arm/boot/dts/ste-ccu8540.dts |
259 | +++ b/arch/arm/boot/dts/ste-ccu8540.dts |
260 | @@ -18,6 +18,7 @@ |
261 | compatible = "st-ericsson,ccu8540", "st-ericsson,u8540"; |
262 | |
263 | memory@0 { |
264 | + device_type = "memory"; |
265 | reg = <0x20000000 0x1f000000>, <0xc0000000 0x3f000000>; |
266 | }; |
267 | |
268 | diff --git a/arch/arm/common/edma.c b/arch/arm/common/edma.c |
269 | index 41bca32409fc..5339009b3c0c 100644 |
270 | --- a/arch/arm/common/edma.c |
271 | +++ b/arch/arm/common/edma.c |
272 | @@ -1423,55 +1423,38 @@ EXPORT_SYMBOL(edma_clear_event); |
273 | |
274 | #if IS_ENABLED(CONFIG_OF) && IS_ENABLED(CONFIG_DMADEVICES) |
275 | |
276 | -static int edma_of_read_u32_to_s16_array(const struct device_node *np, |
277 | - const char *propname, s16 *out_values, |
278 | - size_t sz) |
279 | +static int edma_xbar_event_map(struct device *dev, struct device_node *node, |
280 | + struct edma_soc_info *pdata, size_t sz) |
281 | { |
282 | - int ret; |
283 | - |
284 | - ret = of_property_read_u16_array(np, propname, out_values, sz); |
285 | - if (ret) |
286 | - return ret; |
287 | - |
288 | - /* Terminate it */ |
289 | - *out_values++ = -1; |
290 | - *out_values++ = -1; |
291 | - |
292 | - return 0; |
293 | -} |
294 | - |
295 | -static int edma_xbar_event_map(struct device *dev, |
296 | - struct device_node *node, |
297 | - struct edma_soc_info *pdata, int len) |
298 | -{ |
299 | - int ret, i; |
300 | + const char pname[] = "ti,edma-xbar-event-map"; |
301 | struct resource res; |
302 | void __iomem *xbar; |
303 | - const s16 (*xbar_chans)[2]; |
304 | + s16 (*xbar_chans)[2]; |
305 | + size_t nelm = sz / sizeof(s16); |
306 | u32 shift, offset, mux; |
307 | + int ret, i; |
308 | |
309 | - xbar_chans = devm_kzalloc(dev, |
310 | - len/sizeof(s16) + 2*sizeof(s16), |
311 | - GFP_KERNEL); |
312 | + xbar_chans = devm_kzalloc(dev, (nelm + 2) * sizeof(s16), GFP_KERNEL); |
313 | if (!xbar_chans) |
314 | return -ENOMEM; |
315 | |
316 | ret = of_address_to_resource(node, 1, &res); |
317 | if (ret) |
318 | - return -EIO; |
319 | + return -ENOMEM; |
320 | |
321 | xbar = devm_ioremap(dev, res.start, resource_size(&res)); |
322 | if (!xbar) |
323 | return -ENOMEM; |
324 | |
325 | - ret = edma_of_read_u32_to_s16_array(node, |
326 | - "ti,edma-xbar-event-map", |
327 | - (s16 *)xbar_chans, |
328 | - len/sizeof(u32)); |
329 | + ret = of_property_read_u16_array(node, pname, (u16 *)xbar_chans, nelm); |
330 | if (ret) |
331 | return -EIO; |
332 | |
333 | - for (i = 0; xbar_chans[i][0] != -1; i++) { |
334 | + /* Invalidate last entry for the other user of this mess */ |
335 | + nelm >>= 1; |
336 | + xbar_chans[nelm][0] = xbar_chans[nelm][1] = -1; |
337 | + |
338 | + for (i = 0; i < nelm; i++) { |
339 | shift = (xbar_chans[i][1] & 0x03) << 3; |
340 | offset = xbar_chans[i][1] & 0xfffffffc; |
341 | mux = readl(xbar + offset); |
342 | @@ -1480,8 +1463,7 @@ static int edma_xbar_event_map(struct device *dev, |
343 | writel(mux, (xbar + offset)); |
344 | } |
345 | |
346 | - pdata->xbar_chans = xbar_chans; |
347 | - |
348 | + pdata->xbar_chans = (const s16 (*)[2]) xbar_chans; |
349 | return 0; |
350 | } |
351 | |
352 | diff --git a/arch/arm/kernel/crash_dump.c b/arch/arm/kernel/crash_dump.c |
353 | index 90c50d4b43f7..5d1286d51154 100644 |
354 | --- a/arch/arm/kernel/crash_dump.c |
355 | +++ b/arch/arm/kernel/crash_dump.c |
356 | @@ -39,7 +39,7 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf, |
357 | if (!csize) |
358 | return 0; |
359 | |
360 | - vaddr = ioremap(pfn << PAGE_SHIFT, PAGE_SIZE); |
361 | + vaddr = ioremap(__pfn_to_phys(pfn), PAGE_SIZE); |
362 | if (!vaddr) |
363 | return -ENOMEM; |
364 | |
365 | diff --git a/arch/arm/mach-mvebu/mvebu-soc-id.c b/arch/arm/mach-mvebu/mvebu-soc-id.c |
366 | index f3b325f6cbd4..0e1547a186b0 100644 |
367 | --- a/arch/arm/mach-mvebu/mvebu-soc-id.c |
368 | +++ b/arch/arm/mach-mvebu/mvebu-soc-id.c |
369 | @@ -107,7 +107,18 @@ static int __init mvebu_soc_id_init(void) |
370 | iounmap(pci_base); |
371 | |
372 | res_ioremap: |
373 | - clk_disable_unprepare(clk); |
374 | + /* |
375 | + * If the PCIe unit is actually enabled and we have PCI |
376 | + * support in the kernel, we intentionally do not release the |
377 | + * reference to the clock. We want to keep it running since |
378 | + * the bootloader does some PCIe link configuration that the |
379 | + * kernel is for now unable to do, and gating the clock would |
380 | + * make us loose this precious configuration. |
381 | + */ |
382 | + if (!of_device_is_available(child) || !IS_ENABLED(CONFIG_PCI_MVEBU)) { |
383 | + clk_disable_unprepare(clk); |
384 | + clk_put(clk); |
385 | + } |
386 | |
387 | clk_err: |
388 | of_node_put(child); |
389 | diff --git a/arch/arm/mach-orion5x/common.h b/arch/arm/mach-orion5x/common.h |
390 | index f565f9944af2..7548db2bfb8a 100644 |
391 | --- a/arch/arm/mach-orion5x/common.h |
392 | +++ b/arch/arm/mach-orion5x/common.h |
393 | @@ -21,7 +21,7 @@ struct mv_sata_platform_data; |
394 | #define ORION_MBUS_DEVBUS_BOOT_ATTR 0x0f |
395 | #define ORION_MBUS_DEVBUS_TARGET(cs) 0x01 |
396 | #define ORION_MBUS_DEVBUS_ATTR(cs) (~(1 << cs)) |
397 | -#define ORION_MBUS_SRAM_TARGET 0x00 |
398 | +#define ORION_MBUS_SRAM_TARGET 0x09 |
399 | #define ORION_MBUS_SRAM_ATTR 0x00 |
400 | |
401 | /* |
402 | diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c |
403 | index 473e5dbf8f39..0f08dfd69ebc 100644 |
404 | --- a/arch/arm64/kernel/irq.c |
405 | +++ b/arch/arm64/kernel/irq.c |
406 | @@ -97,11 +97,15 @@ static bool migrate_one_irq(struct irq_desc *desc) |
407 | if (irqd_is_per_cpu(d) || !cpumask_test_cpu(smp_processor_id(), affinity)) |
408 | return false; |
409 | |
410 | - if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) { |
411 | - affinity = cpu_online_mask; |
412 | + if (cpumask_any_and(affinity, cpu_online_mask) >= nr_cpu_ids) |
413 | ret = true; |
414 | - } |
415 | |
416 | + /* |
417 | + * when using forced irq_set_affinity we must ensure that the cpu |
418 | + * being offlined is not present in the affinity mask, it may be |
419 | + * selected as the target CPU otherwise |
420 | + */ |
421 | + affinity = cpu_online_mask; |
422 | c = irq_data_get_irq_chip(d); |
423 | if (!c->irq_set_affinity) |
424 | pr_debug("IRQ%u: unable to set affinity\n", d->irq); |
425 | diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c |
426 | index 5e9aec358306..31eb959e9aa8 100644 |
427 | --- a/arch/arm64/mm/hugetlbpage.c |
428 | +++ b/arch/arm64/mm/hugetlbpage.c |
429 | @@ -51,7 +51,11 @@ int pmd_huge(pmd_t pmd) |
430 | |
431 | int pud_huge(pud_t pud) |
432 | { |
433 | +#ifndef __PAGETABLE_PMD_FOLDED |
434 | return !(pud_val(pud) & PUD_TABLE_BIT); |
435 | +#else |
436 | + return 0; |
437 | +#endif |
438 | } |
439 | |
440 | int pmd_huge_support(void) |
441 | diff --git a/arch/metag/include/asm/barrier.h b/arch/metag/include/asm/barrier.h |
442 | index 5d6b4b407dda..2d6f0de77325 100644 |
443 | --- a/arch/metag/include/asm/barrier.h |
444 | +++ b/arch/metag/include/asm/barrier.h |
445 | @@ -15,6 +15,7 @@ static inline void wr_fence(void) |
446 | volatile int *flushptr = (volatile int *) LINSYSEVENT_WR_FENCE; |
447 | barrier(); |
448 | *flushptr = 0; |
449 | + barrier(); |
450 | } |
451 | |
452 | #else /* CONFIG_METAG_META21 */ |
453 | @@ -35,6 +36,7 @@ static inline void wr_fence(void) |
454 | *flushptr = 0; |
455 | *flushptr = 0; |
456 | *flushptr = 0; |
457 | + barrier(); |
458 | } |
459 | |
460 | #endif /* !CONFIG_METAG_META21 */ |
461 | @@ -68,6 +70,7 @@ static inline void fence(void) |
462 | volatile int *flushptr = (volatile int *) LINSYSEVENT_WR_ATOMIC_UNLOCK; |
463 | barrier(); |
464 | *flushptr = 0; |
465 | + barrier(); |
466 | } |
467 | #define smp_mb() fence() |
468 | #define smp_rmb() fence() |
469 | diff --git a/arch/metag/include/asm/processor.h b/arch/metag/include/asm/processor.h |
470 | index f16477d1f571..3be8581af495 100644 |
471 | --- a/arch/metag/include/asm/processor.h |
472 | +++ b/arch/metag/include/asm/processor.h |
473 | @@ -22,6 +22,8 @@ |
474 | /* Add an extra page of padding at the top of the stack for the guard page. */ |
475 | #define STACK_TOP (TASK_SIZE - PAGE_SIZE) |
476 | #define STACK_TOP_MAX STACK_TOP |
477 | +/* Maximum virtual space for stack */ |
478 | +#define STACK_SIZE_MAX (1 << 28) /* 256 MB */ |
479 | |
480 | /* This decides where the kernel will search for a free chunk of vm |
481 | * space during mmap's. |
482 | diff --git a/arch/mips/cavium-octeon/octeon-irq.c b/arch/mips/cavium-octeon/octeon-irq.c |
483 | index c2bb4f896ce7..3aa5b46b2d40 100644 |
484 | --- a/arch/mips/cavium-octeon/octeon-irq.c |
485 | +++ b/arch/mips/cavium-octeon/octeon-irq.c |
486 | @@ -635,7 +635,7 @@ static void octeon_irq_cpu_offline_ciu(struct irq_data *data) |
487 | cpumask_clear(&new_affinity); |
488 | cpumask_set_cpu(cpumask_first(cpu_online_mask), &new_affinity); |
489 | } |
490 | - __irq_set_affinity_locked(data, &new_affinity); |
491 | + irq_set_affinity_locked(data, &new_affinity, false); |
492 | } |
493 | |
494 | static int octeon_irq_ciu_set_affinity(struct irq_data *data, |
495 | diff --git a/arch/mips/lantiq/dts/easy50712.dts b/arch/mips/lantiq/dts/easy50712.dts |
496 | index fac1f5b178eb..143b8a37b5e4 100644 |
497 | --- a/arch/mips/lantiq/dts/easy50712.dts |
498 | +++ b/arch/mips/lantiq/dts/easy50712.dts |
499 | @@ -8,6 +8,7 @@ |
500 | }; |
501 | |
502 | memory@0 { |
503 | + device_type = "memory"; |
504 | reg = <0x0 0x2000000>; |
505 | }; |
506 | |
507 | diff --git a/arch/mips/loongson/lemote-2f/clock.c b/arch/mips/loongson/lemote-2f/clock.c |
508 | index aed32b88576c..7d8c9cce3009 100644 |
509 | --- a/arch/mips/loongson/lemote-2f/clock.c |
510 | +++ b/arch/mips/loongson/lemote-2f/clock.c |
511 | @@ -91,6 +91,7 @@ EXPORT_SYMBOL(clk_put); |
512 | |
513 | int clk_set_rate(struct clk *clk, unsigned long rate) |
514 | { |
515 | + unsigned int rate_khz = rate / 1000; |
516 | int ret = 0; |
517 | int regval; |
518 | int i; |
519 | @@ -111,10 +112,10 @@ int clk_set_rate(struct clk *clk, unsigned long rate) |
520 | if (loongson2_clockmod_table[i].frequency == |
521 | CPUFREQ_ENTRY_INVALID) |
522 | continue; |
523 | - if (rate == loongson2_clockmod_table[i].frequency) |
524 | + if (rate_khz == loongson2_clockmod_table[i].frequency) |
525 | break; |
526 | } |
527 | - if (rate != loongson2_clockmod_table[i].frequency) |
528 | + if (rate_khz != loongson2_clockmod_table[i].frequency) |
529 | return -ENOTSUPP; |
530 | |
531 | clk->rate = rate; |
532 | diff --git a/arch/mips/ralink/dts/mt7620a_eval.dts b/arch/mips/ralink/dts/mt7620a_eval.dts |
533 | index 35eb874ab7f1..709f58132f5c 100644 |
534 | --- a/arch/mips/ralink/dts/mt7620a_eval.dts |
535 | +++ b/arch/mips/ralink/dts/mt7620a_eval.dts |
536 | @@ -7,6 +7,7 @@ |
537 | model = "Ralink MT7620A evaluation board"; |
538 | |
539 | memory@0 { |
540 | + device_type = "memory"; |
541 | reg = <0x0 0x2000000>; |
542 | }; |
543 | |
544 | diff --git a/arch/mips/ralink/dts/rt2880_eval.dts b/arch/mips/ralink/dts/rt2880_eval.dts |
545 | index 322d7002595b..0a685db093d4 100644 |
546 | --- a/arch/mips/ralink/dts/rt2880_eval.dts |
547 | +++ b/arch/mips/ralink/dts/rt2880_eval.dts |
548 | @@ -7,6 +7,7 @@ |
549 | model = "Ralink RT2880 evaluation board"; |
550 | |
551 | memory@0 { |
552 | + device_type = "memory"; |
553 | reg = <0x8000000 0x2000000>; |
554 | }; |
555 | |
556 | diff --git a/arch/mips/ralink/dts/rt3052_eval.dts b/arch/mips/ralink/dts/rt3052_eval.dts |
557 | index 0ac73ea28198..ec9e9a035541 100644 |
558 | --- a/arch/mips/ralink/dts/rt3052_eval.dts |
559 | +++ b/arch/mips/ralink/dts/rt3052_eval.dts |
560 | @@ -7,6 +7,7 @@ |
561 | model = "Ralink RT3052 evaluation board"; |
562 | |
563 | memory@0 { |
564 | + device_type = "memory"; |
565 | reg = <0x0 0x2000000>; |
566 | }; |
567 | |
568 | diff --git a/arch/mips/ralink/dts/rt3883_eval.dts b/arch/mips/ralink/dts/rt3883_eval.dts |
569 | index 2fa6b330bf4f..e8df21a5d10d 100644 |
570 | --- a/arch/mips/ralink/dts/rt3883_eval.dts |
571 | +++ b/arch/mips/ralink/dts/rt3883_eval.dts |
572 | @@ -7,6 +7,7 @@ |
573 | model = "Ralink RT3883 evaluation board"; |
574 | |
575 | memory@0 { |
576 | + device_type = "memory"; |
577 | reg = <0x0 0x2000000>; |
578 | }; |
579 | |
580 | diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig |
581 | index bb2a8ec440e7..a8f4a70c0742 100644 |
582 | --- a/arch/parisc/Kconfig |
583 | +++ b/arch/parisc/Kconfig |
584 | @@ -22,6 +22,7 @@ config PARISC |
585 | select GENERIC_SMP_IDLE_THREAD |
586 | select GENERIC_STRNCPY_FROM_USER |
587 | select SYSCTL_ARCH_UNALIGN_ALLOW |
588 | + select SYSCTL_EXCEPTION_TRACE |
589 | select HAVE_MOD_ARCH_SPECIFIC |
590 | select VIRT_TO_BUS |
591 | select MODULES_USE_ELF_RELA |
592 | diff --git a/arch/parisc/include/asm/processor.h b/arch/parisc/include/asm/processor.h |
593 | index 198a86feb574..86522ef09d52 100644 |
594 | --- a/arch/parisc/include/asm/processor.h |
595 | +++ b/arch/parisc/include/asm/processor.h |
596 | @@ -55,6 +55,8 @@ |
597 | #define STACK_TOP TASK_SIZE |
598 | #define STACK_TOP_MAX DEFAULT_TASK_SIZE |
599 | |
600 | +#define STACK_SIZE_MAX (1 << 30) /* 1 GB */ |
601 | + |
602 | #endif |
603 | |
604 | #ifndef __ASSEMBLY__ |
605 | diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S |
606 | index a63bb179f79a..838786011037 100644 |
607 | --- a/arch/parisc/kernel/syscall.S |
608 | +++ b/arch/parisc/kernel/syscall.S |
609 | @@ -589,10 +589,13 @@ cas_nocontend: |
610 | # endif |
611 | /* ENABLE_LWS_DEBUG */ |
612 | |
613 | + rsm PSW_SM_I, %r0 /* Disable interrupts */ |
614 | + /* COW breaks can cause contention on UP systems */ |
615 | LDCW 0(%sr2,%r20), %r28 /* Try to acquire the lock */ |
616 | cmpb,<>,n %r0, %r28, cas_action /* Did we get it? */ |
617 | cas_wouldblock: |
618 | ldo 2(%r0), %r28 /* 2nd case */ |
619 | + ssm PSW_SM_I, %r0 |
620 | b lws_exit /* Contended... */ |
621 | ldo -EAGAIN(%r0), %r21 /* Spin in userspace */ |
622 | |
623 | @@ -619,15 +622,17 @@ cas_action: |
624 | stw %r1, 4(%sr2,%r20) |
625 | #endif |
626 | /* The load and store could fail */ |
627 | -1: ldw 0(%sr3,%r26), %r28 |
628 | +1: ldw,ma 0(%sr3,%r26), %r28 |
629 | sub,<> %r28, %r25, %r0 |
630 | -2: stw %r24, 0(%sr3,%r26) |
631 | +2: stw,ma %r24, 0(%sr3,%r26) |
632 | /* Free lock */ |
633 | - stw %r20, 0(%sr2,%r20) |
634 | + stw,ma %r20, 0(%sr2,%r20) |
635 | #if ENABLE_LWS_DEBUG |
636 | /* Clear thread register indicator */ |
637 | stw %r0, 4(%sr2,%r20) |
638 | #endif |
639 | + /* Enable interrupts */ |
640 | + ssm PSW_SM_I, %r0 |
641 | /* Return to userspace, set no error */ |
642 | b lws_exit |
643 | copy %r0, %r21 |
644 | @@ -639,6 +644,7 @@ cas_action: |
645 | #if ENABLE_LWS_DEBUG |
646 | stw %r0, 4(%sr2,%r20) |
647 | #endif |
648 | + ssm PSW_SM_I, %r0 |
649 | b lws_exit |
650 | ldo -EFAULT(%r0),%r21 /* set errno */ |
651 | nop |
652 | diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c |
653 | index 1cd1d0c83b6d..47ee620d15d2 100644 |
654 | --- a/arch/parisc/kernel/traps.c |
655 | +++ b/arch/parisc/kernel/traps.c |
656 | @@ -25,6 +25,7 @@ |
657 | #include <linux/interrupt.h> |
658 | #include <linux/console.h> |
659 | #include <linux/bug.h> |
660 | +#include <linux/ratelimit.h> |
661 | |
662 | #include <asm/assembly.h> |
663 | #include <asm/uaccess.h> |
664 | @@ -42,9 +43,6 @@ |
665 | |
666 | #include "../math-emu/math-emu.h" /* for handle_fpe() */ |
667 | |
668 | -#define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */ |
669 | - /* dumped to the console via printk) */ |
670 | - |
671 | #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK) |
672 | DEFINE_SPINLOCK(pa_dbit_lock); |
673 | #endif |
674 | @@ -160,6 +158,17 @@ void show_regs(struct pt_regs *regs) |
675 | } |
676 | } |
677 | |
678 | +static DEFINE_RATELIMIT_STATE(_hppa_rs, |
679 | + DEFAULT_RATELIMIT_INTERVAL, DEFAULT_RATELIMIT_BURST); |
680 | + |
681 | +#define parisc_printk_ratelimited(critical, regs, fmt, ...) { \ |
682 | + if ((critical || show_unhandled_signals) && __ratelimit(&_hppa_rs)) { \ |
683 | + printk(fmt, ##__VA_ARGS__); \ |
684 | + show_regs(regs); \ |
685 | + } \ |
686 | +} |
687 | + |
688 | + |
689 | static void do_show_stack(struct unwind_frame_info *info) |
690 | { |
691 | int i = 1; |
692 | @@ -229,12 +238,10 @@ void die_if_kernel(char *str, struct pt_regs *regs, long err) |
693 | if (err == 0) |
694 | return; /* STFU */ |
695 | |
696 | - printk(KERN_CRIT "%s (pid %d): %s (code %ld) at " RFMT "\n", |
697 | + parisc_printk_ratelimited(1, regs, |
698 | + KERN_CRIT "%s (pid %d): %s (code %ld) at " RFMT "\n", |
699 | current->comm, task_pid_nr(current), str, err, regs->iaoq[0]); |
700 | -#ifdef PRINT_USER_FAULTS |
701 | - /* XXX for debugging only */ |
702 | - show_regs(regs); |
703 | -#endif |
704 | + |
705 | return; |
706 | } |
707 | |
708 | @@ -321,14 +328,11 @@ static void handle_break(struct pt_regs *regs) |
709 | (tt == BUG_TRAP_TYPE_NONE) ? 9 : 0); |
710 | } |
711 | |
712 | -#ifdef PRINT_USER_FAULTS |
713 | - if (unlikely(iir != GDB_BREAK_INSN)) { |
714 | - printk(KERN_DEBUG "break %d,%d: pid=%d command='%s'\n", |
715 | + if (unlikely(iir != GDB_BREAK_INSN)) |
716 | + parisc_printk_ratelimited(0, regs, |
717 | + KERN_DEBUG "break %d,%d: pid=%d command='%s'\n", |
718 | iir & 31, (iir>>13) & ((1<<13)-1), |
719 | task_pid_nr(current), current->comm); |
720 | - show_regs(regs); |
721 | - } |
722 | -#endif |
723 | |
724 | /* send standard GDB signal */ |
725 | handle_gdb_break(regs, TRAP_BRKPT); |
726 | @@ -758,11 +762,9 @@ void notrace handle_interruption(int code, struct pt_regs *regs) |
727 | |
728 | default: |
729 | if (user_mode(regs)) { |
730 | -#ifdef PRINT_USER_FAULTS |
731 | - printk(KERN_DEBUG "\nhandle_interruption() pid=%d command='%s'\n", |
732 | - task_pid_nr(current), current->comm); |
733 | - show_regs(regs); |
734 | -#endif |
735 | + parisc_printk_ratelimited(0, regs, KERN_DEBUG |
736 | + "handle_interruption() pid=%d command='%s'\n", |
737 | + task_pid_nr(current), current->comm); |
738 | /* SIGBUS, for lack of a better one. */ |
739 | si.si_signo = SIGBUS; |
740 | si.si_code = BUS_OBJERR; |
741 | @@ -779,16 +781,10 @@ void notrace handle_interruption(int code, struct pt_regs *regs) |
742 | |
743 | if (user_mode(regs)) { |
744 | if ((fault_space >> SPACEID_SHIFT) != (regs->sr[7] >> SPACEID_SHIFT)) { |
745 | -#ifdef PRINT_USER_FAULTS |
746 | - if (fault_space == 0) |
747 | - printk(KERN_DEBUG "User Fault on Kernel Space "); |
748 | - else |
749 | - printk(KERN_DEBUG "User Fault (long pointer) (fault %d) ", |
750 | - code); |
751 | - printk(KERN_CONT "pid=%d command='%s'\n", |
752 | - task_pid_nr(current), current->comm); |
753 | - show_regs(regs); |
754 | -#endif |
755 | + parisc_printk_ratelimited(0, regs, KERN_DEBUG |
756 | + "User fault %d on space 0x%08lx, pid=%d command='%s'\n", |
757 | + code, fault_space, |
758 | + task_pid_nr(current), current->comm); |
759 | si.si_signo = SIGSEGV; |
760 | si.si_errno = 0; |
761 | si.si_code = SEGV_MAPERR; |
762 | diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c |
763 | index 9d08c71a967e..d72197f0ddb8 100644 |
764 | --- a/arch/parisc/mm/fault.c |
765 | +++ b/arch/parisc/mm/fault.c |
766 | @@ -19,10 +19,6 @@ |
767 | #include <asm/uaccess.h> |
768 | #include <asm/traps.h> |
769 | |
770 | -#define PRINT_USER_FAULTS /* (turn this on if you want user faults to be */ |
771 | - /* dumped to the console via printk) */ |
772 | - |
773 | - |
774 | /* Various important other fields */ |
775 | #define bit22set(x) (x & 0x00000200) |
776 | #define bits23_25set(x) (x & 0x000001c0) |
777 | @@ -34,6 +30,8 @@ |
778 | |
779 | DEFINE_PER_CPU(struct exception_data, exception_data); |
780 | |
781 | +int show_unhandled_signals = 1; |
782 | + |
783 | /* |
784 | * parisc_acctyp(unsigned int inst) -- |
785 | * Given a PA-RISC memory access instruction, determine if the |
786 | @@ -173,6 +171,32 @@ int fixup_exception(struct pt_regs *regs) |
787 | return 0; |
788 | } |
789 | |
790 | +/* |
791 | + * Print out info about fatal segfaults, if the show_unhandled_signals |
792 | + * sysctl is set: |
793 | + */ |
794 | +static inline void |
795 | +show_signal_msg(struct pt_regs *regs, unsigned long code, |
796 | + unsigned long address, struct task_struct *tsk, |
797 | + struct vm_area_struct *vma) |
798 | +{ |
799 | + if (!unhandled_signal(tsk, SIGSEGV)) |
800 | + return; |
801 | + |
802 | + if (!printk_ratelimit()) |
803 | + return; |
804 | + |
805 | + pr_warn("\n"); |
806 | + pr_warn("do_page_fault() command='%s' type=%lu address=0x%08lx", |
807 | + tsk->comm, code, address); |
808 | + print_vma_addr(KERN_CONT " in ", regs->iaoq[0]); |
809 | + if (vma) |
810 | + pr_warn(" vm_start = 0x%08lx, vm_end = 0x%08lx\n", |
811 | + vma->vm_start, vma->vm_end); |
812 | + |
813 | + show_regs(regs); |
814 | +} |
815 | + |
816 | void do_page_fault(struct pt_regs *regs, unsigned long code, |
817 | unsigned long address) |
818 | { |
819 | @@ -270,16 +294,8 @@ bad_area: |
820 | if (user_mode(regs)) { |
821 | struct siginfo si; |
822 | |
823 | -#ifdef PRINT_USER_FAULTS |
824 | - printk(KERN_DEBUG "\n"); |
825 | - printk(KERN_DEBUG "do_page_fault() pid=%d command='%s' type=%lu address=0x%08lx\n", |
826 | - task_pid_nr(tsk), tsk->comm, code, address); |
827 | - if (vma) { |
828 | - printk(KERN_DEBUG "vm_start = 0x%08lx, vm_end = 0x%08lx\n", |
829 | - vma->vm_start, vma->vm_end); |
830 | - } |
831 | - show_regs(regs); |
832 | -#endif |
833 | + show_signal_msg(regs, code, address, tsk, vma); |
834 | + |
835 | switch (code) { |
836 | case 15: /* Data TLB miss fault/Data page fault */ |
837 | /* send SIGSEGV when outside of vma */ |
838 | diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile |
839 | index 0f4344e6fbca..8289e2b241a2 100644 |
840 | --- a/arch/powerpc/Makefile |
841 | +++ b/arch/powerpc/Makefile |
842 | @@ -149,7 +149,9 @@ endif |
843 | |
844 | CFLAGS-$(CONFIG_TUNE_CELL) += $(call cc-option,-mtune=cell) |
845 | |
846 | -KBUILD_CPPFLAGS += -Iarch/$(ARCH) |
847 | +asinstr := $(call as-instr,lis 9$(comma)foo@high,-DHAVE_AS_ATHIGH=1) |
848 | + |
849 | +KBUILD_CPPFLAGS += -Iarch/$(ARCH) $(asinstr) |
850 | KBUILD_AFLAGS += -Iarch/$(ARCH) |
851 | KBUILD_CFLAGS += -msoft-float -pipe -Iarch/$(ARCH) $(CFLAGS-y) |
852 | CPP = $(CC) -E $(KBUILD_CFLAGS) |
853 | diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h |
854 | index 6586a40a46ce..cded7c1278ef 100644 |
855 | --- a/arch/powerpc/include/asm/ppc_asm.h |
856 | +++ b/arch/powerpc/include/asm/ppc_asm.h |
857 | @@ -318,11 +318,16 @@ n: |
858 | addi reg,reg,(name - 0b)@l; |
859 | |
860 | #ifdef __powerpc64__ |
861 | +#ifdef HAVE_AS_ATHIGH |
862 | +#define __AS_ATHIGH high |
863 | +#else |
864 | +#define __AS_ATHIGH h |
865 | +#endif |
866 | #define LOAD_REG_IMMEDIATE(reg,expr) \ |
867 | lis reg,(expr)@highest; \ |
868 | ori reg,reg,(expr)@higher; \ |
869 | rldicr reg,reg,32,31; \ |
870 | - oris reg,reg,(expr)@h; \ |
871 | + oris reg,reg,(expr)@__AS_ATHIGH; \ |
872 | ori reg,reg,(expr)@l; |
873 | |
874 | #define LOAD_REG_ADDR(reg,name) \ |
875 | diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c |
876 | index 59d229a2a3e0..879b3aacac32 100644 |
877 | --- a/arch/powerpc/kernel/machine_kexec_64.c |
878 | +++ b/arch/powerpc/kernel/machine_kexec_64.c |
879 | @@ -237,7 +237,7 @@ static void wake_offline_cpus(void) |
880 | if (!cpu_online(cpu)) { |
881 | printk(KERN_INFO "kexec: Waking offline cpu %d.\n", |
882 | cpu); |
883 | - cpu_up(cpu); |
884 | + WARN_ON(cpu_up(cpu)); |
885 | } |
886 | } |
887 | } |
888 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c |
889 | index b3dab20acf34..57d4bada19bd 100644 |
890 | --- a/arch/powerpc/kernel/time.c |
891 | +++ b/arch/powerpc/kernel/time.c |
892 | @@ -805,9 +805,6 @@ static void __init clocksource_init(void) |
893 | static int decrementer_set_next_event(unsigned long evt, |
894 | struct clock_event_device *dev) |
895 | { |
896 | - /* Don't adjust the decrementer if some irq work is pending */ |
897 | - if (test_irq_work_pending()) |
898 | - return 0; |
899 | __get_cpu_var(decrementers_next_tb) = get_tb_or_rtc() + evt; |
900 | set_dec(evt); |
901 | |
902 | diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c |
903 | index 253fefe3d1a0..5b51079f3e3b 100644 |
904 | --- a/arch/powerpc/platforms/powernv/eeh-ioda.c |
905 | +++ b/arch/powerpc/platforms/powernv/eeh-ioda.c |
906 | @@ -549,7 +549,8 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) |
907 | ret = ioda_eeh_phb_reset(hose, option); |
908 | } else { |
909 | bus = eeh_pe_bus_get(pe); |
910 | - if (pci_is_root_bus(bus)) |
911 | + if (pci_is_root_bus(bus) || |
912 | + pci_is_root_bus(bus->parent)) |
913 | ret = ioda_eeh_root_reset(hose, option); |
914 | else |
915 | ret = ioda_eeh_bridge_reset(hose, bus->self, option); |
916 | diff --git a/arch/s390/crypto/aes_s390.c b/arch/s390/crypto/aes_s390.c |
917 | index cf3c0089bef2..23223cd63e54 100644 |
918 | --- a/arch/s390/crypto/aes_s390.c |
919 | +++ b/arch/s390/crypto/aes_s390.c |
920 | @@ -820,6 +820,9 @@ static int ctr_aes_crypt(struct blkcipher_desc *desc, long func, |
921 | else |
922 | memcpy(walk->iv, ctrptr, AES_BLOCK_SIZE); |
923 | spin_unlock(&ctrblk_lock); |
924 | + } else { |
925 | + if (!nbytes) |
926 | + memcpy(walk->iv, ctrptr, AES_BLOCK_SIZE); |
927 | } |
928 | /* |
929 | * final block may be < AES_BLOCK_SIZE, copy only nbytes |
930 | diff --git a/arch/s390/crypto/des_s390.c b/arch/s390/crypto/des_s390.c |
931 | index 0a5aac8a9412..7acb77f7ef1a 100644 |
932 | --- a/arch/s390/crypto/des_s390.c |
933 | +++ b/arch/s390/crypto/des_s390.c |
934 | @@ -429,6 +429,9 @@ static int ctr_desall_crypt(struct blkcipher_desc *desc, long func, |
935 | else |
936 | memcpy(walk->iv, ctrptr, DES_BLOCK_SIZE); |
937 | spin_unlock(&ctrblk_lock); |
938 | + } else { |
939 | + if (!nbytes) |
940 | + memcpy(walk->iv, ctrptr, DES_BLOCK_SIZE); |
941 | } |
942 | /* final block may be < DES_BLOCK_SIZE, copy only nbytes */ |
943 | if (nbytes) { |
944 | diff --git a/arch/x86/include/asm/hugetlb.h b/arch/x86/include/asm/hugetlb.h |
945 | index a8091216963b..68c05398bba9 100644 |
946 | --- a/arch/x86/include/asm/hugetlb.h |
947 | +++ b/arch/x86/include/asm/hugetlb.h |
948 | @@ -52,6 +52,7 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, |
949 | static inline void huge_ptep_clear_flush(struct vm_area_struct *vma, |
950 | unsigned long addr, pte_t *ptep) |
951 | { |
952 | + ptep_clear_flush(vma, addr, ptep); |
953 | } |
954 | |
955 | static inline int huge_pte_none(pte_t pte) |
956 | diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c |
957 | index af1d14a9ebda..dcbbaa165bde 100644 |
958 | --- a/arch/x86/kernel/ldt.c |
959 | +++ b/arch/x86/kernel/ldt.c |
960 | @@ -20,6 +20,8 @@ |
961 | #include <asm/mmu_context.h> |
962 | #include <asm/syscalls.h> |
963 | |
964 | +int sysctl_ldt16 = 0; |
965 | + |
966 | #ifdef CONFIG_SMP |
967 | static void flush_ldt(void *current_mm) |
968 | { |
969 | @@ -234,7 +236,7 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) |
970 | * IRET leaking the high bits of the kernel stack address. |
971 | */ |
972 | #ifdef CONFIG_X86_64 |
973 | - if (!ldt_info.seg_32bit) { |
974 | + if (!ldt_info.seg_32bit && !sysctl_ldt16) { |
975 | error = -EINVAL; |
976 | goto out_unlock; |
977 | } |
978 | diff --git a/arch/x86/vdso/vdso32-setup.c b/arch/x86/vdso/vdso32-setup.c |
979 | index d6bfb876cfb0..f1d633a43f8e 100644 |
980 | --- a/arch/x86/vdso/vdso32-setup.c |
981 | +++ b/arch/x86/vdso/vdso32-setup.c |
982 | @@ -41,6 +41,7 @@ enum { |
983 | #ifdef CONFIG_X86_64 |
984 | #define vdso_enabled sysctl_vsyscall32 |
985 | #define arch_setup_additional_pages syscall32_setup_pages |
986 | +extern int sysctl_ldt16; |
987 | #endif |
988 | |
989 | /* |
990 | @@ -380,6 +381,13 @@ static struct ctl_table abi_table2[] = { |
991 | .mode = 0644, |
992 | .proc_handler = proc_dointvec |
993 | }, |
994 | + { |
995 | + .procname = "ldt16", |
996 | + .data = &sysctl_ldt16, |
997 | + .maxlen = sizeof(int), |
998 | + .mode = 0644, |
999 | + .proc_handler = proc_dointvec |
1000 | + }, |
1001 | {} |
1002 | }; |
1003 | |
1004 | diff --git a/crypto/crypto_wq.c b/crypto/crypto_wq.c |
1005 | index adad92a44ba2..2f1b8d12952a 100644 |
1006 | --- a/crypto/crypto_wq.c |
1007 | +++ b/crypto/crypto_wq.c |
1008 | @@ -33,7 +33,7 @@ static void __exit crypto_wq_exit(void) |
1009 | destroy_workqueue(kcrypto_wq); |
1010 | } |
1011 | |
1012 | -module_init(crypto_wq_init); |
1013 | +subsys_initcall(crypto_wq_init); |
1014 | module_exit(crypto_wq_exit); |
1015 | |
1016 | MODULE_LICENSE("GPL"); |
1017 | diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig |
1018 | index 4770de5707b9..561bf25ac9f9 100644 |
1019 | --- a/drivers/acpi/Kconfig |
1020 | +++ b/drivers/acpi/Kconfig |
1021 | @@ -56,6 +56,23 @@ config ACPI_PROCFS |
1022 | |
1023 | Say N to delete /proc/acpi/ files that have moved to /sys/ |
1024 | |
1025 | +config ACPI_PROCFS_POWER |
1026 | + bool "Deprecated power /proc/acpi directories" |
1027 | + depends on PROC_FS |
1028 | + help |
1029 | + For backwards compatibility, this option allows |
1030 | + deprecated power /proc/acpi/ directories to exist, even when |
1031 | + they have been replaced by functions in /sys. |
1032 | + The deprecated directories (and their replacements) include: |
1033 | + /proc/acpi/battery/* (/sys/class/power_supply/*) |
1034 | + /proc/acpi/ac_adapter/* (sys/class/power_supply/*) |
1035 | + This option has no effect on /proc/acpi/ directories |
1036 | + and functions, which do not yet exist in /sys |
1037 | + This option, together with the proc directories, will be |
1038 | + deleted in 2.6.39. |
1039 | + |
1040 | + Say N to delete power /proc/acpi/ directories that have moved to /sys/ |
1041 | + |
1042 | config ACPI_EC_DEBUGFS |
1043 | tristate "EC read/write access through /sys/kernel/debug/ec" |
1044 | default n |
1045 | diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile |
1046 | index 0331f91d56e6..bce34afadcd0 100644 |
1047 | --- a/drivers/acpi/Makefile |
1048 | +++ b/drivers/acpi/Makefile |
1049 | @@ -47,6 +47,7 @@ acpi-y += sysfs.o |
1050 | acpi-$(CONFIG_X86) += acpi_cmos_rtc.o |
1051 | acpi-$(CONFIG_DEBUG_FS) += debugfs.o |
1052 | acpi-$(CONFIG_ACPI_NUMA) += numa.o |
1053 | +acpi-$(CONFIG_ACPI_PROCFS_POWER) += cm_sbs.o |
1054 | ifdef CONFIG_ACPI_VIDEO |
1055 | acpi-y += video_detect.o |
1056 | endif |
1057 | diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c |
1058 | index 6f190bc2b8b7..7c1f8452918a 100644 |
1059 | --- a/drivers/acpi/ac.c |
1060 | +++ b/drivers/acpi/ac.c |
1061 | @@ -51,11 +51,39 @@ MODULE_AUTHOR("Paul Diefenbaugh"); |
1062 | MODULE_DESCRIPTION("ACPI AC Adapter Driver"); |
1063 | MODULE_LICENSE("GPL"); |
1064 | |
1065 | +static int acpi_ac_add(struct acpi_device *device); |
1066 | +static int acpi_ac_remove(struct acpi_device *device); |
1067 | +static void acpi_ac_notify(struct acpi_device *device, u32 event); |
1068 | + |
1069 | +static const struct acpi_device_id ac_device_ids[] = { |
1070 | + {"ACPI0003", 0}, |
1071 | + {"", 0}, |
1072 | +}; |
1073 | +MODULE_DEVICE_TABLE(acpi, ac_device_ids); |
1074 | + |
1075 | +#ifdef CONFIG_PM_SLEEP |
1076 | +static int acpi_ac_resume(struct device *dev); |
1077 | +#endif |
1078 | +static SIMPLE_DEV_PM_OPS(acpi_ac_pm, NULL, acpi_ac_resume); |
1079 | + |
1080 | static int ac_sleep_before_get_state_ms; |
1081 | |
1082 | +static struct acpi_driver acpi_ac_driver = { |
1083 | + .name = "ac", |
1084 | + .class = ACPI_AC_CLASS, |
1085 | + .ids = ac_device_ids, |
1086 | + .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS, |
1087 | + .ops = { |
1088 | + .add = acpi_ac_add, |
1089 | + .remove = acpi_ac_remove, |
1090 | + .notify = acpi_ac_notify, |
1091 | + }, |
1092 | + .drv.pm = &acpi_ac_pm, |
1093 | +}; |
1094 | + |
1095 | struct acpi_ac { |
1096 | struct power_supply charger; |
1097 | - struct platform_device *pdev; |
1098 | + struct acpi_device * device; |
1099 | unsigned long long state; |
1100 | }; |
1101 | |
1102 | @@ -67,10 +95,12 @@ struct acpi_ac { |
1103 | |
1104 | static int acpi_ac_get_state(struct acpi_ac *ac) |
1105 | { |
1106 | - acpi_status status; |
1107 | - acpi_handle handle = ACPI_HANDLE(&ac->pdev->dev); |
1108 | + acpi_status status = AE_OK; |
1109 | + |
1110 | + if (!ac) |
1111 | + return -EINVAL; |
1112 | |
1113 | - status = acpi_evaluate_integer(handle, "_PSR", NULL, |
1114 | + status = acpi_evaluate_integer(ac->device->handle, "_PSR", NULL, |
1115 | &ac->state); |
1116 | if (ACPI_FAILURE(status)) { |
1117 | ACPI_EXCEPTION((AE_INFO, status, |
1118 | @@ -115,10 +145,9 @@ static enum power_supply_property ac_props[] = { |
1119 | Driver Model |
1120 | -------------------------------------------------------------------------- */ |
1121 | |
1122 | -static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data) |
1123 | +static void acpi_ac_notify(struct acpi_device *device, u32 event) |
1124 | { |
1125 | - struct acpi_ac *ac = data; |
1126 | - struct acpi_device *adev; |
1127 | + struct acpi_ac *ac = acpi_driver_data(device); |
1128 | |
1129 | if (!ac) |
1130 | return; |
1131 | @@ -141,11 +170,10 @@ static void acpi_ac_notify_handler(acpi_handle handle, u32 event, void *data) |
1132 | msleep(ac_sleep_before_get_state_ms); |
1133 | |
1134 | acpi_ac_get_state(ac); |
1135 | - adev = ACPI_COMPANION(&ac->pdev->dev); |
1136 | - acpi_bus_generate_netlink_event(adev->pnp.device_class, |
1137 | - dev_name(&ac->pdev->dev), |
1138 | - event, (u32) ac->state); |
1139 | - acpi_notifier_call_chain(adev, event, (u32) ac->state); |
1140 | + acpi_bus_generate_netlink_event(device->pnp.device_class, |
1141 | + dev_name(&device->dev), event, |
1142 | + (u32) ac->state); |
1143 | + acpi_notifier_call_chain(device, event, (u32) ac->state); |
1144 | kobject_uevent(&ac->charger.dev->kobj, KOBJ_CHANGE); |
1145 | } |
1146 | |
1147 | @@ -170,49 +198,39 @@ static struct dmi_system_id ac_dmi_table[] = { |
1148 | {}, |
1149 | }; |
1150 | |
1151 | -static int acpi_ac_probe(struct platform_device *pdev) |
1152 | +static int acpi_ac_add(struct acpi_device *device) |
1153 | { |
1154 | int result = 0; |
1155 | struct acpi_ac *ac = NULL; |
1156 | - struct acpi_device *adev; |
1157 | |
1158 | - if (!pdev) |
1159 | - return -EINVAL; |
1160 | |
1161 | - adev = ACPI_COMPANION(&pdev->dev); |
1162 | - if (!adev) |
1163 | - return -ENODEV; |
1164 | + if (!device) |
1165 | + return -EINVAL; |
1166 | |
1167 | ac = kzalloc(sizeof(struct acpi_ac), GFP_KERNEL); |
1168 | if (!ac) |
1169 | return -ENOMEM; |
1170 | |
1171 | - strcpy(acpi_device_name(adev), ACPI_AC_DEVICE_NAME); |
1172 | - strcpy(acpi_device_class(adev), ACPI_AC_CLASS); |
1173 | - ac->pdev = pdev; |
1174 | - platform_set_drvdata(pdev, ac); |
1175 | + ac->device = device; |
1176 | + strcpy(acpi_device_name(device), ACPI_AC_DEVICE_NAME); |
1177 | + strcpy(acpi_device_class(device), ACPI_AC_CLASS); |
1178 | + device->driver_data = ac; |
1179 | |
1180 | result = acpi_ac_get_state(ac); |
1181 | if (result) |
1182 | goto end; |
1183 | |
1184 | - ac->charger.name = acpi_device_bid(adev); |
1185 | + ac->charger.name = acpi_device_bid(device); |
1186 | ac->charger.type = POWER_SUPPLY_TYPE_MAINS; |
1187 | ac->charger.properties = ac_props; |
1188 | ac->charger.num_properties = ARRAY_SIZE(ac_props); |
1189 | ac->charger.get_property = get_ac_property; |
1190 | - result = power_supply_register(&pdev->dev, &ac->charger); |
1191 | + result = power_supply_register(&ac->device->dev, &ac->charger); |
1192 | if (result) |
1193 | goto end; |
1194 | |
1195 | - result = acpi_install_notify_handler(ACPI_HANDLE(&pdev->dev), |
1196 | - ACPI_ALL_NOTIFY, acpi_ac_notify_handler, ac); |
1197 | - if (result) { |
1198 | - power_supply_unregister(&ac->charger); |
1199 | - goto end; |
1200 | - } |
1201 | printk(KERN_INFO PREFIX "%s [%s] (%s)\n", |
1202 | - acpi_device_name(adev), acpi_device_bid(adev), |
1203 | + acpi_device_name(device), acpi_device_bid(device), |
1204 | ac->state ? "on-line" : "off-line"); |
1205 | |
1206 | end: |
1207 | @@ -232,7 +250,7 @@ static int acpi_ac_resume(struct device *dev) |
1208 | if (!dev) |
1209 | return -EINVAL; |
1210 | |
1211 | - ac = platform_get_drvdata(to_platform_device(dev)); |
1212 | + ac = acpi_driver_data(to_acpi_device(dev)); |
1213 | if (!ac) |
1214 | return -EINVAL; |
1215 | |
1216 | @@ -246,19 +264,17 @@ static int acpi_ac_resume(struct device *dev) |
1217 | #else |
1218 | #define acpi_ac_resume NULL |
1219 | #endif |
1220 | -static SIMPLE_DEV_PM_OPS(acpi_ac_pm_ops, NULL, acpi_ac_resume); |
1221 | |
1222 | -static int acpi_ac_remove(struct platform_device *pdev) |
1223 | +static int acpi_ac_remove(struct acpi_device *device) |
1224 | { |
1225 | - struct acpi_ac *ac; |
1226 | + struct acpi_ac *ac = NULL; |
1227 | + |
1228 | |
1229 | - if (!pdev) |
1230 | + if (!device || !acpi_driver_data(device)) |
1231 | return -EINVAL; |
1232 | |
1233 | - acpi_remove_notify_handler(ACPI_HANDLE(&pdev->dev), |
1234 | - ACPI_ALL_NOTIFY, acpi_ac_notify_handler); |
1235 | + ac = acpi_driver_data(device); |
1236 | |
1237 | - ac = platform_get_drvdata(pdev); |
1238 | if (ac->charger.dev) |
1239 | power_supply_unregister(&ac->charger); |
1240 | |
1241 | @@ -267,23 +283,6 @@ static int acpi_ac_remove(struct platform_device *pdev) |
1242 | return 0; |
1243 | } |
1244 | |
1245 | -static const struct acpi_device_id acpi_ac_match[] = { |
1246 | - { "ACPI0003", 0 }, |
1247 | - { } |
1248 | -}; |
1249 | -MODULE_DEVICE_TABLE(acpi, acpi_ac_match); |
1250 | - |
1251 | -static struct platform_driver acpi_ac_driver = { |
1252 | - .probe = acpi_ac_probe, |
1253 | - .remove = acpi_ac_remove, |
1254 | - .driver = { |
1255 | - .name = "acpi-ac", |
1256 | - .owner = THIS_MODULE, |
1257 | - .pm = &acpi_ac_pm_ops, |
1258 | - .acpi_match_table = ACPI_PTR(acpi_ac_match), |
1259 | - }, |
1260 | -}; |
1261 | - |
1262 | static int __init acpi_ac_init(void) |
1263 | { |
1264 | int result; |
1265 | @@ -291,7 +290,7 @@ static int __init acpi_ac_init(void) |
1266 | if (acpi_disabled) |
1267 | return -ENODEV; |
1268 | |
1269 | - result = platform_driver_register(&acpi_ac_driver); |
1270 | + result = acpi_bus_register_driver(&acpi_ac_driver); |
1271 | if (result < 0) |
1272 | return -ENODEV; |
1273 | |
1274 | @@ -300,7 +299,7 @@ static int __init acpi_ac_init(void) |
1275 | |
1276 | static void __exit acpi_ac_exit(void) |
1277 | { |
1278 | - platform_driver_unregister(&acpi_ac_driver); |
1279 | + acpi_bus_unregister_driver(&acpi_ac_driver); |
1280 | } |
1281 | module_init(acpi_ac_init); |
1282 | module_exit(acpi_ac_exit); |
1283 | diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c |
1284 | index dbfe49e5fd63..1d4950388fa1 100644 |
1285 | --- a/drivers/acpi/acpi_platform.c |
1286 | +++ b/drivers/acpi/acpi_platform.c |
1287 | @@ -29,7 +29,6 @@ ACPI_MODULE_NAME("platform"); |
1288 | static const struct acpi_device_id acpi_platform_device_ids[] = { |
1289 | |
1290 | { "PNP0D40" }, |
1291 | - { "ACPI0003" }, |
1292 | { "VPC2004" }, |
1293 | { "BCM4752" }, |
1294 | |
1295 | diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c |
1296 | index b06f5f55ada9..52c81c49cc7d 100644 |
1297 | --- a/drivers/acpi/acpi_processor.c |
1298 | +++ b/drivers/acpi/acpi_processor.c |
1299 | @@ -405,7 +405,6 @@ static int acpi_processor_add(struct acpi_device *device, |
1300 | goto err; |
1301 | |
1302 | pr->dev = dev; |
1303 | - dev->offline = pr->flags.need_hotplug_init; |
1304 | |
1305 | /* Trigger the processor driver's .probe() if present. */ |
1306 | if (device_attach(dev) >= 0) |
1307 | diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h |
1308 | index 4ed1aa384df2..514f34033f96 100644 |
1309 | --- a/drivers/acpi/acpica/acglobal.h |
1310 | +++ b/drivers/acpi/acpica/acglobal.h |
1311 | @@ -132,9 +132,9 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_do_not_use_xsdt, FALSE); |
1312 | * address. Although ACPICA adheres to the ACPI specification which |
1313 | * requires the use of the corresponding 64-bit address if it is non-zero, |
1314 | * some machines have been found to have a corrupted non-zero 64-bit |
1315 | - * address. Default is FALSE, do not favor the 32-bit addresses. |
1316 | + * address. Default is TRUE, favor the 32-bit addresses. |
1317 | */ |
1318 | -u8 ACPI_INIT_GLOBAL(acpi_gbl_use32_bit_fadt_addresses, FALSE); |
1319 | +u8 ACPI_INIT_GLOBAL(acpi_gbl_use32_bit_fadt_addresses, TRUE); |
1320 | |
1321 | /* |
1322 | * Optionally truncate I/O addresses to 16 bits. Provides compatibility |
1323 | diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c |
1324 | index 6412d3c301cb..1bc879ec83d4 100644 |
1325 | --- a/drivers/acpi/acpica/tbutils.c |
1326 | +++ b/drivers/acpi/acpica/tbutils.c |
1327 | @@ -461,6 +461,7 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address) |
1328 | u32 table_count; |
1329 | struct acpi_table_header *table; |
1330 | acpi_physical_address address; |
1331 | + acpi_physical_address rsdt_address; |
1332 | u32 length; |
1333 | u8 *table_entry; |
1334 | acpi_status status; |
1335 | @@ -488,11 +489,14 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address) |
1336 | * as per the ACPI specification. |
1337 | */ |
1338 | address = (acpi_physical_address) rsdp->xsdt_physical_address; |
1339 | + rsdt_address = |
1340 | + (acpi_physical_address) rsdp->rsdt_physical_address; |
1341 | table_entry_size = ACPI_XSDT_ENTRY_SIZE; |
1342 | } else { |
1343 | /* Root table is an RSDT (32-bit physical addresses) */ |
1344 | |
1345 | address = (acpi_physical_address) rsdp->rsdt_physical_address; |
1346 | + rsdt_address = address; |
1347 | table_entry_size = ACPI_RSDT_ENTRY_SIZE; |
1348 | } |
1349 | |
1350 | @@ -515,8 +519,7 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address) |
1351 | |
1352 | /* Fall back to the RSDT */ |
1353 | |
1354 | - address = |
1355 | - (acpi_physical_address) rsdp->rsdt_physical_address; |
1356 | + address = rsdt_address; |
1357 | table_entry_size = ACPI_RSDT_ENTRY_SIZE; |
1358 | } |
1359 | } |
1360 | diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c |
1361 | index 797a6938d051..efa71d66e8b0 100644 |
1362 | --- a/drivers/acpi/battery.c |
1363 | +++ b/drivers/acpi/battery.c |
1364 | @@ -36,6 +36,12 @@ |
1365 | #include <linux/suspend.h> |
1366 | #include <asm/unaligned.h> |
1367 | |
1368 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1369 | +#include <linux/proc_fs.h> |
1370 | +#include <linux/seq_file.h> |
1371 | +#include <asm/uaccess.h> |
1372 | +#endif |
1373 | + |
1374 | #include <linux/acpi.h> |
1375 | #include <linux/power_supply.h> |
1376 | |
1377 | @@ -66,6 +72,19 @@ static unsigned int cache_time = 1000; |
1378 | module_param(cache_time, uint, 0644); |
1379 | MODULE_PARM_DESC(cache_time, "cache time in milliseconds"); |
1380 | |
1381 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1382 | +extern struct proc_dir_entry *acpi_lock_battery_dir(void); |
1383 | +extern void *acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir); |
1384 | + |
1385 | +enum acpi_battery_files { |
1386 | + info_tag = 0, |
1387 | + state_tag, |
1388 | + alarm_tag, |
1389 | + ACPI_BATTERY_NUMFILES, |
1390 | +}; |
1391 | + |
1392 | +#endif |
1393 | + |
1394 | static const struct acpi_device_id battery_device_ids[] = { |
1395 | {"PNP0C0A", 0}, |
1396 | {"", 0}, |
1397 | @@ -301,6 +320,14 @@ static enum power_supply_property energy_battery_props[] = { |
1398 | POWER_SUPPLY_PROP_SERIAL_NUMBER, |
1399 | }; |
1400 | |
1401 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1402 | +inline char *acpi_battery_units(struct acpi_battery *battery) |
1403 | +{ |
1404 | + return (battery->power_unit == ACPI_BATTERY_POWER_UNIT_MA) ? |
1405 | + "mA" : "mW"; |
1406 | +} |
1407 | +#endif |
1408 | + |
1409 | /* -------------------------------------------------------------------------- |
1410 | Battery Management |
1411 | -------------------------------------------------------------------------- */ |
1412 | @@ -719,6 +746,279 @@ static void acpi_battery_refresh(struct acpi_battery *battery) |
1413 | } |
1414 | |
1415 | /* -------------------------------------------------------------------------- |
1416 | + FS Interface (/proc) |
1417 | + -------------------------------------------------------------------------- */ |
1418 | + |
1419 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1420 | +static struct proc_dir_entry *acpi_battery_dir; |
1421 | + |
1422 | +static int acpi_battery_print_info(struct seq_file *seq, int result) |
1423 | +{ |
1424 | + struct acpi_battery *battery = seq->private; |
1425 | + |
1426 | + if (result) |
1427 | + goto end; |
1428 | + |
1429 | + seq_printf(seq, "present: %s\n", |
1430 | + acpi_battery_present(battery) ? "yes" : "no"); |
1431 | + if (!acpi_battery_present(battery)) |
1432 | + goto end; |
1433 | + if (battery->design_capacity == ACPI_BATTERY_VALUE_UNKNOWN) |
1434 | + seq_printf(seq, "design capacity: unknown\n"); |
1435 | + else |
1436 | + seq_printf(seq, "design capacity: %d %sh\n", |
1437 | + battery->design_capacity, |
1438 | + acpi_battery_units(battery)); |
1439 | + |
1440 | + if (battery->full_charge_capacity == ACPI_BATTERY_VALUE_UNKNOWN) |
1441 | + seq_printf(seq, "last full capacity: unknown\n"); |
1442 | + else |
1443 | + seq_printf(seq, "last full capacity: %d %sh\n", |
1444 | + battery->full_charge_capacity, |
1445 | + acpi_battery_units(battery)); |
1446 | + |
1447 | + seq_printf(seq, "battery technology: %srechargeable\n", |
1448 | + (!battery->technology)?"non-":""); |
1449 | + |
1450 | + if (battery->design_voltage == ACPI_BATTERY_VALUE_UNKNOWN) |
1451 | + seq_printf(seq, "design voltage: unknown\n"); |
1452 | + else |
1453 | + seq_printf(seq, "design voltage: %d mV\n", |
1454 | + battery->design_voltage); |
1455 | + seq_printf(seq, "design capacity warning: %d %sh\n", |
1456 | + battery->design_capacity_warning, |
1457 | + acpi_battery_units(battery)); |
1458 | + seq_printf(seq, "design capacity low: %d %sh\n", |
1459 | + battery->design_capacity_low, |
1460 | + acpi_battery_units(battery)); |
1461 | + seq_printf(seq, "cycle count: %i\n", battery->cycle_count); |
1462 | + seq_printf(seq, "capacity granularity 1: %d %sh\n", |
1463 | + battery->capacity_granularity_1, |
1464 | + acpi_battery_units(battery)); |
1465 | + seq_printf(seq, "capacity granularity 2: %d %sh\n", |
1466 | + battery->capacity_granularity_2, |
1467 | + acpi_battery_units(battery)); |
1468 | + seq_printf(seq, "model number: %s\n", battery->model_number); |
1469 | + seq_printf(seq, "serial number: %s\n", battery->serial_number); |
1470 | + seq_printf(seq, "battery type: %s\n", battery->type); |
1471 | + seq_printf(seq, "OEM info: %s\n", battery->oem_info); |
1472 | + end: |
1473 | + if (result) |
1474 | + seq_printf(seq, "ERROR: Unable to read battery info\n"); |
1475 | + return result; |
1476 | +} |
1477 | + |
1478 | +static int acpi_battery_print_state(struct seq_file *seq, int result) |
1479 | +{ |
1480 | + struct acpi_battery *battery = seq->private; |
1481 | + |
1482 | + if (result) |
1483 | + goto end; |
1484 | + |
1485 | + seq_printf(seq, "present: %s\n", |
1486 | + acpi_battery_present(battery) ? "yes" : "no"); |
1487 | + if (!acpi_battery_present(battery)) |
1488 | + goto end; |
1489 | + |
1490 | + seq_printf(seq, "capacity state: %s\n", |
1491 | + (battery->state & 0x04) ? "critical" : "ok"); |
1492 | + if ((battery->state & 0x01) && (battery->state & 0x02)) |
1493 | + seq_printf(seq, |
1494 | + "charging state: charging/discharging\n"); |
1495 | + else if (battery->state & 0x01) |
1496 | + seq_printf(seq, "charging state: discharging\n"); |
1497 | + else if (battery->state & 0x02) |
1498 | + seq_printf(seq, "charging state: charging\n"); |
1499 | + else |
1500 | + seq_printf(seq, "charging state: charged\n"); |
1501 | + |
1502 | + if (battery->rate_now == ACPI_BATTERY_VALUE_UNKNOWN) |
1503 | + seq_printf(seq, "present rate: unknown\n"); |
1504 | + else |
1505 | + seq_printf(seq, "present rate: %d %s\n", |
1506 | + battery->rate_now, acpi_battery_units(battery)); |
1507 | + |
1508 | + if (battery->capacity_now == ACPI_BATTERY_VALUE_UNKNOWN) |
1509 | + seq_printf(seq, "remaining capacity: unknown\n"); |
1510 | + else |
1511 | + seq_printf(seq, "remaining capacity: %d %sh\n", |
1512 | + battery->capacity_now, acpi_battery_units(battery)); |
1513 | + if (battery->voltage_now == ACPI_BATTERY_VALUE_UNKNOWN) |
1514 | + seq_printf(seq, "present voltage: unknown\n"); |
1515 | + else |
1516 | + seq_printf(seq, "present voltage: %d mV\n", |
1517 | + battery->voltage_now); |
1518 | + end: |
1519 | + if (result) |
1520 | + seq_printf(seq, "ERROR: Unable to read battery state\n"); |
1521 | + |
1522 | + return result; |
1523 | +} |
1524 | + |
1525 | +static int acpi_battery_print_alarm(struct seq_file *seq, int result) |
1526 | +{ |
1527 | + struct acpi_battery *battery = seq->private; |
1528 | + |
1529 | + if (result) |
1530 | + goto end; |
1531 | + |
1532 | + if (!acpi_battery_present(battery)) { |
1533 | + seq_printf(seq, "present: no\n"); |
1534 | + goto end; |
1535 | + } |
1536 | + seq_printf(seq, "alarm: "); |
1537 | + if (!battery->alarm) |
1538 | + seq_printf(seq, "unsupported\n"); |
1539 | + else |
1540 | + seq_printf(seq, "%u %sh\n", battery->alarm, |
1541 | + acpi_battery_units(battery)); |
1542 | + end: |
1543 | + if (result) |
1544 | + seq_printf(seq, "ERROR: Unable to read battery alarm\n"); |
1545 | + return result; |
1546 | +} |
1547 | + |
1548 | +static ssize_t acpi_battery_write_alarm(struct file *file, |
1549 | + const char __user * buffer, |
1550 | + size_t count, loff_t * ppos) |
1551 | +{ |
1552 | + int result = 0; |
1553 | + char alarm_string[12] = { '\0' }; |
1554 | + struct seq_file *m = file->private_data; |
1555 | + struct acpi_battery *battery = m->private; |
1556 | + |
1557 | + if (!battery || (count > sizeof(alarm_string) - 1)) |
1558 | + return -EINVAL; |
1559 | + if (!acpi_battery_present(battery)) { |
1560 | + result = -ENODEV; |
1561 | + goto end; |
1562 | + } |
1563 | + if (copy_from_user(alarm_string, buffer, count)) { |
1564 | + result = -EFAULT; |
1565 | + goto end; |
1566 | + } |
1567 | + alarm_string[count] = '\0'; |
1568 | + battery->alarm = simple_strtol(alarm_string, NULL, 0); |
1569 | + result = acpi_battery_set_alarm(battery); |
1570 | + end: |
1571 | + if (!result) |
1572 | + return count; |
1573 | + return result; |
1574 | +} |
1575 | + |
1576 | +typedef int(*print_func)(struct seq_file *seq, int result); |
1577 | + |
1578 | +static print_func acpi_print_funcs[ACPI_BATTERY_NUMFILES] = { |
1579 | + acpi_battery_print_info, |
1580 | + acpi_battery_print_state, |
1581 | + acpi_battery_print_alarm, |
1582 | +}; |
1583 | + |
1584 | +static int acpi_battery_read(int fid, struct seq_file *seq) |
1585 | +{ |
1586 | + struct acpi_battery *battery = seq->private; |
1587 | + int result = acpi_battery_update(battery); |
1588 | + return acpi_print_funcs[fid](seq, result); |
1589 | +} |
1590 | + |
1591 | +#define DECLARE_FILE_FUNCTIONS(_name) \ |
1592 | +static int acpi_battery_read_##_name(struct seq_file *seq, void *offset) \ |
1593 | +{ \ |
1594 | + return acpi_battery_read(_name##_tag, seq); \ |
1595 | +} \ |
1596 | +static int acpi_battery_##_name##_open_fs(struct inode *inode, struct file *file) \ |
1597 | +{ \ |
1598 | + return single_open(file, acpi_battery_read_##_name, PDE_DATA(inode)); \ |
1599 | +} |
1600 | + |
1601 | +DECLARE_FILE_FUNCTIONS(info); |
1602 | +DECLARE_FILE_FUNCTIONS(state); |
1603 | +DECLARE_FILE_FUNCTIONS(alarm); |
1604 | + |
1605 | +#undef DECLARE_FILE_FUNCTIONS |
1606 | + |
1607 | +#define FILE_DESCRIPTION_RO(_name) \ |
1608 | + { \ |
1609 | + .name = __stringify(_name), \ |
1610 | + .mode = S_IRUGO, \ |
1611 | + .ops = { \ |
1612 | + .open = acpi_battery_##_name##_open_fs, \ |
1613 | + .read = seq_read, \ |
1614 | + .llseek = seq_lseek, \ |
1615 | + .release = single_release, \ |
1616 | + .owner = THIS_MODULE, \ |
1617 | + }, \ |
1618 | + } |
1619 | + |
1620 | +#define FILE_DESCRIPTION_RW(_name) \ |
1621 | + { \ |
1622 | + .name = __stringify(_name), \ |
1623 | + .mode = S_IFREG | S_IRUGO | S_IWUSR, \ |
1624 | + .ops = { \ |
1625 | + .open = acpi_battery_##_name##_open_fs, \ |
1626 | + .read = seq_read, \ |
1627 | + .llseek = seq_lseek, \ |
1628 | + .write = acpi_battery_write_##_name, \ |
1629 | + .release = single_release, \ |
1630 | + .owner = THIS_MODULE, \ |
1631 | + }, \ |
1632 | + } |
1633 | + |
1634 | +static const struct battery_file { |
1635 | + struct file_operations ops; |
1636 | + umode_t mode; |
1637 | + const char *name; |
1638 | +} acpi_battery_file[] = { |
1639 | + FILE_DESCRIPTION_RO(info), |
1640 | + FILE_DESCRIPTION_RO(state), |
1641 | + FILE_DESCRIPTION_RW(alarm), |
1642 | +}; |
1643 | + |
1644 | +#undef FILE_DESCRIPTION_RO |
1645 | +#undef FILE_DESCRIPTION_RW |
1646 | + |
1647 | +static int acpi_battery_add_fs(struct acpi_device *device) |
1648 | +{ |
1649 | + struct proc_dir_entry *entry = NULL; |
1650 | + int i; |
1651 | + |
1652 | + printk(KERN_WARNING PREFIX "Deprecated procfs I/F for battery is loaded," |
1653 | + " please retry with CONFIG_ACPI_PROCFS_POWER cleared\n"); |
1654 | + if (!acpi_device_dir(device)) { |
1655 | + acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device), |
1656 | + acpi_battery_dir); |
1657 | + if (!acpi_device_dir(device)) |
1658 | + return -ENODEV; |
1659 | + } |
1660 | + |
1661 | + for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i) { |
1662 | + entry = proc_create_data(acpi_battery_file[i].name, |
1663 | + acpi_battery_file[i].mode, |
1664 | + acpi_device_dir(device), |
1665 | + &acpi_battery_file[i].ops, |
1666 | + acpi_driver_data(device)); |
1667 | + if (!entry) |
1668 | + return -ENODEV; |
1669 | + } |
1670 | + return 0; |
1671 | +} |
1672 | + |
1673 | +static void acpi_battery_remove_fs(struct acpi_device *device) |
1674 | +{ |
1675 | + int i; |
1676 | + if (!acpi_device_dir(device)) |
1677 | + return; |
1678 | + for (i = 0; i < ACPI_BATTERY_NUMFILES; ++i) |
1679 | + remove_proc_entry(acpi_battery_file[i].name, |
1680 | + acpi_device_dir(device)); |
1681 | + |
1682 | + remove_proc_entry(acpi_device_bid(device), acpi_battery_dir); |
1683 | + acpi_device_dir(device) = NULL; |
1684 | +} |
1685 | + |
1686 | +#endif |
1687 | + |
1688 | +/* -------------------------------------------------------------------------- |
1689 | Driver Interface |
1690 | -------------------------------------------------------------------------- */ |
1691 | |
1692 | @@ -791,6 +1091,15 @@ static int acpi_battery_add(struct acpi_device *device) |
1693 | result = acpi_battery_update(battery); |
1694 | if (result) |
1695 | goto fail; |
1696 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1697 | + result = acpi_battery_add_fs(device); |
1698 | +#endif |
1699 | + if (result) { |
1700 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1701 | + acpi_battery_remove_fs(device); |
1702 | +#endif |
1703 | + goto fail; |
1704 | + } |
1705 | |
1706 | printk(KERN_INFO PREFIX "%s Slot [%s] (battery %s)\n", |
1707 | ACPI_BATTERY_DEVICE_NAME, acpi_device_bid(device), |
1708 | @@ -817,6 +1126,9 @@ static int acpi_battery_remove(struct acpi_device *device) |
1709 | return -EINVAL; |
1710 | battery = acpi_driver_data(device); |
1711 | unregister_pm_notifier(&battery->pm_nb); |
1712 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1713 | + acpi_battery_remove_fs(device); |
1714 | +#endif |
1715 | sysfs_remove_battery(battery); |
1716 | mutex_destroy(&battery->lock); |
1717 | mutex_destroy(&battery->sysfs_lock); |
1718 | @@ -867,7 +1179,19 @@ static void __init acpi_battery_init_async(void *unused, async_cookie_t cookie) |
1719 | |
1720 | if (dmi_check_system(bat_dmi_table)) |
1721 | battery_bix_broken_package = 1; |
1722 | - acpi_bus_register_driver(&acpi_battery_driver); |
1723 | + |
1724 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1725 | + acpi_battery_dir = acpi_lock_battery_dir(); |
1726 | + if (!acpi_battery_dir) |
1727 | + return; |
1728 | +#endif |
1729 | + if (acpi_bus_register_driver(&acpi_battery_driver) < 0) { |
1730 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1731 | + acpi_unlock_battery_dir(acpi_battery_dir); |
1732 | +#endif |
1733 | + return; |
1734 | + } |
1735 | + return; |
1736 | } |
1737 | |
1738 | static int __init acpi_battery_init(void) |
1739 | @@ -879,6 +1203,9 @@ static int __init acpi_battery_init(void) |
1740 | static void __exit acpi_battery_exit(void) |
1741 | { |
1742 | acpi_bus_unregister_driver(&acpi_battery_driver); |
1743 | +#ifdef CONFIG_ACPI_PROCFS_POWER |
1744 | + acpi_unlock_battery_dir(acpi_battery_dir); |
1745 | +#endif |
1746 | } |
1747 | |
1748 | module_init(acpi_battery_init); |
1749 | diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c |
1750 | index afec4526c48a..3d8413d02a97 100644 |
1751 | --- a/drivers/acpi/blacklist.c |
1752 | +++ b/drivers/acpi/blacklist.c |
1753 | @@ -314,6 +314,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
1754 | DMI_MATCH(DMI_PRODUCT_VERSION, "2349D15"), |
1755 | }, |
1756 | }, |
1757 | + { |
1758 | + .callback = dmi_disable_osi_win8, |
1759 | + .ident = "Dell Inspiron 7737", |
1760 | + .matches = { |
1761 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
1762 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7737"), |
1763 | + }, |
1764 | + }, |
1765 | |
1766 | /* |
1767 | * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
1768 | @@ -374,6 +382,19 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
1769 | DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T500"), |
1770 | }, |
1771 | }, |
1772 | + /* |
1773 | + * Without this this EEEpc exports a non working WMI interface, with |
1774 | + * this it exports a working "good old" eeepc_laptop interface, fixing |
1775 | + * both brightness control, and rfkill not working. |
1776 | + */ |
1777 | + { |
1778 | + .callback = dmi_enable_osi_linux, |
1779 | + .ident = "Asus EEE PC 1015PX", |
1780 | + .matches = { |
1781 | + DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK Computer INC."), |
1782 | + DMI_MATCH(DMI_PRODUCT_NAME, "1015PX"), |
1783 | + }, |
1784 | + }, |
1785 | {} |
1786 | }; |
1787 | |
1788 | diff --git a/drivers/acpi/cm_sbs.c b/drivers/acpi/cm_sbs.c |
1789 | new file mode 100644 |
1790 | index 000000000000..6c9ee68e46fb |
1791 | --- /dev/null |
1792 | +++ b/drivers/acpi/cm_sbs.c |
1793 | @@ -0,0 +1,105 @@ |
1794 | +/* |
1795 | + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
1796 | + * |
1797 | + * This program is free software; you can redistribute it and/or modify |
1798 | + * it under the terms of the GNU General Public License as published by |
1799 | + * the Free Software Foundation; either version 2 of the License, or (at |
1800 | + * your option) any later version. |
1801 | + * |
1802 | + * This program is distributed in the hope that it will be useful, but |
1803 | + * WITHOUT ANY WARRANTY; without even the implied warranty of |
1804 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
1805 | + * General Public License for more details. |
1806 | + * |
1807 | + * You should have received a copy of the GNU General Public License along |
1808 | + * with this program; if not, write to the Free Software Foundation, Inc., |
1809 | + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
1810 | + * |
1811 | + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
1812 | + */ |
1813 | + |
1814 | +#include <linux/kernel.h> |
1815 | +#include <linux/module.h> |
1816 | +#include <linux/init.h> |
1817 | +#include <linux/acpi.h> |
1818 | +#include <linux/types.h> |
1819 | +#include <linux/proc_fs.h> |
1820 | +#include <linux/seq_file.h> |
1821 | +#include <acpi/acpi_bus.h> |
1822 | +#include <acpi/acpi_drivers.h> |
1823 | + |
1824 | +#define PREFIX "ACPI: " |
1825 | + |
1826 | +ACPI_MODULE_NAME("cm_sbs"); |
1827 | +#define ACPI_AC_CLASS "ac_adapter" |
1828 | +#define ACPI_BATTERY_CLASS "battery" |
1829 | +#define _COMPONENT ACPI_SBS_COMPONENT |
1830 | +static struct proc_dir_entry *acpi_ac_dir; |
1831 | +static struct proc_dir_entry *acpi_battery_dir; |
1832 | + |
1833 | +static DEFINE_MUTEX(cm_sbs_mutex); |
1834 | + |
1835 | +static int lock_ac_dir_cnt; |
1836 | +static int lock_battery_dir_cnt; |
1837 | + |
1838 | +struct proc_dir_entry *acpi_lock_ac_dir(void) |
1839 | +{ |
1840 | + mutex_lock(&cm_sbs_mutex); |
1841 | + if (!acpi_ac_dir) |
1842 | + acpi_ac_dir = proc_mkdir(ACPI_AC_CLASS, acpi_root_dir); |
1843 | + if (acpi_ac_dir) { |
1844 | + lock_ac_dir_cnt++; |
1845 | + } else { |
1846 | + printk(KERN_ERR PREFIX |
1847 | + "Cannot create %s\n", ACPI_AC_CLASS); |
1848 | + } |
1849 | + mutex_unlock(&cm_sbs_mutex); |
1850 | + return acpi_ac_dir; |
1851 | +} |
1852 | +EXPORT_SYMBOL(acpi_lock_ac_dir); |
1853 | + |
1854 | +void acpi_unlock_ac_dir(struct proc_dir_entry *acpi_ac_dir_param) |
1855 | +{ |
1856 | + mutex_lock(&cm_sbs_mutex); |
1857 | + if (acpi_ac_dir_param) |
1858 | + lock_ac_dir_cnt--; |
1859 | + if (lock_ac_dir_cnt == 0 && acpi_ac_dir_param && acpi_ac_dir) { |
1860 | + remove_proc_entry(ACPI_AC_CLASS, acpi_root_dir); |
1861 | + acpi_ac_dir = NULL; |
1862 | + } |
1863 | + mutex_unlock(&cm_sbs_mutex); |
1864 | +} |
1865 | +EXPORT_SYMBOL(acpi_unlock_ac_dir); |
1866 | + |
1867 | +struct proc_dir_entry *acpi_lock_battery_dir(void) |
1868 | +{ |
1869 | + mutex_lock(&cm_sbs_mutex); |
1870 | + if (!acpi_battery_dir) { |
1871 | + acpi_battery_dir = |
1872 | + proc_mkdir(ACPI_BATTERY_CLASS, acpi_root_dir); |
1873 | + } |
1874 | + if (acpi_battery_dir) { |
1875 | + lock_battery_dir_cnt++; |
1876 | + } else { |
1877 | + printk(KERN_ERR PREFIX |
1878 | + "Cannot create %s\n", ACPI_BATTERY_CLASS); |
1879 | + } |
1880 | + mutex_unlock(&cm_sbs_mutex); |
1881 | + return acpi_battery_dir; |
1882 | +} |
1883 | +EXPORT_SYMBOL(acpi_lock_battery_dir); |
1884 | + |
1885 | +void acpi_unlock_battery_dir(struct proc_dir_entry *acpi_battery_dir_param) |
1886 | +{ |
1887 | + mutex_lock(&cm_sbs_mutex); |
1888 | + if (acpi_battery_dir_param) |
1889 | + lock_battery_dir_cnt--; |
1890 | + if (lock_battery_dir_cnt == 0 && acpi_battery_dir_param |
1891 | + && acpi_battery_dir) { |
1892 | + remove_proc_entry(ACPI_BATTERY_CLASS, acpi_root_dir); |
1893 | + acpi_battery_dir = NULL; |
1894 | + } |
1895 | + mutex_unlock(&cm_sbs_mutex); |
1896 | + return; |
1897 | +} |
1898 | +EXPORT_SYMBOL(acpi_unlock_battery_dir); |
1899 | diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c |
1900 | index d7d32c28829b..ad11ba4a412d 100644 |
1901 | --- a/drivers/acpi/ec.c |
1902 | +++ b/drivers/acpi/ec.c |
1903 | @@ -206,13 +206,13 @@ unlock: |
1904 | spin_unlock_irqrestore(&ec->lock, flags); |
1905 | } |
1906 | |
1907 | -static int acpi_ec_sync_query(struct acpi_ec *ec); |
1908 | +static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data); |
1909 | |
1910 | static int ec_check_sci_sync(struct acpi_ec *ec, u8 state) |
1911 | { |
1912 | if (state & ACPI_EC_FLAG_SCI) { |
1913 | if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags)) |
1914 | - return acpi_ec_sync_query(ec); |
1915 | + return acpi_ec_sync_query(ec, NULL); |
1916 | } |
1917 | return 0; |
1918 | } |
1919 | @@ -443,10 +443,8 @@ acpi_handle ec_get_handle(void) |
1920 | |
1921 | EXPORT_SYMBOL(ec_get_handle); |
1922 | |
1923 | -static int acpi_ec_query_unlocked(struct acpi_ec *ec, u8 *data); |
1924 | - |
1925 | /* |
1926 | - * Clears stale _Q events that might have accumulated in the EC. |
1927 | + * Process _Q events that might have accumulated in the EC. |
1928 | * Run with locked ec mutex. |
1929 | */ |
1930 | static void acpi_ec_clear(struct acpi_ec *ec) |
1931 | @@ -455,7 +453,7 @@ static void acpi_ec_clear(struct acpi_ec *ec) |
1932 | u8 value = 0; |
1933 | |
1934 | for (i = 0; i < ACPI_EC_CLEAR_MAX; i++) { |
1935 | - status = acpi_ec_query_unlocked(ec, &value); |
1936 | + status = acpi_ec_sync_query(ec, &value); |
1937 | if (status || !value) |
1938 | break; |
1939 | } |
1940 | @@ -582,13 +580,18 @@ static void acpi_ec_run(void *cxt) |
1941 | kfree(handler); |
1942 | } |
1943 | |
1944 | -static int acpi_ec_sync_query(struct acpi_ec *ec) |
1945 | +static int acpi_ec_sync_query(struct acpi_ec *ec, u8 *data) |
1946 | { |
1947 | u8 value = 0; |
1948 | int status; |
1949 | struct acpi_ec_query_handler *handler, *copy; |
1950 | - if ((status = acpi_ec_query_unlocked(ec, &value))) |
1951 | + |
1952 | + status = acpi_ec_query_unlocked(ec, &value); |
1953 | + if (data) |
1954 | + *data = value; |
1955 | + if (status) |
1956 | return status; |
1957 | + |
1958 | list_for_each_entry(handler, &ec->list, node) { |
1959 | if (value == handler->query_bit) { |
1960 | /* have custom handler for this bit */ |
1961 | @@ -612,7 +615,7 @@ static void acpi_ec_gpe_query(void *ec_cxt) |
1962 | if (!ec) |
1963 | return; |
1964 | mutex_lock(&ec->mutex); |
1965 | - acpi_ec_sync_query(ec); |
1966 | + acpi_ec_sync_query(ec, NULL); |
1967 | mutex_unlock(&ec->mutex); |
1968 | } |
1969 | |
1970 | diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c |
1971 | index b6ba88ed31ae..bb0b90461a6b 100644 |
1972 | --- a/drivers/acpi/video.c |
1973 | +++ b/drivers/acpi/video.c |
1974 | @@ -459,10 +459,10 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
1975 | }, |
1976 | { |
1977 | .callback = video_set_use_native_backlight, |
1978 | - .ident = "ThinkPad T430s", |
1979 | + .ident = "ThinkPad T430 and T430s", |
1980 | .matches = { |
1981 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
1982 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430s"), |
1983 | + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T430"), |
1984 | }, |
1985 | }, |
1986 | { |
1987 | @@ -474,7 +474,7 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
1988 | }, |
1989 | }, |
1990 | { |
1991 | - .callback = video_set_use_native_backlight, |
1992 | + .callback = video_set_use_native_backlight, |
1993 | .ident = "ThinkPad X1 Carbon", |
1994 | .matches = { |
1995 | DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
1996 | @@ -494,7 +494,7 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
1997 | .ident = "Dell Inspiron 7520", |
1998 | .matches = { |
1999 | DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
2000 | - DMI_MATCH(DMI_PRODUCT_VERSION, "Inspiron 7520"), |
2001 | + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 7520"), |
2002 | }, |
2003 | }, |
2004 | { |
2005 | @@ -507,6 +507,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = { |
2006 | }, |
2007 | { |
2008 | .callback = video_set_use_native_backlight, |
2009 | + .ident = "Acer Aspire 5742G", |
2010 | + .matches = { |
2011 | + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
2012 | + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5742G"), |
2013 | + }, |
2014 | + }, |
2015 | + { |
2016 | + .callback = video_set_use_native_backlight, |
2017 | .ident = "Acer Aspire V5-431", |
2018 | .matches = { |
2019 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
2020 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
2021 | index 0a79c540169c..bb26636f10c8 100644 |
2022 | --- a/drivers/ata/libata-core.c |
2023 | +++ b/drivers/ata/libata-core.c |
2024 | @@ -6329,6 +6329,8 @@ int ata_host_activate(struct ata_host *host, int irq, |
2025 | static void ata_port_detach(struct ata_port *ap) |
2026 | { |
2027 | unsigned long flags; |
2028 | + struct ata_link *link; |
2029 | + struct ata_device *dev; |
2030 | |
2031 | if (!ap->ops->error_handler) |
2032 | goto skip_eh; |
2033 | @@ -6348,6 +6350,13 @@ static void ata_port_detach(struct ata_port *ap) |
2034 | cancel_delayed_work_sync(&ap->hotplug_task); |
2035 | |
2036 | skip_eh: |
2037 | + /* clean up zpodd on port removal */ |
2038 | + ata_for_each_link(link, ap, HOST_FIRST) { |
2039 | + ata_for_each_dev(dev, link, ALL) { |
2040 | + if (zpodd_dev_enabled(dev)) |
2041 | + zpodd_exit(dev); |
2042 | + } |
2043 | + } |
2044 | if (ap->pmp_link) { |
2045 | int i; |
2046 | for (i = 0; i < SATA_PMP_MAX_PORTS; i++) |
2047 | diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c |
2048 | index d63ee8f41a4f..e3a49df958a3 100644 |
2049 | --- a/drivers/ata/pata_at91.c |
2050 | +++ b/drivers/ata/pata_at91.c |
2051 | @@ -408,12 +408,13 @@ static int pata_at91_probe(struct platform_device *pdev) |
2052 | |
2053 | host->private_data = info; |
2054 | |
2055 | - return ata_host_activate(host, gpio_is_valid(irq) ? gpio_to_irq(irq) : 0, |
2056 | - gpio_is_valid(irq) ? ata_sff_interrupt : NULL, |
2057 | - irq_flags, &pata_at91_sht); |
2058 | + ret = ata_host_activate(host, gpio_is_valid(irq) ? gpio_to_irq(irq) : 0, |
2059 | + gpio_is_valid(irq) ? ata_sff_interrupt : NULL, |
2060 | + irq_flags, &pata_at91_sht); |
2061 | + if (ret) |
2062 | + goto err_put; |
2063 | |
2064 | - if (!ret) |
2065 | - return 0; |
2066 | + return 0; |
2067 | |
2068 | err_put: |
2069 | clk_put(info->mck); |
2070 | diff --git a/drivers/base/dd.c b/drivers/base/dd.c |
2071 | index 06051767393f..8a8d611f2021 100644 |
2072 | --- a/drivers/base/dd.c |
2073 | +++ b/drivers/base/dd.c |
2074 | @@ -52,6 +52,7 @@ static DEFINE_MUTEX(deferred_probe_mutex); |
2075 | static LIST_HEAD(deferred_probe_pending_list); |
2076 | static LIST_HEAD(deferred_probe_active_list); |
2077 | static struct workqueue_struct *deferred_wq; |
2078 | +static atomic_t deferred_trigger_count = ATOMIC_INIT(0); |
2079 | |
2080 | /** |
2081 | * deferred_probe_work_func() - Retry probing devices in the active list. |
2082 | @@ -135,6 +136,17 @@ static bool driver_deferred_probe_enable = false; |
2083 | * This functions moves all devices from the pending list to the active |
2084 | * list and schedules the deferred probe workqueue to process them. It |
2085 | * should be called anytime a driver is successfully bound to a device. |
2086 | + * |
2087 | + * Note, there is a race condition in multi-threaded probe. In the case where |
2088 | + * more than one device is probing at the same time, it is possible for one |
2089 | + * probe to complete successfully while another is about to defer. If the second |
2090 | + * depends on the first, then it will get put on the pending list after the |
2091 | + * trigger event has already occured and will be stuck there. |
2092 | + * |
2093 | + * The atomic 'deferred_trigger_count' is used to determine if a successful |
2094 | + * trigger has occurred in the midst of probing a driver. If the trigger count |
2095 | + * changes in the midst of a probe, then deferred processing should be triggered |
2096 | + * again. |
2097 | */ |
2098 | static void driver_deferred_probe_trigger(void) |
2099 | { |
2100 | @@ -147,6 +159,7 @@ static void driver_deferred_probe_trigger(void) |
2101 | * into the active list so they can be retried by the workqueue |
2102 | */ |
2103 | mutex_lock(&deferred_probe_mutex); |
2104 | + atomic_inc(&deferred_trigger_count); |
2105 | list_splice_tail_init(&deferred_probe_pending_list, |
2106 | &deferred_probe_active_list); |
2107 | mutex_unlock(&deferred_probe_mutex); |
2108 | @@ -265,6 +278,7 @@ static DECLARE_WAIT_QUEUE_HEAD(probe_waitqueue); |
2109 | static int really_probe(struct device *dev, struct device_driver *drv) |
2110 | { |
2111 | int ret = 0; |
2112 | + int local_trigger_count = atomic_read(&deferred_trigger_count); |
2113 | |
2114 | atomic_inc(&probe_count); |
2115 | pr_debug("bus: '%s': %s: probing driver %s with device %s\n", |
2116 | @@ -310,6 +324,9 @@ probe_failed: |
2117 | /* Driver requested deferred probing */ |
2118 | dev_info(dev, "Driver %s requests probe deferral\n", drv->name); |
2119 | driver_deferred_probe_add(dev); |
2120 | + /* Did a trigger occur while probing? Need to re-trigger if yes */ |
2121 | + if (local_trigger_count != atomic_read(&deferred_trigger_count)) |
2122 | + driver_deferred_probe_trigger(); |
2123 | } else if (ret != -ENODEV && ret != -ENXIO) { |
2124 | /* driver matched but the probe failed */ |
2125 | printk(KERN_WARNING |
2126 | diff --git a/drivers/base/platform.c b/drivers/base/platform.c |
2127 | index bc78848dd59a..3c51eb0bd659 100644 |
2128 | --- a/drivers/base/platform.c |
2129 | +++ b/drivers/base/platform.c |
2130 | @@ -13,6 +13,7 @@ |
2131 | #include <linux/string.h> |
2132 | #include <linux/platform_device.h> |
2133 | #include <linux/of_device.h> |
2134 | +#include <linux/of_irq.h> |
2135 | #include <linux/module.h> |
2136 | #include <linux/init.h> |
2137 | #include <linux/dma-mapping.h> |
2138 | @@ -87,7 +88,11 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) |
2139 | return -ENXIO; |
2140 | return dev->archdata.irqs[num]; |
2141 | #else |
2142 | - struct resource *r = platform_get_resource(dev, IORESOURCE_IRQ, num); |
2143 | + struct resource *r; |
2144 | + if (IS_ENABLED(CONFIG_OF_IRQ) && dev->dev.of_node) |
2145 | + return of_irq_get(dev->dev.of_node, num); |
2146 | + |
2147 | + r = platform_get_resource(dev, IORESOURCE_IRQ, num); |
2148 | |
2149 | return r ? r->start : -ENXIO; |
2150 | #endif |
2151 | diff --git a/drivers/base/topology.c b/drivers/base/topology.c |
2152 | index 94ffee378f10..37a5661ca5f9 100644 |
2153 | --- a/drivers/base/topology.c |
2154 | +++ b/drivers/base/topology.c |
2155 | @@ -40,8 +40,7 @@ |
2156 | static ssize_t show_##name(struct device *dev, \ |
2157 | struct device_attribute *attr, char *buf) \ |
2158 | { \ |
2159 | - unsigned int cpu = dev->id; \ |
2160 | - return sprintf(buf, "%d\n", topology_##name(cpu)); \ |
2161 | + return sprintf(buf, "%d\n", topology_##name(dev->id)); \ |
2162 | } |
2163 | |
2164 | #if defined(topology_thread_cpumask) || defined(topology_core_cpumask) || \ |
2165 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c |
2166 | index 106d1d8e16ad..b11949c5b029 100644 |
2167 | --- a/drivers/bluetooth/ath3k.c |
2168 | +++ b/drivers/bluetooth/ath3k.c |
2169 | @@ -82,6 +82,7 @@ static const struct usb_device_id ath3k_table[] = { |
2170 | { USB_DEVICE(0x04CA, 0x3004) }, |
2171 | { USB_DEVICE(0x04CA, 0x3005) }, |
2172 | { USB_DEVICE(0x04CA, 0x3006) }, |
2173 | + { USB_DEVICE(0x04CA, 0x3007) }, |
2174 | { USB_DEVICE(0x04CA, 0x3008) }, |
2175 | { USB_DEVICE(0x04CA, 0x300b) }, |
2176 | { USB_DEVICE(0x13d3, 0x3362) }, |
2177 | @@ -127,6 +128,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = { |
2178 | { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, |
2179 | { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, |
2180 | { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 }, |
2181 | + { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 }, |
2182 | { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 }, |
2183 | { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 }, |
2184 | { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, |
2185 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c |
2186 | index baeaaed299e4..1c7b5040d921 100644 |
2187 | --- a/drivers/bluetooth/btusb.c |
2188 | +++ b/drivers/bluetooth/btusb.c |
2189 | @@ -149,6 +149,7 @@ static const struct usb_device_id blacklist_table[] = { |
2190 | { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 }, |
2191 | { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, |
2192 | { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 }, |
2193 | + { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 }, |
2194 | { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 }, |
2195 | { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 }, |
2196 | { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 }, |
2197 | @@ -1478,10 +1479,8 @@ static int btusb_probe(struct usb_interface *intf, |
2198 | if (id->driver_info & BTUSB_BCM92035) |
2199 | hdev->setup = btusb_setup_bcm92035; |
2200 | |
2201 | - if (id->driver_info & BTUSB_INTEL) { |
2202 | - usb_enable_autosuspend(data->udev); |
2203 | + if (id->driver_info & BTUSB_INTEL) |
2204 | hdev->setup = btusb_setup_intel; |
2205 | - } |
2206 | |
2207 | /* Interface numbers are hardcoded in the specification */ |
2208 | data->isoc = usb_ifnum_to_if(data->udev, 1); |
2209 | diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c |
2210 | index 725c46162bbd..372ae72cce34 100644 |
2211 | --- a/drivers/bus/mvebu-mbus.c |
2212 | +++ b/drivers/bus/mvebu-mbus.c |
2213 | @@ -222,12 +222,6 @@ static int mvebu_mbus_window_conflicts(struct mvebu_mbus_state *mbus, |
2214 | */ |
2215 | if ((u64)base < wend && end > wbase) |
2216 | return 0; |
2217 | - |
2218 | - /* |
2219 | - * Check if target/attribute conflicts |
2220 | - */ |
2221 | - if (target == wtarget && attr == wattr) |
2222 | - return 0; |
2223 | } |
2224 | |
2225 | return 1; |
2226 | diff --git a/drivers/char/ipmi/ipmi_kcs_sm.c b/drivers/char/ipmi/ipmi_kcs_sm.c |
2227 | index 6a4bdc18955a..8c25f596808a 100644 |
2228 | --- a/drivers/char/ipmi/ipmi_kcs_sm.c |
2229 | +++ b/drivers/char/ipmi/ipmi_kcs_sm.c |
2230 | @@ -251,8 +251,9 @@ static inline int check_obf(struct si_sm_data *kcs, unsigned char status, |
2231 | if (!GET_STATUS_OBF(status)) { |
2232 | kcs->obf_timeout -= time; |
2233 | if (kcs->obf_timeout < 0) { |
2234 | - start_error_recovery(kcs, "OBF not ready in time"); |
2235 | - return 1; |
2236 | + kcs->obf_timeout = OBF_RETRY_TIMEOUT; |
2237 | + start_error_recovery(kcs, "OBF not ready in time"); |
2238 | + return 1; |
2239 | } |
2240 | return 0; |
2241 | } |
2242 | diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c |
2243 | index 03f41896d090..8b4fa2c4e661 100644 |
2244 | --- a/drivers/char/ipmi/ipmi_si_intf.c |
2245 | +++ b/drivers/char/ipmi/ipmi_si_intf.c |
2246 | @@ -249,6 +249,9 @@ struct smi_info { |
2247 | /* The timer for this si. */ |
2248 | struct timer_list si_timer; |
2249 | |
2250 | + /* This flag is set, if the timer is running (timer_pending() isn't enough) */ |
2251 | + bool timer_running; |
2252 | + |
2253 | /* The time (in jiffies) the last timeout occurred at. */ |
2254 | unsigned long last_timeout_jiffies; |
2255 | |
2256 | @@ -435,6 +438,13 @@ static void start_clear_flags(struct smi_info *smi_info) |
2257 | smi_info->si_state = SI_CLEARING_FLAGS; |
2258 | } |
2259 | |
2260 | +static void smi_mod_timer(struct smi_info *smi_info, unsigned long new_val) |
2261 | +{ |
2262 | + smi_info->last_timeout_jiffies = jiffies; |
2263 | + mod_timer(&smi_info->si_timer, new_val); |
2264 | + smi_info->timer_running = true; |
2265 | +} |
2266 | + |
2267 | /* |
2268 | * When we have a situtaion where we run out of memory and cannot |
2269 | * allocate messages, we just leave them in the BMC and run the system |
2270 | @@ -447,8 +457,7 @@ static inline void disable_si_irq(struct smi_info *smi_info) |
2271 | start_disable_irq(smi_info); |
2272 | smi_info->interrupt_disabled = 1; |
2273 | if (!atomic_read(&smi_info->stop_operation)) |
2274 | - mod_timer(&smi_info->si_timer, |
2275 | - jiffies + SI_TIMEOUT_JIFFIES); |
2276 | + smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); |
2277 | } |
2278 | } |
2279 | |
2280 | @@ -908,15 +917,7 @@ static void sender(void *send_info, |
2281 | list_add_tail(&msg->link, &smi_info->xmit_msgs); |
2282 | |
2283 | if (smi_info->si_state == SI_NORMAL && smi_info->curr_msg == NULL) { |
2284 | - /* |
2285 | - * last_timeout_jiffies is updated here to avoid |
2286 | - * smi_timeout() handler passing very large time_diff |
2287 | - * value to smi_event_handler() that causes |
2288 | - * the send command to abort. |
2289 | - */ |
2290 | - smi_info->last_timeout_jiffies = jiffies; |
2291 | - |
2292 | - mod_timer(&smi_info->si_timer, jiffies + SI_TIMEOUT_JIFFIES); |
2293 | + smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); |
2294 | |
2295 | if (smi_info->thread) |
2296 | wake_up_process(smi_info->thread); |
2297 | @@ -1005,6 +1006,17 @@ static int ipmi_thread(void *data) |
2298 | |
2299 | spin_lock_irqsave(&(smi_info->si_lock), flags); |
2300 | smi_result = smi_event_handler(smi_info, 0); |
2301 | + |
2302 | + /* |
2303 | + * If the driver is doing something, there is a possible |
2304 | + * race with the timer. If the timer handler see idle, |
2305 | + * and the thread here sees something else, the timer |
2306 | + * handler won't restart the timer even though it is |
2307 | + * required. So start it here if necessary. |
2308 | + */ |
2309 | + if (smi_result != SI_SM_IDLE && !smi_info->timer_running) |
2310 | + smi_mod_timer(smi_info, jiffies + SI_TIMEOUT_JIFFIES); |
2311 | + |
2312 | spin_unlock_irqrestore(&(smi_info->si_lock), flags); |
2313 | busy_wait = ipmi_thread_busy_wait(smi_result, smi_info, |
2314 | &busy_until); |
2315 | @@ -1074,10 +1086,6 @@ static void smi_timeout(unsigned long data) |
2316 | * SI_USEC_PER_JIFFY); |
2317 | smi_result = smi_event_handler(smi_info, time_diff); |
2318 | |
2319 | - spin_unlock_irqrestore(&(smi_info->si_lock), flags); |
2320 | - |
2321 | - smi_info->last_timeout_jiffies = jiffies_now; |
2322 | - |
2323 | if ((smi_info->irq) && (!smi_info->interrupt_disabled)) { |
2324 | /* Running with interrupts, only do long timeouts. */ |
2325 | timeout = jiffies + SI_TIMEOUT_JIFFIES; |
2326 | @@ -1099,7 +1107,10 @@ static void smi_timeout(unsigned long data) |
2327 | |
2328 | do_mod_timer: |
2329 | if (smi_result != SI_SM_IDLE) |
2330 | - mod_timer(&(smi_info->si_timer), timeout); |
2331 | + smi_mod_timer(smi_info, timeout); |
2332 | + else |
2333 | + smi_info->timer_running = false; |
2334 | + spin_unlock_irqrestore(&(smi_info->si_lock), flags); |
2335 | } |
2336 | |
2337 | static irqreturn_t si_irq_handler(int irq, void *data) |
2338 | @@ -1147,8 +1158,7 @@ static int smi_start_processing(void *send_info, |
2339 | |
2340 | /* Set up the timer that drives the interface. */ |
2341 | setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi); |
2342 | - new_smi->last_timeout_jiffies = jiffies; |
2343 | - mod_timer(&new_smi->si_timer, jiffies + SI_TIMEOUT_JIFFIES); |
2344 | + smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES); |
2345 | |
2346 | /* |
2347 | * Check if the user forcefully enabled the daemon. |
2348 | diff --git a/drivers/char/tpm/tpm_ppi.c b/drivers/char/tpm/tpm_ppi.c |
2349 | index b3ea223585bd..61dcc8011ec7 100644 |
2350 | --- a/drivers/char/tpm/tpm_ppi.c |
2351 | +++ b/drivers/char/tpm/tpm_ppi.c |
2352 | @@ -328,13 +328,11 @@ int tpm_add_ppi(struct kobject *parent) |
2353 | /* Cache TPM ACPI handle and version string */ |
2354 | acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX, |
2355 | ppi_callback, NULL, NULL, &tpm_ppi_handle); |
2356 | - if (tpm_ppi_handle == NULL) |
2357 | - return -ENODEV; |
2358 | - |
2359 | - return sysfs_create_group(parent, &ppi_attr_grp); |
2360 | + return tpm_ppi_handle ? sysfs_create_group(parent, &ppi_attr_grp) : 0; |
2361 | } |
2362 | |
2363 | void tpm_remove_ppi(struct kobject *parent) |
2364 | { |
2365 | - sysfs_remove_group(parent, &ppi_attr_grp); |
2366 | + if (tpm_ppi_handle) |
2367 | + sysfs_remove_group(parent, &ppi_attr_grp); |
2368 | } |
2369 | diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c |
2370 | index c42e608af6bb..b94a311e5ab6 100644 |
2371 | --- a/drivers/clk/clk.c |
2372 | +++ b/drivers/clk/clk.c |
2373 | @@ -1977,9 +1977,28 @@ struct clk *__clk_register(struct device *dev, struct clk_hw *hw) |
2374 | } |
2375 | EXPORT_SYMBOL_GPL(__clk_register); |
2376 | |
2377 | -static int _clk_register(struct device *dev, struct clk_hw *hw, struct clk *clk) |
2378 | +/** |
2379 | + * clk_register - allocate a new clock, register it and return an opaque cookie |
2380 | + * @dev: device that is registering this clock |
2381 | + * @hw: link to hardware-specific clock data |
2382 | + * |
2383 | + * clk_register is the primary interface for populating the clock tree with new |
2384 | + * clock nodes. It returns a pointer to the newly allocated struct clk which |
2385 | + * cannot be dereferenced by driver code but may be used in conjuction with the |
2386 | + * rest of the clock API. In the event of an error clk_register will return an |
2387 | + * error code; drivers must test for an error code after calling clk_register. |
2388 | + */ |
2389 | +struct clk *clk_register(struct device *dev, struct clk_hw *hw) |
2390 | { |
2391 | int i, ret; |
2392 | + struct clk *clk; |
2393 | + |
2394 | + clk = kzalloc(sizeof(*clk), GFP_KERNEL); |
2395 | + if (!clk) { |
2396 | + pr_err("%s: could not allocate clk\n", __func__); |
2397 | + ret = -ENOMEM; |
2398 | + goto fail_out; |
2399 | + } |
2400 | |
2401 | clk->name = kstrdup(hw->init->name, GFP_KERNEL); |
2402 | if (!clk->name) { |
2403 | @@ -2019,7 +2038,7 @@ static int _clk_register(struct device *dev, struct clk_hw *hw, struct clk *clk) |
2404 | |
2405 | ret = __clk_init(dev, clk); |
2406 | if (!ret) |
2407 | - return 0; |
2408 | + return clk; |
2409 | |
2410 | fail_parent_names_copy: |
2411 | while (--i >= 0) |
2412 | @@ -2028,36 +2047,6 @@ fail_parent_names_copy: |
2413 | fail_parent_names: |
2414 | kfree(clk->name); |
2415 | fail_name: |
2416 | - return ret; |
2417 | -} |
2418 | - |
2419 | -/** |
2420 | - * clk_register - allocate a new clock, register it and return an opaque cookie |
2421 | - * @dev: device that is registering this clock |
2422 | - * @hw: link to hardware-specific clock data |
2423 | - * |
2424 | - * clk_register is the primary interface for populating the clock tree with new |
2425 | - * clock nodes. It returns a pointer to the newly allocated struct clk which |
2426 | - * cannot be dereferenced by driver code but may be used in conjuction with the |
2427 | - * rest of the clock API. In the event of an error clk_register will return an |
2428 | - * error code; drivers must test for an error code after calling clk_register. |
2429 | - */ |
2430 | -struct clk *clk_register(struct device *dev, struct clk_hw *hw) |
2431 | -{ |
2432 | - int ret; |
2433 | - struct clk *clk; |
2434 | - |
2435 | - clk = kzalloc(sizeof(*clk), GFP_KERNEL); |
2436 | - if (!clk) { |
2437 | - pr_err("%s: could not allocate clk\n", __func__); |
2438 | - ret = -ENOMEM; |
2439 | - goto fail_out; |
2440 | - } |
2441 | - |
2442 | - ret = _clk_register(dev, hw, clk); |
2443 | - if (!ret) |
2444 | - return clk; |
2445 | - |
2446 | kfree(clk); |
2447 | fail_out: |
2448 | return ERR_PTR(ret); |
2449 | @@ -2144,9 +2133,10 @@ void clk_unregister(struct clk *clk) |
2450 | |
2451 | if (!hlist_empty(&clk->children)) { |
2452 | struct clk *child; |
2453 | + struct hlist_node *t; |
2454 | |
2455 | /* Reparent all children to the orphan list. */ |
2456 | - hlist_for_each_entry(child, &clk->children, child_node) |
2457 | + hlist_for_each_entry_safe(child, t, &clk->children, child_node) |
2458 | clk_set_parent(child, NULL); |
2459 | } |
2460 | |
2461 | @@ -2166,7 +2156,7 @@ EXPORT_SYMBOL_GPL(clk_unregister); |
2462 | |
2463 | static void devm_clk_release(struct device *dev, void *res) |
2464 | { |
2465 | - clk_unregister(res); |
2466 | + clk_unregister(*(struct clk **)res); |
2467 | } |
2468 | |
2469 | /** |
2470 | @@ -2181,18 +2171,18 @@ static void devm_clk_release(struct device *dev, void *res) |
2471 | struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw) |
2472 | { |
2473 | struct clk *clk; |
2474 | - int ret; |
2475 | + struct clk **clkp; |
2476 | |
2477 | - clk = devres_alloc(devm_clk_release, sizeof(*clk), GFP_KERNEL); |
2478 | - if (!clk) |
2479 | + clkp = devres_alloc(devm_clk_release, sizeof(*clkp), GFP_KERNEL); |
2480 | + if (!clkp) |
2481 | return ERR_PTR(-ENOMEM); |
2482 | |
2483 | - ret = _clk_register(dev, hw, clk); |
2484 | - if (!ret) { |
2485 | - devres_add(dev, clk); |
2486 | + clk = clk_register(dev, hw); |
2487 | + if (!IS_ERR(clk)) { |
2488 | + *clkp = clk; |
2489 | + devres_add(dev, clkp); |
2490 | } else { |
2491 | - devres_free(clk); |
2492 | - clk = ERR_PTR(ret); |
2493 | + devres_free(clkp); |
2494 | } |
2495 | |
2496 | return clk; |
2497 | diff --git a/drivers/clk/tegra/clk-pll.c b/drivers/clk/tegra/clk-pll.c |
2498 | index 0d20241e0770..e1769addf435 100644 |
2499 | --- a/drivers/clk/tegra/clk-pll.c |
2500 | +++ b/drivers/clk/tegra/clk-pll.c |
2501 | @@ -1718,7 +1718,7 @@ struct clk *tegra_clk_register_plle_tegra114(const char *name, |
2502 | "pll_re_vco"); |
2503 | } else { |
2504 | val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL); |
2505 | - pll_writel(val, pll_params->aux_reg, pll); |
2506 | + pll_writel(val_aux, pll_params->aux_reg, pll); |
2507 | } |
2508 | |
2509 | clk = _tegra_clk_register_pll(pll, name, parent_name, flags, |
2510 | diff --git a/drivers/clk/versatile/clk-vexpress-osc.c b/drivers/clk/versatile/clk-vexpress-osc.c |
2511 | index 2dc8b41a339d..a535c7bf8574 100644 |
2512 | --- a/drivers/clk/versatile/clk-vexpress-osc.c |
2513 | +++ b/drivers/clk/versatile/clk-vexpress-osc.c |
2514 | @@ -102,7 +102,7 @@ void __init vexpress_osc_of_setup(struct device_node *node) |
2515 | |
2516 | osc = kzalloc(sizeof(*osc), GFP_KERNEL); |
2517 | if (!osc) |
2518 | - goto error; |
2519 | + return; |
2520 | |
2521 | osc->func = vexpress_config_func_get_by_node(node); |
2522 | if (!osc->func) { |
2523 | diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c |
2524 | index 48f76bc05da0..e252939b9ee1 100644 |
2525 | --- a/drivers/clocksource/exynos_mct.c |
2526 | +++ b/drivers/clocksource/exynos_mct.c |
2527 | @@ -418,8 +418,6 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) |
2528 | evt->set_mode = exynos4_tick_set_mode; |
2529 | evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; |
2530 | evt->rating = 450; |
2531 | - clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), |
2532 | - 0xf, 0x7fffffff); |
2533 | |
2534 | exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); |
2535 | |
2536 | @@ -432,9 +430,12 @@ static int exynos4_local_timer_setup(struct clock_event_device *evt) |
2537 | evt->irq); |
2538 | return -EIO; |
2539 | } |
2540 | + irq_force_affinity(mct_irqs[MCT_L0_IRQ + cpu], cpumask_of(cpu)); |
2541 | } else { |
2542 | enable_percpu_irq(mct_irqs[MCT_L0_IRQ], 0); |
2543 | } |
2544 | + clockevents_config_and_register(evt, clk_rate / (TICK_BASE_CNT + 1), |
2545 | + 0xf, 0x7fffffff); |
2546 | |
2547 | return 0; |
2548 | } |
2549 | @@ -452,7 +453,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, |
2550 | unsigned long action, void *hcpu) |
2551 | { |
2552 | struct mct_clock_event_device *mevt; |
2553 | - unsigned int cpu; |
2554 | |
2555 | /* |
2556 | * Grab cpu pointer in each case to avoid spurious |
2557 | @@ -463,12 +463,6 @@ static int exynos4_mct_cpu_notify(struct notifier_block *self, |
2558 | mevt = this_cpu_ptr(&percpu_mct_tick); |
2559 | exynos4_local_timer_setup(&mevt->evt); |
2560 | break; |
2561 | - case CPU_ONLINE: |
2562 | - cpu = (unsigned long)hcpu; |
2563 | - if (mct_int_type == MCT_INT_SPI) |
2564 | - irq_set_affinity(mct_irqs[MCT_L0_IRQ + cpu], |
2565 | - cpumask_of(cpu)); |
2566 | - break; |
2567 | case CPU_DYING: |
2568 | mevt = this_cpu_ptr(&percpu_mct_tick); |
2569 | exynos4_local_timer_stop(&mevt->evt); |
2570 | diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c |
2571 | index 2cd36b9297f3..9ac378380677 100644 |
2572 | --- a/drivers/cpufreq/intel_pstate.c |
2573 | +++ b/drivers/cpufreq/intel_pstate.c |
2574 | @@ -37,6 +37,7 @@ |
2575 | #define BYT_RATIOS 0x66a |
2576 | #define BYT_VIDS 0x66b |
2577 | #define BYT_TURBO_RATIOS 0x66c |
2578 | +#define BYT_TURBO_VIDS 0x66d |
2579 | |
2580 | |
2581 | #define FRAC_BITS 6 |
2582 | @@ -70,8 +71,9 @@ struct pstate_data { |
2583 | }; |
2584 | |
2585 | struct vid_data { |
2586 | - int32_t min; |
2587 | - int32_t max; |
2588 | + int min; |
2589 | + int max; |
2590 | + int turbo; |
2591 | int32_t ratio; |
2592 | }; |
2593 | |
2594 | @@ -360,14 +362,14 @@ static int byt_get_min_pstate(void) |
2595 | { |
2596 | u64 value; |
2597 | rdmsrl(BYT_RATIOS, value); |
2598 | - return (value >> 8) & 0xFF; |
2599 | + return (value >> 8) & 0x3F; |
2600 | } |
2601 | |
2602 | static int byt_get_max_pstate(void) |
2603 | { |
2604 | u64 value; |
2605 | rdmsrl(BYT_RATIOS, value); |
2606 | - return (value >> 16) & 0xFF; |
2607 | + return (value >> 16) & 0x3F; |
2608 | } |
2609 | |
2610 | static int byt_get_turbo_pstate(void) |
2611 | @@ -394,6 +396,9 @@ static void byt_set_pstate(struct cpudata *cpudata, int pstate) |
2612 | vid_fp = clamp_t(int32_t, vid_fp, cpudata->vid.min, cpudata->vid.max); |
2613 | vid = fp_toint(vid_fp); |
2614 | |
2615 | + if (pstate > cpudata->pstate.max_pstate) |
2616 | + vid = cpudata->vid.turbo; |
2617 | + |
2618 | val |= vid; |
2619 | |
2620 | wrmsrl(MSR_IA32_PERF_CTL, val); |
2621 | @@ -403,13 +408,17 @@ static void byt_get_vid(struct cpudata *cpudata) |
2622 | { |
2623 | u64 value; |
2624 | |
2625 | + |
2626 | rdmsrl(BYT_VIDS, value); |
2627 | - cpudata->vid.min = int_tofp((value >> 8) & 0x7f); |
2628 | - cpudata->vid.max = int_tofp((value >> 16) & 0x7f); |
2629 | + cpudata->vid.min = int_tofp((value >> 8) & 0x3f); |
2630 | + cpudata->vid.max = int_tofp((value >> 16) & 0x3f); |
2631 | cpudata->vid.ratio = div_fp( |
2632 | cpudata->vid.max - cpudata->vid.min, |
2633 | int_tofp(cpudata->pstate.max_pstate - |
2634 | cpudata->pstate.min_pstate)); |
2635 | + |
2636 | + rdmsrl(BYT_TURBO_VIDS, value); |
2637 | + cpudata->vid.turbo = value & 0x7f; |
2638 | } |
2639 | |
2640 | |
2641 | @@ -546,12 +555,7 @@ static void intel_pstate_get_cpu_pstates(struct cpudata *cpu) |
2642 | |
2643 | if (pstate_funcs.get_vid) |
2644 | pstate_funcs.get_vid(cpu); |
2645 | - |
2646 | - /* |
2647 | - * goto max pstate so we don't slow up boot if we are built-in if we are |
2648 | - * a module we will take care of it during normal operation |
2649 | - */ |
2650 | - intel_pstate_set_pstate(cpu, cpu->pstate.max_pstate); |
2651 | + intel_pstate_set_pstate(cpu, cpu->pstate.min_pstate); |
2652 | } |
2653 | |
2654 | static inline void intel_pstate_calc_busy(struct cpudata *cpu, |
2655 | @@ -697,11 +701,6 @@ static int intel_pstate_init_cpu(unsigned int cpunum) |
2656 | cpu = all_cpu_data[cpunum]; |
2657 | |
2658 | intel_pstate_get_cpu_pstates(cpu); |
2659 | - if (!cpu->pstate.current_pstate) { |
2660 | - all_cpu_data[cpunum] = NULL; |
2661 | - kfree(cpu); |
2662 | - return -ENODATA; |
2663 | - } |
2664 | |
2665 | cpu->cpu = cpunum; |
2666 | |
2667 | @@ -712,7 +711,6 @@ static int intel_pstate_init_cpu(unsigned int cpunum) |
2668 | cpu->timer.expires = jiffies + HZ/100; |
2669 | intel_pstate_busy_pid_reset(cpu); |
2670 | intel_pstate_sample(cpu); |
2671 | - intel_pstate_set_pstate(cpu, cpu->pstate.max_pstate); |
2672 | |
2673 | add_timer_on(&cpu->timer, cpunum); |
2674 | |
2675 | diff --git a/drivers/cpufreq/loongson2_cpufreq.c b/drivers/cpufreq/loongson2_cpufreq.c |
2676 | index 8dead6fb28e8..7231967f51b4 100644 |
2677 | --- a/drivers/cpufreq/loongson2_cpufreq.c |
2678 | +++ b/drivers/cpufreq/loongson2_cpufreq.c |
2679 | @@ -62,7 +62,7 @@ static int loongson2_cpufreq_target(struct cpufreq_policy *policy, |
2680 | set_cpus_allowed_ptr(current, &cpus_allowed); |
2681 | |
2682 | /* setting the cpu frequency */ |
2683 | - clk_set_rate(policy->clk, freq); |
2684 | + clk_set_rate(policy->clk, freq * 1000); |
2685 | |
2686 | return 0; |
2687 | } |
2688 | @@ -92,7 +92,7 @@ static int loongson2_cpufreq_cpu_init(struct cpufreq_policy *policy) |
2689 | i++) |
2690 | loongson2_clockmod_table[i].frequency = (rate * i) / 8; |
2691 | |
2692 | - ret = clk_set_rate(cpuclk, rate); |
2693 | + ret = clk_set_rate(cpuclk, rate * 1000); |
2694 | if (ret) { |
2695 | clk_put(cpuclk); |
2696 | return ret; |
2697 | diff --git a/drivers/crypto/caam/error.c b/drivers/crypto/caam/error.c |
2698 | index 9f25f5296029..0eabd81e1a90 100644 |
2699 | --- a/drivers/crypto/caam/error.c |
2700 | +++ b/drivers/crypto/caam/error.c |
2701 | @@ -16,9 +16,13 @@ |
2702 | char *tmp; \ |
2703 | \ |
2704 | tmp = kmalloc(sizeof(format) + max_alloc, GFP_ATOMIC); \ |
2705 | - sprintf(tmp, format, param); \ |
2706 | - strcat(str, tmp); \ |
2707 | - kfree(tmp); \ |
2708 | + if (likely(tmp)) { \ |
2709 | + sprintf(tmp, format, param); \ |
2710 | + strcat(str, tmp); \ |
2711 | + kfree(tmp); \ |
2712 | + } else { \ |
2713 | + strcat(str, "kmalloc failure in SPRINTFCAT"); \ |
2714 | + } \ |
2715 | } |
2716 | |
2717 | static void report_jump_idx(u32 status, char *outstr) |
2718 | diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c |
2719 | index ed610b497518..a4068e2d2b5d 100644 |
2720 | --- a/drivers/dma/dmaengine.c |
2721 | +++ b/drivers/dma/dmaengine.c |
2722 | @@ -1014,6 +1014,7 @@ static void dmaengine_unmap(struct kref *kref) |
2723 | dma_unmap_page(dev, unmap->addr[i], unmap->len, |
2724 | DMA_BIDIRECTIONAL); |
2725 | } |
2726 | + cnt = unmap->map_cnt; |
2727 | mempool_free(unmap, __get_unmap_pool(cnt)->pool); |
2728 | } |
2729 | |
2730 | @@ -1079,6 +1080,7 @@ dmaengine_get_unmap_data(struct device *dev, int nr, gfp_t flags) |
2731 | memset(unmap, 0, sizeof(*unmap)); |
2732 | kref_init(&unmap->kref); |
2733 | unmap->dev = dev; |
2734 | + unmap->map_cnt = nr; |
2735 | |
2736 | return unmap; |
2737 | } |
2738 | diff --git a/drivers/dma/dw/core.c b/drivers/dma/dw/core.c |
2739 | index 13ac3f240e79..01a200cd0189 100644 |
2740 | --- a/drivers/dma/dw/core.c |
2741 | +++ b/drivers/dma/dw/core.c |
2742 | @@ -1545,11 +1545,6 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) |
2743 | /* Disable BLOCK interrupts as well */ |
2744 | channel_clear_bit(dw, MASK.BLOCK, dw->all_chan_mask); |
2745 | |
2746 | - err = devm_request_irq(chip->dev, chip->irq, dw_dma_interrupt, |
2747 | - IRQF_SHARED, "dw_dmac", dw); |
2748 | - if (err) |
2749 | - return err; |
2750 | - |
2751 | /* Create a pool of consistent memory blocks for hardware descriptors */ |
2752 | dw->desc_pool = dmam_pool_create("dw_dmac_desc_pool", chip->dev, |
2753 | sizeof(struct dw_desc), 4, 0); |
2754 | @@ -1560,6 +1555,11 @@ int dw_dma_probe(struct dw_dma_chip *chip, struct dw_dma_platform_data *pdata) |
2755 | |
2756 | tasklet_init(&dw->tasklet, dw_dma_tasklet, (unsigned long)dw); |
2757 | |
2758 | + err = request_irq(chip->irq, dw_dma_interrupt, IRQF_SHARED, |
2759 | + "dw_dmac", dw); |
2760 | + if (err) |
2761 | + return err; |
2762 | + |
2763 | INIT_LIST_HEAD(&dw->dma.channels); |
2764 | for (i = 0; i < nr_channels; i++) { |
2765 | struct dw_dma_chan *dwc = &dw->chan[i]; |
2766 | @@ -1664,6 +1664,7 @@ int dw_dma_remove(struct dw_dma_chip *chip) |
2767 | dw_dma_off(dw); |
2768 | dma_async_device_unregister(&dw->dma); |
2769 | |
2770 | + free_irq(chip->irq, dw); |
2771 | tasklet_kill(&dw->tasklet); |
2772 | |
2773 | list_for_each_entry_safe(dwc, _dwc, &dw->dma.channels, |
2774 | diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c |
2775 | index 766b68ed505c..394cbc5c93e3 100644 |
2776 | --- a/drivers/dma/mv_xor.c |
2777 | +++ b/drivers/dma/mv_xor.c |
2778 | @@ -191,12 +191,10 @@ static void mv_set_mode(struct mv_xor_chan *chan, |
2779 | |
2780 | static void mv_chan_activate(struct mv_xor_chan *chan) |
2781 | { |
2782 | - u32 activation; |
2783 | - |
2784 | dev_dbg(mv_chan_to_devp(chan), " activate chan.\n"); |
2785 | - activation = readl_relaxed(XOR_ACTIVATION(chan)); |
2786 | - activation |= 0x1; |
2787 | - writel_relaxed(activation, XOR_ACTIVATION(chan)); |
2788 | + |
2789 | + /* writel ensures all descriptors are flushed before activation */ |
2790 | + writel(BIT(0), XOR_ACTIVATION(chan)); |
2791 | } |
2792 | |
2793 | static char mv_chan_is_busy(struct mv_xor_chan *chan) |
2794 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c |
2795 | index ec7bb0fc71bc..9debd6e74439 100644 |
2796 | --- a/drivers/gpu/drm/i915/i915_drv.c |
2797 | +++ b/drivers/gpu/drm/i915/i915_drv.c |
2798 | @@ -614,15 +614,20 @@ static void intel_resume_hotplug(struct drm_device *dev) |
2799 | drm_helper_hpd_irq_event(dev); |
2800 | } |
2801 | |
2802 | +static int i915_drm_thaw_early(struct drm_device *dev) |
2803 | +{ |
2804 | + intel_uncore_early_sanitize(dev); |
2805 | + intel_uncore_sanitize(dev); |
2806 | + intel_power_domains_init_hw(dev); |
2807 | + |
2808 | + return 0; |
2809 | +} |
2810 | + |
2811 | static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) |
2812 | { |
2813 | struct drm_i915_private *dev_priv = dev->dev_private; |
2814 | int error = 0; |
2815 | |
2816 | - intel_uncore_early_sanitize(dev); |
2817 | - |
2818 | - intel_uncore_sanitize(dev); |
2819 | - |
2820 | if (drm_core_check_feature(dev, DRIVER_MODESET) && |
2821 | restore_gtt_mappings) { |
2822 | mutex_lock(&dev->struct_mutex); |
2823 | @@ -630,8 +635,6 @@ static int __i915_drm_thaw(struct drm_device *dev, bool restore_gtt_mappings) |
2824 | mutex_unlock(&dev->struct_mutex); |
2825 | } |
2826 | |
2827 | - intel_power_domains_init_hw(dev); |
2828 | - |
2829 | i915_restore_state(dev); |
2830 | intel_opregion_setup(dev); |
2831 | |
2832 | @@ -700,19 +703,33 @@ static int i915_drm_thaw(struct drm_device *dev) |
2833 | return __i915_drm_thaw(dev, true); |
2834 | } |
2835 | |
2836 | -int i915_resume(struct drm_device *dev) |
2837 | +static int i915_resume_early(struct drm_device *dev) |
2838 | { |
2839 | - struct drm_i915_private *dev_priv = dev->dev_private; |
2840 | - int ret; |
2841 | - |
2842 | if (dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
2843 | return 0; |
2844 | |
2845 | + /* |
2846 | + * We have a resume ordering issue with the snd-hda driver also |
2847 | + * requiring our device to be power up. Due to the lack of a |
2848 | + * parent/child relationship we currently solve this with an early |
2849 | + * resume hook. |
2850 | + * |
2851 | + * FIXME: This should be solved with a special hdmi sink device or |
2852 | + * similar so that power domains can be employed. |
2853 | + */ |
2854 | if (pci_enable_device(dev->pdev)) |
2855 | return -EIO; |
2856 | |
2857 | pci_set_master(dev->pdev); |
2858 | |
2859 | + return i915_drm_thaw_early(dev); |
2860 | +} |
2861 | + |
2862 | +int i915_resume(struct drm_device *dev) |
2863 | +{ |
2864 | + struct drm_i915_private *dev_priv = dev->dev_private; |
2865 | + int ret; |
2866 | + |
2867 | /* |
2868 | * Platforms with opregion should have sane BIOS, older ones (gen3 and |
2869 | * earlier) need to restore the GTT mappings since the BIOS might clear |
2870 | @@ -726,6 +743,14 @@ int i915_resume(struct drm_device *dev) |
2871 | return 0; |
2872 | } |
2873 | |
2874 | +static int i915_resume_legacy(struct drm_device *dev) |
2875 | +{ |
2876 | + i915_resume_early(dev); |
2877 | + i915_resume(dev); |
2878 | + |
2879 | + return 0; |
2880 | +} |
2881 | + |
2882 | /** |
2883 | * i915_reset - reset chip after a hang |
2884 | * @dev: drm device to reset |
2885 | @@ -846,7 +871,6 @@ static int i915_pm_suspend(struct device *dev) |
2886 | { |
2887 | struct pci_dev *pdev = to_pci_dev(dev); |
2888 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
2889 | - int error; |
2890 | |
2891 | if (!drm_dev || !drm_dev->dev_private) { |
2892 | dev_err(dev, "DRM not initialized, aborting suspend.\n"); |
2893 | @@ -856,9 +880,25 @@ static int i915_pm_suspend(struct device *dev) |
2894 | if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
2895 | return 0; |
2896 | |
2897 | - error = i915_drm_freeze(drm_dev); |
2898 | - if (error) |
2899 | - return error; |
2900 | + return i915_drm_freeze(drm_dev); |
2901 | +} |
2902 | + |
2903 | +static int i915_pm_suspend_late(struct device *dev) |
2904 | +{ |
2905 | + struct pci_dev *pdev = to_pci_dev(dev); |
2906 | + struct drm_device *drm_dev = pci_get_drvdata(pdev); |
2907 | + |
2908 | + /* |
2909 | + * We have a suspedn ordering issue with the snd-hda driver also |
2910 | + * requiring our device to be power up. Due to the lack of a |
2911 | + * parent/child relationship we currently solve this with an late |
2912 | + * suspend hook. |
2913 | + * |
2914 | + * FIXME: This should be solved with a special hdmi sink device or |
2915 | + * similar so that power domains can be employed. |
2916 | + */ |
2917 | + if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF) |
2918 | + return 0; |
2919 | |
2920 | pci_disable_device(pdev); |
2921 | pci_set_power_state(pdev, PCI_D3hot); |
2922 | @@ -866,6 +906,14 @@ static int i915_pm_suspend(struct device *dev) |
2923 | return 0; |
2924 | } |
2925 | |
2926 | +static int i915_pm_resume_early(struct device *dev) |
2927 | +{ |
2928 | + struct pci_dev *pdev = to_pci_dev(dev); |
2929 | + struct drm_device *drm_dev = pci_get_drvdata(pdev); |
2930 | + |
2931 | + return i915_resume_early(drm_dev); |
2932 | +} |
2933 | + |
2934 | static int i915_pm_resume(struct device *dev) |
2935 | { |
2936 | struct pci_dev *pdev = to_pci_dev(dev); |
2937 | @@ -887,6 +935,14 @@ static int i915_pm_freeze(struct device *dev) |
2938 | return i915_drm_freeze(drm_dev); |
2939 | } |
2940 | |
2941 | +static int i915_pm_thaw_early(struct device *dev) |
2942 | +{ |
2943 | + struct pci_dev *pdev = to_pci_dev(dev); |
2944 | + struct drm_device *drm_dev = pci_get_drvdata(pdev); |
2945 | + |
2946 | + return i915_drm_thaw_early(drm_dev); |
2947 | +} |
2948 | + |
2949 | static int i915_pm_thaw(struct device *dev) |
2950 | { |
2951 | struct pci_dev *pdev = to_pci_dev(dev); |
2952 | @@ -948,10 +1004,14 @@ static int i915_runtime_resume(struct device *device) |
2953 | |
2954 | static const struct dev_pm_ops i915_pm_ops = { |
2955 | .suspend = i915_pm_suspend, |
2956 | + .suspend_late = i915_pm_suspend_late, |
2957 | + .resume_early = i915_pm_resume_early, |
2958 | .resume = i915_pm_resume, |
2959 | .freeze = i915_pm_freeze, |
2960 | + .thaw_early = i915_pm_thaw_early, |
2961 | .thaw = i915_pm_thaw, |
2962 | .poweroff = i915_pm_poweroff, |
2963 | + .restore_early = i915_pm_resume_early, |
2964 | .restore = i915_pm_resume, |
2965 | .runtime_suspend = i915_runtime_suspend, |
2966 | .runtime_resume = i915_runtime_resume, |
2967 | @@ -994,7 +1054,7 @@ static struct drm_driver driver = { |
2968 | |
2969 | /* Used in place of i915_pm_ops for non-DRIVER_MODESET */ |
2970 | .suspend = i915_suspend, |
2971 | - .resume = i915_resume, |
2972 | + .resume = i915_resume_legacy, |
2973 | |
2974 | .device_is_agp = i915_driver_device_is_agp, |
2975 | .master_create = i915_master_create, |
2976 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
2977 | index 00c836154725..3ecb332e7cfa 100644 |
2978 | --- a/drivers/gpu/drm/i915/i915_gem.c |
2979 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
2980 | @@ -3529,7 +3529,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, |
2981 | { |
2982 | struct drm_device *dev = obj->base.dev; |
2983 | drm_i915_private_t *dev_priv = dev->dev_private; |
2984 | - struct i915_vma *vma; |
2985 | + struct i915_vma *vma, *next; |
2986 | int ret; |
2987 | |
2988 | if (obj->cache_level == cache_level) |
2989 | @@ -3540,7 +3540,7 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj, |
2990 | return -EBUSY; |
2991 | } |
2992 | |
2993 | - list_for_each_entry(vma, &obj->vma_list, vma_link) { |
2994 | + list_for_each_entry_safe(vma, next, &obj->vma_list, vma_link) { |
2995 | if (!i915_gem_valid_gtt_space(dev, &vma->node, cache_level)) { |
2996 | ret = i915_vma_unbind(vma); |
2997 | if (ret) |
2998 | diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c |
2999 | index d554169ac592..40504504c9e2 100644 |
3000 | --- a/drivers/gpu/drm/i915/i915_irq.c |
3001 | +++ b/drivers/gpu/drm/i915/i915_irq.c |
3002 | @@ -1252,10 +1252,20 @@ static inline void intel_hpd_irq_handler(struct drm_device *dev, |
3003 | spin_lock(&dev_priv->irq_lock); |
3004 | for (i = 1; i < HPD_NUM_PINS; i++) { |
3005 | |
3006 | - WARN_ONCE(hpd[i] & hotplug_trigger && |
3007 | - dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED, |
3008 | - "Received HPD interrupt (0x%08x) on pin %d (0x%08x) although disabled\n", |
3009 | - hotplug_trigger, i, hpd[i]); |
3010 | + if (hpd[i] & hotplug_trigger && |
3011 | + dev_priv->hpd_stats[i].hpd_mark == HPD_DISABLED) { |
3012 | + /* |
3013 | + * On GMCH platforms the interrupt mask bits only |
3014 | + * prevent irq generation, not the setting of the |
3015 | + * hotplug bits itself. So only WARN about unexpected |
3016 | + * interrupts on saner platforms. |
3017 | + */ |
3018 | + WARN_ONCE(INTEL_INFO(dev)->gen >= 5 && !IS_VALLEYVIEW(dev), |
3019 | + "Received HPD interrupt (0x%08x) on pin %d (0x%08x) although disabled\n", |
3020 | + hotplug_trigger, i, hpd[i]); |
3021 | + |
3022 | + continue; |
3023 | + } |
3024 | |
3025 | if (!(hpd[i] & hotplug_trigger) || |
3026 | dev_priv->hpd_stats[i].hpd_mark != HPD_ENABLED) |
3027 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
3028 | index 963639d9049b..9d4d837506d0 100644 |
3029 | --- a/drivers/gpu/drm/i915/intel_display.c |
3030 | +++ b/drivers/gpu/drm/i915/intel_display.c |
3031 | @@ -9354,11 +9354,22 @@ intel_pipe_config_compare(struct drm_device *dev, |
3032 | PIPE_CONF_CHECK_I(pipe_src_w); |
3033 | PIPE_CONF_CHECK_I(pipe_src_h); |
3034 | |
3035 | - PIPE_CONF_CHECK_I(gmch_pfit.control); |
3036 | - /* pfit ratios are autocomputed by the hw on gen4+ */ |
3037 | - if (INTEL_INFO(dev)->gen < 4) |
3038 | - PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios); |
3039 | - PIPE_CONF_CHECK_I(gmch_pfit.lvds_border_bits); |
3040 | + /* |
3041 | + * FIXME: BIOS likes to set up a cloned config with lvds+external |
3042 | + * screen. Since we don't yet re-compute the pipe config when moving |
3043 | + * just the lvds port away to another pipe the sw tracking won't match. |
3044 | + * |
3045 | + * Proper atomic modesets with recomputed global state will fix this. |
3046 | + * Until then just don't check gmch state for inherited modes. |
3047 | + */ |
3048 | + if (!PIPE_CONF_QUIRK(PIPE_CONFIG_QUIRK_INHERITED_MODE)) { |
3049 | + PIPE_CONF_CHECK_I(gmch_pfit.control); |
3050 | + /* pfit ratios are autocomputed by the hw on gen4+ */ |
3051 | + if (INTEL_INFO(dev)->gen < 4) |
3052 | + PIPE_CONF_CHECK_I(gmch_pfit.pgm_ratios); |
3053 | + PIPE_CONF_CHECK_I(gmch_pfit.lvds_border_bits); |
3054 | + } |
3055 | + |
3056 | PIPE_CONF_CHECK_I(pch_pfit.enabled); |
3057 | if (current_config->pch_pfit.enabled) { |
3058 | PIPE_CONF_CHECK_I(pch_pfit.pos); |
3059 | @@ -10851,6 +10862,9 @@ static struct intel_quirk intel_quirks[] = { |
3060 | /* Acer Aspire 4736Z */ |
3061 | { 0x2a42, 0x1025, 0x0260, quirk_invert_brightness }, |
3062 | |
3063 | + /* Acer Aspire 5336 */ |
3064 | + { 0x2a42, 0x1025, 0x048a, quirk_invert_brightness }, |
3065 | + |
3066 | /* Dell XPS13 HD Sandy Bridge */ |
3067 | { 0x0116, 0x1028, 0x052e, quirk_no_pcm_pwm_enable }, |
3068 | /* Dell XPS13 HD and XPS13 FHD Ivy Bridge */ |
3069 | @@ -10978,15 +10992,6 @@ void intel_modeset_init(struct drm_device *dev) |
3070 | intel_disable_fbc(dev); |
3071 | } |
3072 | |
3073 | -static void |
3074 | -intel_connector_break_all_links(struct intel_connector *connector) |
3075 | -{ |
3076 | - connector->base.dpms = DRM_MODE_DPMS_OFF; |
3077 | - connector->base.encoder = NULL; |
3078 | - connector->encoder->connectors_active = false; |
3079 | - connector->encoder->base.crtc = NULL; |
3080 | -} |
3081 | - |
3082 | static void intel_enable_pipe_a(struct drm_device *dev) |
3083 | { |
3084 | struct intel_connector *connector; |
3085 | @@ -11068,8 +11073,17 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc) |
3086 | if (connector->encoder->base.crtc != &crtc->base) |
3087 | continue; |
3088 | |
3089 | - intel_connector_break_all_links(connector); |
3090 | + connector->base.dpms = DRM_MODE_DPMS_OFF; |
3091 | + connector->base.encoder = NULL; |
3092 | } |
3093 | + /* multiple connectors may have the same encoder: |
3094 | + * handle them and break crtc link separately */ |
3095 | + list_for_each_entry(connector, &dev->mode_config.connector_list, |
3096 | + base.head) |
3097 | + if (connector->encoder->base.crtc == &crtc->base) { |
3098 | + connector->encoder->base.crtc = NULL; |
3099 | + connector->encoder->connectors_active = false; |
3100 | + } |
3101 | |
3102 | WARN_ON(crtc->active); |
3103 | crtc->base.enabled = false; |
3104 | @@ -11140,6 +11154,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder) |
3105 | drm_get_encoder_name(&encoder->base)); |
3106 | encoder->disable(encoder); |
3107 | } |
3108 | + encoder->base.crtc = NULL; |
3109 | + encoder->connectors_active = false; |
3110 | |
3111 | /* Inconsistent output/port/pipe state happens presumably due to |
3112 | * a bug in one of the get_hw_state functions. Or someplace else |
3113 | @@ -11150,8 +11166,8 @@ static void intel_sanitize_encoder(struct intel_encoder *encoder) |
3114 | base.head) { |
3115 | if (connector->encoder != encoder) |
3116 | continue; |
3117 | - |
3118 | - intel_connector_break_all_links(connector); |
3119 | + connector->base.dpms = DRM_MODE_DPMS_OFF; |
3120 | + connector->base.encoder = NULL; |
3121 | } |
3122 | } |
3123 | /* Enabled encoders without active connectors will be fixed in |
3124 | @@ -11193,6 +11209,8 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev) |
3125 | base.head) { |
3126 | memset(&crtc->config, 0, sizeof(crtc->config)); |
3127 | |
3128 | + crtc->config.quirks |= PIPE_CONFIG_QUIRK_INHERITED_MODE; |
3129 | + |
3130 | crtc->active = dev_priv->display.get_pipe_config(crtc, |
3131 | &crtc->config); |
3132 | |
3133 | diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h |
3134 | index fbfaaba5cc3b..00de120531ac 100644 |
3135 | --- a/drivers/gpu/drm/i915/intel_drv.h |
3136 | +++ b/drivers/gpu/drm/i915/intel_drv.h |
3137 | @@ -219,7 +219,8 @@ struct intel_crtc_config { |
3138 | * tracked with quirk flags so that fastboot and state checker can act |
3139 | * accordingly. |
3140 | */ |
3141 | -#define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */ |
3142 | +#define PIPE_CONFIG_QUIRK_MODE_SYNC_FLAGS (1<<0) /* unreliable sync mode.flags */ |
3143 | +#define PIPE_CONFIG_QUIRK_INHERITED_MODE (1<<1) /* mode inherited from firmware */ |
3144 | unsigned long quirks; |
3145 | |
3146 | /* User requested mode, only valid as a starting point to |
3147 | diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c |
3148 | index ee3181ebcc92..ca5d23d17d20 100644 |
3149 | --- a/drivers/gpu/drm/i915/intel_hdmi.c |
3150 | +++ b/drivers/gpu/drm/i915/intel_hdmi.c |
3151 | @@ -841,11 +841,11 @@ static void intel_disable_hdmi(struct intel_encoder *encoder) |
3152 | } |
3153 | } |
3154 | |
3155 | -static int hdmi_portclock_limit(struct intel_hdmi *hdmi) |
3156 | +static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit) |
3157 | { |
3158 | struct drm_device *dev = intel_hdmi_to_dev(hdmi); |
3159 | |
3160 | - if (!hdmi->has_hdmi_sink || IS_G4X(dev)) |
3161 | + if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev)) |
3162 | return 165000; |
3163 | else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8) |
3164 | return 300000; |
3165 | @@ -857,7 +857,8 @@ static enum drm_mode_status |
3166 | intel_hdmi_mode_valid(struct drm_connector *connector, |
3167 | struct drm_display_mode *mode) |
3168 | { |
3169 | - if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector))) |
3170 | + if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector), |
3171 | + true)) |
3172 | return MODE_CLOCK_HIGH; |
3173 | if (mode->clock < 20000) |
3174 | return MODE_CLOCK_LOW; |
3175 | @@ -875,7 +876,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder, |
3176 | struct drm_device *dev = encoder->base.dev; |
3177 | struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode; |
3178 | int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2; |
3179 | - int portclock_limit = hdmi_portclock_limit(intel_hdmi); |
3180 | + int portclock_limit = hdmi_portclock_limit(intel_hdmi, false); |
3181 | int desired_bpp; |
3182 | |
3183 | if (intel_hdmi->color_range_auto) { |
3184 | diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c |
3185 | index 9f1d7a9300e8..19a4f0535b63 100644 |
3186 | --- a/drivers/gpu/drm/i915/intel_panel.c |
3187 | +++ b/drivers/gpu/drm/i915/intel_panel.c |
3188 | @@ -501,6 +501,7 @@ void intel_panel_set_backlight(struct intel_connector *connector, u32 level, |
3189 | enum pipe pipe = intel_get_pipe_from_connector(connector); |
3190 | u32 freq; |
3191 | unsigned long flags; |
3192 | + u64 n; |
3193 | |
3194 | if (!panel->backlight.present || pipe == INVALID_PIPE) |
3195 | return; |
3196 | @@ -511,10 +512,9 @@ void intel_panel_set_backlight(struct intel_connector *connector, u32 level, |
3197 | |
3198 | /* scale to hardware max, but be careful to not overflow */ |
3199 | freq = panel->backlight.max; |
3200 | - if (freq < max) |
3201 | - level = level * freq / max; |
3202 | - else |
3203 | - level = freq / max * level; |
3204 | + n = (u64)level * freq; |
3205 | + do_div(n, max); |
3206 | + level = n; |
3207 | |
3208 | panel->backlight.level = level; |
3209 | if (panel->backlight.device) |
3210 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c |
3211 | index e1fc35a72656..bd1b00344dac 100644 |
3212 | --- a/drivers/gpu/drm/i915/intel_pm.c |
3213 | +++ b/drivers/gpu/drm/i915/intel_pm.c |
3214 | @@ -1539,6 +1539,16 @@ static void i9xx_update_wm(struct drm_crtc *unused_crtc) |
3215 | |
3216 | DRM_DEBUG_KMS("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); |
3217 | |
3218 | + if (IS_I915GM(dev) && enabled) { |
3219 | + struct intel_framebuffer *fb; |
3220 | + |
3221 | + fb = to_intel_framebuffer(enabled->fb); |
3222 | + |
3223 | + /* self-refresh seems busted with untiled */ |
3224 | + if (fb->obj->tiling_mode == I915_TILING_NONE) |
3225 | + enabled = NULL; |
3226 | + } |
3227 | + |
3228 | /* |
3229 | * Overlay gets an aggressive default since video jitter is bad. |
3230 | */ |
3231 | diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c |
3232 | index 87df68f5f504..c8796316d242 100644 |
3233 | --- a/drivers/gpu/drm/i915/intel_uncore.c |
3234 | +++ b/drivers/gpu/drm/i915/intel_uncore.c |
3235 | @@ -177,6 +177,8 @@ static void vlv_force_wake_reset(struct drm_i915_private *dev_priv) |
3236 | { |
3237 | __raw_i915_write32(dev_priv, FORCEWAKE_VLV, |
3238 | _MASKED_BIT_DISABLE(0xffff)); |
3239 | + __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_VLV, |
3240 | + _MASKED_BIT_DISABLE(0xffff)); |
3241 | /* something from same cacheline, but !FORCEWAKE_VLV */ |
3242 | __raw_posting_read(dev_priv, FORCEWAKE_ACK_VLV); |
3243 | } |
3244 | diff --git a/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c b/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c |
3245 | index 95f6129eeede..29d4c417a5b3 100644 |
3246 | --- a/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c |
3247 | +++ b/drivers/gpu/drm/nouveau/core/subdev/therm/fan.c |
3248 | @@ -54,8 +54,10 @@ nouveau_fan_update(struct nouveau_fan *fan, bool immediate, int target) |
3249 | |
3250 | /* check that we're not already at the target duty cycle */ |
3251 | duty = fan->get(therm); |
3252 | - if (duty == target) |
3253 | - goto done; |
3254 | + if (duty == target) { |
3255 | + spin_unlock_irqrestore(&fan->lock, flags); |
3256 | + return 0; |
3257 | + } |
3258 | |
3259 | /* smooth out the fanspeed increase/decrease */ |
3260 | if (!immediate && duty >= 0) { |
3261 | @@ -73,8 +75,15 @@ nouveau_fan_update(struct nouveau_fan *fan, bool immediate, int target) |
3262 | |
3263 | nv_debug(therm, "FAN update: %d\n", duty); |
3264 | ret = fan->set(therm, duty); |
3265 | - if (ret) |
3266 | - goto done; |
3267 | + if (ret) { |
3268 | + spin_unlock_irqrestore(&fan->lock, flags); |
3269 | + return ret; |
3270 | + } |
3271 | + |
3272 | + /* fan speed updated, drop the fan lock before grabbing the |
3273 | + * alarm-scheduling lock and risking a deadlock |
3274 | + */ |
3275 | + spin_unlock_irqrestore(&fan->lock, flags); |
3276 | |
3277 | /* schedule next fan update, if not at target speed already */ |
3278 | if (list_empty(&fan->alarm.head) && target != duty) { |
3279 | @@ -92,8 +101,6 @@ nouveau_fan_update(struct nouveau_fan *fan, bool immediate, int target) |
3280 | ptimer->alarm(ptimer, delay * 1000 * 1000, &fan->alarm); |
3281 | } |
3282 | |
3283 | -done: |
3284 | - spin_unlock_irqrestore(&fan->lock, flags); |
3285 | return ret; |
3286 | } |
3287 | |
3288 | diff --git a/drivers/gpu/drm/nouveau/nouveau_acpi.c b/drivers/gpu/drm/nouveau/nouveau_acpi.c |
3289 | index 83face3f608f..279206997e5c 100644 |
3290 | --- a/drivers/gpu/drm/nouveau/nouveau_acpi.c |
3291 | +++ b/drivers/gpu/drm/nouveau/nouveau_acpi.c |
3292 | @@ -389,9 +389,6 @@ bool nouveau_acpi_rom_supported(struct pci_dev *pdev) |
3293 | acpi_status status; |
3294 | acpi_handle dhandle, rom_handle; |
3295 | |
3296 | - if (!nouveau_dsm_priv.dsm_detected && !nouveau_dsm_priv.optimus_detected) |
3297 | - return false; |
3298 | - |
3299 | dhandle = ACPI_HANDLE(&pdev->dev); |
3300 | if (!dhandle) |
3301 | return false; |
3302 | diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c |
3303 | index 24011596af43..5524a3705224 100644 |
3304 | --- a/drivers/gpu/drm/nouveau/nouveau_display.c |
3305 | +++ b/drivers/gpu/drm/nouveau/nouveau_display.c |
3306 | @@ -762,9 +762,9 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb, |
3307 | } |
3308 | |
3309 | ret = nouveau_page_flip_emit(chan, old_bo, new_bo, s, &fence); |
3310 | - mutex_unlock(&chan->cli->mutex); |
3311 | if (ret) |
3312 | goto fail_unreserve; |
3313 | + mutex_unlock(&chan->cli->mutex); |
3314 | |
3315 | /* Update the crtc struct and cleanup */ |
3316 | crtc->fb = fb; |
3317 | diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c |
3318 | index 8d49104ca6c2..9241e96f8502 100644 |
3319 | --- a/drivers/gpu/drm/radeon/ci_dpm.c |
3320 | +++ b/drivers/gpu/drm/radeon/ci_dpm.c |
3321 | @@ -21,8 +21,10 @@ |
3322 | * |
3323 | */ |
3324 | |
3325 | +#include <linux/firmware.h> |
3326 | #include "drmP.h" |
3327 | #include "radeon.h" |
3328 | +#include "radeon_ucode.h" |
3329 | #include "cikd.h" |
3330 | #include "r600_dpm.h" |
3331 | #include "ci_dpm.h" |
3332 | @@ -5106,6 +5108,12 @@ int ci_dpm_init(struct radeon_device *rdev) |
3333 | pi->mclk_dpm_key_disabled = 0; |
3334 | pi->pcie_dpm_key_disabled = 0; |
3335 | |
3336 | + /* mclk dpm is unstable on some R7 260X cards with the old mc ucode */ |
3337 | + if ((rdev->pdev->device == 0x6658) && |
3338 | + (rdev->mc_fw->size == (BONAIRE_MC_UCODE_SIZE * 4))) { |
3339 | + pi->mclk_dpm_key_disabled = 1; |
3340 | + } |
3341 | + |
3342 | pi->caps_sclk_ds = true; |
3343 | |
3344 | pi->mclk_strobe_mode_threshold = 40000; |
3345 | diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c |
3346 | index 986f9e7364ca..270f68a6b724 100644 |
3347 | --- a/drivers/gpu/drm/radeon/cik.c |
3348 | +++ b/drivers/gpu/drm/radeon/cik.c |
3349 | @@ -38,6 +38,7 @@ MODULE_FIRMWARE("radeon/BONAIRE_me.bin"); |
3350 | MODULE_FIRMWARE("radeon/BONAIRE_ce.bin"); |
3351 | MODULE_FIRMWARE("radeon/BONAIRE_mec.bin"); |
3352 | MODULE_FIRMWARE("radeon/BONAIRE_mc.bin"); |
3353 | +MODULE_FIRMWARE("radeon/BONAIRE_mc2.bin"); |
3354 | MODULE_FIRMWARE("radeon/BONAIRE_rlc.bin"); |
3355 | MODULE_FIRMWARE("radeon/BONAIRE_sdma.bin"); |
3356 | MODULE_FIRMWARE("radeon/BONAIRE_smc.bin"); |
3357 | @@ -46,6 +47,7 @@ MODULE_FIRMWARE("radeon/HAWAII_me.bin"); |
3358 | MODULE_FIRMWARE("radeon/HAWAII_ce.bin"); |
3359 | MODULE_FIRMWARE("radeon/HAWAII_mec.bin"); |
3360 | MODULE_FIRMWARE("radeon/HAWAII_mc.bin"); |
3361 | +MODULE_FIRMWARE("radeon/HAWAII_mc2.bin"); |
3362 | MODULE_FIRMWARE("radeon/HAWAII_rlc.bin"); |
3363 | MODULE_FIRMWARE("radeon/HAWAII_sdma.bin"); |
3364 | MODULE_FIRMWARE("radeon/HAWAII_smc.bin"); |
3365 | @@ -1702,20 +1704,20 @@ int ci_mc_load_microcode(struct radeon_device *rdev) |
3366 | const __be32 *fw_data; |
3367 | u32 running, blackout = 0; |
3368 | u32 *io_mc_regs; |
3369 | - int i, ucode_size, regs_size; |
3370 | + int i, regs_size, ucode_size; |
3371 | |
3372 | if (!rdev->mc_fw) |
3373 | return -EINVAL; |
3374 | |
3375 | + ucode_size = rdev->mc_fw->size / 4; |
3376 | + |
3377 | switch (rdev->family) { |
3378 | case CHIP_BONAIRE: |
3379 | io_mc_regs = (u32 *)&bonaire_io_mc_regs; |
3380 | - ucode_size = CIK_MC_UCODE_SIZE; |
3381 | regs_size = BONAIRE_IO_MC_REGS_SIZE; |
3382 | break; |
3383 | case CHIP_HAWAII: |
3384 | io_mc_regs = (u32 *)&hawaii_io_mc_regs; |
3385 | - ucode_size = HAWAII_MC_UCODE_SIZE; |
3386 | regs_size = HAWAII_IO_MC_REGS_SIZE; |
3387 | break; |
3388 | default: |
3389 | @@ -1782,7 +1784,7 @@ static int cik_init_microcode(struct radeon_device *rdev) |
3390 | const char *chip_name; |
3391 | size_t pfp_req_size, me_req_size, ce_req_size, |
3392 | mec_req_size, rlc_req_size, mc_req_size = 0, |
3393 | - sdma_req_size, smc_req_size = 0; |
3394 | + sdma_req_size, smc_req_size = 0, mc2_req_size = 0; |
3395 | char fw_name[30]; |
3396 | int err; |
3397 | |
3398 | @@ -1796,7 +1798,8 @@ static int cik_init_microcode(struct radeon_device *rdev) |
3399 | ce_req_size = CIK_CE_UCODE_SIZE * 4; |
3400 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; |
3401 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; |
3402 | - mc_req_size = CIK_MC_UCODE_SIZE * 4; |
3403 | + mc_req_size = BONAIRE_MC_UCODE_SIZE * 4; |
3404 | + mc2_req_size = BONAIRE_MC2_UCODE_SIZE * 4; |
3405 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
3406 | smc_req_size = ALIGN(BONAIRE_SMC_UCODE_SIZE, 4); |
3407 | break; |
3408 | @@ -1808,6 +1811,7 @@ static int cik_init_microcode(struct radeon_device *rdev) |
3409 | mec_req_size = CIK_MEC_UCODE_SIZE * 4; |
3410 | rlc_req_size = BONAIRE_RLC_UCODE_SIZE * 4; |
3411 | mc_req_size = HAWAII_MC_UCODE_SIZE * 4; |
3412 | + mc2_req_size = HAWAII_MC2_UCODE_SIZE * 4; |
3413 | sdma_req_size = CIK_SDMA_UCODE_SIZE * 4; |
3414 | smc_req_size = ALIGN(HAWAII_SMC_UCODE_SIZE, 4); |
3415 | break; |
3416 | @@ -1903,16 +1907,22 @@ static int cik_init_microcode(struct radeon_device *rdev) |
3417 | |
3418 | /* No SMC, MC ucode on APUs */ |
3419 | if (!(rdev->flags & RADEON_IS_IGP)) { |
3420 | - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
3421 | + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
3422 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
3423 | - if (err) |
3424 | - goto out; |
3425 | - if (rdev->mc_fw->size != mc_req_size) { |
3426 | + if (err) { |
3427 | + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
3428 | + err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
3429 | + if (err) |
3430 | + goto out; |
3431 | + } |
3432 | + if ((rdev->mc_fw->size != mc_req_size) && |
3433 | + (rdev->mc_fw->size != mc2_req_size)){ |
3434 | printk(KERN_ERR |
3435 | "cik_mc: Bogus length %zu in firmware \"%s\"\n", |
3436 | rdev->mc_fw->size, fw_name); |
3437 | err = -EINVAL; |
3438 | } |
3439 | + DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); |
3440 | |
3441 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
3442 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
3443 | @@ -6662,6 +6672,19 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) |
3444 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
3445 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
3446 | } |
3447 | + /* pflip */ |
3448 | + if (rdev->num_crtc >= 2) { |
3449 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
3450 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
3451 | + } |
3452 | + if (rdev->num_crtc >= 4) { |
3453 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, 0); |
3454 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, 0); |
3455 | + } |
3456 | + if (rdev->num_crtc >= 6) { |
3457 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, 0); |
3458 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, 0); |
3459 | + } |
3460 | |
3461 | /* dac hotplug */ |
3462 | WREG32(DAC_AUTODETECT_INT_CONTROL, 0); |
3463 | @@ -7018,6 +7041,25 @@ int cik_irq_set(struct radeon_device *rdev) |
3464 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
3465 | } |
3466 | |
3467 | + if (rdev->num_crtc >= 2) { |
3468 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, |
3469 | + GRPH_PFLIP_INT_MASK); |
3470 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, |
3471 | + GRPH_PFLIP_INT_MASK); |
3472 | + } |
3473 | + if (rdev->num_crtc >= 4) { |
3474 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, |
3475 | + GRPH_PFLIP_INT_MASK); |
3476 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, |
3477 | + GRPH_PFLIP_INT_MASK); |
3478 | + } |
3479 | + if (rdev->num_crtc >= 6) { |
3480 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, |
3481 | + GRPH_PFLIP_INT_MASK); |
3482 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, |
3483 | + GRPH_PFLIP_INT_MASK); |
3484 | + } |
3485 | + |
3486 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
3487 | WREG32(DC_HPD2_INT_CONTROL, hpd2); |
3488 | WREG32(DC_HPD3_INT_CONTROL, hpd3); |
3489 | @@ -7054,6 +7096,29 @@ static inline void cik_irq_ack(struct radeon_device *rdev) |
3490 | rdev->irq.stat_regs.cik.disp_int_cont5 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE5); |
3491 | rdev->irq.stat_regs.cik.disp_int_cont6 = RREG32(DISP_INTERRUPT_STATUS_CONTINUE6); |
3492 | |
3493 | + rdev->irq.stat_regs.cik.d1grph_int = RREG32(GRPH_INT_STATUS + |
3494 | + EVERGREEN_CRTC0_REGISTER_OFFSET); |
3495 | + rdev->irq.stat_regs.cik.d2grph_int = RREG32(GRPH_INT_STATUS + |
3496 | + EVERGREEN_CRTC1_REGISTER_OFFSET); |
3497 | + if (rdev->num_crtc >= 4) { |
3498 | + rdev->irq.stat_regs.cik.d3grph_int = RREG32(GRPH_INT_STATUS + |
3499 | + EVERGREEN_CRTC2_REGISTER_OFFSET); |
3500 | + rdev->irq.stat_regs.cik.d4grph_int = RREG32(GRPH_INT_STATUS + |
3501 | + EVERGREEN_CRTC3_REGISTER_OFFSET); |
3502 | + } |
3503 | + if (rdev->num_crtc >= 6) { |
3504 | + rdev->irq.stat_regs.cik.d5grph_int = RREG32(GRPH_INT_STATUS + |
3505 | + EVERGREEN_CRTC4_REGISTER_OFFSET); |
3506 | + rdev->irq.stat_regs.cik.d6grph_int = RREG32(GRPH_INT_STATUS + |
3507 | + EVERGREEN_CRTC5_REGISTER_OFFSET); |
3508 | + } |
3509 | + |
3510 | + if (rdev->irq.stat_regs.cik.d1grph_int & GRPH_PFLIP_INT_OCCURRED) |
3511 | + WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, |
3512 | + GRPH_PFLIP_INT_CLEAR); |
3513 | + if (rdev->irq.stat_regs.cik.d2grph_int & GRPH_PFLIP_INT_OCCURRED) |
3514 | + WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, |
3515 | + GRPH_PFLIP_INT_CLEAR); |
3516 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VBLANK_INTERRUPT) |
3517 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC0_REGISTER_OFFSET, VBLANK_ACK); |
3518 | if (rdev->irq.stat_regs.cik.disp_int & LB_D1_VLINE_INTERRUPT) |
3519 | @@ -7064,6 +7129,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev) |
3520 | WREG32(LB_VLINE_STATUS + EVERGREEN_CRTC1_REGISTER_OFFSET, VLINE_ACK); |
3521 | |
3522 | if (rdev->num_crtc >= 4) { |
3523 | + if (rdev->irq.stat_regs.cik.d3grph_int & GRPH_PFLIP_INT_OCCURRED) |
3524 | + WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, |
3525 | + GRPH_PFLIP_INT_CLEAR); |
3526 | + if (rdev->irq.stat_regs.cik.d4grph_int & GRPH_PFLIP_INT_OCCURRED) |
3527 | + WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC3_REGISTER_OFFSET, |
3528 | + GRPH_PFLIP_INT_CLEAR); |
3529 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VBLANK_INTERRUPT) |
3530 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC2_REGISTER_OFFSET, VBLANK_ACK); |
3531 | if (rdev->irq.stat_regs.cik.disp_int_cont2 & LB_D3_VLINE_INTERRUPT) |
3532 | @@ -7075,6 +7146,12 @@ static inline void cik_irq_ack(struct radeon_device *rdev) |
3533 | } |
3534 | |
3535 | if (rdev->num_crtc >= 6) { |
3536 | + if (rdev->irq.stat_regs.cik.d5grph_int & GRPH_PFLIP_INT_OCCURRED) |
3537 | + WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, |
3538 | + GRPH_PFLIP_INT_CLEAR); |
3539 | + if (rdev->irq.stat_regs.cik.d6grph_int & GRPH_PFLIP_INT_OCCURRED) |
3540 | + WREG32(GRPH_INT_STATUS + EVERGREEN_CRTC5_REGISTER_OFFSET, |
3541 | + GRPH_PFLIP_INT_CLEAR); |
3542 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VBLANK_INTERRUPT) |
3543 | WREG32(LB_VBLANK_STATUS + EVERGREEN_CRTC4_REGISTER_OFFSET, VBLANK_ACK); |
3544 | if (rdev->irq.stat_regs.cik.disp_int_cont4 & LB_D5_VLINE_INTERRUPT) |
3545 | @@ -7426,6 +7503,15 @@ restart_ih: |
3546 | break; |
3547 | } |
3548 | break; |
3549 | + case 8: /* D1 page flip */ |
3550 | + case 10: /* D2 page flip */ |
3551 | + case 12: /* D3 page flip */ |
3552 | + case 14: /* D4 page flip */ |
3553 | + case 16: /* D5 page flip */ |
3554 | + case 18: /* D6 page flip */ |
3555 | + DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); |
3556 | + radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); |
3557 | + break; |
3558 | case 42: /* HPD hotplug */ |
3559 | switch (src_data) { |
3560 | case 0: |
3561 | diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c |
3562 | index 94626ea90fa5..aac8f487e6df 100644 |
3563 | --- a/drivers/gpu/drm/radeon/cik_sdma.c |
3564 | +++ b/drivers/gpu/drm/radeon/cik_sdma.c |
3565 | @@ -599,7 +599,7 @@ int cik_sdma_ring_test(struct radeon_device *rdev, |
3566 | tmp = 0xCAFEDEAD; |
3567 | writel(tmp, ptr); |
3568 | |
3569 | - r = radeon_ring_lock(rdev, ring, 4); |
3570 | + r = radeon_ring_lock(rdev, ring, 5); |
3571 | if (r) { |
3572 | DRM_ERROR("radeon: dma failed to lock ring %d (%d).\n", ring->idx, r); |
3573 | return r; |
3574 | diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h |
3575 | index 98bae9d7b74d..d1b2c71b192a 100644 |
3576 | --- a/drivers/gpu/drm/radeon/cikd.h |
3577 | +++ b/drivers/gpu/drm/radeon/cikd.h |
3578 | @@ -882,6 +882,15 @@ |
3579 | # define DC_HPD6_RX_INTERRUPT (1 << 18) |
3580 | #define DISP_INTERRUPT_STATUS_CONTINUE6 0x6780 |
3581 | |
3582 | +/* 0x6858, 0x7458, 0x10058, 0x10c58, 0x11858, 0x12458 */ |
3583 | +#define GRPH_INT_STATUS 0x6858 |
3584 | +# define GRPH_PFLIP_INT_OCCURRED (1 << 0) |
3585 | +# define GRPH_PFLIP_INT_CLEAR (1 << 8) |
3586 | +/* 0x685c, 0x745c, 0x1005c, 0x10c5c, 0x1185c, 0x1245c */ |
3587 | +#define GRPH_INT_CONTROL 0x685c |
3588 | +# define GRPH_PFLIP_INT_MASK (1 << 0) |
3589 | +# define GRPH_PFLIP_INT_TYPE (1 << 8) |
3590 | + |
3591 | #define DAC_AUTODETECT_INT_CONTROL 0x67c8 |
3592 | |
3593 | #define DC_HPD1_INT_STATUS 0x601c |
3594 | diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c |
3595 | index 94e858751994..0a65dc7e93e7 100644 |
3596 | --- a/drivers/gpu/drm/radeon/dce6_afmt.c |
3597 | +++ b/drivers/gpu/drm/radeon/dce6_afmt.c |
3598 | @@ -309,11 +309,17 @@ int dce6_audio_init(struct radeon_device *rdev) |
3599 | |
3600 | rdev->audio.enabled = true; |
3601 | |
3602 | - if (ASIC_IS_DCE8(rdev)) |
3603 | + if (ASIC_IS_DCE81(rdev)) /* KV: 4 streams, 7 endpoints */ |
3604 | + rdev->audio.num_pins = 7; |
3605 | + else if (ASIC_IS_DCE83(rdev)) /* KB: 2 streams, 3 endpoints */ |
3606 | + rdev->audio.num_pins = 3; |
3607 | + else if (ASIC_IS_DCE8(rdev)) /* BN/HW: 6 streams, 7 endpoints */ |
3608 | + rdev->audio.num_pins = 7; |
3609 | + else if (ASIC_IS_DCE61(rdev)) /* TN: 4 streams, 6 endpoints */ |
3610 | rdev->audio.num_pins = 6; |
3611 | - else if (ASIC_IS_DCE61(rdev)) |
3612 | - rdev->audio.num_pins = 4; |
3613 | - else |
3614 | + else if (ASIC_IS_DCE64(rdev)) /* OL: 2 streams, 2 endpoints */ |
3615 | + rdev->audio.num_pins = 2; |
3616 | + else /* SI: 6 streams, 6 endpoints */ |
3617 | rdev->audio.num_pins = 6; |
3618 | |
3619 | for (i = 0; i < rdev->audio.num_pins; i++) { |
3620 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c |
3621 | index 27b0ff16082e..971d9339ce80 100644 |
3622 | --- a/drivers/gpu/drm/radeon/evergreen.c |
3623 | +++ b/drivers/gpu/drm/radeon/evergreen.c |
3624 | @@ -4375,7 +4375,6 @@ int evergreen_irq_set(struct radeon_device *rdev) |
3625 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
3626 | u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; |
3627 | u32 grbm_int_cntl = 0; |
3628 | - u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0; |
3629 | u32 afmt1 = 0, afmt2 = 0, afmt3 = 0, afmt4 = 0, afmt5 = 0, afmt6 = 0; |
3630 | u32 dma_cntl, dma_cntl1 = 0; |
3631 | u32 thermal_int = 0; |
3632 | @@ -4558,15 +4557,21 @@ int evergreen_irq_set(struct radeon_device *rdev) |
3633 | WREG32(INT_MASK + EVERGREEN_CRTC5_REGISTER_OFFSET, crtc6); |
3634 | } |
3635 | |
3636 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1); |
3637 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); |
3638 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, |
3639 | + GRPH_PFLIP_INT_MASK); |
3640 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, |
3641 | + GRPH_PFLIP_INT_MASK); |
3642 | if (rdev->num_crtc >= 4) { |
3643 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); |
3644 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); |
3645 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, |
3646 | + GRPH_PFLIP_INT_MASK); |
3647 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, |
3648 | + GRPH_PFLIP_INT_MASK); |
3649 | } |
3650 | if (rdev->num_crtc >= 6) { |
3651 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); |
3652 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); |
3653 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, |
3654 | + GRPH_PFLIP_INT_MASK); |
3655 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, |
3656 | + GRPH_PFLIP_INT_MASK); |
3657 | } |
3658 | |
3659 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
3660 | @@ -4955,6 +4960,15 @@ restart_ih: |
3661 | break; |
3662 | } |
3663 | break; |
3664 | + case 8: /* D1 page flip */ |
3665 | + case 10: /* D2 page flip */ |
3666 | + case 12: /* D3 page flip */ |
3667 | + case 14: /* D4 page flip */ |
3668 | + case 16: /* D5 page flip */ |
3669 | + case 18: /* D6 page flip */ |
3670 | + DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); |
3671 | + radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); |
3672 | + break; |
3673 | case 42: /* HPD hotplug */ |
3674 | switch (src_data) { |
3675 | case 0: |
3676 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
3677 | index 647ef4079217..f28ab840cc23 100644 |
3678 | --- a/drivers/gpu/drm/radeon/r600.c |
3679 | +++ b/drivers/gpu/drm/radeon/r600.c |
3680 | @@ -3509,7 +3509,6 @@ int r600_irq_set(struct radeon_device *rdev) |
3681 | u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0; |
3682 | u32 grbm_int_cntl = 0; |
3683 | u32 hdmi0, hdmi1; |
3684 | - u32 d1grph = 0, d2grph = 0; |
3685 | u32 dma_cntl; |
3686 | u32 thermal_int = 0; |
3687 | |
3688 | @@ -3618,8 +3617,8 @@ int r600_irq_set(struct radeon_device *rdev) |
3689 | WREG32(CP_INT_CNTL, cp_int_cntl); |
3690 | WREG32(DMA_CNTL, dma_cntl); |
3691 | WREG32(DxMODE_INT_MASK, mode_int); |
3692 | - WREG32(D1GRPH_INTERRUPT_CONTROL, d1grph); |
3693 | - WREG32(D2GRPH_INTERRUPT_CONTROL, d2grph); |
3694 | + WREG32(D1GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK); |
3695 | + WREG32(D2GRPH_INTERRUPT_CONTROL, DxGRPH_PFLIP_INT_MASK); |
3696 | WREG32(GRBM_INT_CNTL, grbm_int_cntl); |
3697 | if (ASIC_IS_DCE3(rdev)) { |
3698 | WREG32(DC_HPD1_INT_CONTROL, hpd1); |
3699 | @@ -3922,6 +3921,14 @@ restart_ih: |
3700 | break; |
3701 | } |
3702 | break; |
3703 | + case 9: /* D1 pflip */ |
3704 | + DRM_DEBUG("IH: D1 flip\n"); |
3705 | + radeon_crtc_handle_flip(rdev, 0); |
3706 | + break; |
3707 | + case 11: /* D2 pflip */ |
3708 | + DRM_DEBUG("IH: D2 flip\n"); |
3709 | + radeon_crtc_handle_flip(rdev, 1); |
3710 | + break; |
3711 | case 19: /* HPD/DAC hotplug */ |
3712 | switch (src_data) { |
3713 | case 0: |
3714 | diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c |
3715 | index e4cc9b314ce9..813db8de52b7 100644 |
3716 | --- a/drivers/gpu/drm/radeon/r600_dpm.c |
3717 | +++ b/drivers/gpu/drm/radeon/r600_dpm.c |
3718 | @@ -158,16 +158,18 @@ u32 r600_dpm_get_vblank_time(struct radeon_device *rdev) |
3719 | u32 line_time_us, vblank_lines; |
3720 | u32 vblank_time_us = 0xffffffff; /* if the displays are off, vblank time is max */ |
3721 | |
3722 | - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
3723 | - radeon_crtc = to_radeon_crtc(crtc); |
3724 | - if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
3725 | - line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / |
3726 | - radeon_crtc->hw_mode.clock; |
3727 | - vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - |
3728 | - radeon_crtc->hw_mode.crtc_vdisplay + |
3729 | - (radeon_crtc->v_border * 2); |
3730 | - vblank_time_us = vblank_lines * line_time_us; |
3731 | - break; |
3732 | + if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
3733 | + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
3734 | + radeon_crtc = to_radeon_crtc(crtc); |
3735 | + if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
3736 | + line_time_us = (radeon_crtc->hw_mode.crtc_htotal * 1000) / |
3737 | + radeon_crtc->hw_mode.clock; |
3738 | + vblank_lines = radeon_crtc->hw_mode.crtc_vblank_end - |
3739 | + radeon_crtc->hw_mode.crtc_vdisplay + |
3740 | + (radeon_crtc->v_border * 2); |
3741 | + vblank_time_us = vblank_lines * line_time_us; |
3742 | + break; |
3743 | + } |
3744 | } |
3745 | } |
3746 | |
3747 | @@ -181,14 +183,15 @@ u32 r600_dpm_get_vrefresh(struct radeon_device *rdev) |
3748 | struct radeon_crtc *radeon_crtc; |
3749 | u32 vrefresh = 0; |
3750 | |
3751 | - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
3752 | - radeon_crtc = to_radeon_crtc(crtc); |
3753 | - if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
3754 | - vrefresh = radeon_crtc->hw_mode.vrefresh; |
3755 | - break; |
3756 | + if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
3757 | + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
3758 | + radeon_crtc = to_radeon_crtc(crtc); |
3759 | + if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
3760 | + vrefresh = radeon_crtc->hw_mode.vrefresh; |
3761 | + break; |
3762 | + } |
3763 | } |
3764 | } |
3765 | - |
3766 | return vrefresh; |
3767 | } |
3768 | |
3769 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h |
3770 | index e887d027b6d0..08e86f90c9a4 100644 |
3771 | --- a/drivers/gpu/drm/radeon/radeon.h |
3772 | +++ b/drivers/gpu/drm/radeon/radeon.h |
3773 | @@ -733,6 +733,12 @@ struct cik_irq_stat_regs { |
3774 | u32 disp_int_cont4; |
3775 | u32 disp_int_cont5; |
3776 | u32 disp_int_cont6; |
3777 | + u32 d1grph_int; |
3778 | + u32 d2grph_int; |
3779 | + u32 d3grph_int; |
3780 | + u32 d4grph_int; |
3781 | + u32 d5grph_int; |
3782 | + u32 d6grph_int; |
3783 | }; |
3784 | |
3785 | union radeon_irq_stat_regs { |
3786 | @@ -742,7 +748,7 @@ union radeon_irq_stat_regs { |
3787 | struct cik_irq_stat_regs cik; |
3788 | }; |
3789 | |
3790 | -#define RADEON_MAX_HPD_PINS 6 |
3791 | +#define RADEON_MAX_HPD_PINS 7 |
3792 | #define RADEON_MAX_CRTCS 6 |
3793 | #define RADEON_MAX_AFMT_BLOCKS 7 |
3794 | |
3795 | @@ -2242,6 +2248,7 @@ struct radeon_device { |
3796 | bool have_disp_power_ref; |
3797 | }; |
3798 | |
3799 | +bool radeon_is_px(struct drm_device *dev); |
3800 | int radeon_device_init(struct radeon_device *rdev, |
3801 | struct drm_device *ddev, |
3802 | struct pci_dev *pdev, |
3803 | @@ -2552,6 +2559,9 @@ void r100_pll_errata_after_index(struct radeon_device *rdev); |
3804 | #define ASIC_IS_DCE64(rdev) ((rdev->family == CHIP_OLAND)) |
3805 | #define ASIC_IS_NODCE(rdev) ((rdev->family == CHIP_HAINAN)) |
3806 | #define ASIC_IS_DCE8(rdev) ((rdev->family >= CHIP_BONAIRE)) |
3807 | +#define ASIC_IS_DCE81(rdev) ((rdev->family == CHIP_KAVERI)) |
3808 | +#define ASIC_IS_DCE82(rdev) ((rdev->family == CHIP_BONAIRE)) |
3809 | +#define ASIC_IS_DCE83(rdev) ((rdev->family == CHIP_KABINI)) |
3810 | |
3811 | #define ASIC_IS_LOMBOK(rdev) ((rdev->ddev->pdev->device == 0x6849) || \ |
3812 | (rdev->ddev->pdev->device == 0x6850) || \ |
3813 | diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
3814 | index fa9a9c02751e..a9fb0d016d38 100644 |
3815 | --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
3816 | +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c |
3817 | @@ -59,7 +59,7 @@ struct atpx_mux { |
3818 | u16 mux; |
3819 | } __packed; |
3820 | |
3821 | -bool radeon_is_px(void) { |
3822 | +bool radeon_has_atpx(void) { |
3823 | return radeon_atpx_priv.atpx_detected; |
3824 | } |
3825 | |
3826 | @@ -528,6 +528,13 @@ static bool radeon_atpx_detect(void) |
3827 | has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
3828 | } |
3829 | |
3830 | + /* some newer PX laptops mark the dGPU as a non-VGA display device */ |
3831 | + while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { |
3832 | + vga_count++; |
3833 | + |
3834 | + has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); |
3835 | + } |
3836 | + |
3837 | if (has_atpx && vga_count == 2) { |
3838 | acpi_get_name(radeon_atpx_priv.atpx.handle, ACPI_FULL_PATHNAME, &buffer); |
3839 | printk(KERN_INFO "VGA switcheroo: detected switching method %s handle\n", |
3840 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c |
3841 | index 044bc98fb459..7f370b309590 100644 |
3842 | --- a/drivers/gpu/drm/radeon/radeon_device.c |
3843 | +++ b/drivers/gpu/drm/radeon/radeon_device.c |
3844 | @@ -102,11 +102,14 @@ static const char radeon_family_name[][16] = { |
3845 | "LAST", |
3846 | }; |
3847 | |
3848 | -#if defined(CONFIG_VGA_SWITCHEROO) |
3849 | -bool radeon_is_px(void); |
3850 | -#else |
3851 | -static inline bool radeon_is_px(void) { return false; } |
3852 | -#endif |
3853 | +bool radeon_is_px(struct drm_device *dev) |
3854 | +{ |
3855 | + struct radeon_device *rdev = dev->dev_private; |
3856 | + |
3857 | + if (rdev->flags & RADEON_IS_PX) |
3858 | + return true; |
3859 | + return false; |
3860 | +} |
3861 | |
3862 | /** |
3863 | * radeon_program_register_sequence - program an array of registers. |
3864 | @@ -1082,7 +1085,7 @@ static void radeon_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero |
3865 | { |
3866 | struct drm_device *dev = pci_get_drvdata(pdev); |
3867 | |
3868 | - if (radeon_is_px() && state == VGA_SWITCHEROO_OFF) |
3869 | + if (radeon_is_px(dev) && state == VGA_SWITCHEROO_OFF) |
3870 | return; |
3871 | |
3872 | if (state == VGA_SWITCHEROO_ON) { |
3873 | @@ -1303,9 +1306,7 @@ int radeon_device_init(struct radeon_device *rdev, |
3874 | * ignore it */ |
3875 | vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); |
3876 | |
3877 | - if (radeon_runtime_pm == 1) |
3878 | - runtime = true; |
3879 | - if ((radeon_runtime_pm == -1) && radeon_is_px()) |
3880 | + if (rdev->flags & RADEON_IS_PX) |
3881 | runtime = true; |
3882 | vga_switcheroo_register_client(rdev->pdev, &radeon_switcheroo_ops, runtime); |
3883 | if (runtime) |
3884 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
3885 | index 6e6f82c53fef..df6d0079d0af 100644 |
3886 | --- a/drivers/gpu/drm/radeon/radeon_display.c |
3887 | +++ b/drivers/gpu/drm/radeon/radeon_display.c |
3888 | @@ -282,6 +282,10 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id) |
3889 | u32 update_pending; |
3890 | int vpos, hpos; |
3891 | |
3892 | + /* can happen during initialization */ |
3893 | + if (radeon_crtc == NULL) |
3894 | + return; |
3895 | + |
3896 | spin_lock_irqsave(&rdev->ddev->event_lock, flags); |
3897 | work = radeon_crtc->unpin_work; |
3898 | if (work == NULL || |
3899 | diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c |
3900 | index f633c2782170..9c0056f0a68a 100644 |
3901 | --- a/drivers/gpu/drm/radeon/radeon_drv.c |
3902 | +++ b/drivers/gpu/drm/radeon/radeon_drv.c |
3903 | @@ -113,6 +113,7 @@ extern int radeon_get_crtc_scanoutpos(struct drm_device *dev, int crtc, |
3904 | unsigned int flags, |
3905 | int *vpos, int *hpos, ktime_t *stime, |
3906 | ktime_t *etime); |
3907 | +extern bool radeon_is_px(struct drm_device *dev); |
3908 | extern const struct drm_ioctl_desc radeon_ioctls_kms[]; |
3909 | extern int radeon_max_kms_ioctl; |
3910 | int radeon_mmap(struct file *filp, struct vm_area_struct *vma); |
3911 | @@ -142,11 +143,9 @@ void radeon_debugfs_cleanup(struct drm_minor *minor); |
3912 | #if defined(CONFIG_VGA_SWITCHEROO) |
3913 | void radeon_register_atpx_handler(void); |
3914 | void radeon_unregister_atpx_handler(void); |
3915 | -bool radeon_is_px(void); |
3916 | #else |
3917 | static inline void radeon_register_atpx_handler(void) {} |
3918 | static inline void radeon_unregister_atpx_handler(void) {} |
3919 | -static inline bool radeon_is_px(void) { return false; } |
3920 | #endif |
3921 | |
3922 | int radeon_no_wb; |
3923 | @@ -403,12 +402,7 @@ static int radeon_pmops_runtime_suspend(struct device *dev) |
3924 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
3925 | int ret; |
3926 | |
3927 | - if (radeon_runtime_pm == 0) { |
3928 | - pm_runtime_forbid(dev); |
3929 | - return -EBUSY; |
3930 | - } |
3931 | - |
3932 | - if (radeon_runtime_pm == -1 && !radeon_is_px()) { |
3933 | + if (!radeon_is_px(drm_dev)) { |
3934 | pm_runtime_forbid(dev); |
3935 | return -EBUSY; |
3936 | } |
3937 | @@ -432,10 +426,7 @@ static int radeon_pmops_runtime_resume(struct device *dev) |
3938 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
3939 | int ret; |
3940 | |
3941 | - if (radeon_runtime_pm == 0) |
3942 | - return -EINVAL; |
3943 | - |
3944 | - if (radeon_runtime_pm == -1 && !radeon_is_px()) |
3945 | + if (!radeon_is_px(drm_dev)) |
3946 | return -EINVAL; |
3947 | |
3948 | drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; |
3949 | @@ -460,14 +451,7 @@ static int radeon_pmops_runtime_idle(struct device *dev) |
3950 | struct drm_device *drm_dev = pci_get_drvdata(pdev); |
3951 | struct drm_crtc *crtc; |
3952 | |
3953 | - if (radeon_runtime_pm == 0) { |
3954 | - pm_runtime_forbid(dev); |
3955 | - return -EBUSY; |
3956 | - } |
3957 | - |
3958 | - /* are we PX enabled? */ |
3959 | - if (radeon_runtime_pm == -1 && !radeon_is_px()) { |
3960 | - DRM_DEBUG_DRIVER("failing to power off - not px\n"); |
3961 | + if (!radeon_is_px(drm_dev)) { |
3962 | pm_runtime_forbid(dev); |
3963 | return -EBUSY; |
3964 | } |
3965 | diff --git a/drivers/gpu/drm/radeon/radeon_family.h b/drivers/gpu/drm/radeon/radeon_family.h |
3966 | index 614ad549297f..9da5da4ffd17 100644 |
3967 | --- a/drivers/gpu/drm/radeon/radeon_family.h |
3968 | +++ b/drivers/gpu/drm/radeon/radeon_family.h |
3969 | @@ -115,6 +115,7 @@ enum radeon_chip_flags { |
3970 | RADEON_NEW_MEMMAP = 0x00400000UL, |
3971 | RADEON_IS_PCI = 0x00800000UL, |
3972 | RADEON_IS_IGPGART = 0x01000000UL, |
3973 | + RADEON_IS_PX = 0x02000000UL, |
3974 | }; |
3975 | |
3976 | #endif |
3977 | diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c |
3978 | index 66ed3ea71440..ea34a31d3bc8 100644 |
3979 | --- a/drivers/gpu/drm/radeon/radeon_kms.c |
3980 | +++ b/drivers/gpu/drm/radeon/radeon_kms.c |
3981 | @@ -35,9 +35,9 @@ |
3982 | #include <linux/pm_runtime.h> |
3983 | |
3984 | #if defined(CONFIG_VGA_SWITCHEROO) |
3985 | -bool radeon_is_px(void); |
3986 | +bool radeon_has_atpx(void); |
3987 | #else |
3988 | -static inline bool radeon_is_px(void) { return false; } |
3989 | +static inline bool radeon_has_atpx(void) { return false; } |
3990 | #endif |
3991 | |
3992 | /** |
3993 | @@ -107,6 +107,11 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) |
3994 | flags |= RADEON_IS_PCI; |
3995 | } |
3996 | |
3997 | + if ((radeon_runtime_pm != 0) && |
3998 | + radeon_has_atpx() && |
3999 | + ((flags & RADEON_IS_IGP) == 0)) |
4000 | + flags |= RADEON_IS_PX; |
4001 | + |
4002 | /* radeon_device_init should report only fatal error |
4003 | * like memory allocation failure or iomapping failure, |
4004 | * or memory manager initialization failure, it must |
4005 | @@ -137,8 +142,7 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) |
4006 | "Error during ACPI methods call\n"); |
4007 | } |
4008 | |
4009 | - if ((radeon_runtime_pm == 1) || |
4010 | - ((radeon_runtime_pm == -1) && radeon_is_px())) { |
4011 | + if (radeon_is_px(dev)) { |
4012 | pm_runtime_use_autosuspend(dev->dev); |
4013 | pm_runtime_set_autosuspend_delay(dev->dev, 5000); |
4014 | pm_runtime_set_active(dev->dev); |
4015 | diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c |
4016 | index 8e8153e471c2..a957024eae24 100644 |
4017 | --- a/drivers/gpu/drm/radeon/radeon_pm.c |
4018 | +++ b/drivers/gpu/drm/radeon/radeon_pm.c |
4019 | @@ -603,7 +603,6 @@ static const struct attribute_group *hwmon_groups[] = { |
4020 | static int radeon_hwmon_init(struct radeon_device *rdev) |
4021 | { |
4022 | int err = 0; |
4023 | - struct device *hwmon_dev; |
4024 | |
4025 | switch (rdev->pm.int_thermal_type) { |
4026 | case THERMAL_TYPE_RV6XX: |
4027 | @@ -616,11 +615,11 @@ static int radeon_hwmon_init(struct radeon_device *rdev) |
4028 | case THERMAL_TYPE_KV: |
4029 | if (rdev->asic->pm.get_temperature == NULL) |
4030 | return err; |
4031 | - hwmon_dev = hwmon_device_register_with_groups(rdev->dev, |
4032 | - "radeon", rdev, |
4033 | - hwmon_groups); |
4034 | - if (IS_ERR(hwmon_dev)) { |
4035 | - err = PTR_ERR(hwmon_dev); |
4036 | + rdev->pm.int_hwmon_dev = hwmon_device_register_with_groups(rdev->dev, |
4037 | + "radeon", rdev, |
4038 | + hwmon_groups); |
4039 | + if (IS_ERR(rdev->pm.int_hwmon_dev)) { |
4040 | + err = PTR_ERR(rdev->pm.int_hwmon_dev); |
4041 | dev_err(rdev->dev, |
4042 | "Unable to register hwmon device: %d\n", err); |
4043 | } |
4044 | @@ -632,6 +631,12 @@ static int radeon_hwmon_init(struct radeon_device *rdev) |
4045 | return err; |
4046 | } |
4047 | |
4048 | +static void radeon_hwmon_fini(struct radeon_device *rdev) |
4049 | +{ |
4050 | + if (rdev->pm.int_hwmon_dev) |
4051 | + hwmon_device_unregister(rdev->pm.int_hwmon_dev); |
4052 | +} |
4053 | + |
4054 | static void radeon_dpm_thermal_work_handler(struct work_struct *work) |
4055 | { |
4056 | struct radeon_device *rdev = |
4057 | @@ -1235,6 +1240,7 @@ int radeon_pm_init(struct radeon_device *rdev) |
4058 | case CHIP_RV670: |
4059 | case CHIP_RS780: |
4060 | case CHIP_RS880: |
4061 | + case CHIP_RV770: |
4062 | case CHIP_BARTS: |
4063 | case CHIP_TURKS: |
4064 | case CHIP_CAICOS: |
4065 | @@ -1251,7 +1257,6 @@ int radeon_pm_init(struct radeon_device *rdev) |
4066 | else |
4067 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
4068 | break; |
4069 | - case CHIP_RV770: |
4070 | case CHIP_RV730: |
4071 | case CHIP_RV710: |
4072 | case CHIP_RV740: |
4073 | @@ -1331,6 +1336,8 @@ static void radeon_pm_fini_old(struct radeon_device *rdev) |
4074 | device_remove_file(rdev->dev, &dev_attr_power_method); |
4075 | } |
4076 | |
4077 | + radeon_hwmon_fini(rdev); |
4078 | + |
4079 | if (rdev->pm.power_state) |
4080 | kfree(rdev->pm.power_state); |
4081 | } |
4082 | @@ -1350,6 +1357,8 @@ static void radeon_pm_fini_dpm(struct radeon_device *rdev) |
4083 | } |
4084 | radeon_dpm_fini(rdev); |
4085 | |
4086 | + radeon_hwmon_fini(rdev); |
4087 | + |
4088 | if (rdev->pm.power_state) |
4089 | kfree(rdev->pm.power_state); |
4090 | } |
4091 | @@ -1375,12 +1384,14 @@ static void radeon_pm_compute_clocks_old(struct radeon_device *rdev) |
4092 | |
4093 | rdev->pm.active_crtcs = 0; |
4094 | rdev->pm.active_crtc_count = 0; |
4095 | - list_for_each_entry(crtc, |
4096 | - &ddev->mode_config.crtc_list, head) { |
4097 | - radeon_crtc = to_radeon_crtc(crtc); |
4098 | - if (radeon_crtc->enabled) { |
4099 | - rdev->pm.active_crtcs |= (1 << radeon_crtc->crtc_id); |
4100 | - rdev->pm.active_crtc_count++; |
4101 | + if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
4102 | + list_for_each_entry(crtc, |
4103 | + &ddev->mode_config.crtc_list, head) { |
4104 | + radeon_crtc = to_radeon_crtc(crtc); |
4105 | + if (radeon_crtc->enabled) { |
4106 | + rdev->pm.active_crtcs |= (1 << radeon_crtc->crtc_id); |
4107 | + rdev->pm.active_crtc_count++; |
4108 | + } |
4109 | } |
4110 | } |
4111 | |
4112 | @@ -1447,12 +1458,14 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) |
4113 | /* update active crtc counts */ |
4114 | rdev->pm.dpm.new_active_crtcs = 0; |
4115 | rdev->pm.dpm.new_active_crtc_count = 0; |
4116 | - list_for_each_entry(crtc, |
4117 | - &ddev->mode_config.crtc_list, head) { |
4118 | - radeon_crtc = to_radeon_crtc(crtc); |
4119 | - if (crtc->enabled) { |
4120 | - rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id); |
4121 | - rdev->pm.dpm.new_active_crtc_count++; |
4122 | + if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { |
4123 | + list_for_each_entry(crtc, |
4124 | + &ddev->mode_config.crtc_list, head) { |
4125 | + radeon_crtc = to_radeon_crtc(crtc); |
4126 | + if (crtc->enabled) { |
4127 | + rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id); |
4128 | + rdev->pm.dpm.new_active_crtc_count++; |
4129 | + } |
4130 | } |
4131 | } |
4132 | |
4133 | diff --git a/drivers/gpu/drm/radeon/radeon_ucode.h b/drivers/gpu/drm/radeon/radeon_ucode.h |
4134 | index a77cd274dfc3..58d12938c0b8 100644 |
4135 | --- a/drivers/gpu/drm/radeon/radeon_ucode.h |
4136 | +++ b/drivers/gpu/drm/radeon/radeon_ucode.h |
4137 | @@ -57,9 +57,14 @@ |
4138 | #define BTC_MC_UCODE_SIZE 6024 |
4139 | #define CAYMAN_MC_UCODE_SIZE 6037 |
4140 | #define SI_MC_UCODE_SIZE 7769 |
4141 | +#define TAHITI_MC_UCODE_SIZE 7808 |
4142 | +#define PITCAIRN_MC_UCODE_SIZE 7775 |
4143 | +#define VERDE_MC_UCODE_SIZE 7875 |
4144 | #define OLAND_MC_UCODE_SIZE 7863 |
4145 | -#define CIK_MC_UCODE_SIZE 7866 |
4146 | +#define BONAIRE_MC_UCODE_SIZE 7866 |
4147 | +#define BONAIRE_MC2_UCODE_SIZE 7948 |
4148 | #define HAWAII_MC_UCODE_SIZE 7933 |
4149 | +#define HAWAII_MC2_UCODE_SIZE 8091 |
4150 | |
4151 | /* SDMA */ |
4152 | #define CIK_SDMA_UCODE_SIZE 1050 |
4153 | diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c |
4154 | index 3e6804b2b2ef..414e07928693 100644 |
4155 | --- a/drivers/gpu/drm/radeon/radeon_uvd.c |
4156 | +++ b/drivers/gpu/drm/radeon/radeon_uvd.c |
4157 | @@ -465,6 +465,10 @@ static int radeon_uvd_cs_reloc(struct radeon_cs_parser *p, |
4158 | cmd = radeon_get_ib_value(p, p->idx) >> 1; |
4159 | |
4160 | if (cmd < 0x4) { |
4161 | + if (end <= start) { |
4162 | + DRM_ERROR("invalid reloc offset %X!\n", offset); |
4163 | + return -EINVAL; |
4164 | + } |
4165 | if ((end - start) < buf_sizes[cmd]) { |
4166 | DRM_ERROR("buffer (%d) to small (%d / %d)!\n", cmd, |
4167 | (unsigned)(end - start), buf_sizes[cmd]); |
4168 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c |
4169 | index 9a124d0608b3..cb7508dc94f3 100644 |
4170 | --- a/drivers/gpu/drm/radeon/si.c |
4171 | +++ b/drivers/gpu/drm/radeon/si.c |
4172 | @@ -39,30 +39,35 @@ MODULE_FIRMWARE("radeon/TAHITI_pfp.bin"); |
4173 | MODULE_FIRMWARE("radeon/TAHITI_me.bin"); |
4174 | MODULE_FIRMWARE("radeon/TAHITI_ce.bin"); |
4175 | MODULE_FIRMWARE("radeon/TAHITI_mc.bin"); |
4176 | +MODULE_FIRMWARE("radeon/TAHITI_mc2.bin"); |
4177 | MODULE_FIRMWARE("radeon/TAHITI_rlc.bin"); |
4178 | MODULE_FIRMWARE("radeon/TAHITI_smc.bin"); |
4179 | MODULE_FIRMWARE("radeon/PITCAIRN_pfp.bin"); |
4180 | MODULE_FIRMWARE("radeon/PITCAIRN_me.bin"); |
4181 | MODULE_FIRMWARE("radeon/PITCAIRN_ce.bin"); |
4182 | MODULE_FIRMWARE("radeon/PITCAIRN_mc.bin"); |
4183 | +MODULE_FIRMWARE("radeon/PITCAIRN_mc2.bin"); |
4184 | MODULE_FIRMWARE("radeon/PITCAIRN_rlc.bin"); |
4185 | MODULE_FIRMWARE("radeon/PITCAIRN_smc.bin"); |
4186 | MODULE_FIRMWARE("radeon/VERDE_pfp.bin"); |
4187 | MODULE_FIRMWARE("radeon/VERDE_me.bin"); |
4188 | MODULE_FIRMWARE("radeon/VERDE_ce.bin"); |
4189 | MODULE_FIRMWARE("radeon/VERDE_mc.bin"); |
4190 | +MODULE_FIRMWARE("radeon/VERDE_mc2.bin"); |
4191 | MODULE_FIRMWARE("radeon/VERDE_rlc.bin"); |
4192 | MODULE_FIRMWARE("radeon/VERDE_smc.bin"); |
4193 | MODULE_FIRMWARE("radeon/OLAND_pfp.bin"); |
4194 | MODULE_FIRMWARE("radeon/OLAND_me.bin"); |
4195 | MODULE_FIRMWARE("radeon/OLAND_ce.bin"); |
4196 | MODULE_FIRMWARE("radeon/OLAND_mc.bin"); |
4197 | +MODULE_FIRMWARE("radeon/OLAND_mc2.bin"); |
4198 | MODULE_FIRMWARE("radeon/OLAND_rlc.bin"); |
4199 | MODULE_FIRMWARE("radeon/OLAND_smc.bin"); |
4200 | MODULE_FIRMWARE("radeon/HAINAN_pfp.bin"); |
4201 | MODULE_FIRMWARE("radeon/HAINAN_me.bin"); |
4202 | MODULE_FIRMWARE("radeon/HAINAN_ce.bin"); |
4203 | MODULE_FIRMWARE("radeon/HAINAN_mc.bin"); |
4204 | +MODULE_FIRMWARE("radeon/HAINAN_mc2.bin"); |
4205 | MODULE_FIRMWARE("radeon/HAINAN_rlc.bin"); |
4206 | MODULE_FIRMWARE("radeon/HAINAN_smc.bin"); |
4207 | |
4208 | @@ -1467,36 +1472,33 @@ int si_mc_load_microcode(struct radeon_device *rdev) |
4209 | const __be32 *fw_data; |
4210 | u32 running, blackout = 0; |
4211 | u32 *io_mc_regs; |
4212 | - int i, ucode_size, regs_size; |
4213 | + int i, regs_size, ucode_size; |
4214 | |
4215 | if (!rdev->mc_fw) |
4216 | return -EINVAL; |
4217 | |
4218 | + ucode_size = rdev->mc_fw->size / 4; |
4219 | + |
4220 | switch (rdev->family) { |
4221 | case CHIP_TAHITI: |
4222 | io_mc_regs = (u32 *)&tahiti_io_mc_regs; |
4223 | - ucode_size = SI_MC_UCODE_SIZE; |
4224 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
4225 | break; |
4226 | case CHIP_PITCAIRN: |
4227 | io_mc_regs = (u32 *)&pitcairn_io_mc_regs; |
4228 | - ucode_size = SI_MC_UCODE_SIZE; |
4229 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
4230 | break; |
4231 | case CHIP_VERDE: |
4232 | default: |
4233 | io_mc_regs = (u32 *)&verde_io_mc_regs; |
4234 | - ucode_size = SI_MC_UCODE_SIZE; |
4235 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
4236 | break; |
4237 | case CHIP_OLAND: |
4238 | io_mc_regs = (u32 *)&oland_io_mc_regs; |
4239 | - ucode_size = OLAND_MC_UCODE_SIZE; |
4240 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
4241 | break; |
4242 | case CHIP_HAINAN: |
4243 | io_mc_regs = (u32 *)&hainan_io_mc_regs; |
4244 | - ucode_size = OLAND_MC_UCODE_SIZE; |
4245 | regs_size = TAHITI_IO_MC_REGS_SIZE; |
4246 | break; |
4247 | } |
4248 | @@ -1552,7 +1554,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
4249 | const char *chip_name; |
4250 | const char *rlc_chip_name; |
4251 | size_t pfp_req_size, me_req_size, ce_req_size, rlc_req_size, mc_req_size; |
4252 | - size_t smc_req_size; |
4253 | + size_t smc_req_size, mc2_req_size; |
4254 | char fw_name[30]; |
4255 | int err; |
4256 | |
4257 | @@ -1567,6 +1569,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
4258 | ce_req_size = SI_CE_UCODE_SIZE * 4; |
4259 | rlc_req_size = SI_RLC_UCODE_SIZE * 4; |
4260 | mc_req_size = SI_MC_UCODE_SIZE * 4; |
4261 | + mc2_req_size = TAHITI_MC_UCODE_SIZE * 4; |
4262 | smc_req_size = ALIGN(TAHITI_SMC_UCODE_SIZE, 4); |
4263 | break; |
4264 | case CHIP_PITCAIRN: |
4265 | @@ -1577,6 +1580,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
4266 | ce_req_size = SI_CE_UCODE_SIZE * 4; |
4267 | rlc_req_size = SI_RLC_UCODE_SIZE * 4; |
4268 | mc_req_size = SI_MC_UCODE_SIZE * 4; |
4269 | + mc2_req_size = PITCAIRN_MC_UCODE_SIZE * 4; |
4270 | smc_req_size = ALIGN(PITCAIRN_SMC_UCODE_SIZE, 4); |
4271 | break; |
4272 | case CHIP_VERDE: |
4273 | @@ -1587,6 +1591,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
4274 | ce_req_size = SI_CE_UCODE_SIZE * 4; |
4275 | rlc_req_size = SI_RLC_UCODE_SIZE * 4; |
4276 | mc_req_size = SI_MC_UCODE_SIZE * 4; |
4277 | + mc2_req_size = VERDE_MC_UCODE_SIZE * 4; |
4278 | smc_req_size = ALIGN(VERDE_SMC_UCODE_SIZE, 4); |
4279 | break; |
4280 | case CHIP_OLAND: |
4281 | @@ -1596,7 +1601,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
4282 | me_req_size = SI_PM4_UCODE_SIZE * 4; |
4283 | ce_req_size = SI_CE_UCODE_SIZE * 4; |
4284 | rlc_req_size = SI_RLC_UCODE_SIZE * 4; |
4285 | - mc_req_size = OLAND_MC_UCODE_SIZE * 4; |
4286 | + mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4; |
4287 | smc_req_size = ALIGN(OLAND_SMC_UCODE_SIZE, 4); |
4288 | break; |
4289 | case CHIP_HAINAN: |
4290 | @@ -1606,7 +1611,7 @@ static int si_init_microcode(struct radeon_device *rdev) |
4291 | me_req_size = SI_PM4_UCODE_SIZE * 4; |
4292 | ce_req_size = SI_CE_UCODE_SIZE * 4; |
4293 | rlc_req_size = SI_RLC_UCODE_SIZE * 4; |
4294 | - mc_req_size = OLAND_MC_UCODE_SIZE * 4; |
4295 | + mc_req_size = mc2_req_size = OLAND_MC_UCODE_SIZE * 4; |
4296 | smc_req_size = ALIGN(HAINAN_SMC_UCODE_SIZE, 4); |
4297 | break; |
4298 | default: BUG(); |
4299 | @@ -1659,16 +1664,22 @@ static int si_init_microcode(struct radeon_device *rdev) |
4300 | err = -EINVAL; |
4301 | } |
4302 | |
4303 | - snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
4304 | + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc2.bin", chip_name); |
4305 | err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
4306 | - if (err) |
4307 | - goto out; |
4308 | - if (rdev->mc_fw->size != mc_req_size) { |
4309 | + if (err) { |
4310 | + snprintf(fw_name, sizeof(fw_name), "radeon/%s_mc.bin", chip_name); |
4311 | + err = request_firmware(&rdev->mc_fw, fw_name, rdev->dev); |
4312 | + if (err) |
4313 | + goto out; |
4314 | + } |
4315 | + if ((rdev->mc_fw->size != mc_req_size) && |
4316 | + (rdev->mc_fw->size != mc2_req_size)) { |
4317 | printk(KERN_ERR |
4318 | "si_mc: Bogus length %zu in firmware \"%s\"\n", |
4319 | rdev->mc_fw->size, fw_name); |
4320 | err = -EINVAL; |
4321 | } |
4322 | + DRM_INFO("%s: %zu bytes\n", fw_name, rdev->mc_fw->size); |
4323 | |
4324 | snprintf(fw_name, sizeof(fw_name), "radeon/%s_smc.bin", chip_name); |
4325 | err = request_firmware(&rdev->smc_fw, fw_name, rdev->dev); |
4326 | @@ -5777,7 +5788,6 @@ int si_irq_set(struct radeon_device *rdev) |
4327 | u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; |
4328 | u32 hpd1 = 0, hpd2 = 0, hpd3 = 0, hpd4 = 0, hpd5 = 0, hpd6 = 0; |
4329 | u32 grbm_int_cntl = 0; |
4330 | - u32 grph1 = 0, grph2 = 0, grph3 = 0, grph4 = 0, grph5 = 0, grph6 = 0; |
4331 | u32 dma_cntl, dma_cntl1; |
4332 | u32 thermal_int = 0; |
4333 | |
4334 | @@ -5916,16 +5926,22 @@ int si_irq_set(struct radeon_device *rdev) |
4335 | } |
4336 | |
4337 | if (rdev->num_crtc >= 2) { |
4338 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, grph1); |
4339 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, grph2); |
4340 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, |
4341 | + GRPH_PFLIP_INT_MASK); |
4342 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, |
4343 | + GRPH_PFLIP_INT_MASK); |
4344 | } |
4345 | if (rdev->num_crtc >= 4) { |
4346 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, grph3); |
4347 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, grph4); |
4348 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, |
4349 | + GRPH_PFLIP_INT_MASK); |
4350 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, |
4351 | + GRPH_PFLIP_INT_MASK); |
4352 | } |
4353 | if (rdev->num_crtc >= 6) { |
4354 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, grph5); |
4355 | - WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, grph6); |
4356 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, |
4357 | + GRPH_PFLIP_INT_MASK); |
4358 | + WREG32(GRPH_INT_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, |
4359 | + GRPH_PFLIP_INT_MASK); |
4360 | } |
4361 | |
4362 | if (!ASIC_IS_NODCE(rdev)) { |
4363 | @@ -6289,6 +6305,15 @@ restart_ih: |
4364 | break; |
4365 | } |
4366 | break; |
4367 | + case 8: /* D1 page flip */ |
4368 | + case 10: /* D2 page flip */ |
4369 | + case 12: /* D3 page flip */ |
4370 | + case 14: /* D4 page flip */ |
4371 | + case 16: /* D5 page flip */ |
4372 | + case 18: /* D6 page flip */ |
4373 | + DRM_DEBUG("IH: D%d flip\n", ((src_id - 8) >> 1) + 1); |
4374 | + radeon_crtc_handle_flip(rdev, (src_id - 8) >> 1); |
4375 | + break; |
4376 | case 42: /* HPD hotplug */ |
4377 | switch (src_data) { |
4378 | case 0: |
4379 | diff --git a/drivers/gpu/drm/radeon/uvd_v1_0.c b/drivers/gpu/drm/radeon/uvd_v1_0.c |
4380 | index d4a68af1a279..c310a0aeebb9 100644 |
4381 | --- a/drivers/gpu/drm/radeon/uvd_v1_0.c |
4382 | +++ b/drivers/gpu/drm/radeon/uvd_v1_0.c |
4383 | @@ -83,7 +83,10 @@ int uvd_v1_0_init(struct radeon_device *rdev) |
4384 | int r; |
4385 | |
4386 | /* raise clocks while booting up the VCPU */ |
4387 | - radeon_set_uvd_clocks(rdev, 53300, 40000); |
4388 | + if (rdev->family < CHIP_RV740) |
4389 | + radeon_set_uvd_clocks(rdev, 10000, 10000); |
4390 | + else |
4391 | + radeon_set_uvd_clocks(rdev, 53300, 40000); |
4392 | |
4393 | r = uvd_v1_0_start(rdev); |
4394 | if (r) |
4395 | @@ -407,7 +410,10 @@ int uvd_v1_0_ib_test(struct radeon_device *rdev, struct radeon_ring *ring) |
4396 | struct radeon_fence *fence = NULL; |
4397 | int r; |
4398 | |
4399 | - r = radeon_set_uvd_clocks(rdev, 53300, 40000); |
4400 | + if (rdev->family < CHIP_RV740) |
4401 | + r = radeon_set_uvd_clocks(rdev, 10000, 10000); |
4402 | + else |
4403 | + r = radeon_set_uvd_clocks(rdev, 53300, 40000); |
4404 | if (r) { |
4405 | DRM_ERROR("radeon: failed to raise UVD clocks (%d).\n", r); |
4406 | return r; |
4407 | diff --git a/drivers/gpu/host1x/hw/intr_hw.c b/drivers/gpu/host1x/hw/intr_hw.c |
4408 | index db9017adfe2b..498b37e39058 100644 |
4409 | --- a/drivers/gpu/host1x/hw/intr_hw.c |
4410 | +++ b/drivers/gpu/host1x/hw/intr_hw.c |
4411 | @@ -47,7 +47,7 @@ static irqreturn_t syncpt_thresh_isr(int irq, void *dev_id) |
4412 | unsigned long reg; |
4413 | int i, id; |
4414 | |
4415 | - for (i = 0; i <= BIT_WORD(host->info->nb_pts); i++) { |
4416 | + for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); i++) { |
4417 | reg = host1x_sync_readl(host, |
4418 | HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(i)); |
4419 | for_each_set_bit(id, ®, BITS_PER_LONG) { |
4420 | @@ -64,7 +64,7 @@ static void _host1x_intr_disable_all_syncpt_intrs(struct host1x *host) |
4421 | { |
4422 | u32 i; |
4423 | |
4424 | - for (i = 0; i <= BIT_WORD(host->info->nb_pts); ++i) { |
4425 | + for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); ++i) { |
4426 | host1x_sync_writel(host, 0xffffffffu, |
4427 | HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(i)); |
4428 | host1x_sync_writel(host, 0xffffffffu, |
4429 | diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c |
4430 | index bbb0b0d463f7..15993103c1a2 100644 |
4431 | --- a/drivers/hwmon/coretemp.c |
4432 | +++ b/drivers/hwmon/coretemp.c |
4433 | @@ -369,12 +369,12 @@ static int get_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev) |
4434 | if (cpu_has_tjmax(c)) |
4435 | dev_warn(dev, "Unable to read TjMax from CPU %u\n", id); |
4436 | } else { |
4437 | - val = (eax >> 16) & 0x7f; |
4438 | + val = (eax >> 16) & 0xff; |
4439 | /* |
4440 | * If the TjMax is not plausible, an assumption |
4441 | * will be used |
4442 | */ |
4443 | - if (val >= 85) { |
4444 | + if (val) { |
4445 | dev_dbg(dev, "TjMax is %d degrees C\n", val); |
4446 | return val * 1000; |
4447 | } |
4448 | diff --git a/drivers/hwmon/emc1403.c b/drivers/hwmon/emc1403.c |
4449 | index 90ec1173b8a1..01723f04fe45 100644 |
4450 | --- a/drivers/hwmon/emc1403.c |
4451 | +++ b/drivers/hwmon/emc1403.c |
4452 | @@ -163,7 +163,7 @@ static ssize_t store_hyst(struct device *dev, |
4453 | if (retval < 0) |
4454 | goto fail; |
4455 | |
4456 | - hyst = val - retval * 1000; |
4457 | + hyst = retval * 1000 - val; |
4458 | hyst = DIV_ROUND_CLOSEST(hyst, 1000); |
4459 | if (hyst < 0 || hyst > 255) { |
4460 | retval = -ERANGE; |
4461 | @@ -330,7 +330,7 @@ static int emc1403_detect(struct i2c_client *client, |
4462 | } |
4463 | |
4464 | id = i2c_smbus_read_byte_data(client, THERMAL_REVISION_REG); |
4465 | - if (id != 0x01) |
4466 | + if (id < 0x01 || id > 0x04) |
4467 | return -ENODEV; |
4468 | |
4469 | return 0; |
4470 | @@ -355,9 +355,9 @@ static int emc1403_probe(struct i2c_client *client, |
4471 | if (id->driver_data) |
4472 | data->groups[1] = &emc1404_group; |
4473 | |
4474 | - hwmon_dev = hwmon_device_register_with_groups(&client->dev, |
4475 | - client->name, data, |
4476 | - data->groups); |
4477 | + hwmon_dev = devm_hwmon_device_register_with_groups(&client->dev, |
4478 | + client->name, data, |
4479 | + data->groups); |
4480 | if (IS_ERR(hwmon_dev)) |
4481 | return PTR_ERR(hwmon_dev); |
4482 | |
4483 | diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig |
4484 | index de17c5593d97..c5eec0290b37 100644 |
4485 | --- a/drivers/i2c/busses/Kconfig |
4486 | +++ b/drivers/i2c/busses/Kconfig |
4487 | @@ -110,6 +110,7 @@ config I2C_I801 |
4488 | Wellsburg (PCH) |
4489 | Coleto Creek (PCH) |
4490 | Wildcat Point-LP (PCH) |
4491 | + BayTrail (SOC) |
4492 | |
4493 | This driver can also be built as a module. If so, the module |
4494 | will be called i2c-i801. |
4495 | diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c |
4496 | index 14c4b30d4ccc..d95b93016b0d 100644 |
4497 | --- a/drivers/i2c/busses/i2c-designware-core.c |
4498 | +++ b/drivers/i2c/busses/i2c-designware-core.c |
4499 | @@ -417,6 +417,9 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev) |
4500 | */ |
4501 | dw_writel(dev, msgs[dev->msg_write_idx].addr | ic_tar, DW_IC_TAR); |
4502 | |
4503 | + /* enforce disabled interrupts (due to HW issues) */ |
4504 | + i2c_dw_disable_int(dev); |
4505 | + |
4506 | /* Enable the adapter */ |
4507 | __i2c_dw_enable(dev, true); |
4508 | |
4509 | diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c |
4510 | index 349c2d35e792..899f55937ca6 100644 |
4511 | --- a/drivers/i2c/busses/i2c-i801.c |
4512 | +++ b/drivers/i2c/busses/i2c-i801.c |
4513 | @@ -60,6 +60,7 @@ |
4514 | Wellsburg (PCH) MS 0x8d7f 32 hard yes yes yes |
4515 | Coleto Creek (PCH) 0x23b0 32 hard yes yes yes |
4516 | Wildcat Point-LP (PCH) 0x9ca2 32 hard yes yes yes |
4517 | + BayTrail (SOC) 0x0f12 32 hard yes yes yes |
4518 | |
4519 | Features supported by this driver: |
4520 | Software PEC no |
4521 | @@ -161,6 +162,7 @@ |
4522 | STATUS_ERROR_FLAGS) |
4523 | |
4524 | /* Older devices have their ID defined in <linux/pci_ids.h> */ |
4525 | +#define PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS 0x0f12 |
4526 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 |
4527 | #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 |
4528 | /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ |
4529 | @@ -822,6 +824,7 @@ static DEFINE_PCI_DEVICE_TABLE(i801_ids) = { |
4530 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) }, |
4531 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) }, |
4532 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) }, |
4533 | + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS) }, |
4534 | { 0, } |
4535 | }; |
4536 | |
4537 | diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c |
4538 | index 0282d4d42805..d3c5d6216575 100644 |
4539 | --- a/drivers/i2c/busses/i2c-rcar.c |
4540 | +++ b/drivers/i2c/busses/i2c-rcar.c |
4541 | @@ -561,6 +561,12 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, |
4542 | |
4543 | ret = -EINVAL; |
4544 | for (i = 0; i < num; i++) { |
4545 | + /* This HW can't send STOP after address phase */ |
4546 | + if (msgs[i].len == 0) { |
4547 | + ret = -EOPNOTSUPP; |
4548 | + break; |
4549 | + } |
4550 | + |
4551 | /*-------------- spin lock -----------------*/ |
4552 | spin_lock_irqsave(&priv->lock, flags); |
4553 | |
4554 | @@ -625,7 +631,8 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap, |
4555 | |
4556 | static u32 rcar_i2c_func(struct i2c_adapter *adap) |
4557 | { |
4558 | - return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; |
4559 | + /* This HW can't do SMBUS_QUICK and NOSTART */ |
4560 | + return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); |
4561 | } |
4562 | |
4563 | static const struct i2c_algorithm rcar_i2c_algo = { |
4564 | diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c |
4565 | index 684d21e71e4a..93ec37649346 100644 |
4566 | --- a/drivers/i2c/busses/i2c-s3c2410.c |
4567 | +++ b/drivers/i2c/busses/i2c-s3c2410.c |
4568 | @@ -1247,10 +1247,10 @@ static int s3c24xx_i2c_resume(struct device *dev) |
4569 | struct platform_device *pdev = to_platform_device(dev); |
4570 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); |
4571 | |
4572 | - i2c->suspended = 0; |
4573 | clk_prepare_enable(i2c->clk); |
4574 | s3c24xx_i2c_init(i2c); |
4575 | clk_disable_unprepare(i2c->clk); |
4576 | + i2c->suspended = 0; |
4577 | |
4578 | return 0; |
4579 | } |
4580 | diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c |
4581 | index df7f1e1157ae..27a91768cc72 100644 |
4582 | --- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c |
4583 | +++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c |
4584 | @@ -661,6 +661,7 @@ static int inv_mpu_probe(struct i2c_client *client, |
4585 | { |
4586 | struct inv_mpu6050_state *st; |
4587 | struct iio_dev *indio_dev; |
4588 | + struct inv_mpu6050_platform_data *pdata; |
4589 | int result; |
4590 | |
4591 | if (!i2c_check_functionality(client->adapter, |
4592 | @@ -673,8 +674,10 @@ static int inv_mpu_probe(struct i2c_client *client, |
4593 | |
4594 | st = iio_priv(indio_dev); |
4595 | st->client = client; |
4596 | - st->plat_data = *(struct inv_mpu6050_platform_data |
4597 | - *)dev_get_platdata(&client->dev); |
4598 | + pdata = (struct inv_mpu6050_platform_data |
4599 | + *)dev_get_platdata(&client->dev); |
4600 | + if (pdata) |
4601 | + st->plat_data = *pdata; |
4602 | /* power is turned on inside check chip type*/ |
4603 | result = inv_check_and_setup_chip(st, id); |
4604 | if (result) |
4605 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
4606 | index f596b413a35b..51766b3bc678 100644 |
4607 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
4608 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
4609 | @@ -28,6 +28,7 @@ |
4610 | #include <target/target_core_base.h> |
4611 | #include <target/target_core_fabric.h> |
4612 | #include <target/iscsi/iscsi_transport.h> |
4613 | +#include <linux/semaphore.h> |
4614 | |
4615 | #include "isert_proto.h" |
4616 | #include "ib_isert.h" |
4617 | @@ -582,11 +583,11 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
4618 | goto out_conn_dev; |
4619 | |
4620 | mutex_lock(&isert_np->np_accept_mutex); |
4621 | - list_add_tail(&isert_np->np_accept_list, &isert_conn->conn_accept_node); |
4622 | + list_add_tail(&isert_conn->conn_accept_node, &isert_np->np_accept_list); |
4623 | mutex_unlock(&isert_np->np_accept_mutex); |
4624 | |
4625 | - pr_debug("isert_connect_request() waking up np_accept_wq: %p\n", np); |
4626 | - wake_up(&isert_np->np_accept_wq); |
4627 | + pr_debug("isert_connect_request() up np_sem np: %p\n", np); |
4628 | + up(&isert_np->np_sem); |
4629 | return 0; |
4630 | |
4631 | out_conn_dev: |
4632 | @@ -2569,7 +2570,7 @@ isert_setup_np(struct iscsi_np *np, |
4633 | pr_err("Unable to allocate struct isert_np\n"); |
4634 | return -ENOMEM; |
4635 | } |
4636 | - init_waitqueue_head(&isert_np->np_accept_wq); |
4637 | + sema_init(&isert_np->np_sem, 0); |
4638 | mutex_init(&isert_np->np_accept_mutex); |
4639 | INIT_LIST_HEAD(&isert_np->np_accept_list); |
4640 | init_completion(&isert_np->np_login_comp); |
4641 | @@ -2618,18 +2619,6 @@ out: |
4642 | } |
4643 | |
4644 | static int |
4645 | -isert_check_accept_queue(struct isert_np *isert_np) |
4646 | -{ |
4647 | - int empty; |
4648 | - |
4649 | - mutex_lock(&isert_np->np_accept_mutex); |
4650 | - empty = list_empty(&isert_np->np_accept_list); |
4651 | - mutex_unlock(&isert_np->np_accept_mutex); |
4652 | - |
4653 | - return empty; |
4654 | -} |
4655 | - |
4656 | -static int |
4657 | isert_rdma_accept(struct isert_conn *isert_conn) |
4658 | { |
4659 | struct rdma_cm_id *cm_id = isert_conn->conn_cm_id; |
4660 | @@ -2721,16 +2710,14 @@ isert_accept_np(struct iscsi_np *np, struct iscsi_conn *conn) |
4661 | int max_accept = 0, ret; |
4662 | |
4663 | accept_wait: |
4664 | - ret = wait_event_interruptible(isert_np->np_accept_wq, |
4665 | - !isert_check_accept_queue(isert_np) || |
4666 | - np->np_thread_state == ISCSI_NP_THREAD_RESET); |
4667 | + ret = down_interruptible(&isert_np->np_sem); |
4668 | if (max_accept > 5) |
4669 | return -ENODEV; |
4670 | |
4671 | spin_lock_bh(&np->np_thread_lock); |
4672 | if (np->np_thread_state == ISCSI_NP_THREAD_RESET) { |
4673 | spin_unlock_bh(&np->np_thread_lock); |
4674 | - pr_err("ISCSI_NP_THREAD_RESET for isert_accept_np\n"); |
4675 | + pr_debug("ISCSI_NP_THREAD_RESET for isert_accept_np\n"); |
4676 | return -ENODEV; |
4677 | } |
4678 | spin_unlock_bh(&np->np_thread_lock); |
4679 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h |
4680 | index f6ae7f5dd408..c3578f6091d2 100644 |
4681 | --- a/drivers/infiniband/ulp/isert/ib_isert.h |
4682 | +++ b/drivers/infiniband/ulp/isert/ib_isert.h |
4683 | @@ -158,7 +158,7 @@ struct isert_device { |
4684 | }; |
4685 | |
4686 | struct isert_np { |
4687 | - wait_queue_head_t np_accept_wq; |
4688 | + struct semaphore np_sem; |
4689 | struct rdma_cm_id *np_cm_id; |
4690 | struct mutex np_accept_mutex; |
4691 | struct list_head np_accept_list; |
4692 | diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c |
4693 | index 2626773ff29b..2dd1d0dd4f7d 100644 |
4694 | --- a/drivers/input/keyboard/atkbd.c |
4695 | +++ b/drivers/input/keyboard/atkbd.c |
4696 | @@ -243,6 +243,12 @@ static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); |
4697 | static void *atkbd_platform_fixup_data; |
4698 | static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); |
4699 | |
4700 | +/* |
4701 | + * Certain keyboards to not like ATKBD_CMD_RESET_DIS and stop responding |
4702 | + * to many commands until full reset (ATKBD_CMD_RESET_BAT) is performed. |
4703 | + */ |
4704 | +static bool atkbd_skip_deactivate; |
4705 | + |
4706 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, |
4707 | ssize_t (*handler)(struct atkbd *, char *)); |
4708 | static ssize_t atkbd_attr_set_helper(struct device *dev, const char *buf, size_t count, |
4709 | @@ -768,7 +774,8 @@ static int atkbd_probe(struct atkbd *atkbd) |
4710 | * Make sure nothing is coming from the keyboard and disturbs our |
4711 | * internal state. |
4712 | */ |
4713 | - atkbd_deactivate(atkbd); |
4714 | + if (!atkbd_skip_deactivate) |
4715 | + atkbd_deactivate(atkbd); |
4716 | |
4717 | return 0; |
4718 | } |
4719 | @@ -1638,6 +1645,12 @@ static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id) |
4720 | return 1; |
4721 | } |
4722 | |
4723 | +static int __init atkbd_deactivate_fixup(const struct dmi_system_id *id) |
4724 | +{ |
4725 | + atkbd_skip_deactivate = true; |
4726 | + return 1; |
4727 | +} |
4728 | + |
4729 | static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { |
4730 | { |
4731 | .matches = { |
4732 | @@ -1775,6 +1788,20 @@ static const struct dmi_system_id atkbd_dmi_quirk_table[] __initconst = { |
4733 | .callback = atkbd_setup_scancode_fixup, |
4734 | .driver_data = atkbd_oqo_01plus_scancode_fixup, |
4735 | }, |
4736 | + { |
4737 | + .matches = { |
4738 | + DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), |
4739 | + DMI_MATCH(DMI_PRODUCT_NAME, "LW25-B7HV"), |
4740 | + }, |
4741 | + .callback = atkbd_deactivate_fixup, |
4742 | + }, |
4743 | + { |
4744 | + .matches = { |
4745 | + DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"), |
4746 | + DMI_MATCH(DMI_PRODUCT_NAME, "P1-J273B"), |
4747 | + }, |
4748 | + .callback = atkbd_deactivate_fixup, |
4749 | + }, |
4750 | { } |
4751 | }; |
4752 | |
4753 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
4754 | index ef1cf52f8bb9..230cdcf8e6fe 100644 |
4755 | --- a/drivers/input/mouse/elantech.c |
4756 | +++ b/drivers/input/mouse/elantech.c |
4757 | @@ -11,6 +11,7 @@ |
4758 | */ |
4759 | |
4760 | #include <linux/delay.h> |
4761 | +#include <linux/dmi.h> |
4762 | #include <linux/slab.h> |
4763 | #include <linux/module.h> |
4764 | #include <linux/input.h> |
4765 | @@ -831,7 +832,11 @@ static int elantech_set_absolute_mode(struct psmouse *psmouse) |
4766 | break; |
4767 | |
4768 | case 3: |
4769 | - etd->reg_10 = 0x0b; |
4770 | + if (etd->set_hw_resolution) |
4771 | + etd->reg_10 = 0x0b; |
4772 | + else |
4773 | + etd->reg_10 = 0x03; |
4774 | + |
4775 | if (elantech_write_reg(psmouse, 0x10, etd->reg_10)) |
4776 | rc = -1; |
4777 | |
4778 | @@ -1331,6 +1336,22 @@ static int elantech_reconnect(struct psmouse *psmouse) |
4779 | } |
4780 | |
4781 | /* |
4782 | + * Some hw_version 3 models go into error state when we try to set bit 3 of r10 |
4783 | + */ |
4784 | +static const struct dmi_system_id no_hw_res_dmi_table[] = { |
4785 | +#if defined(CONFIG_DMI) && defined(CONFIG_X86) |
4786 | + { |
4787 | + /* Gigabyte U2442 */ |
4788 | + .matches = { |
4789 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), |
4790 | + DMI_MATCH(DMI_PRODUCT_NAME, "U2442"), |
4791 | + }, |
4792 | + }, |
4793 | +#endif |
4794 | + { } |
4795 | +}; |
4796 | + |
4797 | +/* |
4798 | * determine hardware version and set some properties according to it. |
4799 | */ |
4800 | static int elantech_set_properties(struct elantech_data *etd) |
4801 | @@ -1389,6 +1410,9 @@ static int elantech_set_properties(struct elantech_data *etd) |
4802 | */ |
4803 | etd->crc_enabled = ((etd->fw_version & 0x4000) == 0x4000); |
4804 | |
4805 | + /* Enable real hardware resolution on hw_version 3 ? */ |
4806 | + etd->set_hw_resolution = !dmi_check_system(no_hw_res_dmi_table); |
4807 | + |
4808 | return 0; |
4809 | } |
4810 | |
4811 | diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h |
4812 | index 036a04abaef7..9e0e2a1f340d 100644 |
4813 | --- a/drivers/input/mouse/elantech.h |
4814 | +++ b/drivers/input/mouse/elantech.h |
4815 | @@ -130,6 +130,7 @@ struct elantech_data { |
4816 | bool jumpy_cursor; |
4817 | bool reports_pressure; |
4818 | bool crc_enabled; |
4819 | + bool set_hw_resolution; |
4820 | unsigned char hw_version; |
4821 | unsigned int fw_version; |
4822 | unsigned int single_finger_reports; |
4823 | diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c |
4824 | index 3c511c4adaca..c5ec703c727e 100644 |
4825 | --- a/drivers/input/mouse/synaptics.c |
4826 | +++ b/drivers/input/mouse/synaptics.c |
4827 | @@ -117,6 +117,81 @@ void synaptics_reset(struct psmouse *psmouse) |
4828 | } |
4829 | |
4830 | #ifdef CONFIG_MOUSE_PS2_SYNAPTICS |
4831 | +struct min_max_quirk { |
4832 | + const char * const *pnp_ids; |
4833 | + int x_min, x_max, y_min, y_max; |
4834 | +}; |
4835 | + |
4836 | +static const struct min_max_quirk min_max_pnpid_table[] = { |
4837 | + { |
4838 | + (const char * const []){"LEN0033", NULL}, |
4839 | + 1024, 5052, 2258, 4832 |
4840 | + }, |
4841 | + { |
4842 | + (const char * const []){"LEN0035", "LEN0042", NULL}, |
4843 | + 1232, 5710, 1156, 4696 |
4844 | + }, |
4845 | + { |
4846 | + (const char * const []){"LEN0034", "LEN0036", "LEN2004", NULL}, |
4847 | + 1024, 5112, 2024, 4832 |
4848 | + }, |
4849 | + { |
4850 | + (const char * const []){"LEN2001", NULL}, |
4851 | + 1024, 5022, 2508, 4832 |
4852 | + }, |
4853 | + { } |
4854 | +}; |
4855 | + |
4856 | +/* This list has been kindly provided by Synaptics. */ |
4857 | +static const char * const topbuttonpad_pnp_ids[] = { |
4858 | + "LEN0017", |
4859 | + "LEN0018", |
4860 | + "LEN0019", |
4861 | + "LEN0023", |
4862 | + "LEN002A", |
4863 | + "LEN002B", |
4864 | + "LEN002C", |
4865 | + "LEN002D", |
4866 | + "LEN002E", |
4867 | + "LEN0033", /* Helix */ |
4868 | + "LEN0034", /* T431s, L440, L540, T540, W540, X1 Carbon 2nd */ |
4869 | + "LEN0035", /* X240 */ |
4870 | + "LEN0036", /* T440 */ |
4871 | + "LEN0037", |
4872 | + "LEN0038", |
4873 | + "LEN0041", |
4874 | + "LEN0042", /* Yoga */ |
4875 | + "LEN0045", |
4876 | + "LEN0046", |
4877 | + "LEN0047", |
4878 | + "LEN0048", |
4879 | + "LEN0049", |
4880 | + "LEN2000", |
4881 | + "LEN2001", /* Edge E431 */ |
4882 | + "LEN2002", |
4883 | + "LEN2003", |
4884 | + "LEN2004", /* L440 */ |
4885 | + "LEN2005", |
4886 | + "LEN2006", |
4887 | + "LEN2007", |
4888 | + "LEN2008", |
4889 | + "LEN2009", |
4890 | + "LEN200A", |
4891 | + "LEN200B", |
4892 | + NULL |
4893 | +}; |
4894 | + |
4895 | +static bool matches_pnp_id(struct psmouse *psmouse, const char * const ids[]) |
4896 | +{ |
4897 | + int i; |
4898 | + |
4899 | + if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4)) |
4900 | + for (i = 0; ids[i]; i++) |
4901 | + if (strstr(psmouse->ps2dev.serio->firmware_id, ids[i])) |
4902 | + return true; |
4903 | + |
4904 | + return false; |
4905 | +} |
4906 | |
4907 | /***************************************************************************** |
4908 | * Synaptics communications functions |
4909 | @@ -266,20 +341,20 @@ static int synaptics_identify(struct psmouse *psmouse) |
4910 | * Resolution is left zero if touchpad does not support the query |
4911 | */ |
4912 | |
4913 | -static const int *quirk_min_max; |
4914 | - |
4915 | static int synaptics_resolution(struct psmouse *psmouse) |
4916 | { |
4917 | struct synaptics_data *priv = psmouse->private; |
4918 | unsigned char resp[3]; |
4919 | + int i; |
4920 | |
4921 | - if (quirk_min_max) { |
4922 | - priv->x_min = quirk_min_max[0]; |
4923 | - priv->x_max = quirk_min_max[1]; |
4924 | - priv->y_min = quirk_min_max[2]; |
4925 | - priv->y_max = quirk_min_max[3]; |
4926 | - return 0; |
4927 | - } |
4928 | + for (i = 0; min_max_pnpid_table[i].pnp_ids; i++) |
4929 | + if (matches_pnp_id(psmouse, min_max_pnpid_table[i].pnp_ids)) { |
4930 | + priv->x_min = min_max_pnpid_table[i].x_min; |
4931 | + priv->x_max = min_max_pnpid_table[i].x_max; |
4932 | + priv->y_min = min_max_pnpid_table[i].y_min; |
4933 | + priv->y_max = min_max_pnpid_table[i].y_max; |
4934 | + return 0; |
4935 | + } |
4936 | |
4937 | if (SYN_ID_MAJOR(priv->identity) < 4) |
4938 | return 0; |
4939 | @@ -1255,8 +1330,10 @@ static void set_abs_position_params(struct input_dev *dev, |
4940 | input_abs_set_res(dev, y_code, priv->y_res); |
4941 | } |
4942 | |
4943 | -static void set_input_params(struct input_dev *dev, struct synaptics_data *priv) |
4944 | +static void set_input_params(struct psmouse *psmouse, |
4945 | + struct synaptics_data *priv) |
4946 | { |
4947 | + struct input_dev *dev = psmouse->dev; |
4948 | int i; |
4949 | |
4950 | /* Things that apply to both modes */ |
4951 | @@ -1325,6 +1402,8 @@ static void set_input_params(struct input_dev *dev, struct synaptics_data *priv) |
4952 | |
4953 | if (SYN_CAP_CLICKPAD(priv->ext_cap_0c)) { |
4954 | __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); |
4955 | + if (matches_pnp_id(psmouse, topbuttonpad_pnp_ids)) |
4956 | + __set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit); |
4957 | /* Clickpads report only left button */ |
4958 | __clear_bit(BTN_RIGHT, dev->keybit); |
4959 | __clear_bit(BTN_MIDDLE, dev->keybit); |
4960 | @@ -1496,104 +1575,10 @@ static const struct dmi_system_id olpc_dmi_table[] __initconst = { |
4961 | { } |
4962 | }; |
4963 | |
4964 | -static const struct dmi_system_id min_max_dmi_table[] __initconst = { |
4965 | -#if defined(CONFIG_DMI) |
4966 | - { |
4967 | - /* Lenovo ThinkPad Helix */ |
4968 | - .matches = { |
4969 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
4970 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Helix"), |
4971 | - }, |
4972 | - .driver_data = (int []){1024, 5052, 2258, 4832}, |
4973 | - }, |
4974 | - { |
4975 | - /* Lenovo ThinkPad X240 */ |
4976 | - .matches = { |
4977 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
4978 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X240"), |
4979 | - }, |
4980 | - .driver_data = (int []){1232, 5710, 1156, 4696}, |
4981 | - }, |
4982 | - { |
4983 | - /* Lenovo ThinkPad Edge E431 */ |
4984 | - .matches = { |
4985 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
4986 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Edge E431"), |
4987 | - }, |
4988 | - .driver_data = (int []){1024, 5022, 2508, 4832}, |
4989 | - }, |
4990 | - { |
4991 | - /* Lenovo ThinkPad T431s */ |
4992 | - .matches = { |
4993 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
4994 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T431"), |
4995 | - }, |
4996 | - .driver_data = (int []){1024, 5112, 2024, 4832}, |
4997 | - }, |
4998 | - { |
4999 | - /* Lenovo ThinkPad T440s */ |
5000 | - .matches = { |
5001 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
5002 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T440"), |
5003 | - }, |
5004 | - .driver_data = (int []){1024, 5112, 2024, 4832}, |
5005 | - }, |
5006 | - { |
5007 | - /* Lenovo ThinkPad L440 */ |
5008 | - .matches = { |
5009 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
5010 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L440"), |
5011 | - }, |
5012 | - .driver_data = (int []){1024, 5112, 2024, 4832}, |
5013 | - }, |
5014 | - { |
5015 | - /* Lenovo ThinkPad T540p */ |
5016 | - .matches = { |
5017 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
5018 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T540"), |
5019 | - }, |
5020 | - .driver_data = (int []){1024, 5056, 2058, 4832}, |
5021 | - }, |
5022 | - { |
5023 | - /* Lenovo ThinkPad L540 */ |
5024 | - .matches = { |
5025 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
5026 | - DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L540"), |
5027 | - }, |
5028 | - .driver_data = (int []){1024, 5112, 2024, 4832}, |
5029 | - }, |
5030 | - { |
5031 | - /* Lenovo Yoga S1 */ |
5032 | - .matches = { |
5033 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
5034 | - DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, |
5035 | - "ThinkPad S1 Yoga"), |
5036 | - }, |
5037 | - .driver_data = (int []){1232, 5710, 1156, 4696}, |
5038 | - }, |
5039 | - { |
5040 | - /* Lenovo ThinkPad X1 Carbon Haswell (3rd generation) */ |
5041 | - .matches = { |
5042 | - DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
5043 | - DMI_MATCH(DMI_PRODUCT_VERSION, |
5044 | - "ThinkPad X1 Carbon 2nd"), |
5045 | - }, |
5046 | - .driver_data = (int []){1024, 5112, 2024, 4832}, |
5047 | - }, |
5048 | -#endif |
5049 | - { } |
5050 | -}; |
5051 | - |
5052 | void __init synaptics_module_init(void) |
5053 | { |
5054 | - const struct dmi_system_id *min_max_dmi; |
5055 | - |
5056 | impaired_toshiba_kbc = dmi_check_system(toshiba_dmi_table); |
5057 | broken_olpc_ec = dmi_check_system(olpc_dmi_table); |
5058 | - |
5059 | - min_max_dmi = dmi_first_match(min_max_dmi_table); |
5060 | - if (min_max_dmi) |
5061 | - quirk_min_max = min_max_dmi->driver_data; |
5062 | } |
5063 | |
5064 | static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) |
5065 | @@ -1643,7 +1628,7 @@ static int __synaptics_init(struct psmouse *psmouse, bool absolute_mode) |
5066 | priv->capabilities, priv->ext_cap, priv->ext_cap_0c, |
5067 | priv->board_id, priv->firmware_id); |
5068 | |
5069 | - set_input_params(psmouse->dev, priv); |
5070 | + set_input_params(psmouse, priv); |
5071 | |
5072 | /* |
5073 | * Encode touchpad model so that it can be used to set |
5074 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
5075 | index 0ec9abbe31fe..381b20d4c561 100644 |
5076 | --- a/drivers/input/serio/i8042-x86ia64io.h |
5077 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
5078 | @@ -702,6 +702,17 @@ static int i8042_pnp_aux_irq; |
5079 | static char i8042_pnp_kbd_name[32]; |
5080 | static char i8042_pnp_aux_name[32]; |
5081 | |
5082 | +static void i8042_pnp_id_to_string(struct pnp_id *id, char *dst, int dst_size) |
5083 | +{ |
5084 | + strlcpy(dst, "PNP:", dst_size); |
5085 | + |
5086 | + while (id) { |
5087 | + strlcat(dst, " ", dst_size); |
5088 | + strlcat(dst, id->id, dst_size); |
5089 | + id = id->next; |
5090 | + } |
5091 | +} |
5092 | + |
5093 | static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id *did) |
5094 | { |
5095 | if (pnp_port_valid(dev, 0) && pnp_port_len(dev, 0) == 1) |
5096 | @@ -718,6 +729,8 @@ static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id * |
5097 | strlcat(i8042_pnp_kbd_name, ":", sizeof(i8042_pnp_kbd_name)); |
5098 | strlcat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); |
5099 | } |
5100 | + i8042_pnp_id_to_string(dev->id, i8042_kbd_firmware_id, |
5101 | + sizeof(i8042_kbd_firmware_id)); |
5102 | |
5103 | /* Keyboard ports are always supposed to be wakeup-enabled */ |
5104 | device_set_wakeup_enable(&dev->dev, true); |
5105 | @@ -742,6 +755,8 @@ static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id * |
5106 | strlcat(i8042_pnp_aux_name, ":", sizeof(i8042_pnp_aux_name)); |
5107 | strlcat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); |
5108 | } |
5109 | + i8042_pnp_id_to_string(dev->id, i8042_aux_firmware_id, |
5110 | + sizeof(i8042_aux_firmware_id)); |
5111 | |
5112 | i8042_pnp_aux_devices++; |
5113 | return 0; |
5114 | diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c |
5115 | index 020053fa5aaa..3807c3e971cc 100644 |
5116 | --- a/drivers/input/serio/i8042.c |
5117 | +++ b/drivers/input/serio/i8042.c |
5118 | @@ -87,6 +87,8 @@ MODULE_PARM_DESC(debug, "Turn i8042 debugging mode on and off"); |
5119 | #endif |
5120 | |
5121 | static bool i8042_bypass_aux_irq_test; |
5122 | +static char i8042_kbd_firmware_id[128]; |
5123 | +static char i8042_aux_firmware_id[128]; |
5124 | |
5125 | #include "i8042.h" |
5126 | |
5127 | @@ -1218,6 +1220,8 @@ static int __init i8042_create_kbd_port(void) |
5128 | serio->dev.parent = &i8042_platform_device->dev; |
5129 | strlcpy(serio->name, "i8042 KBD port", sizeof(serio->name)); |
5130 | strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys)); |
5131 | + strlcpy(serio->firmware_id, i8042_kbd_firmware_id, |
5132 | + sizeof(serio->firmware_id)); |
5133 | |
5134 | port->serio = serio; |
5135 | port->irq = I8042_KBD_IRQ; |
5136 | @@ -1244,6 +1248,8 @@ static int __init i8042_create_aux_port(int idx) |
5137 | if (idx < 0) { |
5138 | strlcpy(serio->name, "i8042 AUX port", sizeof(serio->name)); |
5139 | strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys)); |
5140 | + strlcpy(serio->firmware_id, i8042_aux_firmware_id, |
5141 | + sizeof(serio->firmware_id)); |
5142 | serio->close = i8042_port_close; |
5143 | } else { |
5144 | snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx); |
5145 | diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c |
5146 | index 8f4c4ab04bc2..b29134de983b 100644 |
5147 | --- a/drivers/input/serio/serio.c |
5148 | +++ b/drivers/input/serio/serio.c |
5149 | @@ -451,6 +451,13 @@ static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute * |
5150 | return retval; |
5151 | } |
5152 | |
5153 | +static ssize_t firmware_id_show(struct device *dev, struct device_attribute *attr, char *buf) |
5154 | +{ |
5155 | + struct serio *serio = to_serio_port(dev); |
5156 | + |
5157 | + return sprintf(buf, "%s\n", serio->firmware_id); |
5158 | +} |
5159 | + |
5160 | static DEVICE_ATTR_RO(type); |
5161 | static DEVICE_ATTR_RO(proto); |
5162 | static DEVICE_ATTR_RO(id); |
5163 | @@ -473,12 +480,14 @@ static DEVICE_ATTR_RO(modalias); |
5164 | static DEVICE_ATTR_WO(drvctl); |
5165 | static DEVICE_ATTR(description, S_IRUGO, serio_show_description, NULL); |
5166 | static DEVICE_ATTR(bind_mode, S_IWUSR | S_IRUGO, serio_show_bind_mode, serio_set_bind_mode); |
5167 | +static DEVICE_ATTR_RO(firmware_id); |
5168 | |
5169 | static struct attribute *serio_device_attrs[] = { |
5170 | &dev_attr_modalias.attr, |
5171 | &dev_attr_description.attr, |
5172 | &dev_attr_drvctl.attr, |
5173 | &dev_attr_bind_mode.attr, |
5174 | + &dev_attr_firmware_id.attr, |
5175 | NULL |
5176 | }; |
5177 | |
5178 | @@ -921,9 +930,14 @@ static int serio_uevent(struct device *dev, struct kobj_uevent_env *env) |
5179 | SERIO_ADD_UEVENT_VAR("SERIO_PROTO=%02x", serio->id.proto); |
5180 | SERIO_ADD_UEVENT_VAR("SERIO_ID=%02x", serio->id.id); |
5181 | SERIO_ADD_UEVENT_VAR("SERIO_EXTRA=%02x", serio->id.extra); |
5182 | + |
5183 | SERIO_ADD_UEVENT_VAR("MODALIAS=serio:ty%02Xpr%02Xid%02Xex%02X", |
5184 | serio->id.type, serio->id.proto, serio->id.id, serio->id.extra); |
5185 | |
5186 | + if (serio->firmware_id[0]) |
5187 | + SERIO_ADD_UEVENT_VAR("SERIO_FIRMWARE_ID=%s", |
5188 | + serio->firmware_id); |
5189 | + |
5190 | return 0; |
5191 | } |
5192 | #undef SERIO_ADD_UEVENT_VAR |
5193 | diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c |
5194 | index faf0da4bb3a2..71776ff5aedc 100644 |
5195 | --- a/drivers/iommu/amd_iommu.c |
5196 | +++ b/drivers/iommu/amd_iommu.c |
5197 | @@ -3999,7 +3999,7 @@ static struct irq_remap_table *get_irq_table(u16 devid, bool ioapic) |
5198 | iommu_flush_dte(iommu, devid); |
5199 | if (devid != alias) { |
5200 | irq_lookup_table[alias] = table; |
5201 | - set_dte_irq_entry(devid, table); |
5202 | + set_dte_irq_entry(alias, table); |
5203 | iommu_flush_dte(iommu, alias); |
5204 | } |
5205 | |
5206 | diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c |
5207 | index 540956465ed2..939eb0d8fbf1 100644 |
5208 | --- a/drivers/irqchip/irq-armada-370-xp.c |
5209 | +++ b/drivers/irqchip/irq-armada-370-xp.c |
5210 | @@ -130,8 +130,7 @@ static int armada_370_xp_setup_msi_irq(struct msi_chip *chip, |
5211 | struct msi_desc *desc) |
5212 | { |
5213 | struct msi_msg msg; |
5214 | - irq_hw_number_t hwirq; |
5215 | - int virq; |
5216 | + int virq, hwirq; |
5217 | |
5218 | hwirq = armada_370_xp_alloc_msi(); |
5219 | if (hwirq < 0) |
5220 | @@ -157,8 +156,19 @@ static void armada_370_xp_teardown_msi_irq(struct msi_chip *chip, |
5221 | unsigned int irq) |
5222 | { |
5223 | struct irq_data *d = irq_get_irq_data(irq); |
5224 | + unsigned long hwirq = d->hwirq; |
5225 | + |
5226 | irq_dispose_mapping(irq); |
5227 | - armada_370_xp_free_msi(d->hwirq); |
5228 | + armada_370_xp_free_msi(hwirq); |
5229 | +} |
5230 | + |
5231 | +static int armada_370_xp_check_msi_device(struct msi_chip *chip, struct pci_dev *dev, |
5232 | + int nvec, int type) |
5233 | +{ |
5234 | + /* We support MSI, but not MSI-X */ |
5235 | + if (type == PCI_CAP_ID_MSI) |
5236 | + return 0; |
5237 | + return -EINVAL; |
5238 | } |
5239 | |
5240 | static struct irq_chip armada_370_xp_msi_irq_chip = { |
5241 | @@ -199,6 +209,7 @@ static int armada_370_xp_msi_init(struct device_node *node, |
5242 | |
5243 | msi_chip->setup_irq = armada_370_xp_setup_msi_irq; |
5244 | msi_chip->teardown_irq = armada_370_xp_teardown_msi_irq; |
5245 | + msi_chip->check_device = armada_370_xp_check_msi_device; |
5246 | msi_chip->of_node = node; |
5247 | |
5248 | armada_370_xp_msi_domain = |
5249 | diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c |
5250 | index 341c6016812d..ac2d41bd71a0 100644 |
5251 | --- a/drivers/irqchip/irq-gic.c |
5252 | +++ b/drivers/irqchip/irq-gic.c |
5253 | @@ -246,10 +246,14 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, |
5254 | bool force) |
5255 | { |
5256 | void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); |
5257 | - unsigned int shift = (gic_irq(d) % 4) * 8; |
5258 | - unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); |
5259 | + unsigned int cpu, shift = (gic_irq(d) % 4) * 8; |
5260 | u32 val, mask, bit; |
5261 | |
5262 | + if (!force) |
5263 | + cpu = cpumask_any_and(mask_val, cpu_online_mask); |
5264 | + else |
5265 | + cpu = cpumask_first(mask_val); |
5266 | + |
5267 | if (cpu >= NR_GIC_CPU_IF || cpu >= nr_cpu_ids) |
5268 | return -EINVAL; |
5269 | |
5270 | diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c |
5271 | index 605047428b5a..a7b369fc3554 100644 |
5272 | --- a/drivers/leds/leds-pwm.c |
5273 | +++ b/drivers/leds/leds-pwm.c |
5274 | @@ -84,6 +84,15 @@ static inline size_t sizeof_pwm_leds_priv(int num_leds) |
5275 | (sizeof(struct led_pwm_data) * num_leds); |
5276 | } |
5277 | |
5278 | +static void led_pwm_cleanup(struct led_pwm_priv *priv) |
5279 | +{ |
5280 | + while (priv->num_leds--) { |
5281 | + led_classdev_unregister(&priv->leds[priv->num_leds].cdev); |
5282 | + if (priv->leds[priv->num_leds].can_sleep) |
5283 | + cancel_work_sync(&priv->leds[priv->num_leds].work); |
5284 | + } |
5285 | +} |
5286 | + |
5287 | static int led_pwm_create_of(struct platform_device *pdev, |
5288 | struct led_pwm_priv *priv) |
5289 | { |
5290 | @@ -131,8 +140,7 @@ static int led_pwm_create_of(struct platform_device *pdev, |
5291 | |
5292 | return 0; |
5293 | err: |
5294 | - while (priv->num_leds--) |
5295 | - led_classdev_unregister(&priv->leds[priv->num_leds].cdev); |
5296 | + led_pwm_cleanup(priv); |
5297 | |
5298 | return ret; |
5299 | } |
5300 | @@ -200,8 +208,8 @@ static int led_pwm_probe(struct platform_device *pdev) |
5301 | return 0; |
5302 | |
5303 | err: |
5304 | - while (i--) |
5305 | - led_classdev_unregister(&priv->leds[i].cdev); |
5306 | + priv->num_leds = i; |
5307 | + led_pwm_cleanup(priv); |
5308 | |
5309 | return ret; |
5310 | } |
5311 | @@ -209,13 +217,8 @@ err: |
5312 | static int led_pwm_remove(struct platform_device *pdev) |
5313 | { |
5314 | struct led_pwm_priv *priv = platform_get_drvdata(pdev); |
5315 | - int i; |
5316 | |
5317 | - for (i = 0; i < priv->num_leds; i++) { |
5318 | - led_classdev_unregister(&priv->leds[i].cdev); |
5319 | - if (priv->leds[i].can_sleep) |
5320 | - cancel_work_sync(&priv->leds[i].work); |
5321 | - } |
5322 | + led_pwm_cleanup(priv); |
5323 | |
5324 | return 0; |
5325 | } |
5326 | diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c |
5327 | index b82b58f0bb85..9306e0bcb564 100644 |
5328 | --- a/drivers/md/dm-cache-target.c |
5329 | +++ b/drivers/md/dm-cache-target.c |
5330 | @@ -2506,6 +2506,7 @@ static int cache_map(struct dm_target *ti, struct bio *bio) |
5331 | |
5332 | } else { |
5333 | inc_hit_counter(cache, bio); |
5334 | + pb->all_io_entry = dm_deferred_entry_inc(cache->all_io_ds); |
5335 | |
5336 | if (bio_data_dir(bio) == WRITE && writethrough_mode(&cache->features) && |
5337 | !is_dirty(cache, lookup_result.cblock)) |
5338 | diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c |
5339 | index 784695d22fde..53b213226c01 100644 |
5340 | --- a/drivers/md/dm-crypt.c |
5341 | +++ b/drivers/md/dm-crypt.c |
5342 | @@ -19,7 +19,6 @@ |
5343 | #include <linux/crypto.h> |
5344 | #include <linux/workqueue.h> |
5345 | #include <linux/backing-dev.h> |
5346 | -#include <linux/percpu.h> |
5347 | #include <linux/atomic.h> |
5348 | #include <linux/scatterlist.h> |
5349 | #include <asm/page.h> |
5350 | @@ -43,6 +42,7 @@ struct convert_context { |
5351 | struct bvec_iter iter_out; |
5352 | sector_t cc_sector; |
5353 | atomic_t cc_pending; |
5354 | + struct ablkcipher_request *req; |
5355 | }; |
5356 | |
5357 | /* |
5358 | @@ -111,15 +111,7 @@ struct iv_tcw_private { |
5359 | enum flags { DM_CRYPT_SUSPENDED, DM_CRYPT_KEY_VALID }; |
5360 | |
5361 | /* |
5362 | - * Duplicated per-CPU state for cipher. |
5363 | - */ |
5364 | -struct crypt_cpu { |
5365 | - struct ablkcipher_request *req; |
5366 | -}; |
5367 | - |
5368 | -/* |
5369 | - * The fields in here must be read only after initialization, |
5370 | - * changing state should be in crypt_cpu. |
5371 | + * The fields in here must be read only after initialization. |
5372 | */ |
5373 | struct crypt_config { |
5374 | struct dm_dev *dev; |
5375 | @@ -150,12 +142,6 @@ struct crypt_config { |
5376 | sector_t iv_offset; |
5377 | unsigned int iv_size; |
5378 | |
5379 | - /* |
5380 | - * Duplicated per cpu state. Access through |
5381 | - * per_cpu_ptr() only. |
5382 | - */ |
5383 | - struct crypt_cpu __percpu *cpu; |
5384 | - |
5385 | /* ESSIV: struct crypto_cipher *essiv_tfm */ |
5386 | void *iv_private; |
5387 | struct crypto_ablkcipher **tfms; |
5388 | @@ -192,11 +178,6 @@ static void clone_init(struct dm_crypt_io *, struct bio *); |
5389 | static void kcryptd_queue_crypt(struct dm_crypt_io *io); |
5390 | static u8 *iv_of_dmreq(struct crypt_config *cc, struct dm_crypt_request *dmreq); |
5391 | |
5392 | -static struct crypt_cpu *this_crypt_config(struct crypt_config *cc) |
5393 | -{ |
5394 | - return this_cpu_ptr(cc->cpu); |
5395 | -} |
5396 | - |
5397 | /* |
5398 | * Use this to access cipher attributes that are the same for each CPU. |
5399 | */ |
5400 | @@ -903,16 +884,15 @@ static void kcryptd_async_done(struct crypto_async_request *async_req, |
5401 | static void crypt_alloc_req(struct crypt_config *cc, |
5402 | struct convert_context *ctx) |
5403 | { |
5404 | - struct crypt_cpu *this_cc = this_crypt_config(cc); |
5405 | unsigned key_index = ctx->cc_sector & (cc->tfms_count - 1); |
5406 | |
5407 | - if (!this_cc->req) |
5408 | - this_cc->req = mempool_alloc(cc->req_pool, GFP_NOIO); |
5409 | + if (!ctx->req) |
5410 | + ctx->req = mempool_alloc(cc->req_pool, GFP_NOIO); |
5411 | |
5412 | - ablkcipher_request_set_tfm(this_cc->req, cc->tfms[key_index]); |
5413 | - ablkcipher_request_set_callback(this_cc->req, |
5414 | + ablkcipher_request_set_tfm(ctx->req, cc->tfms[key_index]); |
5415 | + ablkcipher_request_set_callback(ctx->req, |
5416 | CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, |
5417 | - kcryptd_async_done, dmreq_of_req(cc, this_cc->req)); |
5418 | + kcryptd_async_done, dmreq_of_req(cc, ctx->req)); |
5419 | } |
5420 | |
5421 | /* |
5422 | @@ -921,7 +901,6 @@ static void crypt_alloc_req(struct crypt_config *cc, |
5423 | static int crypt_convert(struct crypt_config *cc, |
5424 | struct convert_context *ctx) |
5425 | { |
5426 | - struct crypt_cpu *this_cc = this_crypt_config(cc); |
5427 | int r; |
5428 | |
5429 | atomic_set(&ctx->cc_pending, 1); |
5430 | @@ -932,7 +911,7 @@ static int crypt_convert(struct crypt_config *cc, |
5431 | |
5432 | atomic_inc(&ctx->cc_pending); |
5433 | |
5434 | - r = crypt_convert_block(cc, ctx, this_cc->req); |
5435 | + r = crypt_convert_block(cc, ctx, ctx->req); |
5436 | |
5437 | switch (r) { |
5438 | /* async */ |
5439 | @@ -941,7 +920,7 @@ static int crypt_convert(struct crypt_config *cc, |
5440 | reinit_completion(&ctx->restart); |
5441 | /* fall through*/ |
5442 | case -EINPROGRESS: |
5443 | - this_cc->req = NULL; |
5444 | + ctx->req = NULL; |
5445 | ctx->cc_sector++; |
5446 | continue; |
5447 | |
5448 | @@ -1040,6 +1019,7 @@ static struct dm_crypt_io *crypt_io_alloc(struct crypt_config *cc, |
5449 | io->sector = sector; |
5450 | io->error = 0; |
5451 | io->base_io = NULL; |
5452 | + io->ctx.req = NULL; |
5453 | atomic_set(&io->io_pending, 0); |
5454 | |
5455 | return io; |
5456 | @@ -1065,6 +1045,8 @@ static void crypt_dec_pending(struct dm_crypt_io *io) |
5457 | if (!atomic_dec_and_test(&io->io_pending)) |
5458 | return; |
5459 | |
5460 | + if (io->ctx.req) |
5461 | + mempool_free(io->ctx.req, cc->req_pool); |
5462 | mempool_free(io, cc->io_pool); |
5463 | |
5464 | if (likely(!base_io)) |
5465 | @@ -1492,8 +1474,6 @@ static int crypt_wipe_key(struct crypt_config *cc) |
5466 | static void crypt_dtr(struct dm_target *ti) |
5467 | { |
5468 | struct crypt_config *cc = ti->private; |
5469 | - struct crypt_cpu *cpu_cc; |
5470 | - int cpu; |
5471 | |
5472 | ti->private = NULL; |
5473 | |
5474 | @@ -1505,13 +1485,6 @@ static void crypt_dtr(struct dm_target *ti) |
5475 | if (cc->crypt_queue) |
5476 | destroy_workqueue(cc->crypt_queue); |
5477 | |
5478 | - if (cc->cpu) |
5479 | - for_each_possible_cpu(cpu) { |
5480 | - cpu_cc = per_cpu_ptr(cc->cpu, cpu); |
5481 | - if (cpu_cc->req) |
5482 | - mempool_free(cpu_cc->req, cc->req_pool); |
5483 | - } |
5484 | - |
5485 | crypt_free_tfms(cc); |
5486 | |
5487 | if (cc->bs) |
5488 | @@ -1530,9 +1503,6 @@ static void crypt_dtr(struct dm_target *ti) |
5489 | if (cc->dev) |
5490 | dm_put_device(ti, cc->dev); |
5491 | |
5492 | - if (cc->cpu) |
5493 | - free_percpu(cc->cpu); |
5494 | - |
5495 | kzfree(cc->cipher); |
5496 | kzfree(cc->cipher_string); |
5497 | |
5498 | @@ -1588,13 +1558,6 @@ static int crypt_ctr_cipher(struct dm_target *ti, |
5499 | if (tmp) |
5500 | DMWARN("Ignoring unexpected additional cipher options"); |
5501 | |
5502 | - cc->cpu = __alloc_percpu(sizeof(*(cc->cpu)), |
5503 | - __alignof__(struct crypt_cpu)); |
5504 | - if (!cc->cpu) { |
5505 | - ti->error = "Cannot allocate per cpu state"; |
5506 | - goto bad_mem; |
5507 | - } |
5508 | - |
5509 | /* |
5510 | * For compatibility with the original dm-crypt mapping format, if |
5511 | * only the cipher name is supplied, use cbc-plain. |
5512 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
5513 | index 60cc50685c14..fa602b56b648 100644 |
5514 | --- a/drivers/md/dm-thin.c |
5515 | +++ b/drivers/md/dm-thin.c |
5516 | @@ -25,6 +25,7 @@ |
5517 | #define MAPPING_POOL_SIZE 1024 |
5518 | #define PRISON_CELLS 1024 |
5519 | #define COMMIT_PERIOD HZ |
5520 | +#define NO_SPACE_TIMEOUT (HZ * 60) |
5521 | |
5522 | DECLARE_DM_KCOPYD_THROTTLE_WITH_MODULE_PARM(snapshot_copy_throttle, |
5523 | "A percentage of time allocated for copy on write"); |
5524 | @@ -173,6 +174,7 @@ struct pool { |
5525 | struct workqueue_struct *wq; |
5526 | struct work_struct worker; |
5527 | struct delayed_work waker; |
5528 | + struct delayed_work no_space_timeout; |
5529 | |
5530 | unsigned long last_commit_jiffies; |
5531 | unsigned ref_count; |
5532 | @@ -920,7 +922,7 @@ static int commit(struct pool *pool) |
5533 | { |
5534 | int r; |
5535 | |
5536 | - if (get_pool_mode(pool) != PM_WRITE) |
5537 | + if (get_pool_mode(pool) >= PM_READ_ONLY) |
5538 | return -EINVAL; |
5539 | |
5540 | r = dm_pool_commit_metadata(pool->pmd); |
5541 | @@ -1449,6 +1451,20 @@ static void do_waker(struct work_struct *ws) |
5542 | queue_delayed_work(pool->wq, &pool->waker, COMMIT_PERIOD); |
5543 | } |
5544 | |
5545 | +/* |
5546 | + * We're holding onto IO to allow userland time to react. After the |
5547 | + * timeout either the pool will have been resized (and thus back in |
5548 | + * PM_WRITE mode), or we degrade to PM_READ_ONLY and start erroring IO. |
5549 | + */ |
5550 | +static void do_no_space_timeout(struct work_struct *ws) |
5551 | +{ |
5552 | + struct pool *pool = container_of(to_delayed_work(ws), struct pool, |
5553 | + no_space_timeout); |
5554 | + |
5555 | + if (get_pool_mode(pool) == PM_OUT_OF_DATA_SPACE && !pool->pf.error_if_no_space) |
5556 | + set_pool_mode(pool, PM_READ_ONLY); |
5557 | +} |
5558 | + |
5559 | /*----------------------------------------------------------------*/ |
5560 | |
5561 | struct noflush_work { |
5562 | @@ -1574,6 +1590,9 @@ static void set_pool_mode(struct pool *pool, enum pool_mode new_mode) |
5563 | pool->process_discard = process_discard; |
5564 | pool->process_prepared_mapping = process_prepared_mapping; |
5565 | pool->process_prepared_discard = process_prepared_discard_passdown; |
5566 | + |
5567 | + if (!pool->pf.error_if_no_space) |
5568 | + queue_delayed_work(pool->wq, &pool->no_space_timeout, NO_SPACE_TIMEOUT); |
5569 | break; |
5570 | |
5571 | case PM_WRITE: |
5572 | @@ -1956,6 +1975,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, |
5573 | |
5574 | INIT_WORK(&pool->worker, do_worker); |
5575 | INIT_DELAYED_WORK(&pool->waker, do_waker); |
5576 | + INIT_DELAYED_WORK(&pool->no_space_timeout, do_no_space_timeout); |
5577 | spin_lock_init(&pool->lock); |
5578 | bio_list_init(&pool->deferred_bios); |
5579 | bio_list_init(&pool->deferred_flush_bios); |
5580 | @@ -2519,6 +2539,7 @@ static void pool_postsuspend(struct dm_target *ti) |
5581 | struct pool *pool = pt->pool; |
5582 | |
5583 | cancel_delayed_work(&pool->waker); |
5584 | + cancel_delayed_work(&pool->no_space_timeout); |
5585 | flush_workqueue(pool->wq); |
5586 | (void) commit(pool); |
5587 | } |
5588 | diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity.c |
5589 | index 796007a5e0e1..7a7bab8947ae 100644 |
5590 | --- a/drivers/md/dm-verity.c |
5591 | +++ b/drivers/md/dm-verity.c |
5592 | @@ -330,15 +330,17 @@ test_block_hash: |
5593 | return r; |
5594 | } |
5595 | } |
5596 | - |
5597 | todo = 1 << v->data_dev_block_bits; |
5598 | - while (io->iter.bi_size) { |
5599 | + do { |
5600 | u8 *page; |
5601 | + unsigned len; |
5602 | struct bio_vec bv = bio_iter_iovec(bio, io->iter); |
5603 | |
5604 | page = kmap_atomic(bv.bv_page); |
5605 | - r = crypto_shash_update(desc, page + bv.bv_offset, |
5606 | - bv.bv_len); |
5607 | + len = bv.bv_len; |
5608 | + if (likely(len >= todo)) |
5609 | + len = todo; |
5610 | + r = crypto_shash_update(desc, page + bv.bv_offset, len); |
5611 | kunmap_atomic(page); |
5612 | |
5613 | if (r < 0) { |
5614 | @@ -346,8 +348,9 @@ test_block_hash: |
5615 | return r; |
5616 | } |
5617 | |
5618 | - bio_advance_iter(bio, &io->iter, bv.bv_len); |
5619 | - } |
5620 | + bio_advance_iter(bio, &io->iter, len); |
5621 | + todo -= len; |
5622 | + } while (todo); |
5623 | |
5624 | if (!v->version) { |
5625 | r = crypto_shash_update(desc, v->salt, v->salt_size); |
5626 | diff --git a/drivers/md/md.c b/drivers/md/md.c |
5627 | index 4ad5cc4e63e8..51c431c3a411 100644 |
5628 | --- a/drivers/md/md.c |
5629 | +++ b/drivers/md/md.c |
5630 | @@ -8530,7 +8530,8 @@ static int md_notify_reboot(struct notifier_block *this, |
5631 | if (mddev_trylock(mddev)) { |
5632 | if (mddev->pers) |
5633 | __md_stop_writes(mddev); |
5634 | - mddev->safemode = 2; |
5635 | + if (mddev->persistent) |
5636 | + mddev->safemode = 2; |
5637 | mddev_unlock(mddev); |
5638 | } |
5639 | need_delay = 1; |
5640 | diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c |
5641 | index 33fc408e5eac..cb882aae9e20 100644 |
5642 | --- a/drivers/md/raid10.c |
5643 | +++ b/drivers/md/raid10.c |
5644 | @@ -1172,6 +1172,13 @@ static void __make_request(struct mddev *mddev, struct bio *bio) |
5645 | int max_sectors; |
5646 | int sectors; |
5647 | |
5648 | + /* |
5649 | + * Register the new request and wait if the reconstruction |
5650 | + * thread has put up a bar for new requests. |
5651 | + * Continue immediately if no resync is active currently. |
5652 | + */ |
5653 | + wait_barrier(conf); |
5654 | + |
5655 | sectors = bio_sectors(bio); |
5656 | while (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && |
5657 | bio->bi_iter.bi_sector < conf->reshape_progress && |
5658 | @@ -1552,12 +1559,6 @@ static void make_request(struct mddev *mddev, struct bio *bio) |
5659 | |
5660 | md_write_start(mddev, bio); |
5661 | |
5662 | - /* |
5663 | - * Register the new request and wait if the reconstruction |
5664 | - * thread has put up a bar for new requests. |
5665 | - * Continue immediately if no resync is active currently. |
5666 | - */ |
5667 | - wait_barrier(conf); |
5668 | |
5669 | do { |
5670 | |
5671 | diff --git a/drivers/media/i2c/ov7670.c b/drivers/media/i2c/ov7670.c |
5672 | index e8a1ce204036..cdd7c1b7259b 100644 |
5673 | --- a/drivers/media/i2c/ov7670.c |
5674 | +++ b/drivers/media/i2c/ov7670.c |
5675 | @@ -1109,7 +1109,7 @@ static int ov7670_enum_framesizes(struct v4l2_subdev *sd, |
5676 | * windows that fall outside that. |
5677 | */ |
5678 | for (i = 0; i < n_win_sizes; i++) { |
5679 | - struct ov7670_win_size *win = &info->devtype->win_sizes[index]; |
5680 | + struct ov7670_win_size *win = &info->devtype->win_sizes[i]; |
5681 | if (info->min_width && win->width < info->min_width) |
5682 | continue; |
5683 | if (info->min_height && win->height < info->min_height) |
5684 | diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c |
5685 | index d5a7a135f75d..703560fa5e73 100644 |
5686 | --- a/drivers/media/media-device.c |
5687 | +++ b/drivers/media/media-device.c |
5688 | @@ -93,6 +93,7 @@ static long media_device_enum_entities(struct media_device *mdev, |
5689 | struct media_entity *ent; |
5690 | struct media_entity_desc u_ent; |
5691 | |
5692 | + memset(&u_ent, 0, sizeof(u_ent)); |
5693 | if (copy_from_user(&u_ent.id, &uent->id, sizeof(u_ent.id))) |
5694 | return -EFAULT; |
5695 | |
5696 | diff --git a/drivers/media/tuners/fc2580.c b/drivers/media/tuners/fc2580.c |
5697 | index 3aecaf465094..f0c9c42867de 100644 |
5698 | --- a/drivers/media/tuners/fc2580.c |
5699 | +++ b/drivers/media/tuners/fc2580.c |
5700 | @@ -195,7 +195,7 @@ static int fc2580_set_params(struct dvb_frontend *fe) |
5701 | |
5702 | f_ref = 2UL * priv->cfg->clock / r_val; |
5703 | n_val = div_u64_rem(f_vco, f_ref, &k_val); |
5704 | - k_val_reg = 1UL * k_val * (1 << 20) / f_ref; |
5705 | + k_val_reg = div_u64(1ULL * k_val * (1 << 20), f_ref); |
5706 | |
5707 | ret = fc2580_wr_reg(priv, 0x18, r18_val | ((k_val_reg >> 16) & 0xff)); |
5708 | if (ret < 0) |
5709 | @@ -348,8 +348,8 @@ static int fc2580_set_params(struct dvb_frontend *fe) |
5710 | if (ret < 0) |
5711 | goto err; |
5712 | |
5713 | - ret = fc2580_wr_reg(priv, 0x37, 1UL * priv->cfg->clock * \ |
5714 | - fc2580_if_filter_lut[i].mul / 1000000000); |
5715 | + ret = fc2580_wr_reg(priv, 0x37, div_u64(1ULL * priv->cfg->clock * |
5716 | + fc2580_if_filter_lut[i].mul, 1000000000)); |
5717 | if (ret < 0) |
5718 | goto err; |
5719 | |
5720 | diff --git a/drivers/media/tuners/fc2580_priv.h b/drivers/media/tuners/fc2580_priv.h |
5721 | index be38a9e637e0..646c99452136 100644 |
5722 | --- a/drivers/media/tuners/fc2580_priv.h |
5723 | +++ b/drivers/media/tuners/fc2580_priv.h |
5724 | @@ -22,6 +22,7 @@ |
5725 | #define FC2580_PRIV_H |
5726 | |
5727 | #include "fc2580.h" |
5728 | +#include <linux/math64.h> |
5729 | |
5730 | struct fc2580_reg_val { |
5731 | u8 reg; |
5732 | diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
5733 | index b63a5e584aa0..fca336b65351 100644 |
5734 | --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
5735 | +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
5736 | @@ -178,6 +178,9 @@ struct v4l2_create_buffers32 { |
5737 | |
5738 | static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) |
5739 | { |
5740 | + if (get_user(kp->type, &up->type)) |
5741 | + return -EFAULT; |
5742 | + |
5743 | switch (kp->type) { |
5744 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
5745 | case V4L2_BUF_TYPE_VIDEO_OUTPUT: |
5746 | @@ -204,17 +207,16 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us |
5747 | |
5748 | static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) |
5749 | { |
5750 | - if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32)) || |
5751 | - get_user(kp->type, &up->type)) |
5752 | - return -EFAULT; |
5753 | + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32))) |
5754 | + return -EFAULT; |
5755 | return __get_v4l2_format32(kp, up); |
5756 | } |
5757 | |
5758 | static int get_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up) |
5759 | { |
5760 | if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32)) || |
5761 | - copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format.fmt))) |
5762 | - return -EFAULT; |
5763 | + copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format))) |
5764 | + return -EFAULT; |
5765 | return __get_v4l2_format32(&kp->format, &up->format); |
5766 | } |
5767 | |
5768 | diff --git a/drivers/memory/mvebu-devbus.c b/drivers/memory/mvebu-devbus.c |
5769 | index 110c03627051..b59a17fb7c3e 100644 |
5770 | --- a/drivers/memory/mvebu-devbus.c |
5771 | +++ b/drivers/memory/mvebu-devbus.c |
5772 | @@ -108,8 +108,19 @@ static int devbus_set_timing_params(struct devbus *devbus, |
5773 | node->full_name); |
5774 | return err; |
5775 | } |
5776 | - /* Convert bit width to byte width */ |
5777 | - r.bus_width /= 8; |
5778 | + |
5779 | + /* |
5780 | + * The bus width is encoded into the register as 0 for 8 bits, |
5781 | + * and 1 for 16 bits, so we do the necessary conversion here. |
5782 | + */ |
5783 | + if (r.bus_width == 8) |
5784 | + r.bus_width = 0; |
5785 | + else if (r.bus_width == 16) |
5786 | + r.bus_width = 1; |
5787 | + else { |
5788 | + dev_err(devbus->dev, "invalid bus width %d\n", r.bus_width); |
5789 | + return -EINVAL; |
5790 | + } |
5791 | |
5792 | err = get_timing_param_ps(devbus, node, "devbus,badr-skew-ps", |
5793 | &r.badr_skew); |
5794 | diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c |
5795 | index 6d91933c4cdd..0af6e060e238 100644 |
5796 | --- a/drivers/net/ethernet/intel/e1000e/netdev.c |
5797 | +++ b/drivers/net/ethernet/intel/e1000e/netdev.c |
5798 | @@ -2976,11 +2976,21 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) |
5799 | u32 rctl, rfctl; |
5800 | u32 pages = 0; |
5801 | |
5802 | - /* Workaround Si errata on PCHx - configure jumbo frame flow */ |
5803 | - if ((hw->mac.type >= e1000_pch2lan) && |
5804 | - (adapter->netdev->mtu > ETH_DATA_LEN) && |
5805 | - e1000_lv_jumbo_workaround_ich8lan(hw, true)) |
5806 | - e_dbg("failed to enable jumbo frame workaround mode\n"); |
5807 | + /* Workaround Si errata on PCHx - configure jumbo frame flow. |
5808 | + * If jumbo frames not set, program related MAC/PHY registers |
5809 | + * to h/w defaults |
5810 | + */ |
5811 | + if (hw->mac.type >= e1000_pch2lan) { |
5812 | + s32 ret_val; |
5813 | + |
5814 | + if (adapter->netdev->mtu > ETH_DATA_LEN) |
5815 | + ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); |
5816 | + else |
5817 | + ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); |
5818 | + |
5819 | + if (ret_val) |
5820 | + e_dbg("failed to enable|disable jumbo frame workaround mode\n"); |
5821 | + } |
5822 | |
5823 | /* Program MC offset vector base */ |
5824 | rctl = er32(RCTL); |
5825 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
5826 | index b9d1c1c8ca5a..178506a201d5 100644 |
5827 | --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
5828 | +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |
5829 | @@ -1776,7 +1776,7 @@ int i40e_vc_process_vf_msg(struct i40e_pf *pf, u16 vf_id, u32 v_opcode, |
5830 | u32 v_retval, u8 *msg, u16 msglen) |
5831 | { |
5832 | struct i40e_hw *hw = &pf->hw; |
5833 | - int local_vf_id = vf_id - hw->func_caps.vf_base_id; |
5834 | + unsigned int local_vf_id = vf_id - hw->func_caps.vf_base_id; |
5835 | struct i40e_vf *vf; |
5836 | int ret; |
5837 | |
5838 | diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c |
5839 | index 46d31a49f5ea..d9c7eb279141 100644 |
5840 | --- a/drivers/net/ethernet/intel/igb/igb_main.c |
5841 | +++ b/drivers/net/ethernet/intel/igb/igb_main.c |
5842 | @@ -1014,6 +1014,12 @@ static void igb_reset_q_vector(struct igb_adapter *adapter, int v_idx) |
5843 | { |
5844 | struct igb_q_vector *q_vector = adapter->q_vector[v_idx]; |
5845 | |
5846 | + /* Coming from igb_set_interrupt_capability, the vectors are not yet |
5847 | + * allocated. So, q_vector is NULL so we should stop here. |
5848 | + */ |
5849 | + if (!q_vector) |
5850 | + return; |
5851 | + |
5852 | if (q_vector->tx.ring) |
5853 | adapter->tx_ring[q_vector->tx.ring->queue_index] = NULL; |
5854 | |
5855 | @@ -1121,6 +1127,7 @@ static void igb_set_interrupt_capability(struct igb_adapter *adapter, bool msix) |
5856 | |
5857 | /* If we can't do MSI-X, try MSI */ |
5858 | msi_only: |
5859 | + adapter->flags &= ~IGB_FLAG_HAS_MSIX; |
5860 | #ifdef CONFIG_PCI_IOV |
5861 | /* disable SR-IOV for non MSI-X configurations */ |
5862 | if (adapter->vf_data) { |
5863 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c |
5864 | index 925034b80e9c..93598cd7ee6a 100644 |
5865 | --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c |
5866 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c |
5867 | @@ -426,6 +426,12 @@ static int brcms_ops_start(struct ieee80211_hw *hw) |
5868 | bool blocked; |
5869 | int err; |
5870 | |
5871 | + if (!wl->ucode.bcm43xx_bomminor) { |
5872 | + err = brcms_request_fw(wl, wl->wlc->hw->d11core); |
5873 | + if (err) |
5874 | + return -ENOENT; |
5875 | + } |
5876 | + |
5877 | ieee80211_wake_queues(hw); |
5878 | spin_lock_bh(&wl->lock); |
5879 | blocked = brcms_rfkill_set_hw_state(wl); |
5880 | @@ -433,14 +439,6 @@ static int brcms_ops_start(struct ieee80211_hw *hw) |
5881 | if (!blocked) |
5882 | wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy); |
5883 | |
5884 | - if (!wl->ucode.bcm43xx_bomminor) { |
5885 | - err = brcms_request_fw(wl, wl->wlc->hw->d11core); |
5886 | - if (err) { |
5887 | - brcms_remove(wl->wlc->hw->d11core); |
5888 | - return -ENOENT; |
5889 | - } |
5890 | - } |
5891 | - |
5892 | spin_lock_bh(&wl->lock); |
5893 | /* avoid acknowledging frames before a non-monitor device is added */ |
5894 | wl->mute_tx = true; |
5895 | diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c |
5896 | index 2a59da2ff87a..e1d546665ae8 100644 |
5897 | --- a/drivers/net/wireless/iwlwifi/iwl-7000.c |
5898 | +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c |
5899 | @@ -67,8 +67,8 @@ |
5900 | #include "iwl-agn-hw.h" |
5901 | |
5902 | /* Highest firmware API version supported */ |
5903 | -#define IWL7260_UCODE_API_MAX 8 |
5904 | -#define IWL3160_UCODE_API_MAX 8 |
5905 | +#define IWL7260_UCODE_API_MAX 9 |
5906 | +#define IWL3160_UCODE_API_MAX 9 |
5907 | |
5908 | /* Oldest version we won't warn about */ |
5909 | #define IWL7260_UCODE_API_OK 7 |
5910 | @@ -223,3 +223,4 @@ const struct iwl_cfg iwl7265_n_cfg = { |
5911 | |
5912 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
5913 | MODULE_FIRMWARE(IWL3160_MODULE_FIRMWARE(IWL3160_UCODE_API_OK)); |
5914 | +MODULE_FIRMWARE(IWL7265_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
5915 | diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
5916 | index 18a895a949d4..6b22681068a7 100644 |
5917 | --- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
5918 | +++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
5919 | @@ -188,7 +188,7 @@ static const __le32 iwl_combined_lookup[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE] = { |
5920 | cpu_to_le32(0xcc00aaaa), |
5921 | cpu_to_le32(0x0000aaaa), |
5922 | cpu_to_le32(0xc0004000), |
5923 | - cpu_to_le32(0x00000000), |
5924 | + cpu_to_le32(0x00004000), |
5925 | cpu_to_le32(0xf0005000), |
5926 | cpu_to_le32(0xf0005000), |
5927 | }, |
5928 | @@ -211,16 +211,16 @@ static const __le32 iwl_combined_lookup[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE] = { |
5929 | /* Tx Tx disabled */ |
5930 | cpu_to_le32(0xaaaaaaaa), |
5931 | cpu_to_le32(0xaaaaaaaa), |
5932 | - cpu_to_le32(0xaaaaaaaa), |
5933 | + cpu_to_le32(0xeeaaaaaa), |
5934 | cpu_to_le32(0xaaaaaaaa), |
5935 | cpu_to_le32(0xcc00ff28), |
5936 | cpu_to_le32(0x0000aaaa), |
5937 | cpu_to_le32(0xcc00aaaa), |
5938 | cpu_to_le32(0x0000aaaa), |
5939 | - cpu_to_le32(0xC0004000), |
5940 | - cpu_to_le32(0xC0004000), |
5941 | - cpu_to_le32(0xF0005000), |
5942 | - cpu_to_le32(0xF0005000), |
5943 | + cpu_to_le32(0xc0004000), |
5944 | + cpu_to_le32(0xc0004000), |
5945 | + cpu_to_le32(0xf0005000), |
5946 | + cpu_to_le32(0xf0005000), |
5947 | }, |
5948 | }; |
5949 | |
5950 | diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c |
5951 | index 9a856e5031f1..d06414ef15c5 100644 |
5952 | --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c |
5953 | +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c |
5954 | @@ -606,7 +606,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, |
5955 | if (ret) |
5956 | goto out_remove_mac; |
5957 | |
5958 | - if (!mvm->bf_allowed_vif && |
5959 | + if (!mvm->bf_allowed_vif && false && |
5960 | vif->type == NL80211_IFTYPE_STATION && !vif->p2p && |
5961 | mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BF_UPDATED){ |
5962 | mvm->bf_allowed_vif = mvmvif; |
5963 | @@ -796,7 +796,7 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac, |
5964 | memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN); |
5965 | len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4); |
5966 | |
5967 | - ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_SYNC, len, cmd); |
5968 | + ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd); |
5969 | if (ret) |
5970 | IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret); |
5971 | } |
5972 | @@ -812,7 +812,7 @@ static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm) |
5973 | if (WARN_ON_ONCE(!mvm->mcast_filter_cmd)) |
5974 | return; |
5975 | |
5976 | - ieee80211_iterate_active_interfaces( |
5977 | + ieee80211_iterate_active_interfaces_atomic( |
5978 | mvm->hw, IEEE80211_IFACE_ITER_NORMAL, |
5979 | iwl_mvm_mc_iface_iterator, &iter_data); |
5980 | } |
5981 | @@ -971,6 +971,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm, |
5982 | */ |
5983 | iwl_mvm_remove_time_event(mvm, mvmvif, |
5984 | &mvmvif->time_event_data); |
5985 | + iwl_mvm_sf_update(mvm, vif, false); |
5986 | } else if (changes & (BSS_CHANGED_PS | BSS_CHANGED_P2P_PS | |
5987 | BSS_CHANGED_QOS)) { |
5988 | ret = iwl_mvm_power_update_mode(mvm, vif); |
5989 | diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c |
5990 | index 5bc871513505..03179d0b08c2 100644 |
5991 | --- a/drivers/net/wireless/iwlwifi/mvm/rs.c |
5992 | +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c |
5993 | @@ -59,7 +59,7 @@ |
5994 | /* max allowed rate miss before sync LQ cmd */ |
5995 | #define IWL_MISSED_RATE_MAX 15 |
5996 | #define RS_STAY_IN_COLUMN_TIMEOUT (5*HZ) |
5997 | - |
5998 | +#define RS_IDLE_TIMEOUT (5*HZ) |
5999 | |
6000 | static u8 rs_ht_to_legacy[] = { |
6001 | [IWL_RATE_MCS_0_INDEX] = IWL_RATE_6M_INDEX, |
6002 | @@ -142,7 +142,7 @@ enum rs_column_mode { |
6003 | RS_MIMO2, |
6004 | }; |
6005 | |
6006 | -#define MAX_NEXT_COLUMNS 5 |
6007 | +#define MAX_NEXT_COLUMNS 7 |
6008 | #define MAX_COLUMN_CHECKS 3 |
6009 | |
6010 | typedef bool (*allow_column_func_t) (struct iwl_mvm *mvm, |
6011 | @@ -212,8 +212,10 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6012 | RS_COLUMN_LEGACY_ANT_B, |
6013 | RS_COLUMN_SISO_ANT_A, |
6014 | RS_COLUMN_SISO_ANT_B, |
6015 | - RS_COLUMN_MIMO2, |
6016 | - RS_COLUMN_MIMO2_SGI, |
6017 | + RS_COLUMN_INVALID, |
6018 | + RS_COLUMN_INVALID, |
6019 | + RS_COLUMN_INVALID, |
6020 | + RS_COLUMN_INVALID, |
6021 | }, |
6022 | }, |
6023 | [RS_COLUMN_LEGACY_ANT_B] = { |
6024 | @@ -223,8 +225,10 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6025 | RS_COLUMN_LEGACY_ANT_A, |
6026 | RS_COLUMN_SISO_ANT_A, |
6027 | RS_COLUMN_SISO_ANT_B, |
6028 | - RS_COLUMN_MIMO2, |
6029 | - RS_COLUMN_MIMO2_SGI, |
6030 | + RS_COLUMN_INVALID, |
6031 | + RS_COLUMN_INVALID, |
6032 | + RS_COLUMN_INVALID, |
6033 | + RS_COLUMN_INVALID, |
6034 | }, |
6035 | }, |
6036 | [RS_COLUMN_SISO_ANT_A] = { |
6037 | @@ -235,7 +239,9 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6038 | RS_COLUMN_MIMO2, |
6039 | RS_COLUMN_SISO_ANT_A_SGI, |
6040 | RS_COLUMN_SISO_ANT_B_SGI, |
6041 | - RS_COLUMN_MIMO2_SGI, |
6042 | + RS_COLUMN_LEGACY_ANT_A, |
6043 | + RS_COLUMN_LEGACY_ANT_B, |
6044 | + RS_COLUMN_INVALID, |
6045 | }, |
6046 | .checks = { |
6047 | rs_siso_allow, |
6048 | @@ -249,7 +255,9 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6049 | RS_COLUMN_MIMO2, |
6050 | RS_COLUMN_SISO_ANT_B_SGI, |
6051 | RS_COLUMN_SISO_ANT_A_SGI, |
6052 | - RS_COLUMN_MIMO2_SGI, |
6053 | + RS_COLUMN_LEGACY_ANT_A, |
6054 | + RS_COLUMN_LEGACY_ANT_B, |
6055 | + RS_COLUMN_INVALID, |
6056 | }, |
6057 | .checks = { |
6058 | rs_siso_allow, |
6059 | @@ -265,6 +273,8 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6060 | RS_COLUMN_SISO_ANT_A, |
6061 | RS_COLUMN_SISO_ANT_B, |
6062 | RS_COLUMN_MIMO2, |
6063 | + RS_COLUMN_LEGACY_ANT_A, |
6064 | + RS_COLUMN_LEGACY_ANT_B, |
6065 | }, |
6066 | .checks = { |
6067 | rs_siso_allow, |
6068 | @@ -281,6 +291,8 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6069 | RS_COLUMN_SISO_ANT_B, |
6070 | RS_COLUMN_SISO_ANT_A, |
6071 | RS_COLUMN_MIMO2, |
6072 | + RS_COLUMN_LEGACY_ANT_A, |
6073 | + RS_COLUMN_LEGACY_ANT_B, |
6074 | }, |
6075 | .checks = { |
6076 | rs_siso_allow, |
6077 | @@ -296,6 +308,8 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6078 | RS_COLUMN_SISO_ANT_A_SGI, |
6079 | RS_COLUMN_SISO_ANT_B_SGI, |
6080 | RS_COLUMN_MIMO2_SGI, |
6081 | + RS_COLUMN_LEGACY_ANT_A, |
6082 | + RS_COLUMN_LEGACY_ANT_B, |
6083 | }, |
6084 | .checks = { |
6085 | rs_mimo_allow, |
6086 | @@ -311,6 +325,8 @@ static const struct rs_tx_column rs_tx_columns[] = { |
6087 | RS_COLUMN_SISO_ANT_A, |
6088 | RS_COLUMN_SISO_ANT_B, |
6089 | RS_COLUMN_MIMO2, |
6090 | + RS_COLUMN_LEGACY_ANT_A, |
6091 | + RS_COLUMN_LEGACY_ANT_B, |
6092 | }, |
6093 | .checks = { |
6094 | rs_mimo_allow, |
6095 | @@ -503,6 +519,16 @@ static void rs_rate_scale_clear_window(struct iwl_rate_scale_data *window) |
6096 | window->average_tpt = IWL_INVALID_VALUE; |
6097 | } |
6098 | |
6099 | +static void rs_rate_scale_clear_tbl_windows(struct iwl_mvm *mvm, |
6100 | + struct iwl_scale_tbl_info *tbl) |
6101 | +{ |
6102 | + int i; |
6103 | + |
6104 | + IWL_DEBUG_RATE(mvm, "Clearing up window stats\n"); |
6105 | + for (i = 0; i < IWL_RATE_COUNT; i++) |
6106 | + rs_rate_scale_clear_window(&tbl->win[i]); |
6107 | +} |
6108 | + |
6109 | static inline u8 rs_is_valid_ant(u8 valid_antenna, u8 ant_type) |
6110 | { |
6111 | return (ant_type & valid_antenna) == ant_type; |
6112 | @@ -975,6 +1001,13 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband, |
6113 | return; |
6114 | } |
6115 | |
6116 | +#ifdef CPTCFG_MAC80211_DEBUGFS |
6117 | + /* Disable last tx check if we are debugging with fixed rate */ |
6118 | + if (lq_sta->dbg_fixed_rate) { |
6119 | + IWL_DEBUG_RATE(mvm, "Fixed rate. avoid rate scaling\n"); |
6120 | + return; |
6121 | + } |
6122 | +#endif |
6123 | if (!ieee80211_is_data(hdr->frame_control) || |
6124 | info->flags & IEEE80211_TX_CTL_NO_ACK) |
6125 | return; |
6126 | @@ -1017,6 +1050,18 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband, |
6127 | mac_index++; |
6128 | } |
6129 | |
6130 | + if (time_after(jiffies, |
6131 | + (unsigned long)(lq_sta->last_tx + RS_IDLE_TIMEOUT))) { |
6132 | + int tid; |
6133 | + IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n"); |
6134 | + for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) |
6135 | + ieee80211_stop_tx_ba_session(sta, tid); |
6136 | + |
6137 | + iwl_mvm_rs_rate_init(mvm, sta, sband->band, false); |
6138 | + return; |
6139 | + } |
6140 | + lq_sta->last_tx = jiffies; |
6141 | + |
6142 | /* Here we actually compare this rate to the latest LQ command */ |
6143 | if ((mac_index < 0) || |
6144 | (rate.sgi != !!(mac_flags & IEEE80211_TX_RC_SHORT_GI)) || |
6145 | @@ -1362,7 +1407,6 @@ static u32 rs_bw_from_sta_bw(struct ieee80211_sta *sta) |
6146 | static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search) |
6147 | { |
6148 | struct iwl_scale_tbl_info *tbl; |
6149 | - int i; |
6150 | int active_tbl; |
6151 | int flush_interval_passed = 0; |
6152 | struct iwl_mvm *mvm; |
6153 | @@ -1423,9 +1467,7 @@ static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search) |
6154 | |
6155 | IWL_DEBUG_RATE(mvm, |
6156 | "LQ: stay in table clear win\n"); |
6157 | - for (i = 0; i < IWL_RATE_COUNT; i++) |
6158 | - rs_rate_scale_clear_window( |
6159 | - &(tbl->win[i])); |
6160 | + rs_rate_scale_clear_tbl_windows(mvm, tbl); |
6161 | } |
6162 | } |
6163 | |
6164 | @@ -1433,9 +1475,7 @@ static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search) |
6165 | * bitmaps and stats in active table (this will become the new |
6166 | * "search" table). */ |
6167 | if (lq_sta->rs_state == RS_STATE_SEARCH_CYCLE_STARTED) { |
6168 | - IWL_DEBUG_RATE(mvm, "Clearing up window stats\n"); |
6169 | - for (i = 0; i < IWL_RATE_COUNT; i++) |
6170 | - rs_rate_scale_clear_window(&(tbl->win[i])); |
6171 | + rs_rate_scale_clear_tbl_windows(mvm, tbl); |
6172 | } |
6173 | } |
6174 | } |
6175 | @@ -1628,85 +1668,76 @@ static enum rs_action rs_get_rate_action(struct iwl_mvm *mvm, |
6176 | { |
6177 | enum rs_action action = RS_ACTION_STAY; |
6178 | |
6179 | - /* Too many failures, decrease rate */ |
6180 | if ((sr <= RS_SR_FORCE_DECREASE) || (current_tpt == 0)) { |
6181 | IWL_DEBUG_RATE(mvm, |
6182 | - "decrease rate because of low SR\n"); |
6183 | - action = RS_ACTION_DOWNSCALE; |
6184 | - /* No throughput measured yet for adjacent rates; try increase. */ |
6185 | - } else if ((low_tpt == IWL_INVALID_VALUE) && |
6186 | - (high_tpt == IWL_INVALID_VALUE)) { |
6187 | - if (high != IWL_RATE_INVALID && sr >= IWL_RATE_INCREASE_TH) { |
6188 | - IWL_DEBUG_RATE(mvm, |
6189 | - "Good SR and no high rate measurement. " |
6190 | - "Increase rate\n"); |
6191 | - action = RS_ACTION_UPSCALE; |
6192 | - } else if (low != IWL_RATE_INVALID) { |
6193 | - IWL_DEBUG_RATE(mvm, |
6194 | - "Remain in current rate\n"); |
6195 | - action = RS_ACTION_STAY; |
6196 | - } |
6197 | + "Decrease rate because of low SR\n"); |
6198 | + return RS_ACTION_DOWNSCALE; |
6199 | } |
6200 | |
6201 | - /* Both adjacent throughputs are measured, but neither one has better |
6202 | - * throughput; we're using the best rate, don't change it! |
6203 | - */ |
6204 | - else if ((low_tpt != IWL_INVALID_VALUE) && |
6205 | - (high_tpt != IWL_INVALID_VALUE) && |
6206 | - (low_tpt < current_tpt) && |
6207 | - (high_tpt < current_tpt)) { |
6208 | + if ((low_tpt == IWL_INVALID_VALUE) && |
6209 | + (high_tpt == IWL_INVALID_VALUE) && |
6210 | + (high != IWL_RATE_INVALID)) { |
6211 | IWL_DEBUG_RATE(mvm, |
6212 | - "Both high and low are worse. " |
6213 | - "Maintain rate\n"); |
6214 | - action = RS_ACTION_STAY; |
6215 | + "No data about high/low rates. Increase rate\n"); |
6216 | + return RS_ACTION_UPSCALE; |
6217 | } |
6218 | |
6219 | - /* At least one adjacent rate's throughput is measured, |
6220 | - * and may have better performance. |
6221 | - */ |
6222 | - else { |
6223 | - /* Higher adjacent rate's throughput is measured */ |
6224 | - if (high_tpt != IWL_INVALID_VALUE) { |
6225 | - /* Higher rate has better throughput */ |
6226 | - if (high_tpt > current_tpt && |
6227 | - sr >= IWL_RATE_INCREASE_TH) { |
6228 | - IWL_DEBUG_RATE(mvm, |
6229 | - "Higher rate is better and good " |
6230 | - "SR. Increate rate\n"); |
6231 | - action = RS_ACTION_UPSCALE; |
6232 | - } else { |
6233 | - IWL_DEBUG_RATE(mvm, |
6234 | - "Higher rate isn't better OR " |
6235 | - "no good SR. Maintain rate\n"); |
6236 | - action = RS_ACTION_STAY; |
6237 | - } |
6238 | + if ((high_tpt == IWL_INVALID_VALUE) && |
6239 | + (high != IWL_RATE_INVALID) && |
6240 | + (low_tpt != IWL_INVALID_VALUE) && |
6241 | + (low_tpt < current_tpt)) { |
6242 | + IWL_DEBUG_RATE(mvm, |
6243 | + "No data about high rate and low rate is worse. Increase rate\n"); |
6244 | + return RS_ACTION_UPSCALE; |
6245 | + } |
6246 | |
6247 | - /* Lower adjacent rate's throughput is measured */ |
6248 | - } else if (low_tpt != IWL_INVALID_VALUE) { |
6249 | - /* Lower rate has better throughput */ |
6250 | - if (low_tpt > current_tpt) { |
6251 | - IWL_DEBUG_RATE(mvm, |
6252 | - "Lower rate is better. " |
6253 | - "Decrease rate\n"); |
6254 | - action = RS_ACTION_DOWNSCALE; |
6255 | - } else if (sr >= IWL_RATE_INCREASE_TH) { |
6256 | - IWL_DEBUG_RATE(mvm, |
6257 | - "Lower rate isn't better and " |
6258 | - "good SR. Increase rate\n"); |
6259 | - action = RS_ACTION_UPSCALE; |
6260 | - } |
6261 | - } |
6262 | + if ((high_tpt != IWL_INVALID_VALUE) && |
6263 | + (high_tpt > current_tpt)) { |
6264 | + IWL_DEBUG_RATE(mvm, |
6265 | + "Higher rate is better. Increate rate\n"); |
6266 | + return RS_ACTION_UPSCALE; |
6267 | } |
6268 | |
6269 | - /* Sanity check; asked for decrease, but success rate or throughput |
6270 | - * has been good at old rate. Don't change it. |
6271 | - */ |
6272 | - if ((action == RS_ACTION_DOWNSCALE) && (low != IWL_RATE_INVALID) && |
6273 | - ((sr > IWL_RATE_HIGH_TH) || |
6274 | - (current_tpt > (100 * tbl->expected_tpt[low])))) { |
6275 | + if ((low_tpt != IWL_INVALID_VALUE) && |
6276 | + (high_tpt != IWL_INVALID_VALUE) && |
6277 | + (low_tpt < current_tpt) && |
6278 | + (high_tpt < current_tpt)) { |
6279 | + IWL_DEBUG_RATE(mvm, |
6280 | + "Both high and low are worse. Maintain rate\n"); |
6281 | + return RS_ACTION_STAY; |
6282 | + } |
6283 | + |
6284 | + if ((low_tpt != IWL_INVALID_VALUE) && |
6285 | + (low_tpt > current_tpt)) { |
6286 | IWL_DEBUG_RATE(mvm, |
6287 | - "Sanity check failed. Maintain rate\n"); |
6288 | - action = RS_ACTION_STAY; |
6289 | + "Lower rate is better\n"); |
6290 | + action = RS_ACTION_DOWNSCALE; |
6291 | + goto out; |
6292 | + } |
6293 | + |
6294 | + if ((low_tpt == IWL_INVALID_VALUE) && |
6295 | + (low != IWL_RATE_INVALID)) { |
6296 | + IWL_DEBUG_RATE(mvm, |
6297 | + "No data about lower rate\n"); |
6298 | + action = RS_ACTION_DOWNSCALE; |
6299 | + goto out; |
6300 | + } |
6301 | + |
6302 | + IWL_DEBUG_RATE(mvm, "Maintain rate\n"); |
6303 | + |
6304 | +out: |
6305 | + if ((action == RS_ACTION_DOWNSCALE) && (low != IWL_RATE_INVALID)) { |
6306 | + if (sr >= RS_SR_NO_DECREASE) { |
6307 | + IWL_DEBUG_RATE(mvm, |
6308 | + "SR is above NO DECREASE. Avoid downscale\n"); |
6309 | + action = RS_ACTION_STAY; |
6310 | + } else if (current_tpt > (100 * tbl->expected_tpt[low])) { |
6311 | + IWL_DEBUG_RATE(mvm, |
6312 | + "Current TPT is higher than max expected in low rate. Avoid downscale\n"); |
6313 | + action = RS_ACTION_STAY; |
6314 | + } else { |
6315 | + IWL_DEBUG_RATE(mvm, "Decrease rate\n"); |
6316 | + } |
6317 | } |
6318 | |
6319 | return action; |
6320 | @@ -1725,7 +1756,6 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm, |
6321 | int low = IWL_RATE_INVALID; |
6322 | int high = IWL_RATE_INVALID; |
6323 | int index; |
6324 | - int i; |
6325 | struct iwl_rate_scale_data *window = NULL; |
6326 | int current_tpt = IWL_INVALID_VALUE; |
6327 | int low_tpt = IWL_INVALID_VALUE; |
6328 | @@ -1781,6 +1811,7 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm, |
6329 | "Aggregation changed: prev %d current %d. Update expected TPT table\n", |
6330 | prev_agg, lq_sta->is_agg); |
6331 | rs_set_expected_tpt_table(lq_sta, tbl); |
6332 | + rs_rate_scale_clear_tbl_windows(mvm, tbl); |
6333 | } |
6334 | |
6335 | /* current tx rate */ |
6336 | @@ -2010,8 +2041,7 @@ lq_update: |
6337 | if (lq_sta->search_better_tbl) { |
6338 | /* Access the "search" table, clear its history. */ |
6339 | tbl = &(lq_sta->lq_info[(1 - lq_sta->active_tbl)]); |
6340 | - for (i = 0; i < IWL_RATE_COUNT; i++) |
6341 | - rs_rate_scale_clear_window(&(tbl->win[i])); |
6342 | + rs_rate_scale_clear_tbl_windows(mvm, tbl); |
6343 | |
6344 | /* Use new "search" start rate */ |
6345 | index = tbl->rate.index; |
6346 | @@ -2032,8 +2062,18 @@ lq_update: |
6347 | * stay with best antenna legacy modulation for a while |
6348 | * before next round of mode comparisons. */ |
6349 | tbl1 = &(lq_sta->lq_info[lq_sta->active_tbl]); |
6350 | - if (is_legacy(&tbl1->rate) && !sta->ht_cap.ht_supported) { |
6351 | + if (is_legacy(&tbl1->rate)) { |
6352 | IWL_DEBUG_RATE(mvm, "LQ: STAY in legacy table\n"); |
6353 | + |
6354 | + if (tid != IWL_MAX_TID_COUNT) { |
6355 | + tid_data = &sta_priv->tid_data[tid]; |
6356 | + if (tid_data->state != IWL_AGG_OFF) { |
6357 | + IWL_DEBUG_RATE(mvm, |
6358 | + "Stop aggregation on tid %d\n", |
6359 | + tid); |
6360 | + ieee80211_stop_tx_ba_session(sta, tid); |
6361 | + } |
6362 | + } |
6363 | rs_set_stay_in_table(mvm, 1, lq_sta); |
6364 | } else { |
6365 | /* If we're in an HT mode, and all 3 mode switch actions |
6366 | @@ -2265,10 +2305,10 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, |
6367 | lq_sta->lq.sta_id = sta_priv->sta_id; |
6368 | |
6369 | for (j = 0; j < LQ_SIZE; j++) |
6370 | - for (i = 0; i < IWL_RATE_COUNT; i++) |
6371 | - rs_rate_scale_clear_window(&lq_sta->lq_info[j].win[i]); |
6372 | + rs_rate_scale_clear_tbl_windows(mvm, &lq_sta->lq_info[j]); |
6373 | |
6374 | lq_sta->flush_timer = 0; |
6375 | + lq_sta->last_tx = jiffies; |
6376 | |
6377 | IWL_DEBUG_RATE(mvm, |
6378 | "LQ: *** rate scale station global init for station %d ***\n", |
6379 | @@ -2469,6 +2509,7 @@ static void rs_build_rates_table(struct iwl_mvm *mvm, |
6380 | if (is_siso(&rate)) { |
6381 | num_rates = RS_SECONDARY_SISO_NUM_RATES; |
6382 | num_retries = RS_SECONDARY_SISO_RETRIES; |
6383 | + lq_cmd->mimo_delim = index; |
6384 | } else if (is_legacy(&rate)) { |
6385 | num_rates = RS_SECONDARY_LEGACY_NUM_RATES; |
6386 | num_retries = RS_LEGACY_RETRIES_PER_RATE; |
6387 | diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.h b/drivers/net/wireless/iwlwifi/mvm/rs.h |
6388 | index 7bc6404f6986..f23b68b8eeff 100644 |
6389 | --- a/drivers/net/wireless/iwlwifi/mvm/rs.h |
6390 | +++ b/drivers/net/wireless/iwlwifi/mvm/rs.h |
6391 | @@ -156,6 +156,7 @@ enum { |
6392 | #define IWL_RATE_HIGH_TH 10880 /* 85% */ |
6393 | #define IWL_RATE_INCREASE_TH 6400 /* 50% */ |
6394 | #define RS_SR_FORCE_DECREASE 1920 /* 15% */ |
6395 | +#define RS_SR_NO_DECREASE 10880 /* 85% */ |
6396 | |
6397 | #define LINK_QUAL_AGG_TIME_LIMIT_DEF (4000) /* 4 milliseconds */ |
6398 | #define LINK_QUAL_AGG_TIME_LIMIT_MAX (8000) |
6399 | @@ -310,6 +311,7 @@ struct iwl_lq_sta { |
6400 | u32 visited_columns; /* Bitmask marking which Tx columns were |
6401 | * explored during a search cycle |
6402 | */ |
6403 | + u64 last_tx; |
6404 | bool is_vht; |
6405 | enum ieee80211_band band; |
6406 | |
6407 | diff --git a/drivers/net/wireless/iwlwifi/mvm/sf.c b/drivers/net/wireless/iwlwifi/mvm/sf.c |
6408 | index 8401627c0030..88809b2d1654 100644 |
6409 | --- a/drivers/net/wireless/iwlwifi/mvm/sf.c |
6410 | +++ b/drivers/net/wireless/iwlwifi/mvm/sf.c |
6411 | @@ -274,7 +274,8 @@ int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *changed_vif, |
6412 | return -EINVAL; |
6413 | if (changed_vif->type != NL80211_IFTYPE_STATION) { |
6414 | new_state = SF_UNINIT; |
6415 | - } else if (changed_vif->bss_conf.assoc) { |
6416 | + } else if (changed_vif->bss_conf.assoc && |
6417 | + changed_vif->bss_conf.dtim_period) { |
6418 | mvmvif = iwl_mvm_vif_from_mac80211(changed_vif); |
6419 | sta_id = mvmvif->ap_sta_id; |
6420 | new_state = SF_FULL_ON; |
6421 | diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c |
6422 | index 3872ead75488..43e27a174430 100644 |
6423 | --- a/drivers/net/wireless/iwlwifi/pcie/drv.c |
6424 | +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c |
6425 | @@ -372,12 +372,14 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { |
6426 | {IWL_PCI_DEVICE(0x095A, 0x500A, iwl7265_2n_cfg)}, |
6427 | {IWL_PCI_DEVICE(0x095B, 0x5200, iwl7265_2n_cfg)}, |
6428 | {IWL_PCI_DEVICE(0x095A, 0x5002, iwl7265_n_cfg)}, |
6429 | + {IWL_PCI_DEVICE(0x095A, 0x5102, iwl7265_n_cfg)}, |
6430 | {IWL_PCI_DEVICE(0x095B, 0x5202, iwl7265_n_cfg)}, |
6431 | {IWL_PCI_DEVICE(0x095A, 0x9010, iwl7265_2ac_cfg)}, |
6432 | {IWL_PCI_DEVICE(0x095A, 0x9012, iwl7265_2ac_cfg)}, |
6433 | {IWL_PCI_DEVICE(0x095A, 0x9110, iwl7265_2ac_cfg)}, |
6434 | {IWL_PCI_DEVICE(0x095A, 0x9112, iwl7265_2ac_cfg)}, |
6435 | {IWL_PCI_DEVICE(0x095A, 0x9210, iwl7265_2ac_cfg)}, |
6436 | + {IWL_PCI_DEVICE(0x095A, 0x9200, iwl7265_2ac_cfg)}, |
6437 | {IWL_PCI_DEVICE(0x095A, 0x9510, iwl7265_2ac_cfg)}, |
6438 | {IWL_PCI_DEVICE(0x095A, 0x9310, iwl7265_2ac_cfg)}, |
6439 | {IWL_PCI_DEVICE(0x095A, 0x9410, iwl7265_2ac_cfg)}, |
6440 | diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c |
6441 | index f9507807b486..8d42fd9b0811 100644 |
6442 | --- a/drivers/net/wireless/iwlwifi/pcie/trans.c |
6443 | +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c |
6444 | @@ -1563,6 +1563,10 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, |
6445 | * PCI Tx retries from interfering with C3 CPU state */ |
6446 | pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); |
6447 | |
6448 | + trans->dev = &pdev->dev; |
6449 | + trans_pcie->pci_dev = pdev; |
6450 | + iwl_disable_interrupts(trans); |
6451 | + |
6452 | err = pci_enable_msi(pdev); |
6453 | if (err) { |
6454 | dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", err); |
6455 | @@ -1574,8 +1578,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, |
6456 | } |
6457 | } |
6458 | |
6459 | - trans->dev = &pdev->dev; |
6460 | - trans_pcie->pci_dev = pdev; |
6461 | trans->hw_rev = iwl_read32(trans, CSR_HW_REV); |
6462 | trans->hw_id = (pdev->device << 16) + pdev->subsystem_device; |
6463 | snprintf(trans->hw_id_str, sizeof(trans->hw_id_str), |
6464 | @@ -1601,8 +1603,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, |
6465 | goto out_pci_disable_msi; |
6466 | } |
6467 | |
6468 | - trans_pcie->inta_mask = CSR_INI_SET_MASK; |
6469 | - |
6470 | if (iwl_pcie_alloc_ict(trans)) |
6471 | goto out_free_cmd_pool; |
6472 | |
6473 | @@ -1614,6 +1614,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, |
6474 | goto out_free_ict; |
6475 | } |
6476 | |
6477 | + trans_pcie->inta_mask = CSR_INI_SET_MASK; |
6478 | + |
6479 | return trans; |
6480 | |
6481 | out_free_ict: |
6482 | diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c |
6483 | index ddeb5a709aa3..a87ee9b6585a 100644 |
6484 | --- a/drivers/net/wireless/rt2x00/rt2x00mac.c |
6485 | +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c |
6486 | @@ -621,20 +621,18 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, |
6487 | bss_conf->bssid); |
6488 | |
6489 | /* |
6490 | - * Update the beacon. This is only required on USB devices. PCI |
6491 | - * devices fetch beacons periodically. |
6492 | - */ |
6493 | - if (changes & BSS_CHANGED_BEACON && rt2x00_is_usb(rt2x00dev)) |
6494 | - rt2x00queue_update_beacon(rt2x00dev, vif); |
6495 | - |
6496 | - /* |
6497 | * Start/stop beaconing. |
6498 | */ |
6499 | if (changes & BSS_CHANGED_BEACON_ENABLED) { |
6500 | if (!bss_conf->enable_beacon && intf->enable_beacon) { |
6501 | - rt2x00queue_clear_beacon(rt2x00dev, vif); |
6502 | rt2x00dev->intf_beaconing--; |
6503 | intf->enable_beacon = false; |
6504 | + /* |
6505 | + * Clear beacon in the H/W for this vif. This is needed |
6506 | + * to disable beaconing on this particular interface |
6507 | + * and keep it running on other interfaces. |
6508 | + */ |
6509 | + rt2x00queue_clear_beacon(rt2x00dev, vif); |
6510 | |
6511 | if (rt2x00dev->intf_beaconing == 0) { |
6512 | /* |
6513 | @@ -645,11 +643,15 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, |
6514 | rt2x00queue_stop_queue(rt2x00dev->bcn); |
6515 | mutex_unlock(&intf->beacon_skb_mutex); |
6516 | } |
6517 | - |
6518 | - |
6519 | } else if (bss_conf->enable_beacon && !intf->enable_beacon) { |
6520 | rt2x00dev->intf_beaconing++; |
6521 | intf->enable_beacon = true; |
6522 | + /* |
6523 | + * Upload beacon to the H/W. This is only required on |
6524 | + * USB devices. PCI devices fetch beacons periodically. |
6525 | + */ |
6526 | + if (rt2x00_is_usb(rt2x00dev)) |
6527 | + rt2x00queue_update_beacon(rt2x00dev, vif); |
6528 | |
6529 | if (rt2x00dev->intf_beaconing == 1) { |
6530 | /* |
6531 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c |
6532 | index cd17c642e746..472e592b32ec 100644 |
6533 | --- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c |
6534 | +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c |
6535 | @@ -1001,7 +1001,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw) |
6536 | err = _rtl92cu_init_mac(hw); |
6537 | if (err) { |
6538 | RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "init mac failed!\n"); |
6539 | - return err; |
6540 | + goto exit; |
6541 | } |
6542 | err = rtl92c_download_fw(hw); |
6543 | if (err) { |
6544 | diff --git a/drivers/of/irq.c b/drivers/of/irq.c |
6545 | index 9bcf2cf19357..ca0189308d72 100644 |
6546 | --- a/drivers/of/irq.c |
6547 | +++ b/drivers/of/irq.c |
6548 | @@ -380,6 +380,32 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r) |
6549 | EXPORT_SYMBOL_GPL(of_irq_to_resource); |
6550 | |
6551 | /** |
6552 | + * of_irq_get - Decode a node's IRQ and return it as a Linux irq number |
6553 | + * @dev: pointer to device tree node |
6554 | + * @index: zero-based index of the irq |
6555 | + * |
6556 | + * Returns Linux irq number on success, or -EPROBE_DEFER if the irq domain |
6557 | + * is not yet created. |
6558 | + * |
6559 | + */ |
6560 | +int of_irq_get(struct device_node *dev, int index) |
6561 | +{ |
6562 | + int rc; |
6563 | + struct of_phandle_args oirq; |
6564 | + struct irq_domain *domain; |
6565 | + |
6566 | + rc = of_irq_parse_one(dev, index, &oirq); |
6567 | + if (rc) |
6568 | + return rc; |
6569 | + |
6570 | + domain = irq_find_host(oirq.np); |
6571 | + if (!domain) |
6572 | + return -EPROBE_DEFER; |
6573 | + |
6574 | + return irq_create_of_mapping(&oirq); |
6575 | +} |
6576 | + |
6577 | +/** |
6578 | * of_irq_count - Count the number of IRQs a node uses |
6579 | * @dev: pointer to device tree node |
6580 | */ |
6581 | diff --git a/drivers/of/platform.c b/drivers/of/platform.c |
6582 | index 404d1daebefa..bd47fbc53dc9 100644 |
6583 | --- a/drivers/of/platform.c |
6584 | +++ b/drivers/of/platform.c |
6585 | @@ -168,7 +168,9 @@ struct platform_device *of_device_alloc(struct device_node *np, |
6586 | rc = of_address_to_resource(np, i, res); |
6587 | WARN_ON(rc); |
6588 | } |
6589 | - WARN_ON(of_irq_to_resource_table(np, res, num_irq) != num_irq); |
6590 | + if (of_irq_to_resource_table(np, res, num_irq) != num_irq) |
6591 | + pr_debug("not all legacy IRQ resources mapped for %s\n", |
6592 | + np->name); |
6593 | } |
6594 | |
6595 | dev->dev.of_node = of_node_get(np); |
6596 | diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c |
6597 | index 05e352889868..483d9ad89705 100644 |
6598 | --- a/drivers/pci/host/pci-mvebu.c |
6599 | +++ b/drivers/pci/host/pci-mvebu.c |
6600 | @@ -291,6 +291,58 @@ static int mvebu_pcie_hw_wr_conf(struct mvebu_pcie_port *port, |
6601 | return PCIBIOS_SUCCESSFUL; |
6602 | } |
6603 | |
6604 | +/* |
6605 | + * Remove windows, starting from the largest ones to the smallest |
6606 | + * ones. |
6607 | + */ |
6608 | +static void mvebu_pcie_del_windows(struct mvebu_pcie_port *port, |
6609 | + phys_addr_t base, size_t size) |
6610 | +{ |
6611 | + while (size) { |
6612 | + size_t sz = 1 << (fls(size) - 1); |
6613 | + |
6614 | + mvebu_mbus_del_window(base, sz); |
6615 | + base += sz; |
6616 | + size -= sz; |
6617 | + } |
6618 | +} |
6619 | + |
6620 | +/* |
6621 | + * MBus windows can only have a power of two size, but PCI BARs do not |
6622 | + * have this constraint. Therefore, we have to split the PCI BAR into |
6623 | + * areas each having a power of two size. We start from the largest |
6624 | + * one (i.e highest order bit set in the size). |
6625 | + */ |
6626 | +static void mvebu_pcie_add_windows(struct mvebu_pcie_port *port, |
6627 | + unsigned int target, unsigned int attribute, |
6628 | + phys_addr_t base, size_t size, |
6629 | + phys_addr_t remap) |
6630 | +{ |
6631 | + size_t size_mapped = 0; |
6632 | + |
6633 | + while (size) { |
6634 | + size_t sz = 1 << (fls(size) - 1); |
6635 | + int ret; |
6636 | + |
6637 | + ret = mvebu_mbus_add_window_remap_by_id(target, attribute, base, |
6638 | + sz, remap); |
6639 | + if (ret) { |
6640 | + dev_err(&port->pcie->pdev->dev, |
6641 | + "Could not create MBus window at 0x%x, size 0x%x: %d\n", |
6642 | + base, sz, ret); |
6643 | + mvebu_pcie_del_windows(port, base - size_mapped, |
6644 | + size_mapped); |
6645 | + return; |
6646 | + } |
6647 | + |
6648 | + size -= sz; |
6649 | + size_mapped += sz; |
6650 | + base += sz; |
6651 | + if (remap != MVEBU_MBUS_NO_REMAP) |
6652 | + remap += sz; |
6653 | + } |
6654 | +} |
6655 | + |
6656 | static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) |
6657 | { |
6658 | phys_addr_t iobase; |
6659 | @@ -302,8 +354,8 @@ static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) |
6660 | |
6661 | /* If a window was configured, remove it */ |
6662 | if (port->iowin_base) { |
6663 | - mvebu_mbus_del_window(port->iowin_base, |
6664 | - port->iowin_size); |
6665 | + mvebu_pcie_del_windows(port, port->iowin_base, |
6666 | + port->iowin_size); |
6667 | port->iowin_base = 0; |
6668 | port->iowin_size = 0; |
6669 | } |
6670 | @@ -329,11 +381,11 @@ static void mvebu_pcie_handle_iobase_change(struct mvebu_pcie_port *port) |
6671 | port->iowin_base = port->pcie->io.start + iobase; |
6672 | port->iowin_size = ((0xFFF | ((port->bridge.iolimit & 0xF0) << 8) | |
6673 | (port->bridge.iolimitupper << 16)) - |
6674 | - iobase); |
6675 | + iobase) + 1; |
6676 | |
6677 | - mvebu_mbus_add_window_remap_by_id(port->io_target, port->io_attr, |
6678 | - port->iowin_base, port->iowin_size, |
6679 | - iobase); |
6680 | + mvebu_pcie_add_windows(port, port->io_target, port->io_attr, |
6681 | + port->iowin_base, port->iowin_size, |
6682 | + iobase); |
6683 | } |
6684 | |
6685 | static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) |
6686 | @@ -344,8 +396,8 @@ static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) |
6687 | |
6688 | /* If a window was configured, remove it */ |
6689 | if (port->memwin_base) { |
6690 | - mvebu_mbus_del_window(port->memwin_base, |
6691 | - port->memwin_size); |
6692 | + mvebu_pcie_del_windows(port, port->memwin_base, |
6693 | + port->memwin_size); |
6694 | port->memwin_base = 0; |
6695 | port->memwin_size = 0; |
6696 | } |
6697 | @@ -362,10 +414,11 @@ static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port) |
6698 | port->memwin_base = ((port->bridge.membase & 0xFFF0) << 16); |
6699 | port->memwin_size = |
6700 | (((port->bridge.memlimit & 0xFFF0) << 16) | 0xFFFFF) - |
6701 | - port->memwin_base; |
6702 | + port->memwin_base + 1; |
6703 | |
6704 | - mvebu_mbus_add_window_by_id(port->mem_target, port->mem_attr, |
6705 | - port->memwin_base, port->memwin_size); |
6706 | + mvebu_pcie_add_windows(port, port->mem_target, port->mem_attr, |
6707 | + port->memwin_base, port->memwin_size, |
6708 | + MVEBU_MBUS_NO_REMAP); |
6709 | } |
6710 | |
6711 | /* |
6712 | @@ -721,14 +774,21 @@ static resource_size_t mvebu_pcie_align_resource(struct pci_dev *dev, |
6713 | |
6714 | /* |
6715 | * On the PCI-to-PCI bridge side, the I/O windows must have at |
6716 | - * least a 64 KB size and be aligned on their size, and the |
6717 | - * memory windows must have at least a 1 MB size and be |
6718 | - * aligned on their size |
6719 | + * least a 64 KB size and the memory windows must have at |
6720 | + * least a 1 MB size. Moreover, MBus windows need to have a |
6721 | + * base address aligned on their size, and their size must be |
6722 | + * a power of two. This means that if the BAR doesn't have a |
6723 | + * power of two size, several MBus windows will actually be |
6724 | + * created. We need to ensure that the biggest MBus window |
6725 | + * (which will be the first one) is aligned on its size, which |
6726 | + * explains the rounddown_pow_of_two() being done here. |
6727 | */ |
6728 | if (res->flags & IORESOURCE_IO) |
6729 | - return round_up(start, max_t(resource_size_t, SZ_64K, size)); |
6730 | + return round_up(start, max_t(resource_size_t, SZ_64K, |
6731 | + rounddown_pow_of_two(size))); |
6732 | else if (res->flags & IORESOURCE_MEM) |
6733 | - return round_up(start, max_t(resource_size_t, SZ_1M, size)); |
6734 | + return round_up(start, max_t(resource_size_t, SZ_1M, |
6735 | + rounddown_pow_of_two(size))); |
6736 | else |
6737 | return start; |
6738 | } |
6739 | diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c |
6740 | index 58499277903a..6efc2ec5e4db 100644 |
6741 | --- a/drivers/pci/hotplug/shpchp_ctrl.c |
6742 | +++ b/drivers/pci/hotplug/shpchp_ctrl.c |
6743 | @@ -282,8 +282,8 @@ static int board_added(struct slot *p_slot) |
6744 | return WRONG_BUS_FREQUENCY; |
6745 | } |
6746 | |
6747 | - bsp = ctrl->pci_dev->bus->cur_bus_speed; |
6748 | - msp = ctrl->pci_dev->bus->max_bus_speed; |
6749 | + bsp = ctrl->pci_dev->subordinate->cur_bus_speed; |
6750 | + msp = ctrl->pci_dev->subordinate->max_bus_speed; |
6751 | |
6752 | /* Check if there are other slots or devices on the same bus */ |
6753 | if (!list_empty(&ctrl->pci_dev->subordinate->devices)) |
6754 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
6755 | index fdbc294821e6..33bb970980d2 100644 |
6756 | --- a/drivers/pci/pci.c |
6757 | +++ b/drivers/pci/pci.c |
6758 | @@ -3043,7 +3043,8 @@ int pci_wait_for_pending_transaction(struct pci_dev *dev) |
6759 | if (!pci_is_pcie(dev)) |
6760 | return 1; |
6761 | |
6762 | - return pci_wait_for_pending(dev, PCI_EXP_DEVSTA, PCI_EXP_DEVSTA_TRPND); |
6763 | + return pci_wait_for_pending(dev, pci_pcie_cap(dev) + PCI_EXP_DEVSTA, |
6764 | + PCI_EXP_DEVSTA_TRPND); |
6765 | } |
6766 | EXPORT_SYMBOL(pci_wait_for_pending_transaction); |
6767 | |
6768 | @@ -3085,7 +3086,7 @@ static int pci_af_flr(struct pci_dev *dev, int probe) |
6769 | return 0; |
6770 | |
6771 | /* Wait for Transaction Pending bit clean */ |
6772 | - if (pci_wait_for_pending(dev, PCI_AF_STATUS, PCI_AF_STATUS_TP)) |
6773 | + if (pci_wait_for_pending(dev, pos + PCI_AF_STATUS, PCI_AF_STATUS_TP)) |
6774 | goto clear; |
6775 | |
6776 | dev_err(&dev->dev, "transaction is not cleared; " |
6777 | diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c |
6778 | index 9f611cbbc294..c31aa07b3ba5 100644 |
6779 | --- a/drivers/pnp/pnpacpi/core.c |
6780 | +++ b/drivers/pnp/pnpacpi/core.c |
6781 | @@ -83,8 +83,7 @@ static int pnpacpi_set_resources(struct pnp_dev *dev) |
6782 | { |
6783 | struct acpi_device *acpi_dev; |
6784 | acpi_handle handle; |
6785 | - struct acpi_buffer buffer; |
6786 | - int ret; |
6787 | + int ret = 0; |
6788 | |
6789 | pnp_dbg(&dev->dev, "set resources\n"); |
6790 | |
6791 | @@ -97,19 +96,26 @@ static int pnpacpi_set_resources(struct pnp_dev *dev) |
6792 | if (WARN_ON_ONCE(acpi_dev != dev->data)) |
6793 | dev->data = acpi_dev; |
6794 | |
6795 | - ret = pnpacpi_build_resource_template(dev, &buffer); |
6796 | - if (ret) |
6797 | - return ret; |
6798 | - ret = pnpacpi_encode_resources(dev, &buffer); |
6799 | - if (ret) { |
6800 | + if (acpi_has_method(handle, METHOD_NAME__SRS)) { |
6801 | + struct acpi_buffer buffer; |
6802 | + |
6803 | + ret = pnpacpi_build_resource_template(dev, &buffer); |
6804 | + if (ret) |
6805 | + return ret; |
6806 | + |
6807 | + ret = pnpacpi_encode_resources(dev, &buffer); |
6808 | + if (!ret) { |
6809 | + acpi_status status; |
6810 | + |
6811 | + status = acpi_set_current_resources(handle, &buffer); |
6812 | + if (ACPI_FAILURE(status)) |
6813 | + ret = -EIO; |
6814 | + } |
6815 | kfree(buffer.pointer); |
6816 | - return ret; |
6817 | } |
6818 | - if (ACPI_FAILURE(acpi_set_current_resources(handle, &buffer))) |
6819 | - ret = -EINVAL; |
6820 | - else if (acpi_bus_power_manageable(handle)) |
6821 | + if (!ret && acpi_bus_power_manageable(handle)) |
6822 | ret = acpi_bus_set_power(handle, ACPI_STATE_D0); |
6823 | - kfree(buffer.pointer); |
6824 | + |
6825 | return ret; |
6826 | } |
6827 | |
6828 | @@ -117,7 +123,7 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev) |
6829 | { |
6830 | struct acpi_device *acpi_dev; |
6831 | acpi_handle handle; |
6832 | - int ret; |
6833 | + acpi_status status; |
6834 | |
6835 | dev_dbg(&dev->dev, "disable resources\n"); |
6836 | |
6837 | @@ -128,13 +134,15 @@ static int pnpacpi_disable_resources(struct pnp_dev *dev) |
6838 | } |
6839 | |
6840 | /* acpi_unregister_gsi(pnp_irq(dev, 0)); */ |
6841 | - ret = 0; |
6842 | if (acpi_bus_power_manageable(handle)) |
6843 | acpi_bus_set_power(handle, ACPI_STATE_D3_COLD); |
6844 | - /* continue even if acpi_bus_set_power() fails */ |
6845 | - if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL))) |
6846 | - ret = -ENODEV; |
6847 | - return ret; |
6848 | + |
6849 | + /* continue even if acpi_bus_set_power() fails */ |
6850 | + status = acpi_evaluate_object(handle, "_DIS", NULL, NULL); |
6851 | + if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) |
6852 | + return -ENODEV; |
6853 | + |
6854 | + return 0; |
6855 | } |
6856 | |
6857 | #ifdef CONFIG_ACPI_SLEEP |
6858 | diff --git a/drivers/rtc/rtc-hym8563.c b/drivers/rtc/rtc-hym8563.c |
6859 | index bd628a6f981d..e5f13c4310fe 100644 |
6860 | --- a/drivers/rtc/rtc-hym8563.c |
6861 | +++ b/drivers/rtc/rtc-hym8563.c |
6862 | @@ -569,6 +569,9 @@ static int hym8563_probe(struct i2c_client *client, |
6863 | if (IS_ERR(hym8563->rtc)) |
6864 | return PTR_ERR(hym8563->rtc); |
6865 | |
6866 | + /* the hym8563 alarm only supports a minute accuracy */ |
6867 | + hym8563->rtc->uie_unsupported = 1; |
6868 | + |
6869 | #ifdef CONFIG_COMMON_CLK |
6870 | hym8563_clkout_register_clk(hym8563); |
6871 | #endif |
6872 | diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c |
6873 | index d0b28bba38be..fbf3b22efe5a 100644 |
6874 | --- a/drivers/spi/spi.c |
6875 | +++ b/drivers/spi/spi.c |
6876 | @@ -1568,7 +1568,7 @@ EXPORT_SYMBOL_GPL(spi_busnum_to_master); |
6877 | */ |
6878 | int spi_setup(struct spi_device *spi) |
6879 | { |
6880 | - unsigned bad_bits; |
6881 | + unsigned bad_bits, ugly_bits; |
6882 | int status = 0; |
6883 | |
6884 | /* check mode to prevent that DUAL and QUAD set at the same time |
6885 | @@ -1588,6 +1588,15 @@ int spi_setup(struct spi_device *spi) |
6886 | * that aren't supported with their current master |
6887 | */ |
6888 | bad_bits = spi->mode & ~spi->master->mode_bits; |
6889 | + ugly_bits = bad_bits & |
6890 | + (SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD); |
6891 | + if (ugly_bits) { |
6892 | + dev_warn(&spi->dev, |
6893 | + "setup: ignoring unsupported mode bits %x\n", |
6894 | + ugly_bits); |
6895 | + spi->mode &= ~ugly_bits; |
6896 | + bad_bits &= ~ugly_bits; |
6897 | + } |
6898 | if (bad_bits) { |
6899 | dev_err(&spi->dev, "setup: unsupported mode bits %x\n", |
6900 | bad_bits); |
6901 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
6902 | index 7e5469a80fe3..86b92d95ac10 100644 |
6903 | --- a/drivers/target/iscsi/iscsi_target.c |
6904 | +++ b/drivers/target/iscsi/iscsi_target.c |
6905 | @@ -1564,7 +1564,9 @@ int iscsit_process_nop_out(struct iscsi_conn *conn, struct iscsi_cmd *cmd, |
6906 | * Initiator is expecting a NopIN ping reply.. |
6907 | */ |
6908 | if (hdr->itt != RESERVED_ITT) { |
6909 | - BUG_ON(!cmd); |
6910 | + if (!cmd) |
6911 | + return iscsit_add_reject(conn, ISCSI_REASON_PROTOCOL_ERROR, |
6912 | + (unsigned char *)hdr); |
6913 | |
6914 | spin_lock_bh(&conn->cmd_lock); |
6915 | list_add_tail(&cmd->i_conn_node, &conn->conn_cmd_list); |
6916 | diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c |
6917 | index 65001e133670..26416c15d65c 100644 |
6918 | --- a/drivers/target/target_core_device.c |
6919 | +++ b/drivers/target/target_core_device.c |
6920 | @@ -798,10 +798,10 @@ int se_dev_set_emulate_write_cache(struct se_device *dev, int flag) |
6921 | pr_err("emulate_write_cache not supported for pSCSI\n"); |
6922 | return -EINVAL; |
6923 | } |
6924 | - if (dev->transport->get_write_cache) { |
6925 | - pr_warn("emulate_write_cache cannot be changed when underlying" |
6926 | - " HW reports WriteCacheEnabled, ignoring request\n"); |
6927 | - return 0; |
6928 | + if (flag && |
6929 | + dev->transport->get_write_cache) { |
6930 | + pr_err("emulate_write_cache not supported for this device\n"); |
6931 | + return -EINVAL; |
6932 | } |
6933 | |
6934 | dev->dev_attrib.emulate_write_cache = flag; |
6935 | @@ -936,6 +936,10 @@ int se_dev_set_pi_prot_type(struct se_device *dev, int flag) |
6936 | return 0; |
6937 | } |
6938 | if (!dev->transport->init_prot || !dev->transport->free_prot) { |
6939 | + /* 0 is only allowed value for non-supporting backends */ |
6940 | + if (flag == 0) |
6941 | + return 0; |
6942 | + |
6943 | pr_err("DIF protection not supported by backend: %s\n", |
6944 | dev->transport->name); |
6945 | return -ENOSYS; |
6946 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c |
6947 | index 2956250b7225..98b48d400a3a 100644 |
6948 | --- a/drivers/target/target_core_transport.c |
6949 | +++ b/drivers/target/target_core_transport.c |
6950 | @@ -1102,6 +1102,7 @@ void transport_init_se_cmd( |
6951 | init_completion(&cmd->cmd_wait_comp); |
6952 | init_completion(&cmd->task_stop_comp); |
6953 | spin_lock_init(&cmd->t_state_lock); |
6954 | + kref_init(&cmd->cmd_kref); |
6955 | cmd->transport_state = CMD_T_DEV_ACTIVE; |
6956 | |
6957 | cmd->se_tfo = tfo; |
6958 | @@ -2292,7 +2293,6 @@ int target_get_sess_cmd(struct se_session *se_sess, struct se_cmd *se_cmd, |
6959 | unsigned long flags; |
6960 | int ret = 0; |
6961 | |
6962 | - kref_init(&se_cmd->cmd_kref); |
6963 | /* |
6964 | * Add a second kref if the fabric caller is expecting to handle |
6965 | * fabric acknowledgement that requires two target_put_sess_cmd() |
6966 | diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c |
6967 | index 8b2c1aaf81de..d22cdc77e9d4 100644 |
6968 | --- a/drivers/target/tcm_fc/tfc_cmd.c |
6969 | +++ b/drivers/target/tcm_fc/tfc_cmd.c |
6970 | @@ -90,18 +90,18 @@ static void ft_free_cmd(struct ft_cmd *cmd) |
6971 | { |
6972 | struct fc_frame *fp; |
6973 | struct fc_lport *lport; |
6974 | - struct se_session *se_sess; |
6975 | + struct ft_sess *sess; |
6976 | |
6977 | if (!cmd) |
6978 | return; |
6979 | - se_sess = cmd->sess->se_sess; |
6980 | + sess = cmd->sess; |
6981 | fp = cmd->req_frame; |
6982 | lport = fr_dev(fp); |
6983 | if (fr_seq(fp)) |
6984 | lport->tt.seq_release(fr_seq(fp)); |
6985 | fc_frame_free(fp); |
6986 | - percpu_ida_free(&se_sess->sess_tag_pool, cmd->se_cmd.map_tag); |
6987 | - ft_sess_put(cmd->sess); /* undo get from lookup at recv */ |
6988 | + percpu_ida_free(&sess->se_sess->sess_tag_pool, cmd->se_cmd.map_tag); |
6989 | + ft_sess_put(sess); /* undo get from lookup at recv */ |
6990 | } |
6991 | |
6992 | void ft_release_cmd(struct se_cmd *se_cmd) |
6993 | diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c |
6994 | index 2798a23a0834..29a7f632b354 100644 |
6995 | --- a/drivers/tty/serial/8250/8250_core.c |
6996 | +++ b/drivers/tty/serial/8250/8250_core.c |
6997 | @@ -1520,7 +1520,7 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) |
6998 | status = serial8250_rx_chars(up, status); |
6999 | } |
7000 | serial8250_modem_status(up); |
7001 | - if (status & UART_LSR_THRE) |
7002 | + if (!up->dma && (status & UART_LSR_THRE)) |
7003 | serial8250_tx_chars(up); |
7004 | |
7005 | spin_unlock_irqrestore(&port->lock, flags); |
7006 | diff --git a/drivers/tty/serial/8250/8250_dma.c b/drivers/tty/serial/8250/8250_dma.c |
7007 | index 7046769608d4..ab9096dc3849 100644 |
7008 | --- a/drivers/tty/serial/8250/8250_dma.c |
7009 | +++ b/drivers/tty/serial/8250/8250_dma.c |
7010 | @@ -20,12 +20,15 @@ static void __dma_tx_complete(void *param) |
7011 | struct uart_8250_port *p = param; |
7012 | struct uart_8250_dma *dma = p->dma; |
7013 | struct circ_buf *xmit = &p->port.state->xmit; |
7014 | - |
7015 | - dma->tx_running = 0; |
7016 | + unsigned long flags; |
7017 | |
7018 | dma_sync_single_for_cpu(dma->txchan->device->dev, dma->tx_addr, |
7019 | UART_XMIT_SIZE, DMA_TO_DEVICE); |
7020 | |
7021 | + spin_lock_irqsave(&p->port.lock, flags); |
7022 | + |
7023 | + dma->tx_running = 0; |
7024 | + |
7025 | xmit->tail += dma->tx_size; |
7026 | xmit->tail &= UART_XMIT_SIZE - 1; |
7027 | p->port.icount.tx += dma->tx_size; |
7028 | @@ -35,6 +38,8 @@ static void __dma_tx_complete(void *param) |
7029 | |
7030 | if (!uart_circ_empty(xmit) && !uart_tx_stopped(&p->port)) |
7031 | serial8250_tx_dma(p); |
7032 | + |
7033 | + spin_unlock_irqrestore(&p->port.lock, flags); |
7034 | } |
7035 | |
7036 | static void __dma_rx_complete(void *param) |
7037 | diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c |
7038 | index cea8c20a1425..1926925a52a9 100644 |
7039 | --- a/drivers/usb/gadget/at91_udc.c |
7040 | +++ b/drivers/usb/gadget/at91_udc.c |
7041 | @@ -1709,16 +1709,6 @@ static int at91udc_probe(struct platform_device *pdev) |
7042 | return -ENODEV; |
7043 | } |
7044 | |
7045 | - if (pdev->num_resources != 2) { |
7046 | - DBG("invalid num_resources\n"); |
7047 | - return -ENODEV; |
7048 | - } |
7049 | - if ((pdev->resource[0].flags != IORESOURCE_MEM) |
7050 | - || (pdev->resource[1].flags != IORESOURCE_IRQ)) { |
7051 | - DBG("invalid resource type\n"); |
7052 | - return -ENODEV; |
7053 | - } |
7054 | - |
7055 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
7056 | if (!res) |
7057 | return -ENXIO; |
7058 | diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c |
7059 | index 6f2c8d3899d2..cf2734b532a7 100644 |
7060 | --- a/drivers/usb/host/ehci-fsl.c |
7061 | +++ b/drivers/usb/host/ehci-fsl.c |
7062 | @@ -248,7 +248,8 @@ static int ehci_fsl_setup_phy(struct usb_hcd *hcd, |
7063 | break; |
7064 | } |
7065 | |
7066 | - if (pdata->have_sysif_regs && pdata->controller_ver && |
7067 | + if (pdata->have_sysif_regs && |
7068 | + pdata->controller_ver > FSL_USB_VER_1_6 && |
7069 | (phy_mode == FSL_USB2_PHY_ULPI)) { |
7070 | /* check PHY_CLK_VALID to get phy clk valid */ |
7071 | if (!(spin_event_timeout(in_be32(non_ehci + FSL_SOC_USB_CTRL) & |
7072 | diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c |
7073 | index c81c8721cc5a..cd871b895013 100644 |
7074 | --- a/drivers/usb/host/ohci-hub.c |
7075 | +++ b/drivers/usb/host/ohci-hub.c |
7076 | @@ -90,6 +90,24 @@ __acquires(ohci->lock) |
7077 | dl_done_list (ohci); |
7078 | finish_unlinks (ohci, ohci_frame_no(ohci)); |
7079 | |
7080 | + /* |
7081 | + * Some controllers don't handle "global" suspend properly if |
7082 | + * there are unsuspended ports. For these controllers, put all |
7083 | + * the enabled ports into suspend before suspending the root hub. |
7084 | + */ |
7085 | + if (ohci->flags & OHCI_QUIRK_GLOBAL_SUSPEND) { |
7086 | + __hc32 __iomem *portstat = ohci->regs->roothub.portstatus; |
7087 | + int i; |
7088 | + unsigned temp; |
7089 | + |
7090 | + for (i = 0; i < ohci->num_ports; (++i, ++portstat)) { |
7091 | + temp = ohci_readl(ohci, portstat); |
7092 | + if ((temp & (RH_PS_PES | RH_PS_PSS)) == |
7093 | + RH_PS_PES) |
7094 | + ohci_writel(ohci, RH_PS_PSS, portstat); |
7095 | + } |
7096 | + } |
7097 | + |
7098 | /* maybe resume can wake root hub */ |
7099 | if (ohci_to_hcd(ohci)->self.root_hub->do_remote_wakeup || autostop) { |
7100 | ohci->hc_control |= OHCI_CTRL_RWE; |
7101 | diff --git a/drivers/usb/host/ohci-pci.c b/drivers/usb/host/ohci-pci.c |
7102 | index 90879e9ccbec..bb1509675727 100644 |
7103 | --- a/drivers/usb/host/ohci-pci.c |
7104 | +++ b/drivers/usb/host/ohci-pci.c |
7105 | @@ -160,6 +160,7 @@ static int ohci_quirk_amd700(struct usb_hcd *hcd) |
7106 | ohci_dbg(ohci, "enabled AMD prefetch quirk\n"); |
7107 | } |
7108 | |
7109 | + ohci->flags |= OHCI_QUIRK_GLOBAL_SUSPEND; |
7110 | return 0; |
7111 | } |
7112 | |
7113 | diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h |
7114 | index 9250cada13f0..4550ce05af7f 100644 |
7115 | --- a/drivers/usb/host/ohci.h |
7116 | +++ b/drivers/usb/host/ohci.h |
7117 | @@ -405,6 +405,8 @@ struct ohci_hcd { |
7118 | #define OHCI_QUIRK_HUB_POWER 0x100 /* distrust firmware power/oc setup */ |
7119 | #define OHCI_QUIRK_AMD_PLL 0x200 /* AMD PLL quirk*/ |
7120 | #define OHCI_QUIRK_AMD_PREFETCH 0x400 /* pre-fetch for ISO transfer */ |
7121 | +#define OHCI_QUIRK_GLOBAL_SUSPEND 0x800 /* must suspend ports */ |
7122 | + |
7123 | // there are also chip quirks/bugs in init logic |
7124 | |
7125 | struct work_struct nec_work; /* Worker for NEC quirk */ |
7126 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c |
7127 | index 7ed681a714a5..6c0a542e8ec1 100644 |
7128 | --- a/drivers/usb/serial/qcserial.c |
7129 | +++ b/drivers/usb/serial/qcserial.c |
7130 | @@ -151,6 +151,21 @@ static const struct usb_device_id id_table[] = { |
7131 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 0)}, /* Netgear AirCard 340U Device Management */ |
7132 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 2)}, /* Netgear AirCard 340U NMEA */ |
7133 | {USB_DEVICE_INTERFACE_NUMBER(0x1199, 0x9051, 3)}, /* Netgear AirCard 340U Modem */ |
7134 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a2, 0)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card Device Management */ |
7135 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a2, 2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card NMEA */ |
7136 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a2, 3)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card Modem */ |
7137 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a3, 0)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card Device Management */ |
7138 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a3, 2)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card NMEA */ |
7139 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a3, 3)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card Modem */ |
7140 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a4, 0)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card Device Management */ |
7141 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a4, 2)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card NMEA */ |
7142 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a4, 3)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card Modem */ |
7143 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a8, 0)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card Device Management */ |
7144 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a8, 2)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card NMEA */ |
7145 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a8, 3)}, /* Dell Wireless 5808 Gobi(TM) 4G LTE Mobile Broadband Card Modem */ |
7146 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a9, 0)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card Device Management */ |
7147 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a9, 2)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card NMEA */ |
7148 | + {USB_DEVICE_INTERFACE_NUMBER(0x413c, 0x81a9, 3)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card Modem */ |
7149 | |
7150 | { } /* Terminating entry */ |
7151 | }; |
7152 | diff --git a/drivers/usb/storage/shuttle_usbat.c b/drivers/usb/storage/shuttle_usbat.c |
7153 | index 4ef2a80728f7..008d805c3d21 100644 |
7154 | --- a/drivers/usb/storage/shuttle_usbat.c |
7155 | +++ b/drivers/usb/storage/shuttle_usbat.c |
7156 | @@ -1851,7 +1851,7 @@ static int usbat_probe(struct usb_interface *intf, |
7157 | us->transport_name = "Shuttle USBAT"; |
7158 | us->transport = usbat_flash_transport; |
7159 | us->transport_reset = usb_stor_CB_reset; |
7160 | - us->max_lun = 1; |
7161 | + us->max_lun = 0; |
7162 | |
7163 | result = usb_stor_probe2(us); |
7164 | return result; |
7165 | diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h |
7166 | index adbeb255616a..042c83b01046 100644 |
7167 | --- a/drivers/usb/storage/unusual_devs.h |
7168 | +++ b/drivers/usb/storage/unusual_devs.h |
7169 | @@ -234,6 +234,20 @@ UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370, |
7170 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
7171 | US_FL_MAX_SECTORS_64 ), |
7172 | |
7173 | +/* Reported by Daniele Forsi <dforsi@gmail.com> */ |
7174 | +UNUSUAL_DEV( 0x0421, 0x04b9, 0x0350, 0x0350, |
7175 | + "Nokia", |
7176 | + "5300", |
7177 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
7178 | + US_FL_MAX_SECTORS_64 ), |
7179 | + |
7180 | +/* Patch submitted by Victor A. Santos <victoraur.santos@gmail.com> */ |
7181 | +UNUSUAL_DEV( 0x0421, 0x05af, 0x0742, 0x0742, |
7182 | + "Nokia", |
7183 | + "305", |
7184 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
7185 | + US_FL_MAX_SECTORS_64), |
7186 | + |
7187 | /* Patch submitted by Mikhail Zolotaryov <lebon@lebon.org.ua> */ |
7188 | UNUSUAL_DEV( 0x0421, 0x06aa, 0x1110, 0x1110, |
7189 | "Nokia", |
7190 | diff --git a/fs/affs/super.c b/fs/affs/super.c |
7191 | index d098731b82ff..9a5b19dc899d 100644 |
7192 | --- a/fs/affs/super.c |
7193 | +++ b/fs/affs/super.c |
7194 | @@ -336,8 +336,6 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent) |
7195 | &blocksize,&sbi->s_prefix, |
7196 | sbi->s_volume, &mount_flags)) { |
7197 | printk(KERN_ERR "AFFS: Error parsing options\n"); |
7198 | - kfree(sbi->s_prefix); |
7199 | - kfree(sbi); |
7200 | return -EINVAL; |
7201 | } |
7202 | /* N.B. after this point s_prefix must be released */ |
7203 | diff --git a/fs/aio.c b/fs/aio.c |
7204 | index 12a3de0ee6da..04cd7686555d 100644 |
7205 | --- a/fs/aio.c |
7206 | +++ b/fs/aio.c |
7207 | @@ -1299,10 +1299,8 @@ rw_common: |
7208 | &iovec, compat) |
7209 | : aio_setup_single_vector(req, rw, buf, &nr_segs, |
7210 | iovec); |
7211 | - if (ret) |
7212 | - return ret; |
7213 | - |
7214 | - ret = rw_verify_area(rw, file, &req->ki_pos, req->ki_nbytes); |
7215 | + if (!ret) |
7216 | + ret = rw_verify_area(rw, file, &req->ki_pos, req->ki_nbytes); |
7217 | if (ret < 0) { |
7218 | if (iovec != &inline_vec) |
7219 | kfree(iovec); |
7220 | diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c |
7221 | index 2caf36ac3e93..cc87c1abac97 100644 |
7222 | --- a/fs/autofs4/root.c |
7223 | +++ b/fs/autofs4/root.c |
7224 | @@ -179,7 +179,7 @@ static struct dentry *autofs4_lookup_active(struct dentry *dentry) |
7225 | spin_lock(&active->d_lock); |
7226 | |
7227 | /* Already gone? */ |
7228 | - if (!d_count(active)) |
7229 | + if ((int) d_count(active) <= 0) |
7230 | goto next; |
7231 | |
7232 | qstr = &active->d_name; |
7233 | @@ -230,7 +230,7 @@ static struct dentry *autofs4_lookup_expiring(struct dentry *dentry) |
7234 | |
7235 | spin_lock(&expiring->d_lock); |
7236 | |
7237 | - /* Bad luck, we've already been dentry_iput */ |
7238 | + /* We've already been dentry_iput or unlinked */ |
7239 | if (!expiring->d_inode) |
7240 | goto next; |
7241 | |
7242 | diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c |
7243 | index 45eda6d7a40c..5e0982aa7000 100644 |
7244 | --- a/fs/ceph/dir.c |
7245 | +++ b/fs/ceph/dir.c |
7246 | @@ -446,7 +446,6 @@ more: |
7247 | if (atomic_read(&ci->i_release_count) == fi->dir_release_count) { |
7248 | dout(" marking %p complete\n", inode); |
7249 | __ceph_dir_set_complete(ci, fi->dir_release_count); |
7250 | - ci->i_max_offset = ctx->pos; |
7251 | } |
7252 | spin_unlock(&ci->i_ceph_lock); |
7253 | |
7254 | @@ -932,14 +931,16 @@ static int ceph_rename(struct inode *old_dir, struct dentry *old_dentry, |
7255 | * to do it here. |
7256 | */ |
7257 | |
7258 | - /* d_move screws up d_subdirs order */ |
7259 | - ceph_dir_clear_complete(new_dir); |
7260 | - |
7261 | d_move(old_dentry, new_dentry); |
7262 | |
7263 | /* ensure target dentry is invalidated, despite |
7264 | rehashing bug in vfs_rename_dir */ |
7265 | ceph_invalidate_dentry_lease(new_dentry); |
7266 | + |
7267 | + /* d_move screws up sibling dentries' offsets */ |
7268 | + ceph_dir_clear_complete(old_dir); |
7269 | + ceph_dir_clear_complete(new_dir); |
7270 | + |
7271 | } |
7272 | ceph_mdsc_put_request(req); |
7273 | return err; |
7274 | diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c |
7275 | index 32d519d8a2e2..6471f9c83428 100644 |
7276 | --- a/fs/ceph/inode.c |
7277 | +++ b/fs/ceph/inode.c |
7278 | @@ -752,7 +752,6 @@ static int fill_inode(struct inode *inode, |
7279 | !__ceph_dir_is_complete(ci)) { |
7280 | dout(" marking %p complete (empty)\n", inode); |
7281 | __ceph_dir_set_complete(ci, atomic_read(&ci->i_release_count)); |
7282 | - ci->i_max_offset = 2; |
7283 | } |
7284 | no_change: |
7285 | spin_unlock(&ci->i_ceph_lock); |
7286 | @@ -890,41 +889,6 @@ out_unlock: |
7287 | } |
7288 | |
7289 | /* |
7290 | - * Set dentry's directory position based on the current dir's max, and |
7291 | - * order it in d_subdirs, so that dcache_readdir behaves. |
7292 | - * |
7293 | - * Always called under directory's i_mutex. |
7294 | - */ |
7295 | -static void ceph_set_dentry_offset(struct dentry *dn) |
7296 | -{ |
7297 | - struct dentry *dir = dn->d_parent; |
7298 | - struct inode *inode = dir->d_inode; |
7299 | - struct ceph_inode_info *ci; |
7300 | - struct ceph_dentry_info *di; |
7301 | - |
7302 | - BUG_ON(!inode); |
7303 | - |
7304 | - ci = ceph_inode(inode); |
7305 | - di = ceph_dentry(dn); |
7306 | - |
7307 | - spin_lock(&ci->i_ceph_lock); |
7308 | - if (!__ceph_dir_is_complete(ci)) { |
7309 | - spin_unlock(&ci->i_ceph_lock); |
7310 | - return; |
7311 | - } |
7312 | - di->offset = ceph_inode(inode)->i_max_offset++; |
7313 | - spin_unlock(&ci->i_ceph_lock); |
7314 | - |
7315 | - spin_lock(&dir->d_lock); |
7316 | - spin_lock_nested(&dn->d_lock, DENTRY_D_LOCK_NESTED); |
7317 | - list_move(&dn->d_u.d_child, &dir->d_subdirs); |
7318 | - dout("set_dentry_offset %p %lld (%p %p)\n", dn, di->offset, |
7319 | - dn->d_u.d_child.prev, dn->d_u.d_child.next); |
7320 | - spin_unlock(&dn->d_lock); |
7321 | - spin_unlock(&dir->d_lock); |
7322 | -} |
7323 | - |
7324 | -/* |
7325 | * splice a dentry to an inode. |
7326 | * caller must hold directory i_mutex for this to be safe. |
7327 | * |
7328 | @@ -933,7 +897,7 @@ static void ceph_set_dentry_offset(struct dentry *dn) |
7329 | * the caller) if we fail. |
7330 | */ |
7331 | static struct dentry *splice_dentry(struct dentry *dn, struct inode *in, |
7332 | - bool *prehash, bool set_offset) |
7333 | + bool *prehash) |
7334 | { |
7335 | struct dentry *realdn; |
7336 | |
7337 | @@ -965,8 +929,6 @@ static struct dentry *splice_dentry(struct dentry *dn, struct inode *in, |
7338 | } |
7339 | if ((!prehash || *prehash) && d_unhashed(dn)) |
7340 | d_rehash(dn); |
7341 | - if (set_offset) |
7342 | - ceph_set_dentry_offset(dn); |
7343 | out: |
7344 | return dn; |
7345 | } |
7346 | @@ -987,7 +949,6 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, |
7347 | { |
7348 | struct ceph_mds_reply_info_parsed *rinfo = &req->r_reply_info; |
7349 | struct inode *in = NULL; |
7350 | - struct ceph_mds_reply_inode *ininfo; |
7351 | struct ceph_vino vino; |
7352 | struct ceph_fs_client *fsc = ceph_sb_to_client(sb); |
7353 | int err = 0; |
7354 | @@ -1112,6 +1073,9 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, |
7355 | |
7356 | /* rename? */ |
7357 | if (req->r_old_dentry && req->r_op == CEPH_MDS_OP_RENAME) { |
7358 | + struct inode *olddir = req->r_old_dentry_dir; |
7359 | + BUG_ON(!olddir); |
7360 | + |
7361 | dout(" src %p '%.*s' dst %p '%.*s'\n", |
7362 | req->r_old_dentry, |
7363 | req->r_old_dentry->d_name.len, |
7364 | @@ -1131,13 +1095,10 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, |
7365 | rehashing bug in vfs_rename_dir */ |
7366 | ceph_invalidate_dentry_lease(dn); |
7367 | |
7368 | - /* |
7369 | - * d_move() puts the renamed dentry at the end of |
7370 | - * d_subdirs. We need to assign it an appropriate |
7371 | - * directory offset so we can behave when dir is |
7372 | - * complete. |
7373 | - */ |
7374 | - ceph_set_dentry_offset(req->r_old_dentry); |
7375 | + /* d_move screws up sibling dentries' offsets */ |
7376 | + ceph_dir_clear_complete(dir); |
7377 | + ceph_dir_clear_complete(olddir); |
7378 | + |
7379 | dout("dn %p gets new offset %lld\n", req->r_old_dentry, |
7380 | ceph_dentry(req->r_old_dentry)->offset); |
7381 | |
7382 | @@ -1164,8 +1125,9 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, |
7383 | |
7384 | /* attach proper inode */ |
7385 | if (!dn->d_inode) { |
7386 | + ceph_dir_clear_complete(dir); |
7387 | ihold(in); |
7388 | - dn = splice_dentry(dn, in, &have_lease, true); |
7389 | + dn = splice_dentry(dn, in, &have_lease); |
7390 | if (IS_ERR(dn)) { |
7391 | err = PTR_ERR(dn); |
7392 | goto done; |
7393 | @@ -1186,17 +1148,16 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, |
7394 | (req->r_op == CEPH_MDS_OP_LOOKUPSNAP || |
7395 | req->r_op == CEPH_MDS_OP_MKSNAP)) { |
7396 | struct dentry *dn = req->r_dentry; |
7397 | + struct inode *dir = req->r_locked_dir; |
7398 | |
7399 | /* fill out a snapdir LOOKUPSNAP dentry */ |
7400 | BUG_ON(!dn); |
7401 | - BUG_ON(!req->r_locked_dir); |
7402 | - BUG_ON(ceph_snap(req->r_locked_dir) != CEPH_SNAPDIR); |
7403 | - ininfo = rinfo->targeti.in; |
7404 | - vino.ino = le64_to_cpu(ininfo->ino); |
7405 | - vino.snap = le64_to_cpu(ininfo->snapid); |
7406 | + BUG_ON(!dir); |
7407 | + BUG_ON(ceph_snap(dir) != CEPH_SNAPDIR); |
7408 | dout(" linking snapped dir %p to dn %p\n", in, dn); |
7409 | + ceph_dir_clear_complete(dir); |
7410 | ihold(in); |
7411 | - dn = splice_dentry(dn, in, NULL, true); |
7412 | + dn = splice_dentry(dn, in, NULL); |
7413 | if (IS_ERR(dn)) { |
7414 | err = PTR_ERR(dn); |
7415 | goto done; |
7416 | @@ -1358,7 +1319,7 @@ retry_lookup: |
7417 | } |
7418 | |
7419 | if (!dn->d_inode) { |
7420 | - dn = splice_dentry(dn, in, NULL, false); |
7421 | + dn = splice_dentry(dn, in, NULL); |
7422 | if (IS_ERR(dn)) { |
7423 | err = PTR_ERR(dn); |
7424 | dn = NULL; |
7425 | diff --git a/fs/ceph/super.h b/fs/ceph/super.h |
7426 | index d8801a95b685..df2caa84b94f 100644 |
7427 | --- a/fs/ceph/super.h |
7428 | +++ b/fs/ceph/super.h |
7429 | @@ -266,7 +266,6 @@ struct ceph_inode_info { |
7430 | struct timespec i_rctime; |
7431 | u64 i_rbytes, i_rfiles, i_rsubdirs; |
7432 | u64 i_files, i_subdirs; |
7433 | - u64 i_max_offset; /* largest readdir offset, set with complete dir */ |
7434 | |
7435 | struct rb_root i_fragtree; |
7436 | struct mutex i_fragtree_mutex; |
7437 | diff --git a/fs/coredump.c b/fs/coredump.c |
7438 | index e3ad709a4232..0b2528fb640e 100644 |
7439 | --- a/fs/coredump.c |
7440 | +++ b/fs/coredump.c |
7441 | @@ -73,10 +73,15 @@ static int expand_corename(struct core_name *cn, int size) |
7442 | static int cn_vprintf(struct core_name *cn, const char *fmt, va_list arg) |
7443 | { |
7444 | int free, need; |
7445 | + va_list arg_copy; |
7446 | |
7447 | again: |
7448 | free = cn->size - cn->used; |
7449 | - need = vsnprintf(cn->corename + cn->used, free, fmt, arg); |
7450 | + |
7451 | + va_copy(arg_copy, arg); |
7452 | + need = vsnprintf(cn->corename + cn->used, free, fmt, arg_copy); |
7453 | + va_end(arg_copy); |
7454 | + |
7455 | if (need < free) { |
7456 | cn->used += need; |
7457 | return 0; |
7458 | diff --git a/fs/dcache.c b/fs/dcache.c |
7459 | index ca02c13a84aa..7f3b4004c6c3 100644 |
7460 | --- a/fs/dcache.c |
7461 | +++ b/fs/dcache.c |
7462 | @@ -1647,8 +1647,7 @@ static void __d_instantiate(struct dentry *dentry, struct inode *inode) |
7463 | unsigned add_flags = d_flags_for_inode(inode); |
7464 | |
7465 | spin_lock(&dentry->d_lock); |
7466 | - dentry->d_flags &= ~DCACHE_ENTRY_TYPE; |
7467 | - dentry->d_flags |= add_flags; |
7468 | + __d_set_type(dentry, add_flags); |
7469 | if (inode) |
7470 | hlist_add_head(&dentry->d_alias, &inode->i_dentry); |
7471 | dentry->d_inode = inode; |
7472 | diff --git a/fs/exec.c b/fs/exec.c |
7473 | index 3d78fccdd723..31e46b1b358b 100644 |
7474 | --- a/fs/exec.c |
7475 | +++ b/fs/exec.c |
7476 | @@ -654,10 +654,10 @@ int setup_arg_pages(struct linux_binprm *bprm, |
7477 | unsigned long rlim_stack; |
7478 | |
7479 | #ifdef CONFIG_STACK_GROWSUP |
7480 | - /* Limit stack size to 1GB */ |
7481 | + /* Limit stack size */ |
7482 | stack_base = rlimit_max(RLIMIT_STACK); |
7483 | - if (stack_base > (1 << 30)) |
7484 | - stack_base = 1 << 30; |
7485 | + if (stack_base > STACK_SIZE_MAX) |
7486 | + stack_base = STACK_SIZE_MAX; |
7487 | |
7488 | /* Make sure we didn't let the argument array grow too large. */ |
7489 | if (vma->vm_end - vma->vm_start > stack_base) |
7490 | diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c |
7491 | index dbf397bfdff2..d29640b49be3 100644 |
7492 | --- a/fs/kernfs/file.c |
7493 | +++ b/fs/kernfs/file.c |
7494 | @@ -476,6 +476,8 @@ static int kernfs_fop_mmap(struct file *file, struct vm_area_struct *vma) |
7495 | |
7496 | ops = kernfs_ops(of->kn); |
7497 | rc = ops->mmap(of, vma); |
7498 | + if (rc) |
7499 | + goto out_put; |
7500 | |
7501 | /* |
7502 | * PowerPC's pci_mmap of legacy_mem uses shmem_zero_setup() |
7503 | diff --git a/fs/namei.c b/fs/namei.c |
7504 | index 4b491b431990..4a3c105cf703 100644 |
7505 | --- a/fs/namei.c |
7506 | +++ b/fs/namei.c |
7507 | @@ -1537,7 +1537,7 @@ static inline int walk_component(struct nameidata *nd, struct path *path, |
7508 | inode = path->dentry->d_inode; |
7509 | } |
7510 | err = -ENOENT; |
7511 | - if (!inode) |
7512 | + if (!inode || d_is_negative(path->dentry)) |
7513 | goto out_path_put; |
7514 | |
7515 | if (should_follow_link(path->dentry, follow)) { |
7516 | @@ -2240,7 +2240,7 @@ mountpoint_last(struct nameidata *nd, struct path *path) |
7517 | mutex_unlock(&dir->d_inode->i_mutex); |
7518 | |
7519 | done: |
7520 | - if (!dentry->d_inode) { |
7521 | + if (!dentry->d_inode || d_is_negative(dentry)) { |
7522 | error = -ENOENT; |
7523 | dput(dentry); |
7524 | goto out; |
7525 | @@ -2982,7 +2982,7 @@ retry_lookup: |
7526 | finish_lookup: |
7527 | /* we _can_ be in RCU mode here */ |
7528 | error = -ENOENT; |
7529 | - if (d_is_negative(path->dentry)) { |
7530 | + if (!inode || d_is_negative(path->dentry)) { |
7531 | path_to_nameidata(path, nd); |
7532 | goto out; |
7533 | } |
7534 | diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c |
7535 | index d190e33d0ec2..dea8c60954ba 100644 |
7536 | --- a/fs/nfsd/nfs4acl.c |
7537 | +++ b/fs/nfsd/nfs4acl.c |
7538 | @@ -402,8 +402,10 @@ sort_pacl(struct posix_acl *pacl) |
7539 | * by uid/gid. */ |
7540 | int i, j; |
7541 | |
7542 | - if (pacl->a_count <= 4) |
7543 | - return; /* no users or groups */ |
7544 | + /* no users or groups */ |
7545 | + if (!pacl || pacl->a_count <= 4) |
7546 | + return; |
7547 | + |
7548 | i = 1; |
7549 | while (pacl->a_entries[i].e_tag == ACL_USER) |
7550 | i++; |
7551 | @@ -530,13 +532,12 @@ posix_state_to_acl(struct posix_acl_state *state, unsigned int flags) |
7552 | |
7553 | /* |
7554 | * ACLs with no ACEs are treated differently in the inheritable |
7555 | - * and effective cases: when there are no inheritable ACEs, we |
7556 | - * set a zero-length default posix acl: |
7557 | + * and effective cases: when there are no inheritable ACEs, |
7558 | + * calls ->set_acl with a NULL ACL structure. |
7559 | */ |
7560 | - if (state->empty && (flags & NFS4_ACL_TYPE_DEFAULT)) { |
7561 | - pacl = posix_acl_alloc(0, GFP_KERNEL); |
7562 | - return pacl ? pacl : ERR_PTR(-ENOMEM); |
7563 | - } |
7564 | + if (state->empty && (flags & NFS4_ACL_TYPE_DEFAULT)) |
7565 | + return NULL; |
7566 | + |
7567 | /* |
7568 | * When there are no effective ACEs, the following will end |
7569 | * up setting a 3-element effective posix ACL with all |
7570 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
7571 | index 7415eac36501..1693fd93fa58 100644 |
7572 | --- a/fs/nfsd/nfs4state.c |
7573 | +++ b/fs/nfsd/nfs4state.c |
7574 | @@ -1078,6 +1078,18 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name) |
7575 | return NULL; |
7576 | } |
7577 | clp->cl_name.len = name.len; |
7578 | + INIT_LIST_HEAD(&clp->cl_sessions); |
7579 | + idr_init(&clp->cl_stateids); |
7580 | + atomic_set(&clp->cl_refcount, 0); |
7581 | + clp->cl_cb_state = NFSD4_CB_UNKNOWN; |
7582 | + INIT_LIST_HEAD(&clp->cl_idhash); |
7583 | + INIT_LIST_HEAD(&clp->cl_openowners); |
7584 | + INIT_LIST_HEAD(&clp->cl_delegations); |
7585 | + INIT_LIST_HEAD(&clp->cl_lru); |
7586 | + INIT_LIST_HEAD(&clp->cl_callbacks); |
7587 | + INIT_LIST_HEAD(&clp->cl_revoked); |
7588 | + spin_lock_init(&clp->cl_lock); |
7589 | + rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); |
7590 | return clp; |
7591 | } |
7592 | |
7593 | @@ -1095,6 +1107,7 @@ free_client(struct nfs4_client *clp) |
7594 | WARN_ON_ONCE(atomic_read(&ses->se_ref)); |
7595 | free_session(ses); |
7596 | } |
7597 | + rpc_destroy_wait_queue(&clp->cl_cb_waitq); |
7598 | free_svc_cred(&clp->cl_cred); |
7599 | kfree(clp->cl_name.data); |
7600 | idr_destroy(&clp->cl_stateids); |
7601 | @@ -1347,7 +1360,6 @@ static struct nfs4_client *create_client(struct xdr_netobj name, |
7602 | if (clp == NULL) |
7603 | return NULL; |
7604 | |
7605 | - INIT_LIST_HEAD(&clp->cl_sessions); |
7606 | ret = copy_cred(&clp->cl_cred, &rqstp->rq_cred); |
7607 | if (ret) { |
7608 | spin_lock(&nn->client_lock); |
7609 | @@ -1355,20 +1367,9 @@ static struct nfs4_client *create_client(struct xdr_netobj name, |
7610 | spin_unlock(&nn->client_lock); |
7611 | return NULL; |
7612 | } |
7613 | - idr_init(&clp->cl_stateids); |
7614 | - atomic_set(&clp->cl_refcount, 0); |
7615 | - clp->cl_cb_state = NFSD4_CB_UNKNOWN; |
7616 | - INIT_LIST_HEAD(&clp->cl_idhash); |
7617 | - INIT_LIST_HEAD(&clp->cl_openowners); |
7618 | - INIT_LIST_HEAD(&clp->cl_delegations); |
7619 | - INIT_LIST_HEAD(&clp->cl_lru); |
7620 | - INIT_LIST_HEAD(&clp->cl_callbacks); |
7621 | - INIT_LIST_HEAD(&clp->cl_revoked); |
7622 | - spin_lock_init(&clp->cl_lock); |
7623 | nfsd4_init_callback(&clp->cl_cb_null); |
7624 | clp->cl_time = get_seconds(); |
7625 | clear_bit(0, &clp->cl_cb_slot_busy); |
7626 | - rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); |
7627 | copy_verf(clp, verf); |
7628 | rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa); |
7629 | gen_confirm(clp); |
7630 | @@ -3713,9 +3714,16 @@ out: |
7631 | static __be32 |
7632 | nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp) |
7633 | { |
7634 | - if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner))) |
7635 | + struct nfs4_lockowner *lo = lockowner(stp->st_stateowner); |
7636 | + |
7637 | + if (check_for_locks(stp->st_file, lo)) |
7638 | return nfserr_locks_held; |
7639 | - release_lock_stateid(stp); |
7640 | + /* |
7641 | + * Currently there's a 1-1 lock stateid<->lockowner |
7642 | + * correspondance, and we have to delete the lockowner when we |
7643 | + * delete the lock stateid: |
7644 | + */ |
7645 | + unhash_lockowner(lo); |
7646 | return nfs_ok; |
7647 | } |
7648 | |
7649 | @@ -4155,6 +4163,10 @@ static bool same_lockowner_ino(struct nfs4_lockowner *lo, struct inode *inode, c |
7650 | |
7651 | if (!same_owner_str(&lo->lo_owner, owner, clid)) |
7652 | return false; |
7653 | + if (list_empty(&lo->lo_owner.so_stateids)) { |
7654 | + WARN_ON_ONCE(1); |
7655 | + return false; |
7656 | + } |
7657 | lst = list_first_entry(&lo->lo_owner.so_stateids, |
7658 | struct nfs4_ol_stateid, st_perstateowner); |
7659 | return lst->st_file->fi_inode == inode; |
7660 | diff --git a/fs/posix_acl.c b/fs/posix_acl.c |
7661 | index 9e363e41dacc..0855f772cd41 100644 |
7662 | --- a/fs/posix_acl.c |
7663 | +++ b/fs/posix_acl.c |
7664 | @@ -246,6 +246,12 @@ posix_acl_equiv_mode(const struct posix_acl *acl, umode_t *mode_p) |
7665 | umode_t mode = 0; |
7666 | int not_equiv = 0; |
7667 | |
7668 | + /* |
7669 | + * A null ACL can always be presented as mode bits. |
7670 | + */ |
7671 | + if (!acl) |
7672 | + return 0; |
7673 | + |
7674 | FOREACH_ACL_ENTRY(pa, acl, pe) { |
7675 | switch (pa->e_tag) { |
7676 | case ACL_USER_OBJ: |
7677 | diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c |
7678 | index 810cf6e613e5..5fd2bf18e27d 100644 |
7679 | --- a/fs/sysfs/file.c |
7680 | +++ b/fs/sysfs/file.c |
7681 | @@ -47,12 +47,13 @@ static int sysfs_kf_seq_show(struct seq_file *sf, void *v) |
7682 | ssize_t count; |
7683 | char *buf; |
7684 | |
7685 | - /* acquire buffer and ensure that it's >= PAGE_SIZE */ |
7686 | + /* acquire buffer and ensure that it's >= PAGE_SIZE and clear */ |
7687 | count = seq_get_buf(sf, &buf); |
7688 | if (count < PAGE_SIZE) { |
7689 | seq_commit(sf, -1); |
7690 | return 0; |
7691 | } |
7692 | + memset(buf, 0, PAGE_SIZE); |
7693 | |
7694 | /* |
7695 | * Invoke show(). Control may reach here via seq file lseek even |
7696 | diff --git a/include/linux/dmaengine.h b/include/linux/dmaengine.h |
7697 | index c5c92d59e531..0a5f55272672 100644 |
7698 | --- a/include/linux/dmaengine.h |
7699 | +++ b/include/linux/dmaengine.h |
7700 | @@ -433,6 +433,7 @@ typedef bool (*dma_filter_fn)(struct dma_chan *chan, void *filter_param); |
7701 | typedef void (*dma_async_tx_callback)(void *dma_async_param); |
7702 | |
7703 | struct dmaengine_unmap_data { |
7704 | + u8 map_cnt; |
7705 | u8 to_cnt; |
7706 | u8 from_cnt; |
7707 | u8 bidi_cnt; |
7708 | diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h |
7709 | index f4233b195dab..2068dff8a2cc 100644 |
7710 | --- a/include/linux/ftrace.h |
7711 | +++ b/include/linux/ftrace.h |
7712 | @@ -524,6 +524,7 @@ static inline int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_a |
7713 | extern int ftrace_arch_read_dyn_info(char *buf, int size); |
7714 | |
7715 | extern int skip_trace(unsigned long ip); |
7716 | +extern void ftrace_module_init(struct module *mod); |
7717 | |
7718 | extern void ftrace_disable_daemon(void); |
7719 | extern void ftrace_enable_daemon(void); |
7720 | @@ -533,6 +534,7 @@ static inline int ftrace_force_update(void) { return 0; } |
7721 | static inline void ftrace_disable_daemon(void) { } |
7722 | static inline void ftrace_enable_daemon(void) { } |
7723 | static inline void ftrace_release_mod(struct module *mod) {} |
7724 | +static inline void ftrace_module_init(struct module *mod) {} |
7725 | static inline __init int register_ftrace_command(struct ftrace_func_command *cmd) |
7726 | { |
7727 | return -EINVAL; |
7728 | diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h |
7729 | index a2678d35b5a2..203c43d3e1b8 100644 |
7730 | --- a/include/linux/interrupt.h |
7731 | +++ b/include/linux/interrupt.h |
7732 | @@ -202,7 +202,40 @@ static inline int check_wakeup_irqs(void) { return 0; } |
7733 | |
7734 | extern cpumask_var_t irq_default_affinity; |
7735 | |
7736 | -extern int irq_set_affinity(unsigned int irq, const struct cpumask *cpumask); |
7737 | +/* Internal implementation. Use the helpers below */ |
7738 | +extern int __irq_set_affinity(unsigned int irq, const struct cpumask *cpumask, |
7739 | + bool force); |
7740 | + |
7741 | +/** |
7742 | + * irq_set_affinity - Set the irq affinity of a given irq |
7743 | + * @irq: Interrupt to set affinity |
7744 | + * @mask: cpumask |
7745 | + * |
7746 | + * Fails if cpumask does not contain an online CPU |
7747 | + */ |
7748 | +static inline int |
7749 | +irq_set_affinity(unsigned int irq, const struct cpumask *cpumask) |
7750 | +{ |
7751 | + return __irq_set_affinity(irq, cpumask, false); |
7752 | +} |
7753 | + |
7754 | +/** |
7755 | + * irq_force_affinity - Force the irq affinity of a given irq |
7756 | + * @irq: Interrupt to set affinity |
7757 | + * @mask: cpumask |
7758 | + * |
7759 | + * Same as irq_set_affinity, but without checking the mask against |
7760 | + * online cpus. |
7761 | + * |
7762 | + * Solely for low level cpu hotplug code, where we need to make per |
7763 | + * cpu interrupts affine before the cpu becomes online. |
7764 | + */ |
7765 | +static inline int |
7766 | +irq_force_affinity(unsigned int irq, const struct cpumask *cpumask) |
7767 | +{ |
7768 | + return __irq_set_affinity(irq, cpumask, true); |
7769 | +} |
7770 | + |
7771 | extern int irq_can_set_affinity(unsigned int irq); |
7772 | extern int irq_select_affinity(unsigned int irq); |
7773 | |
7774 | @@ -238,6 +271,11 @@ static inline int irq_set_affinity(unsigned int irq, const struct cpumask *m) |
7775 | return -EINVAL; |
7776 | } |
7777 | |
7778 | +static inline int irq_force_affinity(unsigned int irq, const struct cpumask *cpumask) |
7779 | +{ |
7780 | + return 0; |
7781 | +} |
7782 | + |
7783 | static inline int irq_can_set_affinity(unsigned int irq) |
7784 | { |
7785 | return 0; |
7786 | diff --git a/include/linux/irq.h b/include/linux/irq.h |
7787 | index 7dc10036eff5..ef1ac9feff56 100644 |
7788 | --- a/include/linux/irq.h |
7789 | +++ b/include/linux/irq.h |
7790 | @@ -385,7 +385,8 @@ extern void remove_percpu_irq(unsigned int irq, struct irqaction *act); |
7791 | |
7792 | extern void irq_cpu_online(void); |
7793 | extern void irq_cpu_offline(void); |
7794 | -extern int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *cpumask); |
7795 | +extern int irq_set_affinity_locked(struct irq_data *data, |
7796 | + const struct cpumask *cpumask, bool force); |
7797 | |
7798 | #if defined(CONFIG_SMP) && defined(CONFIG_GENERIC_PENDING_IRQ) |
7799 | void irq_move_irq(struct irq_data *data); |
7800 | diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h |
7801 | index 3f23b4472c31..6404253d810d 100644 |
7802 | --- a/include/linux/of_irq.h |
7803 | +++ b/include/linux/of_irq.h |
7804 | @@ -44,11 +44,16 @@ extern void of_irq_init(const struct of_device_id *matches); |
7805 | |
7806 | #ifdef CONFIG_OF_IRQ |
7807 | extern int of_irq_count(struct device_node *dev); |
7808 | +extern int of_irq_get(struct device_node *dev, int index); |
7809 | #else |
7810 | static inline int of_irq_count(struct device_node *dev) |
7811 | { |
7812 | return 0; |
7813 | } |
7814 | +static inline int of_irq_get(struct device_node *dev, int index) |
7815 | +{ |
7816 | + return 0; |
7817 | +} |
7818 | #endif |
7819 | |
7820 | #if defined(CONFIG_OF) |
7821 | diff --git a/include/linux/serio.h b/include/linux/serio.h |
7822 | index 36aac733840a..9f779c7a2da4 100644 |
7823 | --- a/include/linux/serio.h |
7824 | +++ b/include/linux/serio.h |
7825 | @@ -23,6 +23,7 @@ struct serio { |
7826 | |
7827 | char name[32]; |
7828 | char phys[32]; |
7829 | + char firmware_id[128]; |
7830 | |
7831 | bool manual_bind; |
7832 | |
7833 | diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h |
7834 | index b1f84b05c67e..37123eb1f093 100644 |
7835 | --- a/include/net/cfg80211.h |
7836 | +++ b/include/net/cfg80211.h |
7837 | @@ -3637,6 +3637,18 @@ void cfg80211_sched_scan_results(struct wiphy *wiphy); |
7838 | void cfg80211_sched_scan_stopped(struct wiphy *wiphy); |
7839 | |
7840 | /** |
7841 | + * cfg80211_sched_scan_stopped_rtnl - notify that the scheduled scan has stopped |
7842 | + * |
7843 | + * @wiphy: the wiphy on which the scheduled scan stopped |
7844 | + * |
7845 | + * The driver can call this function to inform cfg80211 that the |
7846 | + * scheduled scan had to be stopped, for whatever reason. The driver |
7847 | + * is then called back via the sched_scan_stop operation when done. |
7848 | + * This function should be called with rtnl locked. |
7849 | + */ |
7850 | +void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy); |
7851 | + |
7852 | +/** |
7853 | * cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame |
7854 | * |
7855 | * @wiphy: the wiphy reporting the BSS |
7856 | diff --git a/include/trace/events/module.h b/include/trace/events/module.h |
7857 | index 161932737416..ca298c7157ae 100644 |
7858 | --- a/include/trace/events/module.h |
7859 | +++ b/include/trace/events/module.h |
7860 | @@ -78,7 +78,7 @@ DECLARE_EVENT_CLASS(module_refcnt, |
7861 | |
7862 | TP_fast_assign( |
7863 | __entry->ip = ip; |
7864 | - __entry->refcnt = __this_cpu_read(mod->refptr->incs) + __this_cpu_read(mod->refptr->decs); |
7865 | + __entry->refcnt = __this_cpu_read(mod->refptr->incs) - __this_cpu_read(mod->refptr->decs); |
7866 | __assign_str(name, mod->name); |
7867 | ), |
7868 | |
7869 | diff --git a/include/uapi/drm/tegra_drm.h b/include/uapi/drm/tegra_drm.h |
7870 | index 5e1ab552cbed..c28de1afd684 100644 |
7871 | --- a/include/uapi/drm/tegra_drm.h |
7872 | +++ b/include/uapi/drm/tegra_drm.h |
7873 | @@ -114,7 +114,6 @@ struct drm_tegra_submit { |
7874 | __u32 num_waitchks; |
7875 | __u32 waitchk_mask; |
7876 | __u32 timeout; |
7877 | - __u32 pad; |
7878 | __u64 syncpts; |
7879 | __u64 cmdbufs; |
7880 | __u64 relocs; |
7881 | diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h |
7882 | index bd24470d24a2..f4849525519c 100644 |
7883 | --- a/include/uapi/linux/input.h |
7884 | +++ b/include/uapi/linux/input.h |
7885 | @@ -164,6 +164,7 @@ struct input_keymap_entry { |
7886 | #define INPUT_PROP_DIRECT 0x01 /* direct input devices */ |
7887 | #define INPUT_PROP_BUTTONPAD 0x02 /* has button(s) under pad */ |
7888 | #define INPUT_PROP_SEMI_MT 0x03 /* touch rectangle only */ |
7889 | +#define INPUT_PROP_TOPBUTTONPAD 0x04 /* softbuttons at top of pad */ |
7890 | |
7891 | #define INPUT_PROP_MAX 0x1f |
7892 | #define INPUT_PROP_CNT (INPUT_PROP_MAX + 1) |
7893 | diff --git a/kernel/futex.c b/kernel/futex.c |
7894 | index 6801b3751a95..e3087afb7429 100644 |
7895 | --- a/kernel/futex.c |
7896 | +++ b/kernel/futex.c |
7897 | @@ -729,6 +729,55 @@ void exit_pi_state_list(struct task_struct *curr) |
7898 | raw_spin_unlock_irq(&curr->pi_lock); |
7899 | } |
7900 | |
7901 | +/* |
7902 | + * We need to check the following states: |
7903 | + * |
7904 | + * Waiter | pi_state | pi->owner | uTID | uODIED | ? |
7905 | + * |
7906 | + * [1] NULL | --- | --- | 0 | 0/1 | Valid |
7907 | + * [2] NULL | --- | --- | >0 | 0/1 | Valid |
7908 | + * |
7909 | + * [3] Found | NULL | -- | Any | 0/1 | Invalid |
7910 | + * |
7911 | + * [4] Found | Found | NULL | 0 | 1 | Valid |
7912 | + * [5] Found | Found | NULL | >0 | 1 | Invalid |
7913 | + * |
7914 | + * [6] Found | Found | task | 0 | 1 | Valid |
7915 | + * |
7916 | + * [7] Found | Found | NULL | Any | 0 | Invalid |
7917 | + * |
7918 | + * [8] Found | Found | task | ==taskTID | 0/1 | Valid |
7919 | + * [9] Found | Found | task | 0 | 0 | Invalid |
7920 | + * [10] Found | Found | task | !=taskTID | 0/1 | Invalid |
7921 | + * |
7922 | + * [1] Indicates that the kernel can acquire the futex atomically. We |
7923 | + * came came here due to a stale FUTEX_WAITERS/FUTEX_OWNER_DIED bit. |
7924 | + * |
7925 | + * [2] Valid, if TID does not belong to a kernel thread. If no matching |
7926 | + * thread is found then it indicates that the owner TID has died. |
7927 | + * |
7928 | + * [3] Invalid. The waiter is queued on a non PI futex |
7929 | + * |
7930 | + * [4] Valid state after exit_robust_list(), which sets the user space |
7931 | + * value to FUTEX_WAITERS | FUTEX_OWNER_DIED. |
7932 | + * |
7933 | + * [5] The user space value got manipulated between exit_robust_list() |
7934 | + * and exit_pi_state_list() |
7935 | + * |
7936 | + * [6] Valid state after exit_pi_state_list() which sets the new owner in |
7937 | + * the pi_state but cannot access the user space value. |
7938 | + * |
7939 | + * [7] pi_state->owner can only be NULL when the OWNER_DIED bit is set. |
7940 | + * |
7941 | + * [8] Owner and user space value match |
7942 | + * |
7943 | + * [9] There is no transient state which sets the user space TID to 0 |
7944 | + * except exit_robust_list(), but this is indicated by the |
7945 | + * FUTEX_OWNER_DIED bit. See [4] |
7946 | + * |
7947 | + * [10] There is no transient state which leaves owner and user space |
7948 | + * TID out of sync. |
7949 | + */ |
7950 | static int |
7951 | lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, |
7952 | union futex_key *key, struct futex_pi_state **ps) |
7953 | @@ -741,12 +790,13 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, |
7954 | plist_for_each_entry_safe(this, next, &hb->chain, list) { |
7955 | if (match_futex(&this->key, key)) { |
7956 | /* |
7957 | - * Another waiter already exists - bump up |
7958 | - * the refcount and return its pi_state: |
7959 | + * Sanity check the waiter before increasing |
7960 | + * the refcount and attaching to it. |
7961 | */ |
7962 | pi_state = this->pi_state; |
7963 | /* |
7964 | - * Userspace might have messed up non-PI and PI futexes |
7965 | + * Userspace might have messed up non-PI and |
7966 | + * PI futexes [3] |
7967 | */ |
7968 | if (unlikely(!pi_state)) |
7969 | return -EINVAL; |
7970 | @@ -754,34 +804,70 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, |
7971 | WARN_ON(!atomic_read(&pi_state->refcount)); |
7972 | |
7973 | /* |
7974 | - * When pi_state->owner is NULL then the owner died |
7975 | - * and another waiter is on the fly. pi_state->owner |
7976 | - * is fixed up by the task which acquires |
7977 | - * pi_state->rt_mutex. |
7978 | - * |
7979 | - * We do not check for pid == 0 which can happen when |
7980 | - * the owner died and robust_list_exit() cleared the |
7981 | - * TID. |
7982 | + * Handle the owner died case: |
7983 | */ |
7984 | - if (pid && pi_state->owner) { |
7985 | + if (uval & FUTEX_OWNER_DIED) { |
7986 | + /* |
7987 | + * exit_pi_state_list sets owner to NULL and |
7988 | + * wakes the topmost waiter. The task which |
7989 | + * acquires the pi_state->rt_mutex will fixup |
7990 | + * owner. |
7991 | + */ |
7992 | + if (!pi_state->owner) { |
7993 | + /* |
7994 | + * No pi state owner, but the user |
7995 | + * space TID is not 0. Inconsistent |
7996 | + * state. [5] |
7997 | + */ |
7998 | + if (pid) |
7999 | + return -EINVAL; |
8000 | + /* |
8001 | + * Take a ref on the state and |
8002 | + * return. [4] |
8003 | + */ |
8004 | + goto out_state; |
8005 | + } |
8006 | + |
8007 | /* |
8008 | - * Bail out if user space manipulated the |
8009 | - * futex value. |
8010 | + * If TID is 0, then either the dying owner |
8011 | + * has not yet executed exit_pi_state_list() |
8012 | + * or some waiter acquired the rtmutex in the |
8013 | + * pi state, but did not yet fixup the TID in |
8014 | + * user space. |
8015 | + * |
8016 | + * Take a ref on the state and return. [6] |
8017 | */ |
8018 | - if (pid != task_pid_vnr(pi_state->owner)) |
8019 | + if (!pid) |
8020 | + goto out_state; |
8021 | + } else { |
8022 | + /* |
8023 | + * If the owner died bit is not set, |
8024 | + * then the pi_state must have an |
8025 | + * owner. [7] |
8026 | + */ |
8027 | + if (!pi_state->owner) |
8028 | return -EINVAL; |
8029 | } |
8030 | |
8031 | + /* |
8032 | + * Bail out if user space manipulated the |
8033 | + * futex value. If pi state exists then the |
8034 | + * owner TID must be the same as the user |
8035 | + * space TID. [9/10] |
8036 | + */ |
8037 | + if (pid != task_pid_vnr(pi_state->owner)) |
8038 | + return -EINVAL; |
8039 | + |
8040 | + out_state: |
8041 | atomic_inc(&pi_state->refcount); |
8042 | *ps = pi_state; |
8043 | - |
8044 | return 0; |
8045 | } |
8046 | } |
8047 | |
8048 | /* |
8049 | * We are the first waiter - try to look up the real owner and attach |
8050 | - * the new pi_state to it, but bail out when TID = 0 |
8051 | + * the new pi_state to it, but bail out when TID = 0 [1] |
8052 | */ |
8053 | if (!pid) |
8054 | return -ESRCH; |
8055 | @@ -789,6 +875,11 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, |
8056 | if (!p) |
8057 | return -ESRCH; |
8058 | |
8059 | + if (!p->mm) { |
8060 | + put_task_struct(p); |
8061 | + return -EPERM; |
8062 | + } |
8063 | + |
8064 | /* |
8065 | * We need to look at the task state flags to figure out, |
8066 | * whether the task is exiting. To protect against the do_exit |
8067 | @@ -809,6 +900,9 @@ lookup_pi_state(u32 uval, struct futex_hash_bucket *hb, |
8068 | return ret; |
8069 | } |
8070 | |
8071 | + /* |
8072 | + * No existing pi state. First waiter. [2] |
8073 | + */ |
8074 | pi_state = alloc_pi_state(); |
8075 | |
8076 | /* |
8077 | @@ -880,10 +974,18 @@ retry: |
8078 | return -EDEADLK; |
8079 | |
8080 | /* |
8081 | - * Surprise - we got the lock. Just return to userspace: |
8082 | + * Surprise - we got the lock, but we do not trust user space at all. |
8083 | */ |
8084 | - if (unlikely(!curval)) |
8085 | - return 1; |
8086 | + if (unlikely(!curval)) { |
8087 | + /* |
8088 | + * We verify whether there is kernel state for this |
8089 | + * futex. If not, we can safely assume, that the 0 -> |
8090 | + * TID transition is correct. If state exists, we do |
8091 | + * not bother to fixup the user space state as it was |
8092 | + * corrupted already. |
8093 | + */ |
8094 | + return futex_top_waiter(hb, key) ? -EINVAL : 1; |
8095 | + } |
8096 | |
8097 | uval = curval; |
8098 | |
8099 | @@ -1014,6 +1116,7 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) |
8100 | struct task_struct *new_owner; |
8101 | struct futex_pi_state *pi_state = this->pi_state; |
8102 | u32 uninitialized_var(curval), newval; |
8103 | + int ret = 0; |
8104 | |
8105 | if (!pi_state) |
8106 | return -EINVAL; |
8107 | @@ -1037,23 +1140,19 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, struct futex_q *this) |
8108 | new_owner = this->task; |
8109 | |
8110 | /* |
8111 | - * We pass it to the next owner. (The WAITERS bit is always |
8112 | - * kept enabled while there is PI state around. We must also |
8113 | - * preserve the owner died bit.) |
8114 | + * We pass it to the next owner. The WAITERS bit is always |
8115 | + * kept enabled while there is PI state around. We cleanup the |
8116 | + * owner died bit, because we are the owner. |
8117 | */ |
8118 | - if (!(uval & FUTEX_OWNER_DIED)) { |
8119 | - int ret = 0; |
8120 | + newval = FUTEX_WAITERS | task_pid_vnr(new_owner); |
8121 | |
8122 | - newval = FUTEX_WAITERS | task_pid_vnr(new_owner); |
8123 | - |
8124 | - if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) |
8125 | - ret = -EFAULT; |
8126 | - else if (curval != uval) |
8127 | - ret = -EINVAL; |
8128 | - if (ret) { |
8129 | - raw_spin_unlock(&pi_state->pi_mutex.wait_lock); |
8130 | - return ret; |
8131 | - } |
8132 | + if (cmpxchg_futex_value_locked(&curval, uaddr, uval, newval)) |
8133 | + ret = -EFAULT; |
8134 | + else if (curval != uval) |
8135 | + ret = -EINVAL; |
8136 | + if (ret) { |
8137 | + raw_spin_unlock(&pi_state->pi_mutex.wait_lock); |
8138 | + return ret; |
8139 | } |
8140 | |
8141 | raw_spin_lock_irq(&pi_state->owner->pi_lock); |
8142 | @@ -1333,7 +1432,7 @@ void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, |
8143 | * |
8144 | * Return: |
8145 | * 0 - failed to acquire the lock atomically; |
8146 | - * 1 - acquired the lock; |
8147 | + * >0 - acquired the lock, return value is vpid of the top_waiter |
8148 | * <0 - error |
8149 | */ |
8150 | static int futex_proxy_trylock_atomic(u32 __user *pifutex, |
8151 | @@ -1344,7 +1443,7 @@ static int futex_proxy_trylock_atomic(u32 __user *pifutex, |
8152 | { |
8153 | struct futex_q *top_waiter = NULL; |
8154 | u32 curval; |
8155 | - int ret; |
8156 | + int ret, vpid; |
8157 | |
8158 | if (get_futex_value_locked(&curval, pifutex)) |
8159 | return -EFAULT; |
8160 | @@ -1372,11 +1471,13 @@ static int futex_proxy_trylock_atomic(u32 __user *pifutex, |
8161 | * the contended case or if set_waiters is 1. The pi_state is returned |
8162 | * in ps in contended cases. |
8163 | */ |
8164 | + vpid = task_pid_vnr(top_waiter->task); |
8165 | ret = futex_lock_pi_atomic(pifutex, hb2, key2, ps, top_waiter->task, |
8166 | set_waiters); |
8167 | - if (ret == 1) |
8168 | + if (ret == 1) { |
8169 | requeue_pi_wake_futex(top_waiter, key2, hb2); |
8170 | - |
8171 | + return vpid; |
8172 | + } |
8173 | return ret; |
8174 | } |
8175 | |
8176 | @@ -1407,10 +1508,16 @@ static int futex_requeue(u32 __user *uaddr1, unsigned int flags, |
8177 | struct futex_pi_state *pi_state = NULL; |
8178 | struct futex_hash_bucket *hb1, *hb2; |
8179 | struct futex_q *this, *next; |
8180 | - u32 curval2; |
8181 | |
8182 | if (requeue_pi) { |
8183 | /* |
8184 | + * Requeue PI only works on two distinct uaddrs. This |
8185 | + * check is only valid for private futexes. See below. |
8186 | + */ |
8187 | + if (uaddr1 == uaddr2) |
8188 | + return -EINVAL; |
8189 | + |
8190 | + /* |
8191 | * requeue_pi requires a pi_state, try to allocate it now |
8192 | * without any locks in case it fails. |
8193 | */ |
8194 | @@ -1448,6 +1555,15 @@ retry: |
8195 | if (unlikely(ret != 0)) |
8196 | goto out_put_key1; |
8197 | |
8198 | + /* |
8199 | + * The check above which compares uaddrs is not sufficient for |
8200 | + * shared futexes. We need to compare the keys: |
8201 | + */ |
8202 | + if (requeue_pi && match_futex(&key1, &key2)) { |
8203 | + ret = -EINVAL; |
8204 | + goto out_put_keys; |
8205 | + } |
8206 | + |
8207 | hb1 = hash_futex(&key1); |
8208 | hb2 = hash_futex(&key2); |
8209 | |
8210 | @@ -1495,16 +1611,25 @@ retry_private: |
8211 | * At this point the top_waiter has either taken uaddr2 or is |
8212 | * waiting on it. If the former, then the pi_state will not |
8213 | * exist yet, look it up one more time to ensure we have a |
8214 | - * reference to it. |
8215 | + * reference to it. If the lock was taken, ret contains the |
8216 | + * vpid of the top waiter task. |
8217 | */ |
8218 | - if (ret == 1) { |
8219 | + if (ret > 0) { |
8220 | WARN_ON(pi_state); |
8221 | drop_count++; |
8222 | task_count++; |
8223 | - ret = get_futex_value_locked(&curval2, uaddr2); |
8224 | - if (!ret) |
8225 | - ret = lookup_pi_state(curval2, hb2, &key2, |
8226 | - &pi_state); |
8227 | + /* |
8228 | + * If we acquired the lock, then the user |
8229 | + * space value of uaddr2 should be vpid. It |
8230 | + * cannot be changed by the top waiter as it |
8231 | + * is blocked on hb2 lock if it tries to do |
8232 | + * so. If something fiddled with it behind our |
8233 | + * back the pi state lookup might unearth |
8234 | + * it. So we rather use the known value than |
8235 | + * rereading and handing potential crap to |
8236 | + * lookup_pi_state. |
8237 | + */ |
8238 | + ret = lookup_pi_state(ret, hb2, &key2, &pi_state); |
8239 | } |
8240 | |
8241 | switch (ret) { |
8242 | @@ -2287,9 +2412,10 @@ retry: |
8243 | /* |
8244 | * To avoid races, try to do the TID -> 0 atomic transition |
8245 | * again. If it succeeds then we can return without waking |
8246 | - * anyone else up: |
8247 | + * anyone else up. We only try this if neither the waiters nor |
8248 | + * the owner died bit are set. |
8249 | */ |
8250 | - if (!(uval & FUTEX_OWNER_DIED) && |
8251 | + if (!(uval & ~FUTEX_TID_MASK) && |
8252 | cmpxchg_futex_value_locked(&uval, uaddr, vpid, 0)) |
8253 | goto pi_faulted; |
8254 | /* |
8255 | @@ -2319,11 +2445,9 @@ retry: |
8256 | /* |
8257 | * No waiters - kernel unlocks the futex: |
8258 | */ |
8259 | - if (!(uval & FUTEX_OWNER_DIED)) { |
8260 | - ret = unlock_futex_pi(uaddr, uval); |
8261 | - if (ret == -EFAULT) |
8262 | - goto pi_faulted; |
8263 | - } |
8264 | + ret = unlock_futex_pi(uaddr, uval); |
8265 | + if (ret == -EFAULT) |
8266 | + goto pi_faulted; |
8267 | |
8268 | out_unlock: |
8269 | spin_unlock(&hb->lock); |
8270 | @@ -2485,6 +2609,15 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, unsigned int flags, |
8271 | if (ret) |
8272 | goto out_key2; |
8273 | |
8274 | + /* |
8275 | + * The check above which compares uaddrs is not sufficient for |
8276 | + * shared futexes. We need to compare the keys: |
8277 | + */ |
8278 | + if (match_futex(&q.key, &key2)) { |
8279 | + ret = -EINVAL; |
8280 | + goto out_put_keys; |
8281 | + } |
8282 | + |
8283 | /* Queue the futex_q, drop the hb lock, wait for wakeup. */ |
8284 | futex_wait_queue_me(hb, &q, to); |
8285 | |
8286 | diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c |
8287 | index 09094361dce5..04d03745fb98 100644 |
8288 | --- a/kernel/hrtimer.c |
8289 | +++ b/kernel/hrtimer.c |
8290 | @@ -247,6 +247,11 @@ again: |
8291 | goto again; |
8292 | } |
8293 | timer->base = new_base; |
8294 | + } else { |
8295 | + if (cpu != this_cpu && hrtimer_check_target(timer, new_base)) { |
8296 | + cpu = this_cpu; |
8297 | + goto again; |
8298 | + } |
8299 | } |
8300 | return new_base; |
8301 | } |
8302 | @@ -582,6 +587,23 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal) |
8303 | |
8304 | cpu_base->expires_next.tv64 = expires_next.tv64; |
8305 | |
8306 | + /* |
8307 | + * If a hang was detected in the last timer interrupt then we |
8308 | + * leave the hang delay active in the hardware. We want the |
8309 | + * system to make progress. That also prevents the following |
8310 | + * scenario: |
8311 | + * T1 expires 50ms from now |
8312 | + * T2 expires 5s from now |
8313 | + * |
8314 | + * T1 is removed, so this code is called and would reprogram |
8315 | + * the hardware to 5s from now. Any hrtimer_start after that |
8316 | + * will not reprogram the hardware due to hang_detected being |
8317 | + * set. So we'd effectivly block all timers until the T2 event |
8318 | + * fires. |
8319 | + */ |
8320 | + if (cpu_base->hang_detected) |
8321 | + return; |
8322 | + |
8323 | if (cpu_base->expires_next.tv64 != KTIME_MAX) |
8324 | tick_program_event(cpu_base->expires_next, 1); |
8325 | } |
8326 | @@ -981,11 +1003,8 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, |
8327 | /* Remove an active timer from the queue: */ |
8328 | ret = remove_hrtimer(timer, base); |
8329 | |
8330 | - /* Switch the timer base, if necessary: */ |
8331 | - new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED); |
8332 | - |
8333 | if (mode & HRTIMER_MODE_REL) { |
8334 | - tim = ktime_add_safe(tim, new_base->get_time()); |
8335 | + tim = ktime_add_safe(tim, base->get_time()); |
8336 | /* |
8337 | * CONFIG_TIME_LOW_RES is a temporary way for architectures |
8338 | * to signal that they simply return xtime in |
8339 | @@ -1000,6 +1019,9 @@ int __hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim, |
8340 | |
8341 | hrtimer_set_expires_range_ns(timer, tim, delta_ns); |
8342 | |
8343 | + /* Switch the timer base, if necessary: */ |
8344 | + new_base = switch_hrtimer_base(timer, base, mode & HRTIMER_MODE_PINNED); |
8345 | + |
8346 | timer_stats_hrtimer_set_start_info(timer); |
8347 | |
8348 | leftmost = enqueue_hrtimer(timer, new_base); |
8349 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
8350 | index d3bf660cb57f..66a1b46d5677 100644 |
8351 | --- a/kernel/irq/manage.c |
8352 | +++ b/kernel/irq/manage.c |
8353 | @@ -150,7 +150,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, |
8354 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
8355 | int ret; |
8356 | |
8357 | - ret = chip->irq_set_affinity(data, mask, false); |
8358 | + ret = chip->irq_set_affinity(data, mask, force); |
8359 | switch (ret) { |
8360 | case IRQ_SET_MASK_OK: |
8361 | cpumask_copy(data->affinity, mask); |
8362 | @@ -162,7 +162,8 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask, |
8363 | return ret; |
8364 | } |
8365 | |
8366 | -int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) |
8367 | +int irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask, |
8368 | + bool force) |
8369 | { |
8370 | struct irq_chip *chip = irq_data_get_irq_chip(data); |
8371 | struct irq_desc *desc = irq_data_to_desc(data); |
8372 | @@ -172,7 +173,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) |
8373 | return -EINVAL; |
8374 | |
8375 | if (irq_can_move_pcntxt(data)) { |
8376 | - ret = irq_do_set_affinity(data, mask, false); |
8377 | + ret = irq_do_set_affinity(data, mask, force); |
8378 | } else { |
8379 | irqd_set_move_pending(data); |
8380 | irq_copy_pending(desc, mask); |
8381 | @@ -187,13 +188,7 @@ int __irq_set_affinity_locked(struct irq_data *data, const struct cpumask *mask) |
8382 | return ret; |
8383 | } |
8384 | |
8385 | -/** |
8386 | - * irq_set_affinity - Set the irq affinity of a given irq |
8387 | - * @irq: Interrupt to set affinity |
8388 | - * @mask: cpumask |
8389 | - * |
8390 | - */ |
8391 | -int irq_set_affinity(unsigned int irq, const struct cpumask *mask) |
8392 | +int __irq_set_affinity(unsigned int irq, const struct cpumask *mask, bool force) |
8393 | { |
8394 | struct irq_desc *desc = irq_to_desc(irq); |
8395 | unsigned long flags; |
8396 | @@ -203,7 +198,7 @@ int irq_set_affinity(unsigned int irq, const struct cpumask *mask) |
8397 | return -EINVAL; |
8398 | |
8399 | raw_spin_lock_irqsave(&desc->lock, flags); |
8400 | - ret = __irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask); |
8401 | + ret = irq_set_affinity_locked(irq_desc_get_irq_data(desc), mask, force); |
8402 | raw_spin_unlock_irqrestore(&desc->lock, flags); |
8403 | return ret; |
8404 | } |
8405 | diff --git a/kernel/kexec.c b/kernel/kexec.c |
8406 | index 60bafbed06ab..18ff0b91d6d2 100644 |
8407 | --- a/kernel/kexec.c |
8408 | +++ b/kernel/kexec.c |
8409 | @@ -1682,6 +1682,14 @@ int kernel_kexec(void) |
8410 | kexec_in_progress = true; |
8411 | kernel_restart_prepare(NULL); |
8412 | migrate_to_reboot_cpu(); |
8413 | + |
8414 | + /* |
8415 | + * migrate_to_reboot_cpu() disables CPU hotplug assuming that |
8416 | + * no further code needs to use CPU hotplug (which is true in |
8417 | + * the reboot case). However, the kexec path depends on using |
8418 | + * CPU hotplug again; so re-enable it here. |
8419 | + */ |
8420 | + cpu_hotplug_enable(); |
8421 | printk(KERN_EMERG "Starting new kernel\n"); |
8422 | machine_shutdown(); |
8423 | } |
8424 | diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c |
8425 | index 2e960a2bab81..0339f515531a 100644 |
8426 | --- a/kernel/locking/rtmutex.c |
8427 | +++ b/kernel/locking/rtmutex.c |
8428 | @@ -331,9 +331,16 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, |
8429 | * top_waiter can be NULL, when we are in the deboosting |
8430 | * mode! |
8431 | */ |
8432 | - if (top_waiter && (!task_has_pi_waiters(task) || |
8433 | - top_waiter != task_top_pi_waiter(task))) |
8434 | - goto out_unlock_pi; |
8435 | + if (top_waiter) { |
8436 | + if (!task_has_pi_waiters(task)) |
8437 | + goto out_unlock_pi; |
8438 | + /* |
8439 | + * If deadlock detection is off, we stop here if we |
8440 | + * are not the top pi waiter of the task. |
8441 | + */ |
8442 | + if (!detect_deadlock && top_waiter != task_top_pi_waiter(task)) |
8443 | + goto out_unlock_pi; |
8444 | + } |
8445 | |
8446 | /* |
8447 | * When deadlock detection is off then we check, if further |
8448 | @@ -349,7 +356,12 @@ static int rt_mutex_adjust_prio_chain(struct task_struct *task, |
8449 | goto retry; |
8450 | } |
8451 | |
8452 | - /* Deadlock detection */ |
8453 | + /* |
8454 | + * Deadlock detection. If the lock is the same as the original |
8455 | + * lock which caused us to walk the lock chain or if the |
8456 | + * current lock is owned by the task which initiated the chain |
8457 | + * walk, we detected a deadlock. |
8458 | + */ |
8459 | if (lock == orig_lock || rt_mutex_owner(lock) == top_task) { |
8460 | debug_rt_mutex_deadlock(deadlock_detect, orig_waiter, lock); |
8461 | raw_spin_unlock(&lock->wait_lock); |
8462 | @@ -515,6 +527,18 @@ static int task_blocks_on_rt_mutex(struct rt_mutex *lock, |
8463 | unsigned long flags; |
8464 | int chain_walk = 0, res; |
8465 | |
8466 | + /* |
8467 | + * Early deadlock detection. We really don't want the task to |
8468 | + * enqueue on itself just to untangle the mess later. It's not |
8469 | + * only an optimization. We drop the locks, so another waiter |
8470 | + * can come in before the chain walk detects the deadlock. So |
8471 | + * the other will detect the deadlock and return -EDEADLOCK, |
8472 | + * which is wrong, as the other waiter is not in a deadlock |
8473 | + * situation. |
8474 | + */ |
8475 | + if (detect_deadlock && owner == task) |
8476 | + return -EDEADLK; |
8477 | + |
8478 | raw_spin_lock_irqsave(&task->pi_lock, flags); |
8479 | __rt_mutex_adjust_prio(task); |
8480 | waiter->task = task; |
8481 | diff --git a/kernel/module.c b/kernel/module.c |
8482 | index d24fcf29cb64..6716a1fa618b 100644 |
8483 | --- a/kernel/module.c |
8484 | +++ b/kernel/module.c |
8485 | @@ -815,9 +815,6 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user, |
8486 | return -EFAULT; |
8487 | name[MODULE_NAME_LEN-1] = '\0'; |
8488 | |
8489 | - if (!(flags & O_NONBLOCK)) |
8490 | - pr_warn("waiting module removal not supported: please upgrade\n"); |
8491 | - |
8492 | if (mutex_lock_interruptible(&module_mutex) != 0) |
8493 | return -EINTR; |
8494 | |
8495 | @@ -3265,6 +3262,9 @@ static int load_module(struct load_info *info, const char __user *uargs, |
8496 | |
8497 | dynamic_debug_setup(info->debug, info->num_debug); |
8498 | |
8499 | + /* Ftrace init must be called in the MODULE_STATE_UNFORMED state */ |
8500 | + ftrace_module_init(mod); |
8501 | + |
8502 | /* Finally it's fully formed, ready to start executing. */ |
8503 | err = complete_formation(mod, info); |
8504 | if (err) |
8505 | diff --git a/kernel/timer.c b/kernel/timer.c |
8506 | index accfd241b9e5..38f0d40fca13 100644 |
8507 | --- a/kernel/timer.c |
8508 | +++ b/kernel/timer.c |
8509 | @@ -822,7 +822,7 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) |
8510 | |
8511 | bit = find_last_bit(&mask, BITS_PER_LONG); |
8512 | |
8513 | - mask = (1 << bit) - 1; |
8514 | + mask = (1UL << bit) - 1; |
8515 | |
8516 | expires_limit = expires_limit & ~(mask); |
8517 | |
8518 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
8519 | index cd7f76d1eb86..868633e61b43 100644 |
8520 | --- a/kernel/trace/ftrace.c |
8521 | +++ b/kernel/trace/ftrace.c |
8522 | @@ -4315,16 +4315,11 @@ static void ftrace_init_module(struct module *mod, |
8523 | ftrace_process_locs(mod, start, end); |
8524 | } |
8525 | |
8526 | -static int ftrace_module_notify_enter(struct notifier_block *self, |
8527 | - unsigned long val, void *data) |
8528 | +void ftrace_module_init(struct module *mod) |
8529 | { |
8530 | - struct module *mod = data; |
8531 | - |
8532 | - if (val == MODULE_STATE_COMING) |
8533 | - ftrace_init_module(mod, mod->ftrace_callsites, |
8534 | - mod->ftrace_callsites + |
8535 | - mod->num_ftrace_callsites); |
8536 | - return 0; |
8537 | + ftrace_init_module(mod, mod->ftrace_callsites, |
8538 | + mod->ftrace_callsites + |
8539 | + mod->num_ftrace_callsites); |
8540 | } |
8541 | |
8542 | static int ftrace_module_notify_exit(struct notifier_block *self, |
8543 | @@ -4338,11 +4333,6 @@ static int ftrace_module_notify_exit(struct notifier_block *self, |
8544 | return 0; |
8545 | } |
8546 | #else |
8547 | -static int ftrace_module_notify_enter(struct notifier_block *self, |
8548 | - unsigned long val, void *data) |
8549 | -{ |
8550 | - return 0; |
8551 | -} |
8552 | static int ftrace_module_notify_exit(struct notifier_block *self, |
8553 | unsigned long val, void *data) |
8554 | { |
8555 | @@ -4350,11 +4340,6 @@ static int ftrace_module_notify_exit(struct notifier_block *self, |
8556 | } |
8557 | #endif /* CONFIG_MODULES */ |
8558 | |
8559 | -struct notifier_block ftrace_module_enter_nb = { |
8560 | - .notifier_call = ftrace_module_notify_enter, |
8561 | - .priority = INT_MAX, /* Run before anything that can use kprobes */ |
8562 | -}; |
8563 | - |
8564 | struct notifier_block ftrace_module_exit_nb = { |
8565 | .notifier_call = ftrace_module_notify_exit, |
8566 | .priority = INT_MIN, /* Run after anything that can remove kprobes */ |
8567 | @@ -4391,10 +4376,6 @@ void __init ftrace_init(void) |
8568 | __start_mcount_loc, |
8569 | __stop_mcount_loc); |
8570 | |
8571 | - ret = register_module_notifier(&ftrace_module_enter_nb); |
8572 | - if (ret) |
8573 | - pr_warning("Failed to register trace ftrace module enter notifier\n"); |
8574 | - |
8575 | ret = register_module_notifier(&ftrace_module_exit_nb); |
8576 | if (ret) |
8577 | pr_warning("Failed to register trace ftrace module exit notifier\n"); |
8578 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
8579 | index 193e977a10ea..b6a394108e3b 100644 |
8580 | --- a/kernel/workqueue.c |
8581 | +++ b/kernel/workqueue.c |
8582 | @@ -1909,6 +1909,12 @@ static void send_mayday(struct work_struct *work) |
8583 | |
8584 | /* mayday mayday mayday */ |
8585 | if (list_empty(&pwq->mayday_node)) { |
8586 | + /* |
8587 | + * If @pwq is for an unbound wq, its base ref may be put at |
8588 | + * any time due to an attribute change. Pin @pwq until the |
8589 | + * rescuer is done with it. |
8590 | + */ |
8591 | + get_pwq(pwq); |
8592 | list_add_tail(&pwq->mayday_node, &wq->maydays); |
8593 | wake_up_process(wq->rescuer->task); |
8594 | } |
8595 | @@ -2391,6 +2397,7 @@ static int rescuer_thread(void *__rescuer) |
8596 | struct worker *rescuer = __rescuer; |
8597 | struct workqueue_struct *wq = rescuer->rescue_wq; |
8598 | struct list_head *scheduled = &rescuer->scheduled; |
8599 | + bool should_stop; |
8600 | |
8601 | set_user_nice(current, RESCUER_NICE_LEVEL); |
8602 | |
8603 | @@ -2402,11 +2409,15 @@ static int rescuer_thread(void *__rescuer) |
8604 | repeat: |
8605 | set_current_state(TASK_INTERRUPTIBLE); |
8606 | |
8607 | - if (kthread_should_stop()) { |
8608 | - __set_current_state(TASK_RUNNING); |
8609 | - rescuer->task->flags &= ~PF_WQ_WORKER; |
8610 | - return 0; |
8611 | - } |
8612 | + /* |
8613 | + * By the time the rescuer is requested to stop, the workqueue |
8614 | + * shouldn't have any work pending, but @wq->maydays may still have |
8615 | + * pwq(s) queued. This can happen by non-rescuer workers consuming |
8616 | + * all the work items before the rescuer got to them. Go through |
8617 | + * @wq->maydays processing before acting on should_stop so that the |
8618 | + * list is always empty on exit. |
8619 | + */ |
8620 | + should_stop = kthread_should_stop(); |
8621 | |
8622 | /* see whether any pwq is asking for help */ |
8623 | spin_lock_irq(&wq_mayday_lock); |
8624 | @@ -2438,6 +2449,12 @@ repeat: |
8625 | process_scheduled_works(rescuer); |
8626 | |
8627 | /* |
8628 | + * Put the reference grabbed by send_mayday(). @pool won't |
8629 | + * go away while we're holding its lock. |
8630 | + */ |
8631 | + put_pwq(pwq); |
8632 | + |
8633 | + /* |
8634 | * Leave this pool. If keep_working() is %true, notify a |
8635 | * regular worker; otherwise, we end up with 0 concurrency |
8636 | * and stalling the execution. |
8637 | @@ -2452,6 +2469,12 @@ repeat: |
8638 | |
8639 | spin_unlock_irq(&wq_mayday_lock); |
8640 | |
8641 | + if (should_stop) { |
8642 | + __set_current_state(TASK_RUNNING); |
8643 | + rescuer->task->flags &= ~PF_WQ_WORKER; |
8644 | + return 0; |
8645 | + } |
8646 | + |
8647 | /* rescuers should never participate in concurrency management */ |
8648 | WARN_ON_ONCE(!(rescuer->flags & WORKER_NOT_RUNNING)); |
8649 | schedule(); |
8650 | @@ -4093,7 +4116,8 @@ static void wq_update_unbound_numa(struct workqueue_struct *wq, int cpu, |
8651 | if (!pwq) { |
8652 | pr_warning("workqueue: allocation failed while updating NUMA affinity of \"%s\"\n", |
8653 | wq->name); |
8654 | - goto out_unlock; |
8655 | + mutex_lock(&wq->mutex); |
8656 | + goto use_dfl_pwq; |
8657 | } |
8658 | |
8659 | /* |
8660 | diff --git a/mm/compaction.c b/mm/compaction.c |
8661 | index 918577595ea8..5f702ef0a65f 100644 |
8662 | --- a/mm/compaction.c |
8663 | +++ b/mm/compaction.c |
8664 | @@ -666,16 +666,20 @@ static void isolate_freepages(struct zone *zone, |
8665 | struct compact_control *cc) |
8666 | { |
8667 | struct page *page; |
8668 | - unsigned long high_pfn, low_pfn, pfn, z_end_pfn, end_pfn; |
8669 | + unsigned long high_pfn, low_pfn, pfn, z_end_pfn; |
8670 | int nr_freepages = cc->nr_freepages; |
8671 | struct list_head *freelist = &cc->freepages; |
8672 | |
8673 | /* |
8674 | * Initialise the free scanner. The starting point is where we last |
8675 | - * scanned from (or the end of the zone if starting). The low point |
8676 | - * is the end of the pageblock the migration scanner is using. |
8677 | + * successfully isolated from, zone-cached value, or the end of the |
8678 | + * zone when isolating for the first time. We need this aligned to |
8679 | + * the pageblock boundary, because we do pfn -= pageblock_nr_pages |
8680 | + * in the for loop. |
8681 | + * The low boundary is the end of the pageblock the migration scanner |
8682 | + * is using. |
8683 | */ |
8684 | - pfn = cc->free_pfn; |
8685 | + pfn = cc->free_pfn & ~(pageblock_nr_pages-1); |
8686 | low_pfn = ALIGN(cc->migrate_pfn + 1, pageblock_nr_pages); |
8687 | |
8688 | /* |
8689 | @@ -695,6 +699,7 @@ static void isolate_freepages(struct zone *zone, |
8690 | for (; pfn >= low_pfn && cc->nr_migratepages > nr_freepages; |
8691 | pfn -= pageblock_nr_pages) { |
8692 | unsigned long isolated; |
8693 | + unsigned long end_pfn; |
8694 | |
8695 | /* |
8696 | * This can iterate a massively long zone without finding any |
8697 | @@ -729,13 +734,10 @@ static void isolate_freepages(struct zone *zone, |
8698 | isolated = 0; |
8699 | |
8700 | /* |
8701 | - * As pfn may not start aligned, pfn+pageblock_nr_page |
8702 | - * may cross a MAX_ORDER_NR_PAGES boundary and miss |
8703 | - * a pfn_valid check. Ensure isolate_freepages_block() |
8704 | - * only scans within a pageblock |
8705 | + * Take care when isolating in last pageblock of a zone which |
8706 | + * ends in the middle of a pageblock. |
8707 | */ |
8708 | - end_pfn = ALIGN(pfn + 1, pageblock_nr_pages); |
8709 | - end_pfn = min(end_pfn, z_end_pfn); |
8710 | + end_pfn = min(pfn + pageblock_nr_pages, z_end_pfn); |
8711 | isolated = isolate_freepages_block(cc, pfn, end_pfn, |
8712 | freelist, false); |
8713 | nr_freepages += isolated; |
8714 | diff --git a/mm/memory-failure.c b/mm/memory-failure.c |
8715 | index 90002ea43638..66586bb44c62 100644 |
8716 | --- a/mm/memory-failure.c |
8717 | +++ b/mm/memory-failure.c |
8718 | @@ -1085,15 +1085,16 @@ int memory_failure(unsigned long pfn, int trapno, int flags) |
8719 | return 0; |
8720 | } else if (PageHuge(hpage)) { |
8721 | /* |
8722 | - * Check "just unpoisoned", "filter hit", and |
8723 | - * "race with other subpage." |
8724 | + * Check "filter hit" and "race with other subpage." |
8725 | */ |
8726 | lock_page(hpage); |
8727 | - if (!PageHWPoison(hpage) |
8728 | - || (hwpoison_filter(p) && TestClearPageHWPoison(p)) |
8729 | - || (p != hpage && TestSetPageHWPoison(hpage))) { |
8730 | - atomic_long_sub(nr_pages, &num_poisoned_pages); |
8731 | - return 0; |
8732 | + if (PageHWPoison(hpage)) { |
8733 | + if ((hwpoison_filter(p) && TestClearPageHWPoison(p)) |
8734 | + || (p != hpage && TestSetPageHWPoison(hpage))) { |
8735 | + atomic_long_sub(nr_pages, &num_poisoned_pages); |
8736 | + unlock_page(hpage); |
8737 | + return 0; |
8738 | + } |
8739 | } |
8740 | set_page_hwpoison_huge_page(hpage); |
8741 | res = dequeue_hwpoisoned_huge_page(hpage); |
8742 | diff --git a/mm/memory.c b/mm/memory.c |
8743 | index 22dfa617bddb..49e930f9ed46 100644 |
8744 | --- a/mm/memory.c |
8745 | +++ b/mm/memory.c |
8746 | @@ -1929,12 +1929,17 @@ int fixup_user_fault(struct task_struct *tsk, struct mm_struct *mm, |
8747 | unsigned long address, unsigned int fault_flags) |
8748 | { |
8749 | struct vm_area_struct *vma; |
8750 | + vm_flags_t vm_flags; |
8751 | int ret; |
8752 | |
8753 | vma = find_extend_vma(mm, address); |
8754 | if (!vma || address < vma->vm_start) |
8755 | return -EFAULT; |
8756 | |
8757 | + vm_flags = (fault_flags & FAULT_FLAG_WRITE) ? VM_WRITE : VM_READ; |
8758 | + if (!(vm_flags & vma->vm_flags)) |
8759 | + return -EFAULT; |
8760 | + |
8761 | ret = handle_mm_fault(mm, vma, address, fault_flags); |
8762 | if (ret & VM_FAULT_ERROR) { |
8763 | if (ret & VM_FAULT_OOM) |
8764 | diff --git a/mm/mremap.c b/mm/mremap.c |
8765 | index 0843feb66f3d..05f1180e9f21 100644 |
8766 | --- a/mm/mremap.c |
8767 | +++ b/mm/mremap.c |
8768 | @@ -194,10 +194,17 @@ unsigned long move_page_tables(struct vm_area_struct *vma, |
8769 | break; |
8770 | if (pmd_trans_huge(*old_pmd)) { |
8771 | int err = 0; |
8772 | - if (extent == HPAGE_PMD_SIZE) |
8773 | + if (extent == HPAGE_PMD_SIZE) { |
8774 | + VM_BUG_ON(vma->vm_file || !vma->anon_vma); |
8775 | + /* See comment in move_ptes() */ |
8776 | + if (need_rmap_locks) |
8777 | + anon_vma_lock_write(vma->anon_vma); |
8778 | err = move_huge_pmd(vma, new_vma, old_addr, |
8779 | new_addr, old_end, |
8780 | old_pmd, new_pmd); |
8781 | + if (need_rmap_locks) |
8782 | + anon_vma_unlock_write(vma->anon_vma); |
8783 | + } |
8784 | if (err > 0) { |
8785 | need_flush = true; |
8786 | continue; |
8787 | diff --git a/mm/page-writeback.c b/mm/page-writeback.c |
8788 | index 7106cb1aca8e..8f6daa62206d 100644 |
8789 | --- a/mm/page-writeback.c |
8790 | +++ b/mm/page-writeback.c |
8791 | @@ -593,14 +593,14 @@ unsigned long bdi_dirty_limit(struct backing_dev_info *bdi, unsigned long dirty) |
8792 | * (5) the closer to setpoint, the smaller |df/dx| (and the reverse) |
8793 | * => fast response on large errors; small oscillation near setpoint |
8794 | */ |
8795 | -static inline long long pos_ratio_polynom(unsigned long setpoint, |
8796 | +static long long pos_ratio_polynom(unsigned long setpoint, |
8797 | unsigned long dirty, |
8798 | unsigned long limit) |
8799 | { |
8800 | long long pos_ratio; |
8801 | long x; |
8802 | |
8803 | - x = div_s64(((s64)setpoint - (s64)dirty) << RATELIMIT_CALC_SHIFT, |
8804 | + x = div64_s64(((s64)setpoint - (s64)dirty) << RATELIMIT_CALC_SHIFT, |
8805 | limit - setpoint + 1); |
8806 | pos_ratio = x; |
8807 | pos_ratio = pos_ratio * x >> RATELIMIT_CALC_SHIFT; |
8808 | @@ -842,7 +842,7 @@ static unsigned long bdi_position_ratio(struct backing_dev_info *bdi, |
8809 | x_intercept = bdi_setpoint + span; |
8810 | |
8811 | if (bdi_dirty < x_intercept - span / 4) { |
8812 | - pos_ratio = div_u64(pos_ratio * (x_intercept - bdi_dirty), |
8813 | + pos_ratio = div64_u64(pos_ratio * (x_intercept - bdi_dirty), |
8814 | x_intercept - bdi_setpoint + 1); |
8815 | } else |
8816 | pos_ratio /= 4; |
8817 | diff --git a/mm/percpu.c b/mm/percpu.c |
8818 | index 036cfe07050f..a2a54a85f691 100644 |
8819 | --- a/mm/percpu.c |
8820 | +++ b/mm/percpu.c |
8821 | @@ -612,7 +612,7 @@ static struct pcpu_chunk *pcpu_alloc_chunk(void) |
8822 | chunk->map = pcpu_mem_zalloc(PCPU_DFL_MAP_ALLOC * |
8823 | sizeof(chunk->map[0])); |
8824 | if (!chunk->map) { |
8825 | - kfree(chunk); |
8826 | + pcpu_mem_free(chunk, pcpu_chunk_struct_size); |
8827 | return NULL; |
8828 | } |
8829 | |
8830 | diff --git a/mm/vmscan.c b/mm/vmscan.c |
8831 | index a9c74b409681..30a4b096ff6e 100644 |
8832 | --- a/mm/vmscan.c |
8833 | +++ b/mm/vmscan.c |
8834 | @@ -1916,6 +1916,24 @@ static void get_scan_count(struct lruvec *lruvec, struct scan_control *sc, |
8835 | } |
8836 | |
8837 | /* |
8838 | + * Prevent the reclaimer from falling into the cache trap: as |
8839 | + * cache pages start out inactive, every cache fault will tip |
8840 | + * the scan balance towards the file LRU. And as the file LRU |
8841 | + * shrinks, so does the window for rotation from references. |
8842 | + * This means we have a runaway feedback loop where a tiny |
8843 | + * thrashing file LRU becomes infinitely more attractive than |
8844 | + * anon pages. Try to detect this based on file LRU size. |
8845 | + */ |
8846 | + if (global_reclaim(sc)) { |
8847 | + unsigned long free = zone_page_state(zone, NR_FREE_PAGES); |
8848 | + |
8849 | + if (unlikely(file + free <= high_wmark_pages(zone))) { |
8850 | + scan_balance = SCAN_ANON; |
8851 | + goto out; |
8852 | + } |
8853 | + } |
8854 | + |
8855 | + /* |
8856 | * There is enough inactive page cache, do not reclaim |
8857 | * anything from the anonymous working set right now. |
8858 | */ |
8859 | diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c |
8860 | index ba5366c320da..9a6bc9df5e81 100644 |
8861 | --- a/net/bluetooth/hci_conn.c |
8862 | +++ b/net/bluetooth/hci_conn.c |
8863 | @@ -752,14 +752,17 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) |
8864 | if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { |
8865 | struct hci_cp_auth_requested cp; |
8866 | |
8867 | - /* encrypt must be pending if auth is also pending */ |
8868 | - set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); |
8869 | - |
8870 | cp.handle = cpu_to_le16(conn->handle); |
8871 | hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, |
8872 | sizeof(cp), &cp); |
8873 | + |
8874 | + /* If we're already encrypted set the REAUTH_PEND flag, |
8875 | + * otherwise set the ENCRYPT_PEND. |
8876 | + */ |
8877 | if (conn->key_type != 0xff) |
8878 | set_bit(HCI_CONN_REAUTH_PEND, &conn->flags); |
8879 | + else |
8880 | + set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags); |
8881 | } |
8882 | |
8883 | return 0; |
8884 | diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c |
8885 | index 60828cf02eb8..66ada7794ed0 100644 |
8886 | --- a/net/bluetooth/hci_event.c |
8887 | +++ b/net/bluetooth/hci_event.c |
8888 | @@ -3006,6 +3006,12 @@ static void hci_key_refresh_complete_evt(struct hci_dev *hdev, |
8889 | if (!conn) |
8890 | goto unlock; |
8891 | |
8892 | + /* For BR/EDR the necessary steps are taken through the |
8893 | + * auth_complete event. |
8894 | + */ |
8895 | + if (conn->type != LE_LINK) |
8896 | + goto unlock; |
8897 | + |
8898 | if (!ev->status) |
8899 | conn->sec_level = conn->pending_sec_level; |
8900 | |
8901 | diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c |
8902 | index 30efc5c18622..988721a629eb 100644 |
8903 | --- a/net/ceph/messenger.c |
8904 | +++ b/net/ceph/messenger.c |
8905 | @@ -557,7 +557,7 @@ static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov, |
8906 | return r; |
8907 | } |
8908 | |
8909 | -static int ceph_tcp_sendpage(struct socket *sock, struct page *page, |
8910 | +static int __ceph_tcp_sendpage(struct socket *sock, struct page *page, |
8911 | int offset, size_t size, bool more) |
8912 | { |
8913 | int flags = MSG_DONTWAIT | MSG_NOSIGNAL | (more ? MSG_MORE : MSG_EOR); |
8914 | @@ -570,6 +570,24 @@ static int ceph_tcp_sendpage(struct socket *sock, struct page *page, |
8915 | return ret; |
8916 | } |
8917 | |
8918 | +static int ceph_tcp_sendpage(struct socket *sock, struct page *page, |
8919 | + int offset, size_t size, bool more) |
8920 | +{ |
8921 | + int ret; |
8922 | + struct kvec iov; |
8923 | + |
8924 | + /* sendpage cannot properly handle pages with page_count == 0, |
8925 | + * we need to fallback to sendmsg if that's the case */ |
8926 | + if (page_count(page) >= 1) |
8927 | + return __ceph_tcp_sendpage(sock, page, offset, size, more); |
8928 | + |
8929 | + iov.iov_base = kmap(page) + offset; |
8930 | + iov.iov_len = size; |
8931 | + ret = ceph_tcp_sendmsg(sock, &iov, 1, size, more); |
8932 | + kunmap(page); |
8933 | + |
8934 | + return ret; |
8935 | +} |
8936 | |
8937 | /* |
8938 | * Shutdown/close the socket for the given connection. |
8939 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h |
8940 | index 6bd498470138..b127902361f4 100644 |
8941 | --- a/net/mac80211/ieee80211_i.h |
8942 | +++ b/net/mac80211/ieee80211_i.h |
8943 | @@ -317,6 +317,7 @@ struct ieee80211_roc_work { |
8944 | |
8945 | bool started, abort, hw_begun, notified; |
8946 | bool to_be_freed; |
8947 | + bool on_channel; |
8948 | |
8949 | unsigned long hw_start_time; |
8950 | |
8951 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
8952 | index 47059ac44e24..e6a84cb1a5e4 100644 |
8953 | --- a/net/mac80211/mlme.c |
8954 | +++ b/net/mac80211/mlme.c |
8955 | @@ -3511,18 +3511,24 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) |
8956 | |
8957 | sdata_lock(sdata); |
8958 | |
8959 | - if (ifmgd->auth_data) { |
8960 | + if (ifmgd->auth_data || ifmgd->assoc_data) { |
8961 | + const u8 *bssid = ifmgd->auth_data ? |
8962 | + ifmgd->auth_data->bss->bssid : |
8963 | + ifmgd->assoc_data->bss->bssid; |
8964 | + |
8965 | /* |
8966 | - * If we are trying to authenticate while suspending, cfg80211 |
8967 | - * won't know and won't actually abort those attempts, thus we |
8968 | - * need to do that ourselves. |
8969 | + * If we are trying to authenticate / associate while suspending, |
8970 | + * cfg80211 won't know and won't actually abort those attempts, |
8971 | + * thus we need to do that ourselves. |
8972 | */ |
8973 | - ieee80211_send_deauth_disassoc(sdata, |
8974 | - ifmgd->auth_data->bss->bssid, |
8975 | + ieee80211_send_deauth_disassoc(sdata, bssid, |
8976 | IEEE80211_STYPE_DEAUTH, |
8977 | WLAN_REASON_DEAUTH_LEAVING, |
8978 | false, frame_buf); |
8979 | - ieee80211_destroy_auth_data(sdata, false); |
8980 | + if (ifmgd->assoc_data) |
8981 | + ieee80211_destroy_assoc_data(sdata, false); |
8982 | + if (ifmgd->auth_data) |
8983 | + ieee80211_destroy_auth_data(sdata, false); |
8984 | cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf, |
8985 | IEEE80211_DEAUTH_FRAME_LEN); |
8986 | } |
8987 | diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c |
8988 | index 6fb38558a5e6..7a17decd27f9 100644 |
8989 | --- a/net/mac80211/offchannel.c |
8990 | +++ b/net/mac80211/offchannel.c |
8991 | @@ -333,7 +333,7 @@ void ieee80211_sw_roc_work(struct work_struct *work) |
8992 | container_of(work, struct ieee80211_roc_work, work.work); |
8993 | struct ieee80211_sub_if_data *sdata = roc->sdata; |
8994 | struct ieee80211_local *local = sdata->local; |
8995 | - bool started; |
8996 | + bool started, on_channel; |
8997 | |
8998 | mutex_lock(&local->mtx); |
8999 | |
9000 | @@ -354,14 +354,26 @@ void ieee80211_sw_roc_work(struct work_struct *work) |
9001 | if (!roc->started) { |
9002 | struct ieee80211_roc_work *dep; |
9003 | |
9004 | - /* start this ROC */ |
9005 | - ieee80211_offchannel_stop_vifs(local); |
9006 | + WARN_ON(local->use_chanctx); |
9007 | + |
9008 | + /* If actually operating on the desired channel (with at least |
9009 | + * 20 MHz channel width) don't stop all the operations but still |
9010 | + * treat it as though the ROC operation started properly, so |
9011 | + * other ROC operations won't interfere with this one. |
9012 | + */ |
9013 | + roc->on_channel = roc->chan == local->_oper_chandef.chan && |
9014 | + local->_oper_chandef.width != NL80211_CHAN_WIDTH_5 && |
9015 | + local->_oper_chandef.width != NL80211_CHAN_WIDTH_10; |
9016 | |
9017 | - /* switch channel etc */ |
9018 | + /* start this ROC */ |
9019 | ieee80211_recalc_idle(local); |
9020 | |
9021 | - local->tmp_channel = roc->chan; |
9022 | - ieee80211_hw_config(local, 0); |
9023 | + if (!roc->on_channel) { |
9024 | + ieee80211_offchannel_stop_vifs(local); |
9025 | + |
9026 | + local->tmp_channel = roc->chan; |
9027 | + ieee80211_hw_config(local, 0); |
9028 | + } |
9029 | |
9030 | /* tell userspace or send frame */ |
9031 | ieee80211_handle_roc_started(roc); |
9032 | @@ -380,9 +392,10 @@ void ieee80211_sw_roc_work(struct work_struct *work) |
9033 | finish: |
9034 | list_del(&roc->list); |
9035 | started = roc->started; |
9036 | + on_channel = roc->on_channel; |
9037 | ieee80211_roc_notify_destroy(roc, !roc->abort); |
9038 | |
9039 | - if (started) { |
9040 | + if (started && !on_channel) { |
9041 | ieee80211_flush_queues(local, NULL); |
9042 | |
9043 | local->tmp_channel = NULL; |
9044 | diff --git a/net/mac80211/util.c b/net/mac80211/util.c |
9045 | index b8700d417a9c..642762518213 100644 |
9046 | --- a/net/mac80211/util.c |
9047 | +++ b/net/mac80211/util.c |
9048 | @@ -1754,7 +1754,7 @@ int ieee80211_reconfig(struct ieee80211_local *local) |
9049 | mutex_unlock(&local->mtx); |
9050 | |
9051 | if (sched_scan_stopped) |
9052 | - cfg80211_sched_scan_stopped(local->hw.wiphy); |
9053 | + cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy); |
9054 | |
9055 | /* |
9056 | * If this is for hw restart things are still running. |
9057 | diff --git a/net/wireless/reg.c b/net/wireless/reg.c |
9058 | index f0541370e68e..338794ea44d1 100644 |
9059 | --- a/net/wireless/reg.c |
9060 | +++ b/net/wireless/reg.c |
9061 | @@ -1683,17 +1683,9 @@ static void reg_process_hint(struct regulatory_request *reg_request) |
9062 | struct wiphy *wiphy = NULL; |
9063 | enum reg_request_treatment treatment; |
9064 | |
9065 | - if (WARN_ON(!reg_request->alpha2)) |
9066 | - return; |
9067 | - |
9068 | if (reg_request->wiphy_idx != WIPHY_IDX_INVALID) |
9069 | wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx); |
9070 | |
9071 | - if (reg_request->initiator == NL80211_REGDOM_SET_BY_DRIVER && !wiphy) { |
9072 | - kfree(reg_request); |
9073 | - return; |
9074 | - } |
9075 | - |
9076 | switch (reg_request->initiator) { |
9077 | case NL80211_REGDOM_SET_BY_CORE: |
9078 | reg_process_hint_core(reg_request); |
9079 | @@ -1706,20 +1698,29 @@ static void reg_process_hint(struct regulatory_request *reg_request) |
9080 | schedule_delayed_work(®_timeout, msecs_to_jiffies(3142)); |
9081 | return; |
9082 | case NL80211_REGDOM_SET_BY_DRIVER: |
9083 | + if (!wiphy) |
9084 | + goto out_free; |
9085 | treatment = reg_process_hint_driver(wiphy, reg_request); |
9086 | break; |
9087 | case NL80211_REGDOM_SET_BY_COUNTRY_IE: |
9088 | + if (!wiphy) |
9089 | + goto out_free; |
9090 | treatment = reg_process_hint_country_ie(wiphy, reg_request); |
9091 | break; |
9092 | default: |
9093 | WARN(1, "invalid initiator %d\n", reg_request->initiator); |
9094 | - return; |
9095 | + goto out_free; |
9096 | } |
9097 | |
9098 | /* This is required so that the orig_* parameters are saved */ |
9099 | if (treatment == REG_REQ_ALREADY_SET && wiphy && |
9100 | wiphy->regulatory_flags & REGULATORY_STRICT_REG) |
9101 | wiphy_update_regulatory(wiphy, reg_request->initiator); |
9102 | + |
9103 | + return; |
9104 | + |
9105 | +out_free: |
9106 | + kfree(reg_request); |
9107 | } |
9108 | |
9109 | /* |
9110 | diff --git a/net/wireless/scan.c b/net/wireless/scan.c |
9111 | index d1ed4aebbbb7..38d6dd553770 100644 |
9112 | --- a/net/wireless/scan.c |
9113 | +++ b/net/wireless/scan.c |
9114 | @@ -284,14 +284,22 @@ void cfg80211_sched_scan_results(struct wiphy *wiphy) |
9115 | } |
9116 | EXPORT_SYMBOL(cfg80211_sched_scan_results); |
9117 | |
9118 | -void cfg80211_sched_scan_stopped(struct wiphy *wiphy) |
9119 | +void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy) |
9120 | { |
9121 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); |
9122 | |
9123 | + ASSERT_RTNL(); |
9124 | + |
9125 | trace_cfg80211_sched_scan_stopped(wiphy); |
9126 | |
9127 | - rtnl_lock(); |
9128 | __cfg80211_stop_sched_scan(rdev, true); |
9129 | +} |
9130 | +EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl); |
9131 | + |
9132 | +void cfg80211_sched_scan_stopped(struct wiphy *wiphy) |
9133 | +{ |
9134 | + rtnl_lock(); |
9135 | + cfg80211_sched_scan_stopped_rtnl(wiphy); |
9136 | rtnl_unlock(); |
9137 | } |
9138 | EXPORT_SYMBOL(cfg80211_sched_scan_stopped); |
9139 | diff --git a/net/wireless/sme.c b/net/wireless/sme.c |
9140 | index f04d4c32e96e..760722f9126b 100644 |
9141 | --- a/net/wireless/sme.c |
9142 | +++ b/net/wireless/sme.c |
9143 | @@ -235,7 +235,6 @@ void cfg80211_conn_work(struct work_struct *work) |
9144 | NULL, 0, NULL, 0, |
9145 | WLAN_STATUS_UNSPECIFIED_FAILURE, |
9146 | false, NULL); |
9147 | - cfg80211_sme_free(wdev); |
9148 | } |
9149 | wdev_unlock(wdev); |
9150 | } |
9151 | @@ -649,6 +648,7 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid, |
9152 | cfg80211_unhold_bss(bss_from_pub(bss)); |
9153 | cfg80211_put_bss(wdev->wiphy, bss); |
9154 | } |
9155 | + cfg80211_sme_free(wdev); |
9156 | return; |
9157 | } |
9158 | |
9159 | diff --git a/security/device_cgroup.c b/security/device_cgroup.c |
9160 | index d3b6d2cd3a06..6e4e6eb732fe 100644 |
9161 | --- a/security/device_cgroup.c |
9162 | +++ b/security/device_cgroup.c |
9163 | @@ -308,57 +308,139 @@ static int devcgroup_seq_show(struct seq_file *m, void *v) |
9164 | } |
9165 | |
9166 | /** |
9167 | - * may_access - verifies if a new exception is part of what is allowed |
9168 | - * by a dev cgroup based on the default policy + |
9169 | - * exceptions. This is used to make sure a child cgroup |
9170 | - * won't have more privileges than its parent or to |
9171 | - * verify if a certain access is allowed. |
9172 | - * @dev_cgroup: dev cgroup to be tested against |
9173 | - * @refex: new exception |
9174 | - * @behavior: behavior of the exception |
9175 | + * match_exception - iterates the exception list trying to match a rule |
9176 | + * based on type, major, minor and access type. It is |
9177 | + * considered a match if an exception is found that |
9178 | + * will contain the entire range of provided parameters. |
9179 | + * @exceptions: list of exceptions |
9180 | + * @type: device type (DEV_BLOCK or DEV_CHAR) |
9181 | + * @major: device file major number, ~0 to match all |
9182 | + * @minor: device file minor number, ~0 to match all |
9183 | + * @access: permission mask (ACC_READ, ACC_WRITE, ACC_MKNOD) |
9184 | + * |
9185 | + * returns: true in case it matches an exception completely |
9186 | */ |
9187 | -static bool may_access(struct dev_cgroup *dev_cgroup, |
9188 | - struct dev_exception_item *refex, |
9189 | - enum devcg_behavior behavior) |
9190 | +static bool match_exception(struct list_head *exceptions, short type, |
9191 | + u32 major, u32 minor, short access) |
9192 | { |
9193 | struct dev_exception_item *ex; |
9194 | - bool match = false; |
9195 | |
9196 | - rcu_lockdep_assert(rcu_read_lock_held() || |
9197 | - lockdep_is_held(&devcgroup_mutex), |
9198 | - "device_cgroup::may_access() called without proper synchronization"); |
9199 | + list_for_each_entry_rcu(ex, exceptions, list) { |
9200 | + if ((type & DEV_BLOCK) && !(ex->type & DEV_BLOCK)) |
9201 | + continue; |
9202 | + if ((type & DEV_CHAR) && !(ex->type & DEV_CHAR)) |
9203 | + continue; |
9204 | + if (ex->major != ~0 && ex->major != major) |
9205 | + continue; |
9206 | + if (ex->minor != ~0 && ex->minor != minor) |
9207 | + continue; |
9208 | + /* provided access cannot have more than the exception rule */ |
9209 | + if (access & (~ex->access)) |
9210 | + continue; |
9211 | + return true; |
9212 | + } |
9213 | + return false; |
9214 | +} |
9215 | + |
9216 | +/** |
9217 | + * match_exception_partial - iterates the exception list trying to match a rule |
9218 | + * based on type, major, minor and access type. It is |
9219 | + * considered a match if an exception's range is |
9220 | + * found to contain *any* of the devices specified by |
9221 | + * provided parameters. This is used to make sure no |
9222 | + * extra access is being granted that is forbidden by |
9223 | + * any of the exception list. |
9224 | + * @exceptions: list of exceptions |
9225 | + * @type: device type (DEV_BLOCK or DEV_CHAR) |
9226 | + * @major: device file major number, ~0 to match all |
9227 | + * @minor: device file minor number, ~0 to match all |
9228 | + * @access: permission mask (ACC_READ, ACC_WRITE, ACC_MKNOD) |
9229 | + * |
9230 | + * returns: true in case the provided range mat matches an exception completely |
9231 | + */ |
9232 | +static bool match_exception_partial(struct list_head *exceptions, short type, |
9233 | + u32 major, u32 minor, short access) |
9234 | +{ |
9235 | + struct dev_exception_item *ex; |
9236 | |
9237 | - list_for_each_entry_rcu(ex, &dev_cgroup->exceptions, list) { |
9238 | - if ((refex->type & DEV_BLOCK) && !(ex->type & DEV_BLOCK)) |
9239 | + list_for_each_entry_rcu(ex, exceptions, list) { |
9240 | + if ((type & DEV_BLOCK) && !(ex->type & DEV_BLOCK)) |
9241 | continue; |
9242 | - if ((refex->type & DEV_CHAR) && !(ex->type & DEV_CHAR)) |
9243 | + if ((type & DEV_CHAR) && !(ex->type & DEV_CHAR)) |
9244 | continue; |
9245 | - if (ex->major != ~0 && ex->major != refex->major) |
9246 | + /* |
9247 | + * We must be sure that both the exception and the provided |
9248 | + * range aren't masking all devices |
9249 | + */ |
9250 | + if (ex->major != ~0 && major != ~0 && ex->major != major) |
9251 | continue; |
9252 | - if (ex->minor != ~0 && ex->minor != refex->minor) |
9253 | + if (ex->minor != ~0 && minor != ~0 && ex->minor != minor) |
9254 | continue; |
9255 | - if (refex->access & (~ex->access)) |
9256 | + /* |
9257 | + * In order to make sure the provided range isn't matching |
9258 | + * an exception, all its access bits shouldn't match the |
9259 | + * exception's access bits |
9260 | + */ |
9261 | + if (!(access & ex->access)) |
9262 | continue; |
9263 | - match = true; |
9264 | - break; |
9265 | + return true; |
9266 | } |
9267 | + return false; |
9268 | +} |
9269 | + |
9270 | +/** |
9271 | + * verify_new_ex - verifies if a new exception is part of what is allowed |
9272 | + * by a dev cgroup based on the default policy + |
9273 | + * exceptions. This is used to make sure a child cgroup |
9274 | + * won't have more privileges than its parent |
9275 | + * @dev_cgroup: dev cgroup to be tested against |
9276 | + * @refex: new exception |
9277 | + * @behavior: behavior of the exception's dev_cgroup |
9278 | + */ |
9279 | +static bool verify_new_ex(struct dev_cgroup *dev_cgroup, |
9280 | + struct dev_exception_item *refex, |
9281 | + enum devcg_behavior behavior) |
9282 | +{ |
9283 | + bool match = false; |
9284 | + |
9285 | + rcu_lockdep_assert(rcu_read_lock_held() || |
9286 | + lockdep_is_held(&devcgroup_mutex), |
9287 | + "device_cgroup:verify_new_ex called without proper synchronization"); |
9288 | |
9289 | if (dev_cgroup->behavior == DEVCG_DEFAULT_ALLOW) { |
9290 | if (behavior == DEVCG_DEFAULT_ALLOW) { |
9291 | - /* the exception will deny access to certain devices */ |
9292 | + /* |
9293 | + * new exception in the child doesn't matter, only |
9294 | + * adding extra restrictions |
9295 | + */ |
9296 | return true; |
9297 | } else { |
9298 | - /* the exception will allow access to certain devices */ |
9299 | + /* |
9300 | + * new exception in the child will add more devices |
9301 | + * that can be acessed, so it can't match any of |
9302 | + * parent's exceptions, even slightly |
9303 | + */ |
9304 | + match = match_exception_partial(&dev_cgroup->exceptions, |
9305 | + refex->type, |
9306 | + refex->major, |
9307 | + refex->minor, |
9308 | + refex->access); |
9309 | + |
9310 | if (match) |
9311 | - /* |
9312 | - * a new exception allowing access shouldn't |
9313 | - * match an parent's exception |
9314 | - */ |
9315 | return false; |
9316 | return true; |
9317 | } |
9318 | } else { |
9319 | - /* only behavior == DEVCG_DEFAULT_DENY allowed here */ |
9320 | + /* |
9321 | + * Only behavior == DEVCG_DEFAULT_DENY allowed here, therefore |
9322 | + * the new exception will add access to more devices and must |
9323 | + * be contained completely in an parent's exception to be |
9324 | + * allowed |
9325 | + */ |
9326 | + match = match_exception(&dev_cgroup->exceptions, refex->type, |
9327 | + refex->major, refex->minor, |
9328 | + refex->access); |
9329 | + |
9330 | if (match) |
9331 | /* parent has an exception that matches the proposed */ |
9332 | return true; |
9333 | @@ -380,7 +462,38 @@ static int parent_has_perm(struct dev_cgroup *childcg, |
9334 | |
9335 | if (!parent) |
9336 | return 1; |
9337 | - return may_access(parent, ex, childcg->behavior); |
9338 | + return verify_new_ex(parent, ex, childcg->behavior); |
9339 | +} |
9340 | + |
9341 | +/** |
9342 | + * parent_allows_removal - verify if it's ok to remove an exception |
9343 | + * @childcg: child cgroup from where the exception will be removed |
9344 | + * @ex: exception being removed |
9345 | + * |
9346 | + * When removing an exception in cgroups with default ALLOW policy, it must |
9347 | + * be checked if removing it will give the child cgroup more access than the |
9348 | + * parent. |
9349 | + * |
9350 | + * Return: true if it's ok to remove exception, false otherwise |
9351 | + */ |
9352 | +static bool parent_allows_removal(struct dev_cgroup *childcg, |
9353 | + struct dev_exception_item *ex) |
9354 | +{ |
9355 | + struct dev_cgroup *parent = css_to_devcgroup(css_parent(&childcg->css)); |
9356 | + |
9357 | + if (!parent) |
9358 | + return true; |
9359 | + |
9360 | + /* It's always allowed to remove access to devices */ |
9361 | + if (childcg->behavior == DEVCG_DEFAULT_DENY) |
9362 | + return true; |
9363 | + |
9364 | + /* |
9365 | + * Make sure you're not removing part or a whole exception existing in |
9366 | + * the parent cgroup |
9367 | + */ |
9368 | + return !match_exception_partial(&parent->exceptions, ex->type, |
9369 | + ex->major, ex->minor, ex->access); |
9370 | } |
9371 | |
9372 | /** |
9373 | @@ -618,17 +731,21 @@ static int devcgroup_update_access(struct dev_cgroup *devcgroup, |
9374 | |
9375 | switch (filetype) { |
9376 | case DEVCG_ALLOW: |
9377 | - if (!parent_has_perm(devcgroup, &ex)) |
9378 | - return -EPERM; |
9379 | /* |
9380 | * If the default policy is to allow by default, try to remove |
9381 | * an matching exception instead. And be silent about it: we |
9382 | * don't want to break compatibility |
9383 | */ |
9384 | if (devcgroup->behavior == DEVCG_DEFAULT_ALLOW) { |
9385 | + /* Check if the parent allows removing it first */ |
9386 | + if (!parent_allows_removal(devcgroup, &ex)) |
9387 | + return -EPERM; |
9388 | dev_exception_rm(devcgroup, &ex); |
9389 | - return 0; |
9390 | + break; |
9391 | } |
9392 | + |
9393 | + if (!parent_has_perm(devcgroup, &ex)) |
9394 | + return -EPERM; |
9395 | rc = dev_exception_add(devcgroup, &ex); |
9396 | break; |
9397 | case DEVCG_DENY: |
9398 | @@ -708,18 +825,18 @@ static int __devcgroup_check_permission(short type, u32 major, u32 minor, |
9399 | short access) |
9400 | { |
9401 | struct dev_cgroup *dev_cgroup; |
9402 | - struct dev_exception_item ex; |
9403 | - int rc; |
9404 | - |
9405 | - memset(&ex, 0, sizeof(ex)); |
9406 | - ex.type = type; |
9407 | - ex.major = major; |
9408 | - ex.minor = minor; |
9409 | - ex.access = access; |
9410 | + bool rc; |
9411 | |
9412 | rcu_read_lock(); |
9413 | dev_cgroup = task_devcgroup(current); |
9414 | - rc = may_access(dev_cgroup, &ex, dev_cgroup->behavior); |
9415 | + if (dev_cgroup->behavior == DEVCG_DEFAULT_ALLOW) |
9416 | + /* Can't match any of the exceptions, even partially */ |
9417 | + rc = !match_exception_partial(&dev_cgroup->exceptions, |
9418 | + type, major, minor, access); |
9419 | + else |
9420 | + /* Need to match completely one exception to be allowed */ |
9421 | + rc = match_exception(&dev_cgroup->exceptions, type, major, |
9422 | + minor, access); |
9423 | rcu_read_unlock(); |
9424 | |
9425 | if (!rc) |
9426 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
9427 | index a8dec9e9e876..22f7883fcb9a 100644 |
9428 | --- a/sound/pci/hda/hda_intel.c |
9429 | +++ b/sound/pci/hda/hda_intel.c |
9430 | @@ -3988,6 +3988,9 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { |
9431 | /* Lynx Point */ |
9432 | { PCI_DEVICE(0x8086, 0x8c20), |
9433 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
9434 | + /* 9 Series */ |
9435 | + { PCI_DEVICE(0x8086, 0x8ca0), |
9436 | + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
9437 | /* Wellsburg */ |
9438 | { PCI_DEVICE(0x8086, 0x8d20), |
9439 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH }, |
9440 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
9441 | index 5ef95034d041..ce5b339d9333 100644 |
9442 | --- a/sound/pci/hda/patch_hdmi.c |
9443 | +++ b/sound/pci/hda/patch_hdmi.c |
9444 | @@ -1123,8 +1123,10 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, |
9445 | AMP_OUT_UNMUTE); |
9446 | |
9447 | eld = &per_pin->sink_eld; |
9448 | - if (!eld->monitor_present) |
9449 | + if (!eld->monitor_present) { |
9450 | + hdmi_set_channel_count(codec, per_pin->cvt_nid, channels); |
9451 | return; |
9452 | + } |
9453 | |
9454 | if (!non_pcm && per_pin->chmap_set) |
9455 | ca = hdmi_manual_channel_allocation(channels, per_pin->chmap); |
9456 | diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c |
9457 | index 97db3b45b411..799348e9cdd0 100644 |
9458 | --- a/sound/soc/codecs/wm8962.c |
9459 | +++ b/sound/soc/codecs/wm8962.c |
9460 | @@ -154,6 +154,7 @@ static struct reg_default wm8962_reg[] = { |
9461 | { 40, 0x0000 }, /* R40 - SPKOUTL volume */ |
9462 | { 41, 0x0000 }, /* R41 - SPKOUTR volume */ |
9463 | |
9464 | + { 49, 0x0010 }, /* R49 - Class D Control 1 */ |
9465 | { 51, 0x0003 }, /* R51 - Class D Control 2 */ |
9466 | |
9467 | { 56, 0x0506 }, /* R56 - Clocking 4 */ |
9468 | @@ -795,7 +796,6 @@ static bool wm8962_volatile_register(struct device *dev, unsigned int reg) |
9469 | case WM8962_ALC2: |
9470 | case WM8962_THERMAL_SHUTDOWN_STATUS: |
9471 | case WM8962_ADDITIONAL_CONTROL_4: |
9472 | - case WM8962_CLASS_D_CONTROL_1: |
9473 | case WM8962_DC_SERVO_6: |
9474 | case WM8962_INTERRUPT_STATUS_1: |
9475 | case WM8962_INTERRUPT_STATUS_2: |
9476 | @@ -2922,13 +2922,22 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source, |
9477 | static int wm8962_mute(struct snd_soc_dai *dai, int mute) |
9478 | { |
9479 | struct snd_soc_codec *codec = dai->codec; |
9480 | - int val; |
9481 | + int val, ret; |
9482 | |
9483 | if (mute) |
9484 | - val = WM8962_DAC_MUTE; |
9485 | + val = WM8962_DAC_MUTE | WM8962_DAC_MUTE_ALT; |
9486 | else |
9487 | val = 0; |
9488 | |
9489 | + /** |
9490 | + * The DAC mute bit is mirrored in two registers, update both to keep |
9491 | + * the register cache consistent. |
9492 | + */ |
9493 | + ret = snd_soc_update_bits(codec, WM8962_CLASS_D_CONTROL_1, |
9494 | + WM8962_DAC_MUTE_ALT, val); |
9495 | + if (ret < 0) |
9496 | + return ret; |
9497 | + |
9498 | return snd_soc_update_bits(codec, WM8962_ADC_DAC_CONTROL_1, |
9499 | WM8962_DAC_MUTE, val); |
9500 | } |
9501 | diff --git a/sound/soc/codecs/wm8962.h b/sound/soc/codecs/wm8962.h |
9502 | index a1a5d5294c19..910aafd09d21 100644 |
9503 | --- a/sound/soc/codecs/wm8962.h |
9504 | +++ b/sound/soc/codecs/wm8962.h |
9505 | @@ -1954,6 +1954,10 @@ |
9506 | #define WM8962_SPKOUTL_ENA_MASK 0x0040 /* SPKOUTL_ENA */ |
9507 | #define WM8962_SPKOUTL_ENA_SHIFT 6 /* SPKOUTL_ENA */ |
9508 | #define WM8962_SPKOUTL_ENA_WIDTH 1 /* SPKOUTL_ENA */ |
9509 | +#define WM8962_DAC_MUTE_ALT 0x0010 /* DAC_MUTE */ |
9510 | +#define WM8962_DAC_MUTE_ALT_MASK 0x0010 /* DAC_MUTE */ |
9511 | +#define WM8962_DAC_MUTE_ALT_SHIFT 4 /* DAC_MUTE */ |
9512 | +#define WM8962_DAC_MUTE_ALT_WIDTH 1 /* DAC_MUTE */ |
9513 | #define WM8962_SPKOUTL_PGA_MUTE 0x0002 /* SPKOUTL_PGA_MUTE */ |
9514 | #define WM8962_SPKOUTL_PGA_MUTE_MASK 0x0002 /* SPKOUTL_PGA_MUTE */ |
9515 | #define WM8962_SPKOUTL_PGA_MUTE_SHIFT 1 /* SPKOUTL_PGA_MUTE */ |
9516 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c |
9517 | index 910223782c5c..c1369c3ad643 100644 |
9518 | --- a/sound/soc/soc-dapm.c |
9519 | +++ b/sound/soc/soc-dapm.c |
9520 | @@ -3649,8 +3649,11 @@ void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card) |
9521 | cpu_dai = rtd->cpu_dai; |
9522 | codec_dai = rtd->codec_dai; |
9523 | |
9524 | - /* dynamic FE links have no fixed DAI mapping */ |
9525 | - if (rtd->dai_link->dynamic) |
9526 | + /* |
9527 | + * dynamic FE links have no fixed DAI mapping. |
9528 | + * CODEC<->CODEC links have no direct connection. |
9529 | + */ |
9530 | + if (rtd->dai_link->dynamic || rtd->dai_link->params) |
9531 | continue; |
9532 | |
9533 | /* there is no point in connecting BE DAI links with dummies */ |
9534 | diff --git a/sound/usb/card.h b/sound/usb/card.h |
9535 | index 9867ab866857..97acb906acc2 100644 |
9536 | --- a/sound/usb/card.h |
9537 | +++ b/sound/usb/card.h |
9538 | @@ -92,6 +92,7 @@ struct snd_usb_endpoint { |
9539 | unsigned int curframesize; /* current packet size in frames (for capture) */ |
9540 | unsigned int syncmaxsize; /* sync endpoint packet size */ |
9541 | unsigned int fill_max:1; /* fill max packet size always */ |
9542 | + unsigned int udh01_fb_quirk:1; /* corrupted feedback data */ |
9543 | unsigned int datainterval; /* log_2 of data packet interval */ |
9544 | unsigned int syncinterval; /* P for adaptive mode, 0 otherwise */ |
9545 | unsigned char silence_value; |
9546 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c |
9547 | index 83aabea259d7..814430fec6a2 100644 |
9548 | --- a/sound/usb/endpoint.c |
9549 | +++ b/sound/usb/endpoint.c |
9550 | @@ -469,6 +469,10 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, |
9551 | ep->syncinterval = 3; |
9552 | |
9553 | ep->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize); |
9554 | + |
9555 | + if (chip->usb_id == USB_ID(0x0644, 0x8038) /* TEAC UD-H01 */ && |
9556 | + ep->syncmaxsize == 4) |
9557 | + ep->udh01_fb_quirk = 1; |
9558 | } |
9559 | |
9560 | list_add_tail(&ep->list, &chip->ep_list); |
9561 | @@ -1099,7 +1103,16 @@ void snd_usb_handle_sync_urb(struct snd_usb_endpoint *ep, |
9562 | if (f == 0) |
9563 | return; |
9564 | |
9565 | - if (unlikely(ep->freqshift == INT_MIN)) { |
9566 | + if (unlikely(sender->udh01_fb_quirk)) { |
9567 | + /* |
9568 | + * The TEAC UD-H01 firmware sometimes changes the feedback value |
9569 | + * by +/- 0x1.0000. |
9570 | + */ |
9571 | + if (f < ep->freqn - 0x8000) |
9572 | + f += 0x10000; |
9573 | + else if (f > ep->freqn + 0x8000) |
9574 | + f -= 0x10000; |
9575 | + } else if (unlikely(ep->freqshift == INT_MIN)) { |
9576 | /* |
9577 | * The first time we see a feedback value, determine its format |
9578 | * by shifting it left or right until it matches the nominal |