vr.c revision 9540:5e546a100242
1198090Srdivacky/*
2194612Sed * CDDL HEADER START
3194612Sed *
4194612Sed * The contents of this file are subject to the terms of the
5194612Sed * Common Development and Distribution License (the "License").
6194612Sed * You may not use this file except in compliance with the License.
7194612Sed *
8194612Sed * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9194612Sed * or http://www.opensolaris.org/os/licensing.
10194612Sed * See the License for the specific language governing permissions
11194612Sed * and limitations under the License.
12194612Sed *
13194612Sed * When distributing Covered Code, include this CDDL HEADER in each
14199511Srdivacky * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15199511Srdivacky * If applicable, add the following below this CDDL HEADER, with the
16207618Srdivacky * fields enclosed by brackets "[]" replaced with your own identifying
17207618Srdivacky * information: Portions Copyright [yyyy] [name of copyright owner]
18207618Srdivacky *
19210299Sed * CDDL HEADER END
20199511Srdivacky */
21207618Srdivacky
22207618Srdivacky/*
23199511Srdivacky * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24199511Srdivacky * Use is subject to license terms.
25207618Srdivacky */
26199511Srdivacky
27199511Srdivacky#include <sys/types.h>
28207618Srdivacky#include <sys/stream.h>
29207618Srdivacky#include <sys/strsun.h>
30207618Srdivacky#include <sys/stat.h>
31207618Srdivacky#include <sys/pci.h>
32199511Srdivacky#include <sys/modctl.h>
33199511Srdivacky#include <sys/kstat.h>
34207618Srdivacky#include <sys/ethernet.h>
35207618Srdivacky#include <sys/devops.h>
36207618Srdivacky#include <sys/debug.h>
37199511Srdivacky#include <sys/conf.h>
38199511Srdivacky#include <sys/mac.h>
39207618Srdivacky#include <sys/mac_provider.h>
40207618Srdivacky#include <sys/mac_ether.h>
41207618Srdivacky#include <sys/sysmacros.h>
42207618Srdivacky#include <sys/dditypes.h>
43199511Srdivacky#include <sys/ddi.h>
44199511Srdivacky#include <sys/sunddi.h>
45207618Srdivacky#include <sys/miiregs.h>
46207618Srdivacky#include <sys/byteorder.h>
47207618Srdivacky#include <sys/note.h>
48207618Srdivacky#include <sys/vlan.h>
49199511Srdivacky
50199511Srdivacky#include "vr.h"
51207618Srdivacky#include "vr_impl.h"
52207618Srdivacky
53207618Srdivacky/*
54207618Srdivacky * VR in a nutshell
55199511Srdivacky * The card uses two rings of data structures to communicate with the host.
56199511Srdivacky * These are referred to as "descriptor rings" and there is one for transmit
57199511Srdivacky * (TX) and one for receive (RX).
58207618Srdivacky *
59207618Srdivacky * The driver uses a "DMA buffer" data type for mapping to those descriptor
60207618Srdivacky * rings. This is a structure with handles and a DMA'able buffer attached to it.
61207618Srdivacky *
62207618Srdivacky * Receive
63207618Srdivacky * The receive ring is filled with DMA buffers. Received packets are copied into
64199511Srdivacky * a newly allocated mblk's and passed upstream.
65199511Srdivacky *
66199511Srdivacky * Transmit
67199511Srdivacky * Each transmit descriptor has a DMA buffer attached to it. The data of TX
68207618Srdivacky * packets is copied into the DMA buffer which is then enqueued for
69199511Srdivacky * transmission.
70199511Srdivacky *
71207618Srdivacky * Reclaim of transmitted packets is done as a result of a transmit completion
72199511Srdivacky * interrupt which is generated 3 times per ring at minimum.
73199511Srdivacky */
74207618Srdivacky
75199511Srdivacky#if defined(DEBUG)
76199511Srdivackyuint32_t	vrdebug = 1;
77207618Srdivacky#define	VR_DEBUG(args)	do {				\
78199511Srdivacky		if (vrdebug > 0)			\
79199511Srdivacky			(*vr_debug()) args;		\
80207618Srdivacky			_NOTE(CONSTANTCONDITION)	\
81199511Srdivacky		} while (0)
82199511Srdivackystatic	void	vr_prt(const char *fmt, ...);
83207618Srdivacky	void	(*vr_debug())(const char *fmt, ...);
84199511Srdivacky#else
85199511Srdivacky#define	VR_DEBUG(args)	do ; _NOTE(CONSTANTCONDITION) while (0)
86199511Srdivacky#endif
87207618Srdivacky
88199511Srdivackystatic char vr_ident[] = "VIA Rhine Ethernet v1.42";
89199511Srdivacky
90199511Srdivacky/*
91199511Srdivacky * Attributes for accessing registers and memory descriptors for this device.
92207618Srdivacky */
93199511Srdivackystatic ddi_device_acc_attr_t vr_dev_dma_accattr = {
94199511Srdivacky	DDI_DEVICE_ATTR_V0,
95207618Srdivacky	DDI_STRUCTURE_LE_ACC,
96199511Srdivacky	DDI_STRICTORDER_ACC
97199511Srdivacky};
98199511Srdivacky
99207618Srdivacky/*
100199511Srdivacky * Attributes for accessing data.
101199511Srdivacky */
102207618Srdivackystatic ddi_device_acc_attr_t vr_data_dma_accattr = {
103199511Srdivacky	DDI_DEVICE_ATTR_V0,
104199511Srdivacky	DDI_NEVERSWAP_ACC,
105207618Srdivacky	DDI_STRICTORDER_ACC
106199511Srdivacky};
107199511Srdivacky
108207618Srdivacky/*
109199511Srdivacky * DMA attributes for descriptors for communication with the device
110199511Srdivacky * This driver assumes that all descriptors of one ring fit in one consequitive
111207618Srdivacky * memory area of max 4K (256 descriptors) that does not cross a page boundary.
112199511Srdivacky * Therefore, we request 4K alignement.
113199511Srdivacky */
114199511Srdivackystatic ddi_dma_attr_t vr_dev_dma_attr = {
115199511Srdivacky	DMA_ATTR_V0,			/* version number */
116207618Srdivacky	0,				/* low DMA address range */
117199511Srdivacky	0xFFFFFFFF,			/* high DMA address range */
118199511Srdivacky	0x7FFFFFFF,			/* DMA counter register */
119199511Srdivacky	0x1000,				/* DMA address alignment */
120199511Srdivacky	0x7F,				/* DMA burstsizes */
121199511Srdivacky	1,				/* min effective DMA size */
122199511Srdivacky	0xFFFFFFFF,			/* max DMA xfer size */
123199511Srdivacky	0xFFFFFFFF,			/* segment boundary */
124207618Srdivacky	1,				/* s/g list length */
125199511Srdivacky	1,				/* granularity of device */
126199511Srdivacky	0				/* DMA transfer flags */
127207618Srdivacky};
128199511Srdivacky
129199511Srdivacky/*
130207618Srdivacky * DMA attributes for the data moved to/from the device
131199511Srdivacky * Note that the alignement is set to 2K so hat a 1500 byte packet never
132199511Srdivacky * crosses a page boundary and thus that a DMA transfer is not split up in
133207618Srdivacky * multiple cookies with a 4K/8K pagesize
134199511Srdivacky */
135199511Srdivackystatic ddi_dma_attr_t vr_data_dma_attr = {
136207618Srdivacky	DMA_ATTR_V0,			/* version number */
137199511Srdivacky	0,				/* low DMA address range */
138199511Srdivacky	0xFFFFFFFF,			/* high DMA address range */
139207618Srdivacky	0x7FFFFFFF,			/* DMA counter register */
140199511Srdivacky	0x800,				/* DMA address alignment */
141199511Srdivacky	0xfff,				/* DMA burstsizes */
142207618Srdivacky	1,				/* min effective DMA size */
143199511Srdivacky	0xFFFFFFFF,			/* max DMA xfer size */
144199511Srdivacky	0xFFFFFFFF,			/* segment boundary */
145207618Srdivacky	1,				/* s/g list length */
146199511Srdivacky	1,				/* granularity of device */
147199511Srdivacky	0				/* DMA transfer flags */
148207618Srdivacky};
149199511Srdivacky
150199511Srdivackystatic mac_callbacks_t vr_mac_callbacks = {
151207618Srdivacky	MC_SETPROP|MC_GETPROP,	/* Which callbacks are set */
152199511Srdivacky	vr_mac_getstat,		/* Get the value of a statistic */
153199511Srdivacky	vr_mac_start,		/* Start the device */
154207618Srdivacky	vr_mac_stop,		/* Stop the device */
155199511Srdivacky	vr_mac_set_promisc,	/* Enable or disable promiscuous mode */
156199511Srdivacky	vr_mac_set_multicast,	/* Enable or disable a multicast addr */
157207618Srdivacky	vr_mac_set_ether_addr,	/* Set the unicast MAC address */
158199511Srdivacky	vr_mac_tx_enqueue_list,	/* Transmit a packet */
159199511Srdivacky	NULL,			/* Process an unknown ioctl */
160207618Srdivacky	NULL,			/* Get capability information */
161199511Srdivacky	NULL,			/* Open the device */
162199511Srdivacky	NULL,			/* Close the device */
163207618Srdivacky	vr_mac_setprop,		/* Set properties of the device */
164199511Srdivacky	vr_mac_getprop		/* Get properties of the device */
165199511Srdivacky};
166207618Srdivacky
167199511Srdivacky/*
168199511Srdivacky * Table with bugs and features for each incarnation of the card.
169207618Srdivacky */
170199511Srdivackystatic const chip_info_t vr_chip_info [] = {
171199511Srdivacky	{
172207618Srdivacky		0x0, 0x0,
173199511Srdivacky		"VIA Rhine Fast Ethernet",
174199511Srdivacky		(VR_BUG_NO_MEMIO),
175207618Srdivacky		(VR_FEATURE_NONE)
176199511Srdivacky	},
177199511Srdivacky	{
178207618Srdivacky		0x04, 0x21,
179199511Srdivacky		"VIA VT86C100A Fast Ethernet",
180199511Srdivacky		(VR_BUG_NEEDMODE2PCEROPT | VR_BUG_NO_TXQUEUEING |
181207618Srdivacky		    VR_BUG_NEEDMODE10T | VR_BUG_TXALIGN | VR_BUG_NO_MEMIO |
182199511Srdivacky		    VR_BUG_MIIPOLLSTOP),
183199511Srdivacky		(VR_FEATURE_NONE)
184207618Srdivacky	},
185199511Srdivacky	{
186199511Srdivacky		0x40, 0x41,
187207618Srdivacky		"VIA VT6102-A Rhine II Fast Ethernet",
188199511Srdivacky		(VR_BUG_NEEDMODE2PCEROPT),
189199511Srdivacky		(VR_FEATURE_RX_PAUSE_CAP)
190207618Srdivacky	},
191199511Srdivacky	{
192199511Srdivacky		0x42, 0x7f,
193207618Srdivacky		"VIA VT6102-C Rhine II Fast Ethernet",
194199511Srdivacky		(VR_BUG_NEEDMODE2PCEROPT),
195199511Srdivacky		(VR_FEATURE_RX_PAUSE_CAP)
196207618Srdivacky	},
197199511Srdivacky	{
198199511Srdivacky		0x80, 0x82,
199199511Srdivacky		"VIA VT6105-A Rhine III Fast Ethernet",
200207618Srdivacky		(VR_BUG_NONE),
201199511Srdivacky		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP)
202199511Srdivacky	},
203207618Srdivacky	{
204199511Srdivacky		0x83, 0x89,
205		"VIA VT6105-B Rhine III Fast Ethernet",
206		(VR_BUG_NONE),
207		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP)
208	},
209	{
210		0x8a, 0x8b,
211		"VIA VT6105-LOM Rhine III Fast Ethernet",
212		(VR_BUG_NONE),
213		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP)
214	},
215	{
216		0x8c, 0x8c,
217		"VIA VT6107-A0 Rhine III Fast Ethernet",
218		(VR_BUG_NONE),
219		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP)
220	},
221	{
222		0x8d, 0x8f,
223		"VIA VT6107-A1 Rhine III Fast Ethernet",
224		(VR_BUG_NONE),
225		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP |
226		    VR_FEATURE_MRDLNMULTIPLE)
227	},
228	{
229		0x90, 0x93,
230		"VIA VT6105M-A0 Rhine III Fast Ethernet Management Adapter",
231		(VR_BUG_NONE),
232		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP |
233		    VR_FEATURE_TXCHKSUM | VR_FEATURE_RXCHKSUM |
234		    VR_FEATURE_CAMSUPPORT | VR_FEATURE_VLANTAGGING |
235		    VR_FEATURE_MIBCOUNTER)
236	},
237	{
238		0x94, 0xff,
239		"VIA VT6105M-B1 Rhine III Fast Ethernet Management Adapter",
240		(VR_BUG_NONE),
241		(VR_FEATURE_RX_PAUSE_CAP | VR_FEATURE_TX_PAUSE_CAP |
242		    VR_FEATURE_TXCHKSUM | VR_FEATURE_RXCHKSUM |
243		    VR_FEATURE_CAMSUPPORT | VR_FEATURE_VLANTAGGING |
244		    VR_FEATURE_MIBCOUNTER)
245	}
246};
247
248/*
249 * Function prototypes
250 */
251static	vr_result_t	vr_add_intr(vr_t *vrp);
252static	void		vr_remove_intr(vr_t *vrp);
253static	int32_t		vr_cam_index(vr_t *vrp, const uint8_t *maddr);
254static	uint32_t	ether_crc_be(const uint8_t *address);
255static	void		vr_tx_enqueue_msg(vr_t *vrp, mblk_t *mp);
256static	void		vr_log(vr_t *vrp, int level, const char *fmt, ...);
257static	int		vr_resume(dev_info_t *devinfo);
258static	int		vr_suspend(dev_info_t *devinfo);
259static	vr_result_t	vr_bus_config(vr_t *vrp);
260static	void		vr_bus_unconfig(vr_t *vrp);
261static	void		vr_reset(vr_t *vrp);
262static	int		vr_start(vr_t *vrp);
263static	int		vr_stop(vr_t *vrp);
264static	vr_result_t	vr_rings_init(vr_t *vrp);
265static	void		vr_rings_fini(vr_t *vrp);
266static	vr_result_t	vr_alloc_ring(vr_t *vrp, vr_ring_t *r, size_t n);
267static	void		vr_free_ring(vr_ring_t *r, size_t n);
268static	vr_result_t	vr_rxring_init(vr_t *vrp);
269static	void		vr_rxring_fini(vr_t *vrp);
270static	vr_result_t	vr_txring_init(vr_t *vrp);
271static	void		vr_txring_fini(vr_t *vrp);
272static	vr_result_t	vr_alloc_dmabuf(vr_t *vrp, vr_data_dma_t *dmap,
273			    uint_t flags);
274static	void		vr_free_dmabuf(vr_data_dma_t *dmap);
275static	void		vr_param_init(vr_t *vrp);
276static	mblk_t		*vr_receive(vr_t *vrp);
277static	void		vr_tx_reclaim(vr_t *vrp);
278static	void		vr_periodic(void *p);
279static	void		vr_error(vr_t *vrp);
280static	void		vr_phy_read(vr_t *vrp, int offset, uint16_t *value);
281static	void		vr_phy_write(vr_t *vrp, int offset, uint16_t value);
282static	void		vr_phy_autopoll_disable(vr_t *vrp);
283static	void		vr_phy_autopoll_enable(vr_t *vrp);
284static	void		vr_link_init(vr_t *vrp);
285static	void		vr_link_state(vr_t *vrp);
286static	void		vr_kstats_init(vr_t *vrp);
287static	int		vr_update_kstats(kstat_t *ksp, int access);
288static	void		vr_remove_kstats(vr_t *vrp);
289
290static int
291vr_attach(dev_info_t *devinfo, ddi_attach_cmd_t cmd)
292{
293	vr_t		*vrp;
294	mac_register_t	*macreg;
295
296	if (cmd == DDI_RESUME)
297		return (vr_resume(devinfo));
298	else if (cmd != DDI_ATTACH)
299		return (DDI_FAILURE);
300
301	/*
302	 * Attach.
303	 */
304	vrp = kmem_zalloc(sizeof (vr_t), KM_SLEEP);
305	ddi_set_driver_private(devinfo, vrp);
306	vrp->devinfo = devinfo;
307
308	/*
309	 * Store the name+instance of the module.
310	 */
311	(void) snprintf(vrp->ifname, sizeof (vrp->ifname), "%s%d",
312	    MODULENAME, ddi_get_instance(devinfo));
313
314	/*
315	 * Bus initialization.
316	 */
317	if (vr_bus_config(vrp) != VR_SUCCESS) {
318		vr_log(vrp, CE_WARN, "vr_bus_config failed");
319		goto fail0;
320	}
321
322	/*
323	 * Initialize default parameters.
324	 */
325	vr_param_init(vrp);
326
327	/*
328	 * Setup the descriptor rings.
329	 */
330	if (vr_rings_init(vrp) != VR_SUCCESS) {
331		vr_log(vrp, CE_WARN, "vr_rings_init failed");
332		goto fail1;
333	}
334
335	/*
336	 * Initialize kstats.
337	 */
338	vr_kstats_init(vrp);
339
340	/*
341	 * Add interrupt to the OS.
342	 */
343	if (vr_add_intr(vrp) != VR_SUCCESS) {
344		vr_log(vrp, CE_WARN, "vr_add_intr failed in attach");
345		goto fail3;
346	}
347
348	/*
349	 * Add mutexes.
350	 */
351	mutex_init(&vrp->intrlock, NULL, MUTEX_DRIVER,
352	    DDI_INTR_PRI(vrp->intr_pri));
353	mutex_init(&vrp->oplock, NULL, MUTEX_DRIVER, NULL);
354	mutex_init(&vrp->tx.lock, NULL, MUTEX_DRIVER, NULL);
355
356	/*
357	 * Enable interrupt.
358	 */
359	if (ddi_intr_enable(vrp->intr_hdl) != DDI_SUCCESS) {
360		vr_log(vrp, CE_NOTE, "ddi_intr_enable failed");
361		goto fail5;
362	}
363
364	/*
365	 * Register with parent, mac.
366	 */
367	if ((macreg = mac_alloc(MAC_VERSION)) == NULL) {
368		vr_log(vrp, CE_WARN, "mac_alloc failed in attach");
369		goto fail6;
370	}
371
372	macreg->m_type_ident = MAC_PLUGIN_IDENT_ETHER;
373	macreg->m_driver = vrp;
374	macreg->m_dip = devinfo;
375	macreg->m_src_addr = vrp->vendor_ether_addr;
376	macreg->m_callbacks = &vr_mac_callbacks;
377	macreg->m_min_sdu = 0;
378	macreg->m_max_sdu = ETHERMTU;
379	macreg->m_margin = VLAN_TAGSZ;
380
381	if (mac_register(macreg, &vrp->machdl) != 0) {
382		vr_log(vrp, CE_WARN, "mac_register failed in attach");
383		goto fail7;
384	}
385	mac_free(macreg);
386	return (DDI_SUCCESS);
387
388fail7:
389	mac_free(macreg);
390fail6:
391	(void) ddi_intr_disable(vrp->intr_hdl);
392fail5:
393	mutex_destroy(&vrp->tx.lock);
394	mutex_destroy(&vrp->oplock);
395	mutex_destroy(&vrp->intrlock);
396	vr_remove_intr(vrp);
397fail3:
398	vr_remove_kstats(vrp);
399fail2:
400	vr_rings_fini(vrp);
401fail1:
402	vr_bus_unconfig(vrp);
403fail0:
404	kmem_free(vrp, sizeof (vr_t));
405	return (DDI_FAILURE);
406}
407
408static int
409vr_detach(dev_info_t *devinfo, ddi_detach_cmd_t cmd)
410{
411	vr_t		*vrp;
412
413	vrp = ddi_get_driver_private(devinfo);
414
415	if (cmd == DDI_SUSPEND)
416		return (vr_suspend(devinfo));
417	else if (cmd != DDI_DETACH)
418		return (DDI_FAILURE);
419
420	if (vrp->chip.state == CHIPSTATE_RUNNING)
421		return (DDI_FAILURE);
422
423	/*
424	 * Try to un-register from the MAC layer.
425	 */
426	if (mac_unregister(vrp->machdl) != 0)
427		return (DDI_FAILURE);
428
429	(void) ddi_intr_disable(vrp->intr_hdl);
430	vr_remove_intr(vrp);
431	mutex_destroy(&vrp->tx.lock);
432	mutex_destroy(&vrp->oplock);
433	mutex_destroy(&vrp->intrlock);
434	vr_remove_kstats(vrp);
435	vr_rings_fini(vrp);
436	vr_bus_unconfig(vrp);
437	kmem_free(vrp, sizeof (vr_t));
438	return (DDI_SUCCESS);
439}
440
441/*
442 * quiesce the card for fast reboot.
443 */
444int
445vr_quiesce(dev_info_t *dev_info)
446{
447	vr_t	*vrp;
448
449	vrp = (vr_t *)ddi_get_driver_private(dev_info);
450
451	/*
452	 * Stop interrupts.
453	 */
454	VR_PUT16(vrp->acc_reg, VR_ICR0, 0);
455	VR_PUT8(vrp->acc_reg, VR_ICR1, 0);
456
457	/*
458	 * Stop DMA.
459	 */
460	VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_STOP);
461	return (DDI_SUCCESS);
462}
463
464/*
465 * Add an interrupt for our device to the OS.
466 */
467static vr_result_t
468vr_add_intr(vr_t *vrp)
469{
470	int	nintrs;
471	int	rc;
472
473	rc = ddi_intr_alloc(vrp->devinfo, &vrp->intr_hdl,
474	    DDI_INTR_TYPE_FIXED,	/* type */
475	    0,			/* number */
476	    1,			/* count */
477	    &nintrs,		/* actualp */
478	    DDI_INTR_ALLOC_STRICT);
479
480	if (rc != DDI_SUCCESS) {
481		vr_log(vrp, CE_NOTE, "ddi_intr_alloc failed: %d", rc);
482		return (VR_FAILURE);
483	}
484
485	rc = ddi_intr_add_handler(vrp->intr_hdl, vr_intr, vrp, NULL);
486	if (rc != DDI_SUCCESS) {
487		vr_log(vrp, CE_NOTE, "ddi_intr_add_handler failed");
488		if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS)
489			vr_log(vrp, CE_NOTE, "ddi_intr_free failed");
490		return (VR_FAILURE);
491	}
492
493	rc = ddi_intr_get_pri(vrp->intr_hdl, &vrp->intr_pri);
494	if (rc != DDI_SUCCESS) {
495		vr_log(vrp, CE_NOTE, "ddi_intr_get_pri failed");
496		if (ddi_intr_remove_handler(vrp->intr_hdl) != DDI_SUCCESS)
497			vr_log(vrp, CE_NOTE, "ddi_intr_remove_handler failed");
498
499		if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS)
500			vr_log(vrp, CE_NOTE, "ddi_intr_free failed");
501
502		return (VR_FAILURE);
503	}
504	return (VR_SUCCESS);
505}
506
507/*
508 * Remove our interrupt from the OS.
509 */
510static void
511vr_remove_intr(vr_t *vrp)
512{
513	if (ddi_intr_remove_handler(vrp->intr_hdl) != DDI_SUCCESS)
514		vr_log(vrp, CE_NOTE, "ddi_intr_remove_handler failed");
515
516	if (ddi_intr_free(vrp->intr_hdl) != DDI_SUCCESS)
517		vr_log(vrp, CE_NOTE, "ddi_intr_free failed");
518}
519
520/*
521 * Resume operation after suspend.
522 */
523static int
524vr_resume(dev_info_t *devinfo)
525{
526	vr_t *vrp;
527
528	vrp = (vr_t *)ddi_get_driver_private(devinfo);
529	mutex_enter(&vrp->oplock);
530	if (vrp->chip.state == CHIPSTATE_SUSPENDED_RUNNING)
531		vr_start(vrp);
532	mutex_exit(&vrp->oplock);
533	return (DDI_SUCCESS);
534}
535
536/*
537 * Suspend operation.
538 */
539static int
540vr_suspend(dev_info_t *devinfo)
541{
542	vr_t *vrp;
543
544	vrp = (vr_t *)ddi_get_driver_private(devinfo);
545	mutex_enter(&vrp->oplock);
546	if (vrp->chip.state == CHIPSTATE_RUNNING) {
547		(void) vr_stop(vrp);
548		vrp->chip.state = CHIPSTATE_SUSPENDED_RUNNING;
549	}
550	mutex_exit(&vrp->oplock);
551	return (DDI_SUCCESS);
552}
553
554/*
555 * Initial bus- and device configuration during attach(9E).
556 */
557static vr_result_t
558vr_bus_config(vr_t *vrp)
559{
560	uint32_t		addr;
561	int			n, nsets, rc;
562	uint_t			elem;
563	pci_regspec_t		*regs;
564
565	/*
566	 * Get the reg property which describes the various access methods.
567	 */
568	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, vrp->devinfo,
569	    0, "reg", (int **)&regs, &elem) != DDI_PROP_SUCCESS) {
570		vr_log(vrp, CE_WARN, "Can't get reg property");
571		return (VR_FAILURE);
572	}
573	nsets = (elem * sizeof (uint_t)) / sizeof (pci_regspec_t);
574
575	/*
576	 * Setup access to all available sets.
577	 */
578	vrp->nsets = nsets;
579	vrp->regset = kmem_zalloc(nsets * sizeof (vr_acc_t), KM_SLEEP);
580	for (n = 0; n < nsets; n++) {
581		rc = ddi_regs_map_setup(vrp->devinfo, n,
582		    &vrp->regset[n].addr, 0, 0,
583		    &vr_dev_dma_accattr,
584		    &vrp->regset[n].hdl);
585		if (rc != DDI_SUCCESS) {
586			vr_log(vrp, CE_NOTE,
587			    "Setup of register set %d failed", n);
588			while (--n >= 0)
589				ddi_regs_map_free(&vrp->regset[n].hdl);
590			kmem_free(vrp->regset, nsets * sizeof (vr_acc_t));
591			ddi_prop_free(regs);
592			return (VR_FAILURE);
593		}
594		bcopy(&regs[n], &vrp->regset[n].reg, sizeof (pci_regspec_t));
595	}
596	ddi_prop_free(regs);
597
598	/*
599	 * Assign type-named pointers to the register sets.
600	 */
601	for (n = 0; n < nsets; n++) {
602		addr = vrp->regset[n].reg.pci_phys_hi & PCI_REG_ADDR_M;
603		if (addr == PCI_ADDR_CONFIG && vrp->acc_cfg == NULL)
604			vrp->acc_cfg = &vrp->regset[n];
605		else if (addr == PCI_ADDR_IO && vrp->acc_io == NULL)
606			vrp->acc_io = &vrp->regset[n];
607		else if (addr == PCI_ADDR_MEM32 && vrp->acc_mem == NULL)
608			vrp->acc_mem = &vrp->regset[n];
609	}
610
611	/*
612	 * Assure there is one of each type.
613	 */
614	if (vrp->acc_cfg == NULL ||
615	    vrp->acc_io == NULL ||
616	    vrp->acc_mem == NULL) {
617		for (n = 0; n < nsets; n++)
618			ddi_regs_map_free(&vrp->regset[n].hdl);
619		kmem_free(vrp->regset, nsets * sizeof (vr_acc_t));
620		vr_log(vrp, CE_WARN,
621		    "Config-, I/O- and memory sets not available");
622		return (VR_FAILURE);
623	}
624
625	/*
626	 * Store vendor/device/revision.
627	 */
628	vrp->chip.vendor = VR_GET16(vrp->acc_cfg, PCI_CONF_VENID);
629	vrp->chip.device = VR_GET16(vrp->acc_cfg, PCI_CONF_DEVID);
630	vrp->chip.revision = VR_GET16(vrp->acc_cfg, PCI_CONF_REVID);
631
632	/*
633	 * Copy the matching chip_info_t structure.
634	 */
635	elem = sizeof (vr_chip_info) / sizeof (chip_info_t);
636	for (n = 0; n < elem; n++) {
637		if (vrp->chip.revision >= vr_chip_info[n].revmin &&
638		    vrp->chip.revision <= vr_chip_info[n].revmax) {
639			bcopy((void*)&vr_chip_info[n],
640			    (void*)&vrp->chip.info,
641			    sizeof (chip_info_t));
642			break;
643		}
644	}
645
646	/*
647	 * If we didn't find a chip_info_t for this card, copy the first
648	 * entry of the info structures. This is a generic Rhine whith no
649	 * bugs and no features.
650	 */
651	if (vrp->chip.info.name == NULL) {
652		bcopy((void*)&vr_chip_info[0],
653		    (void*) &vrp->chip.info,
654		    sizeof (chip_info_t));
655	}
656
657	/*
658	 * Tell what is found.
659	 */
660	vr_log(vrp, CE_NOTE, "pci%d,%d,%d: %s, revision 0x%0x",
661	    PCI_REG_BUS_G(vrp->acc_cfg->reg.pci_phys_hi),
662	    PCI_REG_DEV_G(vrp->acc_cfg->reg.pci_phys_hi),
663	    PCI_REG_FUNC_G(vrp->acc_cfg->reg.pci_phys_hi),
664	    vrp->chip.info.name,
665	    vrp->chip.revision);
666
667	/*
668	 * Assure that the device is prepared for memory space accesses
669	 * This should be the default as the device advertises memory
670	 * access in it's BAR's. However, my VT6102 on a EPIA CL board doesn't
671	 * and thus we explicetely enable it.
672	 */
673	VR_SETBIT8(vrp->acc_io, VR_CFGD, VR_CFGD_MMIOEN);
674
675	/*
676	 * Setup a handle for regular usage, prefer memory space accesses.
677	 */
678	if (vrp->acc_mem != NULL &&
679	    (vrp->chip.info.bugs & VR_BUG_NO_MEMIO) == 0)
680		vrp->acc_reg = vrp->acc_mem;
681	else
682		vrp->acc_reg = vrp->acc_io;
683
684	/*
685	 * Store the vendor's MAC address.
686	 */
687	for (n = 0; n < ETHERADDRL; n++) {
688		vrp->vendor_ether_addr[n] = VR_GET8(vrp->acc_reg,
689		    VR_ETHERADDR + n);
690	}
691	return (VR_SUCCESS);
692}
693
694static void
695vr_bus_unconfig(vr_t *vrp)
696{
697	uint_t	n;
698
699	/*
700	 * Free the register access handles.
701	 */
702	for (n = 0; n < vrp->nsets; n++)
703		ddi_regs_map_free(&vrp->regset[n].hdl);
704	kmem_free(vrp->regset, vrp->nsets * sizeof (vr_acc_t));
705}
706
707/*
708 * Initialize parameter structures.
709 */
710static void
711vr_param_init(vr_t *vrp)
712{
713	/*
714	 * Initialize default link configuration parameters.
715	 */
716	vrp->param.an_en = VR_LINK_AUTONEG_ON;
717	vrp->param.anadv_en = 1; /* Select 802.3 autonegotiation */
718	vrp->param.anadv_en |= MII_ABILITY_100BASE_T4;
719	vrp->param.anadv_en |= MII_ABILITY_100BASE_TX_FD;
720	vrp->param.anadv_en |= MII_ABILITY_100BASE_TX;
721	vrp->param.anadv_en |= MII_ABILITY_10BASE_T_FD;
722	vrp->param.anadv_en |= MII_ABILITY_10BASE_T;
723	/* Not a PHY ability, but advertised on behalf of MAC */
724	vrp->param.anadv_en |= MII_AN_ADVERT_FCS;
725	vrp->param.mtu = ETHERMTU;
726
727	/*
728	 * Store the PHY identity.
729	 */
730	vr_phy_read(vrp, MII_PHYIDH, &vrp->chip.mii.identh);
731	vr_phy_read(vrp, MII_PHYIDL, &vrp->chip.mii.identl);
732
733	/*
734	 * Clear incapabilities imposed by PHY in phymask.
735	 */
736	vrp->param.an_phymask = vrp->param.anadv_en;
737	vr_phy_read(vrp, MII_STATUS, &vrp->chip.mii.status);
738	if ((vrp->chip.mii.status & MII_STATUS_10) == 0)
739		vrp->param.an_phymask &= ~MII_ABILITY_10BASE_T;
740
741	if ((vrp->chip.mii.status & MII_STATUS_10_FD) == 0)
742		vrp->param.an_phymask &= ~MII_ABILITY_10BASE_T_FD;
743
744	if ((vrp->chip.mii.status & MII_STATUS_100_BASEX) == 0)
745		vrp->param.an_phymask &= ~MII_ABILITY_100BASE_TX;
746
747	if ((vrp->chip.mii.status & MII_STATUS_100_BASEX_FD) == 0)
748		vrp->param.an_phymask &= ~MII_ABILITY_100BASE_TX_FD;
749
750	if ((vrp->chip.mii.status & MII_STATUS_100_BASE_T4) == 0)
751		vrp->param.an_phymask &= ~MII_ABILITY_100BASE_T4;
752
753	/*
754	 * Clear incapabilities imposed by MAC in macmask
755	 * Note that flowcontrol (FCS?) is never masked. All of our adapters
756	 * have the ability to honor incoming pause frames. Only the newer can
757	 * transmit pause frames. Since there's no asym flowcontrol in 100Mbit
758	 * Ethernet, we always advertise (symmetric) pause.
759	 */
760	vrp->param.an_macmask = vrp->param.anadv_en;
761
762	/*
763	 * Advertised capabilities is enabled minus incapable.
764	 */
765	vrp->chip.mii.anadv = vrp->param.anadv_en &
766	    (vrp->param.an_phymask & vrp->param.an_macmask);
767
768	/*
769	 * Ensure that autoneg of the PHY matches our default.
770	 */
771	if (vrp->param.an_en == VR_LINK_AUTONEG_ON)
772		vrp->chip.mii.control = MII_CONTROL_ANE;
773	else
774		vrp->chip.mii.control =
775		    (MII_CONTROL_100MB | MII_CONTROL_FDUPLEX);
776}
777
778/*
779 * Setup the descriptor rings.
780 */
781static vr_result_t
782vr_rings_init(vr_t *vrp)
783{
784
785	vrp->rx.ndesc = VR_RX_N_DESC;
786	vrp->tx.ndesc = VR_TX_N_DESC;
787
788	/*
789	 * Create a ring for receive.
790	 */
791	if (vr_alloc_ring(vrp, &vrp->rxring, vrp->rx.ndesc) != VR_SUCCESS)
792		return (VR_FAILURE);
793
794	/*
795	 * Create a ring for transmit.
796	 */
797	if (vr_alloc_ring(vrp, &vrp->txring, vrp->tx.ndesc) != VR_SUCCESS) {
798		vr_free_ring(&vrp->rxring, vrp->rx.ndesc);
799		return (VR_FAILURE);
800	}
801
802	vrp->rx.ring = vrp->rxring.desc;
803	vrp->tx.ring = vrp->txring.desc;
804	return (VR_SUCCESS);
805}
806
807static void
808vr_rings_fini(vr_t *vrp)
809{
810	vr_free_ring(&vrp->rxring, vrp->rx.ndesc);
811	vr_free_ring(&vrp->txring, vrp->tx.ndesc);
812}
813
814/*
815 * Allocate a descriptor ring
816 * The number of descriptor entries must fit in a single page so that the
817 * whole ring fits in one consequtive space.
818 *  i386:  4K page / 16 byte descriptor = 256 entries
819 *  sparc: 8K page / 16 byte descriptor = 512 entries
820 */
821static vr_result_t
822vr_alloc_ring(vr_t *vrp, vr_ring_t *ring, size_t n)
823{
824	ddi_dma_cookie_t	desc_dma_cookie;
825	uint_t			desc_cookiecnt;
826	int			i, rc;
827	size_t			rbytes;
828
829	/*
830	 * Allocate a DMA handle for the chip descriptors.
831	 */
832	rc = ddi_dma_alloc_handle(vrp->devinfo,
833	    &vr_dev_dma_attr,
834	    DDI_DMA_SLEEP,
835	    NULL,
836	    &ring->handle);
837
838	if (rc != DDI_SUCCESS) {
839		vr_log(vrp, CE_WARN,
840		    "ddi_dma_alloc_handle in vr_alloc_ring failed.");
841		return (VR_FAILURE);
842	}
843
844	/*
845	 * Allocate memory for the chip descriptors.
846	 */
847	rc = ddi_dma_mem_alloc(ring->handle,
848	    n * sizeof (vr_chip_desc_t),
849	    &vr_dev_dma_accattr,
850	    DDI_DMA_CONSISTENT,
851	    DDI_DMA_SLEEP,
852	    NULL,
853	    (caddr_t *)&ring->cdesc,
854	    &rbytes,
855	    &ring->acchdl);
856
857	if (rc != DDI_SUCCESS) {
858		vr_log(vrp, CE_WARN,
859		    "ddi_dma_mem_alloc in vr_alloc_ring failed.");
860		ddi_dma_free_handle(&ring->handle);
861		return (VR_FAILURE);
862	}
863
864	/*
865	 * Map the descriptor memory.
866	 */
867	rc = ddi_dma_addr_bind_handle(ring->handle,
868	    NULL,
869	    (caddr_t)ring->cdesc,
870	    rbytes,
871	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
872	    DDI_DMA_SLEEP,
873	    NULL,
874	    &desc_dma_cookie,
875	    &desc_cookiecnt);
876
877	if (rc != DDI_DMA_MAPPED || desc_cookiecnt > 1) {
878		vr_log(vrp, CE_WARN,
879		    "ddi_dma_addr_bind_handle in vr_alloc_ring failed: "
880		    "rc = %d, cookiecnt = %d", rc, desc_cookiecnt);
881		ddi_dma_mem_free(&ring->acchdl);
882		ddi_dma_free_handle(&ring->handle);
883		return (VR_FAILURE);
884	}
885	ring->cdesc_paddr = desc_dma_cookie.dmac_address;
886
887	/*
888	 * Allocate memory for the host descriptor ring.
889	 */
890	ring->desc =
891	    (vr_desc_t *)kmem_zalloc(n * sizeof (vr_desc_t), KM_SLEEP);
892
893	/*
894	 * Interlink the descriptors and connect host- to chip descriptors.
895	 */
896	for (i = 0; i < n; i++) {
897		/*
898		 * Connect the host descriptor to a chip descriptor.
899		 */
900		ring->desc[i].cdesc = &ring->cdesc[i];
901
902		/*
903		 * Store the DMA address and offset in the descriptor
904		 * Offset is for ddi_dma_sync() and paddr is for ddi_get/-put().
905		 */
906		ring->desc[i].offset = i * sizeof (vr_chip_desc_t);
907		ring->desc[i].paddr = ring->cdesc_paddr + ring->desc[i].offset;
908
909		/*
910		 * Link the previous descriptor to this one.
911		 */
912		if (i > 0) {
913			/* Host */
914			ring->desc[i-1].next = &ring->desc[i];
915
916			/* Chip */
917			ddi_put32(ring->acchdl,
918			    &ring->cdesc[i-1].next,
919			    ring->desc[i].paddr);
920		}
921	}
922
923	/*
924	 * Make rings out of this list by pointing last to first.
925	 */
926	i = n - 1;
927	ring->desc[i].next = &ring->desc[0];
928	ddi_put32(ring->acchdl, &ring->cdesc[i].next, ring->desc[0].paddr);
929	return (VR_SUCCESS);
930}
931
932/*
933 * Free the memory allocated for a ring.
934 */
935static void
936vr_free_ring(vr_ring_t *r, size_t n)
937{
938	/*
939	 * Unmap and free the chip descriptors.
940	 */
941	(void) ddi_dma_unbind_handle(r->handle);
942	ddi_dma_mem_free(&r->acchdl);
943	ddi_dma_free_handle(&r->handle);
944
945	/*
946	 * Free the memory for storing host descriptors
947	 */
948	kmem_free(r->desc, n * sizeof (vr_desc_t));
949}
950
951/*
952 * Initialize the receive ring.
953 */
954static vr_result_t
955vr_rxring_init(vr_t *vrp)
956{
957	int		i, rc;
958	vr_desc_t	*rp;
959
960	/*
961	 * Set the read pointer at the start of the ring.
962	 */
963	vrp->rx.rp = &vrp->rx.ring[0];
964
965	/*
966	 * Assign a DMA buffer to each receive descriptor.
967	 */
968	for (i = 0; i < vrp->rx.ndesc; i++) {
969		rp = &vrp->rx.ring[i];
970		rc = vr_alloc_dmabuf(vrp,
971		    &vrp->rx.ring[i].dmabuf,
972		    DDI_DMA_STREAMING | DDI_DMA_READ);
973
974		if (rc != VR_SUCCESS) {
975			while (--i >= 0)
976				vr_free_dmabuf(&vrp->rx.ring[i].dmabuf);
977			return (VR_FAILURE);
978		}
979
980		/*
981		 * Store the address of the dma buffer in the chip descriptor
982		 */
983		ddi_put32(vrp->rxring.acchdl,
984		    &rp->cdesc->data,
985		    rp->dmabuf.paddr);
986
987		/*
988		 * Put the buffer length in the chip descriptor. Ensure that
989		 * length fits in the 11 bits of stat1 (2047/0x7FF)
990		 */
991		ddi_put32(vrp->rxring.acchdl, &rp->cdesc->stat1,
992		    MIN(VR_MAX_PKTSZ, rp->dmabuf.bufsz));
993
994		/*
995		 * Set descriptor ownership to the card
996		 */
997		ddi_put32(vrp->rxring.acchdl, &rp->cdesc->stat0, VR_RDES0_OWN);
998
999		/*
1000		 * Sync the descriptor with main memory
1001		 */
1002		(void) ddi_dma_sync(vrp->rxring.handle, rp->offset,
1003		    sizeof (vr_chip_desc_t), DDI_DMA_SYNC_FORDEV);
1004	}
1005	return (VR_SUCCESS);
1006}
1007
1008/*
1009 * Free the DMA buffers assigned to the receive ring.
1010 */
1011static void
1012vr_rxring_fini(vr_t *vrp)
1013{
1014	int		i;
1015
1016	for (i = 0; i < vrp->rx.ndesc; i++)
1017		vr_free_dmabuf(&vrp->rx.ring[i].dmabuf);
1018}
1019
1020static vr_result_t
1021vr_txring_init(vr_t *vrp)
1022{
1023	vr_desc_t		*wp;
1024	int			i, rc;
1025
1026	/*
1027	 * Set the write- and claim pointer.
1028	 */
1029	vrp->tx.wp = &vrp->tx.ring[0];
1030	vrp->tx.cp = &vrp->tx.ring[0];
1031
1032	/*
1033	 * (Re)set the TX bookkeeping.
1034	 */
1035	vrp->tx.stallticks = 0;
1036	vrp->tx.resched = 0;
1037
1038	/*
1039	 * Every transmit decreases nfree. Every reclaim increases nfree.
1040	 */
1041	vrp->tx.nfree = vrp->tx.ndesc;
1042
1043	/*
1044	 * Attach a DMA buffer to each transmit descriptor.
1045	 */
1046	for (i = 0; i < vrp->tx.ndesc; i++) {
1047		rc = vr_alloc_dmabuf(vrp,
1048		    &vrp->tx.ring[i].dmabuf,
1049		    DDI_DMA_STREAMING | DDI_DMA_WRITE);
1050
1051		if (rc != VR_SUCCESS) {
1052			while (--i >= 0)
1053				vr_free_dmabuf(&vrp->tx.ring[i].dmabuf);
1054			return (VR_FAILURE);
1055		}
1056	}
1057
1058	/*
1059	 * Init & sync the TX descriptors so the device sees a valid ring.
1060	 */
1061	for (i = 0; i < vrp->tx.ndesc; i++) {
1062		wp = &vrp->tx.ring[i];
1063		ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat0, 0);
1064		ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat1, 0);
1065		ddi_put32(vrp->txring.acchdl, &wp->cdesc->data,
1066		    wp->dmabuf.paddr);
1067		(void) ddi_dma_sync(vrp->txring.handle, wp->offset,
1068		    sizeof (vr_chip_desc_t),
1069		    DDI_DMA_SYNC_FORDEV);
1070	}
1071	return (VR_SUCCESS);
1072}
1073
1074/*
1075 * Free the DMA buffers attached to the TX ring.
1076 */
1077static void
1078vr_txring_fini(vr_t *vrp)
1079{
1080	int		i;
1081
1082	/*
1083	 * Free the DMA buffers attached to the TX ring
1084	 */
1085	for (i = 0; i < vrp->tx.ndesc; i++)
1086		vr_free_dmabuf(&vrp->tx.ring[i].dmabuf);
1087}
1088
1089/*
1090 * Allocate a DMA buffer.
1091 */
1092static vr_result_t
1093vr_alloc_dmabuf(vr_t *vrp, vr_data_dma_t *dmap, uint_t dmaflags)
1094{
1095	ddi_dma_cookie_t	dma_cookie;
1096	uint_t			cookiecnt;
1097	int			rc;
1098
1099	/*
1100	 * Allocate a DMA handle for the buffer
1101	 */
1102	rc = ddi_dma_alloc_handle(vrp->devinfo,
1103	    &vr_data_dma_attr,
1104	    DDI_DMA_DONTWAIT, NULL,
1105	    &dmap->handle);
1106
1107	if (rc != DDI_SUCCESS) {
1108		vr_log(vrp, CE_WARN,
1109		    "ddi_dma_alloc_handle failed in vr_alloc_dmabuf");
1110		return (VR_FAILURE);
1111	}
1112
1113	/*
1114	 * Allocate the buffer
1115	 * The allocated buffer is aligned on 2K boundary. This ensures that
1116	 * a 1500 byte frame never cross a page boundary and thus that the DMA
1117	 * mapping can be established in 1 fragment.
1118	 */
1119	rc = ddi_dma_mem_alloc(dmap->handle,
1120	    VR_DMABUFSZ,
1121	    &vr_data_dma_accattr,
1122	    DDI_DMA_RDWR | DDI_DMA_STREAMING,
1123	    DDI_DMA_DONTWAIT, NULL,
1124	    &dmap->buf,
1125	    &dmap->bufsz,
1126	    &dmap->acchdl);
1127
1128	if (rc != DDI_SUCCESS) {
1129		vr_log(vrp, CE_WARN,
1130		    "ddi_dma_mem_alloc failed in vr_alloc_dmabuf");
1131		ddi_dma_free_handle(&dmap->handle);
1132		return (VR_FAILURE);
1133	}
1134
1135	/*
1136	 * Map the memory
1137	 */
1138	rc = ddi_dma_addr_bind_handle(dmap->handle,
1139	    NULL,
1140	    (caddr_t)dmap->buf,
1141	    dmap->bufsz,
1142	    dmaflags,
1143	    DDI_DMA_DONTWAIT,
1144	    NULL,
1145	    &dma_cookie,
1146	    &cookiecnt);
1147
1148	/*
1149	 * The cookiecount should never > 1 because we requested 2K alignment
1150	 */
1151	if (rc != DDI_DMA_MAPPED || cookiecnt > 1) {
1152		vr_log(vrp, CE_WARN,
1153		    "dma_addr_bind_handle failed in vr_alloc_dmabuf: "
1154		    "rc = %d, cookiecnt = %d", rc, cookiecnt);
1155		ddi_dma_mem_free(&dmap->acchdl);
1156		ddi_dma_free_handle(&dmap->handle);
1157		return (VR_FAILURE);
1158	}
1159	dmap->paddr = dma_cookie.dmac_address;
1160	return (VR_SUCCESS);
1161}
1162
1163/*
1164 * Destroy a DMA buffer.
1165 */
1166static void
1167vr_free_dmabuf(vr_data_dma_t *dmap)
1168{
1169	(void) ddi_dma_unbind_handle(dmap->handle);
1170	ddi_dma_mem_free(&dmap->acchdl);
1171	ddi_dma_free_handle(&dmap->handle);
1172}
1173
1174/*
1175 * Interrupt service routine
1176 * When our vector is shared with another device, av_dispatch_autovect calls
1177 * all service routines for the vector until *none* of them return claimed
1178 * That means that, when sharing vectors, this routine is called at least
1179 * twice for each interrupt.
1180 */
1181uint_t
1182vr_intr(caddr_t arg1, caddr_t arg2)
1183{
1184	vr_t		*vrp;
1185	uint16_t	status;
1186	mblk_t		*lp = NULL;
1187	uint32_t	tx_resched;
1188	uint32_t	link_change;
1189
1190	tx_resched = 0;
1191	link_change = 0;
1192	vrp = (void *)arg1;
1193	_NOTE(ARGUNUSED(arg2))
1194
1195	/*
1196	 * Read the status register to see if the interrupt is from our device
1197	 * This read also ensures that posted writes are brought to main memory.
1198	 */
1199	mutex_enter(&vrp->intrlock);
1200	status = VR_GET16(vrp->acc_reg, VR_ISR0) & VR_ICR0_CFG;
1201	if (status == 0) {
1202		/*
1203		 * Status contains no configured interrupts
1204		 * The interrupt was not generated by our device.
1205		 */
1206		vrp->stats.intr_unclaimed++;
1207		mutex_exit(&vrp->intrlock);
1208		return (DDI_INTR_UNCLAIMED);
1209	}
1210	vrp->stats.intr_claimed++;
1211
1212	/*
1213	 * Acknowledge the event(s) that caused interruption.
1214	 */
1215	VR_PUT16(vrp->acc_reg, VR_ISR0, status);
1216
1217	/*
1218	 * Receive completion.
1219	 */
1220	if ((status & (VR_ISR0_RX_DONE | VR_ISR_RX_ERR_BITS)) != 0) {
1221		/*
1222		 * Received some packets.
1223		 */
1224		lp = vr_receive(vrp);
1225
1226		/*
1227		 * DMA stops after a conflict in the FIFO.
1228		 */
1229		if ((status & VR_ISR_RX_ERR_BITS) != 0)
1230			VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO);
1231		status &= ~(VR_ISR0_RX_DONE | VR_ISR_RX_ERR_BITS);
1232	}
1233
1234	/*
1235	 * Transmit completion.
1236	 */
1237	if ((status & (VR_ISR0_TX_DONE | VR_ISR_TX_ERR_BITS)) != 0) {
1238		/*
1239		 * Card done with transmitting some packets
1240		 * TX_DONE is generated 3 times per ring but it appears
1241		 * more often because it is also set when an RX_DONE
1242		 * interrupt is generated.
1243		 */
1244		mutex_enter(&vrp->tx.lock);
1245		vr_tx_reclaim(vrp);
1246		tx_resched = vrp->tx.resched;
1247		vrp->tx.resched = 0;
1248		mutex_exit(&vrp->tx.lock);
1249		status &= ~(VR_ISR0_TX_DONE | VR_ISR_TX_ERR_BITS);
1250	}
1251
1252	/*
1253	 * Link status change.
1254	 */
1255	if ((status & VR_ICR0_LINKSTATUS) != 0) {
1256		/*
1257		 * Get new link state and inform the mac layer.
1258		 */
1259		mutex_enter(&vrp->oplock);
1260		mutex_enter(&vrp->tx.lock);
1261		vr_link_state(vrp);
1262		mutex_exit(&vrp->tx.lock);
1263		mutex_exit(&vrp->oplock);
1264		status &= ~VR_ICR0_LINKSTATUS;
1265		vrp->stats.linkchanges++;
1266		link_change = 1;
1267	}
1268
1269	/*
1270	 * Bus error.
1271	 */
1272	if ((status & VR_ISR0_BUSERR) != 0) {
1273		vr_log(vrp, CE_WARN, "bus error occured");
1274		vrp->reset = 1;
1275		status &= ~VR_ISR0_BUSERR;
1276	}
1277
1278	/*
1279	 * We must have handled all things here.
1280	 */
1281	ASSERT(status == 0);
1282	mutex_exit(&vrp->intrlock);
1283
1284	/*
1285	 * Reset the device if requested
1286	 * The request can come from the periodic tx check or from the interrupt
1287	 * status.
1288	 */
1289	if (vrp->reset != 0) {
1290		vr_error(vrp);
1291		vrp->reset = 0;
1292	}
1293
1294	/*
1295	 * Pass up the list with received packets.
1296	 */
1297	if (lp != NULL)
1298		mac_rx(vrp->machdl, 0, lp);
1299
1300	/*
1301	 * Inform the upper layer on the linkstatus if there was a change.
1302	 */
1303	if (link_change != 0)
1304		mac_link_update(vrp->machdl,
1305		    (link_state_t)vrp->chip.link.state);
1306	/*
1307	 * Restart transmissions if we were waiting for tx descriptors.
1308	 */
1309	if (tx_resched == 1)
1310		mac_tx_update(vrp->machdl);
1311
1312	/*
1313	 * Read something from the card to ensure that all of our configuration
1314	 * writes are delivered to the device before the interrupt is ended.
1315	 */
1316	(void) VR_GET8(vrp->acc_reg, VR_ETHERADDR);
1317	return (DDI_INTR_CLAIMED);
1318}
1319
1320/*
1321 * Respond to an unforseen situation by resetting the card and our bookkeeping.
1322 */
1323static void
1324vr_error(vr_t *vrp)
1325{
1326	vr_log(vrp, CE_WARN, "resetting MAC.");
1327	mutex_enter(&vrp->intrlock);
1328	mutex_enter(&vrp->oplock);
1329	mutex_enter(&vrp->tx.lock);
1330	(void) vr_stop(vrp);
1331	vr_reset(vrp);
1332	(void) vr_start(vrp);
1333	mutex_exit(&vrp->tx.lock);
1334	mutex_exit(&vrp->oplock);
1335	mutex_exit(&vrp->intrlock);
1336	vrp->stats.resets++;
1337}
1338
1339/*
1340 * Collect received packets in a list.
1341 */
1342static mblk_t *
1343vr_receive(vr_t *vrp)
1344{
1345	mblk_t			*lp, *mp, *np;
1346	vr_desc_t		*rxp;
1347	vr_data_dma_t		*dmap;
1348	uint32_t		pklen;
1349	uint32_t		rxstat0;
1350	uint32_t		n;
1351
1352	lp = NULL;
1353	n = 0;
1354	for (rxp = vrp->rx.rp; ; rxp = rxp->next, n++) {
1355		/*
1356		 * Sync the descriptor before looking at it.
1357		 */
1358		(void) ddi_dma_sync(vrp->rxring.handle, rxp->offset,
1359		    sizeof (vr_chip_desc_t), DDI_DMA_SYNC_FORKERNEL);
1360
1361		/*
1362		 * Get the status from the descriptor.
1363		 */
1364		rxstat0 = ddi_get32(vrp->rxring.acchdl, &rxp->cdesc->stat0);
1365
1366		/*
1367		 * We're done if the descriptor is owned by the card.
1368		 */
1369		if ((rxstat0 & VR_RDES0_OWN) != 0)
1370			break;
1371		else if ((rxstat0 & VR_RDES0_RXOK) != 0) {
1372			/*
1373			 * Received a good packet
1374			 */
1375			dmap = &rxp->dmabuf;
1376			pklen = (rxstat0 >> 16) - ETHERFCSL;
1377
1378			/*
1379			 * Sync the data.
1380			 */
1381			(void) ddi_dma_sync(dmap->handle, 0,
1382			    pklen, DDI_DMA_SYNC_FORKERNEL);
1383
1384			/*
1385			 * Send a new copied message upstream.
1386			 */
1387			np = allocb(pklen, 0);
1388			if (np != NULL) {
1389				bcopy(dmap->buf, np->b_rptr, pklen);
1390				np->b_wptr = np->b_rptr + pklen;
1391
1392				vrp->stats.mac_stat_ipackets++;
1393				vrp->stats.mac_stat_rbytes += pklen;
1394
1395				if ((rxstat0 & VR_RDES0_BAR) != 0)
1396					vrp->stats.mac_stat_brdcstrcv++;
1397				else if ((rxstat0 & VR_RDES0_MAR) != 0)
1398					vrp->stats.mac_stat_multircv++;
1399
1400				/*
1401				 * Link this packet in the list.
1402				 */
1403				np->b_next = NULL;
1404				if (lp == NULL)
1405					lp = mp = np;
1406				else {
1407					mp->b_next = np;
1408					mp = np;
1409				}
1410			} else {
1411				vrp->stats.allocbfail++;
1412				vrp->stats.mac_stat_norcvbuf++;
1413			}
1414
1415		} else {
1416			/*
1417			 * Received with errors.
1418			 */
1419			vrp->stats.mac_stat_ierrors++;
1420			if ((rxstat0 & VR_RDES0_FAE) != 0)
1421				vrp->stats.ether_stat_align_errors++;
1422			if ((rxstat0 & VR_RDES0_CRCERR) != 0)
1423				vrp->stats.ether_stat_fcs_errors++;
1424			if ((rxstat0 & VR_RDES0_LONG) != 0)
1425				vrp->stats.ether_stat_toolong_errors++;
1426			if ((rxstat0 & VR_RDES0_RUNT) != 0)
1427				vrp->stats.ether_stat_tooshort_errors++;
1428			if ((rxstat0 & VR_RDES0_FOV) != 0)
1429				vrp->stats.mac_stat_overflows++;
1430		}
1431
1432		/*
1433		 * Reset descriptor ownership to the MAC.
1434		 */
1435		ddi_put32(vrp->rxring.acchdl,
1436		    &rxp->cdesc->stat0,
1437		    VR_RDES0_OWN);
1438		(void) ddi_dma_sync(vrp->rxring.handle,
1439		    rxp->offset,
1440		    sizeof (vr_chip_desc_t),
1441		    DDI_DMA_SYNC_FORDEV);
1442	}
1443	vrp->rx.rp = rxp;
1444
1445	/*
1446	 * If we do flowcontrol and if the card can transmit pause frames,
1447	 * increment the "available receive descriptors" register.
1448	 */
1449	if (n > 0 && vrp->chip.link.flowctrl == VR_PAUSE_BIDIRECTIONAL) {
1450		/*
1451		 * Whenever the card moves a fragment to host memory it
1452		 * decrements the RXBUFCOUNT register. If the value in the
1453		 * register reaches a low watermark, the card transmits a pause
1454		 * frame. If the value in this register reaches a high
1455		 * watermark, the card sends a "cancel pause" frame
1456		 *
1457		 * Non-zero values written to this byte register are added
1458		 * by the chip to the register's contents, so we must write
1459		 * the number of descriptors free'd.
1460		 */
1461		VR_PUT8(vrp->acc_reg, VR_FCR0_RXBUFCOUNT, MIN(n, 0xFF));
1462	}
1463	return (lp);
1464}
1465
1466/*
1467 * Enqueue a list of packets for transmission
1468 * Return the packets not transmitted.
1469 */
1470mblk_t *
1471vr_mac_tx_enqueue_list(void *p, mblk_t *mp)
1472{
1473	vr_t		*vrp;
1474	mblk_t		*nextp;
1475
1476	vrp = (vr_t *)p;
1477	mutex_enter(&vrp->tx.lock);
1478	do {
1479		if (vrp->tx.nfree == 0) {
1480			vrp->stats.ether_stat_defer_xmts++;
1481			vrp->tx.resched = 1;
1482			break;
1483		}
1484		nextp = mp->b_next;
1485		mp->b_next = mp->b_prev = NULL;
1486		vr_tx_enqueue_msg(vrp, mp);
1487		mp = nextp;
1488		vrp->tx.nfree--;
1489	} while (mp != NULL);
1490	mutex_exit(&vrp->tx.lock);
1491
1492	/*
1493	 * Tell the chip to poll the TX ring.
1494	 */
1495	VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO);
1496	return (mp);
1497}
1498
1499/*
1500 * Enqueue a message for transmission.
1501 */
1502static void
1503vr_tx_enqueue_msg(vr_t *vrp, mblk_t *mp)
1504{
1505	vr_desc_t		*wp;
1506	vr_data_dma_t		*dmap;
1507	uint32_t		pklen;
1508	uint32_t		nextp;
1509	int			padlen;
1510
1511	if ((uchar_t)mp->b_rptr[0] == 0xff &&
1512	    (uchar_t)mp->b_rptr[1] == 0xff &&
1513	    (uchar_t)mp->b_rptr[2] == 0xff &&
1514	    (uchar_t)mp->b_rptr[3] == 0xff &&
1515	    (uchar_t)mp->b_rptr[4] == 0xff &&
1516	    (uchar_t)mp->b_rptr[5] == 0xff)
1517		vrp->stats.mac_stat_brdcstxmt++;
1518	else if ((uchar_t)mp->b_rptr[0] == 1)
1519		vrp->stats.mac_stat_multixmt++;
1520
1521	pklen = msgsize(mp);
1522	wp = vrp->tx.wp;
1523	dmap = &wp->dmabuf;
1524
1525	/*
1526	 * Copy the message into the pre-mapped buffer and free mp
1527	 */
1528	mcopymsg(mp, dmap->buf);
1529
1530	/*
1531	 * Clean padlen bytes of short packet.
1532	 */
1533	padlen = ETHERMIN - pklen;
1534	if (padlen > 0) {
1535		bzero(dmap->buf + pklen, padlen);
1536		pklen += padlen;
1537	}
1538
1539	/*
1540	 * Most of the statistics are updated on reclaim, after the actual
1541	 * transmit. obytes is maintained here because the length is cleared
1542	 * after transmission
1543	 */
1544	vrp->stats.mac_stat_obytes += pklen;
1545
1546	/*
1547	 * Sync the data so the device sees the new content too.
1548	 */
1549	(void) ddi_dma_sync(dmap->handle, 0, pklen, DDI_DMA_SYNC_FORDEV);
1550
1551	/*
1552	 * If we have reached the TX interrupt distance, enable a TX interrupt
1553	 * for this packet. The Interrupt Control (IC) bit in the transmit
1554	 * descriptor doesn't have any effect on the interrupt generation
1555	 * despite the vague statements in the datasheet. Thus, we use the
1556	 * more obscure interrupt suppress bit which is probably part of the
1557	 * MAC's bookkeeping for TX interrupts and fragmented packets.
1558	 */
1559	vrp->tx.intr_distance++;
1560	nextp = ddi_get32(vrp->txring.acchdl, &wp->cdesc->next);
1561	if (vrp->tx.intr_distance >= VR_TX_MAX_INTR_DISTANCE) {
1562		/*
1563		 * Don't suppress the interrupt for this packet.
1564		 */
1565		vrp->tx.intr_distance = 0;
1566		nextp &= (~VR_TDES3_SUPPRESS_INTR);
1567	} else {
1568		/*
1569		 * Suppress the interrupt for this packet.
1570		 */
1571		nextp |= VR_TDES3_SUPPRESS_INTR;
1572	}
1573
1574	/*
1575	 * Write and sync the chip's descriptor
1576	 */
1577	ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat1,
1578	    pklen | (VR_TDES1_STP | VR_TDES1_EDP | VR_TDES1_CHN));
1579	ddi_put32(vrp->txring.acchdl, &wp->cdesc->next, nextp);
1580	ddi_put32(vrp->txring.acchdl, &wp->cdesc->stat0, VR_TDES0_OWN);
1581	(void) ddi_dma_sync(vrp->txring.handle, wp->offset,
1582	    sizeof (vr_chip_desc_t), DDI_DMA_SYNC_FORDEV);
1583
1584	/*
1585	 * The ticks counter is cleared by reclaim when it reclaimed some
1586	 * descriptors and incremented by the periodic TX stall check.
1587	 */
1588	vrp->tx.stallticks = 1;
1589	vrp->tx.wp = wp->next;
1590}
1591
1592/*
1593 * Free transmitted descriptors.
1594 */
1595static void
1596vr_tx_reclaim(vr_t *vrp)
1597{
1598	vr_desc_t		*cp;
1599	uint32_t		stat0, stat1, freed, dirty;
1600
1601	ASSERT(mutex_owned(&vrp->tx.lock));
1602
1603	freed = 0;
1604	dirty = vrp->tx.ndesc - vrp->tx.nfree;
1605	for (cp = vrp->tx.cp; dirty > 0; cp = cp->next) {
1606		/*
1607		 * Sync & get descriptor status.
1608		 */
1609		(void) ddi_dma_sync(vrp->txring.handle, cp->offset,
1610		    sizeof (vr_chip_desc_t),
1611		    DDI_DMA_SYNC_FORKERNEL);
1612		stat0 = ddi_get32(vrp->txring.acchdl, &cp->cdesc->stat0);
1613
1614		if ((stat0 & VR_TDES0_OWN) != 0)
1615			break;
1616
1617		/*
1618		 * Do stats for the first descriptor in a chain.
1619		 */
1620		stat1 = ddi_get32(vrp->txring.acchdl, &cp->cdesc->stat1);
1621		if ((stat1 & VR_TDES1_STP) != 0) {
1622			if ((stat0 & VR_TDES0_TERR) != 0) {
1623				vrp->stats.ether_stat_macxmt_errors++;
1624				if ((stat0 & VR_TDES0_UDF) != 0)
1625					vrp->stats.mac_stat_underflows++;
1626				if ((stat0 & VR_TDES0_ABT) != 0)
1627					vrp-> stats.ether_stat_ex_collisions++;
1628				/*
1629				 * Abort and FIFO underflow stop the MAC.
1630				 * Packet queueing must be disabled with HD
1631				 * links because otherwise the MAC is also lost
1632				 * after a few of these events.
1633				 */
1634				VR_PUT8(vrp->acc_reg, VR_CTRL0,
1635				    VR_CTRL0_DMA_GO);
1636			} else
1637				vrp->stats.mac_stat_opackets++;
1638
1639			if ((stat0 & VR_TDES0_COL) != 0) {
1640				if ((stat0 & VR_TDES0_NCR) == 1) {
1641					vrp->stats.
1642					    ether_stat_first_collisions++;
1643				} else {
1644					vrp->stats.
1645					    ether_stat_multi_collisions++;
1646				}
1647				vrp->stats.mac_stat_collisions +=
1648				    (stat0 & VR_TDES0_NCR);
1649			}
1650
1651			if ((stat0 & VR_TDES0_CRS) != 0)
1652				vrp->stats.ether_stat_carrier_errors++;
1653
1654			if ((stat0 & VR_TDES0_OWC) != 0)
1655				vrp->stats.ether_stat_tx_late_collisions++;
1656		}
1657		freed += 1;
1658		dirty -= 1;
1659	}
1660	vrp->tx.cp = cp;
1661
1662	if (freed > 0) {
1663		vrp->tx.nfree += freed;
1664		vrp->tx.stallticks = 0;
1665		vrp->stats.txreclaims += 1;
1666	} else
1667		vrp->stats.txreclaim0 += 1;
1668}
1669
1670/*
1671 * Check TX health every 2 seconds.
1672 */
1673static void
1674vr_periodic(void *p)
1675{
1676	vr_t		*vrp;
1677
1678	vrp = (vr_t *)p;
1679	if (vrp->chip.state == CHIPSTATE_RUNNING &&
1680	    vrp->chip.link.state == VR_LINK_STATE_UP && vrp->reset == 0) {
1681		if (mutex_tryenter(&vrp->intrlock) != 0) {
1682			mutex_enter(&vrp->tx.lock);
1683			if (vrp->tx.resched == 1) {
1684				if (vrp->tx.stallticks >= VR_MAXTXCHECKS) {
1685					/*
1686					 * No succesful reclaim in the last n
1687					 * intervals. Reset the MAC.
1688					 */
1689					vrp->reset = 1;
1690					vr_log(vrp, CE_WARN,
1691					    "TX stalled, resetting MAC");
1692				vrp->stats.txstalls++;
1693				} else {
1694					/*
1695					 * Increase until we find that we've
1696					 * waited long enough.
1697					 */
1698					vrp->tx.stallticks += 1;
1699				}
1700			}
1701			mutex_exit(&vrp->tx.lock);
1702			mutex_exit(&vrp->intrlock);
1703			vrp->stats.txchecks++;
1704		}
1705	}
1706	vrp->stats.cyclics++;
1707}
1708
1709/*
1710 * Bring the device to our desired initial state.
1711 */
1712static void
1713vr_reset(vr_t *vrp)
1714{
1715	uint32_t	time;
1716
1717	/*
1718	 * Reset the MAC
1719	 * If we don't wait long enough for the forced reset to complete,
1720	 * MAC looses sync with PHY. Result link up, no link change interrupt
1721	 * and no data transfer.
1722	 */
1723	time = 0;
1724	VR_PUT8(vrp->acc_io, VR_CTRL1, VR_CTRL1_RESET);
1725	do {
1726		drv_usecwait(100);
1727		time += 100;
1728		if (time >= 100000) {
1729			VR_PUT8(vrp->acc_io, VR_MISC1, VR_MISC1_RESET);
1730			delay(drv_usectohz(200000));
1731		}
1732	} while ((VR_GET8(vrp->acc_io, VR_CTRL1) & VR_CTRL1_RESET) != 0);
1733	delay(drv_usectohz(10000));
1734
1735	/*
1736	 * Load the PROM contents into the MAC again.
1737	 */
1738	VR_SETBIT8(vrp->acc_io, VR_PROMCTL, VR_PROMCTL_RELOAD);
1739	delay(drv_usectohz(100000));
1740
1741	/*
1742	 * Tell the MAC via IO space that we like to use memory space for
1743	 * accessing registers.
1744	 */
1745	VR_SETBIT8(vrp->acc_io, VR_CFGD, VR_CFGD_MMIOEN);
1746}
1747
1748/*
1749 * Prepare and enable the card (MAC + PHY + PCI).
1750 */
1751static int
1752vr_start(vr_t *vrp)
1753{
1754	uint8_t		pci_latency, pci_mode;
1755
1756	ASSERT(mutex_owned(&vrp->oplock));
1757
1758	/*
1759	 * Allocate DMA buffers for RX.
1760	 */
1761	if (vr_rxring_init(vrp) != VR_SUCCESS) {
1762		vr_log(vrp, CE_NOTE, "vr_rxring_init() failed");
1763		return (ENOMEM);
1764	}
1765
1766	/*
1767	 * Allocate DMA buffers for TX.
1768	 */
1769	if (vr_txring_init(vrp) != VR_SUCCESS) {
1770		vr_log(vrp, CE_NOTE, "vr_txring_init() failed");
1771		vr_rxring_fini(vrp);
1772		return (ENOMEM);
1773	}
1774
1775	/*
1776	 * Changes of the chip specific registers as done in VIA's fet driver
1777	 * These bits are not in the datasheet and controlled by vr_chip_info.
1778	 */
1779	pci_mode = VR_GET8(vrp->acc_reg, VR_MODE2);
1780	if ((vrp->chip.info.bugs & VR_BUG_NEEDMODE10T) != 0)
1781		pci_mode |= VR_MODE2_MODE10T;
1782
1783	if ((vrp->chip.info.bugs & VR_BUG_NEEDMODE2PCEROPT) != 0)
1784		pci_mode |= VR_MODE2_PCEROPT;
1785
1786	if ((vrp->chip.info.features & VR_FEATURE_MRDLNMULTIPLE) != 0)
1787		pci_mode |= VR_MODE2_MRDPL;
1788	VR_PUT8(vrp->acc_reg, VR_MODE2, pci_mode);
1789
1790	pci_mode = VR_GET8(vrp->acc_reg, VR_MODE3);
1791	if ((vrp->chip.info.bugs & VR_BUG_NEEDMIION) != 0)
1792		pci_mode |= VR_MODE3_MIION;
1793	VR_PUT8(vrp->acc_reg, VR_MODE3, pci_mode);
1794
1795	/*
1796	 * RX: Accept broadcast packets.
1797	 */
1798	VR_SETBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTBROAD);
1799
1800	/*
1801	 * RX: Start DMA when there are 256 bytes in the FIFO.
1802	 */
1803	VR_SETBITS8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_FIFO_THRESHOLD_BITS,
1804	    VR_RXCFG_FIFO_THRESHOLD_256);
1805	VR_SETBITS8(vrp->acc_reg, VR_BCR0, VR_BCR0_RX_FIFO_THRESHOLD_BITS,
1806	    VR_BCR0_RX_FIFO_THRESHOLD_256);
1807
1808	/*
1809	 * TX: Start transmit when there are 256 bytes in the FIFO.
1810	 */
1811	VR_SETBITS8(vrp->acc_reg, VR_TXCFG, VR_TXCFG_FIFO_THRESHOLD_BITS,
1812	    VR_TXCFG_FIFO_THRESHOLD_256);
1813	VR_SETBITS8(vrp->acc_reg, VR_BCR1, VR_BCR1_TX_FIFO_THRESHOLD_BITS,
1814	    VR_BCR1_TX_FIFO_THRESHOLD_256);
1815
1816	/*
1817	 * Burst transfers up to 256 bytes.
1818	 */
1819	VR_SETBITS8(vrp->acc_reg, VR_BCR0, VR_BCR0_DMABITS, VR_BCR0_DMA256);
1820
1821	/*
1822	 * Disable TX autopolling as it is bad for RX performance
1823	 * I assume this is because the RX process finds the bus often occupied
1824	 * by the polling process.
1825	 */
1826	VR_SETBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_NOAUTOPOLL);
1827
1828	/*
1829	 * Honor the PCI latency timer if it is reasonable.
1830	 */
1831	pci_latency = VR_GET8(vrp->acc_cfg, PCI_CONF_LATENCY_TIMER);
1832	if (pci_latency != 0 && pci_latency != 0xFF)
1833		VR_SETBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_LATENCYTIMER);
1834	else
1835		VR_CLRBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_LATENCYTIMER);
1836
1837	/*
1838	 * Ensure that VLAN filtering is off, because this strips the tag.
1839	 */
1840	if ((vrp->chip.info.features & VR_FEATURE_VLANTAGGING) != 0) {
1841		VR_CLRBIT8(vrp->acc_reg, VR_BCR1, VR_BCR1_VLANFILTER);
1842		VR_CLRBIT8(vrp->acc_reg, VR_TXCFG, VR_TXCFG_8021PQ_EN);
1843	}
1844
1845	/*
1846	 * Clear the CAM filter.
1847	 */
1848	if ((vrp->chip.info.features & VR_FEATURE_CAMSUPPORT) != 0) {
1849		VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_ENABLE);
1850		VR_PUT32(vrp->acc_reg, VR_CAM_MASK, 0);
1851		VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE);
1852
1853		VR_PUT8(vrp->acc_reg, VR_CAM_CTRL,
1854		    VR_CAM_CTRL_ENABLE|VR_CAM_CTRL_SELECT_VLAN);
1855		VR_PUT8(vrp->acc_reg, VR_VCAM0, 0);
1856		VR_PUT8(vrp->acc_reg, VR_VCAM1, 0);
1857		VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_WRITE);
1858		VR_PUT32(vrp->acc_reg, VR_CAM_MASK, 1);
1859		drv_usecwait(2);
1860		VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE);
1861	}
1862
1863	/*
1864	 * Give the start addresses of the descriptor rings to the DMA
1865	 * controller on the MAC.
1866	 */
1867	VR_PUT32(vrp->acc_reg, VR_RXADDR, vrp->rx.rp->paddr);
1868	VR_PUT32(vrp->acc_reg, VR_TXADDR, vrp->tx.wp->paddr);
1869
1870	/*
1871	 * We don't use the additionally invented interrupt ICR1 register,
1872	 * so make sure these are disabled.
1873	 */
1874	VR_PUT8(vrp->acc_reg, VR_ISR1, 0xFF);
1875	VR_PUT8(vrp->acc_reg, VR_ICR1, 0);
1876
1877	/*
1878	 * Enable interrupts.
1879	 */
1880	VR_PUT16(vrp->acc_reg, VR_ISR0, 0xFFFF);
1881	VR_PUT16(vrp->acc_reg, VR_ICR0, VR_ICR0_CFG);
1882
1883	/*
1884	 * Enable the DMA controller.
1885	 */
1886	VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_GO);
1887
1888	/*
1889	 * Configure the link. Rely on the link change interrupt for getting
1890	 * the link state into the driver.
1891	 */
1892	vr_link_init(vrp);
1893
1894	/*
1895	 * Set the software view on the state to 'running'.
1896	 */
1897	vrp->chip.state = CHIPSTATE_RUNNING;
1898	return (0);
1899}
1900
1901/*
1902 * Stop DMA and interrupts.
1903 */
1904static int
1905vr_stop(vr_t *vrp)
1906{
1907	ASSERT(mutex_owned(&vrp->oplock));
1908
1909	/*
1910	 * Stop interrupts.
1911	 */
1912	VR_PUT16(vrp->acc_reg, VR_ICR0, 0);
1913	VR_PUT8(vrp->acc_reg, VR_ICR1, 0);
1914
1915	/*
1916	 * Stop DMA.
1917	 */
1918	VR_PUT8(vrp->acc_reg, VR_CTRL0, VR_CTRL0_DMA_STOP);
1919
1920	/*
1921	 * Set the software view on the state to stopped.
1922	 */
1923	vrp->chip.state = CHIPSTATE_STOPPED;
1924
1925	/*
1926	 * Remove DMA buffers from the rings.
1927	 */
1928	vr_rxring_fini(vrp);
1929	vr_txring_fini(vrp);
1930	return (0);
1931}
1932
1933int
1934vr_mac_start(void *p)
1935{
1936	vr_t	*vrp;
1937	int	rc;
1938
1939	vrp = (vr_t *)p;
1940	mutex_enter(&vrp->oplock);
1941
1942	/*
1943	 * Reset the card.
1944	 */
1945	vr_reset(vrp);
1946
1947	/*
1948	 * Prepare and enable the card.
1949	 */
1950	rc = vr_start(vrp);
1951
1952	/*
1953	 * Configure a cyclic function to keep the card & driver from diverting.
1954	 */
1955	vrp->periodic_id =
1956	    ddi_periodic_add(vr_periodic, vrp, VR_CHECK_INTERVAL, DDI_IPL_0);
1957
1958	mutex_exit(&vrp->oplock);
1959	return (rc);
1960}
1961
1962void
1963vr_mac_stop(void *p)
1964{
1965	vr_t	*vrp = p;
1966
1967	mutex_enter(&vrp->oplock);
1968	mutex_enter(&vrp->tx.lock);
1969
1970	/*
1971	 * Stop the device.
1972	 */
1973	(void) vr_stop(vrp);
1974	mutex_exit(&vrp->tx.lock);
1975
1976	/*
1977	 * Remove the cyclic from the system.
1978	 */
1979	ddi_periodic_delete(vrp->periodic_id);
1980	mutex_exit(&vrp->oplock);
1981}
1982
1983/*
1984 * Add or remove a multicast address to/from the filter
1985 *
1986 * From the 21143 manual:
1987 *  The 21143 can store 512 bits serving as hash bucket heads, and one physical
1988 *  48-bit Ethernet address. Incoming frames with multicast destination
1989 *  addresses are subjected to imperfect filtering. Frames with physical
1990 *  destination  addresses are checked against the single physical address.
1991 *  For any incoming frame with a multicast destination address, the 21143
1992 *  applies the standard Ethernet cyclic redundancy check (CRC) function to the
1993 *  first 6 bytes containing the destination address, then it uses the most
1994 *  significant 9 bits of the result as a bit index into the table. If the
1995 *  indexed bit is set, the frame is accepted. If the bit is cleared, the frame
1996 *  is rejected. This filtering mode is called imperfect because multicast
1997 *  frames not addressed to this station may slip through, but it still
1998 *  decreases the number of frames that the host can receive.
1999 * I assume the above is also the way the VIA chips work. There's not a single
2000 * word about the multicast filter in the datasheet.
2001 *
2002 * Another word on the CAM filter on VT6105M controllers:
2003 *  The VT6105M has content addressable memory which can be used for perfect
2004 *  filtering of 32 multicast addresses and a few VLAN id's
2005 *
2006 *  I think it works like this: When the controller receives a multicast
2007 *  address, it looks up the address using CAM. When it is found, it takes the
2008 *  matching cell address (index) and compares this to the bit position in the
2009 *  cam mask. If the bit is set, the packet is passed up. If CAM lookup does not
2010 *  result in a match, the packet is filtered using the hash based filter,
2011 *  if that matches, the packet is passed up and dropped otherwise
2012 * Also, there's not a single word in the datasheet on how this cam is supposed
2013 * to work ...
2014 */
2015int
2016vr_mac_set_multicast(void *p, boolean_t add, const uint8_t *mca)
2017{
2018	vr_t		*vrp;
2019	uint32_t	crc_index;
2020	int32_t		cam_index;
2021	uint32_t	cam_mask;
2022	boolean_t	use_hash_filter;
2023	ether_addr_t	taddr;
2024	uint32_t	a;
2025
2026	vrp = (vr_t *)p;
2027	mutex_enter(&vrp->oplock);
2028	mutex_enter(&vrp->intrlock);
2029	use_hash_filter = B_FALSE;
2030
2031	if ((vrp->chip.info.features & VR_FEATURE_CAMSUPPORT) != 0) {
2032		/*
2033		 * Program the perfect filter.
2034		 */
2035		cam_mask = VR_GET32(vrp->acc_reg, VR_CAM_MASK);
2036		if (add == B_TRUE) {
2037			/*
2038			 * Get index of first empty slot.
2039			 */
2040			bzero(&taddr, sizeof (taddr));
2041			cam_index = vr_cam_index(vrp, taddr);
2042			if (cam_index != -1) {
2043				/*
2044				 * Add address at cam_index.
2045				 */
2046				cam_mask |= (1 << cam_index);
2047				VR_PUT8(vrp->acc_reg, VR_CAM_CTRL,
2048				    VR_CAM_CTRL_ENABLE);
2049				VR_PUT8(vrp->acc_reg, VR_CAM_ADDR, cam_index);
2050				VR_PUT32(vrp->acc_reg, VR_CAM_MASK, cam_mask);
2051				for (a = 0; a < ETHERADDRL; a++) {
2052					VR_PUT8(vrp->acc_reg,
2053					    VR_MCAM0 + a, mca[a]);
2054				}
2055				VR_PUT8(vrp->acc_reg, VR_CAM_CTRL,
2056				    VR_CAM_CTRL_WRITE);
2057				drv_usecwait(2);
2058				VR_PUT8(vrp->acc_reg, VR_CAM_CTRL,
2059				    VR_CAM_CTRL_DONE);
2060			} else {
2061				/*
2062				 * No free CAM slots available
2063				 * Add mca to the imperfect filter.
2064				 */
2065				use_hash_filter = B_TRUE;
2066			}
2067		} else {
2068			/*
2069			 * Find the index of the entry to remove
2070			 * If the entry was not found (-1), the addition was
2071			 * probably done when the table was full.
2072			 */
2073			cam_index = vr_cam_index(vrp, mca);
2074			if (cam_index != -1) {
2075				/*
2076				 * Disable the corresponding mask bit.
2077				 */
2078				cam_mask &= ~(1 << cam_index);
2079				VR_PUT8(vrp->acc_reg, VR_CAM_CTRL,
2080				    VR_CAM_CTRL_ENABLE);
2081				VR_PUT32(vrp->acc_reg, VR_CAM_MASK, cam_mask);
2082				VR_PUT8(vrp->acc_reg, VR_CAM_CTRL,
2083				    VR_CAM_CTRL_DONE);
2084			} else {
2085				/*
2086				 * The entry to be removed was not found
2087				 * The likely cause is that the CAM was full
2088				 * during addition. The entry is added to the
2089				 * hash filter in that case and needs to be
2090				 * removed there too.
2091				 */
2092				use_hash_filter = B_TRUE;
2093			}
2094		}
2095	} else {
2096		/*
2097		 * No CAM in the MAC, thus we need the hash filter.
2098		 */
2099		use_hash_filter = B_TRUE;
2100	}
2101
2102	if (use_hash_filter == B_TRUE) {
2103		/*
2104		 * Get the CRC-32 of the multicast address
2105		 * The card uses the "MSB first" direction when calculating the
2106		 * the CRC. This is odd because ethernet is "LSB first"
2107		 * We have to use that "big endian" approach as well.
2108		 */
2109		crc_index = ether_crc_be(mca) >> (32 - 6);
2110		if (add == B_TRUE) {
2111			/*
2112			 * Turn bit[crc_index] on.
2113			 */
2114			if (crc_index < 32)
2115				vrp->mhash0 |= (1 << crc_index);
2116			else
2117				vrp->mhash1 |= (1 << (crc_index - 32));
2118		} else {
2119			/*
2120			 * Turn bit[crc_index] off.
2121			 */
2122			if (crc_index < 32)
2123				vrp->mhash0 &= ~(0 << crc_index);
2124			else
2125				vrp->mhash1 &= ~(0 << (crc_index - 32));
2126		}
2127
2128		/*
2129		 * When not promiscuous write the filter now. When promiscuous,
2130		 * the filter is open and will be written when promiscuous ends.
2131		 */
2132		if (vrp->promisc == B_FALSE) {
2133			VR_PUT32(vrp->acc_reg, VR_MAR0, vrp->mhash0);
2134			VR_PUT32(vrp->acc_reg, VR_MAR1, vrp->mhash1);
2135		}
2136	}
2137
2138	/*
2139	 * Enable/disable multicast receivements based on mcount.
2140	 */
2141	if (add == B_TRUE)
2142		vrp->mcount++;
2143	else if (vrp->mcount != 0)
2144		vrp->mcount --;
2145	if (vrp->mcount != 0)
2146		VR_SETBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTMULTI);
2147	else
2148		VR_CLRBIT8(vrp->acc_reg, VR_RXCFG, VR_RXCFG_ACCEPTMULTI);
2149
2150	mutex_exit(&vrp->intrlock);
2151	mutex_exit(&vrp->oplock);
2152	return (0);
2153}
2154
2155/*
2156 * Calculate the CRC32 for 6 bytes of multicast address in MSB(it) first order.
2157 * The MSB first order is a bit odd because Ethernet standard is LSB first
2158 */
2159static uint32_t
2160ether_crc_be(const uint8_t *data)
2161{
2162	uint32_t	crc = (uint32_t)0xFFFFFFFFU;
2163	uint32_t	carry;
2164	uint32_t	bit;
2165	uint32_t	length;
2166	uint8_t		c;
2167
2168	for (length = 0; length < ETHERADDRL; length++) {
2169		c = data[length];
2170		for (bit = 0; bit < 8; bit++) {
2171			carry = ((crc & 0x80000000U) ? 1 : 0) ^ (c & 0x01);
2172			crc <<= 1;
2173			c >>= 1;
2174			if (carry)
2175				crc = (crc ^ 0x04C11DB6) | carry;
2176		}
2177	}
2178	return (crc);
2179}
2180
2181
2182/*
2183 * Return the CAM index (base 0) of maddr or -1 if maddr is not found
2184 * If maddr is 0, return the index of an empty slot in CAM or -1 when no free
2185 * slots available.
2186 */
2187static int32_t
2188vr_cam_index(vr_t *vrp, const uint8_t *maddr)
2189{
2190	ether_addr_t	taddr;
2191	int32_t		index;
2192	uint32_t	mask;
2193	uint32_t	a;
2194
2195	bzero(&taddr, sizeof (taddr));
2196
2197	/*
2198	 * Read the CAM mask from the controller.
2199	 */
2200	mask = VR_GET32(vrp->acc_reg, VR_CAM_MASK);
2201
2202	/*
2203	 * If maddr is 0, return the first unused slot or -1 for no unused.
2204	 */
2205	if (bcmp(maddr, taddr, ETHERADDRL) == 0) {
2206		/*
2207		 * Look for the first unused position in mask.
2208		 */
2209		for (index = 0; index < VR_CAM_SZ; index++) {
2210			if (((mask >> index) & 1) == 0)
2211				return (index);
2212		}
2213		return (-1);
2214	} else {
2215		/*
2216		 * Look for maddr in CAM.
2217		 */
2218		for (index = 0; index < VR_CAM_SZ; index++) {
2219			/* Look at enabled entries only */
2220			if (((mask >> index) & 1) == 0)
2221				continue;
2222
2223			VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_ENABLE);
2224			VR_PUT8(vrp->acc_reg, VR_CAM_ADDR, index);
2225			VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_READ);
2226			drv_usecwait(2);
2227			for (a = 0; a < ETHERADDRL; a++)
2228				taddr[a] = VR_GET8(vrp->acc_reg, VR_MCAM0 + a);
2229			VR_PUT8(vrp->acc_reg, VR_CAM_CTRL, VR_CAM_CTRL_DONE);
2230			if (bcmp(maddr, taddr, ETHERADDRL) == 0)
2231				return (index);
2232		}
2233	}
2234	return (-1);
2235}
2236
2237/*
2238 * Set promiscuous mode on or off.
2239 */
2240int
2241vr_mac_set_promisc(void *p, boolean_t promiscflag)
2242{
2243	vr_t		*vrp;
2244	uint8_t		rxcfg;
2245
2246	vrp = (vr_t *)p;
2247
2248	mutex_enter(&vrp->intrlock);
2249	mutex_enter(&vrp->oplock);
2250	mutex_enter(&vrp->tx.lock);
2251
2252	/*
2253	 * Get current receive configuration.
2254	 */
2255	rxcfg = VR_GET8(vrp->acc_reg, VR_RXCFG);
2256	vrp->promisc = promiscflag;
2257
2258	if (promiscflag == B_TRUE) {
2259		/*
2260		 * Enable promiscuous mode and open the multicast filter.
2261		 */
2262		rxcfg |= (VR_RXCFG_PROMISC | VR_RXCFG_ACCEPTMULTI);
2263		VR_PUT32(vrp->acc_reg, VR_MAR0, 0xffffffff);
2264		VR_PUT32(vrp->acc_reg, VR_MAR1, 0xffffffff);
2265	} else {
2266		/*
2267		 * Restore the multicast filter and disable promiscuous mode.
2268		 */
2269		VR_PUT32(vrp->acc_reg, VR_MAR0, vrp->mhash0);
2270		VR_PUT32(vrp->acc_reg, VR_MAR1, vrp->mhash1);
2271		rxcfg &= ~VR_RXCFG_PROMISC;
2272		if (vrp->mcount != 0)
2273			rxcfg |= VR_RXCFG_ACCEPTMULTI;
2274	}
2275	VR_PUT8(vrp->acc_reg, VR_RXCFG, rxcfg);
2276	mutex_exit(&vrp->tx.lock);
2277	mutex_exit(&vrp->oplock);
2278	mutex_exit(&vrp->intrlock);
2279	return (0);
2280}
2281
2282int
2283vr_mac_getstat(void *arg, uint_t stat, uint64_t *val)
2284{
2285	vr_t		*vrp;
2286	uint64_t	v;
2287
2288	vrp = (void *) arg;
2289
2290	switch (stat) {
2291	default:
2292		return (ENOTSUP);
2293
2294	case ETHER_STAT_ADV_CAP_100T4:
2295		v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_T4) != 0;
2296		break;
2297
2298	case ETHER_STAT_ADV_CAP_100FDX:
2299		v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_TX_FD) != 0;
2300		break;
2301
2302	case ETHER_STAT_ADV_CAP_100HDX:
2303		v = (vrp->chip.mii.anadv & MII_ABILITY_100BASE_TX) != 0;
2304		break;
2305
2306	case ETHER_STAT_ADV_CAP_10FDX:
2307		v = (vrp->chip.mii.anadv & MII_ABILITY_10BASE_T_FD) != 0;
2308		break;
2309
2310	case ETHER_STAT_ADV_CAP_10HDX:
2311		v = (vrp->chip.mii.anadv & MII_ABILITY_10BASE_T) != 0;
2312		break;
2313
2314	case ETHER_STAT_ADV_CAP_ASMPAUSE:
2315		v = 0;
2316		break;
2317
2318	case ETHER_STAT_ADV_CAP_AUTONEG:
2319		v = (vrp->chip.mii.control & MII_CONTROL_ANE) != 0;
2320		break;
2321
2322	case ETHER_STAT_ADV_CAP_PAUSE:
2323		v = (vrp->chip.mii.anadv & MII_AN_ADVERT_FCS) != 0;
2324		break;
2325
2326	case ETHER_STAT_ADV_REMFAULT:
2327		v = (vrp->chip.mii.anadv & MII_AN_ADVERT_REMFAULT) != 0;
2328		break;
2329
2330	case ETHER_STAT_ALIGN_ERRORS:
2331		v = vrp->stats.ether_stat_align_errors;
2332		break;
2333
2334	case ETHER_STAT_CAP_100T4:
2335		v = (vrp->chip.mii.status & MII_STATUS_100_BASE_T4) != 0;
2336		break;
2337
2338	case ETHER_STAT_CAP_100FDX:
2339		v = (vrp->chip.mii.status & MII_STATUS_100_BASEX_FD) != 0;
2340		break;
2341
2342	case ETHER_STAT_CAP_100HDX:
2343		v = (vrp->chip.mii.status & MII_STATUS_100_BASEX) != 0;
2344		break;
2345
2346	case ETHER_STAT_CAP_10FDX:
2347		v = (vrp->chip.mii.status & MII_STATUS_10_FD) != 0;
2348		break;
2349
2350	case ETHER_STAT_CAP_10HDX:
2351		v = (vrp->chip.mii.status & MII_STATUS_10) != 0;
2352		break;
2353
2354	case ETHER_STAT_CAP_ASMPAUSE:
2355		v = 0;
2356		break;
2357
2358	case ETHER_STAT_CAP_AUTONEG:
2359		v = (vrp->chip.mii.status & MII_STATUS_CANAUTONEG) != 0;
2360		break;
2361
2362	case ETHER_STAT_CAP_PAUSE:
2363		v = 1;
2364		break;
2365
2366	case ETHER_STAT_CAP_REMFAULT:
2367		v = (vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0;
2368		break;
2369
2370	case ETHER_STAT_CARRIER_ERRORS:
2371		/*
2372		 * Number of times carrier was lost or never detected on a
2373		 * transmission attempt.
2374		 */
2375		v = vrp->stats.ether_stat_carrier_errors;
2376		break;
2377
2378	case ETHER_STAT_JABBER_ERRORS:
2379		return (ENOTSUP);
2380
2381	case ETHER_STAT_DEFER_XMTS:
2382		/*
2383		 * Packets without collisions where first transmit attempt was
2384		 * delayed because the medium was busy.
2385		 */
2386		v = vrp->stats.ether_stat_defer_xmts;
2387		break;
2388
2389	case ETHER_STAT_EX_COLLISIONS:
2390		/*
2391		 * Frames where excess collisions occurred on transmit, causing
2392		 * transmit failure.
2393		 */
2394		v = vrp->stats.ether_stat_ex_collisions;
2395		break;
2396
2397	case ETHER_STAT_FCS_ERRORS:
2398		/*
2399		 * Packets received with CRC errors.
2400		 */
2401		v = vrp->stats.ether_stat_fcs_errors;
2402		break;
2403
2404	case ETHER_STAT_FIRST_COLLISIONS:
2405		/*
2406		 * Packets successfully transmitted with exactly one collision.
2407		 */
2408		v = vrp->stats.ether_stat_first_collisions;
2409		break;
2410
2411	case ETHER_STAT_LINK_ASMPAUSE:
2412		v = 0;
2413		break;
2414
2415	case ETHER_STAT_LINK_AUTONEG:
2416		v = (vrp->chip.mii.control & MII_CONTROL_ANE) != 0 &&
2417		    (vrp->chip.mii.status & MII_STATUS_ANDONE) != 0;
2418		break;
2419
2420	case ETHER_STAT_LINK_DUPLEX:
2421		v = vrp->chip.link.duplex;
2422		break;
2423
2424	case ETHER_STAT_LINK_PAUSE:
2425		v = vrp->chip.link.flowctrl;
2426		break;
2427
2428	case ETHER_STAT_LP_CAP_100T4:
2429		v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_T4) != 0;
2430		break;
2431
2432	case ETHER_STAT_LP_CAP_1000FDX:
2433		v = 0;
2434		break;
2435
2436	case ETHER_STAT_LP_CAP_1000HDX:
2437		v = 0;
2438		break;
2439
2440	case ETHER_STAT_LP_CAP_100FDX:
2441		v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_TX_FD) != 0;
2442		break;
2443
2444	case ETHER_STAT_LP_CAP_100HDX:
2445		v = (vrp->chip.mii.lpable & MII_ABILITY_100BASE_TX) != 0;
2446		break;
2447
2448	case ETHER_STAT_LP_CAP_10FDX:
2449		v = (vrp->chip.mii.lpable & MII_ABILITY_10BASE_T_FD) != 0;
2450		break;
2451
2452	case ETHER_STAT_LP_CAP_10HDX:
2453		v = (vrp->chip.mii.lpable & MII_ABILITY_10BASE_T) != 0;
2454		break;
2455
2456	case ETHER_STAT_LP_CAP_ASMPAUSE:
2457		v = 0;
2458		break;
2459
2460	case ETHER_STAT_LP_CAP_AUTONEG:
2461		v = (vrp->chip.mii.anexp & MII_AN_EXP_LPCANAN) != 0;
2462		break;
2463
2464	case ETHER_STAT_LP_CAP_PAUSE:
2465		v = (vrp->chip.mii.lpable & MII_AN_ADVERT_FCS) != 0;
2466		break;
2467
2468	case ETHER_STAT_LP_REMFAULT:
2469		v = (vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0;
2470		break;
2471
2472	case ETHER_STAT_MACRCV_ERRORS:
2473		/*
2474		 * Packets received with MAC errors, except align_errors,
2475		 * fcs_errors, and toolong_errors.
2476		 */
2477		v = vrp->stats.ether_stat_macrcv_errors;
2478		break;
2479
2480	case ETHER_STAT_MACXMT_ERRORS:
2481		/*
2482		 * Packets encountering transmit MAC failures, except carrier
2483		 * and collision failures.
2484		 */
2485		v = vrp->stats.ether_stat_macxmt_errors;
2486		break;
2487
2488	case ETHER_STAT_MULTI_COLLISIONS:
2489		/*
2490		 * Packets successfully transmitted with multiple collisions.
2491		 */
2492		v = vrp->stats.ether_stat_multi_collisions;
2493		break;
2494
2495	case ETHER_STAT_SQE_ERRORS:
2496		/*
2497		 * Number of times signal quality error was reported
2498		 * This one is reported by the PHY.
2499		 */
2500		return (ENOTSUP);
2501
2502	case ETHER_STAT_TOOLONG_ERRORS:
2503		/*
2504		 * Packets received larger than the maximum permitted length.
2505		 */
2506		v = vrp->stats.ether_stat_toolong_errors;
2507		break;
2508
2509	case ETHER_STAT_TOOSHORT_ERRORS:
2510		v = vrp->stats.ether_stat_tooshort_errors;
2511		break;
2512
2513	case ETHER_STAT_TX_LATE_COLLISIONS:
2514		/*
2515		 * Number of times a transmit collision occurred late
2516		 * (after 512 bit times).
2517		 */
2518		v = vrp->stats.ether_stat_tx_late_collisions;
2519		break;
2520
2521	case ETHER_STAT_XCVR_ADDR:
2522		/*
2523		 * MII address in the 0 to 31 range of the physical layer
2524		 * device in use for a given Ethernet device.
2525		 */
2526		v = vrp->chip.phyaddr;
2527		break;
2528
2529	case ETHER_STAT_XCVR_ID:
2530		/*
2531		 * MII transceiver manufacturer and device ID.
2532		 */
2533		v = (vrp->chip.mii.identh << 16) | vrp->chip.mii.identl;
2534		break;
2535
2536	case ETHER_STAT_XCVR_INUSE:
2537		v = vrp->chip.link.mau;
2538		break;
2539
2540	case MAC_STAT_BRDCSTRCV:
2541		v = vrp->stats.mac_stat_brdcstrcv;
2542		break;
2543
2544	case MAC_STAT_BRDCSTXMT:
2545		v = vrp->stats.mac_stat_brdcstxmt;
2546		break;
2547
2548	case MAC_STAT_MULTIXMT:
2549		v = vrp->stats.mac_stat_multixmt;
2550		break;
2551
2552	case MAC_STAT_COLLISIONS:
2553		v = vrp->stats.mac_stat_collisions;
2554		break;
2555
2556	case MAC_STAT_IERRORS:
2557		v = vrp->stats.mac_stat_ierrors;
2558		break;
2559
2560	case MAC_STAT_IFSPEED:
2561		if (vrp->chip.link.speed == VR_LINK_SPEED_100MBS)
2562			v = 100 * 1000 * 1000;
2563		else if (vrp->chip.link.speed == VR_LINK_SPEED_10MBS)
2564			v = 10 * 1000 * 1000;
2565		else
2566			v = 0;
2567		break;
2568
2569	case MAC_STAT_IPACKETS:
2570		v = vrp->stats.mac_stat_ipackets;
2571		break;
2572
2573	case MAC_STAT_MULTIRCV:
2574		v = vrp->stats.mac_stat_multircv;
2575		break;
2576
2577	case MAC_STAT_NORCVBUF:
2578		vrp->stats.mac_stat_norcvbuf +=
2579		    VR_GET16(vrp->acc_reg, VR_TALLY_MPA);
2580		VR_PUT16(vrp->acc_reg, VR_TALLY_MPA, 0);
2581		v = vrp->stats.mac_stat_norcvbuf;
2582		break;
2583
2584	case MAC_STAT_NOXMTBUF:
2585		v = vrp->stats.mac_stat_noxmtbuf;
2586		break;
2587
2588	case MAC_STAT_OBYTES:
2589		v = vrp->stats.mac_stat_obytes;
2590		break;
2591
2592	case MAC_STAT_OERRORS:
2593		v = vrp->stats.ether_stat_macxmt_errors +
2594		    vrp->stats.mac_stat_underflows +
2595		    vrp->stats.ether_stat_align_errors +
2596		    vrp->stats.ether_stat_carrier_errors +
2597		    vrp->stats.ether_stat_fcs_errors;
2598		break;
2599
2600	case MAC_STAT_OPACKETS:
2601		v = vrp->stats.mac_stat_opackets;
2602		break;
2603
2604	case MAC_STAT_RBYTES:
2605		v = vrp->stats.mac_stat_rbytes;
2606		break;
2607
2608	case MAC_STAT_UNKNOWNS:
2609		/*
2610		 * Isn't this something for the MAC layer to maintain?
2611		 */
2612		return (ENOTSUP);
2613
2614	case MAC_STAT_UNDERFLOWS:
2615		v = vrp->stats.mac_stat_underflows;
2616		break;
2617
2618	case MAC_STAT_OVERFLOWS:
2619		v = vrp->stats.mac_stat_overflows;
2620		break;
2621	}
2622	*val = v;
2623	return (0);
2624}
2625
2626int
2627vr_mac_set_ether_addr(void *p, const uint8_t *ea)
2628{
2629	vr_t	*vrp;
2630	int	i;
2631
2632	vrp = (vr_t *)p;
2633	mutex_enter(&vrp->oplock);
2634	mutex_enter(&vrp->intrlock);
2635
2636	/*
2637	 * Set a new station address.
2638	 */
2639	for (i = 0; i < ETHERADDRL; i++)
2640		VR_PUT8(vrp->acc_reg, VR_ETHERADDR + i, ea[i]);
2641
2642	mutex_exit(&vrp->intrlock);
2643	mutex_exit(&vrp->oplock);
2644	return (0);
2645}
2646
2647/*
2648 * Configure the ethernet link according to param and chip.mii.
2649 */
2650static void
2651vr_link_init(vr_t *vrp)
2652{
2653	ASSERT(mutex_owned(&vrp->oplock));
2654	if ((vrp->chip.mii.control & MII_CONTROL_ANE) != 0) {
2655		/*
2656		 * If we do autoneg, ensure restart autoneg is ON.
2657		 */
2658		vrp->chip.mii.control |= MII_CONTROL_RSAN;
2659
2660		/*
2661		 * The advertisements are prepared by param_init.
2662		 */
2663		vr_phy_write(vrp, MII_AN_ADVERT, vrp->chip.mii.anadv);
2664	} else {
2665		/*
2666		 * If we don't autoneg, we need speed, duplex and flowcontrol
2667		 * to configure the link. However, dladm doesn't allow changes
2668		 * to speed and duplex (readonly). The way this is solved
2669		 * (ahem) is to select the highest enabled combination
2670		 * Speed and duplex should be r/w when autoneg is off.
2671		 */
2672		if ((vrp->param.anadv_en &
2673		    MII_ABILITY_100BASE_TX_FD) != 0) {
2674			vrp->chip.mii.control |= MII_CONTROL_100MB;
2675			vrp->chip.mii.control |= MII_CONTROL_FDUPLEX;
2676		} else if ((vrp->param.anadv_en &
2677		    MII_ABILITY_100BASE_TX) != 0) {
2678			vrp->chip.mii.control |= MII_CONTROL_100MB;
2679			vrp->chip.mii.control &= ~MII_CONTROL_FDUPLEX;
2680		} else if ((vrp->param.anadv_en &
2681		    MII_ABILITY_10BASE_T_FD) != 0) {
2682			vrp->chip.mii.control |= MII_CONTROL_FDUPLEX;
2683			vrp->chip.mii.control &= ~MII_CONTROL_100MB;
2684		} else {
2685			vrp->chip.mii.control &= ~MII_CONTROL_100MB;
2686			vrp->chip.mii.control &= ~MII_CONTROL_FDUPLEX;
2687		}
2688	}
2689	/*
2690	 * Write the control register.
2691	 */
2692	vr_phy_write(vrp, MII_CONTROL, vrp->chip.mii.control);
2693
2694	/*
2695	 * With autoneg off we cannot rely on the link_change interrupt for
2696	 * for getting the status into the driver.
2697	 */
2698	if ((vrp->chip.mii.control & MII_CONTROL_ANE) == 0) {
2699		vr_link_state(vrp);
2700		mac_link_update(vrp->machdl,
2701		    (link_state_t)vrp->chip.link.state);
2702	}
2703}
2704
2705/*
2706 * Get link state in the driver and configure the MAC accordingly.
2707 */
2708static void
2709vr_link_state(vr_t *vrp)
2710{
2711	uint16_t		mask;
2712
2713	ASSERT(mutex_owned(&vrp->oplock));
2714
2715	vr_phy_read(vrp, MII_STATUS, &vrp->chip.mii.status);
2716	vr_phy_read(vrp, MII_CONTROL, &vrp->chip.mii.control);
2717	vr_phy_read(vrp, MII_AN_ADVERT, &vrp->chip.mii.anadv);
2718	vr_phy_read(vrp, MII_AN_LPABLE, &vrp->chip.mii.lpable);
2719	vr_phy_read(vrp, MII_AN_EXPANSION, &vrp->chip.mii.anexp);
2720
2721	/*
2722	 * If we did autongeg, deduce the link type/speed by selecting the
2723	 * highest common denominator.
2724	 */
2725	if ((vrp->chip.mii.control & MII_CONTROL_ANE) != 0) {
2726		mask = vrp->chip.mii.anadv & vrp->chip.mii.lpable;
2727		if ((mask & MII_ABILITY_100BASE_TX_FD) != 0) {
2728			vrp->chip.link.speed = VR_LINK_SPEED_100MBS;
2729			vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL;
2730			vrp->chip.link.mau = VR_MAU_100X;
2731		} else if ((mask & MII_ABILITY_100BASE_T4) != 0) {
2732			vrp->chip.link.speed = VR_LINK_SPEED_100MBS;
2733			vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF;
2734			vrp->chip.link.mau = VR_MAU_100T4;
2735		} else if ((mask & MII_ABILITY_100BASE_TX) != 0) {
2736			vrp->chip.link.speed = VR_LINK_SPEED_100MBS;
2737			vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF;
2738			vrp->chip.link.mau = VR_MAU_100X;
2739		} else if ((mask & MII_ABILITY_10BASE_T_FD) != 0) {
2740			vrp->chip.link.speed = VR_LINK_SPEED_10MBS;
2741			vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL;
2742			vrp->chip.link.mau = VR_MAU_10;
2743		} else if ((mask & MII_ABILITY_10BASE_T) != 0) {
2744			vrp->chip.link.speed = VR_LINK_SPEED_10MBS;
2745			vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF;
2746			vrp->chip.link.mau = VR_MAU_10;
2747		} else {
2748			vrp->chip.link.speed = VR_LINK_SPEED_UNKNOWN;
2749			vrp->chip.link.duplex = VR_LINK_DUPLEX_UNKNOWN;
2750			vrp->chip.link.mau = VR_MAU_UNKNOWN;
2751		}
2752
2753		/*
2754		 * Did we negotiate pause?
2755		 */
2756		if ((mask & MII_AN_ADVERT_FCS) != 0 &&
2757		    vrp->chip.link.duplex == VR_LINK_DUPLEX_FULL)
2758			vrp->chip.link.flowctrl = VR_PAUSE_BIDIRECTIONAL;
2759		else
2760			vrp->chip.link.flowctrl = VR_PAUSE_NONE;
2761
2762		/*
2763		 * Did either one detect a AN fault?
2764		 */
2765		if ((vrp->chip.mii.status & MII_STATUS_REMFAULT) != 0)
2766			vr_log(vrp, CE_WARN,
2767			    "AN remote fault reported by LP.");
2768
2769		if ((vrp->chip.mii.lpable & MII_AN_ADVERT_REMFAULT) != 0)
2770			vr_log(vrp, CE_WARN, "AN remote fault caused for LP.");
2771	} else {
2772		/*
2773		 * We didn't autoneg
2774		 * The link type is defined by the control register.
2775		 */
2776		if ((vrp->chip.mii.control & MII_CONTROL_100MB) != 0) {
2777			vrp->chip.link.speed = VR_LINK_SPEED_100MBS;
2778			vrp->chip.link.mau = VR_MAU_100X;
2779		} else {
2780			vrp->chip.link.speed = VR_LINK_SPEED_10MBS;
2781			vrp->chip.link.mau = VR_MAU_10;
2782		}
2783
2784		if ((vrp->chip.mii.control & MII_CONTROL_FDUPLEX) != 0)
2785			vrp->chip.link.duplex = VR_LINK_DUPLEX_FULL;
2786		else {
2787			vrp->chip.link.duplex = VR_LINK_DUPLEX_HALF;
2788			/*
2789			 * No pause on HDX links.
2790			 */
2791			vrp->chip.link.flowctrl = VR_PAUSE_NONE;
2792		}
2793	}
2794
2795	/*
2796	 * Set the duplex mode on the MAC according to that of the PHY.
2797	 */
2798	if (vrp->chip.link.duplex == VR_LINK_DUPLEX_FULL) {
2799		VR_SETBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_MACFULLDUPLEX);
2800		/*
2801		 * Enable packet queueing on FDX links.
2802		 */
2803		if ((vrp->chip.info.bugs & VR_BUG_NO_TXQUEUEING) == 0)
2804			VR_CLRBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_QPKTDIS);
2805	} else {
2806		VR_CLRBIT8(vrp->acc_reg, VR_CTRL1, VR_CTRL1_MACFULLDUPLEX);
2807		/*
2808		 * Disable packet queueing on HDX links. With queueing enabled,
2809		 * this MAC get's lost after a TX abort (too many colisions).
2810		 */
2811		VR_SETBIT8(vrp->acc_reg, VR_CFGB, VR_CFGB_QPKTDIS);
2812	}
2813
2814	/*
2815	 * Set pause options on the MAC.
2816	 */
2817	if (vrp->chip.link.flowctrl == VR_PAUSE_BIDIRECTIONAL) {
2818		/*
2819		 * All of our MAC's can receive pause frames.
2820		 */
2821		VR_SETBIT8(vrp->acc_reg, VR_MISC0, VR_MISC0_FDXRFEN);
2822
2823		/*
2824		 * VT6105 and above can transmit pause frames.
2825		 */
2826		if ((vrp->chip.info.features & VR_FEATURE_TX_PAUSE_CAP) != 0) {
2827			/*
2828			 * Set the number of available receive descriptors
2829			 * Non-zero values written to this register are added
2830			 * to the register's contents. Careful: Writing zero
2831			 * clears the register and thus causes a (long) pause
2832			 * request.
2833			 */
2834			VR_PUT8(vrp->acc_reg, VR_FCR0_RXBUFCOUNT,
2835			    MIN(vrp->rx.ndesc, 0xFF) -
2836			    VR_GET8(vrp->acc_reg,
2837			    VR_FCR0_RXBUFCOUNT));
2838
2839			/*
2840			 * Request pause when we have 4 descs left.
2841			 */
2842			VR_SETBITS8(vrp->acc_reg, VR_FCR1,
2843			    VR_FCR1_PAUSEONBITS, VR_FCR1_PAUSEON_04);
2844
2845			/*
2846			 * Cancel the pause when there are 24 descriptors again.
2847			 */
2848			VR_SETBITS8(vrp->acc_reg, VR_FCR1,
2849			    VR_FCR1_PAUSEOFFBITS, VR_FCR1_PAUSEOFF_24);
2850
2851			/*
2852			 * Request a pause of FFFF bit-times. This long pause
2853			 * is cancelled when the high watermark is reached.
2854			 */
2855			VR_PUT16(vrp->acc_reg, VR_FCR2_PAUSE, 0xFFFF);
2856
2857			/*
2858			 * Enable flow control on the MAC.
2859			 */
2860			VR_SETBIT8(vrp->acc_reg, VR_MISC0, VR_MISC0_FDXTFEN);
2861			VR_SETBIT8(vrp->acc_reg, VR_FCR1, VR_FCR1_FD_RX_EN |
2862			    VR_FCR1_FD_TX_EN | VR_FCR1_XONXOFF_EN);
2863		}
2864	} else {
2865		/*
2866		 * Turn flow control OFF.
2867		 */
2868		VR_CLRBIT8(vrp->acc_reg,
2869		    VR_MISC0, VR_MISC0_FDXRFEN | VR_MISC0_FDXTFEN);
2870		if ((vrp->chip.info.features & VR_FEATURE_TX_PAUSE_CAP) != 0) {
2871			VR_CLRBIT8(vrp->acc_reg, VR_FCR1,
2872			    VR_FCR1_FD_RX_EN | VR_FCR1_FD_TX_EN |
2873			    VR_FCR1_XONXOFF_EN);
2874		}
2875	}
2876
2877	/*
2878	 * Set link state.
2879	 */
2880	if ((vrp->chip.mii.status & MII_STATUS_LINKUP) != 0)
2881		vrp->chip.link.state = VR_LINK_STATE_UP;
2882	else
2883		vrp->chip.link.state = VR_LINK_STATE_DOWN;
2884}
2885
2886/*
2887 * The PHY is automatically polled by the MAC once per 1024 MD clock cycles
2888 * MD is clocked once per 960ns so polling happens about every 1M ns, some
2889 * 1000 times per second
2890 * This polling process is required for the functionality of the link change
2891 * interrupt. Polling process must be disabled in order to access PHY registers
2892 * using MDIO
2893 *
2894 * Turn off PHY polling so that the PHY registers can be accessed.
2895 */
2896static void
2897vr_phy_autopoll_disable(vr_t *vrp)
2898{
2899	uint32_t	time;
2900	uint8_t		miicmd, miiaddr;
2901
2902	/*
2903	 * Special procedure to stop the autopolling.
2904	 */
2905	if ((vrp->chip.info.bugs & VR_BUG_MIIPOLLSTOP) != 0) {
2906		/*
2907		 * If polling is enabled.
2908		 */
2909		miicmd = VR_GET8(vrp->acc_reg, VR_MIICMD);
2910		if ((miicmd & VR_MIICMD_MD_AUTO) != 0) {
2911			/*
2912			 * Wait for the end of a cycle (mdone set).
2913			 */
2914			time = 0;
2915			do {
2916				drv_usecwait(10);
2917				if (time >= VR_MMI_WAITMAX) {
2918					vr_log(vrp, CE_WARN,
2919					    "Timeout in "
2920					    "disable MII polling");
2921					break;
2922				}
2923				time += VR_MMI_WAITINCR;
2924				miiaddr = VR_GET8(vrp->acc_reg, VR_MIIADDR);
2925			} while ((miiaddr & VR_MIIADDR_MDONE) == 0);
2926		}
2927		/*
2928		 * Once paused, we can disable autopolling.
2929		 */
2930		VR_PUT8(vrp->acc_reg, VR_MIICMD, 0);
2931	} else {
2932		/*
2933		 * Turn off MII polling.
2934		 */
2935		VR_PUT8(vrp->acc_reg, VR_MIICMD, 0);
2936
2937		/*
2938		 * Wait for MIDLE in MII address register.
2939		 */
2940		time = 0;
2941		do {
2942			drv_usecwait(VR_MMI_WAITINCR);
2943			if (time >= VR_MMI_WAITMAX) {
2944				vr_log(vrp, CE_WARN,
2945				    "Timeout in disable MII polling");
2946				break;
2947			}
2948			time += VR_MMI_WAITINCR;
2949			miiaddr = VR_GET8(vrp->acc_reg, VR_MIIADDR);
2950		} while ((miiaddr & VR_MIIADDR_MIDLE) == 0);
2951	}
2952}
2953
2954/*
2955 * Turn on PHY polling. PHY's registers cannot be accessed.
2956 */
2957static void
2958vr_phy_autopoll_enable(vr_t *vrp)
2959{
2960	uint32_t	time;
2961
2962	VR_PUT8(vrp->acc_reg, VR_MIICMD, 0);
2963	VR_PUT8(vrp->acc_reg, VR_MIIADDR, MII_STATUS|VR_MIIADDR_MAUTO);
2964	VR_PUT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_AUTO);
2965
2966	/*
2967	 * Wait for the polling process to finish.
2968	 */
2969	time = 0;
2970	do {
2971		drv_usecwait(VR_MMI_WAITINCR);
2972		if (time >= VR_MMI_WAITMAX) {
2973			vr_log(vrp, CE_NOTE, "Timeout in enable MII polling");
2974			break;
2975		}
2976		time += VR_MMI_WAITINCR;
2977	} while ((VR_GET8(vrp->acc_reg, VR_MIIADDR) & VR_MIIADDR_MDONE) == 0);
2978
2979	/*
2980	 * Initiate a polling.
2981	 */
2982	VR_SETBIT8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_MAUTO);
2983}
2984
2985/*
2986 * Read a register from the PHY using MDIO.
2987 */
2988static void
2989vr_phy_read(vr_t *vrp, int offset, uint16_t *value)
2990{
2991	uint32_t	time;
2992
2993	vr_phy_autopoll_disable(vrp);
2994
2995	/*
2996	 * Write the register number to the lower 5 bits of the MII address
2997	 * register.
2998	 */
2999	VR_SETBITS8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_BITS, offset);
3000
3001	/*
3002	 * Write a READ command to the MII control register
3003	 * This bit will be cleared when the read is finished.
3004	 */
3005	VR_SETBIT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_READ);
3006
3007	/*
3008	 * Wait until the read is done.
3009	 */
3010	time = 0;
3011	do {
3012		drv_usecwait(VR_MMI_WAITINCR);
3013		if (time >= VR_MMI_WAITMAX) {
3014			vr_log(vrp, CE_NOTE, "Timeout in MII read command");
3015			break;
3016		}
3017		time += VR_MMI_WAITINCR;
3018	} while ((VR_GET8(vrp->acc_reg, VR_MIICMD) & VR_MIICMD_MD_READ) != 0);
3019
3020	*value = VR_GET16(vrp->acc_reg, VR_MIIDATA);
3021	vr_phy_autopoll_enable(vrp);
3022}
3023
3024/*
3025 * Write to a PHY's register.
3026 */
3027static void
3028vr_phy_write(vr_t *vrp, int offset, uint16_t value)
3029{
3030	uint32_t	time;
3031
3032	vr_phy_autopoll_disable(vrp);
3033
3034	/*
3035	 * Write the register number to the MII address register.
3036	 */
3037	VR_SETBITS8(vrp->acc_reg, VR_MIIADDR, VR_MIIADDR_BITS, offset);
3038
3039	/*
3040	 * Write the value to the data register.
3041	 */
3042	VR_PUT16(vrp->acc_reg, VR_MIIDATA, value);
3043
3044	/*
3045	 * Issue the WRITE command to the command register.
3046	 * This bit will be cleared when the write is finished.
3047	 */
3048	VR_SETBIT8(vrp->acc_reg, VR_MIICMD, VR_MIICMD_MD_WRITE);
3049
3050	time = 0;
3051	do {
3052		drv_usecwait(VR_MMI_WAITINCR);
3053		if (time >= VR_MMI_WAITMAX) {
3054			vr_log(vrp, CE_NOTE, "Timeout in MII write command");
3055			break;
3056		}
3057		time += VR_MMI_WAITINCR;
3058	} while ((VR_GET8(vrp->acc_reg, VR_MIICMD) & VR_MIICMD_MD_WRITE) != 0);
3059	vr_phy_autopoll_enable(vrp);
3060}
3061
3062/*
3063 * Initialize and install some private kstats.
3064 */
3065typedef struct {
3066	char		*name;
3067	uchar_t		type;
3068} vr_kstat_t;
3069
3070static const vr_kstat_t vr_driver_stats [] = {
3071	{"allocbfail",		KSTAT_DATA_INT32},
3072	{"intr_claimed",	KSTAT_DATA_INT64},
3073	{"intr_unclaimed",	KSTAT_DATA_INT64},
3074	{"linkchanges",		KSTAT_DATA_INT64},
3075	{"txnfree",		KSTAT_DATA_INT32},
3076	{"txstalls",		KSTAT_DATA_INT32},
3077	{"resets",		KSTAT_DATA_INT32},
3078	{"txreclaims",		KSTAT_DATA_INT64},
3079	{"txreclaim0",		KSTAT_DATA_INT64},
3080	{"cyclics",		KSTAT_DATA_INT64},
3081	{"txchecks",		KSTAT_DATA_INT64},
3082};
3083
3084static void
3085vr_kstats_init(vr_t *vrp)
3086{
3087	kstat_t			*ksp;
3088	struct	kstat_named	*knp;
3089	int			i;
3090	int			nstats;
3091
3092	nstats = sizeof (vr_driver_stats) / sizeof (vr_kstat_t);
3093
3094	ksp = kstat_create(MODULENAME, ddi_get_instance(vrp->devinfo),
3095	    "driver", "net", KSTAT_TYPE_NAMED, nstats, 0);
3096
3097	if (ksp == NULL)
3098		vr_log(vrp, CE_WARN, "kstat_create failed");
3099
3100	ksp->ks_update = vr_update_kstats;
3101	ksp->ks_private = (void*) vrp;
3102	knp = ksp->ks_data;
3103
3104	for (i = 0; i < nstats; i++, knp++) {
3105		kstat_named_init(knp, vr_driver_stats[i].name,
3106		    vr_driver_stats[i].type);
3107	}
3108	kstat_install(ksp);
3109	vrp->ksp = ksp;
3110}
3111
3112static int
3113vr_update_kstats(kstat_t *ksp, int access)
3114{
3115	vr_t			*vrp;
3116	struct kstat_named	*knp;
3117
3118	vrp = (vr_t *)ksp->ks_private;
3119	knp = ksp->ks_data;
3120
3121	if (access != KSTAT_READ)
3122		return (EACCES);
3123
3124	(knp++)->value.ui32 = vrp->stats.allocbfail;
3125	(knp++)->value.ui64 = vrp->stats.intr_claimed;
3126	(knp++)->value.ui64 = vrp->stats.intr_unclaimed;
3127	(knp++)->value.ui64 = vrp->stats.linkchanges;
3128	(knp++)->value.ui32 = vrp->tx.nfree;
3129	(knp++)->value.ui32 = vrp->stats.txstalls;
3130	(knp++)->value.ui32 = vrp->stats.resets;
3131	(knp++)->value.ui64 = vrp->stats.txreclaims;
3132	(knp++)->value.ui64 = vrp->stats.txreclaim0;
3133	(knp++)->value.ui64 = vrp->stats.cyclics;
3134	(knp++)->value.ui64 = vrp->stats.txchecks;
3135	return (0);
3136}
3137
3138/*
3139 * Remove 'private' kstats.
3140 */
3141static void
3142vr_remove_kstats(vr_t *vrp)
3143{
3144	if (vrp->ksp != NULL)
3145		kstat_delete(vrp->ksp);
3146}
3147
3148/*
3149 * Get a property of the device/driver
3150 * Remarks:
3151 * - pr_val is always an integer of size pr_valsize
3152 * - ENABLED (EN) is what is configured via dladm
3153 * - ADVERTISED (ADV) is ENABLED minus constraints, like PHY/MAC capabilities
3154 * - DEFAULT are driver- and hardware defaults (DEFAULT is implemented as a
3155 *   flag in pr_flags instead of MAC_PROP_DEFAULT_)
3156 * - perm is the permission printed on ndd -get /.. \?
3157 */
3158int
3159vr_mac_getprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
3160    uint_t pr_flags, uint_t pr_valsize, void *pr_val, uint_t *perm)
3161{
3162	vr_t		*vrp;
3163	uint32_t	err;
3164	uint64_t	val;
3165
3166	/* Since we have no private properties */
3167	_NOTE(ARGUNUSED(pr_name))
3168
3169	err = 0;
3170	vrp = (vr_t *)arg;
3171	if ((pr_flags & MAC_PROP_DEFAULT) != 0) {
3172		/*
3173		 * Defaults depend on the PHY/MAC's capabilities
3174		 * All defaults are read/write, otherwise reset-linkprop fails
3175		 * with enotsup ....
3176		 */
3177		*perm = MAC_PROP_PERM_RW;
3178		switch (pr_num) {
3179			case MAC_PROP_ADV_1000FDX_CAP:
3180			case MAC_PROP_EN_1000FDX_CAP:
3181			case MAC_PROP_ADV_1000HDX_CAP:
3182			case MAC_PROP_EN_1000HDX_CAP:
3183				val = 0;
3184				break;
3185
3186			case MAC_PROP_ADV_100FDX_CAP:
3187			case MAC_PROP_EN_100FDX_CAP:
3188				val = (vrp->chip.mii.status &
3189				    MII_STATUS_100_BASEX_FD) != 0;
3190				break;
3191
3192			case MAC_PROP_ADV_100HDX_CAP:
3193			case MAC_PROP_EN_100HDX_CAP:
3194				val = (vrp->chip.mii.status &
3195				    MII_STATUS_100_BASEX) != 0;
3196				break;
3197
3198			case MAC_PROP_ADV_100T4_CAP:
3199			case MAC_PROP_EN_100T4_CAP:
3200				val = (vrp->chip.mii.status &
3201				    MII_STATUS_100_BASE_T4) != 0;
3202				break;
3203
3204			case MAC_PROP_ADV_10FDX_CAP:
3205			case MAC_PROP_EN_10FDX_CAP:
3206				val = (vrp->chip.mii.status &
3207				    MII_STATUS_10_FD) != 0;
3208				break;
3209
3210			case MAC_PROP_ADV_10HDX_CAP:
3211			case MAC_PROP_EN_10HDX_CAP:
3212				val = (vrp->chip.mii.status &
3213				    MII_STATUS_10) != 0;
3214				break;
3215
3216			case MAC_PROP_AUTONEG:
3217			case MAC_PROP_EN_AUTONEG:
3218				val = (vrp->chip.mii.status &
3219				    MII_STATUS_CANAUTONEG) != 0;
3220				break;
3221
3222			case MAC_PROP_DUPLEX:
3223				val = VR_LINK_DUPLEX_FULL;
3224				break;
3225
3226			case MAC_PROP_FLOWCTRL:
3227				val = VR_PAUSE_BIDIRECTIONAL;
3228				break;
3229
3230			case MAC_PROP_MTU:
3231				val = ETHERMTU;
3232				break;
3233
3234			case MAC_PROP_SPEED:
3235				val = 100 * 1000 * 1000;
3236				break;
3237
3238			case MAC_PROP_STATUS:
3239				val = VR_LINK_STATE_UP;
3240				break;
3241
3242			default:
3243				return (ENOTSUP);
3244		}
3245	} else {
3246		switch (pr_num) {
3247			case MAC_PROP_ADV_1000FDX_CAP:
3248			case MAC_PROP_ADV_1000HDX_CAP:
3249				val = 0;
3250				*perm = MAC_PROP_PERM_READ;
3251				break;
3252
3253			case MAC_PROP_EN_1000FDX_CAP:
3254			case MAC_PROP_EN_1000HDX_CAP:
3255				*perm = MAC_PROP_PERM_READ;
3256				val = 0;
3257				break;
3258
3259			case MAC_PROP_ADV_100FDX_CAP:
3260				*perm = MAC_PROP_PERM_READ;
3261				val = (vrp->chip.mii.anadv &
3262				    MII_ABILITY_100BASE_TX_FD) != 0;
3263				break;
3264
3265			case MAC_PROP_ADV_100HDX_CAP:
3266				*perm = MAC_PROP_PERM_READ;
3267				val = (vrp->chip.mii.anadv &
3268				    MII_ABILITY_100BASE_TX) != 0;
3269				break;
3270
3271			case MAC_PROP_ADV_100T4_CAP:
3272				*perm = MAC_PROP_PERM_READ;
3273				val = (vrp->chip.mii.anadv &
3274				    MII_ABILITY_100BASE_T4) != 0;
3275				break;
3276
3277			case MAC_PROP_ADV_10FDX_CAP:
3278				*perm = MAC_PROP_PERM_READ;
3279				val = (vrp->chip.mii.anadv &
3280				    MII_ABILITY_10BASE_T_FD) != 0;
3281				break;
3282
3283			case MAC_PROP_ADV_10HDX_CAP:
3284				*perm = MAC_PROP_PERM_READ;
3285				val = (vrp->chip.mii.anadv &
3286				    MII_ABILITY_10BASE_T) != 0;
3287				break;
3288
3289			case MAC_PROP_AUTONEG:
3290				*perm = MAC_PROP_PERM_RW;
3291				val = (vrp->chip.mii.control &
3292				    MII_CONTROL_ANE) != 0;
3293				break;
3294
3295			case MAC_PROP_DUPLEX:
3296				/*
3297				 * Writability depends on autoneg.
3298				 */
3299				if ((vrp->chip.mii.control &
3300				    MII_CONTROL_ANE) == 0)
3301					*perm = MAC_PROP_PERM_RW;
3302				else
3303					*perm = MAC_PROP_PERM_READ;
3304				val = vrp->chip.link.duplex;
3305				break;
3306
3307			case MAC_PROP_EN_100FDX_CAP:
3308				*perm = MAC_PROP_PERM_RW;
3309				val = (vrp->param.anadv_en &
3310				    MII_ABILITY_100BASE_TX_FD) != 0;
3311				break;
3312
3313			case MAC_PROP_EN_100HDX_CAP:
3314				*perm = MAC_PROP_PERM_RW;
3315				val = (vrp->param.anadv_en &
3316				    MII_ABILITY_100BASE_TX) != 0;
3317				break;
3318
3319			case MAC_PROP_EN_100T4_CAP:
3320				*perm = MAC_PROP_PERM_READ;
3321				val = (vrp->param.anadv_en &
3322				    MII_ABILITY_100BASE_T4) != 0;
3323				break;
3324
3325			case MAC_PROP_EN_10FDX_CAP:
3326				*perm = MAC_PROP_PERM_RW;
3327				val = (vrp->param.anadv_en &
3328				    MII_ABILITY_10BASE_T_FD) != 0;
3329				break;
3330
3331			case MAC_PROP_EN_10HDX_CAP:
3332				*perm = MAC_PROP_PERM_RW;
3333				val = (vrp->param.anadv_en &
3334				    MII_ABILITY_10BASE_T) != 0;
3335				break;
3336
3337			case MAC_PROP_EN_AUTONEG:
3338				*perm = MAC_PROP_PERM_RW;
3339				val = vrp->param.an_en == VR_LINK_AUTONEG_ON;
3340				break;
3341
3342			case MAC_PROP_FLOWCTRL:
3343				*perm = MAC_PROP_PERM_RW;
3344				val = vrp->chip.link.flowctrl;
3345				break;
3346
3347			case MAC_PROP_MTU:
3348				*perm = MAC_PROP_PERM_RW;
3349				val = vrp->param.mtu;
3350				break;
3351
3352			case MAC_PROP_SPEED:
3353				/*
3354				 * Writability depends on autoneg.
3355				 */
3356				if ((vrp->chip.mii.control &
3357				    MII_CONTROL_ANE) == 0)
3358					*perm = MAC_PROP_PERM_RW;
3359				else
3360					*perm = MAC_PROP_PERM_READ;
3361				if (vrp->chip.link.speed ==
3362				    VR_LINK_SPEED_100MBS)
3363					val = 100 * 1000 * 1000;
3364				else if (vrp->chip.link.speed ==
3365				    VR_LINK_SPEED_10MBS)
3366					val = 10 * 1000 * 1000;
3367				else
3368					val = 0;
3369				break;
3370
3371			case MAC_PROP_STATUS:
3372				val = vrp->chip.link.state;
3373				break;
3374
3375			default:
3376				err = ENOTSUP;
3377				break;
3378		}
3379	}
3380	if (err == 0 && pr_num != MAC_PROP_PRIVATE) {
3381		if (pr_valsize == sizeof (uint64_t))
3382			*(uint64_t *)pr_val = val;
3383		else if (pr_valsize == sizeof (uint32_t))
3384			*(uint32_t *)pr_val = val;
3385		else if (pr_valsize == sizeof (uint16_t))
3386			*(uint16_t *)pr_val = val;
3387		else if (pr_valsize == sizeof (uint8_t))
3388			*(uint8_t *)pr_val = val;
3389		else
3390			err = EINVAL;
3391	}
3392	return (err);
3393}
3394
3395/*
3396 * Set a property of the device.
3397 */
3398int
3399vr_mac_setprop(void *arg, const char *pr_name, mac_prop_id_t pr_num,
3400	uint_t pr_valsize, const void *pr_val)
3401{
3402	vr_t		*vrp;
3403	uint32_t	err;
3404	uint64_t	val;
3405
3406	/* Since we have no private properties */
3407	_NOTE(ARGUNUSED(pr_name))
3408
3409	err = 0;
3410	vrp = (vr_t *)arg;
3411	mutex_enter(&vrp->oplock);
3412
3413	/*
3414	 * The current set of public property values are passed as integers
3415	 * Private properties are passed as strings in pr_val length pr_valsize.
3416	 */
3417	if (pr_num != MAC_PROP_PRIVATE) {
3418		if (pr_valsize == sizeof (uint64_t))
3419			val = *(uint64_t *)pr_val;
3420		else if (pr_valsize == sizeof (uint32_t))
3421			val = *(uint32_t *)pr_val;
3422		else if (pr_valsize == sizeof (uint16_t))
3423			val = *(uint32_t *)pr_val;
3424		else if (pr_valsize == sizeof (uint8_t))
3425			val = *(uint8_t *)pr_val;
3426		else {
3427			mutex_exit(&vrp->oplock);
3428			return (EINVAL);
3429		}
3430	}
3431
3432	switch (pr_num) {
3433		case MAC_PROP_DUPLEX:
3434			if ((vrp->chip.mii.control & MII_CONTROL_ANE) == 0) {
3435				if (val == LINK_DUPLEX_FULL)
3436					vrp->chip.mii.control |=
3437					    MII_CONTROL_FDUPLEX;
3438				else if (val == LINK_DUPLEX_HALF)
3439					vrp->chip.mii.control &=
3440					    ~MII_CONTROL_FDUPLEX;
3441				else
3442					err = EINVAL;
3443			} else
3444				err = EINVAL;
3445			break;
3446
3447		case MAC_PROP_EN_100FDX_CAP:
3448			if (val == 0)
3449				vrp->param.anadv_en &=
3450				    ~MII_ABILITY_100BASE_TX_FD;
3451			else
3452				vrp->param.anadv_en |=
3453				    MII_ABILITY_100BASE_TX_FD;
3454			break;
3455
3456		case MAC_PROP_EN_100HDX_CAP:
3457			if (val == 0)
3458				vrp->param.anadv_en &=
3459				    ~MII_ABILITY_100BASE_TX;
3460			else
3461				vrp->param.anadv_en |=
3462				    MII_ABILITY_100BASE_TX;
3463			break;
3464
3465		case MAC_PROP_EN_100T4_CAP:
3466			if (val == 0)
3467				vrp->param.anadv_en &=
3468				    ~MII_ABILITY_100BASE_T4;
3469			else
3470				vrp->param.anadv_en |=
3471				    MII_ABILITY_100BASE_T4;
3472			break;
3473
3474		case MAC_PROP_EN_10FDX_CAP:
3475			if (val == 0)
3476				vrp->param.anadv_en &=
3477				    ~MII_ABILITY_10BASE_T_FD;
3478			else
3479				vrp->param.anadv_en |=
3480				    MII_ABILITY_10BASE_T_FD;
3481			break;
3482
3483		case MAC_PROP_EN_10HDX_CAP:
3484			if (val == 0)
3485				vrp->param.anadv_en &=
3486				    ~MII_ABILITY_10BASE_T;
3487			else
3488				vrp->param.anadv_en |=
3489				    MII_ABILITY_10BASE_T;
3490			break;
3491
3492		case MAC_PROP_AUTONEG:
3493		case MAC_PROP_EN_AUTONEG:
3494			if (val == 0) {
3495				vrp->param.an_en = VR_LINK_AUTONEG_OFF;
3496				vrp->chip.mii.control &= ~MII_CONTROL_ANE;
3497			} else {
3498				vrp->param.an_en = VR_LINK_AUTONEG_ON;
3499				if ((vrp->chip.mii.status &
3500				    MII_STATUS_CANAUTONEG) != 0)
3501					vrp->chip.mii.control |=
3502					    MII_CONTROL_ANE;
3503				else
3504					err = EINVAL;
3505			}
3506			break;
3507
3508		case MAC_PROP_FLOWCTRL:
3509			if (val == LINK_FLOWCTRL_NONE)
3510				vrp->param.anadv_en &= ~MII_AN_ADVERT_FCS;
3511			else if (val == LINK_FLOWCTRL_BI)
3512				vrp->param.anadv_en |= MII_AN_ADVERT_FCS;
3513			else
3514				err = EINVAL;
3515			break;
3516
3517		case MAC_PROP_MTU:
3518			if (val >= ETHERMIN && val <= ETHERMTU)
3519				vrp->param.mtu = (uint32_t)val;
3520			else
3521				err = EINVAL;
3522			break;
3523
3524		case MAC_PROP_SPEED:
3525			if (val == 10 * 1000 * 1000)
3526				vrp->chip.link.speed =
3527				    VR_LINK_SPEED_10MBS;
3528			else if (val == 100 * 1000 * 1000)
3529				vrp->chip.link.speed =
3530				    VR_LINK_SPEED_100MBS;
3531			else
3532				err = EINVAL;
3533			break;
3534
3535		default:
3536			err = ENOTSUP;
3537			break;
3538	}
3539	if (err == 0 && pr_num != MAC_PROP_PRIVATE) {
3540		vrp->chip.mii.anadv = vrp->param.anadv_en &
3541		    (vrp->param.an_phymask & vrp->param.an_macmask);
3542		vr_link_init(vrp);
3543	}
3544	mutex_exit(&vrp->oplock);
3545	return (err);
3546}
3547
3548
3549/*
3550 * Logging and debug functions.
3551 */
3552static struct {
3553	kmutex_t mutex[1];
3554	const char *ifname;
3555	const char *fmt;
3556	int level;
3557} prtdata;
3558
3559static void
3560vr_vprt(const char *fmt, va_list args)
3561{
3562	char buf[512];
3563
3564	ASSERT(mutex_owned(prtdata.mutex));
3565	(void) vsnprintf(buf, sizeof (buf), fmt, args);
3566	cmn_err(prtdata.level, prtdata.fmt, prtdata.ifname, buf);
3567}
3568
3569static void
3570vr_log(vr_t *vrp, int level, const char *fmt, ...)
3571{
3572	va_list args;
3573
3574	mutex_enter(prtdata.mutex);
3575	prtdata.ifname = vrp->ifname;
3576	prtdata.fmt = "!%s: %s";
3577	prtdata.level = level;
3578
3579	va_start(args, fmt);
3580	vr_vprt(fmt, args);
3581	va_end(args);
3582
3583	mutex_exit(prtdata.mutex);
3584}
3585
3586#if defined(DEBUG)
3587static void
3588vr_prt(const char *fmt, ...)
3589{
3590	va_list args;
3591
3592	ASSERT(mutex_owned(prtdata.mutex));
3593
3594	va_start(args, fmt);
3595	vr_vprt(fmt, args);
3596	va_end(args);
3597
3598	mutex_exit(prtdata.mutex);
3599}
3600
3601void
3602(*vr_debug())(const char *fmt, ...)
3603{
3604	mutex_enter(prtdata.mutex);
3605	prtdata.ifname = MODULENAME;
3606	prtdata.fmt = "^%s: %s\n";
3607	prtdata.level = CE_CONT;
3608
3609	return (vr_prt);
3610}
3611#endif	/* DEBUG */
3612
3613DDI_DEFINE_STREAM_OPS(vr_dev_ops, nulldev, nulldev, vr_attach, vr_detach,
3614nodev, NULL, D_MP, NULL, vr_quiesce);
3615
3616static struct modldrv vr_modldrv = {
3617	&mod_driverops,		/* Type of module. This one is a driver */
3618	vr_ident,		/* short description */
3619	&vr_dev_ops		/* driver specific ops */
3620};
3621
3622static struct modlinkage modlinkage = {
3623	MODREV_1, (void *)&vr_modldrv, NULL
3624};
3625
3626int
3627_info(struct modinfo *modinfop)
3628{
3629	return (mod_info(&modlinkage, modinfop));
3630}
3631
3632int
3633_init(void)
3634{
3635	int	status;
3636
3637	mac_init_ops(&vr_dev_ops, MODULENAME);
3638	status = mod_install(&modlinkage);
3639	if (status == DDI_SUCCESS)
3640		mutex_init(prtdata.mutex, NULL, MUTEX_DRIVER, NULL);
3641	else
3642		mac_fini_ops(&vr_dev_ops);
3643	return (status);
3644}
3645
3646int
3647_fini(void)
3648{
3649	int status;
3650
3651	status = mod_remove(&modlinkage);
3652	if (status == 0) {
3653		mac_fini_ops(&vr_dev_ops);
3654		mutex_destroy(prtdata.mutex);
3655	}
3656	return (status);
3657}
3658