162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __UM_VECTOR_KERN_H 762306a36Sopenharmony_ci#define __UM_VECTOR_KERN_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/netdevice.h> 1062306a36Sopenharmony_ci#include <linux/platform_device.h> 1162306a36Sopenharmony_ci#include <linux/skbuff.h> 1262306a36Sopenharmony_ci#include <linux/socket.h> 1362306a36Sopenharmony_ci#include <linux/list.h> 1462306a36Sopenharmony_ci#include <linux/ctype.h> 1562306a36Sopenharmony_ci#include <linux/workqueue.h> 1662306a36Sopenharmony_ci#include <linux/interrupt.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "vector_user.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* Queue structure specially adapted for multiple enqueue/dequeue 2162306a36Sopenharmony_ci * in a mmsgrecv/mmsgsend context 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* Dequeue method */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define QUEUE_SENDMSG 0 2762306a36Sopenharmony_ci#define QUEUE_SENDMMSG 1 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define VECTOR_RX 1 3062306a36Sopenharmony_ci#define VECTOR_TX (1 << 1) 3162306a36Sopenharmony_ci#define VECTOR_BPF (1 << 2) 3262306a36Sopenharmony_ci#define VECTOR_QDISC_BYPASS (1 << 3) 3362306a36Sopenharmony_ci#define VECTOR_BPF_FLASH (1 << 4) 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define ETH_MAX_PACKET 1500 3662306a36Sopenharmony_ci#define ETH_HEADER_OTHER 32 /* just in case someone decides to go mad on QnQ */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define MAX_FILTER_PROG (2 << 16) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct vector_queue { 4162306a36Sopenharmony_ci struct mmsghdr *mmsg_vector; 4262306a36Sopenharmony_ci void **skbuff_vector; 4362306a36Sopenharmony_ci /* backlink to device which owns us */ 4462306a36Sopenharmony_ci struct net_device *dev; 4562306a36Sopenharmony_ci spinlock_t head_lock; 4662306a36Sopenharmony_ci spinlock_t tail_lock; 4762306a36Sopenharmony_ci int queue_depth, head, tail, max_depth, max_iov_frags; 4862306a36Sopenharmony_ci short options; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct vector_estats { 5262306a36Sopenharmony_ci uint64_t rx_queue_max; 5362306a36Sopenharmony_ci uint64_t rx_queue_running_average; 5462306a36Sopenharmony_ci uint64_t tx_queue_max; 5562306a36Sopenharmony_ci uint64_t tx_queue_running_average; 5662306a36Sopenharmony_ci uint64_t rx_encaps_errors; 5762306a36Sopenharmony_ci uint64_t tx_timeout_count; 5862306a36Sopenharmony_ci uint64_t tx_restart_queue; 5962306a36Sopenharmony_ci uint64_t tx_kicks; 6062306a36Sopenharmony_ci uint64_t tx_flow_control_xon; 6162306a36Sopenharmony_ci uint64_t tx_flow_control_xoff; 6262306a36Sopenharmony_ci uint64_t rx_csum_offload_good; 6362306a36Sopenharmony_ci uint64_t rx_csum_offload_errors; 6462306a36Sopenharmony_ci uint64_t sg_ok; 6562306a36Sopenharmony_ci uint64_t sg_linearized; 6662306a36Sopenharmony_ci}; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci#define VERIFY_HEADER_NOK -1 6962306a36Sopenharmony_ci#define VERIFY_HEADER_OK 0 7062306a36Sopenharmony_ci#define VERIFY_CSUM_OK 1 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistruct vector_private { 7362306a36Sopenharmony_ci struct list_head list; 7462306a36Sopenharmony_ci spinlock_t lock; 7562306a36Sopenharmony_ci struct net_device *dev; 7662306a36Sopenharmony_ci struct napi_struct napi ____cacheline_aligned; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci int unit; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci /* Timeout timer in TX */ 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci struct timer_list tl; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci /* Scheduled "remove device" work */ 8562306a36Sopenharmony_ci struct work_struct reset_tx; 8662306a36Sopenharmony_ci struct vector_fds *fds; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci struct vector_queue *rx_queue; 8962306a36Sopenharmony_ci struct vector_queue *tx_queue; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci int rx_irq; 9262306a36Sopenharmony_ci int tx_irq; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci struct arglist *parsed; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci void *transport_data; /* transport specific params if needed */ 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci int max_packet; 9962306a36Sopenharmony_ci int req_size; /* different from max packet - used for TSO */ 10062306a36Sopenharmony_ci int headroom; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci int options; 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci /* remote address if any - some transports will leave this as null */ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci int header_size; 10762306a36Sopenharmony_ci int rx_header_size; 10862306a36Sopenharmony_ci int coalesce; 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci void *header_rxbuffer; 11162306a36Sopenharmony_ci void *header_txbuffer; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci int (*form_header)(uint8_t *header, 11462306a36Sopenharmony_ci struct sk_buff *skb, struct vector_private *vp); 11562306a36Sopenharmony_ci int (*verify_header)(uint8_t *header, 11662306a36Sopenharmony_ci struct sk_buff *skb, struct vector_private *vp); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci spinlock_t stats_lock; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci bool rexmit_scheduled; 12162306a36Sopenharmony_ci bool opened; 12262306a36Sopenharmony_ci bool in_write_poll; 12362306a36Sopenharmony_ci bool in_error; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci /* guest allowed to use ethtool flash to load bpf */ 12662306a36Sopenharmony_ci bool bpf_via_flash; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci /* ethtool stats */ 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci struct vector_estats estats; 13162306a36Sopenharmony_ci struct sock_fprog *bpf; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci char user[]; 13462306a36Sopenharmony_ci}; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ciextern int build_transport_data(struct vector_private *vp); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci#endif 139