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

Commit f035e999 authored by Sean Tranchetti's avatar Sean Tranchetti
Browse files

net: qualcomm: rmnet: Add UL packet prioritization



Packets that have the skb->priority field set will now have a QMAPv5
checksum offload header with the new Priority bit marked as 1.

QMAPv5 checksum offload can continue to be used as normal with this
feature, and any combination of priority and csum offload is supported.

Change-Id: I2ce2483ed5f8cb35385ed6bcd64c717d136346a3
Signed-off-by: default avatarSean Tranchetti <stranche@codeaurora.org>
parent 079f3c30
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ struct rmnet_priv_stats {
	u64 csum_sw;
	u64 csum_hw;
	struct rmnet_coal_stats coal;
	u64 ul_prio;
};

struct rmnet_priv {
+4 −2
Original line number Diff line number Diff line
@@ -373,7 +373,8 @@ static int rmnet_map_egress_handler(struct sk_buff *skb,
	if (port->data_format & RMNET_FLAGS_EGRESS_MAP_CKSUMV4) {
		additional_header_len = sizeof(struct rmnet_map_ul_csum_header);
		csum_type = RMNET_FLAGS_EGRESS_MAP_CKSUMV4;
	} else if (port->data_format & RMNET_FLAGS_EGRESS_MAP_CKSUMV5) {
	} else if ((port->data_format & RMNET_FLAGS_EGRESS_MAP_CKSUMV5) ||
		   (port->data_format & RMNET_EGRESS_FORMAT_PRIORITY)) {
		additional_header_len = sizeof(struct rmnet_map_v5_csum_header);
		csum_type = RMNET_FLAGS_EGRESS_MAP_CKSUMV5;
	}
@@ -391,7 +392,8 @@ static int rmnet_map_egress_handler(struct sk_buff *skb,
#endif

	if (csum_type)
		rmnet_map_checksum_uplink_packet(skb, orig_dev, csum_type);
		rmnet_map_checksum_uplink_packet(skb, port, orig_dev,
						 csum_type);

	map_header = rmnet_map_add_map_header(skb, additional_header_len, 0,
					      port);
+4 −1
Original line number Diff line number Diff line
@@ -71,7 +71,9 @@ struct rmnet_map_header {
struct rmnet_map_v5_csum_header {
	u8  next_hdr:1;
	u8  header_type:7;
	u8  hw_reserved:7;
	u8  hw_reserved:5;
	u8  priority:1;
	u8  hw_reserved_bit:1;
	u8  csum_valid_required:1;
	__be16 reserved;
} __aligned(1);
@@ -251,6 +253,7 @@ struct rmnet_map_header *rmnet_map_add_map_header(struct sk_buff *skb,
void rmnet_map_command(struct sk_buff *skb, struct rmnet_port *port);
int rmnet_map_checksum_downlink_packet(struct sk_buff *skb, u16 len);
void rmnet_map_checksum_uplink_packet(struct sk_buff *skb,
				      struct rmnet_port *port,
				      struct net_device *orig_dev,
				      int csum_type);
bool rmnet_map_v5_csum_buggy(struct rmnet_map_v5_coal_header *coal_hdr);
+22 −1
Original line number Diff line number Diff line
@@ -481,7 +481,20 @@ void rmnet_map_v4_checksum_uplink_packet(struct sk_buff *skb,
	priv->stats.csum_sw++;
}

static void rmnet_map_v5_check_priority(struct sk_buff *skb,
					struct net_device *orig_dev,
					struct rmnet_map_v5_csum_header *hdr)
{
	struct rmnet_priv *priv = netdev_priv(orig_dev);

	if (skb->priority) {
		priv->stats.ul_prio++;
		hdr->priority = 1;
	}
}

void rmnet_map_v5_checksum_uplink_packet(struct sk_buff *skb,
					 struct rmnet_port *port,
					 struct net_device *orig_dev)
{
	struct rmnet_priv *priv = netdev_priv(orig_dev);
@@ -492,6 +505,13 @@ void rmnet_map_v5_checksum_uplink_packet(struct sk_buff *skb,
	memset(ul_header, 0, sizeof(*ul_header));
	ul_header->header_type = RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD;

	if (port->data_format & RMNET_EGRESS_FORMAT_PRIORITY)
		rmnet_map_v5_check_priority(skb, orig_dev, ul_header);

	/* Allow priority w/o csum offload */
	if (!(port->data_format & RMNET_FLAGS_EGRESS_MAP_CKSUMV5))
		return;

	if (skb->ip_summed == CHECKSUM_PARTIAL) {
		void *iph = (char *)ul_header + sizeof(*ul_header);
		void *trans;
@@ -532,6 +552,7 @@ void rmnet_map_v5_checksum_uplink_packet(struct sk_buff *skb,
 * packets that are supported for UL checksum offload.
 */
void rmnet_map_checksum_uplink_packet(struct sk_buff *skb,
				      struct rmnet_port *port,
				      struct net_device *orig_dev,
				      int csum_type)
{
@@ -540,7 +561,7 @@ void rmnet_map_checksum_uplink_packet(struct sk_buff *skb,
		rmnet_map_v4_checksum_uplink_packet(skb, orig_dev);
		break;
	case RMNET_FLAGS_EGRESS_MAP_CKSUMV5:
		rmnet_map_v5_checksum_uplink_packet(skb, orig_dev);
		rmnet_map_v5_checksum_uplink_packet(skb, port, orig_dev);
		break;
	default:
		break;
+3 −0
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@
#define RMNET_INGRESS_FORMAT_DL_MARKER  (RMNET_INGRESS_FORMAT_DL_MARKER_V1 |\
RMNET_INGRESS_FORMAT_DL_MARKER_V2)

/* UL Packet prioritization */
#define RMNET_EGRESS_FORMAT_PRIORITY            BIT(28)

/* Power save feature*/
#define RMNET_INGRESS_FORMAT_PS                 BIT(27)
#define RMNET_FORMAT_PS_NOTIF                   BIT(26)
Loading