blob: 495329b35cda1add5e41ac135a22dbcb853a0c6b [file] [log] [blame]
// SPDX-License-Identifier: GPL-2.0-only
/*
* Driver for Wifi performance tracker
*
* Copyright 2022 Google LLC.
*
* Author: Star Chang <starchang@google.com>
*/
#ifndef __TP_TRACKER_DYNAMIC_TWT_SETUP_H
#define __TP_TRACKER_DYNAMIC_TWT_SETUP_H
#include "debugfs.h"
struct wlan_ptracker_client;
struct wlan_ptracker_core;
struct dytwt_setup_param {
u8 config_id;
u8 nego_type;
u8 trigger_type;
u32 wake_duration;
u32 wake_interval;
};
struct dytwt_cap {
u16 device_cap;
u16 peer_cap;
u32 rssi;
int link_speed;
};
struct dytwt_pwr_state {
u64 awake;
u64 asleep;
u64 count;
};
struct dytwt_status {
u32 config_id;
u32 flow_id;
u32 flow_flags;
u32 setup_cmd;
u32 channel;
u32 nego_type;
u32 wake_dur;
u32 wake_int;
};
struct dytwt_stats {
u32 config_id;
u32 sp_seq; /* sequence number of the service period */
u32 tx_ucast_pkts; /* Number of unicast Tx packets in TWT SPs */
u32 tx_pkts_min; /* Minimum number of Tx packets in a TWT SP */
u32 tx_pkts_max; /* Maximum number of Tx packets in a TWT SP */
u32 tx_pkts_avg; /* Average number of Tx packets in each TWT SP */
u32 tx_failures; /* Tx packets failure count */
u32 rx_ucast_pkts; /* Number of unicast Rx packets in TWT SPs */
u32 rx_pkts_min; /* Minimum number of Rx packets in a TWT SP */
u32 rx_pkts_max; /* Maximum number of Rx packets in a TWT SP */
u32 rx_pkts_avg; /* Average number of Rx packets in each TWT SP */
u32 rx_pkts_retried; /* retried Rx packets count */
u32 tx_pkt_sz_avg; /* Average Tx packet size in TWT SPs */
u32 rx_pkt_sz_avg; /* Average Rx Packet size in TWT SPs */
u32 eosp_dur_avg; /* Average Wake duration in SPs ended due to EOSP */
u32 eosp_count; /* Count of TWT SPs ended due to EOSP */
};
struct dytwt_client_ops {
int (*setup)(void *priv, struct dytwt_setup_param *param);
int (*teardown)(void *priv, struct dytwt_setup_param *param);
int (*get_cap)(void *priv, struct dytwt_cap *cap);
int (*get_pwrstates)(void *priv, struct dytwt_pwr_state *state);
int (*get_stats)(void *priv, struct dytwt_stats *stats);
int (*get_status)(void *priv, struct dytwt_status *status);
};
enum {
TWT_ACTION_SETUP,
TWT_ACTION_TEARDOWN,
TWT_ACTION_MAX,
};
enum {
TWT_TEST_FORCE_STATE = 1,
TWT_TEST_CAP,
TWT_TEST_PWRSTATS,
TWT_TEST_ONOFF,
TWT_TEST_SET_PARAM,
TWT_TEST_DUMP_STATS,
TWT_TEST_DUMP_STATUS,
TWT_TEST_MAX,
};
struct dytwt_scene_action {
u32 action;
struct dytwt_setup_param param;
};
struct dytwt_entry {
/* base should put as first membor */
struct history_entry base;
bool apply;
u32 rate;
u32 reason;
struct dytwt_pwr_state pwr;
} __align(void *);
struct dytwt_statistic {
u64 awake;
u64 asleep;
};
#define DYTWT_COUNTER_MAX 6
#define DYTWT_COUNTER_TOTAL 5
struct dytwt_counters {
u64 total_awake;
u64 total_sleep;
u64 total_sleep_cnt;
u64 prev_awake;
u64 prev_asleep;
u64 prev_asleep_cnt;
struct dytwt_statistic scene[DYTWT_COUNTER_MAX];
};
struct dytwt_manager {
u32 prev;
u32 feature_flag;
u32 state;
struct history_manager *hm;
u32 rssi_threshold;
u32 link_threshold;
bool twt_cap;
struct delayed_work wq;
struct delayed_work setup_wq;
struct wlan_ptracker_core *core;
struct dytwt_counters counters;
struct kobject kobj;
struct dentry *dir;
};
struct dytwt_kobj_attr {
struct attribute attr;
ssize_t (*show)(struct dytwt_manager *, char *);
ssize_t (*store)(struct dytwt_manager *, const char *, size_t count);
};
extern int dytwt_init(struct wlan_ptracker_core *core);
extern void dytwt_exit(struct wlan_ptracker_core *core);
#endif /* __TP_TRACKER_DYNAMIC_TWT_SETUP_H */