qcacmn: Add support for TCP delayed ack in driver

qcacld-2.0 to qcacmn propagation

This change adds support for driver supported TCP
delayed ack to increase TCP RX performance in
third-party platform which don't support kernel
TCP delayed ack feature.

TCP delayed ack is dependent on count and timer
values. Whatever is achieved first will trigger
sending TCP ack.

This feature can be controlled through ini values.
gDriverDelAckTimerValue - timer value in ms
gDriverDelAckPktCount - delayed ack count
gDriverDelAckEnable - enable/disable feature

Change-Id: I8105bbb90965295b5a4aefeb00d344a90155974d
CRs-fixed: 2414231
This commit is contained in:
Tiger Yu 2019-04-25 10:41:30 +08:00 • committed by nshrivas
commit 6f1fc0070f
5 changed files with 98 additions and 5 deletions

View file

@ -44,6 +44,7 @@
#define QDF_NBUF_PKT_ERROR 1
#define QDF_NBUF_TRAC_IPV4_OFFSET 14
#define QDF_NBUF_TRAC_IPV4_HEADER_MASK 0xF
#define QDF_NBUF_TRAC_IPV4_HEADER_SIZE 20
#define QDF_NBUF_TRAC_DHCP_SRV_PORT 67
#define QDF_NBUF_TRAC_DHCP_CLI_PORT 68
@ -60,6 +61,7 @@
#define QDF_NBUF_SRC_MAC_OFFSET 6
#define QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET 23
#define QDF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET 30
#define QDF_NBUF_TRAC_IPV4_SRC_ADDR_OFFSET 26
#define QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET 20
#define QDF_NBUF_TRAC_IPV4_ADDR_MCAST_MASK 0xE0000000
#define QDF_NBUF_TRAC_IPV4_ADDR_BCAST_MASK 0xF0000000
@ -69,6 +71,12 @@
#define QDF_NBUF_TRAC_IPV6_HEADER_SIZE 40
#define QDF_NBUF_TRAC_ICMP_TYPE 1
#define QDF_NBUF_TRAC_TCP_TYPE 6
#define QDF_NBUF_TRAC_TCP_FLAGS_OFFSET (47 - 34)
#define QDF_NBUF_TRAC_TCP_ACK_OFFSET (42 - 34)
#define QDF_NBUF_TRAC_TCP_HEADER_LEN_OFFSET (46 - 34)
#define QDF_NBUF_TRAC_TCP_ACK_MASK 0x10
#define QDF_NBUF_TRAC_TCP_SPORT_OFFSET (34 - 34)
#define QDF_NBUF_TRAC_TCP_DPORT_OFFSET (36 - 34)
#define QDF_NBUF_TRAC_UDP_TYPE 17
#define QDF_NBUF_TRAC_ICMPV6_TYPE 0x3a
#define QDF_NBUF_TRAC_DHCP6_SRV_PORT 547

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014-2018 The Linux Foundation. All rights reserved.
* Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -39,6 +39,20 @@ typedef struct {
enum qdf_context_mode ctx;
} __qdf_hrtimer_data_t;
/**
* __qdf_hrtimer_get_mode() - Get hrtimer_mode with qdf mode
* @mode: mode of hrtimer
*
* Get hrtimer_mode with qdf hrtimer mode
*
* Return: void
*/
static inline
enum hrtimer_mode __qdf_hrtimer_get_mode(enum qdf_hrtimer_mode mode)
{
return (enum hrtimer_mode)mode;
}
/**
* __qdf_hrtimer_start() - Starts hrtimer in given context
* @timer: pointer to the hrtimer object
@ -53,11 +67,13 @@ static inline
void __qdf_hrtimer_start(__qdf_hrtimer_data_t *timer, ktime_t interval,
enum qdf_hrtimer_mode mode)
{
enum hrtimer_mode hrt_mode = __qdf_hrtimer_get_mode(mode);
if (timer->ctx == QDF_CONTEXT_HARDWARE)
hrtimer_start(&timer->u.hrtimer, interval, mode);
hrtimer_start(&timer->u.hrtimer, interval, hrt_mode);
else if (timer->ctx == QDF_CONTEXT_TASKLET)
tasklet_hrtimer_start(&timer->u.tasklet_hrtimer,
interval, mode);
interval, hrt_mode);
}
/**
@ -98,14 +114,15 @@ static inline void __qdf_hrtimer_init(__qdf_hrtimer_data_t *timer,
{
struct hrtimer *hrtimer = &timer->u.hrtimer;
struct tasklet_hrtimer *tasklet_hrtimer = &timer->u.tasklet_hrtimer;
enum hrtimer_mode hrt_mode = __qdf_hrtimer_get_mode(mode);
timer->ctx = ctx;
if (timer->ctx == QDF_CONTEXT_HARDWARE) {
hrtimer_init(hrtimer, clock, mode);
hrtimer_init(hrtimer, clock, hrt_mode);
hrtimer->function = cback;
} else if (timer->ctx == QDF_CONTEXT_TASKLET) {
tasklet_hrtimer_init(tasklet_hrtimer, cback, clock, mode);
tasklet_hrtimer_init(tasklet_hrtimer, cback, clock, hrt_mode);
}
}