12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2dd3f92deSKalle Valo /*
3dd3f92deSKalle Valo  *  Copyright (C) 2008, cozybit Inc.
4dd3f92deSKalle Valo  *  Copyright (C) 2003-2006, Marvell International Ltd.
5dd3f92deSKalle Valo  */
6dd3f92deSKalle Valo #include <linux/wait.h>
7dd3f92deSKalle Valo #include <linux/timer.h>
8dd3f92deSKalle Valo 
9dd3f92deSKalle Valo struct lbtf_private;
10dd3f92deSKalle Valo 
11dd3f92deSKalle Valo /**
12dd3f92deSKalle Valo   * This file contains definition for USB interface.
13dd3f92deSKalle Valo   */
14dd3f92deSKalle Valo #define CMD_TYPE_REQUEST		0xF00DFACE
15dd3f92deSKalle Valo #define CMD_TYPE_DATA			0xBEADC0DE
16dd3f92deSKalle Valo #define CMD_TYPE_INDICATION		0xBEEFFACE
17dd3f92deSKalle Valo 
18dd3f92deSKalle Valo #define BOOT_CMD_FW_BY_USB		0x01
19dd3f92deSKalle Valo #define BOOT_CMD_FW_IN_EEPROM		0x02
20dd3f92deSKalle Valo #define BOOT_CMD_UPDATE_BOOT2		0x03
21dd3f92deSKalle Valo #define BOOT_CMD_UPDATE_FW		0x04
22dd3f92deSKalle Valo #define BOOT_CMD_MAGIC_NUMBER		0x4C56524D   /* LVRM */
23dd3f92deSKalle Valo 
24dd3f92deSKalle Valo struct bootcmd {
25dd3f92deSKalle Valo 	__le32	magic;
26dd3f92deSKalle Valo 	uint8_t	cmd;
27dd3f92deSKalle Valo 	uint8_t	pad[11];
28dd3f92deSKalle Valo };
29dd3f92deSKalle Valo 
30dd3f92deSKalle Valo #define BOOT_CMD_RESP_OK		0x0001
31dd3f92deSKalle Valo #define BOOT_CMD_RESP_FAIL		0x0000
32dd3f92deSKalle Valo 
33dd3f92deSKalle Valo struct bootcmdresp {
34dd3f92deSKalle Valo 	__le32	magic;
35dd3f92deSKalle Valo 	uint8_t	cmd;
36dd3f92deSKalle Valo 	uint8_t	result;
37dd3f92deSKalle Valo 	uint8_t	pad[2];
38dd3f92deSKalle Valo };
39dd3f92deSKalle Valo 
40dd3f92deSKalle Valo /** USB card description structure*/
41dd3f92deSKalle Valo struct if_usb_card {
42dd3f92deSKalle Valo 	struct usb_device *udev;
43dd3f92deSKalle Valo 	struct urb *rx_urb, *tx_urb, *cmd_urb;
44dd3f92deSKalle Valo 	struct lbtf_private *priv;
45dd3f92deSKalle Valo 
46dd3f92deSKalle Valo 	struct sk_buff *rx_skb;
47dd3f92deSKalle Valo 
48dd3f92deSKalle Valo 	uint8_t ep_in;
49dd3f92deSKalle Valo 	uint8_t ep_out;
50dd3f92deSKalle Valo 
51dd3f92deSKalle Valo 	int8_t bootcmdresp;
52dd3f92deSKalle Valo 
53dd3f92deSKalle Valo 	int ep_in_size;
54dd3f92deSKalle Valo 
55dd3f92deSKalle Valo 	void *ep_out_buf;
56dd3f92deSKalle Valo 	int ep_out_size;
57dd3f92deSKalle Valo 
58dd3f92deSKalle Valo 	const struct firmware *fw;
59dd3f92deSKalle Valo 	struct timer_list fw_timeout;
60dd3f92deSKalle Valo 	wait_queue_head_t fw_wq;
61dd3f92deSKalle Valo 	uint32_t fwseqnum;
62dd3f92deSKalle Valo 	uint32_t totalbytes;
63dd3f92deSKalle Valo 	uint32_t fwlastblksent;
64dd3f92deSKalle Valo 	uint8_t CRC_OK;
65dd3f92deSKalle Valo 	uint8_t fwdnldover;
66dd3f92deSKalle Valo 	uint8_t fwfinalblk;
67dd3f92deSKalle Valo 
68dd3f92deSKalle Valo 	__le16 boot2_version;
69dd3f92deSKalle Valo };
70dd3f92deSKalle Valo 
71dd3f92deSKalle Valo /** fwheader */
72dd3f92deSKalle Valo struct fwheader {
73dd3f92deSKalle Valo 	__le32 dnldcmd;
74dd3f92deSKalle Valo 	__le32 baseaddr;
75dd3f92deSKalle Valo 	__le32 datalength;
76dd3f92deSKalle Valo 	__le32 CRC;
77dd3f92deSKalle Valo };
78dd3f92deSKalle Valo 
79dd3f92deSKalle Valo #define FW_MAX_DATA_BLK_SIZE	600
80dd3f92deSKalle Valo /** FWData */
81dd3f92deSKalle Valo struct fwdata {
82dd3f92deSKalle Valo 	struct fwheader hdr;
83dd3f92deSKalle Valo 	__le32 seqnum;
842a6be797SGustavo A. R. Silva 	uint8_t data[];
85dd3f92deSKalle Valo };
86dd3f92deSKalle Valo 
87dd3f92deSKalle Valo /** fwsyncheader */
88dd3f92deSKalle Valo struct fwsyncheader {
89dd3f92deSKalle Valo 	__le32 cmd;
90dd3f92deSKalle Valo 	__le32 seqnum;
91dd3f92deSKalle Valo };
92dd3f92deSKalle Valo 
93dd3f92deSKalle Valo #define FW_HAS_DATA_TO_RECV		0x00000001
94dd3f92deSKalle Valo #define FW_HAS_LAST_BLOCK		0x00000004
95