1139825Simp/* SPDX-License-Identifier: GPL-2.0-or-later */
249076Swpaul/*
349076Swpaul *  Copyright (C) 2008, cozybit Inc.
449076Swpaul *  Copyright (C) 2003-2006, Marvell International Ltd.
549076Swpaul */
649076Swpaul#include <linux/wait.h>
749076Swpaul#include <linux/timer.h>
849076Swpaul
949076Swpaulstruct lbtf_private;
1049076Swpaul
1149076Swpaul/**
1249076Swpaul  * This file contains definition for USB interface.
1349076Swpaul  */
1449076Swpaul#define CMD_TYPE_REQUEST		0xF00DFACE
1549076Swpaul#define CMD_TYPE_DATA			0xBEADC0DE
1649076Swpaul#define CMD_TYPE_INDICATION		0xBEEFFACE
1749076Swpaul
1849076Swpaul#define BOOT_CMD_FW_BY_USB		0x01
1949076Swpaul#define BOOT_CMD_FW_IN_EEPROM		0x02
2049076Swpaul#define BOOT_CMD_UPDATE_BOOT2		0x03
2149076Swpaul#define BOOT_CMD_UPDATE_FW		0x04
2249076Swpaul#define BOOT_CMD_MAGIC_NUMBER		0x4C56524D   /* LVRM */
2349076Swpaul
2449076Swpaulstruct bootcmd {
2549076Swpaul	__le32	magic;
2649076Swpaul	uint8_t	cmd;
2749076Swpaul	uint8_t	pad[11];
2849076Swpaul};
2949076Swpaul
3049076Swpaul#define BOOT_CMD_RESP_OK		0x0001
3149076Swpaul#define BOOT_CMD_RESP_FAIL		0x0000
3249076Swpaul
33122678Sobrienstruct bootcmdresp {
34122678Sobrien	__le32	magic;
35122678Sobrien	uint8_t	cmd;
3649076Swpaul	uint8_t	result;
3749076Swpaul	uint8_t	pad[2];
3851682Swpaul};
39137835Sbrueffer
4049076Swpaul/** USB card description structure*/
4149076Swpaulstruct if_usb_card {
4249076Swpaul	struct usb_device *udev;
4349076Swpaul	struct urb *rx_urb, *tx_urb, *cmd_urb;
4449076Swpaul	struct lbtf_private *priv;
4549076Swpaul
4649076Swpaul	struct sk_buff *rx_skb;
4749076Swpaul
4849076Swpaul	uint8_t ep_in;
4949076Swpaul	uint8_t ep_out;
5049076Swpaul
5149076Swpaul	int8_t bootcmdresp;
52175526Syongari
53175526Syongari	int ep_in_size;
5449076Swpaul
5549076Swpaul	void *ep_out_buf;
5649076Swpaul	int ep_out_size;
5749076Swpaul
5849076Swpaul	const struct firmware *fw;
5949076Swpaul	struct timer_list fw_timeout;
6049076Swpaul	wait_queue_head_t fw_wq;
6149076Swpaul	uint32_t fwseqnum;
62175526Syongari	uint32_t totalbytes;
63175526Syongari	uint32_t fwlastblksent;
64175526Syongari	uint8_t CRC_OK;
6549076Swpaul	uint8_t fwdnldover;
6649076Swpaul	uint8_t fwfinalblk;
6749076Swpaul
6849076Swpaul	__le16 boot2_version;
6949076Swpaul};
7049076Swpaul
7149076Swpaul/** fwheader */
7249076Swpaulstruct fwheader {
7349076Swpaul	__le32 dnldcmd;
7449076Swpaul	__le32 baseaddr;
7549076Swpaul	__le32 datalength;
7649076Swpaul	__le32 CRC;
7749076Swpaul};
7849076Swpaul
7949076Swpaul#define FW_MAX_DATA_BLK_SIZE	600
8049076Swpaul/** FWData */
8149076Swpaulstruct fwdata {
8249076Swpaul	struct fwheader hdr;
83150968Sglebius	__le32 seqnum;
84150968Sglebius	uint8_t data[];
85150968Sglebius};
86150968Sglebius
8749076Swpaul/** fwsyncheader */
8849076Swpaulstruct fwsyncheader {
89175526Syongari	__le32 cmd;
90175526Syongari	__le32 seqnum;
91175526Syongari};
92175526Syongari
9349076Swpaul#define FW_HAS_DATA_TO_RECV		0x00000001
94175526Syongari#define FW_HAS_LAST_BLOCK		0x00000004
95129878Sphk