diff options
author | David S. Miller <davem@davemloft.net> | 2015-01-15 19:38:49 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-15 19:38:49 -0500 |
commit | 4315ef8d8b2e90e093a52ad31074dd0dafbed654 (patch) | |
tree | 8fc990fc8e589cf5a393fac500a98dd662dbd265 | |
parent | 5eff6dadb9f466d15692cc5dd45e1015bf0ec987 (diff) | |
parent | a58518ccf39f86f898a65201518dd8e799b3abeb (diff) |
Merge tag 'linux-can-fixes-for-3.19-20150115' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can
Marc Kleine-Budde says:
====================
pull-request: can 2015-01-15
this is a pull request of 8 patches.
Ahmed S. Darwish contributes 4 fixes for the kvaser_usb driver. The two patches
by Oliver Hartkopp mark the m_can driver as non-ISO, as the CANFD standard was
updated. Roger Quadros's patch for the c_can driver fixes the register access
during RAMINIT. And one patch by my, which updates the MAINTAINERS file, as we
moved the git repos to the kernel.org infrastructure.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | MAINTAINERS | 6 | ||||
-rw-r--r-- | drivers/net/can/c_can/c_can_platform.c | 29 | ||||
-rw-r--r-- | drivers/net/can/dev.c | 8 | ||||
-rw-r--r-- | drivers/net/can/m_can/m_can.c | 5 | ||||
-rw-r--r-- | drivers/net/can/usb/kvaser_usb.c | 31 | ||||
-rw-r--r-- | include/uapi/linux/can/netlink.h | 1 |
6 files changed, 49 insertions, 31 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 600d2aad8276..efa5f8d4086d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2346,7 +2346,8 @@ CAN NETWORK LAYER | |||
2346 | M: Oliver Hartkopp <socketcan@hartkopp.net> | 2346 | M: Oliver Hartkopp <socketcan@hartkopp.net> |
2347 | L: linux-can@vger.kernel.org | 2347 | L: linux-can@vger.kernel.org |
2348 | W: http://gitorious.org/linux-can | 2348 | W: http://gitorious.org/linux-can |
2349 | T: git git://gitorious.org/linux-can/linux-can-next.git | 2349 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git |
2350 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git | ||
2350 | S: Maintained | 2351 | S: Maintained |
2351 | F: Documentation/networking/can.txt | 2352 | F: Documentation/networking/can.txt |
2352 | F: net/can/ | 2353 | F: net/can/ |
@@ -2361,7 +2362,8 @@ M: Wolfgang Grandegger <wg@grandegger.com> | |||
2361 | M: Marc Kleine-Budde <mkl@pengutronix.de> | 2362 | M: Marc Kleine-Budde <mkl@pengutronix.de> |
2362 | L: linux-can@vger.kernel.org | 2363 | L: linux-can@vger.kernel.org |
2363 | W: http://gitorious.org/linux-can | 2364 | W: http://gitorious.org/linux-can |
2364 | T: git git://gitorious.org/linux-can/linux-can-next.git | 2365 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git |
2366 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git | ||
2365 | S: Maintained | 2367 | S: Maintained |
2366 | F: drivers/net/can/ | 2368 | F: drivers/net/can/ |
2367 | F: include/linux/can/dev.h | 2369 | F: include/linux/can/dev.h |
diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c index f363972cd77d..e36d10520e24 100644 --- a/drivers/net/can/c_can/c_can_platform.c +++ b/drivers/net/can/c_can/c_can_platform.c | |||
@@ -103,27 +103,34 @@ static void c_can_hw_raminit_syscon(const struct c_can_priv *priv, bool enable) | |||
103 | mask = 1 << raminit->bits.start | 1 << raminit->bits.done; | 103 | mask = 1 << raminit->bits.start | 1 << raminit->bits.done; |
104 | regmap_read(raminit->syscon, raminit->reg, &ctrl); | 104 | regmap_read(raminit->syscon, raminit->reg, &ctrl); |
105 | 105 | ||
106 | /* We clear the done and start bit first. The start bit is | 106 | /* We clear the start bit first. The start bit is |
107 | * looking at the 0 -> transition, but is not self clearing; | 107 | * looking at the 0 -> transition, but is not self clearing; |
108 | * And we clear the init done bit as well. | ||
109 | * NOTE: DONE must be written with 1 to clear it. | 108 | * NOTE: DONE must be written with 1 to clear it. |
109 | * We can't clear the DONE bit here using regmap_update_bits() | ||
110 | * as it will bypass the write if initial condition is START:0 DONE:1 | ||
111 | * e.g. on DRA7 which needs START pulse. | ||
110 | */ | 112 | */ |
111 | ctrl &= ~(1 << raminit->bits.start); | 113 | ctrl &= ~mask; /* START = 0, DONE = 0 */ |
112 | ctrl |= 1 << raminit->bits.done; | 114 | regmap_update_bits(raminit->syscon, raminit->reg, mask, ctrl); |
113 | regmap_write(raminit->syscon, raminit->reg, ctrl); | ||
114 | 115 | ||
115 | ctrl &= ~(1 << raminit->bits.done); | 116 | /* check if START bit is 0. Ignore DONE bit for now |
116 | c_can_hw_raminit_wait_syscon(priv, mask, ctrl); | 117 | * as it can be either 0 or 1. |
118 | */ | ||
119 | c_can_hw_raminit_wait_syscon(priv, 1 << raminit->bits.start, ctrl); | ||
117 | 120 | ||
118 | if (enable) { | 121 | if (enable) { |
119 | /* Set start bit and wait for the done bit. */ | 122 | /* Clear DONE bit & set START bit. */ |
120 | ctrl |= 1 << raminit->bits.start; | 123 | ctrl |= 1 << raminit->bits.start; |
121 | regmap_write(raminit->syscon, raminit->reg, ctrl); | 124 | /* DONE must be written with 1 to clear it */ |
122 | 125 | ctrl |= 1 << raminit->bits.done; | |
126 | regmap_update_bits(raminit->syscon, raminit->reg, mask, ctrl); | ||
127 | /* prevent further clearing of DONE bit */ | ||
128 | ctrl &= ~(1 << raminit->bits.done); | ||
123 | /* clear START bit if start pulse is needed */ | 129 | /* clear START bit if start pulse is needed */ |
124 | if (raminit->needs_pulse) { | 130 | if (raminit->needs_pulse) { |
125 | ctrl &= ~(1 << raminit->bits.start); | 131 | ctrl &= ~(1 << raminit->bits.start); |
126 | regmap_write(raminit->syscon, raminit->reg, ctrl); | 132 | regmap_update_bits(raminit->syscon, raminit->reg, |
133 | mask, ctrl); | ||
127 | } | 134 | } |
128 | 135 | ||
129 | ctrl |= 1 << raminit->bits.done; | 136 | ctrl |= 1 << raminit->bits.done; |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index 3ec8f6f25e5f..847c1f813261 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -807,10 +807,14 @@ static int can_changelink(struct net_device *dev, | |||
807 | if (dev->flags & IFF_UP) | 807 | if (dev->flags & IFF_UP) |
808 | return -EBUSY; | 808 | return -EBUSY; |
809 | cm = nla_data(data[IFLA_CAN_CTRLMODE]); | 809 | cm = nla_data(data[IFLA_CAN_CTRLMODE]); |
810 | if (cm->flags & ~priv->ctrlmode_supported) | 810 | |
811 | /* check whether changed bits are allowed to be modified */ | ||
812 | if (cm->mask & ~priv->ctrlmode_supported) | ||
811 | return -EOPNOTSUPP; | 813 | return -EOPNOTSUPP; |
814 | |||
815 | /* clear bits to be modified and copy the flag values */ | ||
812 | priv->ctrlmode &= ~cm->mask; | 816 | priv->ctrlmode &= ~cm->mask; |
813 | priv->ctrlmode |= cm->flags; | 817 | priv->ctrlmode |= (cm->flags & cm->mask); |
814 | 818 | ||
815 | /* CAN_CTRLMODE_FD can only be set when driver supports FD */ | 819 | /* CAN_CTRLMODE_FD can only be set when driver supports FD */ |
816 | if (priv->ctrlmode & CAN_CTRLMODE_FD) | 820 | if (priv->ctrlmode & CAN_CTRLMODE_FD) |
diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index d7bc462aafdc..244529881be9 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c | |||
@@ -955,6 +955,11 @@ static struct net_device *alloc_m_can_dev(void) | |||
955 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; | 955 | priv->can.data_bittiming_const = &m_can_data_bittiming_const; |
956 | priv->can.do_set_mode = m_can_set_mode; | 956 | priv->can.do_set_mode = m_can_set_mode; |
957 | priv->can.do_get_berr_counter = m_can_get_berr_counter; | 957 | priv->can.do_get_berr_counter = m_can_get_berr_counter; |
958 | |||
959 | /* CAN_CTRLMODE_FD_NON_ISO is fixed with M_CAN IP v3.0.1 */ | ||
960 | priv->can.ctrlmode = CAN_CTRLMODE_FD_NON_ISO; | ||
961 | |||
962 | /* CAN_CTRLMODE_FD_NON_ISO can not be changed with M_CAN IP v3.0.1 */ | ||
958 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | | 963 | priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | |
959 | CAN_CTRLMODE_LISTENONLY | | 964 | CAN_CTRLMODE_LISTENONLY | |
960 | CAN_CTRLMODE_BERR_REPORTING | | 965 | CAN_CTRLMODE_BERR_REPORTING | |
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 541fb7a05625..c32cd61073bc 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
@@ -520,10 +520,10 @@ static void kvaser_usb_tx_acknowledge(const struct kvaser_usb *dev, | |||
520 | skb = alloc_can_err_skb(priv->netdev, &cf); | 520 | skb = alloc_can_err_skb(priv->netdev, &cf); |
521 | if (skb) { | 521 | if (skb) { |
522 | cf->can_id |= CAN_ERR_RESTARTED; | 522 | cf->can_id |= CAN_ERR_RESTARTED; |
523 | netif_rx(skb); | ||
524 | 523 | ||
525 | stats->rx_packets++; | 524 | stats->rx_packets++; |
526 | stats->rx_bytes += cf->can_dlc; | 525 | stats->rx_bytes += cf->can_dlc; |
526 | netif_rx(skb); | ||
527 | } else { | 527 | } else { |
528 | netdev_err(priv->netdev, | 528 | netdev_err(priv->netdev, |
529 | "No memory left for err_skb\n"); | 529 | "No memory left for err_skb\n"); |
@@ -770,10 +770,9 @@ static void kvaser_usb_rx_error(const struct kvaser_usb *dev, | |||
770 | 770 | ||
771 | priv->can.state = new_state; | 771 | priv->can.state = new_state; |
772 | 772 | ||
773 | netif_rx(skb); | ||
774 | |||
775 | stats->rx_packets++; | 773 | stats->rx_packets++; |
776 | stats->rx_bytes += cf->can_dlc; | 774 | stats->rx_bytes += cf->can_dlc; |
775 | netif_rx(skb); | ||
777 | } | 776 | } |
778 | 777 | ||
779 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | 778 | static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, |
@@ -805,10 +804,9 @@ static void kvaser_usb_rx_can_err(const struct kvaser_usb_net_priv *priv, | |||
805 | stats->rx_over_errors++; | 804 | stats->rx_over_errors++; |
806 | stats->rx_errors++; | 805 | stats->rx_errors++; |
807 | 806 | ||
808 | netif_rx(skb); | ||
809 | |||
810 | stats->rx_packets++; | 807 | stats->rx_packets++; |
811 | stats->rx_bytes += cf->can_dlc; | 808 | stats->rx_bytes += cf->can_dlc; |
809 | netif_rx(skb); | ||
812 | } | 810 | } |
813 | } | 811 | } |
814 | 812 | ||
@@ -887,10 +885,9 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | |||
887 | cf->can_dlc); | 885 | cf->can_dlc); |
888 | } | 886 | } |
889 | 887 | ||
890 | netif_rx(skb); | ||
891 | |||
892 | stats->rx_packets++; | 888 | stats->rx_packets++; |
893 | stats->rx_bytes += cf->can_dlc; | 889 | stats->rx_bytes += cf->can_dlc; |
890 | netif_rx(skb); | ||
894 | } | 891 | } |
895 | 892 | ||
896 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, | 893 | static void kvaser_usb_start_chip_reply(const struct kvaser_usb *dev, |
@@ -1246,6 +1243,9 @@ static int kvaser_usb_close(struct net_device *netdev) | |||
1246 | if (err) | 1243 | if (err) |
1247 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | 1244 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); |
1248 | 1245 | ||
1246 | /* reset tx contexts */ | ||
1247 | kvaser_usb_unlink_tx_urbs(priv); | ||
1248 | |||
1249 | priv->can.state = CAN_STATE_STOPPED; | 1249 | priv->can.state = CAN_STATE_STOPPED; |
1250 | close_candev(priv->netdev); | 1250 | close_candev(priv->netdev); |
1251 | 1251 | ||
@@ -1294,12 +1294,14 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1294 | if (!urb) { | 1294 | if (!urb) { |
1295 | netdev_err(netdev, "No memory left for URBs\n"); | 1295 | netdev_err(netdev, "No memory left for URBs\n"); |
1296 | stats->tx_dropped++; | 1296 | stats->tx_dropped++; |
1297 | goto nourbmem; | 1297 | dev_kfree_skb(skb); |
1298 | return NETDEV_TX_OK; | ||
1298 | } | 1299 | } |
1299 | 1300 | ||
1300 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | 1301 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); |
1301 | if (!buf) { | 1302 | if (!buf) { |
1302 | stats->tx_dropped++; | 1303 | stats->tx_dropped++; |
1304 | dev_kfree_skb(skb); | ||
1303 | goto nobufmem; | 1305 | goto nobufmem; |
1304 | } | 1306 | } |
1305 | 1307 | ||
@@ -1334,6 +1336,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1334 | } | 1336 | } |
1335 | } | 1337 | } |
1336 | 1338 | ||
1339 | /* This should never happen; it implies a flow control bug */ | ||
1337 | if (!context) { | 1340 | if (!context) { |
1338 | netdev_warn(netdev, "cannot find free context\n"); | 1341 | netdev_warn(netdev, "cannot find free context\n"); |
1339 | ret = NETDEV_TX_BUSY; | 1342 | ret = NETDEV_TX_BUSY; |
@@ -1364,9 +1367,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | |||
1364 | if (unlikely(err)) { | 1367 | if (unlikely(err)) { |
1365 | can_free_echo_skb(netdev, context->echo_index); | 1368 | can_free_echo_skb(netdev, context->echo_index); |
1366 | 1369 | ||
1367 | skb = NULL; /* set to NULL to avoid double free in | ||
1368 | * dev_kfree_skb(skb) */ | ||
1369 | |||
1370 | atomic_dec(&priv->active_tx_urbs); | 1370 | atomic_dec(&priv->active_tx_urbs); |
1371 | usb_unanchor_urb(urb); | 1371 | usb_unanchor_urb(urb); |
1372 | 1372 | ||
@@ -1388,8 +1388,6 @@ releasebuf: | |||
1388 | kfree(buf); | 1388 | kfree(buf); |
1389 | nobufmem: | 1389 | nobufmem: |
1390 | usb_free_urb(urb); | 1390 | usb_free_urb(urb); |
1391 | nourbmem: | ||
1392 | dev_kfree_skb(skb); | ||
1393 | return ret; | 1391 | return ret; |
1394 | } | 1392 | } |
1395 | 1393 | ||
@@ -1502,6 +1500,10 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | |||
1502 | struct kvaser_usb_net_priv *priv; | 1500 | struct kvaser_usb_net_priv *priv; |
1503 | int i, err; | 1501 | int i, err; |
1504 | 1502 | ||
1503 | err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, channel); | ||
1504 | if (err) | ||
1505 | return err; | ||
1506 | |||
1505 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); | 1507 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); |
1506 | if (!netdev) { | 1508 | if (!netdev) { |
1507 | dev_err(&intf->dev, "Cannot alloc candev\n"); | 1509 | dev_err(&intf->dev, "Cannot alloc candev\n"); |
@@ -1606,9 +1608,6 @@ static int kvaser_usb_probe(struct usb_interface *intf, | |||
1606 | 1608 | ||
1607 | usb_set_intfdata(intf, dev); | 1609 | usb_set_intfdata(intf, dev); |
1608 | 1610 | ||
1609 | for (i = 0; i < MAX_NET_DEVICES; i++) | ||
1610 | kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, i); | ||
1611 | |||
1612 | err = kvaser_usb_get_software_info(dev); | 1611 | err = kvaser_usb_get_software_info(dev); |
1613 | if (err) { | 1612 | if (err) { |
1614 | dev_err(&intf->dev, | 1613 | dev_err(&intf->dev, |
diff --git a/include/uapi/linux/can/netlink.h b/include/uapi/linux/can/netlink.h index 3e4323a3918d..94ffe0c83ce7 100644 --- a/include/uapi/linux/can/netlink.h +++ b/include/uapi/linux/can/netlink.h | |||
@@ -98,6 +98,7 @@ struct can_ctrlmode { | |||
98 | #define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ | 98 | #define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */ |
99 | #define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */ | 99 | #define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */ |
100 | #define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */ | 100 | #define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */ |
101 | #define CAN_CTRLMODE_FD_NON_ISO 0x80 /* CAN FD in non-ISO mode */ | ||
101 | 102 | ||
102 | /* | 103 | /* |
103 | * CAN device statistics | 104 | * CAN device statistics |