18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef __UM_VECTOR_KERN_H
78c2ecf20Sopenharmony_ci#define __UM_VECTOR_KERN_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/netdevice.h>
108c2ecf20Sopenharmony_ci#include <linux/platform_device.h>
118c2ecf20Sopenharmony_ci#include <linux/skbuff.h>
128c2ecf20Sopenharmony_ci#include <linux/socket.h>
138c2ecf20Sopenharmony_ci#include <linux/list.h>
148c2ecf20Sopenharmony_ci#include <linux/ctype.h>
158c2ecf20Sopenharmony_ci#include <linux/workqueue.h>
168c2ecf20Sopenharmony_ci#include <linux/interrupt.h>
178c2ecf20Sopenharmony_ci#include "vector_user.h"
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci/* Queue structure specially adapted for multiple enqueue/dequeue
208c2ecf20Sopenharmony_ci * in a mmsgrecv/mmsgsend context
218c2ecf20Sopenharmony_ci */
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci/* Dequeue method */
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci#define QUEUE_SENDMSG 0
268c2ecf20Sopenharmony_ci#define QUEUE_SENDMMSG 1
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci#define VECTOR_RX 1
298c2ecf20Sopenharmony_ci#define VECTOR_TX (1 << 1)
308c2ecf20Sopenharmony_ci#define VECTOR_BPF (1 << 2)
318c2ecf20Sopenharmony_ci#define VECTOR_QDISC_BYPASS (1 << 3)
328c2ecf20Sopenharmony_ci#define VECTOR_BPF_FLASH (1 << 4)
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci#define ETH_MAX_PACKET 1500
358c2ecf20Sopenharmony_ci#define ETH_HEADER_OTHER 32 /* just in case someone decides to go mad on QnQ */
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#define MAX_FILTER_PROG (2 << 16)
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistruct vector_queue {
408c2ecf20Sopenharmony_ci	struct mmsghdr *mmsg_vector;
418c2ecf20Sopenharmony_ci	void **skbuff_vector;
428c2ecf20Sopenharmony_ci	 /* backlink to device which owns us */
438c2ecf20Sopenharmony_ci	struct net_device *dev;
448c2ecf20Sopenharmony_ci	spinlock_t head_lock;
458c2ecf20Sopenharmony_ci	spinlock_t tail_lock;
468c2ecf20Sopenharmony_ci	int queue_depth, head, tail, max_depth, max_iov_frags;
478c2ecf20Sopenharmony_ci	short options;
488c2ecf20Sopenharmony_ci};
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistruct vector_estats {
518c2ecf20Sopenharmony_ci	uint64_t rx_queue_max;
528c2ecf20Sopenharmony_ci	uint64_t rx_queue_running_average;
538c2ecf20Sopenharmony_ci	uint64_t tx_queue_max;
548c2ecf20Sopenharmony_ci	uint64_t tx_queue_running_average;
558c2ecf20Sopenharmony_ci	uint64_t rx_encaps_errors;
568c2ecf20Sopenharmony_ci	uint64_t tx_timeout_count;
578c2ecf20Sopenharmony_ci	uint64_t tx_restart_queue;
588c2ecf20Sopenharmony_ci	uint64_t tx_kicks;
598c2ecf20Sopenharmony_ci	uint64_t tx_flow_control_xon;
608c2ecf20Sopenharmony_ci	uint64_t tx_flow_control_xoff;
618c2ecf20Sopenharmony_ci	uint64_t rx_csum_offload_good;
628c2ecf20Sopenharmony_ci	uint64_t rx_csum_offload_errors;
638c2ecf20Sopenharmony_ci	uint64_t sg_ok;
648c2ecf20Sopenharmony_ci	uint64_t sg_linearized;
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci#define VERIFY_HEADER_NOK -1
688c2ecf20Sopenharmony_ci#define VERIFY_HEADER_OK 0
698c2ecf20Sopenharmony_ci#define VERIFY_CSUM_OK 1
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_cistruct vector_private {
728c2ecf20Sopenharmony_ci	struct list_head list;
738c2ecf20Sopenharmony_ci	spinlock_t lock;
748c2ecf20Sopenharmony_ci	struct net_device *dev;
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci	int unit;
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ci	/* Timeout timer in TX */
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	struct timer_list tl;
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_ci	/* Scheduled "remove device" work */
838c2ecf20Sopenharmony_ci	struct work_struct reset_tx;
848c2ecf20Sopenharmony_ci	struct vector_fds *fds;
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	struct vector_queue *rx_queue;
878c2ecf20Sopenharmony_ci	struct vector_queue *tx_queue;
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci	int rx_irq;
908c2ecf20Sopenharmony_ci	int tx_irq;
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci	struct arglist *parsed;
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	void *transport_data; /* transport specific params if needed */
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci	int max_packet;
978c2ecf20Sopenharmony_ci	int req_size; /* different from max packet - used for TSO */
988c2ecf20Sopenharmony_ci	int headroom;
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	int options;
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci	/* remote address if any - some transports will leave this as null */
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	int header_size;
1058c2ecf20Sopenharmony_ci	int rx_header_size;
1068c2ecf20Sopenharmony_ci	int coalesce;
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci	void *header_rxbuffer;
1098c2ecf20Sopenharmony_ci	void *header_txbuffer;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci	int (*form_header)(uint8_t *header,
1128c2ecf20Sopenharmony_ci		struct sk_buff *skb, struct vector_private *vp);
1138c2ecf20Sopenharmony_ci	int (*verify_header)(uint8_t *header,
1148c2ecf20Sopenharmony_ci		struct sk_buff *skb, struct vector_private *vp);
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci	spinlock_t stats_lock;
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci	struct tasklet_struct tx_poll;
1198c2ecf20Sopenharmony_ci	bool rexmit_scheduled;
1208c2ecf20Sopenharmony_ci	bool opened;
1218c2ecf20Sopenharmony_ci	bool in_write_poll;
1228c2ecf20Sopenharmony_ci	bool in_error;
1238c2ecf20Sopenharmony_ci
1248c2ecf20Sopenharmony_ci	/* guest allowed to use ethtool flash to load bpf */
1258c2ecf20Sopenharmony_ci	bool bpf_via_flash;
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	/* ethtool stats */
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	struct vector_estats estats;
1308c2ecf20Sopenharmony_ci	struct sock_fprog *bpf;
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci	char user[];
1338c2ecf20Sopenharmony_ci};
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ciextern int build_transport_data(struct vector_private *vp);
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci#endif
138