Contents of /trunk/kernel-alx/patches-5.4/0223-5.4.124-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(show annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (18 months ago) by niro
File size: 189575 byte(s)
Mon Oct 24 12:40:44 2022 UTC (18 months ago) by niro
File size: 189575 byte(s)
-add missing
1 | diff --git a/Documentation/userspace-api/seccomp_filter.rst b/Documentation/userspace-api/seccomp_filter.rst |
2 | index bd9165241b6c8..6efb41cc80725 100644 |
3 | --- a/Documentation/userspace-api/seccomp_filter.rst |
4 | +++ b/Documentation/userspace-api/seccomp_filter.rst |
5 | @@ -250,14 +250,14 @@ Users can read via ``ioctl(SECCOMP_IOCTL_NOTIF_RECV)`` (or ``poll()``) on a |
6 | seccomp notification fd to receive a ``struct seccomp_notif``, which contains |
7 | five members: the input length of the structure, a unique-per-filter ``id``, |
8 | the ``pid`` of the task which triggered this request (which may be 0 if the |
9 | -task is in a pid ns not visible from the listener's pid namespace), a ``flags`` |
10 | -member which for now only has ``SECCOMP_NOTIF_FLAG_SIGNALED``, representing |
11 | -whether or not the notification is a result of a non-fatal signal, and the |
12 | -``data`` passed to seccomp. Userspace can then make a decision based on this |
13 | -information about what to do, and ``ioctl(SECCOMP_IOCTL_NOTIF_SEND)`` a |
14 | -response, indicating what should be returned to userspace. The ``id`` member of |
15 | -``struct seccomp_notif_resp`` should be the same ``id`` as in ``struct |
16 | -seccomp_notif``. |
17 | +task is in a pid ns not visible from the listener's pid namespace). The |
18 | +notification also contains the ``data`` passed to seccomp, and a filters flag. |
19 | +The structure should be zeroed out prior to calling the ioctl. |
20 | + |
21 | +Userspace can then make a decision based on this information about what to do, |
22 | +and ``ioctl(SECCOMP_IOCTL_NOTIF_SEND)`` a response, indicating what should be |
23 | +returned to userspace. The ``id`` member of ``struct seccomp_notif_resp`` should |
24 | +be the same ``id`` as in ``struct seccomp_notif``. |
25 | |
26 | It is worth noting that ``struct seccomp_data`` contains the values of register |
27 | arguments to the syscall, but does not contain pointers to memory. The task's |
28 | diff --git a/Makefile b/Makefile |
29 | index d3f7a032f080b..22668742d3d04 100644 |
30 | --- a/Makefile |
31 | +++ b/Makefile |
32 | @@ -1,7 +1,7 @@ |
33 | # SPDX-License-Identifier: GPL-2.0 |
34 | VERSION = 5 |
35 | PATCHLEVEL = 4 |
36 | -SUBLEVEL = 123 |
37 | +SUBLEVEL = 124 |
38 | EXTRAVERSION = |
39 | NAME = Kleptomaniac Octopus |
40 | |
41 | diff --git a/arch/mips/alchemy/board-xxs1500.c b/arch/mips/alchemy/board-xxs1500.c |
42 | index c67dfe1f49971..ec35aedc7727d 100644 |
43 | --- a/arch/mips/alchemy/board-xxs1500.c |
44 | +++ b/arch/mips/alchemy/board-xxs1500.c |
45 | @@ -18,6 +18,7 @@ |
46 | #include <asm/reboot.h> |
47 | #include <asm/setup.h> |
48 | #include <asm/mach-au1x00/au1000.h> |
49 | +#include <asm/mach-au1x00/gpio-au1000.h> |
50 | #include <prom.h> |
51 | |
52 | const char *get_system_type(void) |
53 | diff --git a/arch/mips/ralink/of.c b/arch/mips/ralink/of.c |
54 | index 59b23095bfbb4..4e38a905ab386 100644 |
55 | --- a/arch/mips/ralink/of.c |
56 | +++ b/arch/mips/ralink/of.c |
57 | @@ -8,6 +8,7 @@ |
58 | |
59 | #include <linux/io.h> |
60 | #include <linux/clk.h> |
61 | +#include <linux/export.h> |
62 | #include <linux/init.h> |
63 | #include <linux/sizes.h> |
64 | #include <linux/of_fdt.h> |
65 | @@ -25,6 +26,7 @@ |
66 | |
67 | __iomem void *rt_sysc_membase; |
68 | __iomem void *rt_memc_membase; |
69 | +EXPORT_SYMBOL_GPL(rt_sysc_membase); |
70 | |
71 | __iomem void *plat_of_remap_node(const char *node) |
72 | { |
73 | diff --git a/arch/openrisc/include/asm/barrier.h b/arch/openrisc/include/asm/barrier.h |
74 | new file mode 100644 |
75 | index 0000000000000..7538294721bed |
76 | --- /dev/null |
77 | +++ b/arch/openrisc/include/asm/barrier.h |
78 | @@ -0,0 +1,9 @@ |
79 | +/* SPDX-License-Identifier: GPL-2.0 */ |
80 | +#ifndef __ASM_BARRIER_H |
81 | +#define __ASM_BARRIER_H |
82 | + |
83 | +#define mb() asm volatile ("l.msync" ::: "memory") |
84 | + |
85 | +#include <asm-generic/barrier.h> |
86 | + |
87 | +#endif /* __ASM_BARRIER_H */ |
88 | diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c |
89 | index f69609b47fef8..d390ab5e51d3f 100644 |
90 | --- a/drivers/char/hpet.c |
91 | +++ b/drivers/char/hpet.c |
92 | @@ -984,6 +984,8 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data) |
93 | hdp->hd_phys_address = fixmem32->address; |
94 | hdp->hd_address = ioremap(fixmem32->address, |
95 | HPET_RANGE_SIZE); |
96 | + if (!hdp->hd_address) |
97 | + return AE_ERROR; |
98 | |
99 | if (hpet_is_known(hdp)) { |
100 | iounmap(hdp->hd_address); |
101 | diff --git a/drivers/dma/qcom/hidma_mgmt.c b/drivers/dma/qcom/hidma_mgmt.c |
102 | index 806ca02c52d71..62026607f3f8b 100644 |
103 | --- a/drivers/dma/qcom/hidma_mgmt.c |
104 | +++ b/drivers/dma/qcom/hidma_mgmt.c |
105 | @@ -418,8 +418,23 @@ static int __init hidma_mgmt_init(void) |
106 | hidma_mgmt_of_populate_channels(child); |
107 | } |
108 | #endif |
109 | - return platform_driver_register(&hidma_mgmt_driver); |
110 | + /* |
111 | + * We do not check for return value here, as it is assumed that |
112 | + * platform_driver_register must not fail. The reason for this is that |
113 | + * the (potential) hidma_mgmt_of_populate_channels calls above are not |
114 | + * cleaned up if it does fail, and to do this work is quite |
115 | + * complicated. In particular, various calls of of_address_to_resource, |
116 | + * of_irq_to_resource, platform_device_register_full, of_dma_configure, |
117 | + * and of_msi_configure which then call other functions and so on, must |
118 | + * be cleaned up - this is not a trivial exercise. |
119 | + * |
120 | + * Currently, this module is not intended to be unloaded, and there is |
121 | + * no module_exit function defined which does the needed cleanup. For |
122 | + * this reason, we have to assume success here. |
123 | + */ |
124 | + platform_driver_register(&hidma_mgmt_driver); |
125 | |
126 | + return 0; |
127 | } |
128 | module_init(hidma_mgmt_init); |
129 | MODULE_LICENSE("GPL v2"); |
130 | diff --git a/drivers/gpio/gpio-cadence.c b/drivers/gpio/gpio-cadence.c |
131 | index a4d3239d25944..4ab3fcd9b9ba6 100644 |
132 | --- a/drivers/gpio/gpio-cadence.c |
133 | +++ b/drivers/gpio/gpio-cadence.c |
134 | @@ -278,6 +278,7 @@ static const struct of_device_id cdns_of_ids[] = { |
135 | { .compatible = "cdns,gpio-r1p02" }, |
136 | { /* sentinel */ }, |
137 | }; |
138 | +MODULE_DEVICE_TABLE(of, cdns_of_ids); |
139 | |
140 | static struct platform_driver cdns_gpio_driver = { |
141 | .driver = { |
142 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
143 | index 3b3fc9a426e91..765f9a6c46401 100644 |
144 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
145 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c |
146 | @@ -3704,7 +3704,6 @@ out: |
147 | r = amdgpu_ib_ring_tests(tmp_adev); |
148 | if (r) { |
149 | dev_err(tmp_adev->dev, "ib ring test failed (%d).\n", r); |
150 | - r = amdgpu_device_ip_suspend(tmp_adev); |
151 | need_full_reset = true; |
152 | r = -EAGAIN; |
153 | goto end; |
154 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c |
155 | index fd94a17fb2c6d..46522804c7d84 100644 |
156 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c |
157 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c |
158 | @@ -289,10 +289,13 @@ out: |
159 | static int amdgpu_fbdev_destroy(struct drm_device *dev, struct amdgpu_fbdev *rfbdev) |
160 | { |
161 | struct amdgpu_framebuffer *rfb = &rfbdev->rfb; |
162 | + int i; |
163 | |
164 | drm_fb_helper_unregister_fbi(&rfbdev->helper); |
165 | |
166 | if (rfb->base.obj[0]) { |
167 | + for (i = 0; i < rfb->base.format->num_planes; i++) |
168 | + drm_gem_object_put(rfb->base.obj[0]); |
169 | amdgpufb_destroy_pinned_object(rfb->base.obj[0]); |
170 | rfb->base.obj[0] = NULL; |
171 | drm_framebuffer_unregister_private(&rfb->base); |
172 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |
173 | index 91e3a87b1de83..58e14d3040f03 100644 |
174 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |
175 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c |
176 | @@ -1300,6 +1300,7 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm) |
177 | if (gtt && gtt->userptr) { |
178 | amdgpu_ttm_tt_set_user_pages(ttm, NULL); |
179 | kfree(ttm->sg); |
180 | + ttm->sg = NULL; |
181 | ttm->page_flags &= ~TTM_PAGE_FLAG_SG; |
182 | return; |
183 | } |
184 | diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c |
185 | index 4f0f0de832937..1bb0f3c0978a8 100644 |
186 | --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c |
187 | +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c |
188 | @@ -233,9 +233,13 @@ static int vcn_v1_0_hw_fini(void *handle) |
189 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
190 | struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec; |
191 | |
192 | + cancel_delayed_work_sync(&adev->vcn.idle_work); |
193 | + |
194 | if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) || |
195 | - RREG32_SOC15(VCN, 0, mmUVD_STATUS)) |
196 | + (adev->vcn.cur_state != AMD_PG_STATE_GATE && |
197 | + RREG32_SOC15(VCN, 0, mmUVD_STATUS))) { |
198 | vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE); |
199 | + } |
200 | |
201 | ring->sched.ready = false; |
202 | |
203 | diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c |
204 | index cd2cbe760e883..82327ee96f953 100644 |
205 | --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c |
206 | +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c |
207 | @@ -293,6 +293,8 @@ static int vcn_v2_0_hw_fini(void *handle) |
208 | struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec; |
209 | int i; |
210 | |
211 | + cancel_delayed_work_sync(&adev->vcn.idle_work); |
212 | + |
213 | if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) || |
214 | (adev->vcn.cur_state != AMD_PG_STATE_GATE && |
215 | RREG32_SOC15(VCN, 0, mmUVD_STATUS))) |
216 | diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |
217 | index 9d778a0b2c5e2..4c9a1633b02a7 100644 |
218 | --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |
219 | +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c |
220 | @@ -302,6 +302,8 @@ static int vcn_v2_5_hw_fini(void *handle) |
221 | struct amdgpu_ring *ring; |
222 | int i; |
223 | |
224 | + cancel_delayed_work_sync(&adev->vcn.idle_work); |
225 | + |
226 | for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { |
227 | if (adev->vcn.harvest_config & (1 << i)) |
228 | continue; |
229 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
230 | index 40041c61a100e..6b03267021eac 100644 |
231 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
232 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c |
233 | @@ -936,6 +936,24 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) |
234 | dc_is_dvi_signal(link->connector_signal)) { |
235 | if (prev_sink != NULL) |
236 | dc_sink_release(prev_sink); |
237 | + link_disconnect_sink(link); |
238 | + |
239 | + return false; |
240 | + } |
241 | + /* |
242 | + * Abort detection for DP connectors if we have |
243 | + * no EDID and connector is active converter |
244 | + * as there are no display downstream |
245 | + * |
246 | + */ |
247 | + if (dc_is_dp_sst_signal(link->connector_signal) && |
248 | + (link->dpcd_caps.dongle_type == |
249 | + DISPLAY_DONGLE_DP_VGA_CONVERTER || |
250 | + link->dpcd_caps.dongle_type == |
251 | + DISPLAY_DONGLE_DP_DVI_CONVERTER)) { |
252 | + if (prev_sink) |
253 | + dc_sink_release(prev_sink); |
254 | + link_disconnect_sink(link); |
255 | |
256 | return false; |
257 | } |
258 | diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c |
259 | index c2fccf97f7a42..abc8c42b8b0c1 100644 |
260 | --- a/drivers/gpu/drm/i915/display/intel_dp.c |
261 | +++ b/drivers/gpu/drm/i915/display/intel_dp.c |
262 | @@ -3634,7 +3634,7 @@ static void chv_dp_post_pll_disable(struct intel_encoder *encoder, |
263 | * link status information |
264 | */ |
265 | bool |
266 | -intel_dp_get_link_status(struct intel_dp *intel_dp, u8 link_status[DP_LINK_STATUS_SIZE]) |
267 | +intel_dp_get_link_status(struct intel_dp *intel_dp, u8 *link_status) |
268 | { |
269 | return drm_dp_dpcd_read(&intel_dp->aux, DP_LANE0_1_STATUS, link_status, |
270 | DP_LINK_STATUS_SIZE) == DP_LINK_STATUS_SIZE; |
271 | @@ -4706,7 +4706,18 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp) |
272 | bool bret; |
273 | |
274 | if (intel_dp->is_mst) { |
275 | - u8 esi[DP_DPRX_ESI_LEN] = { 0 }; |
276 | + /* |
277 | + * The +2 is because DP_DPRX_ESI_LEN is 14, but we then |
278 | + * pass in "esi+10" to drm_dp_channel_eq_ok(), which |
279 | + * takes a 6-byte array. So we actually need 16 bytes |
280 | + * here. |
281 | + * |
282 | + * Somebody who knows what the limits actually are |
283 | + * should check this, but for now this is at least |
284 | + * harmless and avoids a valid compiler warning about |
285 | + * using more of the array than we have allocated. |
286 | + */ |
287 | + u8 esi[DP_DPRX_ESI_LEN+2] = {}; |
288 | int ret = 0; |
289 | int retry; |
290 | bool handled; |
291 | diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c |
292 | index 86d0961112773..61a6536e7e61a 100644 |
293 | --- a/drivers/gpu/drm/meson/meson_drv.c |
294 | +++ b/drivers/gpu/drm/meson/meson_drv.c |
295 | @@ -423,11 +423,12 @@ static int meson_probe_remote(struct platform_device *pdev, |
296 | static void meson_drv_shutdown(struct platform_device *pdev) |
297 | { |
298 | struct meson_drm *priv = dev_get_drvdata(&pdev->dev); |
299 | - struct drm_device *drm = priv->drm; |
300 | |
301 | - DRM_DEBUG_DRIVER("\n"); |
302 | - drm_kms_helper_poll_fini(drm); |
303 | - drm_atomic_helper_shutdown(drm); |
304 | + if (!priv) |
305 | + return; |
306 | + |
307 | + drm_kms_helper_poll_fini(priv->drm); |
308 | + drm_atomic_helper_shutdown(priv->drm); |
309 | } |
310 | |
311 | static int meson_drv_probe(struct platform_device *pdev) |
312 | diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c |
313 | index 2b6a4c1f188f4..a959062ded4f8 100644 |
314 | --- a/drivers/i2c/busses/i2c-i801.c |
315 | +++ b/drivers/i2c/busses/i2c-i801.c |
316 | @@ -379,11 +379,9 @@ static int i801_check_post(struct i801_priv *priv, int status) |
317 | dev_err(&priv->pci_dev->dev, "Transaction timeout\n"); |
318 | /* try to stop the current command */ |
319 | dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n"); |
320 | - outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL, |
321 | - SMBHSTCNT(priv)); |
322 | + outb_p(SMBHSTCNT_KILL, SMBHSTCNT(priv)); |
323 | usleep_range(1000, 2000); |
324 | - outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL), |
325 | - SMBHSTCNT(priv)); |
326 | + outb_p(0, SMBHSTCNT(priv)); |
327 | |
328 | /* Check if it worked */ |
329 | status = inb_p(SMBHSTSTS(priv)); |
330 | diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c |
331 | index c98ef4c4a0c9e..d6322698b2458 100644 |
332 | --- a/drivers/i2c/busses/i2c-s3c2410.c |
333 | +++ b/drivers/i2c/busses/i2c-s3c2410.c |
334 | @@ -484,7 +484,10 @@ static int i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat) |
335 | * forces us to send a new START |
336 | * when we change direction |
337 | */ |
338 | + dev_dbg(i2c->dev, |
339 | + "missing START before write->read\n"); |
340 | s3c24xx_i2c_stop(i2c, -EINVAL); |
341 | + break; |
342 | } |
343 | |
344 | goto retry_write; |
345 | diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c |
346 | index d5dd58c27ce5f..0dc2494f1a37b 100644 |
347 | --- a/drivers/i2c/busses/i2c-sh_mobile.c |
348 | +++ b/drivers/i2c/busses/i2c-sh_mobile.c |
349 | @@ -813,7 +813,7 @@ static const struct sh_mobile_dt_config r8a7740_dt_config = { |
350 | static const struct of_device_id sh_mobile_i2c_dt_ids[] = { |
351 | { .compatible = "renesas,iic-r8a73a4", .data = &fast_clock_dt_config }, |
352 | { .compatible = "renesas,iic-r8a7740", .data = &r8a7740_dt_config }, |
353 | - { .compatible = "renesas,iic-r8a774c0", .data = &fast_clock_dt_config }, |
354 | + { .compatible = "renesas,iic-r8a774c0", .data = &v2_freq_calc_dt_config }, |
355 | { .compatible = "renesas,iic-r8a7790", .data = &v2_freq_calc_dt_config }, |
356 | { .compatible = "renesas,iic-r8a7791", .data = &v2_freq_calc_dt_config }, |
357 | { .compatible = "renesas,iic-r8a7792", .data = &v2_freq_calc_dt_config }, |
358 | diff --git a/drivers/iio/adc/ad7124.c b/drivers/iio/adc/ad7124.c |
359 | index 306bf15023a78..fa808f9c0d9af 100644 |
360 | --- a/drivers/iio/adc/ad7124.c |
361 | +++ b/drivers/iio/adc/ad7124.c |
362 | @@ -473,6 +473,13 @@ static int ad7124_of_parse_channel_config(struct iio_dev *indio_dev, |
363 | if (ret) |
364 | goto err; |
365 | |
366 | + if (channel >= indio_dev->num_channels) { |
367 | + dev_err(indio_dev->dev.parent, |
368 | + "Channel index >= number of channels\n"); |
369 | + ret = -EINVAL; |
370 | + goto err; |
371 | + } |
372 | + |
373 | ret = of_property_read_u32_array(child, "diff-channels", |
374 | ain, 2); |
375 | if (ret) |
376 | @@ -564,6 +571,11 @@ static int ad7124_setup(struct ad7124_state *st) |
377 | return ret; |
378 | } |
379 | |
380 | +static void ad7124_reg_disable(void *r) |
381 | +{ |
382 | + regulator_disable(r); |
383 | +} |
384 | + |
385 | static int ad7124_probe(struct spi_device *spi) |
386 | { |
387 | const struct spi_device_id *id; |
388 | @@ -607,17 +619,20 @@ static int ad7124_probe(struct spi_device *spi) |
389 | ret = regulator_enable(st->vref[i]); |
390 | if (ret) |
391 | return ret; |
392 | + |
393 | + ret = devm_add_action_or_reset(&spi->dev, ad7124_reg_disable, |
394 | + st->vref[i]); |
395 | + if (ret) |
396 | + return ret; |
397 | } |
398 | |
399 | st->mclk = devm_clk_get(&spi->dev, "mclk"); |
400 | - if (IS_ERR(st->mclk)) { |
401 | - ret = PTR_ERR(st->mclk); |
402 | - goto error_regulator_disable; |
403 | - } |
404 | + if (IS_ERR(st->mclk)) |
405 | + return PTR_ERR(st->mclk); |
406 | |
407 | ret = clk_prepare_enable(st->mclk); |
408 | if (ret < 0) |
409 | - goto error_regulator_disable; |
410 | + return ret; |
411 | |
412 | ret = ad7124_soft_reset(st); |
413 | if (ret < 0) |
414 | @@ -643,11 +658,6 @@ error_remove_trigger: |
415 | ad_sd_cleanup_buffer_and_trigger(indio_dev); |
416 | error_clk_disable_unprepare: |
417 | clk_disable_unprepare(st->mclk); |
418 | -error_regulator_disable: |
419 | - for (i = ARRAY_SIZE(st->vref) - 1; i >= 0; i--) { |
420 | - if (!IS_ERR_OR_NULL(st->vref[i])) |
421 | - regulator_disable(st->vref[i]); |
422 | - } |
423 | |
424 | return ret; |
425 | } |
426 | @@ -656,17 +666,11 @@ static int ad7124_remove(struct spi_device *spi) |
427 | { |
428 | struct iio_dev *indio_dev = spi_get_drvdata(spi); |
429 | struct ad7124_state *st = iio_priv(indio_dev); |
430 | - int i; |
431 | |
432 | iio_device_unregister(indio_dev); |
433 | ad_sd_cleanup_buffer_and_trigger(indio_dev); |
434 | clk_disable_unprepare(st->mclk); |
435 | |
436 | - for (i = ARRAY_SIZE(st->vref) - 1; i >= 0; i--) { |
437 | - if (!IS_ERR_OR_NULL(st->vref[i])) |
438 | - regulator_disable(st->vref[i]); |
439 | - } |
440 | - |
441 | return 0; |
442 | } |
443 | |
444 | diff --git a/drivers/iio/adc/ad7768-1.c b/drivers/iio/adc/ad7768-1.c |
445 | index 0d132708c4295..0f6c1be1cda2c 100644 |
446 | --- a/drivers/iio/adc/ad7768-1.c |
447 | +++ b/drivers/iio/adc/ad7768-1.c |
448 | @@ -166,6 +166,10 @@ struct ad7768_state { |
449 | * transfer buffers to live in their own cache lines. |
450 | */ |
451 | union { |
452 | + struct { |
453 | + __be32 chan; |
454 | + s64 timestamp; |
455 | + } scan; |
456 | __be32 d32; |
457 | u8 d8[2]; |
458 | } data ____cacheline_aligned; |
459 | @@ -459,11 +463,11 @@ static irqreturn_t ad7768_trigger_handler(int irq, void *p) |
460 | |
461 | mutex_lock(&st->lock); |
462 | |
463 | - ret = spi_read(st->spi, &st->data.d32, 3); |
464 | + ret = spi_read(st->spi, &st->data.scan.chan, 3); |
465 | if (ret < 0) |
466 | goto err_unlock; |
467 | |
468 | - iio_push_to_buffers_with_timestamp(indio_dev, &st->data.d32, |
469 | + iio_push_to_buffers_with_timestamp(indio_dev, &st->data.scan, |
470 | iio_get_time_ns(indio_dev)); |
471 | |
472 | iio_trigger_notify_done(indio_dev->trig); |
473 | diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c |
474 | index 6ed6d14102016..947d6c7772344 100644 |
475 | --- a/drivers/iio/adc/ad7793.c |
476 | +++ b/drivers/iio/adc/ad7793.c |
477 | @@ -278,6 +278,7 @@ static int ad7793_setup(struct iio_dev *indio_dev, |
478 | id &= AD7793_ID_MASK; |
479 | |
480 | if (id != st->chip_info->id) { |
481 | + ret = -ENODEV; |
482 | dev_err(&st->sd.spi->dev, "device ID query failed\n"); |
483 | goto out; |
484 | } |
485 | diff --git a/drivers/iio/gyro/fxas21002c_core.c b/drivers/iio/gyro/fxas21002c_core.c |
486 | index 89d2bb2282eac..958cf8b6002ca 100644 |
487 | --- a/drivers/iio/gyro/fxas21002c_core.c |
488 | +++ b/drivers/iio/gyro/fxas21002c_core.c |
489 | @@ -333,6 +333,7 @@ static int fxas21002c_temp_get(struct fxas21002c_data *data, int *val) |
490 | ret = regmap_field_read(data->regmap_fields[F_TEMP], &temp); |
491 | if (ret < 0) { |
492 | dev_err(dev, "failed to read temp: %d\n", ret); |
493 | + fxas21002c_pm_put(data); |
494 | goto data_unlock; |
495 | } |
496 | |
497 | @@ -366,6 +367,7 @@ static int fxas21002c_axis_get(struct fxas21002c_data *data, |
498 | &axis_be, sizeof(axis_be)); |
499 | if (ret < 0) { |
500 | dev_err(dev, "failed to read axis: %d: %d\n", index, ret); |
501 | + fxas21002c_pm_put(data); |
502 | goto data_unlock; |
503 | } |
504 | |
505 | diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c |
506 | index 1b9795743276d..24616525c90dc 100644 |
507 | --- a/drivers/iommu/dmar.c |
508 | +++ b/drivers/iommu/dmar.c |
509 | @@ -1110,7 +1110,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd) |
510 | |
511 | err = iommu_device_register(&iommu->iommu); |
512 | if (err) |
513 | - goto err_unmap; |
514 | + goto err_sysfs; |
515 | } |
516 | |
517 | drhd->iommu = iommu; |
518 | @@ -1118,6 +1118,8 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd) |
519 | |
520 | return 0; |
521 | |
522 | +err_sysfs: |
523 | + iommu_device_sysfs_remove(&iommu->iommu); |
524 | err_unmap: |
525 | unmap_iommu(iommu); |
526 | error_free_seq_id: |
527 | diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c |
528 | index 008a74a1ed444..1f89378b56231 100644 |
529 | --- a/drivers/isdn/hardware/mISDN/hfcsusb.c |
530 | +++ b/drivers/isdn/hardware/mISDN/hfcsusb.c |
531 | @@ -46,7 +46,7 @@ static void hfcsusb_start_endpoint(struct hfcsusb *hw, int channel); |
532 | static void hfcsusb_stop_endpoint(struct hfcsusb *hw, int channel); |
533 | static int hfcsusb_setup_bch(struct bchannel *bch, int protocol); |
534 | static void deactivate_bchannel(struct bchannel *bch); |
535 | -static void hfcsusb_ph_info(struct hfcsusb *hw); |
536 | +static int hfcsusb_ph_info(struct hfcsusb *hw); |
537 | |
538 | /* start next background transfer for control channel */ |
539 | static void |
540 | @@ -241,7 +241,7 @@ hfcusb_l2l1B(struct mISDNchannel *ch, struct sk_buff *skb) |
541 | * send full D/B channel status information |
542 | * as MPH_INFORMATION_IND |
543 | */ |
544 | -static void |
545 | +static int |
546 | hfcsusb_ph_info(struct hfcsusb *hw) |
547 | { |
548 | struct ph_info *phi; |
549 | @@ -250,7 +250,7 @@ hfcsusb_ph_info(struct hfcsusb *hw) |
550 | |
551 | phi = kzalloc(struct_size(phi, bch, dch->dev.nrbchan), GFP_ATOMIC); |
552 | if (!phi) |
553 | - return; |
554 | + return -ENOMEM; |
555 | |
556 | phi->dch.ch.protocol = hw->protocol; |
557 | phi->dch.ch.Flags = dch->Flags; |
558 | @@ -264,6 +264,8 @@ hfcsusb_ph_info(struct hfcsusb *hw) |
559 | sizeof(struct ph_info_dch) + dch->dev.nrbchan * |
560 | sizeof(struct ph_info_ch), phi, GFP_ATOMIC); |
561 | kfree(phi); |
562 | + |
563 | + return 0; |
564 | } |
565 | |
566 | /* |
567 | @@ -348,8 +350,7 @@ hfcusb_l2l1D(struct mISDNchannel *ch, struct sk_buff *skb) |
568 | ret = l1_event(dch->l1, hh->prim); |
569 | break; |
570 | case MPH_INFORMATION_REQ: |
571 | - hfcsusb_ph_info(hw); |
572 | - ret = 0; |
573 | + ret = hfcsusb_ph_info(hw); |
574 | break; |
575 | } |
576 | |
577 | @@ -404,8 +405,7 @@ hfc_l1callback(struct dchannel *dch, u_int cmd) |
578 | hw->name, __func__, cmd); |
579 | return -1; |
580 | } |
581 | - hfcsusb_ph_info(hw); |
582 | - return 0; |
583 | + return hfcsusb_ph_info(hw); |
584 | } |
585 | |
586 | static int |
587 | @@ -747,8 +747,7 @@ hfcsusb_setup_bch(struct bchannel *bch, int protocol) |
588 | handle_led(hw, (bch->nr == 1) ? LED_B1_OFF : |
589 | LED_B2_OFF); |
590 | } |
591 | - hfcsusb_ph_info(hw); |
592 | - return 0; |
593 | + return hfcsusb_ph_info(hw); |
594 | } |
595 | |
596 | static void |
597 | diff --git a/drivers/isdn/hardware/mISDN/mISDNinfineon.c b/drivers/isdn/hardware/mISDN/mISDNinfineon.c |
598 | index f4cb297668884..3cf0c6f5a1dca 100644 |
599 | --- a/drivers/isdn/hardware/mISDN/mISDNinfineon.c |
600 | +++ b/drivers/isdn/hardware/mISDN/mISDNinfineon.c |
601 | @@ -630,17 +630,19 @@ static void |
602 | release_io(struct inf_hw *hw) |
603 | { |
604 | if (hw->cfg.mode) { |
605 | - if (hw->cfg.p) { |
606 | + if (hw->cfg.mode == AM_MEMIO) { |
607 | release_mem_region(hw->cfg.start, hw->cfg.size); |
608 | - iounmap(hw->cfg.p); |
609 | + if (hw->cfg.p) |
610 | + iounmap(hw->cfg.p); |
611 | } else |
612 | release_region(hw->cfg.start, hw->cfg.size); |
613 | hw->cfg.mode = AM_NONE; |
614 | } |
615 | if (hw->addr.mode) { |
616 | - if (hw->addr.p) { |
617 | + if (hw->addr.mode == AM_MEMIO) { |
618 | release_mem_region(hw->addr.start, hw->addr.size); |
619 | - iounmap(hw->addr.p); |
620 | + if (hw->addr.p) |
621 | + iounmap(hw->addr.p); |
622 | } else |
623 | release_region(hw->addr.start, hw->addr.size); |
624 | hw->addr.mode = AM_NONE; |
625 | @@ -670,9 +672,12 @@ setup_io(struct inf_hw *hw) |
626 | (ulong)hw->cfg.start, (ulong)hw->cfg.size); |
627 | return err; |
628 | } |
629 | - if (hw->ci->cfg_mode == AM_MEMIO) |
630 | - hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size); |
631 | hw->cfg.mode = hw->ci->cfg_mode; |
632 | + if (hw->ci->cfg_mode == AM_MEMIO) { |
633 | + hw->cfg.p = ioremap(hw->cfg.start, hw->cfg.size); |
634 | + if (!hw->cfg.p) |
635 | + return -ENOMEM; |
636 | + } |
637 | if (debug & DEBUG_HW) |
638 | pr_notice("%s: IO cfg %lx (%lu bytes) mode%d\n", |
639 | hw->name, (ulong)hw->cfg.start, |
640 | @@ -697,12 +702,12 @@ setup_io(struct inf_hw *hw) |
641 | (ulong)hw->addr.start, (ulong)hw->addr.size); |
642 | return err; |
643 | } |
644 | + hw->addr.mode = hw->ci->addr_mode; |
645 | if (hw->ci->addr_mode == AM_MEMIO) { |
646 | hw->addr.p = ioremap(hw->addr.start, hw->addr.size); |
647 | - if (unlikely(!hw->addr.p)) |
648 | + if (!hw->addr.p) |
649 | return -ENOMEM; |
650 | } |
651 | - hw->addr.mode = hw->ci->addr_mode; |
652 | if (debug & DEBUG_HW) |
653 | pr_notice("%s: IO addr %lx (%lu bytes) mode%d\n", |
654 | hw->name, (ulong)hw->addr.start, |
655 | diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c |
656 | index add7d4ce41802..e902aae685af9 100644 |
657 | --- a/drivers/md/dm-snap.c |
658 | +++ b/drivers/md/dm-snap.c |
659 | @@ -854,7 +854,7 @@ static int dm_add_exception(void *context, chunk_t old, chunk_t new) |
660 | static uint32_t __minimum_chunk_size(struct origin *o) |
661 | { |
662 | struct dm_snapshot *snap; |
663 | - unsigned chunk_size = 0; |
664 | + unsigned chunk_size = rounddown_pow_of_two(UINT_MAX); |
665 | |
666 | if (o) |
667 | list_for_each_entry(snap, &o->snapshots, list) |
668 | diff --git a/drivers/media/dvb-frontends/sp8870.c b/drivers/media/dvb-frontends/sp8870.c |
669 | index 655db8272268d..9767159aeb9b2 100644 |
670 | --- a/drivers/media/dvb-frontends/sp8870.c |
671 | +++ b/drivers/media/dvb-frontends/sp8870.c |
672 | @@ -281,7 +281,7 @@ static int sp8870_set_frontend_parameters(struct dvb_frontend *fe) |
673 | |
674 | // read status reg in order to clear pending irqs |
675 | err = sp8870_readreg(state, 0x200); |
676 | - if (err) |
677 | + if (err < 0) |
678 | return err; |
679 | |
680 | // system controller start |
681 | diff --git a/drivers/media/usb/gspca/cpia1.c b/drivers/media/usb/gspca/cpia1.c |
682 | index a4f7431486f31..d93d384286c16 100644 |
683 | --- a/drivers/media/usb/gspca/cpia1.c |
684 | +++ b/drivers/media/usb/gspca/cpia1.c |
685 | @@ -1424,7 +1424,6 @@ static int sd_config(struct gspca_dev *gspca_dev, |
686 | { |
687 | struct sd *sd = (struct sd *) gspca_dev; |
688 | struct cam *cam; |
689 | - int ret; |
690 | |
691 | sd->mainsFreq = FREQ_DEF == V4L2_CID_POWER_LINE_FREQUENCY_60HZ; |
692 | reset_camera_params(gspca_dev); |
693 | @@ -1436,10 +1435,7 @@ static int sd_config(struct gspca_dev *gspca_dev, |
694 | cam->cam_mode = mode; |
695 | cam->nmodes = ARRAY_SIZE(mode); |
696 | |
697 | - ret = goto_low_power(gspca_dev); |
698 | - if (ret) |
699 | - gspca_err(gspca_dev, "Cannot go to low power mode: %d\n", |
700 | - ret); |
701 | + goto_low_power(gspca_dev); |
702 | /* Check the firmware version. */ |
703 | sd->params.version.firmwareVersion = 0; |
704 | get_version_information(gspca_dev); |
705 | diff --git a/drivers/media/usb/gspca/m5602/m5602_mt9m111.c b/drivers/media/usb/gspca/m5602/m5602_mt9m111.c |
706 | index bfa3b381d8a26..bf1af6ed9131e 100644 |
707 | --- a/drivers/media/usb/gspca/m5602/m5602_mt9m111.c |
708 | +++ b/drivers/media/usb/gspca/m5602/m5602_mt9m111.c |
709 | @@ -195,7 +195,7 @@ static const struct v4l2_ctrl_config mt9m111_greenbal_cfg = { |
710 | int mt9m111_probe(struct sd *sd) |
711 | { |
712 | u8 data[2] = {0x00, 0x00}; |
713 | - int i, rc = 0; |
714 | + int i, err; |
715 | struct gspca_dev *gspca_dev = (struct gspca_dev *)sd; |
716 | |
717 | if (force_sensor) { |
718 | @@ -213,18 +213,18 @@ int mt9m111_probe(struct sd *sd) |
719 | /* Do the preinit */ |
720 | for (i = 0; i < ARRAY_SIZE(preinit_mt9m111); i++) { |
721 | if (preinit_mt9m111[i][0] == BRIDGE) { |
722 | - rc |= m5602_write_bridge(sd, |
723 | - preinit_mt9m111[i][1], |
724 | - preinit_mt9m111[i][2]); |
725 | + err = m5602_write_bridge(sd, |
726 | + preinit_mt9m111[i][1], |
727 | + preinit_mt9m111[i][2]); |
728 | } else { |
729 | data[0] = preinit_mt9m111[i][2]; |
730 | data[1] = preinit_mt9m111[i][3]; |
731 | - rc |= m5602_write_sensor(sd, |
732 | - preinit_mt9m111[i][1], data, 2); |
733 | + err = m5602_write_sensor(sd, |
734 | + preinit_mt9m111[i][1], data, 2); |
735 | } |
736 | + if (err < 0) |
737 | + return err; |
738 | } |
739 | - if (rc < 0) |
740 | - return rc; |
741 | |
742 | if (m5602_read_sensor(sd, MT9M111_SC_CHIPVER, data, 2)) |
743 | return -ENODEV; |
744 | diff --git a/drivers/media/usb/gspca/m5602/m5602_po1030.c b/drivers/media/usb/gspca/m5602/m5602_po1030.c |
745 | index d680b777f097f..8fd99ceee4b67 100644 |
746 | --- a/drivers/media/usb/gspca/m5602/m5602_po1030.c |
747 | +++ b/drivers/media/usb/gspca/m5602/m5602_po1030.c |
748 | @@ -154,8 +154,8 @@ static const struct v4l2_ctrl_config po1030_greenbal_cfg = { |
749 | |
750 | int po1030_probe(struct sd *sd) |
751 | { |
752 | - int rc = 0; |
753 | u8 dev_id_h = 0, i; |
754 | + int err; |
755 | struct gspca_dev *gspca_dev = (struct gspca_dev *)sd; |
756 | |
757 | if (force_sensor) { |
758 | @@ -174,14 +174,14 @@ int po1030_probe(struct sd *sd) |
759 | for (i = 0; i < ARRAY_SIZE(preinit_po1030); i++) { |
760 | u8 data = preinit_po1030[i][2]; |
761 | if (preinit_po1030[i][0] == SENSOR) |
762 | - rc |= m5602_write_sensor(sd, |
763 | - preinit_po1030[i][1], &data, 1); |
764 | + err = m5602_write_sensor(sd, preinit_po1030[i][1], |
765 | + &data, 1); |
766 | else |
767 | - rc |= m5602_write_bridge(sd, preinit_po1030[i][1], |
768 | - data); |
769 | + err = m5602_write_bridge(sd, preinit_po1030[i][1], |
770 | + data); |
771 | + if (err < 0) |
772 | + return err; |
773 | } |
774 | - if (rc < 0) |
775 | - return rc; |
776 | |
777 | if (m5602_read_sensor(sd, PO1030_DEVID_H, &dev_id_h, 1)) |
778 | return -ENODEV; |
779 | diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c |
780 | index 5c183c02dfd92..8d18f19c99c4b 100644 |
781 | --- a/drivers/misc/kgdbts.c |
782 | +++ b/drivers/misc/kgdbts.c |
783 | @@ -100,8 +100,9 @@ |
784 | printk(KERN_INFO a); \ |
785 | } while (0) |
786 | #define v2printk(a...) do { \ |
787 | - if (verbose > 1) \ |
788 | + if (verbose > 1) { \ |
789 | printk(KERN_INFO a); \ |
790 | + } \ |
791 | touch_nmi_watchdog(); \ |
792 | } while (0) |
793 | #define eprintk(a...) do { \ |
794 | diff --git a/drivers/misc/lis3lv02d/lis3lv02d.h b/drivers/misc/lis3lv02d/lis3lv02d.h |
795 | index 1b0c99883c57b..c008eecfdfe8d 100644 |
796 | --- a/drivers/misc/lis3lv02d/lis3lv02d.h |
797 | +++ b/drivers/misc/lis3lv02d/lis3lv02d.h |
798 | @@ -271,6 +271,7 @@ struct lis3lv02d { |
799 | int regs_size; |
800 | u8 *reg_cache; |
801 | bool regs_stored; |
802 | + bool init_required; |
803 | u8 odr_mask; /* ODR bit mask */ |
804 | u8 whoami; /* indicates measurement precision */ |
805 | s16 (*read_data) (struct lis3lv02d *lis3, int reg); |
806 | diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c |
807 | index c70a8c74cc57a..a70d989032c19 100644 |
808 | --- a/drivers/misc/mei/interrupt.c |
809 | +++ b/drivers/misc/mei/interrupt.c |
810 | @@ -222,6 +222,9 @@ static int mei_cl_irq_read(struct mei_cl *cl, struct mei_cl_cb *cb, |
811 | return ret; |
812 | } |
813 | |
814 | + pm_runtime_mark_last_busy(dev->dev); |
815 | + pm_request_autosuspend(dev->dev); |
816 | + |
817 | list_move_tail(&cb->list, &cl->rd_pending); |
818 | |
819 | return 0; |
820 | diff --git a/drivers/net/caif/caif_serial.c b/drivers/net/caif/caif_serial.c |
821 | index 40b079162804f..0f2bee59a82b0 100644 |
822 | --- a/drivers/net/caif/caif_serial.c |
823 | +++ b/drivers/net/caif/caif_serial.c |
824 | @@ -270,7 +270,6 @@ static int caif_xmit(struct sk_buff *skb, struct net_device *dev) |
825 | { |
826 | struct ser_device *ser; |
827 | |
828 | - BUG_ON(dev == NULL); |
829 | ser = netdev_priv(dev); |
830 | |
831 | /* Send flow off once, on high water mark */ |
832 | diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c |
833 | index 00d680cb44418..071e5015bf91d 100644 |
834 | --- a/drivers/net/dsa/mt7530.c |
835 | +++ b/drivers/net/dsa/mt7530.c |
836 | @@ -809,14 +809,6 @@ mt7530_port_set_vlan_aware(struct dsa_switch *ds, int port) |
837 | { |
838 | struct mt7530_priv *priv = ds->priv; |
839 | |
840 | - /* The real fabric path would be decided on the membership in the |
841 | - * entry of VLAN table. PCR_MATRIX set up here with ALL_MEMBERS |
842 | - * means potential VLAN can be consisting of certain subset of all |
843 | - * ports. |
844 | - */ |
845 | - mt7530_rmw(priv, MT7530_PCR_P(port), |
846 | - PCR_MATRIX_MASK, PCR_MATRIX(MT7530_ALL_MEMBERS)); |
847 | - |
848 | /* Trapped into security mode allows packet forwarding through VLAN |
849 | * table lookup. CPU port is set to fallback mode to let untagged |
850 | * frames pass through. |
851 | diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c |
852 | index 3b51e87a3714a..034f1b50ab287 100644 |
853 | --- a/drivers/net/dsa/sja1105/sja1105_main.c |
854 | +++ b/drivers/net/dsa/sja1105/sja1105_main.c |
855 | @@ -178,6 +178,7 @@ static int sja1105_init_mii_settings(struct sja1105_private *priv, |
856 | default: |
857 | dev_err(dev, "Unsupported PHY mode %s!\n", |
858 | phy_modes(ports[i].phy_mode)); |
859 | + return -EINVAL; |
860 | } |
861 | |
862 | mii->phy_mac[i] = ports[i].role; |
863 | diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c |
864 | index fbc196b480b63..c3f67d8e10933 100644 |
865 | --- a/drivers/net/ethernet/broadcom/bnx2.c |
866 | +++ b/drivers/net/ethernet/broadcom/bnx2.c |
867 | @@ -8249,9 +8249,9 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) |
868 | BNX2_WR(bp, PCI_COMMAND, reg); |
869 | } else if ((BNX2_CHIP_ID(bp) == BNX2_CHIP_ID_5706_A1) && |
870 | !(bp->flags & BNX2_FLAG_PCIX)) { |
871 | - |
872 | dev_err(&pdev->dev, |
873 | "5706 A1 can only be used in a PCIX bus, aborting\n"); |
874 | + rc = -EPERM; |
875 | goto err_out_unmap; |
876 | } |
877 | |
878 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
879 | index 106f2b2ce17f0..0dba28bb309a2 100644 |
880 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
881 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c |
882 | @@ -280,7 +280,8 @@ static bool bnxt_vf_pciid(enum board_idx idx) |
883 | { |
884 | return (idx == NETXTREME_C_VF || idx == NETXTREME_E_VF || |
885 | idx == NETXTREME_S_VF || idx == NETXTREME_C_VF_HV || |
886 | - idx == NETXTREME_E_VF_HV || idx == NETXTREME_E_P5_VF); |
887 | + idx == NETXTREME_E_VF_HV || idx == NETXTREME_E_P5_VF || |
888 | + idx == NETXTREME_E_P5_VF_HV); |
889 | } |
890 | |
891 | #define DB_CP_REARM_FLAGS (DB_KEY_CP | DB_IDX_VALID) |
892 | diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c |
893 | index e338272931d14..94e87e7f277bb 100644 |
894 | --- a/drivers/net/ethernet/brocade/bna/bnad.c |
895 | +++ b/drivers/net/ethernet/brocade/bna/bnad.c |
896 | @@ -3282,7 +3282,7 @@ bnad_change_mtu(struct net_device *netdev, int new_mtu) |
897 | { |
898 | int err, mtu; |
899 | struct bnad *bnad = netdev_priv(netdev); |
900 | - u32 rx_count = 0, frame, new_frame; |
901 | + u32 frame, new_frame; |
902 | |
903 | mutex_lock(&bnad->conf_mutex); |
904 | |
905 | @@ -3298,12 +3298,9 @@ bnad_change_mtu(struct net_device *netdev, int new_mtu) |
906 | /* only when transition is over 4K */ |
907 | if ((frame <= 4096 && new_frame > 4096) || |
908 | (frame > 4096 && new_frame <= 4096)) |
909 | - rx_count = bnad_reinit_rx(bnad); |
910 | + bnad_reinit_rx(bnad); |
911 | } |
912 | |
913 | - /* rx_count > 0 - new rx created |
914 | - * - Linux set err = 0 and return |
915 | - */ |
916 | err = bnad_mtu_set(bnad, new_frame); |
917 | if (err) |
918 | err = -EBUSY; |
919 | diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c b/drivers/net/ethernet/cavium/liquidio/lio_main.c |
920 | index 7f3b2e3b0868e..d0c77ff9dbb11 100644 |
921 | --- a/drivers/net/ethernet/cavium/liquidio/lio_main.c |
922 | +++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c |
923 | @@ -1179,7 +1179,7 @@ static void octeon_destroy_resources(struct octeon_device *oct) |
924 | * @param lio per-network private data |
925 | * @param start_stop whether to start or stop |
926 | */ |
927 | -static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
928 | +static int send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
929 | { |
930 | struct octeon_soft_command *sc; |
931 | union octnet_cmd *ncmd; |
932 | @@ -1187,15 +1187,15 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
933 | int retval; |
934 | |
935 | if (oct->props[lio->ifidx].rx_on == start_stop) |
936 | - return; |
937 | + return 0; |
938 | |
939 | sc = (struct octeon_soft_command *) |
940 | octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, |
941 | 16, 0); |
942 | if (!sc) { |
943 | netif_info(lio, rx_err, lio->netdev, |
944 | - "Failed to allocate octeon_soft_command\n"); |
945 | - return; |
946 | + "Failed to allocate octeon_soft_command struct\n"); |
947 | + return -ENOMEM; |
948 | } |
949 | |
950 | ncmd = (union octnet_cmd *)sc->virtdptr; |
951 | @@ -1218,18 +1218,19 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
952 | if (retval == IQ_SEND_FAILED) { |
953 | netif_info(lio, rx_err, lio->netdev, "Failed to send RX Control message\n"); |
954 | octeon_free_soft_command(oct, sc); |
955 | - return; |
956 | } else { |
957 | /* Sleep on a wait queue till the cond flag indicates that the |
958 | * response arrived or timed-out. |
959 | */ |
960 | retval = wait_for_sc_completion_timeout(oct, sc, 0); |
961 | if (retval) |
962 | - return; |
963 | + return retval; |
964 | |
965 | oct->props[lio->ifidx].rx_on = start_stop; |
966 | WRITE_ONCE(sc->caller_is_done, true); |
967 | } |
968 | + |
969 | + return retval; |
970 | } |
971 | |
972 | /** |
973 | @@ -1816,6 +1817,7 @@ static int liquidio_open(struct net_device *netdev) |
974 | struct octeon_device_priv *oct_priv = |
975 | (struct octeon_device_priv *)oct->priv; |
976 | struct napi_struct *napi, *n; |
977 | + int ret = 0; |
978 | |
979 | if (oct->props[lio->ifidx].napi_enabled == 0) { |
980 | tasklet_disable(&oct_priv->droq_tasklet); |
981 | @@ -1851,7 +1853,9 @@ static int liquidio_open(struct net_device *netdev) |
982 | netif_info(lio, ifup, lio->netdev, "Interface Open, ready for traffic\n"); |
983 | |
984 | /* tell Octeon to start forwarding packets to host */ |
985 | - send_rx_ctrl_cmd(lio, 1); |
986 | + ret = send_rx_ctrl_cmd(lio, 1); |
987 | + if (ret) |
988 | + return ret; |
989 | |
990 | /* start periodical statistics fetch */ |
991 | INIT_DELAYED_WORK(&lio->stats_wk.work, lio_fetch_stats); |
992 | @@ -1862,7 +1866,7 @@ static int liquidio_open(struct net_device *netdev) |
993 | dev_info(&oct->pci_dev->dev, "%s interface is opened\n", |
994 | netdev->name); |
995 | |
996 | - return 0; |
997 | + return ret; |
998 | } |
999 | |
1000 | /** |
1001 | @@ -1876,6 +1880,7 @@ static int liquidio_stop(struct net_device *netdev) |
1002 | struct octeon_device_priv *oct_priv = |
1003 | (struct octeon_device_priv *)oct->priv; |
1004 | struct napi_struct *napi, *n; |
1005 | + int ret = 0; |
1006 | |
1007 | ifstate_reset(lio, LIO_IFSTATE_RUNNING); |
1008 | |
1009 | @@ -1892,7 +1897,9 @@ static int liquidio_stop(struct net_device *netdev) |
1010 | lio->link_changes++; |
1011 | |
1012 | /* Tell Octeon that nic interface is down. */ |
1013 | - send_rx_ctrl_cmd(lio, 0); |
1014 | + ret = send_rx_ctrl_cmd(lio, 0); |
1015 | + if (ret) |
1016 | + return ret; |
1017 | |
1018 | if (OCTEON_CN23XX_PF(oct)) { |
1019 | if (!oct->msix_on) |
1020 | @@ -1927,7 +1934,7 @@ static int liquidio_stop(struct net_device *netdev) |
1021 | |
1022 | dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name); |
1023 | |
1024 | - return 0; |
1025 | + return ret; |
1026 | } |
1027 | |
1028 | /** |
1029 | diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c |
1030 | index 370d76822ee07..929da9e9fe9af 100644 |
1031 | --- a/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c |
1032 | +++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_main.c |
1033 | @@ -598,7 +598,7 @@ static void octeon_destroy_resources(struct octeon_device *oct) |
1034 | * @param lio per-network private data |
1035 | * @param start_stop whether to start or stop |
1036 | */ |
1037 | -static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
1038 | +static int send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
1039 | { |
1040 | struct octeon_device *oct = (struct octeon_device *)lio->oct_dev; |
1041 | struct octeon_soft_command *sc; |
1042 | @@ -606,11 +606,16 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
1043 | int retval; |
1044 | |
1045 | if (oct->props[lio->ifidx].rx_on == start_stop) |
1046 | - return; |
1047 | + return 0; |
1048 | |
1049 | sc = (struct octeon_soft_command *) |
1050 | octeon_alloc_soft_command(oct, OCTNET_CMD_SIZE, |
1051 | 16, 0); |
1052 | + if (!sc) { |
1053 | + netif_info(lio, rx_err, lio->netdev, |
1054 | + "Failed to allocate octeon_soft_command struct\n"); |
1055 | + return -ENOMEM; |
1056 | + } |
1057 | |
1058 | ncmd = (union octnet_cmd *)sc->virtdptr; |
1059 | |
1060 | @@ -638,11 +643,13 @@ static void send_rx_ctrl_cmd(struct lio *lio, int start_stop) |
1061 | */ |
1062 | retval = wait_for_sc_completion_timeout(oct, sc, 0); |
1063 | if (retval) |
1064 | - return; |
1065 | + return retval; |
1066 | |
1067 | oct->props[lio->ifidx].rx_on = start_stop; |
1068 | WRITE_ONCE(sc->caller_is_done, true); |
1069 | } |
1070 | + |
1071 | + return retval; |
1072 | } |
1073 | |
1074 | /** |
1075 | @@ -909,6 +916,7 @@ static int liquidio_open(struct net_device *netdev) |
1076 | struct octeon_device_priv *oct_priv = |
1077 | (struct octeon_device_priv *)oct->priv; |
1078 | struct napi_struct *napi, *n; |
1079 | + int ret = 0; |
1080 | |
1081 | if (!oct->props[lio->ifidx].napi_enabled) { |
1082 | tasklet_disable(&oct_priv->droq_tasklet); |
1083 | @@ -935,11 +943,13 @@ static int liquidio_open(struct net_device *netdev) |
1084 | (LIQUIDIO_NDEV_STATS_POLL_TIME_MS)); |
1085 | |
1086 | /* tell Octeon to start forwarding packets to host */ |
1087 | - send_rx_ctrl_cmd(lio, 1); |
1088 | + ret = send_rx_ctrl_cmd(lio, 1); |
1089 | + if (ret) |
1090 | + return ret; |
1091 | |
1092 | dev_info(&oct->pci_dev->dev, "%s interface is opened\n", netdev->name); |
1093 | |
1094 | - return 0; |
1095 | + return ret; |
1096 | } |
1097 | |
1098 | /** |
1099 | @@ -953,9 +963,12 @@ static int liquidio_stop(struct net_device *netdev) |
1100 | struct octeon_device_priv *oct_priv = |
1101 | (struct octeon_device_priv *)oct->priv; |
1102 | struct napi_struct *napi, *n; |
1103 | + int ret = 0; |
1104 | |
1105 | /* tell Octeon to stop forwarding packets to host */ |
1106 | - send_rx_ctrl_cmd(lio, 0); |
1107 | + ret = send_rx_ctrl_cmd(lio, 0); |
1108 | + if (ret) |
1109 | + return ret; |
1110 | |
1111 | netif_info(lio, ifdown, lio->netdev, "Stopping interface!\n"); |
1112 | /* Inform that netif carrier is down */ |
1113 | @@ -989,7 +1002,7 @@ static int liquidio_stop(struct net_device *netdev) |
1114 | |
1115 | dev_info(&oct->pci_dev->dev, "%s interface is stopped\n", netdev->name); |
1116 | |
1117 | - return 0; |
1118 | + return ret; |
1119 | } |
1120 | |
1121 | /** |
1122 | diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c |
1123 | index 64a2453e06ba1..ccb28182f745b 100644 |
1124 | --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c |
1125 | +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_filter.c |
1126 | @@ -778,7 +778,7 @@ void clear_all_filters(struct adapter *adapter) |
1127 | cxgb4_del_filter(dev, i, &f->fs); |
1128 | } |
1129 | |
1130 | - sb = t4_read_reg(adapter, LE_DB_SRVR_START_INDEX_A); |
1131 | + sb = adapter->tids.stid_base; |
1132 | for (i = 0; i < sb; i++) { |
1133 | f = (struct filter_entry *)adapter->tids.tid_tab[i]; |
1134 | |
1135 | diff --git a/drivers/net/ethernet/dec/tulip/de4x5.c b/drivers/net/ethernet/dec/tulip/de4x5.c |
1136 | index f16853c3c851a..c813e6f2b371e 100644 |
1137 | --- a/drivers/net/ethernet/dec/tulip/de4x5.c |
1138 | +++ b/drivers/net/ethernet/dec/tulip/de4x5.c |
1139 | @@ -4927,11 +4927,11 @@ mii_get_oui(u_char phyaddr, u_long ioaddr) |
1140 | u_char breg[2]; |
1141 | } a; |
1142 | int i, r2, r3, ret=0;*/ |
1143 | - int r2, r3; |
1144 | + int r2; |
1145 | |
1146 | /* Read r2 and r3 */ |
1147 | r2 = mii_rd(MII_ID0, phyaddr, ioaddr); |
1148 | - r3 = mii_rd(MII_ID1, phyaddr, ioaddr); |
1149 | + mii_rd(MII_ID1, phyaddr, ioaddr); |
1150 | /* SEEQ and Cypress way * / |
1151 | / * Shuffle r2 and r3 * / |
1152 | a.reg=0; |
1153 | diff --git a/drivers/net/ethernet/dec/tulip/media.c b/drivers/net/ethernet/dec/tulip/media.c |
1154 | index dcf21a36a9cf4..011604787b8ed 100644 |
1155 | --- a/drivers/net/ethernet/dec/tulip/media.c |
1156 | +++ b/drivers/net/ethernet/dec/tulip/media.c |
1157 | @@ -319,13 +319,8 @@ void tulip_select_media(struct net_device *dev, int startup) |
1158 | break; |
1159 | } |
1160 | case 5: case 6: { |
1161 | - u16 setup[5]; |
1162 | - |
1163 | new_csr6 = 0; /* FIXME */ |
1164 | |
1165 | - for (i = 0; i < 5; i++) |
1166 | - setup[i] = get_u16(&p[i*2 + 1]); |
1167 | - |
1168 | if (startup && mtable->has_reset) { |
1169 | struct medialeaf *rleaf = &mtable->mleaf[mtable->has_reset]; |
1170 | unsigned char *rst = rleaf->leafdata; |
1171 | diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c |
1172 | index fd7fc6f20c9da..b1856552ab813 100644 |
1173 | --- a/drivers/net/ethernet/freescale/fec_main.c |
1174 | +++ b/drivers/net/ethernet/freescale/fec_main.c |
1175 | @@ -3274,7 +3274,9 @@ static int fec_enet_init(struct net_device *ndev) |
1176 | return ret; |
1177 | } |
1178 | |
1179 | - fec_enet_alloc_queue(ndev); |
1180 | + ret = fec_enet_alloc_queue(ndev); |
1181 | + if (ret) |
1182 | + return ret; |
1183 | |
1184 | bd_size = (fep->total_tx_ring_size + fep->total_rx_ring_size) * dsize; |
1185 | |
1186 | @@ -3282,7 +3284,8 @@ static int fec_enet_init(struct net_device *ndev) |
1187 | cbd_base = dmam_alloc_coherent(&fep->pdev->dev, bd_size, &bd_dma, |
1188 | GFP_KERNEL); |
1189 | if (!cbd_base) { |
1190 | - return -ENOMEM; |
1191 | + ret = -ENOMEM; |
1192 | + goto free_queue_mem; |
1193 | } |
1194 | |
1195 | /* Get the Ethernet address */ |
1196 | @@ -3360,6 +3363,10 @@ static int fec_enet_init(struct net_device *ndev) |
1197 | fec_enet_update_ethtool_stats(ndev); |
1198 | |
1199 | return 0; |
1200 | + |
1201 | +free_queue_mem: |
1202 | + fec_enet_free_queue(ndev); |
1203 | + return ret; |
1204 | } |
1205 | |
1206 | #ifdef CONFIG_OF |
1207 | diff --git a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c |
1208 | index 1eca0fdb99334..b8fc9bbeca2c7 100644 |
1209 | --- a/drivers/net/ethernet/fujitsu/fmvj18x_cs.c |
1210 | +++ b/drivers/net/ethernet/fujitsu/fmvj18x_cs.c |
1211 | @@ -548,8 +548,8 @@ static int fmvj18x_get_hwinfo(struct pcmcia_device *link, u_char *node_id) |
1212 | |
1213 | base = ioremap(link->resource[2]->start, resource_size(link->resource[2])); |
1214 | if (!base) { |
1215 | - pcmcia_release_window(link, link->resource[2]); |
1216 | - return -ENOMEM; |
1217 | + pcmcia_release_window(link, link->resource[2]); |
1218 | + return -1; |
1219 | } |
1220 | |
1221 | pcmcia_map_mem_page(link, link->resource[2], 0); |
1222 | diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c |
1223 | index 9b7a8db9860fc..6ea0975d74a1f 100644 |
1224 | --- a/drivers/net/ethernet/google/gve/gve_main.c |
1225 | +++ b/drivers/net/ethernet/google/gve/gve_main.c |
1226 | @@ -121,7 +121,7 @@ static int gve_napi_poll(struct napi_struct *napi, int budget) |
1227 | /* Double check we have no extra work. |
1228 | * Ensure unmask synchronizes with checking for work. |
1229 | */ |
1230 | - dma_rmb(); |
1231 | + mb(); |
1232 | if (block->tx) |
1233 | reschedule |= gve_tx_poll(block, -1); |
1234 | if (block->rx) |
1235 | @@ -161,6 +161,7 @@ static int gve_alloc_notify_blocks(struct gve_priv *priv) |
1236 | int vecs_left = new_num_ntfy_blks % 2; |
1237 | |
1238 | priv->num_ntfy_blks = new_num_ntfy_blks; |
1239 | + priv->mgmt_msix_idx = priv->num_ntfy_blks; |
1240 | priv->tx_cfg.max_queues = min_t(int, priv->tx_cfg.max_queues, |
1241 | vecs_per_type); |
1242 | priv->rx_cfg.max_queues = min_t(int, priv->rx_cfg.max_queues, |
1243 | @@ -241,20 +242,22 @@ static void gve_free_notify_blocks(struct gve_priv *priv) |
1244 | { |
1245 | int i; |
1246 | |
1247 | - /* Free the irqs */ |
1248 | - for (i = 0; i < priv->num_ntfy_blks; i++) { |
1249 | - struct gve_notify_block *block = &priv->ntfy_blocks[i]; |
1250 | - int msix_idx = i; |
1251 | + if (priv->msix_vectors) { |
1252 | + /* Free the irqs */ |
1253 | + for (i = 0; i < priv->num_ntfy_blks; i++) { |
1254 | + struct gve_notify_block *block = &priv->ntfy_blocks[i]; |
1255 | + int msix_idx = i; |
1256 | |
1257 | - irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, |
1258 | - NULL); |
1259 | - free_irq(priv->msix_vectors[msix_idx].vector, block); |
1260 | + irq_set_affinity_hint(priv->msix_vectors[msix_idx].vector, |
1261 | + NULL); |
1262 | + free_irq(priv->msix_vectors[msix_idx].vector, block); |
1263 | + } |
1264 | + free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); |
1265 | } |
1266 | dma_free_coherent(&priv->pdev->dev, |
1267 | priv->num_ntfy_blks * sizeof(*priv->ntfy_blocks), |
1268 | priv->ntfy_blocks, priv->ntfy_block_bus); |
1269 | priv->ntfy_blocks = NULL; |
1270 | - free_irq(priv->msix_vectors[priv->mgmt_msix_idx].vector, priv); |
1271 | pci_disable_msix(priv->pdev); |
1272 | kvfree(priv->msix_vectors); |
1273 | priv->msix_vectors = NULL; |
1274 | diff --git a/drivers/net/ethernet/google/gve/gve_tx.c b/drivers/net/ethernet/google/gve/gve_tx.c |
1275 | index d0244feb03011..b653197b34d10 100644 |
1276 | --- a/drivers/net/ethernet/google/gve/gve_tx.c |
1277 | +++ b/drivers/net/ethernet/google/gve/gve_tx.c |
1278 | @@ -207,10 +207,12 @@ static int gve_tx_alloc_ring(struct gve_priv *priv, int idx) |
1279 | goto abort_with_info; |
1280 | |
1281 | tx->tx_fifo.qpl = gve_assign_tx_qpl(priv); |
1282 | + if (!tx->tx_fifo.qpl) |
1283 | + goto abort_with_desc; |
1284 | |
1285 | /* map Tx FIFO */ |
1286 | if (gve_tx_fifo_init(priv, &tx->tx_fifo)) |
1287 | - goto abort_with_desc; |
1288 | + goto abort_with_qpl; |
1289 | |
1290 | tx->q_resources = |
1291 | dma_alloc_coherent(hdev, |
1292 | @@ -229,6 +231,8 @@ static int gve_tx_alloc_ring(struct gve_priv *priv, int idx) |
1293 | |
1294 | abort_with_fifo: |
1295 | gve_tx_fifo_release(priv, &tx->tx_fifo); |
1296 | +abort_with_qpl: |
1297 | + gve_unassign_qpl(priv, tx->tx_fifo.qpl->id); |
1298 | abort_with_desc: |
1299 | dma_free_coherent(hdev, bytes, tx->desc, tx->bus); |
1300 | tx->desc = NULL; |
1301 | @@ -478,7 +482,7 @@ netdev_tx_t gve_tx(struct sk_buff *skb, struct net_device *dev) |
1302 | struct gve_tx_ring *tx; |
1303 | int nsegs; |
1304 | |
1305 | - WARN(skb_get_queue_mapping(skb) > priv->tx_cfg.num_queues, |
1306 | + WARN(skb_get_queue_mapping(skb) >= priv->tx_cfg.num_queues, |
1307 | "skb queue index out of range"); |
1308 | tx = &priv->tx[skb_get_queue_mapping(skb)]; |
1309 | if (unlikely(gve_maybe_stop_tx(tx, skb))) { |
1310 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
1311 | index 5f2948bafff21..e64e175162068 100644 |
1312 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
1313 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
1314 | @@ -810,8 +810,6 @@ static bool hns3_tunnel_csum_bug(struct sk_buff *skb) |
1315 | l4.udp->dest == htons(4790)))) |
1316 | return false; |
1317 | |
1318 | - skb_checksum_help(skb); |
1319 | - |
1320 | return true; |
1321 | } |
1322 | |
1323 | @@ -889,8 +887,7 @@ static int hns3_set_l2l3l4(struct sk_buff *skb, u8 ol4_proto, |
1324 | /* the stack computes the IP header already, |
1325 | * driver calculate l4 checksum when not TSO. |
1326 | */ |
1327 | - skb_checksum_help(skb); |
1328 | - return 0; |
1329 | + return skb_checksum_help(skb); |
1330 | } |
1331 | |
1332 | hns3_set_outer_l2l3l4(skb, ol4_proto, ol_type_vlan_len_msec); |
1333 | @@ -935,7 +932,7 @@ static int hns3_set_l2l3l4(struct sk_buff *skb, u8 ol4_proto, |
1334 | break; |
1335 | case IPPROTO_UDP: |
1336 | if (hns3_tunnel_csum_bug(skb)) |
1337 | - break; |
1338 | + return skb_checksum_help(skb); |
1339 | |
1340 | hns3_set_field(*type_cs_vlan_tso, HNS3_TXD_L4CS_B, 1); |
1341 | hns3_set_field(*type_cs_vlan_tso, HNS3_TXD_L4T_S, |
1342 | @@ -960,8 +957,7 @@ static int hns3_set_l2l3l4(struct sk_buff *skb, u8 ol4_proto, |
1343 | /* the stack computes the IP header already, |
1344 | * driver calculate l4 checksum when not TSO. |
1345 | */ |
1346 | - skb_checksum_help(skb); |
1347 | - return 0; |
1348 | + return skb_checksum_help(skb); |
1349 | } |
1350 | |
1351 | return 0; |
1352 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c |
1353 | index 537dfff585e0d..47a920128760e 100644 |
1354 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c |
1355 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c |
1356 | @@ -467,12 +467,16 @@ static int ixgbe_set_vf_vlan(struct ixgbe_adapter *adapter, int add, int vid, |
1357 | return err; |
1358 | } |
1359 | |
1360 | -static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) |
1361 | +static int ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 max_frame, u32 vf) |
1362 | { |
1363 | struct ixgbe_hw *hw = &adapter->hw; |
1364 | - int max_frame = msgbuf[1]; |
1365 | u32 max_frs; |
1366 | |
1367 | + if (max_frame < ETH_MIN_MTU || max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE) { |
1368 | + e_err(drv, "VF max_frame %d out of range\n", max_frame); |
1369 | + return -EINVAL; |
1370 | + } |
1371 | + |
1372 | /* |
1373 | * For 82599EB we have to keep all PFs and VFs operating with |
1374 | * the same max_frame value in order to avoid sending an oversize |
1375 | @@ -533,12 +537,6 @@ static s32 ixgbe_set_vf_lpe(struct ixgbe_adapter *adapter, u32 *msgbuf, u32 vf) |
1376 | } |
1377 | } |
1378 | |
1379 | - /* MTU < 68 is an error and causes problems on some kernels */ |
1380 | - if (max_frame > IXGBE_MAX_JUMBO_FRAME_SIZE) { |
1381 | - e_err(drv, "VF max_frame %d out of range\n", max_frame); |
1382 | - return -EINVAL; |
1383 | - } |
1384 | - |
1385 | /* pull current max frame size from hardware */ |
1386 | max_frs = IXGBE_READ_REG(hw, IXGBE_MAXFRS); |
1387 | max_frs &= IXGBE_MHADD_MFS_MASK; |
1388 | @@ -1249,7 +1247,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf) |
1389 | retval = ixgbe_set_vf_vlan_msg(adapter, msgbuf, vf); |
1390 | break; |
1391 | case IXGBE_VF_SET_LPE: |
1392 | - retval = ixgbe_set_vf_lpe(adapter, msgbuf, vf); |
1393 | + retval = ixgbe_set_vf_lpe(adapter, msgbuf[1], vf); |
1394 | break; |
1395 | case IXGBE_VF_SET_MACVLAN: |
1396 | retval = ixgbe_set_vf_macvlan_msg(adapter, msgbuf, vf); |
1397 | diff --git a/drivers/net/ethernet/lantiq_xrx200.c b/drivers/net/ethernet/lantiq_xrx200.c |
1398 | index 4e44a39267eb3..6ece99e6b6dde 100644 |
1399 | --- a/drivers/net/ethernet/lantiq_xrx200.c |
1400 | +++ b/drivers/net/ethernet/lantiq_xrx200.c |
1401 | @@ -154,6 +154,7 @@ static int xrx200_close(struct net_device *net_dev) |
1402 | |
1403 | static int xrx200_alloc_skb(struct xrx200_chan *ch) |
1404 | { |
1405 | + dma_addr_t mapping; |
1406 | int ret = 0; |
1407 | |
1408 | ch->skb[ch->dma.desc] = netdev_alloc_skb_ip_align(ch->priv->net_dev, |
1409 | @@ -163,16 +164,17 @@ static int xrx200_alloc_skb(struct xrx200_chan *ch) |
1410 | goto skip; |
1411 | } |
1412 | |
1413 | - ch->dma.desc_base[ch->dma.desc].addr = dma_map_single(ch->priv->dev, |
1414 | - ch->skb[ch->dma.desc]->data, XRX200_DMA_DATA_LEN, |
1415 | - DMA_FROM_DEVICE); |
1416 | - if (unlikely(dma_mapping_error(ch->priv->dev, |
1417 | - ch->dma.desc_base[ch->dma.desc].addr))) { |
1418 | + mapping = dma_map_single(ch->priv->dev, ch->skb[ch->dma.desc]->data, |
1419 | + XRX200_DMA_DATA_LEN, DMA_FROM_DEVICE); |
1420 | + if (unlikely(dma_mapping_error(ch->priv->dev, mapping))) { |
1421 | dev_kfree_skb_any(ch->skb[ch->dma.desc]); |
1422 | ret = -ENOMEM; |
1423 | goto skip; |
1424 | } |
1425 | |
1426 | + ch->dma.desc_base[ch->dma.desc].addr = mapping; |
1427 | + /* Make sure the address is written before we give it to HW */ |
1428 | + wmb(); |
1429 | skip: |
1430 | ch->dma.desc_base[ch->dma.desc].ctl = |
1431 | LTQ_DMA_OWN | LTQ_DMA_RX_OFFSET(NET_IP_ALIGN) | |
1432 | @@ -196,6 +198,8 @@ static int xrx200_hw_receive(struct xrx200_chan *ch) |
1433 | ch->dma.desc %= LTQ_DESC_NUM; |
1434 | |
1435 | if (ret) { |
1436 | + ch->skb[ch->dma.desc] = skb; |
1437 | + net_dev->stats.rx_dropped++; |
1438 | netdev_err(net_dev, "failed to allocate new rx buffer\n"); |
1439 | return ret; |
1440 | } |
1441 | diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
1442 | index 7e3806fd70b21..48b395b9c15ad 100644 |
1443 | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
1444 | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c |
1445 | @@ -675,32 +675,53 @@ static int mtk_set_mac_address(struct net_device *dev, void *p) |
1446 | void mtk_stats_update_mac(struct mtk_mac *mac) |
1447 | { |
1448 | struct mtk_hw_stats *hw_stats = mac->hw_stats; |
1449 | - unsigned int base = MTK_GDM1_TX_GBCNT; |
1450 | - u64 stats; |
1451 | - |
1452 | - base += hw_stats->reg_offset; |
1453 | + struct mtk_eth *eth = mac->hw; |
1454 | |
1455 | u64_stats_update_begin(&hw_stats->syncp); |
1456 | |
1457 | - hw_stats->rx_bytes += mtk_r32(mac->hw, base); |
1458 | - stats = mtk_r32(mac->hw, base + 0x04); |
1459 | - if (stats) |
1460 | - hw_stats->rx_bytes += (stats << 32); |
1461 | - hw_stats->rx_packets += mtk_r32(mac->hw, base + 0x08); |
1462 | - hw_stats->rx_overflow += mtk_r32(mac->hw, base + 0x10); |
1463 | - hw_stats->rx_fcs_errors += mtk_r32(mac->hw, base + 0x14); |
1464 | - hw_stats->rx_short_errors += mtk_r32(mac->hw, base + 0x18); |
1465 | - hw_stats->rx_long_errors += mtk_r32(mac->hw, base + 0x1c); |
1466 | - hw_stats->rx_checksum_errors += mtk_r32(mac->hw, base + 0x20); |
1467 | - hw_stats->rx_flow_control_packets += |
1468 | - mtk_r32(mac->hw, base + 0x24); |
1469 | - hw_stats->tx_skip += mtk_r32(mac->hw, base + 0x28); |
1470 | - hw_stats->tx_collisions += mtk_r32(mac->hw, base + 0x2c); |
1471 | - hw_stats->tx_bytes += mtk_r32(mac->hw, base + 0x30); |
1472 | - stats = mtk_r32(mac->hw, base + 0x34); |
1473 | - if (stats) |
1474 | - hw_stats->tx_bytes += (stats << 32); |
1475 | - hw_stats->tx_packets += mtk_r32(mac->hw, base + 0x38); |
1476 | + if (MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628)) { |
1477 | + hw_stats->tx_packets += mtk_r32(mac->hw, MT7628_SDM_TPCNT); |
1478 | + hw_stats->tx_bytes += mtk_r32(mac->hw, MT7628_SDM_TBCNT); |
1479 | + hw_stats->rx_packets += mtk_r32(mac->hw, MT7628_SDM_RPCNT); |
1480 | + hw_stats->rx_bytes += mtk_r32(mac->hw, MT7628_SDM_RBCNT); |
1481 | + hw_stats->rx_checksum_errors += |
1482 | + mtk_r32(mac->hw, MT7628_SDM_CS_ERR); |
1483 | + } else { |
1484 | + unsigned int offs = hw_stats->reg_offset; |
1485 | + u64 stats; |
1486 | + |
1487 | + hw_stats->rx_bytes += mtk_r32(mac->hw, |
1488 | + MTK_GDM1_RX_GBCNT_L + offs); |
1489 | + stats = mtk_r32(mac->hw, MTK_GDM1_RX_GBCNT_H + offs); |
1490 | + if (stats) |
1491 | + hw_stats->rx_bytes += (stats << 32); |
1492 | + hw_stats->rx_packets += |
1493 | + mtk_r32(mac->hw, MTK_GDM1_RX_GPCNT + offs); |
1494 | + hw_stats->rx_overflow += |
1495 | + mtk_r32(mac->hw, MTK_GDM1_RX_OERCNT + offs); |
1496 | + hw_stats->rx_fcs_errors += |
1497 | + mtk_r32(mac->hw, MTK_GDM1_RX_FERCNT + offs); |
1498 | + hw_stats->rx_short_errors += |
1499 | + mtk_r32(mac->hw, MTK_GDM1_RX_SERCNT + offs); |
1500 | + hw_stats->rx_long_errors += |
1501 | + mtk_r32(mac->hw, MTK_GDM1_RX_LENCNT + offs); |
1502 | + hw_stats->rx_checksum_errors += |
1503 | + mtk_r32(mac->hw, MTK_GDM1_RX_CERCNT + offs); |
1504 | + hw_stats->rx_flow_control_packets += |
1505 | + mtk_r32(mac->hw, MTK_GDM1_RX_FCCNT + offs); |
1506 | + hw_stats->tx_skip += |
1507 | + mtk_r32(mac->hw, MTK_GDM1_TX_SKIPCNT + offs); |
1508 | + hw_stats->tx_collisions += |
1509 | + mtk_r32(mac->hw, MTK_GDM1_TX_COLCNT + offs); |
1510 | + hw_stats->tx_bytes += |
1511 | + mtk_r32(mac->hw, MTK_GDM1_TX_GBCNT_L + offs); |
1512 | + stats = mtk_r32(mac->hw, MTK_GDM1_TX_GBCNT_H + offs); |
1513 | + if (stats) |
1514 | + hw_stats->tx_bytes += (stats << 32); |
1515 | + hw_stats->tx_packets += |
1516 | + mtk_r32(mac->hw, MTK_GDM1_TX_GPCNT + offs); |
1517 | + } |
1518 | + |
1519 | u64_stats_update_end(&hw_stats->syncp); |
1520 | } |
1521 | |
1522 | diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
1523 | index 1e9202b34d352..c0b2768b480f8 100644 |
1524 | --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
1525 | +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h |
1526 | @@ -264,8 +264,21 @@ |
1527 | /* QDMA FQ Free Page Buffer Length Register */ |
1528 | #define MTK_QDMA_FQ_BLEN 0x1B2C |
1529 | |
1530 | -/* GMA1 Received Good Byte Count Register */ |
1531 | -#define MTK_GDM1_TX_GBCNT 0x2400 |
1532 | +/* GMA1 counter / statics register */ |
1533 | +#define MTK_GDM1_RX_GBCNT_L 0x2400 |
1534 | +#define MTK_GDM1_RX_GBCNT_H 0x2404 |
1535 | +#define MTK_GDM1_RX_GPCNT 0x2408 |
1536 | +#define MTK_GDM1_RX_OERCNT 0x2410 |
1537 | +#define MTK_GDM1_RX_FERCNT 0x2414 |
1538 | +#define MTK_GDM1_RX_SERCNT 0x2418 |
1539 | +#define MTK_GDM1_RX_LENCNT 0x241c |
1540 | +#define MTK_GDM1_RX_CERCNT 0x2420 |
1541 | +#define MTK_GDM1_RX_FCCNT 0x2424 |
1542 | +#define MTK_GDM1_TX_SKIPCNT 0x2428 |
1543 | +#define MTK_GDM1_TX_COLCNT 0x242c |
1544 | +#define MTK_GDM1_TX_GBCNT_L 0x2430 |
1545 | +#define MTK_GDM1_TX_GBCNT_H 0x2434 |
1546 | +#define MTK_GDM1_TX_GPCNT 0x2438 |
1547 | #define MTK_STAT_OFFSET 0x40 |
1548 | |
1549 | /* QDMA descriptor txd4 */ |
1550 | @@ -476,6 +489,13 @@ |
1551 | #define MT7628_SDM_MAC_ADRL (MT7628_SDM_OFFSET + 0x0c) |
1552 | #define MT7628_SDM_MAC_ADRH (MT7628_SDM_OFFSET + 0x10) |
1553 | |
1554 | +/* Counter / stat register */ |
1555 | +#define MT7628_SDM_TPCNT (MT7628_SDM_OFFSET + 0x100) |
1556 | +#define MT7628_SDM_TBCNT (MT7628_SDM_OFFSET + 0x104) |
1557 | +#define MT7628_SDM_RPCNT (MT7628_SDM_OFFSET + 0x108) |
1558 | +#define MT7628_SDM_RBCNT (MT7628_SDM_OFFSET + 0x10c) |
1559 | +#define MT7628_SDM_CS_ERR (MT7628_SDM_OFFSET + 0x110) |
1560 | + |
1561 | struct mtk_rx_dma { |
1562 | unsigned int rxd1; |
1563 | unsigned int rxd2; |
1564 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1565 | index 5582fba2f5823..426786a349c3c 100644 |
1566 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1567 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c |
1568 | @@ -2011,8 +2011,6 @@ static int mlx4_en_set_tunable(struct net_device *dev, |
1569 | return ret; |
1570 | } |
1571 | |
1572 | -#define MLX4_EEPROM_PAGE_LEN 256 |
1573 | - |
1574 | static int mlx4_en_get_module_info(struct net_device *dev, |
1575 | struct ethtool_modinfo *modinfo) |
1576 | { |
1577 | @@ -2047,7 +2045,7 @@ static int mlx4_en_get_module_info(struct net_device *dev, |
1578 | break; |
1579 | case MLX4_MODULE_ID_SFP: |
1580 | modinfo->type = ETH_MODULE_SFF_8472; |
1581 | - modinfo->eeprom_len = MLX4_EEPROM_PAGE_LEN; |
1582 | + modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; |
1583 | break; |
1584 | default: |
1585 | return -EINVAL; |
1586 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_tx.c b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1587 | index 605c079d48417..b0837ad94da65 100644 |
1588 | --- a/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1589 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_tx.c |
1590 | @@ -868,6 +868,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) |
1591 | struct mlx4_en_tx_desc *tx_desc; |
1592 | struct mlx4_wqe_data_seg *data; |
1593 | struct mlx4_en_tx_info *tx_info; |
1594 | + u32 __maybe_unused ring_cons; |
1595 | int tx_ind; |
1596 | int nr_txbb; |
1597 | int desc_size; |
1598 | @@ -881,7 +882,6 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev) |
1599 | bool stop_queue; |
1600 | bool inline_ok; |
1601 | u8 data_offset; |
1602 | - u32 ring_cons; |
1603 | bool bf_ok; |
1604 | |
1605 | tx_ind = skb_get_queue_mapping(skb); |
1606 | diff --git a/drivers/net/ethernet/mellanox/mlx4/port.c b/drivers/net/ethernet/mellanox/mlx4/port.c |
1607 | index ba6ac31a339dc..256a06b3c096b 100644 |
1608 | --- a/drivers/net/ethernet/mellanox/mlx4/port.c |
1609 | +++ b/drivers/net/ethernet/mellanox/mlx4/port.c |
1610 | @@ -1973,6 +1973,7 @@ EXPORT_SYMBOL(mlx4_get_roce_gid_from_slave); |
1611 | #define I2C_ADDR_LOW 0x50 |
1612 | #define I2C_ADDR_HIGH 0x51 |
1613 | #define I2C_PAGE_SIZE 256 |
1614 | +#define I2C_HIGH_PAGE_SIZE 128 |
1615 | |
1616 | /* Module Info Data */ |
1617 | struct mlx4_cable_info { |
1618 | @@ -2026,6 +2027,88 @@ static inline const char *cable_info_mad_err_str(u16 mad_status) |
1619 | return "Unknown Error"; |
1620 | } |
1621 | |
1622 | +static int mlx4_get_module_id(struct mlx4_dev *dev, u8 port, u8 *module_id) |
1623 | +{ |
1624 | + struct mlx4_cmd_mailbox *inbox, *outbox; |
1625 | + struct mlx4_mad_ifc *inmad, *outmad; |
1626 | + struct mlx4_cable_info *cable_info; |
1627 | + int ret; |
1628 | + |
1629 | + inbox = mlx4_alloc_cmd_mailbox(dev); |
1630 | + if (IS_ERR(inbox)) |
1631 | + return PTR_ERR(inbox); |
1632 | + |
1633 | + outbox = mlx4_alloc_cmd_mailbox(dev); |
1634 | + if (IS_ERR(outbox)) { |
1635 | + mlx4_free_cmd_mailbox(dev, inbox); |
1636 | + return PTR_ERR(outbox); |
1637 | + } |
1638 | + |
1639 | + inmad = (struct mlx4_mad_ifc *)(inbox->buf); |
1640 | + outmad = (struct mlx4_mad_ifc *)(outbox->buf); |
1641 | + |
1642 | + inmad->method = 0x1; /* Get */ |
1643 | + inmad->class_version = 0x1; |
1644 | + inmad->mgmt_class = 0x1; |
1645 | + inmad->base_version = 0x1; |
1646 | + inmad->attr_id = cpu_to_be16(0xFF60); /* Module Info */ |
1647 | + |
1648 | + cable_info = (struct mlx4_cable_info *)inmad->data; |
1649 | + cable_info->dev_mem_address = 0; |
1650 | + cable_info->page_num = 0; |
1651 | + cable_info->i2c_addr = I2C_ADDR_LOW; |
1652 | + cable_info->size = cpu_to_be16(1); |
1653 | + |
1654 | + ret = mlx4_cmd_box(dev, inbox->dma, outbox->dma, port, 3, |
1655 | + MLX4_CMD_MAD_IFC, MLX4_CMD_TIME_CLASS_C, |
1656 | + MLX4_CMD_NATIVE); |
1657 | + if (ret) |
1658 | + goto out; |
1659 | + |
1660 | + if (be16_to_cpu(outmad->status)) { |
1661 | + /* Mad returned with bad status */ |
1662 | + ret = be16_to_cpu(outmad->status); |
1663 | + mlx4_warn(dev, |
1664 | + "MLX4_CMD_MAD_IFC Get Module ID attr(%x) port(%d) i2c_addr(%x) offset(%d) size(%d): Response Mad Status(%x) - %s\n", |
1665 | + 0xFF60, port, I2C_ADDR_LOW, 0, 1, ret, |
1666 | + cable_info_mad_err_str(ret)); |
1667 | + ret = -ret; |
1668 | + goto out; |
1669 | + } |
1670 | + cable_info = (struct mlx4_cable_info *)outmad->data; |
1671 | + *module_id = cable_info->data[0]; |
1672 | +out: |
1673 | + mlx4_free_cmd_mailbox(dev, inbox); |
1674 | + mlx4_free_cmd_mailbox(dev, outbox); |
1675 | + return ret; |
1676 | +} |
1677 | + |
1678 | +static void mlx4_sfp_eeprom_params_set(u8 *i2c_addr, u8 *page_num, u16 *offset) |
1679 | +{ |
1680 | + *i2c_addr = I2C_ADDR_LOW; |
1681 | + *page_num = 0; |
1682 | + |
1683 | + if (*offset < I2C_PAGE_SIZE) |
1684 | + return; |
1685 | + |
1686 | + *i2c_addr = I2C_ADDR_HIGH; |
1687 | + *offset -= I2C_PAGE_SIZE; |
1688 | +} |
1689 | + |
1690 | +static void mlx4_qsfp_eeprom_params_set(u8 *i2c_addr, u8 *page_num, u16 *offset) |
1691 | +{ |
1692 | + /* Offsets 0-255 belong to page 0. |
1693 | + * Offsets 256-639 belong to pages 01, 02, 03. |
1694 | + * For example, offset 400 is page 02: 1 + (400 - 256) / 128 = 2 |
1695 | + */ |
1696 | + if (*offset < I2C_PAGE_SIZE) |
1697 | + *page_num = 0; |
1698 | + else |
1699 | + *page_num = 1 + (*offset - I2C_PAGE_SIZE) / I2C_HIGH_PAGE_SIZE; |
1700 | + *i2c_addr = I2C_ADDR_LOW; |
1701 | + *offset -= *page_num * I2C_HIGH_PAGE_SIZE; |
1702 | +} |
1703 | + |
1704 | /** |
1705 | * mlx4_get_module_info - Read cable module eeprom data |
1706 | * @dev: mlx4_dev. |
1707 | @@ -2045,12 +2128,30 @@ int mlx4_get_module_info(struct mlx4_dev *dev, u8 port, |
1708 | struct mlx4_cmd_mailbox *inbox, *outbox; |
1709 | struct mlx4_mad_ifc *inmad, *outmad; |
1710 | struct mlx4_cable_info *cable_info; |
1711 | - u16 i2c_addr; |
1712 | + u8 module_id, i2c_addr, page_num; |
1713 | int ret; |
1714 | |
1715 | if (size > MODULE_INFO_MAX_READ) |
1716 | size = MODULE_INFO_MAX_READ; |
1717 | |
1718 | + ret = mlx4_get_module_id(dev, port, &module_id); |
1719 | + if (ret) |
1720 | + return ret; |
1721 | + |
1722 | + switch (module_id) { |
1723 | + case MLX4_MODULE_ID_SFP: |
1724 | + mlx4_sfp_eeprom_params_set(&i2c_addr, &page_num, &offset); |
1725 | + break; |
1726 | + case MLX4_MODULE_ID_QSFP: |
1727 | + case MLX4_MODULE_ID_QSFP_PLUS: |
1728 | + case MLX4_MODULE_ID_QSFP28: |
1729 | + mlx4_qsfp_eeprom_params_set(&i2c_addr, &page_num, &offset); |
1730 | + break; |
1731 | + default: |
1732 | + mlx4_err(dev, "Module ID not recognized: %#x\n", module_id); |
1733 | + return -EINVAL; |
1734 | + } |
1735 | + |
1736 | inbox = mlx4_alloc_cmd_mailbox(dev); |
1737 | if (IS_ERR(inbox)) |
1738 | return PTR_ERR(inbox); |
1739 | @@ -2076,11 +2177,9 @@ int mlx4_get_module_info(struct mlx4_dev *dev, u8 port, |
1740 | */ |
1741 | size -= offset + size - I2C_PAGE_SIZE; |
1742 | |
1743 | - i2c_addr = I2C_ADDR_LOW; |
1744 | - |
1745 | cable_info = (struct mlx4_cable_info *)inmad->data; |
1746 | cable_info->dev_mem_address = cpu_to_be16(offset); |
1747 | - cable_info->page_num = 0; |
1748 | + cable_info->page_num = page_num; |
1749 | cable_info->i2c_addr = i2c_addr; |
1750 | cable_info->size = cpu_to_be16(size); |
1751 | |
1752 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1753 | index 6495c26d95969..fe7342e8a043b 100644 |
1754 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1755 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c |
1756 | @@ -3170,8 +3170,12 @@ static int add_vlan_push_action(struct mlx5e_priv *priv, |
1757 | if (err) |
1758 | return err; |
1759 | |
1760 | - *out_dev = dev_get_by_index_rcu(dev_net(vlan_dev), |
1761 | - dev_get_iflink(vlan_dev)); |
1762 | + rcu_read_lock(); |
1763 | + *out_dev = dev_get_by_index_rcu(dev_net(vlan_dev), dev_get_iflink(vlan_dev)); |
1764 | + rcu_read_unlock(); |
1765 | + if (!*out_dev) |
1766 | + return -ENODEV; |
1767 | + |
1768 | if (is_vlan_dev(*out_dev)) |
1769 | err = add_vlan_push_action(priv, attr, out_dev, action); |
1770 | |
1771 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c b/drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c |
1772 | index 5d20d615663e7..bdc7f915d80e3 100644 |
1773 | --- a/drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c |
1774 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/lag_mp.c |
1775 | @@ -307,6 +307,11 @@ int mlx5_lag_mp_init(struct mlx5_lag *ldev) |
1776 | struct lag_mp *mp = &ldev->lag_mp; |
1777 | int err; |
1778 | |
1779 | + /* always clear mfi, as it might become stale when a route delete event |
1780 | + * has been missed |
1781 | + */ |
1782 | + mp->mfi = NULL; |
1783 | + |
1784 | if (mp->fib_nb.notifier_call) |
1785 | return 0; |
1786 | |
1787 | @@ -328,4 +333,5 @@ void mlx5_lag_mp_cleanup(struct mlx5_lag *ldev) |
1788 | |
1789 | unregister_fib_notifier(&mp->fib_nb); |
1790 | mp->fib_nb.notifier_call = NULL; |
1791 | + mp->mfi = NULL; |
1792 | } |
1793 | diff --git a/drivers/net/ethernet/micrel/ksz884x.c b/drivers/net/ethernet/micrel/ksz884x.c |
1794 | index e102e1560ac79..7dc451fdaf35e 100644 |
1795 | --- a/drivers/net/ethernet/micrel/ksz884x.c |
1796 | +++ b/drivers/net/ethernet/micrel/ksz884x.c |
1797 | @@ -1649,8 +1649,7 @@ static inline void set_tx_len(struct ksz_desc *desc, u32 len) |
1798 | |
1799 | #define HW_DELAY(hw, reg) \ |
1800 | do { \ |
1801 | - u16 dummy; \ |
1802 | - dummy = readw(hw->io + reg); \ |
1803 | + readw(hw->io + reg); \ |
1804 | } while (0) |
1805 | |
1806 | /** |
1807 | diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/ethernet/microchip/lan743x_main.c |
1808 | index 4bbdc53eaf3f3..dfa0ded169ee9 100644 |
1809 | --- a/drivers/net/ethernet/microchip/lan743x_main.c |
1810 | +++ b/drivers/net/ethernet/microchip/lan743x_main.c |
1811 | @@ -156,9 +156,8 @@ static void lan743x_tx_isr(void *context, u32 int_sts, u32 flags) |
1812 | struct lan743x_tx *tx = context; |
1813 | struct lan743x_adapter *adapter = tx->adapter; |
1814 | bool enable_flag = true; |
1815 | - u32 int_en = 0; |
1816 | |
1817 | - int_en = lan743x_csr_read(adapter, INT_EN_SET); |
1818 | + lan743x_csr_read(adapter, INT_EN_SET); |
1819 | if (flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_CLEAR) { |
1820 | lan743x_csr_write(adapter, INT_EN_CLR, |
1821 | INT_BIT_DMA_TX_(tx->channel_number)); |
1822 | @@ -1631,10 +1630,9 @@ static int lan743x_tx_napi_poll(struct napi_struct *napi, int weight) |
1823 | bool start_transmitter = false; |
1824 | unsigned long irq_flags = 0; |
1825 | u32 ioc_bit = 0; |
1826 | - u32 int_sts = 0; |
1827 | |
1828 | ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); |
1829 | - int_sts = lan743x_csr_read(adapter, DMAC_INT_STS); |
1830 | + lan743x_csr_read(adapter, DMAC_INT_STS); |
1831 | if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) |
1832 | lan743x_csr_write(adapter, DMAC_INT_STS, ioc_bit); |
1833 | spin_lock_irqsave(&tx->ring_lock, irq_flags); |
1834 | diff --git a/drivers/net/ethernet/neterion/vxge/vxge-traffic.c b/drivers/net/ethernet/neterion/vxge/vxge-traffic.c |
1835 | index 709d20d9938fb..bd525e8eda10c 100644 |
1836 | --- a/drivers/net/ethernet/neterion/vxge/vxge-traffic.c |
1837 | +++ b/drivers/net/ethernet/neterion/vxge/vxge-traffic.c |
1838 | @@ -30,8 +30,6 @@ |
1839 | */ |
1840 | enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp) |
1841 | { |
1842 | - u64 val64; |
1843 | - |
1844 | struct __vxge_hw_virtualpath *vpath; |
1845 | struct vxge_hw_vpath_reg __iomem *vp_reg; |
1846 | enum vxge_hw_status status = VXGE_HW_OK; |
1847 | @@ -84,7 +82,7 @@ enum vxge_hw_status vxge_hw_vpath_intr_enable(struct __vxge_hw_vpath_handle *vp) |
1848 | __vxge_hw_pio_mem_write32_upper((u32)VXGE_HW_INTR_MASK_ALL, |
1849 | &vp_reg->xgmac_vp_int_status); |
1850 | |
1851 | - val64 = readq(&vp_reg->vpath_general_int_status); |
1852 | + readq(&vp_reg->vpath_general_int_status); |
1853 | |
1854 | /* Mask unwanted interrupts */ |
1855 | |
1856 | @@ -157,8 +155,6 @@ exit: |
1857 | enum vxge_hw_status vxge_hw_vpath_intr_disable( |
1858 | struct __vxge_hw_vpath_handle *vp) |
1859 | { |
1860 | - u64 val64; |
1861 | - |
1862 | struct __vxge_hw_virtualpath *vpath; |
1863 | enum vxge_hw_status status = VXGE_HW_OK; |
1864 | struct vxge_hw_vpath_reg __iomem *vp_reg; |
1865 | @@ -179,8 +175,6 @@ enum vxge_hw_status vxge_hw_vpath_intr_disable( |
1866 | (u32)VXGE_HW_INTR_MASK_ALL, |
1867 | &vp_reg->vpath_general_int_mask); |
1868 | |
1869 | - val64 = VXGE_HW_TIM_CLR_INT_EN_VP(1 << (16 - vpath->vp_id)); |
1870 | - |
1871 | writeq(VXGE_HW_INTR_MASK_ALL, &vp_reg->kdfcctl_errors_mask); |
1872 | |
1873 | __vxge_hw_pio_mem_write32_upper((u32)VXGE_HW_INTR_MASK_ALL, |
1874 | @@ -487,9 +481,7 @@ void vxge_hw_device_unmask_all(struct __vxge_hw_device *hldev) |
1875 | */ |
1876 | void vxge_hw_device_flush_io(struct __vxge_hw_device *hldev) |
1877 | { |
1878 | - u32 val32; |
1879 | - |
1880 | - val32 = readl(&hldev->common_reg->titan_general_int_status); |
1881 | + readl(&hldev->common_reg->titan_general_int_status); |
1882 | } |
1883 | |
1884 | /** |
1885 | @@ -1716,8 +1708,8 @@ void vxge_hw_fifo_txdl_free(struct __vxge_hw_fifo *fifo, void *txdlh) |
1886 | enum vxge_hw_status |
1887 | vxge_hw_vpath_mac_addr_add( |
1888 | struct __vxge_hw_vpath_handle *vp, |
1889 | - u8 (macaddr)[ETH_ALEN], |
1890 | - u8 (macaddr_mask)[ETH_ALEN], |
1891 | + u8 *macaddr, |
1892 | + u8 *macaddr_mask, |
1893 | enum vxge_hw_vpath_mac_addr_add_mode duplicate_mode) |
1894 | { |
1895 | u32 i; |
1896 | @@ -1779,8 +1771,8 @@ exit: |
1897 | enum vxge_hw_status |
1898 | vxge_hw_vpath_mac_addr_get( |
1899 | struct __vxge_hw_vpath_handle *vp, |
1900 | - u8 (macaddr)[ETH_ALEN], |
1901 | - u8 (macaddr_mask)[ETH_ALEN]) |
1902 | + u8 *macaddr, |
1903 | + u8 *macaddr_mask) |
1904 | { |
1905 | u32 i; |
1906 | u64 data1 = 0ULL; |
1907 | @@ -1831,8 +1823,8 @@ exit: |
1908 | enum vxge_hw_status |
1909 | vxge_hw_vpath_mac_addr_get_next( |
1910 | struct __vxge_hw_vpath_handle *vp, |
1911 | - u8 (macaddr)[ETH_ALEN], |
1912 | - u8 (macaddr_mask)[ETH_ALEN]) |
1913 | + u8 *macaddr, |
1914 | + u8 *macaddr_mask) |
1915 | { |
1916 | u32 i; |
1917 | u64 data1 = 0ULL; |
1918 | @@ -1884,8 +1876,8 @@ exit: |
1919 | enum vxge_hw_status |
1920 | vxge_hw_vpath_mac_addr_delete( |
1921 | struct __vxge_hw_vpath_handle *vp, |
1922 | - u8 (macaddr)[ETH_ALEN], |
1923 | - u8 (macaddr_mask)[ETH_ALEN]) |
1924 | + u8 *macaddr, |
1925 | + u8 *macaddr_mask) |
1926 | { |
1927 | u32 i; |
1928 | u64 data1 = 0ULL; |
1929 | @@ -2375,7 +2367,6 @@ enum vxge_hw_status vxge_hw_vpath_poll_rx(struct __vxge_hw_ring *ring) |
1930 | u8 t_code; |
1931 | enum vxge_hw_status status = VXGE_HW_OK; |
1932 | void *first_rxdh; |
1933 | - u64 val64 = 0; |
1934 | int new_count = 0; |
1935 | |
1936 | ring->cmpl_cnt = 0; |
1937 | @@ -2403,8 +2394,7 @@ enum vxge_hw_status vxge_hw_vpath_poll_rx(struct __vxge_hw_ring *ring) |
1938 | } |
1939 | writeq(VXGE_HW_PRC_RXD_DOORBELL_NEW_QW_CNT(new_count), |
1940 | &ring->vp_reg->prc_rxd_doorbell); |
1941 | - val64 = |
1942 | - readl(&ring->common_reg->titan_general_int_status); |
1943 | + readl(&ring->common_reg->titan_general_int_status); |
1944 | ring->doorbell_cnt = 0; |
1945 | } |
1946 | } |
1947 | diff --git a/drivers/net/ethernet/sfc/falcon/farch.c b/drivers/net/ethernet/sfc/falcon/farch.c |
1948 | index 332183280a459..612a43233b18b 100644 |
1949 | --- a/drivers/net/ethernet/sfc/falcon/farch.c |
1950 | +++ b/drivers/net/ethernet/sfc/falcon/farch.c |
1951 | @@ -870,17 +870,12 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue, |
1952 | { |
1953 | struct ef4_channel *channel = ef4_rx_queue_channel(rx_queue); |
1954 | struct ef4_nic *efx = rx_queue->efx; |
1955 | - bool rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err; |
1956 | + bool __maybe_unused rx_ev_buf_owner_id_err, rx_ev_ip_hdr_chksum_err; |
1957 | bool rx_ev_tcp_udp_chksum_err, rx_ev_eth_crc_err; |
1958 | bool rx_ev_frm_trunc, rx_ev_drib_nib, rx_ev_tobe_disc; |
1959 | - bool rx_ev_other_err, rx_ev_pause_frm; |
1960 | - bool rx_ev_hdr_type, rx_ev_mcast_pkt; |
1961 | - unsigned rx_ev_pkt_type; |
1962 | + bool rx_ev_pause_frm; |
1963 | |
1964 | - rx_ev_hdr_type = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_HDR_TYPE); |
1965 | - rx_ev_mcast_pkt = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_MCAST_PKT); |
1966 | rx_ev_tobe_disc = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_TOBE_DISC); |
1967 | - rx_ev_pkt_type = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_PKT_TYPE); |
1968 | rx_ev_buf_owner_id_err = EF4_QWORD_FIELD(*event, |
1969 | FSF_AZ_RX_EV_BUF_OWNER_ID_ERR); |
1970 | rx_ev_ip_hdr_chksum_err = EF4_QWORD_FIELD(*event, |
1971 | @@ -893,10 +888,6 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue, |
1972 | 0 : EF4_QWORD_FIELD(*event, FSF_AA_RX_EV_DRIB_NIB)); |
1973 | rx_ev_pause_frm = EF4_QWORD_FIELD(*event, FSF_AZ_RX_EV_PAUSE_FRM_ERR); |
1974 | |
1975 | - /* Every error apart from tobe_disc and pause_frm */ |
1976 | - rx_ev_other_err = (rx_ev_drib_nib | rx_ev_tcp_udp_chksum_err | |
1977 | - rx_ev_buf_owner_id_err | rx_ev_eth_crc_err | |
1978 | - rx_ev_frm_trunc | rx_ev_ip_hdr_chksum_err); |
1979 | |
1980 | /* Count errors that are not in MAC stats. Ignore expected |
1981 | * checksum errors during self-test. */ |
1982 | @@ -916,6 +907,13 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue, |
1983 | * to a FIFO overflow. |
1984 | */ |
1985 | #ifdef DEBUG |
1986 | + { |
1987 | + /* Every error apart from tobe_disc and pause_frm */ |
1988 | + |
1989 | + bool rx_ev_other_err = (rx_ev_drib_nib | rx_ev_tcp_udp_chksum_err | |
1990 | + rx_ev_buf_owner_id_err | rx_ev_eth_crc_err | |
1991 | + rx_ev_frm_trunc | rx_ev_ip_hdr_chksum_err); |
1992 | + |
1993 | if (rx_ev_other_err && net_ratelimit()) { |
1994 | netif_dbg(efx, rx_err, efx->net_dev, |
1995 | " RX queue %d unexpected RX event " |
1996 | @@ -932,6 +930,7 @@ static u16 ef4_farch_handle_rx_not_ok(struct ef4_rx_queue *rx_queue, |
1997 | rx_ev_tobe_disc ? " [TOBE_DISC]" : "", |
1998 | rx_ev_pause_frm ? " [PAUSE]" : ""); |
1999 | } |
2000 | + } |
2001 | #endif |
2002 | |
2003 | /* The frame must be discarded if any of these are true. */ |
2004 | @@ -1643,15 +1642,11 @@ void ef4_farch_rx_push_indir_table(struct ef4_nic *efx) |
2005 | */ |
2006 | void ef4_farch_dimension_resources(struct ef4_nic *efx, unsigned sram_lim_qw) |
2007 | { |
2008 | - unsigned vi_count, buftbl_min; |
2009 | + unsigned vi_count; |
2010 | |
2011 | /* Account for the buffer table entries backing the datapath channels |
2012 | * and the descriptor caches for those channels. |
2013 | */ |
2014 | - buftbl_min = ((efx->n_rx_channels * EF4_MAX_DMAQ_SIZE + |
2015 | - efx->n_tx_channels * EF4_TXQ_TYPES * EF4_MAX_DMAQ_SIZE + |
2016 | - efx->n_channels * EF4_MAX_EVQ_SIZE) |
2017 | - * sizeof(ef4_qword_t) / EF4_BUF_SIZE); |
2018 | vi_count = max(efx->n_channels, efx->n_tx_channels * EF4_TXQ_TYPES); |
2019 | |
2020 | efx->tx_dc_base = sram_lim_qw - vi_count * TX_DC_ENTRIES; |
2021 | @@ -2532,7 +2527,6 @@ int ef4_farch_filter_remove_safe(struct ef4_nic *efx, |
2022 | enum ef4_farch_filter_table_id table_id; |
2023 | struct ef4_farch_filter_table *table; |
2024 | unsigned int filter_idx; |
2025 | - struct ef4_farch_filter_spec *spec; |
2026 | int rc; |
2027 | |
2028 | table_id = ef4_farch_filter_id_table_id(filter_id); |
2029 | @@ -2543,7 +2537,6 @@ int ef4_farch_filter_remove_safe(struct ef4_nic *efx, |
2030 | filter_idx = ef4_farch_filter_id_index(filter_id); |
2031 | if (filter_idx >= table->size) |
2032 | return -ENOENT; |
2033 | - spec = &table->spec[filter_idx]; |
2034 | |
2035 | spin_lock_bh(&efx->filter_lock); |
2036 | rc = ef4_farch_filter_remove(efx, table, filter_idx, priority); |
2037 | diff --git a/drivers/net/ethernet/sis/sis900.c b/drivers/net/ethernet/sis/sis900.c |
2038 | index 85eaccbbbac1c..44fe2adf0ee0c 100644 |
2039 | --- a/drivers/net/ethernet/sis/sis900.c |
2040 | +++ b/drivers/net/ethernet/sis/sis900.c |
2041 | @@ -787,10 +787,9 @@ static u16 sis900_default_phy(struct net_device * net_dev) |
2042 | static void sis900_set_capability(struct net_device *net_dev, struct mii_phy *phy) |
2043 | { |
2044 | u16 cap; |
2045 | - u16 status; |
2046 | |
2047 | - status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); |
2048 | - status = mdio_read(net_dev, phy->phy_addr, MII_STATUS); |
2049 | + mdio_read(net_dev, phy->phy_addr, MII_STATUS); |
2050 | + mdio_read(net_dev, phy->phy_addr, MII_STATUS); |
2051 | |
2052 | cap = MII_NWAY_CSMA_CD | |
2053 | ((phy->status & MII_STAT_CAN_TX_FDX)? MII_NWAY_TX_FDX:0) | |
2054 | diff --git a/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c b/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c |
2055 | index eb1c6b03c329a..df26cea459048 100644 |
2056 | --- a/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c |
2057 | +++ b/drivers/net/ethernet/synopsys/dwc-xlgmac-common.c |
2058 | @@ -513,7 +513,7 @@ void xlgmac_get_all_hw_features(struct xlgmac_pdata *pdata) |
2059 | |
2060 | void xlgmac_print_all_hw_features(struct xlgmac_pdata *pdata) |
2061 | { |
2062 | - char *str = NULL; |
2063 | + char __maybe_unused *str = NULL; |
2064 | |
2065 | XLGMAC_PR("\n"); |
2066 | XLGMAC_PR("=====================================================\n"); |
2067 | diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c |
2068 | index 7cc09a6f9f9ae..6869c5c74b9f7 100644 |
2069 | --- a/drivers/net/ethernet/ti/davinci_emac.c |
2070 | +++ b/drivers/net/ethernet/ti/davinci_emac.c |
2071 | @@ -1226,7 +1226,7 @@ static int emac_poll(struct napi_struct *napi, int budget) |
2072 | struct net_device *ndev = priv->ndev; |
2073 | struct device *emac_dev = &ndev->dev; |
2074 | u32 status = 0; |
2075 | - u32 num_tx_pkts = 0, num_rx_pkts = 0; |
2076 | + u32 num_rx_pkts = 0; |
2077 | |
2078 | /* Check interrupt vectors and call packet processing */ |
2079 | status = emac_read(EMAC_MACINVECTOR); |
2080 | @@ -1237,8 +1237,7 @@ static int emac_poll(struct napi_struct *napi, int budget) |
2081 | mask = EMAC_DM646X_MAC_IN_VECTOR_TX_INT_VEC; |
2082 | |
2083 | if (status & mask) { |
2084 | - num_tx_pkts = cpdma_chan_process(priv->txchan, |
2085 | - EMAC_DEF_TX_MAX_SERVICE); |
2086 | + cpdma_chan_process(priv->txchan, EMAC_DEF_TX_MAX_SERVICE); |
2087 | } /* TX processing */ |
2088 | |
2089 | mask = EMAC_DM644X_MAC_IN_VECTOR_RX_INT_VEC; |
2090 | diff --git a/drivers/net/ethernet/ti/netcp_core.c b/drivers/net/ethernet/ti/netcp_core.c |
2091 | index 1b2702f744552..4154c48d1ddf6 100644 |
2092 | --- a/drivers/net/ethernet/ti/netcp_core.c |
2093 | +++ b/drivers/net/ethernet/ti/netcp_core.c |
2094 | @@ -1350,9 +1350,9 @@ int netcp_txpipe_open(struct netcp_tx_pipe *tx_pipe) |
2095 | tx_pipe->dma_queue = knav_queue_open(name, tx_pipe->dma_queue_id, |
2096 | KNAV_QUEUE_SHARED); |
2097 | if (IS_ERR(tx_pipe->dma_queue)) { |
2098 | + ret = PTR_ERR(tx_pipe->dma_queue); |
2099 | dev_err(dev, "Could not open DMA queue for channel \"%s\": %d\n", |
2100 | name, ret); |
2101 | - ret = PTR_ERR(tx_pipe->dma_queue); |
2102 | goto err; |
2103 | } |
2104 | |
2105 | diff --git a/drivers/net/ethernet/ti/tlan.c b/drivers/net/ethernet/ti/tlan.c |
2106 | index 78f0f2d59e227..a3691bc94b101 100644 |
2107 | --- a/drivers/net/ethernet/ti/tlan.c |
2108 | +++ b/drivers/net/ethernet/ti/tlan.c |
2109 | @@ -673,7 +673,6 @@ module_exit(tlan_exit); |
2110 | static void __init tlan_eisa_probe(void) |
2111 | { |
2112 | long ioaddr; |
2113 | - int rc = -ENODEV; |
2114 | int irq; |
2115 | u16 device_id; |
2116 | |
2117 | @@ -738,8 +737,7 @@ static void __init tlan_eisa_probe(void) |
2118 | |
2119 | |
2120 | /* Setup the newly found eisa adapter */ |
2121 | - rc = tlan_probe1(NULL, ioaddr, irq, |
2122 | - 12, NULL); |
2123 | + tlan_probe1(NULL, ioaddr, irq, 12, NULL); |
2124 | continue; |
2125 | |
2126 | out: |
2127 | diff --git a/drivers/net/ethernet/via/via-velocity.c b/drivers/net/ethernet/via/via-velocity.c |
2128 | index 346e44115c4e0..24a82d51fe60d 100644 |
2129 | --- a/drivers/net/ethernet/via/via-velocity.c |
2130 | +++ b/drivers/net/ethernet/via/via-velocity.c |
2131 | @@ -865,26 +865,13 @@ static u32 check_connection_type(struct mac_regs __iomem *regs) |
2132 | */ |
2133 | static int velocity_set_media_mode(struct velocity_info *vptr, u32 mii_status) |
2134 | { |
2135 | - u32 curr_status; |
2136 | struct mac_regs __iomem *regs = vptr->mac_regs; |
2137 | |
2138 | vptr->mii_status = mii_check_media_mode(vptr->mac_regs); |
2139 | - curr_status = vptr->mii_status & (~VELOCITY_LINK_FAIL); |
2140 | |
2141 | /* Set mii link status */ |
2142 | set_mii_flow_control(vptr); |
2143 | |
2144 | - /* |
2145 | - Check if new status is consistent with current status |
2146 | - if (((mii_status & curr_status) & VELOCITY_AUTONEG_ENABLE) || |
2147 | - (mii_status==curr_status)) { |
2148 | - vptr->mii_status=mii_check_media_mode(vptr->mac_regs); |
2149 | - vptr->mii_status=check_connection_type(vptr->mac_regs); |
2150 | - VELOCITY_PRT(MSG_LEVEL_INFO, "Velocity link no change\n"); |
2151 | - return 0; |
2152 | - } |
2153 | - */ |
2154 | - |
2155 | if (PHYID_GET_PHY_ID(vptr->phy_id) == PHYID_CICADA_CS8201) |
2156 | MII_REG_BITS_ON(AUXCR_MDPPS, MII_NCONFIG, vptr->mac_regs); |
2157 | |
2158 | diff --git a/drivers/net/phy/mdio-octeon.c b/drivers/net/phy/mdio-octeon.c |
2159 | index 8327382aa5689..088c737316526 100644 |
2160 | --- a/drivers/net/phy/mdio-octeon.c |
2161 | +++ b/drivers/net/phy/mdio-octeon.c |
2162 | @@ -72,7 +72,6 @@ static int octeon_mdiobus_probe(struct platform_device *pdev) |
2163 | |
2164 | return 0; |
2165 | fail_register: |
2166 | - mdiobus_free(bus->mii_bus); |
2167 | smi_en.u64 = 0; |
2168 | oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN); |
2169 | return err; |
2170 | @@ -86,7 +85,6 @@ static int octeon_mdiobus_remove(struct platform_device *pdev) |
2171 | bus = platform_get_drvdata(pdev); |
2172 | |
2173 | mdiobus_unregister(bus->mii_bus); |
2174 | - mdiobus_free(bus->mii_bus); |
2175 | smi_en.u64 = 0; |
2176 | oct_mdio_writeq(smi_en.u64, bus->register_base + SMI_EN); |
2177 | return 0; |
2178 | diff --git a/drivers/net/phy/mdio-thunder.c b/drivers/net/phy/mdio-thunder.c |
2179 | index b6128ae7f14f3..1e2f57ed1ef75 100644 |
2180 | --- a/drivers/net/phy/mdio-thunder.c |
2181 | +++ b/drivers/net/phy/mdio-thunder.c |
2182 | @@ -126,7 +126,6 @@ static void thunder_mdiobus_pci_remove(struct pci_dev *pdev) |
2183 | continue; |
2184 | |
2185 | mdiobus_unregister(bus->mii_bus); |
2186 | - mdiobus_free(bus->mii_bus); |
2187 | oct_mdio_writeq(0, bus->register_base + SMI_EN); |
2188 | } |
2189 | pci_set_drvdata(pdev, NULL); |
2190 | diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c |
2191 | index 02de9480d3f06..22450c4a92251 100644 |
2192 | --- a/drivers/net/usb/hso.c |
2193 | +++ b/drivers/net/usb/hso.c |
2194 | @@ -1689,7 +1689,7 @@ static int hso_serial_tiocmset(struct tty_struct *tty, |
2195 | spin_unlock_irqrestore(&serial->serial_lock, flags); |
2196 | |
2197 | return usb_control_msg(serial->parent->usb, |
2198 | - usb_rcvctrlpipe(serial->parent->usb, 0), 0x22, |
2199 | + usb_sndctrlpipe(serial->parent->usb, 0), 0x22, |
2200 | 0x21, val, if_num, NULL, 0, |
2201 | USB_CTRL_SET_TIMEOUT); |
2202 | } |
2203 | @@ -2436,7 +2436,7 @@ static int hso_rfkill_set_block(void *data, bool blocked) |
2204 | if (hso_dev->usb_gone) |
2205 | rv = 0; |
2206 | else |
2207 | - rv = usb_control_msg(hso_dev->usb, usb_rcvctrlpipe(hso_dev->usb, 0), |
2208 | + rv = usb_control_msg(hso_dev->usb, usb_sndctrlpipe(hso_dev->usb, 0), |
2209 | enabled ? 0x82 : 0x81, 0x40, 0, 0, NULL, 0, |
2210 | USB_CTRL_SET_TIMEOUT); |
2211 | mutex_unlock(&hso_dev->mutex); |
2212 | @@ -2619,32 +2619,31 @@ static struct hso_device *hso_create_bulk_serial_device( |
2213 | num_urbs = 2; |
2214 | serial->tiocmget = kzalloc(sizeof(struct hso_tiocmget), |
2215 | GFP_KERNEL); |
2216 | + if (!serial->tiocmget) |
2217 | + goto exit; |
2218 | serial->tiocmget->serial_state_notification |
2219 | = kzalloc(sizeof(struct hso_serial_state_notification), |
2220 | GFP_KERNEL); |
2221 | - /* it isn't going to break our heart if serial->tiocmget |
2222 | - * allocation fails don't bother checking this. |
2223 | - */ |
2224 | - if (serial->tiocmget && serial->tiocmget->serial_state_notification) { |
2225 | - tiocmget = serial->tiocmget; |
2226 | - tiocmget->endp = hso_get_ep(interface, |
2227 | - USB_ENDPOINT_XFER_INT, |
2228 | - USB_DIR_IN); |
2229 | - if (!tiocmget->endp) { |
2230 | - dev_err(&interface->dev, "Failed to find INT IN ep\n"); |
2231 | - goto exit; |
2232 | - } |
2233 | - |
2234 | - tiocmget->urb = usb_alloc_urb(0, GFP_KERNEL); |
2235 | - if (tiocmget->urb) { |
2236 | - mutex_init(&tiocmget->mutex); |
2237 | - init_waitqueue_head(&tiocmget->waitq); |
2238 | - } else |
2239 | - hso_free_tiomget(serial); |
2240 | + if (!serial->tiocmget->serial_state_notification) |
2241 | + goto exit; |
2242 | + tiocmget = serial->tiocmget; |
2243 | + tiocmget->endp = hso_get_ep(interface, |
2244 | + USB_ENDPOINT_XFER_INT, |
2245 | + USB_DIR_IN); |
2246 | + if (!tiocmget->endp) { |
2247 | + dev_err(&interface->dev, "Failed to find INT IN ep\n"); |
2248 | + goto exit; |
2249 | } |
2250 | - } |
2251 | - else |
2252 | + |
2253 | + tiocmget->urb = usb_alloc_urb(0, GFP_KERNEL); |
2254 | + if (!tiocmget->urb) |
2255 | + goto exit; |
2256 | + |
2257 | + mutex_init(&tiocmget->mutex); |
2258 | + init_waitqueue_head(&tiocmget->waitq); |
2259 | + } else { |
2260 | num_urbs = 1; |
2261 | + } |
2262 | |
2263 | if (hso_serial_common_create(serial, num_urbs, BULK_URB_RX_SIZE, |
2264 | BULK_URB_TX_SIZE)) |
2265 | diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c |
2266 | index 9556d431885f5..d0ae0df34e132 100644 |
2267 | --- a/drivers/net/usb/smsc75xx.c |
2268 | +++ b/drivers/net/usb/smsc75xx.c |
2269 | @@ -1482,7 +1482,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf) |
2270 | ret = smsc75xx_wait_ready(dev, 0); |
2271 | if (ret < 0) { |
2272 | netdev_warn(dev->net, "device not ready in smsc75xx_bind\n"); |
2273 | - return ret; |
2274 | + goto err; |
2275 | } |
2276 | |
2277 | smsc75xx_init_mac_address(dev); |
2278 | @@ -1491,7 +1491,7 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf) |
2279 | ret = smsc75xx_reset(dev); |
2280 | if (ret < 0) { |
2281 | netdev_warn(dev->net, "smsc75xx_reset error %d\n", ret); |
2282 | - return ret; |
2283 | + goto err; |
2284 | } |
2285 | |
2286 | dev->net->netdev_ops = &smsc75xx_netdev_ops; |
2287 | @@ -1501,6 +1501,10 @@ static int smsc75xx_bind(struct usbnet *dev, struct usb_interface *intf) |
2288 | dev->hard_mtu = dev->net->mtu + dev->net->hard_header_len; |
2289 | dev->net->max_mtu = MAX_SINGLE_PACKET_SIZE; |
2290 | return 0; |
2291 | + |
2292 | +err: |
2293 | + kfree(pdata); |
2294 | + return ret; |
2295 | } |
2296 | |
2297 | static void smsc75xx_unbind(struct usbnet *dev, struct usb_interface *intf) |
2298 | diff --git a/drivers/net/wireless/ath/ath10k/htt.h b/drivers/net/wireless/ath/ath10k/htt.h |
2299 | index bd5fa4dbab9c0..2637e188954d7 100644 |
2300 | --- a/drivers/net/wireless/ath/ath10k/htt.h |
2301 | +++ b/drivers/net/wireless/ath/ath10k/htt.h |
2302 | @@ -835,6 +835,7 @@ enum htt_security_types { |
2303 | |
2304 | #define ATH10K_HTT_TXRX_PEER_SECURITY_MAX 2 |
2305 | #define ATH10K_TXRX_NUM_EXT_TIDS 19 |
2306 | +#define ATH10K_TXRX_NON_QOS_TID 16 |
2307 | |
2308 | enum htt_security_flags { |
2309 | #define HTT_SECURITY_TYPE_MASK 0x7F |
2310 | diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c |
2311 | index 04095f91d3014..760d24a28f392 100644 |
2312 | --- a/drivers/net/wireless/ath/ath10k/htt_rx.c |
2313 | +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c |
2314 | @@ -1739,16 +1739,97 @@ static void ath10k_htt_rx_h_csum_offload(struct sk_buff *msdu) |
2315 | msdu->ip_summed = ath10k_htt_rx_get_csum_state(msdu); |
2316 | } |
2317 | |
2318 | +static u64 ath10k_htt_rx_h_get_pn(struct ath10k *ar, struct sk_buff *skb, |
2319 | + u16 offset, |
2320 | + enum htt_rx_mpdu_encrypt_type enctype) |
2321 | +{ |
2322 | + struct ieee80211_hdr *hdr; |
2323 | + u64 pn = 0; |
2324 | + u8 *ehdr; |
2325 | + |
2326 | + hdr = (struct ieee80211_hdr *)(skb->data + offset); |
2327 | + ehdr = skb->data + offset + ieee80211_hdrlen(hdr->frame_control); |
2328 | + |
2329 | + if (enctype == HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2) { |
2330 | + pn = ehdr[0]; |
2331 | + pn |= (u64)ehdr[1] << 8; |
2332 | + pn |= (u64)ehdr[4] << 16; |
2333 | + pn |= (u64)ehdr[5] << 24; |
2334 | + pn |= (u64)ehdr[6] << 32; |
2335 | + pn |= (u64)ehdr[7] << 40; |
2336 | + } |
2337 | + return pn; |
2338 | +} |
2339 | + |
2340 | +static bool ath10k_htt_rx_h_frag_multicast_check(struct ath10k *ar, |
2341 | + struct sk_buff *skb, |
2342 | + u16 offset) |
2343 | +{ |
2344 | + struct ieee80211_hdr *hdr; |
2345 | + |
2346 | + hdr = (struct ieee80211_hdr *)(skb->data + offset); |
2347 | + return !is_multicast_ether_addr(hdr->addr1); |
2348 | +} |
2349 | + |
2350 | +static bool ath10k_htt_rx_h_frag_pn_check(struct ath10k *ar, |
2351 | + struct sk_buff *skb, |
2352 | + u16 peer_id, |
2353 | + u16 offset, |
2354 | + enum htt_rx_mpdu_encrypt_type enctype) |
2355 | +{ |
2356 | + struct ath10k_peer *peer; |
2357 | + union htt_rx_pn_t *last_pn, new_pn = {0}; |
2358 | + struct ieee80211_hdr *hdr; |
2359 | + bool more_frags; |
2360 | + u8 tid, frag_number; |
2361 | + u32 seq; |
2362 | + |
2363 | + peer = ath10k_peer_find_by_id(ar, peer_id); |
2364 | + if (!peer) { |
2365 | + ath10k_dbg(ar, ATH10K_DBG_HTT, "invalid peer for frag pn check\n"); |
2366 | + return false; |
2367 | + } |
2368 | + |
2369 | + hdr = (struct ieee80211_hdr *)(skb->data + offset); |
2370 | + if (ieee80211_is_data_qos(hdr->frame_control)) |
2371 | + tid = ieee80211_get_tid(hdr); |
2372 | + else |
2373 | + tid = ATH10K_TXRX_NON_QOS_TID; |
2374 | + |
2375 | + last_pn = &peer->frag_tids_last_pn[tid]; |
2376 | + new_pn.pn48 = ath10k_htt_rx_h_get_pn(ar, skb, offset, enctype); |
2377 | + more_frags = ieee80211_has_morefrags(hdr->frame_control); |
2378 | + frag_number = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG; |
2379 | + seq = (__le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4; |
2380 | + |
2381 | + if (frag_number == 0) { |
2382 | + last_pn->pn48 = new_pn.pn48; |
2383 | + peer->frag_tids_seq[tid] = seq; |
2384 | + } else { |
2385 | + if (seq != peer->frag_tids_seq[tid]) |
2386 | + return false; |
2387 | + |
2388 | + if (new_pn.pn48 != last_pn->pn48 + 1) |
2389 | + return false; |
2390 | + |
2391 | + last_pn->pn48 = new_pn.pn48; |
2392 | + } |
2393 | + |
2394 | + return true; |
2395 | +} |
2396 | + |
2397 | static void ath10k_htt_rx_h_mpdu(struct ath10k *ar, |
2398 | struct sk_buff_head *amsdu, |
2399 | struct ieee80211_rx_status *status, |
2400 | bool fill_crypt_header, |
2401 | u8 *rx_hdr, |
2402 | - enum ath10k_pkt_rx_err *err) |
2403 | + enum ath10k_pkt_rx_err *err, |
2404 | + u16 peer_id, |
2405 | + bool frag) |
2406 | { |
2407 | struct sk_buff *first; |
2408 | struct sk_buff *last; |
2409 | - struct sk_buff *msdu; |
2410 | + struct sk_buff *msdu, *temp; |
2411 | struct htt_rx_desc *rxd; |
2412 | struct ieee80211_hdr *hdr; |
2413 | enum htt_rx_mpdu_encrypt_type enctype; |
2414 | @@ -1761,6 +1842,7 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar, |
2415 | bool is_decrypted; |
2416 | bool is_mgmt; |
2417 | u32 attention; |
2418 | + bool frag_pn_check = true, multicast_check = true; |
2419 | |
2420 | if (skb_queue_empty(amsdu)) |
2421 | return; |
2422 | @@ -1859,7 +1941,37 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar, |
2423 | } |
2424 | |
2425 | skb_queue_walk(amsdu, msdu) { |
2426 | + if (frag && !fill_crypt_header && is_decrypted && |
2427 | + enctype == HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2) |
2428 | + frag_pn_check = ath10k_htt_rx_h_frag_pn_check(ar, |
2429 | + msdu, |
2430 | + peer_id, |
2431 | + 0, |
2432 | + enctype); |
2433 | + |
2434 | + if (frag) |
2435 | + multicast_check = ath10k_htt_rx_h_frag_multicast_check(ar, |
2436 | + msdu, |
2437 | + 0); |
2438 | + |
2439 | + if (!frag_pn_check || !multicast_check) { |
2440 | + /* Discard the fragment with invalid PN or multicast DA |
2441 | + */ |
2442 | + temp = msdu->prev; |
2443 | + __skb_unlink(msdu, amsdu); |
2444 | + dev_kfree_skb_any(msdu); |
2445 | + msdu = temp; |
2446 | + frag_pn_check = true; |
2447 | + multicast_check = true; |
2448 | + continue; |
2449 | + } |
2450 | + |
2451 | ath10k_htt_rx_h_csum_offload(msdu); |
2452 | + |
2453 | + if (frag && !fill_crypt_header && |
2454 | + enctype == HTT_RX_MPDU_ENCRYPT_TKIP_WPA) |
2455 | + status->flag &= ~RX_FLAG_MMIC_STRIPPED; |
2456 | + |
2457 | ath10k_htt_rx_h_undecap(ar, msdu, status, first_hdr, enctype, |
2458 | is_decrypted); |
2459 | |
2460 | @@ -1877,6 +1989,11 @@ static void ath10k_htt_rx_h_mpdu(struct ath10k *ar, |
2461 | |
2462 | hdr = (void *)msdu->data; |
2463 | hdr->frame_control &= ~__cpu_to_le16(IEEE80211_FCTL_PROTECTED); |
2464 | + |
2465 | + if (frag && !fill_crypt_header && |
2466 | + enctype == HTT_RX_MPDU_ENCRYPT_TKIP_WPA) |
2467 | + status->flag &= ~RX_FLAG_IV_STRIPPED & |
2468 | + ~RX_FLAG_MMIC_STRIPPED; |
2469 | } |
2470 | } |
2471 | |
2472 | @@ -1984,14 +2101,62 @@ static void ath10k_htt_rx_h_unchain(struct ath10k *ar, |
2473 | ath10k_unchain_msdu(amsdu, unchain_cnt); |
2474 | } |
2475 | |
2476 | +static bool ath10k_htt_rx_validate_amsdu(struct ath10k *ar, |
2477 | + struct sk_buff_head *amsdu) |
2478 | +{ |
2479 | + u8 *subframe_hdr; |
2480 | + struct sk_buff *first; |
2481 | + bool is_first, is_last; |
2482 | + struct htt_rx_desc *rxd; |
2483 | + struct ieee80211_hdr *hdr; |
2484 | + size_t hdr_len, crypto_len; |
2485 | + enum htt_rx_mpdu_encrypt_type enctype; |
2486 | + int bytes_aligned = ar->hw_params.decap_align_bytes; |
2487 | + |
2488 | + first = skb_peek(amsdu); |
2489 | + |
2490 | + rxd = (void *)first->data - sizeof(*rxd); |
2491 | + hdr = (void *)rxd->rx_hdr_status; |
2492 | + |
2493 | + is_first = !!(rxd->msdu_end.common.info0 & |
2494 | + __cpu_to_le32(RX_MSDU_END_INFO0_FIRST_MSDU)); |
2495 | + is_last = !!(rxd->msdu_end.common.info0 & |
2496 | + __cpu_to_le32(RX_MSDU_END_INFO0_LAST_MSDU)); |
2497 | + |
2498 | + /* Return in case of non-aggregated msdu */ |
2499 | + if (is_first && is_last) |
2500 | + return true; |
2501 | + |
2502 | + /* First msdu flag is not set for the first msdu of the list */ |
2503 | + if (!is_first) |
2504 | + return false; |
2505 | + |
2506 | + enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0), |
2507 | + RX_MPDU_START_INFO0_ENCRYPT_TYPE); |
2508 | + |
2509 | + hdr_len = ieee80211_hdrlen(hdr->frame_control); |
2510 | + crypto_len = ath10k_htt_rx_crypto_param_len(ar, enctype); |
2511 | + |
2512 | + subframe_hdr = (u8 *)hdr + round_up(hdr_len, bytes_aligned) + |
2513 | + crypto_len; |
2514 | + |
2515 | + /* Validate if the amsdu has a proper first subframe. |
2516 | + * There are chances a single msdu can be received as amsdu when |
2517 | + * the unauthenticated amsdu flag of a QoS header |
2518 | + * gets flipped in non-SPP AMSDU's, in such cases the first |
2519 | + * subframe has llc/snap header in place of a valid da. |
2520 | + * return false if the da matches rfc1042 pattern |
2521 | + */ |
2522 | + if (ether_addr_equal(subframe_hdr, rfc1042_header)) |
2523 | + return false; |
2524 | + |
2525 | + return true; |
2526 | +} |
2527 | + |
2528 | static bool ath10k_htt_rx_amsdu_allowed(struct ath10k *ar, |
2529 | struct sk_buff_head *amsdu, |
2530 | struct ieee80211_rx_status *rx_status) |
2531 | { |
2532 | - /* FIXME: It might be a good idea to do some fuzzy-testing to drop |
2533 | - * invalid/dangerous frames. |
2534 | - */ |
2535 | - |
2536 | if (!rx_status->freq) { |
2537 | ath10k_dbg(ar, ATH10K_DBG_HTT, "no channel configured; ignoring frame(s)!\n"); |
2538 | return false; |
2539 | @@ -2002,6 +2167,11 @@ static bool ath10k_htt_rx_amsdu_allowed(struct ath10k *ar, |
2540 | return false; |
2541 | } |
2542 | |
2543 | + if (!ath10k_htt_rx_validate_amsdu(ar, amsdu)) { |
2544 | + ath10k_dbg(ar, ATH10K_DBG_HTT, "invalid amsdu received\n"); |
2545 | + return false; |
2546 | + } |
2547 | + |
2548 | return true; |
2549 | } |
2550 | |
2551 | @@ -2064,7 +2234,8 @@ static int ath10k_htt_rx_handle_amsdu(struct ath10k_htt *htt) |
2552 | ath10k_htt_rx_h_unchain(ar, &amsdu, &drop_cnt, &unchain_cnt); |
2553 | |
2554 | ath10k_htt_rx_h_filter(ar, &amsdu, rx_status, &drop_cnt_filter); |
2555 | - ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status, true, first_hdr, &err); |
2556 | + ath10k_htt_rx_h_mpdu(ar, &amsdu, rx_status, true, first_hdr, &err, 0, |
2557 | + false); |
2558 | msdus_to_queue = skb_queue_len(&amsdu); |
2559 | ath10k_htt_rx_h_enqueue(ar, &amsdu, rx_status); |
2560 | |
2561 | @@ -2197,6 +2368,11 @@ static bool ath10k_htt_rx_proc_rx_ind_hl(struct ath10k_htt *htt, |
2562 | fw_desc = &rx->fw_desc; |
2563 | rx_desc_len = fw_desc->len; |
2564 | |
2565 | + if (fw_desc->u.bits.discard) { |
2566 | + ath10k_dbg(ar, ATH10K_DBG_HTT, "htt discard mpdu\n"); |
2567 | + goto err; |
2568 | + } |
2569 | + |
2570 | /* I have not yet seen any case where num_mpdu_ranges > 1. |
2571 | * qcacld does not seem handle that case either, so we introduce the |
2572 | * same limitiation here as well. |
2573 | @@ -2497,6 +2673,13 @@ static bool ath10k_htt_rx_proc_rx_frag_ind_hl(struct ath10k_htt *htt, |
2574 | rx_desc = (struct htt_hl_rx_desc *)(skb->data + tot_hdr_len); |
2575 | rx_desc_info = __le32_to_cpu(rx_desc->info); |
2576 | |
2577 | + hdr = (struct ieee80211_hdr *)((u8 *)rx_desc + rx_hl->fw_desc.len); |
2578 | + |
2579 | + if (is_multicast_ether_addr(hdr->addr1)) { |
2580 | + /* Discard the fragment with multicast DA */ |
2581 | + goto err; |
2582 | + } |
2583 | + |
2584 | if (!MS(rx_desc_info, HTT_RX_DESC_HL_INFO_ENCRYPTED)) { |
2585 | spin_unlock_bh(&ar->data_lock); |
2586 | return ath10k_htt_rx_proc_rx_ind_hl(htt, &resp->rx_ind_hl, skb, |
2587 | @@ -2504,8 +2687,6 @@ static bool ath10k_htt_rx_proc_rx_frag_ind_hl(struct ath10k_htt *htt, |
2588 | HTT_RX_NON_TKIP_MIC); |
2589 | } |
2590 | |
2591 | - hdr = (struct ieee80211_hdr *)((u8 *)rx_desc + rx_hl->fw_desc.len); |
2592 | - |
2593 | if (ieee80211_has_retry(hdr->frame_control)) |
2594 | goto err; |
2595 | |
2596 | @@ -3014,7 +3195,7 @@ static int ath10k_htt_rx_in_ord_ind(struct ath10k *ar, struct sk_buff *skb) |
2597 | ath10k_htt_rx_h_ppdu(ar, &amsdu, status, vdev_id); |
2598 | ath10k_htt_rx_h_filter(ar, &amsdu, status, NULL); |
2599 | ath10k_htt_rx_h_mpdu(ar, &amsdu, status, false, NULL, |
2600 | - NULL); |
2601 | + NULL, peer_id, frag); |
2602 | ath10k_htt_rx_h_enqueue(ar, &amsdu, status); |
2603 | break; |
2604 | case -EAGAIN: |
2605 | diff --git a/drivers/net/wireless/ath/ath10k/rx_desc.h b/drivers/net/wireless/ath/ath10k/rx_desc.h |
2606 | index dec1582005b94..13a1cae6b51b0 100644 |
2607 | --- a/drivers/net/wireless/ath/ath10k/rx_desc.h |
2608 | +++ b/drivers/net/wireless/ath/ath10k/rx_desc.h |
2609 | @@ -1282,7 +1282,19 @@ struct fw_rx_desc_base { |
2610 | #define FW_RX_DESC_UDP (1 << 6) |
2611 | |
2612 | struct fw_rx_desc_hl { |
2613 | - u8 info0; |
2614 | + union { |
2615 | + struct { |
2616 | + u8 discard:1, |
2617 | + forward:1, |
2618 | + any_err:1, |
2619 | + dup_err:1, |
2620 | + reserved:1, |
2621 | + inspect:1, |
2622 | + extension:2; |
2623 | + } bits; |
2624 | + u8 info0; |
2625 | + } u; |
2626 | + |
2627 | u8 version; |
2628 | u8 len; |
2629 | u8 flags; |
2630 | diff --git a/drivers/net/wireless/ath/ath6kl/debug.c b/drivers/net/wireless/ath/ath6kl/debug.c |
2631 | index 54337d60f288b..085a134069f79 100644 |
2632 | --- a/drivers/net/wireless/ath/ath6kl/debug.c |
2633 | +++ b/drivers/net/wireless/ath/ath6kl/debug.c |
2634 | @@ -1027,14 +1027,17 @@ static ssize_t ath6kl_lrssi_roam_write(struct file *file, |
2635 | { |
2636 | struct ath6kl *ar = file->private_data; |
2637 | unsigned long lrssi_roam_threshold; |
2638 | + int ret; |
2639 | |
2640 | if (kstrtoul_from_user(user_buf, count, 0, &lrssi_roam_threshold)) |
2641 | return -EINVAL; |
2642 | |
2643 | ar->lrssi_roam_threshold = lrssi_roam_threshold; |
2644 | |
2645 | - ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold); |
2646 | + ret = ath6kl_wmi_set_roam_lrssi_cmd(ar->wmi, ar->lrssi_roam_threshold); |
2647 | |
2648 | + if (ret) |
2649 | + return ret; |
2650 | return count; |
2651 | } |
2652 | |
2653 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |
2654 | index fc12598b2dd3f..c492d2d2db1df 100644 |
2655 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |
2656 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c |
2657 | @@ -1168,13 +1168,9 @@ static struct sdio_driver brcmf_sdmmc_driver = { |
2658 | }, |
2659 | }; |
2660 | |
2661 | -void brcmf_sdio_register(void) |
2662 | +int brcmf_sdio_register(void) |
2663 | { |
2664 | - int ret; |
2665 | - |
2666 | - ret = sdio_register_driver(&brcmf_sdmmc_driver); |
2667 | - if (ret) |
2668 | - brcmf_err("sdio_register_driver failed: %d\n", ret); |
2669 | + return sdio_register_driver(&brcmf_sdmmc_driver); |
2670 | } |
2671 | |
2672 | void brcmf_sdio_exit(void) |
2673 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h |
2674 | index 623c0168da79c..8b27494a5d3dc 100644 |
2675 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h |
2676 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bus.h |
2677 | @@ -274,11 +274,26 @@ void brcmf_bus_add_txhdrlen(struct device *dev, uint len); |
2678 | |
2679 | #ifdef CONFIG_BRCMFMAC_SDIO |
2680 | void brcmf_sdio_exit(void); |
2681 | -void brcmf_sdio_register(void); |
2682 | +int brcmf_sdio_register(void); |
2683 | +#else |
2684 | +static inline void brcmf_sdio_exit(void) { } |
2685 | +static inline int brcmf_sdio_register(void) { return 0; } |
2686 | #endif |
2687 | + |
2688 | #ifdef CONFIG_BRCMFMAC_USB |
2689 | void brcmf_usb_exit(void); |
2690 | -void brcmf_usb_register(void); |
2691 | +int brcmf_usb_register(void); |
2692 | +#else |
2693 | +static inline void brcmf_usb_exit(void) { } |
2694 | +static inline int brcmf_usb_register(void) { return 0; } |
2695 | +#endif |
2696 | + |
2697 | +#ifdef CONFIG_BRCMFMAC_PCIE |
2698 | +void brcmf_pcie_exit(void); |
2699 | +int brcmf_pcie_register(void); |
2700 | +#else |
2701 | +static inline void brcmf_pcie_exit(void) { } |
2702 | +static inline int brcmf_pcie_register(void) { return 0; } |
2703 | #endif |
2704 | |
2705 | #endif /* BRCMFMAC_BUS_H */ |
2706 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |
2707 | index e9bb8dbdc9aa8..edb79e9665dc3 100644 |
2708 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |
2709 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c |
2710 | @@ -1438,40 +1438,34 @@ void brcmf_bus_change_state(struct brcmf_bus *bus, enum brcmf_bus_state state) |
2711 | } |
2712 | } |
2713 | |
2714 | -static void brcmf_driver_register(struct work_struct *work) |
2715 | -{ |
2716 | -#ifdef CONFIG_BRCMFMAC_SDIO |
2717 | - brcmf_sdio_register(); |
2718 | -#endif |
2719 | -#ifdef CONFIG_BRCMFMAC_USB |
2720 | - brcmf_usb_register(); |
2721 | -#endif |
2722 | -#ifdef CONFIG_BRCMFMAC_PCIE |
2723 | - brcmf_pcie_register(); |
2724 | -#endif |
2725 | -} |
2726 | -static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register); |
2727 | - |
2728 | int __init brcmf_core_init(void) |
2729 | { |
2730 | - if (!schedule_work(&brcmf_driver_work)) |
2731 | - return -EBUSY; |
2732 | + int err; |
2733 | + |
2734 | + err = brcmf_sdio_register(); |
2735 | + if (err) |
2736 | + return err; |
2737 | + |
2738 | + err = brcmf_usb_register(); |
2739 | + if (err) |
2740 | + goto error_usb_register; |
2741 | |
2742 | + err = brcmf_pcie_register(); |
2743 | + if (err) |
2744 | + goto error_pcie_register; |
2745 | return 0; |
2746 | + |
2747 | +error_pcie_register: |
2748 | + brcmf_usb_exit(); |
2749 | +error_usb_register: |
2750 | + brcmf_sdio_exit(); |
2751 | + return err; |
2752 | } |
2753 | |
2754 | void __exit brcmf_core_exit(void) |
2755 | { |
2756 | - cancel_work_sync(&brcmf_driver_work); |
2757 | - |
2758 | -#ifdef CONFIG_BRCMFMAC_SDIO |
2759 | brcmf_sdio_exit(); |
2760 | -#endif |
2761 | -#ifdef CONFIG_BRCMFMAC_USB |
2762 | brcmf_usb_exit(); |
2763 | -#endif |
2764 | -#ifdef CONFIG_BRCMFMAC_PCIE |
2765 | brcmf_pcie_exit(); |
2766 | -#endif |
2767 | } |
2768 | |
2769 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
2770 | index cb68f54a9c56e..bda042138e967 100644 |
2771 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
2772 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c |
2773 | @@ -2137,15 +2137,10 @@ static struct pci_driver brcmf_pciedrvr = { |
2774 | }; |
2775 | |
2776 | |
2777 | -void brcmf_pcie_register(void) |
2778 | +int brcmf_pcie_register(void) |
2779 | { |
2780 | - int err; |
2781 | - |
2782 | brcmf_dbg(PCIE, "Enter\n"); |
2783 | - err = pci_register_driver(&brcmf_pciedrvr); |
2784 | - if (err) |
2785 | - brcmf_err(NULL, "PCIE driver registration failed, err=%d\n", |
2786 | - err); |
2787 | + return pci_register_driver(&brcmf_pciedrvr); |
2788 | } |
2789 | |
2790 | |
2791 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.h |
2792 | index d026401d20010..8e6c227e8315c 100644 |
2793 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.h |
2794 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.h |
2795 | @@ -11,9 +11,4 @@ struct brcmf_pciedev { |
2796 | struct brcmf_pciedev_info *devinfo; |
2797 | }; |
2798 | |
2799 | - |
2800 | -void brcmf_pcie_exit(void); |
2801 | -void brcmf_pcie_register(void); |
2802 | - |
2803 | - |
2804 | #endif /* BRCMFMAC_PCIE_H */ |
2805 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c |
2806 | index 575ed19e91951..3b897f040371c 100644 |
2807 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c |
2808 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c |
2809 | @@ -1558,12 +1558,8 @@ void brcmf_usb_exit(void) |
2810 | usb_deregister(&brcmf_usbdrvr); |
2811 | } |
2812 | |
2813 | -void brcmf_usb_register(void) |
2814 | +int brcmf_usb_register(void) |
2815 | { |
2816 | - int ret; |
2817 | - |
2818 | brcmf_dbg(USB, "Enter\n"); |
2819 | - ret = usb_register(&brcmf_usbdrvr); |
2820 | - if (ret) |
2821 | - brcmf_err("usb_register failed %d\n", ret); |
2822 | + return usb_register(&brcmf_usbdrvr); |
2823 | } |
2824 | diff --git a/drivers/net/wireless/marvell/libertas/mesh.c b/drivers/net/wireless/marvell/libertas/mesh.c |
2825 | index 2747c957d18c9..050fd403110ed 100644 |
2826 | --- a/drivers/net/wireless/marvell/libertas/mesh.c |
2827 | +++ b/drivers/net/wireless/marvell/libertas/mesh.c |
2828 | @@ -801,24 +801,6 @@ static const struct attribute_group mesh_ie_group = { |
2829 | .attrs = mesh_ie_attrs, |
2830 | }; |
2831 | |
2832 | -static void lbs_persist_config_init(struct net_device *dev) |
2833 | -{ |
2834 | - int ret; |
2835 | - ret = sysfs_create_group(&(dev->dev.kobj), &boot_opts_group); |
2836 | - if (ret) |
2837 | - pr_err("failed to create boot_opts_group.\n"); |
2838 | - |
2839 | - ret = sysfs_create_group(&(dev->dev.kobj), &mesh_ie_group); |
2840 | - if (ret) |
2841 | - pr_err("failed to create mesh_ie_group.\n"); |
2842 | -} |
2843 | - |
2844 | -static void lbs_persist_config_remove(struct net_device *dev) |
2845 | -{ |
2846 | - sysfs_remove_group(&(dev->dev.kobj), &boot_opts_group); |
2847 | - sysfs_remove_group(&(dev->dev.kobj), &mesh_ie_group); |
2848 | -} |
2849 | - |
2850 | |
2851 | /*************************************************************************** |
2852 | * Initializing and starting, stopping mesh |
2853 | @@ -1019,6 +1001,10 @@ static int lbs_add_mesh(struct lbs_private *priv) |
2854 | SET_NETDEV_DEV(priv->mesh_dev, priv->dev->dev.parent); |
2855 | |
2856 | mesh_dev->flags |= IFF_BROADCAST | IFF_MULTICAST; |
2857 | + mesh_dev->sysfs_groups[0] = &lbs_mesh_attr_group; |
2858 | + mesh_dev->sysfs_groups[1] = &boot_opts_group; |
2859 | + mesh_dev->sysfs_groups[2] = &mesh_ie_group; |
2860 | + |
2861 | /* Register virtual mesh interface */ |
2862 | ret = register_netdev(mesh_dev); |
2863 | if (ret) { |
2864 | @@ -1026,19 +1012,10 @@ static int lbs_add_mesh(struct lbs_private *priv) |
2865 | goto err_free_netdev; |
2866 | } |
2867 | |
2868 | - ret = sysfs_create_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group); |
2869 | - if (ret) |
2870 | - goto err_unregister; |
2871 | - |
2872 | - lbs_persist_config_init(mesh_dev); |
2873 | - |
2874 | /* Everything successful */ |
2875 | ret = 0; |
2876 | goto done; |
2877 | |
2878 | -err_unregister: |
2879 | - unregister_netdev(mesh_dev); |
2880 | - |
2881 | err_free_netdev: |
2882 | free_netdev(mesh_dev); |
2883 | |
2884 | @@ -1059,8 +1036,6 @@ void lbs_remove_mesh(struct lbs_private *priv) |
2885 | |
2886 | netif_stop_queue(mesh_dev); |
2887 | netif_carrier_off(mesh_dev); |
2888 | - sysfs_remove_group(&(mesh_dev->dev.kobj), &lbs_mesh_attr_group); |
2889 | - lbs_persist_config_remove(mesh_dev); |
2890 | unregister_netdev(mesh_dev); |
2891 | priv->mesh_dev = NULL; |
2892 | kfree(mesh_dev->ieee80211_ptr); |
2893 | diff --git a/drivers/platform/x86/hp-wireless.c b/drivers/platform/x86/hp-wireless.c |
2894 | index 12c31fd5d5ae2..0753ef18e7211 100644 |
2895 | --- a/drivers/platform/x86/hp-wireless.c |
2896 | +++ b/drivers/platform/x86/hp-wireless.c |
2897 | @@ -17,12 +17,14 @@ MODULE_LICENSE("GPL"); |
2898 | MODULE_AUTHOR("Alex Hung"); |
2899 | MODULE_ALIAS("acpi*:HPQ6001:*"); |
2900 | MODULE_ALIAS("acpi*:WSTADEF:*"); |
2901 | +MODULE_ALIAS("acpi*:AMDI0051:*"); |
2902 | |
2903 | static struct input_dev *hpwl_input_dev; |
2904 | |
2905 | static const struct acpi_device_id hpwl_ids[] = { |
2906 | {"HPQ6001", 0}, |
2907 | {"WSTADEF", 0}, |
2908 | + {"AMDI0051", 0}, |
2909 | {"", 0}, |
2910 | }; |
2911 | |
2912 | diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c |
2913 | index 799cbe2ffcf36..8c0867bda8280 100644 |
2914 | --- a/drivers/platform/x86/hp_accel.c |
2915 | +++ b/drivers/platform/x86/hp_accel.c |
2916 | @@ -88,6 +88,9 @@ MODULE_DEVICE_TABLE(acpi, lis3lv02d_device_ids); |
2917 | static int lis3lv02d_acpi_init(struct lis3lv02d *lis3) |
2918 | { |
2919 | struct acpi_device *dev = lis3->bus_priv; |
2920 | + if (!lis3->init_required) |
2921 | + return 0; |
2922 | + |
2923 | if (acpi_evaluate_object(dev->handle, METHOD_NAME__INI, |
2924 | NULL, NULL) != AE_OK) |
2925 | return -EINVAL; |
2926 | @@ -356,6 +359,7 @@ static int lis3lv02d_add(struct acpi_device *device) |
2927 | } |
2928 | |
2929 | /* call the core layer do its init */ |
2930 | + lis3_dev.init_required = true; |
2931 | ret = lis3lv02d_init_device(&lis3_dev); |
2932 | if (ret) |
2933 | return ret; |
2934 | @@ -403,11 +407,27 @@ static int lis3lv02d_suspend(struct device *dev) |
2935 | |
2936 | static int lis3lv02d_resume(struct device *dev) |
2937 | { |
2938 | + lis3_dev.init_required = false; |
2939 | + lis3lv02d_poweron(&lis3_dev); |
2940 | + return 0; |
2941 | +} |
2942 | + |
2943 | +static int lis3lv02d_restore(struct device *dev) |
2944 | +{ |
2945 | + lis3_dev.init_required = true; |
2946 | lis3lv02d_poweron(&lis3_dev); |
2947 | return 0; |
2948 | } |
2949 | |
2950 | -static SIMPLE_DEV_PM_OPS(hp_accel_pm, lis3lv02d_suspend, lis3lv02d_resume); |
2951 | +static const struct dev_pm_ops hp_accel_pm = { |
2952 | + .suspend = lis3lv02d_suspend, |
2953 | + .resume = lis3lv02d_resume, |
2954 | + .freeze = lis3lv02d_suspend, |
2955 | + .thaw = lis3lv02d_resume, |
2956 | + .poweroff = lis3lv02d_suspend, |
2957 | + .restore = lis3lv02d_restore, |
2958 | +}; |
2959 | + |
2960 | #define HP_ACCEL_PM (&hp_accel_pm) |
2961 | #else |
2962 | #define HP_ACCEL_PM NULL |
2963 | diff --git a/drivers/platform/x86/intel_punit_ipc.c b/drivers/platform/x86/intel_punit_ipc.c |
2964 | index fa97834fdb78e..ccb44f2eb2407 100644 |
2965 | --- a/drivers/platform/x86/intel_punit_ipc.c |
2966 | +++ b/drivers/platform/x86/intel_punit_ipc.c |
2967 | @@ -328,6 +328,7 @@ static const struct acpi_device_id punit_ipc_acpi_ids[] = { |
2968 | { "INT34D4", 0 }, |
2969 | { } |
2970 | }; |
2971 | +MODULE_DEVICE_TABLE(acpi, punit_ipc_acpi_ids); |
2972 | |
2973 | static struct platform_driver intel_punit_ipc_driver = { |
2974 | .probe = intel_punit_ipc_probe, |
2975 | diff --git a/drivers/platform/x86/touchscreen_dmi.c b/drivers/platform/x86/touchscreen_dmi.c |
2976 | index 7ed1189a7200c..515c66ca1aecb 100644 |
2977 | --- a/drivers/platform/x86/touchscreen_dmi.c |
2978 | +++ b/drivers/platform/x86/touchscreen_dmi.c |
2979 | @@ -838,6 +838,14 @@ static const struct dmi_system_id touchscreen_dmi_table[] = { |
2980 | DMI_MATCH(DMI_BIOS_VERSION, "jumperx.T87.KFBNEEA"), |
2981 | }, |
2982 | }, |
2983 | + { |
2984 | + /* Mediacom WinPad 7.0 W700 (same hw as Wintron surftab 7") */ |
2985 | + .driver_data = (void *)&trekstor_surftab_wintron70_data, |
2986 | + .matches = { |
2987 | + DMI_MATCH(DMI_SYS_VENDOR, "MEDIACOM"), |
2988 | + DMI_MATCH(DMI_PRODUCT_NAME, "WinPad 7 W10 - WPW700"), |
2989 | + }, |
2990 | + }, |
2991 | { |
2992 | /* Mediacom Flexbook Edge 11 (same hw as TS Primebook C11) */ |
2993 | .driver_data = (void *)&trekstor_primebook_c11_data, |
2994 | diff --git a/drivers/s390/cio/vfio_ccw_cp.c b/drivers/s390/cio/vfio_ccw_cp.c |
2995 | index 3645d1720c4b5..9628e0f3add3f 100644 |
2996 | --- a/drivers/s390/cio/vfio_ccw_cp.c |
2997 | +++ b/drivers/s390/cio/vfio_ccw_cp.c |
2998 | @@ -636,6 +636,10 @@ int cp_init(struct channel_program *cp, struct device *mdev, union orb *orb) |
2999 | { |
3000 | int ret; |
3001 | |
3002 | + /* this is an error in the caller */ |
3003 | + if (cp->initialized) |
3004 | + return -EBUSY; |
3005 | + |
3006 | /* |
3007 | * XXX: |
3008 | * Only support prefetch enable mode now. |
3009 | diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c |
3010 | index c25e8a54e8690..6e988233fb81f 100644 |
3011 | --- a/drivers/scsi/BusLogic.c |
3012 | +++ b/drivers/scsi/BusLogic.c |
3013 | @@ -3077,11 +3077,11 @@ static int blogic_qcmd_lck(struct scsi_cmnd *command, |
3014 | ccb->opcode = BLOGIC_INITIATOR_CCB_SG; |
3015 | ccb->datalen = count * sizeof(struct blogic_sg_seg); |
3016 | if (blogic_multimaster_type(adapter)) |
3017 | - ccb->data = (void *)((unsigned int) ccb->dma_handle + |
3018 | + ccb->data = (unsigned int) ccb->dma_handle + |
3019 | ((unsigned long) &ccb->sglist - |
3020 | - (unsigned long) ccb)); |
3021 | + (unsigned long) ccb); |
3022 | else |
3023 | - ccb->data = ccb->sglist; |
3024 | + ccb->data = virt_to_32bit_virt(ccb->sglist); |
3025 | |
3026 | scsi_for_each_sg(command, sg, count, i) { |
3027 | ccb->sglist[i].segbytes = sg_dma_len(sg); |
3028 | diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h |
3029 | index 6182cc8a0344a..e081ad47d1cf4 100644 |
3030 | --- a/drivers/scsi/BusLogic.h |
3031 | +++ b/drivers/scsi/BusLogic.h |
3032 | @@ -814,7 +814,7 @@ struct blogic_ccb { |
3033 | unsigned char cdblen; /* Byte 2 */ |
3034 | unsigned char sense_datalen; /* Byte 3 */ |
3035 | u32 datalen; /* Bytes 4-7 */ |
3036 | - void *data; /* Bytes 8-11 */ |
3037 | + u32 data; /* Bytes 8-11 */ |
3038 | unsigned char:8; /* Byte 12 */ |
3039 | unsigned char:8; /* Byte 13 */ |
3040 | enum blogic_adapter_status adapter_status; /* Byte 14 */ |
3041 | diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c |
3042 | index 7c86fd248129a..f751a12f92ea0 100644 |
3043 | --- a/drivers/scsi/libsas/sas_port.c |
3044 | +++ b/drivers/scsi/libsas/sas_port.c |
3045 | @@ -25,7 +25,7 @@ static bool phy_is_wideport_member(struct asd_sas_port *port, struct asd_sas_phy |
3046 | |
3047 | static void sas_resume_port(struct asd_sas_phy *phy) |
3048 | { |
3049 | - struct domain_device *dev; |
3050 | + struct domain_device *dev, *n; |
3051 | struct asd_sas_port *port = phy->port; |
3052 | struct sas_ha_struct *sas_ha = phy->ha; |
3053 | struct sas_internal *si = to_sas_internal(sas_ha->core.shost->transportt); |
3054 | @@ -44,7 +44,7 @@ static void sas_resume_port(struct asd_sas_phy *phy) |
3055 | * 1/ presume every device came back |
3056 | * 2/ force the next revalidation to check all expander phys |
3057 | */ |
3058 | - list_for_each_entry(dev, &port->dev_list, dev_list_node) { |
3059 | + list_for_each_entry_safe(dev, n, &port->dev_list, dev_list_node) { |
3060 | int i, rc; |
3061 | |
3062 | rc = sas_notify_lldd_dev_found(dev); |
3063 | diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c |
3064 | index c7560d7d16276..40dccc580e866 100644 |
3065 | --- a/drivers/spi/spi-fsl-dspi.c |
3066 | +++ b/drivers/spi/spi-fsl-dspi.c |
3067 | @@ -1142,11 +1142,13 @@ poll_mode: |
3068 | ret = spi_register_controller(ctlr); |
3069 | if (ret != 0) { |
3070 | dev_err(&pdev->dev, "Problem registering DSPI ctlr\n"); |
3071 | - goto out_free_irq; |
3072 | + goto out_release_dma; |
3073 | } |
3074 | |
3075 | return ret; |
3076 | |
3077 | +out_release_dma: |
3078 | + dspi_release_dma(dspi); |
3079 | out_free_irq: |
3080 | if (dspi->irq) |
3081 | free_irq(dspi->irq, dspi); |
3082 | diff --git a/drivers/spi/spi-geni-qcom.c b/drivers/spi/spi-geni-qcom.c |
3083 | index 6f3d64a1a2b3e..01b53d816497c 100644 |
3084 | --- a/drivers/spi/spi-geni-qcom.c |
3085 | +++ b/drivers/spi/spi-geni-qcom.c |
3086 | @@ -552,7 +552,7 @@ static int spi_geni_probe(struct platform_device *pdev) |
3087 | return PTR_ERR(clk); |
3088 | } |
3089 | |
3090 | - spi = spi_alloc_master(&pdev->dev, sizeof(*mas)); |
3091 | + spi = devm_spi_alloc_master(&pdev->dev, sizeof(*mas)); |
3092 | if (!spi) |
3093 | return -ENOMEM; |
3094 | |
3095 | @@ -599,7 +599,6 @@ spi_geni_probe_free_irq: |
3096 | free_irq(mas->irq, spi); |
3097 | spi_geni_probe_runtime_disable: |
3098 | pm_runtime_disable(&pdev->dev); |
3099 | - spi_master_put(spi); |
3100 | return ret; |
3101 | } |
3102 | |
3103 | diff --git a/drivers/staging/emxx_udc/emxx_udc.c b/drivers/staging/emxx_udc/emxx_udc.c |
3104 | index a6c893ddbf280..cc4c18c3fb36d 100644 |
3105 | --- a/drivers/staging/emxx_udc/emxx_udc.c |
3106 | +++ b/drivers/staging/emxx_udc/emxx_udc.c |
3107 | @@ -2064,7 +2064,7 @@ static int _nbu2ss_nuke(struct nbu2ss_udc *udc, |
3108 | struct nbu2ss_ep *ep, |
3109 | int status) |
3110 | { |
3111 | - struct nbu2ss_req *req; |
3112 | + struct nbu2ss_req *req, *n; |
3113 | |
3114 | /* Endpoint Disable */ |
3115 | _nbu2ss_epn_exit(udc, ep); |
3116 | @@ -2076,7 +2076,7 @@ static int _nbu2ss_nuke(struct nbu2ss_udc *udc, |
3117 | return 0; |
3118 | |
3119 | /* called with irqs blocked */ |
3120 | - list_for_each_entry(req, &ep->queue, queue) { |
3121 | + list_for_each_entry_safe(req, n, &ep->queue, queue) { |
3122 | _nbu2ss_ep_done(ep, req, status); |
3123 | } |
3124 | |
3125 | diff --git a/drivers/staging/iio/cdc/ad7746.c b/drivers/staging/iio/cdc/ad7746.c |
3126 | index 21527d84f9408..004f123bb0708 100644 |
3127 | --- a/drivers/staging/iio/cdc/ad7746.c |
3128 | +++ b/drivers/staging/iio/cdc/ad7746.c |
3129 | @@ -702,7 +702,6 @@ static int ad7746_probe(struct i2c_client *client, |
3130 | indio_dev->num_channels = ARRAY_SIZE(ad7746_channels); |
3131 | else |
3132 | indio_dev->num_channels = ARRAY_SIZE(ad7746_channels) - 2; |
3133 | - indio_dev->num_channels = ARRAY_SIZE(ad7746_channels); |
3134 | indio_dev->modes = INDIO_DIRECT_MODE; |
3135 | |
3136 | if (pdata) { |
3137 | diff --git a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c |
3138 | index 75484d6c5056a..c313c4f0e8563 100644 |
3139 | --- a/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c |
3140 | +++ b/drivers/thermal/intel/int340x_thermal/int340x_thermal_zone.c |
3141 | @@ -230,6 +230,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, |
3142 | if (ACPI_FAILURE(status)) |
3143 | trip_cnt = 0; |
3144 | else { |
3145 | + int i; |
3146 | + |
3147 | int34x_thermal_zone->aux_trips = |
3148 | kcalloc(trip_cnt, |
3149 | sizeof(*int34x_thermal_zone->aux_trips), |
3150 | @@ -240,6 +242,8 @@ struct int34x_thermal_zone *int340x_thermal_zone_add(struct acpi_device *adev, |
3151 | } |
3152 | trip_mask = BIT(trip_cnt) - 1; |
3153 | int34x_thermal_zone->aux_trip_nr = trip_cnt; |
3154 | + for (i = 0; i < trip_cnt; ++i) |
3155 | + int34x_thermal_zone->aux_trips[i] = THERMAL_TEMP_INVALID; |
3156 | } |
3157 | |
3158 | trip_cnt = int340x_thermal_read_trips(int34x_thermal_zone); |
3159 | diff --git a/drivers/thermal/intel/x86_pkg_temp_thermal.c b/drivers/thermal/intel/x86_pkg_temp_thermal.c |
3160 | index ddb4a973c6986..691931fdc1195 100644 |
3161 | --- a/drivers/thermal/intel/x86_pkg_temp_thermal.c |
3162 | +++ b/drivers/thermal/intel/x86_pkg_temp_thermal.c |
3163 | @@ -164,7 +164,7 @@ static int sys_get_trip_temp(struct thermal_zone_device *tzd, |
3164 | if (thres_reg_value) |
3165 | *temp = zonedev->tj_max - thres_reg_value * 1000; |
3166 | else |
3167 | - *temp = 0; |
3168 | + *temp = THERMAL_TEMP_INVALID; |
3169 | pr_debug("sys_get_trip_temp %d\n", *temp); |
3170 | |
3171 | return 0; |
3172 | diff --git a/drivers/thunderbolt/dma_port.c b/drivers/thunderbolt/dma_port.c |
3173 | index 847dd07a7b172..de219953c8b37 100644 |
3174 | --- a/drivers/thunderbolt/dma_port.c |
3175 | +++ b/drivers/thunderbolt/dma_port.c |
3176 | @@ -364,15 +364,15 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address, |
3177 | void *buf, size_t size) |
3178 | { |
3179 | unsigned int retries = DMA_PORT_RETRIES; |
3180 | - unsigned int offset; |
3181 | - |
3182 | - offset = address & 3; |
3183 | - address = address & ~3; |
3184 | |
3185 | do { |
3186 | - u32 nbytes = min_t(u32, size, MAIL_DATA_DWORDS * 4); |
3187 | + unsigned int offset; |
3188 | + size_t nbytes; |
3189 | int ret; |
3190 | |
3191 | + offset = address & 3; |
3192 | + nbytes = min_t(size_t, size + offset, MAIL_DATA_DWORDS * 4); |
3193 | + |
3194 | ret = dma_port_flash_read_block(dma, address, dma->buf, |
3195 | ALIGN(nbytes, 4)); |
3196 | if (ret) { |
3197 | @@ -384,6 +384,7 @@ int dma_port_flash_read(struct tb_dma_port *dma, unsigned int address, |
3198 | return ret; |
3199 | } |
3200 | |
3201 | + nbytes -= offset; |
3202 | memcpy(buf, dma->buf + offset, nbytes); |
3203 | |
3204 | size -= nbytes; |
3205 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c |
3206 | index 8814ff38aa67b..51346ca91c45c 100644 |
3207 | --- a/drivers/tty/serial/8250/8250_pci.c |
3208 | +++ b/drivers/tty/serial/8250/8250_pci.c |
3209 | @@ -58,6 +58,8 @@ struct serial_private { |
3210 | int line[0]; |
3211 | }; |
3212 | |
3213 | +#define PCI_DEVICE_ID_HPE_PCI_SERIAL 0x37e |
3214 | + |
3215 | static const struct pci_device_id pci_use_msi[] = { |
3216 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9900, |
3217 | 0xA000, 0x1000) }, |
3218 | @@ -65,6 +67,8 @@ static const struct pci_device_id pci_use_msi[] = { |
3219 | 0xA000, 0x1000) }, |
3220 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9922, |
3221 | 0xA000, 0x1000) }, |
3222 | + { PCI_DEVICE_SUB(PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL, |
3223 | + PCI_ANY_ID, PCI_ANY_ID) }, |
3224 | { } |
3225 | }; |
3226 | |
3227 | @@ -1965,6 +1969,16 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = { |
3228 | .init = pci_hp_diva_init, |
3229 | .setup = pci_hp_diva_setup, |
3230 | }, |
3231 | + /* |
3232 | + * HPE PCI serial device |
3233 | + */ |
3234 | + { |
3235 | + .vendor = PCI_VENDOR_ID_HP_3PAR, |
3236 | + .device = PCI_DEVICE_ID_HPE_PCI_SERIAL, |
3237 | + .subvendor = PCI_ANY_ID, |
3238 | + .subdevice = PCI_ANY_ID, |
3239 | + .setup = pci_hp_diva_setup, |
3240 | + }, |
3241 | /* |
3242 | * Intel |
3243 | */ |
3244 | @@ -3903,21 +3917,26 @@ pciserial_init_ports(struct pci_dev *dev, const struct pciserial_board *board) |
3245 | uart.port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF | UPF_SHARE_IRQ; |
3246 | uart.port.uartclk = board->base_baud * 16; |
3247 | |
3248 | - if (pci_match_id(pci_use_msi, dev)) { |
3249 | - dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n"); |
3250 | - pci_set_master(dev); |
3251 | - rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES); |
3252 | + if (board->flags & FL_NOIRQ) { |
3253 | + uart.port.irq = 0; |
3254 | } else { |
3255 | - dev_dbg(&dev->dev, "Using legacy interrupts\n"); |
3256 | - rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY); |
3257 | - } |
3258 | - if (rc < 0) { |
3259 | - kfree(priv); |
3260 | - priv = ERR_PTR(rc); |
3261 | - goto err_deinit; |
3262 | + if (pci_match_id(pci_use_msi, dev)) { |
3263 | + dev_dbg(&dev->dev, "Using MSI(-X) interrupts\n"); |
3264 | + pci_set_master(dev); |
3265 | + rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_ALL_TYPES); |
3266 | + } else { |
3267 | + dev_dbg(&dev->dev, "Using legacy interrupts\n"); |
3268 | + rc = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_LEGACY); |
3269 | + } |
3270 | + if (rc < 0) { |
3271 | + kfree(priv); |
3272 | + priv = ERR_PTR(rc); |
3273 | + goto err_deinit; |
3274 | + } |
3275 | + |
3276 | + uart.port.irq = pci_irq_vector(dev, 0); |
3277 | } |
3278 | |
3279 | - uart.port.irq = pci_irq_vector(dev, 0); |
3280 | uart.port.dev = &dev->dev; |
3281 | |
3282 | for (i = 0; i < nr_ports; i++) { |
3283 | @@ -4932,6 +4951,10 @@ static const struct pci_device_id serial_pci_tbl[] = { |
3284 | { PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_DIVA_AUX, |
3285 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
3286 | pbn_b2_1_115200 }, |
3287 | + /* HPE PCI serial device */ |
3288 | + { PCI_VENDOR_ID_HP_3PAR, PCI_DEVICE_ID_HPE_PCI_SERIAL, |
3289 | + PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
3290 | + pbn_b1_1_115200 }, |
3291 | |
3292 | { PCI_VENDOR_ID_DCI, PCI_DEVICE_ID_DCI_PCCOM2, |
3293 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
3294 | diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c |
3295 | index 8434bd5a8ec78..5bf8dd6198bbd 100644 |
3296 | --- a/drivers/tty/serial/max310x.c |
3297 | +++ b/drivers/tty/serial/max310x.c |
3298 | @@ -1528,6 +1528,8 @@ static int __init max310x_uart_init(void) |
3299 | |
3300 | #ifdef CONFIG_SPI_MASTER |
3301 | ret = spi_register_driver(&max310x_spi_driver); |
3302 | + if (ret) |
3303 | + uart_unregister_driver(&max310x_uart); |
3304 | #endif |
3305 | |
3306 | return ret; |
3307 | diff --git a/drivers/tty/serial/rp2.c b/drivers/tty/serial/rp2.c |
3308 | index 5690c09cc0417..944a4c0105795 100644 |
3309 | --- a/drivers/tty/serial/rp2.c |
3310 | +++ b/drivers/tty/serial/rp2.c |
3311 | @@ -195,7 +195,6 @@ struct rp2_card { |
3312 | void __iomem *bar0; |
3313 | void __iomem *bar1; |
3314 | spinlock_t card_lock; |
3315 | - struct completion fw_loaded; |
3316 | }; |
3317 | |
3318 | #define RP_ID(prod) PCI_VDEVICE(RP, (prod)) |
3319 | @@ -664,17 +663,10 @@ static void rp2_remove_ports(struct rp2_card *card) |
3320 | card->initialized_ports = 0; |
3321 | } |
3322 | |
3323 | -static void rp2_fw_cb(const struct firmware *fw, void *context) |
3324 | +static int rp2_load_firmware(struct rp2_card *card, const struct firmware *fw) |
3325 | { |
3326 | - struct rp2_card *card = context; |
3327 | resource_size_t phys_base; |
3328 | - int i, rc = -ENOENT; |
3329 | - |
3330 | - if (!fw) { |
3331 | - dev_err(&card->pdev->dev, "cannot find '%s' firmware image\n", |
3332 | - RP2_FW_NAME); |
3333 | - goto no_fw; |
3334 | - } |
3335 | + int i, rc = 0; |
3336 | |
3337 | phys_base = pci_resource_start(card->pdev, 1); |
3338 | |
3339 | @@ -720,23 +712,13 @@ static void rp2_fw_cb(const struct firmware *fw, void *context) |
3340 | card->initialized_ports++; |
3341 | } |
3342 | |
3343 | - release_firmware(fw); |
3344 | -no_fw: |
3345 | - /* |
3346 | - * rp2_fw_cb() is called from a workqueue long after rp2_probe() |
3347 | - * has already returned success. So if something failed here, |
3348 | - * we'll just leave the now-dormant device in place until somebody |
3349 | - * unbinds it. |
3350 | - */ |
3351 | - if (rc) |
3352 | - dev_warn(&card->pdev->dev, "driver initialization failed\n"); |
3353 | - |
3354 | - complete(&card->fw_loaded); |
3355 | + return rc; |
3356 | } |
3357 | |
3358 | static int rp2_probe(struct pci_dev *pdev, |
3359 | const struct pci_device_id *id) |
3360 | { |
3361 | + const struct firmware *fw; |
3362 | struct rp2_card *card; |
3363 | struct rp2_uart_port *ports; |
3364 | void __iomem * const *bars; |
3365 | @@ -747,7 +729,6 @@ static int rp2_probe(struct pci_dev *pdev, |
3366 | return -ENOMEM; |
3367 | pci_set_drvdata(pdev, card); |
3368 | spin_lock_init(&card->card_lock); |
3369 | - init_completion(&card->fw_loaded); |
3370 | |
3371 | rc = pcim_enable_device(pdev); |
3372 | if (rc) |
3373 | @@ -780,21 +761,23 @@ static int rp2_probe(struct pci_dev *pdev, |
3374 | return -ENOMEM; |
3375 | card->ports = ports; |
3376 | |
3377 | - rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt, |
3378 | - IRQF_SHARED, DRV_NAME, card); |
3379 | - if (rc) |
3380 | + rc = request_firmware(&fw, RP2_FW_NAME, &pdev->dev); |
3381 | + if (rc < 0) { |
3382 | + dev_err(&pdev->dev, "cannot find '%s' firmware image\n", |
3383 | + RP2_FW_NAME); |
3384 | return rc; |
3385 | + } |
3386 | |
3387 | - /* |
3388 | - * Only catastrophic errors (e.g. ENOMEM) are reported here. |
3389 | - * If the FW image is missing, we'll find out in rp2_fw_cb() |
3390 | - * and print an error message. |
3391 | - */ |
3392 | - rc = request_firmware_nowait(THIS_MODULE, 1, RP2_FW_NAME, &pdev->dev, |
3393 | - GFP_KERNEL, card, rp2_fw_cb); |
3394 | + rc = rp2_load_firmware(card, fw); |
3395 | + |
3396 | + release_firmware(fw); |
3397 | + if (rc < 0) |
3398 | + return rc; |
3399 | + |
3400 | + rc = devm_request_irq(&pdev->dev, pdev->irq, rp2_uart_interrupt, |
3401 | + IRQF_SHARED, DRV_NAME, card); |
3402 | if (rc) |
3403 | return rc; |
3404 | - dev_dbg(&pdev->dev, "waiting for firmware blob...\n"); |
3405 | |
3406 | return 0; |
3407 | } |
3408 | @@ -803,7 +786,6 @@ static void rp2_remove(struct pci_dev *pdev) |
3409 | { |
3410 | struct rp2_card *card = pci_get_drvdata(pdev); |
3411 | |
3412 | - wait_for_completion(&card->fw_loaded); |
3413 | rp2_remove_ports(card); |
3414 | } |
3415 | |
3416 | diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c |
3417 | index 51c3f579ccd02..2007a40feef9d 100644 |
3418 | --- a/drivers/tty/serial/serial-tegra.c |
3419 | +++ b/drivers/tty/serial/serial-tegra.c |
3420 | @@ -332,7 +332,7 @@ static void tegra_uart_fifo_reset(struct tegra_uart_port *tup, u8 fcr_bits) |
3421 | |
3422 | do { |
3423 | lsr = tegra_uart_read(tup, UART_LSR); |
3424 | - if ((lsr | UART_LSR_TEMT) && !(lsr & UART_LSR_DR)) |
3425 | + if ((lsr & UART_LSR_TEMT) && !(lsr & UART_LSR_DR)) |
3426 | break; |
3427 | udelay(1); |
3428 | } while (--tmout); |
3429 | diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c |
3430 | index e2ab6524119a5..fa3bd8a97b244 100644 |
3431 | --- a/drivers/tty/serial/serial_core.c |
3432 | +++ b/drivers/tty/serial/serial_core.c |
3433 | @@ -863,9 +863,11 @@ static int uart_set_info(struct tty_struct *tty, struct tty_port *port, |
3434 | goto check_and_exit; |
3435 | } |
3436 | |
3437 | - retval = security_locked_down(LOCKDOWN_TIOCSSERIAL); |
3438 | - if (retval && (change_irq || change_port)) |
3439 | - goto exit; |
3440 | + if (change_irq || change_port) { |
3441 | + retval = security_locked_down(LOCKDOWN_TIOCSSERIAL); |
3442 | + if (retval) |
3443 | + goto exit; |
3444 | + } |
3445 | |
3446 | /* |
3447 | * Ask the low level driver to verify the settings. |
3448 | diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c |
3449 | index 7d1529b11ae9c..de86e9021a8ff 100644 |
3450 | --- a/drivers/tty/serial/sh-sci.c |
3451 | +++ b/drivers/tty/serial/sh-sci.c |
3452 | @@ -1026,10 +1026,10 @@ static int scif_set_rtrg(struct uart_port *port, int rx_trig) |
3453 | { |
3454 | unsigned int bits; |
3455 | |
3456 | + if (rx_trig >= port->fifosize) |
3457 | + rx_trig = port->fifosize - 1; |
3458 | if (rx_trig < 1) |
3459 | rx_trig = 1; |
3460 | - if (rx_trig >= port->fifosize) |
3461 | - rx_trig = port->fifosize; |
3462 | |
3463 | /* HSCIF can be set to an arbitrary level. */ |
3464 | if (sci_getreg(port, HSRTRGR)->size) { |
3465 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c |
3466 | index 35e89460b9ca8..d037deb958841 100644 |
3467 | --- a/drivers/usb/core/devio.c |
3468 | +++ b/drivers/usb/core/devio.c |
3469 | @@ -1218,7 +1218,12 @@ static int proc_bulk(struct usb_dev_state *ps, void __user *arg) |
3470 | ret = usbfs_increase_memory_usage(len1 + sizeof(struct urb)); |
3471 | if (ret) |
3472 | return ret; |
3473 | - tbuf = kmalloc(len1, GFP_KERNEL); |
3474 | + |
3475 | + /* |
3476 | + * len1 can be almost arbitrarily large. Don't WARN if it's |
3477 | + * too big, just fail the request. |
3478 | + */ |
3479 | + tbuf = kmalloc(len1, GFP_KERNEL | __GFP_NOWARN); |
3480 | if (!tbuf) { |
3481 | ret = -ENOMEM; |
3482 | goto done; |
3483 | @@ -1691,7 +1696,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb |
3484 | if (num_sgs) { |
3485 | as->urb->sg = kmalloc_array(num_sgs, |
3486 | sizeof(struct scatterlist), |
3487 | - GFP_KERNEL); |
3488 | + GFP_KERNEL | __GFP_NOWARN); |
3489 | if (!as->urb->sg) { |
3490 | ret = -ENOMEM; |
3491 | goto error; |
3492 | @@ -1726,7 +1731,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb |
3493 | (uurb_start - as->usbm->vm_start); |
3494 | } else { |
3495 | as->urb->transfer_buffer = kmalloc(uurb->buffer_length, |
3496 | - GFP_KERNEL); |
3497 | + GFP_KERNEL | __GFP_NOWARN); |
3498 | if (!as->urb->transfer_buffer) { |
3499 | ret = -ENOMEM; |
3500 | goto error; |
3501 | diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h |
3502 | index a97dd1ba964ee..a8f23f8bc6efd 100644 |
3503 | --- a/drivers/usb/core/hub.h |
3504 | +++ b/drivers/usb/core/hub.h |
3505 | @@ -148,8 +148,10 @@ static inline unsigned hub_power_on_good_delay(struct usb_hub *hub) |
3506 | { |
3507 | unsigned delay = hub->descriptor->bPwrOn2PwrGood * 2; |
3508 | |
3509 | - /* Wait at least 100 msec for power to become stable */ |
3510 | - return max(delay, 100U); |
3511 | + if (!hub->hdev->parent) /* root hub */ |
3512 | + return delay; |
3513 | + else /* Wait at least 100 msec for power to become stable */ |
3514 | + return max(delay, 100U); |
3515 | } |
3516 | |
3517 | static inline int hub_port_debounce_be_connected(struct usb_hub *hub, |
3518 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
3519 | index 6145311a3855f..ecd83526f26fe 100644 |
3520 | --- a/drivers/usb/dwc3/gadget.c |
3521 | +++ b/drivers/usb/dwc3/gadget.c |
3522 | @@ -1162,6 +1162,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, |
3523 | req->start_sg = sg_next(s); |
3524 | |
3525 | req->num_queued_sgs++; |
3526 | + req->num_pending_sgs--; |
3527 | |
3528 | /* |
3529 | * The number of pending SG entries may not correspond to the |
3530 | @@ -1169,7 +1170,7 @@ static void dwc3_prepare_one_trb_sg(struct dwc3_ep *dep, |
3531 | * don't include unused SG entries. |
3532 | */ |
3533 | if (length == 0) { |
3534 | - req->num_pending_sgs -= req->request.num_mapped_sgs - req->num_queued_sgs; |
3535 | + req->num_pending_sgs = 0; |
3536 | break; |
3537 | } |
3538 | |
3539 | @@ -2602,15 +2603,15 @@ static int dwc3_gadget_ep_reclaim_trb_sg(struct dwc3_ep *dep, |
3540 | struct dwc3_trb *trb = &dep->trb_pool[dep->trb_dequeue]; |
3541 | struct scatterlist *sg = req->sg; |
3542 | struct scatterlist *s; |
3543 | - unsigned int pending = req->num_pending_sgs; |
3544 | + unsigned int num_queued = req->num_queued_sgs; |
3545 | unsigned int i; |
3546 | int ret = 0; |
3547 | |
3548 | - for_each_sg(sg, s, pending, i) { |
3549 | + for_each_sg(sg, s, num_queued, i) { |
3550 | trb = &dep->trb_pool[dep->trb_dequeue]; |
3551 | |
3552 | req->sg = sg_next(s); |
3553 | - req->num_pending_sgs--; |
3554 | + req->num_queued_sgs--; |
3555 | |
3556 | ret = dwc3_gadget_ep_reclaim_completed_trb(dep, req, |
3557 | trb, event, status, true); |
3558 | @@ -2633,7 +2634,7 @@ static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep, |
3559 | |
3560 | static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req) |
3561 | { |
3562 | - return req->num_pending_sgs == 0; |
3563 | + return req->num_pending_sgs == 0 && req->num_queued_sgs == 0; |
3564 | } |
3565 | |
3566 | static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, |
3567 | @@ -2642,7 +2643,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, |
3568 | { |
3569 | int ret; |
3570 | |
3571 | - if (req->num_pending_sgs) |
3572 | + if (req->request.num_mapped_sgs) |
3573 | ret = dwc3_gadget_ep_reclaim_trb_sg(dep, req, event, |
3574 | status); |
3575 | else |
3576 | diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c |
3577 | index 33703140233aa..08a93cf68efff 100644 |
3578 | --- a/drivers/usb/gadget/udc/renesas_usb3.c |
3579 | +++ b/drivers/usb/gadget/udc/renesas_usb3.c |
3580 | @@ -1473,7 +1473,7 @@ static void usb3_start_pipen(struct renesas_usb3_ep *usb3_ep, |
3581 | struct renesas_usb3_request *usb3_req) |
3582 | { |
3583 | struct renesas_usb3 *usb3 = usb3_ep_to_usb3(usb3_ep); |
3584 | - struct renesas_usb3_request *usb3_req_first = usb3_get_request(usb3_ep); |
3585 | + struct renesas_usb3_request *usb3_req_first; |
3586 | unsigned long flags; |
3587 | int ret = -EAGAIN; |
3588 | u32 enable_bits = 0; |
3589 | @@ -1481,7 +1481,8 @@ static void usb3_start_pipen(struct renesas_usb3_ep *usb3_ep, |
3590 | spin_lock_irqsave(&usb3->lock, flags); |
3591 | if (usb3_ep->halt || usb3_ep->started) |
3592 | goto out; |
3593 | - if (usb3_req != usb3_req_first) |
3594 | + usb3_req_first = __usb3_get_request(usb3_ep); |
3595 | + if (!usb3_req_first || usb3_req != usb3_req_first) |
3596 | goto out; |
3597 | |
3598 | if (usb3_pn_change(usb3, usb3_ep->num) < 0) |
3599 | diff --git a/drivers/usb/misc/trancevibrator.c b/drivers/usb/misc/trancevibrator.c |
3600 | index a3dfc77578ea1..26baba3ab7d73 100644 |
3601 | --- a/drivers/usb/misc/trancevibrator.c |
3602 | +++ b/drivers/usb/misc/trancevibrator.c |
3603 | @@ -61,9 +61,9 @@ static ssize_t speed_store(struct device *dev, struct device_attribute *attr, |
3604 | /* Set speed */ |
3605 | retval = usb_control_msg(tv->udev, usb_sndctrlpipe(tv->udev, 0), |
3606 | 0x01, /* vendor request: set speed */ |
3607 | - USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_OTHER, |
3608 | + USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_OTHER, |
3609 | tv->speed, /* speed value */ |
3610 | - 0, NULL, 0, USB_CTRL_GET_TIMEOUT); |
3611 | + 0, NULL, 0, USB_CTRL_SET_TIMEOUT); |
3612 | if (retval) { |
3613 | tv->speed = old; |
3614 | dev_dbg(&tv->udev->dev, "retval = %d\n", retval); |
3615 | diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c |
3616 | index b5d6616442635..748139d262633 100644 |
3617 | --- a/drivers/usb/misc/uss720.c |
3618 | +++ b/drivers/usb/misc/uss720.c |
3619 | @@ -736,6 +736,7 @@ static int uss720_probe(struct usb_interface *intf, |
3620 | parport_announce_port(pp); |
3621 | |
3622 | usb_set_intfdata(intf, pp); |
3623 | + usb_put_dev(usbdev); |
3624 | return 0; |
3625 | |
3626 | probe_abort: |
3627 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
3628 | index c00e4177651a8..7c0181ae44e9c 100644 |
3629 | --- a/drivers/usb/serial/ftdi_sio.c |
3630 | +++ b/drivers/usb/serial/ftdi_sio.c |
3631 | @@ -1034,6 +1034,9 @@ static const struct usb_device_id id_table_combined[] = { |
3632 | /* Sienna devices */ |
3633 | { USB_DEVICE(FTDI_VID, FTDI_SIENNA_PID) }, |
3634 | { USB_DEVICE(ECHELON_VID, ECHELON_U20_PID) }, |
3635 | + /* IDS GmbH devices */ |
3636 | + { USB_DEVICE(IDS_VID, IDS_SI31A_PID) }, |
3637 | + { USB_DEVICE(IDS_VID, IDS_CM31A_PID) }, |
3638 | /* U-Blox devices */ |
3639 | { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) }, |
3640 | { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) }, |
3641 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
3642 | index 3d47c6d72256e..d854e04a4286e 100644 |
3643 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
3644 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
3645 | @@ -1567,6 +1567,13 @@ |
3646 | #define UNJO_VID 0x22B7 |
3647 | #define UNJO_ISODEBUG_V1_PID 0x150D |
3648 | |
3649 | +/* |
3650 | + * IDS GmbH |
3651 | + */ |
3652 | +#define IDS_VID 0x2CAF |
3653 | +#define IDS_SI31A_PID 0x13A2 |
3654 | +#define IDS_CM31A_PID 0x13A3 |
3655 | + |
3656 | /* |
3657 | * U-Blox products (http://www.u-blox.com). |
3658 | */ |
3659 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
3660 | index 5c167bc089a08..25d8fb3a7395f 100644 |
3661 | --- a/drivers/usb/serial/option.c |
3662 | +++ b/drivers/usb/serial/option.c |
3663 | @@ -1240,6 +1240,10 @@ static const struct usb_device_id option_ids[] = { |
3664 | .driver_info = NCTRL(0) | RSVD(1) }, |
3665 | { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1901, 0xff), /* Telit LN940 (MBIM) */ |
3666 | .driver_info = NCTRL(0) }, |
3667 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7010, 0xff), /* Telit LE910-S1 (RNDIS) */ |
3668 | + .driver_info = NCTRL(2) }, |
3669 | + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x7011, 0xff), /* Telit LE910-S1 (ECM) */ |
3670 | + .driver_info = NCTRL(2) }, |
3671 | { USB_DEVICE(TELIT_VENDOR_ID, 0x9010), /* Telit SBL FN980 flashing device */ |
3672 | .driver_info = NCTRL(0) | ZLP }, |
3673 | { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622, 0xff, 0xff, 0xff) }, /* ZTE WCDMA products */ |
3674 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
3675 | index e290b250f45cc..9600cee957697 100644 |
3676 | --- a/drivers/usb/serial/pl2303.c |
3677 | +++ b/drivers/usb/serial/pl2303.c |
3678 | @@ -107,6 +107,7 @@ static const struct usb_device_id id_table[] = { |
3679 | { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, |
3680 | { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) }, |
3681 | { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) }, |
3682 | + { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530GC_PRODUCT_ID) }, |
3683 | { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) }, |
3684 | { USB_DEVICE(AT_VENDOR_ID, AT_VTKIT3_PRODUCT_ID) }, |
3685 | { } /* Terminating entry */ |
3686 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
3687 | index a897680473a78..3e5442573fe4e 100644 |
3688 | --- a/drivers/usb/serial/pl2303.h |
3689 | +++ b/drivers/usb/serial/pl2303.h |
3690 | @@ -152,6 +152,7 @@ |
3691 | /* ADLINK ND-6530 RS232,RS485 and RS422 adapter */ |
3692 | #define ADLINK_VENDOR_ID 0x0b63 |
3693 | #define ADLINK_ND6530_PRODUCT_ID 0x6530 |
3694 | +#define ADLINK_ND6530GC_PRODUCT_ID 0x653a |
3695 | |
3696 | /* SMART USB Serial Adapter */ |
3697 | #define SMART_VENDOR_ID 0x0b8c |
3698 | diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c |
3699 | index b1449d4914cca..acc115d20f812 100644 |
3700 | --- a/drivers/usb/serial/ti_usb_3410_5052.c |
3701 | +++ b/drivers/usb/serial/ti_usb_3410_5052.c |
3702 | @@ -37,6 +37,7 @@ |
3703 | /* Vendor and product ids */ |
3704 | #define TI_VENDOR_ID 0x0451 |
3705 | #define IBM_VENDOR_ID 0x04b3 |
3706 | +#define STARTECH_VENDOR_ID 0x14b0 |
3707 | #define TI_3410_PRODUCT_ID 0x3410 |
3708 | #define IBM_4543_PRODUCT_ID 0x4543 |
3709 | #define IBM_454B_PRODUCT_ID 0x454b |
3710 | @@ -372,6 +373,7 @@ static const struct usb_device_id ti_id_table_3410[] = { |
3711 | { USB_DEVICE(MXU1_VENDOR_ID, MXU1_1131_PRODUCT_ID) }, |
3712 | { USB_DEVICE(MXU1_VENDOR_ID, MXU1_1150_PRODUCT_ID) }, |
3713 | { USB_DEVICE(MXU1_VENDOR_ID, MXU1_1151_PRODUCT_ID) }, |
3714 | + { USB_DEVICE(STARTECH_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
3715 | { } /* terminator */ |
3716 | }; |
3717 | |
3718 | @@ -410,6 +412,7 @@ static const struct usb_device_id ti_id_table_combined[] = { |
3719 | { USB_DEVICE(MXU1_VENDOR_ID, MXU1_1131_PRODUCT_ID) }, |
3720 | { USB_DEVICE(MXU1_VENDOR_ID, MXU1_1150_PRODUCT_ID) }, |
3721 | { USB_DEVICE(MXU1_VENDOR_ID, MXU1_1151_PRODUCT_ID) }, |
3722 | + { USB_DEVICE(STARTECH_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
3723 | { } /* terminator */ |
3724 | }; |
3725 | |
3726 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c |
3727 | index 95205bde240f7..eca3abc1a7cd9 100644 |
3728 | --- a/fs/btrfs/extent_io.c |
3729 | +++ b/fs/btrfs/extent_io.c |
3730 | @@ -4648,7 +4648,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
3731 | __u64 start, __u64 len) |
3732 | { |
3733 | int ret = 0; |
3734 | - u64 off = start; |
3735 | + u64 off; |
3736 | u64 max = start + len; |
3737 | u32 flags = 0; |
3738 | u32 found_type; |
3739 | @@ -4684,6 +4684,11 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, |
3740 | goto out_free_ulist; |
3741 | } |
3742 | |
3743 | + /* |
3744 | + * We can't initialize that to 'start' as this could miss extents due |
3745 | + * to extent item merging |
3746 | + */ |
3747 | + off = 0; |
3748 | start = round_down(start, btrfs_inode_sectorsize(inode)); |
3749 | len = round_up(max, btrfs_inode_sectorsize(inode)) - start; |
3750 | |
3751 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
3752 | index de53e51669976..54647eb9c6ed2 100644 |
3753 | --- a/fs/btrfs/tree-log.c |
3754 | +++ b/fs/btrfs/tree-log.c |
3755 | @@ -1846,8 +1846,6 @@ static noinline int link_to_fixup_dir(struct btrfs_trans_handle *trans, |
3756 | ret = btrfs_update_inode(trans, root, inode); |
3757 | } else if (ret == -EEXIST) { |
3758 | ret = 0; |
3759 | - } else { |
3760 | - BUG(); /* Logic Error */ |
3761 | } |
3762 | iput(inode); |
3763 | |
3764 | diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c |
3765 | index 81d9c4ea0e8f3..e068f82ffeddf 100644 |
3766 | --- a/fs/cifs/smb2pdu.c |
3767 | +++ b/fs/cifs/smb2pdu.c |
3768 | @@ -979,6 +979,13 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses) |
3769 | /* Internal types */ |
3770 | server->capabilities |= SMB2_NT_FIND | SMB2_LARGE_FILES; |
3771 | |
3772 | + /* |
3773 | + * SMB3.0 supports only 1 cipher and doesn't have a encryption neg context |
3774 | + * Set the cipher type manually. |
3775 | + */ |
3776 | + if (server->dialect == SMB30_PROT_ID && (server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)) |
3777 | + server->cipher_type = SMB2_ENCRYPTION_AES128_CCM; |
3778 | + |
3779 | security_blob = smb2_get_data_area_len(&blob_offset, &blob_length, |
3780 | (struct smb2_sync_hdr *)rsp); |
3781 | /* |
3782 | @@ -3604,10 +3611,10 @@ smb2_new_read_req(void **buf, unsigned int *total_len, |
3783 | * Related requests use info from previous read request |
3784 | * in chain. |
3785 | */ |
3786 | - shdr->SessionId = 0xFFFFFFFF; |
3787 | + shdr->SessionId = 0xFFFFFFFFFFFFFFFF; |
3788 | shdr->TreeId = 0xFFFFFFFF; |
3789 | - req->PersistentFileId = 0xFFFFFFFF; |
3790 | - req->VolatileFileId = 0xFFFFFFFF; |
3791 | + req->PersistentFileId = 0xFFFFFFFFFFFFFFFF; |
3792 | + req->VolatileFileId = 0xFFFFFFFFFFFFFFFF; |
3793 | } |
3794 | } |
3795 | if (remaining_bytes > io_parms->length) |
3796 | diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c |
3797 | index c9b605f6c9cb2..98b74cdabb99a 100644 |
3798 | --- a/fs/nfs/filelayout/filelayout.c |
3799 | +++ b/fs/nfs/filelayout/filelayout.c |
3800 | @@ -717,7 +717,7 @@ filelayout_decode_layout(struct pnfs_layout_hdr *flo, |
3801 | if (unlikely(!p)) |
3802 | goto out_err; |
3803 | fl->fh_array[i]->size = be32_to_cpup(p++); |
3804 | - if (sizeof(struct nfs_fh) < fl->fh_array[i]->size) { |
3805 | + if (fl->fh_array[i]->size > NFS_MAXFHSIZE) { |
3806 | printk(KERN_ERR "NFS: Too big fh %d received %d\n", |
3807 | i, fl->fh_array[i]->size); |
3808 | goto out_err; |
3809 | diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c |
3810 | index 6b31cb5f9c9db..7c73097b2f4e5 100644 |
3811 | --- a/fs/nfs/nfs4file.c |
3812 | +++ b/fs/nfs/nfs4file.c |
3813 | @@ -168,7 +168,7 @@ static loff_t nfs4_file_llseek(struct file *filep, loff_t offset, int whence) |
3814 | case SEEK_HOLE: |
3815 | case SEEK_DATA: |
3816 | ret = nfs42_proc_llseek(filep, offset, whence); |
3817 | - if (ret != -ENOTSUPP) |
3818 | + if (ret != -EOPNOTSUPP) |
3819 | return ret; |
3820 | /* Fall through */ |
3821 | default: |
3822 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
3823 | index 304ab4cdaa8c1..ff54ba3c82477 100644 |
3824 | --- a/fs/nfs/nfs4proc.c |
3825 | +++ b/fs/nfs/nfs4proc.c |
3826 | @@ -1647,7 +1647,7 @@ static void nfs_set_open_stateid_locked(struct nfs4_state *state, |
3827 | rcu_read_unlock(); |
3828 | trace_nfs4_open_stateid_update_wait(state->inode, stateid, 0); |
3829 | |
3830 | - if (!signal_pending(current)) { |
3831 | + if (!fatal_signal_pending(current)) { |
3832 | if (schedule_timeout(5*HZ) == 0) |
3833 | status = -EAGAIN; |
3834 | else |
3835 | @@ -3416,7 +3416,7 @@ static bool nfs4_refresh_open_old_stateid(nfs4_stateid *dst, |
3836 | write_sequnlock(&state->seqlock); |
3837 | trace_nfs4_close_stateid_update_wait(state->inode, dst, 0); |
3838 | |
3839 | - if (signal_pending(current)) |
3840 | + if (fatal_signal_pending(current)) |
3841 | status = -EINTR; |
3842 | else |
3843 | if (schedule_timeout(5*HZ) != 0) |
3844 | diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c |
3845 | index f4407dd426bf0..e3b85bfcfc7dc 100644 |
3846 | --- a/fs/nfs/pagelist.c |
3847 | +++ b/fs/nfs/pagelist.c |
3848 | @@ -986,15 +986,16 @@ static int nfs_pageio_do_add_request(struct nfs_pageio_descriptor *desc, |
3849 | |
3850 | struct nfs_page *prev = NULL; |
3851 | |
3852 | - if (mirror->pg_count != 0) { |
3853 | - prev = nfs_list_entry(mirror->pg_list.prev); |
3854 | - } else { |
3855 | + if (list_empty(&mirror->pg_list)) { |
3856 | if (desc->pg_ops->pg_init) |
3857 | desc->pg_ops->pg_init(desc, req); |
3858 | if (desc->pg_error < 0) |
3859 | return 0; |
3860 | mirror->pg_base = req->wb_pgbase; |
3861 | - } |
3862 | + mirror->pg_count = 0; |
3863 | + mirror->pg_recoalesce = 0; |
3864 | + } else |
3865 | + prev = nfs_list_entry(mirror->pg_list.prev); |
3866 | |
3867 | if (desc->pg_maxretrans && req->wb_nio > desc->pg_maxretrans) { |
3868 | if (NFS_SERVER(desc->pg_inode)->flags & NFS_MOUNT_SOFTERR) |
3869 | @@ -1018,17 +1019,16 @@ static void nfs_pageio_doio(struct nfs_pageio_descriptor *desc) |
3870 | { |
3871 | struct nfs_pgio_mirror *mirror = nfs_pgio_current_mirror(desc); |
3872 | |
3873 | - |
3874 | if (!list_empty(&mirror->pg_list)) { |
3875 | int error = desc->pg_ops->pg_doio(desc); |
3876 | if (error < 0) |
3877 | desc->pg_error = error; |
3878 | - else |
3879 | + if (list_empty(&mirror->pg_list)) { |
3880 | mirror->pg_bytes_written += mirror->pg_count; |
3881 | - } |
3882 | - if (list_empty(&mirror->pg_list)) { |
3883 | - mirror->pg_count = 0; |
3884 | - mirror->pg_base = 0; |
3885 | + mirror->pg_count = 0; |
3886 | + mirror->pg_base = 0; |
3887 | + mirror->pg_recoalesce = 0; |
3888 | + } |
3889 | } |
3890 | } |
3891 | |
3892 | @@ -1122,7 +1122,6 @@ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc) |
3893 | |
3894 | do { |
3895 | list_splice_init(&mirror->pg_list, &head); |
3896 | - mirror->pg_bytes_written -= mirror->pg_count; |
3897 | mirror->pg_count = 0; |
3898 | mirror->pg_base = 0; |
3899 | mirror->pg_recoalesce = 0; |
3900 | diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c |
3901 | index 7e8c18218e68f..1b512df1003f9 100644 |
3902 | --- a/fs/nfs/pnfs.c |
3903 | +++ b/fs/nfs/pnfs.c |
3904 | @@ -1285,6 +1285,11 @@ _pnfs_return_layout(struct inode *ino) |
3905 | { |
3906 | struct pnfs_layout_hdr *lo = NULL; |
3907 | struct nfs_inode *nfsi = NFS_I(ino); |
3908 | + struct pnfs_layout_range range = { |
3909 | + .iomode = IOMODE_ANY, |
3910 | + .offset = 0, |
3911 | + .length = NFS4_MAX_UINT64, |
3912 | + }; |
3913 | LIST_HEAD(tmp_list); |
3914 | nfs4_stateid stateid; |
3915 | int status = 0; |
3916 | @@ -1311,16 +1316,10 @@ _pnfs_return_layout(struct inode *ino) |
3917 | } |
3918 | valid_layout = pnfs_layout_is_valid(lo); |
3919 | pnfs_clear_layoutcommit(ino, &tmp_list); |
3920 | - pnfs_mark_matching_lsegs_return(lo, &tmp_list, NULL, 0); |
3921 | + pnfs_mark_matching_lsegs_return(lo, &tmp_list, &range, 0); |
3922 | |
3923 | - if (NFS_SERVER(ino)->pnfs_curr_ld->return_range) { |
3924 | - struct pnfs_layout_range range = { |
3925 | - .iomode = IOMODE_ANY, |
3926 | - .offset = 0, |
3927 | - .length = NFS4_MAX_UINT64, |
3928 | - }; |
3929 | + if (NFS_SERVER(ino)->pnfs_curr_ld->return_range) |
3930 | NFS_SERVER(ino)->pnfs_curr_ld->return_range(lo, &range); |
3931 | - } |
3932 | |
3933 | /* Don't send a LAYOUTRETURN if list was initially empty */ |
3934 | if (!test_bit(NFS_LAYOUT_RETURN_REQUESTED, &lo->plh_flags) || |
3935 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
3936 | index 653c2d8aa1cd7..35114624fb036 100644 |
3937 | --- a/fs/proc/base.c |
3938 | +++ b/fs/proc/base.c |
3939 | @@ -2556,6 +2556,10 @@ static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf, |
3940 | void *page; |
3941 | int rv; |
3942 | |
3943 | + /* A task may only write when it was the opener. */ |
3944 | + if (file->f_cred != current_real_cred()) |
3945 | + return -EPERM; |
3946 | + |
3947 | rcu_read_lock(); |
3948 | task = pid_task(proc_pid(inode), PIDTYPE_PID); |
3949 | if (!task) { |
3950 | diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h |
3951 | index 68782ba8b6e8d..69b9ccbe1ad0f 100644 |
3952 | --- a/include/net/cfg80211.h |
3953 | +++ b/include/net/cfg80211.h |
3954 | @@ -5194,7 +5194,7 @@ unsigned int ieee80211_get_mesh_hdrlen(struct ieee80211s_hdr *meshhdr); |
3955 | */ |
3956 | int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, |
3957 | const u8 *addr, enum nl80211_iftype iftype, |
3958 | - u8 data_offset); |
3959 | + u8 data_offset, bool is_amsdu); |
3960 | |
3961 | /** |
3962 | * ieee80211_data_to_8023 - convert an 802.11 data frame to 802.3 |
3963 | @@ -5206,7 +5206,7 @@ int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, |
3964 | static inline int ieee80211_data_to_8023(struct sk_buff *skb, const u8 *addr, |
3965 | enum nl80211_iftype iftype) |
3966 | { |
3967 | - return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0); |
3968 | + return ieee80211_data_to_8023_exthdr(skb, NULL, addr, iftype, 0, false); |
3969 | } |
3970 | |
3971 | /** |
3972 | diff --git a/include/net/pkt_sched.h b/include/net/pkt_sched.h |
3973 | index cee1c084e9f40..b16f9236de147 100644 |
3974 | --- a/include/net/pkt_sched.h |
3975 | +++ b/include/net/pkt_sched.h |
3976 | @@ -118,12 +118,7 @@ void __qdisc_run(struct Qdisc *q); |
3977 | static inline void qdisc_run(struct Qdisc *q) |
3978 | { |
3979 | if (qdisc_run_begin(q)) { |
3980 | - /* NOLOCK qdisc must check 'state' under the qdisc seqlock |
3981 | - * to avoid racing with dev_qdisc_reset() |
3982 | - */ |
3983 | - if (!(q->flags & TCQ_F_NOLOCK) || |
3984 | - likely(!test_bit(__QDISC_STATE_DEACTIVATED, &q->state))) |
3985 | - __qdisc_run(q); |
3986 | + __qdisc_run(q); |
3987 | qdisc_run_end(q); |
3988 | } |
3989 | } |
3990 | diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h |
3991 | index b2ceec7b280d4..0852f3e51360a 100644 |
3992 | --- a/include/net/sch_generic.h |
3993 | +++ b/include/net/sch_generic.h |
3994 | @@ -36,6 +36,7 @@ struct qdisc_rate_table { |
3995 | enum qdisc_state_t { |
3996 | __QDISC_STATE_SCHED, |
3997 | __QDISC_STATE_DEACTIVATED, |
3998 | + __QDISC_STATE_MISSED, |
3999 | }; |
4000 | |
4001 | struct qdisc_size_table { |
4002 | @@ -156,8 +157,33 @@ static inline bool qdisc_is_empty(const struct Qdisc *qdisc) |
4003 | static inline bool qdisc_run_begin(struct Qdisc *qdisc) |
4004 | { |
4005 | if (qdisc->flags & TCQ_F_NOLOCK) { |
4006 | + if (spin_trylock(&qdisc->seqlock)) |
4007 | + goto nolock_empty; |
4008 | + |
4009 | + /* If the MISSED flag is set, it means other thread has |
4010 | + * set the MISSED flag before second spin_trylock(), so |
4011 | + * we can return false here to avoid multi cpus doing |
4012 | + * the set_bit() and second spin_trylock() concurrently. |
4013 | + */ |
4014 | + if (test_bit(__QDISC_STATE_MISSED, &qdisc->state)) |
4015 | + return false; |
4016 | + |
4017 | + /* Set the MISSED flag before the second spin_trylock(), |
4018 | + * if the second spin_trylock() return false, it means |
4019 | + * other cpu holding the lock will do dequeuing for us |
4020 | + * or it will see the MISSED flag set after releasing |
4021 | + * lock and reschedule the net_tx_action() to do the |
4022 | + * dequeuing. |
4023 | + */ |
4024 | + set_bit(__QDISC_STATE_MISSED, &qdisc->state); |
4025 | + |
4026 | + /* Retry again in case other CPU may not see the new flag |
4027 | + * after it releases the lock at the end of qdisc_run_end(). |
4028 | + */ |
4029 | if (!spin_trylock(&qdisc->seqlock)) |
4030 | return false; |
4031 | + |
4032 | +nolock_empty: |
4033 | WRITE_ONCE(qdisc->empty, false); |
4034 | } else if (qdisc_is_running(qdisc)) { |
4035 | return false; |
4036 | @@ -173,8 +199,15 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc) |
4037 | static inline void qdisc_run_end(struct Qdisc *qdisc) |
4038 | { |
4039 | write_seqcount_end(&qdisc->running); |
4040 | - if (qdisc->flags & TCQ_F_NOLOCK) |
4041 | + if (qdisc->flags & TCQ_F_NOLOCK) { |
4042 | spin_unlock(&qdisc->seqlock); |
4043 | + |
4044 | + if (unlikely(test_bit(__QDISC_STATE_MISSED, |
4045 | + &qdisc->state))) { |
4046 | + clear_bit(__QDISC_STATE_MISSED, &qdisc->state); |
4047 | + __netif_schedule(qdisc); |
4048 | + } |
4049 | + } |
4050 | } |
4051 | |
4052 | static inline bool qdisc_may_bulk(const struct Qdisc *qdisc) |
4053 | diff --git a/include/net/sock.h b/include/net/sock.h |
4054 | index 4137fa1787903..a0728f24ecc53 100644 |
4055 | --- a/include/net/sock.h |
4056 | +++ b/include/net/sock.h |
4057 | @@ -2150,13 +2150,15 @@ static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk) |
4058 | sk_mem_charge(sk, skb->truesize); |
4059 | } |
4060 | |
4061 | -static inline void skb_set_owner_sk_safe(struct sk_buff *skb, struct sock *sk) |
4062 | +static inline __must_check bool skb_set_owner_sk_safe(struct sk_buff *skb, struct sock *sk) |
4063 | { |
4064 | if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) { |
4065 | skb_orphan(skb); |
4066 | skb->destructor = sock_efree; |
4067 | skb->sk = sk; |
4068 | + return true; |
4069 | } |
4070 | + return false; |
4071 | } |
4072 | |
4073 | void sk_reset_timer(struct sock *sk, struct timer_list *timer, |
4074 | diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c |
4075 | index 07cfa3249f83a..0a2d78e811cf5 100644 |
4076 | --- a/net/bluetooth/cmtp/core.c |
4077 | +++ b/net/bluetooth/cmtp/core.c |
4078 | @@ -392,6 +392,11 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) |
4079 | if (!(session->flags & BIT(CMTP_LOOPBACK))) { |
4080 | err = cmtp_attach_device(session); |
4081 | if (err < 0) { |
4082 | + /* Caller will call fput in case of failure, and so |
4083 | + * will cmtp_session kthread. |
4084 | + */ |
4085 | + get_file(session->sock->file); |
4086 | + |
4087 | atomic_inc(&session->terminate); |
4088 | wake_up_interruptible(sk_sleep(session->sock->sk)); |
4089 | up_write(&cmtp_session_sem); |
4090 | diff --git a/net/core/dev.c b/net/core/dev.c |
4091 | index a30878346f54b..e226f266da9e0 100644 |
4092 | --- a/net/core/dev.c |
4093 | +++ b/net/core/dev.c |
4094 | @@ -3384,7 +3384,8 @@ static inline int __dev_xmit_skb(struct sk_buff *skb, struct Qdisc *q, |
4095 | |
4096 | if (q->flags & TCQ_F_NOLOCK) { |
4097 | rc = q->enqueue(skb, q, &to_free) & NET_XMIT_MASK; |
4098 | - qdisc_run(q); |
4099 | + if (likely(!netif_xmit_frozen_or_stopped(txq))) |
4100 | + qdisc_run(q); |
4101 | |
4102 | if (unlikely(to_free)) |
4103 | kfree_skb_list(to_free); |
4104 | @@ -4515,25 +4516,43 @@ static __latent_entropy void net_tx_action(struct softirq_action *h) |
4105 | sd->output_queue_tailp = &sd->output_queue; |
4106 | local_irq_enable(); |
4107 | |
4108 | + rcu_read_lock(); |
4109 | + |
4110 | while (head) { |
4111 | struct Qdisc *q = head; |
4112 | spinlock_t *root_lock = NULL; |
4113 | |
4114 | head = head->next_sched; |
4115 | |
4116 | - if (!(q->flags & TCQ_F_NOLOCK)) { |
4117 | - root_lock = qdisc_lock(q); |
4118 | - spin_lock(root_lock); |
4119 | - } |
4120 | /* We need to make sure head->next_sched is read |
4121 | * before clearing __QDISC_STATE_SCHED |
4122 | */ |
4123 | smp_mb__before_atomic(); |
4124 | + |
4125 | + if (!(q->flags & TCQ_F_NOLOCK)) { |
4126 | + root_lock = qdisc_lock(q); |
4127 | + spin_lock(root_lock); |
4128 | + } else if (unlikely(test_bit(__QDISC_STATE_DEACTIVATED, |
4129 | + &q->state))) { |
4130 | + /* There is a synchronize_net() between |
4131 | + * STATE_DEACTIVATED flag being set and |
4132 | + * qdisc_reset()/some_qdisc_is_busy() in |
4133 | + * dev_deactivate(), so we can safely bail out |
4134 | + * early here to avoid data race between |
4135 | + * qdisc_deactivate() and some_qdisc_is_busy() |
4136 | + * for lockless qdisc. |
4137 | + */ |
4138 | + clear_bit(__QDISC_STATE_SCHED, &q->state); |
4139 | + continue; |
4140 | + } |
4141 | + |
4142 | clear_bit(__QDISC_STATE_SCHED, &q->state); |
4143 | qdisc_run(q); |
4144 | if (root_lock) |
4145 | spin_unlock(root_lock); |
4146 | } |
4147 | + |
4148 | + rcu_read_unlock(); |
4149 | } |
4150 | |
4151 | xfrm_dev_backlog(sd); |
4152 | diff --git a/net/core/filter.c b/net/core/filter.c |
4153 | index 7fbb274b7fe32..108bcf6000529 100644 |
4154 | --- a/net/core/filter.c |
4155 | +++ b/net/core/filter.c |
4156 | @@ -3331,6 +3331,7 @@ static inline int __bpf_skb_change_head(struct sk_buff *skb, u32 head_room, |
4157 | __skb_push(skb, head_room); |
4158 | memset(skb->data, 0, head_room); |
4159 | skb_reset_mac_header(skb); |
4160 | + skb_reset_mac_len(skb); |
4161 | } |
4162 | |
4163 | return ret; |
4164 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c |
4165 | index 6635b83113f8f..472a615775f32 100644 |
4166 | --- a/net/core/neighbour.c |
4167 | +++ b/net/core/neighbour.c |
4168 | @@ -132,6 +132,9 @@ static void neigh_update_gc_list(struct neighbour *n) |
4169 | write_lock_bh(&n->tbl->lock); |
4170 | write_lock(&n->lock); |
4171 | |
4172 | + if (n->dead) |
4173 | + goto out; |
4174 | + |
4175 | /* remove from the gc list if new state is permanent or if neighbor |
4176 | * is externally learned; otherwise entry should be on the gc list |
4177 | */ |
4178 | @@ -148,6 +151,7 @@ static void neigh_update_gc_list(struct neighbour *n) |
4179 | atomic_inc(&n->tbl->gc_entries); |
4180 | } |
4181 | |
4182 | +out: |
4183 | write_unlock(&n->lock); |
4184 | write_unlock_bh(&n->tbl->lock); |
4185 | } |
4186 | diff --git a/net/core/sock.c b/net/core/sock.c |
4187 | index 19c178aac0ae8..68f84fac63e0b 100644 |
4188 | --- a/net/core/sock.c |
4189 | +++ b/net/core/sock.c |
4190 | @@ -2026,10 +2026,10 @@ void skb_orphan_partial(struct sk_buff *skb) |
4191 | if (skb_is_tcp_pure_ack(skb)) |
4192 | return; |
4193 | |
4194 | - if (can_skb_orphan_partial(skb)) |
4195 | - skb_set_owner_sk_safe(skb, skb->sk); |
4196 | - else |
4197 | - skb_orphan(skb); |
4198 | + if (can_skb_orphan_partial(skb) && skb_set_owner_sk_safe(skb, skb->sk)) |
4199 | + return; |
4200 | + |
4201 | + skb_orphan(skb); |
4202 | } |
4203 | EXPORT_SYMBOL(skb_orphan_partial); |
4204 | |
4205 | diff --git a/net/dsa/master.c b/net/dsa/master.c |
4206 | index be0b4ed3b7d89..40eddec48f26e 100644 |
4207 | --- a/net/dsa/master.c |
4208 | +++ b/net/dsa/master.c |
4209 | @@ -147,8 +147,7 @@ static void dsa_master_get_strings(struct net_device *dev, uint32_t stringset, |
4210 | struct dsa_switch *ds = cpu_dp->ds; |
4211 | int port = cpu_dp->index; |
4212 | int len = ETH_GSTRING_LEN; |
4213 | - int mcount = 0, count; |
4214 | - unsigned int i; |
4215 | + int mcount = 0, count, i; |
4216 | uint8_t pfx[4]; |
4217 | uint8_t *ndata; |
4218 | |
4219 | @@ -178,6 +177,8 @@ static void dsa_master_get_strings(struct net_device *dev, uint32_t stringset, |
4220 | */ |
4221 | ds->ops->get_strings(ds, port, stringset, ndata); |
4222 | count = ds->ops->get_sset_count(ds, port, stringset); |
4223 | + if (count < 0) |
4224 | + return; |
4225 | for (i = 0; i < count; i++) { |
4226 | memmove(ndata + (i * len + sizeof(pfx)), |
4227 | ndata + i * len, len - sizeof(pfx)); |
4228 | diff --git a/net/dsa/slave.c b/net/dsa/slave.c |
4229 | index 06f8874d53eea..75b4cd4bcafb9 100644 |
4230 | --- a/net/dsa/slave.c |
4231 | +++ b/net/dsa/slave.c |
4232 | @@ -692,13 +692,15 @@ static int dsa_slave_get_sset_count(struct net_device *dev, int sset) |
4233 | struct dsa_switch *ds = dp->ds; |
4234 | |
4235 | if (sset == ETH_SS_STATS) { |
4236 | - int count; |
4237 | + int count = 0; |
4238 | |
4239 | - count = 4; |
4240 | - if (ds->ops->get_sset_count) |
4241 | - count += ds->ops->get_sset_count(ds, dp->index, sset); |
4242 | + if (ds->ops->get_sset_count) { |
4243 | + count = ds->ops->get_sset_count(ds, dp->index, sset); |
4244 | + if (count < 0) |
4245 | + return count; |
4246 | + } |
4247 | |
4248 | - return count; |
4249 | + return count + 4; |
4250 | } |
4251 | |
4252 | return -EOPNOTSUPP; |
4253 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c |
4254 | index c875c9b6edbe9..7d0a6a7c9d283 100644 |
4255 | --- a/net/ipv6/mcast.c |
4256 | +++ b/net/ipv6/mcast.c |
4257 | @@ -1604,10 +1604,7 @@ static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu) |
4258 | IPV6_TLV_PADN, 0 }; |
4259 | |
4260 | /* we assume size > sizeof(ra) here */ |
4261 | - /* limit our allocations to order-0 page */ |
4262 | - size = min_t(int, size, SKB_MAX_ORDER(0, 0)); |
4263 | skb = sock_alloc_send_skb(sk, size, 1, &err); |
4264 | - |
4265 | if (!skb) |
4266 | return NULL; |
4267 | |
4268 | diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c |
4269 | index c8cf1bbad74a2..45ee1971d9986 100644 |
4270 | --- a/net/ipv6/reassembly.c |
4271 | +++ b/net/ipv6/reassembly.c |
4272 | @@ -344,7 +344,7 @@ static int ipv6_frag_rcv(struct sk_buff *skb) |
4273 | hdr = ipv6_hdr(skb); |
4274 | fhdr = (struct frag_hdr *)skb_transport_header(skb); |
4275 | |
4276 | - if (!(fhdr->frag_off & htons(0xFFF9))) { |
4277 | + if (!(fhdr->frag_off & htons(IP6_OFFSET | IP6_MF))) { |
4278 | /* It is not a fragmented frame */ |
4279 | skb->transport_header += sizeof(struct frag_hdr); |
4280 | __IP6_INC_STATS(net, |
4281 | @@ -352,6 +352,8 @@ static int ipv6_frag_rcv(struct sk_buff *skb) |
4282 | |
4283 | IP6CB(skb)->nhoff = (u8 *)fhdr - skb_network_header(skb); |
4284 | IP6CB(skb)->flags |= IP6SKB_FRAGMENTED; |
4285 | + IP6CB(skb)->frag_max_size = ntohs(hdr->payload_len) + |
4286 | + sizeof(struct ipv6hdr); |
4287 | return 1; |
4288 | } |
4289 | |
4290 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h |
4291 | index 268f1d8f440ba..a7933279a80b7 100644 |
4292 | --- a/net/mac80211/ieee80211_i.h |
4293 | +++ b/net/mac80211/ieee80211_i.h |
4294 | @@ -50,12 +50,6 @@ struct ieee80211_local; |
4295 | #define IEEE80211_ENCRYPT_HEADROOM 8 |
4296 | #define IEEE80211_ENCRYPT_TAILROOM 18 |
4297 | |
4298 | -/* IEEE 802.11 (Ch. 9.5 Defragmentation) requires support for concurrent |
4299 | - * reception of at least three fragmented frames. This limit can be increased |
4300 | - * by changing this define, at the cost of slower frame reassembly and |
4301 | - * increased memory use (about 2 kB of RAM per entry). */ |
4302 | -#define IEEE80211_FRAGMENT_MAX 4 |
4303 | - |
4304 | /* power level hasn't been configured (or set to automatic) */ |
4305 | #define IEEE80211_UNSET_POWER_LEVEL INT_MIN |
4306 | |
4307 | @@ -88,18 +82,6 @@ extern const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS]; |
4308 | |
4309 | #define IEEE80211_MAX_NAN_INSTANCE_ID 255 |
4310 | |
4311 | -struct ieee80211_fragment_entry { |
4312 | - struct sk_buff_head skb_list; |
4313 | - unsigned long first_frag_time; |
4314 | - u16 seq; |
4315 | - u16 extra_len; |
4316 | - u16 last_frag; |
4317 | - u8 rx_queue; |
4318 | - bool check_sequential_pn; /* needed for CCMP/GCMP */ |
4319 | - u8 last_pn[6]; /* PN of the last fragment if CCMP was used */ |
4320 | -}; |
4321 | - |
4322 | - |
4323 | struct ieee80211_bss { |
4324 | u32 device_ts_beacon, device_ts_presp; |
4325 | |
4326 | @@ -240,8 +222,15 @@ struct ieee80211_rx_data { |
4327 | */ |
4328 | int security_idx; |
4329 | |
4330 | - u32 tkip_iv32; |
4331 | - u16 tkip_iv16; |
4332 | + union { |
4333 | + struct { |
4334 | + u32 iv32; |
4335 | + u16 iv16; |
4336 | + } tkip; |
4337 | + struct { |
4338 | + u8 pn[IEEE80211_CCMP_PN_LEN]; |
4339 | + } ccm_gcm; |
4340 | + }; |
4341 | }; |
4342 | |
4343 | struct ieee80211_csa_settings { |
4344 | @@ -894,9 +883,7 @@ struct ieee80211_sub_if_data { |
4345 | |
4346 | char name[IFNAMSIZ]; |
4347 | |
4348 | - /* Fragment table for host-based reassembly */ |
4349 | - struct ieee80211_fragment_entry fragments[IEEE80211_FRAGMENT_MAX]; |
4350 | - unsigned int fragment_next; |
4351 | + struct ieee80211_fragment_cache frags; |
4352 | |
4353 | /* TID bitmap for NoAck policy */ |
4354 | u16 noack_map; |
4355 | @@ -2256,4 +2243,7 @@ extern const struct ethtool_ops ieee80211_ethtool_ops; |
4356 | #define debug_noinline |
4357 | #endif |
4358 | |
4359 | +void ieee80211_init_frag_cache(struct ieee80211_fragment_cache *cache); |
4360 | +void ieee80211_destroy_frag_cache(struct ieee80211_fragment_cache *cache); |
4361 | + |
4362 | #endif /* IEEE80211_I_H */ |
4363 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c |
4364 | index 6089b09ec13b6..6f576306a4d74 100644 |
4365 | --- a/net/mac80211/iface.c |
4366 | +++ b/net/mac80211/iface.c |
4367 | @@ -8,7 +8,7 @@ |
4368 | * Copyright 2008, Johannes Berg <johannes@sipsolutions.net> |
4369 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
4370 | * Copyright (c) 2016 Intel Deutschland GmbH |
4371 | - * Copyright (C) 2018 Intel Corporation |
4372 | + * Copyright (C) 2018-2021 Intel Corporation |
4373 | */ |
4374 | #include <linux/slab.h> |
4375 | #include <linux/kernel.h> |
4376 | @@ -1108,16 +1108,12 @@ static void ieee80211_set_multicast_list(struct net_device *dev) |
4377 | */ |
4378 | static void ieee80211_teardown_sdata(struct ieee80211_sub_if_data *sdata) |
4379 | { |
4380 | - int i; |
4381 | - |
4382 | /* free extra data */ |
4383 | ieee80211_free_keys(sdata, false); |
4384 | |
4385 | ieee80211_debugfs_remove_netdev(sdata); |
4386 | |
4387 | - for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) |
4388 | - __skb_queue_purge(&sdata->fragments[i].skb_list); |
4389 | - sdata->fragment_next = 0; |
4390 | + ieee80211_destroy_frag_cache(&sdata->frags); |
4391 | |
4392 | if (ieee80211_vif_is_mesh(&sdata->vif)) |
4393 | ieee80211_mesh_teardown_sdata(sdata); |
4394 | @@ -1827,8 +1823,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, |
4395 | sdata->wdev.wiphy = local->hw.wiphy; |
4396 | sdata->local = local; |
4397 | |
4398 | - for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) |
4399 | - skb_queue_head_init(&sdata->fragments[i].skb_list); |
4400 | + ieee80211_init_frag_cache(&sdata->frags); |
4401 | |
4402 | INIT_LIST_HEAD(&sdata->key_list); |
4403 | |
4404 | diff --git a/net/mac80211/key.c b/net/mac80211/key.c |
4405 | index efc1acc6543c9..fff7efc5b9713 100644 |
4406 | --- a/net/mac80211/key.c |
4407 | +++ b/net/mac80211/key.c |
4408 | @@ -764,6 +764,7 @@ int ieee80211_key_link(struct ieee80211_key *key, |
4409 | struct ieee80211_sub_if_data *sdata, |
4410 | struct sta_info *sta) |
4411 | { |
4412 | + static atomic_t key_color = ATOMIC_INIT(0); |
4413 | struct ieee80211_key *old_key; |
4414 | int idx = key->conf.keyidx; |
4415 | bool pairwise = key->conf.flags & IEEE80211_KEY_FLAG_PAIRWISE; |
4416 | @@ -815,6 +816,12 @@ int ieee80211_key_link(struct ieee80211_key *key, |
4417 | key->sdata = sdata; |
4418 | key->sta = sta; |
4419 | |
4420 | + /* |
4421 | + * Assign a unique ID to every key so we can easily prevent mixed |
4422 | + * key and fragment cache attacks. |
4423 | + */ |
4424 | + key->color = atomic_inc_return(&key_color); |
4425 | + |
4426 | increment_tailroom_need_count(sdata); |
4427 | |
4428 | ret = ieee80211_key_replace(sdata, sta, pairwise, old_key, key); |
4429 | diff --git a/net/mac80211/key.h b/net/mac80211/key.h |
4430 | index d6d6e89cf7dd2..c463938bec99e 100644 |
4431 | --- a/net/mac80211/key.h |
4432 | +++ b/net/mac80211/key.h |
4433 | @@ -127,6 +127,8 @@ struct ieee80211_key { |
4434 | } debugfs; |
4435 | #endif |
4436 | |
4437 | + unsigned int color; |
4438 | + |
4439 | /* |
4440 | * key config, must be last because it contains key |
4441 | * material as variable length member |
4442 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
4443 | index 1a15e7bae106a..3d7a5c5e586a6 100644 |
4444 | --- a/net/mac80211/rx.c |
4445 | +++ b/net/mac80211/rx.c |
4446 | @@ -6,7 +6,7 @@ |
4447 | * Copyright 2007-2010 Johannes Berg <johannes@sipsolutions.net> |
4448 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
4449 | * Copyright(c) 2015 - 2017 Intel Deutschland GmbH |
4450 | - * Copyright (C) 2018-2019 Intel Corporation |
4451 | + * Copyright (C) 2018-2021 Intel Corporation |
4452 | */ |
4453 | |
4454 | #include <linux/jiffies.h> |
4455 | @@ -2083,19 +2083,34 @@ ieee80211_rx_h_decrypt(struct ieee80211_rx_data *rx) |
4456 | return result; |
4457 | } |
4458 | |
4459 | +void ieee80211_init_frag_cache(struct ieee80211_fragment_cache *cache) |
4460 | +{ |
4461 | + int i; |
4462 | + |
4463 | + for (i = 0; i < ARRAY_SIZE(cache->entries); i++) |
4464 | + skb_queue_head_init(&cache->entries[i].skb_list); |
4465 | +} |
4466 | + |
4467 | +void ieee80211_destroy_frag_cache(struct ieee80211_fragment_cache *cache) |
4468 | +{ |
4469 | + int i; |
4470 | + |
4471 | + for (i = 0; i < ARRAY_SIZE(cache->entries); i++) |
4472 | + __skb_queue_purge(&cache->entries[i].skb_list); |
4473 | +} |
4474 | + |
4475 | static inline struct ieee80211_fragment_entry * |
4476 | -ieee80211_reassemble_add(struct ieee80211_sub_if_data *sdata, |
4477 | +ieee80211_reassemble_add(struct ieee80211_fragment_cache *cache, |
4478 | unsigned int frag, unsigned int seq, int rx_queue, |
4479 | struct sk_buff **skb) |
4480 | { |
4481 | struct ieee80211_fragment_entry *entry; |
4482 | |
4483 | - entry = &sdata->fragments[sdata->fragment_next++]; |
4484 | - if (sdata->fragment_next >= IEEE80211_FRAGMENT_MAX) |
4485 | - sdata->fragment_next = 0; |
4486 | + entry = &cache->entries[cache->next++]; |
4487 | + if (cache->next >= IEEE80211_FRAGMENT_MAX) |
4488 | + cache->next = 0; |
4489 | |
4490 | - if (!skb_queue_empty(&entry->skb_list)) |
4491 | - __skb_queue_purge(&entry->skb_list); |
4492 | + __skb_queue_purge(&entry->skb_list); |
4493 | |
4494 | __skb_queue_tail(&entry->skb_list, *skb); /* no need for locking */ |
4495 | *skb = NULL; |
4496 | @@ -2110,14 +2125,14 @@ ieee80211_reassemble_add(struct ieee80211_sub_if_data *sdata, |
4497 | } |
4498 | |
4499 | static inline struct ieee80211_fragment_entry * |
4500 | -ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata, |
4501 | +ieee80211_reassemble_find(struct ieee80211_fragment_cache *cache, |
4502 | unsigned int frag, unsigned int seq, |
4503 | int rx_queue, struct ieee80211_hdr *hdr) |
4504 | { |
4505 | struct ieee80211_fragment_entry *entry; |
4506 | int i, idx; |
4507 | |
4508 | - idx = sdata->fragment_next; |
4509 | + idx = cache->next; |
4510 | for (i = 0; i < IEEE80211_FRAGMENT_MAX; i++) { |
4511 | struct ieee80211_hdr *f_hdr; |
4512 | struct sk_buff *f_skb; |
4513 | @@ -2126,7 +2141,7 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata, |
4514 | if (idx < 0) |
4515 | idx = IEEE80211_FRAGMENT_MAX - 1; |
4516 | |
4517 | - entry = &sdata->fragments[idx]; |
4518 | + entry = &cache->entries[idx]; |
4519 | if (skb_queue_empty(&entry->skb_list) || entry->seq != seq || |
4520 | entry->rx_queue != rx_queue || |
4521 | entry->last_frag + 1 != frag) |
4522 | @@ -2154,15 +2169,27 @@ ieee80211_reassemble_find(struct ieee80211_sub_if_data *sdata, |
4523 | return NULL; |
4524 | } |
4525 | |
4526 | +static bool requires_sequential_pn(struct ieee80211_rx_data *rx, __le16 fc) |
4527 | +{ |
4528 | + return rx->key && |
4529 | + (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || |
4530 | + rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || |
4531 | + rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || |
4532 | + rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && |
4533 | + ieee80211_has_protected(fc); |
4534 | +} |
4535 | + |
4536 | static ieee80211_rx_result debug_noinline |
4537 | ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) |
4538 | { |
4539 | + struct ieee80211_fragment_cache *cache = &rx->sdata->frags; |
4540 | struct ieee80211_hdr *hdr; |
4541 | u16 sc; |
4542 | __le16 fc; |
4543 | unsigned int frag, seq; |
4544 | struct ieee80211_fragment_entry *entry; |
4545 | struct sk_buff *skb; |
4546 | + struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb); |
4547 | |
4548 | hdr = (struct ieee80211_hdr *)rx->skb->data; |
4549 | fc = hdr->frame_control; |
4550 | @@ -2178,6 +2205,9 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) |
4551 | goto out_no_led; |
4552 | } |
4553 | |
4554 | + if (rx->sta) |
4555 | + cache = &rx->sta->frags; |
4556 | + |
4557 | if (likely(!ieee80211_has_morefrags(fc) && frag == 0)) |
4558 | goto out; |
4559 | |
4560 | @@ -2196,20 +2226,17 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) |
4561 | |
4562 | if (frag == 0) { |
4563 | /* This is the first fragment of a new frame. */ |
4564 | - entry = ieee80211_reassemble_add(rx->sdata, frag, seq, |
4565 | + entry = ieee80211_reassemble_add(cache, frag, seq, |
4566 | rx->seqno_idx, &(rx->skb)); |
4567 | - if (rx->key && |
4568 | - (rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP || |
4569 | - rx->key->conf.cipher == WLAN_CIPHER_SUITE_CCMP_256 || |
4570 | - rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP || |
4571 | - rx->key->conf.cipher == WLAN_CIPHER_SUITE_GCMP_256) && |
4572 | - ieee80211_has_protected(fc)) { |
4573 | + if (requires_sequential_pn(rx, fc)) { |
4574 | int queue = rx->security_idx; |
4575 | |
4576 | /* Store CCMP/GCMP PN so that we can verify that the |
4577 | * next fragment has a sequential PN value. |
4578 | */ |
4579 | entry->check_sequential_pn = true; |
4580 | + entry->is_protected = true; |
4581 | + entry->key_color = rx->key->color; |
4582 | memcpy(entry->last_pn, |
4583 | rx->key->u.ccmp.rx_pn[queue], |
4584 | IEEE80211_CCMP_PN_LEN); |
4585 | @@ -2221,6 +2248,11 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) |
4586 | sizeof(rx->key->u.gcmp.rx_pn[queue])); |
4587 | BUILD_BUG_ON(IEEE80211_CCMP_PN_LEN != |
4588 | IEEE80211_GCMP_PN_LEN); |
4589 | + } else if (rx->key && |
4590 | + (ieee80211_has_protected(fc) || |
4591 | + (status->flag & RX_FLAG_DECRYPTED))) { |
4592 | + entry->is_protected = true; |
4593 | + entry->key_color = rx->key->color; |
4594 | } |
4595 | return RX_QUEUED; |
4596 | } |
4597 | @@ -2228,7 +2260,7 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) |
4598 | /* This is a fragment for a frame that should already be pending in |
4599 | * fragment cache. Add this fragment to the end of the pending entry. |
4600 | */ |
4601 | - entry = ieee80211_reassemble_find(rx->sdata, frag, seq, |
4602 | + entry = ieee80211_reassemble_find(cache, frag, seq, |
4603 | rx->seqno_idx, hdr); |
4604 | if (!entry) { |
4605 | I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag); |
4606 | @@ -2243,25 +2275,39 @@ ieee80211_rx_h_defragment(struct ieee80211_rx_data *rx) |
4607 | if (entry->check_sequential_pn) { |
4608 | int i; |
4609 | u8 pn[IEEE80211_CCMP_PN_LEN], *rpn; |
4610 | - int queue; |
4611 | |
4612 | - if (!rx->key || |
4613 | - (rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP && |
4614 | - rx->key->conf.cipher != WLAN_CIPHER_SUITE_CCMP_256 && |
4615 | - rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP && |
4616 | - rx->key->conf.cipher != WLAN_CIPHER_SUITE_GCMP_256)) |
4617 | + if (!requires_sequential_pn(rx, fc)) |
4618 | + return RX_DROP_UNUSABLE; |
4619 | + |
4620 | + /* Prevent mixed key and fragment cache attacks */ |
4621 | + if (entry->key_color != rx->key->color) |
4622 | return RX_DROP_UNUSABLE; |
4623 | + |
4624 | memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN); |
4625 | for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) { |
4626 | pn[i]++; |
4627 | if (pn[i]) |
4628 | break; |
4629 | } |
4630 | - queue = rx->security_idx; |
4631 | - rpn = rx->key->u.ccmp.rx_pn[queue]; |
4632 | + |
4633 | + rpn = rx->ccm_gcm.pn; |
4634 | if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN)) |
4635 | return RX_DROP_UNUSABLE; |
4636 | memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN); |
4637 | + } else if (entry->is_protected && |
4638 | + (!rx->key || |
4639 | + (!ieee80211_has_protected(fc) && |
4640 | + !(status->flag & RX_FLAG_DECRYPTED)) || |
4641 | + rx->key->color != entry->key_color)) { |
4642 | + /* Drop this as a mixed key or fragment cache attack, even |
4643 | + * if for TKIP Michael MIC should protect us, and WEP is a |
4644 | + * lost cause anyway. |
4645 | + */ |
4646 | + return RX_DROP_UNUSABLE; |
4647 | + } else if (entry->is_protected && rx->key && |
4648 | + entry->key_color != rx->key->color && |
4649 | + (status->flag & RX_FLAG_DECRYPTED)) { |
4650 | + return RX_DROP_UNUSABLE; |
4651 | } |
4652 | |
4653 | skb_pull(rx->skb, ieee80211_hdrlen(fc)); |
4654 | @@ -2447,13 +2493,13 @@ static bool ieee80211_frame_allowed(struct ieee80211_rx_data *rx, __le16 fc) |
4655 | struct ethhdr *ehdr = (struct ethhdr *) rx->skb->data; |
4656 | |
4657 | /* |
4658 | - * Allow EAPOL frames to us/the PAE group address regardless |
4659 | - * of whether the frame was encrypted or not. |
4660 | + * Allow EAPOL frames to us/the PAE group address regardless of |
4661 | + * whether the frame was encrypted or not, and always disallow |
4662 | + * all other destination addresses for them. |
4663 | */ |
4664 | - if (ehdr->h_proto == rx->sdata->control_port_protocol && |
4665 | - (ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) || |
4666 | - ether_addr_equal(ehdr->h_dest, pae_group_addr))) |
4667 | - return true; |
4668 | + if (unlikely(ehdr->h_proto == rx->sdata->control_port_protocol)) |
4669 | + return ether_addr_equal(ehdr->h_dest, rx->sdata->vif.addr) || |
4670 | + ether_addr_equal(ehdr->h_dest, pae_group_addr); |
4671 | |
4672 | if (ieee80211_802_1x_port_control(rx) || |
4673 | ieee80211_drop_unencrypted(rx, fc)) |
4674 | @@ -2477,8 +2523,28 @@ static void ieee80211_deliver_skb_to_local_stack(struct sk_buff *skb, |
4675 | cfg80211_rx_control_port(dev, skb, noencrypt); |
4676 | dev_kfree_skb(skb); |
4677 | } else { |
4678 | + struct ethhdr *ehdr = (void *)skb_mac_header(skb); |
4679 | + |
4680 | memset(skb->cb, 0, sizeof(skb->cb)); |
4681 | |
4682 | + /* |
4683 | + * 802.1X over 802.11 requires that the authenticator address |
4684 | + * be used for EAPOL frames. However, 802.1X allows the use of |
4685 | + * the PAE group address instead. If the interface is part of |
4686 | + * a bridge and we pass the frame with the PAE group address, |
4687 | + * then the bridge will forward it to the network (even if the |
4688 | + * client was not associated yet), which isn't supposed to |
4689 | + * happen. |
4690 | + * To avoid that, rewrite the destination address to our own |
4691 | + * address, so that the authenticator (e.g. hostapd) will see |
4692 | + * the frame, but bridge won't forward it anywhere else. Note |
4693 | + * that due to earlier filtering, the only other address can |
4694 | + * be the PAE group address. |
4695 | + */ |
4696 | + if (unlikely(skb->protocol == sdata->control_port_protocol && |
4697 | + !ether_addr_equal(ehdr->h_dest, sdata->vif.addr))) |
4698 | + ether_addr_copy(ehdr->h_dest, sdata->vif.addr); |
4699 | + |
4700 | /* deliver to local stack */ |
4701 | if (rx->napi) |
4702 | napi_gro_receive(rx->napi, skb); |
4703 | @@ -2518,6 +2584,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx) |
4704 | if ((sdata->vif.type == NL80211_IFTYPE_AP || |
4705 | sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && |
4706 | !(sdata->flags & IEEE80211_SDATA_DONT_BRIDGE_PACKETS) && |
4707 | + ehdr->h_proto != rx->sdata->control_port_protocol && |
4708 | (sdata->vif.type != NL80211_IFTYPE_AP_VLAN || !sdata->u.vlan.sta)) { |
4709 | if (is_multicast_ether_addr(ehdr->h_dest) && |
4710 | ieee80211_vif_get_num_mcast_if(sdata) != 0) { |
4711 | @@ -2627,7 +2694,7 @@ __ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx, u8 data_offset) |
4712 | if (ieee80211_data_to_8023_exthdr(skb, ðhdr, |
4713 | rx->sdata->vif.addr, |
4714 | rx->sdata->vif.type, |
4715 | - data_offset)) |
4716 | + data_offset, true)) |
4717 | return RX_DROP_UNUSABLE; |
4718 | |
4719 | ieee80211_amsdu_to_8023s(skb, &frame_list, dev->dev_addr, |
4720 | @@ -2684,6 +2751,23 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx) |
4721 | if (is_multicast_ether_addr(hdr->addr1)) |
4722 | return RX_DROP_UNUSABLE; |
4723 | |
4724 | + if (rx->key) { |
4725 | + /* |
4726 | + * We should not receive A-MSDUs on pre-HT connections, |
4727 | + * and HT connections cannot use old ciphers. Thus drop |
4728 | + * them, as in those cases we couldn't even have SPP |
4729 | + * A-MSDUs or such. |
4730 | + */ |
4731 | + switch (rx->key->conf.cipher) { |
4732 | + case WLAN_CIPHER_SUITE_WEP40: |
4733 | + case WLAN_CIPHER_SUITE_WEP104: |
4734 | + case WLAN_CIPHER_SUITE_TKIP: |
4735 | + return RX_DROP_UNUSABLE; |
4736 | + default: |
4737 | + break; |
4738 | + } |
4739 | + } |
4740 | + |
4741 | return __ieee80211_rx_h_amsdu(rx, 0); |
4742 | } |
4743 | |
4744 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c |
4745 | index 4a23996dce044..82a1dd7b7d689 100644 |
4746 | --- a/net/mac80211/sta_info.c |
4747 | +++ b/net/mac80211/sta_info.c |
4748 | @@ -4,7 +4,7 @@ |
4749 | * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> |
4750 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
4751 | * Copyright (C) 2015 - 2017 Intel Deutschland GmbH |
4752 | - * Copyright (C) 2018-2020 Intel Corporation |
4753 | + * Copyright (C) 2018-2021 Intel Corporation |
4754 | */ |
4755 | |
4756 | #include <linux/module.h> |
4757 | @@ -378,6 +378,8 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, |
4758 | |
4759 | u64_stats_init(&sta->rx_stats.syncp); |
4760 | |
4761 | + ieee80211_init_frag_cache(&sta->frags); |
4762 | + |
4763 | sta->sta_state = IEEE80211_STA_NONE; |
4764 | |
4765 | /* Mark TID as unreserved */ |
4766 | @@ -1085,6 +1087,8 @@ static void __sta_info_destroy_part2(struct sta_info *sta) |
4767 | |
4768 | ieee80211_sta_debugfs_remove(sta); |
4769 | |
4770 | + ieee80211_destroy_frag_cache(&sta->frags); |
4771 | + |
4772 | cleanup_single_sta(sta); |
4773 | } |
4774 | |
4775 | diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h |
4776 | index be1d9dfa760d4..2eb73be9b9865 100644 |
4777 | --- a/net/mac80211/sta_info.h |
4778 | +++ b/net/mac80211/sta_info.h |
4779 | @@ -3,6 +3,7 @@ |
4780 | * Copyright 2002-2005, Devicescape Software, Inc. |
4781 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
4782 | * Copyright(c) 2015-2017 Intel Deutschland GmbH |
4783 | + * Copyright(c) 2020-2021 Intel Corporation |
4784 | */ |
4785 | |
4786 | #ifndef STA_INFO_H |
4787 | @@ -425,6 +426,34 @@ struct ieee80211_sta_rx_stats { |
4788 | u64 msdu[IEEE80211_NUM_TIDS + 1]; |
4789 | }; |
4790 | |
4791 | +/* |
4792 | + * IEEE 802.11-2016 (10.6 "Defragmentation") recommends support for "concurrent |
4793 | + * reception of at least one MSDU per access category per associated STA" |
4794 | + * on APs, or "at least one MSDU per access category" on other interface types. |
4795 | + * |
4796 | + * This limit can be increased by changing this define, at the cost of slower |
4797 | + * frame reassembly and increased memory use while fragments are pending. |
4798 | + */ |
4799 | +#define IEEE80211_FRAGMENT_MAX 4 |
4800 | + |
4801 | +struct ieee80211_fragment_entry { |
4802 | + struct sk_buff_head skb_list; |
4803 | + unsigned long first_frag_time; |
4804 | + u16 seq; |
4805 | + u16 extra_len; |
4806 | + u16 last_frag; |
4807 | + u8 rx_queue; |
4808 | + u8 check_sequential_pn:1, /* needed for CCMP/GCMP */ |
4809 | + is_protected:1; |
4810 | + u8 last_pn[6]; /* PN of the last fragment if CCMP was used */ |
4811 | + unsigned int key_color; |
4812 | +}; |
4813 | + |
4814 | +struct ieee80211_fragment_cache { |
4815 | + struct ieee80211_fragment_entry entries[IEEE80211_FRAGMENT_MAX]; |
4816 | + unsigned int next; |
4817 | +}; |
4818 | + |
4819 | /* |
4820 | * The bandwidth threshold below which the per-station CoDel parameters will be |
4821 | * scaled to be more lenient (to prevent starvation of slow stations). This |
4822 | @@ -518,6 +547,7 @@ struct ieee80211_sta_rx_stats { |
4823 | * @status_stats.last_ack_signal: last ACK signal |
4824 | * @status_stats.ack_signal_filled: last ACK signal validity |
4825 | * @status_stats.avg_ack_signal: average ACK signal |
4826 | + * @frags: fragment cache |
4827 | */ |
4828 | struct sta_info { |
4829 | /* General information, mostly static */ |
4830 | @@ -623,6 +653,8 @@ struct sta_info { |
4831 | |
4832 | struct cfg80211_chan_def tdls_chandef; |
4833 | |
4834 | + struct ieee80211_fragment_cache frags; |
4835 | + |
4836 | /* keep last! */ |
4837 | struct ieee80211_sta sta; |
4838 | }; |
4839 | diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c |
4840 | index 91bf32af55e9a..bca47fad5a162 100644 |
4841 | --- a/net/mac80211/wpa.c |
4842 | +++ b/net/mac80211/wpa.c |
4843 | @@ -3,6 +3,7 @@ |
4844 | * Copyright 2002-2004, Instant802 Networks, Inc. |
4845 | * Copyright 2008, Jouni Malinen <j@w1.fi> |
4846 | * Copyright (C) 2016-2017 Intel Deutschland GmbH |
4847 | + * Copyright (C) 2020-2021 Intel Corporation |
4848 | */ |
4849 | |
4850 | #include <linux/netdevice.h> |
4851 | @@ -167,8 +168,8 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx) |
4852 | |
4853 | update_iv: |
4854 | /* update IV in key information to be able to detect replays */ |
4855 | - rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip_iv32; |
4856 | - rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip_iv16; |
4857 | + rx->key->u.tkip.rx[rx->security_idx].iv32 = rx->tkip.iv32; |
4858 | + rx->key->u.tkip.rx[rx->security_idx].iv16 = rx->tkip.iv16; |
4859 | |
4860 | return RX_CONTINUE; |
4861 | |
4862 | @@ -294,8 +295,8 @@ ieee80211_crypto_tkip_decrypt(struct ieee80211_rx_data *rx) |
4863 | key, skb->data + hdrlen, |
4864 | skb->len - hdrlen, rx->sta->sta.addr, |
4865 | hdr->addr1, hwaccel, rx->security_idx, |
4866 | - &rx->tkip_iv32, |
4867 | - &rx->tkip_iv16); |
4868 | + &rx->tkip.iv32, |
4869 | + &rx->tkip.iv16); |
4870 | if (res != TKIP_DECRYPT_OK) |
4871 | return RX_DROP_UNUSABLE; |
4872 | |
4873 | @@ -553,6 +554,8 @@ ieee80211_crypto_ccmp_decrypt(struct ieee80211_rx_data *rx, |
4874 | } |
4875 | |
4876 | memcpy(key->u.ccmp.rx_pn[queue], pn, IEEE80211_CCMP_PN_LEN); |
4877 | + if (unlikely(ieee80211_is_frag(hdr))) |
4878 | + memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN); |
4879 | } |
4880 | |
4881 | /* Remove CCMP header and MIC */ |
4882 | @@ -781,6 +784,8 @@ ieee80211_crypto_gcmp_decrypt(struct ieee80211_rx_data *rx) |
4883 | } |
4884 | |
4885 | memcpy(key->u.gcmp.rx_pn[queue], pn, IEEE80211_GCMP_PN_LEN); |
4886 | + if (unlikely(ieee80211_is_frag(hdr))) |
4887 | + memcpy(rx->ccm_gcm.pn, pn, IEEE80211_CCMP_PN_LEN); |
4888 | } |
4889 | |
4890 | /* Remove GCMP header and MIC */ |
4891 | diff --git a/net/openvswitch/meter.c b/net/openvswitch/meter.c |
4892 | index 541eea74ef7a6..c37e09223cbb4 100644 |
4893 | --- a/net/openvswitch/meter.c |
4894 | +++ b/net/openvswitch/meter.c |
4895 | @@ -460,6 +460,14 @@ bool ovs_meter_execute(struct datapath *dp, struct sk_buff *skb, |
4896 | spin_lock(&meter->lock); |
4897 | |
4898 | long_delta_ms = (now_ms - meter->used); /* ms */ |
4899 | + if (long_delta_ms < 0) { |
4900 | + /* This condition means that we have several threads fighting |
4901 | + * for a meter lock, and the one who received the packets a |
4902 | + * bit later wins. Assuming that all racing threads received |
4903 | + * packets at the same time to avoid overflow. |
4904 | + */ |
4905 | + long_delta_ms = 0; |
4906 | + } |
4907 | |
4908 | /* Make sure delta_ms will not be too large, so that bucket will not |
4909 | * wrap around below. |
4910 | diff --git a/net/sched/sch_dsmark.c b/net/sched/sch_dsmark.c |
4911 | index 2b88710994d71..76ed1a05ded27 100644 |
4912 | --- a/net/sched/sch_dsmark.c |
4913 | +++ b/net/sched/sch_dsmark.c |
4914 | @@ -406,7 +406,8 @@ static void dsmark_reset(struct Qdisc *sch) |
4915 | struct dsmark_qdisc_data *p = qdisc_priv(sch); |
4916 | |
4917 | pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p); |
4918 | - qdisc_reset(p->q); |
4919 | + if (p->q) |
4920 | + qdisc_reset(p->q); |
4921 | sch->qstats.backlog = 0; |
4922 | sch->q.qlen = 0; |
4923 | } |
4924 | diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c |
4925 | index 6e6147a81bc3a..9bc5cbe9809b8 100644 |
4926 | --- a/net/sched/sch_generic.c |
4927 | +++ b/net/sched/sch_generic.c |
4928 | @@ -35,6 +35,25 @@ |
4929 | const struct Qdisc_ops *default_qdisc_ops = &pfifo_fast_ops; |
4930 | EXPORT_SYMBOL(default_qdisc_ops); |
4931 | |
4932 | +static void qdisc_maybe_clear_missed(struct Qdisc *q, |
4933 | + const struct netdev_queue *txq) |
4934 | +{ |
4935 | + clear_bit(__QDISC_STATE_MISSED, &q->state); |
4936 | + |
4937 | + /* Make sure the below netif_xmit_frozen_or_stopped() |
4938 | + * checking happens after clearing STATE_MISSED. |
4939 | + */ |
4940 | + smp_mb__after_atomic(); |
4941 | + |
4942 | + /* Checking netif_xmit_frozen_or_stopped() again to |
4943 | + * make sure STATE_MISSED is set if the STATE_MISSED |
4944 | + * set by netif_tx_wake_queue()'s rescheduling of |
4945 | + * net_tx_action() is cleared by the above clear_bit(). |
4946 | + */ |
4947 | + if (!netif_xmit_frozen_or_stopped(txq)) |
4948 | + set_bit(__QDISC_STATE_MISSED, &q->state); |
4949 | +} |
4950 | + |
4951 | /* Main transmission queue. */ |
4952 | |
4953 | /* Modifications to data participating in scheduling must be protected with |
4954 | @@ -74,6 +93,7 @@ static inline struct sk_buff *__skb_dequeue_bad_txq(struct Qdisc *q) |
4955 | } |
4956 | } else { |
4957 | skb = SKB_XOFF_MAGIC; |
4958 | + qdisc_maybe_clear_missed(q, txq); |
4959 | } |
4960 | } |
4961 | |
4962 | @@ -242,6 +262,7 @@ static struct sk_buff *dequeue_skb(struct Qdisc *q, bool *validate, |
4963 | } |
4964 | } else { |
4965 | skb = NULL; |
4966 | + qdisc_maybe_clear_missed(q, txq); |
4967 | } |
4968 | if (lock) |
4969 | spin_unlock(lock); |
4970 | @@ -251,8 +272,10 @@ validate: |
4971 | *validate = true; |
4972 | |
4973 | if ((q->flags & TCQ_F_ONETXQUEUE) && |
4974 | - netif_xmit_frozen_or_stopped(txq)) |
4975 | + netif_xmit_frozen_or_stopped(txq)) { |
4976 | + qdisc_maybe_clear_missed(q, txq); |
4977 | return skb; |
4978 | + } |
4979 | |
4980 | skb = qdisc_dequeue_skb_bad_txq(q); |
4981 | if (unlikely(skb)) { |
4982 | @@ -311,6 +334,8 @@ bool sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q, |
4983 | HARD_TX_LOCK(dev, txq, smp_processor_id()); |
4984 | if (!netif_xmit_frozen_or_stopped(txq)) |
4985 | skb = dev_hard_start_xmit(skb, dev, txq, &ret); |
4986 | + else |
4987 | + qdisc_maybe_clear_missed(q, txq); |
4988 | |
4989 | HARD_TX_UNLOCK(dev, txq); |
4990 | } else { |
4991 | @@ -645,8 +670,10 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc) |
4992 | { |
4993 | struct pfifo_fast_priv *priv = qdisc_priv(qdisc); |
4994 | struct sk_buff *skb = NULL; |
4995 | + bool need_retry = true; |
4996 | int band; |
4997 | |
4998 | +retry: |
4999 | for (band = 0; band < PFIFO_FAST_BANDS && !skb; band++) { |
5000 | struct skb_array *q = band2list(priv, band); |
5001 | |
5002 | @@ -657,6 +684,23 @@ static struct sk_buff *pfifo_fast_dequeue(struct Qdisc *qdisc) |
5003 | } |
5004 | if (likely(skb)) { |
5005 | qdisc_update_stats_at_dequeue(qdisc, skb); |
5006 | + } else if (need_retry && |
5007 | + test_bit(__QDISC_STATE_MISSED, &qdisc->state)) { |
5008 | + /* Delay clearing the STATE_MISSED here to reduce |
5009 | + * the overhead of the second spin_trylock() in |
5010 | + * qdisc_run_begin() and __netif_schedule() calling |
5011 | + * in qdisc_run_end(). |
5012 | + */ |
5013 | + clear_bit(__QDISC_STATE_MISSED, &qdisc->state); |
5014 | + |
5015 | + /* Make sure dequeuing happens after clearing |
5016 | + * STATE_MISSED. |
5017 | + */ |
5018 | + smp_mb__after_atomic(); |
5019 | + |
5020 | + need_retry = false; |
5021 | + |
5022 | + goto retry; |
5023 | } else { |
5024 | WRITE_ONCE(qdisc->empty, true); |
5025 | } |
5026 | @@ -1157,8 +1201,10 @@ static void dev_reset_queue(struct net_device *dev, |
5027 | qdisc_reset(qdisc); |
5028 | |
5029 | spin_unlock_bh(qdisc_lock(qdisc)); |
5030 | - if (nolock) |
5031 | + if (nolock) { |
5032 | + clear_bit(__QDISC_STATE_MISSED, &qdisc->state); |
5033 | spin_unlock_bh(&qdisc->seqlock); |
5034 | + } |
5035 | } |
5036 | |
5037 | static bool some_qdisc_is_busy(struct net_device *dev) |
5038 | diff --git a/net/smc/smc_ism.c b/net/smc/smc_ism.c |
5039 | index e89e918b88e09..2fff79db1a59c 100644 |
5040 | --- a/net/smc/smc_ism.c |
5041 | +++ b/net/smc/smc_ism.c |
5042 | @@ -289,11 +289,6 @@ struct smcd_dev *smcd_alloc_dev(struct device *parent, const char *name, |
5043 | INIT_LIST_HEAD(&smcd->vlan); |
5044 | smcd->event_wq = alloc_ordered_workqueue("ism_evt_wq-%s)", |
5045 | WQ_MEM_RECLAIM, name); |
5046 | - if (!smcd->event_wq) { |
5047 | - kfree(smcd->conn); |
5048 | - kfree(smcd); |
5049 | - return NULL; |
5050 | - } |
5051 | return smcd; |
5052 | } |
5053 | EXPORT_SYMBOL_GPL(smcd_alloc_dev); |
5054 | diff --git a/net/tipc/core.c b/net/tipc/core.c |
5055 | index e3d79f8b69d81..90cf7e0bbaf0f 100644 |
5056 | --- a/net/tipc/core.c |
5057 | +++ b/net/tipc/core.c |
5058 | @@ -107,6 +107,9 @@ static void __net_exit tipc_exit_net(struct net *net) |
5059 | tipc_bcast_stop(net); |
5060 | tipc_nametbl_stop(net); |
5061 | tipc_sk_rht_destroy(net); |
5062 | + |
5063 | + while (atomic_read(&tn->wq_count)) |
5064 | + cond_resched(); |
5065 | } |
5066 | |
5067 | static struct pernet_operations tipc_net_ops = { |
5068 | diff --git a/net/tipc/core.h b/net/tipc/core.h |
5069 | index e119c4a88d63e..c6bda91f85810 100644 |
5070 | --- a/net/tipc/core.h |
5071 | +++ b/net/tipc/core.h |
5072 | @@ -143,6 +143,8 @@ struct tipc_net { |
5073 | |
5074 | /* Work item for net finalize */ |
5075 | struct tipc_net_work final_work; |
5076 | + /* The numbers of work queues in schedule */ |
5077 | + atomic_t wq_count; |
5078 | }; |
5079 | |
5080 | static inline struct tipc_net *tipc_net(struct net *net) |
5081 | diff --git a/net/tipc/msg.c b/net/tipc/msg.c |
5082 | index 46e89c992c2dc..e4ea942873d49 100644 |
5083 | --- a/net/tipc/msg.c |
5084 | +++ b/net/tipc/msg.c |
5085 | @@ -141,18 +141,13 @@ int tipc_buf_append(struct sk_buff **headbuf, struct sk_buff **buf) |
5086 | if (unlikely(head)) |
5087 | goto err; |
5088 | *buf = NULL; |
5089 | + if (skb_has_frag_list(frag) && __skb_linearize(frag)) |
5090 | + goto err; |
5091 | frag = skb_unshare(frag, GFP_ATOMIC); |
5092 | if (unlikely(!frag)) |
5093 | goto err; |
5094 | head = *headbuf = frag; |
5095 | TIPC_SKB_CB(head)->tail = NULL; |
5096 | - if (skb_is_nonlinear(head)) { |
5097 | - skb_walk_frags(head, tail) { |
5098 | - TIPC_SKB_CB(head)->tail = tail; |
5099 | - } |
5100 | - } else { |
5101 | - skb_frag_list_init(head); |
5102 | - } |
5103 | return 0; |
5104 | } |
5105 | |
5106 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c |
5107 | index b2c36dcfc8e2f..cdade990fe445 100644 |
5108 | --- a/net/tipc/socket.c |
5109 | +++ b/net/tipc/socket.c |
5110 | @@ -1210,7 +1210,10 @@ void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq, |
5111 | spin_lock_bh(&inputq->lock); |
5112 | if (skb_peek(arrvq) == skb) { |
5113 | skb_queue_splice_tail_init(&tmpq, inputq); |
5114 | - __skb_dequeue(arrvq); |
5115 | + /* Decrease the skb's refcnt as increasing in the |
5116 | + * function tipc_skb_peek |
5117 | + */ |
5118 | + kfree_skb(__skb_dequeue(arrvq)); |
5119 | } |
5120 | spin_unlock_bh(&inputq->lock); |
5121 | __skb_queue_purge(&tmpq); |
5122 | diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c |
5123 | index 8f0977a9d423c..1fb0535e2eb47 100644 |
5124 | --- a/net/tipc/udp_media.c |
5125 | +++ b/net/tipc/udp_media.c |
5126 | @@ -802,6 +802,7 @@ static void cleanup_bearer(struct work_struct *work) |
5127 | kfree_rcu(rcast, rcu); |
5128 | } |
5129 | |
5130 | + atomic_dec(&tipc_net(sock_net(ub->ubsock->sk))->wq_count); |
5131 | dst_cache_destroy(&ub->rcast.dst_cache); |
5132 | udp_tunnel_sock_release(ub->ubsock); |
5133 | synchronize_net(); |
5134 | @@ -822,6 +823,7 @@ static void tipc_udp_disable(struct tipc_bearer *b) |
5135 | RCU_INIT_POINTER(ub->bearer, NULL); |
5136 | |
5137 | /* sock_release need to be done outside of rtnl lock */ |
5138 | + atomic_inc(&tipc_net(sock_net(ub->ubsock->sk))->wq_count); |
5139 | INIT_WORK(&ub->work, cleanup_bearer); |
5140 | schedule_work(&ub->work); |
5141 | } |
5142 | diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c |
5143 | index 0d524ef0d8c80..cdb65aa54be70 100644 |
5144 | --- a/net/tls/tls_sw.c |
5145 | +++ b/net/tls/tls_sw.c |
5146 | @@ -37,6 +37,7 @@ |
5147 | |
5148 | #include <linux/sched/signal.h> |
5149 | #include <linux/module.h> |
5150 | +#include <linux/splice.h> |
5151 | #include <crypto/aead.h> |
5152 | |
5153 | #include <net/strparser.h> |
5154 | @@ -1278,7 +1279,7 @@ int tls_sw_sendpage(struct sock *sk, struct page *page, |
5155 | } |
5156 | |
5157 | static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock, |
5158 | - int flags, long timeo, int *err) |
5159 | + bool nonblock, long timeo, int *err) |
5160 | { |
5161 | struct tls_context *tls_ctx = tls_get_ctx(sk); |
5162 | struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx); |
5163 | @@ -1303,7 +1304,7 @@ static struct sk_buff *tls_wait_data(struct sock *sk, struct sk_psock *psock, |
5164 | if (sock_flag(sk, SOCK_DONE)) |
5165 | return NULL; |
5166 | |
5167 | - if ((flags & MSG_DONTWAIT) || !timeo) { |
5168 | + if (nonblock || !timeo) { |
5169 | *err = -EAGAIN; |
5170 | return NULL; |
5171 | } |
5172 | @@ -1781,7 +1782,7 @@ int tls_sw_recvmsg(struct sock *sk, |
5173 | bool async_capable; |
5174 | bool async = false; |
5175 | |
5176 | - skb = tls_wait_data(sk, psock, flags, timeo, &err); |
5177 | + skb = tls_wait_data(sk, psock, flags & MSG_DONTWAIT, timeo, &err); |
5178 | if (!skb) { |
5179 | if (psock) { |
5180 | int ret = __tcp_bpf_recvmsg(sk, psock, |
5181 | @@ -1985,9 +1986,9 @@ ssize_t tls_sw_splice_read(struct socket *sock, loff_t *ppos, |
5182 | |
5183 | lock_sock(sk); |
5184 | |
5185 | - timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); |
5186 | + timeo = sock_rcvtimeo(sk, flags & SPLICE_F_NONBLOCK); |
5187 | |
5188 | - skb = tls_wait_data(sk, NULL, flags, timeo, &err); |
5189 | + skb = tls_wait_data(sk, NULL, flags & SPLICE_F_NONBLOCK, timeo, &err); |
5190 | if (!skb) |
5191 | goto splice_read_end; |
5192 | |
5193 | diff --git a/net/wireless/util.c b/net/wireless/util.c |
5194 | index 9abafd76ec50e..82244e2fc1f54 100644 |
5195 | --- a/net/wireless/util.c |
5196 | +++ b/net/wireless/util.c |
5197 | @@ -451,7 +451,7 @@ EXPORT_SYMBOL(ieee80211_get_mesh_hdrlen); |
5198 | |
5199 | int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, |
5200 | const u8 *addr, enum nl80211_iftype iftype, |
5201 | - u8 data_offset) |
5202 | + u8 data_offset, bool is_amsdu) |
5203 | { |
5204 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; |
5205 | struct { |
5206 | @@ -539,7 +539,7 @@ int ieee80211_data_to_8023_exthdr(struct sk_buff *skb, struct ethhdr *ehdr, |
5207 | skb_copy_bits(skb, hdrlen, &payload, sizeof(payload)); |
5208 | tmp.h_proto = payload.proto; |
5209 | |
5210 | - if (likely((ether_addr_equal(payload.hdr, rfc1042_header) && |
5211 | + if (likely((!is_amsdu && ether_addr_equal(payload.hdr, rfc1042_header) && |
5212 | tmp.h_proto != htons(ETH_P_AARP) && |
5213 | tmp.h_proto != htons(ETH_P_IPX)) || |
5214 | ether_addr_equal(payload.hdr, bridge_tunnel_header))) |
5215 | @@ -681,6 +681,9 @@ void ieee80211_amsdu_to_8023s(struct sk_buff *skb, struct sk_buff_head *list, |
5216 | remaining = skb->len - offset; |
5217 | if (subframe_len > remaining) |
5218 | goto purge; |
5219 | + /* mitigate A-MSDU aggregation injection attacks */ |
5220 | + if (ether_addr_equal(eth.h_dest, rfc1042_header)) |
5221 | + goto purge; |
5222 | |
5223 | offset += sizeof(struct ethhdr); |
5224 | last = remaining <= subframe_len + padding; |
5225 | diff --git a/sound/isa/gus/gus_main.c b/sound/isa/gus/gus_main.c |
5226 | index af6b4d89d6952..39911a637e802 100644 |
5227 | --- a/sound/isa/gus/gus_main.c |
5228 | +++ b/sound/isa/gus/gus_main.c |
5229 | @@ -77,17 +77,8 @@ static const struct snd_kcontrol_new snd_gus_joystick_control = { |
5230 | |
5231 | static void snd_gus_init_control(struct snd_gus_card *gus) |
5232 | { |
5233 | - int ret; |
5234 | - |
5235 | - if (!gus->ace_flag) { |
5236 | - ret = |
5237 | - snd_ctl_add(gus->card, |
5238 | - snd_ctl_new1(&snd_gus_joystick_control, |
5239 | - gus)); |
5240 | - if (ret) |
5241 | - snd_printk(KERN_ERR "gus: snd_ctl_add failed: %d\n", |
5242 | - ret); |
5243 | - } |
5244 | + if (!gus->ace_flag) |
5245 | + snd_ctl_add(gus->card, snd_ctl_new1(&snd_gus_joystick_control, gus)); |
5246 | } |
5247 | |
5248 | /* |
5249 | diff --git a/sound/isa/sb/sb16_main.c b/sound/isa/sb/sb16_main.c |
5250 | index 0768bbf8fd713..679f9f48370ff 100644 |
5251 | --- a/sound/isa/sb/sb16_main.c |
5252 | +++ b/sound/isa/sb/sb16_main.c |
5253 | @@ -864,14 +864,10 @@ int snd_sb16dsp_pcm(struct snd_sb *chip, int device) |
5254 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_sb16_playback_ops); |
5255 | snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_sb16_capture_ops); |
5256 | |
5257 | - if (chip->dma16 >= 0 && chip->dma8 != chip->dma16) { |
5258 | - err = snd_ctl_add(card, snd_ctl_new1( |
5259 | - &snd_sb16_dma_control, chip)); |
5260 | - if (err) |
5261 | - return err; |
5262 | - } else { |
5263 | + if (chip->dma16 >= 0 && chip->dma8 != chip->dma16) |
5264 | + snd_ctl_add(card, snd_ctl_new1(&snd_sb16_dma_control, chip)); |
5265 | + else |
5266 | pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX; |
5267 | - } |
5268 | |
5269 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
5270 | card->dev, |
5271 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
5272 | index d02c49e1686b6..b9fa2ee0a40cb 100644 |
5273 | --- a/sound/pci/hda/patch_realtek.c |
5274 | +++ b/sound/pci/hda/patch_realtek.c |
5275 | @@ -2593,6 +2593,28 @@ static const struct hda_model_fixup alc882_fixup_models[] = { |
5276 | {} |
5277 | }; |
5278 | |
5279 | +static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = { |
5280 | + SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950, |
5281 | + {0x14, 0x01014010}, |
5282 | + {0x15, 0x01011012}, |
5283 | + {0x16, 0x01016011}, |
5284 | + {0x18, 0x01a19040}, |
5285 | + {0x19, 0x02a19050}, |
5286 | + {0x1a, 0x0181304f}, |
5287 | + {0x1b, 0x0221401f}, |
5288 | + {0x1e, 0x01456130}), |
5289 | + SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950, |
5290 | + {0x14, 0x01015010}, |
5291 | + {0x15, 0x01011012}, |
5292 | + {0x16, 0x01011011}, |
5293 | + {0x18, 0x01a11040}, |
5294 | + {0x19, 0x02a19050}, |
5295 | + {0x1a, 0x0181104f}, |
5296 | + {0x1b, 0x0221401f}, |
5297 | + {0x1e, 0x01451130}), |
5298 | + {} |
5299 | +}; |
5300 | + |
5301 | /* |
5302 | * BIOS auto configuration |
5303 | */ |
5304 | @@ -2634,6 +2656,7 @@ static int patch_alc882(struct hda_codec *codec) |
5305 | |
5306 | snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl, |
5307 | alc882_fixups); |
5308 | + snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true); |
5309 | snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE); |
5310 | |
5311 | alc_auto_parse_customize_define(codec); |
5312 | diff --git a/sound/soc/codecs/cs35l33.c b/sound/soc/codecs/cs35l33.c |
5313 | index 6042194d95d3e..8894369e329af 100644 |
5314 | --- a/sound/soc/codecs/cs35l33.c |
5315 | +++ b/sound/soc/codecs/cs35l33.c |
5316 | @@ -1201,6 +1201,7 @@ static int cs35l33_i2c_probe(struct i2c_client *i2c_client, |
5317 | dev_err(&i2c_client->dev, |
5318 | "CS35L33 Device ID (%X). Expected ID %X\n", |
5319 | devid, CS35L33_CHIP_ID); |
5320 | + ret = -EINVAL; |
5321 | goto err_enable; |
5322 | } |
5323 | |
5324 | diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c |
5325 | index dcd2acb2c3cef..5faf8877137ae 100644 |
5326 | --- a/sound/soc/codecs/cs42l42.c |
5327 | +++ b/sound/soc/codecs/cs42l42.c |
5328 | @@ -398,6 +398,9 @@ static const struct regmap_config cs42l42_regmap = { |
5329 | .reg_defaults = cs42l42_reg_defaults, |
5330 | .num_reg_defaults = ARRAY_SIZE(cs42l42_reg_defaults), |
5331 | .cache_type = REGCACHE_RBTREE, |
5332 | + |
5333 | + .use_single_read = true, |
5334 | + .use_single_write = true, |
5335 | }; |
5336 | |
5337 | static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false); |
5338 | diff --git a/sound/soc/codecs/cs43130.c b/sound/soc/codecs/cs43130.c |
5339 | index 7fb34422a2a4b..8f70dee958786 100644 |
5340 | --- a/sound/soc/codecs/cs43130.c |
5341 | +++ b/sound/soc/codecs/cs43130.c |
5342 | @@ -1735,6 +1735,14 @@ static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL); |
5343 | static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL); |
5344 | static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL); |
5345 | |
5346 | +static struct attribute *hpload_attrs[] = { |
5347 | + &dev_attr_hpload_dc_l.attr, |
5348 | + &dev_attr_hpload_dc_r.attr, |
5349 | + &dev_attr_hpload_ac_l.attr, |
5350 | + &dev_attr_hpload_ac_r.attr, |
5351 | +}; |
5352 | +ATTRIBUTE_GROUPS(hpload); |
5353 | + |
5354 | static struct reg_sequence hp_en_cal_seq[] = { |
5355 | {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL}, |
5356 | {CS43130_HP_MEAS_LOAD_1, 0}, |
5357 | @@ -2302,25 +2310,15 @@ static int cs43130_probe(struct snd_soc_component *component) |
5358 | |
5359 | cs43130->hpload_done = false; |
5360 | if (cs43130->dc_meas) { |
5361 | - ret = device_create_file(component->dev, &dev_attr_hpload_dc_l); |
5362 | - if (ret < 0) |
5363 | - return ret; |
5364 | - |
5365 | - ret = device_create_file(component->dev, &dev_attr_hpload_dc_r); |
5366 | - if (ret < 0) |
5367 | - return ret; |
5368 | - |
5369 | - ret = device_create_file(component->dev, &dev_attr_hpload_ac_l); |
5370 | - if (ret < 0) |
5371 | - return ret; |
5372 | - |
5373 | - ret = device_create_file(component->dev, &dev_attr_hpload_ac_r); |
5374 | - if (ret < 0) |
5375 | + ret = sysfs_create_groups(&component->dev->kobj, hpload_groups); |
5376 | + if (ret) |
5377 | return ret; |
5378 | |
5379 | cs43130->wq = create_singlethread_workqueue("cs43130_hp"); |
5380 | - if (!cs43130->wq) |
5381 | + if (!cs43130->wq) { |
5382 | + sysfs_remove_groups(&component->dev->kobj, hpload_groups); |
5383 | return -ENOMEM; |
5384 | + } |
5385 | INIT_WORK(&cs43130->work, cs43130_imp_meas); |
5386 | } |
5387 | |
5388 | diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c |
5389 | index 2040fecea17b3..5251818e10d33 100644 |
5390 | --- a/sound/usb/mixer_quirks.c |
5391 | +++ b/sound/usb/mixer_quirks.c |
5392 | @@ -2268,7 +2268,7 @@ int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer) |
5393 | case USB_ID(0x1235, 0x8203): /* Focusrite Scarlett 6i6 2nd Gen */ |
5394 | case USB_ID(0x1235, 0x8204): /* Focusrite Scarlett 18i8 2nd Gen */ |
5395 | case USB_ID(0x1235, 0x8201): /* Focusrite Scarlett 18i20 2nd Gen */ |
5396 | - err = snd_scarlett_gen2_controls_create(mixer); |
5397 | + err = snd_scarlett_gen2_init(mixer); |
5398 | break; |
5399 | |
5400 | case USB_ID(0x041e, 0x323b): /* Creative Sound Blaster E1 */ |
5401 | diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c |
5402 | index 74c00c905d245..7a10c9e22c46c 100644 |
5403 | --- a/sound/usb/mixer_scarlett_gen2.c |
5404 | +++ b/sound/usb/mixer_scarlett_gen2.c |
5405 | @@ -635,7 +635,7 @@ static int scarlett2_usb( |
5406 | /* send a second message to get the response */ |
5407 | |
5408 | err = snd_usb_ctl_msg(mixer->chip->dev, |
5409 | - usb_sndctrlpipe(mixer->chip->dev, 0), |
5410 | + usb_rcvctrlpipe(mixer->chip->dev, 0), |
5411 | SCARLETT2_USB_VENDOR_SPECIFIC_CMD_RESP, |
5412 | USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN, |
5413 | 0, |
5414 | @@ -1997,38 +1997,11 @@ static int scarlett2_mixer_status_create(struct usb_mixer_interface *mixer) |
5415 | return usb_submit_urb(mixer->urb, GFP_KERNEL); |
5416 | } |
5417 | |
5418 | -/* Entry point */ |
5419 | -int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer) |
5420 | +static int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer, |
5421 | + const struct scarlett2_device_info *info) |
5422 | { |
5423 | - const struct scarlett2_device_info *info; |
5424 | int err; |
5425 | |
5426 | - /* only use UAC_VERSION_2 */ |
5427 | - if (!mixer->protocol) |
5428 | - return 0; |
5429 | - |
5430 | - switch (mixer->chip->usb_id) { |
5431 | - case USB_ID(0x1235, 0x8203): |
5432 | - info = &s6i6_gen2_info; |
5433 | - break; |
5434 | - case USB_ID(0x1235, 0x8204): |
5435 | - info = &s18i8_gen2_info; |
5436 | - break; |
5437 | - case USB_ID(0x1235, 0x8201): |
5438 | - info = &s18i20_gen2_info; |
5439 | - break; |
5440 | - default: /* device not (yet) supported */ |
5441 | - return -EINVAL; |
5442 | - } |
5443 | - |
5444 | - if (!(mixer->chip->setup & SCARLETT2_ENABLE)) { |
5445 | - usb_audio_err(mixer->chip, |
5446 | - "Focusrite Scarlett Gen 2 Mixer Driver disabled; " |
5447 | - "use options snd_usb_audio device_setup=1 " |
5448 | - "to enable and report any issues to g@b4.vu"); |
5449 | - return 0; |
5450 | - } |
5451 | - |
5452 | /* Initialise private data, routing, sequence number */ |
5453 | err = scarlett2_init_private(mixer, info); |
5454 | if (err < 0) |
5455 | @@ -2073,3 +2046,51 @@ int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer) |
5456 | |
5457 | return 0; |
5458 | } |
5459 | + |
5460 | +int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer) |
5461 | +{ |
5462 | + struct snd_usb_audio *chip = mixer->chip; |
5463 | + const struct scarlett2_device_info *info; |
5464 | + int err; |
5465 | + |
5466 | + /* only use UAC_VERSION_2 */ |
5467 | + if (!mixer->protocol) |
5468 | + return 0; |
5469 | + |
5470 | + switch (chip->usb_id) { |
5471 | + case USB_ID(0x1235, 0x8203): |
5472 | + info = &s6i6_gen2_info; |
5473 | + break; |
5474 | + case USB_ID(0x1235, 0x8204): |
5475 | + info = &s18i8_gen2_info; |
5476 | + break; |
5477 | + case USB_ID(0x1235, 0x8201): |
5478 | + info = &s18i20_gen2_info; |
5479 | + break; |
5480 | + default: /* device not (yet) supported */ |
5481 | + return -EINVAL; |
5482 | + } |
5483 | + |
5484 | + if (!(chip->setup & SCARLETT2_ENABLE)) { |
5485 | + usb_audio_info(chip, |
5486 | + "Focusrite Scarlett Gen 2 Mixer Driver disabled; " |
5487 | + "use options snd_usb_audio vid=0x%04x pid=0x%04x " |
5488 | + "device_setup=1 to enable and report any issues " |
5489 | + "to g@b4.vu", |
5490 | + USB_ID_VENDOR(chip->usb_id), |
5491 | + USB_ID_PRODUCT(chip->usb_id)); |
5492 | + return 0; |
5493 | + } |
5494 | + |
5495 | + usb_audio_info(chip, |
5496 | + "Focusrite Scarlett Gen 2 Mixer Driver enabled pid=0x%04x", |
5497 | + USB_ID_PRODUCT(chip->usb_id)); |
5498 | + |
5499 | + err = snd_scarlett_gen2_controls_create(mixer, info); |
5500 | + if (err < 0) |
5501 | + usb_audio_err(mixer->chip, |
5502 | + "Error initialising Scarlett Mixer Driver: %d", |
5503 | + err); |
5504 | + |
5505 | + return err; |
5506 | +} |
5507 | diff --git a/sound/usb/mixer_scarlett_gen2.h b/sound/usb/mixer_scarlett_gen2.h |
5508 | index 52e1dad77afd4..668c6b0cb50a6 100644 |
5509 | --- a/sound/usb/mixer_scarlett_gen2.h |
5510 | +++ b/sound/usb/mixer_scarlett_gen2.h |
5511 | @@ -2,6 +2,6 @@ |
5512 | #ifndef __USB_MIXER_SCARLETT_GEN2_H |
5513 | #define __USB_MIXER_SCARLETT_GEN2_H |
5514 | |
5515 | -int snd_scarlett_gen2_controls_create(struct usb_mixer_interface *mixer); |
5516 | +int snd_scarlett_gen2_init(struct usb_mixer_interface *mixer); |
5517 | |
5518 | #endif /* __USB_MIXER_SCARLETT_GEN2_H */ |
5519 | diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c |
5520 | index f4a0d72246cb7..47f57f5829d3a 100644 |
5521 | --- a/tools/perf/pmu-events/jevents.c |
5522 | +++ b/tools/perf/pmu-events/jevents.c |
5523 | @@ -862,7 +862,7 @@ static int get_maxfds(void) |
5524 | struct rlimit rlim; |
5525 | |
5526 | if (getrlimit(RLIMIT_NOFILE, &rlim) == 0) |
5527 | - return min((int)rlim.rlim_max / 2, 512); |
5528 | + return min(rlim.rlim_max / 2, (rlim_t)512); |
5529 | |
5530 | return 512; |
5531 | } |
5532 | diff --git a/tools/perf/scripts/python/exported-sql-viewer.py b/tools/perf/scripts/python/exported-sql-viewer.py |
5533 | index 04217e8f535aa..01acf3ea7619d 100755 |
5534 | --- a/tools/perf/scripts/python/exported-sql-viewer.py |
5535 | +++ b/tools/perf/scripts/python/exported-sql-viewer.py |
5536 | @@ -91,6 +91,11 @@ |
5537 | from __future__ import print_function |
5538 | |
5539 | import sys |
5540 | +# Only change warnings if the python -W option was not used |
5541 | +if not sys.warnoptions: |
5542 | + import warnings |
5543 | + # PySide2 causes deprecation warnings, ignore them. |
5544 | + warnings.filterwarnings("ignore", category=DeprecationWarning) |
5545 | import argparse |
5546 | import weakref |
5547 | import threading |
5548 | @@ -122,8 +127,9 @@ if pyside_version_1: |
5549 | from PySide.QtGui import * |
5550 | from PySide.QtSql import * |
5551 | |
5552 | -from decimal import * |
5553 | -from ctypes import * |
5554 | +from decimal import Decimal, ROUND_HALF_UP |
5555 | +from ctypes import CDLL, Structure, create_string_buffer, addressof, sizeof, \ |
5556 | + c_void_p, c_bool, c_byte, c_char, c_int, c_uint, c_longlong, c_ulonglong |
5557 | from multiprocessing import Process, Array, Value, Event |
5558 | |
5559 | # xrange is range in Python3 |
5560 | @@ -2495,7 +2501,7 @@ def CopyTableCellsToClipboard(view, as_csv=False, with_hdr=False): |
5561 | if with_hdr: |
5562 | model = indexes[0].model() |
5563 | for col in range(min_col, max_col + 1): |
5564 | - val = model.headerData(col, Qt.Horizontal) |
5565 | + val = model.headerData(col, Qt.Horizontal, Qt.DisplayRole) |
5566 | if as_csv: |
5567 | text += sep + ToCSValue(val) |
5568 | sep = "," |
5569 | diff --git a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
5570 | index 7f53b63088b2c..eab7e8ef67899 100644 |
5571 | --- a/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
5572 | +++ b/tools/perf/util/intel-pt-decoder/intel-pt-decoder.c |
5573 | @@ -1090,6 +1090,8 @@ static bool intel_pt_fup_event(struct intel_pt_decoder *decoder) |
5574 | decoder->set_fup_tx_flags = false; |
5575 | decoder->tx_flags = decoder->fup_tx_flags; |
5576 | decoder->state.type = INTEL_PT_TRANSACTION; |
5577 | + if (decoder->fup_tx_flags & INTEL_PT_ABORT_TX) |
5578 | + decoder->state.type |= INTEL_PT_BRANCH; |
5579 | decoder->state.from_ip = decoder->ip; |
5580 | decoder->state.to_ip = 0; |
5581 | decoder->state.flags = decoder->fup_tx_flags; |
5582 | @@ -1164,8 +1166,10 @@ static int intel_pt_walk_fup(struct intel_pt_decoder *decoder) |
5583 | return 0; |
5584 | if (err == -EAGAIN || |
5585 | intel_pt_fup_with_nlip(decoder, &intel_pt_insn, ip, err)) { |
5586 | + bool no_tip = decoder->pkt_state != INTEL_PT_STATE_FUP; |
5587 | + |
5588 | decoder->pkt_state = INTEL_PT_STATE_IN_SYNC; |
5589 | - if (intel_pt_fup_event(decoder)) |
5590 | + if (intel_pt_fup_event(decoder) && no_tip) |
5591 | return 0; |
5592 | return -EAGAIN; |
5593 | } |
5594 | diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c |
5595 | index d0e0ce11faf58..9b7cc5f909b07 100644 |
5596 | --- a/tools/perf/util/intel-pt.c |
5597 | +++ b/tools/perf/util/intel-pt.c |
5598 | @@ -602,8 +602,10 @@ static int intel_pt_walk_next_insn(struct intel_pt_insn *intel_pt_insn, |
5599 | |
5600 | *ip += intel_pt_insn->length; |
5601 | |
5602 | - if (to_ip && *ip == to_ip) |
5603 | + if (to_ip && *ip == to_ip) { |
5604 | + intel_pt_insn->length = 0; |
5605 | goto out_no_cache; |
5606 | + } |
5607 | |
5608 | if (*ip >= al.map->end) |
5609 | break; |
5610 | @@ -991,6 +993,7 @@ static void intel_pt_set_pid_tid_cpu(struct intel_pt *pt, |
5611 | |
5612 | static void intel_pt_sample_flags(struct intel_pt_queue *ptq) |
5613 | { |
5614 | + ptq->insn_len = 0; |
5615 | if (ptq->state->flags & INTEL_PT_ABORT_TX) { |
5616 | ptq->flags = PERF_IP_FLAG_BRANCH | PERF_IP_FLAG_TX_ABORT; |
5617 | } else if (ptq->state->flags & INTEL_PT_ASYNC) { |
5618 | diff --git a/tools/testing/selftests/gpio/Makefile b/tools/testing/selftests/gpio/Makefile |
5619 | index 0bb80619db580..f270b6abd64c5 100644 |
5620 | --- a/tools/testing/selftests/gpio/Makefile |
5621 | +++ b/tools/testing/selftests/gpio/Makefile |
5622 | @@ -11,22 +11,24 @@ LDLIBS += $(MOUNT_LDLIBS) |
5623 | |
5624 | TEST_PROGS := gpio-mockup.sh |
5625 | TEST_FILES := gpio-mockup-sysfs.sh |
5626 | -TEST_PROGS_EXTENDED := gpio-mockup-chardev |
5627 | +TEST_GEN_PROGS_EXTENDED := gpio-mockup-chardev |
5628 | |
5629 | -GPIODIR := $(realpath ../../../gpio) |
5630 | -GPIOOBJ := gpio-utils.o |
5631 | +KSFT_KHDR_INSTALL := 1 |
5632 | +include ../lib.mk |
5633 | |
5634 | -all: $(TEST_PROGS_EXTENDED) |
5635 | +GPIODIR := $(realpath ../../../gpio) |
5636 | +GPIOOUT := $(OUTPUT)/tools-gpio/ |
5637 | +GPIOOBJ := $(GPIOOUT)/gpio-utils.o |
5638 | |
5639 | override define CLEAN |
5640 | - $(RM) $(TEST_PROGS_EXTENDED) |
5641 | - $(MAKE) -C $(GPIODIR) OUTPUT=$(GPIODIR)/ clean |
5642 | + $(RM) $(TEST_GEN_PROGS_EXTENDED) |
5643 | + $(RM) -rf $(GPIOOUT) |
5644 | endef |
5645 | |
5646 | -KSFT_KHDR_INSTALL := 1 |
5647 | -include ../lib.mk |
5648 | +$(TEST_GEN_PROGS_EXTENDED): $(GPIOOBJ) |
5649 | |
5650 | -$(TEST_PROGS_EXTENDED): $(GPIODIR)/$(GPIOOBJ) |
5651 | +$(GPIOOUT): |
5652 | + mkdir -p $@ |
5653 | |
5654 | -$(GPIODIR)/$(GPIOOBJ): |
5655 | - $(MAKE) OUTPUT=$(GPIODIR)/ -C $(GPIODIR) |
5656 | +$(GPIOOBJ): $(GPIOOUT) |
5657 | + $(MAKE) OUTPUT=$(GPIOOUT) -C $(GPIODIR) |