Annotation of /trunk/kernel-alx/patches-4.9/0118-4.9.19-all-fixes.patch
Parent Directory | Revision Log
Revision 2956 -
(hide annotations)
(download)
Mon Jul 24 12:03:46 2017 UTC (7 years, 2 months ago) by niro
File size: 101849 byte(s)
Mon Jul 24 12:03:46 2017 UTC (7 years, 2 months ago) by niro
File size: 101849 byte(s)
-added patches-4.9
1 | niro | 2956 | 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}), |