Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 14 Jul 2013 00:42:22 +0000 (17:42 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 14 Jul 2013 00:42:22 +0000 (17:42 -0700)
Pull networking fixes from David Miller:
 "Just a bunch of small fixes and tidy ups:

   1) Finish the "busy_poll" renames, from Eliezer Tamir.

   2) Fix RCU stalls in IFB driver, from Ding Tianhong.

   3) Linearize buffers properly in tun/macvtap zerocopy code.

   4) Don't crash on rmmod in vxlan, from Pravin B Shelar.

   5) Spinlock used before init in alx driver, from Maarten Lankhorst.

   6) A sparse warning fix in bnx2x broke TSO checksums, fix from Dmitry
      Kravkov.

   7) Dummy and ifb driver load failure paths can oops, fixes from Tan
      Xiaojun and Ding Tianhong.

   8) Correct MTU calculations in IP tunnels, from Alexander Duyck.

   9) Account all TCP retransmits in SNMP stats properly, from Yuchung
      Cheng.

  10) atl1e and via-rhine do not handle DMA mapping failures properly,
      from Neil Horman.

  11) Various equal-cost multipath route fixes in ipv6 from Hannes
      Frederic Sowa"

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (36 commits)
  ipv6: only static routes qualify for equal cost multipathing
  via-rhine: fix dma mapping errors
  atl1e: fix dma mapping warnings
  tcp: account all retransmit failures
  usb/net/r815x: fix cast to restricted __le32
  usb/net/r8152: fix integer overflow in expression
  net: access page->private by using page_private
  net: strict_strtoul is obsolete, use kstrtoul instead
  drivers/net/ieee802154: don't use devm_pinctrl_get_select_default() in probe
  drivers/net/ethernet/cadence: don't use devm_pinctrl_get_select_default() in probe
  drivers/net/can/c_can: don't use devm_pinctrl_get_select_default() in probe
  net/usb: add relative mii functions for r815x
  net/tipc: use %*phC to dump small buffers in hex form
  qlcnic: Adding Maintainers.
  gre: Fix MTU sizing check for gretap tunnels
  pkt_sched: sch_qfq: remove forward declaration of qfq_update_agg_ts
  pkt_sched: sch_qfq: improve efficiency of make_eligible
  gso: Update tunnel segmentation to support Tx checksum offload
  inet: fix spacing in assignment
  ifb: fix oops when loading the ifb failed
  ...

66 files changed:
Documentation/sysctl/net.txt
MAINTAINERS
arch/alpha/include/uapi/asm/socket.h
arch/avr32/include/uapi/asm/socket.h
arch/cris/include/uapi/asm/socket.h
arch/frv/include/uapi/asm/socket.h
arch/h8300/include/uapi/asm/socket.h
arch/ia64/include/uapi/asm/socket.h
arch/m32r/include/uapi/asm/socket.h
arch/mips/include/uapi/asm/socket.h
arch/mn10300/include/uapi/asm/socket.h
arch/parisc/include/uapi/asm/socket.h
arch/powerpc/include/uapi/asm/socket.h
arch/s390/include/uapi/asm/socket.h
arch/sparc/include/uapi/asm/socket.h
arch/xtensa/include/uapi/asm/socket.h
drivers/net/can/c_can/c_can_platform.c
drivers/net/dummy.c
drivers/net/ethernet/atheros/alx/main.c
drivers/net/ethernet/atheros/atl1e/atl1e_main.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/cadence/at91_ether.c
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/mellanox/mlx4/en_netdev.c
drivers/net/ethernet/mellanox/mlx4/en_rx.c
drivers/net/ethernet/realtek/r8169.c
drivers/net/ethernet/renesas/Kconfig
drivers/net/ethernet/via/via-rhine.c
drivers/net/ieee802154/mrf24j40.c
drivers/net/ifb.c
drivers/net/macvtap.c
drivers/net/phy/at803x.c
drivers/net/tun.c
drivers/net/usb/Makefile
drivers/net/usb/cdc_ether.c
drivers/net/usb/r8152.c
drivers/net/usb/r815x.c [new file with mode: 0644]
drivers/net/vxlan.c
fs/select.c
include/linux/netdevice.h
include/net/busy_poll.h [new file with mode: 0644]
include/net/ll_poll.h [deleted file]
include/uapi/asm-generic/socket.h
net/9p/trans_common.c
net/core/datagram.c
net/core/dev.c
net/core/skbuff.c
net/core/sock.c
net/core/sysctl_net_core.c
net/dns_resolver/dns_key.c
net/ipv4/gre_offload.c
net/ipv4/inet_hashtables.c
net/ipv4/ip_tunnel.c
net/ipv4/tcp.c
net/ipv4/tcp_ipv4.c
net/ipv4/tcp_output.c
net/ipv4/udp.c
net/ipv6/ip6_fib.c
net/ipv6/route.c
net/ipv6/tcp_ipv6.c
net/ipv6/udp.c
net/sched/sch_qfq.c
net/socket.c
net/tipc/ib_media.c

index d69e14c9002cbd78cc3fb6d90ec408a654b3ce01..1c15043aaee4c89bf2c76aca10633557c1327bd3 100644 (file)
@@ -50,26 +50,27 @@ The maximum number of packets that kernel can handle on a NAPI interrupt,
 it's a Per-CPU variable.
 Default: 64
 
-low_latency_read
+busy_read
 ----------------
 Low latency busy poll timeout for socket reads. (needs CONFIG_NET_LL_RX_POLL)
 Approximate time in us to busy loop waiting for packets on the device queue.
-This sets the default value of the SO_LL socket option.
-Can be set or overridden per socket by setting socket option SO_LL, which is
-the preferred method of enabling.
-If you need to enable the feature globally via sysctl, a value of 50 is recommended.
+This sets the default value of the SO_BUSY_POLL socket option.
+Can be set or overridden per socket by setting socket option SO_BUSY_POLL,
+which is the preferred method of enabling. If you need to enable the feature
+globally via sysctl, a value of 50 is recommended.
 Will increase power usage.
 Default: 0 (off)
 
-low_latency_poll
+busy_poll
 ----------------
 Low latency busy poll timeout for poll and select. (needs CONFIG_NET_LL_RX_POLL)
 Approximate time in us to busy loop waiting for events.
 Recommended value depends on the number of sockets you poll on.
 For several sockets 50, for several hundreds 100.
 For more than that you probably want to use epoll.
-Note that only sockets with SO_LL set will be busy polled, so you want to either
-selectively set SO_LL on those sockets or set sysctl.net.low_latency_read globally.
+Note that only sockets with SO_BUSY_POLL set will be busy polled,
+so you want to either selectively set SO_BUSY_POLL on those sockets or set
+sysctl.net.busy_read globally.
 Will increase power usage.
 Default: 0 (off)
 
index 4d43db629689f5e8a587efa801afd274efa5f695..bf61e04291abb2f2200544517ab144c89cb3ab8e 100644 (file)
@@ -6681,10 +6681,12 @@ F:      Documentation/networking/LICENSE.qla3xxx
 F:     drivers/net/ethernet/qlogic/qla3xxx.*
 
 QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
+M:     Himanshu Madhani <himanshu.madhani@qlogic.com>
 M:     Rajesh Borundia <rajesh.borundia@qlogic.com>
 M:     Shahed Shaikh <shahed.shaikh@qlogic.com>
 M:     Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
 M:     Sony Chacko <sony.chacko@qlogic.com>
+M:     Sucheta Chakraborty <sucheta.chakraborty@qlogic.com>
 M:     linux-driver@qlogic.com
 L:     netdev@vger.kernel.org
 S:     Supported
index 4885825e498d754b6efb891d1e28a9e9f8536dbc..467de010ea7ee130cdbda0b532f10c885f8d1308 100644 (file)
@@ -81,6 +81,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL                   46
 
 #endif /* _UAPI_ASM_SOCKET_H */
index 79b61798ebf8abce4d89150296ab879280933a9e..11c4259c62fb146b8139b7045958f68d6adc3765 100644 (file)
@@ -74,6 +74,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* __ASM_AVR32_SOCKET_H */
index 47b1ec55092d62cb6df800a7c0ef5250c016ebbd..eb723e51554e559ef73d1196a455a96583a5cf51 100644 (file)
@@ -76,7 +76,7 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_SOCKET_H */
 
index dbc08520f22c581cfd20d3376d40b590486caf18..f0cb1c3411638e7b33bee915739881635c59c9bc 100644 (file)
@@ -74,7 +74,7 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_SOCKET_H */
 
index a38d38a6520bfcc58fb3b4729cb1e38ecc37aa90..9490758c5e2bac1aa4375063a713473221234d97 100644 (file)
@@ -74,6 +74,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_SOCKET_H */
index d3358b7606819bcc733affa863febe620ad90f4b..556d0701a155351e844960aa00b51c55c820a3b9 100644 (file)
@@ -83,6 +83,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_IA64_SOCKET_H */
index 44aaf4639a4a0c5c9364ec4e609200b9be5e553e..24be7c8da86ad3cbbdee6be0933fe302c9adaf02 100644 (file)
@@ -74,6 +74,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_M32R_SOCKET_H */
index 6a07992ba6c6b0e6f9b577e7693a8dfebaed7a8c..61c01f054d1b160f753582b60888e59592b95b21 100644 (file)
@@ -92,6 +92,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _UAPI_ASM_SOCKET_H */
index db80fd3e398b8abf0321db0d08f9d1ec248cb001..e2a2b203eb005b5403f2b68f92a841d87137b75c 100644 (file)
@@ -74,6 +74,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_SOCKET_H */
index f866fff9a00411c7d45111bd9f780a53846615b5..71700e636a8e7b25172cda7f4815b1e46216b3d3 100644 (file)
@@ -73,7 +73,7 @@
 
 #define SO_SELECT_ERR_QUEUE    0x4026
 
-#define SO_LL                  0x4027
+#define SO_BUSY_POLL           0x4027
 
 /* O_NONBLOCK clashes with the bits used for socket types.  Therefore we
  * have to define SOCK_NONBLOCK to a different value here.
index 405fb09bda94184de0876d46fb9ee3618d5bece8..a6d74467c9edb476ad1175e34670848f946528c8 100644 (file)
@@ -81,6 +81,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_POWERPC_SOCKET_H */
index 0c5105fbaaf335f32f3134ef0acc74bd853fbab6..92494494692eca965ee1d315d42a800e08c47605 100644 (file)
@@ -80,6 +80,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _ASM_SOCKET_H */
index b46c3fa0b2653ff93ce0af66eca6df2b2d3a1277..4e1d66c3ce71b0b89bc2acb86643b3cebd445a06 100644 (file)
@@ -70,7 +70,7 @@
 
 #define SO_SELECT_ERR_QUEUE    0x0029
 
-#define SO_LL                  0x0030
+#define SO_BUSY_POLL           0x0030
 
 /* Security levels - as per NRL IPv6 - don't actually do anything */
 #define SO_SECURITY_AUTHENTICATION             0x5001
index b21ace4fc9bab09ef3aa58170a0ac3e0d814dc3d..c114483010c13b70caf62b3edea8b46947ca17e8 100644 (file)
@@ -85,6 +85,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* _XTENSA_SOCKET_H */
index b918c73294265fdcf56737d20c6761cefd82874e..c6f838d922a51b3883f1dea9ba26f2e0a9c63c4b 100644 (file)
@@ -32,7 +32,6 @@
 #include <linux/clk.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
-#include <linux/pinctrl/consumer.h>
 
 #include <linux/can/dev.h>
 
@@ -114,7 +113,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
        struct c_can_priv *priv;
        const struct of_device_id *match;
        const struct platform_device_id *id;
-       struct pinctrl *pinctrl;
        struct resource *mem, *res;
        int irq;
        struct clk *clk;
@@ -131,11 +129,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
                id = platform_get_device_id(pdev);
        }
 
-       pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
-       if (IS_ERR(pinctrl))
-               dev_warn(&pdev->dev,
-                       "failed to configure pins from driver\n");
-
        /* get the appropriate clk */
        clk = clk_get(&pdev->dev, NULL);
        if (IS_ERR(clk)) {
index 42aa54af684271d1a69ffd1852f1b2222bfbcd6d..b710c6b2d65962db616017a6572cf75e425d69a1 100644 (file)
@@ -185,6 +185,8 @@ static int __init dummy_init_module(void)
 
        rtnl_lock();
        err = __rtnl_link_register(&dummy_link_ops);
+       if (err < 0)
+               goto out;
 
        for (i = 0; i < numdummies && !err; i++) {
                err = dummy_init_one();
@@ -192,6 +194,8 @@ static int __init dummy_init_module(void)
        }
        if (err < 0)
                __rtnl_link_unregister(&dummy_link_ops);
+
+out:
        rtnl_unlock();
 
        return err;
index 0e0b242a9dd4509a6c8c856f6f47e7a4d926f757..027398ebbba6aae4bfe946bd6d74bc002f671cab 100644 (file)
@@ -1245,6 +1245,8 @@ static int alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        SET_NETDEV_DEV(netdev, &pdev->dev);
        alx = netdev_priv(netdev);
+       spin_lock_init(&alx->hw.mdio_lock);
+       spin_lock_init(&alx->irq_lock);
        alx->dev = netdev;
        alx->hw.pdev = pdev;
        alx->msg_enable = NETIF_MSG_LINK | NETIF_MSG_HW | NETIF_MSG_IFUP |
@@ -1327,9 +1329,6 @@ static int alx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
        INIT_WORK(&alx->link_check_wk, alx_link_check);
        INIT_WORK(&alx->reset_wk, alx_reset);
-       spin_lock_init(&alx->hw.mdio_lock);
-       spin_lock_init(&alx->irq_lock);
-
        netif_carrier_off(netdev);
 
        err = register_netdev(netdev);
index 895f5377ad1ba2ad7819d162b8f1395d974111d7..6d1a62a84c9d04b3309354f241bcef9061098341 100644 (file)
@@ -1665,8 +1665,8 @@ check_sum:
        return 0;
 }
 
-static void atl1e_tx_map(struct atl1e_adapter *adapter,
-                     struct sk_buff *skb, struct atl1e_tpd_desc *tpd)
+static int atl1e_tx_map(struct atl1e_adapter *adapter,
+                       struct sk_buff *skb, struct atl1e_tpd_desc *tpd)
 {
        struct atl1e_tpd_desc *use_tpd = NULL;
        struct atl1e_tx_buffer *tx_buffer = NULL;
@@ -1677,6 +1677,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
        u16 nr_frags;
        u16 f;
        int segment;
+       int ring_start = adapter->tx_ring.next_to_use;
 
        nr_frags = skb_shinfo(skb)->nr_frags;
        segment = (tpd->word3 >> TPD_SEGMENT_EN_SHIFT) & TPD_SEGMENT_EN_MASK;
@@ -1689,6 +1690,9 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
                tx_buffer->length = map_len;
                tx_buffer->dma = pci_map_single(adapter->pdev,
                                        skb->data, hdr_len, PCI_DMA_TODEVICE);
+               if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma))
+                       return -ENOSPC;
+
                ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
                mapped_len += map_len;
                use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
@@ -1715,6 +1719,13 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
                tx_buffer->dma =
                        pci_map_single(adapter->pdev, skb->data + mapped_len,
                                        map_len, PCI_DMA_TODEVICE);
+
+               if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) {
+                       /* Reset the tx rings next pointer */
+                       adapter->tx_ring.next_to_use = ring_start;
+                       return -ENOSPC;
+               }
+
                ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
                mapped_len  += map_len;
                use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
@@ -1750,6 +1761,13 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
                                                          (i * MAX_TX_BUF_LEN),
                                                          tx_buffer->length,
                                                          DMA_TO_DEVICE);
+
+                       if (dma_mapping_error(&adapter->pdev->dev, tx_buffer->dma)) {
+                               /* Reset the ring next to use pointer */
+                               adapter->tx_ring.next_to_use = ring_start;
+                               return -ENOSPC;
+                       }
+
                        ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE);
                        use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
                        use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
@@ -1767,6 +1785,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
        /* The last buffer info contain the skb address,
           so it will be free after unmap */
        tx_buffer->skb = skb;
+       return 0;
 }
 
 static void atl1e_tx_queue(struct atl1e_adapter *adapter, u16 count,
@@ -1834,10 +1853,13 @@ static netdev_tx_t atl1e_xmit_frame(struct sk_buff *skb,
                return NETDEV_TX_OK;
        }
 
-       atl1e_tx_map(adapter, skb, tpd);
+       if (atl1e_tx_map(adapter, skb, tpd))
+               goto out;
+
        atl1e_tx_queue(adapter, tpd_req, tpd);
 
        netdev->trans_start = jiffies; /* NETIF_F_LLTX driver :( */
+out:
        spin_unlock_irqrestore(&adapter->tx_lock, flags);
        return NETDEV_TX_OK;
 }
index ec3aa1d451e8d4954ec09d1b303b30d46bf08b2d..ee350bde1818cc38c4a20a0db70a466bf158ee2e 100644 (file)
@@ -24,7 +24,7 @@
 #include <net/tcp.h>
 #include <net/ipv6.h>
 #include <net/ip6_checksum.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 #include <linux/prefetch.h>
 #include "bnx2x_cmn.h"
 #include "bnx2x_init.h"
@@ -990,7 +990,7 @@ reuse_rx:
                        __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
                                               le16_to_cpu(cqe_fp->vlan_tag));
 
-               skb_mark_ll(skb, &fp->napi);
+               skb_mark_napi_id(skb, &fp->napi);
 
                if (bnx2x_fp_ll_polling(fp))
                        netif_receive_skb(skb);
@@ -3543,9 +3543,9 @@ static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,
        /* outer IP header info */
        if (xmit_type & XMIT_CSUM_V4) {
                struct iphdr *iph = ip_hdr(skb);
-               u16 csum = (__force u16)(~iph->check) -
-                          (__force u16)iph->tot_len -
-                          (__force u16)iph->frag_off;
+               u32 csum = (__force u32)(~iph->check) -
+                          (__force u32)iph->tot_len -
+                          (__force u32)iph->frag_off;
 
                pbd2->fw_ip_csum_wo_len_flags_frag =
                        bswab16(csum_fold((__force __wsum)csum));
index 15a528bda87ccc60cb757e872e12eac296867681..e5da07858a2f0d5dca0747e1b7fe58992b799d5e 100644 (file)
@@ -12027,7 +12027,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {
 #endif
 
 #ifdef CONFIG_NET_LL_RX_POLL
-       .ndo_ll_poll            = bnx2x_low_latency_recv,
+       .ndo_busy_poll          = bnx2x_low_latency_recv,
 #endif
 };
 
index 3f1957158a3bc876839d0613f1cbb0e7079687a5..bb5d63fb2e6d7b9566dfcdd6bcc2de6bd831b8d9 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/of_net.h>
-#include <linux/pinctrl/consumer.h>
 
 #include "macb.h"
 
@@ -309,7 +308,6 @@ static int __init at91ether_probe(struct platform_device *pdev)
        struct resource *regs;
        struct net_device *dev;
        struct phy_device *phydev;
-       struct pinctrl *pinctrl;
        struct macb *lp;
        int res;
        u32 reg;
@@ -319,15 +317,6 @@ static int __init at91ether_probe(struct platform_device *pdev)
        if (!regs)
                return -ENOENT;
 
-       pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
-       if (IS_ERR(pinctrl)) {
-               res = PTR_ERR(pinctrl);
-               if (res == -EPROBE_DEFER)
-                       return res;
-
-               dev_warn(&pdev->dev, "No pinctrl provided\n");
-       }
-
        dev = alloc_etherdev(sizeof(struct macb));
        if (!dev)
                return -ENOMEM;
index fb098b46c6a634e9a1a401d055b0af9ba154bb61..7be725cdfea8d3b3c7f414a500dd83b965f24d99 100644 (file)
@@ -52,7 +52,7 @@
 #include <linux/dca.h>
 #endif
 
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #ifdef CONFIG_NET_LL_RX_POLL
 #define LL_EXTENDED_STATS
index 047ebaaf01413596bfc0c23363a43fea877ea955..bad8f14b194107b7d77ac5f89f194998c4c0f514 100644 (file)
@@ -1978,7 +1978,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
                }
 
 #endif /* IXGBE_FCOE */
-               skb_mark_ll(skb, &q_vector->napi);
+               skb_mark_napi_id(skb, &q_vector->napi);
                ixgbe_rx_skb(q_vector, skb);
 
                /* update budget accounting */
@@ -7228,7 +7228,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_poll_controller    = ixgbe_netpoll,
 #endif
 #ifdef CONFIG_NET_LL_RX_POLL
-       .ndo_ll_poll            = ixgbe_low_latency_recv,
+       .ndo_busy_poll          = ixgbe_low_latency_recv,
 #endif
 #ifdef IXGBE_FCOE
        .ndo_fcoe_ddp_setup = ixgbe_fcoe_ddp_get,
index caf2047705697f5e370407f46e5b521304ba83f4..5eac871399d8ecedf4fcffff06ed4372753df77f 100644 (file)
@@ -38,7 +38,7 @@
 #include <linux/slab.h>
 #include <linux/hash.h>
 #include <net/ip.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #include <linux/mlx4/driver.h>
 #include <linux/mlx4/device.h>
@@ -2141,7 +2141,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
        .ndo_rx_flow_steer      = mlx4_en_filter_rfs,
 #endif
 #ifdef CONFIG_NET_LL_RX_POLL
-       .ndo_ll_poll            = mlx4_en_low_latency_recv,
+       .ndo_busy_poll          = mlx4_en_low_latency_recv,
 #endif
 };
 
index 76997b93fdfebda261f26621b27b19e1f9e95feb..dec455c8f6274a9827f93bf038d8e12c58242765 100644 (file)
@@ -31,7 +31,7 @@
  *
  */
 
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 #include <linux/mlx4/cq.h>
 #include <linux/slab.h>
 #include <linux/mlx4/qp.h>
@@ -767,7 +767,7 @@ int mlx4_en_process_rx_cq(struct net_device *dev, struct mlx4_en_cq *cq, int bud
                                               timestamp);
                }
 
-               skb_mark_ll(skb, &cq->napi);
+               skb_mark_napi_id(skb, &cq->napi);
 
                /* Push it up the stack */
                netif_receive_skb(skb);
index 393f961a013cec14daf9c624021fdd60be23939d..4106a743ca74c16e0dcf02b1d9b9bc10b76e79a9 100644 (file)
@@ -46,6 +46,7 @@
 #define FIRMWARE_8105E_1       "rtl_nic/rtl8105e-1.fw"
 #define FIRMWARE_8402_1                "rtl_nic/rtl8402-1.fw"
 #define FIRMWARE_8411_1                "rtl_nic/rtl8411-1.fw"
+#define FIRMWARE_8411_2                "rtl_nic/rtl8411-2.fw"
 #define FIRMWARE_8106E_1       "rtl_nic/rtl8106e-1.fw"
 #define FIRMWARE_8106E_2       "rtl_nic/rtl8106e-2.fw"
 #define FIRMWARE_8168G_2       "rtl_nic/rtl8168g-2.fw"
@@ -144,6 +145,7 @@ enum mac_version {
        RTL_GIGA_MAC_VER_41,
        RTL_GIGA_MAC_VER_42,
        RTL_GIGA_MAC_VER_43,
+       RTL_GIGA_MAC_VER_44,
        RTL_GIGA_MAC_NONE   = 0xff,
 };
 
@@ -276,6 +278,9 @@ static const struct {
        [RTL_GIGA_MAC_VER_43] =
                _R("RTL8106e",          RTL_TD_1, FIRMWARE_8106E_2,
                                                        JUMBO_1K, true),
+       [RTL_GIGA_MAC_VER_44] =
+               _R("RTL8411",           RTL_TD_1, FIRMWARE_8411_2,
+                                                       JUMBO_9K, false),
 };
 #undef _R
 
@@ -394,6 +399,7 @@ enum rtl8168_8101_registers {
 #define CSIAR_FUNC_CARD                        0x00000000
 #define CSIAR_FUNC_SDIO                        0x00010000
 #define CSIAR_FUNC_NIC                 0x00020000
+#define CSIAR_FUNC_NIC2                        0x00010000
        PMCH                    = 0x6f,
        EPHYAR                  = 0x80,
 #define        EPHYAR_FLAG                     0x80000000
@@ -826,6 +832,7 @@ MODULE_FIRMWARE(FIRMWARE_8168F_1);
 MODULE_FIRMWARE(FIRMWARE_8168F_2);
 MODULE_FIRMWARE(FIRMWARE_8402_1);
 MODULE_FIRMWARE(FIRMWARE_8411_1);
+MODULE_FIRMWARE(FIRMWARE_8411_2);
 MODULE_FIRMWARE(FIRMWARE_8106E_1);
 MODULE_FIRMWARE(FIRMWARE_8106E_2);
 MODULE_FIRMWARE(FIRMWARE_8168G_2);
@@ -2051,6 +2058,7 @@ static void rtl8169_get_mac_version(struct rtl8169_private *tp,
                int mac_version;
        } mac_info[] = {
                /* 8168G family. */
+               { 0x7cf00000, 0x5c800000,       RTL_GIGA_MAC_VER_44 },
                { 0x7cf00000, 0x50900000,       RTL_GIGA_MAC_VER_42 },
                { 0x7cf00000, 0x4c100000,       RTL_GIGA_MAC_VER_41 },
                { 0x7cf00000, 0x4c000000,       RTL_GIGA_MAC_VER_40 },
@@ -3651,6 +3659,7 @@ static void rtl_hw_phy_config(struct net_device *dev)
                break;
        case RTL_GIGA_MAC_VER_42:
        case RTL_GIGA_MAC_VER_43:
+       case RTL_GIGA_MAC_VER_44:
                rtl8168g_2_hw_phy_config(tp);
                break;
 
@@ -3863,6 +3872,7 @@ static void rtl_init_mdio_ops(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_41:
        case RTL_GIGA_MAC_VER_42:
        case RTL_GIGA_MAC_VER_43:
+       case RTL_GIGA_MAC_VER_44:
                ops->write      = r8168g_mdio_write;
                ops->read       = r8168g_mdio_read;
                break;
@@ -3916,6 +3926,7 @@ static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_41:
        case RTL_GIGA_MAC_VER_42:
        case RTL_GIGA_MAC_VER_43:
+       case RTL_GIGA_MAC_VER_44:
                RTL_W32(RxConfig, RTL_R32(RxConfig) |
                        AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
                break;
@@ -4178,6 +4189,7 @@ static void rtl_init_pll_power_ops(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_40:
        case RTL_GIGA_MAC_VER_41:
        case RTL_GIGA_MAC_VER_42:
+       case RTL_GIGA_MAC_VER_44:
                ops->down       = r8168_pll_power_down;
                ops->up         = r8168_pll_power_up;
                break;
@@ -4224,6 +4236,7 @@ static void rtl_init_rxcfg(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_41:
        case RTL_GIGA_MAC_VER_42:
        case RTL_GIGA_MAC_VER_43:
+       case RTL_GIGA_MAC_VER_44:
                RTL_W32(RxConfig, RX128_INT_EN | RX_DMA_BURST | RX_EARLY_OFF);
                break;
        default:
@@ -4384,6 +4397,7 @@ static void rtl_init_jumbo_ops(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_41:
        case RTL_GIGA_MAC_VER_42:
        case RTL_GIGA_MAC_VER_43:
+       case RTL_GIGA_MAC_VER_44:
        default:
                ops->disable    = NULL;
                ops->enable     = NULL;
@@ -4493,6 +4507,7 @@ static void rtl8169_hw_reset(struct rtl8169_private *tp)
                   tp->mac_version == RTL_GIGA_MAC_VER_41 ||
                   tp->mac_version == RTL_GIGA_MAC_VER_42 ||
                   tp->mac_version == RTL_GIGA_MAC_VER_43 ||
+                  tp->mac_version == RTL_GIGA_MAC_VER_44 ||
                   tp->mac_version == RTL_GIGA_MAC_VER_38) {
                RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
                rtl_udelay_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
@@ -4782,6 +4797,29 @@ static u32 r8402_csi_read(struct rtl8169_private *tp, int addr)
                RTL_R32(CSIDR) : ~0;
 }
 
+static void r8411_csi_write(struct rtl8169_private *tp, int addr, int value)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       RTL_W32(CSIDR, value);
+       RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
+               CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT |
+               CSIAR_FUNC_NIC2);
+
+       rtl_udelay_loop_wait_low(tp, &rtl_csiar_cond, 10, 100);
+}
+
+static u32 r8411_csi_read(struct rtl8169_private *tp, int addr)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+
+       RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) | CSIAR_FUNC_NIC2 |
+               CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
+
+       return rtl_udelay_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
+               RTL_R32(CSIDR) : ~0;
+}
+
 static void rtl_init_csi_ops(struct rtl8169_private *tp)
 {
        struct csi_ops *ops = &tp->csi_ops;
@@ -4811,6 +4849,11 @@ static void rtl_init_csi_ops(struct rtl8169_private *tp)
                ops->read       = r8402_csi_read;
                break;
 
+       case RTL_GIGA_MAC_VER_44:
+               ops->write      = r8411_csi_write;
+               ops->read       = r8411_csi_read;
+               break;
+
        default:
                ops->write      = r8169_csi_write;
                ops->read       = r8169_csi_read;
@@ -5255,6 +5298,25 @@ static void rtl_hw_start_8168g_2(struct rtl8169_private *tp)
        rtl_ephy_init(tp, e_info_8168g_2, ARRAY_SIZE(e_info_8168g_2));
 }
 
+static void rtl_hw_start_8411_2(struct rtl8169_private *tp)
+{
+       void __iomem *ioaddr = tp->mmio_addr;
+       static const struct ephy_info e_info_8411_2[] = {
+               { 0x00, 0x0000, 0x0008 },
+               { 0x0c, 0x3df0, 0x0200 },
+               { 0x0f, 0xffff, 0x5200 },
+               { 0x19, 0x0020, 0x0000 },
+               { 0x1e, 0x0000, 0x2000 }
+       };
+
+       rtl_hw_start_8168g_1(tp);
+
+       /* disable aspm and clock request before access ephy */
+       RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
+       RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+       rtl_ephy_init(tp, e_info_8411_2, ARRAY_SIZE(e_info_8411_2));
+}
+
 static void rtl_hw_start_8168(struct net_device *dev)
 {
        struct rtl8169_private *tp = netdev_priv(dev);
@@ -5361,6 +5423,10 @@ static void rtl_hw_start_8168(struct net_device *dev)
                rtl_hw_start_8168g_2(tp);
                break;
 
+       case RTL_GIGA_MAC_VER_44:
+               rtl_hw_start_8411_2(tp);
+               break;
+
        default:
                printk(KERN_ERR PFX "%s: unknown chipset (mac_version = %d).\n",
                        dev->name, tp->mac_version);
@@ -6877,6 +6943,7 @@ static void rtl_hw_initialize(struct rtl8169_private *tp)
        case RTL_GIGA_MAC_VER_41:
        case RTL_GIGA_MAC_VER_42:
        case RTL_GIGA_MAC_VER_43:
+       case RTL_GIGA_MAC_VER_44:
                rtl_hw_init_8168g(tp);
                break;
 
index 544514e66187e3300320114c7e35826fbc8dab67..19a8a045e07728868cbe3a6e08b841865068e3e3 100644 (file)
@@ -4,6 +4,7 @@
 
 config SH_ETH
        tristate "Renesas SuperH Ethernet support"
+       depends on HAS_DMA
        select CRC32
        select MII
        select MDIO_BITBANG
index ca98acabf1b43b29b6f27c547fbbb0c5277b2e8a..b75eb9e0e867a88ac6531c2cd35f419d8553e88a 100644 (file)
@@ -1171,7 +1171,11 @@ static void alloc_rbufs(struct net_device *dev)
                rp->rx_skbuff_dma[i] =
                        pci_map_single(rp->pdev, skb->data, rp->rx_buf_sz,
                                       PCI_DMA_FROMDEVICE);
-
+               if (dma_mapping_error(&rp->pdev->dev, rp->rx_skbuff_dma[i])) {
+                       rp->rx_skbuff_dma[i] = 0;
+                       dev_kfree_skb(skb);
+                       break;
+               }
                rp->rx_ring[i].addr = cpu_to_le32(rp->rx_skbuff_dma[i]);
                rp->rx_ring[i].rx_status = cpu_to_le32(DescOwn);
        }
@@ -1687,6 +1691,12 @@ static netdev_tx_t rhine_start_tx(struct sk_buff *skb,
                rp->tx_skbuff_dma[entry] =
                        pci_map_single(rp->pdev, skb->data, skb->len,
                                       PCI_DMA_TODEVICE);
+               if (dma_mapping_error(&rp->pdev->dev, rp->tx_skbuff_dma[entry])) {
+                       dev_kfree_skb(skb);
+                       rp->tx_skbuff_dma[entry] = 0;
+                       dev->stats.tx_dropped++;
+                       return NETDEV_TX_OK;
+               }
                rp->tx_ring[entry].addr = cpu_to_le32(rp->tx_skbuff_dma[entry]);
        }
 
@@ -1961,6 +1971,11 @@ static int rhine_rx(struct net_device *dev, int limit)
                                pci_map_single(rp->pdev, skb->data,
                                               rp->rx_buf_sz,
                                               PCI_DMA_FROMDEVICE);
+                       if (dma_mapping_error(&rp->pdev->dev, rp->rx_skbuff_dma[entry])) {
+                               dev_kfree_skb(skb);
+                               rp->rx_skbuff_dma[entry] = 0;
+                               break;
+                       }
                        rp->rx_ring[entry].addr = cpu_to_le32(rp->rx_skbuff_dma[entry]);
                }
                rp->rx_ring[entry].rx_status = cpu_to_le32(DescOwn);
index ede3ce4912f92162b9411167fb8cab5ea248c479..42e6deee6db55ed607170109438960523d6b9b8e 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/spi/spi.h>
 #include <linux/interrupt.h>
 #include <linux/module.h>
-#include <linux/pinctrl/consumer.h>
 #include <net/wpan-phy.h>
 #include <net/mac802154.h>
 #include <net/ieee802154.h>
@@ -627,7 +626,6 @@ static int mrf24j40_probe(struct spi_device *spi)
        int ret = -ENOMEM;
        u8 val;
        struct mrf24j40 *devrec;
-       struct pinctrl *pinctrl;
 
        printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq);
 
@@ -638,11 +636,6 @@ static int mrf24j40_probe(struct spi_device *spi)
        if (!devrec->buf)
                goto err_buf;
 
-       pinctrl = devm_pinctrl_get_select_default(&spi->dev);
-       if (IS_ERR(pinctrl))
-               dev_warn(&spi->dev,
-                       "pinctrl pins are not configured from the driver");
-
        spi->mode = SPI_MODE_0; /* TODO: Is this appropriate for right here? */
        if (spi->max_speed_hz > MAX_SPI_SPEED_HZ)
                spi->max_speed_hz = MAX_SPI_SPEED_HZ;
index dc9f6a45515dacaa76fabb419ed82daa89d9a3d3..a3bed28197d29bf9722b6c586f311827d357b501 100644 (file)
@@ -291,11 +291,17 @@ static int __init ifb_init_module(void)
 
        rtnl_lock();
        err = __rtnl_link_register(&ifb_link_ops);
+       if (err < 0)
+               goto out;
 
-       for (i = 0; i < numifbs && !err; i++)
+       for (i = 0; i < numifbs && !err; i++) {
                err = ifb_init_one(i);
+               cond_resched();
+       }
        if (err)
                __rtnl_link_unregister(&ifb_link_ops);
+
+out:
        rtnl_unlock();
 
        return err;
index f2c4a3b218fc133b97e0697e1202e7a17017f7f3..876c72246ae92aa30efe1291bf90a17ed042555a 100644 (file)
@@ -712,6 +712,7 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
        int vnet_hdr_len = 0;
        int copylen = 0;
        bool zerocopy = false;
+       size_t linear;
 
        if (q->flags & IFF_VNET_HDR) {
                vnet_hdr_len = q->vnet_hdr_sz;
@@ -766,11 +767,14 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
                        copylen = vnet_hdr.hdr_len;
                if (!copylen)
                        copylen = GOODCOPY_LEN;
-       } else
+               linear = copylen;
+       } else {
                copylen = len;
+               linear = vnet_hdr.hdr_len;
+       }
 
        skb = macvtap_alloc_skb(&q->sk, NET_IP_ALIGN, copylen,
-                               vnet_hdr.hdr_len, noblock, &err);
+                               linear, noblock, &err);
        if (!skb)
                goto err;
 
index 1f7091b3c27ca5e972425602f7e56ce45c5d92a2..ac22283aaf23213ab9bf9d931f76df602ccea09d 100644 (file)
@@ -217,6 +217,7 @@ module_exit(atheros_exit);
 
 static struct mdio_device_id __maybe_unused atheros_tbl[] = {
        { 0x004dd076, 0xffffffef },
+       { 0x004dd074, 0xffffffef },
        { 0x004dd072, 0xffffffef },
        { }
 };
index 7eab5fcd064fa5bacc9ddc05557fc032bad327c0..5cdcf92eb310391c1684374d0c41a3147a55f762 100644 (file)
@@ -1042,7 +1042,7 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
 {
        struct tun_pi pi = { 0, cpu_to_be16(ETH_P_IP) };
        struct sk_buff *skb;
-       size_t len = total_len, align = NET_SKB_PAD;
+       size_t len = total_len, align = NET_SKB_PAD, linear;
        struct virtio_net_hdr gso = { 0 };
        int offset = 0;
        int copylen;
@@ -1106,10 +1106,13 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
                        copylen = gso.hdr_len;
                if (!copylen)
                        copylen = GOODCOPY_LEN;
-       } else
+               linear = copylen;
+       } else {
                copylen = len;
+               linear = gso.hdr_len;
+       }
 
-       skb = tun_alloc_skb(tfile, align, copylen, gso.hdr_len, noblock);
+       skb = tun_alloc_skb(tfile, align, copylen, linear, noblock);
        if (IS_ERR(skb)) {
                if (PTR_ERR(skb) != -EAGAIN)
                        tun->dev->stats.rx_dropped++;
index 9ab5c9d4b45a508d38f57301ffa609e527ddb84e..e8171784529d5de3dff43f9ce34fafa0a3235409 100644 (file)
@@ -11,7 +11,7 @@ obj-$(CONFIG_USB_HSO)         += hso.o
 obj-$(CONFIG_USB_NET_AX8817X)  += asix.o
 asix-y := asix_devices.o asix_common.o ax88172a.o
 obj-$(CONFIG_USB_NET_AX88179_178A)      += ax88179_178a.o
-obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o
+obj-$(CONFIG_USB_NET_CDCETHER) += cdc_ether.o r815x.o
 obj-$(CONFIG_USB_NET_CDC_EEM)  += cdc_eem.o
 obj-$(CONFIG_USB_NET_DM9601)   += dm9601.o
 obj-$(CONFIG_USB_NET_SMSC75XX) += smsc75xx.o
index 4393f148312629ba5b93426d4e4e55d7ddd221a0..03ad4dc293aa2a468f8a93f0a0d045623507a9a0 100644 (file)
@@ -646,13 +646,18 @@ static const struct usb_device_id products [] = {
 },
 
 /* Realtek RTL8152 Based USB 2.0 Ethernet Adapters */
-#if defined(CONFIG_USB_RTL8152) || defined(CONFIG_USB_RTL8152_MODULE)
 {
        USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
                        USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
        .driver_info = 0,
 },
-#endif
+
+/* Realtek RTL8153 Based USB 3.0 Ethernet Adapters */
+{
+       USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+       .driver_info = 0,
+},
 
 /*
  * WHITELIST!!!
index d02bac82fc5759df00a8bfab5907e29f92be722c..ee13f9eb740c0bf18b793b308194675e9967a317 100644 (file)
@@ -934,7 +934,8 @@ static netdev_tx_t rtl8152_start_xmit(struct sk_buff *skb,
        struct r8152 *tp = netdev_priv(netdev);
        struct net_device_stats *stats = rtl8152_get_stats(netdev);
        struct tx_desc *tx_desc;
-       int len, res;
+       unsigned int len;
+       int res;
 
        netif_stop_queue(netdev);
        len = skb->len;
diff --git a/drivers/net/usb/r815x.c b/drivers/net/usb/r815x.c
new file mode 100644 (file)
index 0000000..8523922
--- /dev/null
@@ -0,0 +1,234 @@
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/mii.h>
+#include <linux/usb.h>
+#include <linux/usb/cdc.h>
+#include <linux/usb/usbnet.h>
+
+#define RTL815x_REQT_READ      0xc0
+#define RTL815x_REQT_WRITE     0x40
+#define RTL815x_REQ_GET_REGS   0x05
+#define RTL815x_REQ_SET_REGS   0x05
+
+#define MCU_TYPE_PLA           0x0100
+#define OCP_BASE               0xe86c
+#define BASE_MII               0xa400
+
+#define BYTE_EN_DWORD          0xff
+#define BYTE_EN_WORD           0x33
+#define BYTE_EN_BYTE           0x11
+
+#define R815x_PHY_ID           32
+#define REALTEK_VENDOR_ID      0x0bda
+
+
+static int pla_read_word(struct usb_device *udev, u16 index)
+{
+       int data, ret;
+       u8 shift = index & 2;
+       __le32 ocp_data;
+
+       index &= ~3;
+
+       ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+                             RTL815x_REQ_GET_REGS, RTL815x_REQT_READ,
+                             index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data),
+                             500);
+       if (ret < 0)
+               return ret;
+
+       data = __le32_to_cpu(ocp_data);
+       data >>= (shift * 8);
+       data &= 0xffff;
+
+       return data;
+}
+
+static int pla_write_word(struct usb_device *udev, u16 index, u32 data)
+{
+       __le32 ocp_data;
+       u32 mask = 0xffff;
+       u16 byen = BYTE_EN_WORD;
+       u8 shift = index & 2;
+       int ret;
+
+       data &= mask;
+
+       if (shift) {
+               byen <<= shift;
+               mask <<= (shift * 8);
+               data <<= (shift * 8);
+               index &= ~3;
+       }
+
+       ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+                             RTL815x_REQ_GET_REGS, RTL815x_REQT_READ,
+                             index, MCU_TYPE_PLA, &ocp_data, sizeof(ocp_data),
+                             500);
+       if (ret < 0)
+               return ret;
+
+       data |= __le32_to_cpu(ocp_data) & ~mask;
+       ocp_data = __cpu_to_le32(data);
+
+       ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
+                             RTL815x_REQ_SET_REGS, RTL815x_REQT_WRITE,
+                             index, MCU_TYPE_PLA | byen, &ocp_data,
+                             sizeof(ocp_data), 500);
+
+       return ret;
+}
+
+static int ocp_reg_read(struct usbnet *dev, u16 addr)
+{
+       u16 ocp_base, ocp_index;
+       int ret;
+
+       ocp_base = addr & 0xf000;
+       ret = pla_write_word(dev->udev, OCP_BASE, ocp_base);
+       if (ret < 0)
+               goto out;
+
+       ocp_index = (addr & 0x0fff) | 0xb000;
+       ret = pla_read_word(dev->udev, ocp_index);
+
+out:
+       return ret;
+}
+
+static int ocp_reg_write(struct usbnet *dev, u16 addr, u16 data)
+{
+       u16 ocp_base, ocp_index;
+       int ret;
+
+       ocp_base = addr & 0xf000;
+       ret = pla_write_word(dev->udev, OCP_BASE, ocp_base);
+       if (ret < 0)
+               goto out1;
+
+       ocp_index = (addr & 0x0fff) | 0xb000;
+       ret = pla_write_word(dev->udev, ocp_index, data);
+
+out1:
+       return ret;
+}
+
+static int r815x_mdio_read(struct net_device *netdev, int phy_id, int reg)
+{
+       struct usbnet *dev = netdev_priv(netdev);
+
+       if (phy_id != R815x_PHY_ID)
+               return -EINVAL;
+
+       return ocp_reg_read(dev, BASE_MII + reg * 2);
+}
+
+static
+void r815x_mdio_write(struct net_device *netdev, int phy_id, int reg, int val)
+{
+       struct usbnet *dev = netdev_priv(netdev);
+
+       if (phy_id != R815x_PHY_ID)
+               return;
+
+       ocp_reg_write(dev, BASE_MII + reg * 2, val);
+}
+
+static int r8153_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+       int status;
+
+       status = usbnet_cdc_bind(dev, intf);
+       if (status < 0)
+               return status;
+
+       dev->mii.dev = dev->net;
+       dev->mii.mdio_read = r815x_mdio_read;
+       dev->mii.mdio_write = r815x_mdio_write;
+       dev->mii.phy_id_mask = 0x3f;
+       dev->mii.reg_num_mask = 0x1f;
+       dev->mii.phy_id = R815x_PHY_ID;
+       dev->mii.supports_gmii = 1;
+
+       return 0;
+}
+
+static int r8152_bind(struct usbnet *dev, struct usb_interface *intf)
+{
+       int status;
+
+       status = usbnet_cdc_bind(dev, intf);
+       if (status < 0)
+               return status;
+
+       dev->mii.dev = dev->net;
+       dev->mii.mdio_read = r815x_mdio_read;
+       dev->mii.mdio_write = r815x_mdio_write;
+       dev->mii.phy_id_mask = 0x3f;
+       dev->mii.reg_num_mask = 0x1f;
+       dev->mii.phy_id = R815x_PHY_ID;
+       dev->mii.supports_gmii = 0;
+
+       return 0;
+}
+
+static const struct driver_info r8152_info = {
+       .description =  "RTL8152 ECM Device",
+       .flags =        FLAG_ETHER | FLAG_POINTTOPOINT,
+       .bind =         r8152_bind,
+       .unbind =       usbnet_cdc_unbind,
+       .status =       usbnet_cdc_status,
+       .manage_power = usbnet_manage_power,
+};
+
+static const struct driver_info r8153_info = {
+       .description =  "RTL8153 ECM Device",
+       .flags =        FLAG_ETHER | FLAG_POINTTOPOINT,
+       .bind =         r8153_bind,
+       .unbind =       usbnet_cdc_unbind,
+       .status =       usbnet_cdc_status,
+       .manage_power = usbnet_manage_power,
+};
+
+static const struct usb_device_id products[] = {
+{
+       USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8152, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+#if defined(CONFIG_USB_RTL8152) || defined(CONFIG_USB_RTL8152_MODULE)
+       .driver_info = 0,
+#else
+       .driver_info = (unsigned long) &r8152_info,
+#endif
+},
+
+{
+       USB_DEVICE_AND_INTERFACE_INFO(REALTEK_VENDOR_ID, 0x8153, USB_CLASS_COMM,
+                       USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
+#if defined(CONFIG_USB_RTL8153) || defined(CONFIG_USB_RTL8153_MODULE)
+       .driver_info = 0,
+#else
+       .driver_info = (unsigned long) &r8153_info,
+#endif
+},
+
+       { },            /* END */
+};
+MODULE_DEVICE_TABLE(usb, products);
+
+static struct usb_driver r815x_driver = {
+       .name =         "r815x",
+       .id_table =     products,
+       .probe =        usbnet_probe,
+       .disconnect =   usbnet_disconnect,
+       .suspend =      usbnet_suspend,
+       .resume =       usbnet_resume,
+       .reset_resume = usbnet_resume,
+       .supports_autosuspend = 1,
+       .disable_hub_initiated_lpm = 1,
+};
+
+module_usb_driver(r815x_driver);
+
+MODULE_AUTHOR("Hayes Wang");
+MODULE_DESCRIPTION("Realtek USB ECM device");
+MODULE_LICENSE("GPL");
index 227b54a1f88ac6fd5b25005816b72b2a005e6a1e..0ba1e7edbb1b443d8fe34a685baf4fe934c91175 100644 (file)
@@ -1916,9 +1916,9 @@ late_initcall(vxlan_init_module);
 
 static void __exit vxlan_cleanup_module(void)
 {
-       unregister_pernet_device(&vxlan_net_ops);
        rtnl_link_unregister(&vxlan_link_ops);
        destroy_workqueue(vxlan_wq);
+       unregister_pernet_device(&vxlan_net_ops);
        rcu_barrier();
 }
 module_exit(vxlan_cleanup_module);
index f9f49c40cfd48b99442041f8b6f2e82ecd2d0101..35d4adc749d9616f4bb2a7cd6d952eb18b5579b4 100644 (file)
@@ -28,7 +28,7 @@
 #include <linux/hrtimer.h>
 #include <linux/sched/rt.h>
 #include <linux/freezer.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #include <asm/uaccess.h>
 
index bb82871b8494f4369c5fe0c65392f16bba1096be..0741a1e919a542c53e50003560d01ed06322e658 100644 (file)
@@ -974,7 +974,7 @@ struct net_device_ops {
        void                    (*ndo_netpoll_cleanup)(struct net_device *dev);
 #endif
 #ifdef CONFIG_NET_LL_RX_POLL
-       int                     (*ndo_ll_poll)(struct napi_struct *dev);
+       int                     (*ndo_busy_poll)(struct napi_struct *dev);
 #endif
        int                     (*ndo_set_vf_mac)(struct net_device *dev,
                                                  int queue, u8 *mac);
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
new file mode 100644 (file)
index 0000000..a14339c
--- /dev/null
@@ -0,0 +1,185 @@
+/*
+ * net busy poll support
+ * Copyright(c) 2013 Intel Corporation.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Author: Eliezer Tamir
+ *
+ * Contact Information:
+ * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
+ */
+
+#ifndef _LINUX_NET_BUSY_POLL_H
+#define _LINUX_NET_BUSY_POLL_H
+
+#include <linux/netdevice.h>
+#include <net/ip.h>
+
+#ifdef CONFIG_NET_LL_RX_POLL
+
+struct napi_struct;
+extern unsigned int sysctl_net_busy_read __read_mostly;
+extern unsigned int sysctl_net_busy_poll __read_mostly;
+
+/* return values from ndo_ll_poll */
+#define LL_FLUSH_FAILED                -1
+#define LL_FLUSH_BUSY          -2
+
+static inline bool net_busy_loop_on(void)
+{
+       return sysctl_net_busy_poll;
+}
+
+/* a wrapper to make debug_smp_processor_id() happy
+ * we can use sched_clock() because we don't care much about precision
+ * we only care that the average is bounded
+ */
+#ifdef CONFIG_DEBUG_PREEMPT
+static inline u64 busy_loop_us_clock(void)
+{
+       u64 rc;
+
+       preempt_disable_notrace();
+       rc = sched_clock();
+       preempt_enable_no_resched_notrace();
+
+       return rc >> 10;
+}
+#else /* CONFIG_DEBUG_PREEMPT */
+static inline u64 busy_loop_us_clock(void)
+{
+       return sched_clock() >> 10;
+}
+#endif /* CONFIG_DEBUG_PREEMPT */
+
+static inline unsigned long sk_busy_loop_end_time(struct sock *sk)
+{
+       return busy_loop_us_clock() + ACCESS_ONCE(sk->sk_ll_usec);
+}
+
+/* in poll/select we use the global sysctl_net_ll_poll value */
+static inline unsigned long busy_loop_end_time(void)
+{
+       return busy_loop_us_clock() + ACCESS_ONCE(sysctl_net_busy_poll);
+}
+
+static inline bool sk_can_busy_loop(struct sock *sk)
+{
+       return sk->sk_ll_usec && sk->sk_napi_id &&
+              !need_resched() && !signal_pending(current);
+}
+
+
+static inline bool busy_loop_timeout(unsigned long end_time)
+{
+       unsigned long now = busy_loop_us_clock();
+
+       return time_after(now, end_time);
+}
+
+/* when used in sock_poll() nonblock is known at compile time to be true
+ * so the loop and end_time will be optimized out
+ */
+static inline bool sk_busy_loop(struct sock *sk, int nonblock)
+{
+       unsigned long end_time = !nonblock ? sk_busy_loop_end_time(sk) : 0;
+       const struct net_device_ops *ops;
+       struct napi_struct *napi;
+       int rc = false;
+
+       /*
+        * rcu read lock for napi hash
+        * bh so we don't race with net_rx_action
+        */
+       rcu_read_lock_bh();
+
+       napi = napi_by_id(sk->sk_napi_id);
+       if (!napi)
+               goto out;
+
+       ops = napi->dev->netdev_ops;
+       if (!ops->ndo_busy_poll)
+               goto out;
+
+       do {
+               rc = ops->ndo_busy_poll(napi);
+
+               if (rc == LL_FLUSH_FAILED)
+                       break; /* permanent failure */
+
+               if (rc > 0)
+                       /* local bh are disabled so it is ok to use _BH */
+                       NET_ADD_STATS_BH(sock_net(sk),
+                                        LINUX_MIB_LOWLATENCYRXPACKETS, rc);
+
+       } while (!nonblock && skb_queue_empty(&sk->sk_receive_queue) &&
+                !need_resched() && !busy_loop_timeout(end_time));
+
+       rc = !skb_queue_empty(&sk->sk_receive_queue);
+out:
+       rcu_read_unlock_bh();
+       return rc;
+}
+
+/* used in the NIC receive handler to mark the skb */
+static inline void skb_mark_napi_id(struct sk_buff *skb,
+                                   struct napi_struct *napi)
+{
+       skb->napi_id = napi->napi_id;
+}
+
+/* used in the protocol hanlder to propagate the napi_id to the socket */
+static inline void sk_mark_napi_id(struct sock *sk, struct sk_buff *skb)
+{
+       sk->sk_napi_id = skb->napi_id;
+}
+
+#else /* CONFIG_NET_LL_RX_POLL */
+static inline unsigned long net_busy_loop_on(void)
+{
+       return 0;
+}
+
+static inline unsigned long busy_loop_end_time(void)
+{
+       return 0;
+}
+
+static inline bool sk_can_busy_loop(struct sock *sk)
+{
+       return false;
+}
+
+static inline bool sk_busy_poll(struct sock *sk, int nonblock)
+{
+       return false;
+}
+
+static inline void skb_mark_napi_id(struct sk_buff *skb,
+                                   struct napi_struct *napi)
+{
+}
+
+static inline void sk_mark_napi_id(struct sock *sk, struct sk_buff *skb)
+{
+}
+
+static inline bool busy_loop_timeout(unsigned long end_time)
+{
+       return true;
+}
+
+#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* _LINUX_NET_BUSY_POLL_H */
diff --git a/include/net/ll_poll.h b/include/net/ll_poll.h
deleted file mode 100644 (file)
index 76f0340..0000000
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Low Latency Sockets
- * Copyright(c) 2013 Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Author: Eliezer Tamir
- *
- * Contact Information:
- * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
- */
-
-#ifndef _LINUX_NET_LL_POLL_H
-#define _LINUX_NET_LL_POLL_H
-
-#include <linux/netdevice.h>
-#include <net/ip.h>
-
-#ifdef CONFIG_NET_LL_RX_POLL
-
-struct napi_struct;
-extern unsigned int sysctl_net_ll_read __read_mostly;
-extern unsigned int sysctl_net_ll_poll __read_mostly;
-
-/* return values from ndo_ll_poll */
-#define LL_FLUSH_FAILED                -1
-#define LL_FLUSH_BUSY          -2
-
-static inline bool net_busy_loop_on(void)
-{
-       return sysctl_net_ll_poll;
-}
-
-/* a wrapper to make debug_smp_processor_id() happy
- * we can use sched_clock() because we don't care much about precision
- * we only care that the average is bounded
- */
-#ifdef CONFIG_DEBUG_PREEMPT
-static inline u64 busy_loop_us_clock(void)
-{
-       u64 rc;
-
-       preempt_disable_notrace();
-       rc = sched_clock();
-       preempt_enable_no_resched_notrace();
-
-       return rc >> 10;
-}
-#else /* CONFIG_DEBUG_PREEMPT */
-static inline u64 busy_loop_us_clock(void)
-{
-       return sched_clock() >> 10;
-}
-#endif /* CONFIG_DEBUG_PREEMPT */
-
-static inline unsigned long sk_busy_loop_end_time(struct sock *sk)
-{
-       return busy_loop_us_clock() + ACCESS_ONCE(sk->sk_ll_usec);
-}
-
-/* in poll/select we use the global sysctl_net_ll_poll value */
-static inline unsigned long busy_loop_end_time(void)
-{
-       return busy_loop_us_clock() + ACCESS_ONCE(sysctl_net_ll_poll);
-}
-
-static inline bool sk_can_busy_loop(struct sock *sk)
-{
-       return sk->sk_ll_usec && sk->sk_napi_id &&
-              !need_resched() && !signal_pending(current);
-}
-
-
-static inline bool busy_loop_timeout(unsigned long end_time)
-{
-       unsigned long now = busy_loop_us_clock();
-
-       return time_after(now, end_time);
-}
-
-/* when used in sock_poll() nonblock is known at compile time to be true
- * so the loop and end_time will be optimized out
- */
-static inline bool sk_busy_loop(struct sock *sk, int nonblock)
-{
-       unsigned long end_time = !nonblock ? sk_busy_loop_end_time(sk) : 0;
-       const struct net_device_ops *ops;
-       struct napi_struct *napi;
-       int rc = false;
-
-       /*
-        * rcu read lock for napi hash
-        * bh so we don't race with net_rx_action
-        */
-       rcu_read_lock_bh();
-
-       napi = napi_by_id(sk->sk_napi_id);
-       if (!napi)
-               goto out;
-
-       ops = napi->dev->netdev_ops;
-       if (!ops->ndo_ll_poll)
-               goto out;
-
-       do {
-               rc = ops->ndo_ll_poll(napi);
-
-               if (rc == LL_FLUSH_FAILED)
-                       break; /* permanent failure */
-
-               if (rc > 0)
-                       /* local bh are disabled so it is ok to use _BH */
-                       NET_ADD_STATS_BH(sock_net(sk),
-                                        LINUX_MIB_LOWLATENCYRXPACKETS, rc);
-
-       } while (!nonblock && skb_queue_empty(&sk->sk_receive_queue) &&
-                !need_resched() && !busy_loop_timeout(end_time));
-
-       rc = !skb_queue_empty(&sk->sk_receive_queue);
-out:
-       rcu_read_unlock_bh();
-       return rc;
-}
-
-/* used in the NIC receive handler to mark the skb */
-static inline void skb_mark_ll(struct sk_buff *skb, struct napi_struct *napi)
-{
-       skb->napi_id = napi->napi_id;
-}
-
-/* used in the protocol hanlder to propagate the napi_id to the socket */
-static inline void sk_mark_ll(struct sock *sk, struct sk_buff *skb)
-{
-       sk->sk_napi_id = skb->napi_id;
-}
-
-#else /* CONFIG_NET_LL_RX_POLL */
-static inline unsigned long net_busy_loop_on(void)
-{
-       return 0;
-}
-
-static inline unsigned long busy_loop_end_time(void)
-{
-       return 0;
-}
-
-static inline bool sk_can_busy_loop(struct sock *sk)
-{
-       return false;
-}
-
-static inline bool sk_busy_poll(struct sock *sk, int nonblock)
-{
-       return false;
-}
-
-static inline void skb_mark_ll(struct sk_buff *skb, struct napi_struct *napi)
-{
-}
-
-static inline void sk_mark_ll(struct sock *sk, struct sk_buff *skb)
-{
-}
-
-static inline bool busy_loop_timeout(unsigned long end_time)
-{
-       return true;
-}
-
-#endif /* CONFIG_NET_LL_RX_POLL */
-#endif /* _LINUX_NET_LL_POLL_H */
index ca3a20d772ac7f6f8c1afe4e0ff4f90bfe7e75bc..f04b69b6abf251d6f0ba720db25822b11b953489 100644 (file)
@@ -76,6 +76,6 @@
 
 #define SO_SELECT_ERR_QUEUE    45
 
-#define SO_LL                  46
+#define SO_BUSY_POLL           46
 
 #endif /* __ASM_GENERIC_SOCKET_H */
index de8df957867def380831cc9a3589386f82a78aae..2ee3879161b1769f456501044a08c8ebfda420a0 100644 (file)
  */
 void p9_release_pages(struct page **pages, int nr_pages)
 {
-       int i = 0;
-       while (pages[i] && nr_pages--) {
-               put_page(pages[i]);
-               i++;
-       }
+       int i;
+
+       for (i = 0; i < nr_pages; i++)
+               if (pages[i])
+                       put_page(pages[i]);
 }
 EXPORT_SYMBOL(p9_release_pages);
 
index 6e9ab31e457e89db00b32c89fbec8237058abd29..8ab48cd8955971ec7db7e60464a946380a7be49a 100644 (file)
@@ -56,7 +56,7 @@
 #include <net/sock.h>
 #include <net/tcp_states.h>
 #include <trace/events/skb.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 /*
  *     Is a socket 'connection oriented' ?
index 560dafd83adff57f20b661dc0d2e4ce4d60d1d52..a3d8d44cb7f46dddc7e2b04772c97264e021a89f 100644 (file)
@@ -2481,10 +2481,10 @@ static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features)
 }
 
 static netdev_features_t harmonize_features(struct sk_buff *skb,
-       __be16 protocol, netdev_features_t features)
+       netdev_features_t features)
 {
        if (skb->ip_summed != CHECKSUM_NONE &&
-           !can_checksum_protocol(features, protocol)) {
+           !can_checksum_protocol(features, skb_network_protocol(skb))) {
                features &= ~NETIF_F_ALL_CSUM;
        } else if (illegal_highdma(skb->dev, skb)) {
                features &= ~NETIF_F_SG;
@@ -2505,20 +2505,18 @@ netdev_features_t netif_skb_features(struct sk_buff *skb)
                struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
                protocol = veh->h_vlan_encapsulated_proto;
        } else if (!vlan_tx_tag_present(skb)) {
-               return harmonize_features(skb, protocol, features);
+               return harmonize_features(skb, features);
        }
 
        features &= (skb->dev->vlan_features | NETIF_F_HW_VLAN_CTAG_TX |
                                               NETIF_F_HW_VLAN_STAG_TX);
 
-       if (protocol != htons(ETH_P_8021Q) && protocol != htons(ETH_P_8021AD)) {
-               return harmonize_features(skb, protocol, features);
-       } else {
+       if (protocol == htons(ETH_P_8021Q) || protocol == htons(ETH_P_8021AD))
                features &= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_FRAGLIST |
                                NETIF_F_GEN_CSUM | NETIF_F_HW_VLAN_CTAG_TX |
                                NETIF_F_HW_VLAN_STAG_TX;
-               return harmonize_features(skb, protocol, features);
-       }
+
+       return harmonize_features(skb, features);
 }
 EXPORT_SYMBOL(netif_skb_features);
 
index 724bb7cb173fe5f966a7b7bd56cff70b8bdf9ba7..20e02d2605ecb2f10f5f74ab6f00cbd8fb852615 100644 (file)
@@ -824,7 +824,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
                page = alloc_page(gfp_mask);
                if (!page) {
                        while (head) {
-                               struct page *next = (struct page *)head->private;
+                               struct page *next = (struct page *)page_private(head);
                                put_page(head);
                                head = next;
                        }
@@ -834,7 +834,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
                memcpy(page_address(page),
                       vaddr + f->page_offset, skb_frag_size(f));
                kunmap_atomic(vaddr);
-               page->private = (unsigned long)head;
+               set_page_private(page, (unsigned long)head);
                head = page;
        }
 
@@ -848,7 +848,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
        for (i = num_frags - 1; i >= 0; i--) {
                __skb_fill_page_desc(skb, i, head, 0,
                                     skb_shinfo(skb)->frags[i].size);
-               head = (struct page *)head->private;
+               head = (struct page *)page_private(head);
        }
 
        skb_shinfo(skb)->tx_flags &= ~SKBTX_DEV_ZEROCOPY;
index ab06b719f5b1132e73dce818be80fe5e0cd1b8c5..548d716c5f62ac8c9d90d0959d19022714f9585d 100644 (file)
 #include <net/tcp.h>
 #endif
 
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 static DEFINE_MUTEX(proto_list_mutex);
 static LIST_HEAD(proto_list);
@@ -901,7 +901,7 @@ set_rcvbuf:
                break;
 
 #ifdef CONFIG_NET_LL_RX_POLL
-       case SO_LL:
+       case SO_BUSY_POLL:
                /* allow unprivileged users to decrease the value */
                if ((val > sk->sk_ll_usec) && !capable(CAP_NET_ADMIN))
                        ret = -EPERM;
@@ -1171,7 +1171,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                break;
 
 #ifdef CONFIG_NET_LL_RX_POLL
-       case SO_LL:
+       case SO_BUSY_POLL:
                v.val = sk->sk_ll_usec;
                break;
 #endif
@@ -2294,7 +2294,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
 
 #ifdef CONFIG_NET_LL_RX_POLL
        sk->sk_napi_id          =       0;
-       sk->sk_ll_usec          =       sysctl_net_ll_read;
+       sk->sk_ll_usec          =       sysctl_net_busy_read;
 #endif
 
        /*
index afc677eadd9323bd5673c1ae5f0aacbb07f15d6c..6609686166379765233cdbfab0e3d580a3d23051 100644 (file)
@@ -19,7 +19,7 @@
 #include <net/ip.h>
 #include <net/sock.h>
 #include <net/net_ratelimit.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 static int one = 1;
 
@@ -300,15 +300,15 @@ static struct ctl_table net_core_table[] = {
 #endif /* CONFIG_NET_FLOW_LIMIT */
 #ifdef CONFIG_NET_LL_RX_POLL
        {
-               .procname       = "low_latency_poll",
-               .data           = &sysctl_net_ll_poll,
+               .procname       = "busy_poll",
+               .data           = &sysctl_net_busy_poll,
                .maxlen         = sizeof(unsigned int),
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
        {
-               .procname       = "low_latency_read",
-               .data           = &sysctl_net_ll_read,
+               .procname       = "busy_read",
+               .data           = &sysctl_net_busy_read,
                .maxlen         = sizeof(unsigned int),
                .mode           = 0644,
                .proc_handler   = proc_dointvec
index 0a69d075779556fa1f8093b2ba6816e7f7d5cb77..f347a2ca7d7e6c5c1f6feae5e8edae91b487500e 100644 (file)
@@ -118,7 +118,7 @@ dns_resolver_instantiate(struct key *key, struct key_preparsed_payload *prep)
                                if (opt_vlen <= 0)
                                        goto bad_option_value;
 
-                               ret = strict_strtoul(eq, 10, &derrno);
+                               ret = kstrtoul(eq, 10, &derrno);
                                if (ret < 0)
                                        goto bad_option_value;
 
index 775d5b532ece788db2bfd57c9cf826567036f7c3..55e6bfb3a28921c26b0be3170f10c1245a9a74ae 100644 (file)
@@ -100,6 +100,9 @@ static struct sk_buff *gre_gso_segment(struct sk_buff *skb,
                }
                __skb_push(skb, tnl_hlen - ghl);
 
+               skb_reset_inner_headers(skb);
+               skb->encapsulation = 1;
+
                skb_reset_mac_header(skb);
                skb_set_network_header(skb, mac_len);
                skb->mac_len = mac_len;
index 6af375afeeef1e9706667720fda31c3e57a15d65..7bd8983dbfcf308e61dc55bb9491b3dd6866fa35 100644 (file)
@@ -467,7 +467,7 @@ void inet_unhash(struct sock *sk)
                lock = inet_ehash_lockp(hashinfo, sk->sk_hash);
 
        spin_lock_bh(lock);
-       done =__sk_nulls_del_node_init_rcu(sk);
+       done = __sk_nulls_del_node_init_rcu(sk);
        if (done)
                sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
        spin_unlock_bh(lock);
index 945734b2f2092669604b1e588ba045c66f009678..ca1cb2d5f6e2bcb81eea9d35e3178518492a7a63 100644 (file)
@@ -476,7 +476,7 @@ static int tnl_update_pmtu(struct net_device *dev, struct sk_buff *skb,
                            struct rtable *rt, __be16 df)
 {
        struct ip_tunnel *tunnel = netdev_priv(dev);
-       int pkt_size = skb->len - tunnel->hlen;
+       int pkt_size = skb->len - tunnel->hlen - dev->hard_header_len;
        int mtu;
 
        if (df)
index 15cbfa94bd8e969e38f75db6e0e98e7340131d59..5423223e93c25074f87c92dc60b338fddcb66f3f 100644 (file)
 
 #include <asm/uaccess.h>
 #include <asm/ioctls.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 int sysctl_tcp_fin_timeout __read_mostly = TCP_FIN_TIMEOUT;
 
index 35675e46aff8ab32fc2cc676ed8f16bd976662d5..b299da5ff4996fb5785d2725c66c43d91db918d4 100644 (file)
@@ -75,7 +75,7 @@
 #include <net/netdma.h>
 #include <net/secure_seq.h>
 #include <net/tcp_memcontrol.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #include <linux/inet.h>
 #include <linux/ipv6.h>
@@ -1994,7 +1994,7 @@ process:
        if (sk_filter(sk, skb))
                goto discard_and_relse;
 
-       sk_mark_ll(sk, skb);
+       sk_mark_napi_id(sk, skb);
        skb->dev = NULL;
 
        bh_lock_sock_nested(sk);
index 3d609490f118e753ff791b0ac1fb79cbcb6a7fa6..92fde8d1aa821c38b59ba467fe386eb3306c2dfe 100644 (file)
@@ -2407,6 +2407,8 @@ int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)
                 * see tcp_input.c tcp_sacktag_write_queue().
                 */
                TCP_SKB_CB(skb)->ack_seq = tp->snd_nxt;
+       } else {
+               NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL);
        }
        return err;
 }
@@ -2528,10 +2530,9 @@ begin_fwd:
                if (sacked & (TCPCB_SACKED_ACKED|TCPCB_SACKED_RETRANS))
                        continue;
 
-               if (tcp_retransmit_skb(sk, skb)) {
-                       NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPRETRANSFAIL);
+               if (tcp_retransmit_skb(sk, skb))
                        return;
-               }
+
                NET_INC_STATS_BH(sock_net(sk), mib_idx);
 
                if (tcp_in_cwnd_reduction(sk))
index 6b270e53c207a2ba188152e469152562b63db131..766e6bab911362cb0caa44511b10bb82418e7980 100644 (file)
 #include <trace/events/udp.h>
 #include <linux/static_key.h>
 #include <trace/events/skb.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 #include "udp_impl.h"
 
 struct udp_table udp_table __read_mostly;
@@ -1713,7 +1713,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
        if (sk != NULL) {
                int ret;
 
-               sk_mark_ll(sk, skb);
+               sk_mark_napi_id(sk, skb);
                ret = udp_queue_rcv_skb(sk, skb);
                sock_put(sk);
 
@@ -2323,6 +2323,9 @@ struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
                struct udphdr *uh;
                int udp_offset = outer_hlen - tnl_hlen;
 
+               skb_reset_inner_headers(skb);
+               skb->encapsulation = 1;
+
                skb->mac_len = mac_len;
 
                skb_push(skb, outer_hlen);
@@ -2345,7 +2348,6 @@ struct sk_buff *skb_udp_tunnel_segment(struct sk_buff *skb,
                                uh->check = CSUM_MANGLED_0;
 
                }
-               skb->ip_summed = CHECKSUM_NONE;
                skb->protocol = protocol;
        } while ((skb = skb->next));
 out:
index 192dd1a0e18810f01923b43ef5f4a75c5b5d8d35..5fc9c7a68d8d102aef37b7b13ab1dd772553a9cb 100644 (file)
@@ -632,6 +632,12 @@ insert_above:
        return ln;
 }
 
+static inline bool rt6_qualify_for_ecmp(struct rt6_info *rt)
+{
+       return (rt->rt6i_flags & (RTF_GATEWAY|RTF_ADDRCONF|RTF_DYNAMIC)) ==
+              RTF_GATEWAY;
+}
+
 /*
  *     Insert routing information in a node.
  */
@@ -646,6 +652,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
        int add = (!info->nlh ||
                   (info->nlh->nlmsg_flags & NLM_F_CREATE));
        int found = 0;
+       bool rt_can_ecmp = rt6_qualify_for_ecmp(rt);
 
        ins = &fn->leaf;
 
@@ -691,9 +698,8 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
                         * To avoid long list, we only had siblings if the
                         * route have a gateway.
                         */
-                       if (rt->rt6i_flags & RTF_GATEWAY &&
-                           !(rt->rt6i_flags & RTF_EXPIRES) &&
-                           !(iter->rt6i_flags & RTF_EXPIRES))
+                       if (rt_can_ecmp &&
+                           rt6_qualify_for_ecmp(iter))
                                rt->rt6i_nsiblings++;
                }
 
@@ -715,7 +721,8 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
                /* Find the first route that have the same metric */
                sibling = fn->leaf;
                while (sibling) {
-                       if (sibling->rt6i_metric == rt->rt6i_metric) {
+                       if (sibling->rt6i_metric == rt->rt6i_metric &&
+                           rt6_qualify_for_ecmp(sibling)) {
                                list_add_tail(&rt->rt6i_siblings,
                                              &sibling->rt6i_siblings);
                                break;
index bd5fd7054031d677f9ac111ef7d78c74b3d68b24..a8c891aa24645e9a45d2f8e47712b0698a29b216 100644 (file)
 #include <linux/sysctl.h>
 #endif
 
+enum rt6_nud_state {
+       RT6_NUD_FAIL_HARD = -2,
+       RT6_NUD_FAIL_SOFT = -1,
+       RT6_NUD_SUCCEED = 1
+};
+
 static struct rt6_info *ip6_rt_copy(struct rt6_info *ort,
                                    const struct in6_addr *dest);
 static struct dst_entry        *ip6_dst_check(struct dst_entry *dst, u32 cookie);
@@ -531,28 +537,29 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif)
        return 0;
 }
 
-static inline bool rt6_check_neigh(struct rt6_info *rt)
+static inline enum rt6_nud_state rt6_check_neigh(struct rt6_info *rt)
 {
        struct neighbour *neigh;
-       bool ret = false;
+       enum rt6_nud_state ret = RT6_NUD_FAIL_HARD;
 
        if (rt->rt6i_flags & RTF_NONEXTHOP ||
            !(rt->rt6i_flags & RTF_GATEWAY))
-               return true;
+               return RT6_NUD_SUCCEED;
 
        rcu_read_lock_bh();
        neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
        if (neigh) {
                read_lock(&neigh->lock);
                if (neigh->nud_state & NUD_VALID)
-                       ret = true;
+                       ret = RT6_NUD_SUCCEED;
 #ifdef CONFIG_IPV6_ROUTER_PREF
                else if (!(neigh->nud_state & NUD_FAILED))
-                       ret = true;
+                       ret = RT6_NUD_SUCCEED;
 #endif
                read_unlock(&neigh->lock);
-       } else if (IS_ENABLED(CONFIG_IPV6_ROUTER_PREF)) {
-               ret = true;
+       } else {
+               ret = IS_ENABLED(CONFIG_IPV6_ROUTER_PREF) ?
+                     RT6_NUD_SUCCEED : RT6_NUD_FAIL_SOFT;
        }
        rcu_read_unlock_bh();
 
@@ -566,43 +573,52 @@ static int rt6_score_route(struct rt6_info *rt, int oif,
 
        m = rt6_check_dev(rt, oif);
        if (!m && (strict & RT6_LOOKUP_F_IFACE))
-               return -1;
+               return RT6_NUD_FAIL_HARD;
 #ifdef CONFIG_IPV6_ROUTER_PREF
        m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2;
 #endif
-       if (!rt6_check_neigh(rt) && (strict & RT6_LOOKUP_F_REACHABLE))
-               return -1;
+       if (strict & RT6_LOOKUP_F_REACHABLE) {
+               int n = rt6_check_neigh(rt);
+               if (n < 0)
+                       return n;
+       }
        return m;
 }
 
 static struct rt6_info *find_match(struct rt6_info *rt, int oif, int strict,
-                                  int *mpri, struct rt6_info *match)
+                                  int *mpri, struct rt6_info *match,
+                                  bool *do_rr)
 {
        int m;
+       bool match_do_rr = false;
 
        if (rt6_check_expired(rt))
                goto out;
 
        m = rt6_score_route(rt, oif, strict);
-       if (m < 0)
+       if (m == RT6_NUD_FAIL_SOFT && !IS_ENABLED(CONFIG_IPV6_ROUTER_PREF)) {
+               match_do_rr = true;
+               m = 0; /* lowest valid score */
+       } else if (m < 0) {
                goto out;
+       }
+
+       if (strict & RT6_LOOKUP_F_REACHABLE)
+               rt6_probe(rt);
 
        if (m > *mpri) {
-               if (strict & RT6_LOOKUP_F_REACHABLE)
-                       rt6_probe(match);
+               *do_rr = match_do_rr;
                *mpri = m;
                match = rt;
-       } else if (strict & RT6_LOOKUP_F_REACHABLE) {
-               rt6_probe(rt);
        }
-
 out:
        return match;
 }
 
 static struct rt6_info *find_rr_leaf(struct fib6_node *fn,
                                     struct rt6_info *rr_head,
-                                    u32 metric, int oif, int strict)
+                                    u32 metric, int oif, int strict,
+                                    bool *do_rr)
 {
        struct rt6_info *rt, *match;
        int mpri = -1;
@@ -610,10 +626,10 @@ static struct rt6_info *find_rr_leaf(struct fib6_node *fn,
        match = NULL;
        for (rt = rr_head; rt && rt->rt6i_metric == metric;
             rt = rt->dst.rt6_next)
-               match = find_match(rt, oif, strict, &mpri, match);
+               match = find_match(rt, oif, strict, &mpri, match, do_rr);
        for (rt = fn->leaf; rt && rt != rr_head && rt->rt6i_metric == metric;
             rt = rt->dst.rt6_next)
-               match = find_match(rt, oif, strict, &mpri, match);
+               match = find_match(rt, oif, strict, &mpri, match, do_rr);
 
        return match;
 }
@@ -622,15 +638,16 @@ static struct rt6_info *rt6_select(struct fib6_node *fn, int oif, int strict)
 {
        struct rt6_info *match, *rt0;
        struct net *net;
+       bool do_rr = false;
 
        rt0 = fn->rr_ptr;
        if (!rt0)
                fn->rr_ptr = rt0 = fn->leaf;
 
-       match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict);
+       match = find_rr_leaf(fn, rt0, rt0->rt6i_metric, oif, strict,
+                            &do_rr);
 
-       if (!match &&
-           (strict & RT6_LOOKUP_F_REACHABLE)) {
+       if (do_rr) {
                struct rt6_info *next = rt0->dst.rt6_next;
 
                /* no entries matched; do round-robin */
@@ -1080,10 +1097,13 @@ static void ip6_link_failure(struct sk_buff *skb)
 
        rt = (struct rt6_info *) skb_dst(skb);
        if (rt) {
-               if (rt->rt6i_flags & RTF_CACHE)
-                       rt6_update_expires(rt, 0);
-               else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT))
+               if (rt->rt6i_flags & RTF_CACHE) {
+                       dst_hold(&rt->dst);
+                       if (ip6_del_rt(rt))
+                               dst_free(&rt->dst);
+               } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) {
                        rt->rt6i_node->fn_sernum = -1;
+               }
        }
 }
 
index 5cffa5c3e6b810a39a649c99753d0b68f54f07fd..6e1649d58533fd9a1b0a3f9f4373348a625bfb60 100644 (file)
@@ -63,7 +63,7 @@
 #include <net/inet_common.h>
 #include <net/secure_seq.h>
 #include <net/tcp_memcontrol.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #include <asm/uaccess.h>
 
@@ -1499,7 +1499,7 @@ process:
        if (sk_filter(sk, skb))
                goto discard_and_relse;
 
-       sk_mark_ll(sk, skb);
+       sk_mark_napi_id(sk, skb);
        skb->dev = NULL;
 
        bh_lock_sock_nested(sk);
index b6f31437a1f80a84d3c3ee89d71044c7b33c6f17..f4058150262b111d316a423e1c9ddc7ee8bb29a0 100644 (file)
@@ -46,7 +46,7 @@
 #include <net/ip6_checksum.h>
 #include <net/xfrm.h>
 #include <net/inet6_hashtables.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
@@ -844,7 +844,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
        if (sk != NULL) {
                int ret;
 
-               sk_mark_ll(sk, skb);
+               sk_mark_napi_id(sk, skb);
                ret = udpv6_queue_rcv_skb(sk, skb);
                sock_put(sk);
 
index 7c195d972bf0cd437a8b94a6bc80564c1585b82b..a7ab323849b616a152fb1332e2eabc63126b5aab 100644 (file)
@@ -821,7 +821,14 @@ static void qfq_make_eligible(struct qfq_sched *q)
        unsigned long old_vslot = q->oldV >> q->min_slot_shift;
 
        if (vslot != old_vslot) {
-               unsigned long mask = (1ULL << fls(vslot ^ old_vslot)) - 1;
+               unsigned long mask;
+               int last_flip_pos = fls(vslot ^ old_vslot);
+
+               if (last_flip_pos > 31) /* higher than the number of groups */
+                       mask = ~0UL;    /* make all groups eligible */
+               else
+                       mask = (1UL << last_flip_pos) - 1;
+
                qfq_move_groups(q, mask, IR, ER);
                qfq_move_groups(q, mask, IB, EB);
        }
@@ -1003,9 +1010,61 @@ static inline void charge_actual_service(struct qfq_aggregate *agg)
        agg->F = agg->S + (u64)service_received * agg->inv_w;
 }
 
-static inline void qfq_update_agg_ts(struct qfq_sched *q,
-                                    struct qfq_aggregate *agg,
-                                    enum update_reason reason);
+/* Assign a reasonable start time for a new aggregate in group i.
+ * Admissible values for \hat(F) are multiples of \sigma_i
+ * no greater than V+\sigma_i . Larger values mean that
+ * we had a wraparound so we consider the timestamp to be stale.
+ *
+ * If F is not stale and F >= V then we set S = F.
+ * Otherwise we should assign S = V, but this may violate
+ * the ordering in EB (see [2]). So, if we have groups in ER,
+ * set S to the F_j of the first group j which would be blocking us.
+ * We are guaranteed not to move S backward because
+ * otherwise our group i would still be blocked.
+ */
+static void qfq_update_start(struct qfq_sched *q, struct qfq_aggregate *agg)
+{
+       unsigned long mask;
+       u64 limit, roundedF;
+       int slot_shift = agg->grp->slot_shift;
+
+       roundedF = qfq_round_down(agg->F, slot_shift);
+       limit = qfq_round_down(q->V, slot_shift) + (1ULL << slot_shift);
+
+       if (!qfq_gt(agg->F, q->V) || qfq_gt(roundedF, limit)) {
+               /* timestamp was stale */
+               mask = mask_from(q->bitmaps[ER], agg->grp->index);
+               if (mask) {
+                       struct qfq_group *next = qfq_ffs(q, mask);
+                       if (qfq_gt(roundedF, next->F)) {
+                               if (qfq_gt(limit, next->F))
+                                       agg->S = next->F;
+                               else /* preserve timestamp correctness */
+                                       agg->S = limit;
+                               return;
+                       }
+               }
+               agg->S = q->V;
+       } else  /* timestamp is not stale */
+               agg->S = agg->F;
+}
+
+/* Update the timestamps of agg before scheduling/rescheduling it for
+ * service.  In particular, assign to agg->F its maximum possible
+ * value, i.e., the virtual finish time with which the aggregate
+ * should be labeled if it used all its budget once in service.
+ */
+static inline void
+qfq_update_agg_ts(struct qfq_sched *q,
+                   struct qfq_aggregate *agg, enum update_reason reason)
+{
+       if (reason != requeue)
+               qfq_update_start(q, agg);
+       else /* just charge agg for the service received */
+               agg->S = agg->F;
+
+       agg->F = agg->S + (u64)agg->budgetmax * agg->inv_w;
+}
 
 static void qfq_schedule_agg(struct qfq_sched *q, struct qfq_aggregate *agg);
 
@@ -1128,66 +1187,6 @@ static struct qfq_aggregate *qfq_choose_next_agg(struct qfq_sched *q)
        return agg;
 }
 
-/*
- * Assign a reasonable start time for a new aggregate in group i.
- * Admissible values for \hat(F) are multiples of \sigma_i
- * no greater than V+\sigma_i . Larger values mean that
- * we had a wraparound so we consider the timestamp to be stale.
- *
- * If F is not stale and F >= V then we set S = F.
- * Otherwise we should assign S = V, but this may violate
- * the ordering in EB (see [2]). So, if we have groups in ER,
- * set S to the F_j of the first group j which would be blocking us.
- * We are guaranteed not to move S backward because
- * otherwise our group i would still be blocked.
- */
-static void qfq_update_start(struct qfq_sched *q, struct qfq_aggregate *agg)
-{
-       unsigned long mask;
-       u64 limit, roundedF;
-       int slot_shift = agg->grp->slot_shift;
-
-       roundedF = qfq_round_down(agg->F, slot_shift);
-       limit = qfq_round_down(q->V, slot_shift) + (1ULL << slot_shift);
-
-       if (!qfq_gt(agg->F, q->V) || qfq_gt(roundedF, limit)) {
-               /* timestamp was stale */
-               mask = mask_from(q->bitmaps[ER], agg->grp->index);
-               if (mask) {
-                       struct qfq_group *next = qfq_ffs(q, mask);
-                       if (qfq_gt(roundedF, next->F)) {
-                               if (qfq_gt(limit, next->F))
-                                       agg->S = next->F;
-                               else /* preserve timestamp correctness */
-                                       agg->S = limit;
-                               return;
-                       }
-               }
-               agg->S = q->V;
-       } else  /* timestamp is not stale */
-               agg->S = agg->F;
-}
-
-/*
- * Update the timestamps of agg before scheduling/rescheduling it for
- * service.  In particular, assign to agg->F its maximum possible
- * value, i.e., the virtual finish time with which the aggregate
- * should be labeled if it used all its budget once in service.
- */
-static inline void
-qfq_update_agg_ts(struct qfq_sched *q,
-                   struct qfq_aggregate *agg, enum update_reason reason)
-{
-       if (reason != requeue)
-               qfq_update_start(q, agg);
-       else /* just charge agg for the service received */
-               agg->S = agg->F;
-
-       agg->F = agg->S + (u64)agg->budgetmax * agg->inv_w;
-}
-
-static void qfq_schedule_agg(struct qfq_sched *, struct qfq_aggregate *);
-
 static int qfq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
 {
        struct qfq_sched *q = qdisc_priv(sch);
index 45afa648364a1c79a7f90209e6d376fa16a3492a..829b460acb87e61e88928f596589b51b0947411d 100644 (file)
 #include <linux/route.h>
 #include <linux/sockios.h>
 #include <linux/atalk.h>
-#include <net/ll_poll.h>
+#include <net/busy_poll.h>
 
 #ifdef CONFIG_NET_LL_RX_POLL
-unsigned int sysctl_net_ll_read __read_mostly;
-unsigned int sysctl_net_ll_poll __read_mostly;
+unsigned int sysctl_net_busy_read __read_mostly;
+unsigned int sysctl_net_busy_poll __read_mostly;
 #endif
 
 static int sock_no_open(struct inode *irrelevant, struct file *dontcare);
index ad2e1ec4117e316de8a497ab7e83a7b4fe6a8eb8..9934a32bfa877a8a8eae83d1fc74e7f31a7a8399 100644 (file)
@@ -292,13 +292,7 @@ static int ib_addr2str(struct tipc_media_addr *a, char *str_buf, int str_size)
        if (str_size < 60)      /* 60 = 19 * strlen("xx:") + strlen("xx\0") */
                return 1;
 
-       sprintf(str_buf, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:"
-                        "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
-               a->value[0], a->value[1], a->value[2], a->value[3],
-               a->value[4], a->value[5], a->value[6], a->value[7],
-               a->value[8], a->value[9], a->value[10], a->value[11],
-               a->value[12], a->value[13], a->value[14], a->value[15],
-               a->value[16], a->value[17], a->value[18], a->value[19]);
+       sprintf(str_buf, "%20phC", a->value);
 
        return 0;
 }