Annotation of /trunk/kernel-alx-legacy/patches-4.9/0387-4.9.288-all-fixes.patch
Parent Directory
|
Revision Log
Revision 3689 -
(hide annotations)
(download)
Mon Oct 24 14:08:04 2022 UTC (19 months, 3 weeks ago) by niro
File size: 42113 byte(s)
Mon Oct 24 14:08:04 2022 UTC (19 months, 3 weeks ago) by niro
File size: 42113 byte(s)
-linux-4.9.288
1 | niro | 3689 | diff --git a/Makefile b/Makefile |
2 | index 76eff0f592346..49568e384a924 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 4 | ||
7 | PATCHLEVEL = 9 | ||
8 | -SUBLEVEL = 287 | ||
9 | +SUBLEVEL = 288 | ||
10 | EXTRAVERSION = | ||
11 | NAME = Roaring Lionus | ||
12 | |||
13 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig | ||
14 | index 9dbaa283f01db..0f1dbd3238a5e 100644 | ||
15 | --- a/arch/arm/Kconfig | ||
16 | +++ b/arch/arm/Kconfig | ||
17 | @@ -55,6 +55,7 @@ config ARM | ||
18 | select HAVE_FTRACE_MCOUNT_RECORD if (!XIP_KERNEL) | ||
19 | select HAVE_FUNCTION_GRAPH_TRACER if (!THUMB2_KERNEL) | ||
20 | select HAVE_FUNCTION_TRACER if (!XIP_KERNEL) | ||
21 | + select HAVE_FUTEX_CMPXCHG if FUTEX | ||
22 | select HAVE_GCC_PLUGINS | ||
23 | select HAVE_GENERIC_DMA_COHERENT | ||
24 | select HAVE_HW_BREAKPOINT if (PERF_EVENTS && (CPU_V6 || CPU_V6K || CPU_V7)) | ||
25 | diff --git a/arch/arm/boot/dts/spear3xx.dtsi b/arch/arm/boot/dts/spear3xx.dtsi | ||
26 | index 118135d758990..4e4166d96b264 100644 | ||
27 | --- a/arch/arm/boot/dts/spear3xx.dtsi | ||
28 | +++ b/arch/arm/boot/dts/spear3xx.dtsi | ||
29 | @@ -53,7 +53,7 @@ | ||
30 | }; | ||
31 | |||
32 | gmac: eth@e0800000 { | ||
33 | - compatible = "st,spear600-gmac"; | ||
34 | + compatible = "snps,dwmac-3.40a"; | ||
35 | reg = <0xe0800000 0x8000>; | ||
36 | interrupts = <23 22>; | ||
37 | interrupt-names = "macirq", "eth_wake_irq"; | ||
38 | diff --git a/arch/nios2/include/asm/irqflags.h b/arch/nios2/include/asm/irqflags.h | ||
39 | index 75ab92e639f85..0338fcb88203c 100644 | ||
40 | --- a/arch/nios2/include/asm/irqflags.h | ||
41 | +++ b/arch/nios2/include/asm/irqflags.h | ||
42 | @@ -22,7 +22,7 @@ | ||
43 | |||
44 | static inline unsigned long arch_local_save_flags(void) | ||
45 | { | ||
46 | - return RDCTL(CTL_STATUS); | ||
47 | + return RDCTL(CTL_FSTATUS); | ||
48 | } | ||
49 | |||
50 | /* | ||
51 | @@ -31,7 +31,7 @@ static inline unsigned long arch_local_save_flags(void) | ||
52 | */ | ||
53 | static inline void arch_local_irq_restore(unsigned long flags) | ||
54 | { | ||
55 | - WRCTL(CTL_STATUS, flags); | ||
56 | + WRCTL(CTL_FSTATUS, flags); | ||
57 | } | ||
58 | |||
59 | static inline void arch_local_irq_disable(void) | ||
60 | diff --git a/arch/nios2/include/asm/registers.h b/arch/nios2/include/asm/registers.h | ||
61 | index 615bce19b546e..33824f2ad1ab7 100644 | ||
62 | --- a/arch/nios2/include/asm/registers.h | ||
63 | +++ b/arch/nios2/include/asm/registers.h | ||
64 | @@ -24,7 +24,7 @@ | ||
65 | #endif | ||
66 | |||
67 | /* control register numbers */ | ||
68 | -#define CTL_STATUS 0 | ||
69 | +#define CTL_FSTATUS 0 | ||
70 | #define CTL_ESTATUS 1 | ||
71 | #define CTL_BSTATUS 2 | ||
72 | #define CTL_IENABLE 3 | ||
73 | diff --git a/arch/s390/lib/string.c b/arch/s390/lib/string.c | ||
74 | index 48352bffbc929..a82335215d54d 100644 | ||
75 | --- a/arch/s390/lib/string.c | ||
76 | +++ b/arch/s390/lib/string.c | ||
77 | @@ -225,14 +225,13 @@ EXPORT_SYMBOL(strcmp); | ||
78 | */ | ||
79 | char * strrchr(const char * s, int c) | ||
80 | { | ||
81 | - size_t len = __strend(s) - s; | ||
82 | - | ||
83 | - if (len) | ||
84 | - do { | ||
85 | - if (s[len] == (char) c) | ||
86 | - return (char *) s + len; | ||
87 | - } while (--len > 0); | ||
88 | - return NULL; | ||
89 | + ssize_t len = __strend(s) - s; | ||
90 | + | ||
91 | + do { | ||
92 | + if (s[len] == (char)c) | ||
93 | + return (char *)s + len; | ||
94 | + } while (--len >= 0); | ||
95 | + return NULL; | ||
96 | } | ||
97 | EXPORT_SYMBOL(strrchr); | ||
98 | |||
99 | diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c | ||
100 | index 42285f35d3135..db5122765f166 100644 | ||
101 | --- a/arch/xtensa/platforms/xtfpga/setup.c | ||
102 | +++ b/arch/xtensa/platforms/xtfpga/setup.c | ||
103 | @@ -54,8 +54,12 @@ void platform_power_off(void) | ||
104 | |||
105 | void platform_restart(void) | ||
106 | { | ||
107 | - /* Flush and reset the mmu, simulate a processor reset, and | ||
108 | - * jump to the reset vector. */ | ||
109 | + /* Try software reset first. */ | ||
110 | + WRITE_ONCE(*(u32 *)XTFPGA_SWRST_VADDR, 0xdead); | ||
111 | + | ||
112 | + /* If software reset did not work, flush and reset the mmu, | ||
113 | + * simulate a processor reset, and jump to the reset vector. | ||
114 | + */ | ||
115 | cpu_reset(); | ||
116 | /* control never gets here */ | ||
117 | } | ||
118 | @@ -85,7 +89,7 @@ void __init platform_calibrate_ccount(void) | ||
119 | |||
120 | #endif | ||
121 | |||
122 | -#ifdef CONFIG_OF | ||
123 | +#ifdef CONFIG_USE_OF | ||
124 | |||
125 | static void __init xtfpga_clk_setup(struct device_node *np) | ||
126 | { | ||
127 | @@ -303,4 +307,4 @@ static int __init xtavnet_init(void) | ||
128 | */ | ||
129 | arch_initcall(xtavnet_init); | ||
130 | |||
131 | -#endif /* CONFIG_OF */ | ||
132 | +#endif /* CONFIG_USE_OF */ | ||
133 | diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c | ||
134 | index bce2a8ca4678a..55fcdb798002b 100644 | ||
135 | --- a/drivers/ata/pata_legacy.c | ||
136 | +++ b/drivers/ata/pata_legacy.c | ||
137 | @@ -328,7 +328,8 @@ static unsigned int pdc_data_xfer_vlb(struct ata_device *dev, | ||
138 | iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2); | ||
139 | |||
140 | if (unlikely(slop)) { | ||
141 | - __le32 pad; | ||
142 | + __le32 pad = 0; | ||
143 | + | ||
144 | if (rw == READ) { | ||
145 | pad = cpu_to_le32(ioread32(ap->ioaddr.data_addr)); | ||
146 | memcpy(buf + buflen - slop, &pad, slop); | ||
147 | @@ -716,7 +717,8 @@ static unsigned int vlb32_data_xfer(struct ata_device *adev, unsigned char *buf, | ||
148 | ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2); | ||
149 | |||
150 | if (unlikely(slop)) { | ||
151 | - __le32 pad; | ||
152 | + __le32 pad = 0; | ||
153 | + | ||
154 | if (rw == WRITE) { | ||
155 | memcpy(&pad, buf + buflen - slop, slop); | ||
156 | iowrite32(le32_to_cpu(pad), ap->ioaddr.data_addr); | ||
157 | diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c | ||
158 | index dc8d2603612ed..91dbc6ae56cf9 100644 | ||
159 | --- a/drivers/firmware/efi/cper.c | ||
160 | +++ b/drivers/firmware/efi/cper.c | ||
161 | @@ -35,8 +35,6 @@ | ||
162 | |||
163 | #define INDENT_SP " " | ||
164 | |||
165 | -static char rcd_decode_str[CPER_REC_LEN]; | ||
166 | - | ||
167 | /* | ||
168 | * CPER record ID need to be unique even after reboot, because record | ||
169 | * ID is used as index for ERST storage, while CPER records from | ||
170 | @@ -293,6 +291,7 @@ const char *cper_mem_err_unpack(struct trace_seq *p, | ||
171 | struct cper_mem_err_compact *cmem) | ||
172 | { | ||
173 | const char *ret = trace_seq_buffer_ptr(p); | ||
174 | + char rcd_decode_str[CPER_REC_LEN]; | ||
175 | |||
176 | if (cper_mem_err_location(cmem, rcd_decode_str)) | ||
177 | trace_seq_printf(p, "%s", rcd_decode_str); | ||
178 | @@ -307,6 +306,7 @@ static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem, | ||
179 | int len) | ||
180 | { | ||
181 | struct cper_mem_err_compact cmem; | ||
182 | + char rcd_decode_str[CPER_REC_LEN]; | ||
183 | |||
184 | /* Don't trust UEFI 2.1/2.2 structure with bad validation bits */ | ||
185 | if (len == sizeof(struct cper_sec_mem_err_old) && | ||
186 | diff --git a/drivers/firmware/efi/runtime-wrappers.c b/drivers/firmware/efi/runtime-wrappers.c | ||
187 | index dd7f63354ca06..60a32440daffe 100644 | ||
188 | --- a/drivers/firmware/efi/runtime-wrappers.c | ||
189 | +++ b/drivers/firmware/efi/runtime-wrappers.c | ||
190 | @@ -259,7 +259,7 @@ static void virt_efi_reset_system(int reset_type, | ||
191 | unsigned long data_size, | ||
192 | efi_char16_t *data) | ||
193 | { | ||
194 | - if (down_interruptible(&efi_runtime_lock)) { | ||
195 | + if (down_trylock(&efi_runtime_lock)) { | ||
196 | pr_warn("failed to invoke the reset_system() runtime service:\n" | ||
197 | "could not get exclusive access to the firmware\n"); | ||
198 | return; | ||
199 | diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c | ||
200 | index e49b414c012c6..246336a9f47d6 100644 | ||
201 | --- a/drivers/gpu/drm/msm/dsi/dsi_host.c | ||
202 | +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c | ||
203 | @@ -439,7 +439,7 @@ static int dsi_bus_clk_enable(struct msm_dsi_host *msm_host) | ||
204 | |||
205 | return 0; | ||
206 | err: | ||
207 | - for (; i > 0; i--) | ||
208 | + while (--i >= 0) | ||
209 | clk_disable_unprepare(msm_host->bus_clks[i]); | ||
210 | |||
211 | return ret; | ||
212 | diff --git a/drivers/gpu/drm/msm/edp/edp_ctrl.c b/drivers/gpu/drm/msm/edp/edp_ctrl.c | ||
213 | index 149bfe7ddd82d..090ce0a46f068 100644 | ||
214 | --- a/drivers/gpu/drm/msm/edp/edp_ctrl.c | ||
215 | +++ b/drivers/gpu/drm/msm/edp/edp_ctrl.c | ||
216 | @@ -1090,7 +1090,7 @@ void msm_edp_ctrl_power(struct edp_ctrl *ctrl, bool on) | ||
217 | int msm_edp_ctrl_init(struct msm_edp *edp) | ||
218 | { | ||
219 | struct edp_ctrl *ctrl = NULL; | ||
220 | - struct device *dev = &edp->pdev->dev; | ||
221 | + struct device *dev; | ||
222 | int ret; | ||
223 | |||
224 | if (!edp) { | ||
225 | @@ -1098,6 +1098,7 @@ int msm_edp_ctrl_init(struct msm_edp *edp) | ||
226 | return -EINVAL; | ||
227 | } | ||
228 | |||
229 | + dev = &edp->pdev->dev; | ||
230 | ctrl = devm_kzalloc(dev, sizeof(*ctrl), GFP_KERNEL); | ||
231 | if (!ctrl) | ||
232 | return -ENOMEM; | ||
233 | diff --git a/drivers/iio/adc/ti-adc128s052.c b/drivers/iio/adc/ti-adc128s052.c | ||
234 | index 89dfbd31be5c8..b7c7cba2dc092 100644 | ||
235 | --- a/drivers/iio/adc/ti-adc128s052.c | ||
236 | +++ b/drivers/iio/adc/ti-adc128s052.c | ||
237 | @@ -169,7 +169,13 @@ static int adc128_probe(struct spi_device *spi) | ||
238 | mutex_init(&adc->lock); | ||
239 | |||
240 | ret = iio_device_register(indio_dev); | ||
241 | + if (ret) | ||
242 | + goto err_disable_regulator; | ||
243 | |||
244 | + return 0; | ||
245 | + | ||
246 | +err_disable_regulator: | ||
247 | + regulator_disable(adc->reg); | ||
248 | return ret; | ||
249 | } | ||
250 | |||
251 | diff --git a/drivers/iio/common/ssp_sensors/ssp_spi.c b/drivers/iio/common/ssp_sensors/ssp_spi.c | ||
252 | index 704284a475aec..645749b90ec07 100644 | ||
253 | --- a/drivers/iio/common/ssp_sensors/ssp_spi.c | ||
254 | +++ b/drivers/iio/common/ssp_sensors/ssp_spi.c | ||
255 | @@ -147,7 +147,7 @@ static int ssp_print_mcu_debug(char *data_frame, int *data_index, | ||
256 | if (length > received_len - *data_index || length <= 0) { | ||
257 | ssp_dbg("[SSP]: MSG From MCU-invalid debug length(%d/%d)\n", | ||
258 | length, received_len); | ||
259 | - return length ? length : -EPROTO; | ||
260 | + return -EPROTO; | ||
261 | } | ||
262 | |||
263 | ssp_dbg("[SSP]: MSG From MCU - %s\n", &data_frame[*data_index]); | ||
264 | @@ -286,6 +286,8 @@ static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len) | ||
265 | for (idx = 0; idx < len;) { | ||
266 | switch (dataframe[idx++]) { | ||
267 | case SSP_MSG2AP_INST_BYPASS_DATA: | ||
268 | + if (idx >= len) | ||
269 | + return -EPROTO; | ||
270 | sd = dataframe[idx++]; | ||
271 | if (sd < 0 || sd >= SSP_SENSOR_MAX) { | ||
272 | dev_err(SSP_DEV, | ||
273 | @@ -295,10 +297,13 @@ static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len) | ||
274 | |||
275 | if (indio_devs[sd]) { | ||
276 | spd = iio_priv(indio_devs[sd]); | ||
277 | - if (spd->process_data) | ||
278 | + if (spd->process_data) { | ||
279 | + if (idx >= len) | ||
280 | + return -EPROTO; | ||
281 | spd->process_data(indio_devs[sd], | ||
282 | &dataframe[idx], | ||
283 | data->timestamp); | ||
284 | + } | ||
285 | } else { | ||
286 | dev_err(SSP_DEV, "no client for frame\n"); | ||
287 | } | ||
288 | @@ -306,6 +311,8 @@ static int ssp_parse_dataframe(struct ssp_data *data, char *dataframe, int len) | ||
289 | idx += ssp_offset_map[sd]; | ||
290 | break; | ||
291 | case SSP_MSG2AP_INST_DEBUG_DATA: | ||
292 | + if (idx >= len) | ||
293 | + return -EPROTO; | ||
294 | sd = ssp_print_mcu_debug(dataframe, &idx, len); | ||
295 | if (sd) { | ||
296 | dev_err(SSP_DEV, | ||
297 | diff --git a/drivers/iio/light/opt3001.c b/drivers/iio/light/opt3001.c | ||
298 | index be55477de2acc..0a0e52c95ff2d 100644 | ||
299 | --- a/drivers/iio/light/opt3001.c | ||
300 | +++ b/drivers/iio/light/opt3001.c | ||
301 | @@ -283,6 +283,8 @@ static int opt3001_get_lux(struct opt3001 *opt, int *val, int *val2) | ||
302 | ret = wait_event_timeout(opt->result_ready_queue, | ||
303 | opt->result_ready, | ||
304 | msecs_to_jiffies(OPT3001_RESULT_READY_LONG)); | ||
305 | + if (ret == 0) | ||
306 | + return -ETIMEDOUT; | ||
307 | } else { | ||
308 | /* Sleep for result ready time */ | ||
309 | timeout = (opt->int_time == OPT3001_INT_TIME_SHORT) ? | ||
310 | @@ -319,9 +321,7 @@ err: | ||
311 | /* Disallow IRQ to access the device while lock is active */ | ||
312 | opt->ok_to_ignore_lock = false; | ||
313 | |||
314 | - if (ret == 0) | ||
315 | - return -ETIMEDOUT; | ||
316 | - else if (ret < 0) | ||
317 | + if (ret < 0) | ||
318 | return ret; | ||
319 | |||
320 | if (opt->use_irq) { | ||
321 | diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c | ||
322 | index 4168ed0ef187e..f8f6bd92e314c 100644 | ||
323 | --- a/drivers/input/joystick/xpad.c | ||
324 | +++ b/drivers/input/joystick/xpad.c | ||
325 | @@ -348,6 +348,7 @@ static const struct xpad_device { | ||
326 | { 0x24c6, 0x5b03, "Thrustmaster Ferrari 458 Racing Wheel", 0, XTYPE_XBOX360 }, | ||
327 | { 0x24c6, 0x5d04, "Razer Sabertooth", 0, XTYPE_XBOX360 }, | ||
328 | { 0x24c6, 0xfafe, "Rock Candy Gamepad for Xbox 360", 0, XTYPE_XBOX360 }, | ||
329 | + { 0x3285, 0x0607, "Nacon GC-100", 0, XTYPE_XBOX360 }, | ||
330 | { 0x3767, 0x0101, "Fanatec Speedster 3 Forceshock Wheel", 0, XTYPE_XBOX }, | ||
331 | { 0xffff, 0xffff, "Chinese-made Xbox Controller", 0, XTYPE_XBOX }, | ||
332 | { 0x0000, 0x0000, "Generic X-Box pad", 0, XTYPE_UNKNOWN } | ||
333 | @@ -464,6 +465,7 @@ static const struct usb_device_id xpad_table[] = { | ||
334 | XPAD_XBOXONE_VENDOR(0x24c6), /* PowerA Controllers */ | ||
335 | XPAD_XBOXONE_VENDOR(0x2e24), /* Hyperkin Duke X-Box One pad */ | ||
336 | XPAD_XBOX360_VENDOR(0x2f24), /* GameSir Controllers */ | ||
337 | + XPAD_XBOX360_VENDOR(0x3285), /* Nacon GC-100 */ | ||
338 | { } | ||
339 | }; | ||
340 | |||
341 | diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c | ||
342 | index 9de62c3b8bf9f..658e116d8fe66 100644 | ||
343 | --- a/drivers/isdn/capi/kcapi.c | ||
344 | +++ b/drivers/isdn/capi/kcapi.c | ||
345 | @@ -564,6 +564,11 @@ int detach_capi_ctr(struct capi_ctr *ctr) | ||
346 | |||
347 | ctr_down(ctr, CAPI_CTR_DETACHED); | ||
348 | |||
349 | + if (ctr->cnr < 1 || ctr->cnr - 1 >= CAPI_MAXCONTR) { | ||
350 | + err = -EINVAL; | ||
351 | + goto unlock_out; | ||
352 | + } | ||
353 | + | ||
354 | if (capi_controller[ctr->cnr - 1] != ctr) { | ||
355 | err = -EINVAL; | ||
356 | goto unlock_out; | ||
357 | diff --git a/drivers/isdn/hardware/mISDN/netjet.c b/drivers/isdn/hardware/mISDN/netjet.c | ||
358 | index 6dea4c180c494..feada9d7cbcc2 100644 | ||
359 | --- a/drivers/isdn/hardware/mISDN/netjet.c | ||
360 | +++ b/drivers/isdn/hardware/mISDN/netjet.c | ||
361 | @@ -963,8 +963,8 @@ nj_release(struct tiger_hw *card) | ||
362 | nj_disable_hwirq(card); | ||
363 | mode_tiger(&card->bc[0], ISDN_P_NONE); | ||
364 | mode_tiger(&card->bc[1], ISDN_P_NONE); | ||
365 | - card->isac.release(&card->isac); | ||
366 | spin_unlock_irqrestore(&card->lock, flags); | ||
367 | + card->isac.release(&card->isac); | ||
368 | release_region(card->base, card->base_s); | ||
369 | card->base_s = 0; | ||
370 | } | ||
371 | diff --git a/drivers/misc/cb710/sgbuf2.c b/drivers/misc/cb710/sgbuf2.c | ||
372 | index 2a40d0efdff5d..4d2a72a537d42 100644 | ||
373 | --- a/drivers/misc/cb710/sgbuf2.c | ||
374 | +++ b/drivers/misc/cb710/sgbuf2.c | ||
375 | @@ -50,7 +50,7 @@ static inline bool needs_unaligned_copy(const void *ptr) | ||
376 | #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS | ||
377 | return false; | ||
378 | #else | ||
379 | - return ((ptr - NULL) & 3) != 0; | ||
380 | + return ((uintptr_t)ptr & 3) != 0; | ||
381 | #endif | ||
382 | } | ||
383 | |||
384 | diff --git a/drivers/net/can/rcar/rcar_can.c b/drivers/net/can/rcar/rcar_can.c | ||
385 | index 9b2c3bd00f8b4..2ac33ee1067eb 100644 | ||
386 | --- a/drivers/net/can/rcar/rcar_can.c | ||
387 | +++ b/drivers/net/can/rcar/rcar_can.c | ||
388 | @@ -858,10 +858,12 @@ static int __maybe_unused rcar_can_suspend(struct device *dev) | ||
389 | struct rcar_can_priv *priv = netdev_priv(ndev); | ||
390 | u16 ctlr; | ||
391 | |||
392 | - if (netif_running(ndev)) { | ||
393 | - netif_stop_queue(ndev); | ||
394 | - netif_device_detach(ndev); | ||
395 | - } | ||
396 | + if (!netif_running(ndev)) | ||
397 | + return 0; | ||
398 | + | ||
399 | + netif_stop_queue(ndev); | ||
400 | + netif_device_detach(ndev); | ||
401 | + | ||
402 | ctlr = readw(&priv->regs->ctlr); | ||
403 | ctlr |= RCAR_CAN_CTLR_CANM_HALT; | ||
404 | writew(ctlr, &priv->regs->ctlr); | ||
405 | @@ -880,6 +882,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev) | ||
406 | u16 ctlr; | ||
407 | int err; | ||
408 | |||
409 | + if (!netif_running(ndev)) | ||
410 | + return 0; | ||
411 | + | ||
412 | err = clk_enable(priv->clk); | ||
413 | if (err) { | ||
414 | netdev_err(ndev, "clk_enable() failed, error %d\n", err); | ||
415 | @@ -893,10 +898,9 @@ static int __maybe_unused rcar_can_resume(struct device *dev) | ||
416 | writew(ctlr, &priv->regs->ctlr); | ||
417 | priv->can.state = CAN_STATE_ERROR_ACTIVE; | ||
418 | |||
419 | - if (netif_running(ndev)) { | ||
420 | - netif_device_attach(ndev); | ||
421 | - netif_start_queue(ndev); | ||
422 | - } | ||
423 | + netif_device_attach(ndev); | ||
424 | + netif_start_queue(ndev); | ||
425 | + | ||
426 | return 0; | ||
427 | } | ||
428 | |||
429 | diff --git a/drivers/net/can/sja1000/peak_pci.c b/drivers/net/can/sja1000/peak_pci.c | ||
430 | index 131026fbc2d77..e12fc5d88382d 100644 | ||
431 | --- a/drivers/net/can/sja1000/peak_pci.c | ||
432 | +++ b/drivers/net/can/sja1000/peak_pci.c | ||
433 | @@ -736,16 +736,15 @@ static void peak_pci_remove(struct pci_dev *pdev) | ||
434 | struct net_device *prev_dev = chan->prev_dev; | ||
435 | |||
436 | dev_info(&pdev->dev, "removing device %s\n", dev->name); | ||
437 | + /* do that only for first channel */ | ||
438 | + if (!prev_dev && chan->pciec_card) | ||
439 | + peak_pciec_remove(chan->pciec_card); | ||
440 | unregister_sja1000dev(dev); | ||
441 | free_sja1000dev(dev); | ||
442 | dev = prev_dev; | ||
443 | |||
444 | - if (!dev) { | ||
445 | - /* do that only for first channel */ | ||
446 | - if (chan->pciec_card) | ||
447 | - peak_pciec_remove(chan->pciec_card); | ||
448 | + if (!dev) | ||
449 | break; | ||
450 | - } | ||
451 | priv = netdev_priv(dev); | ||
452 | chan = priv->priv; | ||
453 | } | ||
454 | diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c | ||
455 | index d314e73f3d061..e7ffc073fbd68 100644 | ||
456 | --- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c | ||
457 | +++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c | ||
458 | @@ -559,11 +559,10 @@ static int pcan_usb_fd_decode_status(struct pcan_usb_fd_if *usb_if, | ||
459 | } else if (sm->channel_p_w_b & PUCAN_BUS_WARNING) { | ||
460 | new_state = CAN_STATE_ERROR_WARNING; | ||
461 | } else { | ||
462 | - /* no error bit (so, no error skb, back to active state) */ | ||
463 | - dev->can.state = CAN_STATE_ERROR_ACTIVE; | ||
464 | + /* back to (or still in) ERROR_ACTIVE state */ | ||
465 | + new_state = CAN_STATE_ERROR_ACTIVE; | ||
466 | pdev->bec.txerr = 0; | ||
467 | pdev->bec.rxerr = 0; | ||
468 | - return 0; | ||
469 | } | ||
470 | |||
471 | /* state hasn't changed */ | ||
472 | diff --git a/drivers/net/ethernet/Kconfig b/drivers/net/ethernet/Kconfig | ||
473 | index 8cc7467b6c1f6..8c80ca4b8ae18 100644 | ||
474 | --- a/drivers/net/ethernet/Kconfig | ||
475 | +++ b/drivers/net/ethernet/Kconfig | ||
476 | @@ -96,6 +96,7 @@ config JME | ||
477 | config KORINA | ||
478 | tristate "Korina (IDT RC32434) Ethernet support" | ||
479 | depends on MIKROTIK_RB532 | ||
480 | + select CRC32 | ||
481 | ---help--- | ||
482 | If you have a Mikrotik RouterBoard 500 or IDT RC32434 | ||
483 | based system say Y. Otherwise say N. | ||
484 | diff --git a/drivers/net/ethernet/arc/Kconfig b/drivers/net/ethernet/arc/Kconfig | ||
485 | index 689045186064a..ef4988716cf44 100644 | ||
486 | --- a/drivers/net/ethernet/arc/Kconfig | ||
487 | +++ b/drivers/net/ethernet/arc/Kconfig | ||
488 | @@ -19,6 +19,7 @@ config ARC_EMAC_CORE | ||
489 | tristate | ||
490 | select MII | ||
491 | select PHYLIB | ||
492 | + select CRC32 | ||
493 | |||
494 | config ARC_EMAC | ||
495 | tristate "ARC EMAC support" | ||
496 | diff --git a/drivers/net/ethernet/microchip/encx24j600-regmap.c b/drivers/net/ethernet/microchip/encx24j600-regmap.c | ||
497 | index f3bb9055a2927..b5de665ce7189 100644 | ||
498 | --- a/drivers/net/ethernet/microchip/encx24j600-regmap.c | ||
499 | +++ b/drivers/net/ethernet/microchip/encx24j600-regmap.c | ||
500 | @@ -500,13 +500,19 @@ static struct regmap_bus phymap_encx24j600 = { | ||
501 | .reg_read = regmap_encx24j600_phy_reg_read, | ||
502 | }; | ||
503 | |||
504 | -void devm_regmap_init_encx24j600(struct device *dev, | ||
505 | - struct encx24j600_context *ctx) | ||
506 | +int devm_regmap_init_encx24j600(struct device *dev, | ||
507 | + struct encx24j600_context *ctx) | ||
508 | { | ||
509 | mutex_init(&ctx->mutex); | ||
510 | regcfg.lock_arg = ctx; | ||
511 | ctx->regmap = devm_regmap_init(dev, ®map_encx24j600, ctx, ®cfg); | ||
512 | + if (IS_ERR(ctx->regmap)) | ||
513 | + return PTR_ERR(ctx->regmap); | ||
514 | ctx->phymap = devm_regmap_init(dev, &phymap_encx24j600, ctx, &phycfg); | ||
515 | + if (IS_ERR(ctx->phymap)) | ||
516 | + return PTR_ERR(ctx->phymap); | ||
517 | + | ||
518 | + return 0; | ||
519 | } | ||
520 | EXPORT_SYMBOL_GPL(devm_regmap_init_encx24j600); | ||
521 | |||
522 | diff --git a/drivers/net/ethernet/microchip/encx24j600.c b/drivers/net/ethernet/microchip/encx24j600.c | ||
523 | index ad661d1979c78..906751f78ef6c 100644 | ||
524 | --- a/drivers/net/ethernet/microchip/encx24j600.c | ||
525 | +++ b/drivers/net/ethernet/microchip/encx24j600.c | ||
526 | @@ -1015,10 +1015,13 @@ static int encx24j600_spi_probe(struct spi_device *spi) | ||
527 | priv->speed = SPEED_100; | ||
528 | |||
529 | priv->ctx.spi = spi; | ||
530 | - devm_regmap_init_encx24j600(&spi->dev, &priv->ctx); | ||
531 | ndev->irq = spi->irq; | ||
532 | ndev->netdev_ops = &encx24j600_netdev_ops; | ||
533 | |||
534 | + ret = devm_regmap_init_encx24j600(&spi->dev, &priv->ctx); | ||
535 | + if (ret) | ||
536 | + goto out_free; | ||
537 | + | ||
538 | mutex_init(&priv->lock); | ||
539 | |||
540 | /* Reset device and check if it is connected */ | ||
541 | diff --git a/drivers/net/ethernet/microchip/encx24j600_hw.h b/drivers/net/ethernet/microchip/encx24j600_hw.h | ||
542 | index 4be73d5553f89..c9b17ccf749ce 100644 | ||
543 | --- a/drivers/net/ethernet/microchip/encx24j600_hw.h | ||
544 | +++ b/drivers/net/ethernet/microchip/encx24j600_hw.h | ||
545 | @@ -14,8 +14,8 @@ struct encx24j600_context { | ||
546 | int bank; | ||
547 | }; | ||
548 | |||
549 | -void devm_regmap_init_encx24j600(struct device *dev, | ||
550 | - struct encx24j600_context *ctx); | ||
551 | +int devm_regmap_init_encx24j600(struct device *dev, | ||
552 | + struct encx24j600_context *ctx); | ||
553 | |||
554 | /* Single-byte instructions */ | ||
555 | #define BANK_SELECT(bank) (0xC0 | ((bank & (BANK_MASK >> BANK_SHIFT)) << 1)) | ||
556 | diff --git a/drivers/net/ethernet/neterion/s2io.c b/drivers/net/ethernet/neterion/s2io.c | ||
557 | index eaa37c079a7cd..a1447d7ff48b5 100644 | ||
558 | --- a/drivers/net/ethernet/neterion/s2io.c | ||
559 | +++ b/drivers/net/ethernet/neterion/s2io.c | ||
560 | @@ -8618,7 +8618,7 @@ static void s2io_io_resume(struct pci_dev *pdev) | ||
561 | return; | ||
562 | } | ||
563 | |||
564 | - if (s2io_set_mac_addr(netdev, netdev->dev_addr) == FAILURE) { | ||
565 | + if (do_s2io_prog_unicast(netdev, netdev->dev_addr) == FAILURE) { | ||
566 | s2io_card_down(sp); | ||
567 | pr_err("Can't restore mac addr after reset.\n"); | ||
568 | return; | ||
569 | diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c | ||
570 | index 92fb664b56fbb..73f97d00ede79 100644 | ||
571 | --- a/drivers/net/phy/mdio_bus.c | ||
572 | +++ b/drivers/net/phy/mdio_bus.c | ||
573 | @@ -326,6 +326,7 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner) | ||
574 | err = device_register(&bus->dev); | ||
575 | if (err) { | ||
576 | pr_err("mii_bus %s failed to register\n", bus->id); | ||
577 | + put_device(&bus->dev); | ||
578 | return -EINVAL; | ||
579 | } | ||
580 | |||
581 | diff --git a/drivers/net/usb/Kconfig b/drivers/net/usb/Kconfig | ||
582 | index 3a7286256db09..9272d0f938190 100644 | ||
583 | --- a/drivers/net/usb/Kconfig | ||
584 | +++ b/drivers/net/usb/Kconfig | ||
585 | @@ -98,6 +98,10 @@ config USB_RTL8150 | ||
586 | config USB_RTL8152 | ||
587 | tristate "Realtek RTL8152/RTL8153 Based USB Ethernet Adapters" | ||
588 | select MII | ||
589 | + select CRC32 | ||
590 | + select CRYPTO | ||
591 | + select CRYPTO_HASH | ||
592 | + select CRYPTO_SHA256 | ||
593 | help | ||
594 | This option adds support for Realtek RTL8152 based USB 2.0 | ||
595 | 10/100 Ethernet adapters and RTL8153 based USB 3.0 10/100/1000 | ||
596 | diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c | ||
597 | index 2a0c5f3b0e509..286196e3a35d3 100644 | ||
598 | --- a/drivers/nvmem/core.c | ||
599 | +++ b/drivers/nvmem/core.c | ||
600 | @@ -967,7 +967,8 @@ static inline void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, | ||
601 | *p-- = 0; | ||
602 | |||
603 | /* clear msb bits if any leftover in the last byte */ | ||
604 | - *p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0); | ||
605 | + if (cell->nbits % BITS_PER_BYTE) | ||
606 | + *p &= GENMASK((cell->nbits % BITS_PER_BYTE) - 1, 0); | ||
607 | } | ||
608 | |||
609 | static int __nvmem_cell_read(struct nvmem_device *nvmem, | ||
610 | diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c | ||
611 | index e81daff65f622..238ee4275f5c8 100644 | ||
612 | --- a/drivers/platform/x86/intel_scu_ipc.c | ||
613 | +++ b/drivers/platform/x86/intel_scu_ipc.c | ||
614 | @@ -187,7 +187,7 @@ static inline int busy_loop(struct intel_scu_ipc_dev *scu) | ||
615 | return 0; | ||
616 | } | ||
617 | |||
618 | -/* Wait till ipc ioc interrupt is received or timeout in 3 HZ */ | ||
619 | +/* Wait till ipc ioc interrupt is received or timeout in 10 HZ */ | ||
620 | static inline int ipc_wait_for_interrupt(struct intel_scu_ipc_dev *scu) | ||
621 | { | ||
622 | int status; | ||
623 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
624 | index bb63cc5cbca05..ae67f6383ca32 100644 | ||
625 | --- a/drivers/usb/host/xhci-pci.c | ||
626 | +++ b/drivers/usb/host/xhci-pci.c | ||
627 | @@ -38,6 +38,7 @@ | ||
628 | #define PCI_VENDOR_ID_FRESCO_LOGIC 0x1b73 | ||
629 | #define PCI_DEVICE_ID_FRESCO_LOGIC_PDK 0x1000 | ||
630 | #define PCI_DEVICE_ID_FRESCO_LOGIC_FL1009 0x1009 | ||
631 | +#define PCI_DEVICE_ID_FRESCO_LOGIC_FL1100 0x1100 | ||
632 | #define PCI_DEVICE_ID_FRESCO_LOGIC_FL1400 0x1400 | ||
633 | |||
634 | #define PCI_VENDOR_ID_ETRON 0x1b6f | ||
635 | @@ -91,6 +92,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
636 | /* Look for vendor-specific quirks */ | ||
637 | if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && | ||
638 | (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK || | ||
639 | + pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1100 || | ||
640 | pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_FL1400)) { | ||
641 | if (pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && | ||
642 | pdev->revision == 0x0) { | ||
643 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
644 | index ec8ad931f41e3..9a0f8ee8cbd9f 100644 | ||
645 | --- a/drivers/usb/serial/option.c | ||
646 | +++ b/drivers/usb/serial/option.c | ||
647 | @@ -1209,6 +1209,8 @@ static const struct usb_device_id option_ids[] = { | ||
648 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, | ||
649 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1203, 0xff), /* Telit LE910Cx (RNDIS) */ | ||
650 | .driver_info = NCTRL(2) | RSVD(3) }, | ||
651 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1204, 0xff), /* Telit LE910Cx (MBIM) */ | ||
652 | + .driver_info = NCTRL(0) | RSVD(1) }, | ||
653 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4), | ||
654 | .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) | RSVD(3) }, | ||
655 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), | ||
656 | diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c | ||
657 | index 11fb4d78e2dbc..f0bd6a66f551e 100644 | ||
658 | --- a/drivers/usb/serial/qcserial.c | ||
659 | +++ b/drivers/usb/serial/qcserial.c | ||
660 | @@ -169,6 +169,7 @@ static const struct usb_device_id id_table[] = { | ||
661 | {DEVICE_SWI(0x1199, 0x907b)}, /* Sierra Wireless EM74xx */ | ||
662 | {DEVICE_SWI(0x1199, 0x9090)}, /* Sierra Wireless EM7565 QDL */ | ||
663 | {DEVICE_SWI(0x1199, 0x9091)}, /* Sierra Wireless EM7565 */ | ||
664 | + {DEVICE_SWI(0x1199, 0x90d2)}, /* Sierra Wireless EM9191 QDL */ | ||
665 | {DEVICE_SWI(0x413c, 0x81a2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ | ||
666 | {DEVICE_SWI(0x413c, 0x81a3)}, /* Dell Wireless 5570 HSPA+ (42Mbps) Mobile Broadband Card */ | ||
667 | {DEVICE_SWI(0x413c, 0x81a4)}, /* Dell Wireless 5570e HSPA+ (42Mbps) Mobile Broadband Card */ | ||
668 | diff --git a/fs/exec.c b/fs/exec.c | ||
669 | index 319a1f5732fa9..482a8b4f41a5b 100644 | ||
670 | --- a/fs/exec.c | ||
671 | +++ b/fs/exec.c | ||
672 | @@ -994,7 +994,7 @@ int kernel_read_file_from_fd(int fd, void **buf, loff_t *size, loff_t max_size, | ||
673 | struct fd f = fdget(fd); | ||
674 | int ret = -EBADF; | ||
675 | |||
676 | - if (!f.file) | ||
677 | + if (!f.file || !(f.file->f_mode & FMODE_READ)) | ||
678 | goto out; | ||
679 | |||
680 | ret = kernel_read_file(f.file, buf, size, max_size, id); | ||
681 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c | ||
682 | index f704f90db36cd..2418b9d829ae1 100644 | ||
683 | --- a/fs/nfsd/nfsctl.c | ||
684 | +++ b/fs/nfsd/nfsctl.c | ||
685 | @@ -765,7 +765,10 @@ out_close: | ||
686 | svc_xprt_put(xprt); | ||
687 | } | ||
688 | out_err: | ||
689 | - nfsd_destroy(net); | ||
690 | + if (!list_empty(&nn->nfsd_serv->sv_permsocks)) | ||
691 | + nn->nfsd_serv->sv_nrthreads--; | ||
692 | + else | ||
693 | + nfsd_destroy(net); | ||
694 | return err; | ||
695 | } | ||
696 | |||
697 | diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c | ||
698 | index dfb8a923921e0..04bb03b01f62d 100644 | ||
699 | --- a/fs/ocfs2/alloc.c | ||
700 | +++ b/fs/ocfs2/alloc.c | ||
701 | @@ -6891,7 +6891,7 @@ void ocfs2_set_inode_data_inline(struct inode *inode, struct ocfs2_dinode *di) | ||
702 | int ocfs2_convert_inline_data_to_extents(struct inode *inode, | ||
703 | struct buffer_head *di_bh) | ||
704 | { | ||
705 | - int ret, i, has_data, num_pages = 0; | ||
706 | + int ret, has_data, num_pages = 0; | ||
707 | int need_free = 0; | ||
708 | u32 bit_off, num; | ||
709 | handle_t *handle; | ||
710 | @@ -6900,26 +6900,17 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, | ||
711 | struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); | ||
712 | struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data; | ||
713 | struct ocfs2_alloc_context *data_ac = NULL; | ||
714 | - struct page **pages = NULL; | ||
715 | - loff_t end = osb->s_clustersize; | ||
716 | + struct page *page = NULL; | ||
717 | struct ocfs2_extent_tree et; | ||
718 | int did_quota = 0; | ||
719 | |||
720 | has_data = i_size_read(inode) ? 1 : 0; | ||
721 | |||
722 | if (has_data) { | ||
723 | - pages = kcalloc(ocfs2_pages_per_cluster(osb->sb), | ||
724 | - sizeof(struct page *), GFP_NOFS); | ||
725 | - if (pages == NULL) { | ||
726 | - ret = -ENOMEM; | ||
727 | - mlog_errno(ret); | ||
728 | - return ret; | ||
729 | - } | ||
730 | - | ||
731 | ret = ocfs2_reserve_clusters(osb, 1, &data_ac); | ||
732 | if (ret) { | ||
733 | mlog_errno(ret); | ||
734 | - goto free_pages; | ||
735 | + goto out; | ||
736 | } | ||
737 | } | ||
738 | |||
739 | @@ -6939,7 +6930,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, | ||
740 | } | ||
741 | |||
742 | if (has_data) { | ||
743 | - unsigned int page_end; | ||
744 | + unsigned int page_end = min_t(unsigned, PAGE_SIZE, | ||
745 | + osb->s_clustersize); | ||
746 | u64 phys; | ||
747 | |||
748 | ret = dquot_alloc_space_nodirty(inode, | ||
749 | @@ -6963,15 +6955,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, | ||
750 | */ | ||
751 | block = phys = ocfs2_clusters_to_blocks(inode->i_sb, bit_off); | ||
752 | |||
753 | - /* | ||
754 | - * Non sparse file systems zero on extend, so no need | ||
755 | - * to do that now. | ||
756 | - */ | ||
757 | - if (!ocfs2_sparse_alloc(osb) && | ||
758 | - PAGE_SIZE < osb->s_clustersize) | ||
759 | - end = PAGE_SIZE; | ||
760 | - | ||
761 | - ret = ocfs2_grab_eof_pages(inode, 0, end, pages, &num_pages); | ||
762 | + ret = ocfs2_grab_eof_pages(inode, 0, page_end, &page, | ||
763 | + &num_pages); | ||
764 | if (ret) { | ||
765 | mlog_errno(ret); | ||
766 | need_free = 1; | ||
767 | @@ -6982,20 +6967,15 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, | ||
768 | * This should populate the 1st page for us and mark | ||
769 | * it up to date. | ||
770 | */ | ||
771 | - ret = ocfs2_read_inline_data(inode, pages[0], di_bh); | ||
772 | + ret = ocfs2_read_inline_data(inode, page, di_bh); | ||
773 | if (ret) { | ||
774 | mlog_errno(ret); | ||
775 | need_free = 1; | ||
776 | goto out_unlock; | ||
777 | } | ||
778 | |||
779 | - page_end = PAGE_SIZE; | ||
780 | - if (PAGE_SIZE > osb->s_clustersize) | ||
781 | - page_end = osb->s_clustersize; | ||
782 | - | ||
783 | - for (i = 0; i < num_pages; i++) | ||
784 | - ocfs2_map_and_dirty_page(inode, handle, 0, page_end, | ||
785 | - pages[i], i > 0, &phys); | ||
786 | + ocfs2_map_and_dirty_page(inode, handle, 0, page_end, page, 0, | ||
787 | + &phys); | ||
788 | } | ||
789 | |||
790 | spin_lock(&oi->ip_lock); | ||
791 | @@ -7026,8 +7006,8 @@ int ocfs2_convert_inline_data_to_extents(struct inode *inode, | ||
792 | } | ||
793 | |||
794 | out_unlock: | ||
795 | - if (pages) | ||
796 | - ocfs2_unlock_and_free_pages(pages, num_pages); | ||
797 | + if (page) | ||
798 | + ocfs2_unlock_and_free_pages(&page, num_pages); | ||
799 | |||
800 | out_commit: | ||
801 | if (ret < 0 && did_quota) | ||
802 | @@ -7051,8 +7031,6 @@ out_commit: | ||
803 | out: | ||
804 | if (data_ac) | ||
805 | ocfs2_free_alloc_context(data_ac); | ||
806 | -free_pages: | ||
807 | - kfree(pages); | ||
808 | return ret; | ||
809 | } | ||
810 | |||
811 | diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c | ||
812 | index e0fb62f5cf63d..454aad87b866c 100644 | ||
813 | --- a/fs/ocfs2/super.c | ||
814 | +++ b/fs/ocfs2/super.c | ||
815 | @@ -2189,11 +2189,17 @@ static int ocfs2_initialize_super(struct super_block *sb, | ||
816 | } | ||
817 | |||
818 | if (ocfs2_clusterinfo_valid(osb)) { | ||
819 | + /* | ||
820 | + * ci_stack and ci_cluster in ocfs2_cluster_info may not be null | ||
821 | + * terminated, so make sure no overflow happens here by using | ||
822 | + * memcpy. Destination strings will always be null terminated | ||
823 | + * because osb is allocated using kzalloc. | ||
824 | + */ | ||
825 | osb->osb_stackflags = | ||
826 | OCFS2_RAW_SB(di)->s_cluster_info.ci_stackflags; | ||
827 | - strlcpy(osb->osb_cluster_stack, | ||
828 | + memcpy(osb->osb_cluster_stack, | ||
829 | OCFS2_RAW_SB(di)->s_cluster_info.ci_stack, | ||
830 | - OCFS2_STACK_LABEL_LEN + 1); | ||
831 | + OCFS2_STACK_LABEL_LEN); | ||
832 | if (strlen(osb->osb_cluster_stack) != OCFS2_STACK_LABEL_LEN) { | ||
833 | mlog(ML_ERROR, | ||
834 | "couldn't mount because of an invalid " | ||
835 | @@ -2202,9 +2208,9 @@ static int ocfs2_initialize_super(struct super_block *sb, | ||
836 | status = -EINVAL; | ||
837 | goto bail; | ||
838 | } | ||
839 | - strlcpy(osb->osb_cluster_name, | ||
840 | + memcpy(osb->osb_cluster_name, | ||
841 | OCFS2_RAW_SB(di)->s_cluster_info.ci_cluster, | ||
842 | - OCFS2_CLUSTER_NAME_LEN + 1); | ||
843 | + OCFS2_CLUSTER_NAME_LEN); | ||
844 | } else { | ||
845 | /* The empty string is identical with classic tools that | ||
846 | * don't know about s_cluster_info. */ | ||
847 | diff --git a/include/linux/elfcore.h b/include/linux/elfcore.h | ||
848 | index 4adf7faeaeb59..a65dadad65bf8 100644 | ||
849 | --- a/include/linux/elfcore.h | ||
850 | +++ b/include/linux/elfcore.h | ||
851 | @@ -55,7 +55,7 @@ static inline int elf_core_copy_task_xfpregs(struct task_struct *t, elf_fpxregse | ||
852 | } | ||
853 | #endif | ||
854 | |||
855 | -#if defined(CONFIG_UM) || defined(CONFIG_IA64) | ||
856 | +#if (defined(CONFIG_UML) && defined(CONFIG_X86_32)) || defined(CONFIG_IA64) | ||
857 | /* | ||
858 | * These functions parameterize elf_core_dump in fs/binfmt_elf.c to write out | ||
859 | * extra segments containing the gate DSO contents. Dumping its | ||
860 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c | ||
861 | index 84f2caf6a6991..06841602025ef 100644 | ||
862 | --- a/kernel/trace/ftrace.c | ||
863 | +++ b/kernel/trace/ftrace.c | ||
864 | @@ -5288,7 +5288,7 @@ __ftrace_ops_list_func(unsigned long ip, unsigned long parent_ip, | ||
865 | struct ftrace_ops *op; | ||
866 | int bit; | ||
867 | |||
868 | - bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); | ||
869 | + bit = trace_test_and_set_recursion(TRACE_LIST_START); | ||
870 | if (bit < 0) | ||
871 | return; | ||
872 | |||
873 | @@ -5363,7 +5363,7 @@ static void ftrace_ops_assist_func(unsigned long ip, unsigned long parent_ip, | ||
874 | { | ||
875 | int bit; | ||
876 | |||
877 | - bit = trace_test_and_set_recursion(TRACE_LIST_START, TRACE_LIST_MAX); | ||
878 | + bit = trace_test_and_set_recursion(TRACE_LIST_START); | ||
879 | if (bit < 0) | ||
880 | return; | ||
881 | |||
882 | diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h | ||
883 | index d9b7910ef3658..ecea27ba29e68 100644 | ||
884 | --- a/kernel/trace/trace.h | ||
885 | +++ b/kernel/trace/trace.h | ||
886 | @@ -446,23 +446,8 @@ struct tracer { | ||
887 | * When function tracing occurs, the following steps are made: | ||
888 | * If arch does not support a ftrace feature: | ||
889 | * call internal function (uses INTERNAL bits) which calls... | ||
890 | - * If callback is registered to the "global" list, the list | ||
891 | - * function is called and recursion checks the GLOBAL bits. | ||
892 | - * then this function calls... | ||
893 | * The function callback, which can use the FTRACE bits to | ||
894 | * check for recursion. | ||
895 | - * | ||
896 | - * Now if the arch does not suppport a feature, and it calls | ||
897 | - * the global list function which calls the ftrace callback | ||
898 | - * all three of these steps will do a recursion protection. | ||
899 | - * There's no reason to do one if the previous caller already | ||
900 | - * did. The recursion that we are protecting against will | ||
901 | - * go through the same steps again. | ||
902 | - * | ||
903 | - * To prevent the multiple recursion checks, if a recursion | ||
904 | - * bit is set that is higher than the MAX bit of the current | ||
905 | - * check, then we know that the check was made by the previous | ||
906 | - * caller, and we can skip the current check. | ||
907 | */ | ||
908 | enum { | ||
909 | TRACE_BUFFER_BIT, | ||
910 | @@ -475,12 +460,14 @@ enum { | ||
911 | TRACE_FTRACE_NMI_BIT, | ||
912 | TRACE_FTRACE_IRQ_BIT, | ||
913 | TRACE_FTRACE_SIRQ_BIT, | ||
914 | + TRACE_FTRACE_TRANSITION_BIT, | ||
915 | |||
916 | - /* INTERNAL_BITs must be greater than FTRACE_BITs */ | ||
917 | + /* Internal use recursion bits */ | ||
918 | TRACE_INTERNAL_BIT, | ||
919 | TRACE_INTERNAL_NMI_BIT, | ||
920 | TRACE_INTERNAL_IRQ_BIT, | ||
921 | TRACE_INTERNAL_SIRQ_BIT, | ||
922 | + TRACE_INTERNAL_TRANSITION_BIT, | ||
923 | |||
924 | TRACE_BRANCH_BIT, | ||
925 | /* | ||
926 | @@ -491,12 +478,6 @@ enum { | ||
927 | * can only be modified by current, we can reuse trace_recursion. | ||
928 | */ | ||
929 | TRACE_IRQ_BIT, | ||
930 | - | ||
931 | - /* | ||
932 | - * When transitioning between context, the preempt_count() may | ||
933 | - * not be correct. Allow for a single recursion to cover this case. | ||
934 | - */ | ||
935 | - TRACE_TRANSITION_BIT, | ||
936 | }; | ||
937 | |||
938 | #define trace_recursion_set(bit) do { (current)->trace_recursion |= (1<<(bit)); } while (0) | ||
939 | @@ -506,12 +487,18 @@ enum { | ||
940 | #define TRACE_CONTEXT_BITS 4 | ||
941 | |||
942 | #define TRACE_FTRACE_START TRACE_FTRACE_BIT | ||
943 | -#define TRACE_FTRACE_MAX ((1 << (TRACE_FTRACE_START + TRACE_CONTEXT_BITS)) - 1) | ||
944 | |||
945 | #define TRACE_LIST_START TRACE_INTERNAL_BIT | ||
946 | -#define TRACE_LIST_MAX ((1 << (TRACE_LIST_START + TRACE_CONTEXT_BITS)) - 1) | ||
947 | |||
948 | -#define TRACE_CONTEXT_MASK TRACE_LIST_MAX | ||
949 | +#define TRACE_CONTEXT_MASK ((1 << (TRACE_LIST_START + TRACE_CONTEXT_BITS)) - 1) | ||
950 | + | ||
951 | +enum { | ||
952 | + TRACE_CTX_NMI, | ||
953 | + TRACE_CTX_IRQ, | ||
954 | + TRACE_CTX_SOFTIRQ, | ||
955 | + TRACE_CTX_NORMAL, | ||
956 | + TRACE_CTX_TRANSITION, | ||
957 | +}; | ||
958 | |||
959 | static __always_inline int trace_get_context_bit(void) | ||
960 | { | ||
961 | @@ -519,59 +506,48 @@ static __always_inline int trace_get_context_bit(void) | ||
962 | |||
963 | if (in_interrupt()) { | ||
964 | if (in_nmi()) | ||
965 | - bit = 0; | ||
966 | + bit = TRACE_CTX_NMI; | ||
967 | |||
968 | else if (in_irq()) | ||
969 | - bit = 1; | ||
970 | + bit = TRACE_CTX_IRQ; | ||
971 | else | ||
972 | - bit = 2; | ||
973 | + bit = TRACE_CTX_SOFTIRQ; | ||
974 | } else | ||
975 | - bit = 3; | ||
976 | + bit = TRACE_CTX_NORMAL; | ||
977 | |||
978 | return bit; | ||
979 | } | ||
980 | |||
981 | -static __always_inline int trace_test_and_set_recursion(int start, int max) | ||
982 | +static __always_inline int trace_test_and_set_recursion(int start) | ||
983 | { | ||
984 | unsigned int val = current->trace_recursion; | ||
985 | int bit; | ||
986 | |||
987 | - /* A previous recursion check was made */ | ||
988 | - if ((val & TRACE_CONTEXT_MASK) > max) | ||
989 | - return 0; | ||
990 | - | ||
991 | bit = trace_get_context_bit() + start; | ||
992 | if (unlikely(val & (1 << bit))) { | ||
993 | /* | ||
994 | * It could be that preempt_count has not been updated during | ||
995 | * a switch between contexts. Allow for a single recursion. | ||
996 | */ | ||
997 | - bit = TRACE_TRANSITION_BIT; | ||
998 | + bit = start + TRACE_CTX_TRANSITION; | ||
999 | if (trace_recursion_test(bit)) | ||
1000 | return -1; | ||
1001 | trace_recursion_set(bit); | ||
1002 | barrier(); | ||
1003 | - return bit + 1; | ||
1004 | + return bit; | ||
1005 | } | ||
1006 | |||
1007 | - /* Normal check passed, clear the transition to allow it again */ | ||
1008 | - trace_recursion_clear(TRACE_TRANSITION_BIT); | ||
1009 | - | ||
1010 | val |= 1 << bit; | ||
1011 | current->trace_recursion = val; | ||
1012 | barrier(); | ||
1013 | |||
1014 | - return bit + 1; | ||
1015 | + return bit; | ||
1016 | } | ||
1017 | |||
1018 | static __always_inline void trace_clear_recursion(int bit) | ||
1019 | { | ||
1020 | unsigned int val = current->trace_recursion; | ||
1021 | |||
1022 | - if (!bit) | ||
1023 | - return; | ||
1024 | - | ||
1025 | - bit--; | ||
1026 | bit = 1 << bit; | ||
1027 | val &= ~bit; | ||
1028 | |||
1029 | diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c | ||
1030 | index 0efa00d80623d..9434d2fe932f5 100644 | ||
1031 | --- a/kernel/trace/trace_functions.c | ||
1032 | +++ b/kernel/trace/trace_functions.c | ||
1033 | @@ -137,7 +137,7 @@ function_trace_call(unsigned long ip, unsigned long parent_ip, | ||
1034 | pc = preempt_count(); | ||
1035 | preempt_disable_notrace(); | ||
1036 | |||
1037 | - bit = trace_test_and_set_recursion(TRACE_FTRACE_START, TRACE_FTRACE_MAX); | ||
1038 | + bit = trace_test_and_set_recursion(TRACE_FTRACE_START); | ||
1039 | if (bit < 0) | ||
1040 | goto out; | ||
1041 | |||
1042 | diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig | ||
1043 | index e8d56d9a4df2c..dacd2d34a790b 100644 | ||
1044 | --- a/net/netfilter/Kconfig | ||
1045 | +++ b/net/netfilter/Kconfig | ||
1046 | @@ -71,7 +71,7 @@ config NF_CONNTRACK_MARK | ||
1047 | config NF_CONNTRACK_SECMARK | ||
1048 | bool 'Connection tracking security mark support' | ||
1049 | depends on NETWORK_SECMARK | ||
1050 | - default m if NETFILTER_ADVANCED=n | ||
1051 | + default y if NETFILTER_ADVANCED=n | ||
1052 | help | ||
1053 | This option enables security markings to be applied to | ||
1054 | connections. Typically they are copied to connections from | ||
1055 | diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c | ||
1056 | index 4e08305a55c48..3ee198b3bfe28 100644 | ||
1057 | --- a/net/netfilter/ipvs/ip_vs_ctl.c | ||
1058 | +++ b/net/netfilter/ipvs/ip_vs_ctl.c | ||
1059 | @@ -3987,6 +3987,11 @@ static int __net_init ip_vs_control_net_init_sysctl(struct netns_ipvs *ipvs) | ||
1060 | tbl[idx++].data = &ipvs->sysctl_conn_reuse_mode; | ||
1061 | tbl[idx++].data = &ipvs->sysctl_schedule_icmp; | ||
1062 | tbl[idx++].data = &ipvs->sysctl_ignore_tunneled; | ||
1063 | +#ifdef CONFIG_IP_VS_DEBUG | ||
1064 | + /* Global sysctls must be ro in non-init netns */ | ||
1065 | + if (!net_eq(net, &init_net)) | ||
1066 | + tbl[idx++].mode = 0444; | ||
1067 | +#endif | ||
1068 | |||
1069 | ipvs->sysctl_hdr = register_net_sysctl(net, "net/ipv4/vs", tbl); | ||
1070 | if (ipvs->sysctl_hdr == NULL) { | ||
1071 | diff --git a/net/nfc/af_nfc.c b/net/nfc/af_nfc.c | ||
1072 | index 54e40fa478226..1859b8e98ded2 100644 | ||
1073 | --- a/net/nfc/af_nfc.c | ||
1074 | +++ b/net/nfc/af_nfc.c | ||
1075 | @@ -72,6 +72,9 @@ int nfc_proto_register(const struct nfc_protocol *nfc_proto) | ||
1076 | proto_tab[nfc_proto->id] = nfc_proto; | ||
1077 | write_unlock(&proto_tab_lock); | ||
1078 | |||
1079 | + if (rc) | ||
1080 | + proto_unregister(nfc_proto->proto); | ||
1081 | + | ||
1082 | return rc; | ||
1083 | } | ||
1084 | EXPORT_SYMBOL(nfc_proto_register); | ||
1085 | diff --git a/net/nfc/digital_core.c b/net/nfc/digital_core.c | ||
1086 | index 0fd5518bf2522..8d083037f05bf 100644 | ||
1087 | --- a/net/nfc/digital_core.c | ||
1088 | +++ b/net/nfc/digital_core.c | ||
1089 | @@ -286,6 +286,7 @@ int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param) | ||
1090 | static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech) | ||
1091 | { | ||
1092 | struct digital_tg_mdaa_params *params; | ||
1093 | + int rc; | ||
1094 | |||
1095 | params = kzalloc(sizeof(struct digital_tg_mdaa_params), GFP_KERNEL); | ||
1096 | if (!params) | ||
1097 | @@ -300,8 +301,12 @@ static int digital_tg_listen_mdaa(struct nfc_digital_dev *ddev, u8 rf_tech) | ||
1098 | get_random_bytes(params->nfcid2 + 2, NFC_NFCID2_MAXSIZE - 2); | ||
1099 | params->sc = DIGITAL_SENSF_FELICA_SC; | ||
1100 | |||
1101 | - return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params, | ||
1102 | - 500, digital_tg_recv_atr_req, NULL); | ||
1103 | + rc = digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN_MDAA, NULL, params, | ||
1104 | + 500, digital_tg_recv_atr_req, NULL); | ||
1105 | + if (rc) | ||
1106 | + kfree(params); | ||
1107 | + | ||
1108 | + return rc; | ||
1109 | } | ||
1110 | |||
1111 | static int digital_tg_listen_md(struct nfc_digital_dev *ddev, u8 rf_tech) | ||
1112 | diff --git a/net/nfc/digital_technology.c b/net/nfc/digital_technology.c | ||
1113 | index d9080dec5d278..76622b3678fbb 100644 | ||
1114 | --- a/net/nfc/digital_technology.c | ||
1115 | +++ b/net/nfc/digital_technology.c | ||
1116 | @@ -473,8 +473,12 @@ static int digital_in_send_sdd_req(struct nfc_digital_dev *ddev, | ||
1117 | *skb_put(skb, sizeof(u8)) = sel_cmd; | ||
1118 | *skb_put(skb, sizeof(u8)) = DIGITAL_SDD_REQ_SEL_PAR; | ||
1119 | |||
1120 | - return digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sdd_res, | ||
1121 | - target); | ||
1122 | + rc = digital_in_send_cmd(ddev, skb, 30, digital_in_recv_sdd_res, | ||
1123 | + target); | ||
1124 | + if (rc) | ||
1125 | + kfree_skb(skb); | ||
1126 | + | ||
1127 | + return rc; | ||
1128 | } | ||
1129 | |||
1130 | static void digital_in_recv_sens_res(struct nfc_digital_dev *ddev, void *arg, | ||
1131 | diff --git a/net/nfc/nci/rsp.c b/net/nfc/nci/rsp.c | ||
1132 | index e3bbf1937d0e9..7681f89dc312b 100644 | ||
1133 | --- a/net/nfc/nci/rsp.c | ||
1134 | +++ b/net/nfc/nci/rsp.c | ||
1135 | @@ -289,6 +289,8 @@ static void nci_core_conn_close_rsp_packet(struct nci_dev *ndev, | ||
1136 | ndev->cur_conn_id); | ||
1137 | if (conn_info) { | ||
1138 | list_del(&conn_info->list); | ||
1139 | + if (conn_info == ndev->rf_conn_info) | ||
1140 | + ndev->rf_conn_info = NULL; | ||
1141 | devm_kfree(&ndev->nfc_dev->dev, conn_info); | ||
1142 | } | ||
1143 | } | ||
1144 | diff --git a/sound/core/seq/seq_device.c b/sound/core/seq/seq_device.c | ||
1145 | index e40a2cba5002a..5d16b20791195 100644 | ||
1146 | --- a/sound/core/seq/seq_device.c | ||
1147 | +++ b/sound/core/seq/seq_device.c | ||
1148 | @@ -162,6 +162,8 @@ static int snd_seq_device_dev_free(struct snd_device *device) | ||
1149 | struct snd_seq_device *dev = device->device_data; | ||
1150 | |||
1151 | cancel_autoload_drivers(); | ||
1152 | + if (dev->private_free) | ||
1153 | + dev->private_free(dev); | ||
1154 | put_device(&dev->dev); | ||
1155 | return 0; | ||
1156 | } | ||
1157 | @@ -189,11 +191,7 @@ static int snd_seq_device_dev_disconnect(struct snd_device *device) | ||
1158 | |||
1159 | static void snd_seq_dev_release(struct device *dev) | ||
1160 | { | ||
1161 | - struct snd_seq_device *sdev = to_seq_dev(dev); | ||
1162 | - | ||
1163 | - if (sdev->private_free) | ||
1164 | - sdev->private_free(sdev); | ||
1165 | - kfree(sdev); | ||
1166 | + kfree(to_seq_dev(dev)); | ||
1167 | } | ||
1168 | |||
1169 | /* | ||
1170 | diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c | ||
1171 | index 00c6af2ae1c29..f0e112906c687 100644 | ||
1172 | --- a/sound/hda/hdac_controller.c | ||
1173 | +++ b/sound/hda/hdac_controller.c | ||
1174 | @@ -389,8 +389,9 @@ static int azx_reset(struct hdac_bus *bus, bool full_reset) | ||
1175 | if (!full_reset) | ||
1176 | goto skip_reset; | ||
1177 | |||
1178 | - /* clear STATESTS */ | ||
1179 | - snd_hdac_chip_writew(bus, STATESTS, STATESTS_INT_MASK); | ||
1180 | + /* clear STATESTS if not in reset */ | ||
1181 | + if (snd_hdac_chip_readb(bus, GCTL) & AZX_GCTL_RESET) | ||
1182 | + snd_hdac_chip_writew(bus, STATESTS, STATESTS_INT_MASK); | ||
1183 | |||
1184 | /* reset controller */ | ||
1185 | snd_hdac_bus_enter_link_reset(bus); | ||
1186 | diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c | ||
1187 | index 11edb6f6bdafe..5451705f429e0 100644 | ||
1188 | --- a/sound/soc/soc-dapm.c | ||
1189 | +++ b/sound/soc/soc-dapm.c | ||
1190 | @@ -2410,6 +2410,7 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, | ||
1191 | const char *pin, int status) | ||
1192 | { | ||
1193 | struct snd_soc_dapm_widget *w = dapm_find_widget(dapm, pin, true); | ||
1194 | + int ret = 0; | ||
1195 | |||
1196 | dapm_assert_locked(dapm); | ||
1197 | |||
1198 | @@ -2422,13 +2423,14 @@ static int snd_soc_dapm_set_pin(struct snd_soc_dapm_context *dapm, | ||
1199 | dapm_mark_dirty(w, "pin configuration"); | ||
1200 | dapm_widget_invalidate_input_paths(w); | ||
1201 | dapm_widget_invalidate_output_paths(w); | ||
1202 | + ret = 1; | ||
1203 | } | ||
1204 | |||
1205 | w->connected = status; | ||
1206 | if (status == 0) | ||
1207 | w->force = 0; | ||
1208 | |||
1209 | - return 0; | ||
1210 | + return ret; | ||
1211 | } | ||
1212 | |||
1213 | /** | ||
1214 | @@ -3323,14 +3325,15 @@ int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol, | ||
1215 | { | ||
1216 | struct snd_soc_card *card = snd_kcontrol_chip(kcontrol); | ||
1217 | const char *pin = (const char *)kcontrol->private_value; | ||
1218 | + int ret; | ||
1219 | |||
1220 | if (ucontrol->value.integer.value[0]) | ||
1221 | - snd_soc_dapm_enable_pin(&card->dapm, pin); | ||
1222 | + ret = snd_soc_dapm_enable_pin(&card->dapm, pin); | ||
1223 | else | ||
1224 | - snd_soc_dapm_disable_pin(&card->dapm, pin); | ||
1225 | + ret = snd_soc_dapm_disable_pin(&card->dapm, pin); | ||
1226 | |||
1227 | snd_soc_dapm_sync(&card->dapm); | ||
1228 | - return 0; | ||
1229 | + return ret; | ||
1230 | } | ||
1231 | EXPORT_SYMBOL_GPL(snd_soc_dapm_put_pin_switch); | ||
1232 | |||
1233 | @@ -3706,7 +3709,7 @@ static int snd_soc_dapm_dai_link_put(struct snd_kcontrol *kcontrol, | ||
1234 | |||
1235 | w->params_select = ucontrol->value.enumerated.item[0]; | ||
1236 | |||
1237 | - return 0; | ||
1238 | + return 1; | ||
1239 | } | ||
1240 | |||
1241 | int snd_soc_dapm_new_pcm(struct snd_soc_card *card, | ||
1242 | diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h | ||
1243 | index d3d3e05fe5b8d..1904fc542025d 100644 | ||
1244 | --- a/sound/usb/quirks-table.h | ||
1245 | +++ b/sound/usb/quirks-table.h | ||
1246 | @@ -3446,5 +3446,37 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), | ||
1247 | } | ||
1248 | } | ||
1249 | }, | ||
1250 | +{ | ||
1251 | + /* | ||
1252 | + * Sennheiser GSP670 | ||
1253 | + * Change order of interfaces loaded | ||
1254 | + */ | ||
1255 | + USB_DEVICE(0x1395, 0x0300), | ||
1256 | + .bInterfaceClass = USB_CLASS_PER_INTERFACE, | ||
1257 | + .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) { | ||
1258 | + .ifnum = QUIRK_ANY_INTERFACE, | ||
1259 | + .type = QUIRK_COMPOSITE, | ||
1260 | + .data = &(const struct snd_usb_audio_quirk[]) { | ||
1261 | + // Communication | ||
1262 | + { | ||
1263 | + .ifnum = 3, | ||
1264 | + .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
1265 | + }, | ||
1266 | + // Recording | ||
1267 | + { | ||
1268 | + .ifnum = 4, | ||
1269 | + .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
1270 | + }, | ||
1271 | + // Main | ||
1272 | + { | ||
1273 | + .ifnum = 1, | ||
1274 | + .type = QUIRK_AUDIO_STANDARD_INTERFACE | ||
1275 | + }, | ||
1276 | + { | ||
1277 | + .ifnum = -1 | ||
1278 | + } | ||
1279 | + } | ||
1280 | + } | ||
1281 | +}, | ||
1282 | |||
1283 | #undef USB_DEVICE_VENDOR_SPEC |