Annotation of /trunk/kernel-alx/patches-5.4/0304-5.4.205-all-fixes.patch
Parent Directory | Revision Log
Revision 3635 -
(hide annotations)
(download)
Mon Oct 24 12:34:12 2022 UTC (18 months, 3 weeks ago) by niro
File size: 57712 byte(s)
Mon Oct 24 12:34:12 2022 UTC (18 months, 3 weeks ago) by niro
File size: 57712 byte(s)
-sync kernel patches
1 | niro | 3635 | diff --git a/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml b/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml |
2 | index 4cb9d6b931389..c61c4a6b57f10 100644 | ||
3 | --- a/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml | ||
4 | +++ b/Documentation/devicetree/bindings/dma/allwinner,sun50i-a64-dma.yaml | ||
5 | @@ -58,7 +58,7 @@ if: | ||
6 | then: | ||
7 | properties: | ||
8 | clocks: | ||
9 | - maxItems: 2 | ||
10 | + minItems: 2 | ||
11 | |||
12 | required: | ||
13 | - clock-names | ||
14 | diff --git a/Makefile b/Makefile | ||
15 | index b5d1718ae70c6..c40565492ffba 100644 | ||
16 | --- a/Makefile | ||
17 | +++ b/Makefile | ||
18 | @@ -1,7 +1,7 @@ | ||
19 | # SPDX-License-Identifier: GPL-2.0 | ||
20 | VERSION = 5 | ||
21 | PATCHLEVEL = 4 | ||
22 | -SUBLEVEL = 204 | ||
23 | +SUBLEVEL = 205 | ||
24 | EXTRAVERSION = | ||
25 | NAME = Kleptomaniac Octopus | ||
26 | |||
27 | diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c | ||
28 | index 676cc2a318f41..5d75ab82d5a6a 100644 | ||
29 | --- a/arch/arm/mach-at91/pm.c | ||
30 | +++ b/arch/arm/mach-at91/pm.c | ||
31 | @@ -103,7 +103,7 @@ static const struct wakeup_source_info ws_info[] = { | ||
32 | |||
33 | static const struct of_device_id sama5d2_ws_ids[] = { | ||
34 | { .compatible = "atmel,sama5d2-gem", .data = &ws_info[0] }, | ||
35 | - { .compatible = "atmel,at91rm9200-rtc", .data = &ws_info[1] }, | ||
36 | + { .compatible = "atmel,sama5d2-rtc", .data = &ws_info[1] }, | ||
37 | { .compatible = "atmel,sama5d3-udc", .data = &ws_info[2] }, | ||
38 | { .compatible = "atmel,at91rm9200-ohci", .data = &ws_info[2] }, | ||
39 | { .compatible = "usb-ohci", .data = &ws_info[2] }, | ||
40 | @@ -114,12 +114,12 @@ static const struct of_device_id sama5d2_ws_ids[] = { | ||
41 | }; | ||
42 | |||
43 | static const struct of_device_id sam9x60_ws_ids[] = { | ||
44 | - { .compatible = "atmel,at91sam9x5-rtc", .data = &ws_info[1] }, | ||
45 | + { .compatible = "microchip,sam9x60-rtc", .data = &ws_info[1] }, | ||
46 | { .compatible = "atmel,at91rm9200-ohci", .data = &ws_info[2] }, | ||
47 | { .compatible = "usb-ohci", .data = &ws_info[2] }, | ||
48 | { .compatible = "atmel,at91sam9g45-ehci", .data = &ws_info[2] }, | ||
49 | { .compatible = "usb-ehci", .data = &ws_info[2] }, | ||
50 | - { .compatible = "atmel,at91sam9260-rtt", .data = &ws_info[4] }, | ||
51 | + { .compatible = "microchip,sam9x60-rtt", .data = &ws_info[4] }, | ||
52 | { .compatible = "cdns,sam9x60-macb", .data = &ws_info[5] }, | ||
53 | { /* sentinel */ } | ||
54 | }; | ||
55 | diff --git a/arch/arm/mach-meson/platsmp.c b/arch/arm/mach-meson/platsmp.c | ||
56 | index 4b8ad728bb42a..32ac60b89fdcc 100644 | ||
57 | --- a/arch/arm/mach-meson/platsmp.c | ||
58 | +++ b/arch/arm/mach-meson/platsmp.c | ||
59 | @@ -71,6 +71,7 @@ static void __init meson_smp_prepare_cpus(const char *scu_compatible, | ||
60 | } | ||
61 | |||
62 | sram_base = of_iomap(node, 0); | ||
63 | + of_node_put(node); | ||
64 | if (!sram_base) { | ||
65 | pr_err("Couldn't map SRAM registers\n"); | ||
66 | return; | ||
67 | @@ -91,6 +92,7 @@ static void __init meson_smp_prepare_cpus(const char *scu_compatible, | ||
68 | } | ||
69 | |||
70 | scu_base = of_iomap(node, 0); | ||
71 | + of_node_put(node); | ||
72 | if (!scu_base) { | ||
73 | pr_err("Couldn't map SCU registers\n"); | ||
74 | return; | ||
75 | diff --git a/arch/powerpc/platforms/powernv/rng.c b/arch/powerpc/platforms/powernv/rng.c | ||
76 | index eba4142998b03..7186e17cfd3dc 100644 | ||
77 | --- a/arch/powerpc/platforms/powernv/rng.c | ||
78 | +++ b/arch/powerpc/platforms/powernv/rng.c | ||
79 | @@ -176,12 +176,8 @@ static int __init pnv_get_random_long_early(unsigned long *v) | ||
80 | NULL) != pnv_get_random_long_early) | ||
81 | return 0; | ||
82 | |||
83 | - for_each_compatible_node(dn, NULL, "ibm,power-rng") { | ||
84 | - if (rng_create(dn)) | ||
85 | - continue; | ||
86 | - /* Create devices for hwrng driver */ | ||
87 | - of_platform_device_create(dn, NULL, NULL); | ||
88 | - } | ||
89 | + for_each_compatible_node(dn, NULL, "ibm,power-rng") | ||
90 | + rng_create(dn); | ||
91 | |||
92 | if (!ppc_md.get_random_seed) | ||
93 | return 0; | ||
94 | @@ -205,10 +201,18 @@ void __init pnv_rng_init(void) | ||
95 | |||
96 | static int __init pnv_rng_late_init(void) | ||
97 | { | ||
98 | + struct device_node *dn; | ||
99 | unsigned long v; | ||
100 | + | ||
101 | /* In case it wasn't called during init for some other reason. */ | ||
102 | if (ppc_md.get_random_seed == pnv_get_random_long_early) | ||
103 | pnv_get_random_long_early(&v); | ||
104 | + | ||
105 | + if (ppc_md.get_random_seed == powernv_get_random_long) { | ||
106 | + for_each_compatible_node(dn, NULL, "ibm,power-rng") | ||
107 | + of_platform_device_create(dn, NULL, NULL); | ||
108 | + } | ||
109 | + | ||
110 | return 0; | ||
111 | } | ||
112 | machine_subsys_initcall(powernv, pnv_rng_late_init); | ||
113 | diff --git a/drivers/dma/at_xdmac.c b/drivers/dma/at_xdmac.c | ||
114 | index 6473a4a81d58b..a406b3c0d170a 100644 | ||
115 | --- a/drivers/dma/at_xdmac.c | ||
116 | +++ b/drivers/dma/at_xdmac.c | ||
117 | @@ -1848,6 +1848,11 @@ static int at_xdmac_alloc_chan_resources(struct dma_chan *chan) | ||
118 | for (i = 0; i < init_nr_desc_per_channel; i++) { | ||
119 | desc = at_xdmac_alloc_desc(chan, GFP_ATOMIC); | ||
120 | if (!desc) { | ||
121 | + if (i == 0) { | ||
122 | + dev_warn(chan2dev(chan), | ||
123 | + "can't allocate any descriptors\n"); | ||
124 | + return -EIO; | ||
125 | + } | ||
126 | dev_warn(chan2dev(chan), | ||
127 | "only %d descriptors have been allocated\n", i); | ||
128 | break; | ||
129 | diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c | ||
130 | index 801bef83df2a5..8ec7a7041e840 100644 | ||
131 | --- a/drivers/dma/imx-sdma.c | ||
132 | +++ b/drivers/dma/imx-sdma.c | ||
133 | @@ -2208,7 +2208,7 @@ MODULE_DESCRIPTION("i.MX SDMA driver"); | ||
134 | #if IS_ENABLED(CONFIG_SOC_IMX6Q) | ||
135 | MODULE_FIRMWARE("imx/sdma/sdma-imx6q.bin"); | ||
136 | #endif | ||
137 | -#if IS_ENABLED(CONFIG_SOC_IMX7D) | ||
138 | +#if IS_ENABLED(CONFIG_SOC_IMX7D) || IS_ENABLED(CONFIG_SOC_IMX8M) | ||
139 | MODULE_FIRMWARE("imx/sdma/sdma-imx7d.bin"); | ||
140 | #endif | ||
141 | MODULE_LICENSE("GPL"); | ||
142 | diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c | ||
143 | index 9a94d5b9e0590..77a6495bb6b19 100644 | ||
144 | --- a/drivers/dma/pl330.c | ||
145 | +++ b/drivers/dma/pl330.c | ||
146 | @@ -2585,7 +2585,7 @@ static struct dma_pl330_desc *pl330_get_desc(struct dma_pl330_chan *pch) | ||
147 | |||
148 | /* If the DMAC pool is empty, alloc new */ | ||
149 | if (!desc) { | ||
150 | - DEFINE_SPINLOCK(lock); | ||
151 | + static DEFINE_SPINLOCK(lock); | ||
152 | LIST_HEAD(pool); | ||
153 | |||
154 | if (!add_desc(&pool, &lock, GFP_ATOMIC, 1)) | ||
155 | diff --git a/drivers/dma/ti/dma-crossbar.c b/drivers/dma/ti/dma-crossbar.c | ||
156 | index f255056696eec..26cf62af08fc8 100644 | ||
157 | --- a/drivers/dma/ti/dma-crossbar.c | ||
158 | +++ b/drivers/dma/ti/dma-crossbar.c | ||
159 | @@ -247,6 +247,7 @@ static void *ti_dra7_xbar_route_allocate(struct of_phandle_args *dma_spec, | ||
160 | if (dma_spec->args[0] >= xbar->xbar_requests) { | ||
161 | dev_err(&pdev->dev, "Invalid XBAR request number: %d\n", | ||
162 | dma_spec->args[0]); | ||
163 | + put_device(&pdev->dev); | ||
164 | return ERR_PTR(-EINVAL); | ||
165 | } | ||
166 | |||
167 | @@ -254,12 +255,14 @@ static void *ti_dra7_xbar_route_allocate(struct of_phandle_args *dma_spec, | ||
168 | dma_spec->np = of_parse_phandle(ofdma->of_node, "dma-masters", 0); | ||
169 | if (!dma_spec->np) { | ||
170 | dev_err(&pdev->dev, "Can't get DMA master\n"); | ||
171 | + put_device(&pdev->dev); | ||
172 | return ERR_PTR(-EINVAL); | ||
173 | } | ||
174 | |||
175 | map = kzalloc(sizeof(*map), GFP_KERNEL); | ||
176 | if (!map) { | ||
177 | of_node_put(dma_spec->np); | ||
178 | + put_device(&pdev->dev); | ||
179 | return ERR_PTR(-ENOMEM); | ||
180 | } | ||
181 | |||
182 | @@ -270,6 +273,8 @@ static void *ti_dra7_xbar_route_allocate(struct of_phandle_args *dma_spec, | ||
183 | mutex_unlock(&xbar->mutex); | ||
184 | dev_err(&pdev->dev, "Run out of free DMA requests\n"); | ||
185 | kfree(map); | ||
186 | + of_node_put(dma_spec->np); | ||
187 | + put_device(&pdev->dev); | ||
188 | return ERR_PTR(-ENOMEM); | ||
189 | } | ||
190 | set_bit(map->xbar_out, xbar->dma_inuse); | ||
191 | diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c | ||
192 | index 8a3a0991bc1c5..3a1bdc75275f4 100644 | ||
193 | --- a/drivers/i2c/busses/i2c-cadence.c | ||
194 | +++ b/drivers/i2c/busses/i2c-cadence.c | ||
195 | @@ -985,6 +985,7 @@ static int cdns_i2c_probe(struct platform_device *pdev) | ||
196 | return 0; | ||
197 | |||
198 | err_clk_dis: | ||
199 | + clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); | ||
200 | clk_disable_unprepare(id->clk); | ||
201 | pm_runtime_set_suspended(&pdev->dev); | ||
202 | pm_runtime_disable(&pdev->dev); | ||
203 | diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c | ||
204 | index 24616525c90dc..9f7c1e29e86a3 100644 | ||
205 | --- a/drivers/iommu/dmar.c | ||
206 | +++ b/drivers/iommu/dmar.c | ||
207 | @@ -363,7 +363,7 @@ static int dmar_pci_bus_notifier(struct notifier_block *nb, | ||
208 | |||
209 | static struct notifier_block dmar_pci_bus_nb = { | ||
210 | .notifier_call = dmar_pci_bus_notifier, | ||
211 | - .priority = INT_MIN, | ||
212 | + .priority = 1, | ||
213 | }; | ||
214 | |||
215 | static struct dmar_drhd_unit * | ||
216 | diff --git a/drivers/misc/cardreader/rtsx_usb.c b/drivers/misc/cardreader/rtsx_usb.c | ||
217 | index 4aef33d07cc36..8acf6e6aff316 100644 | ||
218 | --- a/drivers/misc/cardreader/rtsx_usb.c | ||
219 | +++ b/drivers/misc/cardreader/rtsx_usb.c | ||
220 | @@ -631,16 +631,20 @@ static int rtsx_usb_probe(struct usb_interface *intf, | ||
221 | |||
222 | ucr->pusb_dev = usb_dev; | ||
223 | |||
224 | - ucr->iobuf = usb_alloc_coherent(ucr->pusb_dev, IOBUF_SIZE, | ||
225 | - GFP_KERNEL, &ucr->iobuf_dma); | ||
226 | - if (!ucr->iobuf) | ||
227 | + ucr->cmd_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); | ||
228 | + if (!ucr->cmd_buf) | ||
229 | return -ENOMEM; | ||
230 | |||
231 | + ucr->rsp_buf = kmalloc(IOBUF_SIZE, GFP_KERNEL); | ||
232 | + if (!ucr->rsp_buf) { | ||
233 | + ret = -ENOMEM; | ||
234 | + goto out_free_cmd_buf; | ||
235 | + } | ||
236 | + | ||
237 | usb_set_intfdata(intf, ucr); | ||
238 | |||
239 | ucr->vendor_id = id->idVendor; | ||
240 | ucr->product_id = id->idProduct; | ||
241 | - ucr->cmd_buf = ucr->rsp_buf = ucr->iobuf; | ||
242 | |||
243 | mutex_init(&ucr->dev_mutex); | ||
244 | |||
245 | @@ -668,8 +672,11 @@ static int rtsx_usb_probe(struct usb_interface *intf, | ||
246 | |||
247 | out_init_fail: | ||
248 | usb_set_intfdata(ucr->pusb_intf, NULL); | ||
249 | - usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, | ||
250 | - ucr->iobuf_dma); | ||
251 | + kfree(ucr->rsp_buf); | ||
252 | + ucr->rsp_buf = NULL; | ||
253 | +out_free_cmd_buf: | ||
254 | + kfree(ucr->cmd_buf); | ||
255 | + ucr->cmd_buf = NULL; | ||
256 | return ret; | ||
257 | } | ||
258 | |||
259 | @@ -682,8 +689,12 @@ static void rtsx_usb_disconnect(struct usb_interface *intf) | ||
260 | mfd_remove_devices(&intf->dev); | ||
261 | |||
262 | usb_set_intfdata(ucr->pusb_intf, NULL); | ||
263 | - usb_free_coherent(ucr->pusb_dev, IOBUF_SIZE, ucr->iobuf, | ||
264 | - ucr->iobuf_dma); | ||
265 | + | ||
266 | + kfree(ucr->cmd_buf); | ||
267 | + ucr->cmd_buf = NULL; | ||
268 | + | ||
269 | + kfree(ucr->rsp_buf); | ||
270 | + ucr->rsp_buf = NULL; | ||
271 | } | ||
272 | |||
273 | #ifdef CONFIG_PM | ||
274 | diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c | ||
275 | index e613cd5707e27..ca864ece89ae5 100644 | ||
276 | --- a/drivers/net/can/grcan.c | ||
277 | +++ b/drivers/net/can/grcan.c | ||
278 | @@ -1660,7 +1660,6 @@ static int grcan_probe(struct platform_device *ofdev) | ||
279 | */ | ||
280 | sysid_parent = of_find_node_by_path("/ambapp0"); | ||
281 | if (sysid_parent) { | ||
282 | - of_node_get(sysid_parent); | ||
283 | err = of_property_read_u32(sysid_parent, "systemid", &sysid); | ||
284 | if (!err && ((sysid & GRLIB_VERSION_MASK) >= | ||
285 | GRCAN_TXBUG_SAFE_GRLIB_VERSION)) | ||
286 | diff --git a/drivers/net/can/usb/gs_usb.c b/drivers/net/can/usb/gs_usb.c | ||
287 | index 76747d94c7602..bf4ab30186aff 100644 | ||
288 | --- a/drivers/net/can/usb/gs_usb.c | ||
289 | +++ b/drivers/net/can/usb/gs_usb.c | ||
290 | @@ -184,6 +184,8 @@ struct gs_can { | ||
291 | |||
292 | struct usb_anchor tx_submitted; | ||
293 | atomic_t active_tx_urbs; | ||
294 | + void *rxbuf[GS_MAX_RX_URBS]; | ||
295 | + dma_addr_t rxbuf_dma[GS_MAX_RX_URBS]; | ||
296 | }; | ||
297 | |||
298 | /* usb interface struct */ | ||
299 | @@ -592,6 +594,7 @@ static int gs_can_open(struct net_device *netdev) | ||
300 | for (i = 0; i < GS_MAX_RX_URBS; i++) { | ||
301 | struct urb *urb; | ||
302 | u8 *buf; | ||
303 | + dma_addr_t buf_dma; | ||
304 | |||
305 | /* alloc rx urb */ | ||
306 | urb = usb_alloc_urb(0, GFP_KERNEL); | ||
307 | @@ -602,7 +605,7 @@ static int gs_can_open(struct net_device *netdev) | ||
308 | buf = usb_alloc_coherent(dev->udev, | ||
309 | sizeof(struct gs_host_frame), | ||
310 | GFP_KERNEL, | ||
311 | - &urb->transfer_dma); | ||
312 | + &buf_dma); | ||
313 | if (!buf) { | ||
314 | netdev_err(netdev, | ||
315 | "No memory left for USB buffer\n"); | ||
316 | @@ -610,6 +613,8 @@ static int gs_can_open(struct net_device *netdev) | ||
317 | return -ENOMEM; | ||
318 | } | ||
319 | |||
320 | + urb->transfer_dma = buf_dma; | ||
321 | + | ||
322 | /* fill, anchor, and submit rx urb */ | ||
323 | usb_fill_bulk_urb(urb, | ||
324 | dev->udev, | ||
325 | @@ -633,10 +638,17 @@ static int gs_can_open(struct net_device *netdev) | ||
326 | rc); | ||
327 | |||
328 | usb_unanchor_urb(urb); | ||
329 | + usb_free_coherent(dev->udev, | ||
330 | + sizeof(struct gs_host_frame), | ||
331 | + buf, | ||
332 | + buf_dma); | ||
333 | usb_free_urb(urb); | ||
334 | break; | ||
335 | } | ||
336 | |||
337 | + dev->rxbuf[i] = buf; | ||
338 | + dev->rxbuf_dma[i] = buf_dma; | ||
339 | + | ||
340 | /* Drop reference, | ||
341 | * USB core will take care of freeing it | ||
342 | */ | ||
343 | @@ -701,13 +713,20 @@ static int gs_can_close(struct net_device *netdev) | ||
344 | int rc; | ||
345 | struct gs_can *dev = netdev_priv(netdev); | ||
346 | struct gs_usb *parent = dev->parent; | ||
347 | + unsigned int i; | ||
348 | |||
349 | netif_stop_queue(netdev); | ||
350 | |||
351 | /* Stop polling */ | ||
352 | parent->active_channels--; | ||
353 | - if (!parent->active_channels) | ||
354 | + if (!parent->active_channels) { | ||
355 | usb_kill_anchored_urbs(&parent->rx_submitted); | ||
356 | + for (i = 0; i < GS_MAX_RX_URBS; i++) | ||
357 | + usb_free_coherent(dev->udev, | ||
358 | + sizeof(struct gs_host_frame), | ||
359 | + dev->rxbuf[i], | ||
360 | + dev->rxbuf_dma[i]); | ||
361 | + } | ||
362 | |||
363 | /* Stop sending URBs */ | ||
364 | usb_kill_anchored_urbs(&dev->tx_submitted); | ||
365 | diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb.h b/drivers/net/can/usb/kvaser_usb/kvaser_usb.h | ||
366 | index 390b6bde883c8..61e67986b625e 100644 | ||
367 | --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb.h | ||
368 | +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb.h | ||
369 | @@ -35,9 +35,10 @@ | ||
370 | #define KVASER_USB_RX_BUFFER_SIZE 3072 | ||
371 | #define KVASER_USB_MAX_NET_DEVICES 5 | ||
372 | |||
373 | -/* USB devices features */ | ||
374 | -#define KVASER_USB_HAS_SILENT_MODE BIT(0) | ||
375 | -#define KVASER_USB_HAS_TXRX_ERRORS BIT(1) | ||
376 | +/* Kvaser USB device quirks */ | ||
377 | +#define KVASER_USB_QUIRK_HAS_SILENT_MODE BIT(0) | ||
378 | +#define KVASER_USB_QUIRK_HAS_TXRX_ERRORS BIT(1) | ||
379 | +#define KVASER_USB_QUIRK_IGNORE_CLK_FREQ BIT(2) | ||
380 | |||
381 | /* Device capabilities */ | ||
382 | #define KVASER_USB_CAP_BERR_CAP 0x01 | ||
383 | @@ -65,12 +66,7 @@ struct kvaser_usb_dev_card_data_hydra { | ||
384 | struct kvaser_usb_dev_card_data { | ||
385 | u32 ctrlmode_supported; | ||
386 | u32 capabilities; | ||
387 | - union { | ||
388 | - struct { | ||
389 | - enum kvaser_usb_leaf_family family; | ||
390 | - } leaf; | ||
391 | - struct kvaser_usb_dev_card_data_hydra hydra; | ||
392 | - }; | ||
393 | + struct kvaser_usb_dev_card_data_hydra hydra; | ||
394 | }; | ||
395 | |||
396 | /* Context for an outstanding, not yet ACKed, transmission */ | ||
397 | @@ -84,7 +80,7 @@ struct kvaser_usb { | ||
398 | struct usb_device *udev; | ||
399 | struct usb_interface *intf; | ||
400 | struct kvaser_usb_net_priv *nets[KVASER_USB_MAX_NET_DEVICES]; | ||
401 | - const struct kvaser_usb_dev_ops *ops; | ||
402 | + const struct kvaser_usb_driver_info *driver_info; | ||
403 | const struct kvaser_usb_dev_cfg *cfg; | ||
404 | |||
405 | struct usb_endpoint_descriptor *bulk_in, *bulk_out; | ||
406 | @@ -166,6 +162,12 @@ struct kvaser_usb_dev_ops { | ||
407 | int *cmd_len, u16 transid); | ||
408 | }; | ||
409 | |||
410 | +struct kvaser_usb_driver_info { | ||
411 | + u32 quirks; | ||
412 | + enum kvaser_usb_leaf_family family; | ||
413 | + const struct kvaser_usb_dev_ops *ops; | ||
414 | +}; | ||
415 | + | ||
416 | struct kvaser_usb_dev_cfg { | ||
417 | const struct can_clock clock; | ||
418 | const unsigned int timestamp_freq; | ||
419 | @@ -185,4 +187,7 @@ int kvaser_usb_send_cmd_async(struct kvaser_usb_net_priv *priv, void *cmd, | ||
420 | int len); | ||
421 | |||
422 | int kvaser_usb_can_rx_over_error(struct net_device *netdev); | ||
423 | + | ||
424 | +extern const struct can_bittiming_const kvaser_usb_flexc_bittiming_const; | ||
425 | + | ||
426 | #endif /* KVASER_USB_H */ | ||
427 | diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | ||
428 | index 0f1d3e807d631..416763fd1f11c 100644 | ||
429 | --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | ||
430 | +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_core.c | ||
431 | @@ -79,104 +79,134 @@ | ||
432 | #define USB_ATI_MEMO_PRO_2HS_V2_PRODUCT_ID 269 | ||
433 | #define USB_HYBRID_PRO_CANLIN_PRODUCT_ID 270 | ||
434 | |||
435 | -static inline bool kvaser_is_leaf(const struct usb_device_id *id) | ||
436 | -{ | ||
437 | - return (id->idProduct >= USB_LEAF_DEVEL_PRODUCT_ID && | ||
438 | - id->idProduct <= USB_CAN_R_PRODUCT_ID) || | ||
439 | - (id->idProduct >= USB_LEAF_LITE_V2_PRODUCT_ID && | ||
440 | - id->idProduct <= USB_MINI_PCIE_2HS_PRODUCT_ID); | ||
441 | -} | ||
442 | +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_hydra = { | ||
443 | + .quirks = 0, | ||
444 | + .ops = &kvaser_usb_hydra_dev_ops, | ||
445 | +}; | ||
446 | |||
447 | -static inline bool kvaser_is_usbcan(const struct usb_device_id *id) | ||
448 | -{ | ||
449 | - return id->idProduct >= USB_USBCAN_REVB_PRODUCT_ID && | ||
450 | - id->idProduct <= USB_MEMORATOR_PRODUCT_ID; | ||
451 | -} | ||
452 | +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_usbcan = { | ||
453 | + .quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS | | ||
454 | + KVASER_USB_QUIRK_HAS_SILENT_MODE, | ||
455 | + .family = KVASER_USBCAN, | ||
456 | + .ops = &kvaser_usb_leaf_dev_ops, | ||
457 | +}; | ||
458 | |||
459 | -static inline bool kvaser_is_hydra(const struct usb_device_id *id) | ||
460 | -{ | ||
461 | - return id->idProduct >= USB_BLACKBIRD_V2_PRODUCT_ID && | ||
462 | - id->idProduct <= USB_HYBRID_PRO_CANLIN_PRODUCT_ID; | ||
463 | -} | ||
464 | +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf = { | ||
465 | + .quirks = KVASER_USB_QUIRK_IGNORE_CLK_FREQ, | ||
466 | + .family = KVASER_LEAF, | ||
467 | + .ops = &kvaser_usb_leaf_dev_ops, | ||
468 | +}; | ||
469 | + | ||
470 | +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err = { | ||
471 | + .quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS | | ||
472 | + KVASER_USB_QUIRK_IGNORE_CLK_FREQ, | ||
473 | + .family = KVASER_LEAF, | ||
474 | + .ops = &kvaser_usb_leaf_dev_ops, | ||
475 | +}; | ||
476 | + | ||
477 | +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leaf_err_listen = { | ||
478 | + .quirks = KVASER_USB_QUIRK_HAS_TXRX_ERRORS | | ||
479 | + KVASER_USB_QUIRK_HAS_SILENT_MODE | | ||
480 | + KVASER_USB_QUIRK_IGNORE_CLK_FREQ, | ||
481 | + .family = KVASER_LEAF, | ||
482 | + .ops = &kvaser_usb_leaf_dev_ops, | ||
483 | +}; | ||
484 | + | ||
485 | +static const struct kvaser_usb_driver_info kvaser_usb_driver_info_leafimx = { | ||
486 | + .quirks = 0, | ||
487 | + .ops = &kvaser_usb_leaf_dev_ops, | ||
488 | +}; | ||
489 | |||
490 | static const struct usb_device_id kvaser_usb_table[] = { | ||
491 | - /* Leaf USB product IDs */ | ||
492 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID) }, | ||
493 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID) }, | ||
494 | + /* Leaf M32C USB product IDs */ | ||
495 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_DEVEL_PRODUCT_ID), | ||
496 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, | ||
497 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_PRODUCT_ID), | ||
498 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, | ||
499 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_PRODUCT_ID), | ||
500 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
501 | - KVASER_USB_HAS_SILENT_MODE }, | ||
502 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
503 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_PRODUCT_ID), | ||
504 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
505 | - KVASER_USB_HAS_SILENT_MODE }, | ||
506 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
507 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LS_PRODUCT_ID), | ||
508 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
509 | - KVASER_USB_HAS_SILENT_MODE }, | ||
510 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
511 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_SWC_PRODUCT_ID), | ||
512 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
513 | - KVASER_USB_HAS_SILENT_MODE }, | ||
514 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
515 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_LIN_PRODUCT_ID), | ||
516 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
517 | - KVASER_USB_HAS_SILENT_MODE }, | ||
518 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
519 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_LS_PRODUCT_ID), | ||
520 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
521 | - KVASER_USB_HAS_SILENT_MODE }, | ||
522 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
523 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_SPRO_SWC_PRODUCT_ID), | ||
524 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
525 | - KVASER_USB_HAS_SILENT_MODE }, | ||
526 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
527 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_DEVEL_PRODUCT_ID), | ||
528 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
529 | - KVASER_USB_HAS_SILENT_MODE }, | ||
530 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
531 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSHS_PRODUCT_ID), | ||
532 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
533 | - KVASER_USB_HAS_SILENT_MODE }, | ||
534 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
535 | { USB_DEVICE(KVASER_VENDOR_ID, USB_UPRO_HSHS_PRODUCT_ID), | ||
536 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
537 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID) }, | ||
538 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
539 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_GI_PRODUCT_ID), | ||
540 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf }, | ||
541 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_OBDII_PRODUCT_ID), | ||
542 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS | | ||
543 | - KVASER_USB_HAS_SILENT_MODE }, | ||
544 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err_listen }, | ||
545 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO2_HSLS_PRODUCT_ID), | ||
546 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
547 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
548 | { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_CH_PRODUCT_ID), | ||
549 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
550 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
551 | { USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_SPRO_PRODUCT_ID), | ||
552 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
553 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
554 | { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_MERCURY_PRODUCT_ID), | ||
555 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
556 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
557 | { USB_DEVICE(KVASER_VENDOR_ID, USB_OEM_LEAF_PRODUCT_ID), | ||
558 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
559 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
560 | { USB_DEVICE(KVASER_VENDOR_ID, USB_CAN_R_PRODUCT_ID), | ||
561 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
562 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID) }, | ||
563 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID) }, | ||
564 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID) }, | ||
565 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID) }, | ||
566 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID) }, | ||
567 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leaf_err }, | ||
568 | + | ||
569 | + /* Leaf i.MX28 USB product IDs */ | ||
570 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LITE_V2_PRODUCT_ID), | ||
571 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, | ||
572 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_HS_PRODUCT_ID), | ||
573 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, | ||
574 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_LIGHT_HS_V2_OEM_PRODUCT_ID), | ||
575 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, | ||
576 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_2HS_PRODUCT_ID), | ||
577 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, | ||
578 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_MINI_PCIE_2HS_PRODUCT_ID), | ||
579 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_leafimx }, | ||
580 | |||
581 | /* USBCANII USB product IDs */ | ||
582 | { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN2_PRODUCT_ID), | ||
583 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
584 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan }, | ||
585 | { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_REVB_PRODUCT_ID), | ||
586 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
587 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan }, | ||
588 | { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMORATOR_PRODUCT_ID), | ||
589 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
590 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan }, | ||
591 | { USB_DEVICE(KVASER_VENDOR_ID, USB_VCI2_PRODUCT_ID), | ||
592 | - .driver_info = KVASER_USB_HAS_TXRX_ERRORS }, | ||
593 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_usbcan }, | ||
594 | |||
595 | /* Minihydra USB product IDs */ | ||
596 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_V2_PRODUCT_ID) }, | ||
597 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_5HS_PRODUCT_ID) }, | ||
598 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_5HS_PRODUCT_ID) }, | ||
599 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_4HS_PRODUCT_ID) }, | ||
600 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_HS_V2_PRODUCT_ID) }, | ||
601 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_2HS_V2_PRODUCT_ID) }, | ||
602 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_2HS_PRODUCT_ID) }, | ||
603 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID) }, | ||
604 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_CANLIN_PRODUCT_ID) }, | ||
605 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_USBCAN_PRO_2HS_V2_PRODUCT_ID) }, | ||
606 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_MEMO_PRO_2HS_V2_PRODUCT_ID) }, | ||
607 | - { USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_CANLIN_PRODUCT_ID) }, | ||
608 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_BLACKBIRD_V2_PRODUCT_ID), | ||
609 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
610 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_5HS_PRODUCT_ID), | ||
611 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
612 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_5HS_PRODUCT_ID), | ||
613 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
614 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_LIGHT_4HS_PRODUCT_ID), | ||
615 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
616 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_LEAF_PRO_HS_V2_PRODUCT_ID), | ||
617 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
618 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_USBCAN_PRO_2HS_V2_PRODUCT_ID), | ||
619 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
620 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_2HS_PRODUCT_ID), | ||
621 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
622 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_MEMO_PRO_2HS_V2_PRODUCT_ID), | ||
623 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
624 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_CANLIN_PRODUCT_ID), | ||
625 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
626 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_USBCAN_PRO_2HS_V2_PRODUCT_ID), | ||
627 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
628 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_ATI_MEMO_PRO_2HS_V2_PRODUCT_ID), | ||
629 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
630 | + { USB_DEVICE(KVASER_VENDOR_ID, USB_HYBRID_PRO_CANLIN_PRODUCT_ID), | ||
631 | + .driver_info = (kernel_ulong_t)&kvaser_usb_driver_info_hydra }, | ||
632 | { } | ||
633 | }; | ||
634 | MODULE_DEVICE_TABLE(usb, kvaser_usb_table); | ||
635 | @@ -267,6 +297,7 @@ int kvaser_usb_can_rx_over_error(struct net_device *netdev) | ||
636 | static void kvaser_usb_read_bulk_callback(struct urb *urb) | ||
637 | { | ||
638 | struct kvaser_usb *dev = urb->context; | ||
639 | + const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops; | ||
640 | int err; | ||
641 | unsigned int i; | ||
642 | |||
643 | @@ -283,8 +314,8 @@ static void kvaser_usb_read_bulk_callback(struct urb *urb) | ||
644 | goto resubmit_urb; | ||
645 | } | ||
646 | |||
647 | - dev->ops->dev_read_bulk_callback(dev, urb->transfer_buffer, | ||
648 | - urb->actual_length); | ||
649 | + ops->dev_read_bulk_callback(dev, urb->transfer_buffer, | ||
650 | + urb->actual_length); | ||
651 | |||
652 | resubmit_urb: | ||
653 | usb_fill_bulk_urb(urb, dev->udev, | ||
654 | @@ -378,6 +409,7 @@ static int kvaser_usb_open(struct net_device *netdev) | ||
655 | { | ||
656 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
657 | struct kvaser_usb *dev = priv->dev; | ||
658 | + const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops; | ||
659 | int err; | ||
660 | |||
661 | err = open_candev(netdev); | ||
662 | @@ -388,11 +420,11 @@ static int kvaser_usb_open(struct net_device *netdev) | ||
663 | if (err) | ||
664 | goto error; | ||
665 | |||
666 | - err = dev->ops->dev_set_opt_mode(priv); | ||
667 | + err = ops->dev_set_opt_mode(priv); | ||
668 | if (err) | ||
669 | goto error; | ||
670 | |||
671 | - err = dev->ops->dev_start_chip(priv); | ||
672 | + err = ops->dev_start_chip(priv); | ||
673 | if (err) { | ||
674 | netdev_warn(netdev, "Cannot start device, error %d\n", err); | ||
675 | goto error; | ||
676 | @@ -449,22 +481,23 @@ static int kvaser_usb_close(struct net_device *netdev) | ||
677 | { | ||
678 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
679 | struct kvaser_usb *dev = priv->dev; | ||
680 | + const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops; | ||
681 | int err; | ||
682 | |||
683 | netif_stop_queue(netdev); | ||
684 | |||
685 | - err = dev->ops->dev_flush_queue(priv); | ||
686 | + err = ops->dev_flush_queue(priv); | ||
687 | if (err) | ||
688 | netdev_warn(netdev, "Cannot flush queue, error %d\n", err); | ||
689 | |||
690 | - if (dev->ops->dev_reset_chip) { | ||
691 | - err = dev->ops->dev_reset_chip(dev, priv->channel); | ||
692 | + if (ops->dev_reset_chip) { | ||
693 | + err = ops->dev_reset_chip(dev, priv->channel); | ||
694 | if (err) | ||
695 | netdev_warn(netdev, "Cannot reset card, error %d\n", | ||
696 | err); | ||
697 | } | ||
698 | |||
699 | - err = dev->ops->dev_stop_chip(priv); | ||
700 | + err = ops->dev_stop_chip(priv); | ||
701 | if (err) | ||
702 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | ||
703 | |||
704 | @@ -503,6 +536,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
705 | { | ||
706 | struct kvaser_usb_net_priv *priv = netdev_priv(netdev); | ||
707 | struct kvaser_usb *dev = priv->dev; | ||
708 | + const struct kvaser_usb_dev_ops *ops = dev->driver_info->ops; | ||
709 | struct net_device_stats *stats = &netdev->stats; | ||
710 | struct kvaser_usb_tx_urb_context *context = NULL; | ||
711 | struct urb *urb; | ||
712 | @@ -545,8 +579,8 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
713 | goto freeurb; | ||
714 | } | ||
715 | |||
716 | - buf = dev->ops->dev_frame_to_cmd(priv, skb, &context->dlc, &cmd_len, | ||
717 | - context->echo_index); | ||
718 | + buf = ops->dev_frame_to_cmd(priv, skb, &context->dlc, &cmd_len, | ||
719 | + context->echo_index); | ||
720 | if (!buf) { | ||
721 | stats->tx_dropped++; | ||
722 | dev_kfree_skb(skb); | ||
723 | @@ -630,15 +664,16 @@ static void kvaser_usb_remove_interfaces(struct kvaser_usb *dev) | ||
724 | } | ||
725 | } | ||
726 | |||
727 | -static int kvaser_usb_init_one(struct kvaser_usb *dev, | ||
728 | - const struct usb_device_id *id, int channel) | ||
729 | +static int kvaser_usb_init_one(struct kvaser_usb *dev, int channel) | ||
730 | { | ||
731 | struct net_device *netdev; | ||
732 | struct kvaser_usb_net_priv *priv; | ||
733 | + const struct kvaser_usb_driver_info *driver_info = dev->driver_info; | ||
734 | + const struct kvaser_usb_dev_ops *ops = driver_info->ops; | ||
735 | int err; | ||
736 | |||
737 | - if (dev->ops->dev_reset_chip) { | ||
738 | - err = dev->ops->dev_reset_chip(dev, channel); | ||
739 | + if (ops->dev_reset_chip) { | ||
740 | + err = ops->dev_reset_chip(dev, channel); | ||
741 | if (err) | ||
742 | return err; | ||
743 | } | ||
744 | @@ -667,20 +702,19 @@ static int kvaser_usb_init_one(struct kvaser_usb *dev, | ||
745 | priv->can.state = CAN_STATE_STOPPED; | ||
746 | priv->can.clock.freq = dev->cfg->clock.freq; | ||
747 | priv->can.bittiming_const = dev->cfg->bittiming_const; | ||
748 | - priv->can.do_set_bittiming = dev->ops->dev_set_bittiming; | ||
749 | - priv->can.do_set_mode = dev->ops->dev_set_mode; | ||
750 | - if ((id->driver_info & KVASER_USB_HAS_TXRX_ERRORS) || | ||
751 | + priv->can.do_set_bittiming = ops->dev_set_bittiming; | ||
752 | + priv->can.do_set_mode = ops->dev_set_mode; | ||
753 | + if ((driver_info->quirks & KVASER_USB_QUIRK_HAS_TXRX_ERRORS) || | ||
754 | (priv->dev->card_data.capabilities & KVASER_USB_CAP_BERR_CAP)) | ||
755 | - priv->can.do_get_berr_counter = dev->ops->dev_get_berr_counter; | ||
756 | - if (id->driver_info & KVASER_USB_HAS_SILENT_MODE) | ||
757 | + priv->can.do_get_berr_counter = ops->dev_get_berr_counter; | ||
758 | + if (driver_info->quirks & KVASER_USB_QUIRK_HAS_SILENT_MODE) | ||
759 | priv->can.ctrlmode_supported |= CAN_CTRLMODE_LISTENONLY; | ||
760 | |||
761 | priv->can.ctrlmode_supported |= dev->card_data.ctrlmode_supported; | ||
762 | |||
763 | if (priv->can.ctrlmode_supported & CAN_CTRLMODE_FD) { | ||
764 | priv->can.data_bittiming_const = dev->cfg->data_bittiming_const; | ||
765 | - priv->can.do_set_data_bittiming = | ||
766 | - dev->ops->dev_set_data_bittiming; | ||
767 | + priv->can.do_set_data_bittiming = ops->dev_set_data_bittiming; | ||
768 | } | ||
769 | |||
770 | netdev->flags |= IFF_ECHO; | ||
771 | @@ -711,29 +745,22 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
772 | struct kvaser_usb *dev; | ||
773 | int err; | ||
774 | int i; | ||
775 | + const struct kvaser_usb_driver_info *driver_info; | ||
776 | + const struct kvaser_usb_dev_ops *ops; | ||
777 | + | ||
778 | + driver_info = (const struct kvaser_usb_driver_info *)id->driver_info; | ||
779 | + if (!driver_info) | ||
780 | + return -ENODEV; | ||
781 | |||
782 | dev = devm_kzalloc(&intf->dev, sizeof(*dev), GFP_KERNEL); | ||
783 | if (!dev) | ||
784 | return -ENOMEM; | ||
785 | |||
786 | - if (kvaser_is_leaf(id)) { | ||
787 | - dev->card_data.leaf.family = KVASER_LEAF; | ||
788 | - dev->ops = &kvaser_usb_leaf_dev_ops; | ||
789 | - } else if (kvaser_is_usbcan(id)) { | ||
790 | - dev->card_data.leaf.family = KVASER_USBCAN; | ||
791 | - dev->ops = &kvaser_usb_leaf_dev_ops; | ||
792 | - } else if (kvaser_is_hydra(id)) { | ||
793 | - dev->ops = &kvaser_usb_hydra_dev_ops; | ||
794 | - } else { | ||
795 | - dev_err(&intf->dev, | ||
796 | - "Product ID (%d) is not a supported Kvaser USB device\n", | ||
797 | - id->idProduct); | ||
798 | - return -ENODEV; | ||
799 | - } | ||
800 | - | ||
801 | dev->intf = intf; | ||
802 | + dev->driver_info = driver_info; | ||
803 | + ops = driver_info->ops; | ||
804 | |||
805 | - err = dev->ops->dev_setup_endpoints(dev); | ||
806 | + err = ops->dev_setup_endpoints(dev); | ||
807 | if (err) { | ||
808 | dev_err(&intf->dev, "Cannot get usb endpoint(s)"); | ||
809 | return err; | ||
810 | @@ -747,22 +774,22 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
811 | |||
812 | dev->card_data.ctrlmode_supported = 0; | ||
813 | dev->card_data.capabilities = 0; | ||
814 | - err = dev->ops->dev_init_card(dev); | ||
815 | + err = ops->dev_init_card(dev); | ||
816 | if (err) { | ||
817 | dev_err(&intf->dev, | ||
818 | "Failed to initialize card, error %d\n", err); | ||
819 | return err; | ||
820 | } | ||
821 | |||
822 | - err = dev->ops->dev_get_software_info(dev); | ||
823 | + err = ops->dev_get_software_info(dev); | ||
824 | if (err) { | ||
825 | dev_err(&intf->dev, | ||
826 | "Cannot get software info, error %d\n", err); | ||
827 | return err; | ||
828 | } | ||
829 | |||
830 | - if (dev->ops->dev_get_software_details) { | ||
831 | - err = dev->ops->dev_get_software_details(dev); | ||
832 | + if (ops->dev_get_software_details) { | ||
833 | + err = ops->dev_get_software_details(dev); | ||
834 | if (err) { | ||
835 | dev_err(&intf->dev, | ||
836 | "Cannot get software details, error %d\n", err); | ||
837 | @@ -780,14 +807,14 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
838 | |||
839 | dev_dbg(&intf->dev, "Max outstanding tx = %d URBs\n", dev->max_tx_urbs); | ||
840 | |||
841 | - err = dev->ops->dev_get_card_info(dev); | ||
842 | + err = ops->dev_get_card_info(dev); | ||
843 | if (err) { | ||
844 | dev_err(&intf->dev, "Cannot get card info, error %d\n", err); | ||
845 | return err; | ||
846 | } | ||
847 | |||
848 | - if (dev->ops->dev_get_capabilities) { | ||
849 | - err = dev->ops->dev_get_capabilities(dev); | ||
850 | + if (ops->dev_get_capabilities) { | ||
851 | + err = ops->dev_get_capabilities(dev); | ||
852 | if (err) { | ||
853 | dev_err(&intf->dev, | ||
854 | "Cannot get capabilities, error %d\n", err); | ||
855 | @@ -797,7 +824,7 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
856 | } | ||
857 | |||
858 | for (i = 0; i < dev->nchannels; i++) { | ||
859 | - err = kvaser_usb_init_one(dev, id, i); | ||
860 | + err = kvaser_usb_init_one(dev, i); | ||
861 | if (err) { | ||
862 | kvaser_usb_remove_interfaces(dev); | ||
863 | return err; | ||
864 | diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | ||
865 | index 218fadc911558..a7c408acb0c09 100644 | ||
866 | --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | ||
867 | +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_hydra.c | ||
868 | @@ -371,7 +371,7 @@ static const struct can_bittiming_const kvaser_usb_hydra_kcan_bittiming_c = { | ||
869 | .brp_inc = 1, | ||
870 | }; | ||
871 | |||
872 | -static const struct can_bittiming_const kvaser_usb_hydra_flexc_bittiming_c = { | ||
873 | +const struct can_bittiming_const kvaser_usb_flexc_bittiming_const = { | ||
874 | .name = "kvaser_usb_flex", | ||
875 | .tseg1_min = 4, | ||
876 | .tseg1_max = 16, | ||
877 | @@ -2024,5 +2024,5 @@ static const struct kvaser_usb_dev_cfg kvaser_usb_hydra_dev_cfg_flexc = { | ||
878 | .freq = 24000000, | ||
879 | }, | ||
880 | .timestamp_freq = 1, | ||
881 | - .bittiming_const = &kvaser_usb_hydra_flexc_bittiming_c, | ||
882 | + .bittiming_const = &kvaser_usb_flexc_bittiming_const, | ||
883 | }; | ||
884 | diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | ||
885 | index 8b5d1add899a6..0e0403dd05500 100644 | ||
886 | --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | ||
887 | +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | ||
888 | @@ -100,16 +100,6 @@ | ||
889 | #define USBCAN_ERROR_STATE_RX_ERROR BIT(1) | ||
890 | #define USBCAN_ERROR_STATE_BUSERROR BIT(2) | ||
891 | |||
892 | -/* bittiming parameters */ | ||
893 | -#define KVASER_USB_TSEG1_MIN 1 | ||
894 | -#define KVASER_USB_TSEG1_MAX 16 | ||
895 | -#define KVASER_USB_TSEG2_MIN 1 | ||
896 | -#define KVASER_USB_TSEG2_MAX 8 | ||
897 | -#define KVASER_USB_SJW_MAX 4 | ||
898 | -#define KVASER_USB_BRP_MIN 1 | ||
899 | -#define KVASER_USB_BRP_MAX 64 | ||
900 | -#define KVASER_USB_BRP_INC 1 | ||
901 | - | ||
902 | /* ctrl modes */ | ||
903 | #define KVASER_CTRL_MODE_NORMAL 1 | ||
904 | #define KVASER_CTRL_MODE_SILENT 2 | ||
905 | @@ -342,48 +332,68 @@ struct kvaser_usb_err_summary { | ||
906 | }; | ||
907 | }; | ||
908 | |||
909 | -static const struct can_bittiming_const kvaser_usb_leaf_bittiming_const = { | ||
910 | - .name = "kvaser_usb", | ||
911 | - .tseg1_min = KVASER_USB_TSEG1_MIN, | ||
912 | - .tseg1_max = KVASER_USB_TSEG1_MAX, | ||
913 | - .tseg2_min = KVASER_USB_TSEG2_MIN, | ||
914 | - .tseg2_max = KVASER_USB_TSEG2_MAX, | ||
915 | - .sjw_max = KVASER_USB_SJW_MAX, | ||
916 | - .brp_min = KVASER_USB_BRP_MIN, | ||
917 | - .brp_max = KVASER_USB_BRP_MAX, | ||
918 | - .brp_inc = KVASER_USB_BRP_INC, | ||
919 | +static const struct can_bittiming_const kvaser_usb_leaf_m16c_bittiming_const = { | ||
920 | + .name = "kvaser_usb_ucii", | ||
921 | + .tseg1_min = 4, | ||
922 | + .tseg1_max = 16, | ||
923 | + .tseg2_min = 2, | ||
924 | + .tseg2_max = 8, | ||
925 | + .sjw_max = 4, | ||
926 | + .brp_min = 1, | ||
927 | + .brp_max = 16, | ||
928 | + .brp_inc = 1, | ||
929 | +}; | ||
930 | + | ||
931 | +static const struct can_bittiming_const kvaser_usb_leaf_m32c_bittiming_const = { | ||
932 | + .name = "kvaser_usb_leaf", | ||
933 | + .tseg1_min = 3, | ||
934 | + .tseg1_max = 16, | ||
935 | + .tseg2_min = 2, | ||
936 | + .tseg2_max = 8, | ||
937 | + .sjw_max = 4, | ||
938 | + .brp_min = 2, | ||
939 | + .brp_max = 128, | ||
940 | + .brp_inc = 2, | ||
941 | }; | ||
942 | |||
943 | -static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_8mhz = { | ||
944 | +static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_usbcan_dev_cfg = { | ||
945 | .clock = { | ||
946 | .freq = 8000000, | ||
947 | }, | ||
948 | .timestamp_freq = 1, | ||
949 | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, | ||
950 | + .bittiming_const = &kvaser_usb_leaf_m16c_bittiming_const, | ||
951 | +}; | ||
952 | + | ||
953 | +static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_m32c_dev_cfg = { | ||
954 | + .clock = { | ||
955 | + .freq = 16000000, | ||
956 | + }, | ||
957 | + .timestamp_freq = 1, | ||
958 | + .bittiming_const = &kvaser_usb_leaf_m32c_bittiming_const, | ||
959 | }; | ||
960 | |||
961 | -static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_16mhz = { | ||
962 | +static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_16mhz = { | ||
963 | .clock = { | ||
964 | .freq = 16000000, | ||
965 | }, | ||
966 | .timestamp_freq = 1, | ||
967 | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, | ||
968 | + .bittiming_const = &kvaser_usb_flexc_bittiming_const, | ||
969 | }; | ||
970 | |||
971 | -static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_24mhz = { | ||
972 | +static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_24mhz = { | ||
973 | .clock = { | ||
974 | .freq = 24000000, | ||
975 | }, | ||
976 | .timestamp_freq = 1, | ||
977 | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, | ||
978 | + .bittiming_const = &kvaser_usb_flexc_bittiming_const, | ||
979 | }; | ||
980 | |||
981 | -static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_dev_cfg_32mhz = { | ||
982 | +static const struct kvaser_usb_dev_cfg kvaser_usb_leaf_imx_dev_cfg_32mhz = { | ||
983 | .clock = { | ||
984 | .freq = 32000000, | ||
985 | }, | ||
986 | .timestamp_freq = 1, | ||
987 | - .bittiming_const = &kvaser_usb_leaf_bittiming_const, | ||
988 | + .bittiming_const = &kvaser_usb_flexc_bittiming_const, | ||
989 | }; | ||
990 | |||
991 | static void * | ||
992 | @@ -405,7 +415,7 @@ kvaser_usb_leaf_frame_to_cmd(const struct kvaser_usb_net_priv *priv, | ||
993 | sizeof(struct kvaser_cmd_tx_can); | ||
994 | cmd->u.tx_can.channel = priv->channel; | ||
995 | |||
996 | - switch (dev->card_data.leaf.family) { | ||
997 | + switch (dev->driver_info->family) { | ||
998 | case KVASER_LEAF: | ||
999 | cmd_tx_can_flags = &cmd->u.tx_can.leaf.flags; | ||
1000 | break; | ||
1001 | @@ -525,16 +535,23 @@ static void kvaser_usb_leaf_get_software_info_leaf(struct kvaser_usb *dev, | ||
1002 | dev->fw_version = le32_to_cpu(softinfo->fw_version); | ||
1003 | dev->max_tx_urbs = le16_to_cpu(softinfo->max_outstanding_tx); | ||
1004 | |||
1005 | - switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) { | ||
1006 | - case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK: | ||
1007 | - dev->cfg = &kvaser_usb_leaf_dev_cfg_16mhz; | ||
1008 | - break; | ||
1009 | - case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK: | ||
1010 | - dev->cfg = &kvaser_usb_leaf_dev_cfg_24mhz; | ||
1011 | - break; | ||
1012 | - case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK: | ||
1013 | - dev->cfg = &kvaser_usb_leaf_dev_cfg_32mhz; | ||
1014 | - break; | ||
1015 | + if (dev->driver_info->quirks & KVASER_USB_QUIRK_IGNORE_CLK_FREQ) { | ||
1016 | + /* Firmware expects bittiming parameters calculated for 16MHz | ||
1017 | + * clock, regardless of the actual clock | ||
1018 | + */ | ||
1019 | + dev->cfg = &kvaser_usb_leaf_m32c_dev_cfg; | ||
1020 | + } else { | ||
1021 | + switch (sw_options & KVASER_USB_LEAF_SWOPTION_FREQ_MASK) { | ||
1022 | + case KVASER_USB_LEAF_SWOPTION_FREQ_16_MHZ_CLK: | ||
1023 | + dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_16mhz; | ||
1024 | + break; | ||
1025 | + case KVASER_USB_LEAF_SWOPTION_FREQ_24_MHZ_CLK: | ||
1026 | + dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_24mhz; | ||
1027 | + break; | ||
1028 | + case KVASER_USB_LEAF_SWOPTION_FREQ_32_MHZ_CLK: | ||
1029 | + dev->cfg = &kvaser_usb_leaf_imx_dev_cfg_32mhz; | ||
1030 | + break; | ||
1031 | + } | ||
1032 | } | ||
1033 | } | ||
1034 | |||
1035 | @@ -551,7 +568,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev) | ||
1036 | if (err) | ||
1037 | return err; | ||
1038 | |||
1039 | - switch (dev->card_data.leaf.family) { | ||
1040 | + switch (dev->driver_info->family) { | ||
1041 | case KVASER_LEAF: | ||
1042 | kvaser_usb_leaf_get_software_info_leaf(dev, &cmd.u.leaf.softinfo); | ||
1043 | break; | ||
1044 | @@ -559,7 +576,7 @@ static int kvaser_usb_leaf_get_software_info_inner(struct kvaser_usb *dev) | ||
1045 | dev->fw_version = le32_to_cpu(cmd.u.usbcan.softinfo.fw_version); | ||
1046 | dev->max_tx_urbs = | ||
1047 | le16_to_cpu(cmd.u.usbcan.softinfo.max_outstanding_tx); | ||
1048 | - dev->cfg = &kvaser_usb_leaf_dev_cfg_8mhz; | ||
1049 | + dev->cfg = &kvaser_usb_leaf_usbcan_dev_cfg; | ||
1050 | break; | ||
1051 | } | ||
1052 | |||
1053 | @@ -598,7 +615,7 @@ static int kvaser_usb_leaf_get_card_info(struct kvaser_usb *dev) | ||
1054 | |||
1055 | dev->nchannels = cmd.u.cardinfo.nchannels; | ||
1056 | if (dev->nchannels > KVASER_USB_MAX_NET_DEVICES || | ||
1057 | - (dev->card_data.leaf.family == KVASER_USBCAN && | ||
1058 | + (dev->driver_info->family == KVASER_USBCAN && | ||
1059 | dev->nchannels > MAX_USBCAN_NET_DEVICES)) | ||
1060 | return -EINVAL; | ||
1061 | |||
1062 | @@ -734,7 +751,7 @@ kvaser_usb_leaf_rx_error_update_can_state(struct kvaser_usb_net_priv *priv, | ||
1063 | new_state < CAN_STATE_BUS_OFF) | ||
1064 | priv->can.can_stats.restarts++; | ||
1065 | |||
1066 | - switch (dev->card_data.leaf.family) { | ||
1067 | + switch (dev->driver_info->family) { | ||
1068 | case KVASER_LEAF: | ||
1069 | if (es->leaf.error_factor) { | ||
1070 | priv->can.can_stats.bus_error++; | ||
1071 | @@ -813,7 +830,7 @@ static void kvaser_usb_leaf_rx_error(const struct kvaser_usb *dev, | ||
1072 | } | ||
1073 | } | ||
1074 | |||
1075 | - switch (dev->card_data.leaf.family) { | ||
1076 | + switch (dev->driver_info->family) { | ||
1077 | case KVASER_LEAF: | ||
1078 | if (es->leaf.error_factor) { | ||
1079 | cf->can_id |= CAN_ERR_BUSERROR | CAN_ERR_PROT; | ||
1080 | @@ -1005,7 +1022,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev, | ||
1081 | stats = &priv->netdev->stats; | ||
1082 | |||
1083 | if ((cmd->u.rx_can_header.flag & MSG_FLAG_ERROR_FRAME) && | ||
1084 | - (dev->card_data.leaf.family == KVASER_LEAF && | ||
1085 | + (dev->driver_info->family == KVASER_LEAF && | ||
1086 | cmd->id == CMD_LEAF_LOG_MESSAGE)) { | ||
1087 | kvaser_usb_leaf_leaf_rx_error(dev, cmd); | ||
1088 | return; | ||
1089 | @@ -1021,7 +1038,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev, | ||
1090 | return; | ||
1091 | } | ||
1092 | |||
1093 | - switch (dev->card_data.leaf.family) { | ||
1094 | + switch (dev->driver_info->family) { | ||
1095 | case KVASER_LEAF: | ||
1096 | rx_data = cmd->u.leaf.rx_can.data; | ||
1097 | break; | ||
1098 | @@ -1036,7 +1053,7 @@ static void kvaser_usb_leaf_rx_can_msg(const struct kvaser_usb *dev, | ||
1099 | return; | ||
1100 | } | ||
1101 | |||
1102 | - if (dev->card_data.leaf.family == KVASER_LEAF && cmd->id == | ||
1103 | + if (dev->driver_info->family == KVASER_LEAF && cmd->id == | ||
1104 | CMD_LEAF_LOG_MESSAGE) { | ||
1105 | cf->can_id = le32_to_cpu(cmd->u.leaf.log_message.id); | ||
1106 | if (cf->can_id & KVASER_EXTENDED_FRAME) | ||
1107 | @@ -1133,14 +1150,14 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev, | ||
1108 | break; | ||
1109 | |||
1110 | case CMD_LEAF_LOG_MESSAGE: | ||
1111 | - if (dev->card_data.leaf.family != KVASER_LEAF) | ||
1112 | + if (dev->driver_info->family != KVASER_LEAF) | ||
1113 | goto warn; | ||
1114 | kvaser_usb_leaf_rx_can_msg(dev, cmd); | ||
1115 | break; | ||
1116 | |||
1117 | case CMD_CHIP_STATE_EVENT: | ||
1118 | case CMD_CAN_ERROR_EVENT: | ||
1119 | - if (dev->card_data.leaf.family == KVASER_LEAF) | ||
1120 | + if (dev->driver_info->family == KVASER_LEAF) | ||
1121 | kvaser_usb_leaf_leaf_rx_error(dev, cmd); | ||
1122 | else | ||
1123 | kvaser_usb_leaf_usbcan_rx_error(dev, cmd); | ||
1124 | @@ -1152,12 +1169,12 @@ static void kvaser_usb_leaf_handle_command(const struct kvaser_usb *dev, | ||
1125 | |||
1126 | /* Ignored commands */ | ||
1127 | case CMD_USBCAN_CLOCK_OVERFLOW_EVENT: | ||
1128 | - if (dev->card_data.leaf.family != KVASER_USBCAN) | ||
1129 | + if (dev->driver_info->family != KVASER_USBCAN) | ||
1130 | goto warn; | ||
1131 | break; | ||
1132 | |||
1133 | case CMD_FLUSH_QUEUE_REPLY: | ||
1134 | - if (dev->card_data.leaf.family != KVASER_LEAF) | ||
1135 | + if (dev->driver_info->family != KVASER_LEAF) | ||
1136 | goto warn; | ||
1137 | break; | ||
1138 | |||
1139 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c | ||
1140 | index 34bf6f4eef4ab..bc313d85fe13a 100644 | ||
1141 | --- a/drivers/net/ethernet/ibm/ibmvnic.c | ||
1142 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c | ||
1143 | @@ -5022,6 +5022,15 @@ static int ibmvnic_reset_init(struct ibmvnic_adapter *adapter) | ||
1144 | release_sub_crqs(adapter, 0); | ||
1145 | rc = init_sub_crqs(adapter); | ||
1146 | } else { | ||
1147 | + /* no need to reinitialize completely, but we do | ||
1148 | + * need to clean up transmits that were in flight | ||
1149 | + * when we processed the reset. Failure to do so | ||
1150 | + * will confound the upper layer, usually TCP, by | ||
1151 | + * creating the illusion of transmits that are | ||
1152 | + * awaiting completion. | ||
1153 | + */ | ||
1154 | + clean_tx_pools(adapter); | ||
1155 | + | ||
1156 | rc = reset_sub_crq_queues(adapter); | ||
1157 | } | ||
1158 | } else { | ||
1159 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c | ||
1160 | index 997936c3a30fd..6598a4cba158a 100644 | ||
1161 | --- a/drivers/net/usb/usbnet.c | ||
1162 | +++ b/drivers/net/usb/usbnet.c | ||
1163 | @@ -2120,7 +2120,7 @@ static void usbnet_async_cmd_cb(struct urb *urb) | ||
1164 | int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype, | ||
1165 | u16 value, u16 index, const void *data, u16 size) | ||
1166 | { | ||
1167 | - struct usb_ctrlrequest *req = NULL; | ||
1168 | + struct usb_ctrlrequest *req; | ||
1169 | struct urb *urb; | ||
1170 | int err = -ENOMEM; | ||
1171 | void *buf = NULL; | ||
1172 | @@ -2138,7 +2138,7 @@ int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype, | ||
1173 | if (!buf) { | ||
1174 | netdev_err(dev->net, "Error allocating buffer" | ||
1175 | " in %s!\n", __func__); | ||
1176 | - goto fail_free; | ||
1177 | + goto fail_free_urb; | ||
1178 | } | ||
1179 | } | ||
1180 | |||
1181 | @@ -2162,14 +2162,21 @@ int usbnet_write_cmd_async(struct usbnet *dev, u8 cmd, u8 reqtype, | ||
1182 | if (err < 0) { | ||
1183 | netdev_err(dev->net, "Error submitting the control" | ||
1184 | " message: status=%d\n", err); | ||
1185 | - goto fail_free; | ||
1186 | + goto fail_free_all; | ||
1187 | } | ||
1188 | return 0; | ||
1189 | |||
1190 | +fail_free_all: | ||
1191 | + kfree(req); | ||
1192 | fail_free_buf: | ||
1193 | kfree(buf); | ||
1194 | -fail_free: | ||
1195 | - kfree(req); | ||
1196 | + /* | ||
1197 | + * avoid a double free | ||
1198 | + * needed because the flag can be set only | ||
1199 | + * after filling the URB | ||
1200 | + */ | ||
1201 | + urb->transfer_flags = 0; | ||
1202 | +fail_free_urb: | ||
1203 | usb_free_urb(urb); | ||
1204 | fail: | ||
1205 | return err; | ||
1206 | diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c | ||
1207 | index 4ada80317a3bd..b5c1a8f363f32 100644 | ||
1208 | --- a/drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c | ||
1209 | +++ b/drivers/pinctrl/sunxi/pinctrl-sun8i-a83t.c | ||
1210 | @@ -158,26 +158,26 @@ static const struct sunxi_desc_pin sun8i_a83t_pins[] = { | ||
1211 | SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14), | ||
1212 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
1213 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
1214 | - SUNXI_FUNCTION(0x2, "nand"), /* DQ6 */ | ||
1215 | + SUNXI_FUNCTION(0x2, "nand0"), /* DQ6 */ | ||
1216 | SUNXI_FUNCTION(0x3, "mmc2")), /* D6 */ | ||
1217 | SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15), | ||
1218 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
1219 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
1220 | - SUNXI_FUNCTION(0x2, "nand"), /* DQ7 */ | ||
1221 | + SUNXI_FUNCTION(0x2, "nand0"), /* DQ7 */ | ||
1222 | SUNXI_FUNCTION(0x3, "mmc2")), /* D7 */ | ||
1223 | SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16), | ||
1224 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
1225 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
1226 | - SUNXI_FUNCTION(0x2, "nand"), /* DQS */ | ||
1227 | + SUNXI_FUNCTION(0x2, "nand0"), /* DQS */ | ||
1228 | SUNXI_FUNCTION(0x3, "mmc2")), /* RST */ | ||
1229 | SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 17), | ||
1230 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
1231 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
1232 | - SUNXI_FUNCTION(0x2, "nand")), /* CE2 */ | ||
1233 | + SUNXI_FUNCTION(0x2, "nand0")), /* CE2 */ | ||
1234 | SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 18), | ||
1235 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
1236 | SUNXI_FUNCTION(0x1, "gpio_out"), | ||
1237 | - SUNXI_FUNCTION(0x2, "nand")), /* CE3 */ | ||
1238 | + SUNXI_FUNCTION(0x2, "nand0")), /* CE3 */ | ||
1239 | /* Hole */ | ||
1240 | SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2), | ||
1241 | SUNXI_FUNCTION(0x0, "gpio_in"), | ||
1242 | diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c | ||
1243 | index 77783582080c7..c4052eab6bfcc 100644 | ||
1244 | --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c | ||
1245 | +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c | ||
1246 | @@ -536,6 +536,8 @@ static int sunxi_pconf_set(struct pinctrl_dev *pctldev, unsigned pin, | ||
1247 | struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); | ||
1248 | int i; | ||
1249 | |||
1250 | + pin -= pctl->desc->pin_base; | ||
1251 | + | ||
1252 | for (i = 0; i < num_configs; i++) { | ||
1253 | enum pin_config_param param; | ||
1254 | unsigned long flags; | ||
1255 | diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c | ||
1256 | index 1decded4845f7..8721b75131362 100644 | ||
1257 | --- a/drivers/video/fbdev/core/fbcon.c | ||
1258 | +++ b/drivers/video/fbdev/core/fbcon.c | ||
1259 | @@ -2490,6 +2490,11 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, | ||
1260 | if (charcount != 256 && charcount != 512) | ||
1261 | return -EINVAL; | ||
1262 | |||
1263 | + /* font bigger than screen resolution ? */ | ||
1264 | + if (w > FBCON_SWAP(info->var.rotate, info->var.xres, info->var.yres) || | ||
1265 | + h > FBCON_SWAP(info->var.rotate, info->var.yres, info->var.xres)) | ||
1266 | + return -EINVAL; | ||
1267 | + | ||
1268 | /* Make sure drawing engine can handle the font */ | ||
1269 | if (!(info->pixmap.blit_x & (1 << (font->width - 1))) || | ||
1270 | !(info->pixmap.blit_y & (1 << (font->height - 1)))) | ||
1271 | @@ -2756,6 +2761,34 @@ void fbcon_update_vcs(struct fb_info *info, bool all) | ||
1272 | } | ||
1273 | EXPORT_SYMBOL(fbcon_update_vcs); | ||
1274 | |||
1275 | +/* let fbcon check if it supports a new screen resolution */ | ||
1276 | +int fbcon_modechange_possible(struct fb_info *info, struct fb_var_screeninfo *var) | ||
1277 | +{ | ||
1278 | + struct fbcon_ops *ops = info->fbcon_par; | ||
1279 | + struct vc_data *vc; | ||
1280 | + unsigned int i; | ||
1281 | + | ||
1282 | + WARN_CONSOLE_UNLOCKED(); | ||
1283 | + | ||
1284 | + if (!ops) | ||
1285 | + return 0; | ||
1286 | + | ||
1287 | + /* prevent setting a screen size which is smaller than font size */ | ||
1288 | + for (i = first_fb_vc; i <= last_fb_vc; i++) { | ||
1289 | + vc = vc_cons[i].d; | ||
1290 | + if (!vc || vc->vc_mode != KD_TEXT || | ||
1291 | + registered_fb[con2fb_map[i]] != info) | ||
1292 | + continue; | ||
1293 | + | ||
1294 | + if (vc->vc_font.width > FBCON_SWAP(var->rotate, var->xres, var->yres) || | ||
1295 | + vc->vc_font.height > FBCON_SWAP(var->rotate, var->yres, var->xres)) | ||
1296 | + return -EINVAL; | ||
1297 | + } | ||
1298 | + | ||
1299 | + return 0; | ||
1300 | +} | ||
1301 | +EXPORT_SYMBOL_GPL(fbcon_modechange_possible); | ||
1302 | + | ||
1303 | int fbcon_mode_deleted(struct fb_info *info, | ||
1304 | struct fb_videomode *mode) | ||
1305 | { | ||
1306 | diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c | ||
1307 | index 03b1bf994cc90..23ce47655c931 100644 | ||
1308 | --- a/drivers/video/fbdev/core/fbmem.c | ||
1309 | +++ b/drivers/video/fbdev/core/fbmem.c | ||
1310 | @@ -512,7 +512,7 @@ static int fb_show_logo_line(struct fb_info *info, int rotate, | ||
1311 | |||
1312 | while (n && (n * (logo->width + 8) - 8 > xres)) | ||
1313 | --n; | ||
1314 | - image.dx = (xres - n * (logo->width + 8) - 8) / 2; | ||
1315 | + image.dx = (xres - (n * (logo->width + 8) - 8)) / 2; | ||
1316 | image.dy = y ?: (yres - logo->height) / 2; | ||
1317 | } else { | ||
1318 | image.dx = 0; | ||
1319 | @@ -1014,6 +1014,16 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) | ||
1320 | if (ret) | ||
1321 | return ret; | ||
1322 | |||
1323 | + /* verify that virtual resolution >= physical resolution */ | ||
1324 | + if (var->xres_virtual < var->xres || | ||
1325 | + var->yres_virtual < var->yres) { | ||
1326 | + pr_warn("WARNING: fbcon: Driver '%s' missed to adjust virtual screen size (%ux%u vs. %ux%u)\n", | ||
1327 | + info->fix.id, | ||
1328 | + var->xres_virtual, var->yres_virtual, | ||
1329 | + var->xres, var->yres); | ||
1330 | + return -EINVAL; | ||
1331 | + } | ||
1332 | + | ||
1333 | if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW) | ||
1334 | return 0; | ||
1335 | |||
1336 | @@ -1104,7 +1114,9 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, | ||
1337 | return -EFAULT; | ||
1338 | console_lock(); | ||
1339 | lock_fb_info(info); | ||
1340 | - ret = fb_set_var(info, &var); | ||
1341 | + ret = fbcon_modechange_possible(info, &var); | ||
1342 | + if (!ret) | ||
1343 | + ret = fb_set_var(info, &var); | ||
1344 | if (!ret) | ||
1345 | fbcon_update_vcs(info, var.activate & FB_ACTIVATE_ALL); | ||
1346 | unlock_fb_info(info); | ||
1347 | diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c | ||
1348 | index b339ff93df997..7a9048c4c2f95 100644 | ||
1349 | --- a/fs/xfs/xfs_inode.c | ||
1350 | +++ b/fs/xfs/xfs_inode.c | ||
1351 | @@ -3232,7 +3232,6 @@ xfs_rename( | ||
1352 | * appropriately. | ||
1353 | */ | ||
1354 | if (flags & RENAME_WHITEOUT) { | ||
1355 | - ASSERT(!(flags & (RENAME_NOREPLACE | RENAME_EXCHANGE))); | ||
1356 | error = xfs_rename_alloc_whiteout(target_dp, &wip); | ||
1357 | if (error) | ||
1358 | return error; | ||
1359 | diff --git a/include/linux/fbcon.h b/include/linux/fbcon.h | ||
1360 | index ff5596dd30f85..2382dec6d6ab8 100644 | ||
1361 | --- a/include/linux/fbcon.h | ||
1362 | +++ b/include/linux/fbcon.h | ||
1363 | @@ -15,6 +15,8 @@ void fbcon_new_modelist(struct fb_info *info); | ||
1364 | void fbcon_get_requirement(struct fb_info *info, | ||
1365 | struct fb_blit_caps *caps); | ||
1366 | void fbcon_fb_blanked(struct fb_info *info, int blank); | ||
1367 | +int fbcon_modechange_possible(struct fb_info *info, | ||
1368 | + struct fb_var_screeninfo *var); | ||
1369 | void fbcon_update_vcs(struct fb_info *info, bool all); | ||
1370 | void fbcon_remap_all(struct fb_info *info); | ||
1371 | int fbcon_set_con2fb_map_ioctl(void __user *argp); | ||
1372 | @@ -33,6 +35,8 @@ static inline void fbcon_new_modelist(struct fb_info *info) {} | ||
1373 | static inline void fbcon_get_requirement(struct fb_info *info, | ||
1374 | struct fb_blit_caps *caps) {} | ||
1375 | static inline void fbcon_fb_blanked(struct fb_info *info, int blank) {} | ||
1376 | +static inline int fbcon_modechange_possible(struct fb_info *info, | ||
1377 | + struct fb_var_screeninfo *var) { return 0; } | ||
1378 | static inline void fbcon_update_vcs(struct fb_info *info, bool all) {} | ||
1379 | static inline void fbcon_remap_all(struct fb_info *info) {} | ||
1380 | static inline int fbcon_set_con2fb_map_ioctl(void __user *argp) { return 0; } | ||
1381 | diff --git a/include/linux/rtsx_usb.h b/include/linux/rtsx_usb.h | ||
1382 | index 159729cffd8e1..3247ed8e9ff0f 100644 | ||
1383 | --- a/include/linux/rtsx_usb.h | ||
1384 | +++ b/include/linux/rtsx_usb.h | ||
1385 | @@ -54,8 +54,6 @@ struct rtsx_ucr { | ||
1386 | struct usb_device *pusb_dev; | ||
1387 | struct usb_interface *pusb_intf; | ||
1388 | struct usb_sg_request current_sg; | ||
1389 | - unsigned char *iobuf; | ||
1390 | - dma_addr_t iobuf_dma; | ||
1391 | |||
1392 | struct timer_list sg_timer; | ||
1393 | struct mutex dev_mutex; | ||
1394 | diff --git a/include/net/esp.h b/include/net/esp.h | ||
1395 | index 465e38890ee98..117652eb6ea32 100644 | ||
1396 | --- a/include/net/esp.h | ||
1397 | +++ b/include/net/esp.h | ||
1398 | @@ -4,8 +4,6 @@ | ||
1399 | |||
1400 | #include <linux/skbuff.h> | ||
1401 | |||
1402 | -#define ESP_SKB_FRAG_MAXSIZE (PAGE_SIZE << SKB_FRAG_PAGE_ORDER) | ||
1403 | - | ||
1404 | struct ip_esp_hdr; | ||
1405 | |||
1406 | static inline struct ip_esp_hdr *ip_esp_hdr(const struct sk_buff *skb) | ||
1407 | diff --git a/include/video/of_display_timing.h b/include/video/of_display_timing.h | ||
1408 | index e1126a74882a5..eff166fdd81b9 100644 | ||
1409 | --- a/include/video/of_display_timing.h | ||
1410 | +++ b/include/video/of_display_timing.h | ||
1411 | @@ -8,6 +8,8 @@ | ||
1412 | #ifndef __LINUX_OF_DISPLAY_TIMING_H | ||
1413 | #define __LINUX_OF_DISPLAY_TIMING_H | ||
1414 | |||
1415 | +#include <linux/errno.h> | ||
1416 | + | ||
1417 | struct device_node; | ||
1418 | struct display_timing; | ||
1419 | struct display_timings; | ||
1420 | diff --git a/lib/idr.c b/lib/idr.c | ||
1421 | index 4d2eef0259d2c..b2bc190431ddf 100644 | ||
1422 | --- a/lib/idr.c | ||
1423 | +++ b/lib/idr.c | ||
1424 | @@ -489,7 +489,8 @@ void ida_free(struct ida *ida, unsigned int id) | ||
1425 | struct ida_bitmap *bitmap; | ||
1426 | unsigned long flags; | ||
1427 | |||
1428 | - BUG_ON((int)id < 0); | ||
1429 | + if ((int)id < 0) | ||
1430 | + return; | ||
1431 | |||
1432 | xas_lock_irqsave(&xas, flags); | ||
1433 | bitmap = xas_load(&xas); | ||
1434 | diff --git a/mm/slub.c b/mm/slub.c | ||
1435 | index 63fe43c8d3323..5211496f6d24f 100644 | ||
1436 | --- a/mm/slub.c | ||
1437 | +++ b/mm/slub.c | ||
1438 | @@ -2214,6 +2214,7 @@ redo: | ||
1439 | |||
1440 | c->page = NULL; | ||
1441 | c->freelist = NULL; | ||
1442 | + c->tid = next_tid(c->tid); | ||
1443 | } | ||
1444 | |||
1445 | /* | ||
1446 | @@ -2347,8 +2348,6 @@ static inline void flush_slab(struct kmem_cache *s, struct kmem_cache_cpu *c) | ||
1447 | { | ||
1448 | stat(s, CPUSLAB_FLUSH); | ||
1449 | deactivate_slab(s, c->page, c->freelist, c); | ||
1450 | - | ||
1451 | - c->tid = next_tid(c->tid); | ||
1452 | } | ||
1453 | |||
1454 | /* | ||
1455 | @@ -2632,6 +2631,7 @@ redo: | ||
1456 | |||
1457 | if (!freelist) { | ||
1458 | c->page = NULL; | ||
1459 | + c->tid = next_tid(c->tid); | ||
1460 | stat(s, DEACTIVATE_BYPASS); | ||
1461 | goto new_slab; | ||
1462 | } | ||
1463 | diff --git a/net/can/bcm.c b/net/can/bcm.c | ||
1464 | index 1e17778d5ceeb..63d81147fb4e3 100644 | ||
1465 | --- a/net/can/bcm.c | ||
1466 | +++ b/net/can/bcm.c | ||
1467 | @@ -102,6 +102,7 @@ static inline u64 get_u64(const struct canfd_frame *cp, int offset) | ||
1468 | |||
1469 | struct bcm_op { | ||
1470 | struct list_head list; | ||
1471 | + struct rcu_head rcu; | ||
1472 | int ifindex; | ||
1473 | canid_t can_id; | ||
1474 | u32 flags; | ||
1475 | @@ -720,10 +721,9 @@ static struct bcm_op *bcm_find_op(struct list_head *ops, | ||
1476 | return NULL; | ||
1477 | } | ||
1478 | |||
1479 | -static void bcm_remove_op(struct bcm_op *op) | ||
1480 | +static void bcm_free_op_rcu(struct rcu_head *rcu_head) | ||
1481 | { | ||
1482 | - hrtimer_cancel(&op->timer); | ||
1483 | - hrtimer_cancel(&op->thrtimer); | ||
1484 | + struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu); | ||
1485 | |||
1486 | if ((op->frames) && (op->frames != &op->sframe)) | ||
1487 | kfree(op->frames); | ||
1488 | @@ -734,6 +734,14 @@ static void bcm_remove_op(struct bcm_op *op) | ||
1489 | kfree(op); | ||
1490 | } | ||
1491 | |||
1492 | +static void bcm_remove_op(struct bcm_op *op) | ||
1493 | +{ | ||
1494 | + hrtimer_cancel(&op->timer); | ||
1495 | + hrtimer_cancel(&op->thrtimer); | ||
1496 | + | ||
1497 | + call_rcu(&op->rcu, bcm_free_op_rcu); | ||
1498 | +} | ||
1499 | + | ||
1500 | static void bcm_rx_unreg(struct net_device *dev, struct bcm_op *op) | ||
1501 | { | ||
1502 | if (op->rx_reg_dev == dev) { | ||
1503 | @@ -759,6 +767,9 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh, | ||
1504 | if ((op->can_id == mh->can_id) && (op->ifindex == ifindex) && | ||
1505 | (op->flags & CAN_FD_FRAME) == (mh->flags & CAN_FD_FRAME)) { | ||
1506 | |||
1507 | + /* disable automatic timer on frame reception */ | ||
1508 | + op->flags |= RX_NO_AUTOTIMER; | ||
1509 | + | ||
1510 | /* | ||
1511 | * Don't care if we're bound or not (due to netdev | ||
1512 | * problems) can_rx_unregister() is always a save | ||
1513 | @@ -787,7 +798,6 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh, | ||
1514 | bcm_rx_handler, op); | ||
1515 | |||
1516 | list_del(&op->list); | ||
1517 | - synchronize_rcu(); | ||
1518 | bcm_remove_op(op); | ||
1519 | return 1; /* done */ | ||
1520 | } | ||
1521 | diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c | ||
1522 | index ef20f550d2f81..f555dd4bac653 100644 | ||
1523 | --- a/net/ipv4/esp4.c | ||
1524 | +++ b/net/ipv4/esp4.c | ||
1525 | @@ -277,7 +277,6 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * | ||
1526 | struct page *page; | ||
1527 | struct sk_buff *trailer; | ||
1528 | int tailen = esp->tailen; | ||
1529 | - unsigned int allocsz; | ||
1530 | |||
1531 | /* this is non-NULL only with UDP Encapsulation */ | ||
1532 | if (x->encap) { | ||
1533 | @@ -287,8 +286,8 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info * | ||
1534 | return err; | ||
1535 | } | ||
1536 | |||
1537 | - allocsz = ALIGN(skb->data_len + tailen, L1_CACHE_BYTES); | ||
1538 | - if (allocsz > ESP_SKB_FRAG_MAXSIZE) | ||
1539 | + if (ALIGN(tailen, L1_CACHE_BYTES) > PAGE_SIZE || | ||
1540 | + ALIGN(skb->data_len, L1_CACHE_BYTES) > PAGE_SIZE) | ||
1541 | goto cow; | ||
1542 | |||
1543 | if (!skb_cloned(skb)) { | ||
1544 | diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c | ||
1545 | index 79f117e33b80e..b64791d3b0f81 100644 | ||
1546 | --- a/net/ipv6/esp6.c | ||
1547 | +++ b/net/ipv6/esp6.c | ||
1548 | @@ -230,10 +230,9 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info | ||
1549 | struct page *page; | ||
1550 | struct sk_buff *trailer; | ||
1551 | int tailen = esp->tailen; | ||
1552 | - unsigned int allocsz; | ||
1553 | |||
1554 | - allocsz = ALIGN(skb->data_len + tailen, L1_CACHE_BYTES); | ||
1555 | - if (allocsz > ESP_SKB_FRAG_MAXSIZE) | ||
1556 | + if (ALIGN(tailen, L1_CACHE_BYTES) > PAGE_SIZE || | ||
1557 | + ALIGN(skb->data_len, L1_CACHE_BYTES) > PAGE_SIZE) | ||
1558 | goto cow; | ||
1559 | |||
1560 | if (!skb_cloned(skb)) { | ||
1561 | diff --git a/net/rose/rose_route.c b/net/rose/rose_route.c | ||
1562 | index c533076232361..5f32113c9bbda 100644 | ||
1563 | --- a/net/rose/rose_route.c | ||
1564 | +++ b/net/rose/rose_route.c | ||
1565 | @@ -227,8 +227,8 @@ static void rose_remove_neigh(struct rose_neigh *rose_neigh) | ||
1566 | { | ||
1567 | struct rose_neigh *s; | ||
1568 | |||
1569 | - rose_stop_ftimer(rose_neigh); | ||
1570 | - rose_stop_t0timer(rose_neigh); | ||
1571 | + del_timer_sync(&rose_neigh->ftimer); | ||
1572 | + del_timer_sync(&rose_neigh->t0timer); | ||
1573 | |||
1574 | skb_queue_purge(&rose_neigh->queue); | ||
1575 | |||
1576 | diff --git a/tools/testing/selftests/net/forwarding/lib.sh b/tools/testing/selftests/net/forwarding/lib.sh | ||
1577 | index 85c587a03c8a5..f190ad58e00d4 100644 | ||
1578 | --- a/tools/testing/selftests/net/forwarding/lib.sh | ||
1579 | +++ b/tools/testing/selftests/net/forwarding/lib.sh | ||
1580 | @@ -894,6 +894,7 @@ learning_test() | ||
1581 | # FDB entry was installed. | ||
1582 | bridge link set dev $br_port1 flood off | ||
1583 | |||
1584 | + ip link set $host1_if promisc on | ||
1585 | tc qdisc add dev $host1_if ingress | ||
1586 | tc filter add dev $host1_if ingress protocol ip pref 1 handle 101 \ | ||
1587 | flower dst_mac $mac action drop | ||
1588 | @@ -904,7 +905,7 @@ learning_test() | ||
1589 | tc -j -s filter show dev $host1_if ingress \ | ||
1590 | | jq -e ".[] | select(.options.handle == 101) \ | ||
1591 | | select(.options.actions[0].stats.packets == 1)" &> /dev/null | ||
1592 | - check_fail $? "Packet reached second host when should not" | ||
1593 | + check_fail $? "Packet reached first host when should not" | ||
1594 | |||
1595 | $MZ $host1_if -c 1 -p 64 -a $mac -t ip -q | ||
1596 | sleep 1 | ||
1597 | @@ -943,6 +944,7 @@ learning_test() | ||
1598 | |||
1599 | tc filter del dev $host1_if ingress protocol ip pref 1 handle 101 flower | ||
1600 | tc qdisc del dev $host1_if ingress | ||
1601 | + ip link set $host1_if promisc off | ||
1602 | |||
1603 | bridge link set dev $br_port1 flood on | ||
1604 | |||
1605 | @@ -960,6 +962,7 @@ flood_test_do() | ||
1606 | |||
1607 | # Add an ACL on `host2_if` which will tell us whether the packet | ||
1608 | # was flooded to it or not. | ||
1609 | + ip link set $host2_if promisc on | ||
1610 | tc qdisc add dev $host2_if ingress | ||
1611 | tc filter add dev $host2_if ingress protocol ip pref 1 handle 101 \ | ||
1612 | flower dst_mac $mac action drop | ||
1613 | @@ -977,6 +980,7 @@ flood_test_do() | ||
1614 | |||
1615 | tc filter del dev $host2_if ingress protocol ip pref 1 handle 101 flower | ||
1616 | tc qdisc del dev $host2_if ingress | ||
1617 | + ip link set $host2_if promisc off | ||
1618 | |||
1619 | return $err | ||
1620 | } |