Contents of /trunk/kernel-alx/patches-4.9/0118-4.9.19-all-fixes.patch
Parent Directory | Revision Log
Revision 2956 -
(show annotations)
(download)
Mon Jul 24 12:03:46 2017 UTC (7 years, 3 months ago) by niro
File size: 101849 byte(s)
Mon Jul 24 12:03:46 2017 UTC (7 years, 3 months ago) by niro
File size: 101849 byte(s)
-added patches-4.9
1 | diff --git a/Makefile b/Makefile |
2 | index c10d0e634e68..ba1c6a8e6a70 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 18 |
9 | +SUBLEVEL = 19 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/arm/boot/dts/sama5d2.dtsi b/arch/arm/boot/dts/sama5d2.dtsi |
14 | index 7173ec9059a1..8158c873b455 100644 |
15 | --- a/arch/arm/boot/dts/sama5d2.dtsi |
16 | +++ b/arch/arm/boot/dts/sama5d2.dtsi |
17 | @@ -266,7 +266,7 @@ |
18 | }; |
19 | |
20 | usb1: ohci@00400000 { |
21 | - compatible = "atmel,sama5d2-ohci", "usb-ohci"; |
22 | + compatible = "atmel,at91rm9200-ohci", "usb-ohci"; |
23 | reg = <0x00400000 0x100000>; |
24 | interrupts = <41 IRQ_TYPE_LEVEL_HIGH 2>; |
25 | clocks = <&uhphs_clk>, <&uhphs_clk>, <&uhpck>; |
26 | diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c |
27 | index b4332b727e9c..31dde8b6f2ea 100644 |
28 | --- a/arch/arm/mach-at91/pm.c |
29 | +++ b/arch/arm/mach-at91/pm.c |
30 | @@ -289,6 +289,22 @@ static void at91_ddr_standby(void) |
31 | at91_ramc_write(1, AT91_DDRSDRC_LPR, saved_lpr1); |
32 | } |
33 | |
34 | +static void sama5d3_ddr_standby(void) |
35 | +{ |
36 | + u32 lpr0; |
37 | + u32 saved_lpr0; |
38 | + |
39 | + saved_lpr0 = at91_ramc_read(0, AT91_DDRSDRC_LPR); |
40 | + lpr0 = saved_lpr0 & ~AT91_DDRSDRC_LPCB; |
41 | + lpr0 |= AT91_DDRSDRC_LPCB_POWER_DOWN; |
42 | + |
43 | + at91_ramc_write(0, AT91_DDRSDRC_LPR, lpr0); |
44 | + |
45 | + cpu_do_idle(); |
46 | + |
47 | + at91_ramc_write(0, AT91_DDRSDRC_LPR, saved_lpr0); |
48 | +} |
49 | + |
50 | /* We manage both DDRAM/SDRAM controllers, we need more than one value to |
51 | * remember. |
52 | */ |
53 | @@ -323,7 +339,7 @@ static const struct of_device_id const ramc_ids[] __initconst = { |
54 | { .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby }, |
55 | { .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby }, |
56 | { .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby }, |
57 | - { .compatible = "atmel,sama5d3-ddramc", .data = at91_ddr_standby }, |
58 | + { .compatible = "atmel,sama5d3-ddramc", .data = sama5d3_ddr_standby }, |
59 | { /*sentinel*/ } |
60 | }; |
61 | |
62 | diff --git a/arch/arm64/kernel/kaslr.c b/arch/arm64/kernel/kaslr.c |
63 | index 769f24ef628c..d7e90d97f5c4 100644 |
64 | --- a/arch/arm64/kernel/kaslr.c |
65 | +++ b/arch/arm64/kernel/kaslr.c |
66 | @@ -131,11 +131,15 @@ u64 __init kaslr_early_init(u64 dt_phys, u64 modulo_offset) |
67 | /* |
68 | * The kernel Image should not extend across a 1GB/32MB/512MB alignment |
69 | * boundary (for 4KB/16KB/64KB granule kernels, respectively). If this |
70 | - * happens, increase the KASLR offset by the size of the kernel image. |
71 | + * happens, increase the KASLR offset by the size of the kernel image |
72 | + * rounded up by SWAPPER_BLOCK_SIZE. |
73 | */ |
74 | if ((((u64)_text + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT) != |
75 | - (((u64)_end + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT)) |
76 | - offset = (offset + (u64)(_end - _text)) & mask; |
77 | + (((u64)_end + offset + modulo_offset) >> SWAPPER_TABLE_SHIFT)) { |
78 | + u64 kimg_sz = _end - _text; |
79 | + offset = (offset + round_up(kimg_sz, SWAPPER_BLOCK_SIZE)) |
80 | + & mask; |
81 | + } |
82 | |
83 | if (IS_ENABLED(CONFIG_KASAN)) |
84 | /* |
85 | diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S |
86 | index 72dac0b58061..b350ac5e3111 100644 |
87 | --- a/arch/powerpc/kernel/idle_book3s.S |
88 | +++ b/arch/powerpc/kernel/idle_book3s.S |
89 | @@ -439,9 +439,23 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) |
90 | _GLOBAL(pnv_wakeup_tb_loss) |
91 | ld r1,PACAR1(r13) |
92 | /* |
93 | - * Before entering any idle state, the NVGPRs are saved in the stack |
94 | - * and they are restored before switching to the process context. Hence |
95 | - * until they are restored, they are free to be used. |
96 | + * Before entering any idle state, the NVGPRs are saved in the stack. |
97 | + * If there was a state loss, or PACA_NAPSTATELOST was set, then the |
98 | + * NVGPRs are restored. If we are here, it is likely that state is lost, |
99 | + * but not guaranteed -- neither ISA207 nor ISA300 tests to reach |
100 | + * here are the same as the test to restore NVGPRS: |
101 | + * PACA_THREAD_IDLE_STATE test for ISA207, PSSCR test for ISA300, |
102 | + * and SRR1 test for restoring NVGPRs. |
103 | + * |
104 | + * We are about to clobber NVGPRs now, so set NAPSTATELOST to |
105 | + * guarantee they will always be restored. This might be tightened |
106 | + * with careful reading of specs (particularly for ISA300) but this |
107 | + * is already a slow wakeup path and it's simpler to be safe. |
108 | + */ |
109 | + li r0,1 |
110 | + stb r0,PACA_NAPSTATELOST(r13) |
111 | + |
112 | + /* |
113 | * |
114 | * Save SRR1 and LR in NVGPRs as they might be clobbered in |
115 | * opal_call() (called in CHECK_HMI_INTERRUPT). SRR1 is required |
116 | diff --git a/block/blk-mq.c b/block/blk-mq.c |
117 | index 81caceb96c3c..ee54ad01f7ac 100644 |
118 | --- a/block/blk-mq.c |
119 | +++ b/block/blk-mq.c |
120 | @@ -629,17 +629,8 @@ static void blk_mq_check_expired(struct blk_mq_hw_ctx *hctx, |
121 | { |
122 | struct blk_mq_timeout_data *data = priv; |
123 | |
124 | - if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) { |
125 | - /* |
126 | - * If a request wasn't started before the queue was |
127 | - * marked dying, kill it here or it'll go unnoticed. |
128 | - */ |
129 | - if (unlikely(blk_queue_dying(rq->q))) { |
130 | - rq->errors = -EIO; |
131 | - blk_mq_end_request(rq, rq->errors); |
132 | - } |
133 | + if (!test_bit(REQ_ATOM_STARTED, &rq->atomic_flags)) |
134 | return; |
135 | - } |
136 | |
137 | if (time_after_eq(jiffies, rq->deadline)) { |
138 | if (!blk_mark_rq_complete(rq)) |
139 | diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c |
140 | index d19b09cdf284..54fc90e8339c 100644 |
141 | --- a/crypto/algif_hash.c |
142 | +++ b/crypto/algif_hash.c |
143 | @@ -245,7 +245,7 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags) |
144 | struct alg_sock *ask = alg_sk(sk); |
145 | struct hash_ctx *ctx = ask->private; |
146 | struct ahash_request *req = &ctx->req; |
147 | - char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req))]; |
148 | + char state[crypto_ahash_statesize(crypto_ahash_reqtfm(req)) ? : 1]; |
149 | struct sock *sk2; |
150 | struct alg_sock *ask2; |
151 | struct hash_ctx *ctx2; |
152 | diff --git a/drivers/auxdisplay/img-ascii-lcd.c b/drivers/auxdisplay/img-ascii-lcd.c |
153 | index bf43b5d2aafc..83f1439e57fd 100644 |
154 | --- a/drivers/auxdisplay/img-ascii-lcd.c |
155 | +++ b/drivers/auxdisplay/img-ascii-lcd.c |
156 | @@ -218,6 +218,7 @@ static const struct of_device_id img_ascii_lcd_matches[] = { |
157 | { .compatible = "img,boston-lcd", .data = &boston_config }, |
158 | { .compatible = "mti,malta-lcd", .data = &malta_config }, |
159 | { .compatible = "mti,sead3-lcd", .data = &sead3_config }, |
160 | + { /* sentinel */ } |
161 | }; |
162 | |
163 | /** |
164 | diff --git a/drivers/char/hw_random/amd-rng.c b/drivers/char/hw_random/amd-rng.c |
165 | index 4a99ac756f08..9959c762da2f 100644 |
166 | --- a/drivers/char/hw_random/amd-rng.c |
167 | +++ b/drivers/char/hw_random/amd-rng.c |
168 | @@ -55,6 +55,7 @@ MODULE_DEVICE_TABLE(pci, pci_tbl); |
169 | struct amd768_priv { |
170 | void __iomem *iobase; |
171 | struct pci_dev *pcidev; |
172 | + u32 pmbase; |
173 | }; |
174 | |
175 | static int amd_rng_read(struct hwrng *rng, void *buf, size_t max, bool wait) |
176 | @@ -148,33 +149,58 @@ static int __init mod_init(void) |
177 | if (pmbase == 0) |
178 | return -EIO; |
179 | |
180 | - priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); |
181 | + priv = kzalloc(sizeof(*priv), GFP_KERNEL); |
182 | if (!priv) |
183 | return -ENOMEM; |
184 | |
185 | - if (!devm_request_region(&pdev->dev, pmbase + PMBASE_OFFSET, |
186 | - PMBASE_SIZE, DRV_NAME)) { |
187 | + if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) { |
188 | dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n", |
189 | pmbase + 0xF0); |
190 | - return -EBUSY; |
191 | + err = -EBUSY; |
192 | + goto out; |
193 | } |
194 | |
195 | - priv->iobase = devm_ioport_map(&pdev->dev, pmbase + PMBASE_OFFSET, |
196 | - PMBASE_SIZE); |
197 | + priv->iobase = ioport_map(pmbase + PMBASE_OFFSET, PMBASE_SIZE); |
198 | if (!priv->iobase) { |
199 | pr_err(DRV_NAME "Cannot map ioport\n"); |
200 | - return -ENOMEM; |
201 | + err = -EINVAL; |
202 | + goto err_iomap; |
203 | } |
204 | |
205 | amd_rng.priv = (unsigned long)priv; |
206 | + priv->pmbase = pmbase; |
207 | priv->pcidev = pdev; |
208 | |
209 | pr_info(DRV_NAME " detected\n"); |
210 | - return devm_hwrng_register(&pdev->dev, &amd_rng); |
211 | + err = hwrng_register(&amd_rng); |
212 | + if (err) { |
213 | + pr_err(DRV_NAME " registering failed (%d)\n", err); |
214 | + goto err_hwrng; |
215 | + } |
216 | + return 0; |
217 | + |
218 | +err_hwrng: |
219 | + ioport_unmap(priv->iobase); |
220 | +err_iomap: |
221 | + release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE); |
222 | +out: |
223 | + kfree(priv); |
224 | + return err; |
225 | } |
226 | |
227 | static void __exit mod_exit(void) |
228 | { |
229 | + struct amd768_priv *priv; |
230 | + |
231 | + priv = (struct amd768_priv *)amd_rng.priv; |
232 | + |
233 | + hwrng_unregister(&amd_rng); |
234 | + |
235 | + ioport_unmap(priv->iobase); |
236 | + |
237 | + release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE); |
238 | + |
239 | + kfree(priv); |
240 | } |
241 | |
242 | module_init(mod_init); |
243 | diff --git a/drivers/char/hw_random/geode-rng.c b/drivers/char/hw_random/geode-rng.c |
244 | index e7a245942029..e1d421a36a13 100644 |
245 | --- a/drivers/char/hw_random/geode-rng.c |
246 | +++ b/drivers/char/hw_random/geode-rng.c |
247 | @@ -31,6 +31,9 @@ |
248 | #include <linux/module.h> |
249 | #include <linux/pci.h> |
250 | |
251 | + |
252 | +#define PFX KBUILD_MODNAME ": " |
253 | + |
254 | #define GEODE_RNG_DATA_REG 0x50 |
255 | #define GEODE_RNG_STATUS_REG 0x54 |
256 | |
257 | @@ -82,6 +85,7 @@ static struct hwrng geode_rng = { |
258 | |
259 | static int __init mod_init(void) |
260 | { |
261 | + int err = -ENODEV; |
262 | struct pci_dev *pdev = NULL; |
263 | const struct pci_device_id *ent; |
264 | void __iomem *mem; |
265 | @@ -89,27 +93,43 @@ static int __init mod_init(void) |
266 | |
267 | for_each_pci_dev(pdev) { |
268 | ent = pci_match_id(pci_tbl, pdev); |
269 | - if (ent) { |
270 | - rng_base = pci_resource_start(pdev, 0); |
271 | - if (rng_base == 0) |
272 | - return -ENODEV; |
273 | - |
274 | - mem = devm_ioremap(&pdev->dev, rng_base, 0x58); |
275 | - if (!mem) |
276 | - return -ENOMEM; |
277 | - geode_rng.priv = (unsigned long)mem; |
278 | - |
279 | - pr_info("AMD Geode RNG detected\n"); |
280 | - return devm_hwrng_register(&pdev->dev, &geode_rng); |
281 | - } |
282 | + if (ent) |
283 | + goto found; |
284 | } |
285 | - |
286 | /* Device not found. */ |
287 | - return -ENODEV; |
288 | + goto out; |
289 | + |
290 | +found: |
291 | + rng_base = pci_resource_start(pdev, 0); |
292 | + if (rng_base == 0) |
293 | + goto out; |
294 | + err = -ENOMEM; |
295 | + mem = ioremap(rng_base, 0x58); |
296 | + if (!mem) |
297 | + goto out; |
298 | + geode_rng.priv = (unsigned long)mem; |
299 | + |
300 | + pr_info("AMD Geode RNG detected\n"); |
301 | + err = hwrng_register(&geode_rng); |
302 | + if (err) { |
303 | + pr_err(PFX "RNG registering failed (%d)\n", |
304 | + err); |
305 | + goto err_unmap; |
306 | + } |
307 | +out: |
308 | + return err; |
309 | + |
310 | +err_unmap: |
311 | + iounmap(mem); |
312 | + goto out; |
313 | } |
314 | |
315 | static void __exit mod_exit(void) |
316 | { |
317 | + void __iomem *mem = (void __iomem *)geode_rng.priv; |
318 | + |
319 | + hwrng_unregister(&geode_rng); |
320 | + iounmap(mem); |
321 | } |
322 | |
323 | module_init(mod_init); |
324 | diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
325 | index fc75a335a7ce..8ca07fe8d3f3 100644 |
326 | --- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
327 | +++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c |
328 | @@ -608,7 +608,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", lcd_ch1_parents, |
329 | 0x150, 0, 4, 24, 2, BIT(31), |
330 | CLK_SET_RATE_PARENT); |
331 | |
332 | -static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 0x150, BIT(31), 0); |
333 | +static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 0x150, BIT(30), 0); |
334 | |
335 | static SUNXI_CCU_GATE(ps_clk, "ps", "lcd1-ch1", 0x140, BIT(31), 0); |
336 | |
337 | diff --git a/drivers/clk/sunxi-ng/ccu_mp.c b/drivers/clk/sunxi-ng/ccu_mp.c |
338 | index ebb1b31568a5..ee7810429c30 100644 |
339 | --- a/drivers/clk/sunxi-ng/ccu_mp.c |
340 | +++ b/drivers/clk/sunxi-ng/ccu_mp.c |
341 | @@ -85,6 +85,10 @@ static unsigned long ccu_mp_recalc_rate(struct clk_hw *hw, |
342 | unsigned int m, p; |
343 | u32 reg; |
344 | |
345 | + /* Adjust parent_rate according to pre-dividers */ |
346 | + ccu_mux_helper_adjust_parent_for_prediv(&cmp->common, &cmp->mux, |
347 | + -1, &parent_rate); |
348 | + |
349 | reg = readl(cmp->common.base + cmp->common.reg); |
350 | |
351 | m = reg >> cmp->m.shift; |
352 | @@ -114,6 +118,10 @@ static int ccu_mp_set_rate(struct clk_hw *hw, unsigned long rate, |
353 | unsigned int m, p; |
354 | u32 reg; |
355 | |
356 | + /* Adjust parent_rate according to pre-dividers */ |
357 | + ccu_mux_helper_adjust_parent_for_prediv(&cmp->common, &cmp->mux, |
358 | + -1, &parent_rate); |
359 | + |
360 | max_m = cmp->m.max ?: 1 << cmp->m.width; |
361 | max_p = cmp->p.max ?: 1 << ((1 << cmp->p.width) - 1); |
362 | |
363 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c |
364 | index 272608f102fb..cac4a92259da 100644 |
365 | --- a/drivers/cpufreq/cpufreq.c |
366 | +++ b/drivers/cpufreq/cpufreq.c |
367 | @@ -1190,6 +1190,9 @@ static int cpufreq_online(unsigned int cpu) |
368 | for_each_cpu(j, policy->related_cpus) |
369 | per_cpu(cpufreq_cpu_data, j) = policy; |
370 | write_unlock_irqrestore(&cpufreq_driver_lock, flags); |
371 | + } else { |
372 | + policy->min = policy->user_policy.min; |
373 | + policy->max = policy->user_policy.max; |
374 | } |
375 | |
376 | if (cpufreq_driver->get && !cpufreq_driver->setpolicy) { |
377 | diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c |
378 | index cafa633aae10..f796e36d7ec3 100644 |
379 | --- a/drivers/crypto/ccp/ccp-dev.c |
380 | +++ b/drivers/crypto/ccp/ccp-dev.c |
381 | @@ -283,11 +283,14 @@ EXPORT_SYMBOL_GPL(ccp_version); |
382 | */ |
383 | int ccp_enqueue_cmd(struct ccp_cmd *cmd) |
384 | { |
385 | - struct ccp_device *ccp = ccp_get_device(); |
386 | + struct ccp_device *ccp; |
387 | unsigned long flags; |
388 | unsigned int i; |
389 | int ret; |
390 | |
391 | + /* Some commands might need to be sent to a specific device */ |
392 | + ccp = cmd->ccp ? cmd->ccp : ccp_get_device(); |
393 | + |
394 | if (!ccp) |
395 | return -ENODEV; |
396 | |
397 | diff --git a/drivers/crypto/ccp/ccp-dmaengine.c b/drivers/crypto/ccp/ccp-dmaengine.c |
398 | index e5d9278f4019..8d0eeb46d4a2 100644 |
399 | --- a/drivers/crypto/ccp/ccp-dmaengine.c |
400 | +++ b/drivers/crypto/ccp/ccp-dmaengine.c |
401 | @@ -390,6 +390,7 @@ static struct ccp_dma_desc *ccp_create_desc(struct dma_chan *dma_chan, |
402 | goto err; |
403 | |
404 | ccp_cmd = &cmd->ccp_cmd; |
405 | + ccp_cmd->ccp = chan->ccp; |
406 | ccp_pt = &ccp_cmd->u.passthru_nomap; |
407 | ccp_cmd->flags = CCP_CMD_MAY_BACKLOG; |
408 | ccp_cmd->flags |= CCP_CMD_PASSTHRU_NO_DMA_MAP; |
409 | diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c |
410 | index 286447a83dab..152552d2c306 100644 |
411 | --- a/drivers/dax/dax.c |
412 | +++ b/drivers/dax/dax.c |
413 | @@ -334,6 +334,7 @@ static int __dax_dev_fault(struct dax_dev *dax_dev, struct vm_area_struct *vma, |
414 | int rc = VM_FAULT_SIGBUS; |
415 | phys_addr_t phys; |
416 | pfn_t pfn; |
417 | + unsigned int fault_size = PAGE_SIZE; |
418 | |
419 | if (check_vma(dax_dev, vma, __func__)) |
420 | return VM_FAULT_SIGBUS; |
421 | @@ -344,6 +345,9 @@ static int __dax_dev_fault(struct dax_dev *dax_dev, struct vm_area_struct *vma, |
422 | return VM_FAULT_SIGBUS; |
423 | } |
424 | |
425 | + if (fault_size != dax_region->align) |
426 | + return VM_FAULT_SIGBUS; |
427 | + |
428 | phys = pgoff_to_phys(dax_dev, vmf->pgoff, PAGE_SIZE); |
429 | if (phys == -1) { |
430 | dev_dbg(dev, "%s: phys_to_pgoff(%#lx) failed\n", __func__, |
431 | @@ -389,6 +393,7 @@ static int __dax_dev_pmd_fault(struct dax_dev *dax_dev, |
432 | phys_addr_t phys; |
433 | pgoff_t pgoff; |
434 | pfn_t pfn; |
435 | + unsigned int fault_size = PMD_SIZE; |
436 | |
437 | if (check_vma(dax_dev, vma, __func__)) |
438 | return VM_FAULT_SIGBUS; |
439 | @@ -405,6 +410,16 @@ static int __dax_dev_pmd_fault(struct dax_dev *dax_dev, |
440 | return VM_FAULT_SIGBUS; |
441 | } |
442 | |
443 | + if (fault_size < dax_region->align) |
444 | + return VM_FAULT_SIGBUS; |
445 | + else if (fault_size > dax_region->align) |
446 | + return VM_FAULT_FALLBACK; |
447 | + |
448 | + /* if we are outside of the VMA */ |
449 | + if (pmd_addr < vma->vm_start || |
450 | + (pmd_addr + PMD_SIZE) > vma->vm_end) |
451 | + return VM_FAULT_SIGBUS; |
452 | + |
453 | pgoff = linear_page_index(vma, pmd_addr); |
454 | phys = pgoff_to_phys(dax_dev, pgoff, PMD_SIZE); |
455 | if (phys == -1) { |
456 | diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
457 | index 09e6a7320bb2..6f3c89178b6a 100644 |
458 | --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
459 | +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c |
460 | @@ -3507,9 +3507,13 @@ static void si_apply_state_adjust_rules(struct amdgpu_device *adev, |
461 | max_mclk = 80000; |
462 | } |
463 | } else if (adev->asic_type == CHIP_OLAND) { |
464 | - if ((adev->pdev->device == 0x6604) && |
465 | - (adev->pdev->subsystem_vendor == 0x1028) && |
466 | - (adev->pdev->subsystem_device == 0x066F)) { |
467 | + if ((adev->pdev->revision == 0xC7) || |
468 | + (adev->pdev->revision == 0x80) || |
469 | + (adev->pdev->revision == 0x81) || |
470 | + (adev->pdev->revision == 0x83) || |
471 | + (adev->pdev->revision == 0x87) || |
472 | + (adev->pdev->device == 0x6604) || |
473 | + (adev->pdev->device == 0x6605)) { |
474 | max_sclk = 75000; |
475 | } |
476 | } |
477 | diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |
478 | index 6e0447f329a2..72ec93de0e76 100644 |
479 | --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |
480 | +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c |
481 | @@ -1382,6 +1382,7 @@ int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev, |
482 | |
483 | pm_runtime_enable(dev); |
484 | |
485 | + pm_runtime_get_sync(dev); |
486 | phy_power_on(dp->phy); |
487 | |
488 | analogix_dp_init_dp(dp); |
489 | @@ -1414,9 +1415,15 @@ int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev, |
490 | goto err_disable_pm_runtime; |
491 | } |
492 | |
493 | + phy_power_off(dp->phy); |
494 | + pm_runtime_put(dev); |
495 | + |
496 | return 0; |
497 | |
498 | err_disable_pm_runtime: |
499 | + |
500 | + phy_power_off(dp->phy); |
501 | + pm_runtime_put(dev); |
502 | pm_runtime_disable(dev); |
503 | |
504 | return ret; |
505 | diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c |
506 | index 2e42a0584a84..50acd799babe 100644 |
507 | --- a/drivers/gpu/drm/drm_atomic_helper.c |
508 | +++ b/drivers/gpu/drm/drm_atomic_helper.c |
509 | @@ -1382,6 +1382,15 @@ static int stall_checks(struct drm_crtc *crtc, bool nonblock) |
510 | return ret < 0 ? ret : 0; |
511 | } |
512 | |
513 | +void release_crtc_commit(struct completion *completion) |
514 | +{ |
515 | + struct drm_crtc_commit *commit = container_of(completion, |
516 | + typeof(*commit), |
517 | + flip_done); |
518 | + |
519 | + drm_crtc_commit_put(commit); |
520 | +} |
521 | + |
522 | /** |
523 | * drm_atomic_helper_setup_commit - setup possibly nonblocking commit |
524 | * @state: new modeset state to be committed |
525 | @@ -1474,6 +1483,8 @@ int drm_atomic_helper_setup_commit(struct drm_atomic_state *state, |
526 | } |
527 | |
528 | crtc_state->event->base.completion = &commit->flip_done; |
529 | + crtc_state->event->base.completion_release = release_crtc_commit; |
530 | + drm_crtc_commit_get(commit); |
531 | } |
532 | |
533 | return 0; |
534 | diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c |
535 | index e84faecf5225..f5815e1a4390 100644 |
536 | --- a/drivers/gpu/drm/drm_fops.c |
537 | +++ b/drivers/gpu/drm/drm_fops.c |
538 | @@ -686,8 +686,8 @@ void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e) |
539 | assert_spin_locked(&dev->event_lock); |
540 | |
541 | if (e->completion) { |
542 | - /* ->completion might disappear as soon as it signalled. */ |
543 | complete_all(e->completion); |
544 | + e->completion_release(e->completion); |
545 | e->completion = NULL; |
546 | } |
547 | |
548 | diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c |
549 | index be34547cdb68..1606e7f08f4b 100644 |
550 | --- a/drivers/hv/channel.c |
551 | +++ b/drivers/hv/channel.c |
552 | @@ -506,12 +506,15 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle) |
553 | |
554 | wait_for_completion(&info->waitevent); |
555 | |
556 | - if (channel->rescind) { |
557 | - ret = -ENODEV; |
558 | - goto post_msg_err; |
559 | - } |
560 | - |
561 | post_msg_err: |
562 | + /* |
563 | + * If the channel has been rescinded; |
564 | + * we will be awakened by the rescind |
565 | + * handler; set the error code to zero so we don't leak memory. |
566 | + */ |
567 | + if (channel->rescind) |
568 | + ret = 0; |
569 | + |
570 | spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags); |
571 | list_del(&info->msglistentry); |
572 | spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); |
573 | diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c |
574 | index cb9531541a12..d8bc4b910192 100644 |
575 | --- a/drivers/hv/channel_mgmt.c |
576 | +++ b/drivers/hv/channel_mgmt.c |
577 | @@ -779,6 +779,7 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr) |
578 | /* Allocate the channel object and save this offer. */ |
579 | newchannel = alloc_channel(); |
580 | if (!newchannel) { |
581 | + vmbus_release_relid(offer->child_relid); |
582 | pr_err("Unable to allocate channel object\n"); |
583 | return; |
584 | } |
585 | diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c |
586 | index 6f0a51a2c6ec..d439736c789b 100644 |
587 | --- a/drivers/hwtracing/intel_th/core.c |
588 | +++ b/drivers/hwtracing/intel_th/core.c |
589 | @@ -218,8 +218,10 @@ static int intel_th_output_activate(struct intel_th_device *thdev) |
590 | else |
591 | intel_th_trace_enable(thdev); |
592 | |
593 | - if (ret) |
594 | + if (ret) { |
595 | pm_runtime_put(&thdev->dev); |
596 | + module_put(thdrv->driver.owner); |
597 | + } |
598 | |
599 | return ret; |
600 | } |
601 | diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c |
602 | index c3cfacca2541..2de1f52f1b19 100644 |
603 | --- a/drivers/iio/adc/ti_am335x_adc.c |
604 | +++ b/drivers/iio/adc/ti_am335x_adc.c |
605 | @@ -151,7 +151,9 @@ static irqreturn_t tiadc_irq_h(int irq, void *private) |
606 | { |
607 | struct iio_dev *indio_dev = private; |
608 | struct tiadc_device *adc_dev = iio_priv(indio_dev); |
609 | - unsigned int status, config; |
610 | + unsigned int status, config, adc_fsm; |
611 | + unsigned short count = 0; |
612 | + |
613 | status = tiadc_readl(adc_dev, REG_IRQSTATUS); |
614 | |
615 | /* |
616 | @@ -165,6 +167,15 @@ static irqreturn_t tiadc_irq_h(int irq, void *private) |
617 | tiadc_writel(adc_dev, REG_CTRL, config); |
618 | tiadc_writel(adc_dev, REG_IRQSTATUS, IRQENB_FIFO1OVRRUN |
619 | | IRQENB_FIFO1UNDRFLW | IRQENB_FIFO1THRES); |
620 | + |
621 | + /* wait for idle state. |
622 | + * ADC needs to finish the current conversion |
623 | + * before disabling the module |
624 | + */ |
625 | + do { |
626 | + adc_fsm = tiadc_readl(adc_dev, REG_ADCFSM); |
627 | + } while (adc_fsm != 0x10 && count++ < 100); |
628 | + |
629 | tiadc_writel(adc_dev, REG_CTRL, (config | CNTRLREG_TSCSSENB)); |
630 | return IRQ_HANDLED; |
631 | } else if (status & IRQENB_FIFO1THRES) { |
632 | diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c |
633 | index a3cce3a38300..ecf592d69043 100644 |
634 | --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c |
635 | +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c |
636 | @@ -51,8 +51,6 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) |
637 | st->report_state.report_id, |
638 | st->report_state.index, |
639 | HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM); |
640 | - |
641 | - poll_value = hid_sensor_read_poll_value(st); |
642 | } else { |
643 | int val; |
644 | |
645 | @@ -89,7 +87,9 @@ static int _hid_sensor_power_state(struct hid_sensor_common *st, bool state) |
646 | sensor_hub_get_feature(st->hsdev, st->power_state.report_id, |
647 | st->power_state.index, |
648 | sizeof(state_val), &state_val); |
649 | - if (state && poll_value) |
650 | + if (state) |
651 | + poll_value = hid_sensor_read_poll_value(st); |
652 | + if (poll_value > 0) |
653 | msleep_interruptible(poll_value * 2); |
654 | |
655 | return 0; |
656 | diff --git a/drivers/iio/magnetometer/ak8974.c b/drivers/iio/magnetometer/ak8974.c |
657 | index 217353145676..dd3fcd1704f8 100644 |
658 | --- a/drivers/iio/magnetometer/ak8974.c |
659 | +++ b/drivers/iio/magnetometer/ak8974.c |
660 | @@ -767,7 +767,7 @@ static int ak8974_probe(struct i2c_client *i2c, |
661 | return ret; |
662 | } |
663 | |
664 | -static int __exit ak8974_remove(struct i2c_client *i2c) |
665 | +static int ak8974_remove(struct i2c_client *i2c) |
666 | { |
667 | struct iio_dev *indio_dev = i2c_get_clientdata(i2c); |
668 | struct ak8974 *ak8974 = iio_priv(indio_dev); |
669 | @@ -849,7 +849,7 @@ static struct i2c_driver ak8974_driver = { |
670 | .of_match_table = of_match_ptr(ak8974_of_match), |
671 | }, |
672 | .probe = ak8974_probe, |
673 | - .remove = __exit_p(ak8974_remove), |
674 | + .remove = ak8974_remove, |
675 | .id_table = ak8974_id, |
676 | }; |
677 | module_i2c_driver(ak8974_driver); |
678 | diff --git a/drivers/input/joystick/iforce/iforce-usb.c b/drivers/input/joystick/iforce/iforce-usb.c |
679 | index d96aa27dfcdc..db64adfbe1af 100644 |
680 | --- a/drivers/input/joystick/iforce/iforce-usb.c |
681 | +++ b/drivers/input/joystick/iforce/iforce-usb.c |
682 | @@ -141,6 +141,9 @@ static int iforce_usb_probe(struct usb_interface *intf, |
683 | |
684 | interface = intf->cur_altsetting; |
685 | |
686 | + if (interface->desc.bNumEndpoints < 2) |
687 | + return -ENODEV; |
688 | + |
689 | epirq = &interface->endpoint[0].desc; |
690 | epout = &interface->endpoint[1].desc; |
691 | |
692 | diff --git a/drivers/input/misc/cm109.c b/drivers/input/misc/cm109.c |
693 | index 9cc6d057c302..23c191a2a071 100644 |
694 | --- a/drivers/input/misc/cm109.c |
695 | +++ b/drivers/input/misc/cm109.c |
696 | @@ -700,6 +700,10 @@ static int cm109_usb_probe(struct usb_interface *intf, |
697 | int error = -ENOMEM; |
698 | |
699 | interface = intf->cur_altsetting; |
700 | + |
701 | + if (interface->desc.bNumEndpoints < 1) |
702 | + return -ENODEV; |
703 | + |
704 | endpoint = &interface->endpoint[0].desc; |
705 | |
706 | if (!usb_endpoint_is_int_in(endpoint)) |
707 | diff --git a/drivers/input/misc/ims-pcu.c b/drivers/input/misc/ims-pcu.c |
708 | index 9c0ea36913b4..f4e8fbec6a94 100644 |
709 | --- a/drivers/input/misc/ims-pcu.c |
710 | +++ b/drivers/input/misc/ims-pcu.c |
711 | @@ -1667,6 +1667,10 @@ static int ims_pcu_parse_cdc_data(struct usb_interface *intf, struct ims_pcu *pc |
712 | return -EINVAL; |
713 | |
714 | alt = pcu->ctrl_intf->cur_altsetting; |
715 | + |
716 | + if (alt->desc.bNumEndpoints < 1) |
717 | + return -ENODEV; |
718 | + |
719 | pcu->ep_ctrl = &alt->endpoint[0].desc; |
720 | pcu->max_ctrl_size = usb_endpoint_maxp(pcu->ep_ctrl); |
721 | |
722 | diff --git a/drivers/input/misc/yealink.c b/drivers/input/misc/yealink.c |
723 | index 79c964c075f1..6e7ff9561d92 100644 |
724 | --- a/drivers/input/misc/yealink.c |
725 | +++ b/drivers/input/misc/yealink.c |
726 | @@ -875,6 +875,10 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) |
727 | int ret, pipe, i; |
728 | |
729 | interface = intf->cur_altsetting; |
730 | + |
731 | + if (interface->desc.bNumEndpoints < 1) |
732 | + return -ENODEV; |
733 | + |
734 | endpoint = &interface->endpoint[0].desc; |
735 | if (!usb_endpoint_is_int_in(endpoint)) |
736 | return -ENODEV; |
737 | diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c |
738 | index b93fe83a0b63..518e8a7bd5f9 100644 |
739 | --- a/drivers/input/mouse/alps.c |
740 | +++ b/drivers/input/mouse/alps.c |
741 | @@ -1290,10 +1290,8 @@ static int alps_decode_ss4_v2(struct alps_fields *f, |
742 | /* handle buttons */ |
743 | if (pkt_id == SS4_PACKET_ID_STICK) { |
744 | f->ts_left = !!(SS4_BTN_V2(p) & 0x01); |
745 | - if (!(priv->flags & ALPS_BUTTONPAD)) { |
746 | - f->ts_right = !!(SS4_BTN_V2(p) & 0x02); |
747 | - f->ts_middle = !!(SS4_BTN_V2(p) & 0x04); |
748 | - } |
749 | + f->ts_right = !!(SS4_BTN_V2(p) & 0x02); |
750 | + f->ts_middle = !!(SS4_BTN_V2(p) & 0x04); |
751 | } else { |
752 | f->left = !!(SS4_BTN_V2(p) & 0x01); |
753 | if (!(priv->flags & ALPS_BUTTONPAD)) { |
754 | @@ -2461,14 +2459,34 @@ static int alps_update_device_area_ss4_v2(unsigned char otp[][4], |
755 | int num_y_electrode; |
756 | int x_pitch, y_pitch, x_phys, y_phys; |
757 | |
758 | - num_x_electrode = SS4_NUMSENSOR_XOFFSET + (otp[1][0] & 0x0F); |
759 | - num_y_electrode = SS4_NUMSENSOR_YOFFSET + ((otp[1][0] >> 4) & 0x0F); |
760 | + if (IS_SS4PLUS_DEV(priv->dev_id)) { |
761 | + num_x_electrode = |
762 | + SS4PLUS_NUMSENSOR_XOFFSET + (otp[0][2] & 0x0F); |
763 | + num_y_electrode = |
764 | + SS4PLUS_NUMSENSOR_YOFFSET + ((otp[0][2] >> 4) & 0x0F); |
765 | + |
766 | + priv->x_max = |
767 | + (num_x_electrode - 1) * SS4PLUS_COUNT_PER_ELECTRODE; |
768 | + priv->y_max = |
769 | + (num_y_electrode - 1) * SS4PLUS_COUNT_PER_ELECTRODE; |
770 | |
771 | - priv->x_max = (num_x_electrode - 1) * SS4_COUNT_PER_ELECTRODE; |
772 | - priv->y_max = (num_y_electrode - 1) * SS4_COUNT_PER_ELECTRODE; |
773 | + x_pitch = (otp[0][1] & 0x0F) + SS4PLUS_MIN_PITCH_MM; |
774 | + y_pitch = ((otp[0][1] >> 4) & 0x0F) + SS4PLUS_MIN_PITCH_MM; |
775 | |
776 | - x_pitch = ((otp[1][2] >> 2) & 0x07) + SS4_MIN_PITCH_MM; |
777 | - y_pitch = ((otp[1][2] >> 5) & 0x07) + SS4_MIN_PITCH_MM; |
778 | + } else { |
779 | + num_x_electrode = |
780 | + SS4_NUMSENSOR_XOFFSET + (otp[1][0] & 0x0F); |
781 | + num_y_electrode = |
782 | + SS4_NUMSENSOR_YOFFSET + ((otp[1][0] >> 4) & 0x0F); |
783 | + |
784 | + priv->x_max = |
785 | + (num_x_electrode - 1) * SS4_COUNT_PER_ELECTRODE; |
786 | + priv->y_max = |
787 | + (num_y_electrode - 1) * SS4_COUNT_PER_ELECTRODE; |
788 | + |
789 | + x_pitch = ((otp[1][2] >> 2) & 0x07) + SS4_MIN_PITCH_MM; |
790 | + y_pitch = ((otp[1][2] >> 5) & 0x07) + SS4_MIN_PITCH_MM; |
791 | + } |
792 | |
793 | x_phys = x_pitch * (num_x_electrode - 1); /* In 0.1 mm units */ |
794 | y_phys = y_pitch * (num_y_electrode - 1); /* In 0.1 mm units */ |
795 | @@ -2484,7 +2502,10 @@ static int alps_update_btn_info_ss4_v2(unsigned char otp[][4], |
796 | { |
797 | unsigned char is_btnless; |
798 | |
799 | - is_btnless = (otp[1][1] >> 3) & 0x01; |
800 | + if (IS_SS4PLUS_DEV(priv->dev_id)) |
801 | + is_btnless = (otp[1][0] >> 1) & 0x01; |
802 | + else |
803 | + is_btnless = (otp[1][1] >> 3) & 0x01; |
804 | |
805 | if (is_btnless) |
806 | priv->flags |= ALPS_BUTTONPAD; |
807 | @@ -2492,6 +2513,21 @@ static int alps_update_btn_info_ss4_v2(unsigned char otp[][4], |
808 | return 0; |
809 | } |
810 | |
811 | +static int alps_update_dual_info_ss4_v2(unsigned char otp[][4], |
812 | + struct alps_data *priv) |
813 | +{ |
814 | + bool is_dual = false; |
815 | + |
816 | + if (IS_SS4PLUS_DEV(priv->dev_id)) |
817 | + is_dual = (otp[0][0] >> 4) & 0x01; |
818 | + |
819 | + if (is_dual) |
820 | + priv->flags |= ALPS_DUALPOINT | |
821 | + ALPS_DUALPOINT_WITH_PRESSURE; |
822 | + |
823 | + return 0; |
824 | +} |
825 | + |
826 | static int alps_set_defaults_ss4_v2(struct psmouse *psmouse, |
827 | struct alps_data *priv) |
828 | { |
829 | @@ -2507,6 +2543,8 @@ static int alps_set_defaults_ss4_v2(struct psmouse *psmouse, |
830 | |
831 | alps_update_btn_info_ss4_v2(otp, priv); |
832 | |
833 | + alps_update_dual_info_ss4_v2(otp, priv); |
834 | + |
835 | return 0; |
836 | } |
837 | |
838 | @@ -2752,10 +2790,6 @@ static int alps_set_protocol(struct psmouse *psmouse, |
839 | if (alps_set_defaults_ss4_v2(psmouse, priv)) |
840 | return -EIO; |
841 | |
842 | - if (priv->fw_ver[1] == 0x1) |
843 | - priv->flags |= ALPS_DUALPOINT | |
844 | - ALPS_DUALPOINT_WITH_PRESSURE; |
845 | - |
846 | break; |
847 | } |
848 | |
849 | @@ -2826,10 +2860,7 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv) |
850 | ec[2] >= 0x90 && ec[2] <= 0x9d) { |
851 | protocol = &alps_v3_protocol_data; |
852 | } else if (e7[0] == 0x73 && e7[1] == 0x03 && |
853 | - e7[2] == 0x14 && ec[1] == 0x02) { |
854 | - protocol = &alps_v8_protocol_data; |
855 | - } else if (e7[0] == 0x73 && e7[1] == 0x03 && |
856 | - e7[2] == 0x28 && ec[1] == 0x01) { |
857 | + (e7[2] == 0x14 || e7[2] == 0x28)) { |
858 | protocol = &alps_v8_protocol_data; |
859 | } else { |
860 | psmouse_dbg(psmouse, |
861 | @@ -2839,7 +2870,8 @@ static int alps_identify(struct psmouse *psmouse, struct alps_data *priv) |
862 | } |
863 | |
864 | if (priv) { |
865 | - /* Save the Firmware version */ |
866 | + /* Save Device ID and Firmware version */ |
867 | + memcpy(priv->dev_id, e7, 3); |
868 | memcpy(priv->fw_ver, ec, 3); |
869 | error = alps_set_protocol(psmouse, priv, protocol); |
870 | if (error) |
871 | diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h |
872 | index b9417e2d7ad3..dbfd26073e1a 100644 |
873 | --- a/drivers/input/mouse/alps.h |
874 | +++ b/drivers/input/mouse/alps.h |
875 | @@ -54,6 +54,16 @@ enum SS4_PACKET_ID { |
876 | |
877 | #define SS4_MASK_NORMAL_BUTTONS 0x07 |
878 | |
879 | +#define SS4PLUS_COUNT_PER_ELECTRODE 128 |
880 | +#define SS4PLUS_NUMSENSOR_XOFFSET 16 |
881 | +#define SS4PLUS_NUMSENSOR_YOFFSET 5 |
882 | +#define SS4PLUS_MIN_PITCH_MM 37 |
883 | + |
884 | +#define IS_SS4PLUS_DEV(_b) (((_b[0]) == 0x73) && \ |
885 | + ((_b[1]) == 0x03) && \ |
886 | + ((_b[2]) == 0x28) \ |
887 | + ) |
888 | + |
889 | #define SS4_1F_X_V2(_b) ((_b[0] & 0x0007) | \ |
890 | ((_b[1] << 3) & 0x0078) | \ |
891 | ((_b[1] << 2) & 0x0380) | \ |
892 | @@ -263,6 +273,7 @@ struct alps_data { |
893 | int addr_command; |
894 | u16 proto_version; |
895 | u8 byte0, mask0; |
896 | + u8 dev_id[3]; |
897 | u8 fw_ver[3]; |
898 | int flags; |
899 | int x_max; |
900 | diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c |
901 | index ed1935f300a7..da5458dfb1e3 100644 |
902 | --- a/drivers/input/mouse/elan_i2c_core.c |
903 | +++ b/drivers/input/mouse/elan_i2c_core.c |
904 | @@ -218,17 +218,19 @@ static int elan_query_product(struct elan_tp_data *data) |
905 | |
906 | static int elan_check_ASUS_special_fw(struct elan_tp_data *data) |
907 | { |
908 | - if (data->ic_type != 0x0E) |
909 | - return false; |
910 | - |
911 | - switch (data->product_id) { |
912 | - case 0x05 ... 0x07: |
913 | - case 0x09: |
914 | - case 0x13: |
915 | + if (data->ic_type == 0x0E) { |
916 | + switch (data->product_id) { |
917 | + case 0x05 ... 0x07: |
918 | + case 0x09: |
919 | + case 0x13: |
920 | + return true; |
921 | + } |
922 | + } else if (data->ic_type == 0x08 && data->product_id == 0x26) { |
923 | + /* ASUS EeeBook X205TA */ |
924 | return true; |
925 | - default: |
926 | - return false; |
927 | } |
928 | + |
929 | + return false; |
930 | } |
931 | |
932 | static int __elan_initialize(struct elan_tp_data *data) |
933 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h |
934 | index 0cdd95801a25..25eab453f2b2 100644 |
935 | --- a/drivers/input/serio/i8042-x86ia64io.h |
936 | +++ b/drivers/input/serio/i8042-x86ia64io.h |
937 | @@ -120,6 +120,13 @@ static const struct dmi_system_id __initconst i8042_dmi_noloop_table[] = { |
938 | }, |
939 | }, |
940 | { |
941 | + /* Dell Embedded Box PC 3000 */ |
942 | + .matches = { |
943 | + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), |
944 | + DMI_MATCH(DMI_PRODUCT_NAME, "Embedded Box PC 3000"), |
945 | + }, |
946 | + }, |
947 | + { |
948 | /* OQO Model 01 */ |
949 | .matches = { |
950 | DMI_MATCH(DMI_SYS_VENDOR, "OQO"), |
951 | diff --git a/drivers/input/tablet/hanwang.c b/drivers/input/tablet/hanwang.c |
952 | index cd852059b99e..df4bea96d7ed 100644 |
953 | --- a/drivers/input/tablet/hanwang.c |
954 | +++ b/drivers/input/tablet/hanwang.c |
955 | @@ -340,6 +340,9 @@ static int hanwang_probe(struct usb_interface *intf, const struct usb_device_id |
956 | int error; |
957 | int i; |
958 | |
959 | + if (intf->cur_altsetting->desc.bNumEndpoints < 1) |
960 | + return -ENODEV; |
961 | + |
962 | hanwang = kzalloc(sizeof(struct hanwang), GFP_KERNEL); |
963 | input_dev = input_allocate_device(); |
964 | if (!hanwang || !input_dev) { |
965 | diff --git a/drivers/input/tablet/kbtab.c b/drivers/input/tablet/kbtab.c |
966 | index e850d7e8afbc..4d9d64908b59 100644 |
967 | --- a/drivers/input/tablet/kbtab.c |
968 | +++ b/drivers/input/tablet/kbtab.c |
969 | @@ -122,6 +122,9 @@ static int kbtab_probe(struct usb_interface *intf, const struct usb_device_id *i |
970 | struct input_dev *input_dev; |
971 | int error = -ENOMEM; |
972 | |
973 | + if (intf->cur_altsetting->desc.bNumEndpoints < 1) |
974 | + return -ENODEV; |
975 | + |
976 | kbtab = kzalloc(sizeof(struct kbtab), GFP_KERNEL); |
977 | input_dev = input_allocate_device(); |
978 | if (!kbtab || !input_dev) |
979 | diff --git a/drivers/input/touchscreen/sur40.c b/drivers/input/touchscreen/sur40.c |
980 | index aefb6e11f88a..4c0eecae065c 100644 |
981 | --- a/drivers/input/touchscreen/sur40.c |
982 | +++ b/drivers/input/touchscreen/sur40.c |
983 | @@ -527,6 +527,9 @@ static int sur40_probe(struct usb_interface *interface, |
984 | if (iface_desc->desc.bInterfaceClass != 0xFF) |
985 | return -ENODEV; |
986 | |
987 | + if (iface_desc->desc.bNumEndpoints < 5) |
988 | + return -ENODEV; |
989 | + |
990 | /* Use endpoint #4 (0x86). */ |
991 | endpoint = &iface_desc->endpoint[4].desc; |
992 | if (endpoint->bEndpointAddress != TOUCH_ENDPOINT) |
993 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c |
994 | index 34be95ee9038..b9e50c10213b 100644 |
995 | --- a/drivers/iommu/intel-iommu.c |
996 | +++ b/drivers/iommu/intel-iommu.c |
997 | @@ -915,7 +915,7 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf |
998 | * which we used for the IOMMU lookup. Strictly speaking |
999 | * we could do this for all PCI devices; we only need to |
1000 | * get the BDF# from the scope table for ACPI matches. */ |
1001 | - if (pdev->is_virtfn) |
1002 | + if (pdev && pdev->is_virtfn) |
1003 | goto got_pdev; |
1004 | |
1005 | *bus = drhd->devices[i].bus; |
1006 | diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c |
1007 | index 410a55b1c25f..1cfd7f900339 100644 |
1008 | --- a/drivers/mmc/host/sdhci-of-arasan.c |
1009 | +++ b/drivers/mmc/host/sdhci-of-arasan.c |
1010 | @@ -28,13 +28,9 @@ |
1011 | #include "sdhci-pltfm.h" |
1012 | #include <linux/of.h> |
1013 | |
1014 | -#define SDHCI_ARASAN_CLK_CTRL_OFFSET 0x2c |
1015 | #define SDHCI_ARASAN_VENDOR_REGISTER 0x78 |
1016 | |
1017 | #define VENDOR_ENHANCED_STROBE BIT(0) |
1018 | -#define CLK_CTRL_TIMEOUT_SHIFT 16 |
1019 | -#define CLK_CTRL_TIMEOUT_MASK (0xf << CLK_CTRL_TIMEOUT_SHIFT) |
1020 | -#define CLK_CTRL_TIMEOUT_MIN_EXP 13 |
1021 | |
1022 | #define PHY_CLK_TOO_SLOW_HZ 400000 |
1023 | |
1024 | @@ -163,15 +159,15 @@ static int sdhci_arasan_syscon_write(struct sdhci_host *host, |
1025 | |
1026 | static unsigned int sdhci_arasan_get_timeout_clock(struct sdhci_host *host) |
1027 | { |
1028 | - u32 div; |
1029 | unsigned long freq; |
1030 | struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); |
1031 | |
1032 | - div = readl(host->ioaddr + SDHCI_ARASAN_CLK_CTRL_OFFSET); |
1033 | - div = (div & CLK_CTRL_TIMEOUT_MASK) >> CLK_CTRL_TIMEOUT_SHIFT; |
1034 | + /* SDHCI timeout clock is in kHz */ |
1035 | + freq = DIV_ROUND_UP(clk_get_rate(pltfm_host->clk), 1000); |
1036 | |
1037 | - freq = clk_get_rate(pltfm_host->clk); |
1038 | - freq /= 1 << (CLK_CTRL_TIMEOUT_MIN_EXP + div); |
1039 | + /* or in MHz */ |
1040 | + if (host->caps & SDHCI_TIMEOUT_CLK_UNIT) |
1041 | + freq = DIV_ROUND_UP(freq, 1000); |
1042 | |
1043 | return freq; |
1044 | } |
1045 | diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c |
1046 | index a9b7fc06c434..387ae1cbf698 100644 |
1047 | --- a/drivers/mmc/host/sdhci-of-at91.c |
1048 | +++ b/drivers/mmc/host/sdhci-of-at91.c |
1049 | @@ -85,11 +85,30 @@ static void sdhci_at91_set_clock(struct sdhci_host *host, unsigned int clock) |
1050 | sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL); |
1051 | } |
1052 | |
1053 | +/* |
1054 | + * In this specific implementation of the SDHCI controller, the power register |
1055 | + * needs to have a valid voltage set even when the power supply is managed by |
1056 | + * an external regulator. |
1057 | + */ |
1058 | +static void sdhci_at91_set_power(struct sdhci_host *host, unsigned char mode, |
1059 | + unsigned short vdd) |
1060 | +{ |
1061 | + if (!IS_ERR(host->mmc->supply.vmmc)) { |
1062 | + struct mmc_host *mmc = host->mmc; |
1063 | + |
1064 | + spin_unlock_irq(&host->lock); |
1065 | + mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); |
1066 | + spin_lock_irq(&host->lock); |
1067 | + } |
1068 | + sdhci_set_power_noreg(host, mode, vdd); |
1069 | +} |
1070 | + |
1071 | static const struct sdhci_ops sdhci_at91_sama5d2_ops = { |
1072 | .set_clock = sdhci_at91_set_clock, |
1073 | .set_bus_width = sdhci_set_bus_width, |
1074 | .reset = sdhci_reset, |
1075 | .set_uhs_signaling = sdhci_set_uhs_signaling, |
1076 | + .set_power = sdhci_at91_set_power, |
1077 | }; |
1078 | |
1079 | static const struct sdhci_pltfm_data soc_data_sama5d2 = { |
1080 | diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c |
1081 | index 1d9e00a00e9f..b0b9ceb0ab01 100644 |
1082 | --- a/drivers/mmc/host/sdhci-pci-core.c |
1083 | +++ b/drivers/mmc/host/sdhci-pci-core.c |
1084 | @@ -412,6 +412,8 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode, |
1085 | if (mode == MMC_POWER_OFF) |
1086 | return; |
1087 | |
1088 | + spin_unlock_irq(&host->lock); |
1089 | + |
1090 | /* |
1091 | * Bus power might not enable after D3 -> D0 transition due to the |
1092 | * present state not yet having propagated. Retry for up to 2ms. |
1093 | @@ -424,6 +426,8 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode, |
1094 | reg |= SDHCI_POWER_ON; |
1095 | sdhci_writeb(host, reg, SDHCI_POWER_CONTROL); |
1096 | } |
1097 | + |
1098 | + spin_lock_irq(&host->lock); |
1099 | } |
1100 | |
1101 | static const struct sdhci_ops sdhci_intel_byt_ops = { |
1102 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c |
1103 | index ba637ff8aa7e..a983ba0349fb 100644 |
1104 | --- a/drivers/mmc/host/sdhci.c |
1105 | +++ b/drivers/mmc/host/sdhci.c |
1106 | @@ -1371,7 +1371,9 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock) |
1107 | return; |
1108 | } |
1109 | timeout--; |
1110 | - mdelay(1); |
1111 | + spin_unlock_irq(&host->lock); |
1112 | + usleep_range(900, 1100); |
1113 | + spin_lock_irq(&host->lock); |
1114 | } |
1115 | |
1116 | clk |= SDHCI_CLOCK_CARD_EN; |
1117 | diff --git a/drivers/mmc/host/ushc.c b/drivers/mmc/host/ushc.c |
1118 | index d2c386f09d69..1d843357422e 100644 |
1119 | --- a/drivers/mmc/host/ushc.c |
1120 | +++ b/drivers/mmc/host/ushc.c |
1121 | @@ -426,6 +426,9 @@ static int ushc_probe(struct usb_interface *intf, const struct usb_device_id *id |
1122 | struct ushc_data *ushc; |
1123 | int ret; |
1124 | |
1125 | + if (intf->cur_altsetting->desc.bNumEndpoints < 1) |
1126 | + return -ENODEV; |
1127 | + |
1128 | mmc = mmc_alloc_host(sizeof(struct ushc_data), &intf->dev); |
1129 | if (mmc == NULL) |
1130 | return -ENOMEM; |
1131 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
1132 | index bbef95973c27..1592e1cc77ce 100644 |
1133 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
1134 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h |
1135 | @@ -917,8 +917,8 @@ |
1136 | #define RX_PACKET_ATTRIBUTES_CSUM_DONE_WIDTH 1 |
1137 | #define RX_PACKET_ATTRIBUTES_VLAN_CTAG_INDEX 1 |
1138 | #define RX_PACKET_ATTRIBUTES_VLAN_CTAG_WIDTH 1 |
1139 | -#define RX_PACKET_ATTRIBUTES_INCOMPLETE_INDEX 2 |
1140 | -#define RX_PACKET_ATTRIBUTES_INCOMPLETE_WIDTH 1 |
1141 | +#define RX_PACKET_ATTRIBUTES_LAST_INDEX 2 |
1142 | +#define RX_PACKET_ATTRIBUTES_LAST_WIDTH 1 |
1143 | #define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_INDEX 3 |
1144 | #define RX_PACKET_ATTRIBUTES_CONTEXT_NEXT_WIDTH 1 |
1145 | #define RX_PACKET_ATTRIBUTES_CONTEXT_INDEX 4 |
1146 | @@ -927,6 +927,8 @@ |
1147 | #define RX_PACKET_ATTRIBUTES_RX_TSTAMP_WIDTH 1 |
1148 | #define RX_PACKET_ATTRIBUTES_RSS_HASH_INDEX 6 |
1149 | #define RX_PACKET_ATTRIBUTES_RSS_HASH_WIDTH 1 |
1150 | +#define RX_PACKET_ATTRIBUTES_FIRST_INDEX 7 |
1151 | +#define RX_PACKET_ATTRIBUTES_FIRST_WIDTH 1 |
1152 | |
1153 | #define RX_NORMAL_DESC0_OVT_INDEX 0 |
1154 | #define RX_NORMAL_DESC0_OVT_WIDTH 16 |
1155 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c |
1156 | index 1babcc11a248..ca106d4275cc 100644 |
1157 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c |
1158 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c |
1159 | @@ -1721,10 +1721,15 @@ static int xgbe_dev_read(struct xgbe_channel *channel) |
1160 | |
1161 | /* Get the header length */ |
1162 | if (XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, FD)) { |
1163 | + XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, |
1164 | + FIRST, 1); |
1165 | rdata->rx.hdr_len = XGMAC_GET_BITS_LE(rdesc->desc2, |
1166 | RX_NORMAL_DESC2, HL); |
1167 | if (rdata->rx.hdr_len) |
1168 | pdata->ext_stats.rx_split_header_packets++; |
1169 | + } else { |
1170 | + XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, |
1171 | + FIRST, 0); |
1172 | } |
1173 | |
1174 | /* Get the RSS hash */ |
1175 | @@ -1747,19 +1752,16 @@ static int xgbe_dev_read(struct xgbe_channel *channel) |
1176 | } |
1177 | } |
1178 | |
1179 | - /* Get the packet length */ |
1180 | - rdata->rx.len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL); |
1181 | - |
1182 | - if (!XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, LD)) { |
1183 | - /* Not all the data has been transferred for this packet */ |
1184 | - XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, |
1185 | - INCOMPLETE, 1); |
1186 | + /* Not all the data has been transferred for this packet */ |
1187 | + if (!XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, LD)) |
1188 | return 0; |
1189 | - } |
1190 | |
1191 | /* This is the last of the data for this packet */ |
1192 | XGMAC_SET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, |
1193 | - INCOMPLETE, 0); |
1194 | + LAST, 1); |
1195 | + |
1196 | + /* Get the packet length */ |
1197 | + rdata->rx.len = XGMAC_GET_BITS_LE(rdesc->desc3, RX_NORMAL_DESC3, PL); |
1198 | |
1199 | /* Set checksum done indicator as appropriate */ |
1200 | if (netdev->features & NETIF_F_RXCSUM) |
1201 | diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c |
1202 | index 7f9216db026f..0f0f30149e5a 100644 |
1203 | --- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c |
1204 | +++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c |
1205 | @@ -1752,13 +1752,12 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, |
1206 | { |
1207 | struct sk_buff *skb; |
1208 | u8 *packet; |
1209 | - unsigned int copy_len; |
1210 | |
1211 | skb = napi_alloc_skb(napi, rdata->rx.hdr.dma_len); |
1212 | if (!skb) |
1213 | return NULL; |
1214 | |
1215 | - /* Start with the header buffer which may contain just the header |
1216 | + /* Pull in the header buffer which may contain just the header |
1217 | * or the header plus data |
1218 | */ |
1219 | dma_sync_single_range_for_cpu(pdata->dev, rdata->rx.hdr.dma_base, |
1220 | @@ -1767,30 +1766,49 @@ static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, |
1221 | |
1222 | packet = page_address(rdata->rx.hdr.pa.pages) + |
1223 | rdata->rx.hdr.pa.pages_offset; |
1224 | - copy_len = (rdata->rx.hdr_len) ? rdata->rx.hdr_len : len; |
1225 | - copy_len = min(rdata->rx.hdr.dma_len, copy_len); |
1226 | - skb_copy_to_linear_data(skb, packet, copy_len); |
1227 | - skb_put(skb, copy_len); |
1228 | - |
1229 | - len -= copy_len; |
1230 | - if (len) { |
1231 | - /* Add the remaining data as a frag */ |
1232 | - dma_sync_single_range_for_cpu(pdata->dev, |
1233 | - rdata->rx.buf.dma_base, |
1234 | - rdata->rx.buf.dma_off, |
1235 | - rdata->rx.buf.dma_len, |
1236 | - DMA_FROM_DEVICE); |
1237 | - |
1238 | - skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, |
1239 | - rdata->rx.buf.pa.pages, |
1240 | - rdata->rx.buf.pa.pages_offset, |
1241 | - len, rdata->rx.buf.dma_len); |
1242 | - rdata->rx.buf.pa.pages = NULL; |
1243 | - } |
1244 | + skb_copy_to_linear_data(skb, packet, len); |
1245 | + skb_put(skb, len); |
1246 | |
1247 | return skb; |
1248 | } |
1249 | |
1250 | +static unsigned int xgbe_rx_buf1_len(struct xgbe_ring_data *rdata, |
1251 | + struct xgbe_packet_data *packet) |
1252 | +{ |
1253 | + /* Always zero if not the first descriptor */ |
1254 | + if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, FIRST)) |
1255 | + return 0; |
1256 | + |
1257 | + /* First descriptor with split header, return header length */ |
1258 | + if (rdata->rx.hdr_len) |
1259 | + return rdata->rx.hdr_len; |
1260 | + |
1261 | + /* First descriptor but not the last descriptor and no split header, |
1262 | + * so the full buffer was used |
1263 | + */ |
1264 | + if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, LAST)) |
1265 | + return rdata->rx.hdr.dma_len; |
1266 | + |
1267 | + /* First descriptor and last descriptor and no split header, so |
1268 | + * calculate how much of the buffer was used |
1269 | + */ |
1270 | + return min_t(unsigned int, rdata->rx.hdr.dma_len, rdata->rx.len); |
1271 | +} |
1272 | + |
1273 | +static unsigned int xgbe_rx_buf2_len(struct xgbe_ring_data *rdata, |
1274 | + struct xgbe_packet_data *packet, |
1275 | + unsigned int len) |
1276 | +{ |
1277 | + /* Always the full buffer if not the last descriptor */ |
1278 | + if (!XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, LAST)) |
1279 | + return rdata->rx.buf.dma_len; |
1280 | + |
1281 | + /* Last descriptor so calculate how much of the buffer was used |
1282 | + * for the last bit of data |
1283 | + */ |
1284 | + return rdata->rx.len - len; |
1285 | +} |
1286 | + |
1287 | static int xgbe_tx_poll(struct xgbe_channel *channel) |
1288 | { |
1289 | struct xgbe_prv_data *pdata = channel->pdata; |
1290 | @@ -1873,8 +1891,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1291 | struct napi_struct *napi; |
1292 | struct sk_buff *skb; |
1293 | struct skb_shared_hwtstamps *hwtstamps; |
1294 | - unsigned int incomplete, error, context_next, context; |
1295 | - unsigned int len, rdesc_len, max_len; |
1296 | + unsigned int last, error, context_next, context; |
1297 | + unsigned int len, buf1_len, buf2_len, max_len; |
1298 | unsigned int received = 0; |
1299 | int packet_count = 0; |
1300 | |
1301 | @@ -1884,7 +1902,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1302 | if (!ring) |
1303 | return 0; |
1304 | |
1305 | - incomplete = 0; |
1306 | + last = 0; |
1307 | context_next = 0; |
1308 | |
1309 | napi = (pdata->per_channel_irq) ? &channel->napi : &pdata->napi; |
1310 | @@ -1918,9 +1936,8 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1311 | received++; |
1312 | ring->cur++; |
1313 | |
1314 | - incomplete = XGMAC_GET_BITS(packet->attributes, |
1315 | - RX_PACKET_ATTRIBUTES, |
1316 | - INCOMPLETE); |
1317 | + last = XGMAC_GET_BITS(packet->attributes, RX_PACKET_ATTRIBUTES, |
1318 | + LAST); |
1319 | context_next = XGMAC_GET_BITS(packet->attributes, |
1320 | RX_PACKET_ATTRIBUTES, |
1321 | CONTEXT_NEXT); |
1322 | @@ -1929,7 +1946,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1323 | CONTEXT); |
1324 | |
1325 | /* Earlier error, just drain the remaining data */ |
1326 | - if ((incomplete || context_next) && error) |
1327 | + if ((!last || context_next) && error) |
1328 | goto read_again; |
1329 | |
1330 | if (error || packet->errors) { |
1331 | @@ -1941,16 +1958,22 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1332 | } |
1333 | |
1334 | if (!context) { |
1335 | - /* Length is cumulative, get this descriptor's length */ |
1336 | - rdesc_len = rdata->rx.len - len; |
1337 | - len += rdesc_len; |
1338 | + /* Get the data length in the descriptor buffers */ |
1339 | + buf1_len = xgbe_rx_buf1_len(rdata, packet); |
1340 | + len += buf1_len; |
1341 | + buf2_len = xgbe_rx_buf2_len(rdata, packet, len); |
1342 | + len += buf2_len; |
1343 | |
1344 | - if (rdesc_len && !skb) { |
1345 | + if (!skb) { |
1346 | skb = xgbe_create_skb(pdata, napi, rdata, |
1347 | - rdesc_len); |
1348 | - if (!skb) |
1349 | + buf1_len); |
1350 | + if (!skb) { |
1351 | error = 1; |
1352 | - } else if (rdesc_len) { |
1353 | + goto skip_data; |
1354 | + } |
1355 | + } |
1356 | + |
1357 | + if (buf2_len) { |
1358 | dma_sync_single_range_for_cpu(pdata->dev, |
1359 | rdata->rx.buf.dma_base, |
1360 | rdata->rx.buf.dma_off, |
1361 | @@ -1960,13 +1983,14 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1362 | skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, |
1363 | rdata->rx.buf.pa.pages, |
1364 | rdata->rx.buf.pa.pages_offset, |
1365 | - rdesc_len, |
1366 | + buf2_len, |
1367 | rdata->rx.buf.dma_len); |
1368 | rdata->rx.buf.pa.pages = NULL; |
1369 | } |
1370 | } |
1371 | |
1372 | - if (incomplete || context_next) |
1373 | +skip_data: |
1374 | + if (!last || context_next) |
1375 | goto read_again; |
1376 | |
1377 | if (!skb) |
1378 | @@ -2024,7 +2048,7 @@ static int xgbe_rx_poll(struct xgbe_channel *channel, int budget) |
1379 | } |
1380 | |
1381 | /* Check if we need to save state before leaving */ |
1382 | - if (received && (incomplete || context_next)) { |
1383 | + if (received && (!last || context_next)) { |
1384 | rdata = XGBE_GET_DESC_DATA(ring, ring->cur); |
1385 | rdata->state_saved = 1; |
1386 | rdata->state.skb = skb; |
1387 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
1388 | index a4e60e56c14f..0975af2903ef 100644 |
1389 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
1390 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c |
1391 | @@ -3402,7 +3402,8 @@ static int bcmgenet_suspend(struct device *d) |
1392 | |
1393 | bcmgenet_netif_stop(dev); |
1394 | |
1395 | - phy_suspend(priv->phydev); |
1396 | + if (!device_may_wakeup(d)) |
1397 | + phy_suspend(priv->phydev); |
1398 | |
1399 | netif_device_detach(dev); |
1400 | |
1401 | @@ -3499,7 +3500,8 @@ static int bcmgenet_resume(struct device *d) |
1402 | |
1403 | netif_device_attach(dev); |
1404 | |
1405 | - phy_resume(priv->phydev); |
1406 | + if (!device_may_wakeup(d)) |
1407 | + phy_resume(priv->phydev); |
1408 | |
1409 | if (priv->eee.eee_enabled) |
1410 | bcmgenet_eee_enable_set(dev, true); |
1411 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c |
1412 | index e87607621e62..2f9281936f0e 100644 |
1413 | --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c |
1414 | +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c |
1415 | @@ -220,20 +220,6 @@ void bcmgenet_phy_power_set(struct net_device *dev, bool enable) |
1416 | udelay(60); |
1417 | } |
1418 | |
1419 | -static void bcmgenet_internal_phy_setup(struct net_device *dev) |
1420 | -{ |
1421 | - struct bcmgenet_priv *priv = netdev_priv(dev); |
1422 | - u32 reg; |
1423 | - |
1424 | - /* Power up PHY */ |
1425 | - bcmgenet_phy_power_set(dev, true); |
1426 | - /* enable APD */ |
1427 | - reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT); |
1428 | - reg |= EXT_PWR_DN_EN_LD; |
1429 | - bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT); |
1430 | - bcmgenet_mii_reset(dev); |
1431 | -} |
1432 | - |
1433 | static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv) |
1434 | { |
1435 | u32 reg; |
1436 | @@ -281,7 +267,6 @@ int bcmgenet_mii_config(struct net_device *dev) |
1437 | |
1438 | if (priv->internal_phy) { |
1439 | phy_name = "internal PHY"; |
1440 | - bcmgenet_internal_phy_setup(dev); |
1441 | } else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) { |
1442 | phy_name = "MoCA"; |
1443 | bcmgenet_moca_phy_setup(priv); |
1444 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c |
1445 | index bfe410e8a469..3f51a44bde6b 100644 |
1446 | --- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c |
1447 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c |
1448 | @@ -367,6 +367,8 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op, |
1449 | case MLX5_CMD_OP_QUERY_VPORT_COUNTER: |
1450 | case MLX5_CMD_OP_ALLOC_Q_COUNTER: |
1451 | case MLX5_CMD_OP_QUERY_Q_COUNTER: |
1452 | + case MLX5_CMD_OP_SET_RATE_LIMIT: |
1453 | + case MLX5_CMD_OP_QUERY_RATE_LIMIT: |
1454 | case MLX5_CMD_OP_ALLOC_PD: |
1455 | case MLX5_CMD_OP_ALLOC_UAR: |
1456 | case MLX5_CMD_OP_CONFIG_INT_MODERATION: |
1457 | @@ -500,6 +502,8 @@ const char *mlx5_command_str(int command) |
1458 | MLX5_COMMAND_STR_CASE(ALLOC_Q_COUNTER); |
1459 | MLX5_COMMAND_STR_CASE(DEALLOC_Q_COUNTER); |
1460 | MLX5_COMMAND_STR_CASE(QUERY_Q_COUNTER); |
1461 | + MLX5_COMMAND_STR_CASE(SET_RATE_LIMIT); |
1462 | + MLX5_COMMAND_STR_CASE(QUERY_RATE_LIMIT); |
1463 | MLX5_COMMAND_STR_CASE(ALLOC_PD); |
1464 | MLX5_COMMAND_STR_CASE(DEALLOC_PD); |
1465 | MLX5_COMMAND_STR_CASE(ALLOC_UAR); |
1466 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |
1467 | index 796bdf06122c..7309ae3b8c7b 100644 |
1468 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |
1469 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c |
1470 | @@ -602,6 +602,10 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe, |
1471 | if (lro_num_seg > 1) { |
1472 | mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt); |
1473 | skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt, lro_num_seg); |
1474 | + /* Subtract one since we already counted this as one |
1475 | + * "regular" packet in mlx5e_complete_rx_cqe() |
1476 | + */ |
1477 | + rq->stats.packets += lro_num_seg - 1; |
1478 | rq->stats.lro_packets++; |
1479 | rq->stats.lro_bytes += cqe_bcnt; |
1480 | } |
1481 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1482 | index a543ea676de3..3fd471a41895 100644 |
1483 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1484 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1485 | @@ -427,14 +427,16 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, struct tcf_exts *exts, |
1486 | } |
1487 | |
1488 | if (is_tcf_vlan(a)) { |
1489 | - if (tcf_vlan_action(a) == VLAN_F_POP) { |
1490 | + if (tcf_vlan_action(a) == TCA_VLAN_ACT_POP) { |
1491 | attr->action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP; |
1492 | - } else if (tcf_vlan_action(a) == VLAN_F_PUSH) { |
1493 | + } else if (tcf_vlan_action(a) == TCA_VLAN_ACT_PUSH) { |
1494 | if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q)) |
1495 | return -EOPNOTSUPP; |
1496 | |
1497 | attr->action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH; |
1498 | attr->vlan = tcf_vlan_push_vid(a); |
1499 | + } else { /* action is TCA_VLAN_ACT_MODIFY */ |
1500 | + return -EOPNOTSUPP; |
1501 | } |
1502 | continue; |
1503 | } |
1504 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c |
1505 | index cfb68371c397..574311018e6f 100644 |
1506 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c |
1507 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c |
1508 | @@ -272,15 +272,18 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb) |
1509 | sq->stats.tso_bytes += skb->len - ihs; |
1510 | } |
1511 | |
1512 | + sq->stats.packets += skb_shinfo(skb)->gso_segs; |
1513 | num_bytes = skb->len + (skb_shinfo(skb)->gso_segs - 1) * ihs; |
1514 | } else { |
1515 | bf = sq->bf_budget && |
1516 | !skb->xmit_more && |
1517 | !skb_shinfo(skb)->nr_frags; |
1518 | ihs = mlx5e_get_inline_hdr_size(sq, skb, bf); |
1519 | + sq->stats.packets++; |
1520 | num_bytes = max_t(unsigned int, skb->len, ETH_ZLEN); |
1521 | } |
1522 | |
1523 | + sq->stats.bytes += num_bytes; |
1524 | wi->num_bytes = num_bytes; |
1525 | |
1526 | if (skb_vlan_tag_present(skb)) { |
1527 | @@ -377,8 +380,6 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_sq *sq, struct sk_buff *skb) |
1528 | if (bf) |
1529 | sq->bf_budget--; |
1530 | |
1531 | - sq->stats.packets++; |
1532 | - sq->stats.bytes += num_bytes; |
1533 | return NETDEV_TX_OK; |
1534 | |
1535 | dma_unmap_wqe_err: |
1536 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1537 | index 0c9ef8729ca7..7a196a07fa51 100644 |
1538 | --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1539 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c |
1540 | @@ -87,7 +87,7 @@ static struct mlx5_profile profile[] = { |
1541 | [2] = { |
1542 | .mask = MLX5_PROF_MASK_QP_SIZE | |
1543 | MLX5_PROF_MASK_MR_CACHE, |
1544 | - .log_max_qp = 17, |
1545 | + .log_max_qp = 18, |
1546 | .mr_cache[0] = { |
1547 | .size = 500, |
1548 | .limit = 250 |
1549 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
1550 | index 24d5272cdce5..0d519a9582ca 100644 |
1551 | --- a/drivers/net/usb/qmi_wwan.c |
1552 | +++ b/drivers/net/usb/qmi_wwan.c |
1553 | @@ -924,6 +924,8 @@ static const struct usb_device_id products[] = { |
1554 | {QMI_FIXED_INTF(0x413c, 0x81a9, 8)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ |
1555 | {QMI_FIXED_INTF(0x413c, 0x81b1, 8)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */ |
1556 | {QMI_FIXED_INTF(0x413c, 0x81b3, 8)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ |
1557 | + {QMI_FIXED_INTF(0x413c, 0x81b6, 8)}, /* Dell Wireless 5811e */ |
1558 | + {QMI_FIXED_INTF(0x413c, 0x81b6, 10)}, /* Dell Wireless 5811e */ |
1559 | {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
1560 | {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ |
1561 | {QMI_FIXED_INTF(0x1e0e, 0x9001, 5)}, /* SIMCom 7230E */ |
1562 | diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c |
1563 | index bc744acabf98..a2afb8ecb5bc 100644 |
1564 | --- a/drivers/net/vrf.c |
1565 | +++ b/drivers/net/vrf.c |
1566 | @@ -467,8 +467,10 @@ static void vrf_rt6_release(struct net_device *dev, struct net_vrf *vrf) |
1567 | } |
1568 | |
1569 | if (rt6_local) { |
1570 | - if (rt6_local->rt6i_idev) |
1571 | + if (rt6_local->rt6i_idev) { |
1572 | in6_dev_put(rt6_local->rt6i_idev); |
1573 | + rt6_local->rt6i_idev = NULL; |
1574 | + } |
1575 | |
1576 | dst = &rt6_local->dst; |
1577 | dev_put(dst->dev); |
1578 | diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c |
1579 | index 3c3c4f197da8..7a310c491ea5 100644 |
1580 | --- a/drivers/net/wireless/marvell/mwifiex/pcie.c |
1581 | +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c |
1582 | @@ -2700,6 +2700,21 @@ static void mwifiex_pcie_device_dump(struct mwifiex_adapter *adapter) |
1583 | schedule_work(&pcie_work); |
1584 | } |
1585 | |
1586 | +static void mwifiex_pcie_free_buffers(struct mwifiex_adapter *adapter) |
1587 | +{ |
1588 | + struct pcie_service_card *card = adapter->card; |
1589 | + const struct mwifiex_pcie_card_reg *reg = card->pcie.reg; |
1590 | + |
1591 | + if (reg->sleep_cookie) |
1592 | + mwifiex_pcie_delete_sleep_cookie_buf(adapter); |
1593 | + |
1594 | + mwifiex_pcie_delete_cmdrsp_buf(adapter); |
1595 | + mwifiex_pcie_delete_evtbd_ring(adapter); |
1596 | + mwifiex_pcie_delete_rxbd_ring(adapter); |
1597 | + mwifiex_pcie_delete_txbd_ring(adapter); |
1598 | + card->cmdrsp_buf = NULL; |
1599 | +} |
1600 | + |
1601 | /* |
1602 | * This function initializes the PCI-E host memory space, WCB rings, etc. |
1603 | * |
1604 | @@ -2812,13 +2827,6 @@ static int mwifiex_pcie_init(struct mwifiex_adapter *adapter) |
1605 | |
1606 | /* |
1607 | * This function cleans up the allocated card buffers. |
1608 | - * |
1609 | - * The following are freed by this function - |
1610 | - * - TXBD ring buffers |
1611 | - * - RXBD ring buffers |
1612 | - * - Event BD ring buffers |
1613 | - * - Command response ring buffer |
1614 | - * - Sleep cookie buffer |
1615 | */ |
1616 | static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter) |
1617 | { |
1618 | @@ -2834,6 +2842,8 @@ static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter) |
1619 | "Failed to write driver not-ready signature\n"); |
1620 | } |
1621 | |
1622 | + mwifiex_pcie_free_buffers(adapter); |
1623 | + |
1624 | if (pdev) { |
1625 | pci_iounmap(pdev, card->pci_mmap); |
1626 | pci_iounmap(pdev, card->pci_mmap1); |
1627 | @@ -3080,10 +3090,7 @@ static void mwifiex_pcie_up_dev(struct mwifiex_adapter *adapter) |
1628 | pci_iounmap(pdev, card->pci_mmap1); |
1629 | } |
1630 | |
1631 | -/* This function cleans up the PCI-E host memory space. |
1632 | - * Some code is extracted from mwifiex_unregister_dev() |
1633 | - * |
1634 | - */ |
1635 | +/* This function cleans up the PCI-E host memory space. */ |
1636 | static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter) |
1637 | { |
1638 | struct pcie_service_card *card = adapter->card; |
1639 | @@ -3095,16 +3102,8 @@ static void mwifiex_pcie_down_dev(struct mwifiex_adapter *adapter) |
1640 | adapter->seq_num = 0; |
1641 | adapter->tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K; |
1642 | |
1643 | - if (card) { |
1644 | - if (reg->sleep_cookie) |
1645 | - mwifiex_pcie_delete_sleep_cookie_buf(adapter); |
1646 | - |
1647 | - mwifiex_pcie_delete_cmdrsp_buf(adapter); |
1648 | - mwifiex_pcie_delete_evtbd_ring(adapter); |
1649 | - mwifiex_pcie_delete_rxbd_ring(adapter); |
1650 | - mwifiex_pcie_delete_txbd_ring(adapter); |
1651 | - card->cmdrsp_buf = NULL; |
1652 | - } |
1653 | + if (card) |
1654 | + mwifiex_pcie_free_buffers(adapter); |
1655 | |
1656 | return; |
1657 | } |
1658 | diff --git a/drivers/parport/share.c b/drivers/parport/share.c |
1659 | index 3308427ed9f7..4399de34054a 100644 |
1660 | --- a/drivers/parport/share.c |
1661 | +++ b/drivers/parport/share.c |
1662 | @@ -939,8 +939,10 @@ parport_register_dev_model(struct parport *port, const char *name, |
1663 | * pardevice fields. -arca |
1664 | */ |
1665 | port->ops->init_state(par_dev, par_dev->state); |
1666 | - port->proc_device = par_dev; |
1667 | - parport_device_proc_register(par_dev); |
1668 | + if (!test_and_set_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags)) { |
1669 | + port->proc_device = par_dev; |
1670 | + parport_device_proc_register(par_dev); |
1671 | + } |
1672 | |
1673 | return par_dev; |
1674 | |
1675 | diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c |
1676 | index a6c1fae7d52a..a391b50fb32f 100644 |
1677 | --- a/drivers/usb/class/usbtmc.c |
1678 | +++ b/drivers/usb/class/usbtmc.c |
1679 | @@ -1380,7 +1380,7 @@ static int usbtmc_probe(struct usb_interface *intf, |
1680 | |
1681 | dev_dbg(&intf->dev, "%s called\n", __func__); |
1682 | |
1683 | - data = kmalloc(sizeof(*data), GFP_KERNEL); |
1684 | + data = kzalloc(sizeof(*data), GFP_KERNEL); |
1685 | if (!data) |
1686 | return -ENOMEM; |
1687 | |
1688 | @@ -1443,6 +1443,13 @@ static int usbtmc_probe(struct usb_interface *intf, |
1689 | break; |
1690 | } |
1691 | } |
1692 | + |
1693 | + if (!data->bulk_out || !data->bulk_in) { |
1694 | + dev_err(&intf->dev, "bulk endpoints not found\n"); |
1695 | + retcode = -ENODEV; |
1696 | + goto err_put; |
1697 | + } |
1698 | + |
1699 | /* Find int endpoint */ |
1700 | for (n = 0; n < iface_desc->desc.bNumEndpoints; n++) { |
1701 | endpoint = &iface_desc->endpoint[n].desc; |
1702 | @@ -1468,8 +1475,10 @@ static int usbtmc_probe(struct usb_interface *intf, |
1703 | if (data->iin_ep_present) { |
1704 | /* allocate int urb */ |
1705 | data->iin_urb = usb_alloc_urb(0, GFP_KERNEL); |
1706 | - if (!data->iin_urb) |
1707 | + if (!data->iin_urb) { |
1708 | + retcode = -ENOMEM; |
1709 | goto error_register; |
1710 | + } |
1711 | |
1712 | /* will reference data in int urb */ |
1713 | kref_get(&data->kref); |
1714 | @@ -1477,8 +1486,10 @@ static int usbtmc_probe(struct usb_interface *intf, |
1715 | /* allocate buffer for interrupt in */ |
1716 | data->iin_buffer = kmalloc(data->iin_wMaxPacketSize, |
1717 | GFP_KERNEL); |
1718 | - if (!data->iin_buffer) |
1719 | + if (!data->iin_buffer) { |
1720 | + retcode = -ENOMEM; |
1721 | goto error_register; |
1722 | + } |
1723 | |
1724 | /* fill interrupt urb */ |
1725 | usb_fill_int_urb(data->iin_urb, data->usb_dev, |
1726 | @@ -1511,6 +1522,7 @@ static int usbtmc_probe(struct usb_interface *intf, |
1727 | sysfs_remove_group(&intf->dev.kobj, &capability_attr_grp); |
1728 | sysfs_remove_group(&intf->dev.kobj, &data_attr_grp); |
1729 | usbtmc_free_int(data); |
1730 | +err_put: |
1731 | kref_put(&data->kref, usbtmc_delete); |
1732 | return retcode; |
1733 | } |
1734 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
1735 | index 1f7036c8f57b..eef716bdc259 100644 |
1736 | --- a/drivers/usb/core/config.c |
1737 | +++ b/drivers/usb/core/config.c |
1738 | @@ -275,6 +275,16 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum, |
1739 | |
1740 | /* |
1741 | * Adjust bInterval for quirked devices. |
1742 | + */ |
1743 | + /* |
1744 | + * This quirk fixes bIntervals reported in ms. |
1745 | + */ |
1746 | + if (to_usb_device(ddev)->quirks & |
1747 | + USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL) { |
1748 | + n = clamp(fls(d->bInterval) + 3, i, j); |
1749 | + i = j = n; |
1750 | + } |
1751 | + /* |
1752 | * This quirk fixes bIntervals reported in |
1753 | * linear microframes. |
1754 | */ |
1755 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1756 | index aef81a16e2c8..c28ccf1b5a1f 100644 |
1757 | --- a/drivers/usb/core/hub.c |
1758 | +++ b/drivers/usb/core/hub.c |
1759 | @@ -4266,7 +4266,7 @@ static void hub_set_initial_usb2_lpm_policy(struct usb_device *udev) |
1760 | struct usb_hub *hub = usb_hub_to_struct_hub(udev->parent); |
1761 | int connect_type = USB_PORT_CONNECT_TYPE_UNKNOWN; |
1762 | |
1763 | - if (!udev->usb2_hw_lpm_capable) |
1764 | + if (!udev->usb2_hw_lpm_capable || !udev->bos) |
1765 | return; |
1766 | |
1767 | if (hub) |
1768 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
1769 | index 24f9f98968a5..96b21b0dac1e 100644 |
1770 | --- a/drivers/usb/core/quirks.c |
1771 | +++ b/drivers/usb/core/quirks.c |
1772 | @@ -170,6 +170,14 @@ static const struct usb_device_id usb_quirk_list[] = { |
1773 | /* M-Systems Flash Disk Pioneers */ |
1774 | { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME }, |
1775 | |
1776 | + /* Baum Vario Ultra */ |
1777 | + { USB_DEVICE(0x0904, 0x6101), .driver_info = |
1778 | + USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL }, |
1779 | + { USB_DEVICE(0x0904, 0x6102), .driver_info = |
1780 | + USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL }, |
1781 | + { USB_DEVICE(0x0904, 0x6103), .driver_info = |
1782 | + USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL }, |
1783 | + |
1784 | /* Keytouch QWERTY Panel keyboard */ |
1785 | { USB_DEVICE(0x0926, 0x3333), .driver_info = |
1786 | USB_QUIRK_CONFIG_INTF_STRINGS }, |
1787 | diff --git a/drivers/usb/gadget/function/f_acm.c b/drivers/usb/gadget/function/f_acm.c |
1788 | index a30766ca4226..5e3828d9dac7 100644 |
1789 | --- a/drivers/usb/gadget/function/f_acm.c |
1790 | +++ b/drivers/usb/gadget/function/f_acm.c |
1791 | @@ -535,13 +535,15 @@ static int acm_notify_serial_state(struct f_acm *acm) |
1792 | { |
1793 | struct usb_composite_dev *cdev = acm->port.func.config->cdev; |
1794 | int status; |
1795 | + __le16 serial_state; |
1796 | |
1797 | spin_lock(&acm->lock); |
1798 | if (acm->notify_req) { |
1799 | dev_dbg(&cdev->gadget->dev, "acm ttyGS%d serial state %04x\n", |
1800 | acm->port_num, acm->serial_state); |
1801 | + serial_state = cpu_to_le16(acm->serial_state); |
1802 | status = acm_cdc_notify(acm, USB_CDC_NOTIFY_SERIAL_STATE, |
1803 | - 0, &acm->serial_state, sizeof(acm->serial_state)); |
1804 | + 0, &serial_state, sizeof(acm->serial_state)); |
1805 | } else { |
1806 | acm->pending = true; |
1807 | status = 0; |
1808 | diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c |
1809 | index 29b41b5dee04..c7689d05356c 100644 |
1810 | --- a/drivers/usb/gadget/function/f_uvc.c |
1811 | +++ b/drivers/usb/gadget/function/f_uvc.c |
1812 | @@ -625,7 +625,7 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) |
1813 | uvc_ss_streaming_comp.bMaxBurst = opts->streaming_maxburst; |
1814 | uvc_ss_streaming_comp.wBytesPerInterval = |
1815 | cpu_to_le16(max_packet_size * max_packet_mult * |
1816 | - opts->streaming_maxburst); |
1817 | + (opts->streaming_maxburst + 1)); |
1818 | |
1819 | /* Allocate endpoints. */ |
1820 | ep = usb_ep_autoconfig(cdev->gadget, &uvc_control_ep); |
1821 | diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c |
1822 | index 2975e80b7a56..9a67ae39185b 100644 |
1823 | --- a/drivers/usb/misc/idmouse.c |
1824 | +++ b/drivers/usb/misc/idmouse.c |
1825 | @@ -346,6 +346,9 @@ static int idmouse_probe(struct usb_interface *interface, |
1826 | if (iface_desc->desc.bInterfaceClass != 0x0A) |
1827 | return -ENODEV; |
1828 | |
1829 | + if (iface_desc->desc.bNumEndpoints < 1) |
1830 | + return -ENODEV; |
1831 | + |
1832 | /* allocate memory for our device state and initialize it */ |
1833 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); |
1834 | if (dev == NULL) |
1835 | diff --git a/drivers/usb/misc/lvstest.c b/drivers/usb/misc/lvstest.c |
1836 | index 77176511658f..d3d124753266 100644 |
1837 | --- a/drivers/usb/misc/lvstest.c |
1838 | +++ b/drivers/usb/misc/lvstest.c |
1839 | @@ -366,6 +366,10 @@ static int lvs_rh_probe(struct usb_interface *intf, |
1840 | |
1841 | hdev = interface_to_usbdev(intf); |
1842 | desc = intf->cur_altsetting; |
1843 | + |
1844 | + if (desc->desc.bNumEndpoints < 1) |
1845 | + return -ENODEV; |
1846 | + |
1847 | endpoint = &desc->endpoint[0].desc; |
1848 | |
1849 | /* valid only for SS root hub */ |
1850 | diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c |
1851 | index 356d312add57..9ff66525924e 100644 |
1852 | --- a/drivers/usb/misc/uss720.c |
1853 | +++ b/drivers/usb/misc/uss720.c |
1854 | @@ -708,6 +708,11 @@ static int uss720_probe(struct usb_interface *intf, |
1855 | |
1856 | interface = intf->cur_altsetting; |
1857 | |
1858 | + if (interface->desc.bNumEndpoints < 3) { |
1859 | + usb_put_dev(usbdev); |
1860 | + return -ENODEV; |
1861 | + } |
1862 | + |
1863 | /* |
1864 | * Allocate parport interface |
1865 | */ |
1866 | diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c |
1867 | index d4d7c56b48c7..cb443df1113e 100644 |
1868 | --- a/drivers/usb/musb/musb_cppi41.c |
1869 | +++ b/drivers/usb/musb/musb_cppi41.c |
1870 | @@ -232,8 +232,27 @@ static void cppi41_dma_callback(void *private_data) |
1871 | transferred < cppi41_channel->packet_sz) |
1872 | cppi41_channel->prog_len = 0; |
1873 | |
1874 | - if (cppi41_channel->is_tx) |
1875 | - empty = musb_is_tx_fifo_empty(hw_ep); |
1876 | + if (cppi41_channel->is_tx) { |
1877 | + u8 type; |
1878 | + |
1879 | + if (is_host_active(musb)) |
1880 | + type = hw_ep->out_qh->type; |
1881 | + else |
1882 | + type = hw_ep->ep_in.type; |
1883 | + |
1884 | + if (type == USB_ENDPOINT_XFER_ISOC) |
1885 | + /* |
1886 | + * Don't use the early-TX-interrupt workaround below |
1887 | + * for Isoch transfter. Since Isoch are periodic |
1888 | + * transfer, by the time the next transfer is |
1889 | + * scheduled, the current one should be done already. |
1890 | + * |
1891 | + * This avoids audio playback underrun issue. |
1892 | + */ |
1893 | + empty = true; |
1894 | + else |
1895 | + empty = musb_is_tx_fifo_empty(hw_ep); |
1896 | + } |
1897 | |
1898 | if (!cppi41_channel->is_tx || empty) { |
1899 | cppi41_trans_done(cppi41_channel); |
1900 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1901 | index 42cc72e54c05..af67a0de6b5d 100644 |
1902 | --- a/drivers/usb/serial/option.c |
1903 | +++ b/drivers/usb/serial/option.c |
1904 | @@ -233,6 +233,14 @@ static void option_instat_callback(struct urb *urb); |
1905 | #define BANDRICH_PRODUCT_1012 0x1012 |
1906 | |
1907 | #define QUALCOMM_VENDOR_ID 0x05C6 |
1908 | +/* These Quectel products use Qualcomm's vendor ID */ |
1909 | +#define QUECTEL_PRODUCT_UC20 0x9003 |
1910 | +#define QUECTEL_PRODUCT_UC15 0x9090 |
1911 | + |
1912 | +#define QUECTEL_VENDOR_ID 0x2c7c |
1913 | +/* These Quectel products use Quectel's vendor ID */ |
1914 | +#define QUECTEL_PRODUCT_EC21 0x0121 |
1915 | +#define QUECTEL_PRODUCT_EC25 0x0125 |
1916 | |
1917 | #define CMOTECH_VENDOR_ID 0x16d8 |
1918 | #define CMOTECH_PRODUCT_6001 0x6001 |
1919 | @@ -1161,7 +1169,14 @@ static const struct usb_device_id option_ids[] = { |
1920 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
1921 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
1922 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
1923 | - { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9003), /* Quectel UC20 */ |
1924 | + /* Quectel products using Qualcomm vendor ID */ |
1925 | + { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC15)}, |
1926 | + { USB_DEVICE(QUALCOMM_VENDOR_ID, QUECTEL_PRODUCT_UC20), |
1927 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1928 | + /* Quectel products using Quectel vendor ID */ |
1929 | + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21), |
1930 | + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1931 | + { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25), |
1932 | .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, |
1933 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
1934 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
1935 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c |
1936 | index 696458db7e3c..38b3f0d8cd58 100644 |
1937 | --- a/drivers/usb/serial/qcserial.c |
1938 | +++ b/drivers/usb/serial/qcserial.c |
1939 | @@ -169,6 +169,8 @@ static const struct usb_device_id id_table[] = { |
1940 | {DEVICE_SWI(0x413c, 0x81a9)}, /* Dell Wireless 5808e Gobi(TM) 4G LTE Mobile Broadband Card */ |
1941 | {DEVICE_SWI(0x413c, 0x81b1)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card */ |
1942 | {DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ |
1943 | + {DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */ |
1944 | + {DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */ |
1945 | |
1946 | /* Huawei devices */ |
1947 | {DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */ |
1948 | diff --git a/drivers/usb/wusbcore/wa-hc.c b/drivers/usb/wusbcore/wa-hc.c |
1949 | index 252c7bd9218a..d01496fd27fe 100644 |
1950 | --- a/drivers/usb/wusbcore/wa-hc.c |
1951 | +++ b/drivers/usb/wusbcore/wa-hc.c |
1952 | @@ -39,6 +39,9 @@ int wa_create(struct wahc *wa, struct usb_interface *iface, |
1953 | int result; |
1954 | struct device *dev = &iface->dev; |
1955 | |
1956 | + if (iface->cur_altsetting->desc.bNumEndpoints < 3) |
1957 | + return -ENODEV; |
1958 | + |
1959 | result = wa_rpipes_create(wa); |
1960 | if (result < 0) |
1961 | goto error_rpipes_create; |
1962 | diff --git a/drivers/uwb/hwa-rc.c b/drivers/uwb/hwa-rc.c |
1963 | index 0aa6c3c29d17..35a1e777b449 100644 |
1964 | --- a/drivers/uwb/hwa-rc.c |
1965 | +++ b/drivers/uwb/hwa-rc.c |
1966 | @@ -823,6 +823,9 @@ static int hwarc_probe(struct usb_interface *iface, |
1967 | struct hwarc *hwarc; |
1968 | struct device *dev = &iface->dev; |
1969 | |
1970 | + if (iface->cur_altsetting->desc.bNumEndpoints < 1) |
1971 | + return -ENODEV; |
1972 | + |
1973 | result = -ENOMEM; |
1974 | uwb_rc = uwb_rc_alloc(); |
1975 | if (uwb_rc == NULL) { |
1976 | diff --git a/drivers/uwb/i1480/dfu/usb.c b/drivers/uwb/i1480/dfu/usb.c |
1977 | index 2bfc846ac071..6345e85822a4 100644 |
1978 | --- a/drivers/uwb/i1480/dfu/usb.c |
1979 | +++ b/drivers/uwb/i1480/dfu/usb.c |
1980 | @@ -362,6 +362,9 @@ int i1480_usb_probe(struct usb_interface *iface, const struct usb_device_id *id) |
1981 | result); |
1982 | } |
1983 | |
1984 | + if (iface->cur_altsetting->desc.bNumEndpoints < 1) |
1985 | + return -ENODEV; |
1986 | + |
1987 | result = -ENOMEM; |
1988 | i1480_usb = kzalloc(sizeof(*i1480_usb), GFP_KERNEL); |
1989 | if (i1480_usb == NULL) { |
1990 | diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c |
1991 | index b87f5cfdaea5..4db10d7990c9 100644 |
1992 | --- a/drivers/video/console/fbcon.c |
1993 | +++ b/drivers/video/console/fbcon.c |
1994 | @@ -1167,6 +1167,8 @@ static void fbcon_free_font(struct display *p, bool freefont) |
1995 | p->userfont = 0; |
1996 | } |
1997 | |
1998 | +static void set_vc_hi_font(struct vc_data *vc, bool set); |
1999 | + |
2000 | static void fbcon_deinit(struct vc_data *vc) |
2001 | { |
2002 | struct display *p = &fb_display[vc->vc_num]; |
2003 | @@ -1202,6 +1204,9 @@ static void fbcon_deinit(struct vc_data *vc) |
2004 | if (free_font) |
2005 | vc->vc_font.data = NULL; |
2006 | |
2007 | + if (vc->vc_hi_font_mask) |
2008 | + set_vc_hi_font(vc, false); |
2009 | + |
2010 | if (!con_is_bound(&fb_con)) |
2011 | fbcon_exit(); |
2012 | |
2013 | @@ -2438,32 +2443,10 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font) |
2014 | return 0; |
2015 | } |
2016 | |
2017 | -static int fbcon_do_set_font(struct vc_data *vc, int w, int h, |
2018 | - const u8 * data, int userfont) |
2019 | +/* set/clear vc_hi_font_mask and update vc attrs accordingly */ |
2020 | +static void set_vc_hi_font(struct vc_data *vc, bool set) |
2021 | { |
2022 | - struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; |
2023 | - struct fbcon_ops *ops = info->fbcon_par; |
2024 | - struct display *p = &fb_display[vc->vc_num]; |
2025 | - int resize; |
2026 | - int cnt; |
2027 | - char *old_data = NULL; |
2028 | - |
2029 | - if (con_is_visible(vc) && softback_lines) |
2030 | - fbcon_set_origin(vc); |
2031 | - |
2032 | - resize = (w != vc->vc_font.width) || (h != vc->vc_font.height); |
2033 | - if (p->userfont) |
2034 | - old_data = vc->vc_font.data; |
2035 | - if (userfont) |
2036 | - cnt = FNTCHARCNT(data); |
2037 | - else |
2038 | - cnt = 256; |
2039 | - vc->vc_font.data = (void *)(p->fontdata = data); |
2040 | - if ((p->userfont = userfont)) |
2041 | - REFCOUNT(data)++; |
2042 | - vc->vc_font.width = w; |
2043 | - vc->vc_font.height = h; |
2044 | - if (vc->vc_hi_font_mask && cnt == 256) { |
2045 | + if (!set) { |
2046 | vc->vc_hi_font_mask = 0; |
2047 | if (vc->vc_can_do_color) { |
2048 | vc->vc_complement_mask >>= 1; |
2049 | @@ -2486,7 +2469,7 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, |
2050 | ((c & 0xfe00) >> 1) | (c & 0xff); |
2051 | vc->vc_attr >>= 1; |
2052 | } |
2053 | - } else if (!vc->vc_hi_font_mask && cnt == 512) { |
2054 | + } else { |
2055 | vc->vc_hi_font_mask = 0x100; |
2056 | if (vc->vc_can_do_color) { |
2057 | vc->vc_complement_mask <<= 1; |
2058 | @@ -2518,8 +2501,38 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, |
2059 | } else |
2060 | vc->vc_video_erase_char = c & ~0x100; |
2061 | } |
2062 | - |
2063 | } |
2064 | +} |
2065 | + |
2066 | +static int fbcon_do_set_font(struct vc_data *vc, int w, int h, |
2067 | + const u8 * data, int userfont) |
2068 | +{ |
2069 | + struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; |
2070 | + struct fbcon_ops *ops = info->fbcon_par; |
2071 | + struct display *p = &fb_display[vc->vc_num]; |
2072 | + int resize; |
2073 | + int cnt; |
2074 | + char *old_data = NULL; |
2075 | + |
2076 | + if (con_is_visible(vc) && softback_lines) |
2077 | + fbcon_set_origin(vc); |
2078 | + |
2079 | + resize = (w != vc->vc_font.width) || (h != vc->vc_font.height); |
2080 | + if (p->userfont) |
2081 | + old_data = vc->vc_font.data; |
2082 | + if (userfont) |
2083 | + cnt = FNTCHARCNT(data); |
2084 | + else |
2085 | + cnt = 256; |
2086 | + vc->vc_font.data = (void *)(p->fontdata = data); |
2087 | + if ((p->userfont = userfont)) |
2088 | + REFCOUNT(data)++; |
2089 | + vc->vc_font.width = w; |
2090 | + vc->vc_font.height = h; |
2091 | + if (vc->vc_hi_font_mask && cnt == 256) |
2092 | + set_vc_hi_font(vc, false); |
2093 | + else if (!vc->vc_hi_font_mask && cnt == 512) |
2094 | + set_vc_hi_font(vc, true); |
2095 | |
2096 | if (resize) { |
2097 | int cols, rows; |
2098 | diff --git a/drivers/xen/xen-acpi-processor.c b/drivers/xen/xen-acpi-processor.c |
2099 | index 4ce10bcca18b..4b857463a2b4 100644 |
2100 | --- a/drivers/xen/xen-acpi-processor.c |
2101 | +++ b/drivers/xen/xen-acpi-processor.c |
2102 | @@ -27,10 +27,10 @@ |
2103 | #include <linux/init.h> |
2104 | #include <linux/module.h> |
2105 | #include <linux/types.h> |
2106 | +#include <linux/syscore_ops.h> |
2107 | #include <linux/acpi.h> |
2108 | #include <acpi/processor.h> |
2109 | #include <xen/xen.h> |
2110 | -#include <xen/xen-ops.h> |
2111 | #include <xen/interface/platform.h> |
2112 | #include <asm/xen/hypercall.h> |
2113 | |
2114 | @@ -466,15 +466,33 @@ static int xen_upload_processor_pm_data(void) |
2115 | return rc; |
2116 | } |
2117 | |
2118 | -static int xen_acpi_processor_resume(struct notifier_block *nb, |
2119 | - unsigned long action, void *data) |
2120 | +static void xen_acpi_processor_resume_worker(struct work_struct *dummy) |
2121 | { |
2122 | + int rc; |
2123 | + |
2124 | bitmap_zero(acpi_ids_done, nr_acpi_bits); |
2125 | - return xen_upload_processor_pm_data(); |
2126 | + |
2127 | + rc = xen_upload_processor_pm_data(); |
2128 | + if (rc != 0) |
2129 | + pr_info("ACPI data upload failed, error = %d\n", rc); |
2130 | +} |
2131 | + |
2132 | +static void xen_acpi_processor_resume(void) |
2133 | +{ |
2134 | + static DECLARE_WORK(wq, xen_acpi_processor_resume_worker); |
2135 | + |
2136 | + /* |
2137 | + * xen_upload_processor_pm_data() calls non-atomic code. |
2138 | + * However, the context for xen_acpi_processor_resume is syscore |
2139 | + * with only the boot CPU online and in an atomic context. |
2140 | + * |
2141 | + * So defer the upload for some point safer. |
2142 | + */ |
2143 | + schedule_work(&wq); |
2144 | } |
2145 | |
2146 | -struct notifier_block xen_acpi_processor_resume_nb = { |
2147 | - .notifier_call = xen_acpi_processor_resume, |
2148 | +static struct syscore_ops xap_syscore_ops = { |
2149 | + .resume = xen_acpi_processor_resume, |
2150 | }; |
2151 | |
2152 | static int __init xen_acpi_processor_init(void) |
2153 | @@ -527,7 +545,7 @@ static int __init xen_acpi_processor_init(void) |
2154 | if (rc) |
2155 | goto err_unregister; |
2156 | |
2157 | - xen_resume_notifier_register(&xen_acpi_processor_resume_nb); |
2158 | + register_syscore_ops(&xap_syscore_ops); |
2159 | |
2160 | return 0; |
2161 | err_unregister: |
2162 | @@ -544,7 +562,7 @@ static void __exit xen_acpi_processor_exit(void) |
2163 | { |
2164 | int i; |
2165 | |
2166 | - xen_resume_notifier_unregister(&xen_acpi_processor_resume_nb); |
2167 | + unregister_syscore_ops(&xap_syscore_ops); |
2168 | kfree(acpi_ids_done); |
2169 | kfree(acpi_id_present); |
2170 | kfree(acpi_id_cst_present); |
2171 | diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c |
2172 | index 37b521ed39df..73cbc01ef5ad 100644 |
2173 | --- a/fs/ext4/inline.c |
2174 | +++ b/fs/ext4/inline.c |
2175 | @@ -1157,10 +1157,9 @@ static int ext4_finish_convert_inline_dir(handle_t *handle, |
2176 | set_buffer_uptodate(dir_block); |
2177 | err = ext4_handle_dirty_dirent_node(handle, inode, dir_block); |
2178 | if (err) |
2179 | - goto out; |
2180 | + return err; |
2181 | set_buffer_verified(dir_block); |
2182 | -out: |
2183 | - return err; |
2184 | + return ext4_mark_inode_dirty(handle, inode); |
2185 | } |
2186 | |
2187 | static int ext4_convert_inline_data_nolock(handle_t *handle, |
2188 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c |
2189 | index 4448ed37181b..3eeed8f0aa06 100644 |
2190 | --- a/fs/ext4/xattr.c |
2191 | +++ b/fs/ext4/xattr.c |
2192 | @@ -131,31 +131,26 @@ static __le32 ext4_xattr_block_csum(struct inode *inode, |
2193 | } |
2194 | |
2195 | static int ext4_xattr_block_csum_verify(struct inode *inode, |
2196 | - sector_t block_nr, |
2197 | - struct ext4_xattr_header *hdr) |
2198 | + struct buffer_head *bh) |
2199 | { |
2200 | - if (ext4_has_metadata_csum(inode->i_sb) && |
2201 | - (hdr->h_checksum != ext4_xattr_block_csum(inode, block_nr, hdr))) |
2202 | - return 0; |
2203 | - return 1; |
2204 | -} |
2205 | - |
2206 | -static void ext4_xattr_block_csum_set(struct inode *inode, |
2207 | - sector_t block_nr, |
2208 | - struct ext4_xattr_header *hdr) |
2209 | -{ |
2210 | - if (!ext4_has_metadata_csum(inode->i_sb)) |
2211 | - return; |
2212 | + struct ext4_xattr_header *hdr = BHDR(bh); |
2213 | + int ret = 1; |
2214 | |
2215 | - hdr->h_checksum = ext4_xattr_block_csum(inode, block_nr, hdr); |
2216 | + if (ext4_has_metadata_csum(inode->i_sb)) { |
2217 | + lock_buffer(bh); |
2218 | + ret = (hdr->h_checksum == ext4_xattr_block_csum(inode, |
2219 | + bh->b_blocknr, hdr)); |
2220 | + unlock_buffer(bh); |
2221 | + } |
2222 | + return ret; |
2223 | } |
2224 | |
2225 | -static inline int ext4_handle_dirty_xattr_block(handle_t *handle, |
2226 | - struct inode *inode, |
2227 | - struct buffer_head *bh) |
2228 | +static void ext4_xattr_block_csum_set(struct inode *inode, |
2229 | + struct buffer_head *bh) |
2230 | { |
2231 | - ext4_xattr_block_csum_set(inode, bh->b_blocknr, BHDR(bh)); |
2232 | - return ext4_handle_dirty_metadata(handle, inode, bh); |
2233 | + if (ext4_has_metadata_csum(inode->i_sb)) |
2234 | + BHDR(bh)->h_checksum = ext4_xattr_block_csum(inode, |
2235 | + bh->b_blocknr, BHDR(bh)); |
2236 | } |
2237 | |
2238 | static inline const struct xattr_handler * |
2239 | @@ -218,7 +213,7 @@ ext4_xattr_check_block(struct inode *inode, struct buffer_head *bh) |
2240 | if (BHDR(bh)->h_magic != cpu_to_le32(EXT4_XATTR_MAGIC) || |
2241 | BHDR(bh)->h_blocks != cpu_to_le32(1)) |
2242 | return -EFSCORRUPTED; |
2243 | - if (!ext4_xattr_block_csum_verify(inode, bh->b_blocknr, BHDR(bh))) |
2244 | + if (!ext4_xattr_block_csum_verify(inode, bh)) |
2245 | return -EFSBADCRC; |
2246 | error = ext4_xattr_check_names(BFIRST(bh), bh->b_data + bh->b_size, |
2247 | bh->b_data); |
2248 | @@ -601,23 +596,22 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
2249 | } |
2250 | } |
2251 | |
2252 | + ext4_xattr_block_csum_set(inode, bh); |
2253 | /* |
2254 | * Beware of this ugliness: Releasing of xattr block references |
2255 | * from different inodes can race and so we have to protect |
2256 | * from a race where someone else frees the block (and releases |
2257 | * its journal_head) before we are done dirtying the buffer. In |
2258 | * nojournal mode this race is harmless and we actually cannot |
2259 | - * call ext4_handle_dirty_xattr_block() with locked buffer as |
2260 | + * call ext4_handle_dirty_metadata() with locked buffer as |
2261 | * that function can call sync_dirty_buffer() so for that case |
2262 | * we handle the dirtying after unlocking the buffer. |
2263 | */ |
2264 | if (ext4_handle_valid(handle)) |
2265 | - error = ext4_handle_dirty_xattr_block(handle, inode, |
2266 | - bh); |
2267 | + error = ext4_handle_dirty_metadata(handle, inode, bh); |
2268 | unlock_buffer(bh); |
2269 | if (!ext4_handle_valid(handle)) |
2270 | - error = ext4_handle_dirty_xattr_block(handle, inode, |
2271 | - bh); |
2272 | + error = ext4_handle_dirty_metadata(handle, inode, bh); |
2273 | if (IS_SYNC(inode)) |
2274 | ext4_handle_sync(handle); |
2275 | dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1)); |
2276 | @@ -846,13 +840,14 @@ ext4_xattr_block_set(handle_t *handle, struct inode *inode, |
2277 | ext4_xattr_cache_insert(ext4_mb_cache, |
2278 | bs->bh); |
2279 | } |
2280 | + ext4_xattr_block_csum_set(inode, bs->bh); |
2281 | unlock_buffer(bs->bh); |
2282 | if (error == -EFSCORRUPTED) |
2283 | goto bad_block; |
2284 | if (!error) |
2285 | - error = ext4_handle_dirty_xattr_block(handle, |
2286 | - inode, |
2287 | - bs->bh); |
2288 | + error = ext4_handle_dirty_metadata(handle, |
2289 | + inode, |
2290 | + bs->bh); |
2291 | if (error) |
2292 | goto cleanup; |
2293 | goto inserted; |
2294 | @@ -950,10 +945,11 @@ ext4_xattr_block_set(handle_t *handle, struct inode *inode, |
2295 | ce->e_reusable = 0; |
2296 | ea_bdebug(new_bh, "reusing; refcount now=%d", |
2297 | ref); |
2298 | + ext4_xattr_block_csum_set(inode, new_bh); |
2299 | unlock_buffer(new_bh); |
2300 | - error = ext4_handle_dirty_xattr_block(handle, |
2301 | - inode, |
2302 | - new_bh); |
2303 | + error = ext4_handle_dirty_metadata(handle, |
2304 | + inode, |
2305 | + new_bh); |
2306 | if (error) |
2307 | goto cleanup_dquot; |
2308 | } |
2309 | @@ -1003,11 +999,12 @@ ext4_xattr_block_set(handle_t *handle, struct inode *inode, |
2310 | goto getblk_failed; |
2311 | } |
2312 | memcpy(new_bh->b_data, s->base, new_bh->b_size); |
2313 | + ext4_xattr_block_csum_set(inode, new_bh); |
2314 | set_buffer_uptodate(new_bh); |
2315 | unlock_buffer(new_bh); |
2316 | ext4_xattr_cache_insert(ext4_mb_cache, new_bh); |
2317 | - error = ext4_handle_dirty_xattr_block(handle, |
2318 | - inode, new_bh); |
2319 | + error = ext4_handle_dirty_metadata(handle, inode, |
2320 | + new_bh); |
2321 | if (error) |
2322 | goto cleanup; |
2323 | } |
2324 | diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c |
2325 | index 927da4956a89..7d4b557f1962 100644 |
2326 | --- a/fs/jbd2/journal.c |
2327 | +++ b/fs/jbd2/journal.c |
2328 | @@ -1125,10 +1125,8 @@ static journal_t *journal_init_common(struct block_device *bdev, |
2329 | |
2330 | /* Set up a default-sized revoke table for the new mount. */ |
2331 | err = jbd2_journal_init_revoke(journal, JOURNAL_REVOKE_DEFAULT_HASH); |
2332 | - if (err) { |
2333 | - kfree(journal); |
2334 | - return NULL; |
2335 | - } |
2336 | + if (err) |
2337 | + goto err_cleanup; |
2338 | |
2339 | spin_lock_init(&journal->j_history_lock); |
2340 | |
2341 | @@ -1145,23 +1143,25 @@ static journal_t *journal_init_common(struct block_device *bdev, |
2342 | journal->j_wbufsize = n; |
2343 | journal->j_wbuf = kmalloc_array(n, sizeof(struct buffer_head *), |
2344 | GFP_KERNEL); |
2345 | - if (!journal->j_wbuf) { |
2346 | - kfree(journal); |
2347 | - return NULL; |
2348 | - } |
2349 | + if (!journal->j_wbuf) |
2350 | + goto err_cleanup; |
2351 | |
2352 | bh = getblk_unmovable(journal->j_dev, start, journal->j_blocksize); |
2353 | if (!bh) { |
2354 | pr_err("%s: Cannot get buffer for journal superblock\n", |
2355 | __func__); |
2356 | - kfree(journal->j_wbuf); |
2357 | - kfree(journal); |
2358 | - return NULL; |
2359 | + goto err_cleanup; |
2360 | } |
2361 | journal->j_sb_buffer = bh; |
2362 | journal->j_superblock = (journal_superblock_t *)bh->b_data; |
2363 | |
2364 | return journal; |
2365 | + |
2366 | +err_cleanup: |
2367 | + kfree(journal->j_wbuf); |
2368 | + jbd2_journal_destroy_revoke(journal); |
2369 | + kfree(journal); |
2370 | + return NULL; |
2371 | } |
2372 | |
2373 | /* jbd2_journal_init_dev and jbd2_journal_init_inode: |
2374 | diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c |
2375 | index 91171dc352cb..3cd73059da9a 100644 |
2376 | --- a/fs/jbd2/revoke.c |
2377 | +++ b/fs/jbd2/revoke.c |
2378 | @@ -280,6 +280,7 @@ int jbd2_journal_init_revoke(journal_t *journal, int hash_size) |
2379 | |
2380 | fail1: |
2381 | jbd2_journal_destroy_revoke_table(journal->j_revoke_table[0]); |
2382 | + journal->j_revoke_table[0] = NULL; |
2383 | fail0: |
2384 | return -ENOMEM; |
2385 | } |
2386 | diff --git a/include/drm/drmP.h b/include/drm/drmP.h |
2387 | index 672644031bd5..e9fb2e802feb 100644 |
2388 | --- a/include/drm/drmP.h |
2389 | +++ b/include/drm/drmP.h |
2390 | @@ -361,6 +361,7 @@ struct drm_ioctl_desc { |
2391 | /* Event queued up for userspace to read */ |
2392 | struct drm_pending_event { |
2393 | struct completion *completion; |
2394 | + void (*completion_release)(struct completion *completion); |
2395 | struct drm_event *event; |
2396 | struct fence *fence; |
2397 | struct list_head link; |
2398 | diff --git a/include/linux/ccp.h b/include/linux/ccp.h |
2399 | index a7653339fedb..edc5d04b9632 100644 |
2400 | --- a/include/linux/ccp.h |
2401 | +++ b/include/linux/ccp.h |
2402 | @@ -556,7 +556,7 @@ enum ccp_engine { |
2403 | * struct ccp_cmd - CPP operation request |
2404 | * @entry: list element (ccp driver use only) |
2405 | * @work: work element used for callbacks (ccp driver use only) |
2406 | - * @ccp: CCP device to be run on (ccp driver use only) |
2407 | + * @ccp: CCP device to be run on |
2408 | * @ret: operation return code (ccp driver use only) |
2409 | * @flags: cmd processing flags |
2410 | * @engine: CCP operation to perform |
2411 | diff --git a/include/linux/iio/sw_device.h b/include/linux/iio/sw_device.h |
2412 | index 23ca41515527..fa7931933067 100644 |
2413 | --- a/include/linux/iio/sw_device.h |
2414 | +++ b/include/linux/iio/sw_device.h |
2415 | @@ -62,7 +62,7 @@ void iio_swd_group_init_type_name(struct iio_sw_device *d, |
2416 | const char *name, |
2417 | struct config_item_type *type) |
2418 | { |
2419 | -#ifdef CONFIG_CONFIGFS_FS |
2420 | +#if IS_ENABLED(CONFIG_CONFIGFS_FS) |
2421 | config_group_init_type_name(&d->group, name, type); |
2422 | #endif |
2423 | } |
2424 | diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h |
2425 | index 1d0043dc34e4..de2a722fe3cf 100644 |
2426 | --- a/include/linux/usb/quirks.h |
2427 | +++ b/include/linux/usb/quirks.h |
2428 | @@ -50,4 +50,10 @@ |
2429 | /* device can't handle Link Power Management */ |
2430 | #define USB_QUIRK_NO_LPM BIT(10) |
2431 | |
2432 | +/* |
2433 | + * Device reports its bInterval as linear frames instead of the |
2434 | + * USB 2.0 calculation. |
2435 | + */ |
2436 | +#define USB_QUIRK_LINEAR_FRAME_INTR_BINTERVAL BIT(11) |
2437 | + |
2438 | #endif /* __LINUX_USB_QUIRKS_H */ |
2439 | diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c |
2440 | index d2436880b305..d3f6c26425b3 100644 |
2441 | --- a/net/ceph/osdmap.c |
2442 | +++ b/net/ceph/osdmap.c |
2443 | @@ -1334,7 +1334,6 @@ static int decode_new_up_state_weight(void **p, void *end, |
2444 | if ((map->osd_state[osd] & CEPH_OSD_EXISTS) && |
2445 | (xorstate & CEPH_OSD_EXISTS)) { |
2446 | pr_info("osd%d does not exist\n", osd); |
2447 | - map->osd_weight[osd] = CEPH_OSD_IN; |
2448 | ret = set_primary_affinity(map, osd, |
2449 | CEPH_OSD_DEFAULT_PRIMARY_AFFINITY); |
2450 | if (ret) |
2451 | diff --git a/net/core/netclassid_cgroup.c b/net/core/netclassid_cgroup.c |
2452 | index 11fce17274f6..46e8830c1979 100644 |
2453 | --- a/net/core/netclassid_cgroup.c |
2454 | +++ b/net/core/netclassid_cgroup.c |
2455 | @@ -69,27 +69,17 @@ static int update_classid_sock(const void *v, struct file *file, unsigned n) |
2456 | return 0; |
2457 | } |
2458 | |
2459 | -static void update_classid(struct cgroup_subsys_state *css, void *v) |
2460 | +static void cgrp_attach(struct cgroup_taskset *tset) |
2461 | { |
2462 | - struct css_task_iter it; |
2463 | + struct cgroup_subsys_state *css; |
2464 | struct task_struct *p; |
2465 | |
2466 | - css_task_iter_start(css, &it); |
2467 | - while ((p = css_task_iter_next(&it))) { |
2468 | + cgroup_taskset_for_each(p, css, tset) { |
2469 | task_lock(p); |
2470 | - iterate_fd(p->files, 0, update_classid_sock, v); |
2471 | + iterate_fd(p->files, 0, update_classid_sock, |
2472 | + (void *)(unsigned long)css_cls_state(css)->classid); |
2473 | task_unlock(p); |
2474 | } |
2475 | - css_task_iter_end(&it); |
2476 | -} |
2477 | - |
2478 | -static void cgrp_attach(struct cgroup_taskset *tset) |
2479 | -{ |
2480 | - struct cgroup_subsys_state *css; |
2481 | - |
2482 | - cgroup_taskset_first(tset, &css); |
2483 | - update_classid(css, |
2484 | - (void *)(unsigned long)css_cls_state(css)->classid); |
2485 | } |
2486 | |
2487 | static u64 read_classid(struct cgroup_subsys_state *css, struct cftype *cft) |
2488 | @@ -101,12 +91,22 @@ static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft, |
2489 | u64 value) |
2490 | { |
2491 | struct cgroup_cls_state *cs = css_cls_state(css); |
2492 | + struct css_task_iter it; |
2493 | + struct task_struct *p; |
2494 | |
2495 | cgroup_sk_alloc_disable(); |
2496 | |
2497 | cs->classid = (u32)value; |
2498 | |
2499 | - update_classid(css, (void *)(unsigned long)cs->classid); |
2500 | + css_task_iter_start(css, &it); |
2501 | + while ((p = css_task_iter_next(&it))) { |
2502 | + task_lock(p); |
2503 | + iterate_fd(p->files, 0, update_classid_sock, |
2504 | + (void *)(unsigned long)cs->classid); |
2505 | + task_unlock(p); |
2506 | + } |
2507 | + css_task_iter_end(&it); |
2508 | + |
2509 | return 0; |
2510 | } |
2511 | |
2512 | diff --git a/net/core/sock.c b/net/core/sock.c |
2513 | index bc6543f7de36..470a2043b846 100644 |
2514 | --- a/net/core/sock.c |
2515 | +++ b/net/core/sock.c |
2516 | @@ -1437,6 +1437,11 @@ static void __sk_destruct(struct rcu_head *head) |
2517 | pr_debug("%s: optmem leakage (%d bytes) detected\n", |
2518 | __func__, atomic_read(&sk->sk_omem_alloc)); |
2519 | |
2520 | + if (sk->sk_frag.page) { |
2521 | + put_page(sk->sk_frag.page); |
2522 | + sk->sk_frag.page = NULL; |
2523 | + } |
2524 | + |
2525 | if (sk->sk_peer_cred) |
2526 | put_cred(sk->sk_peer_cred); |
2527 | put_pid(sk->sk_peer_pid); |
2528 | @@ -1533,6 +1538,12 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) |
2529 | is_charged = sk_filter_charge(newsk, filter); |
2530 | |
2531 | if (unlikely(!is_charged || xfrm_sk_clone_policy(newsk, sk))) { |
2532 | + /* We need to make sure that we don't uncharge the new |
2533 | + * socket if we couldn't charge it in the first place |
2534 | + * as otherwise we uncharge the parent's filter. |
2535 | + */ |
2536 | + if (!is_charged) |
2537 | + RCU_INIT_POINTER(newsk->sk_filter, NULL); |
2538 | /* It is still raw copy of parent, so invalidate |
2539 | * destructor and make plain sk_free() */ |
2540 | newsk->sk_destruct = NULL; |
2541 | @@ -2738,11 +2749,6 @@ void sk_common_release(struct sock *sk) |
2542 | |
2543 | sk_refcnt_debug_release(sk); |
2544 | |
2545 | - if (sk->sk_frag.page) { |
2546 | - put_page(sk->sk_frag.page); |
2547 | - sk->sk_frag.page = NULL; |
2548 | - } |
2549 | - |
2550 | sock_put(sk); |
2551 | } |
2552 | EXPORT_SYMBOL(sk_common_release); |
2553 | diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c |
2554 | index 5b03d7f3b255..6789e48b7085 100644 |
2555 | --- a/net/ipv4/fib_frontend.c |
2556 | +++ b/net/ipv4/fib_frontend.c |
2557 | @@ -1081,7 +1081,8 @@ static void nl_fib_input(struct sk_buff *skb) |
2558 | |
2559 | net = sock_net(skb->sk); |
2560 | nlh = nlmsg_hdr(skb); |
2561 | - if (skb->len < NLMSG_HDRLEN || skb->len < nlh->nlmsg_len || |
2562 | + if (skb->len < nlmsg_total_size(sizeof(*frn)) || |
2563 | + skb->len < nlh->nlmsg_len || |
2564 | nlmsg_len(nlh) < sizeof(*frn)) |
2565 | return; |
2566 | |
2567 | diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c |
2568 | index ce42ded59958..7727ffeaaf9d 100644 |
2569 | --- a/net/ipv4/tcp_input.c |
2570 | +++ b/net/ipv4/tcp_input.c |
2571 | @@ -5571,6 +5571,7 @@ void tcp_finish_connect(struct sock *sk, struct sk_buff *skb) |
2572 | struct inet_connection_sock *icsk = inet_csk(sk); |
2573 | |
2574 | tcp_set_state(sk, TCP_ESTABLISHED); |
2575 | + icsk->icsk_ack.lrcvtime = tcp_time_stamp; |
2576 | |
2577 | if (skb) { |
2578 | icsk->icsk_af_ops->sk_rx_dst_set(sk, skb); |
2579 | @@ -5789,7 +5790,6 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, |
2580 | * to stand against the temptation 8) --ANK |
2581 | */ |
2582 | inet_csk_schedule_ack(sk); |
2583 | - icsk->icsk_ack.lrcvtime = tcp_time_stamp; |
2584 | tcp_enter_quickack_mode(sk); |
2585 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
2586 | TCP_DELACK_MAX, TCP_RTO_MAX); |
2587 | diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c |
2588 | index 6234ebaa7db1..8615a6b8550f 100644 |
2589 | --- a/net/ipv4/tcp_minisocks.c |
2590 | +++ b/net/ipv4/tcp_minisocks.c |
2591 | @@ -466,6 +466,7 @@ struct sock *tcp_create_openreq_child(const struct sock *sk, |
2592 | newtp->mdev_us = jiffies_to_usecs(TCP_TIMEOUT_INIT); |
2593 | minmax_reset(&newtp->rtt_min, tcp_time_stamp, ~0U); |
2594 | newicsk->icsk_rto = TCP_TIMEOUT_INIT; |
2595 | + newicsk->icsk_ack.lrcvtime = tcp_time_stamp; |
2596 | |
2597 | newtp->packets_out = 0; |
2598 | newtp->retrans_out = 0; |
2599 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c |
2600 | index e4a8000d59ad..40a289f78d77 100644 |
2601 | --- a/net/ipv6/udp.c |
2602 | +++ b/net/ipv6/udp.c |
2603 | @@ -1037,6 +1037,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
2604 | ipc6.hlimit = -1; |
2605 | ipc6.tclass = -1; |
2606 | ipc6.dontfrag = -1; |
2607 | + sockc.tsflags = sk->sk_tsflags; |
2608 | |
2609 | /* destination address check */ |
2610 | if (sin6) { |
2611 | @@ -1156,7 +1157,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) |
2612 | fl6.flowi6_oif = np->sticky_pktinfo.ipi6_ifindex; |
2613 | |
2614 | fl6.flowi6_mark = sk->sk_mark; |
2615 | - sockc.tsflags = sk->sk_tsflags; |
2616 | |
2617 | if (msg->msg_controllen) { |
2618 | opt = &opt_space; |
2619 | diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c |
2620 | index ae25ded82b3b..07925418c2a5 100644 |
2621 | --- a/net/openvswitch/flow_netlink.c |
2622 | +++ b/net/openvswitch/flow_netlink.c |
2623 | @@ -588,7 +588,7 @@ static int ip_tun_from_nlattr(const struct nlattr *attr, |
2624 | ipv4 = true; |
2625 | break; |
2626 | case OVS_TUNNEL_KEY_ATTR_IPV6_SRC: |
2627 | - SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.dst, |
2628 | + SW_FLOW_KEY_PUT(match, tun_key.u.ipv6.src, |
2629 | nla_get_in6_addr(a), is_mask); |
2630 | ipv6 = true; |
2631 | break; |
2632 | @@ -649,6 +649,8 @@ static int ip_tun_from_nlattr(const struct nlattr *attr, |
2633 | tun_flags |= TUNNEL_VXLAN_OPT; |
2634 | opts_type = type; |
2635 | break; |
2636 | + case OVS_TUNNEL_KEY_ATTR_PAD: |
2637 | + break; |
2638 | default: |
2639 | OVS_NLERR(log, "Unknown IP tunnel attribute %d", |
2640 | type); |
2641 | diff --git a/net/unix/garbage.c b/net/unix/garbage.c |
2642 | index 6a0d48525fcf..c36757e72844 100644 |
2643 | --- a/net/unix/garbage.c |
2644 | +++ b/net/unix/garbage.c |
2645 | @@ -146,6 +146,7 @@ void unix_notinflight(struct user_struct *user, struct file *fp) |
2646 | if (s) { |
2647 | struct unix_sock *u = unix_sk(s); |
2648 | |
2649 | + BUG_ON(!atomic_long_read(&u->inflight)); |
2650 | BUG_ON(list_empty(&u->link)); |
2651 | |
2652 | if (atomic_long_dec_and_test(&u->inflight)) |
2653 | @@ -341,6 +342,14 @@ void unix_gc(void) |
2654 | } |
2655 | list_del(&cursor); |
2656 | |
2657 | + /* Now gc_candidates contains only garbage. Restore original |
2658 | + * inflight counters for these as well, and remove the skbuffs |
2659 | + * which are creating the cycle(s). |
2660 | + */ |
2661 | + skb_queue_head_init(&hitlist); |
2662 | + list_for_each_entry(u, &gc_candidates, link) |
2663 | + scan_children(&u->sk, inc_inflight, &hitlist); |
2664 | + |
2665 | /* not_cycle_list contains those sockets which do not make up a |
2666 | * cycle. Restore these to the inflight list. |
2667 | */ |
2668 | @@ -350,14 +359,6 @@ void unix_gc(void) |
2669 | list_move_tail(&u->link, &gc_inflight_list); |
2670 | } |
2671 | |
2672 | - /* Now gc_candidates contains only garbage. Restore original |
2673 | - * inflight counters for these as well, and remove the skbuffs |
2674 | - * which are creating the cycle(s). |
2675 | - */ |
2676 | - skb_queue_head_init(&hitlist); |
2677 | - list_for_each_entry(u, &gc_candidates, link) |
2678 | - scan_children(&u->sk, inc_inflight, &hitlist); |
2679 | - |
2680 | spin_unlock(&unix_gc_lock); |
2681 | |
2682 | /* Here we are. Hitlist is filled. Die. */ |
2683 | diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c |
2684 | index cd7a419faa21..e7a3068a1c3b 100644 |
2685 | --- a/net/wireless/nl80211.c |
2686 | +++ b/net/wireless/nl80211.c |
2687 | @@ -548,21 +548,17 @@ static int nl80211_prepare_wdev_dump(struct sk_buff *skb, |
2688 | { |
2689 | int err; |
2690 | |
2691 | - rtnl_lock(); |
2692 | - |
2693 | if (!cb->args[0]) { |
2694 | err = nlmsg_parse(cb->nlh, GENL_HDRLEN + nl80211_fam.hdrsize, |
2695 | nl80211_fam.attrbuf, nl80211_fam.maxattr, |
2696 | nl80211_policy); |
2697 | if (err) |
2698 | - goto out_unlock; |
2699 | + return err; |
2700 | |
2701 | *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), |
2702 | nl80211_fam.attrbuf); |
2703 | - if (IS_ERR(*wdev)) { |
2704 | - err = PTR_ERR(*wdev); |
2705 | - goto out_unlock; |
2706 | - } |
2707 | + if (IS_ERR(*wdev)) |
2708 | + return PTR_ERR(*wdev); |
2709 | *rdev = wiphy_to_rdev((*wdev)->wiphy); |
2710 | /* 0 is the first index - add 1 to parse only once */ |
2711 | cb->args[0] = (*rdev)->wiphy_idx + 1; |
2712 | @@ -572,10 +568,8 @@ static int nl80211_prepare_wdev_dump(struct sk_buff *skb, |
2713 | struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); |
2714 | struct wireless_dev *tmp; |
2715 | |
2716 | - if (!wiphy) { |
2717 | - err = -ENODEV; |
2718 | - goto out_unlock; |
2719 | - } |
2720 | + if (!wiphy) |
2721 | + return -ENODEV; |
2722 | *rdev = wiphy_to_rdev(wiphy); |
2723 | *wdev = NULL; |
2724 | |
2725 | @@ -586,21 +580,11 @@ static int nl80211_prepare_wdev_dump(struct sk_buff *skb, |
2726 | } |
2727 | } |
2728 | |
2729 | - if (!*wdev) { |
2730 | - err = -ENODEV; |
2731 | - goto out_unlock; |
2732 | - } |
2733 | + if (!*wdev) |
2734 | + return -ENODEV; |
2735 | } |
2736 | |
2737 | return 0; |
2738 | - out_unlock: |
2739 | - rtnl_unlock(); |
2740 | - return err; |
2741 | -} |
2742 | - |
2743 | -static void nl80211_finish_wdev_dump(struct cfg80211_registered_device *rdev) |
2744 | -{ |
2745 | - rtnl_unlock(); |
2746 | } |
2747 | |
2748 | /* IE validation */ |
2749 | @@ -2584,17 +2568,17 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback * |
2750 | int filter_wiphy = -1; |
2751 | struct cfg80211_registered_device *rdev; |
2752 | struct wireless_dev *wdev; |
2753 | + int ret; |
2754 | |
2755 | rtnl_lock(); |
2756 | if (!cb->args[2]) { |
2757 | struct nl80211_dump_wiphy_state state = { |
2758 | .filter_wiphy = -1, |
2759 | }; |
2760 | - int ret; |
2761 | |
2762 | ret = nl80211_dump_wiphy_parse(skb, cb, &state); |
2763 | if (ret) |
2764 | - return ret; |
2765 | + goto out_unlock; |
2766 | |
2767 | filter_wiphy = state.filter_wiphy; |
2768 | |
2769 | @@ -2639,12 +2623,14 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback * |
2770 | wp_idx++; |
2771 | } |
2772 | out: |
2773 | - rtnl_unlock(); |
2774 | - |
2775 | cb->args[0] = wp_idx; |
2776 | cb->args[1] = if_idx; |
2777 | |
2778 | - return skb->len; |
2779 | + ret = skb->len; |
2780 | + out_unlock: |
2781 | + rtnl_unlock(); |
2782 | + |
2783 | + return ret; |
2784 | } |
2785 | |
2786 | static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info) |
2787 | @@ -4371,9 +4357,10 @@ static int nl80211_dump_station(struct sk_buff *skb, |
2788 | int sta_idx = cb->args[2]; |
2789 | int err; |
2790 | |
2791 | + rtnl_lock(); |
2792 | err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); |
2793 | if (err) |
2794 | - return err; |
2795 | + goto out_err; |
2796 | |
2797 | if (!wdev->netdev) { |
2798 | err = -EINVAL; |
2799 | @@ -4408,7 +4395,7 @@ static int nl80211_dump_station(struct sk_buff *skb, |
2800 | cb->args[2] = sta_idx; |
2801 | err = skb->len; |
2802 | out_err: |
2803 | - nl80211_finish_wdev_dump(rdev); |
2804 | + rtnl_unlock(); |
2805 | |
2806 | return err; |
2807 | } |
2808 | @@ -5179,9 +5166,10 @@ static int nl80211_dump_mpath(struct sk_buff *skb, |
2809 | int path_idx = cb->args[2]; |
2810 | int err; |
2811 | |
2812 | + rtnl_lock(); |
2813 | err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); |
2814 | if (err) |
2815 | - return err; |
2816 | + goto out_err; |
2817 | |
2818 | if (!rdev->ops->dump_mpath) { |
2819 | err = -EOPNOTSUPP; |
2820 | @@ -5214,7 +5202,7 @@ static int nl80211_dump_mpath(struct sk_buff *skb, |
2821 | cb->args[2] = path_idx; |
2822 | err = skb->len; |
2823 | out_err: |
2824 | - nl80211_finish_wdev_dump(rdev); |
2825 | + rtnl_unlock(); |
2826 | return err; |
2827 | } |
2828 | |
2829 | @@ -5374,9 +5362,10 @@ static int nl80211_dump_mpp(struct sk_buff *skb, |
2830 | int path_idx = cb->args[2]; |
2831 | int err; |
2832 | |
2833 | + rtnl_lock(); |
2834 | err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); |
2835 | if (err) |
2836 | - return err; |
2837 | + goto out_err; |
2838 | |
2839 | if (!rdev->ops->dump_mpp) { |
2840 | err = -EOPNOTSUPP; |
2841 | @@ -5409,7 +5398,7 @@ static int nl80211_dump_mpp(struct sk_buff *skb, |
2842 | cb->args[2] = path_idx; |
2843 | err = skb->len; |
2844 | out_err: |
2845 | - nl80211_finish_wdev_dump(rdev); |
2846 | + rtnl_unlock(); |
2847 | return err; |
2848 | } |
2849 | |
2850 | @@ -7556,9 +7545,12 @@ static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) |
2851 | int start = cb->args[2], idx = 0; |
2852 | int err; |
2853 | |
2854 | + rtnl_lock(); |
2855 | err = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); |
2856 | - if (err) |
2857 | + if (err) { |
2858 | + rtnl_unlock(); |
2859 | return err; |
2860 | + } |
2861 | |
2862 | wdev_lock(wdev); |
2863 | spin_lock_bh(&rdev->bss_lock); |
2864 | @@ -7581,7 +7573,7 @@ static int nl80211_dump_scan(struct sk_buff *skb, struct netlink_callback *cb) |
2865 | wdev_unlock(wdev); |
2866 | |
2867 | cb->args[2] = idx; |
2868 | - nl80211_finish_wdev_dump(rdev); |
2869 | + rtnl_unlock(); |
2870 | |
2871 | return skb->len; |
2872 | } |
2873 | @@ -7665,9 +7657,10 @@ static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) |
2874 | int res; |
2875 | bool radio_stats; |
2876 | |
2877 | + rtnl_lock(); |
2878 | res = nl80211_prepare_wdev_dump(skb, cb, &rdev, &wdev); |
2879 | if (res) |
2880 | - return res; |
2881 | + goto out_err; |
2882 | |
2883 | /* prepare_wdev_dump parsed the attributes */ |
2884 | radio_stats = nl80211_fam.attrbuf[NL80211_ATTR_SURVEY_RADIO_STATS]; |
2885 | @@ -7708,7 +7701,7 @@ static int nl80211_dump_survey(struct sk_buff *skb, struct netlink_callback *cb) |
2886 | cb->args[2] = survey_idx; |
2887 | res = skb->len; |
2888 | out_err: |
2889 | - nl80211_finish_wdev_dump(rdev); |
2890 | + rtnl_unlock(); |
2891 | return res; |
2892 | } |
2893 | |
2894 | @@ -11299,17 +11292,13 @@ static int nl80211_prepare_vendor_dump(struct sk_buff *skb, |
2895 | void *data = NULL; |
2896 | unsigned int data_len = 0; |
2897 | |
2898 | - rtnl_lock(); |
2899 | - |
2900 | if (cb->args[0]) { |
2901 | /* subtract the 1 again here */ |
2902 | struct wiphy *wiphy = wiphy_idx_to_wiphy(cb->args[0] - 1); |
2903 | struct wireless_dev *tmp; |
2904 | |
2905 | - if (!wiphy) { |
2906 | - err = -ENODEV; |
2907 | - goto out_unlock; |
2908 | - } |
2909 | + if (!wiphy) |
2910 | + return -ENODEV; |
2911 | *rdev = wiphy_to_rdev(wiphy); |
2912 | *wdev = NULL; |
2913 | |
2914 | @@ -11330,13 +11319,11 @@ static int nl80211_prepare_vendor_dump(struct sk_buff *skb, |
2915 | nl80211_fam.attrbuf, nl80211_fam.maxattr, |
2916 | nl80211_policy); |
2917 | if (err) |
2918 | - goto out_unlock; |
2919 | + return err; |
2920 | |
2921 | if (!nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID] || |
2922 | - !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) { |
2923 | - err = -EINVAL; |
2924 | - goto out_unlock; |
2925 | - } |
2926 | + !nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]) |
2927 | + return -EINVAL; |
2928 | |
2929 | *wdev = __cfg80211_wdev_from_attrs(sock_net(skb->sk), |
2930 | nl80211_fam.attrbuf); |
2931 | @@ -11345,10 +11332,8 @@ static int nl80211_prepare_vendor_dump(struct sk_buff *skb, |
2932 | |
2933 | *rdev = __cfg80211_rdev_from_attrs(sock_net(skb->sk), |
2934 | nl80211_fam.attrbuf); |
2935 | - if (IS_ERR(*rdev)) { |
2936 | - err = PTR_ERR(*rdev); |
2937 | - goto out_unlock; |
2938 | - } |
2939 | + if (IS_ERR(*rdev)) |
2940 | + return PTR_ERR(*rdev); |
2941 | |
2942 | vid = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_ID]); |
2943 | subcmd = nla_get_u32(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_SUBCMD]); |
2944 | @@ -11361,19 +11346,15 @@ static int nl80211_prepare_vendor_dump(struct sk_buff *skb, |
2945 | if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd) |
2946 | continue; |
2947 | |
2948 | - if (!vcmd->dumpit) { |
2949 | - err = -EOPNOTSUPP; |
2950 | - goto out_unlock; |
2951 | - } |
2952 | + if (!vcmd->dumpit) |
2953 | + return -EOPNOTSUPP; |
2954 | |
2955 | vcmd_idx = i; |
2956 | break; |
2957 | } |
2958 | |
2959 | - if (vcmd_idx < 0) { |
2960 | - err = -EOPNOTSUPP; |
2961 | - goto out_unlock; |
2962 | - } |
2963 | + if (vcmd_idx < 0) |
2964 | + return -EOPNOTSUPP; |
2965 | |
2966 | if (nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]) { |
2967 | data = nla_data(nl80211_fam.attrbuf[NL80211_ATTR_VENDOR_DATA]); |
2968 | @@ -11390,9 +11371,6 @@ static int nl80211_prepare_vendor_dump(struct sk_buff *skb, |
2969 | |
2970 | /* keep rtnl locked in successful case */ |
2971 | return 0; |
2972 | - out_unlock: |
2973 | - rtnl_unlock(); |
2974 | - return err; |
2975 | } |
2976 | |
2977 | static int nl80211_vendor_cmd_dump(struct sk_buff *skb, |
2978 | @@ -11407,9 +11385,10 @@ static int nl80211_vendor_cmd_dump(struct sk_buff *skb, |
2979 | int err; |
2980 | struct nlattr *vendor_data; |
2981 | |
2982 | + rtnl_lock(); |
2983 | err = nl80211_prepare_vendor_dump(skb, cb, &rdev, &wdev); |
2984 | if (err) |
2985 | - return err; |
2986 | + goto out; |
2987 | |
2988 | vcmd_idx = cb->args[2]; |
2989 | data = (void *)cb->args[3]; |
2990 | @@ -11418,18 +11397,26 @@ static int nl80211_vendor_cmd_dump(struct sk_buff *skb, |
2991 | |
2992 | if (vcmd->flags & (WIPHY_VENDOR_CMD_NEED_WDEV | |
2993 | WIPHY_VENDOR_CMD_NEED_NETDEV)) { |
2994 | - if (!wdev) |
2995 | - return -EINVAL; |
2996 | + if (!wdev) { |
2997 | + err = -EINVAL; |
2998 | + goto out; |
2999 | + } |
3000 | if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_NETDEV && |
3001 | - !wdev->netdev) |
3002 | - return -EINVAL; |
3003 | + !wdev->netdev) { |
3004 | + err = -EINVAL; |
3005 | + goto out; |
3006 | + } |
3007 | |
3008 | if (vcmd->flags & WIPHY_VENDOR_CMD_NEED_RUNNING) { |
3009 | if (wdev->netdev && |
3010 | - !netif_running(wdev->netdev)) |
3011 | - return -ENETDOWN; |
3012 | - if (!wdev->netdev && !wdev->p2p_started) |
3013 | - return -ENETDOWN; |
3014 | + !netif_running(wdev->netdev)) { |
3015 | + err = -ENETDOWN; |
3016 | + goto out; |
3017 | + } |
3018 | + if (!wdev->netdev && !wdev->p2p_started) { |
3019 | + err = -ENETDOWN; |
3020 | + goto out; |
3021 | + } |
3022 | } |
3023 | } |
3024 | |
3025 | diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c |
3026 | index 4c935202ce23..f3b1d7f50b81 100644 |
3027 | --- a/sound/core/seq/seq_clientmgr.c |
3028 | +++ b/sound/core/seq/seq_clientmgr.c |
3029 | @@ -1832,6 +1832,7 @@ static int snd_seq_ioctl_set_client_pool(struct snd_seq_client *client, |
3030 | info->output_pool != client->pool->size)) { |
3031 | if (snd_seq_write_pool_allocated(client)) { |
3032 | /* remove all existing cells */ |
3033 | + snd_seq_pool_mark_closing(client->pool); |
3034 | snd_seq_queue_client_leave_cells(client->number); |
3035 | snd_seq_pool_done(client->pool); |
3036 | } |
3037 | diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c |
3038 | index 86240d02b530..3f4efcb85df5 100644 |
3039 | --- a/sound/core/seq/seq_fifo.c |
3040 | +++ b/sound/core/seq/seq_fifo.c |
3041 | @@ -70,6 +70,9 @@ void snd_seq_fifo_delete(struct snd_seq_fifo **fifo) |
3042 | return; |
3043 | *fifo = NULL; |
3044 | |
3045 | + if (f->pool) |
3046 | + snd_seq_pool_mark_closing(f->pool); |
3047 | + |
3048 | snd_seq_fifo_clear(f); |
3049 | |
3050 | /* wake up clients if any */ |
3051 | diff --git a/sound/core/seq/seq_memory.c b/sound/core/seq/seq_memory.c |
3052 | index dfa5156f3585..5847c4475bf3 100644 |
3053 | --- a/sound/core/seq/seq_memory.c |
3054 | +++ b/sound/core/seq/seq_memory.c |
3055 | @@ -414,6 +414,18 @@ int snd_seq_pool_init(struct snd_seq_pool *pool) |
3056 | return 0; |
3057 | } |
3058 | |
3059 | +/* refuse the further insertion to the pool */ |
3060 | +void snd_seq_pool_mark_closing(struct snd_seq_pool *pool) |
3061 | +{ |
3062 | + unsigned long flags; |
3063 | + |
3064 | + if (snd_BUG_ON(!pool)) |
3065 | + return; |
3066 | + spin_lock_irqsave(&pool->lock, flags); |
3067 | + pool->closing = 1; |
3068 | + spin_unlock_irqrestore(&pool->lock, flags); |
3069 | +} |
3070 | + |
3071 | /* remove events */ |
3072 | int snd_seq_pool_done(struct snd_seq_pool *pool) |
3073 | { |
3074 | @@ -424,10 +436,6 @@ int snd_seq_pool_done(struct snd_seq_pool *pool) |
3075 | return -EINVAL; |
3076 | |
3077 | /* wait for closing all threads */ |
3078 | - spin_lock_irqsave(&pool->lock, flags); |
3079 | - pool->closing = 1; |
3080 | - spin_unlock_irqrestore(&pool->lock, flags); |
3081 | - |
3082 | if (waitqueue_active(&pool->output_sleep)) |
3083 | wake_up(&pool->output_sleep); |
3084 | |
3085 | @@ -484,6 +492,7 @@ int snd_seq_pool_delete(struct snd_seq_pool **ppool) |
3086 | *ppool = NULL; |
3087 | if (pool == NULL) |
3088 | return 0; |
3089 | + snd_seq_pool_mark_closing(pool); |
3090 | snd_seq_pool_done(pool); |
3091 | kfree(pool); |
3092 | return 0; |
3093 | diff --git a/sound/core/seq/seq_memory.h b/sound/core/seq/seq_memory.h |
3094 | index 4a2ec779b8a7..32f959c17786 100644 |
3095 | --- a/sound/core/seq/seq_memory.h |
3096 | +++ b/sound/core/seq/seq_memory.h |
3097 | @@ -84,6 +84,7 @@ static inline int snd_seq_total_cells(struct snd_seq_pool *pool) |
3098 | int snd_seq_pool_init(struct snd_seq_pool *pool); |
3099 | |
3100 | /* done pool - free events */ |
3101 | +void snd_seq_pool_mark_closing(struct snd_seq_pool *pool); |
3102 | int snd_seq_pool_done(struct snd_seq_pool *pool); |
3103 | |
3104 | /* create pool */ |
3105 | diff --git a/sound/pci/ctxfi/cthw20k1.c b/sound/pci/ctxfi/cthw20k1.c |
3106 | index ab4cdab5cfa5..79edd88d5cd0 100644 |
3107 | --- a/sound/pci/ctxfi/cthw20k1.c |
3108 | +++ b/sound/pci/ctxfi/cthw20k1.c |
3109 | @@ -1905,7 +1905,7 @@ static int hw_card_start(struct hw *hw) |
3110 | return err; |
3111 | |
3112 | /* Set DMA transfer mask */ |
3113 | - if (dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) { |
3114 | + if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) { |
3115 | dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits)); |
3116 | } else { |
3117 | dma_set_mask(&pci->dev, DMA_BIT_MASK(32)); |
3118 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3119 | index 0c62b1d8c11b..112caa2d3c14 100644 |
3120 | --- a/sound/pci/hda/patch_realtek.c |
3121 | +++ b/sound/pci/hda/patch_realtek.c |
3122 | @@ -6058,6 +6058,8 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { |
3123 | ALC295_STANDARD_PINS, |
3124 | {0x17, 0x21014040}, |
3125 | {0x18, 0x21a19050}), |
3126 | + SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, |
3127 | + ALC295_STANDARD_PINS), |
3128 | SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, |
3129 | ALC298_STANDARD_PINS, |
3130 | {0x17, 0x90170110}), |