aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-09-05 06:17:50 -0400
committerDavid S. Miller <davem@davemloft.net>2019-09-05 06:17:50 -0400
commit44c40910b66f786d33ffd2682ef38750eebb567c (patch)
tree69b08b2eb39c5d39996d2e29016a31874381be01 /drivers/net/can
parent8330f73fe9742f201f467639f8356cf58756fb9f (diff)
parent9d71dd0c70099914fcd063135da3c580865e924c (diff)
Merge tag 'linux-can-next-for-5.4-20190904' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next
Marc Kleine-Budde says: ==================== pull-request: can-next 2019-09-04 j1939 this is a pull request for net-next/master consisting of 21 patches. the first 12 patches are by me and target the CAN core infrastructure. They clean up the names of variables , structs and struct members, convert can_rx_register() to use max() instead of open coding it and remove unneeded code from the can_pernet_exit() callback. The next three patches are also by me and they introduce and make use of the CAN midlayer private structure. It is used to hold protocol specific per device data structures. The next patch is by Oleksij Rempel, switches the &net->can.rcvlists_lock from a spin_lock() to a spin_lock_bh(), so that it can be used from NAPI (soft IRQ) context. The next 4 patches are by Kurt Van Dijck, he first updates his email address via mailmap and then extends sockaddr_can to include j1939 members. The final patch is the collective effort of many entities (The j1939 authors: Oliver Hartkopp, Bastian Stender, Elenita Hinds, kbuild test robot, Kurt Van Dijck, Maxime Jayat, Robin van der Gracht, Oleksij Rempel, Marc Kleine-Budde). It adds support of SAE J1939 protocol to the CAN networking stack. SAE J1939 is the vehicle bus recommended practice used for communication and diagnostics among vehicle components. Originating in the car and heavy-duty truck industry in the United States, it is now widely used in other parts of the world. P.S.: This pull request doesn't invalidate my last pull request: "pull-request: can-next 2019-09-03". ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/dev.c24
-rw-r--r--drivers/net/can/slcan.c6
-rw-r--r--drivers/net/can/vcan.c7
-rw-r--r--drivers/net/can/vxcan.c4
4 files changed, 33 insertions, 8 deletions
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
index 0929c7d83e15..ac86be52b461 100644
--- a/drivers/net/can/dev.c
+++ b/drivers/net/can/dev.c
@@ -11,6 +11,7 @@
11#include <linux/if_arp.h> 11#include <linux/if_arp.h>
12#include <linux/workqueue.h> 12#include <linux/workqueue.h>
13#include <linux/can.h> 13#include <linux/can.h>
14#include <linux/can/can-ml.h>
14#include <linux/can/dev.h> 15#include <linux/can/dev.h>
15#include <linux/can/skb.h> 16#include <linux/can/skb.h>
16#include <linux/can/netlink.h> 17#include <linux/can/netlink.h>
@@ -713,11 +714,24 @@ struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,
713 struct can_priv *priv; 714 struct can_priv *priv;
714 int size; 715 int size;
715 716
717 /* We put the driver's priv, the CAN mid layer priv and the
718 * echo skb into the netdevice's priv. The memory layout for
719 * the netdev_priv is like this:
720 *
721 * +-------------------------+
722 * | driver's priv |
723 * +-------------------------+
724 * | struct can_ml_priv |
725 * +-------------------------+
726 * | array of struct sk_buff |
727 * +-------------------------+
728 */
729
730 size = ALIGN(sizeof_priv, NETDEV_ALIGN) + sizeof(struct can_ml_priv);
731
716 if (echo_skb_max) 732 if (echo_skb_max)
717 size = ALIGN(sizeof_priv, sizeof(struct sk_buff *)) + 733 size = ALIGN(size, sizeof(struct sk_buff *)) +
718 echo_skb_max * sizeof(struct sk_buff *); 734 echo_skb_max * sizeof(struct sk_buff *);
719 else
720 size = sizeof_priv;
721 735
722 dev = alloc_netdev_mqs(size, "can%d", NET_NAME_UNKNOWN, can_setup, 736 dev = alloc_netdev_mqs(size, "can%d", NET_NAME_UNKNOWN, can_setup,
723 txqs, rxqs); 737 txqs, rxqs);
@@ -727,10 +741,12 @@ struct net_device *alloc_candev_mqs(int sizeof_priv, unsigned int echo_skb_max,
727 priv = netdev_priv(dev); 741 priv = netdev_priv(dev);
728 priv->dev = dev; 742 priv->dev = dev;
729 743
744 dev->ml_priv = (void *)priv + ALIGN(sizeof_priv, NETDEV_ALIGN);
745
730 if (echo_skb_max) { 746 if (echo_skb_max) {
731 priv->echo_skb_max = echo_skb_max; 747 priv->echo_skb_max = echo_skb_max;
732 priv->echo_skb = (void *)priv + 748 priv->echo_skb = (void *)priv +
733 ALIGN(sizeof_priv, sizeof(struct sk_buff *)); 749 (size - echo_skb_max * sizeof(struct sk_buff *));
734 } 750 }
735 751
736 priv->state = CAN_STATE_STOPPED; 752 priv->state = CAN_STATE_STOPPED;
diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c
index aa97dbc797b6..bb6032211043 100644
--- a/drivers/net/can/slcan.c
+++ b/drivers/net/can/slcan.c
@@ -55,6 +55,7 @@
55#include <linux/workqueue.h> 55#include <linux/workqueue.h>
56#include <linux/can.h> 56#include <linux/can.h>
57#include <linux/can/skb.h> 57#include <linux/can/skb.h>
58#include <linux/can/can-ml.h>
58 59
59MODULE_ALIAS_LDISC(N_SLCAN); 60MODULE_ALIAS_LDISC(N_SLCAN);
60MODULE_DESCRIPTION("serial line CAN interface"); 61MODULE_DESCRIPTION("serial line CAN interface");
@@ -514,6 +515,7 @@ static struct slcan *slc_alloc(void)
514 char name[IFNAMSIZ]; 515 char name[IFNAMSIZ];
515 struct net_device *dev = NULL; 516 struct net_device *dev = NULL;
516 struct slcan *sl; 517 struct slcan *sl;
518 int size;
517 519
518 for (i = 0; i < maxdev; i++) { 520 for (i = 0; i < maxdev; i++) {
519 dev = slcan_devs[i]; 521 dev = slcan_devs[i];
@@ -527,12 +529,14 @@ static struct slcan *slc_alloc(void)
527 return NULL; 529 return NULL;
528 530
529 sprintf(name, "slcan%d", i); 531 sprintf(name, "slcan%d", i);
530 dev = alloc_netdev(sizeof(*sl), name, NET_NAME_UNKNOWN, slc_setup); 532 size = ALIGN(sizeof(*sl), NETDEV_ALIGN) + sizeof(struct can_ml_priv);
533 dev = alloc_netdev(size, name, NET_NAME_UNKNOWN, slc_setup);
531 if (!dev) 534 if (!dev)
532 return NULL; 535 return NULL;
533 536
534 dev->base_addr = i; 537 dev->base_addr = i;
535 sl = netdev_priv(dev); 538 sl = netdev_priv(dev);
539 dev->ml_priv = (void *)sl + ALIGN(sizeof(*sl), NETDEV_ALIGN);
536 540
537 /* Initialize channel control data */ 541 /* Initialize channel control data */
538 sl->magic = SLCAN_MAGIC; 542 sl->magic = SLCAN_MAGIC;
diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c
index daf27133887b..39ca14b0585d 100644
--- a/drivers/net/can/vcan.c
+++ b/drivers/net/can/vcan.c
@@ -46,6 +46,7 @@
46#include <linux/if_arp.h> 46#include <linux/if_arp.h>
47#include <linux/if_ether.h> 47#include <linux/if_ether.h>
48#include <linux/can.h> 48#include <linux/can.h>
49#include <linux/can/can-ml.h>
49#include <linux/can/dev.h> 50#include <linux/can/dev.h>
50#include <linux/can/skb.h> 51#include <linux/can/skb.h>
51#include <linux/slab.h> 52#include <linux/slab.h>
@@ -152,6 +153,7 @@ static void vcan_setup(struct net_device *dev)
152 dev->addr_len = 0; 153 dev->addr_len = 0;
153 dev->tx_queue_len = 0; 154 dev->tx_queue_len = 0;
154 dev->flags = IFF_NOARP; 155 dev->flags = IFF_NOARP;
156 dev->ml_priv = netdev_priv(dev);
155 157
156 /* set flags according to driver capabilities */ 158 /* set flags according to driver capabilities */
157 if (echo) 159 if (echo)
@@ -162,8 +164,9 @@ static void vcan_setup(struct net_device *dev)
162} 164}
163 165
164static struct rtnl_link_ops vcan_link_ops __read_mostly = { 166static struct rtnl_link_ops vcan_link_ops __read_mostly = {
165 .kind = DRV_NAME, 167 .kind = DRV_NAME,
166 .setup = vcan_setup, 168 .priv_size = sizeof(struct can_ml_priv),
169 .setup = vcan_setup,
167}; 170};
168 171
169static __init int vcan_init_module(void) 172static __init int vcan_init_module(void)
diff --git a/drivers/net/can/vxcan.c b/drivers/net/can/vxcan.c
index b2106292230e..d6ba9426be4d 100644
--- a/drivers/net/can/vxcan.c
+++ b/drivers/net/can/vxcan.c
@@ -18,6 +18,7 @@
18#include <linux/can/dev.h> 18#include <linux/can/dev.h>
19#include <linux/can/skb.h> 19#include <linux/can/skb.h>
20#include <linux/can/vxcan.h> 20#include <linux/can/vxcan.h>
21#include <linux/can/can-ml.h>
21#include <linux/slab.h> 22#include <linux/slab.h>
22#include <net/rtnetlink.h> 23#include <net/rtnetlink.h>
23 24
@@ -146,6 +147,7 @@ static void vxcan_setup(struct net_device *dev)
146 dev->flags = (IFF_NOARP|IFF_ECHO); 147 dev->flags = (IFF_NOARP|IFF_ECHO);
147 dev->netdev_ops = &vxcan_netdev_ops; 148 dev->netdev_ops = &vxcan_netdev_ops;
148 dev->needs_free_netdev = true; 149 dev->needs_free_netdev = true;
150 dev->ml_priv = netdev_priv(dev) + ALIGN(sizeof(struct vxcan_priv), NETDEV_ALIGN);
149} 151}
150 152
151/* forward declaration for rtnl_create_link() */ 153/* forward declaration for rtnl_create_link() */
@@ -281,7 +283,7 @@ static struct net *vxcan_get_link_net(const struct net_device *dev)
281 283
282static struct rtnl_link_ops vxcan_link_ops = { 284static struct rtnl_link_ops vxcan_link_ops = {
283 .kind = DRV_NAME, 285 .kind = DRV_NAME,
284 .priv_size = sizeof(struct vxcan_priv), 286 .priv_size = ALIGN(sizeof(struct vxcan_priv), NETDEV_ALIGN) + sizeof(struct can_ml_priv),
285 .setup = vxcan_setup, 287 .setup = vxcan_setup,
286 .newlink = vxcan_newlink, 288 .newlink = vxcan_newlink,
287 .dellink = vxcan_dellink, 289 .dellink = vxcan_dellink,