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; 84*2a6be797SGustavo 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