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
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
/*
* This file is part of the Chelsio T1 Ethernet driver.
*
* Copyright (C) 2003-2005 Chelsio Communications. All rights reserved.
*/
#ifndef _CHELSIO_CH_H
#define _CHELSIO_CH_H
#pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/debug.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
* Definitions for module_info
*/
#define CHIDNUM (666) /* module ID number */
#define CHNAME "chxge" /* module name */
#define CHMINPSZ (0) /* min packet size */
#define CHMAXPSZ ETHERMTU /* max packet size */
#define CHHIWAT (32 * 1024) /* hi-water mark */
#define CHLOWAT (1) /* lo-water mark */
#define CH_NO_HWCKSUM 0x1 /* hardware should no add checksum */
#define CH_NO_CPL 0x2 /* no cpl header with data */
#define CH_OFFLOAD 0x4 /* do TCP/IP offload processing */
#define CH_ARP 0x8 /* dummy arp packet (don't free) */
#define CH_TCP_MF 0x10 /* Indicator of Fragmented TCP */
#define CH_UDP_MF 0x20 /* Indicator of Fragmented UDP */
#define CH_UDP 0x40 /* Indicator of regular TCP */
#define SZ_INUSE 64 /* # of in use counters */
/*
* PCI registers
*/
#define BAR0 1
#define BAR1 2
#define BAR2 3
#define BAR3 4
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
/*
* TOE pre-mapped buffer structure
*/
typedef struct tbuf {
struct tbuf *tb_next; /* next entry in free list */
caddr_t tb_base; /* base of buffer */
uint64_t tb_pa; /* physical address of buffer */
ulong_t tb_dh; /* dma handle */
ulong_t tb_ah; /* dma address handle */
void *tb_sa; /* address of card ctrl struct */
uint32_t tb_debug; /* initally 0 */
uint32_t tb_len; /* length of data */
} tbuf_t;
#endif /* CONFIG_CHELSIO_T1_OFFLOAD */
/*
* header structures to hold pre-mapped (DMA) kernel memory buffers.
*/
typedef struct ch_esb {
struct ch_esb *cs_next; /* next entry in list */
struct ch_esb *cs_owner; /* list of buffers owned by ch_t */
void *cs_sa; /* card structure to get ch ptr */
ulong_t cs_dh; /* dma handle */
ulong_t cs_ah; /* dma address handle */
caddr_t cs_buf; /* vaddr of buffer */
uint64_t cs_pa; /* paddr of buffer */
uint32_t cs_index; /* index of buffer_in_use count */
uint32_t cs_flag; /* if set, commit suicide */
#ifdef FRAGMENT /* we assume no fragments */
ddi_dma_cookie_t cs_cookie[MAXFS];
uint_t cs_ncookie;
#endif
frtn_t cs_frtn; /* for esballoc */
} ch_esb_t;
/*
* structure for linked list of multicast addresses that have been
* assigned to the card.
*/
typedef struct ch_mc {
struct ch_mc *cmc_next;
uint8_t cmc_mca[6];
} ch_mc_t;
/*
* structure for linked list of pre-allocated dma handles for command Q
*/
typedef struct free_dh {
struct free_dh *dhe_next;
ulong_t dhe_dh;
} free_dh_t;
/*
* instance configuration
*/
typedef struct ch_cfg {
uint32_t cksum_enabled: 1;
uint32_t burstsize_set: 1;
uint32_t burstsize: 2;
uint32_t transaction_cnt_set: 1;
uint32_t transaction_cnt: 3;
uint32_t relaxed_ordering: 1;
uint32_t enable_dvma: 1;
} ch_cfg_t;
/*
* Per-card state information
*/
typedef struct ch {
dev_info_t *ch_dip; /* device dev info */
gld_mac_info_t *ch_macp; /* gld mac structure */
ch_cfg_t ch_config; /* instance configuration */
uint_t ch_flags; /* state flags */
uint_t ch_state; /* card state */
uint_t ch_blked; /* card is blked on output */
kmutex_t ch_lock; /* lock for ch structure */
caddr_t ch_pci; /* PCI configuration vaddr */
ddi_acc_handle_t ch_hpci; /* PCI configuration access handle */
off_t ch_pcisz; /* size of PCI configuration space */
caddr_t ch_bar0; /* PCI BAR0 vaddr */
ddi_acc_handle_t ch_hbar0; /* PCI BAR0 access handle */
off_t ch_bar0sz; /* size of BAR0 space */
ddi_iblock_cookie_t ch_icookp; /* hardware interrupt cookie ptr */
kmutex_t ch_intr; /* lock for interrupts */
uint32_t ch_maximum_mtu; /* maximum mtu for adapter */
uint32_t ch_sm_buf_sz; /* size of sm esballoc bufs */
uint32_t ch_sm_buf_aln; /* alignment of sm esballoc bufs */
ch_esb_t *ch_small_esb_free; /* free list sm esballoc bufs */
ch_esb_t *ch_small_owner; /* list small bufs owned by ch_t */
kmutex_t ch_small_esbl; /* lock for ch_small_esb list */
uint_t ch_sm_index; /* small buffer in use count index */
uint32_t ch_bg_buf_sz; /* size of bg esballoc bufs */
uint32_t ch_bg_buf_aln; /* alignment of bg esballoc bufs */
ch_esb_t *ch_big_esb_free; /* free list of esballoc entries */
ch_esb_t *ch_big_owner; /* list big bufs owned by ch_t */
kmutex_t ch_big_esbl; /* lock for ch_esb list */
uint_t ch_big_index; /* big buffer in use count index */
kmutex_t ch_mc_lck; /* lock of mulitcast list */
ch_mc_t *ch_mc; /* list of multicast entries */
uint32_t ch_mc_cnt; /* cnt of multicast entries */
/* XXX see how we can use cmdQ_ce list and get rid of lock */
kmutex_t ch_dh_lck; /* lock for ch_dh list */
free_dh_t *ch_dh; /* list of free dma headers for v2p */
#if defined(__sparc)
/* XXX see how we can use cmdQ_ce list and get rid of lock */
free_dh_t *ch_vdh; /* list of free dvma headers for v2p */
#endif
uint32_t ch_ip; /* ip address from first arp */
uint32_t ch_mtu; /* size of device MTU (1500 default) */
/* XXX config_data needs cleanup */
pe_config_data_t config_data; /* card configuration vector */
struct pe_port_t port[4]; /* from freebsd/oschtoe.h driver */
pesge *sge;
struct pemc3 *mc3;
struct pemc4 *mc4;
struct pemc5 *mc5;
struct petp *tp;
struct pecspi *cspi;
struct peespi *espi;
struct peulp *ulp;
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
uint32_t open_device_map;
#endif
struct adapter_params params;
uint16_t vendor_id;
uint16_t device_id;
uint16_t device_subid;
uint16_t chip_revision;
uint16_t chip_version;
uint32_t is_asic;
uint32_t config;
uint32_t ch_unit;
uint8_t init_counter;
char *ch_name;
/* statistics per card */
uint32_t isr_intr; /* # interrupts */
uint32_t oerr; /* send error (no mem) */
uint32_t norcvbuf;
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
int ch_refcnt;
void *ch_toeinst;
void (*toe_rcv)(void *, mblk_t *);
void (*toe_free)(void *, tbuf_t *);
int (*toe_tunnel)(void *, mblk_t *);
kcondvar_t *ch_tx_overflow_cv;
kmutex_t *ch_tx_overflow_mutex;
#endif
uint32_t slow_intr_mask;
#ifdef HOST_PAUSE
uint32_t txxg_cfg1; /* Place holder for MAC cfg reg1. */
int pause_on;
hrtime_t pause_time;
#endif
kmutex_t mac_lock; /* lock for MAC structure */
} ch_t;
/* ch_flags */
#define PEIDLE 0x00 /* chip is uninitialized */
#define PERUNNING 0x01 /* chip is initialized */
#define PEPROMISC 0x04 /* promiscuous mode enabled */
#define PEALLMULTI 0x08 /* all multicast enabled */
#define PESUSPENDED 0x20 /* suspended interface */
#define PENORES 0x40 /* ran out of xmit resources */
#define PESTOP 0x80 /* gldm_stop done */
#define PEINITDONE 0x100 /* initialization done */
#define TSO_CAPABLE 0x200 /* TSO able */
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
/* open_device_map flag */
#define TOEDEV_DEVMAP_BIT 0x1
#endif
/*
* DMA mapping defines
*/
#define DMA_STREAM 1 /* use DDI_DMA_STREAMING for DMA xfers */
#define DMA_4KALN 2 /* align memory to 4K page boundry */
#define DMA_OUT 4 /* this is a write buffer */
#define DMA_SMALN 8 /* aligned at small buffer boundry */
#define DMA_BGALN 16 /* aligned at big buffer boundry */
/*
* Number of multicast addresses per stream
*/
#define CHMAXMC 64
#define CHMCALLOC (CHMAXMC * sizeof (struct ether_addr))
/* ----- Solaris memory - PCI - DMA mapping functions ------ */
void *ch_alloc_dma_mem(ch_t *, int, int, int, uint64_t *, ulong_t *, ulong_t *);
void ch_free_dma_mem(ulong_t, ulong_t);
void ch_unbind_dma_handle(ch_t *, free_dh_t *);
void ch_send_up(ch_t *, mblk_t *, uint32_t, int);
void ch_gld_ok(ch_t *);
uint32_t t1_read_reg_4(ch_t *obj, uint32_t reg_val);
void t1_write_reg_4(ch_t *obj, uint32_t reg_val, uint32_t write_val);
uint32_t t1_os_pci_read_config_2(ch_t *obj, uint32_t reg, uint16_t *val);
uint32_t t1_os_pci_read_config_4(ch_t *obj, uint32_t reg, uint32_t *val);
int t1_os_pci_write_config_2(ch_t *obj, uint32_t reg, uint16_t val);
int t1_os_pci_write_config_4(ch_t *obj, uint32_t reg, uint32_t val);
uint32_t le32_to_cpu(uint32_t data);
void *t1_os_malloc_wait_zero(size_t len);
void t1_os_free(void *adr, size_t len);
int t1_num_of_ports(ch_t *obj);
int pe_os_mem_copy(ch_t *obj, void *dst, void *src, size_t len);
void *pe_os_malloc_contig_wait_zero(ch_t *, size_t, uint64_t *,
ulong_t *, ulong_t *, uint32_t);
void pe_set_mac(ch_t *sa, unsigned char *ac_enaddr);
unsigned char *pe_get_mac(ch_t *sa);
void pe_set_promiscuous(ch_t *sa, int flag);
int pe_get_stats(ch_t *sa, uint64_t *speed, uint32_t *intrcnt,
uint32_t *norcvbuf, uint32_t *oerrors, uint32_t *ierrors,
uint32_t *underrun, uint32_t *overrun, uint32_t *framing,
uint32_t *crc, uint32_t *carrier, uint32_t *collisions,
uint32_t *xcollisions, uint32_t *late, uint32_t *defer,
uint32_t *xerrs, uint32_t *rerrs, uint32_t *toolong, uint32_t *runt,
ulong_t *multixmt, ulong_t *multircv, ulong_t *brdcstxmt,
ulong_t *brdcstrcv);
int pe_attach(ch_t *);
void pe_detach(ch_t *);
void pe_init(void *);
uint_t pe_intr(ch_t *);
#ifdef CONFIG_CHELSIO_T1_OFFLOAD
#define toe_running(a) (a->open_device_map & TOEDEV_DEVMAP_BIT)
#endif
int pe_start(ch_t *sa, mblk_t *mb, uint32_t flg);
void pe_stop(ch_t *sa);
void pe_ioctl(ch_t *, queue_t *, mblk_t *);
int pe_set_mc(ch_t *, uint8_t *, int);
int tpi_read(ch_t *obj, u32 addr, u32 *value);
void CH_ALERT(const char *fmt, ...);
void CH_WARN(const char *fmt, ...);
void CH_ERR(const char *fmt, ...);
void t1_fatal_err(ch_t *chp);
#define memset(s, c, n) bzero(s, n)
extern int enable_checksum_offload;
void pe_dma_handle_init(ch_t *, int);
free_dh_t *ch_get_dma_handle(ch_t *);
void pe_free_fake_arp(void *);
void pe_mark_freelists(ch_t *chp);
#if defined(__sparc)
free_dh_t *ch_get_dvma_handle(ch_t *);
void ch_unbind_dvma_handle(ch_t *, free_dh_t *);
#endif
#define AMD_VENDOR_ID 0x1022
#define AMD_BRIDGE 0x7450
#define AMD_BRIDGE_REV 0x12
#ifdef __cplusplus
}
#endif
#endif /* _CHELSIO_CH_H */
|