brintos

brintos / linux-shallow public Read only

0
0
Text · 5.1 KiB · ba2defd Raw
199 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (c) 2021 pureLiFi4 */5 6#ifndef PLFXLC_USB_H7#define PLFXLC_USB_H8 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 200018 19#define PURELIFI_X_VENDOR_ID_0   0x16C120#define PURELIFI_X_PRODUCT_ID_0  0x1CDE21#define PURELIFI_XC_VENDOR_ID_0  0x2EF522#define PURELIFI_XC_PRODUCT_ID_0 0x000823#define PURELIFI_XL_VENDOR_ID_0  0x2EF524#define PURELIFI_XL_PRODUCT_ID_0 0x000A /* Station */25 26#define PLF_FPGA_STATUS_LEN 227#define PLF_FPGA_STATE_LEN 928#define PLF_BULK_TLEN 1638429#define PLF_FPGA_MG 6 /* Magic check */30#define PLF_XL_BUF_LEN 6431#define PLF_MSG_STATUS_OFFSET 732 33#define PLF_USB_TIMEOUT 100034#define PLF_MSLEEP_TIME 20035 36#define PURELIFI_URB_RETRY_MAX 537 38#define plfxlc_usb_dev(usb) (&(usb)->intf->dev)39 40/* Tx retry backoff timer (in milliseconds) */41#define TX_RETRY_BACKOFF_MS 1042#define STA_QUEUE_CLEANUP_MS 500043 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     053#define STATION_FIFO_ALMOST_FULL_NOT_MESSAGE 154#define STATION_CONNECT_MESSAGE              255#define STATION_DISCONNECT_MESSAGE           356 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 574 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 0x1103#define STATION_FIFO_FULL_FLAG 0x2104#define STATION_HEARTBEAT_FLAG 0x4105#define STATION_ACTIVE_FLAG    0xFD106 107#define PURELIFI_SERIAL_LEN 256108#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 intf124 * 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 */199