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

Commit 7cd9c57c authored by Conner Huff's avatar Conner Huff Committed by Gerrit - the friendly Code Review server
Browse files

net: qualcomm: rmnet: Dl marker v2 callbacks



Modify the callbacks for Dl marker so that they can
handle new qcmd field in dl marker v2 variant of.
Accompanying rmnet modules will now
register to the v2 callback interface variant.

Change-Id: Ic242b2cdd9048f77864d514a846160aa08506de6
Signed-off-by: default avatarConner Huff <chuff@codeaurora.org>
parent ebfbb23f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -29,6 +29,9 @@ struct rmnet_endpoint {
};

struct rmnet_port_priv_stats {
	u64 dl_hdr_last_qmap_vers;
	u64 dl_hdr_last_ep_id;
	u64 dl_hdr_last_trans_id;
	u64 dl_hdr_last_seq;
	u64 dl_hdr_last_bytes;
	u64 dl_hdr_last_pkts;
+24 −6
Original line number Diff line number Diff line
@@ -129,8 +129,10 @@ struct rmnet_map_ul_csum_header {
struct rmnet_map_control_command_header {
	u8 command_name;
	u8 cmd_type:2;
	u8  reserved:6;
	u16 reserved2;
	u8 reserved:5;
	u8 e:1;
	u16 source_id:15;
	u16 ext:1;
	u32 transaction_id;
}  __aligned(1);

@@ -176,8 +178,18 @@ struct rmnet_map_dl_ind_trl {

struct rmnet_map_dl_ind {
	u8 priority;
	union {
		void (*dl_hdr_handler)(struct rmnet_map_dl_ind_hdr *);
		void (*dl_hdr_handler_v2)(struct rmnet_map_dl_ind_hdr *,
					  struct
					  rmnet_map_control_command_header *);
	} __aligned(1);
	union {
		void (*dl_trl_handler)(struct rmnet_map_dl_ind_trl *);
		void (*dl_trl_handler_v2)(struct rmnet_map_dl_ind_trl *,
					  struct
					  rmnet_map_control_command_header *);
	} __aligned(1);
	struct list_head list;
};

@@ -257,8 +269,14 @@ void rmnet_map_tx_aggregate_init(struct rmnet_port *port);
void rmnet_map_tx_aggregate_exit(struct rmnet_port *port);
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,
				struct rmnet_map_dl_ind_hdr *dl_hdr,
				struct rmnet_map_control_command_header *qcmd);
void rmnet_map_dl_trl_notify(struct rmnet_port *port,
			     struct rmnet_map_dl_ind_trl *dltrl);
void rmnet_map_dl_trl_notify_v2(struct rmnet_port *port,
				struct rmnet_map_dl_ind_trl *dltrl,
				struct rmnet_map_control_command_header *qcmd);
int rmnet_map_flow_command(struct sk_buff *skb,
			   struct rmnet_port *port,
			   bool rmnet_perf);
+79 −10
Original line number Diff line number Diff line
@@ -96,7 +96,21 @@ static void rmnet_map_send_ack(struct sk_buff *skb,
	netif_tx_unlock(dev);
}

void rmnet_map_dl_hdr_notify(struct rmnet_port *port,
void
rmnet_map_dl_hdr_notify_v2(struct rmnet_port *port,
			   struct rmnet_map_dl_ind_hdr *dlhdr,
			   struct rmnet_map_control_command_header *qcmd)
{
	struct rmnet_map_dl_ind *tmp;

	port->dl_marker_flush = 0;

	list_for_each_entry(tmp, &port->dl_list, list)
		tmp->dl_hdr_handler_v2(dlhdr, qcmd);
}

void
rmnet_map_dl_hdr_notify(struct rmnet_port *port,
			struct rmnet_map_dl_ind_hdr *dlhdr)
{
	struct rmnet_map_dl_ind *tmp;
@@ -107,7 +121,27 @@ void rmnet_map_dl_hdr_notify(struct rmnet_port *port,
		tmp->dl_hdr_handler(dlhdr);
}

void rmnet_map_dl_trl_notify(struct rmnet_port *port,
void
rmnet_map_dl_trl_notify_v2(struct rmnet_port *port,
			   struct rmnet_map_dl_ind_trl *dltrl,
			   struct rmnet_map_control_command_header *qcmd)
{
	struct rmnet_map_dl_ind *tmp;
	struct napi_struct *napi;

	list_for_each_entry(tmp, &port->dl_list, list)
		tmp->dl_trl_handler_v2(dltrl, qcmd);

	if (port->dl_marker_flush) {
		napi = get_current_napi_context();
		napi_gro_flush(napi, false);
	}

	port->dl_marker_flush = -1;
}

void
rmnet_map_dl_trl_notify(struct rmnet_port *port,
			struct rmnet_map_dl_ind_trl *dltrl)
{
	struct rmnet_map_dl_ind *tmp;
@@ -129,11 +163,26 @@ static void rmnet_map_process_flow_start(struct sk_buff *skb,
					 bool rmnet_perf)
{
	struct rmnet_map_dl_ind_hdr *dlhdr;
	struct rmnet_map_control_command_header *qcmd;
	u32 data_format;
	bool is_dl_mark_v2;

	if (skb->len < RMNET_DL_IND_HDR_SIZE)
		return;

	data_format = port->data_format;
	is_dl_mark_v2 = data_format & RMNET_INGRESS_FORMAT_DL_MARKER_V2;
	if (is_dl_mark_v2) {
		pskb_pull(skb, sizeof(struct rmnet_map_header));
		qcmd = (struct rmnet_map_control_command_header *)
			rmnet_map_data_ptr(skb);
		port->stats.dl_hdr_last_ep_id = qcmd->source_id;
		port->stats.dl_hdr_last_qmap_vers = qcmd->reserved;
		port->stats.dl_hdr_last_trans_id = qcmd->transaction_id;
		pskb_pull(skb, sizeof(struct rmnet_map_control_command_header));
	} else {
		pskb_pull(skb, RMNET_MAP_CMD_SIZE);
	}

	dlhdr = (struct rmnet_map_dl_ind_hdr *)rmnet_map_data_ptr(skb);

@@ -145,12 +194,16 @@ static void rmnet_map_process_flow_start(struct sk_buff *skb,
	port->stats.dl_hdr_total_pkts += port->stats.dl_hdr_last_pkts;
	port->stats.dl_hdr_count++;

	if (is_dl_mark_v2)
		rmnet_map_dl_hdr_notify_v2(port, dlhdr, qcmd);
	else
		rmnet_map_dl_hdr_notify(port, dlhdr);

	if (rmnet_perf) {
		unsigned int pull_size;

		pull_size = sizeof(struct rmnet_map_dl_ind_hdr);
		if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
		if (data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
			pull_size += sizeof(struct rmnet_map_dl_csum_trailer);
		pskb_pull(skb, pull_size);
	}
@@ -161,23 +214,39 @@ static void rmnet_map_process_flow_end(struct sk_buff *skb,
				       bool rmnet_perf)
{
	struct rmnet_map_dl_ind_trl *dltrl;
	struct rmnet_map_control_command_header *qcmd;
	u32 data_format;
	bool is_dl_mark_v2;

	if (skb->len < RMNET_DL_IND_TRL_SIZE)
		return;

	data_format = port->data_format;
	is_dl_mark_v2 = data_format & RMNET_INGRESS_FORMAT_DL_MARKER_V2;
	if (is_dl_mark_v2) {
		pskb_pull(skb, sizeof(struct rmnet_map_header));
		qcmd = (struct rmnet_map_control_command_header *)
			rmnet_map_data_ptr(skb);
		pskb_pull(skb, sizeof(struct rmnet_map_control_command_header));
	} else {
		pskb_pull(skb, RMNET_MAP_CMD_SIZE);
	}

	dltrl = (struct rmnet_map_dl_ind_trl *)rmnet_map_data_ptr(skb);

	port->stats.dl_trl_last_seq = dltrl->seq_le;
	port->stats.dl_trl_count++;

	if (is_dl_mark_v2)
		rmnet_map_dl_trl_notify_v2(port, dltrl, qcmd);
	else
		rmnet_map_dl_trl_notify(port, dltrl);

	if (rmnet_perf) {
		unsigned int pull_size;

		pull_size = sizeof(struct rmnet_map_dl_ind_trl);
		if (port->data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
		if (data_format & RMNET_FLAGS_INGRESS_MAP_CKSUMV4)
			pull_size += sizeof(struct rmnet_map_dl_csum_trailer);
		pskb_pull(skb, pull_size);
	}
+6 −3
Original line number Diff line number Diff line
/* Copyright (c) 2013-2014, 2016-2018 The Linux Foundation. All rights reserved.
/* Copyright (c) 2013-2014, 2016-2019 The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -20,8 +20,11 @@

/* Constants */
#define RMNET_EGRESS_FORMAT_AGGREGATION         BIT(31)
#define RMNET_INGRESS_FORMAT_DL_MARKER          BIT(30)
#define RMNET_INGRESS_FORMAT_RPS_STAMP          BIG(29)
#define RMNET_INGRESS_FORMAT_DL_MARKER_V1       BIT(30)
#define RMNET_INGRESS_FORMAT_DL_MARKER_V2       BIT(29)

#define RMNET_INGRESS_FORMAT_DL_MARKER  (RMNET_INGRESS_FORMAT_DL_MARKER_V1 |\
RMNET_INGRESS_FORMAT_DL_MARKER_V2)

/* Power save feature*/
#define RMNET_INGRESS_FORMAT_PS                 BIT(27)
+3 −0
Original line number Diff line number Diff line
@@ -224,6 +224,9 @@ static const char rmnet_gstrings_stats[][ETH_GSTRING_LEN] = {
};

static const char rmnet_port_gstrings_stats[][ETH_GSTRING_LEN] = {
	"MAP Cmd last version",
	"MAP Cmd last ep id",
	"MAP Cmd last transaction id",
	"DL header last seen sequence",
	"DL header last seen bytes",
	"DL header last seen packets",