Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8658fe7 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "net: qualcomm: rmnet: Refactor uplink aggregation"

parents 8cb43599 1d86232b
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -389,14 +389,12 @@ static int rmnet_changelink(struct net_device *dev, struct nlattr *tb[],
	}

	if (data[IFLA_RMNET_UL_AGG_PARAMS]) {
		void *agg_params;
		unsigned long irq_flags;
		struct rmnet_egress_agg_params *agg_params;

		agg_params = nla_data(data[IFLA_RMNET_UL_AGG_PARAMS]);
		spin_lock_irqsave(&port->agg_lock, irq_flags);
		memcpy(&port->egress_agg_params, agg_params,
		       sizeof(port->egress_agg_params));
		spin_unlock_irqrestore(&port->agg_lock, irq_flags);
		rmnet_map_update_ul_agg_config(port, agg_params->agg_size,
					       agg_params->agg_count,
					       agg_params->agg_time);
	}

	return 0;
+2 −0
Original line number Diff line number Diff line
@@ -261,6 +261,8 @@ int rmnet_map_tx_agg_skip(struct sk_buff *skb, int offset);
void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port);
void rmnet_map_tx_aggregate_init(struct rmnet_port *port);
void rmnet_map_tx_aggregate_exit(struct rmnet_port *port);
void rmnet_map_update_ul_agg_config(struct rmnet_port *port, u16 size,
				    u16 count, u32 time);
void rmnet_map_dl_hdr_notify(struct rmnet_port *port,
			     struct rmnet_map_dl_ind_hdr *dl_hdr);
void rmnet_map_dl_hdr_notify_v2(struct rmnet_port *port,
+20 −5
Original line number Diff line number Diff line
@@ -1250,6 +1250,11 @@ static void rmnet_map_linearize_copy(struct sk_buff *dst, struct sk_buff *src)
	}
}

static struct sk_buff *rmnet_map_build_skb(struct rmnet_port *port)
{
	return alloc_skb(port->egress_agg_params.agg_size, GFP_ATOMIC);
}

void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port)
{
	struct timespec diff, last;
@@ -1277,8 +1282,7 @@ void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port)
			return;
		}

		port->agg_skb = alloc_skb(port->egress_agg_params.agg_size,
					  GFP_ATOMIC);
		port->agg_skb = rmnet_map_build_skb(port);
		if (!port->agg_skb) {
			port->agg_skb = 0;
			port->agg_count = 0;
@@ -1328,15 +1332,26 @@ void rmnet_map_tx_aggregate(struct sk_buff *skb, struct rmnet_port *port)
	spin_unlock_irqrestore(&port->agg_lock, flags);
}

void rmnet_map_update_ul_agg_config(struct rmnet_port *port, u16 size,
				    u16 count, u32 time)
{
	unsigned long irq_flags;

	spin_lock_irqsave(&port->agg_lock, irq_flags);
	port->egress_agg_params.agg_size = size;
	port->egress_agg_params.agg_count = count;
	port->egress_agg_params.agg_time = time;
	spin_unlock_irqrestore(&port->agg_lock, irq_flags);
}

void rmnet_map_tx_aggregate_init(struct rmnet_port *port)
{
	hrtimer_init(&port->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
	port->hrtimer.function = rmnet_map_flush_tx_packet_queue;
	port->egress_agg_params.agg_size = 8192;
	port->egress_agg_params.agg_count = 20;
	port->egress_agg_params.agg_time = 3000000;
	spin_lock_init(&port->agg_lock);

	rmnet_map_update_ul_agg_config(port, 8192, 20, 3000000);

	INIT_WORK(&port->agg_wq, rmnet_map_flush_tx_packet_work);
}

+6 −0
Original line number Diff line number Diff line
@@ -276,6 +276,7 @@ static int rmnet_stats_reset(struct net_device *dev)
{
	struct rmnet_priv *priv = netdev_priv(dev);
	struct rmnet_port_priv_stats *stp;
	struct rmnet_priv_stats *st;
	struct rmnet_port *port;

	port = rmnet_get_port(priv->real_dev);
@@ -285,6 +286,11 @@ static int rmnet_stats_reset(struct net_device *dev)
	stp = &port->stats;

	memset(stp, 0, sizeof(*stp));

	st = &priv->stats;

	memset(st, 0, sizeof(*st));

	return 0;
}