blob: 7d7aed400a8b743dfae534ccf78e1e9f3a797bba [file] [log] [blame]
#ifndef _PFE_VWD_H_
#define _PFE_VWD_H_
#include <linux/cdev.h>
#include <linux/interrupt.h>
#include "pfe_tso.h"
#define PFE_VWD_TX_STATS
#define PFE_VWD_LRO_STATS
#define PFE_VWD_NAPI_STATS
#define VWD_DEBUG_STATS
#define VWD_TXQ_CNT 16
#define VWD_RXQ_CNT 3
#define PFE_WIFI_PKT_HEADROOM 96 /*PFE inserts this headroom for WiFi tx packets only in lro mode */
#define VWD_MINOR 0
#define VWD_MINOR_COUNT 1
#define VWD_DRV_NAME "vwd"
#define VWD_DEV_COUNT 1
#define VWD_RX_POLL_WEIGHT HIF_RX_POLL_WEIGHT - 16
struct vap_desc_s {
struct kobject *vap_kobj;
struct net_device *dev;
struct net_device *wifi_dev;
const struct ethtool_ops *wifi_ethtool_ops;
struct pfe_vwd_priv_s *priv;
unsigned int ifindex;
unsigned int diff_hw_features;
struct hif_client_s client;
struct net_device dummy_dev;
struct napi_struct low_napi;
struct napi_struct high_napi;
struct napi_struct lro_napi;
spinlock_t tx_lock[VWD_TXQ_CNT];
struct sk_buff *skb_inflight[VWD_RXQ_CNT + 6];
struct pfe_eth_fast_timer fast_tx_timeout[VWD_TXQ_CNT];
struct net_device_stats stats;
int cpu_id;
unsigned char ifname[12];
unsigned char macaddr[6];
unsigned short vapid;
unsigned short programmed;
unsigned short bridged;
unsigned short direct_rx_path; /* Direct path support from offload device=>VWD */
unsigned short direct_tx_path; /* Direct path support from offload VWD=>device */
unsigned short custom_skb; /* Customized skb model from VWD=>offload_device */
#ifdef PFE_VWD_TX_STATS
unsigned int stop_queue_total[VWD_TXQ_CNT];
unsigned int stop_queue_hif[VWD_TXQ_CNT];
unsigned int stop_queue_hif_client[VWD_TXQ_CNT];
unsigned int clean_fail[VWD_TXQ_CNT];
unsigned int was_stopped[VWD_TXQ_CNT];
#endif
};
struct vap_cmd_s {
int action;
#define ADD 0
#define REMOVE 1
#define UPDATE 2
#define RESET 3
int ifindex;
unsigned short vapid;
unsigned short direct_rx_path;
unsigned char ifname[12];
unsigned char macaddr[6];
};
struct pfe_vwd_priv_s {
struct pfe *pfe;
unsigned char name[12];
struct cdev char_dev;
int char_devno;
struct vap_desc_s *vaps[MAX_VAP_SUPPORT];
char conf_vap_names[MAX_VAP_SUPPORT][IFNAMSIZ];
int vap_count;
int vap_programmed_count;
int vap_bridged_count;
spinlock_t vaplock;
spinlock_t conf_lock;
struct timer_list tx_timer;
struct tso_cb_s tso;
struct workqueue_struct *event_queue;
struct work_struct event;
#ifdef PFE_VWD_LRO_STATS
unsigned int lro_len_counters[LRO_LEN_COUNT_MAX];
unsigned int lro_nb_counters[LRO_NB_COUNT_MAX]; //TODO change to exact max number when RX scatter done
#endif
#ifdef PFE_VWD_NAPI_STATS
unsigned int napi_counters[NAPI_MAX_COUNT];
#endif
int fast_path_enable;
int fast_bridging_enable;
int fast_routing_enable;
int tso_hook_enable;
#ifdef VWD_DEBUG_STATS
u32 pkts_local_tx_sgs;
u32 pkts_total_local_tx;
u32 pkts_local_tx_csum;
u32 pkts_transmitted;
u32 pkts_slow_forwarded[VWD_RXQ_CNT];
u32 pkts_tx_dropped;
u32 pkts_rx_fast_forwarded[VWD_RXQ_CNT];
u32 rx_skb_alloc_fail;
u32 rx_csum_correct;
#endif
u32 msg_enable;
};
int pfe_vwd_init(struct pfe *pfe);
void pfe_vwd_exit(struct pfe *pfe);
#endif /* _PFE_VWD_H_ */