1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
|
/* $OpenBSD: if_bwfm_pci.h,v 1.7 2021/08/31 23:05:11 patrick Exp $ */
/*
* Copyright (c) 2010-2016 Broadcom Corporation
* Copyright (c) 2017 Patrick Wildt <patrick@blueri.se>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Registers */
#define BWFM_PCI_BAR0_WINDOW 0x80
#define BWFM_PCI_BAR0_REG_SIZE 0x1000
#define BWFM_PCI_ARMCR4REG_BANKIDX 0x40
#define BWFM_PCI_ARMCR4REG_BANKPDA 0x4C
#define BWFM_PCI_REG_SBMBX 0x98
#define BWFM_PCI_PCIE2REG_INTMASK 0x24
#define BWFM_PCI_PCIE2REG_MAILBOXINT 0x48
#define BWFM_PCI_PCIE2REG_MAILBOXMASK 0x4C
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_FN0_0 0x0100
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_FN0_1 0x0200
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB0 0x10000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB1 0x20000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB0 0x40000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB1 0x80000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB0 0x100000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB1 0x200000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB0 0x400000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB1 0x800000
#define BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H_DB \
(BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB0 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H0_DB1 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB0 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H1_DB1 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB0 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H2_DB1 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB0 | \
BWFM_PCI_PCIE2REG_MAILBOXMASK_INT_D2H3_DB1)
#define BWFM_PCI_PCIE2REG_CONFIGADDR 0x120
#define BWFM_PCI_PCIE2REG_CONFIGDATA 0x124
#define BWFM_PCI_PCIE2REG_H2D_MAILBOX_0 0x140
#define BWFM_PCI_PCIE2REG_H2D_MAILBOX_1 0x144
#define BWFM_PCI_64_PCIE2REG_INTMASK 0xC14
#define BWFM_PCI_64_PCIE2REG_MAILBOXINT 0xC30
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK 0xC34
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H0_DB0 1
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H0_DB1 2
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H1_DB0 4
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H1_DB1 8
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H2_DB0 0x10
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H2_DB1 0x20
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H3_DB0 0x40
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H3_DB1 0x80
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H4_DB0 0x100
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H4_DB1 0x200
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H5_DB0 0x400
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H5_DB1 0x800
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H6_DB0 0x1000
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H6_DB1 0x2000
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H7_DB0 0x4000
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H7_DB1 0x8000
#define BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H_DB \
(BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H0_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H0_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H1_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H1_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H2_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H2_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H3_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H3_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H4_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H4_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H5_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H5_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H6_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H6_DB1 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H7_DB0 | \
BWFM_PCI_64_PCIE2REG_MAILBOXMASK_INT_D2H7_DB1)
#define BWFM_PCI_64_PCIE2REG_H2D_MAILBOX_0 0xA20
#define BWFM_PCI_64_PCIE2REG_H2D_MAILBOX_1 0xA24
#define BWFM_PCI_CFGREG_STATUS_CMD 0x004
#define BWFM_PCI_CFGREG_PM_CSR 0x04C
#define BWFM_PCI_CFGREG_MSI_CAP 0x058
#define BWFM_PCI_CFGREG_MSI_ADDR_L 0x05C
#define BWFM_PCI_CFGREG_MSI_ADDR_H 0x060
#define BWFM_PCI_CFGREG_MSI_DATA 0x064
#define BWFM_PCI_CFGREG_LINK_STATUS_CTRL 0x0BC
#define BWFM_PCI_CFGREG_LINK_STATUS_CTRL_ASPM_ENAB 0x3
#define BWFM_PCI_CFGREG_LINK_STATUS_CTRL2 0x0DC
#define BWFM_PCI_CFGREG_RBAR_CTRL 0x228
#define BWFM_PCI_CFGREG_PML1_SUB_CTRL1 0x248
#define BWFM_PCI_CFGREG_REG_BAR2_CONFIG 0x4E0
#define BWFM_PCI_CFGREG_REG_BAR3_CONFIG 0x4F4
#define BWFM_RAMSIZE 0x6c
#define BWFM_RAMSIZE_MAGIC 0x534d4152 /* SMAR */
#define BWFM_SHARED_INFO 0x000
#define BWFM_SHARED_INFO_MIN_VERSION 5
#define BWFM_SHARED_INFO_MAX_VERSION 7
#define BWFM_SHARED_INFO_VERSION_MASK 0x00FF
#define BWFM_SHARED_INFO_DMA_INDEX 0x10000
#define BWFM_SHARED_INFO_DMA_2B_IDX 0x100000
#define BWFM_SHARED_INFO_HOSTRDY_DB1 0x10000000
#define BWFM_SHARED_CONSOLE_ADDR 0x14
#define BWFM_SHARED_MAX_RXBUFPOST 0x22
#define BWFM_SHARED_MAX_RXBUFPOST_DEFAULT 255
#define BWFM_SHARED_RX_DATAOFFSET 0x24
#define BWFM_SHARED_HTOD_MB_DATA_ADDR 0x28
#define BWFM_PCI_H2D_HOST_D3_INFORM 0x00000001
#define BWFM_PCI_H2D_HOST_DS_ACK 0x00000002
#define BWFM_PCI_H2D_HOST_D0_INFORM_IN_USE 0x00000008
#define BWFM_PCI_H2D_HOST_D0_INFORM 0x00000010
#define BWFM_SHARED_DTOH_MB_DATA_ADDR 0x2c
#define BWFM_PCI_D2H_DEV_D3_ACK 0x00000001
#define BWFM_PCI_D2H_DEV_DS_ENTER_REQ 0x00000002
#define BWFM_PCI_D2H_DEV_DS_EXIT_NOTE 0x00000004
#define BWFM_PCI_D2H_DEV_FWHALT 0x10000000
#define BWFM_SHARED_RING_INFO_ADDR 0x30
#define BWFM_SHARED_DMA_SCRATCH_LEN 0x34
#define BWFM_SHARED_DMA_SCRATCH_ADDR_LOW 0x38
#define BWFM_SHARED_DMA_SCRATCH_ADDR_HIGH 0x3c
#define BWFM_SHARED_DMA_RINGUPD_LEN 0x40
#define BWFM_SHARED_DMA_RINGUPD_ADDR_LOW 0x44
#define BWFM_SHARED_DMA_RINGUPD_ADDR_HIGH 0x48
#define BWFM_RING_MAX_ITEM 0x04
#define BWFM_RING_LEN_ITEMS 0x06
#define BWFM_RING_MEM_BASE_ADDR_LOW 0x08
#define BWFM_RING_MEM_BASE_ADDR_HIGH 0x0c
#define BWFM_RING_MEM_SZ 16
#define BWFM_CONSOLE_BUFADDR 0x08
#define BWFM_CONSOLE_BUFSIZE 0x0c
#define BWFM_CONSOLE_WRITEIDX 0x10
struct bwfm_pci_ringinfo {
uint32_t ringmem;
uint32_t h2d_w_idx_ptr;
uint32_t h2d_r_idx_ptr;
uint32_t d2h_w_idx_ptr;
uint32_t d2h_r_idx_ptr;
uint32_t h2d_w_idx_hostaddr_low;
uint32_t h2d_w_idx_hostaddr_high;
uint32_t h2d_r_idx_hostaddr_low;
uint32_t h2d_r_idx_hostaddr_high;
uint32_t d2h_w_idx_hostaddr_low;
uint32_t d2h_w_idx_hostaddr_high;
uint32_t d2h_r_idx_hostaddr_low;
uint32_t d2h_r_idx_hostaddr_high;
uint16_t max_flowrings;
uint16_t max_submissionrings;
uint16_t max_completionrings;
};
/* Msgbuf defines */
#define MSGBUF_IOCTL_RESP_TIMEOUT 2000 /* msecs */
#define MSGBUF_IOCTL_REQ_PKTID 0xFFFE
#define MSGBUF_MAX_PKT_SIZE 2048
#define MSGBUF_MAX_CTL_PKT_SIZE 8192
#define MSGBUF_TYPE_GEN_STATUS 0x1
#define MSGBUF_TYPE_RING_STATUS 0x2
#define MSGBUF_TYPE_FLOW_RING_CREATE 0x3
#define MSGBUF_TYPE_FLOW_RING_CREATE_CMPLT 0x4
#define MSGBUF_TYPE_FLOW_RING_DELETE 0x5
#define MSGBUF_TYPE_FLOW_RING_DELETE_CMPLT 0x6
#define MSGBUF_TYPE_FLOW_RING_FLUSH 0x7
#define MSGBUF_TYPE_FLOW_RING_FLUSH_CMPLT 0x8
#define MSGBUF_TYPE_IOCTLPTR_REQ 0x9
#define MSGBUF_TYPE_IOCTLPTR_REQ_ACK 0xA
#define MSGBUF_TYPE_IOCTLRESP_BUF_POST 0xB
#define MSGBUF_TYPE_IOCTL_CMPLT 0xC
#define MSGBUF_TYPE_EVENT_BUF_POST 0xD
#define MSGBUF_TYPE_WL_EVENT 0xE
#define MSGBUF_TYPE_TX_POST 0xF
#define MSGBUF_TYPE_TX_STATUS 0x10
#define MSGBUF_TYPE_RXBUF_POST 0x11
#define MSGBUF_TYPE_RX_CMPLT 0x12
#define MSGBUF_TYPE_LPBK_DMAXFER 0x13
#define MSGBUF_TYPE_LPBK_DMAXFER_CMPLT 0x14
struct msgbuf_common_hdr {
uint8_t msgtype;
uint8_t ifidx;
uint8_t flags;
uint8_t rsvd0;
uint32_t request_id;
};
struct msgbuf_buf_addr {
uint32_t low_addr;
uint32_t high_addr;
};
struct msgbuf_ioctl_req_hdr {
struct msgbuf_common_hdr msg;
uint32_t cmd;
uint16_t trans_id;
uint16_t input_buf_len;
uint16_t output_buf_len;
uint16_t rsvd0[3];
struct msgbuf_buf_addr req_buf_addr;
uint32_t rsvd1[2];
};
struct msgbuf_tx_msghdr {
struct msgbuf_common_hdr msg;
uint8_t txhdr[ETHER_HDR_LEN];
uint8_t flags;
#define BWFM_MSGBUF_PKT_FLAGS_FRAME_802_3 (1 << 0)
#define BWFM_MSGBUF_PKT_FLAGS_PRIO_SHIFT 5
uint8_t seg_cnt;
struct msgbuf_buf_addr metadata_buf_addr;
struct msgbuf_buf_addr data_buf_addr;
uint16_t metadata_buf_len;
uint16_t data_len;
uint32_t rsvd0;
};
struct msgbuf_rx_bufpost {
struct msgbuf_common_hdr msg;
uint16_t metadata_buf_len;
uint16_t data_buf_len;
uint32_t rsvd0;
struct msgbuf_buf_addr metadata_buf_addr;
struct msgbuf_buf_addr data_buf_addr;
};
struct msgbuf_rx_ioctl_resp_or_event {
struct msgbuf_common_hdr msg;
uint16_t host_buf_len;
uint16_t rsvd0[3];
struct msgbuf_buf_addr host_buf_addr;
uint32_t rsvd1[4];
};
struct msgbuf_completion_hdr {
uint16_t status;
uint16_t flow_ring_id;
};
struct msgbuf_rx_event {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint16_t event_data_len;
uint16_t seqnum;
uint16_t rsvd0[4];
};
struct msgbuf_ioctl_resp_hdr {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint16_t resp_len;
uint16_t trans_id;
uint32_t cmd;
uint32_t rsvd0;
};
struct msgbuf_tx_status {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint16_t metadata_len;
uint16_t tx_status;
};
struct msgbuf_rx_complete {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint16_t metadata_len;
uint16_t data_len;
uint16_t data_offset;
uint16_t flags;
uint32_t rx_status_0;
uint32_t rx_status_1;
uint32_t rsvd0;
};
struct msgbuf_tx_flowring_create_req {
struct msgbuf_common_hdr msg;
uint8_t da[ETHER_ADDR_LEN];
uint8_t sa[ETHER_ADDR_LEN];
uint8_t tid;
uint8_t if_flags;
uint16_t flow_ring_id;
uint8_t tc;
uint8_t priority;
uint16_t int_vector;
uint16_t max_items;
uint16_t len_item;
struct msgbuf_buf_addr flow_ring_addr;
};
struct msgbuf_tx_flowring_delete_req {
struct msgbuf_common_hdr msg;
uint16_t flow_ring_id;
uint16_t reason;
uint32_t rsvd0[7];
};
struct msgbuf_flowring_create_resp {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint32_t rsvd0[3];
};
struct msgbuf_flowring_delete_resp {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint32_t rsvd0[3];
};
struct msgbuf_flowring_flush_resp {
struct msgbuf_common_hdr msg;
struct msgbuf_completion_hdr compl_hdr;
uint32_t rsvd0[3];
};
|