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