xref: /titanic_50/usr/src/uts/common/io/pcn/pcnimpl.h (revision 174bc6499d233e329ecd3d98a880a7b07df16bfa)
1 /*
2  * Copyright (c) 2011 Jason King.
3  * Copyright (c) 2000 Berkeley Software Design, Inc.
4  * Copyright (c) 1997, 1998, 1999, 2000
5  *      Bill Paul <wpaul@ee.columbia.edu>.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *      This product includes software developed by Bill Paul.
18  * 4. Neither the name of the author nor the names of any co-contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED.  IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD
26  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
32  * THE POSSIBILITY OF SUCH DAMAGE.
33  *
34  */
35 #ifndef	_PCNIMPL_H
36 #define	_PCNIMPL_H
37 
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41 
42 #ifdef	_KERNEL
43 
44 #define	PCN_VENDORID		0x1022
45 #define	PCN_DEVICEID_PCNET	0x2000
46 #define	PCN_DEVICEID_HOME	0x2001
47 
48 typedef struct pcn_type {
49 	uint16_t	pcn_vid;
50 	uint16_t	pcn_did;
51 	char		*pcn_name;	/* ddi_set_prop takes char * */
52 } pcn_type_t;
53 
54 #define	PCN_TXRECLAIM		8
55 #define	PCN_HEADROOM		34
56 #define	PCN_TXRESCHED		120
57 
58 #define	PCN_RXSTAT_BAM		0x0008	/* broadcast address match */
59 #define	PCN_RXSTAT_LAFM		0x0010	/* logical address filter match */
60 #define	PCN_RXSTAT_PAM		0x0020	/* physical address match */
61 #define	PCN_RXSTAT_BPE		0x0080  /* bus parity error */
62 #define	PCN_RXSTAT_ENP		0x0100  /* end of packet */
63 #define	PCN_RXSTAT_STP		0x0200  /* start of packet */
64 #define	PCN_RXSTAT_BUFF		0x0400  /* buffer error */
65 #define	PCN_RXSTAT_CRC		0x0800  /* CRC error */
66 #define	PCN_RXSTAT_OFLOW	0x1000  /* rx overrun */
67 #define	PCN_RXSTAT_FRAM		0x2000  /* framing error */
68 #define	PCN_RXSTAT_ERR		0x4000  /* error summary */
69 #define	PCN_RXSTAT_OWN		0x8000
70 #define	PCN_RXSTAT_STR \
71 	"\020" \
72 	"\004BAM" \
73 	"\005LAFM" \
74 	"\006PAM" \
75 	"\010BPE" \
76 	"\011ENP" \
77 	"\012STP" \
78 	"\013BUFF" \
79 	"\014CRC" \
80 	"\015OFLOW" \
81 	"\016FRAM" \
82 	"\017ERR" \
83 	"\020OWN"
84 
85 #define	PCN_RXLEN_MBO		0xF000
86 #define	PCN_RXLEN_BUFSZ		0x0FFF
87 
88 typedef struct pcn_rx_desc {
89 	uint16_t	pcn_rxlen;
90 	uint16_t	pcn_rsvd0;
91 	uint16_t	pcn_bufsz;
92 	uint16_t	pcn_rxstat;
93 	uint32_t	pcn_rbaddr;
94 	uint32_t	pcn_uspace;
95 } pcn_rx_desc_t;
96 
97 typedef struct pcn_tx_desc {
98 	uint32_t	pcn_txstat;
99 	uint32_t	pcn_txctl;
100 	uint32_t	pcn_tbaddr;
101 	uint32_t	pcn_uspace;
102 } pcn_tx_desc_t;
103 
104 #define	PCN_TXCTL_OWN		0x80000000
105 #define	PCN_TXCTL_ERR		0x40000000	/* error summary */
106 #define	PCN_TXCTL_ADD_FCS	0x20000000	/* add FCS to pkt */
107 #define	PCN_TXCTL_MORE_LTINT	0x10000000
108 #define	PCN_TXCTL_ONE		0x08000000
109 #define	PCN_TXCTL_DEF		0x04000000
110 #define	PCN_TXCTL_STP		0x02000000
111 #define	PCN_TXCTL_ENP		0x01000000
112 #define	PCN_TXCTL_BPE		0x00800000
113 #define	PCN_TXCTL_MBO		0x0000F000
114 #define	PCN_TXCTL_BUFSZ		0x00000FFF
115 #define	PCN_TXCTL_STR \
116 	"\020" \
117 	"\040OWN" \
118 	"\037ERR" \
119 	"\036ADD_FCS" \
120 	"\035MORE_LTINT" \
121 	"\034ONE" \
122 	"\033DEF" \
123 	"\032STP" \
124 	"\031ENP" \
125 	"\030BPE"
126 
127 typedef struct pcn_buf {
128 	caddr_t			pb_buf;
129 	ddi_dma_handle_t	pb_dmah;
130 	ddi_acc_handle_t	pb_acch;
131 	uint32_t		pb_paddr;
132 } pcn_buf_t;
133 
134 /* Constants, do not change */
135 #define	PCN_BUFSZ	(1664)
136 #define	PCN_MCHASH	(64)
137 
138 /* Number of descriptor entries */
139 #define	PCN_RXRING	64
140 #define	PCN_TXRING	256
141 
142 typedef struct pcn {
143 	dev_info_t		*pcn_dip;
144 	mac_handle_t		pcn_mh;
145 	mii_handle_t		pcn_mii;
146 	uint16_t		pcn_cachesize;
147 	int			pcn_flags;
148 	int			pcn_instance;
149 	kmutex_t		pcn_xmtlock;
150 	kmutex_t		pcn_intrlock;
151 	kmutex_t		pcn_reglock;
152 	ddi_iblock_cookie_t	pcn_icookie;
153 	uint_t			pcn_int_pri;
154 	int			pcn_type;
155 	int8_t			pcn_extphyaddr;
156 
157 	/*
158 	 * Register and DMA access
159 	 */
160 	uintptr_t		pcn_regs;
161 	ddi_acc_handle_t	pcn_regshandle;
162 
163 	/*
164 	 * Receive descriptors.
165 	 */
166 	int			pcn_rxhead;
167 	pcn_rx_desc_t		*pcn_rxdescp;
168 	ddi_dma_handle_t	pcn_rxdesc_dmah;
169 	ddi_acc_handle_t	pcn_rxdesc_acch;
170 	uint32_t		pcn_rxdesc_paddr;
171 	pcn_buf_t		**pcn_rxbufs;
172 
173 	/*
174 	 * Transmit descriptors.
175 	 */
176 	int			pcn_txreclaim;
177 	int			pcn_txsend;
178 	int			pcn_txavail;
179 	pcn_tx_desc_t		*pcn_txdescp;
180 	ddi_dma_handle_t	pcn_txdesc_dmah;
181 	ddi_acc_handle_t	pcn_txdesc_acch;
182 	uint32_t		pcn_txdesc_paddr;
183 	pcn_buf_t		**pcn_txbufs;
184 	hrtime_t		pcn_txstall_time;
185 	boolean_t		pcn_wantw;
186 
187 	/*
188 	 * Address management.
189 	 */
190 	uchar_t			pcn_addr[ETHERADDRL];
191 	boolean_t		pcn_promisc;
192 	uint16_t		pcn_mccount[PCN_MCHASH];
193 	uint16_t		pcn_mctab[PCN_MCHASH / 16];
194 
195 	/*
196 	 * stats
197 	 */
198 	uint64_t		pcn_ipackets;
199 	uint64_t		pcn_opackets;
200 	uint64_t		pcn_rbytes;
201 	uint64_t		pcn_obytes;
202 	uint64_t		pcn_brdcstxmt;
203 	uint64_t		pcn_multixmt;
204 	uint64_t		pcn_brdcstrcv;
205 	uint64_t		pcn_multircv;
206 	uint64_t		pcn_norcvbuf;
207 	uint64_t		pcn_errrcv;
208 	uint64_t		pcn_errxmt;
209 	uint64_t		pcn_missed;
210 	uint64_t		pcn_underflow;
211 	uint64_t		pcn_overflow;
212 	uint64_t		pcn_align_errors;
213 	uint64_t		pcn_fcs_errors;
214 	uint64_t		pcn_carrier_errors;
215 	uint64_t		pcn_collisions;
216 	uint64_t		pcn_ex_collisions;
217 	uint64_t		pcn_tx_late_collisions;
218 	uint64_t		pcn_defer_xmts;
219 	uint64_t		pcn_first_collisions;
220 	uint64_t		pcn_multi_collisions;
221 	uint64_t		pcn_sqe_errors;
222 	uint64_t		pcn_macxmt_errors;
223 	uint64_t		pcn_macrcv_errors;
224 	uint64_t		pcn_toolong_errors;
225 	uint64_t		pcn_runt;
226 	uint64_t		pcn_jabber;
227 } pcn_t;
228 
229 /* Flags */
230 #define	PCN_RUNNING		(1L << 0)
231 #define	PCN_SUSPENDED		(1L << 1)
232 #define	PCN_INTR_ENABLED	(1L << 2)
233 #define	PCN_FLAGSTR \
234 	"\020" \
235 	"\001RUNNING" \
236 	"\002SUSPENDED" \
237 	"\003INTR_ENABLED"
238 #define	IS_RUNNING(p)	((p)->pcn_flags & PCN_RUNNING)
239 #define	IS_SUSPENDED(p)	((p)->pcn_flags & PCN_SUSPENDED)
240 
241 #define	SYNCTXDESC(pcnp, index, who) \
242 	(void) ddi_dma_sync(pcnp->pcn_txdesc_dmah, \
243 	    (index * sizeof (pcn_tx_desc_t)), sizeof (pcn_tx_desc_t), who)
244 
245 #define	SYNCRXDESC(pcnp, index, who) \
246 	(void) ddi_dma_sync(pcnp->pcn_rxdesc_dmah, \
247 	    (index * sizeof (pcn_rx_desc_t)), sizeof (pcn_rx_desc_t), who)
248 
249 #define	SYNCBUF(pb, len, who) \
250 	(void) ddi_dma_sync(pb->pb_dmah, 0, len, who)
251 
252 #endif /* _KERNEL */
253 
254 #ifdef __cplusplus
255 }
256 #endif
257 
258 #endif /* _PCNIMPL_H */
259