* [PATCH] Add OF bindings to Micrel PHY
From: Sean Cross @ 2013-08-01 4:16 UTC (permalink / raw)
To: netdev, devicetree; +Cc: Sean Cross
Some boards require custom parameters be passed to the Micrel PHY.
Allow these boards to specify custom timing parameters in the device
tree node.
Sean Cross (1):
net/phy: micrel: Add OF configuration support
.../devicetree/bindings/net/micrel-phy.txt | 20 +++++++
drivers/net/phy/micrel.c | 57 ++++++++++++++++++++
2 files changed, 77 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/micrel-phy.txt
--
1.7.9.5
^ permalink raw reply
* [PATCH] net/phy: micrel: Add OF configuration support
From: Sean Cross @ 2013-08-01 4:16 UTC (permalink / raw)
To: netdev, devicetree; +Cc: Sean Cross
In-Reply-To: <1375330601-3609-1-git-send-email-xobs@kosagi.com>
Some boards require custom PHY configuration, for example due to trace
length differences. Add the ability to configure these registers in
order to get the PHY to function on boards that need it.
Because PHYs are auto-detected based on MDIO device IDs, allow PHY
configuration to be specified in the parent Ethernet device node if no
PHY device node is present.
Signed-off-by: Sean Cross <xobs@kosagi.com>
---
.../devicetree/bindings/net/micrel-phy.txt | 20 +++++++
drivers/net/phy/micrel.c | 57 ++++++++++++++++++++
2 files changed, 77 insertions(+)
create mode 100644 Documentation/devicetree/bindings/net/micrel-phy.txt
diff --git a/Documentation/devicetree/bindings/net/micrel-phy.txt b/Documentation/devicetree/bindings/net/micrel-phy.txt
new file mode 100644
index 0000000..97c1ef2
--- /dev/null
+++ b/Documentation/devicetree/bindings/net/micrel-phy.txt
@@ -0,0 +1,20 @@
+Micrel KS8737, KSZ8041, KSZ8001, KS8721, KSZ8081, KSZ8091, KSZ8061, KSZ9021,
+KSZ9031, Ethernet PHYs, and KSZ8873MLL and KSZ886X Ethernet switches.
+
+Some boards require special tuning values, particularly when it comes to
+clock delays. You can specify clock delay values by adding
+micrel-specific properties to an Ethernet OF device node.
+
+Optional properties:
+- micrel,clk-control-pad-skew : Timing offset for the MII clock line
+- micrel,rx-data-pad-skew : Timing offset for the RX MII pad
+- micrel,tx-data-pad-skew : Timing offset for the TX MII pad
+
+Example:
+ &enet {
+ micrel,clk-control-pad-skew = <0xf0f0>;
+ micrel,rx-data-pad-skew = <0x0000>;
+ micrel,tx-data-pad-skew = <0xffff>;
+ status = "okay";
+ };
+
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 2510435..0abe821 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -25,6 +25,7 @@
#include <linux/module.h>
#include <linux/phy.h>
#include <linux/micrel_phy.h>
+#include <linux/of.h>
/* Operation Mode Strap Override */
#define MII_KSZPHY_OMSO 0x16
@@ -53,6 +54,25 @@
#define KS8737_CTRL_INT_ACTIVE_HIGH (1 << 14)
#define KSZ8051_RMII_50MHZ_CLK (1 << 7)
+/* Write/read to/from extended registers */
+#define MII_KSZPHY_EXTREG 0x0b
+#define KSZPHY_EXTREG_WRITE 0x8000
+
+#define MII_KSZPHY_EXTREG_WRITE 0x0c
+#define MII_KSZPHY_EXTREG_READ 0x0d
+
+/* Write/read to/from extended registers */
+#define MII_KSZPHY_EXTREG 0x0b
+#define KSZPHY_EXTREG_WRITE 0x8000
+
+#define MII_KSZPHY_EXTREG_WRITE 0x0c
+#define MII_KSZPHY_EXTREG_READ 0x0d
+
+/* Extended registers */
+#define MII_KSZPHY_CLK_CONTROL_PAD_SKEW 0x104
+#define MII_KSZPHY_RX_DATA_PAD_SKEW 0x105
+#define MII_KSZPHY_TX_DATA_PAD_SKEW 0x106
+
static int ksz_config_flags(struct phy_device *phydev)
{
int regval;
@@ -65,6 +85,13 @@ static int ksz_config_flags(struct phy_device *phydev)
return 0;
}
+static int kszphy_extended_write(struct phy_device *phydev,
+ u32 regnum, u16 val)
+{
+ phy_write(phydev, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | regnum);
+ return phy_write(phydev, MII_KSZPHY_EXTREG_WRITE, val);
+}
+
static int kszphy_ack_interrupt(struct phy_device *phydev)
{
/* bit[7..0] int status, which is a read and clear register. */
@@ -121,6 +148,36 @@ static int ks8737_config_intr(struct phy_device *phydev)
static int kszphy_config_init(struct phy_device *phydev)
{
+ struct device *dev = &phydev->dev;
+ struct device_node *of_node = dev->of_node;
+
+ if (!of_node && dev->parent->of_node)
+ of_node = dev->parent->of_node;
+
+ if (of_node) {
+ u32 val;
+
+ if (!of_property_read_u32(of_node,
+ "micrel,clk-control-pad-skew",
+ &val))
+ kszphy_extended_write(phydev,
+ MII_KSZPHY_CLK_CONTROL_PAD_SKEW,
+ val);
+
+ if (!of_property_read_u32(of_node,
+ "micrel,rx-data-pad-skew",
+ &val))
+ kszphy_extended_write(phydev,
+ MII_KSZPHY_RX_DATA_PAD_SKEW,
+ val);
+
+ if (!of_property_read_u32(of_node,
+ "micrel,tx-data-pad-skew",
+ &val))
+ kszphy_extended_write(phydev,
+ MII_KSZPHY_TX_DATA_PAD_SKEW,
+ val);
+ }
return 0;
}
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH 4/4] USBNET: ax88179_178a: enable tso if host supports sg dma
From: Eric Dumazet @ 2013-08-01 3:51 UTC (permalink / raw)
To: Ming Lei
Cc: David S. Miller, Greg Kroah-Hartman, Oliver Neukum, Freddy Xin,
Ben Hutchings, Grant Grundler, netdev-u79uwXL29TY76Z2rM5mHXA,
linux-usb-u79uwXL29TY76Z2rM5mHXA
In-Reply-To: <1375267909-30373-5-git-send-email-ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
On Wed, 2013-07-31 at 18:51 +0800, Ming Lei wrote:
> This patch enables 'can_dma_sg' flag for ax88179_178a device
> if the attached host controller supports building packet from
> discontinuous buffers(DMA SG is possible), so both frame header
> and skb data buffers can be passed to usb stack via urb->sg,
> then skb data copy can be saved.
>
> With the patch, CPU utilization decreased much in iperf test at
> client mode.
>
> Signed-off-by: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>
> ---
> drivers/net/usb/ax88179_178a.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
> index 5a468f3..c75bded 100644
> --- a/drivers/net/usb/ax88179_178a.c
> +++ b/drivers/net/usb/ax88179_178a.c
> @@ -1031,12 +1031,20 @@ static int ax88179_bind(struct usbnet *dev, struct usb_interface *intf)
> dev->mii.phy_id = 0x03;
> dev->mii.supports_gmii = 1;
>
> + if (dev->udev->bus->no_sg_limit)
> + dev->can_dma_sg = 1;
> +
> dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
> NETIF_F_RXCSUM;
>
> dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
> NETIF_F_RXCSUM;
>
> + if (dev->can_dma_sg) {
> + dev->net->features |= NETIF_F_SG | NETIF_F_TSO;
> + dev->net->hw_features |= NETIF_F_SG | NETIF_F_TSO;
> + }
> +
> /* Enable checksum offload */
> *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP |
> AX_RXCOE_TCPV6 | AX_RXCOE_UDPV6;
> @@ -1170,12 +1178,30 @@ ax88179_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)
> int mss = skb_shinfo(skb)->gso_size;
> int headroom;
> int tailroom;
> + struct skb_data *entry = (struct skb_data *)skb->cb;
>
> tx_hdr1 = skb->len;
> tx_hdr2 = mss;
> if (((skb->len + 8) % frame_size) == 0)
> tx_hdr2 |= 0x80008000; /* Enable padding */
>
> + if (dev->can_dma_sg) {
> + if (!(entry->header = kmalloc(8, GFP_ATOMIC)))
> + goto no_sg;
> +
> + entry->length = 8;
> + cpu_to_le32s(&tx_hdr1);
> + cpu_to_le32s(&tx_hdr2);
You could do these cpu_to_le32s() calls before the if (dev->can_dma_sg)
and remove them before the skb_copy_to_linear_data() calls.
> + memcpy(entry->header, &tx_hdr1, 4);
> + memcpy(entry->header + 4, &tx_hdr2, 4);
> +
> + return skb;
> + } else {
> +no_sg:
> + entry->header = NULL;
> + entry->length = 0;
> + }
> +
> headroom = skb_headroom(skb);
> tailroom = skb_tailroom(skb);
>
> @@ -1323,6 +1349,10 @@ static int ax88179_reset(struct usbnet *dev)
>
> dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
> NETIF_F_RXCSUM;
> + if (dev->can_dma_sg) {
> + dev->net->features |= NETIF_F_SG | NETIF_F_TSO;
> + dev->net->hw_features |= NETIF_F_SG | NETIF_F_TSO;
> + }
Are you sure this part is needed ?
Also it looks like that you are going through this sg allocation/setup
even for linear skb ?
For linear skb, with 8+ bytes of headroom, I guess this adds significant
overhead (2 kmalloc() + sg setup)
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* [Patch v2 net-next 2/2] net: rename CONFIG_NET_LL_RX_POLL to CONFIG_NET_RX_BUSY_POLL
From: Cong Wang @ 2013-08-01 3:10 UTC (permalink / raw)
To: netdev; +Cc: David S. Miller, Eliezer Tamir, Cong Wang
In-Reply-To: <1375326625-21427-1-git-send-email-amwang@redhat.com>
From: Cong Wang <amwang@redhat.com>
Eliezer renames several *ll_poll to *busy_poll, but forgets
CONFIG_NET_LL_RX_POLL, so in case of confusion, rename it too.
Cc: Eliezer Tamir <eliezer.tamir@linux.intel.com>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
---
v2: fix doc as well
Documentation/sysctl/net.txt | 4 ++--
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h | 8 ++++----
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | 2 +-
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 2 +-
drivers/net/ethernet/intel/ixgbe/ixgbe.h | 12 ++++++------
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 6 +++---
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 6 +++---
drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 6 +++---
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 10 +++++-----
include/linux/netdevice.h | 2 +-
include/linux/skbuff.h | 2 +-
include/net/busy_poll.h | 6 +++---
include/net/sock.h | 2 +-
net/Kconfig | 2 +-
net/core/skbuff.c | 2 +-
net/core/sock.c | 6 +++---
net/core/sysctl_net_core.c | 2 +-
net/socket.c | 2 +-
18 files changed, 41 insertions(+), 41 deletions(-)
diff --git a/Documentation/sysctl/net.txt b/Documentation/sysctl/net.txt
index 1c15043..d569f2a 100644
--- a/Documentation/sysctl/net.txt
+++ b/Documentation/sysctl/net.txt
@@ -52,7 +52,7 @@ Default: 64
busy_read
----------------
-Low latency busy poll timeout for socket reads. (needs CONFIG_NET_LL_RX_POLL)
+Low latency busy poll timeout for socket reads. (needs CONFIG_NET_RX_BUSY_POLL)
Approximate time in us to busy loop waiting for packets on the device queue.
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,
@@ -63,7 +63,7 @@ Default: 0 (off)
busy_poll
----------------
-Low latency busy poll timeout for poll and select. (needs CONFIG_NET_LL_RX_POLL)
+Low latency busy poll timeout for poll and select. (needs CONFIG_NET_RX_BUSY_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.
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
index dedbd76..d80e34b 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
@@ -486,7 +486,7 @@ struct bnx2x_fastpath {
struct napi_struct napi;
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
unsigned int state;
#define BNX2X_FP_STATE_IDLE 0
#define BNX2X_FP_STATE_NAPI (1 << 0) /* NAPI owns this FP */
@@ -498,7 +498,7 @@ struct bnx2x_fastpath {
#define BNX2X_FP_USER_PEND (BNX2X_FP_STATE_POLL | BNX2X_FP_STATE_POLL_YIELD)
/* protect state */
spinlock_t lock;
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
union host_hc_status_block status_blk;
/* chip independent shortcuts into sb structure */
@@ -572,7 +572,7 @@ struct bnx2x_fastpath {
#define bnx2x_fp_stats(bp, fp) (&((bp)->fp_stats[(fp)->index]))
#define bnx2x_fp_qstats(bp, fp) (&((bp)->fp_stats[(fp)->index].eth_q_stats))
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
static inline void bnx2x_fp_init_lock(struct bnx2x_fastpath *fp)
{
spin_lock_init(&fp->lock);
@@ -680,7 +680,7 @@ static inline bool bnx2x_fp_ll_polling(struct bnx2x_fastpath *fp)
{
return false;
}
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
/* Use 2500 as a mini-jumbo MTU for FCoE */
#define BNX2X_FCOE_MINI_JUMBO_MTU 2500
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index ee350bd..f2d1ff1 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -3117,7 +3117,7 @@ int bnx2x_poll(struct napi_struct *napi, int budget)
return work_done;
}
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
/* must be called with local_bh_disable()d */
int bnx2x_low_latency_recv(struct napi_struct *napi)
{
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index e5da078..e06186c 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -12026,7 +12026,7 @@ static const struct net_device_ops bnx2x_netdev_ops = {
.ndo_fcoe_get_wwn = bnx2x_fcoe_get_wwn,
#endif
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
.ndo_busy_poll = bnx2x_low_latency_recv,
#endif
};
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
index 6844f39..0ac6b11 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
@@ -54,7 +54,7 @@
#include <net/busy_poll.h>
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
#define LL_EXTENDED_STATS
#endif
/* common prefix used by pr_<> macros */
@@ -366,7 +366,7 @@ struct ixgbe_q_vector {
struct rcu_head rcu; /* to avoid race with update stats on free */
char name[IFNAMSIZ + 9];
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
unsigned int state;
#define IXGBE_QV_STATE_IDLE 0
#define IXGBE_QV_STATE_NAPI 1 /* NAPI owns this QV */
@@ -377,12 +377,12 @@ struct ixgbe_q_vector {
#define IXGBE_QV_YIELD (IXGBE_QV_STATE_NAPI_YIELD | IXGBE_QV_STATE_POLL_YIELD)
#define IXGBE_QV_USER_PEND (IXGBE_QV_STATE_POLL | IXGBE_QV_STATE_POLL_YIELD)
spinlock_t lock;
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
/* for dynamic allocation of rings associated with this q_vector */
struct ixgbe_ring ring[0] ____cacheline_internodealigned_in_smp;
};
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector)
{
@@ -462,7 +462,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector)
WARN_ON(!(q_vector->state & IXGBE_QV_LOCKED));
return q_vector->state & IXGBE_QV_USER_PEND;
}
-#else /* CONFIG_NET_LL_RX_POLL */
+#else /* CONFIG_NET_RX_BUSY_POLL */
static inline void ixgbe_qv_init_lock(struct ixgbe_q_vector *q_vector)
{
}
@@ -491,7 +491,7 @@ static inline bool ixgbe_qv_ll_polling(struct ixgbe_q_vector *q_vector)
{
return false;
}
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
#ifdef CONFIG_IXGBE_HWMON
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index 136de7d..128d6b8 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -2079,7 +2079,7 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
return total_rx_packets;
}
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
/* must be called with local_bh_disable()d */
static int ixgbe_low_latency_recv(struct napi_struct *napi)
{
@@ -2111,7 +2111,7 @@ static int ixgbe_low_latency_recv(struct napi_struct *napi)
return found;
}
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
/**
* ixgbe_configure_msix - Configure MSI-X hardware
@@ -7310,7 +7310,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = ixgbe_netpoll,
#endif
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
.ndo_busy_poll = ixgbe_low_latency_recv,
#endif
#ifdef IXGBE_FCOE
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index 727874f..a28cd80 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@ -223,7 +223,7 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
case ETH_SS_STATS:
return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) +
(priv->tx_ring_num * 2) +
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
(priv->rx_ring_num * 5);
#else
(priv->rx_ring_num * 2);
@@ -276,7 +276,7 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
for (i = 0; i < priv->rx_ring_num; i++) {
data[index++] = priv->rx_ring[i].packets;
data[index++] = priv->rx_ring[i].bytes;
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
data[index++] = priv->rx_ring[i].yields;
data[index++] = priv->rx_ring[i].misses;
data[index++] = priv->rx_ring[i].cleaned;
@@ -344,7 +344,7 @@ static void mlx4_en_get_strings(struct net_device *dev,
"rx%d_packets", i);
sprintf(data + (index++) * ETH_GSTRING_LEN,
"rx%d_bytes", i);
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
sprintf(data + (index++) * ETH_GSTRING_LEN,
"rx%d_napi_yield", i);
sprintf(data + (index++) * ETH_GSTRING_LEN,
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 5eac871..fa37b7a 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -68,7 +68,7 @@ int mlx4_en_setup_tc(struct net_device *dev, u8 up)
return 0;
}
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
/* must be called with local_bh_disable()d */
static int mlx4_en_low_latency_recv(struct napi_struct *napi)
{
@@ -94,7 +94,7 @@ static int mlx4_en_low_latency_recv(struct napi_struct *napi)
return done;
}
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
#ifdef CONFIG_RFS_ACCEL
@@ -2140,7 +2140,7 @@ static const struct net_device_ops mlx4_netdev_ops = {
#ifdef CONFIG_RFS_ACCEL
.ndo_rx_flow_steer = mlx4_en_filter_rfs,
#endif
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
.ndo_busy_poll = mlx4_en_low_latency_recv,
#endif
};
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
index 35fb60e..5e0aa56 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
+++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h
@@ -292,7 +292,7 @@ struct mlx4_en_rx_ring {
void *rx_info;
unsigned long bytes;
unsigned long packets;
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
unsigned long yields;
unsigned long misses;
unsigned long cleaned;
@@ -318,7 +318,7 @@ struct mlx4_en_cq {
struct mlx4_cqe *buf;
#define MLX4_EN_OPCODE_ERROR 0x1e
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
unsigned int state;
#define MLX4_EN_CQ_STATE_IDLE 0
#define MLX4_EN_CQ_STATE_NAPI 1 /* NAPI owns this CQ */
@@ -329,7 +329,7 @@ struct mlx4_en_cq {
#define CQ_YIELD (MLX4_EN_CQ_STATE_NAPI_YIELD | MLX4_EN_CQ_STATE_POLL_YIELD)
#define CQ_USER_PEND (MLX4_EN_CQ_STATE_POLL | MLX4_EN_CQ_STATE_POLL_YIELD)
spinlock_t poll_lock; /* protects from LLS/napi conflicts */
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
};
struct mlx4_en_port_profile {
@@ -580,7 +580,7 @@ struct mlx4_mac_entry {
struct rcu_head rcu;
};
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq)
{
spin_lock_init(&cq->poll_lock);
@@ -687,7 +687,7 @@ static inline bool mlx4_en_cq_ll_polling(struct mlx4_en_cq *cq)
{
return false;
}
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
#define MLX4_EN_WOL_DO_MODIFY (1ULL << 63)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 875f869..077363d 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -989,7 +989,7 @@ struct net_device_ops {
gfp_t gfp);
void (*ndo_netpoll_cleanup)(struct net_device *dev);
#endif
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
int (*ndo_busy_poll)(struct napi_struct *dev);
#endif
int (*ndo_set_vf_mac)(struct net_device *dev,
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index a95547a..3413b95 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -501,7 +501,7 @@ struct sk_buff {
/* 7/9 bit hole (depending on ndisc_nodetype presence) */
kmemcheck_bitfield_end(flags2);
-#if defined CONFIG_NET_DMA || defined CONFIG_NET_LL_RX_POLL
+#if defined CONFIG_NET_DMA || defined CONFIG_NET_RX_BUSY_POLL
union {
unsigned int napi_id;
dma_cookie_t dma_cookie;
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
index a14339c..1428c32 100644
--- a/include/net/busy_poll.h
+++ b/include/net/busy_poll.h
@@ -27,7 +27,7 @@
#include <linux/netdevice.h>
#include <net/ip.h>
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
struct napi_struct;
extern unsigned int sysctl_net_busy_read __read_mostly;
@@ -146,7 +146,7 @@ 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 */
+#else /* CONFIG_NET_RX_BUSY_POLL */
static inline unsigned long net_busy_loop_on(void)
{
return 0;
@@ -181,5 +181,5 @@ static inline bool busy_loop_timeout(unsigned long end_time)
return true;
}
-#endif /* CONFIG_NET_LL_RX_POLL */
+#endif /* CONFIG_NET_RX_BUSY_POLL */
#endif /* _LINUX_NET_BUSY_POLL_H */
diff --git a/include/net/sock.h b/include/net/sock.h
index 53d4714..ab6a8b7 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -327,7 +327,7 @@ struct sock {
#ifdef CONFIG_RPS
__u32 sk_rxhash;
#endif
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
unsigned int sk_napi_id;
unsigned int sk_ll_usec;
#endif
diff --git a/net/Kconfig b/net/Kconfig
index 37162eb..ee02136 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -244,7 +244,7 @@ config NETPRIO_CGROUP
Cgroup subsystem for use in assigning processes to network priorities on
a per-interface basis
-config NET_LL_RX_POLL
+config NET_RX_BUSY_POLL
boolean
default y
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 20e02d2..6a9aa52 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -739,7 +739,7 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
skb_copy_secmark(new, old);
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
new->napi_id = old->napi_id;
#endif
}
diff --git a/net/core/sock.c b/net/core/sock.c
index a753d97..83667de 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -901,7 +901,7 @@ set_rcvbuf:
sock_valbool_flag(sk, SOCK_SELECT_ERR_QUEUE, valbool);
break;
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
case SO_BUSY_POLL:
/* allow unprivileged users to decrease the value */
if ((val > sk->sk_ll_usec) && !capable(CAP_NET_ADMIN))
@@ -1171,7 +1171,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
v.val = sock_flag(sk, SOCK_SELECT_ERR_QUEUE);
break;
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
case SO_BUSY_POLL:
v.val = sk->sk_ll_usec;
break;
@@ -2312,7 +2312,7 @@ void sock_init_data(struct socket *sock, struct sock *sk)
sk->sk_stamp = ktime_set(-1L, 0);
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
sk->sk_napi_id = 0;
sk->sk_ll_usec = sysctl_net_busy_read;
#endif
diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index 6609686..b59b680 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -298,7 +298,7 @@ static struct ctl_table net_core_table[] = {
.proc_handler = flow_limit_table_len_sysctl
},
#endif /* CONFIG_NET_FLOW_LIMIT */
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
{
.procname = "busy_poll",
.data = &sysctl_net_busy_poll,
diff --git a/net/socket.c b/net/socket.c
index 829b460..b2d7c62 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -106,7 +106,7 @@
#include <linux/atalk.h>
#include <net/busy_poll.h>
-#ifdef CONFIG_NET_LL_RX_POLL
+#ifdef CONFIG_NET_RX_BUSY_POLL
unsigned int sysctl_net_busy_read __read_mostly;
unsigned int sysctl_net_busy_poll __read_mostly;
#endif
^ permalink raw reply related
* [Patch net-next 1/2] net: fix a compile error when CONFIG_NET_LL_RX_POLL is not set
From: Cong Wang @ 2013-08-01 3:10 UTC (permalink / raw)
To: netdev; +Cc: David S. Miller, Eliezer Tamir, Cong Wang
From: Cong Wang <amwang@redhat.com>
When CONFIG_NET_LL_RX_POLL is not set, I got:
net/socket.c: In function ‘sock_poll’:
net/socket.c:1165:4: error: implicit declaration of function ‘sk_busy_loop’ [-Werror=implicit-function-declaration]
Fix this by adding a nop when !CONFIG_NET_LL_RX_POLL.
Cc: Eliezer Tamir <eliezer.tamir@linux.intel.com>
Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Cong Wang <amwang@redhat.com>
---
diff --git a/include/net/busy_poll.h b/include/net/busy_poll.h
index a14339c..6cd8848 100644
--- a/include/net/busy_poll.h
+++ b/include/net/busy_poll.h
@@ -181,5 +181,10 @@ static inline bool busy_loop_timeout(unsigned long end_time)
return true;
}
+static inline bool sk_busy_loop(struct sock *sk, int nonblock)
+{
+ return false;
+}
+
#endif /* CONFIG_NET_LL_RX_POLL */
#endif /* _LINUX_NET_BUSY_POLL_H */
^ permalink raw reply related
* Re: [PATCH net-next v5 2/7] vxlan: Restructure vxlan receive for multiple protocols.
From: Pravin Shelar @ 2013-08-01 3:01 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
In-Reply-To: <20130731164749.58b6ee1b@nehalam.linuxnetplumber.net>
On Wed, Jul 31, 2013 at 4:47 PM, Stephen Hemminger
<stephen@networkplumber.org> wrote:
> On Wed, 31 Jul 2013 16:14:29 -0700
> Pravin B Shelar <pshelar@nicira.com> wrote:
>
>> -- a/drivers/net/vxlan.c
>> +++ b/drivers/net/vxlan.c
>> @@ -57,6 +57,7 @@
>> #define VXLAN_VID_MASK (VXLAN_N_VID - 1)
>> /* IP header + UDP + VXLAN + Ethernet header */
>> #define VXLAN_HEADROOM (20 + 8 + 8 + 14)
>> +#define VXLAN_HLEN (sizeof(struct udphdr) + sizeof(struct vxlanhdr))
>>
>> #define VXLAN_FLAGS 0x08000000 /* struct vxlanhdr.vx_flags required value. */
>>
>> @@ -82,8 +83,12 @@ static int vxlan_net_id;
>>
>> static const u8 all_zeros_mac[ETH_ALEN];
>>
>> +struct vxlan_sock;
>> +typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, __be32 key);
>> +
>> /* per UDP socket information */
>> struct vxlan_sock {
>> + vxlan_rcv_t *rcv;
>> struct hlist_node hlist;
>> struct rcu_head rcu;
>> struct work_struct del_work;
>> @@ -211,6 +216,18 @@ static struct vxlan_dev *vxlan_find_vni(struct net *net, u32 id, __be16 port)
>> return NULL;
>> }
>>
>> +static struct vxlan_dev *vxlan_find_vni_port(struct vxlan_sock *vs, u32 id)
>> +{
>> + struct vxlan_dev *vxlan;
>> +
>> + hlist_for_each_entry_rcu(vxlan, vni_head(vs, id), hlist) {
>> + if (vxlan->default_dst.remote_vni == id)
>> + return vxlan;
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> /* Fill in neighbour message in skbuff. */
>> static int vxlan_fdb_info(struct sk_buff *skb, struct vxlan_dev *vxlan,
>> const struct vxlan_fdb *fdb,
>> @@ -836,23 +853,16 @@ static void vxlan_igmp_work(struct work_struct *work)
>> /* Callback from net/ipv4/udp.c to receive packets */
>> static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
>> {
>> - struct iphdr *oip;
>> + struct vxlan_sock *vs;
>> struct vxlanhdr *vxh;
>> - struct vxlan_dev *vxlan;
>> - struct pcpu_tstats *stats;
>> __be16 port;
>> - __u32 vni;
>> - int err;
>> -
>> - /* pop off outer UDP header */
>> - __skb_pull(skb, sizeof(struct udphdr));
>>
>> /* Need Vxlan and inner Ethernet header to be present */
>> - if (!pskb_may_pull(skb, sizeof(struct vxlanhdr)))
>> + if (!pskb_may_pull(skb, VXLAN_HLEN))
>> goto error;
>
> This patch would be clearer if split into two parts.
> One for the parsing changes (like VXLAN_HLEN) and other for the receive
> callback.
ok, I will send updated patch.
^ permalink raw reply
* Re: [PATCH net-next v5 1/7] vxlan: Restructure vxlan socket apis.
From: Pravin Shelar @ 2013-08-01 3:00 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: netdev
In-Reply-To: <20130731164521.09c43fb8@nehalam.linuxnetplumber.net>
On Wed, Jul 31, 2013 at 4:45 PM, Stephen Hemminger
<stephen@networkplumber.org> wrote:
> On Wed, 31 Jul 2013 16:14:23 -0700
> Pravin B Shelar <pshelar@nicira.com> wrote:
>
>> /* Disable multicast loopback */
>> inet_sk(sk)->mc_loop = 0;
>> + spin_lock(&vn->sock_lock);
>> + hlist_add_head_rcu(&vs->hlist, vs_head(net, port));
>> + spin_unlock(&vn->sock_lock);
>>
>
> This change could potentially put two of the sockets with the
> same port in the list.
>
> There is an existing check in vxlan_sock_work to handle this
> now. It does:
> create new socket (no locks)
>
> spin_lock
> if (udp_socket with that port exists)
> drop new socket
> else
> add to list
> spin_unlock
>
> Your code seems to immediately put it on the list which
> will cause duplicates if race occurs.
I do not think it is possible.
Create new socket does bind which shld fail on same port. So there
would be only one vxlan-sock entry in socket table.
^ permalink raw reply
* Re: [Patch net-next] tcp_metrics: rearrange fields to avoid holes
From: Cong Wang @ 2013-08-01 2:48 UTC (permalink / raw)
To: David Miller; +Cc: eric.dumazet, netdev, edumazet, ycheng, ncardwell
In-Reply-To: <20130730.232639.178259761581407616.davem@davemloft.net>
On Tue, 2013-07-30 at 23:26 -0700, David Miller wrote:
> From: Cong Wang <amwang@redhat.com>
> Date: Wed, 31 Jul 2013 11:13:22 +0800
>
> > I know saving 8 bytes is not interesting for you, but it is for me,
> > since I need some room in struct tcp_metrics_block for union inet_addr.
> > With this patch, I don't have to make struct tcp_metrics_block expand to
> > 3 cachelines. :)
>
> Cong, please.
>
> Instead of making code accomodate an unnecessarily large "union
> inet_addr", make a small version of it that accomodates this use case
> and doesn't have the extra fields.
Please teach me how to do that?
The fields not used by inetpeer are sin_port and scope_id etc., and
sin_port is in the middle of sockaddr* structs.
Hmm, maybe just define a new struct by kicking the last field from
struct sockaddr_{in,in6}, so that we can at least shrink 4 bytes.
Except this, I have no idea how to do that.
Thanks!
^ permalink raw reply
* Re: [PATCH] net/fec: Don't let ndo_start_xmit return NETDEV_TX_BUSY without link
From: Steven Rostedt @ 2013-08-01 2:25 UTC (permalink / raw)
To: Duan Fugang-B38611
Cc: David Miller, u.kleine-koenig@pengutronix.de,
netdev@vger.kernel.org, Estevam Fabio-R49496, Li Frank-B20596,
shawn.guo@linaro.org, kernel@pengutronix.de,
hector.palacios@digi.com, tim.sander@hbm.com, tglx@linutronix.de,
stephen@networkplumber.org, florian@openwrt.org,
bhutchings@solarflare.com
In-Reply-To: <9848F2DB572E5649BA045B288BE08FBE015E3A69@039-SN2MPN1-023.039d.mgd.msft.net>
On Thu, 2013-08-01 at 02:01 +0000, Duan Fugang-B38611 wrote:
> > This is not an official tag recognized by patchwork, he should say:
> >
> > Acked-by: Fugang Duan <B38611@freescale.com>
> > Tested-by: Fugang Duan <B38611@freescale.com>
>
> I see Linux kernel trees have many non-official tag such as: Acked-and-tested-by.
Yeah, that was done before, but it's been stated several times that we
want to conform to one tag per line. Makes parsing with tools much
easier.
-- Steve
^ permalink raw reply
* Re: [PATCH] genetlink: fix usage of NLM_F_EXCL or NLM_F_REPLACE
From: David Miller @ 2013-08-01 2:12 UTC (permalink / raw)
To: pablo; +Cc: netdev
In-Reply-To: <20130801020049.GA4067@localhost>
From: Pablo Neira Ayuso <pablo@netfilter.org>
Date: Thu, 1 Aug 2013 04:00:49 +0200
> On Thu, Aug 01, 2013 at 02:37:10AM +0200, Pablo Neira Ayuso wrote:
>> On Wed, Jul 31, 2013 at 05:03:48PM -0700, David Miller wrote:
> [...]
>> > Therefore I don't see how NLM_F_REPLACE and NLM_F_EXCL can be used
>> > at all, in those places, because the check is still "& NLM_F_DUMP"
>>
>> The kind = type&3; is doing the magic there for rtnetlink. kind == 2
>> means that this is a get command, and you can only set NLM_F_DUMP
>> using the get command.
>>
>> Since it doesn't make sense to use NLM_F_EXCL or NLM_F_REPLACE for get
>> commands, there is no room for ambiguity and rtnetlink is fine.
>
> I had re-read what I wrote to get your point. We can fix in a
> different way by checking for: ops->flags & GENL_CMD_CAP_DUMP, which
> means we have a .dumpit callback, so only in that case genetlink
> should interpret the flags as NLM_F_DUMP.
>
> Please, see patch attached.
Thanks for the RFC patch, I'll think about this some more and reply.
^ permalink raw reply
* Re: [PATCH 4/4] USBNET: ax88179_178a: enable tso if host supports sg dma
From: Ming Lei @ 2013-08-01 2:04 UTC (permalink / raw)
To: Eric Dumazet
Cc: Oliver Neukum, Greg Kroah-Hartman, David S. Miller, Freddy Xin,
Ben Hutchings, Grant Grundler, netdev, linux-usb
In-Reply-To: <1375283711.10515.104.camel@edumazet-glaptop>
On Wed, Jul 31, 2013 at 11:15 PM, Eric Dumazet <eric.dumazet@gmail.com> wrote:
> On Wed, 2013-07-31 at 16:02 +0200, Oliver Neukum wrote:
>
> Hmm, I would rather make sure SG is really supported before adding TSO
> support.
>
> TCP stack can build skb with fragments of any size, not multiple
> of 512 or 1024 bytes.
Now Sarah Sharp(xHCD maintainer) has Acked patch 2/4, and confirmed
SG is supported on xHCD, so I appreciate that you network guys may
review the network related changes in patch 3/4 and 4/4, then we
can move on, :-)
Thanks,
--
Ming Lei
^ permalink raw reply
* RE: [PATCH] net/fec: Don't let ndo_start_xmit return NETDEV_TX_BUSY without link
From: Duan Fugang-B38611 @ 2013-08-01 2:01 UTC (permalink / raw)
To: David Miller, u.kleine-koenig@pengutronix.de
Cc: netdev@vger.kernel.org, Estevam Fabio-R49496, Li Frank-B20596,
shawn.guo@linaro.org, kernel@pengutronix.de,
hector.palacios@digi.com, tim.sander@hbm.com, rostedt@goodmis.org,
tglx@linutronix.de, stephen@networkplumber.org,
florian@openwrt.org, bhutchings@solarflare.com
In-Reply-To: <20130731.115101.340503855490269301.davem@davemloft.net>
On Thu, Aug 01, 2013 at 02:51 AM, David Miller wrote:
>> On Tue, Jul 30, 2013 at 04:05:30PM -0700, David Miller wrote:
>>> From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>>> Date: Tue, 30 Jul 2013 11:29:40 +0200
>>>
>>> > Don't test for having link and let hardware deal with this situation.
>>> >
>>> > Without this patch I see a machine running an -rt patched Linux
>>> > being stuck in sch_direct_xmit when it looses link while there is
>>> > still a packet to be sent. In this case the fec_enet_start_xmit
>>> > routine returned NETDEV_TX_BUSY which makes the network stack
>>> > reschedule the packet and so sch_direct_xmit calls fec_enet_start_xmit again.
>>> > I failed to reproduce a complete hang without -rt, but I think the
>>> > problem exists there, too.
>>> >
>>> > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
>>>
>>> Applied, thanks.
>> Thanks, I see it as a264b981f2c76e281ef27e7232774bf6c54ec865 in
>> net.git (i.e.
>> https://git.kernel.org/cgit/linux/kernel/git/davem/net.git/commit/?id=
>> a264b981f2c76e281ef27e7232774bf6c54ec865)
>>
>> You missed to take the
>>
>> Acked-and-tested-by: Fugang Duan <B38611@freescale.com>
>
> This is not an official tag recognized by patchwork, he should say:
>
> Acked-by: Fugang Duan <B38611@freescale.com>
> Tested-by: Fugang Duan <B38611@freescale.com>
I see Linux kernel trees have many non-official tag such as: Acked-and-tested-by.
Anyway, we must follow the official rules. Thanks, David.
^ permalink raw reply
* Re: [PATCH] genetlink: fix usage of NLM_F_EXCL or NLM_F_REPLACE
From: Pablo Neira Ayuso @ 2013-08-01 2:00 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <20130801003710.GA19777@localhost>
[-- Attachment #1: Type: text/plain, Size: 856 bytes --]
On Thu, Aug 01, 2013 at 02:37:10AM +0200, Pablo Neira Ayuso wrote:
> On Wed, Jul 31, 2013 at 05:03:48PM -0700, David Miller wrote:
[...]
> > Therefore I don't see how NLM_F_REPLACE and NLM_F_EXCL can be used
> > at all, in those places, because the check is still "& NLM_F_DUMP"
>
> The kind = type&3; is doing the magic there for rtnetlink. kind == 2
> means that this is a get command, and you can only set NLM_F_DUMP
> using the get command.
>
> Since it doesn't make sense to use NLM_F_EXCL or NLM_F_REPLACE for get
> commands, there is no room for ambiguity and rtnetlink is fine.
I had re-read what I wrote to get your point. We can fix in a
different way by checking for: ops->flags & GENL_CMD_CAP_DUMP, which
means we have a .dumpit callback, so only in that case genetlink
should interpret the flags as NLM_F_DUMP.
Please, see patch attached.
[-- Attachment #2: 0001-genetlink-interpret-NLM_F_DUMP-if-GENL_CMD_CAP_DUMP-.patch --]
[-- Type: text/x-diff, Size: 1284 bytes --]
>From 0536ae81c430d007a81dbdf2989b736f4f5057f1 Mon Sep 17 00:00:00 2001
From: Pablo Neira Ayuso <pablo@netfilter.org>
Date: Thu, 1 Aug 2013 03:32:11 +0200
Subject: [PATCH] genetlink: interpret NLM_F_DUMP if GENL_CMD_CAP_DUMP flag is
set
This patch reverts (e1ee367 genetlink: fix usage of NLM_F_EXCL
or NLM_F_REPLACE) to fix the possible ambiguity for non-get
commands in a different way. Basically, we assume that genetlink
should only interpret the NLM_F_DUMP flags if the .dumpit callback
is set, which is the common case for getoperation.
This approach is similar to what rtnetlink does to resolve this
ambiguity.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
net/netlink/genetlink.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 512718a..d034728 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -571,7 +571,8 @@ static int genl_family_rcv_msg(struct genl_family *family,
!capable(CAP_NET_ADMIN))
return -EPERM;
- if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP) {
+ if ((ops->flags & GENL_CMD_CAP_DUMP) &&
+ nlh->nlmsg_flags & NLM_F_DUMP) {
struct netlink_dump_control c = {
.dump = ops->dumpit,
.done = ops->done,
--
1.7.10.4
^ permalink raw reply related
* Re: [net PATCH] atl1c: Fix misuse of netdev_alloc_skb in refilling rx ring
From: Eric Dumazet @ 2013-08-01 1:57 UTC (permalink / raw)
To: David Miller
Cc: benjamin.poirier, luis.henriques, bhutchings, nhorman, netdev,
jcliburn
In-Reply-To: <20130731.120126.2193837817631047825.davem@davemloft.net>
On Wed, 2013-07-31 at 12:01 -0700, David Miller wrote:
> I know, I realized this when I sent the pull request to Linus.
>
> Eric, your patch submission format is extremely error prone for me
> sometime. When you submit patches in email thread, and do things like
> you did here, it causes problems sometimes.
>
> Really just send it in the usual way, with the real Subject line
> matching the commit message header line you wish to use etc.
>
Sorry for that, I'll do this next times !
Thanks !
^ permalink raw reply
* Re: [Patch net-next] net: rename CONFIG_NET_LL_RX_POLL to CONFIG_NET_RX_BUSY_POLL
From: Cong Wang @ 2013-08-01 1:53 UTC (permalink / raw)
To: David Miller; +Cc: eliezer.tamir, netdev
In-Reply-To: <20130731.170103.1728448549547059368.davem@davemloft.net>
On Wed, 2013-07-31 at 17:01 -0700, David Miller wrote:
> From: Eliezer Tamir <eliezer.tamir@linux.intel.com>
> Date: Wed, 31 Jul 2013 16:35:11 +0300
>
> > On 30/07/2013 12:38, Cong Wang wrote:
> >> From: Cong Wang <amwang@redhat.com>
> >>
> >> Eliezer renames several *ll_poll to *busy_poll, but forgets
> >> CONFIG_NET_LL_RX_POLL, so in case of confusion, rename it too.
> >>
> >> Cc: Eliezer Tamir <eliezer.tamir@linux.intel.com>
> >> Cc: David S. Miller <davem@davemloft.net>
> >> Signed-off-by: Cong Wang <amwang@redhat.com>
> >
> > Looks OK to me, but I'm not able to test it since I'm away on vacation.
> > If you can test it with the usual config options and allnoconfig, then I
> > have no objections to this patch.
I tested with CONFIG_NET_RX_BUSY_POLL=y and CONFIG_NET_RX_BUSY_POLL=n.
> >
> > If you want me to test it, that can only happen early next week.
>
> Cong, you missed Documentation/sysctl/net.txt, please fix that up and
> respin this patch.
>
OK, will do.
Thanks.
^ permalink raw reply
* Re: [PATCH v4] fib_rules: add .suppress operation
From: Stefan Tomanek @ 2013-08-01 1:26 UTC (permalink / raw)
To: David Miller; +Cc: netdev, hannes, bsderandrew
In-Reply-To: <20130731.172740.549970338016485006.davem@davemloft.net>
Dies schrieb David Miller (davem@davemloft.net):
> Applied, thanks.
Thank you very much; Hannes Frederic Sowa noted some irregularities with the
error reporting in fib6_rules (message ID
<20130727060802.GD20273@order.stressinduktion.org>) that might interfere with
the function of my patch; perhaps his change should be applied as well? I've
reposted his changes with git format-patch as message ID
<20130730065258.GG13357@zirkel.wertarbyte.de> ("[PATCH v2 1/2] fib6_rules: make
error handling consistent with IPv4").
^ permalink raw reply
* Re: [PATCH 0/8] include/net: next set of extern removals
From: Joe Perches @ 2013-08-01 0:58 UTC (permalink / raw)
To: David Miller; +Cc: netdev, linux-kernel, linux-afs, linux-hams, linux-wireless
In-Reply-To: <20130731.175036.1962194560242893587.davem@davemloft.net>
On Wed, 2013-07-31 at 17:50 -0700, David Miller wrote:
> From: Joe Perches <joe@perches.com>
> Date: Wed, 31 Jul 2013 17:31:31 -0700
> > Standardize on no extern use on function prototypes
[]
> Please hold off for a few days before the next batch so we can watch
> for any fallout from this one.
Sure.
If/when nothing bad happens I'll send another couple
of sets next week.
^ permalink raw reply
* Re: [PATCH 0/8] include/net: next set of extern removals
From: David Miller @ 2013-08-01 0:50 UTC (permalink / raw)
To: joe; +Cc: netdev, linux-kernel, linux-afs, linux-hams, linux-wireless
In-Reply-To: <cover.1375316912.git.joe@perches.com>
From: Joe Perches <joe@perches.com>
Date: Wed, 31 Jul 2013 17:31:31 -0700
> Standardize on no extern use on function prototypes
>
> Joe Perches (8):
> addrconf.h: Remove extern function prototypes
> af_unix.h: Remove extern from function prototypes
> af_rxrpc.h: Remove extern from function prototypes
> arp/neighbour.h: Remove extern from function prototypes
> ax25.h: Remove extern from function prototypes
> cfg80211.h/mac80211.h: Remove extern from function prototypes
> checksum: Remove extern from function prototypes
> cls_cgroup.h netprio_cgroup.h: Remove extern from function prototypes
I guess there is no time like the present to apply something like
this, so I have.
Please hold off for a few days before the next batch so we can watch
for any fallout from this one.
Thanks Joe.
^ permalink raw reply
* Re: [PATCHv3] bridge: disable snooping if there is no querier
From: David Miller @ 2013-08-01 0:40 UTC (permalink / raw)
To: linus.luessing
Cc: amwang, netdev, bridge, linux-kernel, linux, stephen, herbert
In-Reply-To: <1375311980-25575-1-git-send-email-linus.luessing@web.de>
From: Linus Lüssing <linus.luessing@web.de>
Date: Thu, 1 Aug 2013 01:06:20 +0200
> If there is no querier on a link then we won't get periodic reports and
> therefore won't be able to learn about multicast listeners behind ports,
> potentially leading to lost multicast packets, especially for multicast
> listeners that joined before the creation of the bridge.
>
> These lost multicast packets can appear since c5c23260594
> ("bridge: Add multicast_querier toggle and disable queries by default")
> in particular.
>
> With this patch we are flooding multicast packets if our querier is
> disabled and if we didn't detect any other querier.
>
> A grace period of the Maximum Response Delay of the querier is added to
> give multicast responses enough time to arrive and to be learned from
> before disabling the flooding behaviour again.
>
> Signed-off-by: Linus Lüssing <linus.luessing@web.de>
Looks good, applied, thanks Linus.
^ permalink raw reply
* Re: [PATCH] genetlink: fix usage of NLM_F_EXCL or NLM_F_REPLACE
From: Pablo Neira Ayuso @ 2013-08-01 0:37 UTC (permalink / raw)
To: David Miller; +Cc: netdev
In-Reply-To: <20130731.170348.1752477967026355787.davem@davemloft.net>
On Wed, Jul 31, 2013 at 05:03:48PM -0700, David Miller wrote:
> From: Pablo Neira Ayuso <pablo@netfilter.org>
> Date: Wed, 31 Jul 2013 13:12:15 +0200
>
> > Hi David!
> >
> > On Tue, Jul 30, 2013 at 04:44:23PM -0700, David Miller wrote:
> >> From: Pablo Neira Ayuso <pablo@netfilter.org>
> >> Date: Mon, 29 Jul 2013 12:30:04 +0200
> >>
> >> > Currently, it is not possible to use neither NLM_F_EXCL nor
> >> > NLM_F_REPLACE from genetlink. This is due to this checking in
> >> > genl_family_rcv_msg:
> >> >
> >> > if (nlh->nlmsg_flags & NLM_F_DUMP)
> >> >
> >> > NLM_F_DUMP is NLM_F_MATCH|NLM_F_ROOT. Thus, if NLM_F_EXCL or
> >> > NLM_F_REPLACE flag is set, genetlink believes that you're
> >> > requesting a dump and it calls the .dumpit callback.
> >> >
> >> > The solution that I propose is to refine this checking to
> >> > make it stricter:
> >> >
> >> > if ((nlh->nlmsg_flags & NLM_F_DUMP) == NLM_F_DUMP)
> >> >
> >> > And given the combination NLM_F_REPLACE and NLM_F_EXCL does
> >> > not make sense to me, it removes the ambiguity.
> >> >
> >> > There was a patch that tried to fix this some time ago (0ab03c2
> >> > netlink: test for all flags of the NLM_F_DUMP composite) but it
> >> > tried to resolve this ambiguity in *all* existing netlink subsystems,
> >> > not only genetlink. That patch was reverted since it broke iproute2,
> >> > which is using NLM_F_ROOT to request the dump of the routing cache.
> >> >
> >> > Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> >>
> >> Yes, I remember that old attempt to fix this.
> >>
> >> Ok, let's see what happens when we limit the scope of this change
> >> to just genetlink users.
> >>
> >> I honestly can't believe that NLM_F_EXCL and NLM_F_REPLACE are
> >> completely unusable in normal rtnetlink interfaces.
> >
> > I guess you mean 'genetlink' instead of 'rtnetlink'.
>
> I really meant 'rtnetlink' and netlink in general. As you stated, we
> tried to make the same check for all netlink users, and it had to
> be reverted because iproute2 uses NLM_F_ROOT to get a dump.
Oh I see, sorry.
> Therefore I don't see how NLM_F_REPLACE and NLM_F_EXCL can be used
> at all, in those places, because the check is still "& NLM_F_DUMP"
The kind = type&3; is doing the magic there for rtnetlink. kind == 2
means that this is a get command, and you can only set NLM_F_DUMP
using the get command.
Since it doesn't make sense to use NLM_F_EXCL or NLM_F_REPLACE for get
commands, there is no room for ambiguity and rtnetlink is fine.
The old patch was too ambicious IMO, as it was trying to enforce
something in all netlink subsystems that we only needed to fix
genetlink.
^ permalink raw reply
* Re: [PATCH net-next] Documentation: add networking/netdev-FAQ.txt
From: David Miller @ 2013-08-01 0:37 UTC (permalink / raw)
To: paul.gortmaker; +Cc: linux-doc, netdev
In-Reply-To: <1375298180-17628-1-git-send-email-paul.gortmaker@windriver.com>
From: Paul Gortmaker <paul.gortmaker@windriver.com>
Date: Wed, 31 Jul 2013 15:16:20 -0400
> A collection of expectations and operational details about how
> networking development takes place in the context of the netdev
> mailing list.
>
> The content is meant to capture specific items that are unique
> to netdev workflow, and not re-document generic linux expectations
> that are already captured elsewhere.
>
> This was originally proposed[1] as a regular posting mailing list
> FAQ, but it probably is more universally accessible here in tree.
>
> [1] https://lwn.net/Articles/559211/
>
> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
This is fantastic, thanks for following up on this.
Applied.
^ permalink raw reply
* [PATCH 7/8] checksum: Remove extern from function prototypes
From: Joe Perches @ 2013-08-01 0:31 UTC (permalink / raw)
To: netdev; +Cc: David S. Miller, linux-kernel
In-Reply-To: <cover.1375316912.git.joe@perches.com>
There are a mix of function prototypes with and without extern
in the kernel sources. Standardize on not using extern for
function prototypes.
Function prototypes don't need to be written with extern.
extern is assumed by the compiler. Its use is as unnecessary as
using auto to declare automatic/local variables in a block.
Signed-off-by: Joe Perches <joe@perches.com>
---
include/net/checksum.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/net/checksum.h b/include/net/checksum.h
index 600d1d7..8f59ca5 100644
--- a/include/net/checksum.h
+++ b/include/net/checksum.h
@@ -107,11 +107,11 @@ static inline void csum_replace2(__sum16 *sum, __be16 from, __be16 to)
}
struct sk_buff;
-extern void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
- __be32 from, __be32 to, int pseudohdr);
-extern void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
- const __be32 *from, const __be32 *to,
- int pseudohdr);
+void inet_proto_csum_replace4(__sum16 *sum, struct sk_buff *skb,
+ __be32 from, __be32 to, int pseudohdr);
+void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
+ const __be32 *from, const __be32 *to,
+ int pseudohdr);
static inline void inet_proto_csum_replace2(__sum16 *sum, struct sk_buff *skb,
__be16 from, __be16 to,
--
1.8.1.2.459.gbcd45b4.dirty
^ permalink raw reply related
* Re: [PATCH net-next v4] net: split rt_genid for ipv4 and ipv6
From: Fan Du @ 2013-08-01 0:33 UTC (permalink / raw)
To: David Miller
Cc: hannes, nicolas.dichtel, yoshfuji, jmorris, steffen.klassert,
paul, netdev
In-Reply-To: <20130731.145710.1507535169314670977.davem@davemloft.net>
On 2013年08月01日 05:57, David Miller wrote:
> From: Hannes Frederic Sowa<hannes@stressinduktion.org>
> Date: Tue, 30 Jul 2013 09:07:02 +0200
>
>> On Tue, Jul 30, 2013 at 08:33:53AM +0800, Fan Du wrote:
>>> Current net name space has only one genid for both IPv4 and IPv6, it has below
>>> drawbacks:
>>>
>>> - Add/delete an IPv4 address will invalidate all IPv6 routing table entries.
>>> - Insert/remove XFRM policy will also invalidate both IPv4/IPv6 routing table
>>> entries even when the policy is only applied for one address family.
>>>
>>> Thus, this patch attempt to split one genid for two to cater for IPv4 and IPv6
>>> separately in a fine granularity.
>>>
>>> Signed-off-by: Fan Du<fan.du@windriver.com>
>>
>> Also this patch only applies with some fuzz, it addressed all my issues:
>>
>> Acked-by: Hannes Frederic Sowa<hannes@stressinduktion.org>
>
> Applied, thanks.
>
Thanks Dave, Hannes, Steffen and Nicolas for reviewing this patch!
--
浮沉随浪只记今朝笑
--fan
^ permalink raw reply
* [PATCH 8/8] cls_cgroup.h netprio_cgroup.h: Remove extern from function prototypes
From: Joe Perches @ 2013-08-01 0:31 UTC (permalink / raw)
To: netdev; +Cc: David S. Miller, linux-kernel
In-Reply-To: <cover.1375316912.git.joe@perches.com>
There are a mix of function prototypes with and without extern
in the kernel sources. Standardize on not using extern for
function prototypes.
Function prototypes don't need to be written with extern.
extern is assumed by the compiler. Its use is as unnecessary as
using auto to declare automatic/local variables in a block.
Signed-off-by: Joe Perches <joe@perches.com>
---
include/net/cls_cgroup.h | 2 +-
include/net/netprio_cgroup.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/include/net/cls_cgroup.h b/include/net/cls_cgroup.h
index 0fee061..f55c145 100644
--- a/include/net/cls_cgroup.h
+++ b/include/net/cls_cgroup.h
@@ -24,7 +24,7 @@ struct cgroup_cls_state
u32 classid;
};
-extern void sock_update_classid(struct sock *sk);
+void sock_update_classid(struct sock *sk);
#if IS_BUILTIN(CONFIG_NET_CLS_CGROUP)
static inline u32 task_cls_classid(struct task_struct *p)
diff --git a/include/net/netprio_cgroup.h b/include/net/netprio_cgroup.h
index 50ab8c2..379dd5d 100644
--- a/include/net/netprio_cgroup.h
+++ b/include/net/netprio_cgroup.h
@@ -29,7 +29,7 @@ struct cgroup_netprio_state {
struct cgroup_subsys_state css;
};
-extern void sock_update_netprioidx(struct sock *sk);
+void sock_update_netprioidx(struct sock *sk);
#if IS_BUILTIN(CONFIG_NETPRIO_CGROUP)
--
1.8.1.2.459.gbcd45b4.dirty
^ permalink raw reply related
* [PATCH 6/8] cfg80211.h/mac80211.h: Remove extern from function prototypes
From: Joe Perches @ 2013-08-01 0:31 UTC (permalink / raw)
To: netdev; +Cc: Johannes Berg, David S. Miller, linux-wireless, linux-kernel
In-Reply-To: <cover.1375316912.git.joe@perches.com>
There are a mix of function prototypes with and without extern
in the kernel sources. Standardize on not using extern for
function prototypes.
Function prototypes don't need to be written with extern.
extern is assumed by the compiler. Its use is as unnecessary as
using auto to declare automatic/local variables in a block.
Reflow modified prototypes to 80 columns.
Signed-off-by: Joe Perches <joe@perches.com>
---
include/net/cfg80211.h | 34 +++++++++++++++++-----------------
include/net/mac80211.h | 16 ++++++++--------
2 files changed, 25 insertions(+), 25 deletions(-)
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 7b0730a..f49de28 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -2841,7 +2841,7 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv);
*
* Return: A non-negative wiphy index or a negative error code.
*/
-extern int wiphy_register(struct wiphy *wiphy);
+int wiphy_register(struct wiphy *wiphy);
/**
* wiphy_unregister - deregister a wiphy from cfg80211
@@ -2852,14 +2852,14 @@ extern int wiphy_register(struct wiphy *wiphy);
* pointer, but the call may sleep to wait for an outstanding
* request that is being handled.
*/
-extern void wiphy_unregister(struct wiphy *wiphy);
+void wiphy_unregister(struct wiphy *wiphy);
/**
* wiphy_free - free wiphy
*
* @wiphy: The wiphy to free
*/
-extern void wiphy_free(struct wiphy *wiphy);
+void wiphy_free(struct wiphy *wiphy);
/* internal structs */
struct cfg80211_conn;
@@ -3014,14 +3014,14 @@ static inline void *wdev_priv(struct wireless_dev *wdev)
* @band: band, necessary due to channel number overlap
* Return: The corresponding frequency (in MHz), or 0 if the conversion failed.
*/
-extern int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band);
+int ieee80211_channel_to_frequency(int chan, enum ieee80211_band band);
/**
* ieee80211_frequency_to_channel - convert frequency to channel number
* @freq: center frequency
* Return: The corresponding channel, or 0 if the conversion failed.
*/
-extern int ieee80211_frequency_to_channel(int freq);
+int ieee80211_frequency_to_channel(int freq);
/*
* Name indirection necessary because the ieee80211 code also has
@@ -3030,8 +3030,8 @@ extern int ieee80211_frequency_to_channel(int freq);
* to include both header files you'll (rightfully!) get a symbol
* clash.
*/
-extern struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
- int freq);
+struct ieee80211_channel *__ieee80211_get_channel(struct wiphy *wiphy,
+ int freq);
/**
* ieee80211_get_channel - get channel struct from wiphy for specified frequency
* @wiphy: the struct wiphy to get the channel for
@@ -3141,13 +3141,14 @@ struct ieee80211_radiotap_iterator {
int _reset_on_ext;
};
-extern int ieee80211_radiotap_iterator_init(
- struct ieee80211_radiotap_iterator *iterator,
- struct ieee80211_radiotap_header *radiotap_header,
- int max_length, const struct ieee80211_radiotap_vendor_namespaces *vns);
+int
+ieee80211_radiotap_iterator_init(struct ieee80211_radiotap_iterator *iterator,
+ struct ieee80211_radiotap_header *radiotap_header,
+ int max_length,
+ const struct ieee80211_radiotap_vendor_namespaces *vns);
-extern int ieee80211_radiotap_iterator_next(
- struct ieee80211_radiotap_iterator *iterator);
+int
+ieee80211_radiotap_iterator_next(struct ieee80211_radiotap_iterator *iterator);
extern const unsigned char rfc1042_header[6];
@@ -3307,7 +3308,7 @@ const u8 *cfg80211_find_vendor_ie(unsigned int oui, u8 oui_type,
*
* Return: 0 on success. -ENOMEM.
*/
-extern int regulatory_hint(struct wiphy *wiphy, const char *alpha2);
+int regulatory_hint(struct wiphy *wiphy, const char *alpha2);
/**
* wiphy_apply_custom_regulatory - apply a custom driver regulatory domain
@@ -3321,9 +3322,8 @@ extern int regulatory_hint(struct wiphy *wiphy, const char *alpha2);
* default channel settings will be disregarded. If no rule is found for a
* channel on the regulatory domain the channel will be disabled.
*/
-extern void wiphy_apply_custom_regulatory(
- struct wiphy *wiphy,
- const struct ieee80211_regdomain *regd);
+void wiphy_apply_custom_regulatory(struct wiphy *wiphy,
+ const struct ieee80211_regdomain *regd);
/**
* freq_reg_info - get regulatory information for the given frequency
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 5b7a3da..e5f0290 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2877,14 +2877,14 @@ enum ieee80211_tpt_led_trigger_flags {
};
#ifdef CONFIG_MAC80211_LEDS
-extern char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw);
-extern char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw);
-extern char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw);
-extern char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw);
-extern char *__ieee80211_create_tpt_led_trigger(
- struct ieee80211_hw *hw, unsigned int flags,
- const struct ieee80211_tpt_blink *blink_table,
- unsigned int blink_table_len);
+char *__ieee80211_get_tx_led_name(struct ieee80211_hw *hw);
+char *__ieee80211_get_rx_led_name(struct ieee80211_hw *hw);
+char *__ieee80211_get_assoc_led_name(struct ieee80211_hw *hw);
+char *__ieee80211_get_radio_led_name(struct ieee80211_hw *hw);
+char *__ieee80211_create_tpt_led_trigger(struct ieee80211_hw *hw,
+ unsigned int flags,
+ const struct ieee80211_tpt_blink *blink_table,
+ unsigned int blink_table_len);
#endif
/**
* ieee80211_get_tx_led_name - get name of TX LED
--
1.8.1.2.459.gbcd45b4.dirty
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox