Commit 42f02130 authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-fixes-for-4.17-20180508' of...

Merge tag 'linux-can-fixes-for-4.17-20180508' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can

Marc Kleine-Budde says:

====================
pull-request: can 2018-05-08

this is a pull request for 7 patches for net/master.

The first patch is by Jakob Unterwurzacher and increases the severity of
bus-off messages in the generic CAN device infrastructure. The next two patches
are by Uwe Kleine-König and fix the endianess detection in the flexcan driver.
Jimmy Assarsson's patch for the kvaser driver corrects the stats counter for
dropped tx-messages. Geert Uytterhoeven provides one patch and Sergei Shtylyov
two patches for the rcan_canfd device tree binding description.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2dabf9f2 7a25ac2f
...@@ -5,7 +5,9 @@ Required properties: ...@@ -5,7 +5,9 @@ Required properties:
- compatible: Must contain one or more of the following: - compatible: Must contain one or more of the following:
- "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller. - "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller.
- "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller. - "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller.
- "renesas,r8a7796-canfd" for R8A7796 (R-Car M3) compatible controller. - "renesas,r8a7796-canfd" for R8A7796 (R-Car M3-W) compatible controller.
- "renesas,r8a77970-canfd" for R8A77970 (R-Car V3M) compatible controller.
- "renesas,r8a77980-canfd" for R8A77980 (R-Car V3H) compatible controller.
When compatible with the generic version, nodes must list the When compatible with the generic version, nodes must list the
SoC-specific version corresponding to the platform first, followed by the SoC-specific version corresponding to the platform first, followed by the
......
...@@ -303,7 +303,7 @@ wdog: wdog@53fdc000 { ...@@ -303,7 +303,7 @@ wdog: wdog@53fdc000 {
}; };
can1: can@53fe4000 { can1: can@53fe4000 {
compatible = "fsl,imx35-flexcan"; compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
reg = <0x53fe4000 0x1000>; reg = <0x53fe4000 0x1000>;
clocks = <&clks 33>, <&clks 33>; clocks = <&clks 33>, <&clks 33>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
...@@ -312,7 +312,7 @@ can1: can@53fe4000 { ...@@ -312,7 +312,7 @@ can1: can@53fe4000 {
}; };
can2: can@53fe8000 { can2: can@53fe8000 {
compatible = "fsl,imx35-flexcan"; compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
reg = <0x53fe8000 0x1000>; reg = <0x53fe8000 0x1000>;
clocks = <&clks 34>, <&clks 34>; clocks = <&clks 34>, <&clks 34>;
clock-names = "ipg", "per"; clock-names = "ipg", "per";
......
...@@ -551,7 +551,7 @@ uart2: serial@53fc0000 { ...@@ -551,7 +551,7 @@ uart2: serial@53fc0000 {
}; };
can1: can@53fc8000 { can1: can@53fc8000 {
compatible = "fsl,imx53-flexcan"; compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
reg = <0x53fc8000 0x4000>; reg = <0x53fc8000 0x4000>;
interrupts = <82>; interrupts = <82>;
clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>, clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>,
...@@ -561,7 +561,7 @@ can1: can@53fc8000 { ...@@ -561,7 +561,7 @@ can1: can@53fc8000 {
}; };
can2: can@53fcc000 { can2: can@53fcc000 {
compatible = "fsl,imx53-flexcan"; compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
reg = <0x53fcc000 0x4000>; reg = <0x53fcc000 0x4000>;
interrupts = <83>; interrupts = <83>;
clocks = <&clks IMX5_CLK_CAN2_IPG_GATE>, clocks = <&clks IMX5_CLK_CAN2_IPG_GATE>,
......
...@@ -605,7 +605,7 @@ void can_bus_off(struct net_device *dev) ...@@ -605,7 +605,7 @@ void can_bus_off(struct net_device *dev)
{ {
struct can_priv *priv = netdev_priv(dev); struct can_priv *priv = netdev_priv(dev);
netdev_dbg(dev, "bus-off\n"); netdev_info(dev, "bus-off\n");
netif_carrier_off(dev); netif_carrier_off(dev);
......
...@@ -200,6 +200,7 @@ ...@@ -200,6 +200,7 @@
#define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disable Memory error detection */ #define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disable Memory error detection */
#define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */ #define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */
#define FLEXCAN_QUIRK_BROKEN_PERR_STATE BIT(6) /* No interrupt for error passive */ #define FLEXCAN_QUIRK_BROKEN_PERR_STATE BIT(6) /* No interrupt for error passive */
#define FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN BIT(7) /* default to BE register access */
/* Structure of the message buffer */ /* Structure of the message buffer */
struct flexcan_mb { struct flexcan_mb {
...@@ -287,6 +288,12 @@ struct flexcan_priv { ...@@ -287,6 +288,12 @@ struct flexcan_priv {
}; };
static const struct flexcan_devtype_data fsl_p1010_devtype_data = { static const struct flexcan_devtype_data fsl_p1010_devtype_data = {
.quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE |
FLEXCAN_QUIRK_BROKEN_PERR_STATE |
FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN,
};
static const struct flexcan_devtype_data fsl_imx25_devtype_data = {
.quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE | .quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE |
FLEXCAN_QUIRK_BROKEN_PERR_STATE, FLEXCAN_QUIRK_BROKEN_PERR_STATE,
}; };
...@@ -1251,9 +1258,9 @@ static void unregister_flexcandev(struct net_device *dev) ...@@ -1251,9 +1258,9 @@ static void unregister_flexcandev(struct net_device *dev)
static const struct of_device_id flexcan_of_match[] = { static const struct of_device_id flexcan_of_match[] = {
{ .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, }, { .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, },
{ .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, },
{ .compatible = "fsl,imx53-flexcan", .data = &fsl_p1010_devtype_data, }, { .compatible = "fsl,imx53-flexcan", .data = &fsl_imx25_devtype_data, },
{ .compatible = "fsl,imx35-flexcan", .data = &fsl_p1010_devtype_data, }, { .compatible = "fsl,imx35-flexcan", .data = &fsl_imx25_devtype_data, },
{ .compatible = "fsl,imx25-flexcan", .data = &fsl_p1010_devtype_data, }, { .compatible = "fsl,imx25-flexcan", .data = &fsl_imx25_devtype_data, },
{ .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, },
{ .compatible = "fsl,vf610-flexcan", .data = &fsl_vf610_devtype_data, }, { .compatible = "fsl,vf610-flexcan", .data = &fsl_vf610_devtype_data, },
{ .compatible = "fsl,ls1021ar2-flexcan", .data = &fsl_ls1021a_r2_devtype_data, }, { .compatible = "fsl,ls1021ar2-flexcan", .data = &fsl_ls1021a_r2_devtype_data, },
...@@ -1337,18 +1344,13 @@ static int flexcan_probe(struct platform_device *pdev) ...@@ -1337,18 +1344,13 @@ static int flexcan_probe(struct platform_device *pdev)
priv = netdev_priv(dev); priv = netdev_priv(dev);
if (of_property_read_bool(pdev->dev.of_node, "big-endian")) { if (of_property_read_bool(pdev->dev.of_node, "big-endian") ||
devtype_data->quirks & FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN) {
priv->read = flexcan_read_be; priv->read = flexcan_read_be;
priv->write = flexcan_write_be; priv->write = flexcan_write_be;
} else { } else {
if (of_device_is_compatible(pdev->dev.of_node, priv->read = flexcan_read_le;
"fsl,p1010-flexcan")) { priv->write = flexcan_write_le;
priv->read = flexcan_read_be;
priv->write = flexcan_write_be;
} else {
priv->read = flexcan_read_le;
priv->write = flexcan_write_le;
}
} }
priv->can.clock.freq = clock_freq; priv->can.clock.freq = clock_freq;
......
...@@ -1179,7 +1179,7 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, ...@@ -1179,7 +1179,7 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev,
skb = alloc_can_skb(priv->netdev, &cf); skb = alloc_can_skb(priv->netdev, &cf);
if (!skb) { if (!skb) {
stats->tx_dropped++; stats->rx_dropped++;
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment