Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'dsa-netconsole'

Florian Fainelli says:

====================
net: GENET, SYSTEMPORT and DSA netconsole

This patch series adds support for netconsole in the GENET, SYSTEMPORT and DSA
drivers.

A small refactoring to the DSA transmit path is required to avoid duplicating
the dsa_netpoll_send_skb() into each and every tagging protocol supported.

Testing on e.g: mv643xx_eth and/or e1000e would be much appreciated!

Changes in v2:

- properly disable/enable interrupts in GENET and SYSTEMPORT

- pass the reallocated SKB back to dsa_slave_xmit() in case a tag protocol had to
alter the original SKB
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+142 -49
+18
drivers/net/ethernet/broadcom/bcmsysport.c
··· 933 933 return IRQ_HANDLED; 934 934 } 935 935 936 + #ifdef CONFIG_NET_POLL_CONTROLLER 937 + static void bcm_sysport_poll_controller(struct net_device *dev) 938 + { 939 + struct bcm_sysport_priv *priv = netdev_priv(dev); 940 + 941 + disable_irq(priv->irq0); 942 + bcm_sysport_rx_isr(priv->irq0, priv); 943 + enable_irq(priv->irq0); 944 + 945 + disable_irq(priv->irq1); 946 + bcm_sysport_tx_isr(priv->irq1, priv); 947 + enable_irq(priv->irq1); 948 + } 949 + #endif 950 + 936 951 static struct sk_buff *bcm_sysport_insert_tsb(struct sk_buff *skb, 937 952 struct net_device *dev) 938 953 { ··· 1738 1723 .ndo_set_features = bcm_sysport_set_features, 1739 1724 .ndo_set_rx_mode = bcm_sysport_set_rx_mode, 1740 1725 .ndo_set_mac_address = bcm_sysport_change_mac, 1726 + #ifdef CONFIG_NET_POLL_CONTROLLER 1727 + .ndo_poll_controller = bcm_sysport_poll_controller, 1728 + #endif 1741 1729 }; 1742 1730 1743 1731 #define REV_FMT "v%2x.%02x"
+20
drivers/net/ethernet/broadcom/genet/bcmgenet.c
··· 2388 2388 return IRQ_HANDLED; 2389 2389 } 2390 2390 2391 + #ifdef CONFIG_NET_POLL_CONTROLLER 2392 + static void bcmgenet_poll_controller(struct net_device *dev) 2393 + { 2394 + struct bcmgenet_priv *priv = netdev_priv(dev); 2395 + 2396 + /* Invoke the main RX/TX interrupt handler */ 2397 + disable_irq(priv->irq0); 2398 + bcmgenet_isr0(priv->irq0, priv); 2399 + enable_irq(priv->irq0); 2400 + 2401 + /* And the interrupt handler for RX/TX priority queues */ 2402 + disable_irq(priv->irq1); 2403 + bcmgenet_isr1(priv->irq1, priv); 2404 + enable_irq(priv->irq1); 2405 + } 2406 + #endif 2407 + 2391 2408 static void bcmgenet_umac_reset(struct bcmgenet_priv *priv) 2392 2409 { 2393 2410 u32 reg; ··· 2956 2939 .ndo_set_mac_address = bcmgenet_set_mac_addr, 2957 2940 .ndo_do_ioctl = bcmgenet_ioctl, 2958 2941 .ndo_set_features = bcmgenet_set_features, 2942 + #ifdef CONFIG_NET_POLL_CONTROLLER 2943 + .ndo_poll_controller = bcmgenet_poll_controller, 2944 + #endif 2959 2945 }; 2960 2946 2961 2947 /* Array of GENET hardware parameters/characteristics */
+6 -2
net/dsa/dsa_priv.h
··· 13 13 14 14 #include <linux/phy.h> 15 15 #include <linux/netdevice.h> 16 + #include <linux/netpoll.h> 16 17 17 18 struct dsa_device_ops { 18 - netdev_tx_t (*xmit)(struct sk_buff *skb, struct net_device *dev); 19 + struct sk_buff *(*xmit)(struct sk_buff *skb, struct net_device *dev); 19 20 int (*rcv)(struct sk_buff *skb, struct net_device *dev, 20 21 struct packet_type *pt, struct net_device *orig_dev); 21 22 }; ··· 27 26 * switch port. 28 27 */ 29 28 struct net_device *dev; 30 - netdev_tx_t (*xmit)(struct sk_buff *skb, 29 + struct sk_buff * (*xmit)(struct sk_buff *skb, 31 30 struct net_device *dev); 32 31 33 32 /* ··· 48 47 int old_duplex; 49 48 50 49 struct net_device *bridge_dev; 50 + #ifdef CONFIG_NET_POLL_CONTROLLER 51 + struct netpoll *netpoll; 52 + #endif 51 53 }; 52 54 53 55 /* dsa.c */
+86 -8
net/dsa/slave.c
··· 18 18 #include <net/rtnetlink.h> 19 19 #include <net/switchdev.h> 20 20 #include <linux/if_bridge.h> 21 + #include <linux/netpoll.h> 21 22 #include "dsa_priv.h" 22 23 23 24 /* slave mii_bus handling ***************************************************/ ··· 419 418 return 0; 420 419 } 421 420 421 + static inline netdev_tx_t dsa_netpoll_send_skb(struct dsa_slave_priv *p, 422 + struct sk_buff *skb) 423 + { 424 + #ifdef CONFIG_NET_POLL_CONTROLLER 425 + if (p->netpoll) 426 + netpoll_send_skb(p->netpoll, skb); 427 + #else 428 + BUG(); 429 + #endif 430 + return NETDEV_TX_OK; 431 + } 432 + 422 433 static netdev_tx_t dsa_slave_xmit(struct sk_buff *skb, struct net_device *dev) 423 434 { 424 435 struct dsa_slave_priv *p = netdev_priv(dev); 436 + struct sk_buff *nskb; 425 437 426 - return p->xmit(skb, dev); 427 - } 438 + dev->stats.tx_packets++; 439 + dev->stats.tx_bytes += skb->len; 428 440 429 - static netdev_tx_t dsa_slave_notag_xmit(struct sk_buff *skb, 430 - struct net_device *dev) 431 - { 432 - struct dsa_slave_priv *p = netdev_priv(dev); 441 + /* Transmit function may have to reallocate the original SKB */ 442 + nskb = p->xmit(skb, dev); 443 + if (!nskb) 444 + return NETDEV_TX_OK; 433 445 434 - skb->dev = p->parent->dst->master_netdev; 435 - dev_queue_xmit(skb); 446 + /* SKB for netpoll still need to be mangled with the protocol-specific 447 + * tag to be successfully transmitted 448 + */ 449 + if (unlikely(netpoll_tx_running(dev))) 450 + return dsa_netpoll_send_skb(p, nskb); 451 + 452 + /* Queue the SKB for transmission on the parent interface, but 453 + * do not modify its EtherType 454 + */ 455 + nskb->dev = p->parent->dst->master_netdev; 456 + dev_queue_xmit(nskb); 436 457 437 458 return NETDEV_TX_OK; 459 + } 460 + 461 + static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb, 462 + struct net_device *dev) 463 + { 464 + /* Just return the original SKB */ 465 + return skb; 438 466 } 439 467 440 468 ··· 695 665 return ret; 696 666 } 697 667 668 + #ifdef CONFIG_NET_POLL_CONTROLLER 669 + static int dsa_slave_netpoll_setup(struct net_device *dev, 670 + struct netpoll_info *ni) 671 + { 672 + struct dsa_slave_priv *p = netdev_priv(dev); 673 + struct dsa_switch *ds = p->parent; 674 + struct net_device *master = ds->dst->master_netdev; 675 + struct netpoll *netpoll; 676 + int err = 0; 677 + 678 + netpoll = kzalloc(sizeof(*netpoll), GFP_KERNEL); 679 + if (!netpoll) 680 + return -ENOMEM; 681 + 682 + err = __netpoll_setup(netpoll, master); 683 + if (err) { 684 + kfree(netpoll); 685 + goto out; 686 + } 687 + 688 + p->netpoll = netpoll; 689 + out: 690 + return err; 691 + } 692 + 693 + static void dsa_slave_netpoll_cleanup(struct net_device *dev) 694 + { 695 + struct dsa_slave_priv *p = netdev_priv(dev); 696 + struct netpoll *netpoll = p->netpoll; 697 + 698 + if (!netpoll) 699 + return; 700 + 701 + p->netpoll = NULL; 702 + 703 + __netpoll_free_async(netpoll); 704 + } 705 + 706 + static void dsa_slave_poll_controller(struct net_device *dev) 707 + { 708 + } 709 + #endif 710 + 698 711 static const struct ethtool_ops dsa_slave_ethtool_ops = { 699 712 .get_settings = dsa_slave_get_settings, 700 713 .set_settings = dsa_slave_set_settings, ··· 770 697 .ndo_fdb_dump = dsa_slave_fdb_dump, 771 698 .ndo_do_ioctl = dsa_slave_ioctl, 772 699 .ndo_get_iflink = dsa_slave_get_iflink, 700 + #ifdef CONFIG_NET_POLL_CONTROLLER 701 + .ndo_netpoll_setup = dsa_slave_netpoll_setup, 702 + .ndo_netpoll_cleanup = dsa_slave_netpoll_cleanup, 703 + .ndo_poll_controller = dsa_slave_poll_controller, 704 + #endif 773 705 }; 774 706 775 707 static const struct switchdev_ops dsa_slave_switchdev_ops = {
+3 -12
net/dsa/tag_brcm.c
··· 58 58 #define BRCM_EG_TC_MASK 0x7 59 59 #define BRCM_EG_PID_MASK 0x1f 60 60 61 - static netdev_tx_t brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev) 61 + static struct sk_buff *brcm_tag_xmit(struct sk_buff *skb, struct net_device *dev) 62 62 { 63 63 struct dsa_slave_priv *p = netdev_priv(dev); 64 64 u8 *brcm_tag; 65 - 66 - dev->stats.tx_packets++; 67 - dev->stats.tx_bytes += skb->len; 68 65 69 66 if (skb_cow_head(skb, BRCM_TAG_LEN) < 0) 70 67 goto out_free; ··· 84 87 brcm_tag[2] = BRCM_IG_DSTMAP2_MASK; 85 88 brcm_tag[3] = (1 << p->port) & BRCM_IG_DSTMAP1_MASK; 86 89 87 - /* Queue the SKB for transmission on the parent interface, but 88 - * do not modify its EtherType 89 - */ 90 - skb->dev = p->parent->dst->master_netdev; 91 - dev_queue_xmit(skb); 92 - 93 - return NETDEV_TX_OK; 90 + return skb; 94 91 95 92 out_free: 96 93 kfree_skb(skb); 97 - return NETDEV_TX_OK; 94 + return NULL; 98 95 } 99 96 100 97 static int brcm_tag_rcv(struct sk_buff *skb, struct net_device *dev,
+3 -9
net/dsa/tag_dsa.c
··· 15 15 16 16 #define DSA_HLEN 4 17 17 18 - static netdev_tx_t dsa_xmit(struct sk_buff *skb, struct net_device *dev) 18 + static struct sk_buff *dsa_xmit(struct sk_buff *skb, struct net_device *dev) 19 19 { 20 20 struct dsa_slave_priv *p = netdev_priv(dev); 21 21 u8 *dsa_header; 22 - 23 - dev->stats.tx_packets++; 24 - dev->stats.tx_bytes += skb->len; 25 22 26 23 /* 27 24 * Convert the outermost 802.1q tag to a DSA tag for tagged ··· 60 63 dsa_header[3] = 0x00; 61 64 } 62 65 63 - skb->dev = p->parent->dst->master_netdev; 64 - dev_queue_xmit(skb); 65 - 66 - return NETDEV_TX_OK; 66 + return skb; 67 67 68 68 out_free: 69 69 kfree_skb(skb); 70 - return NETDEV_TX_OK; 70 + return NULL; 71 71 } 72 72 73 73 static int dsa_rcv(struct sk_buff *skb, struct net_device *dev,
+3 -9
net/dsa/tag_edsa.c
··· 16 16 #define DSA_HLEN 4 17 17 #define EDSA_HLEN 8 18 18 19 - static netdev_tx_t edsa_xmit(struct sk_buff *skb, struct net_device *dev) 19 + static struct sk_buff *edsa_xmit(struct sk_buff *skb, struct net_device *dev) 20 20 { 21 21 struct dsa_slave_priv *p = netdev_priv(dev); 22 22 u8 *edsa_header; 23 - 24 - dev->stats.tx_packets++; 25 - dev->stats.tx_bytes += skb->len; 26 23 27 24 /* 28 25 * Convert the outermost 802.1q tag to a DSA tag and prepend ··· 73 76 edsa_header[7] = 0x00; 74 77 } 75 78 76 - skb->dev = p->parent->dst->master_netdev; 77 - dev_queue_xmit(skb); 78 - 79 - return NETDEV_TX_OK; 79 + return skb; 80 80 81 81 out_free: 82 82 kfree_skb(skb); 83 - return NETDEV_TX_OK; 83 + return NULL; 84 84 } 85 85 86 86 static int edsa_rcv(struct sk_buff *skb, struct net_device *dev,
+3 -9
net/dsa/tag_trailer.c
··· 13 13 #include <linux/slab.h> 14 14 #include "dsa_priv.h" 15 15 16 - static netdev_tx_t trailer_xmit(struct sk_buff *skb, struct net_device *dev) 16 + static struct sk_buff *trailer_xmit(struct sk_buff *skb, struct net_device *dev) 17 17 { 18 18 struct dsa_slave_priv *p = netdev_priv(dev); 19 19 struct sk_buff *nskb; 20 20 int padlen; 21 21 u8 *trailer; 22 - 23 - dev->stats.tx_packets++; 24 - dev->stats.tx_bytes += skb->len; 25 22 26 23 /* 27 24 * We have to make sure that the trailer ends up as the very ··· 33 36 nskb = alloc_skb(NET_IP_ALIGN + skb->len + padlen + 4, GFP_ATOMIC); 34 37 if (nskb == NULL) { 35 38 kfree_skb(skb); 36 - return NETDEV_TX_OK; 39 + return NULL; 37 40 } 38 41 skb_reserve(nskb, NET_IP_ALIGN); 39 42 ··· 54 57 trailer[2] = 0x10; 55 58 trailer[3] = 0x00; 56 59 57 - nskb->dev = p->parent->dst->master_netdev; 58 - dev_queue_xmit(nskb); 59 - 60 - return NETDEV_TX_OK; 60 + return nskb; 61 61 } 62 62 63 63 static int trailer_rcv(struct sk_buff *skb, struct net_device *dev,