Annotation of /trunk/kernel-alx/patches-5.4/0209-5.4.110-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(hide annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 178834 byte(s)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 178834 byte(s)
-add missing
1 | niro | 3637 | diff --git a/Makefile b/Makefile |
2 | index e037662c369ba..b028b5ead5f7e 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 109 | ||
10 | +SUBLEVEL = 110 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/powerpc/include/asm/cpu_has_feature.h b/arch/powerpc/include/asm/cpu_has_feature.h | ||
15 | index 7897d16e09904..727d4b3219379 100644 | ||
16 | --- a/arch/powerpc/include/asm/cpu_has_feature.h | ||
17 | +++ b/arch/powerpc/include/asm/cpu_has_feature.h | ||
18 | @@ -7,7 +7,7 @@ | ||
19 | #include <linux/bug.h> | ||
20 | #include <asm/cputable.h> | ||
21 | |||
22 | -static inline bool early_cpu_has_feature(unsigned long feature) | ||
23 | +static __always_inline bool early_cpu_has_feature(unsigned long feature) | ||
24 | { | ||
25 | return !!((CPU_FTRS_ALWAYS & feature) || | ||
26 | (CPU_FTRS_POSSIBLE & cur_cpu_spec->cpu_features & feature)); | ||
27 | @@ -46,7 +46,7 @@ static __always_inline bool cpu_has_feature(unsigned long feature) | ||
28 | return static_branch_likely(&cpu_feature_keys[i]); | ||
29 | } | ||
30 | #else | ||
31 | -static inline bool cpu_has_feature(unsigned long feature) | ||
32 | +static __always_inline bool cpu_has_feature(unsigned long feature) | ||
33 | { | ||
34 | return early_cpu_has_feature(feature); | ||
35 | } | ||
36 | diff --git a/arch/xtensa/kernel/coprocessor.S b/arch/xtensa/kernel/coprocessor.S | ||
37 | index 80828b95a51f0..d956f87fcb095 100644 | ||
38 | --- a/arch/xtensa/kernel/coprocessor.S | ||
39 | +++ b/arch/xtensa/kernel/coprocessor.S | ||
40 | @@ -108,37 +108,6 @@ | ||
41 | |||
42 | .previous | ||
43 | |||
44 | -/* | ||
45 | - * coprocessor_flush(struct thread_info*, index) | ||
46 | - * a2 a3 | ||
47 | - * | ||
48 | - * Save coprocessor registers for coprocessor 'index'. | ||
49 | - * The register values are saved to or loaded from the coprocessor area | ||
50 | - * inside the task_info structure. | ||
51 | - * | ||
52 | - * Note that this function doesn't update the coprocessor_owner information! | ||
53 | - * | ||
54 | - */ | ||
55 | - | ||
56 | -ENTRY(coprocessor_flush) | ||
57 | - | ||
58 | - /* reserve 4 bytes on stack to save a0 */ | ||
59 | - abi_entry(4) | ||
60 | - | ||
61 | - s32i a0, a1, 0 | ||
62 | - movi a0, .Lsave_cp_regs_jump_table | ||
63 | - addx8 a3, a3, a0 | ||
64 | - l32i a4, a3, 4 | ||
65 | - l32i a3, a3, 0 | ||
66 | - add a2, a2, a4 | ||
67 | - beqz a3, 1f | ||
68 | - callx0 a3 | ||
69 | -1: l32i a0, a1, 0 | ||
70 | - | ||
71 | - abi_ret(4) | ||
72 | - | ||
73 | -ENDPROC(coprocessor_flush) | ||
74 | - | ||
75 | /* | ||
76 | * Entry condition: | ||
77 | * | ||
78 | @@ -261,6 +230,39 @@ ENTRY(fast_coprocessor) | ||
79 | |||
80 | ENDPROC(fast_coprocessor) | ||
81 | |||
82 | + .text | ||
83 | + | ||
84 | +/* | ||
85 | + * coprocessor_flush(struct thread_info*, index) | ||
86 | + * a2 a3 | ||
87 | + * | ||
88 | + * Save coprocessor registers for coprocessor 'index'. | ||
89 | + * The register values are saved to or loaded from the coprocessor area | ||
90 | + * inside the task_info structure. | ||
91 | + * | ||
92 | + * Note that this function doesn't update the coprocessor_owner information! | ||
93 | + * | ||
94 | + */ | ||
95 | + | ||
96 | +ENTRY(coprocessor_flush) | ||
97 | + | ||
98 | + /* reserve 4 bytes on stack to save a0 */ | ||
99 | + abi_entry(4) | ||
100 | + | ||
101 | + s32i a0, a1, 0 | ||
102 | + movi a0, .Lsave_cp_regs_jump_table | ||
103 | + addx8 a3, a3, a0 | ||
104 | + l32i a4, a3, 4 | ||
105 | + l32i a3, a3, 0 | ||
106 | + add a2, a2, a4 | ||
107 | + beqz a3, 1f | ||
108 | + callx0 a3 | ||
109 | +1: l32i a0, a1, 0 | ||
110 | + | ||
111 | + abi_ret(4) | ||
112 | + | ||
113 | +ENDPROC(coprocessor_flush) | ||
114 | + | ||
115 | .data | ||
116 | |||
117 | ENTRY(coprocessor_owner) | ||
118 | diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c | ||
119 | index e0c4ef06ca917..94785083c018a 100644 | ||
120 | --- a/drivers/base/power/runtime.c | ||
121 | +++ b/drivers/base/power/runtime.c | ||
122 | @@ -1663,8 +1663,8 @@ void pm_runtime_get_suppliers(struct device *dev) | ||
123 | device_links_read_lock_held()) | ||
124 | if (link->flags & DL_FLAG_PM_RUNTIME) { | ||
125 | link->supplier_preactivated = true; | ||
126 | - refcount_inc(&link->rpm_active); | ||
127 | pm_runtime_get_sync(link->supplier); | ||
128 | + refcount_inc(&link->rpm_active); | ||
129 | } | ||
130 | |||
131 | device_links_read_unlock(idx); | ||
132 | @@ -1677,6 +1677,8 @@ void pm_runtime_get_suppliers(struct device *dev) | ||
133 | void pm_runtime_put_suppliers(struct device *dev) | ||
134 | { | ||
135 | struct device_link *link; | ||
136 | + unsigned long flags; | ||
137 | + bool put; | ||
138 | int idx; | ||
139 | |||
140 | idx = device_links_read_lock(); | ||
141 | @@ -1685,7 +1687,11 @@ void pm_runtime_put_suppliers(struct device *dev) | ||
142 | device_links_read_lock_held()) | ||
143 | if (link->supplier_preactivated) { | ||
144 | link->supplier_preactivated = false; | ||
145 | - if (refcount_dec_not_one(&link->rpm_active)) | ||
146 | + spin_lock_irqsave(&dev->power.lock, flags); | ||
147 | + put = pm_runtime_status_suspended(dev) && | ||
148 | + refcount_dec_not_one(&link->rpm_active); | ||
149 | + spin_unlock_irqrestore(&dev->power.lock, flags); | ||
150 | + if (put) | ||
151 | pm_runtime_put(link->supplier); | ||
152 | } | ||
153 | |||
154 | diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c | ||
155 | index e055893fd5c39..5c9e156cd0862 100644 | ||
156 | --- a/drivers/extcon/extcon.c | ||
157 | +++ b/drivers/extcon/extcon.c | ||
158 | @@ -1241,6 +1241,7 @@ int extcon_dev_register(struct extcon_dev *edev) | ||
159 | sizeof(*edev->nh), GFP_KERNEL); | ||
160 | if (!edev->nh) { | ||
161 | ret = -ENOMEM; | ||
162 | + device_unregister(&edev->dev); | ||
163 | goto err_dev; | ||
164 | } | ||
165 | |||
166 | diff --git a/drivers/firewire/nosy.c b/drivers/firewire/nosy.c | ||
167 | index 0cc7466736773..9ee747a85ee49 100644 | ||
168 | --- a/drivers/firewire/nosy.c | ||
169 | +++ b/drivers/firewire/nosy.c | ||
170 | @@ -346,6 +346,7 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
171 | struct client *client = file->private_data; | ||
172 | spinlock_t *client_list_lock = &client->lynx->client_list_lock; | ||
173 | struct nosy_stats stats; | ||
174 | + int ret; | ||
175 | |||
176 | switch (cmd) { | ||
177 | case NOSY_IOC_GET_STATS: | ||
178 | @@ -360,11 +361,15 @@ nosy_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
179 | return 0; | ||
180 | |||
181 | case NOSY_IOC_START: | ||
182 | + ret = -EBUSY; | ||
183 | spin_lock_irq(client_list_lock); | ||
184 | - list_add_tail(&client->link, &client->lynx->client_list); | ||
185 | + if (list_empty(&client->link)) { | ||
186 | + list_add_tail(&client->link, &client->lynx->client_list); | ||
187 | + ret = 0; | ||
188 | + } | ||
189 | spin_unlock_irq(client_list_lock); | ||
190 | |||
191 | - return 0; | ||
192 | + return ret; | ||
193 | |||
194 | case NOSY_IOC_STOP: | ||
195 | spin_lock_irq(client_list_lock); | ||
196 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
197 | index 6335bd4ae374a..fb47ddc6f7f4e 100644 | ||
198 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
199 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
200 | @@ -2123,8 +2123,8 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | ||
201 | uint64_t eaddr; | ||
202 | |||
203 | /* validate the parameters */ | ||
204 | - if (saddr & AMDGPU_GPU_PAGE_MASK || offset & AMDGPU_GPU_PAGE_MASK || | ||
205 | - size == 0 || size & AMDGPU_GPU_PAGE_MASK) | ||
206 | + if (saddr & ~PAGE_MASK || offset & ~PAGE_MASK || | ||
207 | + size == 0 || size & ~PAGE_MASK) | ||
208 | return -EINVAL; | ||
209 | |||
210 | /* make sure object fit at this offset */ | ||
211 | @@ -2188,8 +2188,8 @@ int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev, | ||
212 | int r; | ||
213 | |||
214 | /* validate the parameters */ | ||
215 | - if (saddr & AMDGPU_GPU_PAGE_MASK || offset & AMDGPU_GPU_PAGE_MASK || | ||
216 | - size == 0 || size & AMDGPU_GPU_PAGE_MASK) | ||
217 | + if (saddr & ~PAGE_MASK || offset & ~PAGE_MASK || | ||
218 | + size == 0 || size & ~PAGE_MASK) | ||
219 | return -EINVAL; | ||
220 | |||
221 | /* make sure object fit at this offset */ | ||
222 | @@ -2333,7 +2333,7 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev, | ||
223 | after->start = eaddr + 1; | ||
224 | after->last = tmp->last; | ||
225 | after->offset = tmp->offset; | ||
226 | - after->offset += after->start - tmp->start; | ||
227 | + after->offset += (after->start - tmp->start) << PAGE_SHIFT; | ||
228 | after->flags = tmp->flags; | ||
229 | after->bo_va = tmp->bo_va; | ||
230 | list_add(&after->list, &tmp->bo_va->invalids); | ||
231 | diff --git a/drivers/net/can/Makefile b/drivers/net/can/Makefile | ||
232 | index 22164300122d5..a2b4463d84802 100644 | ||
233 | --- a/drivers/net/can/Makefile | ||
234 | +++ b/drivers/net/can/Makefile | ||
235 | @@ -7,12 +7,7 @@ obj-$(CONFIG_CAN_VCAN) += vcan.o | ||
236 | obj-$(CONFIG_CAN_VXCAN) += vxcan.o | ||
237 | obj-$(CONFIG_CAN_SLCAN) += slcan.o | ||
238 | |||
239 | -obj-$(CONFIG_CAN_DEV) += can-dev.o | ||
240 | -can-dev-y += dev.o | ||
241 | -can-dev-y += rx-offload.o | ||
242 | - | ||
243 | -can-dev-$(CONFIG_CAN_LEDS) += led.o | ||
244 | - | ||
245 | +obj-y += dev/ | ||
246 | obj-y += rcar/ | ||
247 | obj-y += spi/ | ||
248 | obj-y += usb/ | ||
249 | diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c | ||
250 | deleted file mode 100644 | ||
251 | index 1e0c1a05df82d..0000000000000 | ||
252 | --- a/drivers/net/can/dev.c | ||
253 | +++ /dev/null | ||
254 | @@ -1,1310 +0,0 @@ | ||
255 | -// SPDX-License-Identifier: GPL-2.0-only | ||
256 | -/* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix | ||
257 | - * Copyright (C) 2006 Andrey Volkov, Varma Electronics | ||
258 | - * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com> | ||
259 | - */ | ||
260 | - | ||
261 | -#include <linux/module.h> | ||
262 | -#include <linux/kernel.h> | ||
263 | -#include <linux/slab.h> | ||
264 | -#include <linux/netdevice.h> | ||
265 | -#include <linux/if_arp.h> | ||
266 | -#include <linux/workqueue.h> | ||
267 | -#include <linux/can.h> | ||
268 | -#include <linux/can/can-ml.h> | ||
269 | -#include <linux/can/dev.h> | ||
270 | -#include <linux/can/skb.h> | ||
271 | -#include <linux/can/netlink.h> | ||
272 | -#include <linux/can/led.h> | ||
273 | -#include <linux/of.h> | ||
274 | -#include <net/rtnetlink.h> | ||
275 | - | ||
276 | -#define MOD_DESC "CAN device driver interface" | ||
277 | - | ||
278 | -MODULE_DESCRIPTION(MOD_DESC); | ||
279 | -MODULE_LICENSE("GPL v2"); | ||
280 | -MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | ||
281 | - | ||
282 | -/* CAN DLC to real data length conversion helpers */ | ||
283 | - | ||
284 | -static const u8 dlc2len[] = {0, 1, 2, 3, 4, 5, 6, 7, | ||
285 | - 8, 12, 16, 20, 24, 32, 48, 64}; | ||
286 | - | ||
287 | -/* get data length from can_dlc with sanitized can_dlc */ | ||
288 | -u8 can_dlc2len(u8 can_dlc) | ||
289 | -{ | ||
290 | - return dlc2len[can_dlc & 0x0F]; | ||
291 | -} | ||
292 | -EXPORT_SYMBOL_GPL(can_dlc2len); | ||
293 | - | ||
294 | -static const u8 len2dlc[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, /* 0 - 8 */ | ||
295 | - 9, 9, 9, 9, /* 9 - 12 */ | ||
296 | - 10, 10, 10, 10, /* 13 - 16 */ | ||
297 | - 11, 11, 11, 11, /* 17 - 20 */ | ||
298 | - 12, 12, 12, 12, /* 21 - 24 */ | ||
299 | - 13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */ | ||
300 | - 14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */ | ||
301 | - 14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */ | ||
302 | - 15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */ | ||
303 | - 15, 15, 15, 15, 15, 15, 15, 15}; /* 57 - 64 */ | ||
304 | - | ||
305 | -/* map the sanitized data length to an appropriate data length code */ | ||
306 | -u8 can_len2dlc(u8 len) | ||
307 | -{ | ||
308 | - if (unlikely(len > 64)) | ||
309 | - return 0xF; | ||
310 | - | ||
311 | - return len2dlc[len]; | ||
312 | -} | ||
313 | -EXPORT_SYMBOL_GPL(can_len2dlc); | ||
314 | - | ||
315 | -#ifdef CONFIG_CAN_CALC_BITTIMING | ||
316 | -#define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */ | ||
317 | -#define CAN_CALC_SYNC_SEG 1 | ||
318 | - | ||
319 | -/* Bit-timing calculation derived from: | ||
320 | - * | ||
321 | - * Code based on LinCAN sources and H8S2638 project | ||
322 | - * Copyright 2004-2006 Pavel Pisa - DCE FELK CVUT cz | ||
323 | - * Copyright 2005 Stanislav Marek | ||
324 | - * email: pisa@cmp.felk.cvut.cz | ||
325 | - * | ||
326 | - * Calculates proper bit-timing parameters for a specified bit-rate | ||
327 | - * and sample-point, which can then be used to set the bit-timing | ||
328 | - * registers of the CAN controller. You can find more information | ||
329 | - * in the header file linux/can/netlink.h. | ||
330 | - */ | ||
331 | -static int | ||
332 | -can_update_sample_point(const struct can_bittiming_const *btc, | ||
333 | - unsigned int sample_point_nominal, unsigned int tseg, | ||
334 | - unsigned int *tseg1_ptr, unsigned int *tseg2_ptr, | ||
335 | - unsigned int *sample_point_error_ptr) | ||
336 | -{ | ||
337 | - unsigned int sample_point_error, best_sample_point_error = UINT_MAX; | ||
338 | - unsigned int sample_point, best_sample_point = 0; | ||
339 | - unsigned int tseg1, tseg2; | ||
340 | - int i; | ||
341 | - | ||
342 | - for (i = 0; i <= 1; i++) { | ||
343 | - tseg2 = tseg + CAN_CALC_SYNC_SEG - | ||
344 | - (sample_point_nominal * (tseg + CAN_CALC_SYNC_SEG)) / | ||
345 | - 1000 - i; | ||
346 | - tseg2 = clamp(tseg2, btc->tseg2_min, btc->tseg2_max); | ||
347 | - tseg1 = tseg - tseg2; | ||
348 | - if (tseg1 > btc->tseg1_max) { | ||
349 | - tseg1 = btc->tseg1_max; | ||
350 | - tseg2 = tseg - tseg1; | ||
351 | - } | ||
352 | - | ||
353 | - sample_point = 1000 * (tseg + CAN_CALC_SYNC_SEG - tseg2) / | ||
354 | - (tseg + CAN_CALC_SYNC_SEG); | ||
355 | - sample_point_error = abs(sample_point_nominal - sample_point); | ||
356 | - | ||
357 | - if (sample_point <= sample_point_nominal && | ||
358 | - sample_point_error < best_sample_point_error) { | ||
359 | - best_sample_point = sample_point; | ||
360 | - best_sample_point_error = sample_point_error; | ||
361 | - *tseg1_ptr = tseg1; | ||
362 | - *tseg2_ptr = tseg2; | ||
363 | - } | ||
364 | - } | ||
365 | - | ||
366 | - if (sample_point_error_ptr) | ||
367 | - *sample_point_error_ptr = best_sample_point_error; | ||
368 | - | ||
369 | - return best_sample_point; | ||
370 | -} | ||
371 | - | ||
372 | -static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
373 | - const struct can_bittiming_const *btc) | ||
374 | -{ | ||
375 | - struct can_priv *priv = netdev_priv(dev); | ||
376 | - unsigned int bitrate; /* current bitrate */ | ||
377 | - unsigned int bitrate_error; /* difference between current and nominal value */ | ||
378 | - unsigned int best_bitrate_error = UINT_MAX; | ||
379 | - unsigned int sample_point_error; /* difference between current and nominal value */ | ||
380 | - unsigned int best_sample_point_error = UINT_MAX; | ||
381 | - unsigned int sample_point_nominal; /* nominal sample point */ | ||
382 | - unsigned int best_tseg = 0; /* current best value for tseg */ | ||
383 | - unsigned int best_brp = 0; /* current best value for brp */ | ||
384 | - unsigned int brp, tsegall, tseg, tseg1 = 0, tseg2 = 0; | ||
385 | - u64 v64; | ||
386 | - | ||
387 | - /* Use CiA recommended sample points */ | ||
388 | - if (bt->sample_point) { | ||
389 | - sample_point_nominal = bt->sample_point; | ||
390 | - } else { | ||
391 | - if (bt->bitrate > 800000) | ||
392 | - sample_point_nominal = 750; | ||
393 | - else if (bt->bitrate > 500000) | ||
394 | - sample_point_nominal = 800; | ||
395 | - else | ||
396 | - sample_point_nominal = 875; | ||
397 | - } | ||
398 | - | ||
399 | - /* tseg even = round down, odd = round up */ | ||
400 | - for (tseg = (btc->tseg1_max + btc->tseg2_max) * 2 + 1; | ||
401 | - tseg >= (btc->tseg1_min + btc->tseg2_min) * 2; tseg--) { | ||
402 | - tsegall = CAN_CALC_SYNC_SEG + tseg / 2; | ||
403 | - | ||
404 | - /* Compute all possible tseg choices (tseg=tseg1+tseg2) */ | ||
405 | - brp = priv->clock.freq / (tsegall * bt->bitrate) + tseg % 2; | ||
406 | - | ||
407 | - /* choose brp step which is possible in system */ | ||
408 | - brp = (brp / btc->brp_inc) * btc->brp_inc; | ||
409 | - if (brp < btc->brp_min || brp > btc->brp_max) | ||
410 | - continue; | ||
411 | - | ||
412 | - bitrate = priv->clock.freq / (brp * tsegall); | ||
413 | - bitrate_error = abs(bt->bitrate - bitrate); | ||
414 | - | ||
415 | - /* tseg brp biterror */ | ||
416 | - if (bitrate_error > best_bitrate_error) | ||
417 | - continue; | ||
418 | - | ||
419 | - /* reset sample point error if we have a better bitrate */ | ||
420 | - if (bitrate_error < best_bitrate_error) | ||
421 | - best_sample_point_error = UINT_MAX; | ||
422 | - | ||
423 | - can_update_sample_point(btc, sample_point_nominal, tseg / 2, | ||
424 | - &tseg1, &tseg2, &sample_point_error); | ||
425 | - if (sample_point_error > best_sample_point_error) | ||
426 | - continue; | ||
427 | - | ||
428 | - best_sample_point_error = sample_point_error; | ||
429 | - best_bitrate_error = bitrate_error; | ||
430 | - best_tseg = tseg / 2; | ||
431 | - best_brp = brp; | ||
432 | - | ||
433 | - if (bitrate_error == 0 && sample_point_error == 0) | ||
434 | - break; | ||
435 | - } | ||
436 | - | ||
437 | - if (best_bitrate_error) { | ||
438 | - /* Error in one-tenth of a percent */ | ||
439 | - v64 = (u64)best_bitrate_error * 1000; | ||
440 | - do_div(v64, bt->bitrate); | ||
441 | - bitrate_error = (u32)v64; | ||
442 | - if (bitrate_error > CAN_CALC_MAX_ERROR) { | ||
443 | - netdev_err(dev, | ||
444 | - "bitrate error %d.%d%% too high\n", | ||
445 | - bitrate_error / 10, bitrate_error % 10); | ||
446 | - return -EDOM; | ||
447 | - } | ||
448 | - netdev_warn(dev, "bitrate error %d.%d%%\n", | ||
449 | - bitrate_error / 10, bitrate_error % 10); | ||
450 | - } | ||
451 | - | ||
452 | - /* real sample point */ | ||
453 | - bt->sample_point = can_update_sample_point(btc, sample_point_nominal, | ||
454 | - best_tseg, &tseg1, &tseg2, | ||
455 | - NULL); | ||
456 | - | ||
457 | - v64 = (u64)best_brp * 1000 * 1000 * 1000; | ||
458 | - do_div(v64, priv->clock.freq); | ||
459 | - bt->tq = (u32)v64; | ||
460 | - bt->prop_seg = tseg1 / 2; | ||
461 | - bt->phase_seg1 = tseg1 - bt->prop_seg; | ||
462 | - bt->phase_seg2 = tseg2; | ||
463 | - | ||
464 | - /* check for sjw user settings */ | ||
465 | - if (!bt->sjw || !btc->sjw_max) { | ||
466 | - bt->sjw = 1; | ||
467 | - } else { | ||
468 | - /* bt->sjw is at least 1 -> sanitize upper bound to sjw_max */ | ||
469 | - if (bt->sjw > btc->sjw_max) | ||
470 | - bt->sjw = btc->sjw_max; | ||
471 | - /* bt->sjw must not be higher than tseg2 */ | ||
472 | - if (tseg2 < bt->sjw) | ||
473 | - bt->sjw = tseg2; | ||
474 | - } | ||
475 | - | ||
476 | - bt->brp = best_brp; | ||
477 | - | ||
478 | - /* real bitrate */ | ||
479 | - bt->bitrate = priv->clock.freq / | ||
480 | - (bt->brp * (CAN_CALC_SYNC_SEG + tseg1 + tseg2)); | ||
481 | - | ||
482 | - return 0; | ||
483 | -} | ||
484 | -#else /* !CONFIG_CAN_CALC_BITTIMING */ | ||
485 | -static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
486 | - const struct can_bittiming_const *btc) | ||
487 | -{ | ||
488 | - netdev_err(dev, "bit-timing calculation not available\n"); | ||
489 | - return -EINVAL; | ||
490 | -} | ||
491 | -#endif /* CONFIG_CAN_CALC_BITTIMING */ | ||
492 | - | ||
493 | -/* Checks the validity of the specified bit-timing parameters prop_seg, | ||
494 | - * phase_seg1, phase_seg2 and sjw and tries to determine the bitrate | ||
495 | - * prescaler value brp. You can find more information in the header | ||
496 | - * file linux/can/netlink.h. | ||
497 | - */ | ||
498 | -static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
499 | - const struct can_bittiming_const *btc) | ||
500 | -{ | ||
501 | - struct can_priv *priv = netdev_priv(dev); | ||
502 | - int tseg1, alltseg; | ||
503 | - u64 brp64; | ||
504 | - | ||
505 | - tseg1 = bt->prop_seg + bt->phase_seg1; | ||
506 | - if (!bt->sjw) | ||
507 | - bt->sjw = 1; | ||
508 | - if (bt->sjw > btc->sjw_max || | ||
509 | - tseg1 < btc->tseg1_min || tseg1 > btc->tseg1_max || | ||
510 | - bt->phase_seg2 < btc->tseg2_min || bt->phase_seg2 > btc->tseg2_max) | ||
511 | - return -ERANGE; | ||
512 | - | ||
513 | - brp64 = (u64)priv->clock.freq * (u64)bt->tq; | ||
514 | - if (btc->brp_inc > 1) | ||
515 | - do_div(brp64, btc->brp_inc); | ||
516 | - brp64 += 500000000UL - 1; | ||
517 | - do_div(brp64, 1000000000UL); /* the practicable BRP */ | ||
518 | - if (btc->brp_inc > 1) | ||
519 | - brp64 *= btc->brp_inc; | ||
520 | - bt->brp = (u32)brp64; | ||
521 | - | ||
522 | - if (bt->brp < btc->brp_min || bt->brp > btc->brp_max) | ||
523 | - return -EINVAL; | ||
524 | - | ||
525 | - alltseg = bt->prop_seg + bt->phase_seg1 + bt->phase_seg2 + 1; | ||
526 | - bt->bitrate = priv->clock.freq / (bt->brp * alltseg); | ||
527 | - bt->sample_point = ((tseg1 + 1) * 1000) / alltseg; | ||
528 | - | ||
529 | - return 0; | ||
530 | -} | ||
531 | - | ||
532 | -/* Checks the validity of predefined bitrate settings */ | ||
533 | -static int | ||
534 | -can_validate_bitrate(struct net_device *dev, struct can_bittiming *bt, | ||
535 | - const u32 *bitrate_const, | ||
536 | - const unsigned int bitrate_const_cnt) | ||
537 | -{ | ||
538 | - struct can_priv *priv = netdev_priv(dev); | ||
539 | - unsigned int i; | ||
540 | - | ||
541 | - for (i = 0; i < bitrate_const_cnt; i++) { | ||
542 | - if (bt->bitrate == bitrate_const[i]) | ||
543 | - break; | ||
544 | - } | ||
545 | - | ||
546 | - if (i >= priv->bitrate_const_cnt) | ||
547 | - return -EINVAL; | ||
548 | - | ||
549 | - return 0; | ||
550 | -} | ||
551 | - | ||
552 | -static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
553 | - const struct can_bittiming_const *btc, | ||
554 | - const u32 *bitrate_const, | ||
555 | - const unsigned int bitrate_const_cnt) | ||
556 | -{ | ||
557 | - int err; | ||
558 | - | ||
559 | - /* Depending on the given can_bittiming parameter structure the CAN | ||
560 | - * timing parameters are calculated based on the provided bitrate OR | ||
561 | - * alternatively the CAN timing parameters (tq, prop_seg, etc.) are | ||
562 | - * provided directly which are then checked and fixed up. | ||
563 | - */ | ||
564 | - if (!bt->tq && bt->bitrate && btc) | ||
565 | - err = can_calc_bittiming(dev, bt, btc); | ||
566 | - else if (bt->tq && !bt->bitrate && btc) | ||
567 | - err = can_fixup_bittiming(dev, bt, btc); | ||
568 | - else if (!bt->tq && bt->bitrate && bitrate_const) | ||
569 | - err = can_validate_bitrate(dev, bt, bitrate_const, | ||
570 | - bitrate_const_cnt); | ||
571 | - else | ||
572 | - err = -EINVAL; | ||
573 | - | ||
574 | - return err; | ||
575 | -} | ||
576 | - | ||
577 | -static void can_update_state_error_stats(struct net_device *dev, | ||
578 | - enum can_state new_state) | ||
579 | -{ | ||
580 | - struct can_priv *priv = netdev_priv(dev); | ||
581 | - | ||
582 | - if (new_state <= priv->state) | ||
583 | - return; | ||
584 | - | ||
585 | - switch (new_state) { | ||
586 | - case CAN_STATE_ERROR_WARNING: | ||
587 | - priv->can_stats.error_warning++; | ||
588 | - break; | ||
589 | - case CAN_STATE_ERROR_PASSIVE: | ||
590 | - priv->can_stats.error_passive++; | ||
591 | - break; | ||
592 | - case CAN_STATE_BUS_OFF: | ||
593 | - priv->can_stats.bus_off++; | ||
594 | - break; | ||
595 | - default: | ||
596 | - break; | ||
597 | - } | ||
598 | -} | ||
599 | - | ||
600 | -static int can_tx_state_to_frame(struct net_device *dev, enum can_state state) | ||
601 | -{ | ||
602 | - switch (state) { | ||
603 | - case CAN_STATE_ERROR_ACTIVE: | ||
604 | - return CAN_ERR_CRTL_ACTIVE; | ||
605 | - case CAN_STATE_ERROR_WARNING: | ||
606 | - return CAN_ERR_CRTL_TX_WARNING; | ||
607 | - case CAN_STATE_ERROR_PASSIVE: | ||
608 | - return CAN_ERR_CRTL_TX_PASSIVE; | ||
609 | - default: | ||
610 | - return 0; | ||
611 | - } | ||
612 | -} | ||
613 | - | ||
614 | -static int can_rx_state_to_frame(struct net_device *dev, enum can_state state) | ||
615 | -{ | ||
616 | - switch (state) { | ||
617 | - case CAN_STATE_ERROR_ACTIVE: | ||
618 | - return CAN_ERR_CRTL_ACTIVE; | ||
619 | - case CAN_STATE_ERROR_WARNING: | ||
620 | - return CAN_ERR_CRTL_RX_WARNING; | ||
621 | - case CAN_STATE_ERROR_PASSIVE: | ||
622 | - return CAN_ERR_CRTL_RX_PASSIVE; | ||
623 | - default: | ||
624 | - return 0; | ||
625 | - } | ||
626 | -} | ||
627 | - | ||
628 | -void can_change_state(struct net_device *dev, struct can_frame *cf, | ||
629 | - enum can_state tx_state, enum can_state rx_state) | ||
630 | -{ | ||
631 | - struct can_priv *priv = netdev_priv(dev); | ||
632 | - enum can_state new_state = max(tx_state, rx_state); | ||
633 | - | ||
634 | - if (unlikely(new_state == priv->state)) { | ||
635 | - netdev_warn(dev, "%s: oops, state did not change", __func__); | ||
636 | - return; | ||
637 | - } | ||
638 | - | ||
639 | - netdev_dbg(dev, "New error state: %d\n", new_state); | ||
640 | - | ||
641 | - can_update_state_error_stats(dev, new_state); | ||
642 | - priv->state = new_state; | ||
643 | - | ||
644 | - if (!cf) | ||
645 | - return; | ||
646 | - | ||
647 | - if (unlikely(new_state == CAN_STATE_BUS_OFF)) { | ||
648 | - cf->can_id |= CAN_ERR_BUSOFF; | ||
649 | - return; | ||
650 | - } | ||
651 | - | ||
652 | - cf->can_id |= CAN_ERR_CRTL; | ||
653 | - cf->data[1] |= tx_state >= rx_state ? | ||
654 | - can_tx_state_to_frame(dev, tx_state) : 0; | ||
655 | - cf->data[1] |= tx_state <= rx_state ? | ||
656 | - can_rx_state_to_frame(dev, rx_state) : 0; | ||
657 | -} | ||
658 | -EXPORT_SYMBOL_GPL(can_change_state); | ||
659 | - | ||
660 | -/* Local echo of CAN messages | ||
661 | - * | ||
662 | - * CAN network devices *should* support a local echo functionality | ||
663 | - * (see Documentation/networking/can.rst). To test the handling of CAN | ||
664 | - * interfaces that do not support the local echo both driver types are | ||
665 | - * implemented. In the case that the driver does not support the echo | ||
666 | - * the IFF_ECHO remains clear in dev->flags. This causes the PF_CAN core | ||
667 | - * to perform the echo as a fallback solution. | ||
668 | - */ | ||
669 | -static void can_flush_echo_skb(struct net_device *dev) | ||
670 | -{ | ||
671 | - struct can_priv *priv = netdev_priv(dev); | ||
672 | - struct net_device_stats *stats = &dev->stats; | ||
673 | - int i; | ||
674 | - | ||
675 | - for (i = 0; i < priv->echo_skb_max; i++) { | ||
676 | - if (priv->echo_skb[i]) { | ||
677 | - kfree_skb(priv->echo_skb[i]); | ||
678 | - priv->echo_skb[i] = NULL; | ||
679 | - stats->tx_dropped++; | ||
680 | - stats->tx_aborted_errors++; | ||
681 | - } | ||
682 | - } | ||
683 | -} | ||
684 | - | ||
685 | -/* Put the skb on the stack to be looped backed locally lateron | ||
686 | - * | ||
687 | - * The function is typically called in the start_xmit function | ||
688 | - * of the device driver. The driver must protect access to | ||
689 | - * priv->echo_skb, if necessary. | ||
690 | - */ | ||
691 | -void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, | ||
692 | - unsigned int idx) | ||
693 | -{ | ||
694 | - struct can_priv *priv = netdev_priv(dev); | ||
695 | - | ||
696 | - BUG_ON(idx >= priv->echo_skb_max); | ||
697 | - | ||
698 | - /* check flag whether this packet has to be looped back */ | ||
699 | - if (!(dev->flags & IFF_ECHO) || skb->pkt_type != PACKET_LOOPBACK || | ||
700 | - (skb->protocol != htons(ETH_P_CAN) && | ||
701 | - skb->protocol != htons(ETH_P_CANFD))) { | ||
702 | - kfree_skb(skb); | ||
703 | - return; | ||
704 | - } | ||
705 | - | ||
706 | - if (!priv->echo_skb[idx]) { | ||
707 | - skb = can_create_echo_skb(skb); | ||
708 | - if (!skb) | ||
709 | - return; | ||
710 | - | ||
711 | - /* make settings for echo to reduce code in irq context */ | ||
712 | - skb->pkt_type = PACKET_BROADCAST; | ||
713 | - skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
714 | - skb->dev = dev; | ||
715 | - | ||
716 | - /* save this skb for tx interrupt echo handling */ | ||
717 | - priv->echo_skb[idx] = skb; | ||
718 | - } else { | ||
719 | - /* locking problem with netif_stop_queue() ?? */ | ||
720 | - netdev_err(dev, "%s: BUG! echo_skb is occupied!\n", __func__); | ||
721 | - kfree_skb(skb); | ||
722 | - } | ||
723 | -} | ||
724 | -EXPORT_SYMBOL_GPL(can_put_echo_skb); | ||
725 | - | ||
726 | -struct sk_buff * | ||
727 | -__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr) | ||
728 | -{ | ||
729 | - struct can_priv *priv = netdev_priv(dev); | ||
730 | - | ||
731 | - if (idx >= priv->echo_skb_max) { | ||
732 | - netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n", | ||
733 | - __func__, idx, priv->echo_skb_max); | ||
734 | - return NULL; | ||
735 | - } | ||
736 | - | ||
737 | - if (priv->echo_skb[idx]) { | ||
738 | - /* Using "struct canfd_frame::len" for the frame | ||
739 | - * length is supported on both CAN and CANFD frames. | ||
740 | - */ | ||
741 | - struct sk_buff *skb = priv->echo_skb[idx]; | ||
742 | - struct canfd_frame *cf = (struct canfd_frame *)skb->data; | ||
743 | - | ||
744 | - /* get the real payload length for netdev statistics */ | ||
745 | - if (cf->can_id & CAN_RTR_FLAG) | ||
746 | - *len_ptr = 0; | ||
747 | - else | ||
748 | - *len_ptr = cf->len; | ||
749 | - | ||
750 | - priv->echo_skb[idx] = NULL; | ||
751 | - | ||
752 | - return skb; | ||
753 | - } | ||
754 | - | ||
755 | - return NULL; | ||
756 | -} | ||
757 | - | ||
758 | -/* Get the skb from the stack and loop it back locally | ||
759 | - * | ||
760 | - * The function is typically called when the TX done interrupt | ||
761 | - * is handled in the device driver. The driver must protect | ||
762 | - * access to priv->echo_skb, if necessary. | ||
763 | - */ | ||
764 | -unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) | ||
765 | -{ | ||
766 | - struct sk_buff *skb; | ||
767 | - u8 len; | ||
768 | - | ||
769 | - skb = __can_get_echo_skb(dev, idx, &len); | ||
770 | - if (!skb) | ||
771 | - return 0; | ||
772 | - | ||
773 | - skb_get(skb); | ||
774 | - if (netif_rx(skb) == NET_RX_SUCCESS) | ||
775 | - dev_consume_skb_any(skb); | ||
776 | - else | ||
777 | - dev_kfree_skb_any(skb); | ||
778 | - | ||
779 | - return len; | ||
780 | -} | ||
781 | -EXPORT_SYMBOL_GPL(can_get_echo_skb); | ||
782 | - | ||
783 | -/* Remove the skb from the stack and free it. | ||
784 | - * | ||
785 | - * The function is typically called when TX failed. | ||
786 | - */ | ||
787 | -void can_free_echo_skb(struct net_device *dev, unsigned int idx) | ||
788 | -{ | ||
789 | - struct can_priv *priv = netdev_priv(dev); | ||
790 | - | ||
791 | - BUG_ON(idx >= priv->echo_skb_max); | ||
792 | - | ||
793 | - if (priv->echo_skb[idx]) { | ||
794 | - dev_kfree_skb_any(priv->echo_skb[idx]); | ||
795 | - priv->echo_skb[idx] = NULL; | ||
796 | - } | ||
797 | -} | ||
798 | -EXPORT_SYMBOL_GPL(can_free_echo_skb); | ||
799 | - | ||
800 | -/* CAN device restart for bus-off recovery */ | ||
801 | -static void can_restart(struct net_device *dev) | ||
802 | -{ | ||
803 | - struct can_priv *priv = netdev_priv(dev); | ||
804 | - struct net_device_stats *stats = &dev->stats; | ||
805 | - struct sk_buff *skb; | ||
806 | - struct can_frame *cf; | ||
807 | - int err; | ||
808 | - | ||
809 | - BUG_ON(netif_carrier_ok(dev)); | ||
810 | - | ||
811 | - /* No synchronization needed because the device is bus-off and | ||
812 | - * no messages can come in or go out. | ||
813 | - */ | ||
814 | - can_flush_echo_skb(dev); | ||
815 | - | ||
816 | - /* send restart message upstream */ | ||
817 | - skb = alloc_can_err_skb(dev, &cf); | ||
818 | - if (!skb) { | ||
819 | - err = -ENOMEM; | ||
820 | - goto restart; | ||
821 | - } | ||
822 | - cf->can_id |= CAN_ERR_RESTARTED; | ||
823 | - | ||
824 | - stats->rx_packets++; | ||
825 | - stats->rx_bytes += cf->can_dlc; | ||
826 | - | ||
827 | - netif_rx_ni(skb); | ||
828 | - | ||
829 | -restart: | ||
830 | - netdev_dbg(dev, "restarted\n"); | ||
831 | - priv->can_stats.restarts++; | ||
832 | - | ||
833 | - /* Now restart the device */ | ||
834 | - err = priv->do_set_mode(dev, CAN_MODE_START); | ||
835 | - | ||
836 | - netif_carrier_on(dev); | ||
837 | - if (err) | ||
838 | - netdev_err(dev, "Error %d during restart", err); | ||
839 | -} | ||
840 | - | ||
841 | -static void can_restart_work(struct work_struct *work) | ||
842 | -{ | ||
843 | - struct delayed_work *dwork = to_delayed_work(work); | ||
844 | - struct can_priv *priv = container_of(dwork, struct can_priv, | ||
845 | - restart_work); | ||
846 | - | ||
847 | - can_restart(priv->dev); | ||
848 | -} | ||
849 | - | ||
850 | -int can_restart_now(struct net_device *dev) | ||
851 | -{ | ||
852 | - struct can_priv *priv = netdev_priv(dev); | ||
853 | - | ||
854 | - /* A manual restart is only permitted if automatic restart is | ||
855 | - * disabled and the device is in the bus-off state | ||
856 | - */ | ||
857 | - if (priv->restart_ms) | ||
858 | - return -EINVAL; | ||
859 | - if (priv->state != CAN_STATE_BUS_OFF) | ||
860 | - return -EBUSY; | ||
861 | - | ||
862 | - cancel_delayed_work_sync(&priv->restart_work); | ||
863 | - can_restart(dev); | ||
864 | - | ||
865 | - return 0; | ||
866 | -} | ||
867 | - | ||
868 | -/* CAN bus-off | ||
869 | - * | ||
870 | - * This functions should be called when the device goes bus-off to | ||
871 | - * tell the netif layer that no more packets can be sent or received. | ||
872 | - * If enabled, a timer is started to trigger bus-off recovery. | ||
873 | - */ | ||
874 | -void can_bus_off(struct net_device *dev) | ||
875 | -{ | ||
876 | - struct can_priv *priv = netdev_priv(dev); | ||
877 | - | ||
878 | - netdev_info(dev, "bus-off\n"); | ||
879 | - | ||
880 | - netif_carrier_off(dev); | ||
881 | - | ||
882 | - if (priv->restart_ms) | ||
883 | - schedule_delayed_work(&priv->restart_work, | ||
884 | - msecs_to_jiffies(priv->restart_ms)); | ||
885 | -} | ||
886 | -EXPORT_SYMBOL_GPL(can_bus_off); | ||
887 | - | ||
888 | -static void can_setup(struct net_device *dev) | ||
889 | -{ | ||
890 | - dev->type = ARPHRD_CAN; | ||
891 | - dev->mtu = CAN_MTU; | ||
892 | - dev->hard_header_len = 0; | ||
893 | - dev->addr_len = 0; | ||
894 | - dev->tx_queue_len = 10; | ||
895 | - | ||
896 | - /* New-style flags. */ | ||
897 | - dev->flags = IFF_NOARP; | ||
898 | - dev->features = NETIF_F_HW_CSUM; | ||
899 | -} | ||
900 | - | ||
901 | -struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | ||
902 | -{ | ||
903 | - struct sk_buff *skb; | ||
904 | - | ||
905 | - skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + | ||
906 | - sizeof(struct can_frame)); | ||
907 | - if (unlikely(!skb)) | ||
908 | - return NULL; | ||
909 | - | ||
910 | - skb->protocol = htons(ETH_P_CAN); | ||
911 | - skb->pkt_type = PACKET_BROADCAST; | ||
912 | - skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
913 | - | ||
914 | - skb_reset_mac_header(skb); | ||
915 | - skb_reset_network_header(skb); | ||
916 | - skb_reset_transport_header(skb); | ||
917 | - | ||
918 | - can_skb_reserve(skb); | ||
919 | - can_skb_prv(skb)->ifindex = dev->ifindex; | ||
920 | - can_skb_prv(skb)->skbcnt = 0; | ||
921 | - | ||
922 | - *cf = skb_put_zero(skb, sizeof(struct can_frame)); | ||
923 | - | ||
924 | - return skb; | ||
925 | -} | ||
926 | -EXPORT_SYMBOL_GPL(alloc_can_skb); | ||
927 | - | ||
928 | -struct sk_buff *alloc_canfd_skb(struct net_device *dev, | ||
929 | - struct canfd_frame **cfd) | ||
930 | -{ | ||
931 | - struct sk_buff *skb; | ||
932 | - | ||
933 | - skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + | ||
934 | - sizeof(struct canfd_frame)); | ||
935 | - if (unlikely(!skb)) | ||
936 | - return NULL; | ||
937 | - | ||
938 | - skb->protocol = htons(ETH_P_CANFD); | ||
939 | - skb->pkt_type = PACKET_BROADCAST; | ||
940 | - skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
941 | - | ||
942 | - skb_reset_mac_header(skb); | ||
943 | - skb_reset_network_header(skb); | ||
944 | - skb_reset_transport_header(skb); | ||
945 | - | ||
946 | - can_skb_reserve(skb); | ||
947 | - can_skb_prv(skb)->ifindex = dev->ifindex; | ||
948 | - can_skb_prv(skb)->skbcnt = 0; | ||
949 | - | ||
950 | - *cfd = skb_put_zero(skb, sizeof(struct canfd_frame)); | ||
951 | - | ||
952 | - return skb; | ||
953 | -} | ||
954 | -EXPORT_SYMBOL_GPL(alloc_canfd_skb); | ||
955 | - | ||
956 | -struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf) | ||
957 | -{ | ||
958 | - struct sk_buff *skb; | ||
959 | - | ||
960 | - skb = alloc_can_skb(dev, cf); | ||
961 | - if (unlikely(!skb)) | ||
962 | - return NULL; | ||
963 | - | ||
964 | - (*cf)->can_id = CAN_ERR_FLAG; | ||
965 | - (*cf)->can_dlc = CAN_ERR_DLC; | ||
966 | - | ||
967 | - return skb; | ||
968 | -} | ||
969 | -EXPORT_SYMBOL_GPL(alloc_can_err_skb); | ||
970 | - | ||
971 | -/* Allocate and setup space for the CAN network device */ | ||
972 | -struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max, | ||
973 | - unsigned int txqs, unsigned int rxqs) | ||
974 | -{ | ||
975 | - struct net_device *dev; | ||
976 | - struct can_priv *priv; | ||
977 | - int size; | ||
978 | - | ||
979 | - /* We put the driver's priv, the CAN mid layer priv and the | ||
980 | - * echo skb into the netdevice's priv. The memory layout for | ||
981 | - * the netdev_priv is like this: | ||
982 | - * | ||
983 | - * +-------------------------+ | ||
984 | - * | driver's priv | | ||
985 | - * +-------------------------+ | ||
986 | - * | struct can_ml_priv | | ||
987 | - * +-------------------------+ | ||
988 | - * | array of struct sk_buff | | ||
989 | - * +-------------------------+ | ||
990 | - */ | ||
991 | - | ||
992 | - size = ALIGN(sizeof_priv, NETDEV_ALIGN) + sizeof(struct can_ml_priv); | ||
993 | - | ||
994 | - if (echo_skb_max) | ||
995 | - size = ALIGN(size, sizeof(struct sk_buff *)) + | ||
996 | - echo_skb_max * sizeof(struct sk_buff *); | ||
997 | - | ||
998 | - dev = alloc_netdev_mqs(size, "can%d", NET_NAME_UNKNOWN, can_setup, | ||
999 | - txqs, rxqs); | ||
1000 | - if (!dev) | ||
1001 | - return NULL; | ||
1002 | - | ||
1003 | - priv = netdev_priv(dev); | ||
1004 | - priv->dev = dev; | ||
1005 | - | ||
1006 | - dev->ml_priv = (void *)priv + ALIGN(sizeof_priv, NETDEV_ALIGN); | ||
1007 | - | ||
1008 | - if (echo_skb_max) { | ||
1009 | - priv->echo_skb_max = echo_skb_max; | ||
1010 | - priv->echo_skb = (void *)priv + | ||
1011 | - (size - echo_skb_max * sizeof(struct sk_buff *)); | ||
1012 | - } | ||
1013 | - | ||
1014 | - priv->state = CAN_STATE_STOPPED; | ||
1015 | - | ||
1016 | - INIT_DELAYED_WORK(&priv->restart_work, can_restart_work); | ||
1017 | - | ||
1018 | - return dev; | ||
1019 | -} | ||
1020 | -EXPORT_SYMBOL_GPL(alloc_candev_mqs); | ||
1021 | - | ||
1022 | -/* Free space of the CAN network device */ | ||
1023 | -void free_candev(struct net_device *dev) | ||
1024 | -{ | ||
1025 | - free_netdev(dev); | ||
1026 | -} | ||
1027 | -EXPORT_SYMBOL_GPL(free_candev); | ||
1028 | - | ||
1029 | -/* changing MTU and control mode for CAN/CANFD devices */ | ||
1030 | -int can_change_mtu(struct net_device *dev, int new_mtu) | ||
1031 | -{ | ||
1032 | - struct can_priv *priv = netdev_priv(dev); | ||
1033 | - | ||
1034 | - /* Do not allow changing the MTU while running */ | ||
1035 | - if (dev->flags & IFF_UP) | ||
1036 | - return -EBUSY; | ||
1037 | - | ||
1038 | - /* allow change of MTU according to the CANFD ability of the device */ | ||
1039 | - switch (new_mtu) { | ||
1040 | - case CAN_MTU: | ||
1041 | - /* 'CANFD-only' controllers can not switch to CAN_MTU */ | ||
1042 | - if (priv->ctrlmode_static & CAN_CTRLMODE_FD) | ||
1043 | - return -EINVAL; | ||
1044 | - | ||
1045 | - priv->ctrlmode &= ~CAN_CTRLMODE_FD; | ||
1046 | - break; | ||
1047 | - | ||
1048 | - case CANFD_MTU: | ||
1049 | - /* check for potential CANFD ability */ | ||
1050 | - if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD) && | ||
1051 | - !(priv->ctrlmode_static & CAN_CTRLMODE_FD)) | ||
1052 | - return -EINVAL; | ||
1053 | - | ||
1054 | - priv->ctrlmode |= CAN_CTRLMODE_FD; | ||
1055 | - break; | ||
1056 | - | ||
1057 | - default: | ||
1058 | - return -EINVAL; | ||
1059 | - } | ||
1060 | - | ||
1061 | - dev->mtu = new_mtu; | ||
1062 | - return 0; | ||
1063 | -} | ||
1064 | -EXPORT_SYMBOL_GPL(can_change_mtu); | ||
1065 | - | ||
1066 | -/* Common open function when the device gets opened. | ||
1067 | - * | ||
1068 | - * This function should be called in the open function of the device | ||
1069 | - * driver. | ||
1070 | - */ | ||
1071 | -int open_candev(struct net_device *dev) | ||
1072 | -{ | ||
1073 | - struct can_priv *priv = netdev_priv(dev); | ||
1074 | - | ||
1075 | - if (!priv->bittiming.bitrate) { | ||
1076 | - netdev_err(dev, "bit-timing not yet defined\n"); | ||
1077 | - return -EINVAL; | ||
1078 | - } | ||
1079 | - | ||
1080 | - /* For CAN FD the data bitrate has to be >= the arbitration bitrate */ | ||
1081 | - if ((priv->ctrlmode & CAN_CTRLMODE_FD) && | ||
1082 | - (!priv->data_bittiming.bitrate || | ||
1083 | - priv->data_bittiming.bitrate < priv->bittiming.bitrate)) { | ||
1084 | - netdev_err(dev, "incorrect/missing data bit-timing\n"); | ||
1085 | - return -EINVAL; | ||
1086 | - } | ||
1087 | - | ||
1088 | - /* Switch carrier on if device was stopped while in bus-off state */ | ||
1089 | - if (!netif_carrier_ok(dev)) | ||
1090 | - netif_carrier_on(dev); | ||
1091 | - | ||
1092 | - return 0; | ||
1093 | -} | ||
1094 | -EXPORT_SYMBOL_GPL(open_candev); | ||
1095 | - | ||
1096 | -#ifdef CONFIG_OF | ||
1097 | -/* Common function that can be used to understand the limitation of | ||
1098 | - * a transceiver when it provides no means to determine these limitations | ||
1099 | - * at runtime. | ||
1100 | - */ | ||
1101 | -void of_can_transceiver(struct net_device *dev) | ||
1102 | -{ | ||
1103 | - struct device_node *dn; | ||
1104 | - struct can_priv *priv = netdev_priv(dev); | ||
1105 | - struct device_node *np = dev->dev.parent->of_node; | ||
1106 | - int ret; | ||
1107 | - | ||
1108 | - dn = of_get_child_by_name(np, "can-transceiver"); | ||
1109 | - if (!dn) | ||
1110 | - return; | ||
1111 | - | ||
1112 | - ret = of_property_read_u32(dn, "max-bitrate", &priv->bitrate_max); | ||
1113 | - of_node_put(dn); | ||
1114 | - if ((ret && ret != -EINVAL) || (!ret && !priv->bitrate_max)) | ||
1115 | - netdev_warn(dev, "Invalid value for transceiver max bitrate. Ignoring bitrate limit.\n"); | ||
1116 | -} | ||
1117 | -EXPORT_SYMBOL_GPL(of_can_transceiver); | ||
1118 | -#endif | ||
1119 | - | ||
1120 | -/* Common close function for cleanup before the device gets closed. | ||
1121 | - * | ||
1122 | - * This function should be called in the close function of the device | ||
1123 | - * driver. | ||
1124 | - */ | ||
1125 | -void close_candev(struct net_device *dev) | ||
1126 | -{ | ||
1127 | - struct can_priv *priv = netdev_priv(dev); | ||
1128 | - | ||
1129 | - cancel_delayed_work_sync(&priv->restart_work); | ||
1130 | - can_flush_echo_skb(dev); | ||
1131 | -} | ||
1132 | -EXPORT_SYMBOL_GPL(close_candev); | ||
1133 | - | ||
1134 | -/* CAN netlink interface */ | ||
1135 | -static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = { | ||
1136 | - [IFLA_CAN_STATE] = { .type = NLA_U32 }, | ||
1137 | - [IFLA_CAN_CTRLMODE] = { .len = sizeof(struct can_ctrlmode) }, | ||
1138 | - [IFLA_CAN_RESTART_MS] = { .type = NLA_U32 }, | ||
1139 | - [IFLA_CAN_RESTART] = { .type = NLA_U32 }, | ||
1140 | - [IFLA_CAN_BITTIMING] = { .len = sizeof(struct can_bittiming) }, | ||
1141 | - [IFLA_CAN_BITTIMING_CONST] | ||
1142 | - = { .len = sizeof(struct can_bittiming_const) }, | ||
1143 | - [IFLA_CAN_CLOCK] = { .len = sizeof(struct can_clock) }, | ||
1144 | - [IFLA_CAN_BERR_COUNTER] = { .len = sizeof(struct can_berr_counter) }, | ||
1145 | - [IFLA_CAN_DATA_BITTIMING] | ||
1146 | - = { .len = sizeof(struct can_bittiming) }, | ||
1147 | - [IFLA_CAN_DATA_BITTIMING_CONST] | ||
1148 | - = { .len = sizeof(struct can_bittiming_const) }, | ||
1149 | - [IFLA_CAN_TERMINATION] = { .type = NLA_U16 }, | ||
1150 | -}; | ||
1151 | - | ||
1152 | -static int can_validate(struct nlattr *tb[], struct nlattr *data[], | ||
1153 | - struct netlink_ext_ack *extack) | ||
1154 | -{ | ||
1155 | - bool is_can_fd = false; | ||
1156 | - | ||
1157 | - /* Make sure that valid CAN FD configurations always consist of | ||
1158 | - * - nominal/arbitration bittiming | ||
1159 | - * - data bittiming | ||
1160 | - * - control mode with CAN_CTRLMODE_FD set | ||
1161 | - */ | ||
1162 | - | ||
1163 | - if (!data) | ||
1164 | - return 0; | ||
1165 | - | ||
1166 | - if (data[IFLA_CAN_CTRLMODE]) { | ||
1167 | - struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]); | ||
1168 | - | ||
1169 | - is_can_fd = cm->flags & cm->mask & CAN_CTRLMODE_FD; | ||
1170 | - } | ||
1171 | - | ||
1172 | - if (is_can_fd) { | ||
1173 | - if (!data[IFLA_CAN_BITTIMING] || !data[IFLA_CAN_DATA_BITTIMING]) | ||
1174 | - return -EOPNOTSUPP; | ||
1175 | - } | ||
1176 | - | ||
1177 | - if (data[IFLA_CAN_DATA_BITTIMING]) { | ||
1178 | - if (!is_can_fd || !data[IFLA_CAN_BITTIMING]) | ||
1179 | - return -EOPNOTSUPP; | ||
1180 | - } | ||
1181 | - | ||
1182 | - return 0; | ||
1183 | -} | ||
1184 | - | ||
1185 | -static int can_changelink(struct net_device *dev, struct nlattr *tb[], | ||
1186 | - struct nlattr *data[], | ||
1187 | - struct netlink_ext_ack *extack) | ||
1188 | -{ | ||
1189 | - struct can_priv *priv = netdev_priv(dev); | ||
1190 | - int err; | ||
1191 | - | ||
1192 | - /* We need synchronization with dev->stop() */ | ||
1193 | - ASSERT_RTNL(); | ||
1194 | - | ||
1195 | - if (data[IFLA_CAN_BITTIMING]) { | ||
1196 | - struct can_bittiming bt; | ||
1197 | - | ||
1198 | - /* Do not allow changing bittiming while running */ | ||
1199 | - if (dev->flags & IFF_UP) | ||
1200 | - return -EBUSY; | ||
1201 | - | ||
1202 | - /* Calculate bittiming parameters based on | ||
1203 | - * bittiming_const if set, otherwise pass bitrate | ||
1204 | - * directly via do_set_bitrate(). Bail out if neither | ||
1205 | - * is given. | ||
1206 | - */ | ||
1207 | - if (!priv->bittiming_const && !priv->do_set_bittiming) | ||
1208 | - return -EOPNOTSUPP; | ||
1209 | - | ||
1210 | - memcpy(&bt, nla_data(data[IFLA_CAN_BITTIMING]), sizeof(bt)); | ||
1211 | - err = can_get_bittiming(dev, &bt, | ||
1212 | - priv->bittiming_const, | ||
1213 | - priv->bitrate_const, | ||
1214 | - priv->bitrate_const_cnt); | ||
1215 | - if (err) | ||
1216 | - return err; | ||
1217 | - | ||
1218 | - if (priv->bitrate_max && bt.bitrate > priv->bitrate_max) { | ||
1219 | - netdev_err(dev, "arbitration bitrate surpasses transceiver capabilities of %d bps\n", | ||
1220 | - priv->bitrate_max); | ||
1221 | - return -EINVAL; | ||
1222 | - } | ||
1223 | - | ||
1224 | - memcpy(&priv->bittiming, &bt, sizeof(bt)); | ||
1225 | - | ||
1226 | - if (priv->do_set_bittiming) { | ||
1227 | - /* Finally, set the bit-timing registers */ | ||
1228 | - err = priv->do_set_bittiming(dev); | ||
1229 | - if (err) | ||
1230 | - return err; | ||
1231 | - } | ||
1232 | - } | ||
1233 | - | ||
1234 | - if (data[IFLA_CAN_CTRLMODE]) { | ||
1235 | - struct can_ctrlmode *cm; | ||
1236 | - u32 ctrlstatic; | ||
1237 | - u32 maskedflags; | ||
1238 | - | ||
1239 | - /* Do not allow changing controller mode while running */ | ||
1240 | - if (dev->flags & IFF_UP) | ||
1241 | - return -EBUSY; | ||
1242 | - cm = nla_data(data[IFLA_CAN_CTRLMODE]); | ||
1243 | - ctrlstatic = priv->ctrlmode_static; | ||
1244 | - maskedflags = cm->flags & cm->mask; | ||
1245 | - | ||
1246 | - /* check whether provided bits are allowed to be passed */ | ||
1247 | - if (cm->mask & ~(priv->ctrlmode_supported | ctrlstatic)) | ||
1248 | - return -EOPNOTSUPP; | ||
1249 | - | ||
1250 | - /* do not check for static fd-non-iso if 'fd' is disabled */ | ||
1251 | - if (!(maskedflags & CAN_CTRLMODE_FD)) | ||
1252 | - ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO; | ||
1253 | - | ||
1254 | - /* make sure static options are provided by configuration */ | ||
1255 | - if ((maskedflags & ctrlstatic) != ctrlstatic) | ||
1256 | - return -EOPNOTSUPP; | ||
1257 | - | ||
1258 | - /* clear bits to be modified and copy the flag values */ | ||
1259 | - priv->ctrlmode &= ~cm->mask; | ||
1260 | - priv->ctrlmode |= maskedflags; | ||
1261 | - | ||
1262 | - /* CAN_CTRLMODE_FD can only be set when driver supports FD */ | ||
1263 | - if (priv->ctrlmode & CAN_CTRLMODE_FD) | ||
1264 | - dev->mtu = CANFD_MTU; | ||
1265 | - else | ||
1266 | - dev->mtu = CAN_MTU; | ||
1267 | - } | ||
1268 | - | ||
1269 | - if (data[IFLA_CAN_RESTART_MS]) { | ||
1270 | - /* Do not allow changing restart delay while running */ | ||
1271 | - if (dev->flags & IFF_UP) | ||
1272 | - return -EBUSY; | ||
1273 | - priv->restart_ms = nla_get_u32(data[IFLA_CAN_RESTART_MS]); | ||
1274 | - } | ||
1275 | - | ||
1276 | - if (data[IFLA_CAN_RESTART]) { | ||
1277 | - /* Do not allow a restart while not running */ | ||
1278 | - if (!(dev->flags & IFF_UP)) | ||
1279 | - return -EINVAL; | ||
1280 | - err = can_restart_now(dev); | ||
1281 | - if (err) | ||
1282 | - return err; | ||
1283 | - } | ||
1284 | - | ||
1285 | - if (data[IFLA_CAN_DATA_BITTIMING]) { | ||
1286 | - struct can_bittiming dbt; | ||
1287 | - | ||
1288 | - /* Do not allow changing bittiming while running */ | ||
1289 | - if (dev->flags & IFF_UP) | ||
1290 | - return -EBUSY; | ||
1291 | - | ||
1292 | - /* Calculate bittiming parameters based on | ||
1293 | - * data_bittiming_const if set, otherwise pass bitrate | ||
1294 | - * directly via do_set_bitrate(). Bail out if neither | ||
1295 | - * is given. | ||
1296 | - */ | ||
1297 | - if (!priv->data_bittiming_const && !priv->do_set_data_bittiming) | ||
1298 | - return -EOPNOTSUPP; | ||
1299 | - | ||
1300 | - memcpy(&dbt, nla_data(data[IFLA_CAN_DATA_BITTIMING]), | ||
1301 | - sizeof(dbt)); | ||
1302 | - err = can_get_bittiming(dev, &dbt, | ||
1303 | - priv->data_bittiming_const, | ||
1304 | - priv->data_bitrate_const, | ||
1305 | - priv->data_bitrate_const_cnt); | ||
1306 | - if (err) | ||
1307 | - return err; | ||
1308 | - | ||
1309 | - if (priv->bitrate_max && dbt.bitrate > priv->bitrate_max) { | ||
1310 | - netdev_err(dev, "canfd data bitrate surpasses transceiver capabilities of %d bps\n", | ||
1311 | - priv->bitrate_max); | ||
1312 | - return -EINVAL; | ||
1313 | - } | ||
1314 | - | ||
1315 | - memcpy(&priv->data_bittiming, &dbt, sizeof(dbt)); | ||
1316 | - | ||
1317 | - if (priv->do_set_data_bittiming) { | ||
1318 | - /* Finally, set the bit-timing registers */ | ||
1319 | - err = priv->do_set_data_bittiming(dev); | ||
1320 | - if (err) | ||
1321 | - return err; | ||
1322 | - } | ||
1323 | - } | ||
1324 | - | ||
1325 | - if (data[IFLA_CAN_TERMINATION]) { | ||
1326 | - const u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]); | ||
1327 | - const unsigned int num_term = priv->termination_const_cnt; | ||
1328 | - unsigned int i; | ||
1329 | - | ||
1330 | - if (!priv->do_set_termination) | ||
1331 | - return -EOPNOTSUPP; | ||
1332 | - | ||
1333 | - /* check whether given value is supported by the interface */ | ||
1334 | - for (i = 0; i < num_term; i++) { | ||
1335 | - if (termval == priv->termination_const[i]) | ||
1336 | - break; | ||
1337 | - } | ||
1338 | - if (i >= num_term) | ||
1339 | - return -EINVAL; | ||
1340 | - | ||
1341 | - /* Finally, set the termination value */ | ||
1342 | - err = priv->do_set_termination(dev, termval); | ||
1343 | - if (err) | ||
1344 | - return err; | ||
1345 | - | ||
1346 | - priv->termination = termval; | ||
1347 | - } | ||
1348 | - | ||
1349 | - return 0; | ||
1350 | -} | ||
1351 | - | ||
1352 | -static size_t can_get_size(const struct net_device *dev) | ||
1353 | -{ | ||
1354 | - struct can_priv *priv = netdev_priv(dev); | ||
1355 | - size_t size = 0; | ||
1356 | - | ||
1357 | - if (priv->bittiming.bitrate) /* IFLA_CAN_BITTIMING */ | ||
1358 | - size += nla_total_size(sizeof(struct can_bittiming)); | ||
1359 | - if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ | ||
1360 | - size += nla_total_size(sizeof(struct can_bittiming_const)); | ||
1361 | - size += nla_total_size(sizeof(struct can_clock)); /* IFLA_CAN_CLOCK */ | ||
1362 | - size += nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */ | ||
1363 | - size += nla_total_size(sizeof(struct can_ctrlmode)); /* IFLA_CAN_CTRLMODE */ | ||
1364 | - size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ | ||
1365 | - if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */ | ||
1366 | - size += nla_total_size(sizeof(struct can_berr_counter)); | ||
1367 | - if (priv->data_bittiming.bitrate) /* IFLA_CAN_DATA_BITTIMING */ | ||
1368 | - size += nla_total_size(sizeof(struct can_bittiming)); | ||
1369 | - if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */ | ||
1370 | - size += nla_total_size(sizeof(struct can_bittiming_const)); | ||
1371 | - if (priv->termination_const) { | ||
1372 | - size += nla_total_size(sizeof(priv->termination)); /* IFLA_CAN_TERMINATION */ | ||
1373 | - size += nla_total_size(sizeof(*priv->termination_const) * /* IFLA_CAN_TERMINATION_CONST */ | ||
1374 | - priv->termination_const_cnt); | ||
1375 | - } | ||
1376 | - if (priv->bitrate_const) /* IFLA_CAN_BITRATE_CONST */ | ||
1377 | - size += nla_total_size(sizeof(*priv->bitrate_const) * | ||
1378 | - priv->bitrate_const_cnt); | ||
1379 | - if (priv->data_bitrate_const) /* IFLA_CAN_DATA_BITRATE_CONST */ | ||
1380 | - size += nla_total_size(sizeof(*priv->data_bitrate_const) * | ||
1381 | - priv->data_bitrate_const_cnt); | ||
1382 | - size += sizeof(priv->bitrate_max); /* IFLA_CAN_BITRATE_MAX */ | ||
1383 | - | ||
1384 | - return size; | ||
1385 | -} | ||
1386 | - | ||
1387 | -static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) | ||
1388 | -{ | ||
1389 | - struct can_priv *priv = netdev_priv(dev); | ||
1390 | - struct can_ctrlmode cm = {.flags = priv->ctrlmode}; | ||
1391 | - struct can_berr_counter bec = { }; | ||
1392 | - enum can_state state = priv->state; | ||
1393 | - | ||
1394 | - if (priv->do_get_state) | ||
1395 | - priv->do_get_state(dev, &state); | ||
1396 | - | ||
1397 | - if ((priv->bittiming.bitrate && | ||
1398 | - nla_put(skb, IFLA_CAN_BITTIMING, | ||
1399 | - sizeof(priv->bittiming), &priv->bittiming)) || | ||
1400 | - | ||
1401 | - (priv->bittiming_const && | ||
1402 | - nla_put(skb, IFLA_CAN_BITTIMING_CONST, | ||
1403 | - sizeof(*priv->bittiming_const), priv->bittiming_const)) || | ||
1404 | - | ||
1405 | - nla_put(skb, IFLA_CAN_CLOCK, sizeof(priv->clock), &priv->clock) || | ||
1406 | - nla_put_u32(skb, IFLA_CAN_STATE, state) || | ||
1407 | - nla_put(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm) || | ||
1408 | - nla_put_u32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms) || | ||
1409 | - | ||
1410 | - (priv->do_get_berr_counter && | ||
1411 | - !priv->do_get_berr_counter(dev, &bec) && | ||
1412 | - nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) || | ||
1413 | - | ||
1414 | - (priv->data_bittiming.bitrate && | ||
1415 | - nla_put(skb, IFLA_CAN_DATA_BITTIMING, | ||
1416 | - sizeof(priv->data_bittiming), &priv->data_bittiming)) || | ||
1417 | - | ||
1418 | - (priv->data_bittiming_const && | ||
1419 | - nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST, | ||
1420 | - sizeof(*priv->data_bittiming_const), | ||
1421 | - priv->data_bittiming_const)) || | ||
1422 | - | ||
1423 | - (priv->termination_const && | ||
1424 | - (nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) || | ||
1425 | - nla_put(skb, IFLA_CAN_TERMINATION_CONST, | ||
1426 | - sizeof(*priv->termination_const) * | ||
1427 | - priv->termination_const_cnt, | ||
1428 | - priv->termination_const))) || | ||
1429 | - | ||
1430 | - (priv->bitrate_const && | ||
1431 | - nla_put(skb, IFLA_CAN_BITRATE_CONST, | ||
1432 | - sizeof(*priv->bitrate_const) * | ||
1433 | - priv->bitrate_const_cnt, | ||
1434 | - priv->bitrate_const)) || | ||
1435 | - | ||
1436 | - (priv->data_bitrate_const && | ||
1437 | - nla_put(skb, IFLA_CAN_DATA_BITRATE_CONST, | ||
1438 | - sizeof(*priv->data_bitrate_const) * | ||
1439 | - priv->data_bitrate_const_cnt, | ||
1440 | - priv->data_bitrate_const)) || | ||
1441 | - | ||
1442 | - (nla_put(skb, IFLA_CAN_BITRATE_MAX, | ||
1443 | - sizeof(priv->bitrate_max), | ||
1444 | - &priv->bitrate_max)) | ||
1445 | - ) | ||
1446 | - | ||
1447 | - return -EMSGSIZE; | ||
1448 | - | ||
1449 | - return 0; | ||
1450 | -} | ||
1451 | - | ||
1452 | -static size_t can_get_xstats_size(const struct net_device *dev) | ||
1453 | -{ | ||
1454 | - return sizeof(struct can_device_stats); | ||
1455 | -} | ||
1456 | - | ||
1457 | -static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev) | ||
1458 | -{ | ||
1459 | - struct can_priv *priv = netdev_priv(dev); | ||
1460 | - | ||
1461 | - if (nla_put(skb, IFLA_INFO_XSTATS, | ||
1462 | - sizeof(priv->can_stats), &priv->can_stats)) | ||
1463 | - goto nla_put_failure; | ||
1464 | - return 0; | ||
1465 | - | ||
1466 | -nla_put_failure: | ||
1467 | - return -EMSGSIZE; | ||
1468 | -} | ||
1469 | - | ||
1470 | -static int can_newlink(struct net *src_net, struct net_device *dev, | ||
1471 | - struct nlattr *tb[], struct nlattr *data[], | ||
1472 | - struct netlink_ext_ack *extack) | ||
1473 | -{ | ||
1474 | - return -EOPNOTSUPP; | ||
1475 | -} | ||
1476 | - | ||
1477 | -static void can_dellink(struct net_device *dev, struct list_head *head) | ||
1478 | -{ | ||
1479 | -} | ||
1480 | - | ||
1481 | -static struct rtnl_link_ops can_link_ops __read_mostly = { | ||
1482 | - .kind = "can", | ||
1483 | - .netns_refund = true, | ||
1484 | - .maxtype = IFLA_CAN_MAX, | ||
1485 | - .policy = can_policy, | ||
1486 | - .setup = can_setup, | ||
1487 | - .validate = can_validate, | ||
1488 | - .newlink = can_newlink, | ||
1489 | - .changelink = can_changelink, | ||
1490 | - .dellink = can_dellink, | ||
1491 | - .get_size = can_get_size, | ||
1492 | - .fill_info = can_fill_info, | ||
1493 | - .get_xstats_size = can_get_xstats_size, | ||
1494 | - .fill_xstats = can_fill_xstats, | ||
1495 | -}; | ||
1496 | - | ||
1497 | -/* Register the CAN network device */ | ||
1498 | -int register_candev(struct net_device *dev) | ||
1499 | -{ | ||
1500 | - struct can_priv *priv = netdev_priv(dev); | ||
1501 | - | ||
1502 | - /* Ensure termination_const, termination_const_cnt and | ||
1503 | - * do_set_termination consistency. All must be either set or | ||
1504 | - * unset. | ||
1505 | - */ | ||
1506 | - if ((!priv->termination_const != !priv->termination_const_cnt) || | ||
1507 | - (!priv->termination_const != !priv->do_set_termination)) | ||
1508 | - return -EINVAL; | ||
1509 | - | ||
1510 | - if (!priv->bitrate_const != !priv->bitrate_const_cnt) | ||
1511 | - return -EINVAL; | ||
1512 | - | ||
1513 | - if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt) | ||
1514 | - return -EINVAL; | ||
1515 | - | ||
1516 | - dev->rtnl_link_ops = &can_link_ops; | ||
1517 | - netif_carrier_off(dev); | ||
1518 | - | ||
1519 | - return register_netdev(dev); | ||
1520 | -} | ||
1521 | -EXPORT_SYMBOL_GPL(register_candev); | ||
1522 | - | ||
1523 | -/* Unregister the CAN network device */ | ||
1524 | -void unregister_candev(struct net_device *dev) | ||
1525 | -{ | ||
1526 | - unregister_netdev(dev); | ||
1527 | -} | ||
1528 | -EXPORT_SYMBOL_GPL(unregister_candev); | ||
1529 | - | ||
1530 | -/* Test if a network device is a candev based device | ||
1531 | - * and return the can_priv* if so. | ||
1532 | - */ | ||
1533 | -struct can_priv *safe_candev_priv(struct net_device *dev) | ||
1534 | -{ | ||
1535 | - if (dev->type != ARPHRD_CAN || dev->rtnl_link_ops != &can_link_ops) | ||
1536 | - return NULL; | ||
1537 | - | ||
1538 | - return netdev_priv(dev); | ||
1539 | -} | ||
1540 | -EXPORT_SYMBOL_GPL(safe_candev_priv); | ||
1541 | - | ||
1542 | -static __init int can_dev_init(void) | ||
1543 | -{ | ||
1544 | - int err; | ||
1545 | - | ||
1546 | - can_led_notifier_init(); | ||
1547 | - | ||
1548 | - err = rtnl_link_register(&can_link_ops); | ||
1549 | - if (!err) | ||
1550 | - pr_info(MOD_DESC "\n"); | ||
1551 | - | ||
1552 | - return err; | ||
1553 | -} | ||
1554 | -module_init(can_dev_init); | ||
1555 | - | ||
1556 | -static __exit void can_dev_exit(void) | ||
1557 | -{ | ||
1558 | - rtnl_link_unregister(&can_link_ops); | ||
1559 | - | ||
1560 | - can_led_notifier_exit(); | ||
1561 | -} | ||
1562 | -module_exit(can_dev_exit); | ||
1563 | - | ||
1564 | -MODULE_ALIAS_RTNL_LINK("can"); | ||
1565 | diff --git a/drivers/net/can/dev/Makefile b/drivers/net/can/dev/Makefile | ||
1566 | new file mode 100644 | ||
1567 | index 0000000000000..cba92e6bcf6f5 | ||
1568 | --- /dev/null | ||
1569 | +++ b/drivers/net/can/dev/Makefile | ||
1570 | @@ -0,0 +1,7 @@ | ||
1571 | +# SPDX-License-Identifier: GPL-2.0 | ||
1572 | + | ||
1573 | +obj-$(CONFIG_CAN_DEV) += can-dev.o | ||
1574 | +can-dev-y += dev.o | ||
1575 | +can-dev-y += rx-offload.o | ||
1576 | + | ||
1577 | +can-dev-$(CONFIG_CAN_LEDS) += led.o | ||
1578 | diff --git a/drivers/net/can/dev/dev.c b/drivers/net/can/dev/dev.c | ||
1579 | new file mode 100644 | ||
1580 | index 0000000000000..322da89cb9c60 | ||
1581 | --- /dev/null | ||
1582 | +++ b/drivers/net/can/dev/dev.c | ||
1583 | @@ -0,0 +1,1312 @@ | ||
1584 | +// SPDX-License-Identifier: GPL-2.0-only | ||
1585 | +/* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix | ||
1586 | + * Copyright (C) 2006 Andrey Volkov, Varma Electronics | ||
1587 | + * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com> | ||
1588 | + */ | ||
1589 | + | ||
1590 | +#include <linux/module.h> | ||
1591 | +#include <linux/kernel.h> | ||
1592 | +#include <linux/slab.h> | ||
1593 | +#include <linux/netdevice.h> | ||
1594 | +#include <linux/if_arp.h> | ||
1595 | +#include <linux/workqueue.h> | ||
1596 | +#include <linux/can.h> | ||
1597 | +#include <linux/can/can-ml.h> | ||
1598 | +#include <linux/can/dev.h> | ||
1599 | +#include <linux/can/skb.h> | ||
1600 | +#include <linux/can/netlink.h> | ||
1601 | +#include <linux/can/led.h> | ||
1602 | +#include <linux/of.h> | ||
1603 | +#include <net/rtnetlink.h> | ||
1604 | + | ||
1605 | +#define MOD_DESC "CAN device driver interface" | ||
1606 | + | ||
1607 | +MODULE_DESCRIPTION(MOD_DESC); | ||
1608 | +MODULE_LICENSE("GPL v2"); | ||
1609 | +MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>"); | ||
1610 | + | ||
1611 | +/* CAN DLC to real data length conversion helpers */ | ||
1612 | + | ||
1613 | +static const u8 dlc2len[] = {0, 1, 2, 3, 4, 5, 6, 7, | ||
1614 | + 8, 12, 16, 20, 24, 32, 48, 64}; | ||
1615 | + | ||
1616 | +/* get data length from can_dlc with sanitized can_dlc */ | ||
1617 | +u8 can_dlc2len(u8 can_dlc) | ||
1618 | +{ | ||
1619 | + return dlc2len[can_dlc & 0x0F]; | ||
1620 | +} | ||
1621 | +EXPORT_SYMBOL_GPL(can_dlc2len); | ||
1622 | + | ||
1623 | +static const u8 len2dlc[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, /* 0 - 8 */ | ||
1624 | + 9, 9, 9, 9, /* 9 - 12 */ | ||
1625 | + 10, 10, 10, 10, /* 13 - 16 */ | ||
1626 | + 11, 11, 11, 11, /* 17 - 20 */ | ||
1627 | + 12, 12, 12, 12, /* 21 - 24 */ | ||
1628 | + 13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */ | ||
1629 | + 14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */ | ||
1630 | + 14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */ | ||
1631 | + 15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */ | ||
1632 | + 15, 15, 15, 15, 15, 15, 15, 15}; /* 57 - 64 */ | ||
1633 | + | ||
1634 | +/* map the sanitized data length to an appropriate data length code */ | ||
1635 | +u8 can_len2dlc(u8 len) | ||
1636 | +{ | ||
1637 | + if (unlikely(len > 64)) | ||
1638 | + return 0xF; | ||
1639 | + | ||
1640 | + return len2dlc[len]; | ||
1641 | +} | ||
1642 | +EXPORT_SYMBOL_GPL(can_len2dlc); | ||
1643 | + | ||
1644 | +#ifdef CONFIG_CAN_CALC_BITTIMING | ||
1645 | +#define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */ | ||
1646 | +#define CAN_CALC_SYNC_SEG 1 | ||
1647 | + | ||
1648 | +/* Bit-timing calculation derived from: | ||
1649 | + * | ||
1650 | + * Code based on LinCAN sources and H8S2638 project | ||
1651 | + * Copyright 2004-2006 Pavel Pisa - DCE FELK CVUT cz | ||
1652 | + * Copyright 2005 Stanislav Marek | ||
1653 | + * email: pisa@cmp.felk.cvut.cz | ||
1654 | + * | ||
1655 | + * Calculates proper bit-timing parameters for a specified bit-rate | ||
1656 | + * and sample-point, which can then be used to set the bit-timing | ||
1657 | + * registers of the CAN controller. You can find more information | ||
1658 | + * in the header file linux/can/netlink.h. | ||
1659 | + */ | ||
1660 | +static int | ||
1661 | +can_update_sample_point(const struct can_bittiming_const *btc, | ||
1662 | + unsigned int sample_point_nominal, unsigned int tseg, | ||
1663 | + unsigned int *tseg1_ptr, unsigned int *tseg2_ptr, | ||
1664 | + unsigned int *sample_point_error_ptr) | ||
1665 | +{ | ||
1666 | + unsigned int sample_point_error, best_sample_point_error = UINT_MAX; | ||
1667 | + unsigned int sample_point, best_sample_point = 0; | ||
1668 | + unsigned int tseg1, tseg2; | ||
1669 | + int i; | ||
1670 | + | ||
1671 | + for (i = 0; i <= 1; i++) { | ||
1672 | + tseg2 = tseg + CAN_CALC_SYNC_SEG - | ||
1673 | + (sample_point_nominal * (tseg + CAN_CALC_SYNC_SEG)) / | ||
1674 | + 1000 - i; | ||
1675 | + tseg2 = clamp(tseg2, btc->tseg2_min, btc->tseg2_max); | ||
1676 | + tseg1 = tseg - tseg2; | ||
1677 | + if (tseg1 > btc->tseg1_max) { | ||
1678 | + tseg1 = btc->tseg1_max; | ||
1679 | + tseg2 = tseg - tseg1; | ||
1680 | + } | ||
1681 | + | ||
1682 | + sample_point = 1000 * (tseg + CAN_CALC_SYNC_SEG - tseg2) / | ||
1683 | + (tseg + CAN_CALC_SYNC_SEG); | ||
1684 | + sample_point_error = abs(sample_point_nominal - sample_point); | ||
1685 | + | ||
1686 | + if (sample_point <= sample_point_nominal && | ||
1687 | + sample_point_error < best_sample_point_error) { | ||
1688 | + best_sample_point = sample_point; | ||
1689 | + best_sample_point_error = sample_point_error; | ||
1690 | + *tseg1_ptr = tseg1; | ||
1691 | + *tseg2_ptr = tseg2; | ||
1692 | + } | ||
1693 | + } | ||
1694 | + | ||
1695 | + if (sample_point_error_ptr) | ||
1696 | + *sample_point_error_ptr = best_sample_point_error; | ||
1697 | + | ||
1698 | + return best_sample_point; | ||
1699 | +} | ||
1700 | + | ||
1701 | +static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
1702 | + const struct can_bittiming_const *btc) | ||
1703 | +{ | ||
1704 | + struct can_priv *priv = netdev_priv(dev); | ||
1705 | + unsigned int bitrate; /* current bitrate */ | ||
1706 | + unsigned int bitrate_error; /* difference between current and nominal value */ | ||
1707 | + unsigned int best_bitrate_error = UINT_MAX; | ||
1708 | + unsigned int sample_point_error; /* difference between current and nominal value */ | ||
1709 | + unsigned int best_sample_point_error = UINT_MAX; | ||
1710 | + unsigned int sample_point_nominal; /* nominal sample point */ | ||
1711 | + unsigned int best_tseg = 0; /* current best value for tseg */ | ||
1712 | + unsigned int best_brp = 0; /* current best value for brp */ | ||
1713 | + unsigned int brp, tsegall, tseg, tseg1 = 0, tseg2 = 0; | ||
1714 | + u64 v64; | ||
1715 | + | ||
1716 | + /* Use CiA recommended sample points */ | ||
1717 | + if (bt->sample_point) { | ||
1718 | + sample_point_nominal = bt->sample_point; | ||
1719 | + } else { | ||
1720 | + if (bt->bitrate > 800000) | ||
1721 | + sample_point_nominal = 750; | ||
1722 | + else if (bt->bitrate > 500000) | ||
1723 | + sample_point_nominal = 800; | ||
1724 | + else | ||
1725 | + sample_point_nominal = 875; | ||
1726 | + } | ||
1727 | + | ||
1728 | + /* tseg even = round down, odd = round up */ | ||
1729 | + for (tseg = (btc->tseg1_max + btc->tseg2_max) * 2 + 1; | ||
1730 | + tseg >= (btc->tseg1_min + btc->tseg2_min) * 2; tseg--) { | ||
1731 | + tsegall = CAN_CALC_SYNC_SEG + tseg / 2; | ||
1732 | + | ||
1733 | + /* Compute all possible tseg choices (tseg=tseg1+tseg2) */ | ||
1734 | + brp = priv->clock.freq / (tsegall * bt->bitrate) + tseg % 2; | ||
1735 | + | ||
1736 | + /* choose brp step which is possible in system */ | ||
1737 | + brp = (brp / btc->brp_inc) * btc->brp_inc; | ||
1738 | + if (brp < btc->brp_min || brp > btc->brp_max) | ||
1739 | + continue; | ||
1740 | + | ||
1741 | + bitrate = priv->clock.freq / (brp * tsegall); | ||
1742 | + bitrate_error = abs(bt->bitrate - bitrate); | ||
1743 | + | ||
1744 | + /* tseg brp biterror */ | ||
1745 | + if (bitrate_error > best_bitrate_error) | ||
1746 | + continue; | ||
1747 | + | ||
1748 | + /* reset sample point error if we have a better bitrate */ | ||
1749 | + if (bitrate_error < best_bitrate_error) | ||
1750 | + best_sample_point_error = UINT_MAX; | ||
1751 | + | ||
1752 | + can_update_sample_point(btc, sample_point_nominal, tseg / 2, | ||
1753 | + &tseg1, &tseg2, &sample_point_error); | ||
1754 | + if (sample_point_error > best_sample_point_error) | ||
1755 | + continue; | ||
1756 | + | ||
1757 | + best_sample_point_error = sample_point_error; | ||
1758 | + best_bitrate_error = bitrate_error; | ||
1759 | + best_tseg = tseg / 2; | ||
1760 | + best_brp = brp; | ||
1761 | + | ||
1762 | + if (bitrate_error == 0 && sample_point_error == 0) | ||
1763 | + break; | ||
1764 | + } | ||
1765 | + | ||
1766 | + if (best_bitrate_error) { | ||
1767 | + /* Error in one-tenth of a percent */ | ||
1768 | + v64 = (u64)best_bitrate_error * 1000; | ||
1769 | + do_div(v64, bt->bitrate); | ||
1770 | + bitrate_error = (u32)v64; | ||
1771 | + if (bitrate_error > CAN_CALC_MAX_ERROR) { | ||
1772 | + netdev_err(dev, | ||
1773 | + "bitrate error %d.%d%% too high\n", | ||
1774 | + bitrate_error / 10, bitrate_error % 10); | ||
1775 | + return -EDOM; | ||
1776 | + } | ||
1777 | + netdev_warn(dev, "bitrate error %d.%d%%\n", | ||
1778 | + bitrate_error / 10, bitrate_error % 10); | ||
1779 | + } | ||
1780 | + | ||
1781 | + /* real sample point */ | ||
1782 | + bt->sample_point = can_update_sample_point(btc, sample_point_nominal, | ||
1783 | + best_tseg, &tseg1, &tseg2, | ||
1784 | + NULL); | ||
1785 | + | ||
1786 | + v64 = (u64)best_brp * 1000 * 1000 * 1000; | ||
1787 | + do_div(v64, priv->clock.freq); | ||
1788 | + bt->tq = (u32)v64; | ||
1789 | + bt->prop_seg = tseg1 / 2; | ||
1790 | + bt->phase_seg1 = tseg1 - bt->prop_seg; | ||
1791 | + bt->phase_seg2 = tseg2; | ||
1792 | + | ||
1793 | + /* check for sjw user settings */ | ||
1794 | + if (!bt->sjw || !btc->sjw_max) { | ||
1795 | + bt->sjw = 1; | ||
1796 | + } else { | ||
1797 | + /* bt->sjw is at least 1 -> sanitize upper bound to sjw_max */ | ||
1798 | + if (bt->sjw > btc->sjw_max) | ||
1799 | + bt->sjw = btc->sjw_max; | ||
1800 | + /* bt->sjw must not be higher than tseg2 */ | ||
1801 | + if (tseg2 < bt->sjw) | ||
1802 | + bt->sjw = tseg2; | ||
1803 | + } | ||
1804 | + | ||
1805 | + bt->brp = best_brp; | ||
1806 | + | ||
1807 | + /* real bitrate */ | ||
1808 | + bt->bitrate = priv->clock.freq / | ||
1809 | + (bt->brp * (CAN_CALC_SYNC_SEG + tseg1 + tseg2)); | ||
1810 | + | ||
1811 | + return 0; | ||
1812 | +} | ||
1813 | +#else /* !CONFIG_CAN_CALC_BITTIMING */ | ||
1814 | +static int can_calc_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
1815 | + const struct can_bittiming_const *btc) | ||
1816 | +{ | ||
1817 | + netdev_err(dev, "bit-timing calculation not available\n"); | ||
1818 | + return -EINVAL; | ||
1819 | +} | ||
1820 | +#endif /* CONFIG_CAN_CALC_BITTIMING */ | ||
1821 | + | ||
1822 | +/* Checks the validity of the specified bit-timing parameters prop_seg, | ||
1823 | + * phase_seg1, phase_seg2 and sjw and tries to determine the bitrate | ||
1824 | + * prescaler value brp. You can find more information in the header | ||
1825 | + * file linux/can/netlink.h. | ||
1826 | + */ | ||
1827 | +static int can_fixup_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
1828 | + const struct can_bittiming_const *btc) | ||
1829 | +{ | ||
1830 | + struct can_priv *priv = netdev_priv(dev); | ||
1831 | + int tseg1, alltseg; | ||
1832 | + u64 brp64; | ||
1833 | + | ||
1834 | + tseg1 = bt->prop_seg + bt->phase_seg1; | ||
1835 | + if (!bt->sjw) | ||
1836 | + bt->sjw = 1; | ||
1837 | + if (bt->sjw > btc->sjw_max || | ||
1838 | + tseg1 < btc->tseg1_min || tseg1 > btc->tseg1_max || | ||
1839 | + bt->phase_seg2 < btc->tseg2_min || bt->phase_seg2 > btc->tseg2_max) | ||
1840 | + return -ERANGE; | ||
1841 | + | ||
1842 | + brp64 = (u64)priv->clock.freq * (u64)bt->tq; | ||
1843 | + if (btc->brp_inc > 1) | ||
1844 | + do_div(brp64, btc->brp_inc); | ||
1845 | + brp64 += 500000000UL - 1; | ||
1846 | + do_div(brp64, 1000000000UL); /* the practicable BRP */ | ||
1847 | + if (btc->brp_inc > 1) | ||
1848 | + brp64 *= btc->brp_inc; | ||
1849 | + bt->brp = (u32)brp64; | ||
1850 | + | ||
1851 | + if (bt->brp < btc->brp_min || bt->brp > btc->brp_max) | ||
1852 | + return -EINVAL; | ||
1853 | + | ||
1854 | + alltseg = bt->prop_seg + bt->phase_seg1 + bt->phase_seg2 + 1; | ||
1855 | + bt->bitrate = priv->clock.freq / (bt->brp * alltseg); | ||
1856 | + bt->sample_point = ((tseg1 + 1) * 1000) / alltseg; | ||
1857 | + | ||
1858 | + return 0; | ||
1859 | +} | ||
1860 | + | ||
1861 | +/* Checks the validity of predefined bitrate settings */ | ||
1862 | +static int | ||
1863 | +can_validate_bitrate(struct net_device *dev, struct can_bittiming *bt, | ||
1864 | + const u32 *bitrate_const, | ||
1865 | + const unsigned int bitrate_const_cnt) | ||
1866 | +{ | ||
1867 | + struct can_priv *priv = netdev_priv(dev); | ||
1868 | + unsigned int i; | ||
1869 | + | ||
1870 | + for (i = 0; i < bitrate_const_cnt; i++) { | ||
1871 | + if (bt->bitrate == bitrate_const[i]) | ||
1872 | + break; | ||
1873 | + } | ||
1874 | + | ||
1875 | + if (i >= priv->bitrate_const_cnt) | ||
1876 | + return -EINVAL; | ||
1877 | + | ||
1878 | + return 0; | ||
1879 | +} | ||
1880 | + | ||
1881 | +static int can_get_bittiming(struct net_device *dev, struct can_bittiming *bt, | ||
1882 | + const struct can_bittiming_const *btc, | ||
1883 | + const u32 *bitrate_const, | ||
1884 | + const unsigned int bitrate_const_cnt) | ||
1885 | +{ | ||
1886 | + int err; | ||
1887 | + | ||
1888 | + /* Depending on the given can_bittiming parameter structure the CAN | ||
1889 | + * timing parameters are calculated based on the provided bitrate OR | ||
1890 | + * alternatively the CAN timing parameters (tq, prop_seg, etc.) are | ||
1891 | + * provided directly which are then checked and fixed up. | ||
1892 | + */ | ||
1893 | + if (!bt->tq && bt->bitrate && btc) | ||
1894 | + err = can_calc_bittiming(dev, bt, btc); | ||
1895 | + else if (bt->tq && !bt->bitrate && btc) | ||
1896 | + err = can_fixup_bittiming(dev, bt, btc); | ||
1897 | + else if (!bt->tq && bt->bitrate && bitrate_const) | ||
1898 | + err = can_validate_bitrate(dev, bt, bitrate_const, | ||
1899 | + bitrate_const_cnt); | ||
1900 | + else | ||
1901 | + err = -EINVAL; | ||
1902 | + | ||
1903 | + return err; | ||
1904 | +} | ||
1905 | + | ||
1906 | +static void can_update_state_error_stats(struct net_device *dev, | ||
1907 | + enum can_state new_state) | ||
1908 | +{ | ||
1909 | + struct can_priv *priv = netdev_priv(dev); | ||
1910 | + | ||
1911 | + if (new_state <= priv->state) | ||
1912 | + return; | ||
1913 | + | ||
1914 | + switch (new_state) { | ||
1915 | + case CAN_STATE_ERROR_WARNING: | ||
1916 | + priv->can_stats.error_warning++; | ||
1917 | + break; | ||
1918 | + case CAN_STATE_ERROR_PASSIVE: | ||
1919 | + priv->can_stats.error_passive++; | ||
1920 | + break; | ||
1921 | + case CAN_STATE_BUS_OFF: | ||
1922 | + priv->can_stats.bus_off++; | ||
1923 | + break; | ||
1924 | + default: | ||
1925 | + break; | ||
1926 | + } | ||
1927 | +} | ||
1928 | + | ||
1929 | +static int can_tx_state_to_frame(struct net_device *dev, enum can_state state) | ||
1930 | +{ | ||
1931 | + switch (state) { | ||
1932 | + case CAN_STATE_ERROR_ACTIVE: | ||
1933 | + return CAN_ERR_CRTL_ACTIVE; | ||
1934 | + case CAN_STATE_ERROR_WARNING: | ||
1935 | + return CAN_ERR_CRTL_TX_WARNING; | ||
1936 | + case CAN_STATE_ERROR_PASSIVE: | ||
1937 | + return CAN_ERR_CRTL_TX_PASSIVE; | ||
1938 | + default: | ||
1939 | + return 0; | ||
1940 | + } | ||
1941 | +} | ||
1942 | + | ||
1943 | +static int can_rx_state_to_frame(struct net_device *dev, enum can_state state) | ||
1944 | +{ | ||
1945 | + switch (state) { | ||
1946 | + case CAN_STATE_ERROR_ACTIVE: | ||
1947 | + return CAN_ERR_CRTL_ACTIVE; | ||
1948 | + case CAN_STATE_ERROR_WARNING: | ||
1949 | + return CAN_ERR_CRTL_RX_WARNING; | ||
1950 | + case CAN_STATE_ERROR_PASSIVE: | ||
1951 | + return CAN_ERR_CRTL_RX_PASSIVE; | ||
1952 | + default: | ||
1953 | + return 0; | ||
1954 | + } | ||
1955 | +} | ||
1956 | + | ||
1957 | +void can_change_state(struct net_device *dev, struct can_frame *cf, | ||
1958 | + enum can_state tx_state, enum can_state rx_state) | ||
1959 | +{ | ||
1960 | + struct can_priv *priv = netdev_priv(dev); | ||
1961 | + enum can_state new_state = max(tx_state, rx_state); | ||
1962 | + | ||
1963 | + if (unlikely(new_state == priv->state)) { | ||
1964 | + netdev_warn(dev, "%s: oops, state did not change", __func__); | ||
1965 | + return; | ||
1966 | + } | ||
1967 | + | ||
1968 | + netdev_dbg(dev, "New error state: %d\n", new_state); | ||
1969 | + | ||
1970 | + can_update_state_error_stats(dev, new_state); | ||
1971 | + priv->state = new_state; | ||
1972 | + | ||
1973 | + if (!cf) | ||
1974 | + return; | ||
1975 | + | ||
1976 | + if (unlikely(new_state == CAN_STATE_BUS_OFF)) { | ||
1977 | + cf->can_id |= CAN_ERR_BUSOFF; | ||
1978 | + return; | ||
1979 | + } | ||
1980 | + | ||
1981 | + cf->can_id |= CAN_ERR_CRTL; | ||
1982 | + cf->data[1] |= tx_state >= rx_state ? | ||
1983 | + can_tx_state_to_frame(dev, tx_state) : 0; | ||
1984 | + cf->data[1] |= tx_state <= rx_state ? | ||
1985 | + can_rx_state_to_frame(dev, rx_state) : 0; | ||
1986 | +} | ||
1987 | +EXPORT_SYMBOL_GPL(can_change_state); | ||
1988 | + | ||
1989 | +/* Local echo of CAN messages | ||
1990 | + * | ||
1991 | + * CAN network devices *should* support a local echo functionality | ||
1992 | + * (see Documentation/networking/can.rst). To test the handling of CAN | ||
1993 | + * interfaces that do not support the local echo both driver types are | ||
1994 | + * implemented. In the case that the driver does not support the echo | ||
1995 | + * the IFF_ECHO remains clear in dev->flags. This causes the PF_CAN core | ||
1996 | + * to perform the echo as a fallback solution. | ||
1997 | + */ | ||
1998 | +static void can_flush_echo_skb(struct net_device *dev) | ||
1999 | +{ | ||
2000 | + struct can_priv *priv = netdev_priv(dev); | ||
2001 | + struct net_device_stats *stats = &dev->stats; | ||
2002 | + int i; | ||
2003 | + | ||
2004 | + for (i = 0; i < priv->echo_skb_max; i++) { | ||
2005 | + if (priv->echo_skb[i]) { | ||
2006 | + kfree_skb(priv->echo_skb[i]); | ||
2007 | + priv->echo_skb[i] = NULL; | ||
2008 | + stats->tx_dropped++; | ||
2009 | + stats->tx_aborted_errors++; | ||
2010 | + } | ||
2011 | + } | ||
2012 | +} | ||
2013 | + | ||
2014 | +/* Put the skb on the stack to be looped backed locally lateron | ||
2015 | + * | ||
2016 | + * The function is typically called in the start_xmit function | ||
2017 | + * of the device driver. The driver must protect access to | ||
2018 | + * priv->echo_skb, if necessary. | ||
2019 | + */ | ||
2020 | +void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, | ||
2021 | + unsigned int idx) | ||
2022 | +{ | ||
2023 | + struct can_priv *priv = netdev_priv(dev); | ||
2024 | + | ||
2025 | + BUG_ON(idx >= priv->echo_skb_max); | ||
2026 | + | ||
2027 | + /* check flag whether this packet has to be looped back */ | ||
2028 | + if (!(dev->flags & IFF_ECHO) || skb->pkt_type != PACKET_LOOPBACK || | ||
2029 | + (skb->protocol != htons(ETH_P_CAN) && | ||
2030 | + skb->protocol != htons(ETH_P_CANFD))) { | ||
2031 | + kfree_skb(skb); | ||
2032 | + return; | ||
2033 | + } | ||
2034 | + | ||
2035 | + if (!priv->echo_skb[idx]) { | ||
2036 | + skb = can_create_echo_skb(skb); | ||
2037 | + if (!skb) | ||
2038 | + return; | ||
2039 | + | ||
2040 | + /* make settings for echo to reduce code in irq context */ | ||
2041 | + skb->pkt_type = PACKET_BROADCAST; | ||
2042 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
2043 | + skb->dev = dev; | ||
2044 | + | ||
2045 | + /* save this skb for tx interrupt echo handling */ | ||
2046 | + priv->echo_skb[idx] = skb; | ||
2047 | + } else { | ||
2048 | + /* locking problem with netif_stop_queue() ?? */ | ||
2049 | + netdev_err(dev, "%s: BUG! echo_skb is occupied!\n", __func__); | ||
2050 | + kfree_skb(skb); | ||
2051 | + } | ||
2052 | +} | ||
2053 | +EXPORT_SYMBOL_GPL(can_put_echo_skb); | ||
2054 | + | ||
2055 | +struct sk_buff * | ||
2056 | +__can_get_echo_skb(struct net_device *dev, unsigned int idx, u8 *len_ptr) | ||
2057 | +{ | ||
2058 | + struct can_priv *priv = netdev_priv(dev); | ||
2059 | + | ||
2060 | + if (idx >= priv->echo_skb_max) { | ||
2061 | + netdev_err(dev, "%s: BUG! Trying to access can_priv::echo_skb out of bounds (%u/max %u)\n", | ||
2062 | + __func__, idx, priv->echo_skb_max); | ||
2063 | + return NULL; | ||
2064 | + } | ||
2065 | + | ||
2066 | + if (priv->echo_skb[idx]) { | ||
2067 | + /* Using "struct canfd_frame::len" for the frame | ||
2068 | + * length is supported on both CAN and CANFD frames. | ||
2069 | + */ | ||
2070 | + struct sk_buff *skb = priv->echo_skb[idx]; | ||
2071 | + struct canfd_frame *cf = (struct canfd_frame *)skb->data; | ||
2072 | + | ||
2073 | + /* get the real payload length for netdev statistics */ | ||
2074 | + if (cf->can_id & CAN_RTR_FLAG) | ||
2075 | + *len_ptr = 0; | ||
2076 | + else | ||
2077 | + *len_ptr = cf->len; | ||
2078 | + | ||
2079 | + priv->echo_skb[idx] = NULL; | ||
2080 | + | ||
2081 | + return skb; | ||
2082 | + } | ||
2083 | + | ||
2084 | + return NULL; | ||
2085 | +} | ||
2086 | + | ||
2087 | +/* Get the skb from the stack and loop it back locally | ||
2088 | + * | ||
2089 | + * The function is typically called when the TX done interrupt | ||
2090 | + * is handled in the device driver. The driver must protect | ||
2091 | + * access to priv->echo_skb, if necessary. | ||
2092 | + */ | ||
2093 | +unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx) | ||
2094 | +{ | ||
2095 | + struct sk_buff *skb; | ||
2096 | + u8 len; | ||
2097 | + | ||
2098 | + skb = __can_get_echo_skb(dev, idx, &len); | ||
2099 | + if (!skb) | ||
2100 | + return 0; | ||
2101 | + | ||
2102 | + skb_get(skb); | ||
2103 | + if (netif_rx(skb) == NET_RX_SUCCESS) | ||
2104 | + dev_consume_skb_any(skb); | ||
2105 | + else | ||
2106 | + dev_kfree_skb_any(skb); | ||
2107 | + | ||
2108 | + return len; | ||
2109 | +} | ||
2110 | +EXPORT_SYMBOL_GPL(can_get_echo_skb); | ||
2111 | + | ||
2112 | +/* Remove the skb from the stack and free it. | ||
2113 | + * | ||
2114 | + * The function is typically called when TX failed. | ||
2115 | + */ | ||
2116 | +void can_free_echo_skb(struct net_device *dev, unsigned int idx) | ||
2117 | +{ | ||
2118 | + struct can_priv *priv = netdev_priv(dev); | ||
2119 | + | ||
2120 | + BUG_ON(idx >= priv->echo_skb_max); | ||
2121 | + | ||
2122 | + if (priv->echo_skb[idx]) { | ||
2123 | + dev_kfree_skb_any(priv->echo_skb[idx]); | ||
2124 | + priv->echo_skb[idx] = NULL; | ||
2125 | + } | ||
2126 | +} | ||
2127 | +EXPORT_SYMBOL_GPL(can_free_echo_skb); | ||
2128 | + | ||
2129 | +/* CAN device restart for bus-off recovery */ | ||
2130 | +static void can_restart(struct net_device *dev) | ||
2131 | +{ | ||
2132 | + struct can_priv *priv = netdev_priv(dev); | ||
2133 | + struct net_device_stats *stats = &dev->stats; | ||
2134 | + struct sk_buff *skb; | ||
2135 | + struct can_frame *cf; | ||
2136 | + int err; | ||
2137 | + | ||
2138 | + BUG_ON(netif_carrier_ok(dev)); | ||
2139 | + | ||
2140 | + /* No synchronization needed because the device is bus-off and | ||
2141 | + * no messages can come in or go out. | ||
2142 | + */ | ||
2143 | + can_flush_echo_skb(dev); | ||
2144 | + | ||
2145 | + /* send restart message upstream */ | ||
2146 | + skb = alloc_can_err_skb(dev, &cf); | ||
2147 | + if (!skb) { | ||
2148 | + err = -ENOMEM; | ||
2149 | + goto restart; | ||
2150 | + } | ||
2151 | + cf->can_id |= CAN_ERR_RESTARTED; | ||
2152 | + | ||
2153 | + stats->rx_packets++; | ||
2154 | + stats->rx_bytes += cf->can_dlc; | ||
2155 | + | ||
2156 | + netif_rx_ni(skb); | ||
2157 | + | ||
2158 | +restart: | ||
2159 | + netdev_dbg(dev, "restarted\n"); | ||
2160 | + priv->can_stats.restarts++; | ||
2161 | + | ||
2162 | + /* Now restart the device */ | ||
2163 | + err = priv->do_set_mode(dev, CAN_MODE_START); | ||
2164 | + | ||
2165 | + netif_carrier_on(dev); | ||
2166 | + if (err) | ||
2167 | + netdev_err(dev, "Error %d during restart", err); | ||
2168 | +} | ||
2169 | + | ||
2170 | +static void can_restart_work(struct work_struct *work) | ||
2171 | +{ | ||
2172 | + struct delayed_work *dwork = to_delayed_work(work); | ||
2173 | + struct can_priv *priv = container_of(dwork, struct can_priv, | ||
2174 | + restart_work); | ||
2175 | + | ||
2176 | + can_restart(priv->dev); | ||
2177 | +} | ||
2178 | + | ||
2179 | +int can_restart_now(struct net_device *dev) | ||
2180 | +{ | ||
2181 | + struct can_priv *priv = netdev_priv(dev); | ||
2182 | + | ||
2183 | + /* A manual restart is only permitted if automatic restart is | ||
2184 | + * disabled and the device is in the bus-off state | ||
2185 | + */ | ||
2186 | + if (priv->restart_ms) | ||
2187 | + return -EINVAL; | ||
2188 | + if (priv->state != CAN_STATE_BUS_OFF) | ||
2189 | + return -EBUSY; | ||
2190 | + | ||
2191 | + cancel_delayed_work_sync(&priv->restart_work); | ||
2192 | + can_restart(dev); | ||
2193 | + | ||
2194 | + return 0; | ||
2195 | +} | ||
2196 | + | ||
2197 | +/* CAN bus-off | ||
2198 | + * | ||
2199 | + * This functions should be called when the device goes bus-off to | ||
2200 | + * tell the netif layer that no more packets can be sent or received. | ||
2201 | + * If enabled, a timer is started to trigger bus-off recovery. | ||
2202 | + */ | ||
2203 | +void can_bus_off(struct net_device *dev) | ||
2204 | +{ | ||
2205 | + struct can_priv *priv = netdev_priv(dev); | ||
2206 | + | ||
2207 | + netdev_info(dev, "bus-off\n"); | ||
2208 | + | ||
2209 | + netif_carrier_off(dev); | ||
2210 | + | ||
2211 | + if (priv->restart_ms) | ||
2212 | + schedule_delayed_work(&priv->restart_work, | ||
2213 | + msecs_to_jiffies(priv->restart_ms)); | ||
2214 | +} | ||
2215 | +EXPORT_SYMBOL_GPL(can_bus_off); | ||
2216 | + | ||
2217 | +static void can_setup(struct net_device *dev) | ||
2218 | +{ | ||
2219 | + dev->type = ARPHRD_CAN; | ||
2220 | + dev->mtu = CAN_MTU; | ||
2221 | + dev->hard_header_len = 0; | ||
2222 | + dev->addr_len = 0; | ||
2223 | + dev->tx_queue_len = 10; | ||
2224 | + | ||
2225 | + /* New-style flags. */ | ||
2226 | + dev->flags = IFF_NOARP; | ||
2227 | + dev->features = NETIF_F_HW_CSUM; | ||
2228 | +} | ||
2229 | + | ||
2230 | +struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf) | ||
2231 | +{ | ||
2232 | + struct sk_buff *skb; | ||
2233 | + | ||
2234 | + skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + | ||
2235 | + sizeof(struct can_frame)); | ||
2236 | + if (unlikely(!skb)) | ||
2237 | + return NULL; | ||
2238 | + | ||
2239 | + skb->protocol = htons(ETH_P_CAN); | ||
2240 | + skb->pkt_type = PACKET_BROADCAST; | ||
2241 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
2242 | + | ||
2243 | + skb_reset_mac_header(skb); | ||
2244 | + skb_reset_network_header(skb); | ||
2245 | + skb_reset_transport_header(skb); | ||
2246 | + | ||
2247 | + can_skb_reserve(skb); | ||
2248 | + can_skb_prv(skb)->ifindex = dev->ifindex; | ||
2249 | + can_skb_prv(skb)->skbcnt = 0; | ||
2250 | + | ||
2251 | + *cf = skb_put_zero(skb, sizeof(struct can_frame)); | ||
2252 | + | ||
2253 | + return skb; | ||
2254 | +} | ||
2255 | +EXPORT_SYMBOL_GPL(alloc_can_skb); | ||
2256 | + | ||
2257 | +struct sk_buff *alloc_canfd_skb(struct net_device *dev, | ||
2258 | + struct canfd_frame **cfd) | ||
2259 | +{ | ||
2260 | + struct sk_buff *skb; | ||
2261 | + | ||
2262 | + skb = netdev_alloc_skb(dev, sizeof(struct can_skb_priv) + | ||
2263 | + sizeof(struct canfd_frame)); | ||
2264 | + if (unlikely(!skb)) | ||
2265 | + return NULL; | ||
2266 | + | ||
2267 | + skb->protocol = htons(ETH_P_CANFD); | ||
2268 | + skb->pkt_type = PACKET_BROADCAST; | ||
2269 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
2270 | + | ||
2271 | + skb_reset_mac_header(skb); | ||
2272 | + skb_reset_network_header(skb); | ||
2273 | + skb_reset_transport_header(skb); | ||
2274 | + | ||
2275 | + can_skb_reserve(skb); | ||
2276 | + can_skb_prv(skb)->ifindex = dev->ifindex; | ||
2277 | + can_skb_prv(skb)->skbcnt = 0; | ||
2278 | + | ||
2279 | + *cfd = skb_put_zero(skb, sizeof(struct canfd_frame)); | ||
2280 | + | ||
2281 | + return skb; | ||
2282 | +} | ||
2283 | +EXPORT_SYMBOL_GPL(alloc_canfd_skb); | ||
2284 | + | ||
2285 | +struct sk_buff *alloc_can_err_skb(struct net_device *dev, struct can_frame **cf) | ||
2286 | +{ | ||
2287 | + struct sk_buff *skb; | ||
2288 | + | ||
2289 | + skb = alloc_can_skb(dev, cf); | ||
2290 | + if (unlikely(!skb)) | ||
2291 | + return NULL; | ||
2292 | + | ||
2293 | + (*cf)->can_id = CAN_ERR_FLAG; | ||
2294 | + (*cf)->can_dlc = CAN_ERR_DLC; | ||
2295 | + | ||
2296 | + return skb; | ||
2297 | +} | ||
2298 | +EXPORT_SYMBOL_GPL(alloc_can_err_skb); | ||
2299 | + | ||
2300 | +/* Allocate and setup space for the CAN network device */ | ||
2301 | +struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max, | ||
2302 | + unsigned int txqs, unsigned int rxqs) | ||
2303 | +{ | ||
2304 | + struct can_ml_priv *can_ml; | ||
2305 | + struct net_device *dev; | ||
2306 | + struct can_priv *priv; | ||
2307 | + int size; | ||
2308 | + | ||
2309 | + /* We put the driver's priv, the CAN mid layer priv and the | ||
2310 | + * echo skb into the netdevice's priv. The memory layout for | ||
2311 | + * the netdev_priv is like this: | ||
2312 | + * | ||
2313 | + * +-------------------------+ | ||
2314 | + * | driver's priv | | ||
2315 | + * +-------------------------+ | ||
2316 | + * | struct can_ml_priv | | ||
2317 | + * +-------------------------+ | ||
2318 | + * | array of struct sk_buff | | ||
2319 | + * +-------------------------+ | ||
2320 | + */ | ||
2321 | + | ||
2322 | + size = ALIGN(sizeof_priv, NETDEV_ALIGN) + sizeof(struct can_ml_priv); | ||
2323 | + | ||
2324 | + if (echo_skb_max) | ||
2325 | + size = ALIGN(size, sizeof(struct sk_buff *)) + | ||
2326 | + echo_skb_max * sizeof(struct sk_buff *); | ||
2327 | + | ||
2328 | + dev = alloc_netdev_mqs(size, "can%d", NET_NAME_UNKNOWN, can_setup, | ||
2329 | + txqs, rxqs); | ||
2330 | + if (!dev) | ||
2331 | + return NULL; | ||
2332 | + | ||
2333 | + priv = netdev_priv(dev); | ||
2334 | + priv->dev = dev; | ||
2335 | + | ||
2336 | + can_ml = (void *)priv + ALIGN(sizeof_priv, NETDEV_ALIGN); | ||
2337 | + can_set_ml_priv(dev, can_ml); | ||
2338 | + | ||
2339 | + if (echo_skb_max) { | ||
2340 | + priv->echo_skb_max = echo_skb_max; | ||
2341 | + priv->echo_skb = (void *)priv + | ||
2342 | + (size - echo_skb_max * sizeof(struct sk_buff *)); | ||
2343 | + } | ||
2344 | + | ||
2345 | + priv->state = CAN_STATE_STOPPED; | ||
2346 | + | ||
2347 | + INIT_DELAYED_WORK(&priv->restart_work, can_restart_work); | ||
2348 | + | ||
2349 | + return dev; | ||
2350 | +} | ||
2351 | +EXPORT_SYMBOL_GPL(alloc_candev_mqs); | ||
2352 | + | ||
2353 | +/* Free space of the CAN network device */ | ||
2354 | +void free_candev(struct net_device *dev) | ||
2355 | +{ | ||
2356 | + free_netdev(dev); | ||
2357 | +} | ||
2358 | +EXPORT_SYMBOL_GPL(free_candev); | ||
2359 | + | ||
2360 | +/* changing MTU and control mode for CAN/CANFD devices */ | ||
2361 | +int can_change_mtu(struct net_device *dev, int new_mtu) | ||
2362 | +{ | ||
2363 | + struct can_priv *priv = netdev_priv(dev); | ||
2364 | + | ||
2365 | + /* Do not allow changing the MTU while running */ | ||
2366 | + if (dev->flags & IFF_UP) | ||
2367 | + return -EBUSY; | ||
2368 | + | ||
2369 | + /* allow change of MTU according to the CANFD ability of the device */ | ||
2370 | + switch (new_mtu) { | ||
2371 | + case CAN_MTU: | ||
2372 | + /* 'CANFD-only' controllers can not switch to CAN_MTU */ | ||
2373 | + if (priv->ctrlmode_static & CAN_CTRLMODE_FD) | ||
2374 | + return -EINVAL; | ||
2375 | + | ||
2376 | + priv->ctrlmode &= ~CAN_CTRLMODE_FD; | ||
2377 | + break; | ||
2378 | + | ||
2379 | + case CANFD_MTU: | ||
2380 | + /* check for potential CANFD ability */ | ||
2381 | + if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD) && | ||
2382 | + !(priv->ctrlmode_static & CAN_CTRLMODE_FD)) | ||
2383 | + return -EINVAL; | ||
2384 | + | ||
2385 | + priv->ctrlmode |= CAN_CTRLMODE_FD; | ||
2386 | + break; | ||
2387 | + | ||
2388 | + default: | ||
2389 | + return -EINVAL; | ||
2390 | + } | ||
2391 | + | ||
2392 | + dev->mtu = new_mtu; | ||
2393 | + return 0; | ||
2394 | +} | ||
2395 | +EXPORT_SYMBOL_GPL(can_change_mtu); | ||
2396 | + | ||
2397 | +/* Common open function when the device gets opened. | ||
2398 | + * | ||
2399 | + * This function should be called in the open function of the device | ||
2400 | + * driver. | ||
2401 | + */ | ||
2402 | +int open_candev(struct net_device *dev) | ||
2403 | +{ | ||
2404 | + struct can_priv *priv = netdev_priv(dev); | ||
2405 | + | ||
2406 | + if (!priv->bittiming.bitrate) { | ||
2407 | + netdev_err(dev, "bit-timing not yet defined\n"); | ||
2408 | + return -EINVAL; | ||
2409 | + } | ||
2410 | + | ||
2411 | + /* For CAN FD the data bitrate has to be >= the arbitration bitrate */ | ||
2412 | + if ((priv->ctrlmode & CAN_CTRLMODE_FD) && | ||
2413 | + (!priv->data_bittiming.bitrate || | ||
2414 | + priv->data_bittiming.bitrate < priv->bittiming.bitrate)) { | ||
2415 | + netdev_err(dev, "incorrect/missing data bit-timing\n"); | ||
2416 | + return -EINVAL; | ||
2417 | + } | ||
2418 | + | ||
2419 | + /* Switch carrier on if device was stopped while in bus-off state */ | ||
2420 | + if (!netif_carrier_ok(dev)) | ||
2421 | + netif_carrier_on(dev); | ||
2422 | + | ||
2423 | + return 0; | ||
2424 | +} | ||
2425 | +EXPORT_SYMBOL_GPL(open_candev); | ||
2426 | + | ||
2427 | +#ifdef CONFIG_OF | ||
2428 | +/* Common function that can be used to understand the limitation of | ||
2429 | + * a transceiver when it provides no means to determine these limitations | ||
2430 | + * at runtime. | ||
2431 | + */ | ||
2432 | +void of_can_transceiver(struct net_device *dev) | ||
2433 | +{ | ||
2434 | + struct device_node *dn; | ||
2435 | + struct can_priv *priv = netdev_priv(dev); | ||
2436 | + struct device_node *np = dev->dev.parent->of_node; | ||
2437 | + int ret; | ||
2438 | + | ||
2439 | + dn = of_get_child_by_name(np, "can-transceiver"); | ||
2440 | + if (!dn) | ||
2441 | + return; | ||
2442 | + | ||
2443 | + ret = of_property_read_u32(dn, "max-bitrate", &priv->bitrate_max); | ||
2444 | + of_node_put(dn); | ||
2445 | + if ((ret && ret != -EINVAL) || (!ret && !priv->bitrate_max)) | ||
2446 | + netdev_warn(dev, "Invalid value for transceiver max bitrate. Ignoring bitrate limit.\n"); | ||
2447 | +} | ||
2448 | +EXPORT_SYMBOL_GPL(of_can_transceiver); | ||
2449 | +#endif | ||
2450 | + | ||
2451 | +/* Common close function for cleanup before the device gets closed. | ||
2452 | + * | ||
2453 | + * This function should be called in the close function of the device | ||
2454 | + * driver. | ||
2455 | + */ | ||
2456 | +void close_candev(struct net_device *dev) | ||
2457 | +{ | ||
2458 | + struct can_priv *priv = netdev_priv(dev); | ||
2459 | + | ||
2460 | + cancel_delayed_work_sync(&priv->restart_work); | ||
2461 | + can_flush_echo_skb(dev); | ||
2462 | +} | ||
2463 | +EXPORT_SYMBOL_GPL(close_candev); | ||
2464 | + | ||
2465 | +/* CAN netlink interface */ | ||
2466 | +static const struct nla_policy can_policy[IFLA_CAN_MAX + 1] = { | ||
2467 | + [IFLA_CAN_STATE] = { .type = NLA_U32 }, | ||
2468 | + [IFLA_CAN_CTRLMODE] = { .len = sizeof(struct can_ctrlmode) }, | ||
2469 | + [IFLA_CAN_RESTART_MS] = { .type = NLA_U32 }, | ||
2470 | + [IFLA_CAN_RESTART] = { .type = NLA_U32 }, | ||
2471 | + [IFLA_CAN_BITTIMING] = { .len = sizeof(struct can_bittiming) }, | ||
2472 | + [IFLA_CAN_BITTIMING_CONST] | ||
2473 | + = { .len = sizeof(struct can_bittiming_const) }, | ||
2474 | + [IFLA_CAN_CLOCK] = { .len = sizeof(struct can_clock) }, | ||
2475 | + [IFLA_CAN_BERR_COUNTER] = { .len = sizeof(struct can_berr_counter) }, | ||
2476 | + [IFLA_CAN_DATA_BITTIMING] | ||
2477 | + = { .len = sizeof(struct can_bittiming) }, | ||
2478 | + [IFLA_CAN_DATA_BITTIMING_CONST] | ||
2479 | + = { .len = sizeof(struct can_bittiming_const) }, | ||
2480 | + [IFLA_CAN_TERMINATION] = { .type = NLA_U16 }, | ||
2481 | +}; | ||
2482 | + | ||
2483 | +static int can_validate(struct nlattr *tb[], struct nlattr *data[], | ||
2484 | + struct netlink_ext_ack *extack) | ||
2485 | +{ | ||
2486 | + bool is_can_fd = false; | ||
2487 | + | ||
2488 | + /* Make sure that valid CAN FD configurations always consist of | ||
2489 | + * - nominal/arbitration bittiming | ||
2490 | + * - data bittiming | ||
2491 | + * - control mode with CAN_CTRLMODE_FD set | ||
2492 | + */ | ||
2493 | + | ||
2494 | + if (!data) | ||
2495 | + return 0; | ||
2496 | + | ||
2497 | + if (data[IFLA_CAN_CTRLMODE]) { | ||
2498 | + struct can_ctrlmode *cm = nla_data(data[IFLA_CAN_CTRLMODE]); | ||
2499 | + | ||
2500 | + is_can_fd = cm->flags & cm->mask & CAN_CTRLMODE_FD; | ||
2501 | + } | ||
2502 | + | ||
2503 | + if (is_can_fd) { | ||
2504 | + if (!data[IFLA_CAN_BITTIMING] || !data[IFLA_CAN_DATA_BITTIMING]) | ||
2505 | + return -EOPNOTSUPP; | ||
2506 | + } | ||
2507 | + | ||
2508 | + if (data[IFLA_CAN_DATA_BITTIMING]) { | ||
2509 | + if (!is_can_fd || !data[IFLA_CAN_BITTIMING]) | ||
2510 | + return -EOPNOTSUPP; | ||
2511 | + } | ||
2512 | + | ||
2513 | + return 0; | ||
2514 | +} | ||
2515 | + | ||
2516 | +static int can_changelink(struct net_device *dev, struct nlattr *tb[], | ||
2517 | + struct nlattr *data[], | ||
2518 | + struct netlink_ext_ack *extack) | ||
2519 | +{ | ||
2520 | + struct can_priv *priv = netdev_priv(dev); | ||
2521 | + int err; | ||
2522 | + | ||
2523 | + /* We need synchronization with dev->stop() */ | ||
2524 | + ASSERT_RTNL(); | ||
2525 | + | ||
2526 | + if (data[IFLA_CAN_BITTIMING]) { | ||
2527 | + struct can_bittiming bt; | ||
2528 | + | ||
2529 | + /* Do not allow changing bittiming while running */ | ||
2530 | + if (dev->flags & IFF_UP) | ||
2531 | + return -EBUSY; | ||
2532 | + | ||
2533 | + /* Calculate bittiming parameters based on | ||
2534 | + * bittiming_const if set, otherwise pass bitrate | ||
2535 | + * directly via do_set_bitrate(). Bail out if neither | ||
2536 | + * is given. | ||
2537 | + */ | ||
2538 | + if (!priv->bittiming_const && !priv->do_set_bittiming) | ||
2539 | + return -EOPNOTSUPP; | ||
2540 | + | ||
2541 | + memcpy(&bt, nla_data(data[IFLA_CAN_BITTIMING]), sizeof(bt)); | ||
2542 | + err = can_get_bittiming(dev, &bt, | ||
2543 | + priv->bittiming_const, | ||
2544 | + priv->bitrate_const, | ||
2545 | + priv->bitrate_const_cnt); | ||
2546 | + if (err) | ||
2547 | + return err; | ||
2548 | + | ||
2549 | + if (priv->bitrate_max && bt.bitrate > priv->bitrate_max) { | ||
2550 | + netdev_err(dev, "arbitration bitrate surpasses transceiver capabilities of %d bps\n", | ||
2551 | + priv->bitrate_max); | ||
2552 | + return -EINVAL; | ||
2553 | + } | ||
2554 | + | ||
2555 | + memcpy(&priv->bittiming, &bt, sizeof(bt)); | ||
2556 | + | ||
2557 | + if (priv->do_set_bittiming) { | ||
2558 | + /* Finally, set the bit-timing registers */ | ||
2559 | + err = priv->do_set_bittiming(dev); | ||
2560 | + if (err) | ||
2561 | + return err; | ||
2562 | + } | ||
2563 | + } | ||
2564 | + | ||
2565 | + if (data[IFLA_CAN_CTRLMODE]) { | ||
2566 | + struct can_ctrlmode *cm; | ||
2567 | + u32 ctrlstatic; | ||
2568 | + u32 maskedflags; | ||
2569 | + | ||
2570 | + /* Do not allow changing controller mode while running */ | ||
2571 | + if (dev->flags & IFF_UP) | ||
2572 | + return -EBUSY; | ||
2573 | + cm = nla_data(data[IFLA_CAN_CTRLMODE]); | ||
2574 | + ctrlstatic = priv->ctrlmode_static; | ||
2575 | + maskedflags = cm->flags & cm->mask; | ||
2576 | + | ||
2577 | + /* check whether provided bits are allowed to be passed */ | ||
2578 | + if (cm->mask & ~(priv->ctrlmode_supported | ctrlstatic)) | ||
2579 | + return -EOPNOTSUPP; | ||
2580 | + | ||
2581 | + /* do not check for static fd-non-iso if 'fd' is disabled */ | ||
2582 | + if (!(maskedflags & CAN_CTRLMODE_FD)) | ||
2583 | + ctrlstatic &= ~CAN_CTRLMODE_FD_NON_ISO; | ||
2584 | + | ||
2585 | + /* make sure static options are provided by configuration */ | ||
2586 | + if ((maskedflags & ctrlstatic) != ctrlstatic) | ||
2587 | + return -EOPNOTSUPP; | ||
2588 | + | ||
2589 | + /* clear bits to be modified and copy the flag values */ | ||
2590 | + priv->ctrlmode &= ~cm->mask; | ||
2591 | + priv->ctrlmode |= maskedflags; | ||
2592 | + | ||
2593 | + /* CAN_CTRLMODE_FD can only be set when driver supports FD */ | ||
2594 | + if (priv->ctrlmode & CAN_CTRLMODE_FD) | ||
2595 | + dev->mtu = CANFD_MTU; | ||
2596 | + else | ||
2597 | + dev->mtu = CAN_MTU; | ||
2598 | + } | ||
2599 | + | ||
2600 | + if (data[IFLA_CAN_RESTART_MS]) { | ||
2601 | + /* Do not allow changing restart delay while running */ | ||
2602 | + if (dev->flags & IFF_UP) | ||
2603 | + return -EBUSY; | ||
2604 | + priv->restart_ms = nla_get_u32(data[IFLA_CAN_RESTART_MS]); | ||
2605 | + } | ||
2606 | + | ||
2607 | + if (data[IFLA_CAN_RESTART]) { | ||
2608 | + /* Do not allow a restart while not running */ | ||
2609 | + if (!(dev->flags & IFF_UP)) | ||
2610 | + return -EINVAL; | ||
2611 | + err = can_restart_now(dev); | ||
2612 | + if (err) | ||
2613 | + return err; | ||
2614 | + } | ||
2615 | + | ||
2616 | + if (data[IFLA_CAN_DATA_BITTIMING]) { | ||
2617 | + struct can_bittiming dbt; | ||
2618 | + | ||
2619 | + /* Do not allow changing bittiming while running */ | ||
2620 | + if (dev->flags & IFF_UP) | ||
2621 | + return -EBUSY; | ||
2622 | + | ||
2623 | + /* Calculate bittiming parameters based on | ||
2624 | + * data_bittiming_const if set, otherwise pass bitrate | ||
2625 | + * directly via do_set_bitrate(). Bail out if neither | ||
2626 | + * is given. | ||
2627 | + */ | ||
2628 | + if (!priv->data_bittiming_const && !priv->do_set_data_bittiming) | ||
2629 | + return -EOPNOTSUPP; | ||
2630 | + | ||
2631 | + memcpy(&dbt, nla_data(data[IFLA_CAN_DATA_BITTIMING]), | ||
2632 | + sizeof(dbt)); | ||
2633 | + err = can_get_bittiming(dev, &dbt, | ||
2634 | + priv->data_bittiming_const, | ||
2635 | + priv->data_bitrate_const, | ||
2636 | + priv->data_bitrate_const_cnt); | ||
2637 | + if (err) | ||
2638 | + return err; | ||
2639 | + | ||
2640 | + if (priv->bitrate_max && dbt.bitrate > priv->bitrate_max) { | ||
2641 | + netdev_err(dev, "canfd data bitrate surpasses transceiver capabilities of %d bps\n", | ||
2642 | + priv->bitrate_max); | ||
2643 | + return -EINVAL; | ||
2644 | + } | ||
2645 | + | ||
2646 | + memcpy(&priv->data_bittiming, &dbt, sizeof(dbt)); | ||
2647 | + | ||
2648 | + if (priv->do_set_data_bittiming) { | ||
2649 | + /* Finally, set the bit-timing registers */ | ||
2650 | + err = priv->do_set_data_bittiming(dev); | ||
2651 | + if (err) | ||
2652 | + return err; | ||
2653 | + } | ||
2654 | + } | ||
2655 | + | ||
2656 | + if (data[IFLA_CAN_TERMINATION]) { | ||
2657 | + const u16 termval = nla_get_u16(data[IFLA_CAN_TERMINATION]); | ||
2658 | + const unsigned int num_term = priv->termination_const_cnt; | ||
2659 | + unsigned int i; | ||
2660 | + | ||
2661 | + if (!priv->do_set_termination) | ||
2662 | + return -EOPNOTSUPP; | ||
2663 | + | ||
2664 | + /* check whether given value is supported by the interface */ | ||
2665 | + for (i = 0; i < num_term; i++) { | ||
2666 | + if (termval == priv->termination_const[i]) | ||
2667 | + break; | ||
2668 | + } | ||
2669 | + if (i >= num_term) | ||
2670 | + return -EINVAL; | ||
2671 | + | ||
2672 | + /* Finally, set the termination value */ | ||
2673 | + err = priv->do_set_termination(dev, termval); | ||
2674 | + if (err) | ||
2675 | + return err; | ||
2676 | + | ||
2677 | + priv->termination = termval; | ||
2678 | + } | ||
2679 | + | ||
2680 | + return 0; | ||
2681 | +} | ||
2682 | + | ||
2683 | +static size_t can_get_size(const struct net_device *dev) | ||
2684 | +{ | ||
2685 | + struct can_priv *priv = netdev_priv(dev); | ||
2686 | + size_t size = 0; | ||
2687 | + | ||
2688 | + if (priv->bittiming.bitrate) /* IFLA_CAN_BITTIMING */ | ||
2689 | + size += nla_total_size(sizeof(struct can_bittiming)); | ||
2690 | + if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ | ||
2691 | + size += nla_total_size(sizeof(struct can_bittiming_const)); | ||
2692 | + size += nla_total_size(sizeof(struct can_clock)); /* IFLA_CAN_CLOCK */ | ||
2693 | + size += nla_total_size(sizeof(u32)); /* IFLA_CAN_STATE */ | ||
2694 | + size += nla_total_size(sizeof(struct can_ctrlmode)); /* IFLA_CAN_CTRLMODE */ | ||
2695 | + size += nla_total_size(sizeof(u32)); /* IFLA_CAN_RESTART_MS */ | ||
2696 | + if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */ | ||
2697 | + size += nla_total_size(sizeof(struct can_berr_counter)); | ||
2698 | + if (priv->data_bittiming.bitrate) /* IFLA_CAN_DATA_BITTIMING */ | ||
2699 | + size += nla_total_size(sizeof(struct can_bittiming)); | ||
2700 | + if (priv->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */ | ||
2701 | + size += nla_total_size(sizeof(struct can_bittiming_const)); | ||
2702 | + if (priv->termination_const) { | ||
2703 | + size += nla_total_size(sizeof(priv->termination)); /* IFLA_CAN_TERMINATION */ | ||
2704 | + size += nla_total_size(sizeof(*priv->termination_const) * /* IFLA_CAN_TERMINATION_CONST */ | ||
2705 | + priv->termination_const_cnt); | ||
2706 | + } | ||
2707 | + if (priv->bitrate_const) /* IFLA_CAN_BITRATE_CONST */ | ||
2708 | + size += nla_total_size(sizeof(*priv->bitrate_const) * | ||
2709 | + priv->bitrate_const_cnt); | ||
2710 | + if (priv->data_bitrate_const) /* IFLA_CAN_DATA_BITRATE_CONST */ | ||
2711 | + size += nla_total_size(sizeof(*priv->data_bitrate_const) * | ||
2712 | + priv->data_bitrate_const_cnt); | ||
2713 | + size += sizeof(priv->bitrate_max); /* IFLA_CAN_BITRATE_MAX */ | ||
2714 | + | ||
2715 | + return size; | ||
2716 | +} | ||
2717 | + | ||
2718 | +static int can_fill_info(struct sk_buff *skb, const struct net_device *dev) | ||
2719 | +{ | ||
2720 | + struct can_priv *priv = netdev_priv(dev); | ||
2721 | + struct can_ctrlmode cm = {.flags = priv->ctrlmode}; | ||
2722 | + struct can_berr_counter bec = { }; | ||
2723 | + enum can_state state = priv->state; | ||
2724 | + | ||
2725 | + if (priv->do_get_state) | ||
2726 | + priv->do_get_state(dev, &state); | ||
2727 | + | ||
2728 | + if ((priv->bittiming.bitrate && | ||
2729 | + nla_put(skb, IFLA_CAN_BITTIMING, | ||
2730 | + sizeof(priv->bittiming), &priv->bittiming)) || | ||
2731 | + | ||
2732 | + (priv->bittiming_const && | ||
2733 | + nla_put(skb, IFLA_CAN_BITTIMING_CONST, | ||
2734 | + sizeof(*priv->bittiming_const), priv->bittiming_const)) || | ||
2735 | + | ||
2736 | + nla_put(skb, IFLA_CAN_CLOCK, sizeof(priv->clock), &priv->clock) || | ||
2737 | + nla_put_u32(skb, IFLA_CAN_STATE, state) || | ||
2738 | + nla_put(skb, IFLA_CAN_CTRLMODE, sizeof(cm), &cm) || | ||
2739 | + nla_put_u32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms) || | ||
2740 | + | ||
2741 | + (priv->do_get_berr_counter && | ||
2742 | + !priv->do_get_berr_counter(dev, &bec) && | ||
2743 | + nla_put(skb, IFLA_CAN_BERR_COUNTER, sizeof(bec), &bec)) || | ||
2744 | + | ||
2745 | + (priv->data_bittiming.bitrate && | ||
2746 | + nla_put(skb, IFLA_CAN_DATA_BITTIMING, | ||
2747 | + sizeof(priv->data_bittiming), &priv->data_bittiming)) || | ||
2748 | + | ||
2749 | + (priv->data_bittiming_const && | ||
2750 | + nla_put(skb, IFLA_CAN_DATA_BITTIMING_CONST, | ||
2751 | + sizeof(*priv->data_bittiming_const), | ||
2752 | + priv->data_bittiming_const)) || | ||
2753 | + | ||
2754 | + (priv->termination_const && | ||
2755 | + (nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) || | ||
2756 | + nla_put(skb, IFLA_CAN_TERMINATION_CONST, | ||
2757 | + sizeof(*priv->termination_const) * | ||
2758 | + priv->termination_const_cnt, | ||
2759 | + priv->termination_const))) || | ||
2760 | + | ||
2761 | + (priv->bitrate_const && | ||
2762 | + nla_put(skb, IFLA_CAN_BITRATE_CONST, | ||
2763 | + sizeof(*priv->bitrate_const) * | ||
2764 | + priv->bitrate_const_cnt, | ||
2765 | + priv->bitrate_const)) || | ||
2766 | + | ||
2767 | + (priv->data_bitrate_const && | ||
2768 | + nla_put(skb, IFLA_CAN_DATA_BITRATE_CONST, | ||
2769 | + sizeof(*priv->data_bitrate_const) * | ||
2770 | + priv->data_bitrate_const_cnt, | ||
2771 | + priv->data_bitrate_const)) || | ||
2772 | + | ||
2773 | + (nla_put(skb, IFLA_CAN_BITRATE_MAX, | ||
2774 | + sizeof(priv->bitrate_max), | ||
2775 | + &priv->bitrate_max)) | ||
2776 | + ) | ||
2777 | + | ||
2778 | + return -EMSGSIZE; | ||
2779 | + | ||
2780 | + return 0; | ||
2781 | +} | ||
2782 | + | ||
2783 | +static size_t can_get_xstats_size(const struct net_device *dev) | ||
2784 | +{ | ||
2785 | + return sizeof(struct can_device_stats); | ||
2786 | +} | ||
2787 | + | ||
2788 | +static int can_fill_xstats(struct sk_buff *skb, const struct net_device *dev) | ||
2789 | +{ | ||
2790 | + struct can_priv *priv = netdev_priv(dev); | ||
2791 | + | ||
2792 | + if (nla_put(skb, IFLA_INFO_XSTATS, | ||
2793 | + sizeof(priv->can_stats), &priv->can_stats)) | ||
2794 | + goto nla_put_failure; | ||
2795 | + return 0; | ||
2796 | + | ||
2797 | +nla_put_failure: | ||
2798 | + return -EMSGSIZE; | ||
2799 | +} | ||
2800 | + | ||
2801 | +static int can_newlink(struct net *src_net, struct net_device *dev, | ||
2802 | + struct nlattr *tb[], struct nlattr *data[], | ||
2803 | + struct netlink_ext_ack *extack) | ||
2804 | +{ | ||
2805 | + return -EOPNOTSUPP; | ||
2806 | +} | ||
2807 | + | ||
2808 | +static void can_dellink(struct net_device *dev, struct list_head *head) | ||
2809 | +{ | ||
2810 | +} | ||
2811 | + | ||
2812 | +static struct rtnl_link_ops can_link_ops __read_mostly = { | ||
2813 | + .kind = "can", | ||
2814 | + .netns_refund = true, | ||
2815 | + .maxtype = IFLA_CAN_MAX, | ||
2816 | + .policy = can_policy, | ||
2817 | + .setup = can_setup, | ||
2818 | + .validate = can_validate, | ||
2819 | + .newlink = can_newlink, | ||
2820 | + .changelink = can_changelink, | ||
2821 | + .dellink = can_dellink, | ||
2822 | + .get_size = can_get_size, | ||
2823 | + .fill_info = can_fill_info, | ||
2824 | + .get_xstats_size = can_get_xstats_size, | ||
2825 | + .fill_xstats = can_fill_xstats, | ||
2826 | +}; | ||
2827 | + | ||
2828 | +/* Register the CAN network device */ | ||
2829 | +int register_candev(struct net_device *dev) | ||
2830 | +{ | ||
2831 | + struct can_priv *priv = netdev_priv(dev); | ||
2832 | + | ||
2833 | + /* Ensure termination_const, termination_const_cnt and | ||
2834 | + * do_set_termination consistency. All must be either set or | ||
2835 | + * unset. | ||
2836 | + */ | ||
2837 | + if ((!priv->termination_const != !priv->termination_const_cnt) || | ||
2838 | + (!priv->termination_const != !priv->do_set_termination)) | ||
2839 | + return -EINVAL; | ||
2840 | + | ||
2841 | + if (!priv->bitrate_const != !priv->bitrate_const_cnt) | ||
2842 | + return -EINVAL; | ||
2843 | + | ||
2844 | + if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt) | ||
2845 | + return -EINVAL; | ||
2846 | + | ||
2847 | + dev->rtnl_link_ops = &can_link_ops; | ||
2848 | + netif_carrier_off(dev); | ||
2849 | + | ||
2850 | + return register_netdev(dev); | ||
2851 | +} | ||
2852 | +EXPORT_SYMBOL_GPL(register_candev); | ||
2853 | + | ||
2854 | +/* Unregister the CAN network device */ | ||
2855 | +void unregister_candev(struct net_device *dev) | ||
2856 | +{ | ||
2857 | + unregister_netdev(dev); | ||
2858 | +} | ||
2859 | +EXPORT_SYMBOL_GPL(unregister_candev); | ||
2860 | + | ||
2861 | +/* Test if a network device is a candev based device | ||
2862 | + * and return the can_priv* if so. | ||
2863 | + */ | ||
2864 | +struct can_priv *safe_candev_priv(struct net_device *dev) | ||
2865 | +{ | ||
2866 | + if (dev->type != ARPHRD_CAN || dev->rtnl_link_ops != &can_link_ops) | ||
2867 | + return NULL; | ||
2868 | + | ||
2869 | + return netdev_priv(dev); | ||
2870 | +} | ||
2871 | +EXPORT_SYMBOL_GPL(safe_candev_priv); | ||
2872 | + | ||
2873 | +static __init int can_dev_init(void) | ||
2874 | +{ | ||
2875 | + int err; | ||
2876 | + | ||
2877 | + can_led_notifier_init(); | ||
2878 | + | ||
2879 | + err = rtnl_link_register(&can_link_ops); | ||
2880 | + if (!err) | ||
2881 | + pr_info(MOD_DESC "\n"); | ||
2882 | + | ||
2883 | + return err; | ||
2884 | +} | ||
2885 | +module_init(can_dev_init); | ||
2886 | + | ||
2887 | +static __exit void can_dev_exit(void) | ||
2888 | +{ | ||
2889 | + rtnl_link_unregister(&can_link_ops); | ||
2890 | + | ||
2891 | + can_led_notifier_exit(); | ||
2892 | +} | ||
2893 | +module_exit(can_dev_exit); | ||
2894 | + | ||
2895 | +MODULE_ALIAS_RTNL_LINK("can"); | ||
2896 | diff --git a/drivers/net/can/dev/rx-offload.c b/drivers/net/can/dev/rx-offload.c | ||
2897 | new file mode 100644 | ||
2898 | index 0000000000000..7e75a87a8a6a9 | ||
2899 | --- /dev/null | ||
2900 | +++ b/drivers/net/can/dev/rx-offload.c | ||
2901 | @@ -0,0 +1,395 @@ | ||
2902 | +// SPDX-License-Identifier: GPL-2.0-only | ||
2903 | +/* | ||
2904 | + * Copyright (c) 2014 David Jander, Protonic Holland | ||
2905 | + * Copyright (C) 2014-2017 Pengutronix, Marc Kleine-Budde <kernel@pengutronix.de> | ||
2906 | + */ | ||
2907 | + | ||
2908 | +#include <linux/can/dev.h> | ||
2909 | +#include <linux/can/rx-offload.h> | ||
2910 | + | ||
2911 | +struct can_rx_offload_cb { | ||
2912 | + u32 timestamp; | ||
2913 | +}; | ||
2914 | + | ||
2915 | +static inline struct can_rx_offload_cb *can_rx_offload_get_cb(struct sk_buff *skb) | ||
2916 | +{ | ||
2917 | + BUILD_BUG_ON(sizeof(struct can_rx_offload_cb) > sizeof(skb->cb)); | ||
2918 | + | ||
2919 | + return (struct can_rx_offload_cb *)skb->cb; | ||
2920 | +} | ||
2921 | + | ||
2922 | +static inline bool can_rx_offload_le(struct can_rx_offload *offload, unsigned int a, unsigned int b) | ||
2923 | +{ | ||
2924 | + if (offload->inc) | ||
2925 | + return a <= b; | ||
2926 | + else | ||
2927 | + return a >= b; | ||
2928 | +} | ||
2929 | + | ||
2930 | +static inline unsigned int can_rx_offload_inc(struct can_rx_offload *offload, unsigned int *val) | ||
2931 | +{ | ||
2932 | + if (offload->inc) | ||
2933 | + return (*val)++; | ||
2934 | + else | ||
2935 | + return (*val)--; | ||
2936 | +} | ||
2937 | + | ||
2938 | +static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota) | ||
2939 | +{ | ||
2940 | + struct can_rx_offload *offload = container_of(napi, struct can_rx_offload, napi); | ||
2941 | + struct net_device *dev = offload->dev; | ||
2942 | + struct net_device_stats *stats = &dev->stats; | ||
2943 | + struct sk_buff *skb; | ||
2944 | + int work_done = 0; | ||
2945 | + | ||
2946 | + while ((work_done < quota) && | ||
2947 | + (skb = skb_dequeue(&offload->skb_queue))) { | ||
2948 | + struct can_frame *cf = (struct can_frame *)skb->data; | ||
2949 | + | ||
2950 | + work_done++; | ||
2951 | + stats->rx_packets++; | ||
2952 | + stats->rx_bytes += cf->can_dlc; | ||
2953 | + netif_receive_skb(skb); | ||
2954 | + } | ||
2955 | + | ||
2956 | + if (work_done < quota) { | ||
2957 | + napi_complete_done(napi, work_done); | ||
2958 | + | ||
2959 | + /* Check if there was another interrupt */ | ||
2960 | + if (!skb_queue_empty(&offload->skb_queue)) | ||
2961 | + napi_reschedule(&offload->napi); | ||
2962 | + } | ||
2963 | + | ||
2964 | + can_led_event(offload->dev, CAN_LED_EVENT_RX); | ||
2965 | + | ||
2966 | + return work_done; | ||
2967 | +} | ||
2968 | + | ||
2969 | +static inline void __skb_queue_add_sort(struct sk_buff_head *head, struct sk_buff *new, | ||
2970 | + int (*compare)(struct sk_buff *a, struct sk_buff *b)) | ||
2971 | +{ | ||
2972 | + struct sk_buff *pos, *insert = NULL; | ||
2973 | + | ||
2974 | + skb_queue_reverse_walk(head, pos) { | ||
2975 | + const struct can_rx_offload_cb *cb_pos, *cb_new; | ||
2976 | + | ||
2977 | + cb_pos = can_rx_offload_get_cb(pos); | ||
2978 | + cb_new = can_rx_offload_get_cb(new); | ||
2979 | + | ||
2980 | + netdev_dbg(new->dev, | ||
2981 | + "%s: pos=0x%08x, new=0x%08x, diff=%10d, queue_len=%d\n", | ||
2982 | + __func__, | ||
2983 | + cb_pos->timestamp, cb_new->timestamp, | ||
2984 | + cb_new->timestamp - cb_pos->timestamp, | ||
2985 | + skb_queue_len(head)); | ||
2986 | + | ||
2987 | + if (compare(pos, new) < 0) | ||
2988 | + continue; | ||
2989 | + insert = pos; | ||
2990 | + break; | ||
2991 | + } | ||
2992 | + if (!insert) | ||
2993 | + __skb_queue_head(head, new); | ||
2994 | + else | ||
2995 | + __skb_queue_after(head, insert, new); | ||
2996 | +} | ||
2997 | + | ||
2998 | +static int can_rx_offload_compare(struct sk_buff *a, struct sk_buff *b) | ||
2999 | +{ | ||
3000 | + const struct can_rx_offload_cb *cb_a, *cb_b; | ||
3001 | + | ||
3002 | + cb_a = can_rx_offload_get_cb(a); | ||
3003 | + cb_b = can_rx_offload_get_cb(b); | ||
3004 | + | ||
3005 | + /* Substract two u32 and return result as int, to keep | ||
3006 | + * difference steady around the u32 overflow. | ||
3007 | + */ | ||
3008 | + return cb_b->timestamp - cb_a->timestamp; | ||
3009 | +} | ||
3010 | + | ||
3011 | +/** | ||
3012 | + * can_rx_offload_offload_one() - Read one CAN frame from HW | ||
3013 | + * @offload: pointer to rx_offload context | ||
3014 | + * @n: number of mailbox to read | ||
3015 | + * | ||
3016 | + * The task of this function is to read a CAN frame from mailbox @n | ||
3017 | + * from the device and return the mailbox's content as a struct | ||
3018 | + * sk_buff. | ||
3019 | + * | ||
3020 | + * If the struct can_rx_offload::skb_queue exceeds the maximal queue | ||
3021 | + * length (struct can_rx_offload::skb_queue_len_max) or no skb can be | ||
3022 | + * allocated, the mailbox contents is discarded by reading it into an | ||
3023 | + * overflow buffer. This way the mailbox is marked as free by the | ||
3024 | + * driver. | ||
3025 | + * | ||
3026 | + * Return: A pointer to skb containing the CAN frame on success. | ||
3027 | + * | ||
3028 | + * NULL if the mailbox @n is empty. | ||
3029 | + * | ||
3030 | + * ERR_PTR() in case of an error | ||
3031 | + */ | ||
3032 | +static struct sk_buff * | ||
3033 | +can_rx_offload_offload_one(struct can_rx_offload *offload, unsigned int n) | ||
3034 | +{ | ||
3035 | + struct sk_buff *skb = NULL, *skb_error = NULL; | ||
3036 | + struct can_rx_offload_cb *cb; | ||
3037 | + struct can_frame *cf; | ||
3038 | + int ret; | ||
3039 | + | ||
3040 | + if (likely(skb_queue_len(&offload->skb_queue) < | ||
3041 | + offload->skb_queue_len_max)) { | ||
3042 | + skb = alloc_can_skb(offload->dev, &cf); | ||
3043 | + if (unlikely(!skb)) | ||
3044 | + skb_error = ERR_PTR(-ENOMEM); /* skb alloc failed */ | ||
3045 | + } else { | ||
3046 | + skb_error = ERR_PTR(-ENOBUFS); /* skb_queue is full */ | ||
3047 | + } | ||
3048 | + | ||
3049 | + /* If queue is full or skb not available, drop by reading into | ||
3050 | + * overflow buffer. | ||
3051 | + */ | ||
3052 | + if (unlikely(skb_error)) { | ||
3053 | + struct can_frame cf_overflow; | ||
3054 | + u32 timestamp; | ||
3055 | + | ||
3056 | + ret = offload->mailbox_read(offload, &cf_overflow, | ||
3057 | + ×tamp, n); | ||
3058 | + | ||
3059 | + /* Mailbox was empty. */ | ||
3060 | + if (unlikely(!ret)) | ||
3061 | + return NULL; | ||
3062 | + | ||
3063 | + /* Mailbox has been read and we're dropping it or | ||
3064 | + * there was a problem reading the mailbox. | ||
3065 | + * | ||
3066 | + * Increment error counters in any case. | ||
3067 | + */ | ||
3068 | + offload->dev->stats.rx_dropped++; | ||
3069 | + offload->dev->stats.rx_fifo_errors++; | ||
3070 | + | ||
3071 | + /* There was a problem reading the mailbox, propagate | ||
3072 | + * error value. | ||
3073 | + */ | ||
3074 | + if (unlikely(ret < 0)) | ||
3075 | + return ERR_PTR(ret); | ||
3076 | + | ||
3077 | + return skb_error; | ||
3078 | + } | ||
3079 | + | ||
3080 | + cb = can_rx_offload_get_cb(skb); | ||
3081 | + ret = offload->mailbox_read(offload, cf, &cb->timestamp, n); | ||
3082 | + | ||
3083 | + /* Mailbox was empty. */ | ||
3084 | + if (unlikely(!ret)) { | ||
3085 | + kfree_skb(skb); | ||
3086 | + return NULL; | ||
3087 | + } | ||
3088 | + | ||
3089 | + /* There was a problem reading the mailbox, propagate error value. */ | ||
3090 | + if (unlikely(ret < 0)) { | ||
3091 | + kfree_skb(skb); | ||
3092 | + | ||
3093 | + offload->dev->stats.rx_dropped++; | ||
3094 | + offload->dev->stats.rx_fifo_errors++; | ||
3095 | + | ||
3096 | + return ERR_PTR(ret); | ||
3097 | + } | ||
3098 | + | ||
3099 | + /* Mailbox was read. */ | ||
3100 | + return skb; | ||
3101 | +} | ||
3102 | + | ||
3103 | +int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pending) | ||
3104 | +{ | ||
3105 | + struct sk_buff_head skb_queue; | ||
3106 | + unsigned int i; | ||
3107 | + | ||
3108 | + __skb_queue_head_init(&skb_queue); | ||
3109 | + | ||
3110 | + for (i = offload->mb_first; | ||
3111 | + can_rx_offload_le(offload, i, offload->mb_last); | ||
3112 | + can_rx_offload_inc(offload, &i)) { | ||
3113 | + struct sk_buff *skb; | ||
3114 | + | ||
3115 | + if (!(pending & BIT_ULL(i))) | ||
3116 | + continue; | ||
3117 | + | ||
3118 | + skb = can_rx_offload_offload_one(offload, i); | ||
3119 | + if (IS_ERR_OR_NULL(skb)) | ||
3120 | + continue; | ||
3121 | + | ||
3122 | + __skb_queue_add_sort(&skb_queue, skb, can_rx_offload_compare); | ||
3123 | + } | ||
3124 | + | ||
3125 | + if (!skb_queue_empty(&skb_queue)) { | ||
3126 | + unsigned long flags; | ||
3127 | + u32 queue_len; | ||
3128 | + | ||
3129 | + spin_lock_irqsave(&offload->skb_queue.lock, flags); | ||
3130 | + skb_queue_splice_tail(&skb_queue, &offload->skb_queue); | ||
3131 | + spin_unlock_irqrestore(&offload->skb_queue.lock, flags); | ||
3132 | + | ||
3133 | + if ((queue_len = skb_queue_len(&offload->skb_queue)) > | ||
3134 | + (offload->skb_queue_len_max / 8)) | ||
3135 | + netdev_dbg(offload->dev, "%s: queue_len=%d\n", | ||
3136 | + __func__, queue_len); | ||
3137 | + | ||
3138 | + can_rx_offload_schedule(offload); | ||
3139 | + } | ||
3140 | + | ||
3141 | + return skb_queue_len(&skb_queue); | ||
3142 | +} | ||
3143 | +EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_timestamp); | ||
3144 | + | ||
3145 | +int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload) | ||
3146 | +{ | ||
3147 | + struct sk_buff *skb; | ||
3148 | + int received = 0; | ||
3149 | + | ||
3150 | + while (1) { | ||
3151 | + skb = can_rx_offload_offload_one(offload, 0); | ||
3152 | + if (IS_ERR(skb)) | ||
3153 | + continue; | ||
3154 | + if (!skb) | ||
3155 | + break; | ||
3156 | + | ||
3157 | + skb_queue_tail(&offload->skb_queue, skb); | ||
3158 | + received++; | ||
3159 | + } | ||
3160 | + | ||
3161 | + if (received) | ||
3162 | + can_rx_offload_schedule(offload); | ||
3163 | + | ||
3164 | + return received; | ||
3165 | +} | ||
3166 | +EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); | ||
3167 | + | ||
3168 | +int can_rx_offload_queue_sorted(struct can_rx_offload *offload, | ||
3169 | + struct sk_buff *skb, u32 timestamp) | ||
3170 | +{ | ||
3171 | + struct can_rx_offload_cb *cb; | ||
3172 | + unsigned long flags; | ||
3173 | + | ||
3174 | + if (skb_queue_len(&offload->skb_queue) > | ||
3175 | + offload->skb_queue_len_max) { | ||
3176 | + dev_kfree_skb_any(skb); | ||
3177 | + return -ENOBUFS; | ||
3178 | + } | ||
3179 | + | ||
3180 | + cb = can_rx_offload_get_cb(skb); | ||
3181 | + cb->timestamp = timestamp; | ||
3182 | + | ||
3183 | + spin_lock_irqsave(&offload->skb_queue.lock, flags); | ||
3184 | + __skb_queue_add_sort(&offload->skb_queue, skb, can_rx_offload_compare); | ||
3185 | + spin_unlock_irqrestore(&offload->skb_queue.lock, flags); | ||
3186 | + | ||
3187 | + can_rx_offload_schedule(offload); | ||
3188 | + | ||
3189 | + return 0; | ||
3190 | +} | ||
3191 | +EXPORT_SYMBOL_GPL(can_rx_offload_queue_sorted); | ||
3192 | + | ||
3193 | +unsigned int can_rx_offload_get_echo_skb(struct can_rx_offload *offload, | ||
3194 | + unsigned int idx, u32 timestamp) | ||
3195 | +{ | ||
3196 | + struct net_device *dev = offload->dev; | ||
3197 | + struct net_device_stats *stats = &dev->stats; | ||
3198 | + struct sk_buff *skb; | ||
3199 | + u8 len; | ||
3200 | + int err; | ||
3201 | + | ||
3202 | + skb = __can_get_echo_skb(dev, idx, &len); | ||
3203 | + if (!skb) | ||
3204 | + return 0; | ||
3205 | + | ||
3206 | + err = can_rx_offload_queue_sorted(offload, skb, timestamp); | ||
3207 | + if (err) { | ||
3208 | + stats->rx_errors++; | ||
3209 | + stats->tx_fifo_errors++; | ||
3210 | + } | ||
3211 | + | ||
3212 | + return len; | ||
3213 | +} | ||
3214 | +EXPORT_SYMBOL_GPL(can_rx_offload_get_echo_skb); | ||
3215 | + | ||
3216 | +int can_rx_offload_queue_tail(struct can_rx_offload *offload, | ||
3217 | + struct sk_buff *skb) | ||
3218 | +{ | ||
3219 | + if (skb_queue_len(&offload->skb_queue) > | ||
3220 | + offload->skb_queue_len_max) { | ||
3221 | + dev_kfree_skb_any(skb); | ||
3222 | + return -ENOBUFS; | ||
3223 | + } | ||
3224 | + | ||
3225 | + skb_queue_tail(&offload->skb_queue, skb); | ||
3226 | + can_rx_offload_schedule(offload); | ||
3227 | + | ||
3228 | + return 0; | ||
3229 | +} | ||
3230 | +EXPORT_SYMBOL_GPL(can_rx_offload_queue_tail); | ||
3231 | + | ||
3232 | +static int can_rx_offload_init_queue(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) | ||
3233 | +{ | ||
3234 | + offload->dev = dev; | ||
3235 | + | ||
3236 | + /* Limit queue len to 4x the weight (rounted to next power of two) */ | ||
3237 | + offload->skb_queue_len_max = 2 << fls(weight); | ||
3238 | + offload->skb_queue_len_max *= 4; | ||
3239 | + skb_queue_head_init(&offload->skb_queue); | ||
3240 | + | ||
3241 | + can_rx_offload_reset(offload); | ||
3242 | + netif_napi_add(dev, &offload->napi, can_rx_offload_napi_poll, weight); | ||
3243 | + | ||
3244 | + dev_dbg(dev->dev.parent, "%s: skb_queue_len_max=%d\n", | ||
3245 | + __func__, offload->skb_queue_len_max); | ||
3246 | + | ||
3247 | + return 0; | ||
3248 | +} | ||
3249 | + | ||
3250 | +int can_rx_offload_add_timestamp(struct net_device *dev, struct can_rx_offload *offload) | ||
3251 | +{ | ||
3252 | + unsigned int weight; | ||
3253 | + | ||
3254 | + if (offload->mb_first > BITS_PER_LONG_LONG || | ||
3255 | + offload->mb_last > BITS_PER_LONG_LONG || !offload->mailbox_read) | ||
3256 | + return -EINVAL; | ||
3257 | + | ||
3258 | + if (offload->mb_first < offload->mb_last) { | ||
3259 | + offload->inc = true; | ||
3260 | + weight = offload->mb_last - offload->mb_first; | ||
3261 | + } else { | ||
3262 | + offload->inc = false; | ||
3263 | + weight = offload->mb_first - offload->mb_last; | ||
3264 | + } | ||
3265 | + | ||
3266 | + return can_rx_offload_init_queue(dev, offload, weight); | ||
3267 | +} | ||
3268 | +EXPORT_SYMBOL_GPL(can_rx_offload_add_timestamp); | ||
3269 | + | ||
3270 | +int can_rx_offload_add_fifo(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) | ||
3271 | +{ | ||
3272 | + if (!offload->mailbox_read) | ||
3273 | + return -EINVAL; | ||
3274 | + | ||
3275 | + return can_rx_offload_init_queue(dev, offload, weight); | ||
3276 | +} | ||
3277 | +EXPORT_SYMBOL_GPL(can_rx_offload_add_fifo); | ||
3278 | + | ||
3279 | +void can_rx_offload_enable(struct can_rx_offload *offload) | ||
3280 | +{ | ||
3281 | + can_rx_offload_reset(offload); | ||
3282 | + napi_enable(&offload->napi); | ||
3283 | +} | ||
3284 | +EXPORT_SYMBOL_GPL(can_rx_offload_enable); | ||
3285 | + | ||
3286 | +void can_rx_offload_del(struct can_rx_offload *offload) | ||
3287 | +{ | ||
3288 | + netif_napi_del(&offload->napi); | ||
3289 | + skb_queue_purge(&offload->skb_queue); | ||
3290 | +} | ||
3291 | +EXPORT_SYMBOL_GPL(can_rx_offload_del); | ||
3292 | + | ||
3293 | +void can_rx_offload_reset(struct can_rx_offload *offload) | ||
3294 | +{ | ||
3295 | +} | ||
3296 | +EXPORT_SYMBOL_GPL(can_rx_offload_reset); | ||
3297 | diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c | ||
3298 | index 32cb479fe6ac8..0d66582bd3560 100644 | ||
3299 | --- a/drivers/net/can/m_can/tcan4x5x.c | ||
3300 | +++ b/drivers/net/can/m_can/tcan4x5x.c | ||
3301 | @@ -88,7 +88,7 @@ | ||
3302 | |||
3303 | #define TCAN4X5X_MRAM_START 0x8000 | ||
3304 | #define TCAN4X5X_MCAN_OFFSET 0x1000 | ||
3305 | -#define TCAN4X5X_MAX_REGISTER 0x8fff | ||
3306 | +#define TCAN4X5X_MAX_REGISTER 0x8ffc | ||
3307 | |||
3308 | #define TCAN4X5X_CLEAR_ALL_INT 0xffffffff | ||
3309 | #define TCAN4X5X_SET_ALL_INT 0xffffffff | ||
3310 | diff --git a/drivers/net/can/rx-offload.c b/drivers/net/can/rx-offload.c | ||
3311 | deleted file mode 100644 | ||
3312 | index 7e75a87a8a6a9..0000000000000 | ||
3313 | --- a/drivers/net/can/rx-offload.c | ||
3314 | +++ /dev/null | ||
3315 | @@ -1,395 +0,0 @@ | ||
3316 | -// SPDX-License-Identifier: GPL-2.0-only | ||
3317 | -/* | ||
3318 | - * Copyright (c) 2014 David Jander, Protonic Holland | ||
3319 | - * Copyright (C) 2014-2017 Pengutronix, Marc Kleine-Budde <kernel@pengutronix.de> | ||
3320 | - */ | ||
3321 | - | ||
3322 | -#include <linux/can/dev.h> | ||
3323 | -#include <linux/can/rx-offload.h> | ||
3324 | - | ||
3325 | -struct can_rx_offload_cb { | ||
3326 | - u32 timestamp; | ||
3327 | -}; | ||
3328 | - | ||
3329 | -static inline struct can_rx_offload_cb *can_rx_offload_get_cb(struct sk_buff *skb) | ||
3330 | -{ | ||
3331 | - BUILD_BUG_ON(sizeof(struct can_rx_offload_cb) > sizeof(skb->cb)); | ||
3332 | - | ||
3333 | - return (struct can_rx_offload_cb *)skb->cb; | ||
3334 | -} | ||
3335 | - | ||
3336 | -static inline bool can_rx_offload_le(struct can_rx_offload *offload, unsigned int a, unsigned int b) | ||
3337 | -{ | ||
3338 | - if (offload->inc) | ||
3339 | - return a <= b; | ||
3340 | - else | ||
3341 | - return a >= b; | ||
3342 | -} | ||
3343 | - | ||
3344 | -static inline unsigned int can_rx_offload_inc(struct can_rx_offload *offload, unsigned int *val) | ||
3345 | -{ | ||
3346 | - if (offload->inc) | ||
3347 | - return (*val)++; | ||
3348 | - else | ||
3349 | - return (*val)--; | ||
3350 | -} | ||
3351 | - | ||
3352 | -static int can_rx_offload_napi_poll(struct napi_struct *napi, int quota) | ||
3353 | -{ | ||
3354 | - struct can_rx_offload *offload = container_of(napi, struct can_rx_offload, napi); | ||
3355 | - struct net_device *dev = offload->dev; | ||
3356 | - struct net_device_stats *stats = &dev->stats; | ||
3357 | - struct sk_buff *skb; | ||
3358 | - int work_done = 0; | ||
3359 | - | ||
3360 | - while ((work_done < quota) && | ||
3361 | - (skb = skb_dequeue(&offload->skb_queue))) { | ||
3362 | - struct can_frame *cf = (struct can_frame *)skb->data; | ||
3363 | - | ||
3364 | - work_done++; | ||
3365 | - stats->rx_packets++; | ||
3366 | - stats->rx_bytes += cf->can_dlc; | ||
3367 | - netif_receive_skb(skb); | ||
3368 | - } | ||
3369 | - | ||
3370 | - if (work_done < quota) { | ||
3371 | - napi_complete_done(napi, work_done); | ||
3372 | - | ||
3373 | - /* Check if there was another interrupt */ | ||
3374 | - if (!skb_queue_empty(&offload->skb_queue)) | ||
3375 | - napi_reschedule(&offload->napi); | ||
3376 | - } | ||
3377 | - | ||
3378 | - can_led_event(offload->dev, CAN_LED_EVENT_RX); | ||
3379 | - | ||
3380 | - return work_done; | ||
3381 | -} | ||
3382 | - | ||
3383 | -static inline void __skb_queue_add_sort(struct sk_buff_head *head, struct sk_buff *new, | ||
3384 | - int (*compare)(struct sk_buff *a, struct sk_buff *b)) | ||
3385 | -{ | ||
3386 | - struct sk_buff *pos, *insert = NULL; | ||
3387 | - | ||
3388 | - skb_queue_reverse_walk(head, pos) { | ||
3389 | - const struct can_rx_offload_cb *cb_pos, *cb_new; | ||
3390 | - | ||
3391 | - cb_pos = can_rx_offload_get_cb(pos); | ||
3392 | - cb_new = can_rx_offload_get_cb(new); | ||
3393 | - | ||
3394 | - netdev_dbg(new->dev, | ||
3395 | - "%s: pos=0x%08x, new=0x%08x, diff=%10d, queue_len=%d\n", | ||
3396 | - __func__, | ||
3397 | - cb_pos->timestamp, cb_new->timestamp, | ||
3398 | - cb_new->timestamp - cb_pos->timestamp, | ||
3399 | - skb_queue_len(head)); | ||
3400 | - | ||
3401 | - if (compare(pos, new) < 0) | ||
3402 | - continue; | ||
3403 | - insert = pos; | ||
3404 | - break; | ||
3405 | - } | ||
3406 | - if (!insert) | ||
3407 | - __skb_queue_head(head, new); | ||
3408 | - else | ||
3409 | - __skb_queue_after(head, insert, new); | ||
3410 | -} | ||
3411 | - | ||
3412 | -static int can_rx_offload_compare(struct sk_buff *a, struct sk_buff *b) | ||
3413 | -{ | ||
3414 | - const struct can_rx_offload_cb *cb_a, *cb_b; | ||
3415 | - | ||
3416 | - cb_a = can_rx_offload_get_cb(a); | ||
3417 | - cb_b = can_rx_offload_get_cb(b); | ||
3418 | - | ||
3419 | - /* Substract two u32 and return result as int, to keep | ||
3420 | - * difference steady around the u32 overflow. | ||
3421 | - */ | ||
3422 | - return cb_b->timestamp - cb_a->timestamp; | ||
3423 | -} | ||
3424 | - | ||
3425 | -/** | ||
3426 | - * can_rx_offload_offload_one() - Read one CAN frame from HW | ||
3427 | - * @offload: pointer to rx_offload context | ||
3428 | - * @n: number of mailbox to read | ||
3429 | - * | ||
3430 | - * The task of this function is to read a CAN frame from mailbox @n | ||
3431 | - * from the device and return the mailbox's content as a struct | ||
3432 | - * sk_buff. | ||
3433 | - * | ||
3434 | - * If the struct can_rx_offload::skb_queue exceeds the maximal queue | ||
3435 | - * length (struct can_rx_offload::skb_queue_len_max) or no skb can be | ||
3436 | - * allocated, the mailbox contents is discarded by reading it into an | ||
3437 | - * overflow buffer. This way the mailbox is marked as free by the | ||
3438 | - * driver. | ||
3439 | - * | ||
3440 | - * Return: A pointer to skb containing the CAN frame on success. | ||
3441 | - * | ||
3442 | - * NULL if the mailbox @n is empty. | ||
3443 | - * | ||
3444 | - * ERR_PTR() in case of an error | ||
3445 | - */ | ||
3446 | -static struct sk_buff * | ||
3447 | -can_rx_offload_offload_one(struct can_rx_offload *offload, unsigned int n) | ||
3448 | -{ | ||
3449 | - struct sk_buff *skb = NULL, *skb_error = NULL; | ||
3450 | - struct can_rx_offload_cb *cb; | ||
3451 | - struct can_frame *cf; | ||
3452 | - int ret; | ||
3453 | - | ||
3454 | - if (likely(skb_queue_len(&offload->skb_queue) < | ||
3455 | - offload->skb_queue_len_max)) { | ||
3456 | - skb = alloc_can_skb(offload->dev, &cf); | ||
3457 | - if (unlikely(!skb)) | ||
3458 | - skb_error = ERR_PTR(-ENOMEM); /* skb alloc failed */ | ||
3459 | - } else { | ||
3460 | - skb_error = ERR_PTR(-ENOBUFS); /* skb_queue is full */ | ||
3461 | - } | ||
3462 | - | ||
3463 | - /* If queue is full or skb not available, drop by reading into | ||
3464 | - * overflow buffer. | ||
3465 | - */ | ||
3466 | - if (unlikely(skb_error)) { | ||
3467 | - struct can_frame cf_overflow; | ||
3468 | - u32 timestamp; | ||
3469 | - | ||
3470 | - ret = offload->mailbox_read(offload, &cf_overflow, | ||
3471 | - ×tamp, n); | ||
3472 | - | ||
3473 | - /* Mailbox was empty. */ | ||
3474 | - if (unlikely(!ret)) | ||
3475 | - return NULL; | ||
3476 | - | ||
3477 | - /* Mailbox has been read and we're dropping it or | ||
3478 | - * there was a problem reading the mailbox. | ||
3479 | - * | ||
3480 | - * Increment error counters in any case. | ||
3481 | - */ | ||
3482 | - offload->dev->stats.rx_dropped++; | ||
3483 | - offload->dev->stats.rx_fifo_errors++; | ||
3484 | - | ||
3485 | - /* There was a problem reading the mailbox, propagate | ||
3486 | - * error value. | ||
3487 | - */ | ||
3488 | - if (unlikely(ret < 0)) | ||
3489 | - return ERR_PTR(ret); | ||
3490 | - | ||
3491 | - return skb_error; | ||
3492 | - } | ||
3493 | - | ||
3494 | - cb = can_rx_offload_get_cb(skb); | ||
3495 | - ret = offload->mailbox_read(offload, cf, &cb->timestamp, n); | ||
3496 | - | ||
3497 | - /* Mailbox was empty. */ | ||
3498 | - if (unlikely(!ret)) { | ||
3499 | - kfree_skb(skb); | ||
3500 | - return NULL; | ||
3501 | - } | ||
3502 | - | ||
3503 | - /* There was a problem reading the mailbox, propagate error value. */ | ||
3504 | - if (unlikely(ret < 0)) { | ||
3505 | - kfree_skb(skb); | ||
3506 | - | ||
3507 | - offload->dev->stats.rx_dropped++; | ||
3508 | - offload->dev->stats.rx_fifo_errors++; | ||
3509 | - | ||
3510 | - return ERR_PTR(ret); | ||
3511 | - } | ||
3512 | - | ||
3513 | - /* Mailbox was read. */ | ||
3514 | - return skb; | ||
3515 | -} | ||
3516 | - | ||
3517 | -int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pending) | ||
3518 | -{ | ||
3519 | - struct sk_buff_head skb_queue; | ||
3520 | - unsigned int i; | ||
3521 | - | ||
3522 | - __skb_queue_head_init(&skb_queue); | ||
3523 | - | ||
3524 | - for (i = offload->mb_first; | ||
3525 | - can_rx_offload_le(offload, i, offload->mb_last); | ||
3526 | - can_rx_offload_inc(offload, &i)) { | ||
3527 | - struct sk_buff *skb; | ||
3528 | - | ||
3529 | - if (!(pending & BIT_ULL(i))) | ||
3530 | - continue; | ||
3531 | - | ||
3532 | - skb = can_rx_offload_offload_one(offload, i); | ||
3533 | - if (IS_ERR_OR_NULL(skb)) | ||
3534 | - continue; | ||
3535 | - | ||
3536 | - __skb_queue_add_sort(&skb_queue, skb, can_rx_offload_compare); | ||
3537 | - } | ||
3538 | - | ||
3539 | - if (!skb_queue_empty(&skb_queue)) { | ||
3540 | - unsigned long flags; | ||
3541 | - u32 queue_len; | ||
3542 | - | ||
3543 | - spin_lock_irqsave(&offload->skb_queue.lock, flags); | ||
3544 | - skb_queue_splice_tail(&skb_queue, &offload->skb_queue); | ||
3545 | - spin_unlock_irqrestore(&offload->skb_queue.lock, flags); | ||
3546 | - | ||
3547 | - if ((queue_len = skb_queue_len(&offload->skb_queue)) > | ||
3548 | - (offload->skb_queue_len_max / 8)) | ||
3549 | - netdev_dbg(offload->dev, "%s: queue_len=%d\n", | ||
3550 | - __func__, queue_len); | ||
3551 | - | ||
3552 | - can_rx_offload_schedule(offload); | ||
3553 | - } | ||
3554 | - | ||
3555 | - return skb_queue_len(&skb_queue); | ||
3556 | -} | ||
3557 | -EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_timestamp); | ||
3558 | - | ||
3559 | -int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload) | ||
3560 | -{ | ||
3561 | - struct sk_buff *skb; | ||
3562 | - int received = 0; | ||
3563 | - | ||
3564 | - while (1) { | ||
3565 | - skb = can_rx_offload_offload_one(offload, 0); | ||
3566 | - if (IS_ERR(skb)) | ||
3567 | - continue; | ||
3568 | - if (!skb) | ||
3569 | - break; | ||
3570 | - | ||
3571 | - skb_queue_tail(&offload->skb_queue, skb); | ||
3572 | - received++; | ||
3573 | - } | ||
3574 | - | ||
3575 | - if (received) | ||
3576 | - can_rx_offload_schedule(offload); | ||
3577 | - | ||
3578 | - return received; | ||
3579 | -} | ||
3580 | -EXPORT_SYMBOL_GPL(can_rx_offload_irq_offload_fifo); | ||
3581 | - | ||
3582 | -int can_rx_offload_queue_sorted(struct can_rx_offload *offload, | ||
3583 | - struct sk_buff *skb, u32 timestamp) | ||
3584 | -{ | ||
3585 | - struct can_rx_offload_cb *cb; | ||
3586 | - unsigned long flags; | ||
3587 | - | ||
3588 | - if (skb_queue_len(&offload->skb_queue) > | ||
3589 | - offload->skb_queue_len_max) { | ||
3590 | - dev_kfree_skb_any(skb); | ||
3591 | - return -ENOBUFS; | ||
3592 | - } | ||
3593 | - | ||
3594 | - cb = can_rx_offload_get_cb(skb); | ||
3595 | - cb->timestamp = timestamp; | ||
3596 | - | ||
3597 | - spin_lock_irqsave(&offload->skb_queue.lock, flags); | ||
3598 | - __skb_queue_add_sort(&offload->skb_queue, skb, can_rx_offload_compare); | ||
3599 | - spin_unlock_irqrestore(&offload->skb_queue.lock, flags); | ||
3600 | - | ||
3601 | - can_rx_offload_schedule(offload); | ||
3602 | - | ||
3603 | - return 0; | ||
3604 | -} | ||
3605 | -EXPORT_SYMBOL_GPL(can_rx_offload_queue_sorted); | ||
3606 | - | ||
3607 | -unsigned int can_rx_offload_get_echo_skb(struct can_rx_offload *offload, | ||
3608 | - unsigned int idx, u32 timestamp) | ||
3609 | -{ | ||
3610 | - struct net_device *dev = offload->dev; | ||
3611 | - struct net_device_stats *stats = &dev->stats; | ||
3612 | - struct sk_buff *skb; | ||
3613 | - u8 len; | ||
3614 | - int err; | ||
3615 | - | ||
3616 | - skb = __can_get_echo_skb(dev, idx, &len); | ||
3617 | - if (!skb) | ||
3618 | - return 0; | ||
3619 | - | ||
3620 | - err = can_rx_offload_queue_sorted(offload, skb, timestamp); | ||
3621 | - if (err) { | ||
3622 | - stats->rx_errors++; | ||
3623 | - stats->tx_fifo_errors++; | ||
3624 | - } | ||
3625 | - | ||
3626 | - return len; | ||
3627 | -} | ||
3628 | -EXPORT_SYMBOL_GPL(can_rx_offload_get_echo_skb); | ||
3629 | - | ||
3630 | -int can_rx_offload_queue_tail(struct can_rx_offload *offload, | ||
3631 | - struct sk_buff *skb) | ||
3632 | -{ | ||
3633 | - if (skb_queue_len(&offload->skb_queue) > | ||
3634 | - offload->skb_queue_len_max) { | ||
3635 | - dev_kfree_skb_any(skb); | ||
3636 | - return -ENOBUFS; | ||
3637 | - } | ||
3638 | - | ||
3639 | - skb_queue_tail(&offload->skb_queue, skb); | ||
3640 | - can_rx_offload_schedule(offload); | ||
3641 | - | ||
3642 | - return 0; | ||
3643 | -} | ||
3644 | -EXPORT_SYMBOL_GPL(can_rx_offload_queue_tail); | ||
3645 | - | ||
3646 | -static int can_rx_offload_init_queue(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) | ||
3647 | -{ | ||
3648 | - offload->dev = dev; | ||
3649 | - | ||
3650 | - /* Limit queue len to 4x the weight (rounted to next power of two) */ | ||
3651 | - offload->skb_queue_len_max = 2 << fls(weight); | ||
3652 | - offload->skb_queue_len_max *= 4; | ||
3653 | - skb_queue_head_init(&offload->skb_queue); | ||
3654 | - | ||
3655 | - can_rx_offload_reset(offload); | ||
3656 | - netif_napi_add(dev, &offload->napi, can_rx_offload_napi_poll, weight); | ||
3657 | - | ||
3658 | - dev_dbg(dev->dev.parent, "%s: skb_queue_len_max=%d\n", | ||
3659 | - __func__, offload->skb_queue_len_max); | ||
3660 | - | ||
3661 | - return 0; | ||
3662 | -} | ||
3663 | - | ||
3664 | -int can_rx_offload_add_timestamp(struct net_device *dev, struct can_rx_offload *offload) | ||
3665 | -{ | ||
3666 | - unsigned int weight; | ||
3667 | - | ||
3668 | - if (offload->mb_first > BITS_PER_LONG_LONG || | ||
3669 | - offload->mb_last > BITS_PER_LONG_LONG || !offload->mailbox_read) | ||
3670 | - return -EINVAL; | ||
3671 | - | ||
3672 | - if (offload->mb_first < offload->mb_last) { | ||
3673 | - offload->inc = true; | ||
3674 | - weight = offload->mb_last - offload->mb_first; | ||
3675 | - } else { | ||
3676 | - offload->inc = false; | ||
3677 | - weight = offload->mb_first - offload->mb_last; | ||
3678 | - } | ||
3679 | - | ||
3680 | - return can_rx_offload_init_queue(dev, offload, weight); | ||
3681 | -} | ||
3682 | -EXPORT_SYMBOL_GPL(can_rx_offload_add_timestamp); | ||
3683 | - | ||
3684 | -int can_rx_offload_add_fifo(struct net_device *dev, struct can_rx_offload *offload, unsigned int weight) | ||
3685 | -{ | ||
3686 | - if (!offload->mailbox_read) | ||
3687 | - return -EINVAL; | ||
3688 | - | ||
3689 | - return can_rx_offload_init_queue(dev, offload, weight); | ||
3690 | -} | ||
3691 | -EXPORT_SYMBOL_GPL(can_rx_offload_add_fifo); | ||
3692 | - | ||
3693 | -void can_rx_offload_enable(struct can_rx_offload *offload) | ||
3694 | -{ | ||
3695 | - can_rx_offload_reset(offload); | ||
3696 | - napi_enable(&offload->napi); | ||
3697 | -} | ||
3698 | -EXPORT_SYMBOL_GPL(can_rx_offload_enable); | ||
3699 | - | ||
3700 | -void can_rx_offload_del(struct can_rx_offload *offload) | ||
3701 | -{ | ||
3702 | - netif_napi_del(&offload->napi); | ||
3703 | - skb_queue_purge(&offload->skb_queue); | ||
3704 | -} | ||
3705 | -EXPORT_SYMBOL_GPL(can_rx_offload_del); | ||
3706 | - | ||
3707 | -void can_rx_offload_reset(struct can_rx_offload *offload) | ||
3708 | -{ | ||
3709 | -} | ||
3710 | -EXPORT_SYMBOL_GPL(can_rx_offload_reset); | ||
3711 | diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c | ||
3712 | index 4dfa459ef5c73..95fefb1eef361 100644 | ||
3713 | --- a/drivers/net/can/slcan.c | ||
3714 | +++ b/drivers/net/can/slcan.c | ||
3715 | @@ -519,6 +519,7 @@ static struct slcan *slc_alloc(void) | ||
3716 | int i; | ||
3717 | char name[IFNAMSIZ]; | ||
3718 | struct net_device *dev = NULL; | ||
3719 | + struct can_ml_priv *can_ml; | ||
3720 | struct slcan *sl; | ||
3721 | int size; | ||
3722 | |||
3723 | @@ -541,7 +542,8 @@ static struct slcan *slc_alloc(void) | ||
3724 | |||
3725 | dev->base_addr = i; | ||
3726 | sl = netdev_priv(dev); | ||
3727 | - dev->ml_priv = (void *)sl + ALIGN(sizeof(*sl), NETDEV_ALIGN); | ||
3728 | + can_ml = (void *)sl + ALIGN(sizeof(*sl), NETDEV_ALIGN); | ||
3729 | + can_set_ml_priv(dev, can_ml); | ||
3730 | |||
3731 | /* Initialize channel control data */ | ||
3732 | sl->magic = SLCAN_MAGIC; | ||
3733 | diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c | ||
3734 | index 39ca14b0585dc..067705e2850b3 100644 | ||
3735 | --- a/drivers/net/can/vcan.c | ||
3736 | +++ b/drivers/net/can/vcan.c | ||
3737 | @@ -153,7 +153,7 @@ static void vcan_setup(struct net_device *dev) | ||
3738 | dev->addr_len = 0; | ||
3739 | dev->tx_queue_len = 0; | ||
3740 | dev->flags = IFF_NOARP; | ||
3741 | - dev->ml_priv = netdev_priv(dev); | ||
3742 | + can_set_ml_priv(dev, netdev_priv(dev)); | ||
3743 | |||
3744 | /* set flags according to driver capabilities */ | ||
3745 | if (echo) | ||
3746 | diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c | ||
3747 | index b1baa4ac1d537..7000c6cd1e48b 100644 | ||
3748 | --- a/drivers/net/can/vxcan.c | ||
3749 | +++ b/drivers/net/can/vxcan.c | ||
3750 | @@ -141,6 +141,8 @@ static const struct net_device_ops vxcan_netdev_ops = { | ||
3751 | |||
3752 | static void vxcan_setup(struct net_device *dev) | ||
3753 | { | ||
3754 | + struct can_ml_priv *can_ml; | ||
3755 | + | ||
3756 | dev->type = ARPHRD_CAN; | ||
3757 | dev->mtu = CANFD_MTU; | ||
3758 | dev->hard_header_len = 0; | ||
3759 | @@ -149,7 +151,9 @@ static void vxcan_setup(struct net_device *dev) | ||
3760 | dev->flags = (IFF_NOARP|IFF_ECHO); | ||
3761 | dev->netdev_ops = &vxcan_netdev_ops; | ||
3762 | dev->needs_free_netdev = true; | ||
3763 | - dev->ml_priv = netdev_priv(dev) + ALIGN(sizeof(struct vxcan_priv), NETDEV_ALIGN); | ||
3764 | + | ||
3765 | + can_ml = netdev_priv(dev) + ALIGN(sizeof(struct vxcan_priv), NETDEV_ALIGN); | ||
3766 | + can_set_ml_priv(dev, can_ml); | ||
3767 | } | ||
3768 | |||
3769 | /* forward declaration for rtnl_create_link() */ | ||
3770 | diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_main.c b/drivers/net/ethernet/aquantia/atlantic/aq_main.c | ||
3771 | index bb65dd39f8474..72c7404ae6c5b 100644 | ||
3772 | --- a/drivers/net/ethernet/aquantia/atlantic/aq_main.c | ||
3773 | +++ b/drivers/net/ethernet/aquantia/atlantic/aq_main.c | ||
3774 | @@ -66,8 +66,10 @@ static int aq_ndev_open(struct net_device *ndev) | ||
3775 | goto err_exit; | ||
3776 | |||
3777 | err = aq_nic_start(aq_nic); | ||
3778 | - if (err < 0) | ||
3779 | + if (err < 0) { | ||
3780 | + aq_nic_stop(aq_nic); | ||
3781 | goto err_exit; | ||
3782 | + } | ||
3783 | |||
3784 | err_exit: | ||
3785 | if (err < 0) | ||
3786 | diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
3787 | index 9a77b70ad601b..491bcfd36ac25 100644 | ||
3788 | --- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
3789 | +++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c | ||
3790 | @@ -1073,7 +1073,7 @@ static void mvpp2_interrupts_unmask(void *arg) | ||
3791 | u32 val; | ||
3792 | |||
3793 | /* If the thread isn't used, don't do anything */ | ||
3794 | - if (smp_processor_id() > port->priv->nthreads) | ||
3795 | + if (smp_processor_id() >= port->priv->nthreads) | ||
3796 | return; | ||
3797 | |||
3798 | val = MVPP2_CAUSE_MISC_SUM_MASK | | ||
3799 | @@ -2078,7 +2078,7 @@ static void mvpp2_txq_sent_counter_clear(void *arg) | ||
3800 | int queue; | ||
3801 | |||
3802 | /* If the thread isn't used, don't do anything */ | ||
3803 | - if (smp_processor_id() > port->priv->nthreads) | ||
3804 | + if (smp_processor_id() >= port->priv->nthreads) | ||
3805 | return; | ||
3806 | |||
3807 | for (queue = 0; queue < port->ntxqs; queue++) { | ||
3808 | diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c | ||
3809 | index 0e6a51525d913..f3deb2a2fa47d 100644 | ||
3810 | --- a/drivers/net/wan/lmc/lmc_main.c | ||
3811 | +++ b/drivers/net/wan/lmc/lmc_main.c | ||
3812 | @@ -912,6 +912,8 @@ static int lmc_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
3813 | break; | ||
3814 | default: | ||
3815 | printk(KERN_WARNING "%s: LMC UNKNOWN CARD!\n", dev->name); | ||
3816 | + unregister_hdlc_device(dev); | ||
3817 | + return -EIO; | ||
3818 | break; | ||
3819 | } | ||
3820 | |||
3821 | diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c | ||
3822 | index 3ec71f52e8fe1..d38276ac375e9 100644 | ||
3823 | --- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c | ||
3824 | +++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c | ||
3825 | @@ -445,13 +445,13 @@ static void ath10k_wmi_event_tdls_peer(struct ath10k *ar, struct sk_buff *skb) | ||
3826 | case WMI_TDLS_TEARDOWN_REASON_TX: | ||
3827 | case WMI_TDLS_TEARDOWN_REASON_RSSI: | ||
3828 | case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT: | ||
3829 | + rcu_read_lock(); | ||
3830 | station = ieee80211_find_sta_by_ifaddr(ar->hw, | ||
3831 | ev->peer_macaddr.addr, | ||
3832 | NULL); | ||
3833 | if (!station) { | ||
3834 | ath10k_warn(ar, "did not find station from tdls peer event"); | ||
3835 | - kfree(tb); | ||
3836 | - return; | ||
3837 | + goto exit; | ||
3838 | } | ||
3839 | arvif = ath10k_get_arvif(ar, __le32_to_cpu(ev->vdev_id)); | ||
3840 | ieee80211_tdls_oper_request( | ||
3841 | @@ -462,6 +462,9 @@ static void ath10k_wmi_event_tdls_peer(struct ath10k *ar, struct sk_buff *skb) | ||
3842 | ); | ||
3843 | break; | ||
3844 | } | ||
3845 | + | ||
3846 | +exit: | ||
3847 | + rcu_read_unlock(); | ||
3848 | kfree(tb); | ||
3849 | } | ||
3850 | |||
3851 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||
3852 | index 4ca50353538ef..cd813c69a1781 100644 | ||
3853 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||
3854 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c | ||
3855 | @@ -5382,7 +5382,8 @@ static bool brcmf_is_linkup(struct brcmf_cfg80211_vif *vif, | ||
3856 | return false; | ||
3857 | } | ||
3858 | |||
3859 | -static bool brcmf_is_linkdown(const struct brcmf_event_msg *e) | ||
3860 | +static bool brcmf_is_linkdown(struct brcmf_cfg80211_vif *vif, | ||
3861 | + const struct brcmf_event_msg *e) | ||
3862 | { | ||
3863 | u32 event = e->event_code; | ||
3864 | u16 flags = e->flags; | ||
3865 | @@ -5391,6 +5392,8 @@ static bool brcmf_is_linkdown(const struct brcmf_event_msg *e) | ||
3866 | (event == BRCMF_E_DISASSOC_IND) || | ||
3867 | ((event == BRCMF_E_LINK) && (!(flags & BRCMF_EVENT_MSG_LINK)))) { | ||
3868 | brcmf_dbg(CONN, "Processing link down\n"); | ||
3869 | + clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &vif->sme_state); | ||
3870 | + clear_bit(BRCMF_VIF_STATUS_ASSOC_SUCCESS, &vif->sme_state); | ||
3871 | return true; | ||
3872 | } | ||
3873 | return false; | ||
3874 | @@ -5683,7 +5686,7 @@ brcmf_notify_connect_status(struct brcmf_if *ifp, | ||
3875 | } else | ||
3876 | brcmf_bss_connect_done(cfg, ndev, e, true); | ||
3877 | brcmf_net_setcarrier(ifp, true); | ||
3878 | - } else if (brcmf_is_linkdown(e)) { | ||
3879 | + } else if (brcmf_is_linkdown(ifp->vif, e)) { | ||
3880 | brcmf_dbg(CONN, "Linkdown\n"); | ||
3881 | if (!brcmf_is_ibssmode(ifp->vif)) { | ||
3882 | brcmf_bss_connect_done(cfg, ndev, e, false); | ||
3883 | diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c | ||
3884 | index 930edfc32f597..59fe3204e965d 100644 | ||
3885 | --- a/drivers/pinctrl/pinctrl-rockchip.c | ||
3886 | +++ b/drivers/pinctrl/pinctrl-rockchip.c | ||
3887 | @@ -3386,12 +3386,15 @@ static int __maybe_unused rockchip_pinctrl_suspend(struct device *dev) | ||
3888 | static int __maybe_unused rockchip_pinctrl_resume(struct device *dev) | ||
3889 | { | ||
3890 | struct rockchip_pinctrl *info = dev_get_drvdata(dev); | ||
3891 | - int ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX, | ||
3892 | - rk3288_grf_gpio6c_iomux | | ||
3893 | - GPIO6C6_SEL_WRITE_ENABLE); | ||
3894 | + int ret; | ||
3895 | |||
3896 | - if (ret) | ||
3897 | - return ret; | ||
3898 | + if (info->ctrl->type == RK3288) { | ||
3899 | + ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX, | ||
3900 | + rk3288_grf_gpio6c_iomux | | ||
3901 | + GPIO6C6_SEL_WRITE_ENABLE); | ||
3902 | + if (ret) | ||
3903 | + return ret; | ||
3904 | + } | ||
3905 | |||
3906 | return pinctrl_force_default(info->pctl_dev); | ||
3907 | } | ||
3908 | diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h | ||
3909 | index d006f0a97b8cf..2236751a3a568 100644 | ||
3910 | --- a/drivers/scsi/qla2xxx/qla_target.h | ||
3911 | +++ b/drivers/scsi/qla2xxx/qla_target.h | ||
3912 | @@ -116,7 +116,6 @@ | ||
3913 | (min(1270, ((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD_24XX + \ | ||
3914 | QLA_TGT_DATASEGS_PER_CONT_24XX*((ql) - 1)) : 0)) | ||
3915 | #endif | ||
3916 | -#endif | ||
3917 | |||
3918 | #define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha)) \ | ||
3919 | ? le16_to_cpu((iocb)->u.isp2x.target.extended) \ | ||
3920 | @@ -244,6 +243,7 @@ struct ctio_to_2xxx { | ||
3921 | #ifndef CTIO_RET_TYPE | ||
3922 | #define CTIO_RET_TYPE 0x17 /* CTIO return entry */ | ||
3923 | #define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */ | ||
3924 | +#endif | ||
3925 | |||
3926 | struct fcp_hdr { | ||
3927 | uint8_t r_ctl; | ||
3928 | diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c | ||
3929 | index e3266a64a4770..2121e44c342f8 100644 | ||
3930 | --- a/drivers/scsi/st.c | ||
3931 | +++ b/drivers/scsi/st.c | ||
3932 | @@ -1267,8 +1267,8 @@ static int st_open(struct inode *inode, struct file *filp) | ||
3933 | spin_lock(&st_use_lock); | ||
3934 | if (STp->in_use) { | ||
3935 | spin_unlock(&st_use_lock); | ||
3936 | - scsi_tape_put(STp); | ||
3937 | DEBC_printk(STp, "Device already in use.\n"); | ||
3938 | + scsi_tape_put(STp); | ||
3939 | return (-EBUSY); | ||
3940 | } | ||
3941 | |||
3942 | diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c b/drivers/staging/comedi/drivers/cb_pcidas.c | ||
3943 | index 1893c70de0b93..10f097a7d847d 100644 | ||
3944 | --- a/drivers/staging/comedi/drivers/cb_pcidas.c | ||
3945 | +++ b/drivers/staging/comedi/drivers/cb_pcidas.c | ||
3946 | @@ -1281,7 +1281,7 @@ static int cb_pcidas_auto_attach(struct comedi_device *dev, | ||
3947 | devpriv->amcc + AMCC_OP_REG_INTCSR); | ||
3948 | |||
3949 | ret = request_irq(pcidev->irq, cb_pcidas_interrupt, IRQF_SHARED, | ||
3950 | - dev->board_name, dev); | ||
3951 | + "cb_pcidas", dev); | ||
3952 | if (ret) { | ||
3953 | dev_dbg(dev->class_dev, "unable to allocate irq %d\n", | ||
3954 | pcidev->irq); | ||
3955 | diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c | ||
3956 | index e1774e09a3203..9fe8b65cd9e3a 100644 | ||
3957 | --- a/drivers/staging/comedi/drivers/cb_pcidas64.c | ||
3958 | +++ b/drivers/staging/comedi/drivers/cb_pcidas64.c | ||
3959 | @@ -4035,7 +4035,7 @@ static int auto_attach(struct comedi_device *dev, | ||
3960 | init_stc_registers(dev); | ||
3961 | |||
3962 | retval = request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED, | ||
3963 | - dev->board_name, dev); | ||
3964 | + "cb_pcidas64", dev); | ||
3965 | if (retval) { | ||
3966 | dev_dbg(dev->class_dev, "unable to allocate irq %u\n", | ||
3967 | pcidev->irq); | ||
3968 | diff --git a/drivers/staging/rtl8192e/rtllib.h b/drivers/staging/rtl8192e/rtllib.h | ||
3969 | index 328f410daa035..2eeb9a43734e3 100644 | ||
3970 | --- a/drivers/staging/rtl8192e/rtllib.h | ||
3971 | +++ b/drivers/staging/rtl8192e/rtllib.h | ||
3972 | @@ -1105,7 +1105,7 @@ struct rtllib_network { | ||
3973 | bool bWithAironetIE; | ||
3974 | bool bCkipSupported; | ||
3975 | bool bCcxRmEnable; | ||
3976 | - u16 CcxRmState[2]; | ||
3977 | + u8 CcxRmState[2]; | ||
3978 | bool bMBssidValid; | ||
3979 | u8 MBssidMask; | ||
3980 | u8 MBssid[ETH_ALEN]; | ||
3981 | diff --git a/drivers/staging/rtl8192e/rtllib_rx.c b/drivers/staging/rtl8192e/rtllib_rx.c | ||
3982 | index 0bae0a0a4cbe1..83c30e2d82f5f 100644 | ||
3983 | --- a/drivers/staging/rtl8192e/rtllib_rx.c | ||
3984 | +++ b/drivers/staging/rtl8192e/rtllib_rx.c | ||
3985 | @@ -1968,7 +1968,7 @@ static void rtllib_parse_mife_generic(struct rtllib_device *ieee, | ||
3986 | info_element->data[2] == 0x96 && | ||
3987 | info_element->data[3] == 0x01) { | ||
3988 | if (info_element->len == 6) { | ||
3989 | - memcpy(network->CcxRmState, &info_element[4], 2); | ||
3990 | + memcpy(network->CcxRmState, &info_element->data[4], 2); | ||
3991 | if (network->CcxRmState[0] != 0) | ||
3992 | network->bCcxRmEnable = true; | ||
3993 | else | ||
3994 | diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c | ||
3995 | index aa99edb4dff7d..4dce4a8f71ed9 100644 | ||
3996 | --- a/drivers/thermal/thermal_sysfs.c | ||
3997 | +++ b/drivers/thermal/thermal_sysfs.c | ||
3998 | @@ -770,6 +770,9 @@ void thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev, | ||
3999 | { | ||
4000 | struct cooling_dev_stats *stats = cdev->stats; | ||
4001 | |||
4002 | + if (!stats) | ||
4003 | + return; | ||
4004 | + | ||
4005 | spin_lock(&stats->lock); | ||
4006 | |||
4007 | if (stats->state == new_state) | ||
4008 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
4009 | index 00bfc81f24702..2b672840dfd9a 100644 | ||
4010 | --- a/drivers/usb/class/cdc-acm.c | ||
4011 | +++ b/drivers/usb/class/cdc-acm.c | ||
4012 | @@ -147,17 +147,29 @@ static inline int acm_set_control(struct acm *acm, int control) | ||
4013 | #define acm_send_break(acm, ms) \ | ||
4014 | acm_ctrl_msg(acm, USB_CDC_REQ_SEND_BREAK, ms, NULL, 0) | ||
4015 | |||
4016 | -static void acm_kill_urbs(struct acm *acm) | ||
4017 | +static void acm_poison_urbs(struct acm *acm) | ||
4018 | { | ||
4019 | int i; | ||
4020 | |||
4021 | - usb_kill_urb(acm->ctrlurb); | ||
4022 | + usb_poison_urb(acm->ctrlurb); | ||
4023 | for (i = 0; i < ACM_NW; i++) | ||
4024 | - usb_kill_urb(acm->wb[i].urb); | ||
4025 | + usb_poison_urb(acm->wb[i].urb); | ||
4026 | for (i = 0; i < acm->rx_buflimit; i++) | ||
4027 | - usb_kill_urb(acm->read_urbs[i]); | ||
4028 | + usb_poison_urb(acm->read_urbs[i]); | ||
4029 | } | ||
4030 | |||
4031 | +static void acm_unpoison_urbs(struct acm *acm) | ||
4032 | +{ | ||
4033 | + int i; | ||
4034 | + | ||
4035 | + for (i = 0; i < acm->rx_buflimit; i++) | ||
4036 | + usb_unpoison_urb(acm->read_urbs[i]); | ||
4037 | + for (i = 0; i < ACM_NW; i++) | ||
4038 | + usb_unpoison_urb(acm->wb[i].urb); | ||
4039 | + usb_unpoison_urb(acm->ctrlurb); | ||
4040 | +} | ||
4041 | + | ||
4042 | + | ||
4043 | /* | ||
4044 | * Write buffer management. | ||
4045 | * All of these assume proper locks taken by the caller. | ||
4046 | @@ -225,9 +237,10 @@ static int acm_start_wb(struct acm *acm, struct acm_wb *wb) | ||
4047 | |||
4048 | rc = usb_submit_urb(wb->urb, GFP_ATOMIC); | ||
4049 | if (rc < 0) { | ||
4050 | - dev_err(&acm->data->dev, | ||
4051 | - "%s - usb_submit_urb(write bulk) failed: %d\n", | ||
4052 | - __func__, rc); | ||
4053 | + if (rc != -EPERM) | ||
4054 | + dev_err(&acm->data->dev, | ||
4055 | + "%s - usb_submit_urb(write bulk) failed: %d\n", | ||
4056 | + __func__, rc); | ||
4057 | acm_write_done(acm, wb); | ||
4058 | } | ||
4059 | return rc; | ||
4060 | @@ -312,8 +325,10 @@ static void acm_process_notification(struct acm *acm, unsigned char *buf) | ||
4061 | acm->iocount.dsr++; | ||
4062 | if (difference & ACM_CTRL_DCD) | ||
4063 | acm->iocount.dcd++; | ||
4064 | - if (newctrl & ACM_CTRL_BRK) | ||
4065 | + if (newctrl & ACM_CTRL_BRK) { | ||
4066 | acm->iocount.brk++; | ||
4067 | + tty_insert_flip_char(&acm->port, 0, TTY_BREAK); | ||
4068 | + } | ||
4069 | if (newctrl & ACM_CTRL_RI) | ||
4070 | acm->iocount.rng++; | ||
4071 | if (newctrl & ACM_CTRL_FRAMING) | ||
4072 | @@ -479,11 +494,6 @@ static void acm_read_bulk_callback(struct urb *urb) | ||
4073 | dev_vdbg(&acm->data->dev, "got urb %d, len %d, status %d\n", | ||
4074 | rb->index, urb->actual_length, status); | ||
4075 | |||
4076 | - if (!acm->dev) { | ||
4077 | - dev_dbg(&acm->data->dev, "%s - disconnected\n", __func__); | ||
4078 | - return; | ||
4079 | - } | ||
4080 | - | ||
4081 | switch (status) { | ||
4082 | case 0: | ||
4083 | usb_mark_last_busy(acm->dev); | ||
4084 | @@ -648,7 +658,8 @@ static void acm_port_dtr_rts(struct tty_port *port, int raise) | ||
4085 | |||
4086 | res = acm_set_control(acm, val); | ||
4087 | if (res && (acm->ctrl_caps & USB_CDC_CAP_LINE)) | ||
4088 | - dev_err(&acm->control->dev, "failed to set dtr/rts\n"); | ||
4089 | + /* This is broken in too many devices to spam the logs */ | ||
4090 | + dev_dbg(&acm->control->dev, "failed to set dtr/rts\n"); | ||
4091 | } | ||
4092 | |||
4093 | static int acm_port_activate(struct tty_port *port, struct tty_struct *tty) | ||
4094 | @@ -730,6 +741,7 @@ static void acm_port_shutdown(struct tty_port *port) | ||
4095 | * Need to grab write_lock to prevent race with resume, but no need to | ||
4096 | * hold it due to the tty-port initialised flag. | ||
4097 | */ | ||
4098 | + acm_poison_urbs(acm); | ||
4099 | spin_lock_irq(&acm->write_lock); | ||
4100 | spin_unlock_irq(&acm->write_lock); | ||
4101 | |||
4102 | @@ -746,7 +758,8 @@ static void acm_port_shutdown(struct tty_port *port) | ||
4103 | usb_autopm_put_interface_async(acm->control); | ||
4104 | } | ||
4105 | |||
4106 | - acm_kill_urbs(acm); | ||
4107 | + acm_unpoison_urbs(acm); | ||
4108 | + | ||
4109 | } | ||
4110 | |||
4111 | static void acm_tty_cleanup(struct tty_struct *tty) | ||
4112 | @@ -1516,12 +1529,16 @@ skip_countries: | ||
4113 | |||
4114 | return 0; | ||
4115 | alloc_fail6: | ||
4116 | + if (!acm->combined_interfaces) { | ||
4117 | + /* Clear driver data so that disconnect() returns early. */ | ||
4118 | + usb_set_intfdata(data_interface, NULL); | ||
4119 | + usb_driver_release_interface(&acm_driver, data_interface); | ||
4120 | + } | ||
4121 | if (acm->country_codes) { | ||
4122 | device_remove_file(&acm->control->dev, | ||
4123 | &dev_attr_wCountryCodes); | ||
4124 | device_remove_file(&acm->control->dev, | ||
4125 | &dev_attr_iCountryCodeRelDate); | ||
4126 | - kfree(acm->country_codes); | ||
4127 | } | ||
4128 | device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities); | ||
4129 | alloc_fail5: | ||
4130 | @@ -1553,8 +1570,14 @@ static void acm_disconnect(struct usb_interface *intf) | ||
4131 | if (!acm) | ||
4132 | return; | ||
4133 | |||
4134 | - mutex_lock(&acm->mutex); | ||
4135 | acm->disconnected = true; | ||
4136 | + /* | ||
4137 | + * there is a circular dependency. acm_softint() can resubmit | ||
4138 | + * the URBs in error handling so we need to block any | ||
4139 | + * submission right away | ||
4140 | + */ | ||
4141 | + acm_poison_urbs(acm); | ||
4142 | + mutex_lock(&acm->mutex); | ||
4143 | if (acm->country_codes) { | ||
4144 | device_remove_file(&acm->control->dev, | ||
4145 | &dev_attr_wCountryCodes); | ||
4146 | @@ -1573,7 +1596,6 @@ static void acm_disconnect(struct usb_interface *intf) | ||
4147 | tty_kref_put(tty); | ||
4148 | } | ||
4149 | |||
4150 | - acm_kill_urbs(acm); | ||
4151 | cancel_delayed_work_sync(&acm->dwork); | ||
4152 | |||
4153 | tty_unregister_device(acm_tty_driver, acm->minor); | ||
4154 | @@ -1615,7 +1637,7 @@ static int acm_suspend(struct usb_interface *intf, pm_message_t message) | ||
4155 | if (cnt) | ||
4156 | return 0; | ||
4157 | |||
4158 | - acm_kill_urbs(acm); | ||
4159 | + acm_poison_urbs(acm); | ||
4160 | cancel_delayed_work_sync(&acm->dwork); | ||
4161 | acm->urbs_in_error_delay = 0; | ||
4162 | |||
4163 | @@ -1628,6 +1650,7 @@ static int acm_resume(struct usb_interface *intf) | ||
4164 | struct urb *urb; | ||
4165 | int rv = 0; | ||
4166 | |||
4167 | + acm_unpoison_urbs(acm); | ||
4168 | spin_lock_irq(&acm->write_lock); | ||
4169 | |||
4170 | if (--acm->susp_count) | ||
4171 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c | ||
4172 | index 239443ce52001..b8a4707dfafab 100644 | ||
4173 | --- a/drivers/usb/core/quirks.c | ||
4174 | +++ b/drivers/usb/core/quirks.c | ||
4175 | @@ -498,6 +498,10 @@ static const struct usb_device_id usb_quirk_list[] = { | ||
4176 | /* DJI CineSSD */ | ||
4177 | { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM }, | ||
4178 | |||
4179 | + /* Fibocom L850-GL LTE Modem */ | ||
4180 | + { USB_DEVICE(0x2cb7, 0x0007), .driver_info = | ||
4181 | + USB_QUIRK_IGNORE_REMOTE_WAKEUP }, | ||
4182 | + | ||
4183 | /* INTEL VALUE SSD */ | ||
4184 | { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME }, | ||
4185 | |||
4186 | diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c | ||
4187 | index a91f2aa24118a..258056c822069 100644 | ||
4188 | --- a/drivers/usb/dwc2/hcd.c | ||
4189 | +++ b/drivers/usb/dwc2/hcd.c | ||
4190 | @@ -4322,7 +4322,8 @@ static int _dwc2_hcd_suspend(struct usb_hcd *hcd) | ||
4191 | if (hsotg->op_state == OTG_STATE_B_PERIPHERAL) | ||
4192 | goto unlock; | ||
4193 | |||
4194 | - if (hsotg->params.power_down > DWC2_POWER_DOWN_PARAM_PARTIAL) | ||
4195 | + if (hsotg->params.power_down != DWC2_POWER_DOWN_PARAM_PARTIAL || | ||
4196 | + hsotg->flags.b.port_connect_status == 0) | ||
4197 | goto skip_power_saving; | ||
4198 | |||
4199 | /* | ||
4200 | @@ -5398,7 +5399,7 @@ int dwc2_host_enter_hibernation(struct dwc2_hsotg *hsotg) | ||
4201 | dwc2_writel(hsotg, hprt0, HPRT0); | ||
4202 | |||
4203 | /* Wait for the HPRT0.PrtSusp register field to be set */ | ||
4204 | - if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 3000)) | ||
4205 | + if (dwc2_hsotg_wait_bit_set(hsotg, HPRT0, HPRT0_SUSP, 5000)) | ||
4206 | dev_warn(hsotg->dev, "Suspend wasn't generated\n"); | ||
4207 | |||
4208 | /* | ||
4209 | diff --git a/drivers/usb/gadget/udc/amd5536udc_pci.c b/drivers/usb/gadget/udc/amd5536udc_pci.c | ||
4210 | index 57b6f66331cfa..362284057d307 100644 | ||
4211 | --- a/drivers/usb/gadget/udc/amd5536udc_pci.c | ||
4212 | +++ b/drivers/usb/gadget/udc/amd5536udc_pci.c | ||
4213 | @@ -154,6 +154,11 @@ static int udc_pci_probe( | ||
4214 | pci_set_master(pdev); | ||
4215 | pci_try_set_mwi(pdev); | ||
4216 | |||
4217 | + dev->phys_addr = resource; | ||
4218 | + dev->irq = pdev->irq; | ||
4219 | + dev->pdev = pdev; | ||
4220 | + dev->dev = &pdev->dev; | ||
4221 | + | ||
4222 | /* init dma pools */ | ||
4223 | if (use_dma) { | ||
4224 | retval = init_dma_pools(dev); | ||
4225 | @@ -161,11 +166,6 @@ static int udc_pci_probe( | ||
4226 | goto err_dma; | ||
4227 | } | ||
4228 | |||
4229 | - dev->phys_addr = resource; | ||
4230 | - dev->irq = pdev->irq; | ||
4231 | - dev->pdev = pdev; | ||
4232 | - dev->dev = &pdev->dev; | ||
4233 | - | ||
4234 | /* general probing */ | ||
4235 | if (udc_probe(dev)) { | ||
4236 | retval = -ENODEV; | ||
4237 | diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c | ||
4238 | index 09b67219fd146..5fc3ea6d46c56 100644 | ||
4239 | --- a/drivers/usb/host/xhci-mtk.c | ||
4240 | +++ b/drivers/usb/host/xhci-mtk.c | ||
4241 | @@ -397,6 +397,13 @@ static void xhci_mtk_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
4242 | xhci->quirks |= XHCI_SPURIOUS_SUCCESS; | ||
4243 | if (mtk->lpm_support) | ||
4244 | xhci->quirks |= XHCI_LPM_SUPPORT; | ||
4245 | + | ||
4246 | + /* | ||
4247 | + * MTK xHCI 0.96: PSA is 1 by default even if doesn't support stream, | ||
4248 | + * and it's 3 when support it. | ||
4249 | + */ | ||
4250 | + if (xhci->hci_version < 0x100 && HCC_MAX_PSA(xhci->hcc_params) == 4) | ||
4251 | + xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
4252 | } | ||
4253 | |||
4254 | /* called during probe() after chip reset completes */ | ||
4255 | @@ -553,7 +560,8 @@ static int xhci_mtk_probe(struct platform_device *pdev) | ||
4256 | if (ret) | ||
4257 | goto put_usb3_hcd; | ||
4258 | |||
4259 | - if (HCC_MAX_PSA(xhci->hcc_params) >= 4) | ||
4260 | + if (HCC_MAX_PSA(xhci->hcc_params) >= 4 && | ||
4261 | + !(xhci->quirks & XHCI_BROKEN_STREAMS)) | ||
4262 | xhci->shared_hcd->can_do_streams = 1; | ||
4263 | |||
4264 | ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED); | ||
4265 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c | ||
4266 | index 9fcff4e94484e..166f68f639c28 100644 | ||
4267 | --- a/drivers/usb/musb/musb_core.c | ||
4268 | +++ b/drivers/usb/musb/musb_core.c | ||
4269 | @@ -1866,10 +1866,14 @@ static void musb_pm_runtime_check_session(struct musb *musb) | ||
4270 | MUSB_DEVCTL_HR; | ||
4271 | switch (devctl & ~s) { | ||
4272 | case MUSB_QUIRK_B_DISCONNECT_99: | ||
4273 | - musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n"); | ||
4274 | - schedule_delayed_work(&musb->irq_work, | ||
4275 | - msecs_to_jiffies(1000)); | ||
4276 | - break; | ||
4277 | + if (musb->quirk_retries && !musb->flush_irq_work) { | ||
4278 | + musb_dbg(musb, "Poll devctl in case of suspend after disconnect\n"); | ||
4279 | + schedule_delayed_work(&musb->irq_work, | ||
4280 | + msecs_to_jiffies(1000)); | ||
4281 | + musb->quirk_retries--; | ||
4282 | + break; | ||
4283 | + } | ||
4284 | + fallthrough; | ||
4285 | case MUSB_QUIRK_B_INVALID_VBUS_91: | ||
4286 | if (musb->quirk_retries && !musb->flush_irq_work) { | ||
4287 | musb_dbg(musb, | ||
4288 | diff --git a/drivers/usb/usbip/vhci_hcd.c b/drivers/usb/usbip/vhci_hcd.c | ||
4289 | index fee511437abe3..1e0b618e2e6ec 100644 | ||
4290 | --- a/drivers/usb/usbip/vhci_hcd.c | ||
4291 | +++ b/drivers/usb/usbip/vhci_hcd.c | ||
4292 | @@ -595,6 +595,8 @@ static int vhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | ||
4293 | pr_err("invalid port number %d\n", wIndex); | ||
4294 | goto error; | ||
4295 | } | ||
4296 | + if (wValue >= 32) | ||
4297 | + goto error; | ||
4298 | if (hcd->speed == HCD_USB3) { | ||
4299 | if ((vhci_hcd->port_status[rhport] & | ||
4300 | USB_SS_PORT_STAT_POWER) != 0) { | ||
4301 | diff --git a/drivers/vfio/pci/Kconfig b/drivers/vfio/pci/Kconfig | ||
4302 | index ac3c1dd3edeff..4abddbebd4b23 100644 | ||
4303 | --- a/drivers/vfio/pci/Kconfig | ||
4304 | +++ b/drivers/vfio/pci/Kconfig | ||
4305 | @@ -42,6 +42,6 @@ config VFIO_PCI_IGD | ||
4306 | |||
4307 | config VFIO_PCI_NVLINK2 | ||
4308 | def_bool y | ||
4309 | - depends on VFIO_PCI && PPC_POWERNV | ||
4310 | + depends on VFIO_PCI && PPC_POWERNV && SPAPR_TCE_IOMMU | ||
4311 | help | ||
4312 | VFIO PCI support for P9 Witherspoon machine with NVIDIA V100 GPUs | ||
4313 | diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c | ||
4314 | index 57ab79fbcee95..a279ecacbf60a 100644 | ||
4315 | --- a/drivers/vhost/vhost.c | ||
4316 | +++ b/drivers/vhost/vhost.c | ||
4317 | @@ -320,8 +320,8 @@ static void vhost_vq_reset(struct vhost_dev *dev, | ||
4318 | vq->kick = NULL; | ||
4319 | vq->call_ctx = NULL; | ||
4320 | vq->log_ctx = NULL; | ||
4321 | - vhost_reset_is_le(vq); | ||
4322 | vhost_disable_cross_endian(vq); | ||
4323 | + vhost_reset_is_le(vq); | ||
4324 | vq->busyloop_timeout = 0; | ||
4325 | vq->umem = NULL; | ||
4326 | vq->iotlb = NULL; | ||
4327 | diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c | ||
4328 | index 4cf71ee0965a6..0a9202176ffc9 100644 | ||
4329 | --- a/drivers/video/fbdev/core/fbcon.c | ||
4330 | +++ b/drivers/video/fbdev/core/fbcon.c | ||
4331 | @@ -1339,6 +1339,9 @@ static void fbcon_cursor(struct vc_data *vc, int mode) | ||
4332 | |||
4333 | ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1; | ||
4334 | |||
4335 | + if (!ops->cursor) | ||
4336 | + return; | ||
4337 | + | ||
4338 | ops->cursor(vc, info, mode, get_color(vc, info, c, 1), | ||
4339 | get_color(vc, info, c, 0)); | ||
4340 | } | ||
4341 | diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c | ||
4342 | index 5aba67a504cf8..031ff3f190184 100644 | ||
4343 | --- a/fs/ext4/balloc.c | ||
4344 | +++ b/fs/ext4/balloc.c | ||
4345 | @@ -612,27 +612,41 @@ int ext4_claim_free_clusters(struct ext4_sb_info *sbi, | ||
4346 | |||
4347 | /** | ||
4348 | * ext4_should_retry_alloc() - check if a block allocation should be retried | ||
4349 | - * @sb: super block | ||
4350 | - * @retries: number of attemps has been made | ||
4351 | + * @sb: superblock | ||
4352 | + * @retries: number of retry attempts made so far | ||
4353 | * | ||
4354 | - * ext4_should_retry_alloc() is called when ENOSPC is returned, and if | ||
4355 | - * it is profitable to retry the operation, this function will wait | ||
4356 | - * for the current or committing transaction to complete, and then | ||
4357 | - * return TRUE. We will only retry once. | ||
4358 | + * ext4_should_retry_alloc() is called when ENOSPC is returned while | ||
4359 | + * attempting to allocate blocks. If there's an indication that a pending | ||
4360 | + * journal transaction might free some space and allow another attempt to | ||
4361 | + * succeed, this function will wait for the current or committing transaction | ||
4362 | + * to complete and then return TRUE. | ||
4363 | */ | ||
4364 | int ext4_should_retry_alloc(struct super_block *sb, int *retries) | ||
4365 | { | ||
4366 | - if (!ext4_has_free_clusters(EXT4_SB(sb), 1, 0) || | ||
4367 | - (*retries)++ > 1 || | ||
4368 | - !EXT4_SB(sb)->s_journal) | ||
4369 | + struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
4370 | + | ||
4371 | + if (!sbi->s_journal) | ||
4372 | return 0; | ||
4373 | |||
4374 | - smp_mb(); | ||
4375 | - if (EXT4_SB(sb)->s_mb_free_pending == 0) | ||
4376 | + if (++(*retries) > 3) { | ||
4377 | + percpu_counter_inc(&sbi->s_sra_exceeded_retry_limit); | ||
4378 | return 0; | ||
4379 | + } | ||
4380 | |||
4381 | + /* | ||
4382 | + * if there's no indication that blocks are about to be freed it's | ||
4383 | + * possible we just missed a transaction commit that did so | ||
4384 | + */ | ||
4385 | + smp_mb(); | ||
4386 | + if (sbi->s_mb_free_pending == 0) | ||
4387 | + return ext4_has_free_clusters(sbi, 1, 0); | ||
4388 | + | ||
4389 | + /* | ||
4390 | + * it's possible we've just missed a transaction commit here, | ||
4391 | + * so ignore the returned status | ||
4392 | + */ | ||
4393 | jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id); | ||
4394 | - jbd2_journal_force_commit_nested(EXT4_SB(sb)->s_journal); | ||
4395 | + (void) jbd2_journal_force_commit_nested(sbi->s_journal); | ||
4396 | return 1; | ||
4397 | } | ||
4398 | |||
4399 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
4400 | index 1c558b5547889..bf3eaa9030335 100644 | ||
4401 | --- a/fs/ext4/ext4.h | ||
4402 | +++ b/fs/ext4/ext4.h | ||
4403 | @@ -1420,6 +1420,7 @@ struct ext4_sb_info { | ||
4404 | struct percpu_counter s_freeinodes_counter; | ||
4405 | struct percpu_counter s_dirs_counter; | ||
4406 | struct percpu_counter s_dirtyclusters_counter; | ||
4407 | + struct percpu_counter s_sra_exceeded_retry_limit; | ||
4408 | struct blockgroup_lock *s_blockgroup_lock; | ||
4409 | struct proc_dir_entry *s_proc; | ||
4410 | struct kobject s_kobj; | ||
4411 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
4412 | index efce97b938b7a..1429d01d836bb 100644 | ||
4413 | --- a/fs/ext4/inode.c | ||
4414 | +++ b/fs/ext4/inode.c | ||
4415 | @@ -2076,13 +2076,13 @@ static int __ext4_journalled_writepage(struct page *page, | ||
4416 | if (!ret) | ||
4417 | ret = err; | ||
4418 | |||
4419 | - if (!ext4_has_inline_data(inode)) | ||
4420 | - ext4_walk_page_buffers(NULL, page_bufs, 0, len, | ||
4421 | - NULL, bput_one); | ||
4422 | ext4_set_inode_state(inode, EXT4_STATE_JDATA); | ||
4423 | out: | ||
4424 | unlock_page(page); | ||
4425 | out_no_pagelock: | ||
4426 | + if (!inline_data && page_bufs) | ||
4427 | + ext4_walk_page_buffers(NULL, page_bufs, 0, len, | ||
4428 | + NULL, bput_one); | ||
4429 | brelse(inode_bh); | ||
4430 | return ret; | ||
4431 | } | ||
4432 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
4433 | index e992a9f156714..4c37abe768512 100644 | ||
4434 | --- a/fs/ext4/namei.c | ||
4435 | +++ b/fs/ext4/namei.c | ||
4436 | @@ -3731,14 +3731,14 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | ||
4437 | */ | ||
4438 | retval = -ENOENT; | ||
4439 | if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) | ||
4440 | - goto end_rename; | ||
4441 | + goto release_bh; | ||
4442 | |||
4443 | new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, | ||
4444 | &new.de, &new.inlined); | ||
4445 | if (IS_ERR(new.bh)) { | ||
4446 | retval = PTR_ERR(new.bh); | ||
4447 | new.bh = NULL; | ||
4448 | - goto end_rename; | ||
4449 | + goto release_bh; | ||
4450 | } | ||
4451 | if (new.bh) { | ||
4452 | if (!new.inode) { | ||
4453 | @@ -3755,15 +3755,13 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, | ||
4454 | handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits); | ||
4455 | if (IS_ERR(handle)) { | ||
4456 | retval = PTR_ERR(handle); | ||
4457 | - handle = NULL; | ||
4458 | - goto end_rename; | ||
4459 | + goto release_bh; | ||
4460 | } | ||
4461 | } else { | ||
4462 | whiteout = ext4_whiteout_for_rename(&old, credits, &handle); | ||
4463 | if (IS_ERR(whiteout)) { | ||
4464 | retval = PTR_ERR(whiteout); | ||
4465 | - whiteout = NULL; | ||
4466 | - goto end_rename; | ||
4467 | + goto release_bh; | ||
4468 | } | ||
4469 | } | ||
4470 | |||
4471 | @@ -3871,16 +3869,18 @@ end_rename: | ||
4472 | ext4_resetent(handle, &old, | ||
4473 | old.inode->i_ino, old_file_type); | ||
4474 | drop_nlink(whiteout); | ||
4475 | + ext4_orphan_add(handle, whiteout); | ||
4476 | } | ||
4477 | unlock_new_inode(whiteout); | ||
4478 | + ext4_journal_stop(handle); | ||
4479 | iput(whiteout); | ||
4480 | - | ||
4481 | + } else { | ||
4482 | + ext4_journal_stop(handle); | ||
4483 | } | ||
4484 | +release_bh: | ||
4485 | brelse(old.dir_bh); | ||
4486 | brelse(old.bh); | ||
4487 | brelse(new.bh); | ||
4488 | - if (handle) | ||
4489 | - ext4_journal_stop(handle); | ||
4490 | return retval; | ||
4491 | } | ||
4492 | |||
4493 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
4494 | index 06568467b0c27..2ecf4594a20dd 100644 | ||
4495 | --- a/fs/ext4/super.c | ||
4496 | +++ b/fs/ext4/super.c | ||
4497 | @@ -1017,6 +1017,7 @@ static void ext4_put_super(struct super_block *sb) | ||
4498 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | ||
4499 | percpu_counter_destroy(&sbi->s_dirs_counter); | ||
4500 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); | ||
4501 | + percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit); | ||
4502 | percpu_free_rwsem(&sbi->s_writepages_rwsem); | ||
4503 | #ifdef CONFIG_QUOTA | ||
4504 | for (i = 0; i < EXT4_MAXQUOTAS; i++) | ||
4505 | @@ -4597,6 +4598,9 @@ no_journal: | ||
4506 | if (!err) | ||
4507 | err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0, | ||
4508 | GFP_KERNEL); | ||
4509 | + if (!err) | ||
4510 | + err = percpu_counter_init(&sbi->s_sra_exceeded_retry_limit, 0, | ||
4511 | + GFP_KERNEL); | ||
4512 | if (!err) | ||
4513 | err = percpu_init_rwsem(&sbi->s_writepages_rwsem); | ||
4514 | |||
4515 | @@ -4699,6 +4703,7 @@ failed_mount6: | ||
4516 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | ||
4517 | percpu_counter_destroy(&sbi->s_dirs_counter); | ||
4518 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); | ||
4519 | + percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit); | ||
4520 | percpu_free_rwsem(&sbi->s_writepages_rwsem); | ||
4521 | failed_mount5: | ||
4522 | ext4_ext_release(sb); | ||
4523 | diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c | ||
4524 | index eb1efad0e20a3..9394360ff1373 100644 | ||
4525 | --- a/fs/ext4/sysfs.c | ||
4526 | +++ b/fs/ext4/sysfs.c | ||
4527 | @@ -23,6 +23,7 @@ typedef enum { | ||
4528 | attr_session_write_kbytes, | ||
4529 | attr_lifetime_write_kbytes, | ||
4530 | attr_reserved_clusters, | ||
4531 | + attr_sra_exceeded_retry_limit, | ||
4532 | attr_inode_readahead, | ||
4533 | attr_trigger_test_error, | ||
4534 | attr_first_error_time, | ||
4535 | @@ -176,6 +177,7 @@ EXT4_ATTR_FUNC(delayed_allocation_blocks, 0444); | ||
4536 | EXT4_ATTR_FUNC(session_write_kbytes, 0444); | ||
4537 | EXT4_ATTR_FUNC(lifetime_write_kbytes, 0444); | ||
4538 | EXT4_ATTR_FUNC(reserved_clusters, 0644); | ||
4539 | +EXT4_ATTR_FUNC(sra_exceeded_retry_limit, 0444); | ||
4540 | |||
4541 | EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, inode_readahead, | ||
4542 | ext4_sb_info, s_inode_readahead_blks); | ||
4543 | @@ -207,6 +209,7 @@ static struct attribute *ext4_attrs[] = { | ||
4544 | ATTR_LIST(session_write_kbytes), | ||
4545 | ATTR_LIST(lifetime_write_kbytes), | ||
4546 | ATTR_LIST(reserved_clusters), | ||
4547 | + ATTR_LIST(sra_exceeded_retry_limit), | ||
4548 | ATTR_LIST(inode_readahead_blks), | ||
4549 | ATTR_LIST(inode_goal), | ||
4550 | ATTR_LIST(mb_stats), | ||
4551 | @@ -308,6 +311,10 @@ static ssize_t ext4_attr_show(struct kobject *kobj, | ||
4552 | return snprintf(buf, PAGE_SIZE, "%llu\n", | ||
4553 | (unsigned long long) | ||
4554 | atomic64_read(&sbi->s_resv_clusters)); | ||
4555 | + case attr_sra_exceeded_retry_limit: | ||
4556 | + return snprintf(buf, PAGE_SIZE, "%llu\n", | ||
4557 | + (unsigned long long) | ||
4558 | + percpu_counter_sum(&sbi->s_sra_exceeded_retry_limit)); | ||
4559 | case attr_inode_readahead: | ||
4560 | case attr_pointer_ui: | ||
4561 | if (!ptr) | ||
4562 | diff --git a/fs/iomap/swapfile.c b/fs/iomap/swapfile.c | ||
4563 | index 152a230f668d4..bd0cc3dcc9807 100644 | ||
4564 | --- a/fs/iomap/swapfile.c | ||
4565 | +++ b/fs/iomap/swapfile.c | ||
4566 | @@ -169,6 +169,16 @@ int iomap_swapfile_activate(struct swap_info_struct *sis, | ||
4567 | return ret; | ||
4568 | } | ||
4569 | |||
4570 | + /* | ||
4571 | + * If this swapfile doesn't contain even a single page-aligned | ||
4572 | + * contiguous range of blocks, reject this useless swapfile to | ||
4573 | + * prevent confusion later on. | ||
4574 | + */ | ||
4575 | + if (isi.nr_pages == 0) { | ||
4576 | + pr_warn("swapon: Cannot find a single usable page in file.\n"); | ||
4577 | + return -EINVAL; | ||
4578 | + } | ||
4579 | + | ||
4580 | *pagespan = 1 + isi.highest_ppage - isi.lowest_ppage; | ||
4581 | sis->max = isi.nr_pages; | ||
4582 | sis->pages = isi.nr_pages - 1; | ||
4583 | diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig | ||
4584 | index f2f81561ebb65..4d6e71335bce2 100644 | ||
4585 | --- a/fs/nfsd/Kconfig | ||
4586 | +++ b/fs/nfsd/Kconfig | ||
4587 | @@ -73,6 +73,7 @@ config NFSD_V4 | ||
4588 | select NFSD_V3 | ||
4589 | select FS_POSIX_ACL | ||
4590 | select SUNRPC_GSS | ||
4591 | + select CRYPTO | ||
4592 | select CRYPTO_MD5 | ||
4593 | select CRYPTO_SHA256 | ||
4594 | select GRACE_PERIOD | ||
4595 | diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c | ||
4596 | index efe55d101b0ed..3c50d18fe8a9b 100644 | ||
4597 | --- a/fs/nfsd/nfs4callback.c | ||
4598 | +++ b/fs/nfsd/nfs4callback.c | ||
4599 | @@ -1121,6 +1121,7 @@ static void nfsd4_cb_done(struct rpc_task *task, void *calldata) | ||
4600 | switch (task->tk_status) { | ||
4601 | case -EIO: | ||
4602 | case -ETIMEDOUT: | ||
4603 | + case -EACCES: | ||
4604 | nfsd4_mark_cb_down(clp, task->tk_status); | ||
4605 | } | ||
4606 | break; | ||
4607 | diff --git a/fs/reiserfs/xattr.h b/fs/reiserfs/xattr.h | ||
4608 | index c764352447ba1..81bec2c80b25c 100644 | ||
4609 | --- a/fs/reiserfs/xattr.h | ||
4610 | +++ b/fs/reiserfs/xattr.h | ||
4611 | @@ -43,7 +43,7 @@ void reiserfs_security_free(struct reiserfs_security_handle *sec); | ||
4612 | |||
4613 | static inline int reiserfs_xattrs_initialized(struct super_block *sb) | ||
4614 | { | ||
4615 | - return REISERFS_SB(sb)->priv_root != NULL; | ||
4616 | + return REISERFS_SB(sb)->priv_root && REISERFS_SB(sb)->xattr_root; | ||
4617 | } | ||
4618 | |||
4619 | #define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header)) | ||
4620 | diff --git a/include/linux/can/can-ml.h b/include/linux/can/can-ml.h | ||
4621 | index 2f5d731ae251d..8afa92d15a664 100644 | ||
4622 | --- a/include/linux/can/can-ml.h | ||
4623 | +++ b/include/linux/can/can-ml.h | ||
4624 | @@ -44,6 +44,7 @@ | ||
4625 | |||
4626 | #include <linux/can.h> | ||
4627 | #include <linux/list.h> | ||
4628 | +#include <linux/netdevice.h> | ||
4629 | |||
4630 | #define CAN_SFF_RCV_ARRAY_SZ (1 << CAN_SFF_ID_BITS) | ||
4631 | #define CAN_EFF_RCV_HASH_BITS 10 | ||
4632 | @@ -65,4 +66,15 @@ struct can_ml_priv { | ||
4633 | #endif | ||
4634 | }; | ||
4635 | |||
4636 | +static inline struct can_ml_priv *can_get_ml_priv(struct net_device *dev) | ||
4637 | +{ | ||
4638 | + return netdev_get_ml_priv(dev, ML_PRIV_CAN); | ||
4639 | +} | ||
4640 | + | ||
4641 | +static inline void can_set_ml_priv(struct net_device *dev, | ||
4642 | + struct can_ml_priv *ml_priv) | ||
4643 | +{ | ||
4644 | + netdev_set_ml_priv(dev, ml_priv, ML_PRIV_CAN); | ||
4645 | +} | ||
4646 | + | ||
4647 | #endif /* CAN_ML_H */ | ||
4648 | diff --git a/include/linux/extcon.h b/include/linux/extcon.h | ||
4649 | index 2bdf643d85937..47d3e19a49ae4 100644 | ||
4650 | --- a/include/linux/extcon.h | ||
4651 | +++ b/include/linux/extcon.h | ||
4652 | @@ -271,6 +271,29 @@ static inline void devm_extcon_unregister_notifier(struct device *dev, | ||
4653 | struct extcon_dev *edev, unsigned int id, | ||
4654 | struct notifier_block *nb) { } | ||
4655 | |||
4656 | +static inline int extcon_register_notifier_all(struct extcon_dev *edev, | ||
4657 | + struct notifier_block *nb) | ||
4658 | +{ | ||
4659 | + return 0; | ||
4660 | +} | ||
4661 | + | ||
4662 | +static inline int extcon_unregister_notifier_all(struct extcon_dev *edev, | ||
4663 | + struct notifier_block *nb) | ||
4664 | +{ | ||
4665 | + return 0; | ||
4666 | +} | ||
4667 | + | ||
4668 | +static inline int devm_extcon_register_notifier_all(struct device *dev, | ||
4669 | + struct extcon_dev *edev, | ||
4670 | + struct notifier_block *nb) | ||
4671 | +{ | ||
4672 | + return 0; | ||
4673 | +} | ||
4674 | + | ||
4675 | +static inline void devm_extcon_unregister_notifier_all(struct device *dev, | ||
4676 | + struct extcon_dev *edev, | ||
4677 | + struct notifier_block *nb) { } | ||
4678 | + | ||
4679 | static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name) | ||
4680 | { | ||
4681 | return ERR_PTR(-ENODEV); | ||
4682 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
4683 | index db1b9623977c8..11a52f2fa35de 100644 | ||
4684 | --- a/include/linux/netdevice.h | ||
4685 | +++ b/include/linux/netdevice.h | ||
4686 | @@ -1555,6 +1555,12 @@ enum netdev_priv_flags { | ||
4687 | #define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER | ||
4688 | #define IFF_LIVE_RENAME_OK IFF_LIVE_RENAME_OK | ||
4689 | |||
4690 | +/* Specifies the type of the struct net_device::ml_priv pointer */ | ||
4691 | +enum netdev_ml_priv_type { | ||
4692 | + ML_PRIV_NONE, | ||
4693 | + ML_PRIV_CAN, | ||
4694 | +}; | ||
4695 | + | ||
4696 | /** | ||
4697 | * struct net_device - The DEVICE structure. | ||
4698 | * | ||
4699 | @@ -1732,6 +1738,7 @@ enum netdev_priv_flags { | ||
4700 | * @nd_net: Network namespace this network device is inside | ||
4701 | * | ||
4702 | * @ml_priv: Mid-layer private | ||
4703 | + * @ml_priv_type: Mid-layer private type | ||
4704 | * @lstats: Loopback statistics | ||
4705 | * @tstats: Tunnel statistics | ||
4706 | * @dstats: Dummy statistics | ||
4707 | @@ -2019,8 +2026,10 @@ struct net_device { | ||
4708 | possible_net_t nd_net; | ||
4709 | |||
4710 | /* mid-layer private */ | ||
4711 | + void *ml_priv; | ||
4712 | + enum netdev_ml_priv_type ml_priv_type; | ||
4713 | + | ||
4714 | union { | ||
4715 | - void *ml_priv; | ||
4716 | struct pcpu_lstats __percpu *lstats; | ||
4717 | struct pcpu_sw_netstats __percpu *tstats; | ||
4718 | struct pcpu_dstats __percpu *dstats; | ||
4719 | @@ -2167,6 +2176,29 @@ static inline void netdev_reset_rx_headroom(struct net_device *dev) | ||
4720 | netdev_set_rx_headroom(dev, -1); | ||
4721 | } | ||
4722 | |||
4723 | +static inline void *netdev_get_ml_priv(struct net_device *dev, | ||
4724 | + enum netdev_ml_priv_type type) | ||
4725 | +{ | ||
4726 | + if (dev->ml_priv_type != type) | ||
4727 | + return NULL; | ||
4728 | + | ||
4729 | + return dev->ml_priv; | ||
4730 | +} | ||
4731 | + | ||
4732 | +static inline void netdev_set_ml_priv(struct net_device *dev, | ||
4733 | + void *ml_priv, | ||
4734 | + enum netdev_ml_priv_type type) | ||
4735 | +{ | ||
4736 | + WARN(dev->ml_priv_type && dev->ml_priv_type != type, | ||
4737 | + "Overwriting already set ml_priv_type (%u) with different ml_priv_type (%u)!\n", | ||
4738 | + dev->ml_priv_type, type); | ||
4739 | + WARN(!dev->ml_priv_type && dev->ml_priv, | ||
4740 | + "Overwriting already set ml_priv and ml_priv_type is ML_PRIV_NONE!\n"); | ||
4741 | + | ||
4742 | + dev->ml_priv = ml_priv; | ||
4743 | + dev->ml_priv_type = type; | ||
4744 | +} | ||
4745 | + | ||
4746 | /* | ||
4747 | * Net namespace inlines | ||
4748 | */ | ||
4749 | diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c | ||
4750 | index 468a9b8422e39..07a9f9f46e035 100644 | ||
4751 | --- a/kernel/locking/mutex.c | ||
4752 | +++ b/kernel/locking/mutex.c | ||
4753 | @@ -636,7 +636,7 @@ static inline int mutex_can_spin_on_owner(struct mutex *lock) | ||
4754 | */ | ||
4755 | static __always_inline bool | ||
4756 | mutex_optimistic_spin(struct mutex *lock, struct ww_acquire_ctx *ww_ctx, | ||
4757 | - const bool use_ww_ctx, struct mutex_waiter *waiter) | ||
4758 | + struct mutex_waiter *waiter) | ||
4759 | { | ||
4760 | if (!waiter) { | ||
4761 | /* | ||
4762 | @@ -712,7 +712,7 @@ fail: | ||
4763 | #else | ||
4764 | static __always_inline bool | ||
4765 | mutex_optimistic_spin(struct mutex *lock, struct ww_acquire_ctx *ww_ctx, | ||
4766 | - const bool use_ww_ctx, struct mutex_waiter *waiter) | ||
4767 | + struct mutex_waiter *waiter) | ||
4768 | { | ||
4769 | return false; | ||
4770 | } | ||
4771 | @@ -932,6 +932,9 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4772 | struct ww_mutex *ww; | ||
4773 | int ret; | ||
4774 | |||
4775 | + if (!use_ww_ctx) | ||
4776 | + ww_ctx = NULL; | ||
4777 | + | ||
4778 | might_sleep(); | ||
4779 | |||
4780 | #ifdef CONFIG_DEBUG_MUTEXES | ||
4781 | @@ -939,7 +942,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4782 | #endif | ||
4783 | |||
4784 | ww = container_of(lock, struct ww_mutex, base); | ||
4785 | - if (use_ww_ctx && ww_ctx) { | ||
4786 | + if (ww_ctx) { | ||
4787 | if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) | ||
4788 | return -EALREADY; | ||
4789 | |||
4790 | @@ -956,10 +959,10 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4791 | mutex_acquire_nest(&lock->dep_map, subclass, 0, nest_lock, ip); | ||
4792 | |||
4793 | if (__mutex_trylock(lock) || | ||
4794 | - mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx, NULL)) { | ||
4795 | + mutex_optimistic_spin(lock, ww_ctx, NULL)) { | ||
4796 | /* got the lock, yay! */ | ||
4797 | lock_acquired(&lock->dep_map, ip); | ||
4798 | - if (use_ww_ctx && ww_ctx) | ||
4799 | + if (ww_ctx) | ||
4800 | ww_mutex_set_context_fastpath(ww, ww_ctx); | ||
4801 | preempt_enable(); | ||
4802 | return 0; | ||
4803 | @@ -970,7 +973,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4804 | * After waiting to acquire the wait_lock, try again. | ||
4805 | */ | ||
4806 | if (__mutex_trylock(lock)) { | ||
4807 | - if (use_ww_ctx && ww_ctx) | ||
4808 | + if (ww_ctx) | ||
4809 | __ww_mutex_check_waiters(lock, ww_ctx); | ||
4810 | |||
4811 | goto skip_wait; | ||
4812 | @@ -1023,7 +1026,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4813 | goto err; | ||
4814 | } | ||
4815 | |||
4816 | - if (use_ww_ctx && ww_ctx) { | ||
4817 | + if (ww_ctx) { | ||
4818 | ret = __ww_mutex_check_kill(lock, &waiter, ww_ctx); | ||
4819 | if (ret) | ||
4820 | goto err; | ||
4821 | @@ -1036,7 +1039,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4822 | * ww_mutex needs to always recheck its position since its waiter | ||
4823 | * list is not FIFO ordered. | ||
4824 | */ | ||
4825 | - if ((use_ww_ctx && ww_ctx) || !first) { | ||
4826 | + if (ww_ctx || !first) { | ||
4827 | first = __mutex_waiter_is_first(lock, &waiter); | ||
4828 | if (first) | ||
4829 | __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF); | ||
4830 | @@ -1049,7 +1052,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4831 | * or we must see its unlock and acquire. | ||
4832 | */ | ||
4833 | if (__mutex_trylock(lock) || | ||
4834 | - (first && mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx, &waiter))) | ||
4835 | + (first && mutex_optimistic_spin(lock, ww_ctx, &waiter))) | ||
4836 | break; | ||
4837 | |||
4838 | spin_lock(&lock->wait_lock); | ||
4839 | @@ -1058,7 +1061,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, | ||
4840 | acquired: | ||
4841 | __set_current_state(TASK_RUNNING); | ||
4842 | |||
4843 | - if (use_ww_ctx && ww_ctx) { | ||
4844 | + if (ww_ctx) { | ||
4845 | /* | ||
4846 | * Wound-Wait; we stole the lock (!first_waiter), check the | ||
4847 | * waiters as anyone might want to wound us. | ||
4848 | @@ -1078,7 +1081,7 @@ skip_wait: | ||
4849 | /* got the lock - cleanup and rejoice! */ | ||
4850 | lock_acquired(&lock->dep_map, ip); | ||
4851 | |||
4852 | - if (use_ww_ctx && ww_ctx) | ||
4853 | + if (ww_ctx) | ||
4854 | ww_mutex_lock_acquired(ww, ww_ctx); | ||
4855 | |||
4856 | spin_unlock(&lock->wait_lock); | ||
4857 | diff --git a/kernel/module.c b/kernel/module.c | ||
4858 | index ab1f97cfe18dc..c60559b5bf101 100644 | ||
4859 | --- a/kernel/module.c | ||
4860 | +++ b/kernel/module.c | ||
4861 | @@ -2908,20 +2908,14 @@ static int module_sig_check(struct load_info *info, int flags) | ||
4862 | * enforcing, certain errors are non-fatal. | ||
4863 | */ | ||
4864 | case -ENODATA: | ||
4865 | - reason = "Loading of unsigned module"; | ||
4866 | - goto decide; | ||
4867 | + reason = "unsigned module"; | ||
4868 | + break; | ||
4869 | case -ENOPKG: | ||
4870 | - reason = "Loading of module with unsupported crypto"; | ||
4871 | - goto decide; | ||
4872 | + reason = "module with unsupported crypto"; | ||
4873 | + break; | ||
4874 | case -ENOKEY: | ||
4875 | - reason = "Loading of module with unavailable key"; | ||
4876 | - decide: | ||
4877 | - if (is_module_sig_enforced()) { | ||
4878 | - pr_notice("%s is rejected\n", reason); | ||
4879 | - return -EKEYREJECTED; | ||
4880 | - } | ||
4881 | - | ||
4882 | - return security_locked_down(LOCKDOWN_MODULE_SIGNATURE); | ||
4883 | + reason = "module with unavailable key"; | ||
4884 | + break; | ||
4885 | |||
4886 | /* All other errors are fatal, including nomem, unparseable | ||
4887 | * signatures and signature check failures - even if signatures | ||
4888 | @@ -2930,6 +2924,13 @@ static int module_sig_check(struct load_info *info, int flags) | ||
4889 | default: | ||
4890 | return err; | ||
4891 | } | ||
4892 | + | ||
4893 | + if (is_module_sig_enforced()) { | ||
4894 | + pr_notice("Loading of %s is rejected\n", reason); | ||
4895 | + return -EKEYREJECTED; | ||
4896 | + } | ||
4897 | + | ||
4898 | + return security_locked_down(LOCKDOWN_MODULE_SIGNATURE); | ||
4899 | } | ||
4900 | #else /* !CONFIG_MODULE_SIG */ | ||
4901 | static int module_sig_check(struct load_info *info, int flags) | ||
4902 | @@ -2938,9 +2939,33 @@ static int module_sig_check(struct load_info *info, int flags) | ||
4903 | } | ||
4904 | #endif /* !CONFIG_MODULE_SIG */ | ||
4905 | |||
4906 | -/* Sanity checks against invalid binaries, wrong arch, weird elf version. */ | ||
4907 | -static int elf_header_check(struct load_info *info) | ||
4908 | +static int validate_section_offset(struct load_info *info, Elf_Shdr *shdr) | ||
4909 | +{ | ||
4910 | + unsigned long secend; | ||
4911 | + | ||
4912 | + /* | ||
4913 | + * Check for both overflow and offset/size being | ||
4914 | + * too large. | ||
4915 | + */ | ||
4916 | + secend = shdr->sh_offset + shdr->sh_size; | ||
4917 | + if (secend < shdr->sh_offset || secend > info->len) | ||
4918 | + return -ENOEXEC; | ||
4919 | + | ||
4920 | + return 0; | ||
4921 | +} | ||
4922 | + | ||
4923 | +/* | ||
4924 | + * Sanity checks against invalid binaries, wrong arch, weird elf version. | ||
4925 | + * | ||
4926 | + * Also do basic validity checks against section offsets and sizes, the | ||
4927 | + * section name string table, and the indices used for it (sh_name). | ||
4928 | + */ | ||
4929 | +static int elf_validity_check(struct load_info *info) | ||
4930 | { | ||
4931 | + unsigned int i; | ||
4932 | + Elf_Shdr *shdr, *strhdr; | ||
4933 | + int err; | ||
4934 | + | ||
4935 | if (info->len < sizeof(*(info->hdr))) | ||
4936 | return -ENOEXEC; | ||
4937 | |||
4938 | @@ -2950,11 +2975,78 @@ static int elf_header_check(struct load_info *info) | ||
4939 | || info->hdr->e_shentsize != sizeof(Elf_Shdr)) | ||
4940 | return -ENOEXEC; | ||
4941 | |||
4942 | + /* | ||
4943 | + * e_shnum is 16 bits, and sizeof(Elf_Shdr) is | ||
4944 | + * known and small. So e_shnum * sizeof(Elf_Shdr) | ||
4945 | + * will not overflow unsigned long on any platform. | ||
4946 | + */ | ||
4947 | if (info->hdr->e_shoff >= info->len | ||
4948 | || (info->hdr->e_shnum * sizeof(Elf_Shdr) > | ||
4949 | info->len - info->hdr->e_shoff)) | ||
4950 | return -ENOEXEC; | ||
4951 | |||
4952 | + info->sechdrs = (void *)info->hdr + info->hdr->e_shoff; | ||
4953 | + | ||
4954 | + /* | ||
4955 | + * Verify if the section name table index is valid. | ||
4956 | + */ | ||
4957 | + if (info->hdr->e_shstrndx == SHN_UNDEF | ||
4958 | + || info->hdr->e_shstrndx >= info->hdr->e_shnum) | ||
4959 | + return -ENOEXEC; | ||
4960 | + | ||
4961 | + strhdr = &info->sechdrs[info->hdr->e_shstrndx]; | ||
4962 | + err = validate_section_offset(info, strhdr); | ||
4963 | + if (err < 0) | ||
4964 | + return err; | ||
4965 | + | ||
4966 | + /* | ||
4967 | + * The section name table must be NUL-terminated, as required | ||
4968 | + * by the spec. This makes strcmp and pr_* calls that access | ||
4969 | + * strings in the section safe. | ||
4970 | + */ | ||
4971 | + info->secstrings = (void *)info->hdr + strhdr->sh_offset; | ||
4972 | + if (info->secstrings[strhdr->sh_size - 1] != '\0') | ||
4973 | + return -ENOEXEC; | ||
4974 | + | ||
4975 | + /* | ||
4976 | + * The code assumes that section 0 has a length of zero and | ||
4977 | + * an addr of zero, so check for it. | ||
4978 | + */ | ||
4979 | + if (info->sechdrs[0].sh_type != SHT_NULL | ||
4980 | + || info->sechdrs[0].sh_size != 0 | ||
4981 | + || info->sechdrs[0].sh_addr != 0) | ||
4982 | + return -ENOEXEC; | ||
4983 | + | ||
4984 | + for (i = 1; i < info->hdr->e_shnum; i++) { | ||
4985 | + shdr = &info->sechdrs[i]; | ||
4986 | + switch (shdr->sh_type) { | ||
4987 | + case SHT_NULL: | ||
4988 | + case SHT_NOBITS: | ||
4989 | + continue; | ||
4990 | + case SHT_SYMTAB: | ||
4991 | + if (shdr->sh_link == SHN_UNDEF | ||
4992 | + || shdr->sh_link >= info->hdr->e_shnum) | ||
4993 | + return -ENOEXEC; | ||
4994 | + fallthrough; | ||
4995 | + default: | ||
4996 | + err = validate_section_offset(info, shdr); | ||
4997 | + if (err < 0) { | ||
4998 | + pr_err("Invalid ELF section in module (section %u type %u)\n", | ||
4999 | + i, shdr->sh_type); | ||
5000 | + return err; | ||
5001 | + } | ||
5002 | + | ||
5003 | + if (shdr->sh_flags & SHF_ALLOC) { | ||
5004 | + if (shdr->sh_name >= strhdr->sh_size) { | ||
5005 | + pr_err("Invalid ELF section name in module (section %u type %u)\n", | ||
5006 | + i, shdr->sh_type); | ||
5007 | + return -ENOEXEC; | ||
5008 | + } | ||
5009 | + } | ||
5010 | + break; | ||
5011 | + } | ||
5012 | + } | ||
5013 | + | ||
5014 | return 0; | ||
5015 | } | ||
5016 | |||
5017 | @@ -3051,11 +3143,6 @@ static int rewrite_section_headers(struct load_info *info, int flags) | ||
5018 | |||
5019 | for (i = 1; i < info->hdr->e_shnum; i++) { | ||
5020 | Elf_Shdr *shdr = &info->sechdrs[i]; | ||
5021 | - if (shdr->sh_type != SHT_NOBITS | ||
5022 | - && info->len < shdr->sh_offset + shdr->sh_size) { | ||
5023 | - pr_err("Module len %lu truncated\n", info->len); | ||
5024 | - return -ENOEXEC; | ||
5025 | - } | ||
5026 | |||
5027 | /* Mark all sections sh_addr with their address in the | ||
5028 | temporary image. */ | ||
5029 | @@ -3087,11 +3174,6 @@ static int setup_load_info(struct load_info *info, int flags) | ||
5030 | { | ||
5031 | unsigned int i; | ||
5032 | |||
5033 | - /* Set up the convenience variables */ | ||
5034 | - info->sechdrs = (void *)info->hdr + info->hdr->e_shoff; | ||
5035 | - info->secstrings = (void *)info->hdr | ||
5036 | - + info->sechdrs[info->hdr->e_shstrndx].sh_offset; | ||
5037 | - | ||
5038 | /* Try to find a name early so we can log errors with a module name */ | ||
5039 | info->index.info = find_sec(info, ".modinfo"); | ||
5040 | if (info->index.info) | ||
5041 | @@ -3819,23 +3901,49 @@ static int load_module(struct load_info *info, const char __user *uargs, | ||
5042 | long err = 0; | ||
5043 | char *after_dashes; | ||
5044 | |||
5045 | - err = elf_header_check(info); | ||
5046 | + /* | ||
5047 | + * Do the signature check (if any) first. All that | ||
5048 | + * the signature check needs is info->len, it does | ||
5049 | + * not need any of the section info. That can be | ||
5050 | + * set up later. This will minimize the chances | ||
5051 | + * of a corrupt module causing problems before | ||
5052 | + * we even get to the signature check. | ||
5053 | + * | ||
5054 | + * The check will also adjust info->len by stripping | ||
5055 | + * off the sig length at the end of the module, making | ||
5056 | + * checks against info->len more correct. | ||
5057 | + */ | ||
5058 | + err = module_sig_check(info, flags); | ||
5059 | if (err) | ||
5060 | goto free_copy; | ||
5061 | |||
5062 | + /* | ||
5063 | + * Do basic sanity checks against the ELF header and | ||
5064 | + * sections. | ||
5065 | + */ | ||
5066 | + err = elf_validity_check(info); | ||
5067 | + if (err) { | ||
5068 | + pr_err("Module has invalid ELF structures\n"); | ||
5069 | + goto free_copy; | ||
5070 | + } | ||
5071 | + | ||
5072 | + /* | ||
5073 | + * Everything checks out, so set up the section info | ||
5074 | + * in the info structure. | ||
5075 | + */ | ||
5076 | err = setup_load_info(info, flags); | ||
5077 | if (err) | ||
5078 | goto free_copy; | ||
5079 | |||
5080 | + /* | ||
5081 | + * Now that we know we have the correct module name, check | ||
5082 | + * if it's blacklisted. | ||
5083 | + */ | ||
5084 | if (blacklisted(info->name)) { | ||
5085 | err = -EPERM; | ||
5086 | goto free_copy; | ||
5087 | } | ||
5088 | |||
5089 | - err = module_sig_check(info, flags); | ||
5090 | - if (err) | ||
5091 | - goto free_copy; | ||
5092 | - | ||
5093 | err = rewrite_section_headers(info, flags); | ||
5094 | if (err) | ||
5095 | goto free_copy; | ||
5096 | diff --git a/kernel/module_signature.c b/kernel/module_signature.c | ||
5097 | index 4224a1086b7d8..00132d12487cd 100644 | ||
5098 | --- a/kernel/module_signature.c | ||
5099 | +++ b/kernel/module_signature.c | ||
5100 | @@ -25,7 +25,7 @@ int mod_check_sig(const struct module_signature *ms, size_t file_len, | ||
5101 | return -EBADMSG; | ||
5102 | |||
5103 | if (ms->id_type != PKEY_ID_PKCS7) { | ||
5104 | - pr_err("%s: Module is not signed with expected PKCS#7 message\n", | ||
5105 | + pr_err("%s: not signed with expected PKCS#7 message\n", | ||
5106 | name); | ||
5107 | return -ENOPKG; | ||
5108 | } | ||
5109 | diff --git a/kernel/module_signing.c b/kernel/module_signing.c | ||
5110 | index 9d9fc678c91d6..8723ae70ea1fe 100644 | ||
5111 | --- a/kernel/module_signing.c | ||
5112 | +++ b/kernel/module_signing.c | ||
5113 | @@ -30,7 +30,7 @@ int mod_verify_sig(const void *mod, struct load_info *info) | ||
5114 | |||
5115 | memcpy(&ms, mod + (modlen - sizeof(ms)), sizeof(ms)); | ||
5116 | |||
5117 | - ret = mod_check_sig(&ms, modlen, info->name); | ||
5118 | + ret = mod_check_sig(&ms, modlen, "module"); | ||
5119 | if (ret) | ||
5120 | return ret; | ||
5121 | |||
5122 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
5123 | index 1a75610f5f57b..1b5f54b309be5 100644 | ||
5124 | --- a/kernel/trace/trace.c | ||
5125 | +++ b/kernel/trace/trace.c | ||
5126 | @@ -2857,7 +2857,8 @@ static void __ftrace_trace_stack(struct ring_buffer *buffer, | ||
5127 | |||
5128 | size = nr_entries * sizeof(unsigned long); | ||
5129 | event = __trace_buffer_lock_reserve(buffer, TRACE_STACK, | ||
5130 | - sizeof(*entry) + size, flags, pc); | ||
5131 | + (sizeof(*entry) - sizeof(entry->caller)) + size, | ||
5132 | + flags, pc); | ||
5133 | if (!event) | ||
5134 | goto out; | ||
5135 | entry = ring_buffer_event_data(event); | ||
5136 | diff --git a/mm/memory.c b/mm/memory.c | ||
5137 | index c432e7c764451..13a575ce2ec8f 100644 | ||
5138 | --- a/mm/memory.c | ||
5139 | +++ b/mm/memory.c | ||
5140 | @@ -150,7 +150,7 @@ static int __init init_zero_pfn(void) | ||
5141 | zero_pfn = page_to_pfn(ZERO_PAGE(0)); | ||
5142 | return 0; | ||
5143 | } | ||
5144 | -core_initcall(init_zero_pfn); | ||
5145 | +early_initcall(init_zero_pfn); | ||
5146 | |||
5147 | |||
5148 | #if defined(SPLIT_RSS_COUNTING) | ||
5149 | diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c | ||
5150 | index b41375d4d295d..4610c352849bc 100644 | ||
5151 | --- a/net/appletalk/ddp.c | ||
5152 | +++ b/net/appletalk/ddp.c | ||
5153 | @@ -1568,8 +1568,8 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) | ||
5154 | struct sk_buff *skb; | ||
5155 | struct net_device *dev; | ||
5156 | struct ddpehdr *ddp; | ||
5157 | - int size; | ||
5158 | - struct atalk_route *rt; | ||
5159 | + int size, hard_header_len; | ||
5160 | + struct atalk_route *rt, *rt_lo = NULL; | ||
5161 | int err; | ||
5162 | |||
5163 | if (flags & ~(MSG_DONTWAIT|MSG_CMSG_COMPAT)) | ||
5164 | @@ -1632,7 +1632,22 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) | ||
5165 | SOCK_DEBUG(sk, "SK %p: Size needed %d, device %s\n", | ||
5166 | sk, size, dev->name); | ||
5167 | |||
5168 | - size += dev->hard_header_len; | ||
5169 | + hard_header_len = dev->hard_header_len; | ||
5170 | + /* Leave room for loopback hardware header if necessary */ | ||
5171 | + if (usat->sat_addr.s_node == ATADDR_BCAST && | ||
5172 | + (dev->flags & IFF_LOOPBACK || !(rt->flags & RTF_GATEWAY))) { | ||
5173 | + struct atalk_addr at_lo; | ||
5174 | + | ||
5175 | + at_lo.s_node = 0; | ||
5176 | + at_lo.s_net = 0; | ||
5177 | + | ||
5178 | + rt_lo = atrtr_find(&at_lo); | ||
5179 | + | ||
5180 | + if (rt_lo && rt_lo->dev->hard_header_len > hard_header_len) | ||
5181 | + hard_header_len = rt_lo->dev->hard_header_len; | ||
5182 | + } | ||
5183 | + | ||
5184 | + size += hard_header_len; | ||
5185 | release_sock(sk); | ||
5186 | skb = sock_alloc_send_skb(sk, size, (flags & MSG_DONTWAIT), &err); | ||
5187 | lock_sock(sk); | ||
5188 | @@ -1640,7 +1655,7 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) | ||
5189 | goto out; | ||
5190 | |||
5191 | skb_reserve(skb, ddp_dl->header_length); | ||
5192 | - skb_reserve(skb, dev->hard_header_len); | ||
5193 | + skb_reserve(skb, hard_header_len); | ||
5194 | skb->dev = dev; | ||
5195 | |||
5196 | SOCK_DEBUG(sk, "SK %p: Begin build.\n", sk); | ||
5197 | @@ -1691,18 +1706,12 @@ static int atalk_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) | ||
5198 | /* loop back */ | ||
5199 | skb_orphan(skb); | ||
5200 | if (ddp->deh_dnode == ATADDR_BCAST) { | ||
5201 | - struct atalk_addr at_lo; | ||
5202 | - | ||
5203 | - at_lo.s_node = 0; | ||
5204 | - at_lo.s_net = 0; | ||
5205 | - | ||
5206 | - rt = atrtr_find(&at_lo); | ||
5207 | - if (!rt) { | ||
5208 | + if (!rt_lo) { | ||
5209 | kfree_skb(skb); | ||
5210 | err = -ENETUNREACH; | ||
5211 | goto out; | ||
5212 | } | ||
5213 | - dev = rt->dev; | ||
5214 | + dev = rt_lo->dev; | ||
5215 | skb->dev = dev; | ||
5216 | } | ||
5217 | ddp_dl->request(ddp_dl, skb, dev->dev_addr); | ||
5218 | diff --git a/net/can/af_can.c b/net/can/af_can.c | ||
5219 | index 306d3584a4417..c758a12ffe461 100644 | ||
5220 | --- a/net/can/af_can.c | ||
5221 | +++ b/net/can/af_can.c | ||
5222 | @@ -304,8 +304,8 @@ static struct can_dev_rcv_lists *can_dev_rcv_lists_find(struct net *net, | ||
5223 | struct net_device *dev) | ||
5224 | { | ||
5225 | if (dev) { | ||
5226 | - struct can_ml_priv *ml_priv = dev->ml_priv; | ||
5227 | - return &ml_priv->dev_rcv_lists; | ||
5228 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); | ||
5229 | + return &can_ml->dev_rcv_lists; | ||
5230 | } else { | ||
5231 | return net->can.rx_alldev_list; | ||
5232 | } | ||
5233 | @@ -788,25 +788,6 @@ void can_proto_unregister(const struct can_proto *cp) | ||
5234 | } | ||
5235 | EXPORT_SYMBOL(can_proto_unregister); | ||
5236 | |||
5237 | -/* af_can notifier to create/remove CAN netdevice specific structs */ | ||
5238 | -static int can_notifier(struct notifier_block *nb, unsigned long msg, | ||
5239 | - void *ptr) | ||
5240 | -{ | ||
5241 | - struct net_device *dev = netdev_notifier_info_to_dev(ptr); | ||
5242 | - | ||
5243 | - if (dev->type != ARPHRD_CAN) | ||
5244 | - return NOTIFY_DONE; | ||
5245 | - | ||
5246 | - switch (msg) { | ||
5247 | - case NETDEV_REGISTER: | ||
5248 | - WARN(!dev->ml_priv, | ||
5249 | - "No CAN mid layer private allocated, please fix your driver and use alloc_candev()!\n"); | ||
5250 | - break; | ||
5251 | - } | ||
5252 | - | ||
5253 | - return NOTIFY_DONE; | ||
5254 | -} | ||
5255 | - | ||
5256 | static int can_pernet_init(struct net *net) | ||
5257 | { | ||
5258 | spin_lock_init(&net->can.rcvlists_lock); | ||
5259 | @@ -874,11 +855,6 @@ static const struct net_proto_family can_family_ops = { | ||
5260 | .owner = THIS_MODULE, | ||
5261 | }; | ||
5262 | |||
5263 | -/* notifier block for netdevice event */ | ||
5264 | -static struct notifier_block can_netdev_notifier __read_mostly = { | ||
5265 | - .notifier_call = can_notifier, | ||
5266 | -}; | ||
5267 | - | ||
5268 | static struct pernet_operations can_pernet_ops __read_mostly = { | ||
5269 | .init = can_pernet_init, | ||
5270 | .exit = can_pernet_exit, | ||
5271 | @@ -909,17 +885,12 @@ static __init int can_init(void) | ||
5272 | err = sock_register(&can_family_ops); | ||
5273 | if (err) | ||
5274 | goto out_sock; | ||
5275 | - err = register_netdevice_notifier(&can_netdev_notifier); | ||
5276 | - if (err) | ||
5277 | - goto out_notifier; | ||
5278 | |||
5279 | dev_add_pack(&can_packet); | ||
5280 | dev_add_pack(&canfd_packet); | ||
5281 | |||
5282 | return 0; | ||
5283 | |||
5284 | -out_notifier: | ||
5285 | - sock_unregister(PF_CAN); | ||
5286 | out_sock: | ||
5287 | unregister_pernet_subsys(&can_pernet_ops); | ||
5288 | out_pernet: | ||
5289 | @@ -933,7 +904,6 @@ static __exit void can_exit(void) | ||
5290 | /* protocol unregister */ | ||
5291 | dev_remove_pack(&canfd_packet); | ||
5292 | dev_remove_pack(&can_packet); | ||
5293 | - unregister_netdevice_notifier(&can_netdev_notifier); | ||
5294 | sock_unregister(PF_CAN); | ||
5295 | |||
5296 | unregister_pernet_subsys(&can_pernet_ops); | ||
5297 | diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c | ||
5298 | index 137054bff9ec7..e52330f628c9f 100644 | ||
5299 | --- a/net/can/j1939/main.c | ||
5300 | +++ b/net/can/j1939/main.c | ||
5301 | @@ -140,9 +140,9 @@ static struct j1939_priv *j1939_priv_create(struct net_device *ndev) | ||
5302 | static inline void j1939_priv_set(struct net_device *ndev, | ||
5303 | struct j1939_priv *priv) | ||
5304 | { | ||
5305 | - struct can_ml_priv *can_ml_priv = ndev->ml_priv; | ||
5306 | + struct can_ml_priv *can_ml = can_get_ml_priv(ndev); | ||
5307 | |||
5308 | - can_ml_priv->j1939_priv = priv; | ||
5309 | + can_ml->j1939_priv = priv; | ||
5310 | } | ||
5311 | |||
5312 | static void __j1939_priv_release(struct kref *kref) | ||
5313 | @@ -211,12 +211,9 @@ static void __j1939_rx_release(struct kref *kref) | ||
5314 | /* get pointer to priv without increasing ref counter */ | ||
5315 | static inline struct j1939_priv *j1939_ndev_to_priv(struct net_device *ndev) | ||
5316 | { | ||
5317 | - struct can_ml_priv *can_ml_priv = ndev->ml_priv; | ||
5318 | + struct can_ml_priv *can_ml = can_get_ml_priv(ndev); | ||
5319 | |||
5320 | - if (!can_ml_priv) | ||
5321 | - return NULL; | ||
5322 | - | ||
5323 | - return can_ml_priv->j1939_priv; | ||
5324 | + return can_ml->j1939_priv; | ||
5325 | } | ||
5326 | |||
5327 | static struct j1939_priv *j1939_priv_get_by_ndev_locked(struct net_device *ndev) | ||
5328 | @@ -225,9 +222,6 @@ static struct j1939_priv *j1939_priv_get_by_ndev_locked(struct net_device *ndev) | ||
5329 | |||
5330 | lockdep_assert_held(&j1939_netdev_lock); | ||
5331 | |||
5332 | - if (ndev->type != ARPHRD_CAN) | ||
5333 | - return NULL; | ||
5334 | - | ||
5335 | priv = j1939_ndev_to_priv(ndev); | ||
5336 | if (priv) | ||
5337 | j1939_priv_get(priv); | ||
5338 | @@ -348,15 +342,16 @@ static int j1939_netdev_notify(struct notifier_block *nb, | ||
5339 | unsigned long msg, void *data) | ||
5340 | { | ||
5341 | struct net_device *ndev = netdev_notifier_info_to_dev(data); | ||
5342 | + struct can_ml_priv *can_ml = can_get_ml_priv(ndev); | ||
5343 | struct j1939_priv *priv; | ||
5344 | |||
5345 | + if (!can_ml) | ||
5346 | + goto notify_done; | ||
5347 | + | ||
5348 | priv = j1939_priv_get_by_ndev(ndev); | ||
5349 | if (!priv) | ||
5350 | goto notify_done; | ||
5351 | |||
5352 | - if (ndev->type != ARPHRD_CAN) | ||
5353 | - goto notify_put; | ||
5354 | - | ||
5355 | switch (msg) { | ||
5356 | case NETDEV_DOWN: | ||
5357 | j1939_cancel_active_session(priv, NULL); | ||
5358 | @@ -365,7 +360,6 @@ static int j1939_netdev_notify(struct notifier_block *nb, | ||
5359 | break; | ||
5360 | } | ||
5361 | |||
5362 | -notify_put: | ||
5363 | j1939_priv_put(priv); | ||
5364 | |||
5365 | notify_done: | ||
5366 | diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c | ||
5367 | index 0470909605392..d57475c8ba07f 100644 | ||
5368 | --- a/net/can/j1939/socket.c | ||
5369 | +++ b/net/can/j1939/socket.c | ||
5370 | @@ -12,6 +12,7 @@ | ||
5371 | |||
5372 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
5373 | |||
5374 | +#include <linux/can/can-ml.h> | ||
5375 | #include <linux/can/core.h> | ||
5376 | #include <linux/can/skb.h> | ||
5377 | #include <linux/errqueue.h> | ||
5378 | @@ -453,6 +454,7 @@ static int j1939_sk_bind(struct socket *sock, struct sockaddr *uaddr, int len) | ||
5379 | j1939_jsk_del(priv, jsk); | ||
5380 | j1939_local_ecu_put(priv, jsk->addr.src_name, jsk->addr.sa); | ||
5381 | } else { | ||
5382 | + struct can_ml_priv *can_ml; | ||
5383 | struct net_device *ndev; | ||
5384 | |||
5385 | ndev = dev_get_by_index(net, addr->can_ifindex); | ||
5386 | @@ -461,15 +463,8 @@ static int j1939_sk_bind(struct socket *sock, struct sockaddr *uaddr, int len) | ||
5387 | goto out_release_sock; | ||
5388 | } | ||
5389 | |||
5390 | - if (ndev->type != ARPHRD_CAN) { | ||
5391 | - dev_put(ndev); | ||
5392 | - ret = -ENODEV; | ||
5393 | - goto out_release_sock; | ||
5394 | - } | ||
5395 | - | ||
5396 | - if (!ndev->ml_priv) { | ||
5397 | - netdev_warn_once(ndev, | ||
5398 | - "No CAN mid layer private allocated, please fix your driver and use alloc_candev()!\n"); | ||
5399 | + can_ml = can_get_ml_priv(ndev); | ||
5400 | + if (!can_ml) { | ||
5401 | dev_put(ndev); | ||
5402 | ret = -ENODEV; | ||
5403 | goto out_release_sock; | ||
5404 | diff --git a/net/can/proc.c b/net/can/proc.c | ||
5405 | index 077af42c26ba5..a5fc63c78370e 100644 | ||
5406 | --- a/net/can/proc.c | ||
5407 | +++ b/net/can/proc.c | ||
5408 | @@ -329,8 +329,11 @@ static int can_rcvlist_proc_show(struct seq_file *m, void *v) | ||
5409 | |||
5410 | /* receive list for registered CAN devices */ | ||
5411 | for_each_netdev_rcu(net, dev) { | ||
5412 | - if (dev->type == ARPHRD_CAN && dev->ml_priv) | ||
5413 | - can_rcvlist_proc_show_one(m, idx, dev, dev->ml_priv); | ||
5414 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); | ||
5415 | + | ||
5416 | + if (can_ml) | ||
5417 | + can_rcvlist_proc_show_one(m, idx, dev, | ||
5418 | + &can_ml->dev_rcv_lists); | ||
5419 | } | ||
5420 | |||
5421 | rcu_read_unlock(); | ||
5422 | @@ -382,8 +385,10 @@ static int can_rcvlist_sff_proc_show(struct seq_file *m, void *v) | ||
5423 | |||
5424 | /* sff receive list for registered CAN devices */ | ||
5425 | for_each_netdev_rcu(net, dev) { | ||
5426 | - if (dev->type == ARPHRD_CAN && dev->ml_priv) { | ||
5427 | - dev_rcv_lists = dev->ml_priv; | ||
5428 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); | ||
5429 | + | ||
5430 | + if (can_ml) { | ||
5431 | + dev_rcv_lists = &can_ml->dev_rcv_lists; | ||
5432 | can_rcvlist_proc_show_array(m, dev, dev_rcv_lists->rx_sff, | ||
5433 | ARRAY_SIZE(dev_rcv_lists->rx_sff)); | ||
5434 | } | ||
5435 | @@ -413,8 +418,10 @@ static int can_rcvlist_eff_proc_show(struct seq_file *m, void *v) | ||
5436 | |||
5437 | /* eff receive list for registered CAN devices */ | ||
5438 | for_each_netdev_rcu(net, dev) { | ||
5439 | - if (dev->type == ARPHRD_CAN && dev->ml_priv) { | ||
5440 | - dev_rcv_lists = dev->ml_priv; | ||
5441 | + struct can_ml_priv *can_ml = can_get_ml_priv(dev); | ||
5442 | + | ||
5443 | + if (can_ml) { | ||
5444 | + dev_rcv_lists = &can_ml->dev_rcv_lists; | ||
5445 | can_rcvlist_proc_show_array(m, dev, dev_rcv_lists->rx_eff, | ||
5446 | ARRAY_SIZE(dev_rcv_lists->rx_eff)); | ||
5447 | } | ||
5448 | diff --git a/net/core/filter.c b/net/core/filter.c | ||
5449 | index 524f3364f8a05..7fbb274b7fe32 100644 | ||
5450 | --- a/net/core/filter.c | ||
5451 | +++ b/net/core/filter.c | ||
5452 | @@ -3146,18 +3146,14 @@ static int bpf_skb_net_shrink(struct sk_buff *skb, u32 off, u32 len_diff, | ||
5453 | return 0; | ||
5454 | } | ||
5455 | |||
5456 | -static u32 __bpf_skb_max_len(const struct sk_buff *skb) | ||
5457 | -{ | ||
5458 | - return skb->dev ? skb->dev->mtu + skb->dev->hard_header_len : | ||
5459 | - SKB_MAX_ALLOC; | ||
5460 | -} | ||
5461 | +#define BPF_SKB_MAX_LEN SKB_MAX_ALLOC | ||
5462 | |||
5463 | BPF_CALL_4(bpf_skb_adjust_room, struct sk_buff *, skb, s32, len_diff, | ||
5464 | u32, mode, u64, flags) | ||
5465 | { | ||
5466 | u32 len_cur, len_diff_abs = abs(len_diff); | ||
5467 | u32 len_min = bpf_skb_net_base_len(skb); | ||
5468 | - u32 len_max = __bpf_skb_max_len(skb); | ||
5469 | + u32 len_max = BPF_SKB_MAX_LEN; | ||
5470 | __be16 proto = skb->protocol; | ||
5471 | bool shrink = len_diff < 0; | ||
5472 | u32 off; | ||
5473 | @@ -3237,7 +3233,7 @@ static int bpf_skb_trim_rcsum(struct sk_buff *skb, unsigned int new_len) | ||
5474 | static inline int __bpf_skb_change_tail(struct sk_buff *skb, u32 new_len, | ||
5475 | u64 flags) | ||
5476 | { | ||
5477 | - u32 max_len = __bpf_skb_max_len(skb); | ||
5478 | + u32 max_len = BPF_SKB_MAX_LEN; | ||
5479 | u32 min_len = __bpf_skb_min_len(skb); | ||
5480 | int ret; | ||
5481 | |||
5482 | @@ -3313,7 +3309,7 @@ static const struct bpf_func_proto sk_skb_change_tail_proto = { | ||
5483 | static inline int __bpf_skb_change_head(struct sk_buff *skb, u32 head_room, | ||
5484 | u64 flags) | ||
5485 | { | ||
5486 | - u32 max_len = __bpf_skb_max_len(skb); | ||
5487 | + u32 max_len = BPF_SKB_MAX_LEN; | ||
5488 | u32 new_len = skb->len + head_room; | ||
5489 | int ret; | ||
5490 | |||
5491 | diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c | ||
5492 | index e3bdd859c895c..da86c0e1b677d 100644 | ||
5493 | --- a/net/core/flow_dissector.c | ||
5494 | +++ b/net/core/flow_dissector.c | ||
5495 | @@ -1028,6 +1028,9 @@ proto_again: | ||
5496 | key_control->addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS; | ||
5497 | } | ||
5498 | |||
5499 | + __skb_flow_dissect_ipv4(skb, flow_dissector, | ||
5500 | + target_container, data, iph); | ||
5501 | + | ||
5502 | if (ip_is_fragment(iph)) { | ||
5503 | key_control->flags |= FLOW_DIS_IS_FRAGMENT; | ||
5504 | |||
5505 | @@ -1044,9 +1047,6 @@ proto_again: | ||
5506 | } | ||
5507 | } | ||
5508 | |||
5509 | - __skb_flow_dissect_ipv4(skb, flow_dissector, | ||
5510 | - target_container, data, iph); | ||
5511 | - | ||
5512 | break; | ||
5513 | } | ||
5514 | case htons(ETH_P_IPV6): { | ||
5515 | diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c | ||
5516 | index 1e5e08cc0bfc3..9f73ccf46c9b1 100644 | ||
5517 | --- a/net/dccp/ipv6.c | ||
5518 | +++ b/net/dccp/ipv6.c | ||
5519 | @@ -319,6 +319,11 @@ static int dccp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | ||
5520 | if (!ipv6_unicast_destination(skb)) | ||
5521 | return 0; /* discard, don't send a reset here */ | ||
5522 | |||
5523 | + if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) { | ||
5524 | + __IP6_INC_STATS(sock_net(sk), NULL, IPSTATS_MIB_INHDRERRORS); | ||
5525 | + return 0; | ||
5526 | + } | ||
5527 | + | ||
5528 | if (dccp_bad_service_code(sk, service)) { | ||
5529 | dcb->dccpd_reset_code = DCCP_RESET_CODE_BAD_SERVICE_CODE; | ||
5530 | goto drop; | ||
5531 | diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c | ||
5532 | index 3d71c7d6102c4..7e5df23cbe7bf 100644 | ||
5533 | --- a/net/ipv6/ip6_input.c | ||
5534 | +++ b/net/ipv6/ip6_input.c | ||
5535 | @@ -223,16 +223,6 @@ static struct sk_buff *ip6_rcv_core(struct sk_buff *skb, struct net_device *dev, | ||
5536 | if (ipv6_addr_is_multicast(&hdr->saddr)) | ||
5537 | goto err; | ||
5538 | |||
5539 | - /* While RFC4291 is not explicit about v4mapped addresses | ||
5540 | - * in IPv6 headers, it seems clear linux dual-stack | ||
5541 | - * model can not deal properly with these. | ||
5542 | - * Security models could be fooled by ::ffff:127.0.0.1 for example. | ||
5543 | - * | ||
5544 | - * https://tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful-02 | ||
5545 | - */ | ||
5546 | - if (ipv6_addr_v4mapped(&hdr->saddr)) | ||
5547 | - goto err; | ||
5548 | - | ||
5549 | skb->transport_header = skb->network_header + sizeof(*hdr); | ||
5550 | IP6CB(skb)->nhoff = offsetof(struct ipv6hdr, nexthdr); | ||
5551 | |||
5552 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c | ||
5553 | index b42fa41cfceb5..2f061a911bc2c 100644 | ||
5554 | --- a/net/ipv6/tcp_ipv6.c | ||
5555 | +++ b/net/ipv6/tcp_ipv6.c | ||
5556 | @@ -1093,6 +1093,11 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb) | ||
5557 | if (!ipv6_unicast_destination(skb)) | ||
5558 | goto drop; | ||
5559 | |||
5560 | + if (ipv6_addr_v4mapped(&ipv6_hdr(skb)->saddr)) { | ||
5561 | + __IP6_INC_STATS(sock_net(sk), NULL, IPSTATS_MIB_INHDRERRORS); | ||
5562 | + return 0; | ||
5563 | + } | ||
5564 | + | ||
5565 | return tcp_conn_request(&tcp6_request_sock_ops, | ||
5566 | &tcp_request_sock_ipv6_ops, sk, skb); | ||
5567 | |||
5568 | diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c | ||
5569 | index cf4d6d7e72822..d5470c7fe8792 100644 | ||
5570 | --- a/net/sunrpc/auth_gss/svcauth_gss.c | ||
5571 | +++ b/net/sunrpc/auth_gss/svcauth_gss.c | ||
5572 | @@ -1782,11 +1782,14 @@ static int | ||
5573 | svcauth_gss_release(struct svc_rqst *rqstp) | ||
5574 | { | ||
5575 | struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data; | ||
5576 | - struct rpc_gss_wire_cred *gc = &gsd->clcred; | ||
5577 | + struct rpc_gss_wire_cred *gc; | ||
5578 | struct xdr_buf *resbuf = &rqstp->rq_res; | ||
5579 | int stat = -EINVAL; | ||
5580 | struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id); | ||
5581 | |||
5582 | + if (!gsd) | ||
5583 | + goto out; | ||
5584 | + gc = &gsd->clcred; | ||
5585 | if (gc->gc_proc != RPC_GSS_PROC_DATA) | ||
5586 | goto out; | ||
5587 | /* Release can be called twice, but we only wrap once. */ | ||
5588 | @@ -1827,10 +1830,10 @@ out_err: | ||
5589 | if (rqstp->rq_cred.cr_group_info) | ||
5590 | put_group_info(rqstp->rq_cred.cr_group_info); | ||
5591 | rqstp->rq_cred.cr_group_info = NULL; | ||
5592 | - if (gsd->rsci) | ||
5593 | + if (gsd && gsd->rsci) { | ||
5594 | cache_put(&gsd->rsci->h, sn->rsc_cache); | ||
5595 | - gsd->rsci = NULL; | ||
5596 | - | ||
5597 | + gsd->rsci = NULL; | ||
5598 | + } | ||
5599 | return stat; | ||
5600 | } | ||
5601 | |||
5602 | diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c | ||
5603 | index 5d323574d04fe..c82e7b52ab1f8 100644 | ||
5604 | --- a/net/vmw_vsock/af_vsock.c | ||
5605 | +++ b/net/vmw_vsock/af_vsock.c | ||
5606 | @@ -620,6 +620,7 @@ struct sock *__vsock_create(struct net *net, | ||
5607 | vsk->trusted = psk->trusted; | ||
5608 | vsk->owner = get_cred(psk->owner); | ||
5609 | vsk->connect_timeout = psk->connect_timeout; | ||
5610 | + security_sk_clone(parent, sk); | ||
5611 | } else { | ||
5612 | vsk->trusted = ns_capable_noaudit(&init_user_ns, CAP_NET_ADMIN); | ||
5613 | vsk->owner = get_current_cred(); | ||
5614 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
5615 | index febd16c9efd7a..ebb1ee69dd0c3 100644 | ||
5616 | --- a/sound/pci/hda/hda_intel.c | ||
5617 | +++ b/sound/pci/hda/hda_intel.c | ||
5618 | @@ -1022,8 +1022,12 @@ static int azx_prepare(struct device *dev) | ||
5619 | struct snd_card *card = dev_get_drvdata(dev); | ||
5620 | struct azx *chip; | ||
5621 | |||
5622 | + if (!azx_is_pm_ready(card)) | ||
5623 | + return 0; | ||
5624 | + | ||
5625 | chip = card->private_data; | ||
5626 | chip->pm_prepared = 1; | ||
5627 | + snd_power_change_state(card, SNDRV_CTL_POWER_D3hot); | ||
5628 | |||
5629 | flush_work(&azx_bus(chip)->unsol_work); | ||
5630 | |||
5631 | @@ -1038,7 +1042,11 @@ static void azx_complete(struct device *dev) | ||
5632 | struct snd_card *card = dev_get_drvdata(dev); | ||
5633 | struct azx *chip; | ||
5634 | |||
5635 | + if (!azx_is_pm_ready(card)) | ||
5636 | + return; | ||
5637 | + | ||
5638 | chip = card->private_data; | ||
5639 | + snd_power_change_state(card, SNDRV_CTL_POWER_D0); | ||
5640 | chip->pm_prepared = 0; | ||
5641 | } | ||
5642 | |||
5643 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
5644 | index 73580e8208ed1..3c9e072db3538 100644 | ||
5645 | --- a/sound/pci/hda/patch_realtek.c | ||
5646 | +++ b/sound/pci/hda/patch_realtek.c | ||
5647 | @@ -5192,7 +5192,7 @@ static void alc_determine_headset_type(struct hda_codec *codec) | ||
5648 | case 0x10ec0274: | ||
5649 | case 0x10ec0294: | ||
5650 | alc_process_coef_fw(codec, coef0274); | ||
5651 | - msleep(80); | ||
5652 | + msleep(850); | ||
5653 | val = alc_read_coef_idx(codec, 0x46); | ||
5654 | is_ctia = (val & 0x00f0) == 0x00f0; | ||
5655 | break; | ||
5656 | @@ -5376,6 +5376,7 @@ static void alc_update_headset_jack_cb(struct hda_codec *codec, | ||
5657 | struct hda_jack_callback *jack) | ||
5658 | { | ||
5659 | snd_hda_gen_hp_automute(codec, jack); | ||
5660 | + alc_update_headset_mode(codec); | ||
5661 | } | ||
5662 | |||
5663 | static void alc_probe_headset_mode(struct hda_codec *codec) | ||
5664 | diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c | ||
5665 | index 5125bb9b37b55..dcd2acb2c3cef 100644 | ||
5666 | --- a/sound/soc/codecs/cs42l42.c | ||
5667 | +++ b/sound/soc/codecs/cs42l42.c | ||
5668 | @@ -401,7 +401,7 @@ static const struct regmap_config cs42l42_regmap = { | ||
5669 | }; | ||
5670 | |||
5671 | static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false); | ||
5672 | -static DECLARE_TLV_DB_SCALE(mixer_tlv, -6200, 100, false); | ||
5673 | +static DECLARE_TLV_DB_SCALE(mixer_tlv, -6300, 100, true); | ||
5674 | |||
5675 | static const char * const cs42l42_hpf_freq_text[] = { | ||
5676 | "1.86Hz", "120Hz", "235Hz", "466Hz" | ||
5677 | @@ -458,7 +458,7 @@ static const struct snd_kcontrol_new cs42l42_snd_controls[] = { | ||
5678 | CS42L42_DAC_HPF_EN_SHIFT, true, false), | ||
5679 | SOC_DOUBLE_R_TLV("Mixer Volume", CS42L42_MIXER_CHA_VOL, | ||
5680 | CS42L42_MIXER_CHB_VOL, CS42L42_MIXER_CH_VOL_SHIFT, | ||
5681 | - 0x3e, 1, mixer_tlv) | ||
5682 | + 0x3f, 1, mixer_tlv) | ||
5683 | }; | ||
5684 | |||
5685 | static int cs42l42_hpdrv_evt(struct snd_soc_dapm_widget *w, | ||
5686 | @@ -691,24 +691,6 @@ static int cs42l42_pll_config(struct snd_soc_component *component) | ||
5687 | CS42L42_CLK_OASRC_SEL_MASK, | ||
5688 | CS42L42_CLK_OASRC_SEL_12 << | ||
5689 | CS42L42_CLK_OASRC_SEL_SHIFT); | ||
5690 | - /* channel 1 on low LRCLK, 32 bit */ | ||
5691 | - snd_soc_component_update_bits(component, | ||
5692 | - CS42L42_ASP_RX_DAI0_CH1_AP_RES, | ||
5693 | - CS42L42_ASP_RX_CH_AP_MASK | | ||
5694 | - CS42L42_ASP_RX_CH_RES_MASK, | ||
5695 | - (CS42L42_ASP_RX_CH_AP_LOW << | ||
5696 | - CS42L42_ASP_RX_CH_AP_SHIFT) | | ||
5697 | - (CS42L42_ASP_RX_CH_RES_32 << | ||
5698 | - CS42L42_ASP_RX_CH_RES_SHIFT)); | ||
5699 | - /* Channel 2 on high LRCLK, 32 bit */ | ||
5700 | - snd_soc_component_update_bits(component, | ||
5701 | - CS42L42_ASP_RX_DAI0_CH2_AP_RES, | ||
5702 | - CS42L42_ASP_RX_CH_AP_MASK | | ||
5703 | - CS42L42_ASP_RX_CH_RES_MASK, | ||
5704 | - (CS42L42_ASP_RX_CH_AP_HI << | ||
5705 | - CS42L42_ASP_RX_CH_AP_SHIFT) | | ||
5706 | - (CS42L42_ASP_RX_CH_RES_32 << | ||
5707 | - CS42L42_ASP_RX_CH_RES_SHIFT)); | ||
5708 | if (pll_ratio_table[i].mclk_src_sel == 0) { | ||
5709 | /* Pass the clock straight through */ | ||
5710 | snd_soc_component_update_bits(component, | ||
5711 | @@ -797,27 +779,23 @@ static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) | ||
5712 | /* Bitclock/frame inversion */ | ||
5713 | switch (fmt & SND_SOC_DAIFMT_INV_MASK) { | ||
5714 | case SND_SOC_DAIFMT_NB_NF: | ||
5715 | + asp_cfg_val |= CS42L42_ASP_SCPOL_NOR << CS42L42_ASP_SCPOL_SHIFT; | ||
5716 | break; | ||
5717 | case SND_SOC_DAIFMT_NB_IF: | ||
5718 | - asp_cfg_val |= CS42L42_ASP_POL_INV << | ||
5719 | - CS42L42_ASP_LCPOL_IN_SHIFT; | ||
5720 | + asp_cfg_val |= CS42L42_ASP_SCPOL_NOR << CS42L42_ASP_SCPOL_SHIFT; | ||
5721 | + asp_cfg_val |= CS42L42_ASP_LCPOL_INV << CS42L42_ASP_LCPOL_SHIFT; | ||
5722 | break; | ||
5723 | case SND_SOC_DAIFMT_IB_NF: | ||
5724 | - asp_cfg_val |= CS42L42_ASP_POL_INV << | ||
5725 | - CS42L42_ASP_SCPOL_IN_DAC_SHIFT; | ||
5726 | break; | ||
5727 | case SND_SOC_DAIFMT_IB_IF: | ||
5728 | - asp_cfg_val |= CS42L42_ASP_POL_INV << | ||
5729 | - CS42L42_ASP_LCPOL_IN_SHIFT; | ||
5730 | - asp_cfg_val |= CS42L42_ASP_POL_INV << | ||
5731 | - CS42L42_ASP_SCPOL_IN_DAC_SHIFT; | ||
5732 | + asp_cfg_val |= CS42L42_ASP_LCPOL_INV << CS42L42_ASP_LCPOL_SHIFT; | ||
5733 | break; | ||
5734 | } | ||
5735 | |||
5736 | - snd_soc_component_update_bits(component, CS42L42_ASP_CLK_CFG, | ||
5737 | - CS42L42_ASP_MODE_MASK | | ||
5738 | - CS42L42_ASP_SCPOL_IN_DAC_MASK | | ||
5739 | - CS42L42_ASP_LCPOL_IN_MASK, asp_cfg_val); | ||
5740 | + snd_soc_component_update_bits(component, CS42L42_ASP_CLK_CFG, CS42L42_ASP_MODE_MASK | | ||
5741 | + CS42L42_ASP_SCPOL_MASK | | ||
5742 | + CS42L42_ASP_LCPOL_MASK, | ||
5743 | + asp_cfg_val); | ||
5744 | |||
5745 | return 0; | ||
5746 | } | ||
5747 | @@ -828,14 +806,29 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream, | ||
5748 | { | ||
5749 | struct snd_soc_component *component = dai->component; | ||
5750 | struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component); | ||
5751 | - int retval; | ||
5752 | + unsigned int width = (params_width(params) / 8) - 1; | ||
5753 | + unsigned int val = 0; | ||
5754 | |||
5755 | cs42l42->srate = params_rate(params); | ||
5756 | - cs42l42->swidth = params_width(params); | ||
5757 | |||
5758 | - retval = cs42l42_pll_config(component); | ||
5759 | + switch(substream->stream) { | ||
5760 | + case SNDRV_PCM_STREAM_PLAYBACK: | ||
5761 | + val |= width << CS42L42_ASP_RX_CH_RES_SHIFT; | ||
5762 | + /* channel 1 on low LRCLK */ | ||
5763 | + snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH1_AP_RES, | ||
5764 | + CS42L42_ASP_RX_CH_AP_MASK | | ||
5765 | + CS42L42_ASP_RX_CH_RES_MASK, val); | ||
5766 | + /* Channel 2 on high LRCLK */ | ||
5767 | + val |= CS42L42_ASP_RX_CH_AP_HI << CS42L42_ASP_RX_CH_AP_SHIFT; | ||
5768 | + snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH2_AP_RES, | ||
5769 | + CS42L42_ASP_RX_CH_AP_MASK | | ||
5770 | + CS42L42_ASP_RX_CH_RES_MASK, val); | ||
5771 | + break; | ||
5772 | + default: | ||
5773 | + break; | ||
5774 | + } | ||
5775 | |||
5776 | - return retval; | ||
5777 | + return cs42l42_pll_config(component); | ||
5778 | } | ||
5779 | |||
5780 | static int cs42l42_set_sysclk(struct snd_soc_dai *dai, | ||
5781 | @@ -900,9 +893,9 @@ static int cs42l42_digital_mute(struct snd_soc_dai *dai, int mute) | ||
5782 | return 0; | ||
5783 | } | ||
5784 | |||
5785 | -#define CS42L42_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \ | ||
5786 | - SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE | \ | ||
5787 | - SNDRV_PCM_FMTBIT_S32_LE) | ||
5788 | +#define CS42L42_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ | ||
5789 | + SNDRV_PCM_FMTBIT_S24_LE |\ | ||
5790 | + SNDRV_PCM_FMTBIT_S32_LE ) | ||
5791 | |||
5792 | |||
5793 | static const struct snd_soc_dai_ops cs42l42_ops = { | ||
5794 | @@ -1803,7 +1796,7 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client, | ||
5795 | dev_dbg(&i2c_client->dev, "Found reset GPIO\n"); | ||
5796 | gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); | ||
5797 | } | ||
5798 | - mdelay(3); | ||
5799 | + usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2); | ||
5800 | |||
5801 | /* Request IRQ */ | ||
5802 | ret = devm_request_threaded_irq(&i2c_client->dev, | ||
5803 | @@ -1928,6 +1921,7 @@ static int cs42l42_runtime_resume(struct device *dev) | ||
5804 | } | ||
5805 | |||
5806 | gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); | ||
5807 | + usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2); | ||
5808 | |||
5809 | regcache_cache_only(cs42l42->regmap, false); | ||
5810 | regcache_sync(cs42l42->regmap); | ||
5811 | diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h | ||
5812 | index 9e3cc528dcff0..866d7c873e3c9 100644 | ||
5813 | --- a/sound/soc/codecs/cs42l42.h | ||
5814 | +++ b/sound/soc/codecs/cs42l42.h | ||
5815 | @@ -258,11 +258,12 @@ | ||
5816 | #define CS42L42_ASP_SLAVE_MODE 0x00 | ||
5817 | #define CS42L42_ASP_MODE_SHIFT 4 | ||
5818 | #define CS42L42_ASP_MODE_MASK (1 << CS42L42_ASP_MODE_SHIFT) | ||
5819 | -#define CS42L42_ASP_SCPOL_IN_DAC_SHIFT 2 | ||
5820 | -#define CS42L42_ASP_SCPOL_IN_DAC_MASK (1 << CS42L42_ASP_SCPOL_IN_DAC_SHIFT) | ||
5821 | -#define CS42L42_ASP_LCPOL_IN_SHIFT 0 | ||
5822 | -#define CS42L42_ASP_LCPOL_IN_MASK (1 << CS42L42_ASP_LCPOL_IN_SHIFT) | ||
5823 | -#define CS42L42_ASP_POL_INV 1 | ||
5824 | +#define CS42L42_ASP_SCPOL_SHIFT 2 | ||
5825 | +#define CS42L42_ASP_SCPOL_MASK (3 << CS42L42_ASP_SCPOL_SHIFT) | ||
5826 | +#define CS42L42_ASP_SCPOL_NOR 3 | ||
5827 | +#define CS42L42_ASP_LCPOL_SHIFT 0 | ||
5828 | +#define CS42L42_ASP_LCPOL_MASK (3 << CS42L42_ASP_LCPOL_SHIFT) | ||
5829 | +#define CS42L42_ASP_LCPOL_INV 3 | ||
5830 | |||
5831 | #define CS42L42_ASP_FRM_CFG (CS42L42_PAGE_12 + 0x08) | ||
5832 | #define CS42L42_ASP_STP_SHIFT 4 | ||
5833 | @@ -739,6 +740,7 @@ | ||
5834 | #define CS42L42_FRAC2_VAL(val) (((val) & 0xff0000) >> 16) | ||
5835 | |||
5836 | #define CS42L42_NUM_SUPPLIES 5 | ||
5837 | +#define CS42L42_BOOT_TIME_US 3000 | ||
5838 | |||
5839 | static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = { | ||
5840 | "VA", | ||
5841 | @@ -756,7 +758,6 @@ struct cs42l42_private { | ||
5842 | struct completion pdn_done; | ||
5843 | u32 sclk; | ||
5844 | u32 srate; | ||
5845 | - u32 swidth; | ||
5846 | u8 plug_state; | ||
5847 | u8 hs_type; | ||
5848 | u8 ts_inv; | ||
5849 | diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c | ||
5850 | index 36eef1fb3d181..b781b28de0126 100644 | ||
5851 | --- a/sound/soc/codecs/es8316.c | ||
5852 | +++ b/sound/soc/codecs/es8316.c | ||
5853 | @@ -63,13 +63,8 @@ static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(adc_pga_gain_tlv, | ||
5854 | 1, 1, TLV_DB_SCALE_ITEM(0, 0, 0), | ||
5855 | 2, 2, TLV_DB_SCALE_ITEM(250, 0, 0), | ||
5856 | 3, 3, TLV_DB_SCALE_ITEM(450, 0, 0), | ||
5857 | - 4, 4, TLV_DB_SCALE_ITEM(700, 0, 0), | ||
5858 | - 5, 5, TLV_DB_SCALE_ITEM(1000, 0, 0), | ||
5859 | - 6, 6, TLV_DB_SCALE_ITEM(1300, 0, 0), | ||
5860 | - 7, 7, TLV_DB_SCALE_ITEM(1600, 0, 0), | ||
5861 | - 8, 8, TLV_DB_SCALE_ITEM(1800, 0, 0), | ||
5862 | - 9, 9, TLV_DB_SCALE_ITEM(2100, 0, 0), | ||
5863 | - 10, 10, TLV_DB_SCALE_ITEM(2400, 0, 0), | ||
5864 | + 4, 7, TLV_DB_SCALE_ITEM(700, 300, 0), | ||
5865 | + 8, 10, TLV_DB_SCALE_ITEM(1800, 300, 0), | ||
5866 | ); | ||
5867 | |||
5868 | static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpout_vol_tlv, | ||
5869 | diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c | ||
5870 | index 747ca248bf10c..3bc63fbcb1889 100644 | ||
5871 | --- a/sound/soc/codecs/rt5640.c | ||
5872 | +++ b/sound/soc/codecs/rt5640.c | ||
5873 | @@ -339,9 +339,9 @@ static bool rt5640_readable_register(struct device *dev, unsigned int reg) | ||
5874 | } | ||
5875 | |||
5876 | static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); | ||
5877 | -static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); | ||
5878 | +static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0); | ||
5879 | static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); | ||
5880 | -static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); | ||
5881 | +static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000); | ||
5882 | static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); | ||
5883 | |||
5884 | /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ | ||
5885 | diff --git a/sound/soc/codecs/rt5651.c b/sound/soc/codecs/rt5651.c | ||
5886 | index c506c9305043e..829cf552fe3e8 100644 | ||
5887 | --- a/sound/soc/codecs/rt5651.c | ||
5888 | +++ b/sound/soc/codecs/rt5651.c | ||
5889 | @@ -285,9 +285,9 @@ static bool rt5651_readable_register(struct device *dev, unsigned int reg) | ||
5890 | } | ||
5891 | |||
5892 | static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); | ||
5893 | -static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); | ||
5894 | +static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0); | ||
5895 | static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); | ||
5896 | -static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); | ||
5897 | +static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000); | ||
5898 | static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); | ||
5899 | |||
5900 | /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ | ||
5901 | diff --git a/sound/soc/codecs/rt5659.c b/sound/soc/codecs/rt5659.c | ||
5902 | index e66d08398f746..afd61599d94c9 100644 | ||
5903 | --- a/sound/soc/codecs/rt5659.c | ||
5904 | +++ b/sound/soc/codecs/rt5659.c | ||
5905 | @@ -3463,12 +3463,17 @@ static int rt5659_set_component_sysclk(struct snd_soc_component *component, int | ||
5906 | { | ||
5907 | struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); | ||
5908 | unsigned int reg_val = 0; | ||
5909 | + int ret; | ||
5910 | |||
5911 | if (freq == rt5659->sysclk && clk_id == rt5659->sysclk_src) | ||
5912 | return 0; | ||
5913 | |||
5914 | switch (clk_id) { | ||
5915 | case RT5659_SCLK_S_MCLK: | ||
5916 | + ret = clk_set_rate(rt5659->mclk, freq); | ||
5917 | + if (ret) | ||
5918 | + return ret; | ||
5919 | + | ||
5920 | reg_val |= RT5659_SCLK_SRC_MCLK; | ||
5921 | break; | ||
5922 | case RT5659_SCLK_S_PLL1: | ||
5923 | diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c | ||
5924 | index f5b59305c957a..8a1e485982d81 100644 | ||
5925 | --- a/sound/soc/codecs/sgtl5000.c | ||
5926 | +++ b/sound/soc/codecs/sgtl5000.c | ||
5927 | @@ -71,7 +71,7 @@ static const struct reg_default sgtl5000_reg_defaults[] = { | ||
5928 | { SGTL5000_DAP_EQ_BASS_BAND4, 0x002f }, | ||
5929 | { SGTL5000_DAP_MAIN_CHAN, 0x8000 }, | ||
5930 | { SGTL5000_DAP_MIX_CHAN, 0x0000 }, | ||
5931 | - { SGTL5000_DAP_AVC_CTRL, 0x0510 }, | ||
5932 | + { SGTL5000_DAP_AVC_CTRL, 0x5100 }, | ||
5933 | { SGTL5000_DAP_AVC_THRESHOLD, 0x1473 }, | ||
5934 | { SGTL5000_DAP_AVC_ATTACK, 0x0028 }, | ||
5935 | { SGTL5000_DAP_AVC_DECAY, 0x0050 }, | ||
5936 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
5937 | index 9fb03c646a88f..3d1585c12b074 100644 | ||
5938 | --- a/sound/usb/quirks.c | ||
5939 | +++ b/sound/usb/quirks.c | ||
5940 | @@ -1453,6 +1453,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
5941 | case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ | ||
5942 | case USB_ID(0x2912, 0x30c8): /* Audioengine D1 */ | ||
5943 | case USB_ID(0x413c, 0xa506): /* Dell AE515 sound bar */ | ||
5944 | + case USB_ID(0x046d, 0x084c): /* Logitech ConferenceCam Connect */ | ||
5945 | return true; | ||
5946 | } | ||
5947 | |||
5948 | diff --git a/tools/testing/selftests/net/forwarding/tc_flower.sh b/tools/testing/selftests/net/forwarding/tc_flower.sh | ||
5949 | index 058c746ee3006..b11d8e6b5bc14 100755 | ||
5950 | --- a/tools/testing/selftests/net/forwarding/tc_flower.sh | ||
5951 | +++ b/tools/testing/selftests/net/forwarding/tc_flower.sh | ||
5952 | @@ -3,7 +3,7 @@ | ||
5953 | |||
5954 | ALL_TESTS="match_dst_mac_test match_src_mac_test match_dst_ip_test \ | ||
5955 | match_src_ip_test match_ip_flags_test match_pcp_test match_vlan_test \ | ||
5956 | - match_ip_tos_test match_indev_test" | ||
5957 | + match_ip_tos_test match_indev_test match_ip_ttl_test" | ||
5958 | NUM_NETIFS=2 | ||
5959 | source tc_common.sh | ||
5960 | source lib.sh | ||
5961 | @@ -310,6 +310,42 @@ match_ip_tos_test() | ||
5962 | log_test "ip_tos match ($tcflags)" | ||
5963 | } | ||
5964 | |||
5965 | +match_ip_ttl_test() | ||
5966 | +{ | ||
5967 | + RET=0 | ||
5968 | + | ||
5969 | + tc filter add dev $h2 ingress protocol ip pref 1 handle 101 flower \ | ||
5970 | + $tcflags dst_ip 192.0.2.2 ip_ttl 63 action drop | ||
5971 | + tc filter add dev $h2 ingress protocol ip pref 2 handle 102 flower \ | ||
5972 | + $tcflags dst_ip 192.0.2.2 action drop | ||
5973 | + | ||
5974 | + $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \ | ||
5975 | + -t ip "ttl=63" -q | ||
5976 | + | ||
5977 | + $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \ | ||
5978 | + -t ip "ttl=63,mf,frag=256" -q | ||
5979 | + | ||
5980 | + tc_check_packets "dev $h2 ingress" 102 1 | ||
5981 | + check_fail $? "Matched on the wrong filter (no check on ttl)" | ||
5982 | + | ||
5983 | + tc_check_packets "dev $h2 ingress" 101 2 | ||
5984 | + check_err $? "Did not match on correct filter (ttl=63)" | ||
5985 | + | ||
5986 | + $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \ | ||
5987 | + -t ip "ttl=255" -q | ||
5988 | + | ||
5989 | + tc_check_packets "dev $h2 ingress" 101 3 | ||
5990 | + check_fail $? "Matched on a wrong filter (ttl=63)" | ||
5991 | + | ||
5992 | + tc_check_packets "dev $h2 ingress" 102 1 | ||
5993 | + check_err $? "Did not match on correct filter (no check on ttl)" | ||
5994 | + | ||
5995 | + tc filter del dev $h2 ingress protocol ip pref 2 handle 102 flower | ||
5996 | + tc filter del dev $h2 ingress protocol ip pref 1 handle 101 flower | ||
5997 | + | ||
5998 | + log_test "ip_ttl match ($tcflags)" | ||
5999 | +} | ||
6000 | + | ||
6001 | match_indev_test() | ||
6002 | { | ||
6003 | RET=0 |