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