xref: /illumos-gate/usr/src/uts/common/io/chxge/ch.c (revision 3893cb7fe5bfa1c9a4f7954517a917367f6cf081)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * This file is part of the Chelsio T1 Ethernet driver.
29  *
30  * Copyright (C) 2003-2005 Chelsio Communications.  All rights reserved.
31  */
32 
33 /*
34  * Solaris Multithreaded STREAMS DLPI Chelsio PCI Ethernet Driver
35  */
36 
37 #pragma ident	"%Z%%M%	%I%	%E% SMI"
38 
39 /* #define CH_DEBUG 1 */
40 #ifdef CH_DEBUG
41 #define	DEBUG_ENTER(a) debug_enter(a)
42 #define	PRINT(a) printf a
43 #else
44 #define	DEBUG_ENTER(a)
45 #define	PRINT(a)
46 #endif
47 
48 #include <sys/types.h>
49 #include <sys/conf.h>
50 #include <sys/debug.h>
51 #include <sys/stropts.h>
52 #include <sys/stream.h>
53 #include <sys/strlog.h>
54 #include <sys/kmem.h>
55 #include <sys/stat.h>
56 #include <sys/kstat.h>
57 #include <sys/modctl.h>
58 #include <sys/errno.h>
59 #include <sys/cmn_err.h>
60 #include <sys/ddi.h>
61 #include <sys/sunddi.h>
62 #include <sys/dlpi.h>
63 #include <sys/ethernet.h>
64 #include <sys/strsun.h>
65 #include <sys/strsubr.h>
66 #include <inet/common.h>
67 #include <inet/nd.h>
68 #include <inet/ip.h>
69 #include <inet/tcp.h>
70 #include <sys/pattr.h>
71 #include <sys/gld.h>
72 #include "ostypes.h"
73 #include "common.h"
74 #include "oschtoe.h"
75 #include "sge.h"
76 #include "ch.h"			/* Chelsio Driver specific parameters */
77 #include "version.h"
78 
79 /*
80  * Function prototypes.
81  */
82 static int ch_attach(dev_info_t *, ddi_attach_cmd_t);
83 static int ch_detach(dev_info_t *, ddi_detach_cmd_t);
84 static void ch_free_dma_handles(ch_t *chp);
85 static void ch_set_name(ch_t *chp, int unit);
86 static void ch_free_name(ch_t *chp);
87 static void ch_get_prop(ch_t *chp);
88 
89 #if defined(__sparc)
90 static void ch_free_dvma_handles(ch_t *chp);
91 #endif
92 
93 /* GLD interfaces */
94 static int ch_reset(gld_mac_info_t *);
95 static int ch_start(gld_mac_info_t *);
96 static int ch_stop(gld_mac_info_t *);
97 static int ch_set_mac_address(gld_mac_info_t *, uint8_t *);
98 static int ch_set_multicast(gld_mac_info_t *, uint8_t *, int);
99 static int ch_ioctl(gld_mac_info_t *, queue_t *, mblk_t *);
100 static int ch_set_promiscuous(gld_mac_info_t *, int);
101 static int ch_get_stats(gld_mac_info_t *, struct gld_stats *);
102 static int ch_send(gld_mac_info_t *, mblk_t *);
103 static uint_t ch_intr(gld_mac_info_t *);
104 
105 /*
106  * Data access requirements.
107  */
108 static struct ddi_device_acc_attr le_attr = {
109 	DDI_DEVICE_ATTR_V0,
110 	DDI_STRUCTURE_LE_ACC,
111 	DDI_STRICTORDER_ACC
112 };
113 
114 /*
115  * No swap mapping device attributes
116  */
117 static struct ddi_device_acc_attr null_attr = {
118 	DDI_DEVICE_ATTR_V0,
119 	DDI_NEVERSWAP_ACC,
120 	DDI_STRICTORDER_ACC
121 };
122 
123 /*
124  * STREAMS driver identification struture module_info(9s)
125  *
126  * driver limit values
127  */
128 
129 static	struct module_info ch_minfo = {
130 	CHIDNUM,	/* mi_idnum */
131 	CHNAME,		/* mi_idname */
132 	CHMINPSZ,	/* mi_minpsz */
133 	CHMAXPSZ,	/* mi_maxpsz */
134 	CHHIWAT,	/* mi_hiwat */
135 	CHLOWAT		/* mi_lowat */
136 };
137 
138 /*
139  * STREAMS queue processiong procedures qinit(9s)
140  *
141  * read queue procedures
142  */
143 
144 static struct qinit ch_rinit = {
145 	(int (*)()) NULL, 	/* qi_putp */
146 	gld_rsrv,		/* qi_srvp */
147 	gld_open,		/* qi_qopen */
148 	gld_close,		/* qi_qclose */
149 	(int (*)()) NULL, 	/* qi_qadmin */
150 	&ch_minfo,		/* qi_minfo */
151 	NULL			/* qi_mstat */
152 };
153 
154 /*
155  * STREAMS queue processiong procedures qinit(9s)
156  *
157  * write queue procedures
158  */
159 
160 static struct qinit ch_winit = {
161 	gld_wput,		/* qi_putp */
162 	gld_wsrv,		/* qi_srvp */
163 	(int (*)()) NULL, 	/* qi_qopen */
164 	(int (*)()) NULL, 	/* qi_qclose */
165 	(int (*)()) NULL, 	/* qi_qadmin */
166 	&ch_minfo,		/* qi_minfo */
167 	NULL			/* qi_mstat */
168 };
169 
170 /*
171  * STREAMS entity declaration structure - streamtab(9s)
172  */
173 static struct streamtab	chinfo = {
174 	&ch_rinit,	/* read queue information */
175 	&ch_winit,	/* write queue information */
176 	NULL,		/* st_muxrinit */
177 	NULL		/* st_muxwrinit */
178 };
179 
180 /*
181  * Device driver ops vector - cb_ops(9s)
182  *
183  * charater/block entry points structure.
184  * chinfo identifies driver as a STREAMS driver.
185  */
186 
187 static struct cb_ops cb_ch_ops = {
188 	nulldev,	/* cb_open */
189 	nulldev,	/* cb_close */
190 	nodev,		/* cb_strategy */
191 	nodev,		/* cb_print */
192 	nodev,		/* cb_dump */
193 	nodev,		/* cb_read */
194 	nodev,		/* cb_write */
195 	nodev,		/* cb_ioctl */
196 	nodev,		/* cb_devmap */
197 	nodev,		/* cb_mmap */
198 	nodev,		/* cb_segmap */
199 	nochpoll,	/* cb_chpoll */
200 	ddi_prop_op,	/* report driver property information - prop_op(9e) */
201 	&chinfo,	/* cb_stream */
202 #if defined(__sparc)
203 	D_MP | D_64BIT,
204 #else
205 	D_MP,		/* cb_flag (supports multi-threading) */
206 #endif
207 	CB_REV,		/* cb_rev */
208 	nodev,		/* cb_aread */
209 	nodev		/* cb_awrite */
210 };
211 
212 /*
213  * dev_ops(9S) structure
214  *
215  * Device Operations table, for autoconfiguration
216  */
217 
218 static	struct dev_ops ch_ops = {
219 	DEVO_REV,	/* Driver build version */
220 	0,		/* Initial driver reference count */
221 	gld_getinfo,	/* funcp: get driver information - getinfo(9e) */
222 	nulldev,	/* funcp: entry point obsolute - identify(9e) */
223 	nulldev,	/* funp: probe for device - probe(9e) */
224 	ch_attach,	/* funp: attach driver to dev_info - attach(9e) */
225 	ch_detach,	/* funp: detach driver to unload - detach(9e) */
226 	nodev,		/* funp: reset device (not supported) - dev_ops(9s) */
227 	&cb_ch_ops,	/* ptr to cb_ops structure */
228 	NULL,		/* ptr to nexus bus operations structure (leaf) */
229 	NULL		/* funp: change device power level - power(9e) */
230 };
231 
232 /*
233  * modldrv(9s) structure
234  *
235  * Definition for module specific device driver linkage structures (modctl.h)
236  */
237 
238 static struct modldrv modldrv = {
239 	&mod_driverops,		/* driver module */
240 	VERSION,
241 	&ch_ops,		/* driver ops */
242 };
243 
244 /*
245  * modlinkage(9s) structure
246  *
247  * module linkage base structure (modctl.h)
248  */
249 
250 static struct modlinkage modlinkage = {
251 	MODREV_1,		/* revision # of system */
252 	&modldrv,		/* NULL terminated list of linkage strucures */
253 	NULL
254 };
255 
256 /* ===================== start of STREAMS driver code ================== */
257 
258 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
259 /*
260  * global pointer to toe per-driver control structure.
261  */
262 #define	MAX_CARDS	4
263 ch_t *gchp[MAX_CARDS];
264 #endif
265 
266 kmutex_t in_use_l;
267 uint32_t buffers_in_use[SZ_INUSE];
268 uint32_t in_use_index;
269 
270 /*
271  * Ethernet broadcast address definition.
272  */
273 static struct ether_addr etherbroadcastaddr = {
274 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff
275 };
276 
277 /*
278  * Module initialization functions.
279  *
280  *      Routine         Called by
281  *      _init(9E)       modload(9F)
282  *      _info(9E)       modinfo(9F)
283  *      _fini(9E)       modunload(9F)
284  */
285 
286 /*
287  * _init(9E):
288  *
289  * Initial, one-time, resource allocation and data initialization.
290  */
291 
292 int
293 _init(void)
294 {
295 	int status;
296 
297 	status = mod_install(&modlinkage);
298 
299 	mutex_init(&in_use_l, NULL, MUTEX_DRIVER, NULL);
300 
301 	return (status);
302 }
303 
304 /*
305  * _fini(9E): It is here that any device information that was allocated
306  * during the _init(9E) routine should be released and the module removed
307  * from the system.  In the case of per-instance information, that information
308  * should be released in the _detach(9E) routine.
309  */
310 
311 int
312 _fini(void)
313 {
314 	int status;
315 	int i;
316 	uint32_t t = 0;
317 
318 	for (i = 0; i < SZ_INUSE; i++)
319 		t += buffers_in_use[i];
320 
321 	if (t != NULL)
322 		return (DDI_FAILURE);
323 
324 	status = mod_remove(&modlinkage);
325 
326 	if (status == DDI_SUCCESS)
327 		mutex_destroy(&in_use_l);
328 
329 	return (status);
330 }
331 
332 int
333 _info(struct modinfo *modinfop)
334 {
335 	int status;
336 
337 
338 	status = mod_info(&modlinkage, modinfop);
339 
340 	return (status);
341 }
342 
343 /*
344  * Attach(9E) - This is called on the open to the device.  It creates
345  * an instance of the driver.  In this routine we create the minor
346  * device node.  The routine also initializes all per-unit
347  * mutex's and conditional variables.
348  *
349  * If we were resuming a suspended instance of a device due to power
350  * management, then that would be handled here as well.  For more on
351  * that subject see the man page for pm(9E)
352  *
353  * Interface exists: make available by filling in network interface
354  * record.  System will initialize the interface when it is ready
355  * to accept packets.
356  */
357 int chdebug = 0;
358 int ch_abort_debug = 0;
359 
360 static int
361 ch_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
362 {
363 	ch_t *chp;
364 	int rv;
365 	int unit;
366 #ifdef CH_DEBUG
367 	int Version;
368 	int VendorID;
369 	int DeviceID;
370 	int SubDeviceID;
371 	int Command;
372 #endif
373 	gld_mac_info_t *macinfo;		/* GLD stuff follows */
374 	char *driver;
375 
376 	if (ch_abort_debug)
377 		debug_enter("ch_attach");
378 
379 	if (chdebug)
380 		return (DDI_FAILURE);
381 
382 
383 	if (cmd == DDI_ATTACH) {
384 
385 		unit = ddi_get_instance(dip);
386 
387 		driver = (char *)ddi_driver_name(dip);
388 
389 		PRINT(("driver %s unit: %d\n", driver, unit));
390 
391 		macinfo = gld_mac_alloc(dip);
392 		if (macinfo == NULL) {
393 			PRINT(("macinfo allocation failed\n"));
394 			DEBUG_ENTER("ch_attach");
395 			return (DDI_FAILURE);
396 		}
397 
398 		chp = (ch_t *)kmem_zalloc(sizeof (ch_t), KM_SLEEP);
399 
400 		if (chp == NULL) {
401 			PRINT(("zalloc of chp failed\n"));
402 			DEBUG_ENTER("ch_attach");
403 
404 			gld_mac_free(macinfo);
405 
406 			return (DDI_FAILURE);
407 		}
408 
409 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
410 		/* Solaris TOE support */
411 		gchp[unit] = chp;
412 #endif
413 
414 		PRINT(("attach macinfo: %p chp: %p\n", macinfo, chp));
415 
416 		chp->ch_dip  = dip;
417 		chp->ch_macp = macinfo;
418 		chp->ch_unit = unit;
419 		ch_set_name(chp, unit);
420 
421 		/*
422 		 * map in PCI register spaces
423 		 *
424 		 * PCI register set 0 - PCI configuration space
425 		 * PCI register set 1 - T101 card register space #1
426 		 */
427 
428 		/* map in T101 PCI configuration space */
429 		rv = pci_config_setup(
430 			dip,		/* ptr to dev's dev_info struct */
431 			&chp->ch_hpci);	/* ptr to data access handle */
432 
433 		if (rv != DDI_SUCCESS) {
434 			PRINT(("PCI config setup failed\n"));
435 			DEBUG_ENTER("ch_attach");
436 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
437 			gchp[unit] = NULL;
438 #endif
439 			cmn_err(CE_WARN, "%s: ddi_config_setup PCI error %d\n",
440 				chp->ch_name, rv);
441 
442 			ch_free_name(chp);
443 			kmem_free(chp, sizeof (ch_t));
444 			gld_mac_free(macinfo);
445 
446 			return (DDI_FAILURE);
447 		}
448 
449 		ch_get_prop(chp);
450 
451 		macinfo->gldm_devinfo = dip;
452 		macinfo->gldm_private = (caddr_t)chp;
453 		macinfo->gldm_reset = ch_reset;
454 		macinfo->gldm_start = ch_start;
455 		macinfo->gldm_stop = ch_stop;
456 		macinfo->gldm_set_mac_addr = ch_set_mac_address;
457 		macinfo->gldm_send = ch_send;
458 		macinfo->gldm_set_promiscuous = ch_set_promiscuous;
459 		macinfo->gldm_get_stats = ch_get_stats;
460 		macinfo->gldm_ioctl = ch_ioctl;
461 		macinfo->gldm_set_multicast = ch_set_multicast;
462 		macinfo->gldm_intr = ch_intr;
463 		macinfo->gldm_mctl = NULL;
464 
465 		macinfo->gldm_ident = driver;
466 		macinfo->gldm_type = DL_ETHER;
467 		macinfo->gldm_minpkt = 0;
468 		macinfo->gldm_maxpkt = chp->ch_mtu;
469 		macinfo->gldm_addrlen = ETHERADDRL;
470 		macinfo->gldm_saplen = -2;
471 		macinfo->gldm_ppa = unit;
472 		macinfo->gldm_broadcast_addr =
473 				etherbroadcastaddr.ether_addr_octet;
474 
475 
476 		/*
477 		 * do a power reset of card
478 		 *
479 		 * 1. set PwrState to D3hot (3)
480 		 * 2. clear PwrState flags
481 		 */
482 		pci_config_put32(chp->ch_hpci, 0x44, 3);
483 		pci_config_put32(chp->ch_hpci, 0x44, 0);
484 
485 		/* delay .5 sec */
486 		DELAY(500000);
487 
488 #ifdef CH_DEBUG
489 		VendorID    = pci_config_get16(chp->ch_hpci, 0);
490 		DeviceID    = pci_config_get16(chp->ch_hpci, 2);
491 		SubDeviceID = pci_config_get16(chp->ch_hpci, 0x2e);
492 		Command = pci_config_get16(chp->ch_hpci, 4);
493 
494 		PRINT(("IDs: %x,%x,%x\n", VendorID, DeviceID, SubDeviceID));
495 		PRINT(("Command: %x\n", Command));
496 #endif
497 		/* map in T101 register space (BAR0) */
498 		rv = ddi_regs_map_setup(
499 			dip,		/* ptr to dev's dev_info struct */
500 			BAR0,		/* register address space */
501 			&chp->ch_bar0,	/* address of offset */
502 			0,		/* offset into register address space */
503 			0,		/* length mapped (everything) */
504 			&le_attr,	/* ptr to device attr structure */
505 			&chp->ch_hbar0);	/* ptr to data access handle */
506 
507 		if (rv != DDI_SUCCESS) {
508 			PRINT(("map registers failed\n"));
509 			DEBUG_ENTER("ch_attach");
510 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
511 			gchp[unit] = NULL;
512 #endif
513 			cmn_err(CE_WARN,
514 				"%s: ddi_regs_map_setup BAR0 error %d\n",
515 				chp->ch_name, rv);
516 
517 			pci_config_teardown(&chp->ch_hpci);
518 			ch_free_name(chp);
519 			kmem_free(chp, sizeof (ch_t));
520 			gld_mac_free(macinfo);
521 
522 			return (DDI_FAILURE);
523 		}
524 
525 #ifdef CH_DEBUG
526 		Version  = ddi_get32(chp->ch_hbar0,
527 			(uint32_t *)(chp->ch_bar0+0x6c));
528 #endif
529 
530 		(void) ddi_dev_regsize(dip, 1, &chp->ch_bar0sz);
531 
532 		PRINT(("PCI BAR0 space addr: %p\n", chp->ch_bar0));
533 		PRINT(("PCI BAR0 space size: %x\n", chp->ch_bar0sz));
534 		PRINT(("PE Version: %x\n", Version));
535 
536 		/*
537 		 * Add interrupt to system.
538 		 */
539 		rv = ddi_get_iblock_cookie(
540 			dip,		   /* ptr to dev's dev_info struct */
541 			0,		   /* interrupt # (0) */
542 			&chp->ch_icookp); /* ptr to interrupt block cookie */
543 
544 		if (rv != DDI_SUCCESS) {
545 			PRINT(("iblock cookie failed\n"));
546 			DEBUG_ENTER("ch_attach");
547 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
548 			gchp[unit] = NULL;
549 #endif
550 			cmn_err(CE_WARN,
551 				"%s: ddi_get_iblock_cookie error %d\n",
552 				chp->ch_name, rv);
553 
554 			ddi_regs_map_free(&chp->ch_hbar0);
555 			pci_config_teardown(&chp->ch_hpci);
556 			ch_free_name(chp);
557 			kmem_free(chp, sizeof (ch_t));
558 			gld_mac_free(macinfo);
559 
560 			return (DDI_FAILURE);
561 		}
562 
563 		/*
564 		 * add interrupt handler before card setup.
565 		 */
566 		rv = ddi_add_intr(
567 			dip,		/* ptr to dev's dev_info struct */
568 			0,		/* interrupt # (0) */
569 			0,		/* iblock cookie ptr (NULL) */
570 			0,		/* idevice cookie ptr (NULL) */
571 			gld_intr,	/* function ptr to interrupt handler */
572 			(caddr_t)macinfo);	/* handler argument */
573 
574 		if (rv != DDI_SUCCESS) {
575 			PRINT(("add_intr failed\n"));
576 			DEBUG_ENTER("ch_attach");
577 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
578 			gchp[unit] = NULL;
579 #endif
580 			cmn_err(CE_WARN, "%s: ddi_add_intr error %d\n",
581 				chp->ch_name, rv);
582 
583 			ddi_regs_map_free(&chp->ch_hbar0);
584 			pci_config_teardown(&chp->ch_hpci);
585 			ch_free_name(chp);
586 			kmem_free(chp, sizeof (ch_t));
587 			gld_mac_free(macinfo);
588 
589 			return (DDI_FAILURE);
590 		}
591 
592 		/* initalize all the remaining per-card locks */
593 		mutex_init(&chp->ch_lock, NULL, MUTEX_DRIVER,
594 					(void *)chp->ch_icookp);
595 		mutex_init(&chp->ch_intr, NULL, MUTEX_DRIVER,
596 					(void *)chp->ch_icookp);
597 		mutex_init(&chp->ch_mc_lck, NULL, MUTEX_DRIVER, NULL);
598 		mutex_init(&chp->ch_dh_lck, NULL, MUTEX_DRIVER, NULL);
599 		mutex_init(&chp->mac_lock, NULL, MUTEX_DRIVER, NULL);
600 
601 		/* ------- initialize Chelsio card ------- */
602 
603 		if (pe_attach(chp)) {
604 			PRINT(("card initialization failed\n"));
605 			DEBUG_ENTER("ch_attach");
606 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
607 			gchp[unit] = NULL;
608 #endif
609 			cmn_err(CE_WARN, "%s: pe_attach failed\n",
610 				chp->ch_name);
611 
612 			mutex_destroy(&chp->ch_lock);
613 			mutex_destroy(&chp->ch_intr);
614 			mutex_destroy(&chp->ch_mc_lck);
615 			mutex_destroy(&chp->ch_dh_lck);
616 			mutex_destroy(&chp->mac_lock);
617 			ddi_remove_intr(dip, 0, chp->ch_icookp);
618 			ddi_regs_map_free(&chp->ch_hbar0);
619 			pci_config_teardown(&chp->ch_hpci);
620 			ch_free_name(chp);
621 			kmem_free(chp, sizeof (ch_t));
622 			gld_mac_free(macinfo);
623 
624 			return (DDI_FAILURE);
625 		}
626 
627 		/* ------- done with Chelsio card ------- */
628 
629 		/* now can  set mac address */
630 		macinfo->gldm_vendor_addr = pe_get_mac(chp);
631 
632 		macinfo->gldm_cookie = chp->ch_icookp;
633 
634 		/*
635 		 * We only active checksum offload for T2 architectures.
636 		 */
637 		if (is_T2(chp)) {
638 			if (chp->ch_config.cksum_enabled)
639 				macinfo->gldm_capabilities |=
640 				    GLD_CAP_CKSUM_FULL_V4;
641 		} else
642 			chp->ch_config.cksum_enabled = 0;
643 
644 		rv = gld_register(
645 			dip,		/* ptr to dev's dev_info struct */
646 			(char *)ddi_driver_name(dip),	/* driver name */
647 			macinfo);	/* ptr to gld macinfo buffer */
648 
649 		/*
650 		 * The Jumbo frames capability is not yet available
651 		 * in Solaris 10 so registration will fail. MTU > 1500 is
652 		 * supported in Update 1.
653 		 */
654 		if (rv != DDI_SUCCESS) {
655 			cmn_err(CE_NOTE, "MTU > 1500 not supported by GLD.\n");
656 			cmn_err(CE_NOTE, "Setting MTU to 1500. \n");
657 			macinfo->gldm_maxpkt = chp->ch_mtu = 1500;
658 			rv = gld_register(
659 				dip,	/* ptr to dev's dev_info struct */
660 				(char *)ddi_driver_name(dip), /* driver name */
661 				macinfo); /* ptr to gld macinfo buffer */
662 		}
663 
664 
665 		if (rv != DDI_SUCCESS) {
666 			PRINT(("gld_register failed\n"));
667 			DEBUG_ENTER("ch_attach");
668 
669 			cmn_err(CE_WARN, "%s: gld_register error %d\n",
670 				chp->ch_name, rv);
671 
672 			pe_detach(chp);
673 
674 			mutex_destroy(&chp->ch_lock);
675 			mutex_destroy(&chp->ch_intr);
676 			mutex_destroy(&chp->ch_mc_lck);
677 			mutex_destroy(&chp->ch_dh_lck);
678 			mutex_destroy(&chp->mac_lock);
679 			ddi_remove_intr(dip, 0, chp->ch_icookp);
680 			ddi_regs_map_free(&chp->ch_hbar0);
681 			pci_config_teardown(&chp->ch_hpci);
682 			ch_free_name(chp);
683 			kmem_free(chp, sizeof (ch_t));
684 			gld_mac_free(macinfo);
685 
686 			return (DDI_FAILURE);
687 		}
688 
689 		/*
690 		 * print a banner at boot time (verbose mode), announcing
691 		 * the device pointed to by dip
692 		 */
693 		ddi_report_dev(dip);
694 
695 		if (ch_abort_debug)
696 			debug_enter("ch_attach");
697 
698 		return (DDI_SUCCESS);
699 
700 	} else if (cmd == DDI_RESUME) {
701 		PRINT(("attach resume\n"));
702 		DEBUG_ENTER("ch_attach");
703 		if ((chp = (ch_t *)ddi_get_driver_private(dip)) == NULL)
704 			return (DDI_FAILURE);
705 
706 		mutex_enter(&chp->ch_lock);
707 		chp->ch_flags &= ~PESUSPENDED;
708 		mutex_exit(&chp->ch_lock);
709 		return (DDI_SUCCESS);
710 	} else {
711 		PRINT(("attach: bad command\n"));
712 		DEBUG_ENTER("ch_attach");
713 
714 		return (DDI_FAILURE);
715 	}
716 }
717 
718 static int
719 ch_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
720 {
721 	gld_mac_info_t *macinfo;
722 	ch_t *chp;
723 
724 	if (cmd == DDI_DETACH) {
725 		macinfo = (gld_mac_info_t *)ddi_get_driver_private(dip);
726 		chp = (ch_t *)macinfo->gldm_private;
727 
728 		/*
729 		 * fail detach if there are outstanding mblks still
730 		 * in use somewhere.
731 		 */
732 		DEBUG_ENTER("ch_detach");
733 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
734 		mutex_enter(&chp->ch_lock);
735 		if (chp->ch_refcnt > 0) {
736 			mutex_exit(&chp->ch_lock);
737 			return (DDI_FAILURE);
738 		}
739 		mutex_exit(&chp->ch_lock);
740 		gchp[chp->ch_unit] = NULL;
741 #endif
742 		/*
743 		 * set driver state for this card to IDLE. We're
744 		 * shutting down.
745 		 */
746 		mutex_enter(&chp->ch_lock);
747 		chp->ch_state = PEIDLE;
748 		mutex_exit(&chp->ch_lock);
749 
750 		/*
751 		 * do a power reset of card
752 		 *
753 		 * 1. set PwrState to D3hot (3)
754 		 * 2. clear PwrState flags
755 		 */
756 		pci_config_put32(chp->ch_hpci, 0x44, 3);
757 		pci_config_put32(chp->ch_hpci, 0x44, 0);
758 
759 		/* delay .5 sec */
760 		DELAY(500000);
761 
762 		/* free register resources */
763 		(void) gld_unregister(macinfo);
764 
765 		/* make sure no interrupts while shutting down card */
766 		ddi_remove_intr(dip, 0, chp->ch_icookp);
767 
768 		/*
769 		 * reset device and recover resources
770 		 */
771 		pe_detach(chp);
772 
773 		ddi_regs_map_free(&chp->ch_hbar0);
774 		pci_config_teardown(&chp->ch_hpci);
775 		mutex_destroy(&chp->ch_lock);
776 		mutex_destroy(&chp->ch_intr);
777 		mutex_destroy(&chp->ch_mc_lck);
778 		mutex_destroy(&chp->ch_dh_lck);
779 		mutex_destroy(&chp->mac_lock);
780 		ch_free_dma_handles(chp);
781 #if defined(__sparc)
782 		ch_free_dvma_handles(chp);
783 #endif
784 		ch_free_name(chp);
785 		kmem_free(chp, sizeof (ch_t));
786 		gld_mac_free(macinfo);
787 
788 		DEBUG_ENTER("ch_detach end");
789 
790 		return (DDI_SUCCESS);
791 
792 	} else if ((cmd == DDI_SUSPEND) || (cmd == DDI_PM_SUSPEND)) {
793 		DEBUG_ENTER("suspend");
794 		if ((chp = (ch_t *)ddi_get_driver_private(dip)) == NULL)
795 			return (DDI_FAILURE);
796 		mutex_enter(&chp->ch_lock);
797 		chp->ch_flags |= PESUSPENDED;
798 		mutex_exit(&chp->ch_lock);
799 #ifdef TODO
800 		/* Un-initialize (STOP) T101 */
801 #endif
802 		return (DDI_SUCCESS);
803 	} else
804 		return (DDI_FAILURE);
805 }
806 
807 /*
808  * ch_alloc_dma_mem
809  *
810  * allocates DMA handle
811  * allocates kernel memory
812  * allocates DMA access handle
813  *
814  * chp - per-board descriptor
815  * type - byteswap mapping?
816  * flags - type of mapping
817  * size - # bytes mapped
818  * paddr - physical address
819  * dh - ddi dma handle
820  * ah - ddi access handle
821  */
822 
823 void *
824 ch_alloc_dma_mem(ch_t *chp, int type, int flags, int size, uint64_t *paddr,
825 	ulong_t *dh, ulong_t *ah)
826 {
827 	ddi_dma_attr_t ch_dma_attr;
828 	ddi_dma_cookie_t cookie;
829 	ddi_dma_handle_t ch_dh;
830 	ddi_acc_handle_t ch_ah;
831 	ddi_device_acc_attr_t *dev_attrp;
832 	caddr_t ch_vaddr;
833 	size_t rlen;
834 	uint_t count;
835 	uint_t mapping;
836 	uint_t align;
837 	uint_t rv;
838 	uint_t direction;
839 
840 	mapping = (flags&DMA_STREAM)?DDI_DMA_STREAMING:DDI_DMA_CONSISTENT;
841 	if (flags & DMA_4KALN)
842 		align = 0x4000;
843 	else if (flags & DMA_SMALN)
844 		align = chp->ch_sm_buf_aln;
845 	else if (flags & DMA_BGALN)
846 		align = chp->ch_bg_buf_aln;
847 	else {
848 		cmn_err(CE_WARN, "ch_alloc_dma_mem(%s): bad alignment flag\n",
849 		    chp->ch_name);
850 		return (0);
851 	}
852 	direction = (flags&DMA_OUT)?DDI_DMA_WRITE:DDI_DMA_READ;
853 
854 	/*
855 	 * dynamically create a dma attribute structure
856 	 */
857 	ch_dma_attr.dma_attr_version = DMA_ATTR_V0;
858 	ch_dma_attr.dma_attr_addr_lo = 0;
859 	ch_dma_attr.dma_attr_addr_hi = 0xffffffffffffffff;
860 	ch_dma_attr.dma_attr_count_max = 0x00ffffff;
861 	ch_dma_attr.dma_attr_align = align;
862 	ch_dma_attr.dma_attr_burstsizes = 0xfff;
863 	ch_dma_attr.dma_attr_minxfer = 1;
864 	ch_dma_attr.dma_attr_maxxfer = 0x00ffffff;
865 	ch_dma_attr.dma_attr_seg = 0xffffffff;
866 	ch_dma_attr.dma_attr_sgllen = 1;
867 	ch_dma_attr.dma_attr_granular = 1;
868 	ch_dma_attr.dma_attr_flags = 0;
869 
870 	rv = ddi_dma_alloc_handle(
871 	    chp->ch_dip,		/* device dev_info structure */
872 	    &ch_dma_attr,		/* DMA attributes */
873 	    DDI_DMA_SLEEP,		/* Wait if no memory */
874 	    NULL,			/* no argument to callback */
875 	    &ch_dh);			/* DMA handle */
876 	if (rv != DDI_SUCCESS) {
877 
878 		cmn_err(CE_WARN,
879 			"%s: ch_alloc_dma_mem: ddi_dma_alloc_handle error %d\n",
880 			chp->ch_name, rv);
881 
882 		return (0);
883 	}
884 
885 	/* set byte order for data xfer */
886 	if (type)
887 		dev_attrp = &null_attr;
888 	else
889 		dev_attrp = &le_attr;
890 
891 	rv = ddi_dma_mem_alloc(
892 	    ch_dh,		/* dma handle */
893 	    size,		/* size desired allocate */
894 	    dev_attrp,		/* access attributes */
895 	    mapping,
896 	    DDI_DMA_SLEEP,	/* wait for resources */
897 	    NULL,		/* no argument */
898 	    &ch_vaddr,		/* allocated memory */
899 	    &rlen,		/* real size allocated */
900 	    &ch_ah);		/* data access handle */
901 	if (rv != DDI_SUCCESS) {
902 		ddi_dma_free_handle(&ch_dh);
903 
904 		cmn_err(CE_WARN,
905 			"%s: ch_alloc_dma_mem: ddi_dma_mem_alloc error %d\n",
906 			chp->ch_name, rv);
907 
908 		return (0);
909 	}
910 
911 	rv = ddi_dma_addr_bind_handle(
912 	    ch_dh,				/* dma handle */
913 	    (struct as *)0,			/* kernel address space */
914 	    ch_vaddr,				/* virtual address */
915 	    rlen,				/* length of object */
916 	    direction|mapping,
917 	    DDI_DMA_SLEEP,			/* Wait for resources */
918 	    NULL,				/* no argument */
919 	    &cookie,				/* dma cookie */
920 	    &count);
921 	if (rv != DDI_DMA_MAPPED) {
922 		ddi_dma_mem_free(&ch_ah);
923 		ddi_dma_free_handle(&ch_dh);
924 
925 		cmn_err(CE_WARN,
926 		    "%s: ch_alloc_dma_mem: ddi_dma_addr_bind_handle error %d\n",
927 			chp->ch_name, rv);
928 
929 		return (0);
930 	}
931 
932 	if (count != 1) {
933 		cmn_err(CE_WARN,
934 		    "%s: ch_alloc_dma_mem: ch_alloc_dma_mem cookie count %d\n",
935 			chp->ch_name, count);
936 		PRINT(("ch_alloc_dma_mem cookie count %d\n", count));
937 
938 		ddi_dma_mem_free(&ch_ah);
939 		ddi_dma_free_handle(&ch_dh);
940 
941 		return (0);
942 	}
943 
944 	*paddr = cookie.dmac_laddress;
945 
946 	*(ddi_dma_handle_t *)dh = ch_dh;
947 	*(ddi_acc_handle_t *)ah = ch_ah;
948 
949 	return ((void *)ch_vaddr);
950 }
951 
952 /*
953  * ch_free_dma_mem
954  *
955  * frees resources allocated by ch_alloc_dma_mem()
956  *
957  * frees DMA handle
958  * frees kernel memory
959  * frees DMA access handle
960  */
961 
962 void
963 ch_free_dma_mem(ulong_t dh, ulong_t ah)
964 {
965 	ddi_dma_handle_t ch_dh = (ddi_dma_handle_t)dh;
966 	ddi_acc_handle_t ch_ah = (ddi_acc_handle_t)ah;
967 
968 	(void) ddi_dma_unbind_handle(ch_dh);
969 	ddi_dma_mem_free(&ch_ah);
970 	ddi_dma_free_handle(&ch_dh);
971 }
972 
973 /*
974  * create a dma handle and return a dma handle entry.
975  */
976 free_dh_t *
977 ch_get_dma_handle(ch_t *chp)
978 {
979 	ddi_dma_handle_t ch_dh;
980 	ddi_dma_attr_t ch_dma_attr;
981 	free_dh_t *dhe;
982 	int rv;
983 
984 	dhe = (free_dh_t *)kmem_zalloc(sizeof (*dhe), KM_SLEEP);
985 
986 	ch_dma_attr.dma_attr_version = DMA_ATTR_V0;
987 	ch_dma_attr.dma_attr_addr_lo = 0;
988 	ch_dma_attr.dma_attr_addr_hi = 0xffffffffffffffff;
989 	ch_dma_attr.dma_attr_count_max = 0x00ffffff;
990 	ch_dma_attr.dma_attr_align = 1;
991 	ch_dma_attr.dma_attr_burstsizes = 0xfff;
992 	ch_dma_attr.dma_attr_minxfer = 1;
993 	ch_dma_attr.dma_attr_maxxfer = 0x00ffffff;
994 	ch_dma_attr.dma_attr_seg = 0xffffffff;
995 	ch_dma_attr.dma_attr_sgllen = 5;
996 	ch_dma_attr.dma_attr_granular = 1;
997 	ch_dma_attr.dma_attr_flags = 0;
998 
999 	rv = ddi_dma_alloc_handle(
1000 	    chp->ch_dip,		/* device dev_info */
1001 	    &ch_dma_attr,		/* DMA attributes */
1002 	    DDI_DMA_SLEEP,		/* Wait if no memory */
1003 	    NULL,			/* no argument */
1004 	    &ch_dh);			/* DMA handle */
1005 	if (rv != DDI_SUCCESS) {
1006 
1007 		cmn_err(CE_WARN,
1008 		    "%s: ch_get_dma_handle: ddi_dma_alloc_handle error %d\n",
1009 			chp->ch_name, rv);
1010 
1011 		kmem_free(dhe, sizeof (*dhe));
1012 
1013 		return ((free_dh_t *)0);
1014 	}
1015 
1016 	dhe->dhe_dh = (ulong_t)ch_dh;
1017 
1018 	return (dhe);
1019 }
1020 
1021 /*
1022  * free the linked list of dma descriptor entries.
1023  */
1024 static void
1025 ch_free_dma_handles(ch_t *chp)
1026 {
1027 	free_dh_t *dhe, *the;
1028 
1029 	dhe = chp->ch_dh;
1030 	while (dhe) {
1031 		ddi_dma_free_handle((ddi_dma_handle_t *)&dhe->dhe_dh);
1032 		the = dhe;
1033 		dhe = dhe->dhe_next;
1034 		kmem_free(the, sizeof (*the));
1035 	}
1036 	chp->ch_dh = NULL;
1037 }
1038 
1039 /*
1040  * ch_bind_dma_handle()
1041  *
1042  * returns # of entries used off of cmdQ_ce_t array to hold physical addrs.
1043  *
1044  * chp - per-board descriptor
1045  * size - # bytes mapped
1046  * vaddr - virtual address
1047  * cmp - array of cmdQ_ce_t entries
1048  * cnt - # free entries in cmp array
1049  */
1050 
1051 uint32_t
1052 ch_bind_dma_handle(ch_t *chp, int size, caddr_t vaddr, cmdQ_ce_t *cmp,
1053 	uint32_t cnt)
1054 {
1055 	ddi_dma_cookie_t cookie;
1056 	ddi_dma_handle_t ch_dh;
1057 	uint_t count;
1058 	uint32_t n = 1;
1059 	free_dh_t *dhe;
1060 	uint_t rv;
1061 
1062 	mutex_enter(&chp->ch_dh_lck);
1063 	if ((dhe = chp->ch_dh) != NULL) {
1064 		chp->ch_dh = dhe->dhe_next;
1065 	}
1066 	mutex_exit(&chp->ch_dh_lck);
1067 
1068 	if (dhe == NULL) {
1069 		return (0);
1070 	}
1071 
1072 	ch_dh = (ddi_dma_handle_t)dhe->dhe_dh;
1073 
1074 	rv = ddi_dma_addr_bind_handle(
1075 	    ch_dh,		/* dma handle */
1076 	    (struct as *)0,	/* kernel address space */
1077 	    vaddr,		/* virtual address */
1078 	    size,		/* length of object */
1079 	    DDI_DMA_WRITE|DDI_DMA_STREAMING,
1080 	    DDI_DMA_SLEEP,	/* Wait for resources */
1081 	    NULL,		/* no argument */
1082 	    &cookie,	/* dma cookie */
1083 	    &count);
1084 	if (rv != DDI_DMA_MAPPED) {
1085 
1086 		/* return dma header descriptor back to free list */
1087 		mutex_enter(&chp->ch_dh_lck);
1088 		dhe->dhe_next = chp->ch_dh;
1089 		chp->ch_dh = dhe;
1090 		mutex_exit(&chp->ch_dh_lck);
1091 
1092 		cmn_err(CE_WARN,
1093 		    "%s: ch_bind_dma_handle: ddi_dma_addr_bind_handle err %d\n",
1094 			chp->ch_name, rv);
1095 
1096 		return (0);
1097 	}
1098 
1099 	/*
1100 	 * abort if we've run out of space
1101 	 */
1102 	if (count > cnt) {
1103 		/* return dma header descriptor back to free list */
1104 		mutex_enter(&chp->ch_dh_lck);
1105 		dhe->dhe_next = chp->ch_dh;
1106 		chp->ch_dh = dhe;
1107 		mutex_exit(&chp->ch_dh_lck);
1108 
1109 		return (0);
1110 	}
1111 
1112 	cmp->ce_pa = cookie.dmac_laddress;
1113 	cmp->ce_dh = NULL;
1114 	cmp->ce_len = cookie.dmac_size;
1115 	cmp->ce_mp = NULL;
1116 	cmp->ce_flg = DH_DMA;
1117 
1118 	while (--count) {
1119 		cmp++;
1120 		n++;
1121 		ddi_dma_nextcookie(ch_dh, &cookie);
1122 		cmp->ce_pa = cookie.dmac_laddress;
1123 		cmp->ce_dh = NULL;
1124 		cmp->ce_len = cookie.dmac_size;
1125 		cmp->ce_mp = NULL;
1126 		cmp->ce_flg = DH_DMA;
1127 	}
1128 
1129 	cmp->ce_dh = dhe;
1130 
1131 	return (n);
1132 }
1133 
1134 /*
1135  * ch_unbind_dma_handle()
1136  *
1137  * frees resources alloacted by ch_bind_dma_handle().
1138  *
1139  * frees DMA handle
1140  */
1141 
1142 void
1143 ch_unbind_dma_handle(ch_t *chp, free_dh_t *dhe)
1144 {
1145 	ddi_dma_handle_t ch_dh = (ddi_dma_handle_t)dhe->dhe_dh;
1146 
1147 	if (ddi_dma_unbind_handle(ch_dh))
1148 		cmn_err(CE_WARN, "%s: ddi_dma_unbind_handle failed",
1149 			chp->ch_name);
1150 
1151 	mutex_enter(&chp->ch_dh_lck);
1152 	dhe->dhe_next = chp->ch_dh;
1153 	chp->ch_dh = dhe;
1154 	mutex_exit(&chp->ch_dh_lck);
1155 }
1156 
1157 #if defined(__sparc)
1158 /*
1159  * DVMA stuff. Solaris only.
1160  */
1161 
1162 /*
1163  * create a dvma handle and return a dma handle entry.
1164  * DVMA is on sparc only!
1165  */
1166 
1167 free_dh_t *
1168 ch_get_dvma_handle(ch_t *chp)
1169 {
1170 	ddi_dma_handle_t ch_dh;
1171 	ddi_dma_lim_t ch_dvma_attr;
1172 	free_dh_t *dhe;
1173 	int rv;
1174 
1175 	dhe = (free_dh_t *)kmem_zalloc(sizeof (*dhe), KM_SLEEP);
1176 
1177 	ch_dvma_attr.dlim_addr_lo = 0;
1178 	ch_dvma_attr.dlim_addr_hi = 0xffffffff;
1179 	ch_dvma_attr.dlim_cntr_max = 0xffffffff;
1180 	ch_dvma_attr.dlim_burstsizes = 0xfff;
1181 	ch_dvma_attr.dlim_minxfer = 1;
1182 	ch_dvma_attr.dlim_dmaspeed = 0;
1183 
1184 	rv = dvma_reserve(
1185 		chp->ch_dip,		/* device dev_info */
1186 		&ch_dvma_attr,		/* DVMA attributes */
1187 		3,			/* number of pages */
1188 		&ch_dh);		/* DVMA handle */
1189 
1190 	if (rv != DDI_SUCCESS) {
1191 
1192 		cmn_err(CE_WARN,
1193 		    "%s: ch_get_dvma_handle: dvma_reserve() error %d\n",
1194 			chp->ch_name, rv);
1195 
1196 		kmem_free(dhe, sizeof (*dhe));
1197 
1198 		return ((free_dh_t *)0);
1199 	}
1200 
1201 	dhe->dhe_dh = (ulong_t)ch_dh;
1202 
1203 	return (dhe);
1204 }
1205 
1206 /*
1207  * free the linked list of dvma descriptor entries.
1208  * DVMA is only on sparc!
1209  */
1210 
1211 static void
1212 ch_free_dvma_handles(ch_t *chp)
1213 {
1214 	free_dh_t *dhe, *the;
1215 
1216 	dhe = chp->ch_vdh;
1217 	while (dhe) {
1218 		dvma_release((ddi_dma_handle_t)dhe->dhe_dh);
1219 		the = dhe;
1220 		dhe = dhe->dhe_next;
1221 		kmem_free(the, sizeof (*the));
1222 	}
1223 	chp->ch_vdh = NULL;
1224 }
1225 
1226 /*
1227  * ch_bind_dvma_handle()
1228  *
1229  * returns # of entries used off of cmdQ_ce_t array to hold physical addrs.
1230  * DVMA in sparc only
1231  *
1232  * chp - per-board descriptor
1233  * size - # bytes mapped
1234  * vaddr - virtual address
1235  * cmp - array of cmdQ_ce_t entries
1236  * cnt - # free entries in cmp array
1237  */
1238 
1239 uint32_t
1240 ch_bind_dvma_handle(ch_t *chp, int size, caddr_t vaddr, cmdQ_ce_t *cmp,
1241 	uint32_t cnt)
1242 {
1243 	ddi_dma_cookie_t cookie;
1244 	ddi_dma_handle_t ch_dh;
1245 	uint32_t n = 1;
1246 	free_dh_t *dhe;
1247 
1248 	mutex_enter(&chp->ch_dh_lck);
1249 	if ((dhe = chp->ch_vdh) != NULL) {
1250 		chp->ch_vdh = dhe->dhe_next;
1251 	}
1252 	mutex_exit(&chp->ch_dh_lck);
1253 
1254 	if (dhe == NULL) {
1255 		return (0);
1256 	}
1257 
1258 	ch_dh = (ddi_dma_handle_t)dhe->dhe_dh;
1259 	n = cnt;
1260 
1261 	dvma_kaddr_load(
1262 		ch_dh,		/* dvma handle */
1263 		vaddr,		/* virtual address */
1264 		size,		/* length of object */
1265 		0,		/* start at index 0 */
1266 		&cookie);
1267 
1268 	dvma_sync(ch_dh, 0, DDI_DMA_SYNC_FORDEV);
1269 
1270 	cookie.dmac_notused = 0;
1271 	n = 1;
1272 
1273 	cmp->ce_pa = cookie.dmac_laddress;
1274 	cmp->ce_dh = dhe;
1275 	cmp->ce_len = cookie.dmac_size;
1276 	cmp->ce_mp = NULL;
1277 	cmp->ce_flg = DH_DVMA;	/* indicate a dvma descriptor */
1278 
1279 	return (n);
1280 }
1281 
1282 /*
1283  * ch_unbind_dvma_handle()
1284  *
1285  * frees resources alloacted by ch_bind_dvma_handle().
1286  *
1287  * frees DMA handle
1288  */
1289 
1290 void
1291 ch_unbind_dvma_handle(ch_t *chp, free_dh_t *dhe)
1292 {
1293 	ddi_dma_handle_t ch_dh = (ddi_dma_handle_t)dhe->dhe_dh;
1294 
1295 	dvma_unload(ch_dh, 0, -1);
1296 
1297 	mutex_enter(&chp->ch_dh_lck);
1298 	dhe->dhe_next = chp->ch_vdh;
1299 	chp->ch_vdh = dhe;
1300 	mutex_exit(&chp->ch_dh_lck);
1301 }
1302 
1303 #endif	/* defined(__sparc) */
1304 
1305 /*
1306  * send received packet up stream.
1307  *
1308  * if driver has been stopped, then we drop the message.
1309  */
1310 void
1311 ch_send_up(ch_t *chp, mblk_t *mp, uint32_t cksum, int flg)
1312 {
1313 	/*
1314 	 * probably do not need a lock here. When we set PESTOP in
1315 	 * ch_stop() a packet could have just passed here and gone
1316 	 * upstream. The next one will be dropped.
1317 	 */
1318 	if (chp->ch_state == PERUNNING) {
1319 		/*
1320 		 * note that flg will not be set unless enable_checksum_offload
1321 		 * set in /etc/system (see sge.c).
1322 		 */
1323 		if (flg)
1324 			(void) hcksum_assoc(mp, NULL, NULL, 0, 0, 0, cksum,
1325 				HCK_FULLCKSUM, 0);
1326 		gld_recv(chp->ch_macp, mp);
1327 	} else {
1328 		freemsg(mp);
1329 	}
1330 }
1331 
1332 /*
1333  * unblock gld driver.
1334  */
1335 void
1336 ch_gld_ok(ch_t *chp)
1337 {
1338 	gld_sched(chp->ch_macp);
1339 }
1340 
1341 
1342 /*
1343  * reset the card.
1344  *
1345  * Note: we only do this after the card has been initialized.
1346  */
1347 static int
1348 ch_reset(gld_mac_info_t *mp)
1349 {
1350 	ch_t *chp;
1351 
1352 	if (mp == NULL) {
1353 		return (GLD_FAILURE);
1354 	}
1355 
1356 	chp = (ch_t *)mp->gldm_private;
1357 
1358 	if (chp == NULL) {
1359 		return (GLD_FAILURE);
1360 	}
1361 
1362 #ifdef NOTYET
1363 	/*
1364 	 * do a reset of card
1365 	 *
1366 	 * 1. set PwrState to D3hot (3)
1367 	 * 2. clear PwrState flags
1368 	 */
1369 	/*
1370 	 * When we did this, the card didn't start. First guess is that
1371 	 * the initialization is not quite correct. For now, we don't
1372 	 * reset things.
1373 	 */
1374 	if (chp->ch_hpci) {
1375 		pci_config_put32(chp->ch_hpci, 0x44, 3);
1376 		pci_config_put32(chp->ch_hpci, 0x44, 0);
1377 
1378 		/* delay .5 sec */
1379 		DELAY(500000);
1380 	}
1381 #endif
1382 
1383 	return (GLD_SUCCESS);
1384 }
1385 
1386 static int
1387 ch_start(gld_mac_info_t *macinfo)
1388 {
1389 	ch_t *chp = (ch_t *)macinfo->gldm_private;
1390 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
1391 	/* only initialize card on first attempt */
1392 	mutex_enter(&chp->ch_lock);
1393 	chp->ch_refcnt++;
1394 	if (chp->ch_refcnt == 1) {
1395 		chp->ch_state = PERUNNING;
1396 		mutex_exit(&chp->ch_lock);
1397 		pe_init((void *)chp);
1398 	} else
1399 		mutex_exit(&chp->ch_lock);
1400 #else
1401 	pe_init((void *)chp);
1402 
1403 	/* go to running state, we're being started */
1404 	mutex_enter(&chp->ch_lock);
1405 	chp->ch_state = PERUNNING;
1406 	mutex_exit(&chp->ch_lock);
1407 #endif
1408 
1409 	return (GLD_SUCCESS);
1410 }
1411 
1412 static int
1413 ch_stop(gld_mac_info_t *mp)
1414 {
1415 	ch_t *chp = (ch_t *)mp->gldm_private;
1416 
1417 	/*
1418 	 * can only stop the chip if it's been initialized
1419 	 */
1420 	mutex_enter(&chp->ch_lock);
1421 	if (chp->ch_state == PEIDLE) {
1422 		mutex_exit(&chp->ch_lock);
1423 		return (GLD_FAILURE);
1424 	}
1425 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
1426 	chp->ch_refcnt--;
1427 	if (chp->ch_refcnt == 0) {
1428 		chp->ch_state = PESTOP;
1429 		mutex_exit(&chp->ch_lock);
1430 		pe_stop(chp);
1431 	} else
1432 		mutex_exit(&chp->ch_lock);
1433 #else
1434 	chp->ch_state = PESTOP;
1435 	mutex_exit(&chp->ch_lock);
1436 	pe_stop(chp);
1437 #endif
1438 	return (GLD_SUCCESS);
1439 }
1440 
1441 static int
1442 ch_set_mac_address(gld_mac_info_t *mp, uint8_t *mac)
1443 {
1444 	ch_t *chp;
1445 
1446 	if (mp) {
1447 		chp = (ch_t *)mp->gldm_private;
1448 	} else {
1449 		return (GLD_FAILURE);
1450 	}
1451 
1452 	pe_set_mac(chp, mac);
1453 
1454 	return (GLD_SUCCESS);
1455 }
1456 
1457 static int
1458 ch_set_multicast(gld_mac_info_t *mp, uint8_t *ep, int flg)
1459 {
1460 	ch_t *chp = (ch_t *)mp->gldm_private;
1461 
1462 	return (pe_set_mc(chp, ep, flg));
1463 }
1464 
1465 static int
1466 ch_ioctl(gld_mac_info_t *macinfo, queue_t *q, mblk_t *mp)
1467 {
1468 	struct iocblk *iocp;
1469 
1470 	switch (mp->b_datap->db_type) {
1471 	case M_IOCTL:
1472 		/* pe_ioctl() does qreply() */
1473 		pe_ioctl((ch_t *)(macinfo->gldm_private), q, mp);
1474 		break;
1475 
1476 	default:
1477 /*
1478  *		cmn_err(CE_NOTE, "ch_ioctl not M_IOCTL\n");
1479  *		debug_enter("bad ch_ioctl");
1480  */
1481 
1482 		iocp = (struct iocblk *)mp->b_rptr;
1483 
1484 		if (mp->b_cont)
1485 			freemsg(mp->b_cont);
1486 		mp->b_cont = NULL;
1487 
1488 		mp->b_datap->db_type = M_IOCNAK;
1489 		iocp->ioc_error = EINVAL;
1490 		qreply(q, mp);
1491 		break;
1492 	}
1493 
1494 	return (GLD_SUCCESS);
1495 }
1496 
1497 static int
1498 ch_set_promiscuous(gld_mac_info_t *mp, int flag)
1499 {
1500 	ch_t *chp = (ch_t *)mp->gldm_private;
1501 
1502 	switch (flag) {
1503 	case GLD_MAC_PROMISC_MULTI:
1504 		pe_set_promiscuous(chp, 2);
1505 		break;
1506 
1507 	case GLD_MAC_PROMISC_NONE:
1508 		pe_set_promiscuous(chp, 0);
1509 		break;
1510 
1511 	case GLD_MAC_PROMISC_PHYS:
1512 	default:
1513 		pe_set_promiscuous(chp, 1);
1514 		break;
1515 	}
1516 
1517 	return (GLD_SUCCESS);
1518 }
1519 
1520 static int
1521 ch_get_stats(gld_mac_info_t *mp, struct gld_stats *gs)
1522 {
1523 	ch_t *chp = (ch_t *)mp->gldm_private;
1524 	uint64_t speed;
1525 	uint32_t intrcnt;
1526 	uint32_t norcvbuf;
1527 	uint32_t oerrors;
1528 	uint32_t ierrors;
1529 	uint32_t underrun;
1530 	uint32_t overrun;
1531 	uint32_t framing;
1532 	uint32_t crc;
1533 	uint32_t carrier;
1534 	uint32_t collisions;
1535 	uint32_t xcollisions;
1536 	uint32_t late;
1537 	uint32_t defer;
1538 	uint32_t xerrs;
1539 	uint32_t rerrs;
1540 	uint32_t toolong;
1541 	uint32_t runt;
1542 	ulong_t multixmt;
1543 	ulong_t multircv;
1544 	ulong_t brdcstxmt;
1545 	ulong_t brdcstrcv;
1546 
1547 	/*
1548 	 * race looks benign here.
1549 	 */
1550 	if (chp->ch_state != PERUNNING) {
1551 		return (GLD_FAILURE);
1552 	}
1553 
1554 	(void) pe_get_stats(chp,
1555 			&speed,
1556 			&intrcnt,
1557 			&norcvbuf,
1558 			&oerrors,
1559 			&ierrors,
1560 			&underrun,
1561 			&overrun,
1562 			&framing,
1563 			&crc,
1564 			&carrier,
1565 			&collisions,
1566 			&xcollisions,
1567 			&late,
1568 			&defer,
1569 			&xerrs,
1570 			&rerrs,
1571 			&toolong,
1572 			&runt,
1573 			&multixmt,
1574 			&multircv,
1575 			&brdcstxmt,
1576 			&brdcstrcv);
1577 
1578 	gs->glds_speed = speed;
1579 	gs->glds_media = GLDM_UNKNOWN;
1580 	gs->glds_intr  = intrcnt;
1581 	gs->glds_norcvbuf = norcvbuf;
1582 	gs->glds_errxmt = oerrors;
1583 	gs->glds_errrcv = ierrors;
1584 	gs->glds_missed = ierrors;	/* ??? */
1585 	gs->glds_underflow = underrun;
1586 	gs->glds_overflow = overrun;
1587 	gs->glds_frame = framing;
1588 	gs->glds_crc = crc;
1589 	gs->glds_duplex = GLD_DUPLEX_FULL;
1590 	gs->glds_nocarrier = carrier;
1591 	gs->glds_collisions = collisions;
1592 	gs->glds_excoll = xcollisions;
1593 	gs->glds_xmtlatecoll = late;
1594 	gs->glds_defer = defer;
1595 	gs->glds_dot3_first_coll = 0;	/* Not available */
1596 	gs->glds_dot3_multi_coll = 0;	/* Not available */
1597 	gs->glds_dot3_sqe_error = 0;	/* Not available */
1598 	gs->glds_dot3_mac_xmt_error = xerrs;
1599 	gs->glds_dot3_mac_rcv_error = rerrs;
1600 	gs->glds_dot3_frame_too_long = toolong;
1601 	gs->glds_short = runt;
1602 
1603 	gs->glds_noxmtbuf = 0;		/* not documented */
1604 	gs->glds_xmtretry = 0;		/* not documented */
1605 	gs->glds_multixmt = multixmt;	/* not documented */
1606 	gs->glds_multircv = multircv;	/* not documented */
1607 	gs->glds_brdcstxmt = brdcstxmt;	/* not documented */
1608 	gs->glds_brdcstrcv = brdcstrcv;	/* not documented */
1609 
1610 	return (GLD_SUCCESS);
1611 }
1612 
1613 
1614 static int
1615 ch_send(gld_mac_info_t *macinfo, mblk_t *mp)
1616 {
1617 	ch_t *chp = (ch_t *)macinfo->gldm_private;
1618 	uint32_t flg;
1619 	uint32_t msg_flg;
1620 
1621 #ifdef TX_CKSUM_FIX
1622 	mblk_t *nmp;
1623 	int frags;
1624 	size_t msg_len;
1625 	struct ether_header *ehdr;
1626 	ipha_t *ihdr;
1627 	int tflg = 0;
1628 #endif	/* TX_CKSUM_FIX */
1629 
1630 	/*
1631 	 * race looks benign here.
1632 	 */
1633 	if (chp->ch_state != PERUNNING) {
1634 		return (GLD_FAILURE);
1635 	}
1636 
1637 	msg_flg = 0;
1638 	if (chp->ch_config.cksum_enabled) {
1639 		if (is_T2(chp)) {
1640 			hcksum_retrieve(mp, NULL, NULL, NULL, NULL, NULL,
1641 				NULL, &msg_flg);
1642 			flg = (msg_flg & HCK_FULLCKSUM)?
1643 				CH_NO_CPL: CH_NO_HWCKSUM|CH_NO_CPL;
1644 		} else
1645 			flg = CH_NO_CPL;
1646 	} else
1647 	flg = CH_NO_HWCKSUM | CH_NO_CPL;
1648 
1649 #ifdef TX_CKSUM_FIX
1650 	/*
1651 	 * Check if the message spans more than one mblk or
1652 	 * if it does and the ip header is not in the first
1653 	 * fragment then pull up the message. This case is
1654 	 * expected to be rare.
1655 	 */
1656 	frags = 0;
1657 	msg_len = 0;
1658 	nmp = mp;
1659 	do {
1660 		frags++;
1661 		msg_len += MBLKL(nmp);
1662 		nmp = nmp->b_cont;
1663 	} while (nmp);
1664 #define	MAX_ALL_HDRLEN SZ_CPL_TX_PKT + sizeof (struct ether_header) + \
1665 				TCP_MAX_COMBINED_HEADER_LENGTH
1666 	/*
1667 	 * If the first mblk has enough space at the beginning of
1668 	 * the data buffer to hold a CPL header, then, we'll expancd
1669 	 * the front of the buffer so a pullup will leave space for
1670 	 * pe_start() to add the CPL header in line. We need to remember
1671 	 * that we've done this so we can undo it after the pullup.
1672 	 *
1673 	 * Note that if we decide to do an allocb to hold the CPL header,
1674 	 * we need to catch the case where we've added an empty mblk for
1675 	 * the header but never did a pullup. This would result in the
1676 	 * tests for etherheader, etc. being done on the initial, empty,
1677 	 * mblk instead of the one with data. See PR3646 for further
1678 	 * details. (note this PR is closed since it is no longer relevant).
1679 	 *
1680 	 * Another point is that if we do add an allocb to add space for
1681 	 * a CPL header, after a pullup, the initial pointer, mp, in GLD will
1682 	 * no longer point to a valid mblk. When we get the mblk (by allocb),
1683 	 * we need to switch the mblk structure values between it and the
1684 	 * mp structure values referenced by GLD. This handles the case where
1685 	 * we've run out of cmdQ entries and report GLD_NORESOURCES back to
1686 	 * GLD. The pointer to the mblk data will have been modified to hold
1687 	 * an empty 8 bytes for the CPL header, For now, we let the pe_start()
1688 	 * routine prepend an 8 byte mblk.
1689 	 */
1690 	if (MBLKHEAD(mp) >= SZ_CPL_TX_PKT) {
1691 		mp->b_rptr -= SZ_CPL_TX_PKT;
1692 		tflg = 1;
1693 	}
1694 	if (frags > 3) {
1695 		chp->sge->intr_cnt.tx_msg_pullups++;
1696 		if (pullupmsg(mp, -1) == 0) {
1697 			freemsg(mp);
1698 			return (GLD_SUCCESS);
1699 		}
1700 	} else if ((msg_len > MAX_ALL_HDRLEN) &&
1701 			(MBLKL(mp) < MAX_ALL_HDRLEN)) {
1702 		chp->sge->intr_cnt.tx_hdr_pullups++;
1703 		if (pullupmsg(mp, MAX_ALL_HDRLEN) == 0) {
1704 			freemsg(mp);
1705 			return (GLD_SUCCESS);
1706 		}
1707 	}
1708 	if (tflg)
1709 		mp->b_rptr += SZ_CPL_TX_PKT;
1710 
1711 	ehdr = (struct ether_header *)mp->b_rptr;
1712 	if (ehdr->ether_type == htons(ETHERTYPE_IP)) {
1713 		ihdr = (ipha_t *)&mp->b_rptr[sizeof (struct ether_header)];
1714 		if ((ihdr->ipha_fragment_offset_and_flags & IPH_MF)) {
1715 			if (ihdr->ipha_protocol == IPPROTO_UDP) {
1716 				flg |= CH_UDP_MF;
1717 				chp->sge->intr_cnt.tx_udp_ip_frag++;
1718 			} else if (ihdr->ipha_protocol == IPPROTO_TCP) {
1719 				flg |= CH_TCP_MF;
1720 				chp->sge->intr_cnt.tx_tcp_ip_frag++;
1721 			}
1722 		} else if (ihdr->ipha_protocol == IPPROTO_UDP)
1723 			flg |= CH_UDP;
1724 	}
1725 #endif	/* TX_CKSUM_FIX */
1726 
1727 	/*
1728 	 * return 0 - data send successfully
1729 	 * return 1 - no resources, reschedule
1730 	 */
1731 	if (pe_start(chp, mp, flg))
1732 		return (GLD_NORESOURCES);
1733 	else
1734 		return (GLD_SUCCESS);
1735 }
1736 
1737 static uint_t
1738 ch_intr(gld_mac_info_t *mp)
1739 {
1740 	return (pe_intr((ch_t *)mp->gldm_private));
1741 }
1742 
1743 /*
1744  * generate name of driver with unit# postpended.
1745  */
1746 void
1747 ch_set_name(ch_t *chp, int unit)
1748 {
1749 	chp->ch_name = (char *)kmem_alloc(sizeof ("chxge00"), KM_SLEEP);
1750 	if (unit > 9) {
1751 		bcopy("chxge00", (void *)chp->ch_name, sizeof ("chxge00"));
1752 		chp->ch_name[5] += unit/10;
1753 		chp->ch_name[6] += unit%10;
1754 	} else {
1755 		bcopy("chxge0", (void *)chp->ch_name, sizeof ("chxge0"));
1756 		chp->ch_name[5] += unit;
1757 	}
1758 }
1759 
1760 void
1761 ch_free_name(ch_t *chp)
1762 {
1763 	if (chp->ch_name)
1764 		kmem_free(chp->ch_name, sizeof ("chxge00"));
1765 	chp->ch_name = NULL;
1766 }
1767 
1768 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
1769 /*
1770  * register toe offload.
1771  */
1772 void *
1773 ch_register(void *instp, void *toe_rcv, void *toe_free, void *toe_tunnel,
1774     kmutex_t *toe_tx_mx, kcondvar_t *toe_of_cv, int unit)
1775 {
1776 	ch_t *chp = gchp[unit];
1777 	if (chp != NULL) {
1778 		mutex_enter(&chp->ch_lock);
1779 
1780 		chp->toe_rcv = (void (*)(void *, mblk_t *))toe_rcv;
1781 		chp->ch_toeinst = instp;
1782 		chp->toe_free = (void (*)(void *, tbuf_t *))toe_free;
1783 		chp->toe_tunnel = (int (*)(void *, mblk_t *))toe_tunnel;
1784 		chp->ch_tx_overflow_mutex = toe_tx_mx;
1785 		chp->ch_tx_overflow_cv = toe_of_cv;
1786 		chp->open_device_map |= TOEDEV_DEVMAP_BIT;
1787 
1788 		/* start up adapter if first user */
1789 		chp->ch_refcnt++;
1790 		if (chp->ch_refcnt == 1) {
1791 			chp->ch_state = PERUNNING;
1792 			mutex_exit(&chp->ch_lock);
1793 			pe_init((void *)chp);
1794 		} else
1795 			mutex_exit(&chp->ch_lock);
1796 	}
1797 	return ((void *)gchp[unit]);
1798 }
1799 
1800 /*
1801  * unregister toe offload.
1802  * XXX Need to fix races here.
1803  *     1. turn off SGE interrupts.
1804  *     2. do update
1805  *     3. re-enable SGE interrupts
1806  *     4. SGE doorbell to make sure things get restarted.
1807  */
1808 void
1809 ch_unregister(void)
1810 {
1811 	int i;
1812 	ch_t *chp;
1813 
1814 	for (i = 0; i < MAX_CARDS; i++) {
1815 		chp = gchp[i];
1816 		if (chp == NULL)
1817 			continue;
1818 
1819 		mutex_enter(&chp->ch_lock);
1820 
1821 		chp->ch_refcnt--;
1822 		if (chp->ch_refcnt == 0) {
1823 			chp->ch_state = PESTOP;
1824 			mutex_exit(&chp->ch_lock);
1825 			pe_stop(chp);
1826 		} else
1827 			mutex_exit(&chp->ch_lock);
1828 
1829 		chp->open_device_map &= ~TOEDEV_DEVMAP_BIT;
1830 		chp->toe_rcv = NULL;
1831 		chp->ch_toeinst =  NULL;
1832 		chp->toe_free = NULL;
1833 		chp->toe_tunnel = NULL;
1834 		chp->ch_tx_overflow_mutex = NULL;
1835 		chp->ch_tx_overflow_cv = NULL;
1836 	}
1837 }
1838 #endif	/* CONFIG_CHELSIO_T1_OFFLOAD */
1839 
1840 /*
1841  * get properties from chxge.conf
1842  */
1843 static void
1844 ch_get_prop(ch_t *chp)
1845 {
1846 	int val;
1847 	int tval = 0;
1848 	extern int enable_latency_timer;
1849 	extern uint32_t sge_cmdq0_cnt;
1850 	extern uint32_t sge_cmdq1_cnt;
1851 	extern uint32_t sge_flq0_cnt;
1852 	extern uint32_t sge_flq1_cnt;
1853 	extern uint32_t sge_respq_cnt;
1854 	extern uint32_t sge_cmdq0_cnt_orig;
1855 	extern uint32_t sge_cmdq1_cnt_orig;
1856 	extern uint32_t sge_flq0_cnt_orig;
1857 	extern uint32_t sge_flq1_cnt_orig;
1858 	extern uint32_t sge_respq_cnt_orig;
1859 	dev_info_t *pdip;
1860 	uint32_t vendor_id, device_id, revision_id;
1861 	uint32_t *prop_val = NULL;
1862 	uint32_t prop_len = NULL;
1863 
1864 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
1865 		"enable_dvma", -1);
1866 	if (val == -1)
1867 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
1868 			"enable-dvma", -1);
1869 	if (val != -1) {
1870 		if (val != 0)
1871 			chp->ch_config.enable_dvma = 1;
1872 	}
1873 
1874 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
1875 		"amd_bug_workaround", -1);
1876 	if (val == -1)
1877 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
1878 			"amd-bug-workaround", -1);
1879 
1880 	if (val != -1) {
1881 		if (val == 0) {
1882 			chp->ch_config.burstsize_set = 0;
1883 			chp->ch_config.transaction_cnt_set = 0;
1884 			goto fail_exit;
1885 		}
1886 	}
1887 	/*
1888 	 * Step up to the parent node,  That's the node above us
1889 	 * in the device tree. And will typically be the PCI host
1890 	 * Controller.
1891 	 */
1892 	pdip = ddi_get_parent(chp->ch_dip);
1893 
1894 	/*
1895 	 * Now get the 'Vendor id' properties
1896 	 */
1897 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pdip, 0, "vendor-id",
1898 	    (int **)&prop_val, &prop_len) != DDI_PROP_SUCCESS) {
1899 		chp->ch_config.burstsize_set = 0;
1900 		chp->ch_config.transaction_cnt_set = 0;
1901 		goto fail_exit;
1902 	}
1903 	vendor_id = *(uint32_t *)prop_val;
1904 	ddi_prop_free(prop_val);
1905 
1906 	/*
1907 	 * Now get the 'Device id' properties
1908 	 */
1909 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pdip, 0, "device-id",
1910 	    (int **)&prop_val, &prop_len) != DDI_PROP_SUCCESS) {
1911 		chp->ch_config.burstsize_set = 0;
1912 		chp->ch_config.transaction_cnt_set = 0;
1913 		goto fail_exit;
1914 	}
1915 	device_id = *(uint32_t *)prop_val;
1916 	ddi_prop_free(prop_val);
1917 
1918 	/*
1919 	 * Now get the 'Revision id' properties
1920 	 */
1921 	if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, pdip, 0, "revision-id",
1922 	    (int **)&prop_val, &prop_len) != DDI_PROP_SUCCESS) {
1923 		chp->ch_config.burstsize_set = 0;
1924 		chp->ch_config.transaction_cnt_set = 0;
1925 		goto fail_exit;
1926 	}
1927 	revision_id = *(uint32_t *)prop_val;
1928 	ddi_prop_free(prop_val);
1929 
1930 	/*
1931 	 * set default values based on node above us.
1932 	 */
1933 	if ((vendor_id == AMD_VENDOR_ID) && (device_id == AMD_BRIDGE) &&
1934 	    (revision_id <= AMD_BRIDGE_REV)) {
1935 		uint32_t v;
1936 		uint32_t burst;
1937 		uint32_t cnt;
1938 
1939 		/* if 133 Mhz not enabled, then do nothing - we're not PCIx */
1940 		v = pci_config_get32(chp->ch_hpci, 0x64);
1941 		if ((v & 0x20000) == NULL) {
1942 			chp->ch_config.burstsize_set = 0;
1943 			chp->ch_config.transaction_cnt_set = 0;
1944 			goto fail_exit;
1945 		}
1946 
1947 		/* check burst size and transaction count */
1948 		v = pci_config_get32(chp->ch_hpci, 0x60);
1949 		burst = (v >> 18) & 3;
1950 		cnt = (v >> 20) & 7;
1951 
1952 		switch (burst) {
1953 		case 0:	/* 512 */
1954 			/* 512 burst size legal with split cnts 1,2,3 */
1955 			if (cnt <= 2) {
1956 				chp->ch_config.burstsize_set = 0;
1957 				chp->ch_config.transaction_cnt_set = 0;
1958 				goto fail_exit;
1959 			}
1960 			break;
1961 		case 1:	/* 1024 */
1962 			/* 1024 burst size legal with split cnts 1,2 */
1963 			if (cnt <= 1) {
1964 				chp->ch_config.burstsize_set = 0;
1965 				chp->ch_config.transaction_cnt_set = 0;
1966 				goto fail_exit;
1967 			}
1968 			break;
1969 		case 2:	/* 2048 */
1970 			/* 2048 burst size legal with split cnts 1 */
1971 			if (cnt == 0) {
1972 				chp->ch_config.burstsize_set = 0;
1973 				chp->ch_config.transaction_cnt_set = 0;
1974 				goto fail_exit;
1975 			}
1976 			break;
1977 		case 3:	/* 4096 */
1978 			break;
1979 		}
1980 	} else {
1981 		goto fail_exit;
1982 	}
1983 
1984 	/*
1985 	 * if illegal burst size seen, then default to 1024 burst size
1986 	 */
1987 	chp->ch_config.burstsize = 1;
1988 	chp->ch_config.burstsize_set = 1;
1989 	/*
1990 	 * if illegal transaction cnt seen, then default to 2
1991 	 */
1992 	chp->ch_config.transaction_cnt = 1;
1993 	chp->ch_config.transaction_cnt_set = 1;
1994 
1995 
1996 fail_exit:
1997 
1998 	/*
1999 	 * alter the burstsize parameter via an entry
2000 	 * in chxge.conf
2001 	 */
2002 
2003 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2004 		"pci_burstsize", -1);
2005 	if (val == -1)
2006 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2007 			"pci-burstsize", -1);
2008 
2009 	if (val != -1) {
2010 
2011 		switch (val) {
2012 		case 0:	/* use default */
2013 			chp->ch_config.burstsize_set = 0;
2014 			break;
2015 
2016 		case 1024:
2017 			chp->ch_config.burstsize_set = 1;
2018 			chp->ch_config.burstsize = 1;
2019 			break;
2020 
2021 		case 2048:
2022 			chp->ch_config.burstsize_set = 1;
2023 			chp->ch_config.burstsize = 2;
2024 			break;
2025 
2026 		case 4096:
2027 			cmn_err(CE_WARN, "%s not supported %d\n",
2028 			    chp->ch_name, val);
2029 			break;
2030 
2031 		default:
2032 			cmn_err(CE_WARN, "%s illegal burst size %d\n",
2033 			    chp->ch_name, val);
2034 			break;
2035 		}
2036 	}
2037 
2038 	/*
2039 	 * set transaction count
2040 	 */
2041 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2042 		"pci_split_transaction_cnt", -1);
2043 	if (val == -1)
2044 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2045 			"pci-split-transaction-cnt", -1);
2046 
2047 	if (val != -1) {
2048 		switch (val) {
2049 		case 0:	/* use default */
2050 			chp->ch_config.transaction_cnt_set = 0;
2051 			break;
2052 
2053 		case 1:
2054 			chp->ch_config.transaction_cnt_set = 1;
2055 			chp->ch_config.transaction_cnt = 0;
2056 			break;
2057 
2058 		case 2:
2059 			chp->ch_config.transaction_cnt_set = 1;
2060 			chp->ch_config.transaction_cnt = 1;
2061 			break;
2062 
2063 		case 3:
2064 			chp->ch_config.transaction_cnt_set = 1;
2065 			chp->ch_config.transaction_cnt = 2;
2066 			break;
2067 
2068 		case 4:
2069 			chp->ch_config.transaction_cnt_set = 1;
2070 			chp->ch_config.transaction_cnt = 3;
2071 			break;
2072 
2073 		case 8:
2074 			chp->ch_config.transaction_cnt_set = 1;
2075 			chp->ch_config.transaction_cnt = 4;
2076 			break;
2077 
2078 		case 12:
2079 			chp->ch_config.transaction_cnt_set = 1;
2080 			chp->ch_config.transaction_cnt = 5;
2081 			break;
2082 
2083 		case 16:
2084 			chp->ch_config.transaction_cnt_set = 1;
2085 			chp->ch_config.transaction_cnt = 6;
2086 			break;
2087 
2088 		case 32:
2089 			chp->ch_config.transaction_cnt_set = 1;
2090 			chp->ch_config.transaction_cnt = 7;
2091 			break;
2092 
2093 		default:
2094 			cmn_err(CE_WARN, "%s illegal transaction cnt %d\n",
2095 			    chp->ch_name, val);
2096 			break;
2097 		}
2098 	}
2099 
2100 	/*
2101 	 * set relaxed ordering bit?
2102 	 */
2103 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2104 		"pci_relaxed_ordering_on", -1);
2105 	if (val == -1)
2106 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2107 			"pci-relaxed-ordering-on", -1);
2108 
2109 	/*
2110 	 * default is to use system default value.
2111 	 */
2112 	chp->ch_config.relaxed_ordering = 0;
2113 
2114 	if (val != -1) {
2115 		if (val)
2116 			chp->ch_config.relaxed_ordering = 1;
2117 	}
2118 
2119 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2120 		"enable_latency_timer", -1);
2121 	if (val == -1)
2122 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2123 			"enable-latency-timer", -1);
2124 	if (val != -1)
2125 		enable_latency_timer = (val == 0)? 0: 1;
2126 
2127 	/*
2128 	 * default maximum Jumbo Frame size.
2129 	 */
2130 	chp->ch_maximum_mtu = 9198;	/* tunable via chxge.conf */
2131 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2132 		"maximum_mtu", -1);
2133 	if (val == -1) {
2134 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2135 			"maximum-mtu", -1);
2136 	}
2137 	if (val != -1) {
2138 		if (val > 9582) {
2139 			cmn_err(CE_WARN,
2140 			    "maximum_mtu value %d > 9582. Value set to 9582",
2141 			    val);
2142 			val = 9582;
2143 		} else if (val < 1500) {
2144 			cmn_err(CE_WARN,
2145 			    "maximum_mtu value %d < 1500. Value set to 1500",
2146 			    val);
2147 			val = 1500;
2148 		}
2149 
2150 		if (val)
2151 			chp->ch_maximum_mtu = val;
2152 	}
2153 
2154 	/*
2155 	 * default value for this instance mtu
2156 	 */
2157 	chp->ch_mtu = ETHERMTU;
2158 
2159 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2160 		"accept_jumbo", -1);
2161 	if (val == -1) {
2162 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2163 			"accept-jumbo", -1);
2164 	}
2165 	if (val != -1) {
2166 		if (val)
2167 			chp->ch_mtu = chp->ch_maximum_mtu;
2168 	}
2169 #ifdef CONFIG_CHELSIO_T1_OFFLOAD
2170 	chp->ch_sm_buf_sz = 0x800;
2171 	chp->ch_sm_buf_aln = 0x800;
2172 	chp->ch_bg_buf_sz = 0x4000;
2173 	chp->ch_bg_buf_aln = 0x4000;
2174 #else
2175 	chp->ch_sm_buf_sz = 0x200;
2176 	chp->ch_sm_buf_aln = 0x200;
2177 	chp->ch_bg_buf_sz = 0x800;
2178 	chp->ch_bg_buf_aln = 0x800;
2179 	if ((chp->ch_mtu > 0x800) && (chp->ch_mtu <= 0x1000)) {
2180 		chp->ch_sm_buf_sz = 0x400;
2181 		chp->ch_sm_buf_aln = 0x400;
2182 		chp->ch_bg_buf_sz = 0x1000;
2183 		chp->ch_bg_buf_aln = 0x1000;
2184 	} else if ((chp->ch_mtu > 0x1000) && (chp->ch_mtu <= 0x2000)) {
2185 		chp->ch_sm_buf_sz = 0x400;
2186 		chp->ch_sm_buf_aln = 0x400;
2187 		chp->ch_bg_buf_sz = 0x2000;
2188 		chp->ch_bg_buf_aln = 0x2000;
2189 	} else if (chp->ch_mtu > 0x2000) {
2190 		chp->ch_sm_buf_sz = 0x400;
2191 		chp->ch_sm_buf_aln = 0x400;
2192 		chp->ch_bg_buf_sz = 0x3000;
2193 		chp->ch_bg_buf_aln = 0x4000;
2194 	}
2195 #endif
2196 	chp->ch_config.cksum_enabled = 1;
2197 
2198 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2199 		"enable_checksum_offload", -1);
2200 	if (val == -1)
2201 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2202 			"enable-checksum-offload", -1);
2203 	if (val != -1) {
2204 		if (val == NULL)
2205 			chp->ch_config.cksum_enabled = 0;
2206 	}
2207 
2208 	/*
2209 	 * Provides a tuning capability for the command queue 0 size.
2210 	 */
2211 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2212 		"sge_cmdq0_cnt", -1);
2213 	if (val == -1)
2214 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2215 			"sge-cmdq0-cnt", -1);
2216 	if (val != -1) {
2217 		if (val > 10)
2218 			sge_cmdq0_cnt = val;
2219 	}
2220 
2221 	if (sge_cmdq0_cnt > 65535) {
2222 		cmn_err(CE_WARN,
2223 		    "%s: sge-cmdQ0-cnt > 65535 - resetting value to default",
2224 			chp->ch_name);
2225 		sge_cmdq0_cnt = sge_cmdq0_cnt_orig;
2226 	}
2227 	tval += sge_cmdq0_cnt;
2228 
2229 	/*
2230 	 * Provides a tuning capability for the command queue 1 size.
2231 	 */
2232 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2233 		"sge_cmdq1_cnt", -1);
2234 	if (val == -1)
2235 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2236 			"sge-cmdq1-cnt", -1);
2237 	if (val != -1) {
2238 		if (val > 10)
2239 			sge_cmdq1_cnt = val;
2240 	}
2241 
2242 	if (sge_cmdq1_cnt > 65535) {
2243 		cmn_err(CE_WARN,
2244 		    "%s: sge-cmdQ0-cnt > 65535 - resetting value to default",
2245 			chp->ch_name);
2246 		sge_cmdq1_cnt = sge_cmdq1_cnt_orig;
2247 	}
2248 
2249 	/*
2250 	 * Provides a tuning capability for the free list 0 size.
2251 	 */
2252 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2253 		"sge_flq0_cnt", -1);
2254 	if (val == -1)
2255 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2256 			"sge-flq0-cnt", -1);
2257 	if (val != -1) {
2258 		if (val > 512)
2259 			sge_flq0_cnt = val;
2260 	}
2261 
2262 	if (sge_flq0_cnt > 65535) {
2263 		cmn_err(CE_WARN,
2264 		    "%s: sge-flq0-cnt > 65535 - resetting value to default",
2265 			chp->ch_name);
2266 		sge_flq0_cnt = sge_flq0_cnt_orig;
2267 	}
2268 
2269 	tval += sge_flq0_cnt;
2270 
2271 	/*
2272 	 * Provides a tuning capability for the free list 1 size.
2273 	 */
2274 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2275 		"sge_flq1_cnt", -1);
2276 	if (val == -1)
2277 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2278 			"sge-flq1-cnt", -1);
2279 	if (val != -1) {
2280 		if (val > 512)
2281 			sge_flq1_cnt = val;
2282 	}
2283 
2284 	if (sge_flq1_cnt > 65535) {
2285 		cmn_err(CE_WARN,
2286 		    "%s: sge-flq1-cnt > 65535 - resetting value to default",
2287 			chp->ch_name);
2288 		sge_flq1_cnt = sge_flq1_cnt_orig;
2289 	}
2290 
2291 	tval += sge_flq1_cnt;
2292 
2293 	/*
2294 	 * Provides a tuning capability for the responce queue size.
2295 	 */
2296 	val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2297 		"sge_respq_cnt", -1);
2298 	if (val == -1)
2299 		val = ddi_getprop(DDI_DEV_T_ANY, chp->ch_dip, DDI_PROP_DONTPASS,
2300 			"sge-respq-cnt", -1);
2301 	if (val != -1) {
2302 		if (val > 30)
2303 			sge_respq_cnt = val;
2304 	}
2305 
2306 	if (sge_respq_cnt > 65535) {
2307 		cmn_err(CE_WARN,
2308 		    "%s: sge-respq-cnt > 65535 - resetting value to default",
2309 			chp->ch_name);
2310 		sge_respq_cnt = sge_respq_cnt_orig;
2311 	}
2312 
2313 	if (tval > sge_respq_cnt) {
2314 		if (tval <= 65535) {
2315 			cmn_err(CE_WARN,
2316 	    "%s: sge-respq-cnt < %d - setting value to %d (cmdQ+flq0+flq1)",
2317 			    chp->ch_name, tval, tval);
2318 
2319 			sge_respq_cnt = tval;
2320 		} else {
2321 			cmn_err(CE_WARN,
2322 			    "%s: Q sizes invalid - resetting to default values",
2323 			    chp->ch_name);
2324 
2325 			sge_cmdq0_cnt = sge_cmdq0_cnt_orig;
2326 			sge_cmdq1_cnt = sge_cmdq1_cnt_orig;
2327 			sge_flq0_cnt = sge_flq0_cnt_orig;
2328 			sge_flq1_cnt = sge_flq1_cnt_orig;
2329 			sge_respq_cnt = sge_respq_cnt_orig;
2330 		}
2331 	}
2332 }
2333