Magellan Linux

Annotation of /trunk/kernel-alx/patches-5.4/0304-5.4.205-all-fixes.patch

Parent Directory Parent Directory | Revision Log 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)
-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     }