162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _LBS_IF_USB_H 362306a36Sopenharmony_ci#define _LBS_IF_USB_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/wait.h> 662306a36Sopenharmony_ci#include <linux/timer.h> 762306a36Sopenharmony_ci 862306a36Sopenharmony_cistruct lbs_private; 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* 1162306a36Sopenharmony_ci * This file contains definition for USB interface. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci#define CMD_TYPE_REQUEST 0xF00DFACE 1462306a36Sopenharmony_ci#define CMD_TYPE_DATA 0xBEADC0DE 1562306a36Sopenharmony_ci#define CMD_TYPE_INDICATION 0xBEEFFACE 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define IPFIELD_ALIGN_OFFSET 2 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define BOOT_CMD_FW_BY_USB 0x01 2062306a36Sopenharmony_ci#define BOOT_CMD_FW_IN_EEPROM 0x02 2162306a36Sopenharmony_ci#define BOOT_CMD_UPDATE_BOOT2 0x03 2262306a36Sopenharmony_ci#define BOOT_CMD_UPDATE_FW 0x04 2362306a36Sopenharmony_ci#define BOOT_CMD_MAGIC_NUMBER 0x4C56524D /* LVRM */ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct bootcmd 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci __le32 magic; 2862306a36Sopenharmony_ci uint8_t cmd; 2962306a36Sopenharmony_ci uint8_t pad[11]; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define BOOT_CMD_RESP_OK 0x0001 3362306a36Sopenharmony_ci#define BOOT_CMD_RESP_FAIL 0x0000 3462306a36Sopenharmony_ci#define BOOT_CMD_RESP_NOT_SUPPORTED 0x0002 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct bootcmdresp 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci __le32 magic; 3962306a36Sopenharmony_ci uint8_t cmd; 4062306a36Sopenharmony_ci uint8_t result; 4162306a36Sopenharmony_ci uint8_t pad[2]; 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* USB card description structure*/ 4562306a36Sopenharmony_cistruct if_usb_card { 4662306a36Sopenharmony_ci struct usb_device *udev; 4762306a36Sopenharmony_ci uint32_t model; /* MODEL_* */ 4862306a36Sopenharmony_ci struct urb *rx_urb, *tx_urb; 4962306a36Sopenharmony_ci struct lbs_private *priv; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci struct sk_buff *rx_skb; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci uint8_t ep_in; 5462306a36Sopenharmony_ci uint8_t ep_out; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci /* bootcmdresp == 0 means command is pending 5762306a36Sopenharmony_ci * bootcmdresp < 0 means error 5862306a36Sopenharmony_ci * bootcmdresp > 0 is a BOOT_CMD_RESP_* from firmware 5962306a36Sopenharmony_ci */ 6062306a36Sopenharmony_ci int8_t bootcmdresp; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci int ep_in_size; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci void *ep_out_buf; 6562306a36Sopenharmony_ci int ep_out_size; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci const struct firmware *fw; 6862306a36Sopenharmony_ci struct timer_list fw_timeout; 6962306a36Sopenharmony_ci wait_queue_head_t fw_wq; 7062306a36Sopenharmony_ci uint32_t fwseqnum; 7162306a36Sopenharmony_ci uint32_t totalbytes; 7262306a36Sopenharmony_ci uint32_t fwlastblksent; 7362306a36Sopenharmony_ci uint8_t CRC_OK; 7462306a36Sopenharmony_ci uint8_t fwdnldover; 7562306a36Sopenharmony_ci uint8_t fwfinalblk; 7662306a36Sopenharmony_ci uint8_t surprise_removed; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci __le16 boot2_version; 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci/* fwheader */ 8262306a36Sopenharmony_cistruct fwheader { 8362306a36Sopenharmony_ci __le32 dnldcmd; 8462306a36Sopenharmony_ci __le32 baseaddr; 8562306a36Sopenharmony_ci __le32 datalength; 8662306a36Sopenharmony_ci __le32 CRC; 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#define FW_MAX_DATA_BLK_SIZE 600 9062306a36Sopenharmony_ci/* FWData */ 9162306a36Sopenharmony_cistruct fwdata { 9262306a36Sopenharmony_ci struct fwheader hdr; 9362306a36Sopenharmony_ci __le32 seqnum; 9462306a36Sopenharmony_ci uint8_t data[]; 9562306a36Sopenharmony_ci}; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci/* fwsyncheader */ 9862306a36Sopenharmony_cistruct fwsyncheader { 9962306a36Sopenharmony_ci __le32 cmd; 10062306a36Sopenharmony_ci __le32 seqnum; 10162306a36Sopenharmony_ci}; 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#define FW_HAS_DATA_TO_RECV 0x00000001 10462306a36Sopenharmony_ci#define FW_HAS_LAST_BLOCK 0x00000004 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci#endif 108