Commit ca32fb03 authored by Subash Abhinov Kasiviswanathan's avatar Subash Abhinov Kasiviswanathan Committed by David S. Miller
Browse files

net: qualcomm: rmnet: Add support for GRO



Add gro_cells so that rmnet devices can call gro_cells_receive
instead of netif_receive_skb.

Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
Cc: Eric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 192c4b5d
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -5,6 +5,7 @@
menuconfig RMNET
menuconfig RMNET
	tristate "RmNet MAP driver"
	tristate "RmNet MAP driver"
	default n
	default n
	select GRO_CELLS
	---help---
	---help---
	  If you select this, you will enable the RMNET module which is used
	  If you select this, you will enable the RMNET module which is used
	  for handling data in the multiplexing and aggregation protocol (MAP)
	  for handling data in the multiplexing and aggregation protocol (MAP)
+2 −0
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@
 */
 */


#include <linux/skbuff.h>
#include <linux/skbuff.h>
#include <net/gro_cells.h>


#ifndef _RMNET_CONFIG_H_
#ifndef _RMNET_CONFIG_H_
#define _RMNET_CONFIG_H_
#define _RMNET_CONFIG_H_
@@ -58,6 +59,7 @@ struct rmnet_priv {
	u8 mux_id;
	u8 mux_id;
	struct net_device *real_dev;
	struct net_device *real_dev;
	struct rmnet_pcpu_stats __percpu *pcpu_stats;
	struct rmnet_pcpu_stats __percpu *pcpu_stats;
	struct gro_cells gro_cells;
};
};


struct rmnet_port *rmnet_get_port(struct net_device *real_dev);
struct rmnet_port *rmnet_get_port(struct net_device *real_dev);
+3 −1
Original line number Original line Diff line number Diff line
@@ -46,13 +46,15 @@ static void rmnet_set_skb_proto(struct sk_buff *skb)
static void
static void
rmnet_deliver_skb(struct sk_buff *skb)
rmnet_deliver_skb(struct sk_buff *skb)
{
{
	struct rmnet_priv *priv = netdev_priv(skb->dev);

	skb_reset_transport_header(skb);
	skb_reset_transport_header(skb);
	skb_reset_network_header(skb);
	skb_reset_network_header(skb);
	rmnet_vnd_rx_fixup(skb, skb->dev);
	rmnet_vnd_rx_fixup(skb, skb->dev);


	skb->pkt_type = PACKET_HOST;
	skb->pkt_type = PACKET_HOST;
	skb_set_mac_header(skb, 0);
	skb_set_mac_header(skb, 0);
	netif_receive_skb(skb);
	gro_cells_receive(&priv->gro_cells, skb);
}
}


/* MAP handler */
/* MAP handler */
+8 −0
Original line number Original line Diff line number Diff line
@@ -87,11 +87,18 @@ static int rmnet_vnd_get_iflink(const struct net_device *dev)
static int rmnet_vnd_init(struct net_device *dev)
static int rmnet_vnd_init(struct net_device *dev)
{
{
	struct rmnet_priv *priv = netdev_priv(dev);
	struct rmnet_priv *priv = netdev_priv(dev);
	int err;


	priv->pcpu_stats = alloc_percpu(struct rmnet_pcpu_stats);
	priv->pcpu_stats = alloc_percpu(struct rmnet_pcpu_stats);
	if (!priv->pcpu_stats)
	if (!priv->pcpu_stats)
		return -ENOMEM;
		return -ENOMEM;


	err = gro_cells_init(&priv->gro_cells, dev);
	if (err) {
		free_percpu(priv->pcpu_stats);
		return err;
	}

	return 0;
	return 0;
}
}


@@ -99,6 +106,7 @@ static void rmnet_vnd_uninit(struct net_device *dev)
{
{
	struct rmnet_priv *priv = netdev_priv(dev);
	struct rmnet_priv *priv = netdev_priv(dev);


	gro_cells_destroy(&priv->gro_cells);
	free_percpu(priv->pcpu_stats);
	free_percpu(priv->pcpu_stats);
}
}