cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

usb.h (5202B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (c) 2021 pureLiFi
      4 */
      5
      6#ifndef PLFXLC_USB_H
      7#define PLFXLC_USB_H
      8
      9#include <linux/completion.h>
     10#include <linux/netdevice.h>
     11#include <linux/spinlock.h>
     12#include <linux/skbuff.h>
     13#include <linux/usb.h>
     14
     15#include "intf.h"
     16
     17#define USB_BULK_MSG_TIMEOUT_MS 2000
     18
     19#define PURELIFI_X_VENDOR_ID_0   0x16C1
     20#define PURELIFI_X_PRODUCT_ID_0  0x1CDE
     21#define PURELIFI_XC_VENDOR_ID_0  0x2EF5
     22#define PURELIFI_XC_PRODUCT_ID_0 0x0008
     23#define PURELIFI_XL_VENDOR_ID_0  0x2EF5
     24#define PURELIFI_XL_PRODUCT_ID_0 0x000A /* Station */
     25
     26#define PLF_FPGA_STATUS_LEN 2
     27#define PLF_FPGA_STATE_LEN 9
     28#define PLF_BULK_TLEN 16384
     29#define PLF_FPGA_MG 6 /* Magic check */
     30#define PLF_XL_BUF_LEN 64
     31#define PLF_MSG_STATUS_OFFSET 7
     32
     33#define PLF_USB_TIMEOUT 1000
     34#define PLF_MSLEEP_TIME 200
     35
     36#define PURELIFI_URB_RETRY_MAX 5
     37
     38#define plfxlc_usb_dev(usb) (&(usb)->intf->dev)
     39
     40/* Tx retry backoff timer (in milliseconds) */
     41#define TX_RETRY_BACKOFF_MS 10
     42#define STA_QUEUE_CLEANUP_MS 5000
     43
     44/* Tx retry backoff timer (in jiffies) */
     45#define TX_RETRY_BACKOFF_JIFF ((TX_RETRY_BACKOFF_MS * HZ) / 1000)
     46#define STA_QUEUE_CLEANUP_JIFF ((STA_QUEUE_CLEANUP_MS * HZ) / 1000)
     47
     48/* Ensures that MAX_TRANSFER_SIZE is even. */
     49#define MAX_TRANSFER_SIZE (USB_MAX_TRANSFER_SIZE & ~1)
     50#define plfxlc_urb_dev(urb) (&(urb)->dev->dev)
     51
     52#define STATION_FIFO_ALMOST_FULL_MESSAGE     0
     53#define STATION_FIFO_ALMOST_FULL_NOT_MESSAGE 1
     54#define STATION_CONNECT_MESSAGE              2
     55#define STATION_DISCONNECT_MESSAGE           3
     56
     57int plfxlc_usb_wreq(struct usb_interface *ez_usb, void *buffer, int buffer_len,
     58		    enum plf_usb_req_enum usb_req_id);
     59void plfxlc_tx_urb_complete(struct urb *urb);
     60
     61enum {
     62	USB_MAX_RX_SIZE       = 4800,
     63	USB_MAX_EP_INT_BUFFER = 64,
     64};
     65
     66struct plfxlc_usb_interrupt {
     67	spinlock_t lock; /* spin lock for usb interrupt buffer */
     68	struct urb *urb;
     69	void *buffer;
     70	int interval;
     71};
     72
     73#define RX_URBS_COUNT 5
     74
     75struct plfxlc_usb_rx {
     76	spinlock_t lock; /* spin lock for rx urb */
     77	struct mutex setup_mutex; /* mutex lockt for rx urb */
     78	u8 fragment[2 * USB_MAX_RX_SIZE];
     79	unsigned int fragment_length;
     80	unsigned int usb_packet_size;
     81	struct urb **urbs;
     82	int urbs_count;
     83};
     84
     85struct plf_station {
     86   /*  7...3    |    2      |     1     |     0	    |
     87    * Reserved  | Heartbeat | FIFO full | Connected |
     88    */
     89	unsigned char flag;
     90	unsigned char mac[ETH_ALEN];
     91	struct sk_buff_head data_list;
     92};
     93
     94struct plfxlc_firmware_file {
     95	u32 total_files;
     96	u32 total_size;
     97	u32 size;
     98	u32 start_addr;
     99	u32 control_packets;
    100} __packed;
    101
    102#define STATION_CONNECTED_FLAG 0x1
    103#define STATION_FIFO_FULL_FLAG 0x2
    104#define STATION_HEARTBEAT_FLAG 0x4
    105#define STATION_ACTIVE_FLAG    0xFD
    106
    107#define PURELIFI_SERIAL_LEN 256
    108#define STA_BROADCAST_INDEX (AP_USER_LIMIT)
    109#define MAX_STA_NUM         (AP_USER_LIMIT + 1)
    110
    111struct plfxlc_usb_tx {
    112	unsigned long enabled;
    113	spinlock_t lock; /* spinlock for USB tx */
    114	u8 mac_fifo_full;
    115	struct sk_buff_head submitted_skbs;
    116	struct usb_anchor submitted;
    117	int submitted_urbs;
    118	bool stopped;
    119	struct timer_list tx_retry_timer;
    120	struct plf_station station[MAX_STA_NUM];
    121};
    122
    123/* Contains the usb parts. The structure doesn't require a lock because intf
    124 * will not be changed after initialization.
    125 */
    126struct plfxlc_usb {
    127	struct timer_list sta_queue_cleanup;
    128	struct plfxlc_usb_rx rx;
    129	struct plfxlc_usb_tx tx;
    130	struct usb_interface *intf;
    131	struct usb_interface *ez_usb;
    132	u8 req_buf[64]; /* plfxlc_usb_iowrite16v needs 62 bytes */
    133	u8 sidx; /* store last served */
    134	bool rx_usb_enabled;
    135	bool initialized;
    136	bool was_running;
    137	bool link_up;
    138};
    139
    140enum endpoints {
    141	EP_DATA_IN  = 2,
    142	EP_DATA_OUT = 8,
    143};
    144
    145enum devicetype {
    146	DEVICE_LIFI_X  = 0,
    147	DEVICE_LIFI_XC  = 1,
    148	DEVICE_LIFI_XL  = 1,
    149};
    150
    151enum {
    152	PLF_BIT_ENABLED = 1,
    153	PLF_BIT_MAX = 2,
    154};
    155
    156int plfxlc_usb_wreq_async(struct plfxlc_usb *usb, const u8 *buffer,
    157			  int buffer_len, enum plf_usb_req_enum usb_req_id,
    158			  usb_complete_t complete_fn, void *context);
    159
    160static inline struct usb_device *
    161plfxlc_usb_to_usbdev(struct plfxlc_usb *usb)
    162{
    163	return interface_to_usbdev(usb->intf);
    164}
    165
    166static inline struct ieee80211_hw *
    167plfxlc_intf_to_hw(struct usb_interface *intf)
    168{
    169	return usb_get_intfdata(intf);
    170}
    171
    172static inline struct ieee80211_hw *
    173plfxlc_usb_to_hw(struct plfxlc_usb *usb)
    174{
    175	return plfxlc_intf_to_hw(usb->intf);
    176}
    177
    178void plfxlc_usb_init(struct plfxlc_usb *usb, struct ieee80211_hw *hw,
    179		     struct usb_interface *intf);
    180void plfxlc_send_packet_from_data_queue(struct plfxlc_usb *usb);
    181void plfxlc_usb_release(struct plfxlc_usb *usb);
    182void plfxlc_usb_disable_rx(struct plfxlc_usb *usb);
    183void plfxlc_usb_enable_tx(struct plfxlc_usb *usb);
    184void plfxlc_usb_disable_tx(struct plfxlc_usb *usb);
    185int plfxlc_usb_tx(struct plfxlc_usb *usb, struct sk_buff *skb);
    186int plfxlc_usb_enable_rx(struct plfxlc_usb *usb);
    187int plfxlc_usb_init_hw(struct plfxlc_usb *usb);
    188const char *plfxlc_speed(enum usb_device_speed speed);
    189
    190/* Firmware declarations */
    191int plfxlc_download_xl_firmware(struct usb_interface *intf);
    192int plfxlc_download_fpga(struct usb_interface *intf);
    193
    194int plfxlc_upload_mac_and_serial(struct usb_interface *intf,
    195				 unsigned char *hw_address,
    196				 unsigned char *serial_number);
    197
    198#endif /* PLFXLC_USB_H */