Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/misc/iwmc3200top/iwmc3200top.h
15111 views
1
/*
2
* iwmc3200top - Intel Wireless MultiCom 3200 Top Driver
3
* drivers/misc/iwmc3200top/iwmc3200top.h
4
*
5
* Copyright (C) 2009 Intel Corporation. All rights reserved.
6
*
7
* This program is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU General Public License version
9
* 2 as published by the Free Software Foundation.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
* 02110-1301, USA.
20
*
21
*
22
* Author Name: Maxim Grabarnik <[email protected]>
23
* -
24
*
25
*/
26
27
#ifndef __IWMC3200TOP_H__
28
#define __IWMC3200TOP_H__
29
30
#include <linux/workqueue.h>
31
32
#define DRV_NAME "iwmc3200top"
33
#define FW_API_VER 1
34
#define _FW_NAME(api) DRV_NAME "." #api ".fw"
35
#define FW_NAME(api) _FW_NAME(api)
36
37
#define IWMC_SDIO_BLK_SIZE 256
38
#define IWMC_DEFAULT_TR_BLK 64
39
#define IWMC_SDIO_DATA_ADDR 0x0
40
#define IWMC_SDIO_INTR_ENABLE_ADDR 0x14
41
#define IWMC_SDIO_INTR_STATUS_ADDR 0x13
42
#define IWMC_SDIO_INTR_CLEAR_ADDR 0x13
43
#define IWMC_SDIO_INTR_GET_SIZE_ADDR 0x2C
44
45
#define COMM_HUB_HEADER_LENGTH 16
46
#define LOGGER_HEADER_LENGTH 10
47
48
49
#define BARKER_DNLOAD_BT_POS 0
50
#define BARKER_DNLOAD_BT_MSK BIT(BARKER_DNLOAD_BT_POS)
51
#define BARKER_DNLOAD_GPS_POS 1
52
#define BARKER_DNLOAD_GPS_MSK BIT(BARKER_DNLOAD_GPS_POS)
53
#define BARKER_DNLOAD_TOP_POS 2
54
#define BARKER_DNLOAD_TOP_MSK BIT(BARKER_DNLOAD_TOP_POS)
55
#define BARKER_DNLOAD_RESERVED1_POS 3
56
#define BARKER_DNLOAD_RESERVED1_MSK BIT(BARKER_DNLOAD_RESERVED1_POS)
57
#define BARKER_DNLOAD_JUMP_POS 4
58
#define BARKER_DNLOAD_JUMP_MSK BIT(BARKER_DNLOAD_JUMP_POS)
59
#define BARKER_DNLOAD_SYNC_POS 5
60
#define BARKER_DNLOAD_SYNC_MSK BIT(BARKER_DNLOAD_SYNC_POS)
61
#define BARKER_DNLOAD_RESERVED2_POS 6
62
#define BARKER_DNLOAD_RESERVED2_MSK (0x3 << BARKER_DNLOAD_RESERVED2_POS)
63
#define BARKER_DNLOAD_BARKER_POS 8
64
#define BARKER_DNLOAD_BARKER_MSK (0xffffff << BARKER_DNLOAD_BARKER_POS)
65
66
#define IWMC_BARKER_REBOOT (0xdeadbe << BARKER_DNLOAD_BARKER_POS)
67
/* whole field barker */
68
#define IWMC_BARKER_ACK 0xfeedbabe
69
70
#define IWMC_CMD_SIGNATURE 0xcbbc
71
72
#define CMD_HDR_OPCODE_POS 0
73
#define CMD_HDR_OPCODE_MSK_MSK (0xf << CMD_HDR_OPCODE_MSK_POS)
74
#define CMD_HDR_RESPONSE_CODE_POS 4
75
#define CMD_HDR_RESPONSE_CODE_MSK (0xf << CMD_HDR_RESPONSE_CODE_POS)
76
#define CMD_HDR_USE_CHECKSUM_POS 8
77
#define CMD_HDR_USE_CHECKSUM_MSK BIT(CMD_HDR_USE_CHECKSUM_POS)
78
#define CMD_HDR_RESPONSE_REQUIRED_POS 9
79
#define CMD_HDR_RESPONSE_REQUIRED_MSK BIT(CMD_HDR_RESPONSE_REQUIRED_POS)
80
#define CMD_HDR_DIRECT_ACCESS_POS 10
81
#define CMD_HDR_DIRECT_ACCESS_MSK BIT(CMD_HDR_DIRECT_ACCESS_POS)
82
#define CMD_HDR_RESERVED_POS 11
83
#define CMD_HDR_RESERVED_MSK BIT(0x1f << CMD_HDR_RESERVED_POS)
84
#define CMD_HDR_SIGNATURE_POS 16
85
#define CMD_HDR_SIGNATURE_MSK BIT(0xffff << CMD_HDR_SIGNATURE_POS)
86
87
enum {
88
IWMC_OPCODE_PING = 0,
89
IWMC_OPCODE_READ = 1,
90
IWMC_OPCODE_WRITE = 2,
91
IWMC_OPCODE_JUMP = 3,
92
IWMC_OPCODE_REBOOT = 4,
93
IWMC_OPCODE_PERSISTENT_WRITE = 5,
94
IWMC_OPCODE_PERSISTENT_READ = 6,
95
IWMC_OPCODE_READ_MODIFY_WRITE = 7,
96
IWMC_OPCODE_LAST_COMMAND = 15
97
};
98
99
struct iwmct_fw_load_hdr {
100
__le32 cmd;
101
__le32 target_addr;
102
__le32 data_size;
103
__le32 block_chksm;
104
u8 data[0];
105
};
106
107
/**
108
* struct iwmct_fw_hdr
109
* holds all sw components versions
110
*/
111
struct iwmct_fw_hdr {
112
u8 top_major;
113
u8 top_minor;
114
u8 top_revision;
115
u8 gps_major;
116
u8 gps_minor;
117
u8 gps_revision;
118
u8 bt_major;
119
u8 bt_minor;
120
u8 bt_revision;
121
u8 tic_name[31];
122
};
123
124
/**
125
* struct iwmct_fw_sec_hdr
126
* @type: function type
127
* @data_size: section's data size
128
* @target_addr: download address
129
*/
130
struct iwmct_fw_sec_hdr {
131
u8 type[4];
132
__le32 data_size;
133
__le32 target_addr;
134
};
135
136
/**
137
* struct iwmct_parser
138
* @file: fw image
139
* @file_size: fw size
140
* @cur_pos: position in file
141
* @buf: temp buf for download
142
* @buf_size: size of buf
143
* @entry_point: address to jump in fw kick-off
144
*/
145
struct iwmct_parser {
146
const u8 *file;
147
size_t file_size;
148
size_t cur_pos;
149
u8 *buf;
150
size_t buf_size;
151
u32 entry_point;
152
struct iwmct_fw_hdr versions;
153
};
154
155
156
struct iwmct_work_struct {
157
struct list_head list;
158
ssize_t iosize;
159
};
160
161
struct iwmct_dbg {
162
int blocks;
163
bool dump;
164
bool jump;
165
bool direct;
166
bool checksum;
167
bool fw_download;
168
int block_size;
169
int download_trans_blks;
170
171
char label_fw[256];
172
};
173
174
struct iwmct_debugfs;
175
176
struct iwmct_priv {
177
struct sdio_func *func;
178
struct iwmct_debugfs *dbgfs;
179
struct iwmct_parser parser;
180
atomic_t reset;
181
atomic_t dev_sync;
182
u32 trans_len;
183
u32 barker;
184
struct iwmct_dbg dbg;
185
186
/* drivers work items */
187
struct work_struct bus_rescan_worker;
188
struct work_struct isr_worker;
189
190
/* drivers wait queue */
191
wait_queue_head_t wait_q;
192
193
/* rx request list */
194
struct list_head read_req_list;
195
};
196
197
extern int iwmct_tx(struct iwmct_priv *priv, void *src, int count);
198
extern int iwmct_fw_load(struct iwmct_priv *priv);
199
200
extern void iwmct_dbg_init_params(struct iwmct_priv *drv);
201
extern void iwmct_dbg_init_drv_attrs(struct device_driver *drv);
202
extern void iwmct_dbg_remove_drv_attrs(struct device_driver *drv);
203
extern int iwmct_send_hcmd(struct iwmct_priv *priv, u8 *cmd, u16 len);
204
205
#endif /* __IWMC3200TOP_H__ */
206
207