xref: /illumos-gate/usr/src/uts/common/io/fibre-channel/fca/qlge/qlge.c (revision 8c69cc8fbe729fa7b091e901c4b50508ccc6bb33)
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 2010 QLogic Corporation. All rights reserved.
24  */
25 
26 #include <qlge.h>
27 #include <sys/atomic.h>
28 #include <sys/strsubr.h>
29 #include <sys/pattr.h>
30 #include <netinet/in.h>
31 #include <netinet/ip.h>
32 #include <netinet/ip6.h>
33 #include <netinet/tcp.h>
34 #include <netinet/udp.h>
35 #include <inet/ip.h>
36 
37 
38 
39 /*
40  * Local variables
41  */
42 static struct ether_addr ql_ether_broadcast_addr =
43 	{0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
44 static char version[] = "GLDv3 QLogic 81XX " VERSIONSTR;
45 
46 /*
47  * Local function prototypes
48  */
49 static void ql_free_resources(qlge_t *);
50 static void ql_fini_kstats(qlge_t *);
51 static uint32_t ql_get_link_state(qlge_t *);
52 static void ql_read_conf(qlge_t *);
53 static int ql_alloc_phys(dev_info_t *, ddi_dma_handle_t *,
54     ddi_device_acc_attr_t *, uint_t, ddi_acc_handle_t *,
55     size_t, size_t, caddr_t *, ddi_dma_cookie_t *);
56 static int ql_alloc_phys_rbuf(dev_info_t *, ddi_dma_handle_t *,
57     ddi_device_acc_attr_t *, uint_t, ddi_acc_handle_t *,
58     size_t, size_t, caddr_t *, ddi_dma_cookie_t *);
59 static void ql_free_phys(ddi_dma_handle_t *, ddi_acc_handle_t *);
60 static int ql_set_routing_reg(qlge_t *, uint32_t, uint32_t, int);
61 static int ql_attach(dev_info_t *, ddi_attach_cmd_t);
62 static int ql_detach(dev_info_t *, ddi_detach_cmd_t);
63 static int ql_bringdown_adapter(qlge_t *);
64 static int ql_bringup_adapter(qlge_t *);
65 static int ql_asic_reset(qlge_t *);
66 static void ql_wake_mpi_reset_soft_intr(qlge_t *);
67 static void ql_stop_timer(qlge_t *qlge);
68 static void ql_fm_fini(qlge_t *qlge);
69 int ql_clean_outbound_rx_ring(struct rx_ring *rx_ring);
70 
71 /*
72  * TX dma maping handlers allow multiple sscatter-gather lists
73  */
74 ddi_dma_attr_t  tx_mapping_dma_attr = {
75 	DMA_ATTR_V0,			/* dma_attr_version */
76 	QL_DMA_LOW_ADDRESS,		/* low DMA address range */
77 	QL_DMA_HIGH_64BIT_ADDRESS,	/* high DMA address range */
78 	QL_DMA_XFER_COUNTER,		/* DMA counter register */
79 	QL_DMA_ADDRESS_ALIGNMENT,	/* DMA address alignment, default - 8 */
80 	QL_DMA_BURSTSIZES,		/* DMA burstsizes */
81 	QL_DMA_MIN_XFER_SIZE,		/* min effective DMA size */
82 	QL_DMA_MAX_XFER_SIZE,		/* max DMA xfer size */
83 	QL_DMA_SEGMENT_BOUNDARY,	/* segment boundary */
84 	QL_MAX_TX_DMA_HANDLES,		/* s/g list length */
85 	QL_DMA_GRANULARITY,		/* granularity of device */
86 	DDI_DMA_RELAXED_ORDERING	/* DMA transfer flags */
87 };
88 
89 /*
90  * Receive buffers and Request/Response queues do not allow scatter-gather lists
91  */
92 ddi_dma_attr_t  dma_attr = {
93 	DMA_ATTR_V0,			/* dma_attr_version */
94 	QL_DMA_LOW_ADDRESS,		/* low DMA address range */
95 	QL_DMA_HIGH_64BIT_ADDRESS,	/* high DMA address range */
96 	QL_DMA_XFER_COUNTER,		/* DMA counter register */
97 	QL_DMA_ADDRESS_ALIGNMENT,	/* DMA address alignment, default - 8 */
98 	QL_DMA_BURSTSIZES,		/* DMA burstsizes */
99 	QL_DMA_MIN_XFER_SIZE,		/* min effective DMA size */
100 	QL_DMA_MAX_XFER_SIZE,		/* max DMA xfer size */
101 	QL_DMA_SEGMENT_BOUNDARY,	/* segment boundary */
102 	1,				/* s/g list length, i.e no sg list */
103 	QL_DMA_GRANULARITY,		/* granularity of device */
104 	QL_DMA_XFER_FLAGS		/* DMA transfer flags */
105 };
106 /*
107  * Receive buffers do not allow scatter-gather lists
108  */
109 ddi_dma_attr_t  dma_attr_rbuf = {
110 	DMA_ATTR_V0,			/* dma_attr_version */
111 	QL_DMA_LOW_ADDRESS,		/* low DMA address range */
112 	QL_DMA_HIGH_64BIT_ADDRESS,	/* high DMA address range */
113 	QL_DMA_XFER_COUNTER,		/* DMA counter register */
114 	0x1,				/* DMA address alignment, default - 8 */
115 	QL_DMA_BURSTSIZES,		/* DMA burstsizes */
116 	QL_DMA_MIN_XFER_SIZE,		/* min effective DMA size */
117 	QL_DMA_MAX_XFER_SIZE,		/* max DMA xfer size */
118 	QL_DMA_SEGMENT_BOUNDARY,	/* segment boundary */
119 	1,				/* s/g list length, i.e no sg list */
120 	QL_DMA_GRANULARITY,		/* granularity of device */
121 	DDI_DMA_RELAXED_ORDERING	/* DMA transfer flags */
122 };
123 /*
124  * DMA access attribute structure.
125  */
126 /* device register access from host */
127 ddi_device_acc_attr_t ql_dev_acc_attr = {
128 	DDI_DEVICE_ATTR_V0,
129 	DDI_STRUCTURE_LE_ACC,
130 	DDI_STRICTORDER_ACC
131 };
132 
133 /* host ring descriptors */
134 ddi_device_acc_attr_t ql_desc_acc_attr = {
135 	DDI_DEVICE_ATTR_V0,
136 	DDI_NEVERSWAP_ACC,
137 	DDI_STRICTORDER_ACC
138 };
139 
140 /* host ring buffer */
141 ddi_device_acc_attr_t ql_buf_acc_attr = {
142 	DDI_DEVICE_ATTR_V0,
143 	DDI_NEVERSWAP_ACC,
144 	DDI_STRICTORDER_ACC
145 };
146 
147 /*
148  * Hash key table for Receive Side Scaling (RSS) support
149  */
150 const uint8_t key_data[] = {
151 	0x23, 0x64, 0xa1, 0xaa, 0x37, 0xc0, 0xed, 0x05, 0x2b, 0x36,
152 	0x50, 0x5c, 0x45, 0x1e, 0x7e, 0xc8, 0x5d, 0x2a, 0x54, 0x2f,
153 	0xe4, 0x3d, 0x0f, 0xbb, 0x91, 0xd9, 0x25, 0x60, 0xd4, 0xf8,
154 	0x12, 0xa0, 0x59, 0x4b, 0x9e, 0x8a, 0x51, 0xda, 0xcd, 0x49};
155 
156 /*
157  * Shadow Registers:
158  * Outbound queues have a consumer index that is maintained by the chip.
159  * Inbound queues have a producer index that is maintained by the chip.
160  * For lower overhead, these registers are "shadowed" to host memory
161  * which allows the device driver to track the queue progress without
162  * PCI reads. When an entry is placed on an inbound queue, the chip will
163  * update the relevant index register and then copy the value to the
164  * shadow register in host memory.
165  * Currently, ql_read_sh_reg only read Inbound queues'producer index.
166  */
167 
168 static inline unsigned int
169 ql_read_sh_reg(qlge_t *qlge, struct rx_ring *rx_ring)
170 {
171 	uint32_t rtn;
172 
173 	/* re-synchronize shadow prod index dma buffer before reading */
174 	(void) ddi_dma_sync(qlge->host_copy_shadow_dma_attr.dma_handle,
175 	    rx_ring->prod_idx_sh_reg_offset,
176 	    sizeof (uint32_t), DDI_DMA_SYNC_FORKERNEL);
177 
178 	rtn = ddi_get32(qlge->host_copy_shadow_dma_attr.acc_handle,
179 	    (uint32_t *)rx_ring->prod_idx_sh_reg);
180 
181 	return (rtn);
182 }
183 
184 /*
185  * Read 32 bit atomically
186  */
187 uint32_t
188 ql_atomic_read_32(volatile uint32_t *target)
189 {
190 	/*
191 	 * atomic_add_32_nv returns the new value after the add,
192 	 * we are adding 0 so we should get the original value
193 	 */
194 	return (atomic_add_32_nv(target, 0));
195 }
196 
197 /*
198  * Set 32 bit atomically
199  */
200 void
201 ql_atomic_set_32(volatile uint32_t *target, uint32_t newval)
202 {
203 	(void) atomic_swap_32(target, newval);
204 }
205 
206 
207 /*
208  * Setup device PCI configuration registers.
209  * Kernel context.
210  */
211 static void
212 ql_pci_config(qlge_t *qlge)
213 {
214 	uint16_t w;
215 
216 	qlge->vendor_id = (uint16_t)pci_config_get16(qlge->pci_handle,
217 	    PCI_CONF_VENID);
218 	qlge->device_id = (uint16_t)pci_config_get16(qlge->pci_handle,
219 	    PCI_CONF_DEVID);
220 
221 	/*
222 	 * we want to respect framework's setting of PCI
223 	 * configuration space command register and also
224 	 * want to make sure that all bits of interest to us
225 	 * are properly set in PCI Command register(0x04).
226 	 * PCI_COMM_IO		0x1	 I/O access enable
227 	 * PCI_COMM_MAE		0x2	 Memory access enable
228 	 * PCI_COMM_ME		0x4	 bus master enable
229 	 * PCI_COMM_MEMWR_INVAL	0x10	 memory write and invalidate enable.
230 	 */
231 	w = (uint16_t)pci_config_get16(qlge->pci_handle, PCI_CONF_COMM);
232 	w = (uint16_t)(w & (~PCI_COMM_IO));
233 	w = (uint16_t)(w | PCI_COMM_MAE | PCI_COMM_ME |
234 	    /* PCI_COMM_MEMWR_INVAL | */
235 	    PCI_COMM_PARITY_DETECT | PCI_COMM_SERR_ENABLE);
236 
237 	pci_config_put16(qlge->pci_handle, PCI_CONF_COMM, w);
238 
239 	w = pci_config_get16(qlge->pci_handle, 0x54);
240 	w = (uint16_t)(w & (~0x7000));
241 	w = (uint16_t)(w | 0x5000);
242 	pci_config_put16(qlge->pci_handle, 0x54, w);
243 
244 	ql_dump_pci_config(qlge);
245 }
246 
247 /*
248  * This routine parforms the neccessary steps to set GLD mac information
249  * such as Function number, xgmac mask and shift bits
250  */
251 static int
252 ql_set_mac_info(qlge_t *qlge)
253 {
254 	uint32_t value;
255 	int rval = DDI_FAILURE;
256 	uint32_t fn0_net, fn1_net;
257 
258 	/* set default value */
259 	qlge->fn0_net = FN0_NET;
260 	qlge->fn1_net = FN1_NET;
261 
262 	if (ql_read_processor_data(qlge, MPI_REG, &value) != DDI_SUCCESS) {
263 		cmn_err(CE_WARN, "%s(%d) read MPI register failed",
264 		    __func__, qlge->instance);
265 		goto exit;
266 	} else {
267 		fn0_net = (value >> 1) & 0x07;
268 		fn1_net = (value >> 5) & 0x07;
269 		if ((fn0_net > 4) || (fn1_net > 4) || (fn0_net == fn1_net)) {
270 			cmn_err(CE_WARN, "%s(%d) bad mpi register value %x, \n"
271 			    "nic0 function number %d,"
272 			    "nic1 function number %d "
273 			    "use default\n",
274 			    __func__, qlge->instance, value, fn0_net, fn1_net);
275 			goto exit;
276 		} else {
277 			qlge->fn0_net = fn0_net;
278 			qlge->fn1_net = fn1_net;
279 		}
280 	}
281 
282 	/* Get the function number that the driver is associated with */
283 	value = ql_read_reg(qlge, REG_STATUS);
284 	qlge->func_number = (uint8_t)((value >> 6) & 0x03);
285 	QL_PRINT(DBG_INIT, ("status register is:%x, func_number: %d\n",
286 	    value, qlge->func_number));
287 
288 	/* The driver is loaded on a non-NIC function? */
289 	if ((qlge->func_number != qlge->fn0_net) &&
290 	    (qlge->func_number != qlge->fn1_net)) {
291 		cmn_err(CE_WARN,
292 		    "Invalid function number = 0x%x\n", qlge->func_number);
293 		goto exit;
294 	}
295 	/* network port 0? */
296 	if (qlge->func_number == qlge->fn0_net) {
297 		qlge->xgmac_sem_mask = QL_PORT0_XGMAC_SEM_MASK;
298 		qlge->xgmac_sem_bits = QL_PORT0_XGMAC_SEM_BITS;
299 	} else {
300 		qlge->xgmac_sem_mask = QL_PORT1_XGMAC_SEM_MASK;
301 		qlge->xgmac_sem_bits = QL_PORT1_XGMAC_SEM_BITS;
302 	}
303 	rval = DDI_SUCCESS;
304 exit:
305 	return (rval);
306 
307 }
308 
309 /*
310  * write to doorbell register
311  */
312 void
313 ql_write_doorbell_reg(qlge_t *qlge, uint32_t *addr, uint32_t data)
314 {
315 	ddi_put32(qlge->dev_doorbell_reg_handle, addr, data);
316 }
317 
318 /*
319  * read from doorbell register
320  */
321 uint32_t
322 ql_read_doorbell_reg(qlge_t *qlge, uint32_t *addr)
323 {
324 	uint32_t ret;
325 
326 	ret = ddi_get32(qlge->dev_doorbell_reg_handle, addr);
327 
328 	return	(ret);
329 }
330 
331 /*
332  * This function waits for a specific bit to come ready
333  * in a given register.  It is used mostly by the initialize
334  * process, but is also used in kernel thread API such as
335  * netdev->set_multi, netdev->set_mac_address, netdev->vlan_rx_add_vid.
336  */
337 static int
338 ql_wait_reg_rdy(qlge_t *qlge, uint32_t reg, uint32_t bit, uint32_t err_bit)
339 {
340 	uint32_t temp;
341 	int count = UDELAY_COUNT;
342 
343 	while (count) {
344 		temp = ql_read_reg(qlge, reg);
345 
346 		/* check for errors */
347 		if ((temp & err_bit) != 0) {
348 			break;
349 		} else if ((temp & bit) != 0)
350 			return (DDI_SUCCESS);
351 		qlge_delay(UDELAY_DELAY);
352 		count--;
353 	}
354 	cmn_err(CE_WARN,
355 	    "Waiting for reg %x to come ready failed.", reg);
356 	if (qlge->fm_enable) {
357 		ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
358 		atomic_or_32(&qlge->flags, ADAPTER_ERROR);
359 	}
360 	return (DDI_FAILURE);
361 }
362 
363 /*
364  * The CFG register is used to download TX and RX control blocks
365  * to the chip. This function waits for an operation to complete.
366  */
367 static int
368 ql_wait_cfg(qlge_t *qlge, uint32_t bit)
369 {
370 	return (ql_wait_reg_bit(qlge, REG_CONFIGURATION, bit, BIT_RESET, 0));
371 }
372 
373 
374 /*
375  * Used to issue init control blocks to hw. Maps control block,
376  * sets address, triggers download, waits for completion.
377  */
378 static int
379 ql_write_cfg(qlge_t *qlge, uint32_t bit, uint64_t phy_addr, uint16_t q_id)
380 {
381 	int status = DDI_SUCCESS;
382 	uint32_t mask;
383 	uint32_t value;
384 
385 	status = ql_sem_spinlock(qlge, SEM_ICB_MASK);
386 	if (status != DDI_SUCCESS) {
387 		goto exit;
388 	}
389 	status = ql_wait_cfg(qlge, bit);
390 	if (status != DDI_SUCCESS) {
391 		goto exit;
392 	}
393 
394 	ql_write_reg(qlge, REG_ICB_ACCESS_ADDRESS_LOWER, LS_64BITS(phy_addr));
395 	ql_write_reg(qlge, REG_ICB_ACCESS_ADDRESS_UPPER, MS_64BITS(phy_addr));
396 
397 	mask = CFG_Q_MASK | (bit << 16);
398 	value = bit | (q_id << CFG_Q_SHIFT);
399 	ql_write_reg(qlge, REG_CONFIGURATION, (mask | value));
400 
401 	/*
402 	 * Wait for the bit to clear after signaling hw.
403 	 */
404 	status = ql_wait_cfg(qlge, bit);
405 	ql_sem_unlock(qlge, SEM_ICB_MASK); /* does flush too */
406 
407 exit:
408 	return (status);
409 }
410 
411 /*
412  * Initialize adapter instance
413  */
414 static int
415 ql_init_instance(qlge_t *qlge)
416 {
417 	int i;
418 
419 	/* Default value */
420 	qlge->mac_flags = QL_MAC_INIT;
421 	qlge->mtu = ETHERMTU;		/* set normal size as default */
422 	qlge->page_size = VM_PAGE_SIZE;	/* default page size */
423 
424 	for (i = 0; i < MAX_RX_RINGS; i++) {
425 		qlge->rx_polls[i] = 0;
426 		qlge->rx_interrupts[i] = 0;
427 	}
428 
429 	/*
430 	 * Set up the operating parameters.
431 	 */
432 	qlge->multicast_list_count = 0;
433 
434 	/*
435 	 * Set up the max number of unicast list
436 	 */
437 	qlge->unicst_total = MAX_UNICAST_LIST_SIZE;
438 	qlge->unicst_avail = MAX_UNICAST_LIST_SIZE;
439 
440 	/*
441 	 * read user defined properties in .conf file
442 	 */
443 	ql_read_conf(qlge); /* mtu, pause, LSO etc */
444 	qlge->rx_ring_count = qlge->tx_ring_count + qlge->rss_ring_count;
445 
446 	QL_PRINT(DBG_INIT, ("mtu is %d \n", qlge->mtu));
447 
448 	/* choose Memory Space mapping and get Vendor Id, Device ID etc */
449 	ql_pci_config(qlge);
450 	qlge->ip_hdr_offset = 0;
451 
452 	if (qlge->device_id == 0x8000) {
453 		/* Schultz card */
454 		qlge->cfg_flags |= CFG_CHIP_8100;
455 		/* enable just ipv4 chksum offload for Schultz */
456 		qlge->cfg_flags |= CFG_CKSUM_FULL_IPv4;
457 		/*
458 		 * Schultz firmware does not do pseduo IP header checksum
459 		 * calculation, needed to be done by driver
460 		 */
461 		qlge->cfg_flags |= CFG_HW_UNABLE_PSEUDO_HDR_CKSUM;
462 		if (qlge->lso_enable)
463 			qlge->cfg_flags |= CFG_LSO;
464 		qlge->cfg_flags |= CFG_SUPPORT_SCATTER_GATHER;
465 		/* Schultz must split packet header */
466 		qlge->cfg_flags |= CFG_ENABLE_SPLIT_HEADER;
467 		qlge->max_read_mbx = 5;
468 		qlge->ip_hdr_offset = 2;
469 	}
470 
471 	/* Set Function Number and some of the iocb mac information */
472 	if (ql_set_mac_info(qlge) != DDI_SUCCESS)
473 		return (DDI_FAILURE);
474 
475 	/* Read network settings from NVRAM */
476 	/* After nvram is read successfully, update dev_addr */
477 	if (ql_get_flash_params(qlge) == DDI_SUCCESS) {
478 		QL_PRINT(DBG_INIT, ("mac%d address is \n", qlge->func_number));
479 		for (i = 0; i < ETHERADDRL; i++) {
480 			qlge->dev_addr.ether_addr_octet[i] =
481 			    qlge->nic_config.factory_MAC[i];
482 		}
483 	} else {
484 		cmn_err(CE_WARN, "%s(%d): Failed to read flash memory",
485 		    __func__, qlge->instance);
486 		return (DDI_FAILURE);
487 	}
488 
489 	bcopy(qlge->dev_addr.ether_addr_octet,
490 	    qlge->unicst_addr[0].addr.ether_addr_octet,
491 	    ETHERADDRL);
492 	QL_DUMP(DBG_INIT, "\t flash mac address dump:\n",
493 	    &qlge->dev_addr.ether_addr_octet[0], 8, ETHERADDRL);
494 
495 	qlge->port_link_state = LS_DOWN;
496 
497 	return (DDI_SUCCESS);
498 }
499 
500 
501 /*
502  * This hardware semaphore provides the mechanism for exclusive access to
503  * resources shared between the NIC driver, MPI firmware,
504  * FCOE firmware and the FC driver.
505  */
506 static int
507 ql_sem_trylock(qlge_t *qlge, uint32_t sem_mask)
508 {
509 	uint32_t sem_bits = 0;
510 
511 	switch (sem_mask) {
512 	case SEM_XGMAC0_MASK:
513 		sem_bits = SEM_SET << SEM_XGMAC0_SHIFT;
514 		break;
515 	case SEM_XGMAC1_MASK:
516 		sem_bits = SEM_SET << SEM_XGMAC1_SHIFT;
517 		break;
518 	case SEM_ICB_MASK:
519 		sem_bits = SEM_SET << SEM_ICB_SHIFT;
520 		break;
521 	case SEM_MAC_ADDR_MASK:
522 		sem_bits = SEM_SET << SEM_MAC_ADDR_SHIFT;
523 		break;
524 	case SEM_FLASH_MASK:
525 		sem_bits = SEM_SET << SEM_FLASH_SHIFT;
526 		break;
527 	case SEM_PROBE_MASK:
528 		sem_bits = SEM_SET << SEM_PROBE_SHIFT;
529 		break;
530 	case SEM_RT_IDX_MASK:
531 		sem_bits = SEM_SET << SEM_RT_IDX_SHIFT;
532 		break;
533 	case SEM_PROC_REG_MASK:
534 		sem_bits = SEM_SET << SEM_PROC_REG_SHIFT;
535 		break;
536 	default:
537 		cmn_err(CE_WARN, "Bad Semaphore mask!.");
538 		return (DDI_FAILURE);
539 	}
540 
541 	ql_write_reg(qlge, REG_SEMAPHORE, sem_bits | sem_mask);
542 	return (!(ql_read_reg(qlge, REG_SEMAPHORE) & sem_bits));
543 }
544 
545 /*
546  * Lock a specific bit of Semaphore register to gain
547  * access to a particular shared register
548  */
549 int
550 ql_sem_spinlock(qlge_t *qlge, uint32_t sem_mask)
551 {
552 	unsigned int wait_count = 30;
553 
554 	while (wait_count) {
555 		if (!ql_sem_trylock(qlge, sem_mask))
556 			return (DDI_SUCCESS);
557 		qlge_delay(100);
558 		wait_count--;
559 	}
560 	cmn_err(CE_WARN, "%s(%d) sem_mask 0x%x lock timeout ",
561 	    __func__, qlge->instance, sem_mask);
562 	return (DDI_FAILURE);
563 }
564 
565 /*
566  * Unock a specific bit of Semaphore register to release
567  * access to a particular shared register
568  */
569 void
570 ql_sem_unlock(qlge_t *qlge, uint32_t sem_mask)
571 {
572 	ql_write_reg(qlge, REG_SEMAPHORE, sem_mask);
573 	(void) ql_read_reg(qlge, REG_SEMAPHORE);	/* flush */
574 }
575 
576 /*
577  * Get property value from configuration file.
578  *
579  * string = property string pointer.
580  *
581  * Returns:
582  * 0xFFFFFFFF = no property else property value.
583  */
584 static uint32_t
585 ql_get_prop(qlge_t *qlge, char *string)
586 {
587 	char buf[256];
588 	uint32_t data;
589 
590 	/* Get adapter instance parameter. */
591 	(void) sprintf(buf, "hba%d-%s", qlge->instance, string);
592 	data = (uint32_t)ddi_prop_get_int(DDI_DEV_T_ANY, qlge->dip, 0, buf,
593 	    (int)0xffffffff);
594 
595 	/* Adapter instance parameter found? */
596 	if (data == 0xffffffff) {
597 		/* No, get default parameter. */
598 		data = (uint32_t)ddi_prop_get_int(DDI_DEV_T_ANY, qlge->dip, 0,
599 		    string, (int)0xffffffff);
600 	}
601 
602 	return (data);
603 }
604 
605 /*
606  * Read user setting from configuration file.
607  */
608 static void
609 ql_read_conf(qlge_t *qlge)
610 {
611 	uint32_t data;
612 
613 	/* clear configuration flags */
614 	qlge->cfg_flags = 0;
615 
616 	/* Set up the default ring sizes. */
617 	qlge->tx_ring_size = NUM_TX_RING_ENTRIES;
618 	data = ql_get_prop(qlge, "tx_ring_size");
619 	/* if data is valid */
620 	if ((data != 0xffffffff) && data) {
621 		if (qlge->tx_ring_size != data) {
622 			qlge->tx_ring_size = (uint16_t)data;
623 		}
624 	}
625 
626 	qlge->rx_ring_size = NUM_RX_RING_ENTRIES;
627 	data = ql_get_prop(qlge, "rx_ring_size");
628 	/* if data is valid */
629 	if ((data != 0xffffffff) && data) {
630 		if (qlge->rx_ring_size != data) {
631 			qlge->rx_ring_size = (uint16_t)data;
632 		}
633 	}
634 
635 	qlge->tx_ring_count = 8;
636 	data = ql_get_prop(qlge, "tx_ring_count");
637 	/* if data is valid */
638 	if ((data != 0xffffffff) && data) {
639 		if (qlge->tx_ring_count != data) {
640 			qlge->tx_ring_count = (uint16_t)data;
641 		}
642 	}
643 
644 	qlge->rss_ring_count = 8;
645 	data = ql_get_prop(qlge, "rss_ring_count");
646 	/* if data is valid */
647 	if ((data != 0xffffffff) && data) {
648 		if (qlge->rss_ring_count != data) {
649 			qlge->rss_ring_count = (uint16_t)data;
650 		}
651 	}
652 
653 	/* Get default rx_copy enable/disable. */
654 	if ((data = ql_get_prop(qlge, "force-rx-copy")) == 0xffffffff ||
655 	    data == 0) {
656 		qlge->rx_copy = B_FALSE;
657 		QL_PRINT(DBG_INIT, ("rx copy mode disabled\n"));
658 	} else if (data == 1) {
659 		qlge->rx_copy = B_TRUE;
660 		QL_PRINT(DBG_INIT, ("rx copy mode enabled\n"));
661 	}
662 
663 	qlge->rx_copy_threshold = qlge->rx_ring_size / 4;
664 	data = ql_get_prop(qlge, "rx_copy_threshold");
665 	if ((data != 0xffffffff) && (data != 0)) {
666 		qlge->rx_copy_threshold = data;
667 		cmn_err(CE_NOTE, "!new rx_copy_threshold %d \n",
668 		    qlge->rx_copy_threshold);
669 	}
670 
671 	/* Get mtu packet size. */
672 	data = ql_get_prop(qlge, "mtu");
673 	if ((data == ETHERMTU) || (data == JUMBO_MTU)) {
674 		if (qlge->mtu != data) {
675 			qlge->mtu = data;
676 			cmn_err(CE_NOTE, "new mtu is %d\n", qlge->mtu);
677 		}
678 	}
679 
680 	if (qlge->mtu == JUMBO_MTU) {
681 		qlge->rx_coalesce_usecs = DFLT_RX_COALESCE_WAIT_JUMBO;
682 		qlge->tx_coalesce_usecs = DFLT_TX_COALESCE_WAIT_JUMBO;
683 		qlge->rx_max_coalesced_frames = DFLT_RX_INTER_FRAME_WAIT_JUMBO;
684 		qlge->tx_max_coalesced_frames = DFLT_TX_INTER_FRAME_WAIT_JUMBO;
685 	}
686 
687 
688 	/* Get pause mode, default is Per Priority mode. */
689 	qlge->pause = PAUSE_MODE_PER_PRIORITY;
690 	data = ql_get_prop(qlge, "pause");
691 	if (data <= PAUSE_MODE_PER_PRIORITY) {
692 		if (qlge->pause != data) {
693 			qlge->pause = data;
694 			cmn_err(CE_NOTE, "new pause mode %d\n", qlge->pause);
695 		}
696 	}
697 	/* Receive interrupt delay */
698 	qlge->rx_coalesce_usecs = DFLT_RX_COALESCE_WAIT;
699 	data = ql_get_prop(qlge, "rx_intr_delay");
700 	/* if data is valid */
701 	if ((data != 0xffffffff) && data) {
702 		if (qlge->rx_coalesce_usecs != data) {
703 			qlge->rx_coalesce_usecs = (uint16_t)data;
704 		}
705 	}
706 	/* Rx inter-packet delay. */
707 	qlge->rx_max_coalesced_frames = DFLT_RX_INTER_FRAME_WAIT;
708 	data = ql_get_prop(qlge, "rx_ipkt_delay");
709 	/* if data is valid */
710 	if ((data != 0xffffffff) && data) {
711 		if (qlge->rx_max_coalesced_frames != data) {
712 			qlge->rx_max_coalesced_frames = (uint16_t)data;
713 		}
714 	}
715 	/* Transmit interrupt delay */
716 	qlge->tx_coalesce_usecs = DFLT_TX_COALESCE_WAIT;
717 	data = ql_get_prop(qlge, "tx_intr_delay");
718 	/* if data is valid */
719 	if ((data != 0xffffffff) && data) {
720 		if (qlge->tx_coalesce_usecs != data) {
721 			qlge->tx_coalesce_usecs = (uint16_t)data;
722 		}
723 	}
724 	/* Tx inter-packet delay. */
725 	qlge->tx_max_coalesced_frames = DFLT_TX_INTER_FRAME_WAIT;
726 	data = ql_get_prop(qlge, "tx_ipkt_delay");
727 	/* if data is valid */
728 	if ((data != 0xffffffff) && data) {
729 		if (qlge->tx_max_coalesced_frames != data) {
730 			qlge->tx_max_coalesced_frames = (uint16_t)data;
731 		}
732 	}
733 
734 	/* Get split header payload_copy_thresh. */
735 	qlge->payload_copy_thresh = DFLT_PAYLOAD_COPY_THRESH;
736 	data = ql_get_prop(qlge, "payload_copy_thresh");
737 	/* if data is valid */
738 	if ((data != 0xffffffff) && (data != 0)) {
739 		if (qlge->payload_copy_thresh != data) {
740 			qlge->payload_copy_thresh = data;
741 		}
742 	}
743 
744 	/* large send offload (LSO) capability. */
745 	qlge->lso_enable = 1;
746 	data = ql_get_prop(qlge, "lso_enable");
747 	/* if data is valid */
748 	if ((data == 0) || (data == 1)) {
749 		if (qlge->lso_enable != data) {
750 			qlge->lso_enable = (uint16_t)data;
751 		}
752 	}
753 
754 	/* dcbx capability. */
755 	qlge->dcbx_enable = 1;
756 	data = ql_get_prop(qlge, "dcbx_enable");
757 	/* if data is valid */
758 	if ((data == 0) || (data == 1)) {
759 		if (qlge->dcbx_enable != data) {
760 			qlge->dcbx_enable = (uint16_t)data;
761 		}
762 	}
763 	/* fault management enable */
764 	qlge->fm_enable = B_TRUE;
765 	data = ql_get_prop(qlge, "fm-enable");
766 	if ((data == 0x1) || (data == 0)) {
767 		qlge->fm_enable = (boolean_t)data;
768 	}
769 
770 }
771 
772 /*
773  * Enable global interrupt
774  */
775 static void
776 ql_enable_global_interrupt(qlge_t *qlge)
777 {
778 	ql_write_reg(qlge, REG_INTERRUPT_ENABLE,
779 	    (INTR_EN_EI << 16) | INTR_EN_EI);
780 	qlge->flags |= INTERRUPTS_ENABLED;
781 }
782 
783 /*
784  * Disable global interrupt
785  */
786 static void
787 ql_disable_global_interrupt(qlge_t *qlge)
788 {
789 	ql_write_reg(qlge, REG_INTERRUPT_ENABLE, (INTR_EN_EI << 16));
790 	qlge->flags &= ~INTERRUPTS_ENABLED;
791 }
792 
793 /*
794  * Enable one ring interrupt
795  */
796 void
797 ql_enable_completion_interrupt(qlge_t *qlge, uint32_t intr)
798 {
799 	struct intr_ctx *ctx = qlge->intr_ctx + intr;
800 
801 	QL_PRINT(DBG_INTR, ("%s(%d): To enable intr %d, irq_cnt %d \n",
802 	    __func__, qlge->instance, intr, ctx->irq_cnt));
803 
804 	if ((qlge->intr_type == DDI_INTR_TYPE_MSIX) && intr) {
805 		/*
806 		 * Always enable if we're MSIX multi interrupts and
807 		 * it's not the default (zeroeth) interrupt.
808 		 */
809 		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_en_mask);
810 		return;
811 	}
812 
813 	if (!atomic_dec_32_nv(&ctx->irq_cnt)) {
814 		mutex_enter(&qlge->hw_mutex);
815 		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_en_mask);
816 		mutex_exit(&qlge->hw_mutex);
817 		QL_PRINT(DBG_INTR,
818 		    ("%s(%d): write %x to intr enable register \n",
819 		    __func__, qlge->instance, ctx->intr_en_mask));
820 	}
821 }
822 
823 /*
824  * ql_forced_disable_completion_interrupt
825  * Used by call from OS, may be called without
826  * a pending interrupt so force the disable
827  */
828 uint32_t
829 ql_forced_disable_completion_interrupt(qlge_t *qlge, uint32_t intr)
830 {
831 	uint32_t var = 0;
832 	struct intr_ctx *ctx = qlge->intr_ctx + intr;
833 
834 	QL_PRINT(DBG_INTR, ("%s(%d): To disable intr %d, irq_cnt %d \n",
835 	    __func__, qlge->instance, intr, ctx->irq_cnt));
836 
837 	if ((qlge->intr_type == DDI_INTR_TYPE_MSIX) && intr) {
838 		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_dis_mask);
839 		var = ql_read_reg(qlge, REG_STATUS);
840 		return (var);
841 	}
842 
843 	mutex_enter(&qlge->hw_mutex);
844 	ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_dis_mask);
845 	var = ql_read_reg(qlge, REG_STATUS);
846 	mutex_exit(&qlge->hw_mutex);
847 
848 	return (var);
849 }
850 
851 /*
852  * Disable a completion interrupt
853  */
854 void
855 ql_disable_completion_interrupt(qlge_t *qlge, uint32_t intr)
856 {
857 	struct intr_ctx *ctx;
858 
859 	ctx = qlge->intr_ctx + intr;
860 	QL_PRINT(DBG_INTR, ("%s(%d): To disable intr %d, irq_cnt %d \n",
861 	    __func__, qlge->instance, intr, ctx->irq_cnt));
862 	/*
863 	 * HW disables for us if we're MSIX multi interrupts and
864 	 * it's not the default (zeroeth) interrupt.
865 	 */
866 	if ((qlge->intr_type == DDI_INTR_TYPE_MSIX) && (intr != 0))
867 		return;
868 
869 	if (ql_atomic_read_32(&ctx->irq_cnt) == 0) {
870 		mutex_enter(&qlge->hw_mutex);
871 		ql_write_reg(qlge, REG_INTERRUPT_ENABLE, ctx->intr_dis_mask);
872 		mutex_exit(&qlge->hw_mutex);
873 	}
874 	atomic_inc_32(&ctx->irq_cnt);
875 }
876 
877 /*
878  * Enable all completion interrupts
879  */
880 static void
881 ql_enable_all_completion_interrupts(qlge_t *qlge)
882 {
883 	int i;
884 	uint32_t value = 1;
885 
886 	for (i = 0; i < qlge->intr_cnt; i++) {
887 		/*
888 		 * Set the count to 1 for Legacy / MSI interrupts or for the
889 		 * default interrupt (0)
890 		 */
891 		if ((qlge->intr_type != DDI_INTR_TYPE_MSIX) || i == 0) {
892 			ql_atomic_set_32(&qlge->intr_ctx[i].irq_cnt, value);
893 		}
894 		ql_enable_completion_interrupt(qlge, i);
895 	}
896 }
897 
898 /*
899  * Disable all completion interrupts
900  */
901 static void
902 ql_disable_all_completion_interrupts(qlge_t *qlge)
903 {
904 	int i;
905 	uint32_t value = 0;
906 
907 	for (i = 0; i < qlge->intr_cnt; i++) {
908 
909 		/*
910 		 * Set the count to 0 for Legacy / MSI interrupts or for the
911 		 * default interrupt (0)
912 		 */
913 		if ((qlge->intr_type != DDI_INTR_TYPE_MSIX) || i == 0)
914 			ql_atomic_set_32(&qlge->intr_ctx[i].irq_cnt, value);
915 
916 		ql_disable_completion_interrupt(qlge, i);
917 	}
918 }
919 
920 /*
921  * Update small buffer queue producer index
922  */
923 static void
924 ql_update_sbq_prod_idx(qlge_t *qlge, struct rx_ring *rx_ring)
925 {
926 	/* Update the buffer producer index */
927 	QL_PRINT(DBG_RX, ("sbq: updating prod idx = %d.\n",
928 	    rx_ring->sbq_prod_idx));
929 	ql_write_doorbell_reg(qlge, rx_ring->sbq_prod_idx_db_reg,
930 	    rx_ring->sbq_prod_idx);
931 }
932 
933 /*
934  * Update large buffer queue producer index
935  */
936 static void
937 ql_update_lbq_prod_idx(qlge_t *qlge, struct rx_ring *rx_ring)
938 {
939 	/* Update the buffer producer index */
940 	QL_PRINT(DBG_RX, ("lbq: updating prod idx = %d.\n",
941 	    rx_ring->lbq_prod_idx));
942 	ql_write_doorbell_reg(qlge, rx_ring->lbq_prod_idx_db_reg,
943 	    rx_ring->lbq_prod_idx);
944 }
945 
946 /*
947  * Adds a small buffer descriptor to end of its in use list,
948  * assumes sbq_lock is already taken
949  */
950 static void
951 ql_add_sbuf_to_in_use_list(struct rx_ring *rx_ring,
952     struct bq_desc *sbq_desc)
953 {
954 	uint32_t inuse_idx = rx_ring->sbq_use_tail;
955 
956 	rx_ring->sbuf_in_use[inuse_idx] = sbq_desc;
957 	inuse_idx++;
958 	if (inuse_idx >= rx_ring->sbq_len)
959 		inuse_idx = 0;
960 	rx_ring->sbq_use_tail = inuse_idx;
961 	atomic_inc_32(&rx_ring->sbuf_in_use_count);
962 	ASSERT(rx_ring->sbuf_in_use_count <= rx_ring->sbq_len);
963 }
964 
965 /*
966  * Get a small buffer descriptor from its in use list
967  */
968 static struct bq_desc *
969 ql_get_sbuf_from_in_use_list(struct rx_ring *rx_ring)
970 {
971 	struct bq_desc *sbq_desc = NULL;
972 	uint32_t inuse_idx;
973 
974 	/* Pick from head of in use list */
975 	inuse_idx = rx_ring->sbq_use_head;
976 	sbq_desc = rx_ring->sbuf_in_use[inuse_idx];
977 	rx_ring->sbuf_in_use[inuse_idx] = NULL;
978 
979 	if (sbq_desc != NULL) {
980 		inuse_idx++;
981 		if (inuse_idx >= rx_ring->sbq_len)
982 			inuse_idx = 0;
983 		rx_ring->sbq_use_head = inuse_idx;
984 		atomic_dec_32(&rx_ring->sbuf_in_use_count);
985 		atomic_inc_32(&rx_ring->rx_indicate);
986 		sbq_desc->upl_inuse = 1;
987 		/* if mp is NULL */
988 		if (sbq_desc->mp == NULL) {
989 			/* try to remap mp again */
990 			sbq_desc->mp =
991 			    desballoc((unsigned char *)(sbq_desc->bd_dma.vaddr),
992 			    rx_ring->sbq_buf_size, 0, &sbq_desc->rx_recycle);
993 		}
994 	}
995 
996 	return (sbq_desc);
997 }
998 
999 /*
1000  * Add a small buffer descriptor to its free list
1001  */
1002 static void
1003 ql_add_sbuf_to_free_list(struct rx_ring *rx_ring,
1004     struct bq_desc *sbq_desc)
1005 {
1006 	uint32_t free_idx;
1007 
1008 	/* Add to the end of free list */
1009 	free_idx = rx_ring->sbq_free_tail;
1010 	rx_ring->sbuf_free[free_idx] = sbq_desc;
1011 	ASSERT(rx_ring->sbuf_free_count <= rx_ring->sbq_len);
1012 	free_idx++;
1013 	if (free_idx >= rx_ring->sbq_len)
1014 		free_idx = 0;
1015 	rx_ring->sbq_free_tail = free_idx;
1016 	atomic_inc_32(&rx_ring->sbuf_free_count);
1017 }
1018 
1019 /*
1020  * Get a small buffer descriptor from its free list
1021  */
1022 static struct bq_desc *
1023 ql_get_sbuf_from_free_list(struct rx_ring *rx_ring)
1024 {
1025 	struct bq_desc *sbq_desc;
1026 	uint32_t free_idx;
1027 
1028 	free_idx = rx_ring->sbq_free_head;
1029 	/* Pick from top of free list */
1030 	sbq_desc = rx_ring->sbuf_free[free_idx];
1031 	rx_ring->sbuf_free[free_idx] = NULL;
1032 	if (sbq_desc != NULL) {
1033 		free_idx++;
1034 		if (free_idx >= rx_ring->sbq_len)
1035 			free_idx = 0;
1036 		rx_ring->sbq_free_head = free_idx;
1037 		atomic_dec_32(&rx_ring->sbuf_free_count);
1038 	}
1039 	return (sbq_desc);
1040 }
1041 
1042 /*
1043  * Add a large buffer descriptor to its in use list
1044  */
1045 static void
1046 ql_add_lbuf_to_in_use_list(struct rx_ring *rx_ring,
1047     struct bq_desc *lbq_desc)
1048 {
1049 	uint32_t inuse_idx;
1050 
1051 	inuse_idx = rx_ring->lbq_use_tail;
1052 
1053 	rx_ring->lbuf_in_use[inuse_idx] = lbq_desc;
1054 	inuse_idx++;
1055 	if (inuse_idx >= rx_ring->lbq_len)
1056 		inuse_idx = 0;
1057 	rx_ring->lbq_use_tail = inuse_idx;
1058 	atomic_inc_32(&rx_ring->lbuf_in_use_count);
1059 }
1060 
1061 /*
1062  * Get a large buffer descriptor from in use list
1063  */
1064 static struct bq_desc *
1065 ql_get_lbuf_from_in_use_list(struct rx_ring *rx_ring)
1066 {
1067 	struct bq_desc *lbq_desc;
1068 	uint32_t inuse_idx;
1069 
1070 	/* Pick from head of in use list */
1071 	inuse_idx = rx_ring->lbq_use_head;
1072 	lbq_desc = rx_ring->lbuf_in_use[inuse_idx];
1073 	rx_ring->lbuf_in_use[inuse_idx] = NULL;
1074 
1075 	if (lbq_desc != NULL) {
1076 		inuse_idx++;
1077 		if (inuse_idx >= rx_ring->lbq_len)
1078 			inuse_idx = 0;
1079 		rx_ring->lbq_use_head = inuse_idx;
1080 		atomic_dec_32(&rx_ring->lbuf_in_use_count);
1081 		atomic_inc_32(&rx_ring->rx_indicate);
1082 		lbq_desc->upl_inuse = 1;
1083 
1084 		/* if mp is NULL */
1085 		if (lbq_desc->mp == NULL) {
1086 			/* try to remap mp again */
1087 			lbq_desc->mp =
1088 			    desballoc((unsigned char *)(lbq_desc->bd_dma.vaddr),
1089 			    rx_ring->lbq_buf_size, 0, &lbq_desc->rx_recycle);
1090 		}
1091 	}
1092 	return (lbq_desc);
1093 }
1094 
1095 /*
1096  * Add a large buffer descriptor to free list
1097  */
1098 static void
1099 ql_add_lbuf_to_free_list(struct rx_ring *rx_ring,
1100     struct bq_desc *lbq_desc)
1101 {
1102 	uint32_t free_idx;
1103 
1104 	/* Add to the end of free list */
1105 	free_idx = rx_ring->lbq_free_tail;
1106 	rx_ring->lbuf_free[free_idx] = lbq_desc;
1107 	free_idx++;
1108 	if (free_idx >= rx_ring->lbq_len)
1109 		free_idx = 0;
1110 	rx_ring->lbq_free_tail = free_idx;
1111 	atomic_inc_32(&rx_ring->lbuf_free_count);
1112 	ASSERT(rx_ring->lbuf_free_count <= rx_ring->lbq_len);
1113 }
1114 
1115 /*
1116  * Get a large buffer descriptor from its free list
1117  */
1118 static struct bq_desc *
1119 ql_get_lbuf_from_free_list(struct rx_ring *rx_ring)
1120 {
1121 	struct bq_desc *lbq_desc;
1122 	uint32_t free_idx;
1123 
1124 	free_idx = rx_ring->lbq_free_head;
1125 	/* Pick from head of free list */
1126 	lbq_desc = rx_ring->lbuf_free[free_idx];
1127 	rx_ring->lbuf_free[free_idx] = NULL;
1128 
1129 	if (lbq_desc != NULL) {
1130 		free_idx++;
1131 		if (free_idx >= rx_ring->lbq_len)
1132 			free_idx = 0;
1133 		rx_ring->lbq_free_head = free_idx;
1134 		atomic_dec_32(&rx_ring->lbuf_free_count);
1135 	}
1136 	return (lbq_desc);
1137 }
1138 
1139 /*
1140  * Add a small buffer descriptor to free list
1141  */
1142 static void
1143 ql_refill_sbuf_free_list(struct bq_desc *sbq_desc, boolean_t alloc_memory)
1144 {
1145 	struct rx_ring *rx_ring = sbq_desc->rx_ring;
1146 	uint64_t *sbq_entry;
1147 	qlge_t *qlge = (qlge_t *)rx_ring->qlge;
1148 	/*
1149 	 * Sync access
1150 	 */
1151 	mutex_enter(&rx_ring->sbq_lock);
1152 
1153 	sbq_desc->upl_inuse = 0;
1154 
1155 	/*
1156 	 * If we are freeing the buffers as a result of adapter unload, get out
1157 	 */
1158 	if ((sbq_desc->free_buf != NULL) ||
1159 	    (qlge->mac_flags == QL_MAC_DETACH)) {
1160 		if (sbq_desc->free_buf == NULL)
1161 			atomic_dec_32(&rx_ring->rx_indicate);
1162 		mutex_exit(&rx_ring->sbq_lock);
1163 		return;
1164 	}
1165 #ifdef QLGE_LOAD_UNLOAD
1166 	if (rx_ring->rx_indicate == 0)
1167 		cmn_err(CE_WARN, "sbq: indicate wrong");
1168 #endif
1169 #ifdef QLGE_TRACK_BUFFER_USAGE
1170 	uint32_t sb_consumer_idx;
1171 	uint32_t sb_producer_idx;
1172 	uint32_t num_free_buffers;
1173 	uint32_t temp;
1174 
1175 	temp = ql_read_doorbell_reg(qlge, rx_ring->sbq_prod_idx_db_reg);
1176 	sb_producer_idx = temp & 0x0000ffff;
1177 	sb_consumer_idx = (temp >> 16);
1178 
1179 	if (sb_consumer_idx > sb_producer_idx)
1180 		num_free_buffers = NUM_SMALL_BUFFERS -
1181 		    (sb_consumer_idx - sb_producer_idx);
1182 	else
1183 		num_free_buffers = sb_producer_idx - sb_consumer_idx;
1184 
1185 	if (num_free_buffers < qlge->rx_sb_low_count[rx_ring->cq_id])
1186 		qlge->rx_sb_low_count[rx_ring->cq_id] = num_free_buffers;
1187 
1188 #endif
1189 
1190 #ifdef QLGE_LOAD_UNLOAD
1191 	if (rx_ring->rx_indicate > 0xFF000000)
1192 		cmn_err(CE_WARN, "sbq: indicate(%d) wrong: %d mac_flags %d,"
1193 		    " sbq_desc index %d.",
1194 		    rx_ring->cq_id, rx_ring->rx_indicate, rx_ring->mac_flags,
1195 		    sbq_desc->index);
1196 #endif
1197 	if (alloc_memory) {
1198 		sbq_desc->mp =
1199 		    desballoc((unsigned char *)(sbq_desc->bd_dma.vaddr),
1200 		    rx_ring->sbq_buf_size, 0, &sbq_desc->rx_recycle);
1201 		if (sbq_desc->mp == NULL) {
1202 			rx_ring->rx_failed_sbq_allocs++;
1203 		}
1204 	}
1205 
1206 	/* Got the packet from the stack decrement rx_indicate count */
1207 	atomic_dec_32(&rx_ring->rx_indicate);
1208 
1209 	ql_add_sbuf_to_free_list(rx_ring, sbq_desc);
1210 
1211 	/* Rearm if possible */
1212 	if ((rx_ring->sbuf_free_count >= MIN_BUFFERS_FREE_COUNT) &&
1213 	    (qlge->mac_flags == QL_MAC_STARTED)) {
1214 		sbq_entry = rx_ring->sbq_dma.vaddr;
1215 		sbq_entry += rx_ring->sbq_prod_idx;
1216 
1217 		while (rx_ring->sbuf_free_count > MIN_BUFFERS_ARM_COUNT) {
1218 			/* Get first one from free list */
1219 			sbq_desc = ql_get_sbuf_from_free_list(rx_ring);
1220 
1221 			*sbq_entry = cpu_to_le64(sbq_desc->bd_dma.dma_addr);
1222 			sbq_entry++;
1223 			rx_ring->sbq_prod_idx++;
1224 			if (rx_ring->sbq_prod_idx >= rx_ring->sbq_len) {
1225 				rx_ring->sbq_prod_idx = 0;
1226 				sbq_entry = rx_ring->sbq_dma.vaddr;
1227 			}
1228 			/* Add to end of in use list */
1229 			ql_add_sbuf_to_in_use_list(rx_ring, sbq_desc);
1230 		}
1231 
1232 		/* Update small buffer queue producer index */
1233 		ql_update_sbq_prod_idx(qlge, rx_ring);
1234 	}
1235 
1236 	mutex_exit(&rx_ring->sbq_lock);
1237 	QL_PRINT(DBG_RX_RING, ("%s(%d) exited, sbuf_free_count %d\n",
1238 	    __func__, qlge->instance, rx_ring->sbuf_free_count));
1239 }
1240 
1241 /*
1242  * rx recycle call back function
1243  */
1244 static void
1245 ql_release_to_sbuf_free_list(caddr_t p)
1246 {
1247 	struct bq_desc *sbq_desc = (struct bq_desc *)(void *)p;
1248 
1249 	if (sbq_desc == NULL)
1250 		return;
1251 	ql_refill_sbuf_free_list(sbq_desc, B_TRUE);
1252 }
1253 
1254 /*
1255  * Add a large buffer descriptor to free list
1256  */
1257 static void
1258 ql_refill_lbuf_free_list(struct bq_desc *lbq_desc, boolean_t alloc_memory)
1259 {
1260 	struct rx_ring *rx_ring = lbq_desc->rx_ring;
1261 	uint64_t *lbq_entry;
1262 	qlge_t *qlge = rx_ring->qlge;
1263 
1264 	/* Sync access */
1265 	mutex_enter(&rx_ring->lbq_lock);
1266 
1267 	lbq_desc->upl_inuse = 0;
1268 	/*
1269 	 * If we are freeing the buffers as a result of adapter unload, get out
1270 	 */
1271 	if ((lbq_desc->free_buf != NULL) ||
1272 	    (qlge->mac_flags == QL_MAC_DETACH)) {
1273 		if (lbq_desc->free_buf == NULL)
1274 			atomic_dec_32(&rx_ring->rx_indicate);
1275 		mutex_exit(&rx_ring->lbq_lock);
1276 		return;
1277 	}
1278 #ifdef QLGE_LOAD_UNLOAD
1279 	if (rx_ring->rx_indicate == 0)
1280 		cmn_err(CE_WARN, "lbq: indicate wrong");
1281 #endif
1282 #ifdef QLGE_TRACK_BUFFER_USAGE
1283 	uint32_t lb_consumer_idx;
1284 	uint32_t lb_producer_idx;
1285 	uint32_t num_free_buffers;
1286 	uint32_t temp;
1287 
1288 	temp = ql_read_doorbell_reg(qlge, rx_ring->lbq_prod_idx_db_reg);
1289 
1290 	lb_producer_idx = temp & 0x0000ffff;
1291 	lb_consumer_idx = (temp >> 16);
1292 
1293 	if (lb_consumer_idx > lb_producer_idx)
1294 		num_free_buffers = NUM_LARGE_BUFFERS -
1295 		    (lb_consumer_idx - lb_producer_idx);
1296 	else
1297 		num_free_buffers = lb_producer_idx - lb_consumer_idx;
1298 
1299 	if (num_free_buffers < qlge->rx_lb_low_count[rx_ring->cq_id]) {
1300 		qlge->rx_lb_low_count[rx_ring->cq_id] = num_free_buffers;
1301 	}
1302 #endif
1303 
1304 #ifdef QLGE_LOAD_UNLOAD
1305 	if (rx_ring->rx_indicate > 0xFF000000)
1306 		cmn_err(CE_WARN, "lbq: indicate(%d) wrong: %d mac_flags %d,"
1307 		    "lbq_desc index %d",
1308 		    rx_ring->cq_id, rx_ring->rx_indicate, rx_ring->mac_flags,
1309 		    lbq_desc->index);
1310 #endif
1311 	if (alloc_memory) {
1312 		lbq_desc->mp =
1313 		    desballoc((unsigned char *)(lbq_desc->bd_dma.vaddr),
1314 		    rx_ring->lbq_buf_size, 0, &lbq_desc->rx_recycle);
1315 		if (lbq_desc->mp == NULL) {
1316 			rx_ring->rx_failed_lbq_allocs++;
1317 		}
1318 	}
1319 
1320 	/* Got the packet from the stack decrement rx_indicate count */
1321 	atomic_dec_32(&rx_ring->rx_indicate);
1322 
1323 	ql_add_lbuf_to_free_list(rx_ring, lbq_desc);
1324 
1325 	/* Rearm if possible */
1326 	if ((rx_ring->lbuf_free_count >= MIN_BUFFERS_FREE_COUNT) &&
1327 	    (qlge->mac_flags == QL_MAC_STARTED)) {
1328 		lbq_entry = rx_ring->lbq_dma.vaddr;
1329 		lbq_entry += rx_ring->lbq_prod_idx;
1330 		while (rx_ring->lbuf_free_count > MIN_BUFFERS_ARM_COUNT) {
1331 			/* Get first one from free list */
1332 			lbq_desc = ql_get_lbuf_from_free_list(rx_ring);
1333 
1334 			*lbq_entry = cpu_to_le64(lbq_desc->bd_dma.dma_addr);
1335 			lbq_entry++;
1336 			rx_ring->lbq_prod_idx++;
1337 			if (rx_ring->lbq_prod_idx >= rx_ring->lbq_len) {
1338 				rx_ring->lbq_prod_idx = 0;
1339 				lbq_entry = rx_ring->lbq_dma.vaddr;
1340 			}
1341 
1342 			/* Add to end of in use list */
1343 			ql_add_lbuf_to_in_use_list(rx_ring, lbq_desc);
1344 		}
1345 
1346 		/* Update large buffer queue producer index */
1347 		ql_update_lbq_prod_idx(rx_ring->qlge, rx_ring);
1348 	}
1349 
1350 	mutex_exit(&rx_ring->lbq_lock);
1351 	QL_PRINT(DBG_RX_RING, ("%s exitd, lbuf_free_count %d\n",
1352 	    __func__, rx_ring->lbuf_free_count));
1353 }
1354 /*
1355  * rx recycle call back function
1356  */
1357 static void
1358 ql_release_to_lbuf_free_list(caddr_t p)
1359 {
1360 	struct bq_desc *lbq_desc = (struct bq_desc *)(void *)p;
1361 
1362 	if (lbq_desc == NULL)
1363 		return;
1364 	ql_refill_lbuf_free_list(lbq_desc, B_TRUE);
1365 }
1366 
1367 /*
1368  * free small buffer queue buffers
1369  */
1370 static void
1371 ql_free_sbq_buffers(struct rx_ring *rx_ring)
1372 {
1373 	struct bq_desc *sbq_desc;
1374 	uint32_t i;
1375 	uint32_t j = rx_ring->sbq_free_head;
1376 	int  force_cnt = 0;
1377 
1378 	for (i = 0; i < rx_ring->sbuf_free_count; i++) {
1379 		sbq_desc = rx_ring->sbuf_free[j];
1380 		sbq_desc->free_buf = 1;
1381 		j++;
1382 		if (j >= rx_ring->sbq_len) {
1383 			j = 0;
1384 		}
1385 		if (sbq_desc->mp != NULL) {
1386 			freemsg(sbq_desc->mp);
1387 			sbq_desc->mp = NULL;
1388 		}
1389 	}
1390 	rx_ring->sbuf_free_count = 0;
1391 
1392 	j = rx_ring->sbq_use_head;
1393 	for (i = 0; i < rx_ring->sbuf_in_use_count; i++) {
1394 		sbq_desc = rx_ring->sbuf_in_use[j];
1395 		sbq_desc->free_buf = 1;
1396 		j++;
1397 		if (j >= rx_ring->sbq_len) {
1398 			j = 0;
1399 		}
1400 		if (sbq_desc->mp != NULL) {
1401 			freemsg(sbq_desc->mp);
1402 			sbq_desc->mp = NULL;
1403 		}
1404 	}
1405 	rx_ring->sbuf_in_use_count = 0;
1406 
1407 	sbq_desc = &rx_ring->sbq_desc[0];
1408 	for (i = 0; i < rx_ring->sbq_len; i++, sbq_desc++) {
1409 		/*
1410 		 * Set flag so that the callback does not allocate a new buffer
1411 		 */
1412 		sbq_desc->free_buf = 1;
1413 		if (sbq_desc->upl_inuse != 0) {
1414 			force_cnt++;
1415 		}
1416 		if (sbq_desc->bd_dma.dma_handle != NULL) {
1417 			ql_free_phys(&sbq_desc->bd_dma.dma_handle,
1418 			    &sbq_desc->bd_dma.acc_handle);
1419 			sbq_desc->bd_dma.dma_handle = NULL;
1420 			sbq_desc->bd_dma.acc_handle = NULL;
1421 		}
1422 	}
1423 #ifdef QLGE_LOAD_UNLOAD
1424 	cmn_err(CE_NOTE, "sbq: free %d inuse %d force %d\n",
1425 	    rx_ring->sbuf_free_count, rx_ring->sbuf_in_use_count, force_cnt);
1426 #endif
1427 	if (rx_ring->sbuf_in_use != NULL) {
1428 		kmem_free(rx_ring->sbuf_in_use, (rx_ring->sbq_len *
1429 		    sizeof (struct bq_desc *)));
1430 		rx_ring->sbuf_in_use = NULL;
1431 	}
1432 
1433 	if (rx_ring->sbuf_free != NULL) {
1434 		kmem_free(rx_ring->sbuf_free, (rx_ring->sbq_len *
1435 		    sizeof (struct bq_desc *)));
1436 		rx_ring->sbuf_free = NULL;
1437 	}
1438 }
1439 
1440 /* Allocate small buffers */
1441 static int
1442 ql_alloc_sbufs(qlge_t *qlge, struct rx_ring *rx_ring)
1443 {
1444 	struct bq_desc *sbq_desc;
1445 	int i;
1446 	ddi_dma_cookie_t dma_cookie;
1447 
1448 	rx_ring->sbq_use_head = 0;
1449 	rx_ring->sbq_use_tail = 0;
1450 	rx_ring->sbuf_in_use_count = 0;
1451 	rx_ring->sbq_free_head = 0;
1452 	rx_ring->sbq_free_tail = 0;
1453 	rx_ring->sbuf_free_count = 0;
1454 	rx_ring->sbuf_free = kmem_zalloc(rx_ring->sbq_len *
1455 	    sizeof (struct bq_desc *), KM_NOSLEEP);
1456 	if (rx_ring->sbuf_free == NULL) {
1457 		cmn_err(CE_WARN,
1458 		    "!%s: sbuf_free_list alloc: failed",
1459 		    __func__);
1460 		goto alloc_sbuf_err;
1461 	}
1462 
1463 	rx_ring->sbuf_in_use = kmem_zalloc(rx_ring->sbq_len *
1464 	    sizeof (struct bq_desc *), KM_NOSLEEP);
1465 	if (rx_ring->sbuf_in_use == NULL) {
1466 		cmn_err(CE_WARN,
1467 		    "!%s: sbuf_inuse_list alloc: failed",
1468 		    __func__);
1469 		goto alloc_sbuf_err;
1470 	}
1471 
1472 	sbq_desc = &rx_ring->sbq_desc[0];
1473 
1474 	for (i = 0; i < rx_ring->sbq_len; i++, sbq_desc++) {
1475 		/* Allocate buffer */
1476 		if (ql_alloc_phys_rbuf(qlge->dip, &sbq_desc->bd_dma.dma_handle,
1477 		    &ql_buf_acc_attr,
1478 		    DDI_DMA_READ | DDI_DMA_STREAMING,
1479 		    &sbq_desc->bd_dma.acc_handle,
1480 		    (size_t)rx_ring->sbq_buf_size,	/* mem size */
1481 		    (size_t)0,				/* default alignment */
1482 		    (caddr_t *)&sbq_desc->bd_dma.vaddr,
1483 		    &dma_cookie) != 0) {
1484 			cmn_err(CE_WARN,
1485 			    "!%s: ddi_dma_alloc_handle: failed",
1486 			    __func__);
1487 			goto alloc_sbuf_err;
1488 		}
1489 
1490 		/* Set context for Return buffer callback */
1491 		sbq_desc->bd_dma.dma_addr = dma_cookie.dmac_laddress;
1492 		sbq_desc->rx_recycle.free_func = ql_release_to_sbuf_free_list;
1493 		sbq_desc->rx_recycle.free_arg  = (caddr_t)sbq_desc;
1494 		sbq_desc->rx_ring = rx_ring;
1495 		sbq_desc->upl_inuse = 0;
1496 		sbq_desc->free_buf = 0;
1497 
1498 		sbq_desc->mp =
1499 		    desballoc((unsigned char *)(sbq_desc->bd_dma.vaddr),
1500 		    rx_ring->sbq_buf_size, 0, &sbq_desc->rx_recycle);
1501 		if (sbq_desc->mp == NULL) {
1502 			cmn_err(CE_WARN, "%s: desballoc() failed", __func__);
1503 			goto alloc_sbuf_err;
1504 		}
1505 		ql_add_sbuf_to_free_list(rx_ring, sbq_desc);
1506 	}
1507 
1508 	return (DDI_SUCCESS);
1509 
1510 alloc_sbuf_err:
1511 	ql_free_sbq_buffers(rx_ring);
1512 	return (DDI_FAILURE);
1513 }
1514 
1515 static void
1516 ql_free_lbq_buffers(struct rx_ring *rx_ring)
1517 {
1518 	struct bq_desc *lbq_desc;
1519 	uint32_t i, j;
1520 	int force_cnt = 0;
1521 
1522 	j = rx_ring->lbq_free_head;
1523 	for (i = 0; i < rx_ring->lbuf_free_count; i++) {
1524 		lbq_desc = rx_ring->lbuf_free[j];
1525 		lbq_desc->free_buf = 1;
1526 		j++;
1527 		if (j >= rx_ring->lbq_len)
1528 			j = 0;
1529 		if (lbq_desc->mp != NULL) {
1530 			freemsg(lbq_desc->mp);
1531 			lbq_desc->mp = NULL;
1532 		}
1533 	}
1534 	rx_ring->lbuf_free_count = 0;
1535 
1536 	j = rx_ring->lbq_use_head;
1537 	for (i = 0; i < rx_ring->lbuf_in_use_count; i++) {
1538 		lbq_desc = rx_ring->lbuf_in_use[j];
1539 		lbq_desc->free_buf = 1;
1540 		j++;
1541 		if (j >= rx_ring->lbq_len) {
1542 			j = 0;
1543 		}
1544 		if (lbq_desc->mp != NULL) {
1545 			freemsg(lbq_desc->mp);
1546 			lbq_desc->mp = NULL;
1547 		}
1548 	}
1549 	rx_ring->lbuf_in_use_count = 0;
1550 
1551 	lbq_desc = &rx_ring->lbq_desc[0];
1552 	for (i = 0; i < rx_ring->lbq_len; i++, lbq_desc++) {
1553 		/* Set flag so that callback will not allocate a new buffer */
1554 		lbq_desc->free_buf = 1;
1555 		if (lbq_desc->upl_inuse != 0) {
1556 			force_cnt++;
1557 		}
1558 		if (lbq_desc->bd_dma.dma_handle != NULL) {
1559 			ql_free_phys(&lbq_desc->bd_dma.dma_handle,
1560 			    &lbq_desc->bd_dma.acc_handle);
1561 			lbq_desc->bd_dma.dma_handle = NULL;
1562 			lbq_desc->bd_dma.acc_handle = NULL;
1563 		}
1564 	}
1565 #ifdef QLGE_LOAD_UNLOAD
1566 	if (force_cnt) {
1567 		cmn_err(CE_WARN, "lbq: free %d inuse %d force %d",
1568 		    rx_ring->lbuf_free_count, rx_ring->lbuf_in_use_count,
1569 		    force_cnt);
1570 	}
1571 #endif
1572 	if (rx_ring->lbuf_in_use != NULL) {
1573 		kmem_free(rx_ring->lbuf_in_use, (rx_ring->lbq_len *
1574 		    sizeof (struct bq_desc *)));
1575 		rx_ring->lbuf_in_use = NULL;
1576 	}
1577 
1578 	if (rx_ring->lbuf_free != NULL) {
1579 		kmem_free(rx_ring->lbuf_free, (rx_ring->lbq_len *
1580 		    sizeof (struct bq_desc *)));
1581 		rx_ring->lbuf_free = NULL;
1582 	}
1583 }
1584 
1585 /* Allocate large buffers */
1586 static int
1587 ql_alloc_lbufs(qlge_t *qlge, struct rx_ring *rx_ring)
1588 {
1589 	struct bq_desc *lbq_desc;
1590 	ddi_dma_cookie_t dma_cookie;
1591 	int i;
1592 	uint32_t lbq_buf_size;
1593 
1594 	rx_ring->lbq_use_head = 0;
1595 	rx_ring->lbq_use_tail = 0;
1596 	rx_ring->lbuf_in_use_count = 0;
1597 	rx_ring->lbq_free_head = 0;
1598 	rx_ring->lbq_free_tail = 0;
1599 	rx_ring->lbuf_free_count = 0;
1600 	rx_ring->lbuf_free = kmem_zalloc(rx_ring->lbq_len *
1601 	    sizeof (struct bq_desc *), KM_NOSLEEP);
1602 	if (rx_ring->lbuf_free == NULL) {
1603 		cmn_err(CE_WARN,
1604 		    "!%s: lbuf_free_list alloc: failed",
1605 		    __func__);
1606 		goto alloc_lbuf_err;
1607 	}
1608 
1609 	rx_ring->lbuf_in_use = kmem_zalloc(rx_ring->lbq_len *
1610 	    sizeof (struct bq_desc *), KM_NOSLEEP);
1611 
1612 	if (rx_ring->lbuf_in_use == NULL) {
1613 		cmn_err(CE_WARN,
1614 		    "!%s: lbuf_inuse_list alloc: failed",
1615 		    __func__);
1616 		goto alloc_lbuf_err;
1617 	}
1618 
1619 	lbq_buf_size = (qlge->mtu == ETHERMTU) ?
1620 	    LRG_BUF_NORMAL_SIZE : LRG_BUF_JUMBO_SIZE;
1621 
1622 	lbq_desc = &rx_ring->lbq_desc[0];
1623 	for (i = 0; i < rx_ring->lbq_len; i++, lbq_desc++) {
1624 		rx_ring->lbq_buf_size = lbq_buf_size;
1625 		/* Allocate buffer */
1626 		if (ql_alloc_phys_rbuf(qlge->dip, &lbq_desc->bd_dma.dma_handle,
1627 		    &ql_buf_acc_attr,
1628 		    DDI_DMA_READ | DDI_DMA_STREAMING,
1629 		    &lbq_desc->bd_dma.acc_handle,
1630 		    (size_t)rx_ring->lbq_buf_size,  /* mem size */
1631 		    (size_t)0, /* default alignment */
1632 		    (caddr_t *)&lbq_desc->bd_dma.vaddr,
1633 		    &dma_cookie) != 0) {
1634 			cmn_err(CE_WARN,
1635 			    "!%s: ddi_dma_alloc_handle: failed",
1636 			    __func__);
1637 			goto alloc_lbuf_err;
1638 		}
1639 
1640 		/* Set context for Return buffer callback */
1641 		lbq_desc->bd_dma.dma_addr = dma_cookie.dmac_laddress;
1642 		lbq_desc->rx_recycle.free_func = ql_release_to_lbuf_free_list;
1643 		lbq_desc->rx_recycle.free_arg  = (caddr_t)lbq_desc;
1644 		lbq_desc->rx_ring = rx_ring;
1645 		lbq_desc->upl_inuse = 0;
1646 		lbq_desc->free_buf = 0;
1647 
1648 		lbq_desc->mp =
1649 		    desballoc((unsigned char *)(lbq_desc->bd_dma.vaddr),
1650 		    rx_ring->lbq_buf_size, 0, &lbq_desc->rx_recycle);
1651 		if (lbq_desc->mp == NULL) {
1652 			cmn_err(CE_WARN, "%s: desballoc() failed", __func__);
1653 			goto alloc_lbuf_err;
1654 		}
1655 		ql_add_lbuf_to_free_list(rx_ring, lbq_desc);
1656 	} /* For all large buffers */
1657 
1658 	return (DDI_SUCCESS);
1659 
1660 alloc_lbuf_err:
1661 	ql_free_lbq_buffers(rx_ring);
1662 	return (DDI_FAILURE);
1663 }
1664 
1665 /*
1666  * Free rx buffers
1667  */
1668 static void
1669 ql_free_rx_buffers(qlge_t *qlge)
1670 {
1671 	int i;
1672 	struct rx_ring *rx_ring;
1673 
1674 	for (i = 0; i < qlge->rx_ring_count; i++) {
1675 		rx_ring = &qlge->rx_ring[i];
1676 		if (rx_ring->type != TX_Q) {
1677 			ql_free_lbq_buffers(rx_ring);
1678 			ql_free_sbq_buffers(rx_ring);
1679 		}
1680 	}
1681 }
1682 
1683 /*
1684  * Allocate rx buffers
1685  */
1686 static int
1687 ql_alloc_rx_buffers(qlge_t *qlge)
1688 {
1689 	struct rx_ring *rx_ring;
1690 	int i;
1691 
1692 	for (i = 0; i < qlge->rx_ring_count; i++) {
1693 		rx_ring = &qlge->rx_ring[i];
1694 		if (rx_ring->type != TX_Q) {
1695 			if (ql_alloc_sbufs(qlge, rx_ring) != DDI_SUCCESS)
1696 				goto alloc_err;
1697 			if (ql_alloc_lbufs(qlge, rx_ring) != DDI_SUCCESS)
1698 				goto alloc_err;
1699 		}
1700 	}
1701 #ifdef QLGE_TRACK_BUFFER_USAGE
1702 	for (i = 0; i < qlge->rx_ring_count; i++) {
1703 		if (qlge->rx_ring[i].type == RX_Q) {
1704 			qlge->rx_sb_low_count[i] = NUM_SMALL_BUFFERS;
1705 			qlge->rx_lb_low_count[i] = NUM_LARGE_BUFFERS;
1706 		}
1707 		qlge->cq_low_count[i] = NUM_RX_RING_ENTRIES;
1708 	}
1709 #endif
1710 	return (DDI_SUCCESS);
1711 
1712 alloc_err:
1713 	ql_free_rx_buffers(qlge);
1714 	return (DDI_FAILURE);
1715 }
1716 
1717 /*
1718  * Initialize large buffer queue ring
1719  */
1720 static void
1721 ql_init_lbq_ring(struct rx_ring *rx_ring)
1722 {
1723 	uint16_t i;
1724 	struct bq_desc *lbq_desc;
1725 
1726 	bzero(rx_ring->lbq_desc, rx_ring->lbq_len * sizeof (struct bq_desc));
1727 	for (i = 0; i < rx_ring->lbq_len; i++) {
1728 		lbq_desc = &rx_ring->lbq_desc[i];
1729 		lbq_desc->index = i;
1730 	}
1731 }
1732 
1733 /*
1734  * Initialize small buffer queue ring
1735  */
1736 static void
1737 ql_init_sbq_ring(struct rx_ring *rx_ring)
1738 {
1739 	uint16_t i;
1740 	struct bq_desc *sbq_desc;
1741 
1742 	bzero(rx_ring->sbq_desc, rx_ring->sbq_len * sizeof (struct bq_desc));
1743 	for (i = 0; i < rx_ring->sbq_len; i++) {
1744 		sbq_desc = &rx_ring->sbq_desc[i];
1745 		sbq_desc->index = i;
1746 	}
1747 }
1748 
1749 /*
1750  * Calculate the pseudo-header checksum if hardware can not do
1751  */
1752 static void
1753 ql_pseudo_cksum(uint8_t *buf)
1754 {
1755 	uint32_t cksum;
1756 	uint16_t iphl;
1757 	uint16_t proto;
1758 
1759 	iphl = (uint16_t)(4 * (buf[0] & 0xF));
1760 	cksum = (((uint16_t)buf[2])<<8) + buf[3] - iphl;
1761 	cksum += proto = buf[9];
1762 	cksum += (((uint16_t)buf[12])<<8) + buf[13];
1763 	cksum += (((uint16_t)buf[14])<<8) + buf[15];
1764 	cksum += (((uint16_t)buf[16])<<8) + buf[17];
1765 	cksum += (((uint16_t)buf[18])<<8) + buf[19];
1766 	cksum = (cksum>>16) + (cksum & 0xFFFF);
1767 	cksum = (cksum>>16) + (cksum & 0xFFFF);
1768 
1769 	/*
1770 	 * Point it to the TCP/UDP header, and
1771 	 * update the checksum field.
1772 	 */
1773 	buf += iphl + ((proto == IPPROTO_TCP) ?
1774 	    TCP_CKSUM_OFFSET : UDP_CKSUM_OFFSET);
1775 
1776 	*(uint16_t *)(void *)buf = (uint16_t)htons((uint16_t)cksum);
1777 
1778 }
1779 
1780 /*
1781  * Transmit an incoming packet.
1782  */
1783 mblk_t *
1784 ql_ring_tx(void *arg, mblk_t *mp)
1785 {
1786 	struct tx_ring *tx_ring = (struct tx_ring *)arg;
1787 	qlge_t *qlge = tx_ring->qlge;
1788 	mblk_t *next;
1789 	int rval;
1790 	uint32_t tx_count = 0;
1791 
1792 	if (qlge->port_link_state == LS_DOWN) {
1793 		/* can not send message while link is down */
1794 		mblk_t *tp;
1795 
1796 		while (mp != NULL) {
1797 			tp = mp->b_next;
1798 			mp->b_next = NULL;
1799 			freemsg(mp);
1800 			mp = tp;
1801 		}
1802 		goto exit;
1803 	}
1804 
1805 	mutex_enter(&tx_ring->tx_lock);
1806 	/* if mac is not started, driver is not ready, can not send */
1807 	if (tx_ring->mac_flags != QL_MAC_STARTED) {
1808 		cmn_err(CE_WARN, "%s(%d)ring not started, mode %d "
1809 		    " return packets",
1810 		    __func__, qlge->instance, tx_ring->mac_flags);
1811 		mutex_exit(&tx_ring->tx_lock);
1812 		goto exit;
1813 	}
1814 
1815 	/* we must try to send all */
1816 	while (mp != NULL) {
1817 		/*
1818 		 * if number of available slots is less than a threshold,
1819 		 * then quit
1820 		 */
1821 		if (tx_ring->tx_free_count <= TX_STOP_THRESHOLD) {
1822 			tx_ring->queue_stopped = 1;
1823 			rval = DDI_FAILURE;
1824 #ifdef QLGE_LOAD_UNLOAD
1825 			cmn_err(CE_WARN, "%s(%d) no resources",
1826 			    __func__, qlge->instance);
1827 #endif
1828 			tx_ring->defer++;
1829 			/*
1830 			 * If we return the buffer back we are expected to call
1831 			 * mac_tx_ring_update() when resources are available
1832 			 */
1833 			break;
1834 		}
1835 
1836 		next = mp->b_next;
1837 		mp->b_next = NULL;
1838 
1839 		rval = ql_send_common(tx_ring, mp);
1840 
1841 		if (rval != DDI_SUCCESS) {
1842 			mp->b_next = next;
1843 			break;
1844 		}
1845 		tx_count++;
1846 		mp = next;
1847 	}
1848 
1849 	/*
1850 	 * After all msg blocks are mapped or copied to tx buffer,
1851 	 * trigger the hardware to send!
1852 	 */
1853 	if (tx_count > 0) {
1854 		ql_write_doorbell_reg(tx_ring->qlge, tx_ring->prod_idx_db_reg,
1855 		    tx_ring->prod_idx);
1856 	}
1857 
1858 	mutex_exit(&tx_ring->tx_lock);
1859 exit:
1860 	return (mp);
1861 }
1862 
1863 
1864 /*
1865  * This function builds an mblk list for the given inbound
1866  * completion.
1867  */
1868 
1869 static mblk_t *
1870 ql_build_rx_mp(qlge_t *qlge, struct rx_ring *rx_ring,
1871     struct ib_mac_iocb_rsp *ib_mac_rsp)
1872 {
1873 	mblk_t *mp = NULL;
1874 	mblk_t *mp1 = NULL;	/* packet header */
1875 	mblk_t *mp2 = NULL;	/* packet content */
1876 	struct bq_desc *lbq_desc;
1877 	struct bq_desc *sbq_desc;
1878 	uint32_t err_flag = (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK);
1879 	uint32_t payload_len = le32_to_cpu(ib_mac_rsp->data_len);
1880 	uint32_t header_len = le32_to_cpu(ib_mac_rsp->hdr_len);
1881 	uint32_t pkt_len = payload_len + header_len;
1882 	uint32_t done;
1883 	uint64_t *curr_ial_ptr;
1884 	uint32_t ial_data_addr_low;
1885 	uint32_t actual_data_addr_low;
1886 	mblk_t *mp_ial = NULL;	/* ial chained packets */
1887 	uint32_t size;
1888 	uint32_t cp_offset;
1889 	boolean_t rx_copy = B_FALSE;
1890 	mblk_t *tp = NULL;
1891 
1892 	/*
1893 	 * Check if error flags are set
1894 	 */
1895 	if (err_flag != 0) {
1896 		if ((err_flag & IB_MAC_IOCB_RSP_ERR_OVERSIZE) != 0)
1897 			rx_ring->frame_too_long++;
1898 		if ((err_flag & IB_MAC_IOCB_RSP_ERR_UNDERSIZE) != 0)
1899 			rx_ring->frame_too_short++;
1900 		if ((err_flag & IB_MAC_IOCB_RSP_ERR_CRC) != 0)
1901 			rx_ring->fcs_err++;
1902 #ifdef QLGE_LOAD_UNLOAD
1903 		cmn_err(CE_WARN, "bad packet, type 0x%x", err_flag);
1904 #endif
1905 		QL_DUMP(DBG_RX, "qlge_ring_rx: bad response iocb dump\n",
1906 		    (uint8_t *)ib_mac_rsp, 8,
1907 		    (size_t)sizeof (struct ib_mac_iocb_rsp));
1908 	}
1909 
1910 	/* header should not be in large buffer */
1911 	if (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HL) {
1912 		cmn_err(CE_WARN, "header in large buffer or invalid!");
1913 		err_flag |= 1;
1914 	}
1915 	/* if whole packet is too big than rx buffer size */
1916 	if (pkt_len > qlge->max_frame_size) {
1917 		cmn_err(CE_WARN, "ql_build_rx_mpframe too long(%d)!", pkt_len);
1918 		err_flag |= 1;
1919 	}
1920 	if (qlge->rx_copy ||
1921 	    (rx_ring->sbuf_in_use_count <= qlge->rx_copy_threshold) ||
1922 	    (rx_ring->lbuf_in_use_count <= qlge->rx_copy_threshold)) {
1923 		rx_copy = B_TRUE;
1924 	}
1925 
1926 	/* if using rx copy mode, we need to allocate a big enough buffer */
1927 	if (rx_copy) {
1928 		qlge->stats.norcvbuf++;
1929 		tp = allocb(payload_len + header_len + qlge->ip_hdr_offset,
1930 		    BPRI_MED);
1931 		if (tp == NULL) {
1932 			cmn_err(CE_WARN, "rx copy failed to allocate memory");
1933 		} else {
1934 			tp->b_rptr += qlge->ip_hdr_offset;
1935 		}
1936 	}
1937 	/*
1938 	 * Handle the header buffer if present.
1939 	 * packet header must be valid and saved in one small buffer
1940 	 * broadcast/multicast packets' headers not splitted
1941 	 */
1942 	if ((ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV) &&
1943 	    (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HS)) {
1944 		QL_PRINT(DBG_RX, ("Header of %d bytes in small buffer.\n",
1945 		    header_len));
1946 		/* Sync access */
1947 		sbq_desc = ql_get_sbuf_from_in_use_list(rx_ring);
1948 
1949 		ASSERT(sbq_desc != NULL);
1950 
1951 		/*
1952 		 * Validate addresses from the ASIC with the
1953 		 * expected sbuf address
1954 		 */
1955 		if (cpu_to_le64(sbq_desc->bd_dma.dma_addr)
1956 		    != ib_mac_rsp->hdr_addr) {
1957 			/* Small buffer address mismatch */
1958 			cmn_err(CE_WARN, "%s(%d) ring%d packet saved"
1959 			    " in wrong small buffer",
1960 			    __func__, qlge->instance, rx_ring->cq_id);
1961 			goto fatal_error;
1962 		}
1963 		/* get this packet */
1964 		mp1 = sbq_desc->mp;
1965 		/* Flush DMA'd data */
1966 		(void) ddi_dma_sync(sbq_desc->bd_dma.dma_handle,
1967 		    0, header_len, DDI_DMA_SYNC_FORKERNEL);
1968 
1969 		if ((err_flag != 0)|| (mp1 == NULL)) {
1970 			/* failed on this packet, put it back for re-arming */
1971 #ifdef QLGE_LOAD_UNLOAD
1972 			cmn_err(CE_WARN, "get header from small buffer fail");
1973 #endif
1974 			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
1975 			mp1 = NULL;
1976 		} else if (rx_copy) {
1977 			if (tp != NULL) {
1978 				bcopy(sbq_desc->bd_dma.vaddr, tp->b_rptr,
1979 				    header_len);
1980 			}
1981 			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
1982 			mp1 = NULL;
1983 		} else {
1984 			if ((qlge->ip_hdr_offset != 0)&&
1985 			    (header_len < SMALL_BUFFER_SIZE)) {
1986 				/*
1987 				 * copy entire header to a 2 bytes boundary
1988 				 * address for 8100 adapters so that the IP
1989 				 * header can be on a 4 byte boundary address
1990 				 */
1991 				bcopy(mp1->b_rptr,
1992 				    (mp1->b_rptr + SMALL_BUFFER_SIZE +
1993 				    qlge->ip_hdr_offset),
1994 				    header_len);
1995 				mp1->b_rptr += SMALL_BUFFER_SIZE +
1996 				    qlge->ip_hdr_offset;
1997 			}
1998 
1999 			/*
2000 			 * Adjust the mp payload_len to match
2001 			 * the packet header payload_len
2002 			 */
2003 			mp1->b_wptr = mp1->b_rptr + header_len;
2004 			mp1->b_next = mp1->b_cont = NULL;
2005 			QL_DUMP(DBG_RX, "\t RX packet header dump:\n",
2006 			    (uint8_t *)mp1->b_rptr, 8, header_len);
2007 		}
2008 	}
2009 
2010 	/*
2011 	 * packet data or whole packet can be in small or one or
2012 	 * several large buffer(s)
2013 	 */
2014 	if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DS) {
2015 		/*
2016 		 * The data is in a single small buffer.
2017 		 */
2018 		sbq_desc = ql_get_sbuf_from_in_use_list(rx_ring);
2019 
2020 		ASSERT(sbq_desc != NULL);
2021 
2022 		QL_PRINT(DBG_RX,
2023 		    ("%d bytes in a single small buffer, sbq_desc = %p, "
2024 		    "sbq_desc->bd_dma.dma_addr = %x,"
2025 		    " ib_mac_rsp->data_addr = %x, mp = %p\n",
2026 		    payload_len, sbq_desc, sbq_desc->bd_dma.dma_addr,
2027 		    ib_mac_rsp->data_addr, sbq_desc->mp));
2028 
2029 		/*
2030 		 * Validate  addresses from the ASIC with the
2031 		 * expected sbuf address
2032 		 */
2033 		if (cpu_to_le64(sbq_desc->bd_dma.dma_addr)
2034 		    != ib_mac_rsp->data_addr) {
2035 			/* Small buffer address mismatch */
2036 			cmn_err(CE_WARN, "%s(%d) ring%d packet saved"
2037 			    " in wrong small buffer",
2038 			    __func__, qlge->instance, rx_ring->cq_id);
2039 			goto fatal_error;
2040 		}
2041 		/* get this packet */
2042 		mp2 = sbq_desc->mp;
2043 		(void) ddi_dma_sync(sbq_desc->bd_dma.dma_handle,
2044 		    0, payload_len, DDI_DMA_SYNC_FORKERNEL);
2045 		if ((err_flag != 0) || (mp2 == NULL)) {
2046 #ifdef QLGE_LOAD_UNLOAD
2047 			/* failed on this packet, put it back for re-arming */
2048 			cmn_err(CE_WARN, "ignore bad data from small buffer");
2049 #endif
2050 			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
2051 			mp2 = NULL;
2052 		} else if (rx_copy) {
2053 			if (tp != NULL) {
2054 				bcopy(sbq_desc->bd_dma.vaddr,
2055 				    tp->b_rptr + header_len, payload_len);
2056 				tp->b_wptr =
2057 				    tp->b_rptr + header_len + payload_len;
2058 			}
2059 			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
2060 			mp2 = NULL;
2061 		} else {
2062 			/* Adjust the buffer length to match the payload_len */
2063 			mp2->b_wptr = mp2->b_rptr + payload_len;
2064 			mp2->b_next = mp2->b_cont = NULL;
2065 			/* Flush DMA'd data */
2066 			QL_DUMP(DBG_RX, "\t RX packet payload dump:\n",
2067 			    (uint8_t *)mp2->b_rptr, 8, payload_len);
2068 			/*
2069 			 * if payload is too small , copy to
2070 			 * the end of packet header
2071 			 */
2072 			if ((mp1 != NULL) &&
2073 			    (payload_len <= qlge->payload_copy_thresh) &&
2074 			    (pkt_len <
2075 			    (SMALL_BUFFER_SIZE - qlge->ip_hdr_offset))) {
2076 				bcopy(mp2->b_rptr, mp1->b_wptr, payload_len);
2077 				mp1->b_wptr += payload_len;
2078 				freemsg(mp2);
2079 				mp2 = NULL;
2080 			}
2081 		}
2082 	} else if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DL) {
2083 		/*
2084 		 * The data is in a single large buffer.
2085 		 */
2086 		lbq_desc = ql_get_lbuf_from_in_use_list(rx_ring);
2087 
2088 		QL_PRINT(DBG_RX,
2089 		    ("%d bytes in a single large buffer, lbq_desc = %p, "
2090 		    "lbq_desc->bd_dma.dma_addr = %x,"
2091 		    " ib_mac_rsp->data_addr = %x, mp = %p\n",
2092 		    payload_len, lbq_desc, lbq_desc->bd_dma.dma_addr,
2093 		    ib_mac_rsp->data_addr, lbq_desc->mp));
2094 
2095 		ASSERT(lbq_desc != NULL);
2096 
2097 		/*
2098 		 * Validate  addresses from the ASIC with
2099 		 * the expected lbuf address
2100 		 */
2101 		if (cpu_to_le64(lbq_desc->bd_dma.dma_addr)
2102 		    != ib_mac_rsp->data_addr) {
2103 			/* Large buffer address mismatch */
2104 			cmn_err(CE_WARN, "%s(%d) ring%d packet saved"
2105 			    " in wrong large buffer",
2106 			    __func__, qlge->instance, rx_ring->cq_id);
2107 			goto fatal_error;
2108 		}
2109 		mp2 = lbq_desc->mp;
2110 		/* Flush DMA'd data */
2111 		(void) ddi_dma_sync(lbq_desc->bd_dma.dma_handle,
2112 		    0, payload_len, DDI_DMA_SYNC_FORKERNEL);
2113 		if ((err_flag != 0) || (mp2 == NULL)) {
2114 #ifdef QLGE_LOAD_UNLOAD
2115 			cmn_err(CE_WARN, "ignore bad data from large buffer");
2116 #endif
2117 			/* failed on this packet, put it back for re-arming */
2118 			ql_refill_lbuf_free_list(lbq_desc, B_FALSE);
2119 			mp2 = NULL;
2120 		} else if (rx_copy) {
2121 			if (tp != NULL) {
2122 				bcopy(lbq_desc->bd_dma.vaddr,
2123 				    tp->b_rptr + header_len, payload_len);
2124 				tp->b_wptr =
2125 				    tp->b_rptr + header_len + payload_len;
2126 			}
2127 			ql_refill_lbuf_free_list(lbq_desc, B_FALSE);
2128 			mp2 = NULL;
2129 		} else {
2130 			/*
2131 			 * Adjust the buffer length to match
2132 			 * the packet payload_len
2133 			 */
2134 			mp2->b_wptr = mp2->b_rptr + payload_len;
2135 			mp2->b_next = mp2->b_cont = NULL;
2136 			QL_DUMP(DBG_RX, "\t RX packet payload dump:\n",
2137 			    (uint8_t *)mp2->b_rptr, 8, payload_len);
2138 			/*
2139 			 * if payload is too small , copy to
2140 			 * the end of packet header
2141 			 */
2142 			if ((mp1 != NULL) &&
2143 			    (payload_len <= qlge->payload_copy_thresh) &&
2144 			    (pkt_len<
2145 			    (SMALL_BUFFER_SIZE - qlge->ip_hdr_offset))) {
2146 				bcopy(mp2->b_rptr, mp1->b_wptr, payload_len);
2147 				mp1->b_wptr += payload_len;
2148 				freemsg(mp2);
2149 				mp2 = NULL;
2150 			}
2151 		}
2152 	} else if (payload_len) { /* ial case */
2153 		/*
2154 		 * payload available but not in sml nor lrg buffer,
2155 		 * so, it is saved in IAL
2156 		 */
2157 #ifdef QLGE_LOAD_UNLOAD
2158 		cmn_err(CE_NOTE, "packet chained in IAL \n");
2159 #endif
2160 		/* lrg buf addresses are saved in one small buffer */
2161 		sbq_desc = ql_get_sbuf_from_in_use_list(rx_ring);
2162 		curr_ial_ptr = (uint64_t *)sbq_desc->bd_dma.vaddr;
2163 		done = 0;
2164 		cp_offset = 0;
2165 
2166 		while (!done) {
2167 			ial_data_addr_low =
2168 			    (uint32_t)(le64_to_cpu(*curr_ial_ptr) &
2169 			    0xFFFFFFFE);
2170 			/* check if this is the last packet fragment */
2171 			done = (uint32_t)(le64_to_cpu(*curr_ial_ptr) & 1);
2172 			curr_ial_ptr++;
2173 			/*
2174 			 * The data is in one or several large buffer(s).
2175 			 */
2176 			lbq_desc = ql_get_lbuf_from_in_use_list(rx_ring);
2177 			actual_data_addr_low =
2178 			    (uint32_t)(lbq_desc->bd_dma.dma_addr &
2179 			    0xFFFFFFFE);
2180 			if (ial_data_addr_low != actual_data_addr_low) {
2181 				cmn_err(CE_WARN,
2182 				    "packet saved in wrong ial lrg buffer"
2183 				    " expected %x, actual %lx",
2184 				    ial_data_addr_low,
2185 				    (uintptr_t)lbq_desc->bd_dma.dma_addr);
2186 				goto fatal_error;
2187 			}
2188 
2189 			size = (payload_len < rx_ring->lbq_buf_size)?
2190 			    payload_len : rx_ring->lbq_buf_size;
2191 			payload_len -= size;
2192 			mp2 = lbq_desc->mp;
2193 			if ((err_flag != 0) || (mp2 == NULL)) {
2194 #ifdef QLGE_LOAD_UNLOAD
2195 				cmn_err(CE_WARN,
2196 				    "ignore bad data from large buffer");
2197 #endif
2198 				ql_refill_lbuf_free_list(lbq_desc, B_FALSE);
2199 				mp2 = NULL;
2200 			} else if (rx_copy) {
2201 				if (tp != NULL) {
2202 					(void) ddi_dma_sync(
2203 					    lbq_desc->bd_dma.dma_handle,
2204 					    0, size, DDI_DMA_SYNC_FORKERNEL);
2205 					bcopy(lbq_desc->bd_dma.vaddr,
2206 					    tp->b_rptr + header_len + cp_offset,
2207 					    size);
2208 					tp->b_wptr =
2209 					    tp->b_rptr + size + cp_offset +
2210 					    header_len;
2211 					cp_offset += size;
2212 				}
2213 				ql_refill_lbuf_free_list(lbq_desc, B_FALSE);
2214 				mp2 = NULL;
2215 			} else {
2216 				if (mp_ial == NULL) {
2217 					mp_ial = mp2;
2218 				} else {
2219 					linkb(mp_ial, mp2);
2220 				}
2221 
2222 				mp2->b_next = NULL;
2223 				mp2->b_cont = NULL;
2224 				mp2->b_wptr = mp2->b_rptr + size;
2225 				/* Flush DMA'd data */
2226 				(void) ddi_dma_sync(lbq_desc->bd_dma.dma_handle,
2227 				    0, size, DDI_DMA_SYNC_FORKERNEL);
2228 				QL_PRINT(DBG_RX, ("ial %d payload received \n",
2229 				    size));
2230 				QL_DUMP(DBG_RX, "\t Mac data dump:\n",
2231 				    (uint8_t *)mp2->b_rptr, 8, size);
2232 			}
2233 		}
2234 		if (err_flag != 0) {
2235 #ifdef QLGE_LOAD_UNLOAD
2236 			/* failed on this packet, put it back for re-arming */
2237 			cmn_err(CE_WARN, "ignore bad data from small buffer");
2238 #endif
2239 			ql_refill_sbuf_free_list(sbq_desc, B_FALSE);
2240 		} else {
2241 			mp2 = mp_ial;
2242 			freemsg(sbq_desc->mp);
2243 		}
2244 	}
2245 	/*
2246 	 * some packets' hdr not split, then send mp2 upstream, otherwise,
2247 	 * concatenate message block mp2 to the tail of message header, mp1
2248 	 */
2249 	if (!err_flag) {
2250 		if (rx_copy) {
2251 			if (tp != NULL) {
2252 				tp->b_next = NULL;
2253 				tp->b_cont = NULL;
2254 				tp->b_wptr = tp->b_rptr +
2255 				    header_len + payload_len;
2256 			}
2257 			mp = tp;
2258 		} else {
2259 			if (mp1) {
2260 				if (mp2) {
2261 					QL_PRINT(DBG_RX,
2262 					    ("packet in mp1 and mp2\n"));
2263 					/* mp1->b_cont = mp2; */
2264 					linkb(mp1, mp2);
2265 					mp = mp1;
2266 				} else {
2267 					QL_PRINT(DBG_RX,
2268 					    ("packet in mp1 only\n"));
2269 					mp = mp1;
2270 				}
2271 			} else if (mp2) {
2272 				QL_PRINT(DBG_RX, ("packet in mp2 only\n"));
2273 				mp = mp2;
2274 			}
2275 		}
2276 	}
2277 	return (mp);
2278 
2279 fatal_error:
2280 	/* fatal Error! */
2281 	if (qlge->fm_enable) {
2282 		ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
2283 		ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
2284 		atomic_or_32(&qlge->flags, ADAPTER_ERROR);
2285 	}
2286 	if (tp) {
2287 		freemsg(tp);
2288 	}
2289 
2290 	/* *mp->b_wptr = 0; */
2291 	ql_wake_asic_reset_soft_intr(qlge);
2292 	return (NULL);
2293 
2294 }
2295 
2296 /*
2297  * Bump completion queue consumer index.
2298  */
2299 static void
2300 ql_update_cq(struct rx_ring *rx_ring)
2301 {
2302 	rx_ring->cnsmr_idx++;
2303 	rx_ring->curr_entry++;
2304 	if (rx_ring->cnsmr_idx >= rx_ring->cq_len) {
2305 		rx_ring->cnsmr_idx = 0;
2306 		rx_ring->curr_entry = rx_ring->cq_dma.vaddr;
2307 	}
2308 }
2309 
2310 /*
2311  * Update completion queue consumer index.
2312  */
2313 static void
2314 ql_write_cq_idx(struct rx_ring *rx_ring)
2315 {
2316 	qlge_t *qlge = rx_ring->qlge;
2317 
2318 	ql_write_doorbell_reg(qlge, rx_ring->cnsmr_idx_db_reg,
2319 	    rx_ring->cnsmr_idx);
2320 }
2321 
2322 /*
2323  * Processes a SYS-Chip Event Notification Completion Event.
2324  * The incoming notification event that describes a link up/down
2325  * or some sorts of error happens.
2326  */
2327 static void
2328 ql_process_chip_ae_intr(qlge_t *qlge,
2329     struct ib_sys_event_iocb_rsp *ib_sys_event_rsp_ptr)
2330 {
2331 	uint8_t eventType = ib_sys_event_rsp_ptr->event_type;
2332 	uint32_t soft_req = 0;
2333 
2334 	switch (eventType) {
2335 		case SYS_EVENT_PORT_LINK_UP:	/* 0x0h */
2336 			QL_PRINT(DBG_MBX, ("Port Link Up\n"));
2337 			break;
2338 
2339 		case SYS_EVENT_PORT_LINK_DOWN:	/* 0x1h */
2340 			QL_PRINT(DBG_MBX, ("Port Link Down\n"));
2341 			break;
2342 
2343 		case SYS_EVENT_MULTIPLE_CAM_HITS : /* 0x6h */
2344 			cmn_err(CE_WARN, "A multiple CAM hits look up error "
2345 			    "occurred");
2346 			soft_req |= NEED_HW_RESET;
2347 			break;
2348 
2349 		case SYS_EVENT_SOFT_ECC_ERR:	/* 0x7h */
2350 			cmn_err(CE_WARN, "Soft ECC error detected");
2351 			soft_req |= NEED_HW_RESET;
2352 			break;
2353 
2354 		case SYS_EVENT_MGMT_FATAL_ERR:	/* 0x8h */
2355 			cmn_err(CE_WARN, "Management (MPI) Processor fatal"
2356 			    " error occured");
2357 			soft_req |= NEED_MPI_RESET;
2358 			break;
2359 
2360 		case SYS_EVENT_MAC_INTERRUPT:	/* 0x9h */
2361 			QL_PRINT(DBG_MBX, ("MAC Interrupt"));
2362 			break;
2363 
2364 		case SYS_EVENT_PCI_ERR_READING_SML_LRG_BUF:	/* 0x40h */
2365 			cmn_err(CE_WARN, "PCI Error reading small/large "
2366 			    "buffers occured");
2367 			soft_req |= NEED_HW_RESET;
2368 			break;
2369 
2370 		default:
2371 			QL_PRINT(DBG_RX, ("%s(%d) unknown Sys Event: "
2372 			    "type 0x%x occured",
2373 			    __func__, qlge->instance, eventType));
2374 			break;
2375 	}
2376 
2377 	if ((soft_req & NEED_MPI_RESET) != 0) {
2378 		ql_wake_mpi_reset_soft_intr(qlge);
2379 		if (qlge->fm_enable) {
2380 			ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
2381 			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
2382 		}
2383 	} else if ((soft_req & NEED_HW_RESET) != 0) {
2384 		ql_wake_asic_reset_soft_intr(qlge);
2385 		if (qlge->fm_enable) {
2386 			ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
2387 			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
2388 		}
2389 	}
2390 }
2391 
2392 /*
2393  * set received packet checksum flag
2394  */
2395 void
2396 ql_set_rx_cksum(mblk_t *mp, struct ib_mac_iocb_rsp *net_rsp)
2397 {
2398 	uint32_t flags;
2399 
2400 	/* Not TCP or UDP packet? nothing more to do */
2401 	if (((net_rsp->flags2 & IB_MAC_IOCB_RSP_T) == 0) &&
2402 	    ((net_rsp->flags2 & IB_MAC_IOCB_RSP_U) == 0))
2403 	return;
2404 
2405 	/* No CKO support for IPv6 */
2406 	if ((net_rsp->flags3 & IB_MAC_IOCB_RSP_V6) != 0)
2407 		return;
2408 
2409 	/*
2410 	 * If checksum error, don't set flags; stack will calculate
2411 	 * checksum, detect the error and update statistics
2412 	 */
2413 	if (((net_rsp->flags1 & IB_MAC_IOCB_RSP_TE) != 0) ||
2414 	    ((net_rsp->flags1 & IB_MAC_IOCB_RSP_IE) != 0))
2415 		return;
2416 
2417 	/* TCP or UDP packet and checksum valid */
2418 	if (((net_rsp->flags2 & IB_MAC_IOCB_RSP_T) != 0) &&
2419 	    ((net_rsp->flags1 & IB_MAC_IOCB_RSP_NU) == 0)) {
2420 		flags = HCK_FULLCKSUM_OK;
2421 		mac_hcksum_set(mp, 0, 0, 0, 0, flags);
2422 	}
2423 	if (((net_rsp->flags2 & IB_MAC_IOCB_RSP_U) != 0) &&
2424 	    ((net_rsp->flags1 & IB_MAC_IOCB_RSP_NU) == 0)) {
2425 		flags = HCK_FULLCKSUM_OK;
2426 		mac_hcksum_set(mp, 0, 0, 0, 0, flags);
2427 	}
2428 }
2429 
2430 /*
2431  * This function goes through h/w descriptor in one specified rx ring,
2432  * receives the data if the descriptor status shows the data is ready.
2433  * It returns a chain of mblks containing the received data, to be
2434  * passed up to mac_rx_ring().
2435  */
2436 mblk_t *
2437 ql_ring_rx(struct rx_ring *rx_ring, int poll_bytes)
2438 {
2439 	qlge_t *qlge = rx_ring->qlge;
2440 	uint32_t prod = ql_read_sh_reg(qlge, rx_ring);
2441 	struct ib_mac_iocb_rsp *net_rsp;
2442 	mblk_t *mp;
2443 	mblk_t *mblk_head;
2444 	mblk_t **mblk_tail;
2445 	uint32_t received_bytes = 0;
2446 	uint32_t length;
2447 #ifdef QLGE_PERFORMANCE
2448 	uint32_t pkt_ct = 0;
2449 #endif
2450 
2451 #ifdef QLGE_TRACK_BUFFER_USAGE
2452 	uint32_t consumer_idx;
2453 	uint32_t producer_idx;
2454 	uint32_t num_free_entries;
2455 	uint32_t temp;
2456 
2457 	temp = ql_read_doorbell_reg(qlge, rx_ring->cnsmr_idx_db_reg);
2458 	consumer_idx = temp & 0x0000ffff;
2459 	producer_idx = (temp >> 16);
2460 
2461 	if (consumer_idx > producer_idx)
2462 		num_free_entries = (consumer_idx - producer_idx);
2463 	else
2464 		num_free_entries = NUM_RX_RING_ENTRIES - (
2465 		    producer_idx - consumer_idx);
2466 
2467 	if (num_free_entries < qlge->cq_low_count[rx_ring->cq_id])
2468 		qlge->cq_low_count[rx_ring->cq_id] = num_free_entries;
2469 
2470 #endif
2471 	mblk_head = NULL;
2472 	mblk_tail = &mblk_head;
2473 
2474 	while ((prod != rx_ring->cnsmr_idx)) {
2475 		QL_PRINT(DBG_RX,
2476 		    ("%s cq_id = %d, prod = %d, cnsmr = %d.\n",
2477 		    __func__, rx_ring->cq_id, prod, rx_ring->cnsmr_idx));
2478 
2479 		net_rsp = (struct ib_mac_iocb_rsp *)rx_ring->curr_entry;
2480 		(void) ddi_dma_sync(rx_ring->cq_dma.dma_handle,
2481 		    (off_t)((uintptr_t)net_rsp -
2482 		    (uintptr_t)rx_ring->cq_dma.vaddr),
2483 		    (size_t)sizeof (*net_rsp), DDI_DMA_SYNC_FORKERNEL);
2484 		QL_DUMP(DBG_RX, "qlge_ring_rx: rx completion iocb\n",
2485 		    rx_ring->curr_entry, 8, (size_t)sizeof (*net_rsp));
2486 
2487 		switch (net_rsp->opcode) {
2488 
2489 		case OPCODE_IB_MAC_IOCB:
2490 			/* Adding length of pkt header and payload */
2491 			length = le32_to_cpu(net_rsp->data_len) +
2492 			    le32_to_cpu(net_rsp->hdr_len);
2493 			if ((poll_bytes != QLGE_POLL_ALL) &&
2494 			    ((received_bytes + length) > poll_bytes)) {
2495 				continue;
2496 			}
2497 			received_bytes += length;
2498 
2499 #ifdef QLGE_PERFORMANCE
2500 			pkt_ct++;
2501 #endif
2502 			mp = ql_build_rx_mp(qlge, rx_ring, net_rsp);
2503 			if (mp != NULL) {
2504 				if (rx_ring->mac_flags != QL_MAC_STARTED) {
2505 					/*
2506 					 * Increment number of packets we have
2507 					 * indicated to the stack, should be
2508 					 * decremented when we get it back
2509 					 * or when freemsg is called
2510 					 */
2511 					ASSERT(rx_ring->rx_indicate
2512 					    <= rx_ring->cq_len);
2513 #ifdef QLGE_LOAD_UNLOAD
2514 					cmn_err(CE_WARN, "%s do not send to OS,"
2515 					    " mac_flags %d, indicate %d",
2516 					    __func__, rx_ring->mac_flags,
2517 					    rx_ring->rx_indicate);
2518 #endif
2519 					QL_PRINT(DBG_RX,
2520 					    ("cq_id = %d, packet "
2521 					    "dropped, mac not "
2522 					    "enabled.\n",
2523 					    rx_ring->cq_id));
2524 					rx_ring->rx_pkt_dropped_mac_unenabled++;
2525 
2526 					/* rx_lock is expected to be held */
2527 					mutex_exit(&rx_ring->rx_lock);
2528 					freemsg(mp);
2529 					mutex_enter(&rx_ring->rx_lock);
2530 					mp = NULL;
2531 				}
2532 
2533 				if (mp != NULL) {
2534 					/*
2535 					 * IP full packet has been
2536 					 * successfully verified by
2537 					 * H/W and is correct
2538 					 */
2539 					ql_set_rx_cksum(mp, net_rsp);
2540 
2541 					rx_ring->rx_packets++;
2542 					rx_ring->rx_bytes += length;
2543 					*mblk_tail = mp;
2544 					mblk_tail = &mp->b_next;
2545 				}
2546 			} else {
2547 				QL_PRINT(DBG_RX,
2548 				    ("cq_id = %d, packet dropped\n",
2549 				    rx_ring->cq_id));
2550 				rx_ring->rx_packets_dropped_no_buffer++;
2551 			}
2552 			break;
2553 
2554 		case OPCODE_IB_SYS_EVENT_IOCB:
2555 			ql_process_chip_ae_intr(qlge,
2556 			    (struct ib_sys_event_iocb_rsp *)
2557 			    net_rsp);
2558 			break;
2559 
2560 		default:
2561 			cmn_err(CE_WARN,
2562 			    "%s Ring(%d)Hit default case, not handled!"
2563 			    " dropping the packet, "
2564 			    "opcode = %x.", __func__, rx_ring->cq_id,
2565 			    net_rsp->opcode);
2566 			break;
2567 		}
2568 		/* increment cnsmr_idx and curr_entry */
2569 		ql_update_cq(rx_ring);
2570 		prod = ql_read_sh_reg(qlge, rx_ring);
2571 
2572 	}
2573 
2574 #ifdef QLGE_PERFORMANCE
2575 	if (pkt_ct >= 7)
2576 		rx_ring->hist[7]++;
2577 	else if (pkt_ct == 6)
2578 		rx_ring->hist[6]++;
2579 	else if (pkt_ct == 5)
2580 		rx_ring->hist[5]++;
2581 	else if (pkt_ct == 4)
2582 		rx_ring->hist[4]++;
2583 	else if (pkt_ct == 3)
2584 		rx_ring->hist[3]++;
2585 	else if (pkt_ct == 2)
2586 		rx_ring->hist[2]++;
2587 	else if (pkt_ct == 1)
2588 		rx_ring->hist[1]++;
2589 	else if (pkt_ct == 0)
2590 		rx_ring->hist[0]++;
2591 #endif
2592 
2593 	/* update cnsmr_idx */
2594 	ql_write_cq_idx(rx_ring);
2595 	/* do not enable interrupt for polling mode */
2596 	if (poll_bytes == QLGE_POLL_ALL)
2597 		ql_enable_completion_interrupt(rx_ring->qlge, rx_ring->irq);
2598 	return (mblk_head);
2599 }
2600 
2601 /* Process an outbound completion from an rx ring. */
2602 static void
2603 ql_process_mac_tx_intr(qlge_t *qlge, struct ob_mac_iocb_rsp *mac_rsp)
2604 {
2605 	struct tx_ring *tx_ring;
2606 	struct tx_ring_desc *tx_ring_desc;
2607 	int j;
2608 
2609 	tx_ring = &qlge->tx_ring[mac_rsp->txq_idx];
2610 	tx_ring_desc = tx_ring->wq_desc;
2611 	tx_ring_desc += mac_rsp->tid;
2612 
2613 	if (tx_ring_desc->tx_type == USE_DMA) {
2614 		QL_PRINT(DBG_TX, ("%s(%d): tx type USE_DMA\n",
2615 		    __func__, qlge->instance));
2616 
2617 		/*
2618 		 * Release the DMA resource that is used for
2619 		 * DMA binding.
2620 		 */
2621 		for (j = 0; j < tx_ring_desc->tx_dma_handle_used; j++) {
2622 			(void) ddi_dma_unbind_handle(
2623 			    tx_ring_desc->tx_dma_handle[j]);
2624 		}
2625 
2626 		tx_ring_desc->tx_dma_handle_used = 0;
2627 		/*
2628 		 * Free the mblk after sending completed
2629 		 */
2630 		if (tx_ring_desc->mp != NULL) {
2631 			freemsg(tx_ring_desc->mp);
2632 			tx_ring_desc->mp = NULL;
2633 		}
2634 	}
2635 
2636 	tx_ring->obytes += tx_ring_desc->tx_bytes;
2637 	tx_ring->opackets++;
2638 
2639 	if (mac_rsp->flags1 & (OB_MAC_IOCB_RSP_E | OB_MAC_IOCB_RSP_S |
2640 	    OB_MAC_IOCB_RSP_L | OB_MAC_IOCB_RSP_B)) {
2641 		tx_ring->errxmt++;
2642 		if (mac_rsp->flags1 & OB_MAC_IOCB_RSP_E) {
2643 			/* EMPTY */
2644 			QL_PRINT(DBG_TX,
2645 			    ("Total descriptor length did not match "
2646 			    "transfer length.\n"));
2647 		}
2648 		if (mac_rsp->flags1 & OB_MAC_IOCB_RSP_S) {
2649 			/* EMPTY */
2650 			QL_PRINT(DBG_TX,
2651 			    ("Frame too short to be legal, not sent.\n"));
2652 		}
2653 		if (mac_rsp->flags1 & OB_MAC_IOCB_RSP_L) {
2654 			/* EMPTY */
2655 			QL_PRINT(DBG_TX,
2656 			    ("Frame too long, but sent anyway.\n"));
2657 		}
2658 		if (mac_rsp->flags3 & OB_MAC_IOCB_RSP_B) {
2659 			/* EMPTY */
2660 			QL_PRINT(DBG_TX,
2661 			    ("PCI backplane error. Frame not sent.\n"));
2662 		}
2663 	}
2664 	atomic_inc_32(&tx_ring->tx_free_count);
2665 }
2666 
2667 /*
2668  * clean up tx completion iocbs
2669  */
2670 int
2671 ql_clean_outbound_rx_ring(struct rx_ring *rx_ring)
2672 {
2673 	qlge_t *qlge = rx_ring->qlge;
2674 	uint32_t prod = ql_read_sh_reg(qlge, rx_ring);
2675 	struct ob_mac_iocb_rsp *net_rsp = NULL;
2676 	int count = 0;
2677 	struct tx_ring *tx_ring;
2678 	boolean_t resume_tx = B_FALSE;
2679 
2680 	mutex_enter(&rx_ring->rx_lock);
2681 #ifdef QLGE_TRACK_BUFFER_USAGE
2682 	{
2683 	uint32_t consumer_idx;
2684 	uint32_t producer_idx;
2685 	uint32_t num_free_entries;
2686 	uint32_t temp;
2687 
2688 	temp = ql_read_doorbell_reg(qlge, rx_ring->cnsmr_idx_db_reg);
2689 	consumer_idx = temp & 0x0000ffff;
2690 	producer_idx = (temp >> 16);
2691 
2692 	if (consumer_idx > producer_idx)
2693 		num_free_entries = (consumer_idx - producer_idx);
2694 	else
2695 		num_free_entries = NUM_RX_RING_ENTRIES -
2696 		    (producer_idx - consumer_idx);
2697 
2698 	if (num_free_entries < qlge->cq_low_count[rx_ring->cq_id])
2699 		qlge->cq_low_count[rx_ring->cq_id] = num_free_entries;
2700 
2701 	}
2702 #endif
2703 	/* While there are entries in the completion queue. */
2704 	while (prod != rx_ring->cnsmr_idx) {
2705 
2706 		QL_PRINT(DBG_RX,
2707 		    ("%s cq_id = %d, prod = %d, cnsmr = %d.\n", __func__,
2708 		    rx_ring->cq_id, prod, rx_ring->cnsmr_idx));
2709 
2710 		net_rsp = (struct ob_mac_iocb_rsp *)rx_ring->curr_entry;
2711 		(void) ddi_dma_sync(rx_ring->cq_dma.dma_handle,
2712 		    (off_t)((uintptr_t)net_rsp -
2713 		    (uintptr_t)rx_ring->cq_dma.vaddr),
2714 		    (size_t)sizeof (*net_rsp), DDI_DMA_SYNC_FORKERNEL);
2715 
2716 		QL_DUMP(DBG_RX, "ql_clean_outbound_rx_ring: "
2717 		    "response packet data\n",
2718 		    rx_ring->curr_entry, 8,
2719 		    (size_t)sizeof (*net_rsp));
2720 
2721 		switch (net_rsp->opcode) {
2722 
2723 		case OPCODE_OB_MAC_OFFLOAD_IOCB:
2724 		case OPCODE_OB_MAC_IOCB:
2725 			ql_process_mac_tx_intr(qlge, net_rsp);
2726 			break;
2727 
2728 		default:
2729 			cmn_err(CE_WARN,
2730 			    "%s Hit default case, not handled! "
2731 			    "dropping the packet,"
2732 			    " opcode = %x.",
2733 			    __func__, net_rsp->opcode);
2734 			break;
2735 		}
2736 		count++;
2737 		ql_update_cq(rx_ring);
2738 		prod = ql_read_sh_reg(qlge, rx_ring);
2739 	}
2740 	ql_write_cq_idx(rx_ring);
2741 
2742 	mutex_exit(&rx_ring->rx_lock);
2743 
2744 	net_rsp = (struct ob_mac_iocb_rsp *)rx_ring->curr_entry;
2745 	tx_ring = &qlge->tx_ring[net_rsp->txq_idx];
2746 
2747 	mutex_enter(&tx_ring->tx_lock);
2748 
2749 	if (tx_ring->queue_stopped &&
2750 	    (tx_ring->tx_free_count > TX_RESUME_THRESHOLD)) {
2751 		/*
2752 		 * The queue got stopped because the tx_ring was full.
2753 		 * Wake it up, because it's now at least 25% empty.
2754 		 */
2755 		tx_ring->queue_stopped = 0;
2756 		resume_tx = B_TRUE;
2757 	}
2758 
2759 	mutex_exit(&tx_ring->tx_lock);
2760 	/* Don't hold the lock during OS callback */
2761 	if (resume_tx)
2762 		RESUME_TX(tx_ring);
2763 	return (count);
2764 }
2765 
2766 /*
2767  * reset asic when error happens
2768  */
2769 /* ARGSUSED */
2770 static uint_t
2771 ql_asic_reset_work(caddr_t arg1, caddr_t arg2)
2772 {
2773 	qlge_t *qlge = (qlge_t *)((void *)arg1);
2774 	int status;
2775 
2776 	mutex_enter(&qlge->gen_mutex);
2777 	(void) ql_do_stop(qlge);
2778 	/*
2779 	 * Write default ethernet address to chip register Mac
2780 	 * Address slot 0 and Enable Primary Mac Function.
2781 	 */
2782 	mutex_enter(&qlge->hw_mutex);
2783 	(void) ql_unicst_set(qlge,
2784 	    (uint8_t *)qlge->unicst_addr[0].addr.ether_addr_octet, 0);
2785 	mutex_exit(&qlge->hw_mutex);
2786 	qlge->mac_flags = QL_MAC_INIT;
2787 	status = ql_do_start(qlge);
2788 	if (status != DDI_SUCCESS)
2789 		goto error;
2790 	qlge->mac_flags = QL_MAC_STARTED;
2791 	mutex_exit(&qlge->gen_mutex);
2792 	ddi_fm_service_impact(qlge->dip, DDI_SERVICE_RESTORED);
2793 
2794 	return (DDI_INTR_CLAIMED);
2795 
2796 error:
2797 	mutex_exit(&qlge->gen_mutex);
2798 	cmn_err(CE_WARN,
2799 	    "qlge up/down cycle failed, closing device");
2800 	if (qlge->fm_enable) {
2801 		ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
2802 		ddi_fm_service_impact(qlge->dip, DDI_SERVICE_LOST);
2803 		atomic_or_32(&qlge->flags, ADAPTER_ERROR);
2804 	}
2805 	return (DDI_INTR_CLAIMED);
2806 }
2807 
2808 /*
2809  * Reset MPI
2810  */
2811 /* ARGSUSED */
2812 static uint_t
2813 ql_mpi_reset_work(caddr_t arg1, caddr_t arg2)
2814 {
2815 	qlge_t *qlge = (qlge_t *)((void *)arg1);
2816 
2817 	(void) ql_reset_mpi_risc(qlge);
2818 	return (DDI_INTR_CLAIMED);
2819 }
2820 
2821 /*
2822  * Process MPI mailbox messages
2823  */
2824 /* ARGSUSED */
2825 static uint_t
2826 ql_mpi_event_work(caddr_t arg1, caddr_t arg2)
2827 {
2828 	qlge_t *qlge = (qlge_t *)((void *)arg1);
2829 
2830 	ql_do_mpi_intr(qlge);
2831 	return (DDI_INTR_CLAIMED);
2832 }
2833 
2834 /* Fire up a handler to reset the MPI processor. */
2835 void
2836 ql_wake_asic_reset_soft_intr(qlge_t *qlge)
2837 {
2838 	(void) ddi_intr_trigger_softint(qlge->asic_reset_intr_hdl, NULL);
2839 }
2840 
2841 static void
2842 ql_wake_mpi_reset_soft_intr(qlge_t *qlge)
2843 {
2844 	(void) ddi_intr_trigger_softint(qlge->mpi_reset_intr_hdl, NULL);
2845 }
2846 
2847 static void
2848 ql_wake_mpi_event_soft_intr(qlge_t *qlge)
2849 {
2850 	(void) ddi_intr_trigger_softint(qlge->mpi_event_intr_hdl, NULL);
2851 }
2852 
2853 /*
2854  * This handles a fatal error, MPI activity, and the default
2855  * rx_ring in an MSI-X multiple interrupt vector environment.
2856  * In MSI/Legacy environment it also process the rest of
2857  * the rx_rings.
2858  */
2859 /* ARGSUSED */
2860 static uint_t
2861 ql_isr(caddr_t arg1, caddr_t arg2)
2862 {
2863 	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
2864 	struct rx_ring *ob_ring;
2865 	qlge_t *qlge = rx_ring->qlge;
2866 	struct intr_ctx *intr_ctx = &qlge->intr_ctx[0];
2867 	uint32_t var, prod;
2868 	int i;
2869 	int work_done = 0;
2870 
2871 	mblk_t *mp;
2872 
2873 	_NOTE(ARGUNUSED(arg2));
2874 
2875 	++qlge->rx_interrupts[rx_ring->cq_id];
2876 
2877 	if (ql_atomic_read_32(&qlge->intr_ctx[0].irq_cnt)) {
2878 		ql_write_reg(qlge, REG_RSVD7, 0xfeed0002);
2879 		var = ql_read_reg(qlge, REG_ERROR_STATUS);
2880 		var = ql_read_reg(qlge, REG_STATUS);
2881 		var = ql_read_reg(qlge, REG_INTERRUPT_STATUS_1);
2882 		return (DDI_INTR_CLAIMED);
2883 	}
2884 
2885 	ql_disable_completion_interrupt(qlge, intr_ctx->intr);
2886 
2887 	/*
2888 	 * process send completes on first stride tx ring if available
2889 	 */
2890 	if (qlge->isr_stride) {
2891 		ob_ring = &qlge->rx_ring[qlge->isr_stride];
2892 		if (ql_read_sh_reg(qlge, ob_ring) !=
2893 		    ob_ring->cnsmr_idx) {
2894 			(void) ql_clean_outbound_rx_ring(ob_ring);
2895 		}
2896 	}
2897 	/*
2898 	 * Check the default queue and wake handler if active.
2899 	 */
2900 	rx_ring = &qlge->rx_ring[0];
2901 	prod = ql_read_sh_reg(qlge, rx_ring);
2902 	QL_PRINT(DBG_INTR, ("rx-ring[0] prod index 0x%x, consumer 0x%x ",
2903 	    prod, rx_ring->cnsmr_idx));
2904 	/* check if interrupt is due to incoming packet */
2905 	if (prod != rx_ring->cnsmr_idx) {
2906 		QL_PRINT(DBG_INTR, ("Waking handler for rx_ring[0].\n"));
2907 		ql_disable_completion_interrupt(qlge, intr_ctx->intr);
2908 		mutex_enter(&rx_ring->rx_lock);
2909 		mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
2910 		mutex_exit(&rx_ring->rx_lock);
2911 
2912 		if (mp != NULL)
2913 			RX_UPSTREAM(rx_ring, mp);
2914 		work_done++;
2915 	} else {
2916 		/*
2917 		 * If interrupt is not due to incoming packet, read status
2918 		 * register to see if error happens or mailbox interrupt.
2919 		 */
2920 		var = ql_read_reg(qlge, REG_STATUS);
2921 		if ((var & STATUS_FE) != 0) {
2922 			ql_write_reg(qlge, REG_RSVD7, 0xfeed0003);
2923 			if (qlge->fm_enable) {
2924 				atomic_or_32(&qlge->flags, ADAPTER_ERROR);
2925 				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
2926 				ddi_fm_service_impact(qlge->dip,
2927 				    DDI_SERVICE_LOST);
2928 			}
2929 			cmn_err(CE_WARN, "Got fatal error, STS = %x.", var);
2930 			var = ql_read_reg(qlge, REG_ERROR_STATUS);
2931 			cmn_err(CE_WARN,
2932 			    "Resetting chip. Error Status Register = 0x%x",
2933 			    var);
2934 			ql_wake_asic_reset_soft_intr(qlge);
2935 			return (DDI_INTR_CLAIMED);
2936 		}
2937 
2938 		/*
2939 		 * Check MPI processor activity.
2940 		 */
2941 		if ((var & STATUS_PI) != 0) {
2942 			/*
2943 			 * We've got an async event or mailbox completion.
2944 			 * Handle it and clear the source of the interrupt.
2945 			 */
2946 			ql_write_reg(qlge, REG_RSVD7, 0xfeed0004);
2947 
2948 			QL_PRINT(DBG_INTR, ("Got MPI processor interrupt.\n"));
2949 			ql_disable_completion_interrupt(qlge, intr_ctx->intr);
2950 			ql_wake_mpi_event_soft_intr(qlge);
2951 			work_done++;
2952 		}
2953 	}
2954 
2955 
2956 	if (qlge->intr_type != DDI_INTR_TYPE_MSIX) {
2957 		/*
2958 		 * Start the DPC for each active queue.
2959 		 */
2960 		for (i = 1; i < qlge->rx_ring_count; i++) {
2961 			rx_ring = &qlge->rx_ring[i];
2962 
2963 			if (ql_read_sh_reg(qlge, rx_ring) !=
2964 			    rx_ring->cnsmr_idx) {
2965 				QL_PRINT(DBG_INTR,
2966 				    ("Waking handler for rx_ring[%d].\n", i));
2967 
2968 				ql_disable_completion_interrupt(qlge,
2969 				    rx_ring->irq);
2970 				if (rx_ring->type == TX_Q) {
2971 					(void) ql_clean_outbound_rx_ring(
2972 					    rx_ring);
2973 					ql_enable_completion_interrupt(
2974 					    rx_ring->qlge, rx_ring->irq);
2975 				} else {
2976 					mutex_enter(&rx_ring->rx_lock);
2977 					mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
2978 					mutex_exit(&rx_ring->rx_lock);
2979 					if (mp != NULL)
2980 						RX_UPSTREAM(rx_ring, mp);
2981 #ifdef QLGE_LOAD_UNLOAD
2982 					if (rx_ring->mac_flags ==
2983 					    QL_MAC_STOPPED)
2984 						cmn_err(CE_NOTE,
2985 						    "%s rx_indicate(%d) %d\n",
2986 						    __func__, i,
2987 						    rx_ring->rx_indicate);
2988 #endif
2989 				}
2990 				work_done++;
2991 			}
2992 		}
2993 	}
2994 
2995 	ql_enable_completion_interrupt(qlge, intr_ctx->intr);
2996 
2997 	return (work_done ? DDI_INTR_CLAIMED : DDI_INTR_UNCLAIMED);
2998 }
2999 
3000 /*
3001  * MSI-X Multiple Vector Interrupt Handler for outbound (TX) completions.
3002  */
3003 /* ARGSUSED */
3004 static uint_t
3005 ql_msix_tx_isr(caddr_t arg1, caddr_t arg2)
3006 {
3007 	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
3008 	qlge_t *qlge = rx_ring->qlge;
3009 	_NOTE(ARGUNUSED(arg2));
3010 
3011 	++qlge->rx_interrupts[rx_ring->cq_id];
3012 	(void) ql_clean_outbound_rx_ring(rx_ring);
3013 	ql_enable_completion_interrupt(rx_ring->qlge, rx_ring->irq);
3014 
3015 	return (DDI_INTR_CLAIMED);
3016 }
3017 
3018 /*
3019  * MSI-X Multiple Vector Interrupt Handler
3020  */
3021 /* ARGSUSED */
3022 static uint_t
3023 ql_msix_isr(caddr_t arg1, caddr_t arg2)
3024 {
3025 	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
3026 	struct rx_ring *ob_ring;
3027 	qlge_t *qlge = rx_ring->qlge;
3028 	mblk_t *mp;
3029 	_NOTE(ARGUNUSED(arg2));
3030 
3031 	QL_PRINT(DBG_INTR, ("%s for ring %d\n", __func__, rx_ring->cq_id));
3032 
3033 	ql_disable_completion_interrupt(qlge, rx_ring->irq);
3034 
3035 	/*
3036 	 * process send completes on stride tx ring if available
3037 	 */
3038 	if (qlge->isr_stride) {
3039 		ob_ring = rx_ring + qlge->isr_stride;
3040 		if (ql_read_sh_reg(qlge, ob_ring) !=
3041 		    ob_ring->cnsmr_idx) {
3042 			++qlge->rx_interrupts[ob_ring->cq_id];
3043 			(void) ql_clean_outbound_rx_ring(ob_ring);
3044 		}
3045 	}
3046 
3047 	++qlge->rx_interrupts[rx_ring->cq_id];
3048 
3049 	mutex_enter(&rx_ring->rx_lock);
3050 	mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
3051 	mutex_exit(&rx_ring->rx_lock);
3052 
3053 	if (mp != NULL)
3054 		RX_UPSTREAM(rx_ring, mp);
3055 
3056 	return (DDI_INTR_CLAIMED);
3057 }
3058 
3059 /*
3060  * Poll n_bytes of chained incoming packets
3061  */
3062 mblk_t *
3063 ql_ring_rx_poll(void *arg, int n_bytes)
3064 {
3065 	struct rx_ring *rx_ring = (struct rx_ring *)arg;
3066 	qlge_t *qlge = rx_ring->qlge;
3067 	mblk_t *mp = NULL;
3068 	uint32_t var;
3069 
3070 	ASSERT(n_bytes >= 0);
3071 	QL_PRINT(DBG_GLD, ("%s for ring(%d) to read max %d bytes\n",
3072 	    __func__, rx_ring->cq_id, n_bytes));
3073 
3074 	++qlge->rx_polls[rx_ring->cq_id];
3075 
3076 	if (n_bytes == 0)
3077 		return (mp);
3078 	mutex_enter(&rx_ring->rx_lock);
3079 	mp = ql_ring_rx(rx_ring, n_bytes);
3080 	mutex_exit(&rx_ring->rx_lock);
3081 
3082 	if ((rx_ring->cq_id == 0) && (mp == NULL)) {
3083 		var = ql_read_reg(qlge, REG_STATUS);
3084 		/*
3085 		 * Check for fatal error.
3086 		 */
3087 		if ((var & STATUS_FE) != 0) {
3088 			ql_write_reg(qlge, REG_RSVD7, 0xfeed0003);
3089 			var = ql_read_reg(qlge, REG_ERROR_STATUS);
3090 			cmn_err(CE_WARN, "Got fatal error %x.", var);
3091 			ql_wake_asic_reset_soft_intr(qlge);
3092 			if (qlge->fm_enable) {
3093 				atomic_or_32(&qlge->flags, ADAPTER_ERROR);
3094 				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
3095 				ddi_fm_service_impact(qlge->dip,
3096 				    DDI_SERVICE_LOST);
3097 			}
3098 		}
3099 		/*
3100 		 * Check MPI processor activity.
3101 		 */
3102 		if ((var & STATUS_PI) != 0) {
3103 			/*
3104 			 * We've got an async event or mailbox completion.
3105 			 * Handle it and clear the source of the interrupt.
3106 			 */
3107 			ql_write_reg(qlge, REG_RSVD7, 0xfeed0004);
3108 			ql_do_mpi_intr(qlge);
3109 		}
3110 	}
3111 
3112 	return (mp);
3113 }
3114 
3115 /*
3116  * MSI-X Multiple Vector Interrupt Handler for inbound (RX) completions.
3117  */
3118 /* ARGSUSED */
3119 static uint_t
3120 ql_msix_rx_isr(caddr_t arg1, caddr_t arg2)
3121 {
3122 	struct rx_ring *rx_ring = (struct rx_ring *)((void *)arg1);
3123 	qlge_t *qlge = rx_ring->qlge;
3124 	mblk_t *mp;
3125 	_NOTE(ARGUNUSED(arg2));
3126 
3127 	QL_PRINT(DBG_INTR, ("%s for ring %d\n", __func__, rx_ring->cq_id));
3128 
3129 	++qlge->rx_interrupts[rx_ring->cq_id];
3130 
3131 	mutex_enter(&rx_ring->rx_lock);
3132 	mp = ql_ring_rx(rx_ring, QLGE_POLL_ALL);
3133 	mutex_exit(&rx_ring->rx_lock);
3134 
3135 	if (mp != NULL)
3136 		RX_UPSTREAM(rx_ring, mp);
3137 
3138 	return (DDI_INTR_CLAIMED);
3139 }
3140 
3141 
3142 /*
3143  *
3144  * Allocate DMA Buffer for ioctl service
3145  *
3146  */
3147 static int
3148 ql_alloc_ioctl_dma_buf(qlge_t *qlge)
3149 {
3150 	uint64_t phy_addr;
3151 	uint64_t alloc_size;
3152 	ddi_dma_cookie_t dma_cookie;
3153 
3154 	alloc_size = qlge->ioctl_buf_dma_attr.mem_len =
3155 	    max(WCS_MPI_CODE_RAM_LENGTH, MEMC_MPI_RAM_LENGTH);
3156 	if (ql_alloc_phys(qlge->dip, &qlge->ioctl_buf_dma_attr.dma_handle,
3157 	    &ql_buf_acc_attr,
3158 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3159 	    &qlge->ioctl_buf_dma_attr.acc_handle,
3160 	    (size_t)alloc_size,  /* mem size */
3161 	    (size_t)0,  /* alignment */
3162 	    (caddr_t *)&qlge->ioctl_buf_dma_attr.vaddr,
3163 	    &dma_cookie) != 0) {
3164 		cmn_err(CE_WARN, "%s(%d): ioctl DMA allocation failed.",
3165 		    __func__, qlge->instance);
3166 		return (DDI_FAILURE);
3167 	}
3168 
3169 	phy_addr = dma_cookie.dmac_laddress;
3170 
3171 	if (qlge->ioctl_buf_dma_attr.vaddr == NULL) {
3172 		cmn_err(CE_WARN, "%s(%d): failed.", __func__, qlge->instance);
3173 		return (DDI_FAILURE);
3174 	}
3175 
3176 	qlge->ioctl_buf_dma_attr.dma_addr = phy_addr;
3177 
3178 	QL_PRINT(DBG_MBX, ("%s: ioctl_dma_buf_virt_addr = 0x%lx, "
3179 	    "phy_addr = 0x%lx\n",
3180 	    __func__, qlge->ioctl_buf_dma_attr.vaddr, phy_addr));
3181 
3182 	return (DDI_SUCCESS);
3183 }
3184 
3185 
3186 /*
3187  * Function to free physical memory.
3188  */
3189 static void
3190 ql_free_phys(ddi_dma_handle_t *dma_handle, ddi_acc_handle_t *acc_handle)
3191 {
3192 	if (*dma_handle != NULL) {
3193 		(void) ddi_dma_unbind_handle(*dma_handle);
3194 		if (*acc_handle != NULL)
3195 			ddi_dma_mem_free(acc_handle);
3196 		ddi_dma_free_handle(dma_handle);
3197 		*acc_handle = NULL;
3198 		*dma_handle = NULL;
3199 	}
3200 }
3201 
3202 /*
3203  * Function to free ioctl dma buffer.
3204  */
3205 static void
3206 ql_free_ioctl_dma_buf(qlge_t *qlge)
3207 {
3208 	if (qlge->ioctl_buf_dma_attr.dma_handle != NULL) {
3209 		ql_free_phys(&qlge->ioctl_buf_dma_attr.dma_handle,
3210 		    &qlge->ioctl_buf_dma_attr.acc_handle);
3211 
3212 		qlge->ioctl_buf_dma_attr.vaddr = NULL;
3213 		qlge->ioctl_buf_dma_attr.dma_handle = NULL;
3214 	}
3215 }
3216 
3217 /*
3218  * Free shadow register space used for request and completion queues
3219  */
3220 static void
3221 ql_free_shadow_space(qlge_t *qlge)
3222 {
3223 	if (qlge->host_copy_shadow_dma_attr.dma_handle != NULL) {
3224 		ql_free_phys(&qlge->host_copy_shadow_dma_attr.dma_handle,
3225 		    &qlge->host_copy_shadow_dma_attr.acc_handle);
3226 		bzero(&qlge->host_copy_shadow_dma_attr,
3227 		    sizeof (qlge->host_copy_shadow_dma_attr));
3228 	}
3229 
3230 	if (qlge->buf_q_ptr_base_addr_dma_attr.dma_handle != NULL) {
3231 		ql_free_phys(&qlge->buf_q_ptr_base_addr_dma_attr.dma_handle,
3232 		    &qlge->buf_q_ptr_base_addr_dma_attr.acc_handle);
3233 		bzero(&qlge->buf_q_ptr_base_addr_dma_attr,
3234 		    sizeof (qlge->buf_q_ptr_base_addr_dma_attr));
3235 	}
3236 }
3237 
3238 /*
3239  * Allocate shadow register space for request and completion queues
3240  */
3241 static int
3242 ql_alloc_shadow_space(qlge_t *qlge)
3243 {
3244 	ddi_dma_cookie_t dma_cookie;
3245 
3246 	if (ql_alloc_phys(qlge->dip,
3247 	    &qlge->host_copy_shadow_dma_attr.dma_handle,
3248 	    &ql_dev_acc_attr,
3249 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3250 	    &qlge->host_copy_shadow_dma_attr.acc_handle,
3251 	    (size_t)VM_PAGE_SIZE,  /* mem size */
3252 	    (size_t)4, /* 4 bytes alignment */
3253 	    (caddr_t *)&qlge->host_copy_shadow_dma_attr.vaddr,
3254 	    &dma_cookie) != 0) {
3255 		bzero(&qlge->host_copy_shadow_dma_attr,
3256 		    sizeof (qlge->host_copy_shadow_dma_attr));
3257 
3258 		cmn_err(CE_WARN, "%s(%d): Unable to allocate DMA memory for "
3259 		    "response shadow registers", __func__, qlge->instance);
3260 		return (DDI_FAILURE);
3261 	}
3262 
3263 	qlge->host_copy_shadow_dma_attr.dma_addr = dma_cookie.dmac_laddress;
3264 
3265 	if (ql_alloc_phys(qlge->dip,
3266 	    &qlge->buf_q_ptr_base_addr_dma_attr.dma_handle,
3267 	    &ql_desc_acc_attr,
3268 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3269 	    &qlge->buf_q_ptr_base_addr_dma_attr.acc_handle,
3270 	    (size_t)VM_PAGE_SIZE,  /* mem size */
3271 	    (size_t)4, /* 4 bytes alignment */
3272 	    (caddr_t *)&qlge->buf_q_ptr_base_addr_dma_attr.vaddr,
3273 	    &dma_cookie) != 0) {
3274 		bzero(&qlge->buf_q_ptr_base_addr_dma_attr,
3275 		    sizeof (qlge->buf_q_ptr_base_addr_dma_attr));
3276 
3277 		cmn_err(CE_WARN, "%s(%d): Unable to allocate DMA memory "
3278 		    "for request shadow registers",
3279 		    __func__, qlge->instance);
3280 		goto err_wqp_sh_area;
3281 	}
3282 	qlge->buf_q_ptr_base_addr_dma_attr.dma_addr = dma_cookie.dmac_laddress;
3283 
3284 	return (DDI_SUCCESS);
3285 
3286 err_wqp_sh_area:
3287 	ql_free_phys(&qlge->host_copy_shadow_dma_attr.dma_handle,
3288 	    &qlge->host_copy_shadow_dma_attr.acc_handle);
3289 	bzero(&qlge->host_copy_shadow_dma_attr,
3290 	    sizeof (qlge->host_copy_shadow_dma_attr));
3291 
3292 	return (DDI_FAILURE);
3293 }
3294 
3295 /*
3296  * Initialize a tx ring
3297  */
3298 static void
3299 ql_init_tx_ring(struct tx_ring *tx_ring)
3300 {
3301 	int i;
3302 	struct ob_mac_iocb_req *mac_iocb_ptr = tx_ring->wq_dma.vaddr;
3303 	struct tx_ring_desc *tx_ring_desc = tx_ring->wq_desc;
3304 
3305 	for (i = 0; i < tx_ring->wq_len; i++) {
3306 		tx_ring_desc->index = i;
3307 		tx_ring_desc->queue_entry = mac_iocb_ptr;
3308 		mac_iocb_ptr++;
3309 		tx_ring_desc++;
3310 	}
3311 	tx_ring->tx_free_count = tx_ring->wq_len;
3312 	tx_ring->queue_stopped = 0;
3313 }
3314 
3315 /*
3316  * Free one tx ring resources
3317  */
3318 static void
3319 ql_free_tx_resources(struct tx_ring *tx_ring)
3320 {
3321 	struct tx_ring_desc *tx_ring_desc;
3322 	int i, j;
3323 
3324 	if (tx_ring->wq_dma.dma_handle != NULL) {
3325 		ql_free_phys(&tx_ring->wq_dma.dma_handle,
3326 		    &tx_ring->wq_dma.acc_handle);
3327 		bzero(&tx_ring->wq_dma, sizeof (tx_ring->wq_dma));
3328 	}
3329 	if (tx_ring->wq_desc != NULL) {
3330 		tx_ring_desc = tx_ring->wq_desc;
3331 		for (i = 0; i < tx_ring->wq_len; i++, tx_ring_desc++) {
3332 			for (j = 0; j < QL_MAX_TX_DMA_HANDLES; j++) {
3333 				if (tx_ring_desc->tx_dma_handle[j]) {
3334 					/*
3335 					 * The unbinding will happen in tx
3336 					 * completion, here we just free the
3337 					 * handles
3338 					 */
3339 					ddi_dma_free_handle(
3340 					    &(tx_ring_desc->tx_dma_handle[j]));
3341 					tx_ring_desc->tx_dma_handle[j] = NULL;
3342 				}
3343 			}
3344 			if (tx_ring_desc->oal != NULL) {
3345 				tx_ring_desc->oal_dma_addr = 0;
3346 				tx_ring_desc->oal = NULL;
3347 				tx_ring_desc->copy_buffer = NULL;
3348 				tx_ring_desc->copy_buffer_dma_addr = 0;
3349 
3350 				ql_free_phys(&tx_ring_desc->oal_dma.dma_handle,
3351 				    &tx_ring_desc->oal_dma.acc_handle);
3352 			}
3353 		}
3354 		kmem_free(tx_ring->wq_desc,
3355 		    tx_ring->wq_len * sizeof (struct tx_ring_desc));
3356 		tx_ring->wq_desc = NULL;
3357 	}
3358 	/* free the wqicb struct */
3359 	if (tx_ring->wqicb_dma.dma_handle) {
3360 		ql_free_phys(&tx_ring->wqicb_dma.dma_handle,
3361 		    &tx_ring->wqicb_dma.acc_handle);
3362 		bzero(&tx_ring->wqicb_dma, sizeof (tx_ring->wqicb_dma));
3363 	}
3364 }
3365 
3366 /*
3367  * Allocate work (request) queue memory and transmit
3368  * descriptors for this transmit ring
3369  */
3370 static int
3371 ql_alloc_tx_resources(qlge_t *qlge, struct tx_ring *tx_ring)
3372 {
3373 	ddi_dma_cookie_t dma_cookie;
3374 	struct tx_ring_desc *tx_ring_desc;
3375 	int i, j;
3376 	uint32_t length;
3377 
3378 	/* allocate dma buffers for obiocbs */
3379 	if (ql_alloc_phys(qlge->dip, &tx_ring->wq_dma.dma_handle,
3380 	    &ql_desc_acc_attr,
3381 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3382 	    &tx_ring->wq_dma.acc_handle,
3383 	    (size_t)tx_ring->wq_size,	/* mem size */
3384 	    (size_t)128, /* alignment:128 bytes boundary */
3385 	    (caddr_t *)&tx_ring->wq_dma.vaddr,
3386 	    &dma_cookie) != 0) {
3387 		bzero(&tx_ring->wq_dma, sizeof (&tx_ring->wq_dma));
3388 		cmn_err(CE_WARN, "%s(%d): reqQ allocation failed.",
3389 		    __func__, qlge->instance);
3390 		return (DDI_FAILURE);
3391 	}
3392 	tx_ring->wq_dma.dma_addr = dma_cookie.dmac_laddress;
3393 
3394 	tx_ring->wq_desc =
3395 	    kmem_zalloc(tx_ring->wq_len * sizeof (struct tx_ring_desc),
3396 	    KM_NOSLEEP);
3397 	if (tx_ring->wq_desc == NULL) {
3398 		goto err;
3399 	} else {
3400 		tx_ring_desc = tx_ring->wq_desc;
3401 		/*
3402 		 * Allocate a large enough structure to hold the following
3403 		 * 1. oal buffer MAX_SGELEMENTS * sizeof (oal_entry) bytes
3404 		 * 2. copy buffer of QL_MAX_COPY_LENGTH bytes
3405 		 */
3406 		length = (sizeof (struct oal_entry) * MAX_SG_ELEMENTS)
3407 		    + QL_MAX_COPY_LENGTH;
3408 		for (i = 0; i < tx_ring->wq_len; i++, tx_ring_desc++) {
3409 
3410 			if (ql_alloc_phys(qlge->dip,
3411 			    &tx_ring_desc->oal_dma.dma_handle,
3412 			    &ql_desc_acc_attr,
3413 			    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3414 			    &tx_ring_desc->oal_dma.acc_handle,
3415 			    (size_t)length,	/* mem size */
3416 			    (size_t)0, /* default alignment:8 bytes boundary */
3417 			    (caddr_t *)&tx_ring_desc->oal_dma.vaddr,
3418 			    &dma_cookie) != 0) {
3419 				bzero(&tx_ring_desc->oal_dma,
3420 				    sizeof (tx_ring_desc->oal_dma));
3421 				cmn_err(CE_WARN, "%s(%d): reqQ tx buf &"
3422 				    "oal alloc failed.",
3423 				    __func__, qlge->instance);
3424 				goto err;
3425 			}
3426 
3427 			tx_ring_desc->oal = tx_ring_desc->oal_dma.vaddr;
3428 			tx_ring_desc->oal_dma_addr = dma_cookie.dmac_laddress;
3429 			tx_ring_desc->copy_buffer =
3430 			    (caddr_t)((uint8_t *)tx_ring_desc->oal
3431 			    + (sizeof (struct oal_entry) * MAX_SG_ELEMENTS));
3432 			tx_ring_desc->copy_buffer_dma_addr =
3433 			    (tx_ring_desc->oal_dma_addr
3434 			    + (sizeof (struct oal_entry) * MAX_SG_ELEMENTS));
3435 
3436 			/* Allocate dma handles for transmit buffers */
3437 			for (j = 0; j < QL_MAX_TX_DMA_HANDLES; j++) {
3438 				if (ddi_dma_alloc_handle(qlge->dip,
3439 				    &tx_mapping_dma_attr,
3440 				    DDI_DMA_DONTWAIT,
3441 				    0, &tx_ring_desc->tx_dma_handle[j])
3442 				    != DDI_SUCCESS) {
3443 					tx_ring_desc->tx_dma_handle[j] = NULL;
3444 					cmn_err(CE_WARN,
3445 					    "!%s: ddi_dma_alloc_handle: "
3446 					    "tx_dma_handle "
3447 					    "alloc failed", __func__);
3448 					ql_free_phys(
3449 					    &tx_ring_desc->oal_dma.dma_handle,
3450 					    &tx_ring_desc->oal_dma.acc_handle);
3451 					goto err;
3452 				}
3453 			}
3454 		}
3455 	}
3456 	/* alloc a wqicb control block to load this tx ring to hw */
3457 	if (ql_alloc_phys(qlge->dip, &tx_ring->wqicb_dma.dma_handle,
3458 	    &ql_desc_acc_attr,
3459 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3460 	    &tx_ring->wqicb_dma.acc_handle,
3461 	    (size_t)sizeof (struct wqicb_t),	/* mem size */
3462 	    (size_t)0, /* alignment:128 bytes boundary */
3463 	    (caddr_t *)&tx_ring->wqicb_dma.vaddr,
3464 	    &dma_cookie) != 0) {
3465 		bzero(&tx_ring->wqicb_dma, sizeof (tx_ring->wqicb_dma));
3466 		cmn_err(CE_WARN, "%s(%d): wqicb allocation failed.",
3467 		    __func__, qlge->instance);
3468 		goto err;
3469 	}
3470 	tx_ring->wqicb_dma.dma_addr = dma_cookie.dmac_laddress;
3471 
3472 	return (DDI_SUCCESS);
3473 
3474 err:
3475 	ql_free_tx_resources(tx_ring);
3476 	return (DDI_FAILURE);
3477 }
3478 
3479 /*
3480  * Free one rx ring resources
3481  */
3482 static void
3483 ql_free_rx_resources(struct rx_ring *rx_ring)
3484 {
3485 	/* Free the small buffer queue. */
3486 	if (rx_ring->sbq_dma.dma_handle) {
3487 		ql_free_phys(&rx_ring->sbq_dma.dma_handle,
3488 		    &rx_ring->sbq_dma.acc_handle);
3489 		bzero(&rx_ring->sbq_dma, sizeof (rx_ring->sbq_dma));
3490 	}
3491 
3492 	/* Free the small buffer queue control blocks. */
3493 	if (rx_ring->sbq_desc != NULL) {
3494 		kmem_free(rx_ring->sbq_desc, rx_ring->sbq_len *
3495 		    sizeof (struct bq_desc));
3496 		rx_ring->sbq_desc = NULL;
3497 	}
3498 
3499 	/* Free the large buffer queue. */
3500 	if (rx_ring->lbq_dma.dma_handle) {
3501 		ql_free_phys(&rx_ring->lbq_dma.dma_handle,
3502 		    &rx_ring->lbq_dma.acc_handle);
3503 		bzero(&rx_ring->lbq_dma, sizeof (rx_ring->lbq_dma));
3504 	}
3505 
3506 	/* Free the large buffer queue control blocks. */
3507 	if (rx_ring->lbq_desc != NULL) {
3508 		kmem_free(rx_ring->lbq_desc, rx_ring->lbq_len *
3509 		    sizeof (struct bq_desc));
3510 		rx_ring->lbq_desc = NULL;
3511 	}
3512 
3513 	/* Free cqicb struct */
3514 	if (rx_ring->cqicb_dma.dma_handle) {
3515 		ql_free_phys(&rx_ring->cqicb_dma.dma_handle,
3516 		    &rx_ring->cqicb_dma.acc_handle);
3517 		bzero(&rx_ring->cqicb_dma, sizeof (rx_ring->cqicb_dma));
3518 	}
3519 	/* Free the rx queue. */
3520 	if (rx_ring->cq_dma.dma_handle) {
3521 		ql_free_phys(&rx_ring->cq_dma.dma_handle,
3522 		    &rx_ring->cq_dma.acc_handle);
3523 		bzero(&rx_ring->cq_dma, sizeof (rx_ring->cq_dma));
3524 	}
3525 }
3526 
3527 /*
3528  * Allocate queues and buffers for this completions queue based
3529  * on the values in the parameter structure.
3530  */
3531 static int
3532 ql_alloc_rx_resources(qlge_t *qlge, struct rx_ring *rx_ring)
3533 {
3534 	ddi_dma_cookie_t dma_cookie;
3535 
3536 	if (ql_alloc_phys(qlge->dip, &rx_ring->cq_dma.dma_handle,
3537 	    &ql_desc_acc_attr,
3538 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3539 	    &rx_ring->cq_dma.acc_handle,
3540 	    (size_t)rx_ring->cq_size,  /* mem size */
3541 	    (size_t)128, /* alignment:128 bytes boundary */
3542 	    (caddr_t *)&rx_ring->cq_dma.vaddr,
3543 	    &dma_cookie) != 0)	{
3544 		bzero(&rx_ring->cq_dma, sizeof (rx_ring->cq_dma));
3545 		cmn_err(CE_WARN, "%s(%d): rspQ allocation failed.",
3546 		    __func__, qlge->instance);
3547 		return (DDI_FAILURE);
3548 	}
3549 	rx_ring->cq_dma.dma_addr = dma_cookie.dmac_laddress;
3550 
3551 	if (rx_ring->sbq_len != 0) {
3552 		/*
3553 		 * Allocate small buffer queue.
3554 		 */
3555 		if (ql_alloc_phys(qlge->dip, &rx_ring->sbq_dma.dma_handle,
3556 		    &ql_desc_acc_attr,
3557 		    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3558 		    &rx_ring->sbq_dma.acc_handle,
3559 		    (size_t)rx_ring->sbq_size,  /* mem size */
3560 		    (size_t)128, /* alignment:128 bytes boundary */
3561 		    (caddr_t *)&rx_ring->sbq_dma.vaddr,
3562 		    &dma_cookie) != 0) {
3563 			bzero(&rx_ring->sbq_dma, sizeof (rx_ring->sbq_dma));
3564 			cmn_err(CE_WARN,
3565 			    "%s(%d): small buffer queue allocation failed.",
3566 			    __func__, qlge->instance);
3567 			goto err_mem;
3568 		}
3569 		rx_ring->sbq_dma.dma_addr = dma_cookie.dmac_laddress;
3570 
3571 		/*
3572 		 * Allocate small buffer queue control blocks.
3573 		 */
3574 		rx_ring->sbq_desc =
3575 		    kmem_zalloc(rx_ring->sbq_len * sizeof (struct bq_desc),
3576 		    KM_NOSLEEP);
3577 		if (rx_ring->sbq_desc == NULL) {
3578 			cmn_err(CE_WARN,
3579 			    "sbq control block allocation failed.");
3580 			goto err_mem;
3581 		}
3582 
3583 		ql_init_sbq_ring(rx_ring);
3584 	}
3585 
3586 	if (rx_ring->lbq_len != 0) {
3587 		/*
3588 		 * Allocate large buffer queue.
3589 		 */
3590 		if (ql_alloc_phys(qlge->dip, &rx_ring->lbq_dma.dma_handle,
3591 		    &ql_desc_acc_attr,
3592 		    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3593 		    &rx_ring->lbq_dma.acc_handle,
3594 		    (size_t)rx_ring->lbq_size,  /* mem size */
3595 		    (size_t)128, /* alignment:128 bytes boundary */
3596 		    (caddr_t *)&rx_ring->lbq_dma.vaddr,
3597 		    &dma_cookie) != 0) {
3598 			bzero(&rx_ring->lbq_dma, sizeof (rx_ring->lbq_dma));
3599 			cmn_err(CE_WARN, "%s(%d): lbq allocation failed.",
3600 			    __func__, qlge->instance);
3601 			goto err_mem;
3602 		}
3603 		rx_ring->lbq_dma.dma_addr = dma_cookie.dmac_laddress;
3604 
3605 		/*
3606 		 * Allocate large buffer queue control blocks.
3607 		 */
3608 		rx_ring->lbq_desc =
3609 		    kmem_zalloc(rx_ring->lbq_len * sizeof (struct bq_desc),
3610 		    KM_NOSLEEP);
3611 		if (rx_ring->lbq_desc == NULL) {
3612 			cmn_err(CE_WARN,
3613 			    "Large buffer queue control block allocation "
3614 			    "failed.");
3615 			goto err_mem;
3616 		}
3617 		ql_init_lbq_ring(rx_ring);
3618 	}
3619 
3620 	if (ql_alloc_phys(qlge->dip, &rx_ring->cqicb_dma.dma_handle,
3621 	    &ql_desc_acc_attr,
3622 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3623 	    &rx_ring->cqicb_dma.acc_handle,
3624 	    (size_t)sizeof (struct cqicb_t),  /* mem size */
3625 	    (size_t)0, /* alignment:128 bytes boundary */
3626 	    (caddr_t *)&rx_ring->cqicb_dma.vaddr,
3627 	    &dma_cookie) != 0) {
3628 		bzero(&rx_ring->cqicb_dma, sizeof (rx_ring->cqicb_dma));
3629 		cmn_err(CE_WARN, "%s(%d): cqicb allocation failed.",
3630 		    __func__, qlge->instance);
3631 		goto err_mem;
3632 	}
3633 	rx_ring->cqicb_dma.dma_addr = dma_cookie.dmac_laddress;
3634 
3635 	return (DDI_SUCCESS);
3636 
3637 err_mem:
3638 	ql_free_rx_resources(rx_ring);
3639 	return (DDI_FAILURE);
3640 }
3641 
3642 /*
3643  * Frees tx/rx queues memory resources
3644  */
3645 static void
3646 ql_free_mem_resources(qlge_t *qlge)
3647 {
3648 	int i;
3649 
3650 	if (qlge->ricb_dma.dma_handle) {
3651 		/* free the ricb struct */
3652 		ql_free_phys(&qlge->ricb_dma.dma_handle,
3653 		    &qlge->ricb_dma.acc_handle);
3654 		bzero(&qlge->ricb_dma, sizeof (qlge->ricb_dma));
3655 	}
3656 
3657 	ql_free_rx_buffers(qlge);
3658 
3659 	ql_free_ioctl_dma_buf(qlge);
3660 
3661 	for (i = 0; i < qlge->tx_ring_count; i++)
3662 		ql_free_tx_resources(&qlge->tx_ring[i]);
3663 
3664 	for (i = 0; i < qlge->rx_ring_count; i++)
3665 		ql_free_rx_resources(&qlge->rx_ring[i]);
3666 
3667 	ql_free_shadow_space(qlge);
3668 }
3669 
3670 /*
3671  * Allocate buffer queues, large buffers and small buffers etc
3672  *
3673  * This API is called in the gld_attach member function. It is called
3674  * only once.  Later reset,reboot should not re-allocate all rings and
3675  * buffers.
3676  */
3677 static int
3678 ql_alloc_mem_resources(qlge_t *qlge)
3679 {
3680 	int i;
3681 	ddi_dma_cookie_t dma_cookie;
3682 
3683 	/* Allocate space for our shadow registers */
3684 	if (ql_alloc_shadow_space(qlge))
3685 		return (DDI_FAILURE);
3686 
3687 	for (i = 0; i < qlge->rx_ring_count; i++) {
3688 		if (ql_alloc_rx_resources(qlge, &qlge->rx_ring[i]) != 0) {
3689 			cmn_err(CE_WARN, "RX resource allocation failed.");
3690 			goto err_mem;
3691 		}
3692 	}
3693 	/* Allocate tx queue resources */
3694 	for (i = 0; i < qlge->tx_ring_count; i++) {
3695 		if (ql_alloc_tx_resources(qlge, &qlge->tx_ring[i]) != 0) {
3696 			cmn_err(CE_WARN, "Tx resource allocation failed.");
3697 			goto err_mem;
3698 		}
3699 	}
3700 
3701 	if (ql_alloc_ioctl_dma_buf(qlge) != DDI_SUCCESS) {
3702 		goto err_mem;
3703 	}
3704 
3705 	if (ql_alloc_rx_buffers(qlge) != DDI_SUCCESS) {
3706 		cmn_err(CE_WARN, "?%s(%d): ql_alloc_rx_buffers failed",
3707 		    __func__, qlge->instance);
3708 		goto err_mem;
3709 	}
3710 
3711 	qlge->sequence |= INIT_ALLOC_RX_BUF;
3712 
3713 	if (ql_alloc_phys(qlge->dip, &qlge->ricb_dma.dma_handle,
3714 	    &ql_desc_acc_attr,
3715 	    DDI_DMA_RDWR | DDI_DMA_CONSISTENT,
3716 	    &qlge->ricb_dma.acc_handle,
3717 	    (size_t)sizeof (struct ricb),  /* mem size */
3718 	    (size_t)0, /* alignment:128 bytes boundary */
3719 	    (caddr_t *)&qlge->ricb_dma.vaddr,
3720 	    &dma_cookie) != 0) {
3721 		bzero(&qlge->ricb_dma, sizeof (qlge->ricb_dma));
3722 		cmn_err(CE_WARN, "%s(%d): ricb allocation failed.",
3723 		    __func__, qlge->instance);
3724 		goto err_mem;
3725 	}
3726 	qlge->ricb_dma.dma_addr = dma_cookie.dmac_laddress;
3727 
3728 	return (DDI_SUCCESS);
3729 
3730 err_mem:
3731 	ql_free_mem_resources(qlge);
3732 	return (DDI_FAILURE);
3733 }
3734 
3735 
3736 /*
3737  * Function used to allocate physical memory and zero it.
3738  */
3739 
3740 static int
3741 ql_alloc_phys_rbuf(dev_info_t *dip, ddi_dma_handle_t *dma_handle,
3742     ddi_device_acc_attr_t *device_acc_attr,
3743     uint_t dma_flags,
3744     ddi_acc_handle_t *acc_handle,
3745     size_t size,
3746     size_t alignment,
3747     caddr_t *vaddr,
3748     ddi_dma_cookie_t *dma_cookie)
3749 {
3750 	size_t rlen;
3751 	uint_t cnt;
3752 
3753 	/*
3754 	 * Workaround for SUN XMITS buffer must end and start on 8 byte
3755 	 * boundary. Else, hardware will overrun the buffer. Simple fix is
3756 	 * to make sure buffer has enough room for overrun.
3757 	 */
3758 	if (size & 7) {
3759 		size += 8 - (size & 7);
3760 	}
3761 
3762 	/* Adjust the alignment if requested */
3763 	if (alignment) {
3764 		dma_attr.dma_attr_align = alignment;
3765 	}
3766 
3767 	/*
3768 	 * Allocate DMA handle
3769 	 */
3770 	if (ddi_dma_alloc_handle(dip, &dma_attr_rbuf, DDI_DMA_DONTWAIT, NULL,
3771 	    dma_handle) != DDI_SUCCESS) {
3772 		cmn_err(CE_WARN, QL_BANG "%s:  ddi_dma_alloc_handle FAILED",
3773 		    __func__);
3774 		*dma_handle = NULL;
3775 		return (QL_ERROR);
3776 	}
3777 	/*
3778 	 * Allocate DMA memory
3779 	 */
3780 	if (ddi_dma_mem_alloc(*dma_handle, size, device_acc_attr,
3781 	    dma_flags & (DDI_DMA_CONSISTENT|DDI_DMA_STREAMING),
3782 	    DDI_DMA_DONTWAIT,
3783 	    NULL, vaddr, &rlen, acc_handle) != DDI_SUCCESS) {
3784 		cmn_err(CE_WARN, "alloc_phys: DMA Memory alloc Failed");
3785 		ddi_dma_free_handle(dma_handle);
3786 		*acc_handle = NULL;
3787 		*dma_handle = NULL;
3788 		return (QL_ERROR);
3789 	}
3790 
3791 	if (ddi_dma_addr_bind_handle(*dma_handle, NULL, *vaddr, rlen,
3792 	    dma_flags, DDI_DMA_DONTWAIT, NULL,
3793 	    dma_cookie, &cnt) != DDI_DMA_MAPPED) {
3794 		ddi_dma_mem_free(acc_handle);
3795 
3796 		ddi_dma_free_handle(dma_handle);
3797 		cmn_err(CE_WARN, "%s ddi_dma_addr_bind_handle FAILED",
3798 		    __func__);
3799 		*acc_handle = NULL;
3800 		*dma_handle = NULL;
3801 		return (QL_ERROR);
3802 	}
3803 
3804 	if (cnt != 1) {
3805 
3806 		ql_free_phys(dma_handle, acc_handle);
3807 
3808 		cmn_err(CE_WARN, "%s: cnt != 1; Failed segment count",
3809 		    __func__);
3810 		return (QL_ERROR);
3811 	}
3812 
3813 	bzero((caddr_t)*vaddr, rlen);
3814 
3815 	return (0);
3816 }
3817 
3818 /*
3819  * Function used to allocate physical memory and zero it.
3820  */
3821 static int
3822 ql_alloc_phys(dev_info_t *dip, ddi_dma_handle_t *dma_handle,
3823     ddi_device_acc_attr_t *device_acc_attr,
3824     uint_t dma_flags,
3825     ddi_acc_handle_t *acc_handle,
3826     size_t size,
3827     size_t alignment,
3828     caddr_t *vaddr,
3829     ddi_dma_cookie_t *dma_cookie)
3830 {
3831 	size_t rlen;
3832 	uint_t cnt;
3833 
3834 	/*
3835 	 * Workaround for SUN XMITS buffer must end and start on 8 byte
3836 	 * boundary. Else, hardware will overrun the buffer. Simple fix is
3837 	 * to make sure buffer has enough room for overrun.
3838 	 */
3839 	if (size & 7) {
3840 		size += 8 - (size & 7);
3841 	}
3842 
3843 	/* Adjust the alignment if requested */
3844 	if (alignment) {
3845 		dma_attr.dma_attr_align = alignment;
3846 	}
3847 
3848 	/*
3849 	 * Allocate DMA handle
3850 	 */
3851 	if (ddi_dma_alloc_handle(dip, &dma_attr, DDI_DMA_DONTWAIT, NULL,
3852 	    dma_handle) != DDI_SUCCESS) {
3853 		cmn_err(CE_WARN, QL_BANG "%s:  ddi_dma_alloc_handle FAILED",
3854 		    __func__);
3855 		*dma_handle = NULL;
3856 		return (QL_ERROR);
3857 	}
3858 	/*
3859 	 * Allocate DMA memory
3860 	 */
3861 	if (ddi_dma_mem_alloc(*dma_handle, size, device_acc_attr,
3862 	    dma_flags & (DDI_DMA_CONSISTENT|DDI_DMA_STREAMING),
3863 	    DDI_DMA_DONTWAIT,
3864 	    NULL, vaddr, &rlen, acc_handle) != DDI_SUCCESS) {
3865 		cmn_err(CE_WARN, "alloc_phys: DMA Memory alloc Failed");
3866 		ddi_dma_free_handle(dma_handle);
3867 		*acc_handle = NULL;
3868 		*dma_handle = NULL;
3869 		return (QL_ERROR);
3870 	}
3871 
3872 	if (ddi_dma_addr_bind_handle(*dma_handle, NULL, *vaddr, rlen,
3873 	    dma_flags, DDI_DMA_DONTWAIT, NULL,
3874 	    dma_cookie, &cnt) != DDI_DMA_MAPPED) {
3875 		ddi_dma_mem_free(acc_handle);
3876 		ddi_dma_free_handle(dma_handle);
3877 		cmn_err(CE_WARN, "%s ddi_dma_addr_bind_handle FAILED",
3878 		    __func__);
3879 		*acc_handle = NULL;
3880 		*dma_handle = NULL;
3881 		return (QL_ERROR);
3882 	}
3883 
3884 	if (cnt != 1) {
3885 
3886 		ql_free_phys(dma_handle, acc_handle);
3887 
3888 		cmn_err(CE_WARN, "%s: cnt != 1; Failed segment count",
3889 		    __func__);
3890 		return (QL_ERROR);
3891 	}
3892 
3893 	bzero((caddr_t)*vaddr, rlen);
3894 
3895 	return (0);
3896 }
3897 
3898 /*
3899  * Add interrupt handlers based on the interrupt type.
3900  * Before adding the interrupt handlers, the interrupt vectors should
3901  * have been allocated, and the rx/tx rings have also been allocated.
3902  */
3903 static int
3904 ql_add_intr_handlers(qlge_t *qlge)
3905 {
3906 	int vector = 0;
3907 	int rc, i;
3908 	uint32_t value;
3909 	struct intr_ctx *intr_ctx = &qlge->intr_ctx[0];
3910 
3911 	switch (qlge->intr_type) {
3912 	case DDI_INTR_TYPE_MSIX:
3913 		/*
3914 		 * Add interrupt handler for rx and tx rings: vector[0 -
3915 		 * (qlge->intr_cnt -1)].
3916 		 */
3917 		value = 0;
3918 		for (vector = 0; vector < qlge->intr_cnt; vector++) {
3919 			ql_atomic_set_32(&intr_ctx->irq_cnt, value);
3920 
3921 			/*
3922 			 * associate interrupt vector with interrupt handler
3923 			 */
3924 			rc = ddi_intr_add_handler(qlge->htable[vector],
3925 			    (ddi_intr_handler_t *)intr_ctx->handler,
3926 			    (void *)&qlge->rx_ring[vector], NULL);
3927 
3928 			QL_PRINT(DBG_INIT, ("rx_ring[%d] 0x%p\n",
3929 			    vector, &qlge->rx_ring[vector]));
3930 			if (rc != DDI_SUCCESS) {
3931 				QL_PRINT(DBG_INIT,
3932 				    ("Add rx interrupt handler failed. "
3933 				    "return: %d, vector: %d", rc, vector));
3934 				for (vector--; vector >= 0; vector--) {
3935 					(void) ddi_intr_remove_handler(
3936 					    qlge->htable[vector]);
3937 				}
3938 				return (DDI_FAILURE);
3939 			}
3940 			intr_ctx++;
3941 		}
3942 		break;
3943 
3944 	case DDI_INTR_TYPE_MSI:
3945 		/*
3946 		 * Add interrupt handlers for the only vector
3947 		 */
3948 		ql_atomic_set_32(&intr_ctx->irq_cnt, value);
3949 
3950 		rc = ddi_intr_add_handler(qlge->htable[vector],
3951 		    ql_isr,
3952 		    (caddr_t)&qlge->rx_ring[0], NULL);
3953 
3954 		if (rc != DDI_SUCCESS) {
3955 			QL_PRINT(DBG_INIT,
3956 			    ("Add MSI interrupt handler failed: %d\n", rc));
3957 			return (DDI_FAILURE);
3958 		}
3959 		break;
3960 
3961 	case DDI_INTR_TYPE_FIXED:
3962 		/*
3963 		 * Add interrupt handlers for the only vector
3964 		 */
3965 		ql_atomic_set_32(&intr_ctx->irq_cnt, value);
3966 
3967 		rc = ddi_intr_add_handler(qlge->htable[vector],
3968 		    ql_isr,
3969 		    (caddr_t)&qlge->rx_ring[0], NULL);
3970 
3971 		if (rc != DDI_SUCCESS) {
3972 			QL_PRINT(DBG_INIT,
3973 			    ("Add legacy interrupt handler failed: %d\n", rc));
3974 			return (DDI_FAILURE);
3975 		}
3976 		break;
3977 
3978 	default:
3979 		return (DDI_FAILURE);
3980 	}
3981 
3982 	/* Enable interrupts */
3983 	/* Block enable */
3984 	if (qlge->intr_cap & DDI_INTR_FLAG_BLOCK) {
3985 		QL_PRINT(DBG_INIT, ("Block enabling %d interrupt(s)\n",
3986 		    qlge->intr_cnt));
3987 		(void) ddi_intr_block_enable(qlge->htable, qlge->intr_cnt);
3988 	} else { /* Non block enable */
3989 		for (i = 0; i < qlge->intr_cnt; i++) {
3990 			QL_PRINT(DBG_INIT, ("Non Block Enabling interrupt %d "
3991 			    "handle 0x%x\n", i, qlge->htable[i]));
3992 			(void) ddi_intr_enable(qlge->htable[i]);
3993 		}
3994 	}
3995 	qlge->sequence |= INIT_INTR_ENABLED;
3996 
3997 	return (DDI_SUCCESS);
3998 }
3999 
4000 /*
4001  * Here we build the intr_ctx structures based on
4002  * our rx_ring count and intr vector count.
4003  * The intr_ctx structure is used to hook each vector
4004  * to possibly different handlers.
4005  */
4006 static void
4007 ql_resolve_queues_to_irqs(qlge_t *qlge)
4008 {
4009 	int i = 0;
4010 	struct intr_ctx *intr_ctx = &qlge->intr_ctx[0];
4011 
4012 	if (qlge->intr_type == DDI_INTR_TYPE_MSIX) {
4013 		/*
4014 		 * Each rx_ring has its own intr_ctx since we
4015 		 * have separate vectors for each queue.
4016 		 * This only true when MSI-X is enabled.
4017 		 */
4018 		for (i = 0; i < qlge->intr_cnt; i++, intr_ctx++) {
4019 			qlge->rx_ring[i].irq = i;
4020 			intr_ctx->intr = i;
4021 			intr_ctx->qlge = qlge;
4022 
4023 			/*
4024 			 * We set up each vectors enable/disable/read bits so
4025 			 * there's no bit/mask calculations in critical path.
4026 			 */
4027 			intr_ctx->intr_en_mask =
4028 			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4029 			    INTR_EN_TYPE_ENABLE | INTR_EN_IHD_MASK |
4030 			    INTR_EN_IHD | i;
4031 			intr_ctx->intr_dis_mask =
4032 			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4033 			    INTR_EN_TYPE_DISABLE | INTR_EN_IHD_MASK |
4034 			    INTR_EN_IHD | i;
4035 			intr_ctx->intr_read_mask =
4036 			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4037 			    INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD
4038 			    | i;
4039 
4040 			if (i == 0) {
4041 				/*
4042 				 * Default queue handles bcast/mcast plus
4043 				 * async events.
4044 				 */
4045 				intr_ctx->handler = ql_isr;
4046 			} else if (qlge->rx_ring[i].type == TX_Q) {
4047 				/*
4048 				 * Outbound queue is for outbound completions
4049 				 * only.
4050 				 */
4051 				if (qlge->isr_stride)
4052 					intr_ctx->handler = ql_msix_isr;
4053 				else
4054 					intr_ctx->handler = ql_msix_tx_isr;
4055 			} else {
4056 				/*
4057 				 * Inbound queues handle unicast frames only.
4058 				 */
4059 				if (qlge->isr_stride)
4060 					intr_ctx->handler = ql_msix_isr;
4061 				else
4062 					intr_ctx->handler = ql_msix_rx_isr;
4063 			}
4064 		}
4065 		i = qlge->intr_cnt;
4066 		for (; i < qlge->rx_ring_count; i++, intr_ctx++) {
4067 			int iv = i - qlge->isr_stride;
4068 			qlge->rx_ring[i].irq = iv;
4069 			intr_ctx->intr = iv;
4070 			intr_ctx->qlge = qlge;
4071 
4072 			/*
4073 			 * We set up each vectors enable/disable/read bits so
4074 			 * there's no bit/mask calculations in critical path.
4075 			 */
4076 			intr_ctx->intr_en_mask =
4077 			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4078 			    INTR_EN_TYPE_ENABLE | INTR_EN_IHD_MASK |
4079 			    INTR_EN_IHD | iv;
4080 			intr_ctx->intr_dis_mask =
4081 			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4082 			    INTR_EN_TYPE_DISABLE | INTR_EN_IHD_MASK |
4083 			    INTR_EN_IHD | iv;
4084 			intr_ctx->intr_read_mask =
4085 			    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4086 			    INTR_EN_TYPE_READ | INTR_EN_IHD_MASK | INTR_EN_IHD
4087 			    | iv;
4088 
4089 			if (qlge->rx_ring[i].type == TX_Q) {
4090 				/*
4091 				 * Outbound queue is for outbound completions
4092 				 * only.
4093 				 */
4094 				intr_ctx->handler = ql_msix_isr;
4095 			} else {
4096 				/*
4097 				 * Inbound queues handle unicast frames only.
4098 				 */
4099 				intr_ctx->handler = ql_msix_rx_isr;
4100 			}
4101 		}
4102 	} else {
4103 		/*
4104 		 * All rx_rings use the same intr_ctx since
4105 		 * there is only one vector.
4106 		 */
4107 		intr_ctx->intr = 0;
4108 		intr_ctx->qlge = qlge;
4109 		/*
4110 		 * We set up each vectors enable/disable/read bits so
4111 		 * there's no bit/mask calculations in the critical path.
4112 		 */
4113 		intr_ctx->intr_en_mask =
4114 		    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4115 		    INTR_EN_TYPE_ENABLE;
4116 		intr_ctx->intr_dis_mask =
4117 		    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4118 		    INTR_EN_TYPE_DISABLE;
4119 		intr_ctx->intr_read_mask =
4120 		    INTR_EN_TYPE_MASK | INTR_EN_INTR_MASK |
4121 		    INTR_EN_TYPE_READ;
4122 		/*
4123 		 * Single interrupt means one handler for all rings.
4124 		 */
4125 		intr_ctx->handler = ql_isr;
4126 		for (i = 0; i < qlge->rx_ring_count; i++)
4127 			qlge->rx_ring[i].irq = 0;
4128 	}
4129 }
4130 
4131 
4132 /*
4133  * Free allocated interrupts.
4134  */
4135 static void
4136 ql_free_irq_vectors(qlge_t *qlge)
4137 {
4138 	int i;
4139 	int rc;
4140 
4141 	if (qlge->sequence & INIT_INTR_ENABLED) {
4142 		/* Disable all interrupts */
4143 		if (qlge->intr_cap & DDI_INTR_FLAG_BLOCK) {
4144 			/* Call ddi_intr_block_disable() */
4145 			(void) ddi_intr_block_disable(qlge->htable,
4146 			    qlge->intr_cnt);
4147 		} else {
4148 			for (i = 0; i < qlge->intr_cnt; i++) {
4149 				(void) ddi_intr_disable(qlge->htable[i]);
4150 			}
4151 		}
4152 
4153 		qlge->sequence &= ~INIT_INTR_ENABLED;
4154 	}
4155 
4156 	for (i = 0; i < qlge->intr_cnt; i++) {
4157 
4158 		if (qlge->sequence & INIT_ADD_INTERRUPT)
4159 			(void) ddi_intr_remove_handler(qlge->htable[i]);
4160 
4161 		if (qlge->sequence & INIT_INTR_ALLOC) {
4162 			rc = ddi_intr_free(qlge->htable[i]);
4163 			if (rc != DDI_SUCCESS) {
4164 				/* EMPTY */
4165 				QL_PRINT(DBG_INIT, ("Free intr failed: %d",
4166 				    rc));
4167 			}
4168 		}
4169 	}
4170 	if (qlge->sequence & INIT_INTR_ALLOC)
4171 		qlge->sequence &= ~INIT_INTR_ALLOC;
4172 
4173 	if (qlge->sequence & INIT_ADD_INTERRUPT)
4174 		qlge->sequence &= ~INIT_ADD_INTERRUPT;
4175 
4176 	if (qlge->htable) {
4177 		kmem_free(qlge->htable, qlge->intr_size);
4178 		qlge->htable = NULL;
4179 	}
4180 }
4181 
4182 /*
4183  * Allocate interrupt vectors
4184  * For legacy and MSI, only 1 handle is needed.
4185  * For MSI-X, if fewer than 2 vectors are available, return failure.
4186  * Upon success, this maps the vectors to rx and tx rings for
4187  * interrupts.
4188  */
4189 static int
4190 ql_request_irq_vectors(qlge_t *qlge, int intr_type)
4191 {
4192 	dev_info_t *devinfo;
4193 	uint32_t request, orig;
4194 	int count, avail, actual;
4195 	int minimum;
4196 	int rc;
4197 
4198 	devinfo = qlge->dip;
4199 
4200 	switch (intr_type) {
4201 	case DDI_INTR_TYPE_FIXED:
4202 		request = 1;	/* Request 1 legacy interrupt handle */
4203 		minimum = 1;
4204 		QL_PRINT(DBG_INIT, ("interrupt type: legacy\n"));
4205 		break;
4206 
4207 	case DDI_INTR_TYPE_MSI:
4208 		request = 1;	/* Request 1 MSI interrupt handle */
4209 		minimum = 1;
4210 		QL_PRINT(DBG_INIT, ("interrupt type: MSI\n"));
4211 		break;
4212 
4213 	case DDI_INTR_TYPE_MSIX:
4214 		/*
4215 		 * Ideal number of vectors for the adapter is
4216 		 * # rss rings + tx completion rings for default completion
4217 		 * queue.
4218 		 */
4219 		request = qlge->rx_ring_count;
4220 
4221 		orig = request;
4222 		if (request > (MAX_RX_RINGS))
4223 			request = MAX_RX_RINGS;
4224 		minimum = 2;
4225 		QL_PRINT(DBG_INIT, ("interrupt type: MSI-X\n"));
4226 		break;
4227 
4228 	default:
4229 		QL_PRINT(DBG_INIT, ("Invalid parameter\n"));
4230 		return (DDI_FAILURE);
4231 	}
4232 
4233 	QL_PRINT(DBG_INIT, ("interrupt handles requested: %d  minimum: %d\n",
4234 	    request, minimum));
4235 
4236 	/*
4237 	 * Get number of supported interrupts
4238 	 */
4239 	rc = ddi_intr_get_nintrs(devinfo, intr_type, &count);
4240 	if ((rc != DDI_SUCCESS) || (count < minimum)) {
4241 		QL_PRINT(DBG_INIT, ("Get interrupt number failed. Return: %d, "
4242 		    "count: %d\n", rc, count));
4243 		return (DDI_FAILURE);
4244 	}
4245 	QL_PRINT(DBG_INIT, ("interrupts supported: %d\n", count));
4246 
4247 	/*
4248 	 * Get number of available interrupts
4249 	 */
4250 	rc = ddi_intr_get_navail(devinfo, intr_type, &avail);
4251 	if ((rc != DDI_SUCCESS) || (avail < minimum)) {
4252 		QL_PRINT(DBG_INIT,
4253 		    ("Get interrupt available number failed. Return:"
4254 		    " %d, available: %d\n", rc, avail));
4255 		return (DDI_FAILURE);
4256 	}
4257 	QL_PRINT(DBG_INIT, ("interrupts available: %d\n", avail));
4258 
4259 	if (avail < request) {
4260 		QL_PRINT(DBG_INIT, ("Request %d handles, %d available\n",
4261 		    request, avail));
4262 		request = avail;
4263 	}
4264 
4265 	actual = 0;
4266 	qlge->intr_cnt = 0;
4267 
4268 	/*
4269 	 * Allocate an array of interrupt handles
4270 	 */
4271 	qlge->intr_size = (size_t)(request * sizeof (ddi_intr_handle_t));
4272 	qlge->htable = kmem_alloc(qlge->intr_size, KM_SLEEP);
4273 
4274 	rc = ddi_intr_alloc(devinfo, qlge->htable, intr_type, 0,
4275 	    (int)request, &actual, DDI_INTR_ALLOC_NORMAL);
4276 	if (rc != DDI_SUCCESS) {
4277 		cmn_err(CE_WARN, "%s(%d) Allocate interrupts failed. return:"
4278 		    " %d, request: %d, actual: %d",
4279 		    __func__, qlge->instance, rc, request, actual);
4280 		goto ql_intr_alloc_fail;
4281 	}
4282 	qlge->intr_cnt = actual;
4283 
4284 	qlge->sequence |= INIT_INTR_ALLOC;
4285 
4286 	/*
4287 	 * If the actual number of vectors is less than the minumum
4288 	 * then fail.
4289 	 */
4290 	if (actual < minimum) {
4291 		cmn_err(CE_WARN,
4292 		    "Insufficient interrupt handles available: %d", actual);
4293 		goto ql_intr_alloc_fail;
4294 	}
4295 
4296 	/*
4297 	 * For MSI-X, actual might force us to reduce number of tx & rx rings
4298 	 */
4299 	if ((intr_type == DDI_INTR_TYPE_MSIX) && (orig > actual)) {
4300 		if (actual >= (orig / 2)) {
4301 			count = orig / 2;
4302 			qlge->rss_ring_count = count;
4303 			qlge->tx_ring_count = count;
4304 			qlge->isr_stride = count;
4305 		} else if (actual >= (orig / 4)) {
4306 			count = orig / 4;
4307 			qlge->rss_ring_count = count;
4308 			qlge->tx_ring_count = count;
4309 			qlge->isr_stride = count;
4310 		} else if (actual >= (orig / 8)) {
4311 			count = orig / 8;
4312 			qlge->rss_ring_count = count;
4313 			qlge->tx_ring_count = count;
4314 			qlge->isr_stride = count;
4315 		} else if (actual < MAX_RX_RINGS) {
4316 			qlge->tx_ring_count = 1;
4317 			qlge->rss_ring_count = actual - 1;
4318 		}
4319 		qlge->intr_cnt = count;
4320 		qlge->rx_ring_count = qlge->tx_ring_count +
4321 		    qlge->rss_ring_count;
4322 	}
4323 	cmn_err(CE_NOTE, "!qlge(%d) tx %d, rss %d, stride %d\n", qlge->instance,
4324 	    qlge->tx_ring_count, qlge->rss_ring_count, qlge->isr_stride);
4325 
4326 	/*
4327 	 * Get priority for first vector, assume remaining are all the same
4328 	 */
4329 	rc = ddi_intr_get_pri(qlge->htable[0], &qlge->intr_pri);
4330 	if (rc != DDI_SUCCESS) {
4331 		QL_PRINT(DBG_INIT, ("Get interrupt priority failed: %d\n", rc));
4332 		goto ql_intr_alloc_fail;
4333 	}
4334 
4335 	rc = ddi_intr_get_cap(qlge->htable[0], &qlge->intr_cap);
4336 	if (rc != DDI_SUCCESS) {
4337 		QL_PRINT(DBG_INIT, ("Get interrupt cap failed: %d\n", rc));
4338 		goto ql_intr_alloc_fail;
4339 	}
4340 
4341 	qlge->intr_type = intr_type;
4342 
4343 	return (DDI_SUCCESS);
4344 
4345 ql_intr_alloc_fail:
4346 	ql_free_irq_vectors(qlge);
4347 
4348 	return (DDI_FAILURE);
4349 }
4350 
4351 /*
4352  * Allocate interrupt vector(s) for one of the following interrupt types, MSI-X,
4353  * MSI or Legacy. In MSI and Legacy modes we only support a single receive and
4354  * transmit queue.
4355  */
4356 int
4357 ql_alloc_irqs(qlge_t *qlge)
4358 {
4359 	int intr_types;
4360 	int rval;
4361 
4362 	/*
4363 	 * Get supported interrupt types
4364 	 */
4365 	if (ddi_intr_get_supported_types(qlge->dip, &intr_types)
4366 	    != DDI_SUCCESS) {
4367 		cmn_err(CE_WARN, "%s(%d):ddi_intr_get_supported_types failed",
4368 		    __func__, qlge->instance);
4369 
4370 		return (DDI_FAILURE);
4371 	}
4372 
4373 	QL_PRINT(DBG_INIT, ("%s(%d) Interrupt types supported %d\n",
4374 	    __func__, qlge->instance, intr_types));
4375 
4376 	/* Install MSI-X interrupts */
4377 	if ((intr_types & DDI_INTR_TYPE_MSIX) != 0) {
4378 		QL_PRINT(DBG_INIT, ("%s(%d) MSI-X interrupt supported %d\n",
4379 		    __func__, qlge->instance, intr_types));
4380 		rval = ql_request_irq_vectors(qlge, DDI_INTR_TYPE_MSIX);
4381 		if (rval == DDI_SUCCESS) {
4382 			return (rval);
4383 		}
4384 		QL_PRINT(DBG_INIT, ("%s(%d) MSI-X interrupt allocation failed,"
4385 		    " trying MSI interrupts ...\n", __func__, qlge->instance));
4386 	}
4387 
4388 	/*
4389 	 * We will have 2 completion queues in MSI / Legacy mode,
4390 	 * Queue 0 for default completions
4391 	 * Queue 1 for transmit completions
4392 	 */
4393 	qlge->rss_ring_count = 1; /* Default completion queue (0) for all */
4394 	qlge->tx_ring_count = 1; /* Single tx completion queue */
4395 	qlge->rx_ring_count = qlge->tx_ring_count + qlge->rss_ring_count;
4396 
4397 	QL_PRINT(DBG_INIT, ("%s(%d) Falling back to single completion queue \n",
4398 	    __func__, qlge->instance));
4399 	/*
4400 	 * Add the h/w interrupt handler and initialise mutexes
4401 	 */
4402 	rval = DDI_FAILURE;
4403 
4404 	/*
4405 	 * If OS supports MSIX interrupt but fails to allocate, then try
4406 	 * MSI interrupt. If MSI interrupt allocation fails also, then roll
4407 	 * back to fixed interrupt.
4408 	 */
4409 	if (intr_types & DDI_INTR_TYPE_MSI) {
4410 		rval = ql_request_irq_vectors(qlge, DDI_INTR_TYPE_MSI);
4411 		if (rval == DDI_SUCCESS) {
4412 			qlge->intr_type = DDI_INTR_TYPE_MSI;
4413 			QL_PRINT(DBG_INIT, ("%s(%d) use MSI Interrupt \n",
4414 			    __func__, qlge->instance));
4415 		}
4416 	}
4417 
4418 	/* Try Fixed interrupt Legacy mode */
4419 	if (rval != DDI_SUCCESS) {
4420 		rval = ql_request_irq_vectors(qlge, DDI_INTR_TYPE_FIXED);
4421 		if (rval != DDI_SUCCESS) {
4422 			cmn_err(CE_WARN, "%s(%d):Legacy mode interrupt "
4423 			    "allocation failed",
4424 			    __func__, qlge->instance);
4425 		} else {
4426 			qlge->intr_type = DDI_INTR_TYPE_FIXED;
4427 			QL_PRINT(DBG_INIT, ("%s(%d) use Fixed Interrupt \n",
4428 			    __func__, qlge->instance));
4429 		}
4430 	}
4431 
4432 	return (rval);
4433 }
4434 
4435 static void
4436 ql_free_rx_tx_locks(qlge_t *qlge)
4437 {
4438 	int i;
4439 	struct rx_ring *rx_ring;
4440 	struct tx_ring *tx_ring;
4441 
4442 	for (i = 0; i < qlge->tx_ring_count; i++) {
4443 		tx_ring = &qlge->tx_ring[i];
4444 		mutex_destroy(&tx_ring->tx_lock);
4445 	}
4446 
4447 	for (i = 0; i < qlge->rx_ring_count; i++) {
4448 		rx_ring = &qlge->rx_ring[i];
4449 		mutex_destroy(&rx_ring->rx_lock);
4450 		mutex_destroy(&rx_ring->sbq_lock);
4451 		mutex_destroy(&rx_ring->lbq_lock);
4452 	}
4453 }
4454 
4455 /*
4456  * Frees all resources allocated during attach.
4457  *
4458  * Input:
4459  * dip = pointer to device information structure.
4460  * sequence = bits indicating resources to free.
4461  *
4462  * Context:
4463  * Kernel context.
4464  */
4465 static void
4466 ql_free_resources(qlge_t *qlge)
4467 {
4468 
4469 	/* Disable driver timer */
4470 	ql_stop_timer(qlge);
4471 
4472 	if (qlge->sequence & INIT_MAC_REGISTERED) {
4473 		(void) mac_unregister(qlge->mh);
4474 		qlge->sequence &= ~INIT_MAC_REGISTERED;
4475 	}
4476 
4477 	if (qlge->sequence & INIT_MAC_ALLOC) {
4478 		/* Nothing to do, macp is already freed */
4479 		qlge->sequence &= ~INIT_MAC_ALLOC;
4480 	}
4481 
4482 	if (qlge->sequence & INIT_PCI_CONFIG_SETUP) {
4483 		pci_config_teardown(&qlge->pci_handle);
4484 		qlge->sequence &= ~INIT_PCI_CONFIG_SETUP;
4485 	}
4486 
4487 	if (qlge->sequence & INIT_INTR_ALLOC) {
4488 		ql_free_irq_vectors(qlge);
4489 		qlge->sequence &= ~INIT_ADD_INTERRUPT;
4490 	}
4491 
4492 	if (qlge->sequence & INIT_ADD_SOFT_INTERRUPT) {
4493 		(void) ddi_intr_remove_softint(qlge->mpi_event_intr_hdl);
4494 		(void) ddi_intr_remove_softint(qlge->mpi_reset_intr_hdl);
4495 		(void) ddi_intr_remove_softint(qlge->asic_reset_intr_hdl);
4496 		qlge->sequence &= ~INIT_ADD_SOFT_INTERRUPT;
4497 	}
4498 
4499 	if (qlge->sequence & INIT_KSTATS) {
4500 		ql_fini_kstats(qlge);
4501 		qlge->sequence &= ~INIT_KSTATS;
4502 	}
4503 
4504 	if (qlge->sequence & INIT_MUTEX) {
4505 		mutex_destroy(&qlge->gen_mutex);
4506 		mutex_destroy(&qlge->hw_mutex);
4507 		mutex_destroy(&qlge->mbx_mutex);
4508 		cv_destroy(&qlge->cv_mbx_intr);
4509 		qlge->sequence &= ~INIT_MUTEX;
4510 	}
4511 
4512 	if (qlge->sequence & INIT_LOCKS_CREATED) {
4513 		ql_free_rx_tx_locks(qlge);
4514 		qlge->sequence &= ~INIT_LOCKS_CREATED;
4515 	}
4516 
4517 	if (qlge->sequence & INIT_MEMORY_ALLOC) {
4518 		ql_free_mem_resources(qlge);
4519 		qlge->sequence &= ~INIT_MEMORY_ALLOC;
4520 	}
4521 
4522 	if (qlge->sequence & INIT_REGS_SETUP) {
4523 		ddi_regs_map_free(&qlge->dev_handle);
4524 		qlge->sequence &= ~INIT_REGS_SETUP;
4525 	}
4526 
4527 	if (qlge->sequence & INIT_DOORBELL_REGS_SETUP) {
4528 		ddi_regs_map_free(&qlge->dev_doorbell_reg_handle);
4529 		qlge->sequence &= ~INIT_DOORBELL_REGS_SETUP;
4530 	}
4531 
4532 	/*
4533 	 * free flash flt table that allocated in attach stage
4534 	 */
4535 	if ((qlge->flt.ql_flt_entry_ptr != NULL)&&
4536 	    (qlge->flt.header.length != 0)) {
4537 		kmem_free(qlge->flt.ql_flt_entry_ptr, qlge->flt.header.length);
4538 		qlge->flt.ql_flt_entry_ptr = NULL;
4539 	}
4540 
4541 	if (qlge->sequence & INIT_FM) {
4542 		ql_fm_fini(qlge);
4543 		qlge->sequence &= ~INIT_FM;
4544 	}
4545 
4546 	ddi_prop_remove_all(qlge->dip);
4547 	ddi_set_driver_private(qlge->dip, NULL);
4548 
4549 	/* finally, free qlge structure */
4550 	if (qlge->sequence & INIT_SOFTSTATE_ALLOC) {
4551 		kmem_free(qlge, sizeof (qlge_t));
4552 	}
4553 }
4554 
4555 /*
4556  * Set promiscuous mode of the driver
4557  * Caller must catch HW_LOCK
4558  */
4559 void
4560 ql_set_promiscuous(qlge_t *qlge, int mode)
4561 {
4562 	if (mode) {
4563 		(void) ql_set_routing_reg(qlge, RT_IDX_PROMISCUOUS_SLOT,
4564 		    RT_IDX_VALID, 1);
4565 	} else {
4566 		(void) ql_set_routing_reg(qlge, RT_IDX_PROMISCUOUS_SLOT,
4567 		    RT_IDX_VALID, 0);
4568 	}
4569 }
4570 /*
4571  * Write 'data1' to Mac Protocol Address Index Register and
4572  * 'data2' to Mac Protocol Address Data Register
4573  *  Assuming that the Mac Protocol semaphore lock has been acquired.
4574  */
4575 static int
4576 ql_write_mac_proto_regs(qlge_t *qlge, uint32_t data1, uint32_t data2)
4577 {
4578 	int return_value = DDI_SUCCESS;
4579 
4580 	if (ql_wait_reg_bit(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
4581 	    MAC_PROTOCOL_ADDRESS_INDEX_MW, BIT_SET, 5) != DDI_SUCCESS) {
4582 		cmn_err(CE_WARN, "Wait for MAC_PROTOCOL Address Register "
4583 		    "timeout.");
4584 		return_value = DDI_FAILURE;
4585 		goto out;
4586 	}
4587 	ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX /* A8 */, data1);
4588 	ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA /* 0xAC */, data2);
4589 out:
4590 	return (return_value);
4591 }
4592 /*
4593  * Enable the 'index'ed multicast address in the host memory's multicast_list
4594  */
4595 int
4596 ql_add_multicast_address(qlge_t *qlge, int index)
4597 {
4598 	int rtn_val = DDI_FAILURE;
4599 	uint32_t offset;
4600 	uint32_t value1, value2;
4601 
4602 	/* Acquire the required semaphore */
4603 	if (ql_sem_spinlock(qlge, QL_MAC_PROTOCOL_SEM_MASK) != DDI_SUCCESS) {
4604 		return (rtn_val);
4605 	}
4606 
4607 	/* Program Offset0 - lower 32 bits of the MAC address */
4608 	offset = 0;
4609 	value1 = MAC_PROTOCOL_ADDRESS_ENABLE | MAC_PROTOCOL_TYPE_MULTICAST |
4610 	    (index << 4) | offset;
4611 	value2 = ((qlge->multicast_list[index].addr.ether_addr_octet[2] << 24)
4612 	    |(qlge->multicast_list[index].addr.ether_addr_octet[3] << 16)
4613 	    |(qlge->multicast_list[index].addr.ether_addr_octet[4] << 8)
4614 	    |(qlge->multicast_list[index].addr.ether_addr_octet[5]));
4615 	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS)
4616 		goto out;
4617 
4618 	/* Program offset1: upper 16 bits of the MAC address */
4619 	offset = 1;
4620 	value1 = MAC_PROTOCOL_ADDRESS_ENABLE | MAC_PROTOCOL_TYPE_MULTICAST |
4621 	    (index<<4) | offset;
4622 	value2 = ((qlge->multicast_list[index].addr.ether_addr_octet[0] << 8)
4623 	    |qlge->multicast_list[index].addr.ether_addr_octet[1]);
4624 	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS) {
4625 		goto out;
4626 	}
4627 	rtn_val = DDI_SUCCESS;
4628 out:
4629 	ql_sem_unlock(qlge, QL_MAC_PROTOCOL_SEM_MASK);
4630 	return (rtn_val);
4631 }
4632 
4633 /*
4634  * Disable the 'index'ed multicast address in the host memory's multicast_list
4635  */
4636 int
4637 ql_remove_multicast_address(qlge_t *qlge, int index)
4638 {
4639 	int rtn_val = DDI_FAILURE;
4640 	uint32_t offset;
4641 	uint32_t value1, value2;
4642 
4643 	/* Acquire the required semaphore */
4644 	if (ql_sem_spinlock(qlge, QL_MAC_PROTOCOL_SEM_MASK) != DDI_SUCCESS) {
4645 		return (rtn_val);
4646 	}
4647 	/* Program Offset0 - lower 32 bits of the MAC address */
4648 	offset = 0;
4649 	value1 = (MAC_PROTOCOL_TYPE_MULTICAST | offset)|(index<<4);
4650 	value2 =
4651 	    ((qlge->multicast_list[index].addr.ether_addr_octet[2] << 24)
4652 	    |(qlge->multicast_list[index].addr.ether_addr_octet[3] << 16)
4653 	    |(qlge->multicast_list[index].addr.ether_addr_octet[4] << 8)
4654 	    |(qlge->multicast_list[index].addr.ether_addr_octet[5]));
4655 	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS) {
4656 		goto out;
4657 	}
4658 	/* Program offset1: upper 16 bits of the MAC address */
4659 	offset = 1;
4660 	value1 = (MAC_PROTOCOL_TYPE_MULTICAST | offset)|(index<<4);
4661 	value2 = 0;
4662 	if (ql_write_mac_proto_regs(qlge, value1, value2) != DDI_SUCCESS) {
4663 		goto out;
4664 	}
4665 	rtn_val = DDI_SUCCESS;
4666 out:
4667 	ql_sem_unlock(qlge, QL_MAC_PROTOCOL_SEM_MASK);
4668 	return (rtn_val);
4669 }
4670 
4671 /*
4672  * Add a new multicast address to the list of supported list
4673  * This API is called after OS called gld_set_multicast (GLDv2)
4674  * or m_multicst (GLDv3)
4675  *
4676  * Restriction:
4677  * The number of maximum multicast address is limited by hardware.
4678  */
4679 int
4680 ql_add_to_multicast_list(qlge_t *qlge, uint8_t *ep)
4681 {
4682 	uint32_t index = qlge->multicast_list_count;
4683 	int rval = DDI_SUCCESS;
4684 	int status;
4685 
4686 	if ((ep[0] & 01) == 0) {
4687 		rval = EINVAL;
4688 		goto exit;
4689 	}
4690 
4691 	/* if there is an availabe space in multicast_list, then add it */
4692 	if (index < MAX_MULTICAST_LIST_SIZE) {
4693 		bcopy(ep, qlge->multicast_list[index].addr.ether_addr_octet,
4694 		    ETHERADDRL);
4695 		/* increment the total number of addresses in multicast list */
4696 		(void) ql_add_multicast_address(qlge, index);
4697 		qlge->multicast_list_count++;
4698 		QL_PRINT(DBG_GLD,
4699 		    ("%s(%d): added to index of multicast list= 0x%x, "
4700 		    "total %d\n", __func__, qlge->instance, index,
4701 		    qlge->multicast_list_count));
4702 
4703 		if (index > MAX_MULTICAST_HW_SIZE) {
4704 			if (!qlge->multicast_promisc) {
4705 				status = ql_set_routing_reg(qlge,
4706 				    RT_IDX_ALLMULTI_SLOT,
4707 				    RT_IDX_MCAST, 1);
4708 				if (status) {
4709 					cmn_err(CE_WARN,
4710 					    "Failed to init routing reg "
4711 					    "for mcast promisc mode.");
4712 					rval = ENOENT;
4713 					goto exit;
4714 				}
4715 				qlge->multicast_promisc = B_TRUE;
4716 			}
4717 		}
4718 	} else {
4719 		rval = ENOENT;
4720 	}
4721 exit:
4722 	return (rval);
4723 }
4724 
4725 /*
4726  * Remove an old multicast address from the list of supported multicast
4727  * addresses. This API is called after OS called gld_set_multicast (GLDv2)
4728  * or m_multicst (GLDv3)
4729  * The number of maximum multicast address is limited by hardware.
4730  */
4731 int
4732 ql_remove_from_multicast_list(qlge_t *qlge, uint8_t *ep)
4733 {
4734 	uint32_t total = qlge->multicast_list_count;
4735 	int i = 0;
4736 	int rmv_index = 0;
4737 	size_t length = sizeof (ql_multicast_addr);
4738 	int status;
4739 
4740 	for (i = 0; i < total; i++) {
4741 		if (bcmp(ep, &qlge->multicast_list[i].addr, ETHERADDRL) != 0) {
4742 			continue;
4743 		}
4744 
4745 		rmv_index = i;
4746 		/* block move the reset of other multicast address forward */
4747 		length = ((total -1) -i) * sizeof (ql_multicast_addr);
4748 		if (length > 0) {
4749 			bcopy(&qlge->multicast_list[i+1],
4750 			    &qlge->multicast_list[i], length);
4751 		}
4752 		qlge->multicast_list_count--;
4753 		if (qlge->multicast_list_count <= MAX_MULTICAST_HW_SIZE) {
4754 			/*
4755 			 * there is a deletion in multicast list table,
4756 			 * re-enable them
4757 			 */
4758 			for (i = rmv_index; i < qlge->multicast_list_count;
4759 			    i++) {
4760 				(void) ql_add_multicast_address(qlge, i);
4761 			}
4762 			/* and disable the last one */
4763 			(void) ql_remove_multicast_address(qlge, i);
4764 
4765 			/* disable multicast promiscuous mode */
4766 			if (qlge->multicast_promisc) {
4767 				status = ql_set_routing_reg(qlge,
4768 				    RT_IDX_ALLMULTI_SLOT,
4769 				    RT_IDX_MCAST, 0);
4770 				if (status) {
4771 					cmn_err(CE_WARN,
4772 					    "Failed to init routing reg for "
4773 					    "mcast promisc mode.");
4774 					goto exit;
4775 				}
4776 				/* write to config register */
4777 				qlge->multicast_promisc = B_FALSE;
4778 			}
4779 		}
4780 		break;
4781 	}
4782 exit:
4783 	return (DDI_SUCCESS);
4784 }
4785 
4786 /*
4787  * Read a XGMAC register
4788  */
4789 int
4790 ql_read_xgmac_reg(qlge_t *qlge, uint32_t addr, uint32_t *val)
4791 {
4792 	int rtn_val = DDI_FAILURE;
4793 
4794 	/* wait for XGMAC Address register RDY bit set */
4795 	if (ql_wait_reg_bit(qlge, REG_XGMAC_ADDRESS, XGMAC_ADDRESS_RDY,
4796 	    BIT_SET, 10) != DDI_SUCCESS) {
4797 		goto out;
4798 	}
4799 	/* start rx transaction */
4800 	ql_write_reg(qlge, REG_XGMAC_ADDRESS, addr|XGMAC_ADDRESS_READ_TRANSACT);
4801 
4802 	/*
4803 	 * wait for XGMAC Address register RDY bit set,
4804 	 * which indicates data is ready
4805 	 */
4806 	if (ql_wait_reg_bit(qlge, REG_XGMAC_ADDRESS, XGMAC_ADDRESS_RDY,
4807 	    BIT_SET, 10) != DDI_SUCCESS) {
4808 		goto out;
4809 	}
4810 	/* read data from XGAMC_DATA register */
4811 	*val = ql_read_reg(qlge, REG_XGMAC_DATA);
4812 	rtn_val = DDI_SUCCESS;
4813 out:
4814 	return (rtn_val);
4815 }
4816 
4817 /*
4818  * Implement checksum offload for IPv4 IP packets
4819  */
4820 static void
4821 ql_hw_csum_setup(qlge_t *qlge, uint32_t pflags, caddr_t bp,
4822     struct ob_mac_iocb_req *mac_iocb_ptr)
4823 {
4824 	struct ip *iphdr = NULL;
4825 	struct ether_header *ethhdr;
4826 	struct ether_vlan_header *ethvhdr;
4827 	struct tcphdr *tcp_hdr;
4828 	uint32_t etherType;
4829 	int mac_hdr_len, ip_hdr_len, tcp_udp_hdr_len;
4830 	int ip_hdr_off, tcp_udp_hdr_off, hdr_off;
4831 
4832 	ethhdr  = (struct ether_header *)((void *)bp);
4833 	ethvhdr = (struct ether_vlan_header *)((void *)bp);
4834 	/* Is this vlan packet? */
4835 	if (ntohs(ethvhdr->ether_tpid) == ETHERTYPE_VLAN) {
4836 		mac_hdr_len = sizeof (struct ether_vlan_header);
4837 		etherType = ntohs(ethvhdr->ether_type);
4838 	} else {
4839 		mac_hdr_len = sizeof (struct ether_header);
4840 		etherType = ntohs(ethhdr->ether_type);
4841 	}
4842 	/* Is this IPv4 or IPv6 packet? */
4843 	if (IPH_HDR_VERSION((ipha_t *)(void *)(bp+mac_hdr_len)) ==
4844 	    IPV4_VERSION) {
4845 		if (etherType == ETHERTYPE_IP /* 0800 */) {
4846 			iphdr = (struct ip *)(void *)(bp+mac_hdr_len);
4847 		} else {
4848 			/* EMPTY */
4849 			QL_PRINT(DBG_TX,
4850 			    ("%s(%d) : IPv4 None IP packet type 0x%x\n",
4851 			    __func__, qlge->instance, etherType));
4852 		}
4853 	}
4854 	/* ipV4 packets */
4855 	if (iphdr != NULL) {
4856 
4857 		ip_hdr_len = IPH_HDR_LENGTH(iphdr);
4858 		QL_PRINT(DBG_TX,
4859 		    ("%s(%d) : IPv4 header length using IPH_HDR_LENGTH:"
4860 		    " %d bytes \n", __func__, qlge->instance, ip_hdr_len));
4861 
4862 		ip_hdr_off = mac_hdr_len;
4863 		QL_PRINT(DBG_TX, ("%s(%d) : ip_hdr_len=%d\n",
4864 		    __func__, qlge->instance, ip_hdr_len));
4865 
4866 		mac_iocb_ptr->flag0 = (uint8_t)(mac_iocb_ptr->flag0 |
4867 		    OB_MAC_IOCB_REQ_IPv4);
4868 
4869 		if (pflags & HCK_IPV4_HDRCKSUM) {
4870 			QL_PRINT(DBG_TX, ("%s(%d) : Do IPv4 header checksum\n",
4871 			    __func__, qlge->instance));
4872 			mac_iocb_ptr->opcode = OPCODE_OB_MAC_OFFLOAD_IOCB;
4873 			mac_iocb_ptr->flag2 = (uint8_t)(mac_iocb_ptr->flag2 |
4874 			    OB_MAC_IOCB_REQ_IC);
4875 			iphdr->ip_sum = 0;
4876 			mac_iocb_ptr->hdr_off = (uint16_t)
4877 			    cpu_to_le16(ip_hdr_off);
4878 		}
4879 		if (pflags & HCK_FULLCKSUM) {
4880 			if (iphdr->ip_p == IPPROTO_TCP) {
4881 				tcp_hdr =
4882 				    (struct tcphdr *)(void *)
4883 				    ((uint8_t *)(void *)iphdr + ip_hdr_len);
4884 				QL_PRINT(DBG_TX, ("%s(%d) : Do TCP checksum\n",
4885 				    __func__, qlge->instance));
4886 				mac_iocb_ptr->opcode =
4887 				    OPCODE_OB_MAC_OFFLOAD_IOCB;
4888 				mac_iocb_ptr->flag1 =
4889 				    (uint8_t)(mac_iocb_ptr->flag1 |
4890 				    OB_MAC_IOCB_REQ_TC);
4891 				mac_iocb_ptr->flag2 =
4892 				    (uint8_t)(mac_iocb_ptr->flag2 |
4893 				    OB_MAC_IOCB_REQ_IC);
4894 				iphdr->ip_sum = 0;
4895 				tcp_udp_hdr_off = mac_hdr_len+ip_hdr_len;
4896 				tcp_udp_hdr_len = tcp_hdr->th_off*4;
4897 				QL_PRINT(DBG_TX, ("%s(%d): tcp header len:%d\n",
4898 				    __func__, qlge->instance, tcp_udp_hdr_len));
4899 				hdr_off = ip_hdr_off;
4900 				tcp_udp_hdr_off <<= 6;
4901 				hdr_off |= tcp_udp_hdr_off;
4902 				mac_iocb_ptr->hdr_off =
4903 				    (uint16_t)cpu_to_le16(hdr_off);
4904 				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
4905 				    cpu_to_le16(mac_hdr_len + ip_hdr_len +
4906 				    tcp_udp_hdr_len);
4907 
4908 				/*
4909 				 * if the chip is unable to do pseudo header
4910 				 * cksum calculation, do it in then put the
4911 				 * result to the data passed to the chip
4912 				 */
4913 				if (qlge->cfg_flags &
4914 				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM) {
4915 					ql_pseudo_cksum((uint8_t *)iphdr);
4916 				}
4917 			} else if (iphdr->ip_p == IPPROTO_UDP) {
4918 				QL_PRINT(DBG_TX, ("%s(%d) : Do UDP checksum\n",
4919 				    __func__, qlge->instance));
4920 				mac_iocb_ptr->opcode =
4921 				    OPCODE_OB_MAC_OFFLOAD_IOCB;
4922 				mac_iocb_ptr->flag1 =
4923 				    (uint8_t)(mac_iocb_ptr->flag1 |
4924 				    OB_MAC_IOCB_REQ_UC);
4925 				mac_iocb_ptr->flag2 =
4926 				    (uint8_t)(mac_iocb_ptr->flag2 |
4927 				    OB_MAC_IOCB_REQ_IC);
4928 				iphdr->ip_sum = 0;
4929 				tcp_udp_hdr_off = mac_hdr_len + ip_hdr_len;
4930 				tcp_udp_hdr_len = sizeof (struct udphdr);
4931 				QL_PRINT(DBG_TX, ("%s(%d):udp header len:%d\n",
4932 				    __func__, qlge->instance, tcp_udp_hdr_len));
4933 				hdr_off = ip_hdr_off;
4934 				tcp_udp_hdr_off <<= 6;
4935 				hdr_off |= tcp_udp_hdr_off;
4936 				mac_iocb_ptr->hdr_off =
4937 				    (uint16_t)cpu_to_le16(hdr_off);
4938 				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
4939 				    cpu_to_le16(mac_hdr_len + ip_hdr_len
4940 				    + tcp_udp_hdr_len);
4941 
4942 				/*
4943 				 * if the chip is unable to calculate pseudo
4944 				 * hdr cksum,do it in then put the result to
4945 				 * the data passed to the chip
4946 				 */
4947 				if (qlge->cfg_flags &
4948 				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM) {
4949 					ql_pseudo_cksum((uint8_t *)iphdr);
4950 				}
4951 			}
4952 		}
4953 	}
4954 }
4955 
4956 /*
4957  * For TSO/LSO:
4958  * MAC frame transmission with TCP large segment offload is performed in the
4959  * same way as the MAC frame transmission with checksum offload with the
4960  * exception that the maximum TCP segment size (MSS) must be specified to
4961  * allow the chip to segment the data into legal sized frames.
4962  * The host also needs to calculate a pseudo-header checksum over the
4963  * following fields:
4964  * Source IP Address, Destination IP Address, and the Protocol.
4965  * The TCP length is not included in the pseudo-header calculation.
4966  * The pseudo-header checksum is place in the TCP checksum field of the
4967  * prototype header.
4968  */
4969 static void
4970 ql_lso_pseudo_cksum(uint8_t *buf)
4971 {
4972 	uint32_t cksum;
4973 	uint16_t iphl;
4974 	uint16_t proto;
4975 
4976 	/*
4977 	 * Calculate the LSO pseudo-header checksum.
4978 	 */
4979 	iphl = (uint16_t)(4 * (buf[0] & 0xF));
4980 	cksum = proto = buf[9];
4981 	cksum += (((uint16_t)buf[12])<<8) + buf[13];
4982 	cksum += (((uint16_t)buf[14])<<8) + buf[15];
4983 	cksum += (((uint16_t)buf[16])<<8) + buf[17];
4984 	cksum += (((uint16_t)buf[18])<<8) + buf[19];
4985 	cksum = (cksum>>16) + (cksum & 0xFFFF);
4986 	cksum = (cksum>>16) + (cksum & 0xFFFF);
4987 
4988 	/*
4989 	 * Point it to the TCP/UDP header, and
4990 	 * update the checksum field.
4991 	 */
4992 	buf += iphl + ((proto == IPPROTO_TCP) ?
4993 	    TCP_CKSUM_OFFSET : UDP_CKSUM_OFFSET);
4994 
4995 	*(uint16_t *)(void *)buf = (uint16_t)htons((uint16_t)cksum);
4996 }
4997 
4998 /*
4999  * For IPv4 IP packets, distribute the tx packets evenly among tx rings
5000  */
5001 typedef	uint32_t	ub4; /* unsigned 4-byte quantities */
5002 typedef	uint8_t		ub1;
5003 
5004 #define	hashsize(n)	((ub4)1<<(n))
5005 #define	hashmask(n)	(hashsize(n)-1)
5006 
5007 #define	mix(a, b, c) \
5008 { \
5009 	a -= b; a -= c; a ^= (c>>13); \
5010 	b -= c; b -= a; b ^= (a<<8); \
5011 	c -= a; c -= b; c ^= (b>>13); \
5012 	a -= b; a -= c; a ^= (c>>12);  \
5013 	b -= c; b -= a; b ^= (a<<16); \
5014 	c -= a; c -= b; c ^= (b>>5); \
5015 	a -= b; a -= c; a ^= (c>>3);  \
5016 	b -= c; b -= a; b ^= (a<<10); \
5017 	c -= a; c -= b; c ^= (b>>15); \
5018 }
5019 
5020 ub4
5021 hash(k, length, initval)
5022 register ub1 *k;	/* the key */
5023 register ub4 length;	/* the length of the key */
5024 register ub4 initval;	/* the previous hash, or an arbitrary value */
5025 {
5026 	register ub4 a, b, c, len;
5027 
5028 	/* Set up the internal state */
5029 	len = length;
5030 	a = b = 0x9e3779b9;	/* the golden ratio; an arbitrary value */
5031 	c = initval;		/* the previous hash value */
5032 
5033 	/* handle most of the key */
5034 	while (len >= 12) {
5035 		a += (k[0] +((ub4)k[1]<<8) +((ub4)k[2]<<16) +((ub4)k[3]<<24));
5036 		b += (k[4] +((ub4)k[5]<<8) +((ub4)k[6]<<16) +((ub4)k[7]<<24));
5037 		c += (k[8] +((ub4)k[9]<<8) +((ub4)k[10]<<16)+((ub4)k[11]<<24));
5038 		mix(a, b, c);
5039 		k += 12;
5040 		len -= 12;
5041 	}
5042 
5043 	/* handle the last 11 bytes */
5044 	c += length;
5045 	/* all the case statements fall through */
5046 	switch (len) {
5047 		/* FALLTHRU */
5048 	case 11: c += ((ub4)k[10]<<24);
5049 		/* FALLTHRU */
5050 	case 10: c += ((ub4)k[9]<<16);
5051 		/* FALLTHRU */
5052 	case 9 : c += ((ub4)k[8]<<8);
5053 	/* the first byte of c is reserved for the length */
5054 		/* FALLTHRU */
5055 	case 8 : b += ((ub4)k[7]<<24);
5056 		/* FALLTHRU */
5057 	case 7 : b += ((ub4)k[6]<<16);
5058 		/* FALLTHRU */
5059 	case 6 : b += ((ub4)k[5]<<8);
5060 		/* FALLTHRU */
5061 	case 5 : b += k[4];
5062 		/* FALLTHRU */
5063 	case 4 : a += ((ub4)k[3]<<24);
5064 		/* FALLTHRU */
5065 	case 3 : a += ((ub4)k[2]<<16);
5066 		/* FALLTHRU */
5067 	case 2 : a += ((ub4)k[1]<<8);
5068 		/* FALLTHRU */
5069 	case 1 : a += k[0];
5070 	/* case 0: nothing left to add */
5071 	}
5072 	mix(a, b, c);
5073 	/* report the result */
5074 	return (c);
5075 }
5076 
5077 uint8_t
5078 ql_tx_hashing(qlge_t *qlge, caddr_t bp)
5079 {
5080 	struct ip *iphdr = NULL;
5081 	struct ether_header *ethhdr;
5082 	struct ether_vlan_header *ethvhdr;
5083 	struct tcphdr *tcp_hdr;
5084 	struct udphdr *udp_hdr;
5085 	uint32_t etherType;
5086 	int mac_hdr_len, ip_hdr_len;
5087 	uint32_t h = 0; /* 0 by default */
5088 	uint8_t tx_ring_id = 0;
5089 	uint32_t ip_src_addr = 0;
5090 	uint32_t ip_desc_addr = 0;
5091 	uint16_t src_port = 0;
5092 	uint16_t dest_port = 0;
5093 	uint8_t key[12];
5094 	QL_PRINT(DBG_TX, ("%s(%d) entered \n", __func__, qlge->instance));
5095 
5096 	ethhdr = (struct ether_header *)((void *)bp);
5097 	ethvhdr = (struct ether_vlan_header *)((void *)bp);
5098 
5099 	if (qlge->tx_ring_count == 1)
5100 		return (tx_ring_id);
5101 
5102 	/* Is this vlan packet? */
5103 	if (ntohs(ethvhdr->ether_tpid) == ETHERTYPE_VLAN) {
5104 		mac_hdr_len = sizeof (struct ether_vlan_header);
5105 		etherType = ntohs(ethvhdr->ether_type);
5106 	} else {
5107 		mac_hdr_len = sizeof (struct ether_header);
5108 		etherType = ntohs(ethhdr->ether_type);
5109 	}
5110 	/* Is this IPv4 or IPv6 packet? */
5111 	if (etherType == ETHERTYPE_IP /* 0800 */) {
5112 		if (IPH_HDR_VERSION((ipha_t *)(void *)(bp+mac_hdr_len))
5113 		    == IPV4_VERSION) {
5114 			iphdr = (struct ip *)(void *)(bp+mac_hdr_len);
5115 		}
5116 		if (((unsigned long)iphdr) & 0x3) {
5117 			/*  IP hdr not 4-byte aligned */
5118 			return (tx_ring_id);
5119 		}
5120 	}
5121 	/* ipV4 packets */
5122 	if (iphdr) {
5123 
5124 		ip_hdr_len = IPH_HDR_LENGTH(iphdr);
5125 		ip_src_addr = iphdr->ip_src.s_addr;
5126 		ip_desc_addr = iphdr->ip_dst.s_addr;
5127 
5128 		if (iphdr->ip_p == IPPROTO_TCP) {
5129 			tcp_hdr = (struct tcphdr *)(void *)
5130 			    ((uint8_t *)iphdr + ip_hdr_len);
5131 			src_port = tcp_hdr->th_sport;
5132 			dest_port = tcp_hdr->th_dport;
5133 		} else if (iphdr->ip_p == IPPROTO_UDP) {
5134 			udp_hdr = (struct udphdr *)(void *)
5135 			    ((uint8_t *)iphdr + ip_hdr_len);
5136 			src_port = udp_hdr->uh_sport;
5137 			dest_port = udp_hdr->uh_dport;
5138 		}
5139 		key[0] = (uint8_t)((ip_src_addr) &0xFF);
5140 		key[1] = (uint8_t)((ip_src_addr >> 8) &0xFF);
5141 		key[2] = (uint8_t)((ip_src_addr >> 16) &0xFF);
5142 		key[3] = (uint8_t)((ip_src_addr >> 24) &0xFF);
5143 		key[4] = (uint8_t)((ip_desc_addr) &0xFF);
5144 		key[5] = (uint8_t)((ip_desc_addr >> 8) &0xFF);
5145 		key[6] = (uint8_t)((ip_desc_addr >> 16) &0xFF);
5146 		key[7] = (uint8_t)((ip_desc_addr >> 24) &0xFF);
5147 		key[8] = (uint8_t)((src_port) &0xFF);
5148 		key[9] = (uint8_t)((src_port >> 8) &0xFF);
5149 		key[10] = (uint8_t)((dest_port) &0xFF);
5150 		key[11] = (uint8_t)((dest_port >> 8) &0xFF);
5151 		h = hash(key, 12, 0); /* return 32 bit */
5152 		tx_ring_id = (h & (qlge->tx_ring_count - 1));
5153 		if (tx_ring_id >= qlge->tx_ring_count) {
5154 			cmn_err(CE_WARN, "%s bad tx_ring_id %d\n",
5155 			    __func__, tx_ring_id);
5156 			tx_ring_id = 0;
5157 		}
5158 	}
5159 	return (tx_ring_id);
5160 }
5161 
5162 /*
5163  * Tell the hardware to do Large Send Offload (LSO)
5164  *
5165  * Some fields in ob_mac_iocb need to be set so hardware can know what is
5166  * the incoming packet, TCP or UDP, whether a VLAN tag needs to be inserted
5167  * in the right place of the packet etc, thus, hardware can process the
5168  * packet correctly.
5169  */
5170 static void
5171 ql_hw_lso_setup(qlge_t *qlge, uint32_t mss, caddr_t bp,
5172     struct ob_mac_iocb_req *mac_iocb_ptr)
5173 {
5174 	struct ip *iphdr = NULL;
5175 	struct ether_header *ethhdr;
5176 	struct ether_vlan_header *ethvhdr;
5177 	struct tcphdr *tcp_hdr;
5178 	struct udphdr *udp_hdr;
5179 	uint32_t etherType;
5180 	uint16_t mac_hdr_len, ip_hdr_len, tcp_udp_hdr_len;
5181 	uint16_t ip_hdr_off, tcp_udp_hdr_off, hdr_off;
5182 
5183 	ethhdr = (struct ether_header *)(void *)bp;
5184 	ethvhdr = (struct ether_vlan_header *)(void *)bp;
5185 
5186 	/* Is this vlan packet? */
5187 	if (ntohs(ethvhdr->ether_tpid) == ETHERTYPE_VLAN) {
5188 		mac_hdr_len = sizeof (struct ether_vlan_header);
5189 		etherType = ntohs(ethvhdr->ether_type);
5190 	} else {
5191 		mac_hdr_len = sizeof (struct ether_header);
5192 		etherType = ntohs(ethhdr->ether_type);
5193 	}
5194 	/* Is this IPv4 or IPv6 packet? */
5195 	if (IPH_HDR_VERSION((ipha_t *)(void *)(bp + mac_hdr_len)) ==
5196 	    IPV4_VERSION) {
5197 		if (etherType == ETHERTYPE_IP /* 0800 */) {
5198 			iphdr 	= (struct ip *)(void *)(bp+mac_hdr_len);
5199 		} else {
5200 			/* EMPTY */
5201 			QL_PRINT(DBG_TX, ("%s(%d) : IPv4 None IP packet"
5202 			    " type 0x%x\n",
5203 			    __func__, qlge->instance, etherType));
5204 		}
5205 	}
5206 
5207 	if (iphdr != NULL) { /* ipV4 packets */
5208 		ip_hdr_len = (uint16_t)IPH_HDR_LENGTH(iphdr);
5209 		QL_PRINT(DBG_TX,
5210 		    ("%s(%d) : IPv4 header length using IPH_HDR_LENGTH: %d"
5211 		    " bytes \n", __func__, qlge->instance, ip_hdr_len));
5212 
5213 		ip_hdr_off = mac_hdr_len;
5214 		QL_PRINT(DBG_TX, ("%s(%d) : ip_hdr_len=%d\n",
5215 		    __func__, qlge->instance, ip_hdr_len));
5216 
5217 		mac_iocb_ptr->flag0 = (uint8_t)(mac_iocb_ptr->flag0 |
5218 		    OB_MAC_IOCB_REQ_IPv4);
5219 		if (qlge->cfg_flags & CFG_CKSUM_FULL_IPv4) {
5220 			if (iphdr->ip_p == IPPROTO_TCP) {
5221 				tcp_hdr = (struct tcphdr *)(void *)
5222 				    ((uint8_t *)(void *)iphdr +
5223 				    ip_hdr_len);
5224 				QL_PRINT(DBG_TX, ("%s(%d) : Do TSO on TCP "
5225 				    "packet\n",
5226 				    __func__, qlge->instance));
5227 				mac_iocb_ptr->opcode =
5228 				    OPCODE_OB_MAC_OFFLOAD_IOCB;
5229 				mac_iocb_ptr->flag1 =
5230 				    (uint8_t)(mac_iocb_ptr->flag1 |
5231 				    OB_MAC_IOCB_REQ_LSO);
5232 				iphdr->ip_sum = 0;
5233 				tcp_udp_hdr_off =
5234 				    (uint16_t)(mac_hdr_len+ip_hdr_len);
5235 				tcp_udp_hdr_len =
5236 				    (uint16_t)(tcp_hdr->th_off*4);
5237 				QL_PRINT(DBG_TX, ("%s(%d): tcp header len:%d\n",
5238 				    __func__, qlge->instance, tcp_udp_hdr_len));
5239 				hdr_off = ip_hdr_off;
5240 				tcp_udp_hdr_off <<= 6;
5241 				hdr_off |= tcp_udp_hdr_off;
5242 				mac_iocb_ptr->hdr_off =
5243 				    (uint16_t)cpu_to_le16(hdr_off);
5244 				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
5245 				    cpu_to_le16(mac_hdr_len + ip_hdr_len +
5246 				    tcp_udp_hdr_len);
5247 				mac_iocb_ptr->mss = (uint16_t)cpu_to_le16(mss);
5248 
5249 				/*
5250 				 * if the chip is unable to calculate pseudo
5251 				 * header checksum, do it in then put the result
5252 				 * to the data passed to the chip
5253 				 */
5254 				if (qlge->cfg_flags &
5255 				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM)
5256 					ql_lso_pseudo_cksum((uint8_t *)iphdr);
5257 			} else if (iphdr->ip_p == IPPROTO_UDP) {
5258 				udp_hdr = (struct udphdr *)(void *)
5259 				    ((uint8_t *)(void *)iphdr
5260 				    + ip_hdr_len);
5261 				QL_PRINT(DBG_TX, ("%s(%d) : Do TSO on UDP "
5262 				    "packet\n",
5263 				    __func__, qlge->instance));
5264 				mac_iocb_ptr->opcode =
5265 				    OPCODE_OB_MAC_OFFLOAD_IOCB;
5266 				mac_iocb_ptr->flag1 =
5267 				    (uint8_t)(mac_iocb_ptr->flag1 |
5268 				    OB_MAC_IOCB_REQ_LSO);
5269 				iphdr->ip_sum = 0;
5270 				tcp_udp_hdr_off =
5271 				    (uint16_t)(mac_hdr_len+ip_hdr_len);
5272 				tcp_udp_hdr_len =
5273 				    (uint16_t)(udp_hdr->uh_ulen*4);
5274 				QL_PRINT(DBG_TX, ("%s(%d):udp header len:%d\n",
5275 				    __func__, qlge->instance, tcp_udp_hdr_len));
5276 				hdr_off = ip_hdr_off;
5277 				tcp_udp_hdr_off <<= 6;
5278 				hdr_off |= tcp_udp_hdr_off;
5279 				mac_iocb_ptr->hdr_off =
5280 				    (uint16_t)cpu_to_le16(hdr_off);
5281 				mac_iocb_ptr->protocol_hdr_len = (uint16_t)
5282 				    cpu_to_le16(mac_hdr_len + ip_hdr_len +
5283 				    tcp_udp_hdr_len);
5284 				mac_iocb_ptr->mss = (uint16_t)cpu_to_le16(mss);
5285 
5286 				/*
5287 				 * if the chip is unable to do pseudo header
5288 				 * checksum calculation, do it here then put the
5289 				 * result to the data passed to the chip
5290 				 */
5291 				if (qlge->cfg_flags &
5292 				    CFG_HW_UNABLE_PSEUDO_HDR_CKSUM)
5293 					ql_lso_pseudo_cksum((uint8_t *)iphdr);
5294 			}
5295 		}
5296 	}
5297 }
5298 
5299 /*
5300  * Generic packet sending function which is used to send one packet.
5301  */
5302 int
5303 ql_send_common(struct tx_ring *tx_ring, mblk_t *mp)
5304 {
5305 	struct tx_ring_desc *tx_cb;
5306 	struct ob_mac_iocb_req *mac_iocb_ptr;
5307 	mblk_t *tp;
5308 	size_t msg_len = 0;
5309 	size_t off;
5310 	caddr_t bp;
5311 	size_t nbyte, total_len;
5312 	uint_t i = 0;
5313 	int j = 0, frags = 0;
5314 	uint32_t phy_addr_low, phy_addr_high;
5315 	uint64_t phys_addr;
5316 	clock_t now;
5317 	uint32_t pflags = 0;
5318 	uint32_t mss = 0;
5319 	enum tx_mode_t tx_mode;
5320 	struct oal_entry *oal_entry;
5321 	int status;
5322 	uint_t ncookies, oal_entries, max_oal_entries;
5323 	size_t max_seg_len = 0;
5324 	boolean_t use_lso = B_FALSE;
5325 	struct oal_entry *tx_entry = NULL;
5326 	struct oal_entry *last_oal_entry;
5327 	qlge_t *qlge = tx_ring->qlge;
5328 	ddi_dma_cookie_t dma_cookie;
5329 	size_t tx_buf_len = QL_MAX_COPY_LENGTH;
5330 	int force_pullup = 0;
5331 
5332 	tp = mp;
5333 	total_len = msg_len = 0;
5334 	max_oal_entries = TX_DESC_PER_IOCB + MAX_SG_ELEMENTS-1;
5335 
5336 	/* Calculate number of data and segments in the incoming message */
5337 	for (tp = mp; tp != NULL; tp = tp->b_cont) {
5338 		nbyte = MBLKL(tp);
5339 		total_len += nbyte;
5340 		max_seg_len = max(nbyte, max_seg_len);
5341 		QL_PRINT(DBG_TX, ("Requested sending data in %d segments, "
5342 		    "total length: %d\n", frags, nbyte));
5343 		frags++;
5344 	}
5345 
5346 	if (total_len >= QL_LSO_MAX) {
5347 		freemsg(mp);
5348 #ifdef QLGE_LOAD_UNLOAD
5349 		cmn_err(CE_NOTE, "%s: quit, packet oversize %d\n",
5350 		    __func__, (int)total_len);
5351 #endif
5352 		return (NULL);
5353 	}
5354 
5355 	bp = (caddr_t)mp->b_rptr;
5356 	if (bp[0] & 1) {
5357 		if (bcmp(bp, ql_ether_broadcast_addr.ether_addr_octet,
5358 		    ETHERADDRL) == 0) {
5359 			QL_PRINT(DBG_TX, ("Broadcast packet\n"));
5360 			tx_ring->brdcstxmt++;
5361 		} else {
5362 			QL_PRINT(DBG_TX, ("multicast packet\n"));
5363 			tx_ring->multixmt++;
5364 		}
5365 	}
5366 
5367 	tx_ring->obytes += total_len;
5368 	tx_ring->opackets ++;
5369 
5370 	QL_PRINT(DBG_TX, ("total requested sending data length: %d, in %d segs,"
5371 	    " max seg len: %d\n", total_len, frags, max_seg_len));
5372 
5373 	/* claim a free slot in tx ring */
5374 	tx_cb = &tx_ring->wq_desc[tx_ring->prod_idx];
5375 
5376 	/* get the tx descriptor */
5377 	mac_iocb_ptr = tx_cb->queue_entry;
5378 
5379 	bzero((void *)mac_iocb_ptr, 20);
5380 
5381 	ASSERT(tx_cb->mp == NULL);
5382 
5383 	/*
5384 	 * Decide to use DMA map or copy mode.
5385 	 * DMA map mode must be used when the total msg length is more than the
5386 	 * tx buffer length.
5387 	 */
5388 
5389 	if (total_len > tx_buf_len)
5390 		tx_mode = USE_DMA;
5391 	else if	(max_seg_len > QL_MAX_COPY_LENGTH)
5392 		tx_mode = USE_DMA;
5393 	else
5394 		tx_mode = USE_COPY;
5395 
5396 	if (qlge->chksum_cap) {
5397 		mac_hcksum_get(mp, NULL, NULL, NULL, NULL, &pflags);
5398 		QL_PRINT(DBG_TX, ("checksum flag is :0x%x, card capability "
5399 		    "is 0x%x \n", pflags, qlge->chksum_cap));
5400 		if (qlge->lso_enable) {
5401 			uint32_t lso_flags = 0;
5402 			mac_lso_get(mp, &mss, &lso_flags);
5403 			use_lso = (lso_flags == HW_LSO);
5404 		}
5405 		QL_PRINT(DBG_TX, ("mss :%d, use_lso %x \n",
5406 		    mss, use_lso));
5407 	}
5408 
5409 do_pullup:
5410 
5411 	/* concatenate all frags into one large packet if too fragmented */
5412 	if (((tx_mode == USE_DMA)&&(frags > QL_MAX_TX_DMA_HANDLES)) ||
5413 	    force_pullup) {
5414 		mblk_t *mp1;
5415 		if ((mp1 = msgpullup(mp, -1)) != NULL) {
5416 			freemsg(mp);
5417 			mp = mp1;
5418 			frags = 1;
5419 		} else {
5420 			tx_ring->tx_fail_dma_bind++;
5421 			goto bad;
5422 		}
5423 	}
5424 
5425 	tx_cb->tx_bytes = (uint32_t)total_len;
5426 	tx_cb->mp = mp;
5427 	tx_cb->tx_dma_handle_used = 0;
5428 
5429 	if (tx_mode == USE_DMA) {
5430 		msg_len = total_len;
5431 
5432 		mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
5433 		mac_iocb_ptr->tid = tx_ring->prod_idx;
5434 		mac_iocb_ptr->frame_len = (uint32_t)cpu_to_le32(msg_len);
5435 		mac_iocb_ptr->txq_idx = tx_ring->wq_id;
5436 
5437 		tx_entry = &mac_iocb_ptr->oal_entry[0];
5438 		oal_entry = NULL;
5439 
5440 		for (tp = mp, oal_entries = j = 0; tp != NULL;
5441 		    tp = tp->b_cont) {
5442 			/* if too many tx dma handles needed */
5443 			if (j >= QL_MAX_TX_DMA_HANDLES) {
5444 				tx_ring->tx_no_dma_handle++;
5445 				if (!force_pullup) {
5446 					force_pullup = 1;
5447 					goto do_pullup;
5448 				} else {
5449 					goto bad;
5450 				}
5451 			}
5452 			nbyte = (uint16_t)MBLKL(tp);
5453 			if (nbyte == 0)
5454 				continue;
5455 
5456 			status = ddi_dma_addr_bind_handle(
5457 			    tx_cb->tx_dma_handle[j], NULL,
5458 			    (caddr_t)tp->b_rptr, nbyte,
5459 			    DDI_DMA_WRITE | DDI_DMA_STREAMING, DDI_DMA_DONTWAIT,
5460 			    0, &dma_cookie, &ncookies);
5461 
5462 			QL_PRINT(DBG_TX, ("map sending data segment: %d, "
5463 			    "length: %d, spans in %d cookies\n",
5464 			    j, nbyte, ncookies));
5465 
5466 			if (status != DDI_DMA_MAPPED) {
5467 				goto bad;
5468 			}
5469 			/*
5470 			 * Each fragment can span several cookies. One cookie
5471 			 * will use one tx descriptor to transmit.
5472 			 */
5473 			for (i = ncookies; i > 0; i--, tx_entry++,
5474 			    oal_entries++) {
5475 				/*
5476 				 * The number of TX descriptors that can be
5477 				 *  saved in tx iocb and oal list is limited
5478 				 */
5479 				if (oal_entries > max_oal_entries) {
5480 					tx_ring->tx_no_dma_cookie++;
5481 					if (!force_pullup) {
5482 						force_pullup = 1;
5483 						goto do_pullup;
5484 					} else {
5485 						goto bad;
5486 					}
5487 				}
5488 
5489 				if ((oal_entries == TX_DESC_PER_IOCB) &&
5490 				    !oal_entry) {
5491 					/*
5492 					 * Time to switch to an oal list
5493 					 * The last entry should be copied
5494 					 * to first entry in the oal list
5495 					 */
5496 					oal_entry = tx_cb->oal;
5497 					tx_entry =
5498 					    &mac_iocb_ptr->oal_entry[
5499 					    TX_DESC_PER_IOCB-1];
5500 					bcopy(tx_entry, oal_entry,
5501 					    sizeof (*oal_entry));
5502 
5503 					/*
5504 					 * last entry should be updated to
5505 					 * point to the extended oal list itself
5506 					 */
5507 					tx_entry->buf_addr_low =
5508 					    cpu_to_le32(
5509 					    LS_64BITS(tx_cb->oal_dma_addr));
5510 					tx_entry->buf_addr_high =
5511 					    cpu_to_le32(
5512 					    MS_64BITS(tx_cb->oal_dma_addr));
5513 					/*
5514 					 * Point tx_entry to the oal list
5515 					 * second entry
5516 					 */
5517 					tx_entry = &oal_entry[1];
5518 				}
5519 
5520 				tx_entry->buf_len =
5521 				    (uint32_t)cpu_to_le32(dma_cookie.dmac_size);
5522 				phys_addr = dma_cookie.dmac_laddress;
5523 				tx_entry->buf_addr_low =
5524 				    cpu_to_le32(LS_64BITS(phys_addr));
5525 				tx_entry->buf_addr_high =
5526 				    cpu_to_le32(MS_64BITS(phys_addr));
5527 
5528 				last_oal_entry = tx_entry;
5529 
5530 				if (i > 1)
5531 					ddi_dma_nextcookie(
5532 					    tx_cb->tx_dma_handle[j],
5533 					    &dma_cookie);
5534 			}
5535 			j++;
5536 		}
5537 		/*
5538 		 * if OAL is used, the last oal entry in tx iocb indicates
5539 		 * number of additional address/len pairs in OAL
5540 		 */
5541 		if (oal_entries > TX_DESC_PER_IOCB) {
5542 			tx_entry = &mac_iocb_ptr->oal_entry[TX_DESC_PER_IOCB-1];
5543 			tx_entry->buf_len = (uint32_t)
5544 			    (cpu_to_le32((sizeof (struct oal_entry) *
5545 			    (oal_entries -TX_DESC_PER_IOCB+1))|OAL_CONT_ENTRY));
5546 		}
5547 		last_oal_entry->buf_len = cpu_to_le32(
5548 		    le32_to_cpu(last_oal_entry->buf_len)|OAL_LAST_ENTRY);
5549 
5550 		tx_cb->tx_dma_handle_used = j;
5551 		QL_PRINT(DBG_TX, ("total tx_dma_handle_used %d cookies %d \n",
5552 		    j, oal_entries));
5553 
5554 		bp = (caddr_t)mp->b_rptr;
5555 	}
5556 	if (tx_mode == USE_COPY) {
5557 		bp = tx_cb->copy_buffer;
5558 		off = 0;
5559 		nbyte = 0;
5560 		frags = 0;
5561 		/*
5562 		 * Copy up to tx_buf_len of the transmit data
5563 		 * from mp to tx buffer
5564 		 */
5565 		for (tp = mp; tp != NULL; tp = tp->b_cont) {
5566 			nbyte = MBLKL(tp);
5567 			if ((off + nbyte) <= tx_buf_len) {
5568 				bcopy(tp->b_rptr, &bp[off], nbyte);
5569 				off += nbyte;
5570 				frags ++;
5571 			}
5572 		}
5573 
5574 		msg_len = off;
5575 
5576 		mac_iocb_ptr->opcode = OPCODE_OB_MAC_IOCB;
5577 		mac_iocb_ptr->tid = tx_ring->prod_idx;
5578 		mac_iocb_ptr->frame_len = (uint32_t)cpu_to_le32(msg_len);
5579 		mac_iocb_ptr->txq_idx = tx_ring->wq_id;
5580 
5581 		QL_PRINT(DBG_TX, ("Copy Mode:actual sent data length is: %d, "
5582 		    "from %d segaments\n", msg_len, frags));
5583 
5584 		phys_addr = tx_cb->copy_buffer_dma_addr;
5585 		phy_addr_low = cpu_to_le32(LS_64BITS(phys_addr));
5586 		phy_addr_high = cpu_to_le32(MS_64BITS(phys_addr));
5587 
5588 		QL_DUMP(DBG_TX, "\t requested sending data:\n",
5589 		    (uint8_t *)tx_cb->copy_buffer, 8, total_len);
5590 
5591 		mac_iocb_ptr->oal_entry[0].buf_len = (uint32_t)
5592 		    cpu_to_le32(msg_len | OAL_LAST_ENTRY);
5593 		mac_iocb_ptr->oal_entry[0].buf_addr_low  = phy_addr_low;
5594 		mac_iocb_ptr->oal_entry[0].buf_addr_high = phy_addr_high;
5595 
5596 		freemsg(mp); /* no need, we have copied */
5597 		tx_cb->mp = NULL;
5598 	} /* End of Copy Mode */
5599 
5600 	/* Do TSO/LSO on TCP packet? */
5601 	if (use_lso && mss) {
5602 		ql_hw_lso_setup(qlge, mss, bp, mac_iocb_ptr);
5603 	} else if (pflags & qlge->chksum_cap) {
5604 		/* Do checksum offloading */
5605 		ql_hw_csum_setup(qlge, pflags, bp, mac_iocb_ptr);
5606 	}
5607 
5608 	/* let device know the latest outbound IOCB */
5609 	(void) ddi_dma_sync(tx_ring->wq_dma.dma_handle,
5610 	    (off_t)((uintptr_t)mac_iocb_ptr - (uintptr_t)tx_ring->wq_dma.vaddr),
5611 	    (size_t)sizeof (*mac_iocb_ptr), DDI_DMA_SYNC_FORDEV);
5612 
5613 	if (tx_mode == USE_DMA) {
5614 		/* let device know the latest outbound OAL if necessary */
5615 		if (oal_entries > TX_DESC_PER_IOCB) {
5616 			(void) ddi_dma_sync(tx_cb->oal_dma.dma_handle,
5617 			    (off_t)0,
5618 			    (sizeof (struct oal_entry) *
5619 			    (oal_entries -TX_DESC_PER_IOCB+1)),
5620 			    DDI_DMA_SYNC_FORDEV);
5621 		}
5622 	} else { /* for USE_COPY mode, tx buffer has changed */
5623 		/* let device know the latest change */
5624 		(void) ddi_dma_sync(tx_cb->oal_dma.dma_handle,
5625 		/* copy buf offset */
5626 		    (off_t)(sizeof (oal_entry) * MAX_SG_ELEMENTS),
5627 		    msg_len, DDI_DMA_SYNC_FORDEV);
5628 	}
5629 
5630 	/* save how the packet was sent */
5631 	tx_cb->tx_type = tx_mode;
5632 
5633 	QL_DUMP_REQ_PKT(qlge, mac_iocb_ptr, tx_cb->oal, oal_entries);
5634 	/* reduce the number of available tx slot */
5635 	atomic_dec_32(&tx_ring->tx_free_count);
5636 
5637 	tx_ring->prod_idx++;
5638 	if (tx_ring->prod_idx >= tx_ring->wq_len)
5639 		tx_ring->prod_idx = 0;
5640 
5641 	now = ddi_get_lbolt();
5642 	qlge->last_tx_time = now;
5643 
5644 	return (DDI_SUCCESS);
5645 
5646 bad:
5647 	/*
5648 	 * if for any reason driver can not send, delete
5649 	 * the message pointer, mp
5650 	 */
5651 	now = ddi_get_lbolt();
5652 	freemsg(mp);
5653 	mp = NULL;
5654 	tx_cb->mp = NULL;
5655 	for (i = 0; i < j; i++)
5656 		(void) ddi_dma_unbind_handle(tx_cb->tx_dma_handle[i]);
5657 
5658 	QL_PRINT(DBG_TX, ("%s(%d) failed at 0x%x",
5659 	    __func__, qlge->instance, (int)now));
5660 
5661 	return (DDI_SUCCESS);
5662 }
5663 
5664 
5665 /*
5666  * Initializes hardware and driver software flags before the driver
5667  * is finally ready to work.
5668  */
5669 int
5670 ql_do_start(qlge_t *qlge)
5671 {
5672 	int i;
5673 	struct rx_ring *rx_ring;
5674 	uint16_t lbq_buf_size;
5675 	int rings_done;
5676 
5677 	ASSERT(qlge != NULL);
5678 
5679 	mutex_enter(&qlge->hw_mutex);
5680 
5681 	/* Reset adapter */
5682 	(void) ql_asic_reset(qlge);
5683 
5684 	lbq_buf_size = (uint16_t)
5685 	    ((qlge->mtu == ETHERMTU)? LRG_BUF_NORMAL_SIZE : LRG_BUF_JUMBO_SIZE);
5686 	if (qlge->rx_ring[0].lbq_buf_size != lbq_buf_size) {
5687 #ifdef QLGE_LOAD_UNLOAD
5688 		cmn_err(CE_NOTE, "realloc buffers old: %d new: %d\n",
5689 		    qlge->rx_ring[0].lbq_buf_size, lbq_buf_size);
5690 #endif
5691 		/*
5692 		 * Check if any ring has buffers still with upper layers
5693 		 * If buffers are pending with upper layers, we use the
5694 		 * existing buffers and don't reallocate new ones
5695 		 * Unfortunately there is no way to evict buffers from
5696 		 * upper layers. Using buffers with the current size may
5697 		 * cause slightly sub-optimal performance, but that seems
5698 		 * to be the easiest way to handle this situation.
5699 		 */
5700 		rings_done = 0;
5701 		for (i = 0; i < qlge->rx_ring_count; i++) {
5702 			rx_ring = &qlge->rx_ring[i];
5703 			if (rx_ring->rx_indicate == 0)
5704 				rings_done++;
5705 			else
5706 				break;
5707 		}
5708 		/*
5709 		 * No buffers pending with upper layers;
5710 		 * reallocte them for new MTU size
5711 		 */
5712 		if (rings_done >= qlge->rx_ring_count) {
5713 			/* free large buffer pool */
5714 			for (i = 0; i < qlge->rx_ring_count; i++) {
5715 				rx_ring = &qlge->rx_ring[i];
5716 				if (rx_ring->type != TX_Q) {
5717 					ql_free_sbq_buffers(rx_ring);
5718 					ql_free_lbq_buffers(rx_ring);
5719 				}
5720 			}
5721 			/* reallocate large buffer pool */
5722 			for (i = 0; i < qlge->rx_ring_count; i++) {
5723 				rx_ring = &qlge->rx_ring[i];
5724 				if (rx_ring->type != TX_Q) {
5725 					(void) ql_alloc_sbufs(qlge, rx_ring);
5726 					(void) ql_alloc_lbufs(qlge, rx_ring);
5727 				}
5728 			}
5729 		}
5730 	}
5731 
5732 	if (ql_bringup_adapter(qlge) != DDI_SUCCESS) {
5733 		cmn_err(CE_WARN, "qlge bringup adapter failed");
5734 		mutex_exit(&qlge->hw_mutex);
5735 		if (qlge->fm_enable) {
5736 			atomic_or_32(&qlge->flags, ADAPTER_ERROR);
5737 			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_LOST);
5738 		}
5739 		return (DDI_FAILURE);
5740 	}
5741 
5742 	mutex_exit(&qlge->hw_mutex);
5743 	/* if adapter is up successfully but was bad before */
5744 	if (qlge->flags & ADAPTER_ERROR) {
5745 		atomic_and_32(&qlge->flags, ~ADAPTER_ERROR);
5746 		if (qlge->fm_enable) {
5747 			ddi_fm_service_impact(qlge->dip, DDI_SERVICE_RESTORED);
5748 		}
5749 	}
5750 
5751 	/* Get current link state */
5752 	qlge->port_link_state = ql_get_link_state(qlge);
5753 
5754 	if (qlge->port_link_state == LS_UP) {
5755 		QL_PRINT(DBG_GLD, ("%s(%d) Link UP !!\n",
5756 		    __func__, qlge->instance));
5757 		/* If driver detects a carrier on */
5758 		CARRIER_ON(qlge);
5759 	} else {
5760 		QL_PRINT(DBG_GLD, ("%s(%d) Link down\n",
5761 		    __func__, qlge->instance));
5762 		/* If driver detects a lack of carrier */
5763 		CARRIER_OFF(qlge);
5764 	}
5765 	qlge->mac_flags = QL_MAC_STARTED;
5766 	return (DDI_SUCCESS);
5767 }
5768 
5769 /*
5770  * Stop currently running driver
5771  * Driver needs to stop routing new packets to driver and wait until
5772  * all pending tx/rx buffers to be free-ed.
5773  */
5774 int
5775 ql_do_stop(qlge_t *qlge)
5776 {
5777 	int rc = DDI_FAILURE;
5778 	uint32_t i, j, k;
5779 	struct bq_desc *sbq_desc, *lbq_desc;
5780 	struct rx_ring *rx_ring;
5781 
5782 	ASSERT(qlge != NULL);
5783 
5784 	CARRIER_OFF(qlge);
5785 
5786 	rc = ql_bringdown_adapter(qlge);
5787 	if (rc != DDI_SUCCESS) {
5788 		cmn_err(CE_WARN, "qlge bringdown adapter failed.");
5789 	} else
5790 		rc = DDI_SUCCESS;
5791 
5792 	for (k = 0; k < qlge->rx_ring_count; k++) {
5793 		rx_ring = &qlge->rx_ring[k];
5794 		if (rx_ring->type != TX_Q) {
5795 			j = rx_ring->lbq_use_head;
5796 #ifdef QLGE_LOAD_UNLOAD
5797 			cmn_err(CE_NOTE, "ring %d: move %d lbufs in use list"
5798 			    " to free list %d\n total %d\n",
5799 			    k, rx_ring->lbuf_in_use_count,
5800 			    rx_ring->lbuf_free_count,
5801 			    rx_ring->lbuf_in_use_count +
5802 			    rx_ring->lbuf_free_count);
5803 #endif
5804 			for (i = 0; i < rx_ring->lbuf_in_use_count; i++) {
5805 				lbq_desc = rx_ring->lbuf_in_use[j];
5806 				j++;
5807 				if (j >= rx_ring->lbq_len) {
5808 					j = 0;
5809 				}
5810 				if (lbq_desc->mp) {
5811 					atomic_inc_32(&rx_ring->rx_indicate);
5812 					freemsg(lbq_desc->mp);
5813 				}
5814 			}
5815 			rx_ring->lbq_use_head = j;
5816 			rx_ring->lbq_use_tail = j;
5817 			rx_ring->lbuf_in_use_count = 0;
5818 			j = rx_ring->sbq_use_head;
5819 #ifdef QLGE_LOAD_UNLOAD
5820 			cmn_err(CE_NOTE, "ring %d: move %d sbufs in use list,"
5821 			    " to free list %d\n total %d \n",
5822 			    k, rx_ring->sbuf_in_use_count,
5823 			    rx_ring->sbuf_free_count,
5824 			    rx_ring->sbuf_in_use_count +
5825 			    rx_ring->sbuf_free_count);
5826 #endif
5827 			for (i = 0; i < rx_ring->sbuf_in_use_count; i++) {
5828 				sbq_desc = rx_ring->sbuf_in_use[j];
5829 				j++;
5830 				if (j >= rx_ring->sbq_len) {
5831 					j = 0;
5832 				}
5833 				if (sbq_desc->mp) {
5834 					atomic_inc_32(&rx_ring->rx_indicate);
5835 					freemsg(sbq_desc->mp);
5836 				}
5837 			}
5838 			rx_ring->sbq_use_head = j;
5839 			rx_ring->sbq_use_tail = j;
5840 			rx_ring->sbuf_in_use_count = 0;
5841 		}
5842 	}
5843 
5844 	qlge->mac_flags = QL_MAC_STOPPED;
5845 
5846 	return (rc);
5847 }
5848 
5849 /*
5850  * Support
5851  */
5852 
5853 void
5854 ql_disable_isr(qlge_t *qlge)
5855 {
5856 	/*
5857 	 * disable the hardware interrupt
5858 	 */
5859 	ISP_DISABLE_GLOBAL_INTRS(qlge);
5860 
5861 	qlge->flags &= ~INTERRUPTS_ENABLED;
5862 }
5863 
5864 
5865 
5866 /*
5867  * busy wait for 'usecs' microseconds.
5868  */
5869 void
5870 qlge_delay(clock_t usecs)
5871 {
5872 	drv_usecwait(usecs);
5873 }
5874 
5875 /*
5876  * retrieve firmware details.
5877  */
5878 
5879 pci_cfg_t *
5880 ql_get_pci_config(qlge_t *qlge)
5881 {
5882 	return (&(qlge->pci_cfg));
5883 }
5884 
5885 /*
5886  * Get current Link status
5887  */
5888 static uint32_t
5889 ql_get_link_state(qlge_t *qlge)
5890 {
5891 	uint32_t bitToCheck = 0;
5892 	uint32_t temp, linkState;
5893 
5894 	if (qlge->func_number == qlge->fn0_net) {
5895 		bitToCheck = STS_PL0;
5896 	} else {
5897 		bitToCheck = STS_PL1;
5898 	}
5899 	temp = ql_read_reg(qlge, REG_STATUS);
5900 	QL_PRINT(DBG_GLD, ("%s(%d) chip status reg: 0x%x\n",
5901 	    __func__, qlge->instance, temp));
5902 
5903 	if (temp & bitToCheck) {
5904 		linkState = LS_UP;
5905 	} else {
5906 		linkState = LS_DOWN;
5907 	}
5908 	if (CFG_IST(qlge, CFG_CHIP_8100)) {
5909 		/* for Schultz, link Speed is fixed to 10G, full duplex */
5910 		qlge->speed  = SPEED_10G;
5911 		qlge->duplex = 1;
5912 	}
5913 	return (linkState);
5914 }
5915 /*
5916  * Get current link status and report to OS
5917  */
5918 static void
5919 ql_get_and_report_link_state(qlge_t *qlge)
5920 {
5921 	uint32_t cur_link_state;
5922 
5923 	/* Get current link state */
5924 	cur_link_state = ql_get_link_state(qlge);
5925 	/* if link state has changed */
5926 	if (cur_link_state != qlge->port_link_state) {
5927 
5928 		qlge->port_link_state = cur_link_state;
5929 
5930 		if (qlge->port_link_state == LS_UP) {
5931 			QL_PRINT(DBG_GLD, ("%s(%d) Link UP !!\n",
5932 			    __func__, qlge->instance));
5933 			/* If driver detects a carrier on */
5934 			CARRIER_ON(qlge);
5935 		} else {
5936 			QL_PRINT(DBG_GLD, ("%s(%d) Link down\n",
5937 			    __func__, qlge->instance));
5938 			/* If driver detects a lack of carrier */
5939 			CARRIER_OFF(qlge);
5940 		}
5941 	}
5942 }
5943 
5944 /*
5945  * timer callback function executed after timer expires
5946  */
5947 static void
5948 ql_timer(void* arg)
5949 {
5950 	ql_get_and_report_link_state((qlge_t *)arg);
5951 }
5952 
5953 /*
5954  * stop the running timer if activated
5955  */
5956 static void
5957 ql_stop_timer(qlge_t *qlge)
5958 {
5959 	timeout_id_t timer_id;
5960 	/* Disable driver timer */
5961 	if (qlge->ql_timer_timeout_id != NULL) {
5962 		timer_id = qlge->ql_timer_timeout_id;
5963 		qlge->ql_timer_timeout_id = NULL;
5964 		(void) untimeout(timer_id);
5965 	}
5966 }
5967 
5968 /*
5969  * stop then restart timer
5970  */
5971 void
5972 ql_restart_timer(qlge_t *qlge)
5973 {
5974 	ql_stop_timer(qlge);
5975 	qlge->ql_timer_ticks = TICKS_PER_SEC / 4;
5976 	qlge->ql_timer_timeout_id = timeout(ql_timer,
5977 	    (void *)qlge, qlge->ql_timer_ticks);
5978 }
5979 
5980 /* ************************************************************************* */
5981 /*
5982  *		Hardware K-Stats Data Structures and Subroutines
5983  */
5984 /* ************************************************************************* */
5985 static const ql_ksindex_t ql_kstats_hw[] = {
5986 	/* PCI related hardware information */
5987 	{ 0, "Vendor Id"			},
5988 	{ 1, "Device Id"			},
5989 	{ 2, "Command"				},
5990 	{ 3, "Status"				},
5991 	{ 4, "Revision Id"			},
5992 	{ 5, "Cache Line Size"			},
5993 	{ 6, "Latency Timer"			},
5994 	{ 7, "Header Type"			},
5995 	{ 9, "I/O base addr"			},
5996 	{ 10, "Control Reg Base addr low"	},
5997 	{ 11, "Control Reg Base addr high"	},
5998 	{ 12, "Doorbell Reg Base addr low"	},
5999 	{ 13, "Doorbell Reg Base addr high"	},
6000 	{ 14, "Subsystem Vendor Id"		},
6001 	{ 15, "Subsystem Device ID"		},
6002 	{ 16, "PCIe Device Control"		},
6003 	{ 17, "PCIe Link Status"		},
6004 
6005 	{ -1,	NULL				},
6006 };
6007 
6008 /*
6009  * kstat update function for PCI registers
6010  */
6011 static int
6012 ql_kstats_get_pci_regs(kstat_t *ksp, int flag)
6013 {
6014 	qlge_t *qlge;
6015 	kstat_named_t *knp;
6016 
6017 	if (flag != KSTAT_READ)
6018 		return (EACCES);
6019 
6020 	qlge = ksp->ks_private;
6021 	knp = ksp->ks_data;
6022 	(knp++)->value.ui32 = qlge->pci_cfg.vendor_id;
6023 	(knp++)->value.ui32 = qlge->pci_cfg.device_id;
6024 	(knp++)->value.ui32 = qlge->pci_cfg.command;
6025 	(knp++)->value.ui32 = qlge->pci_cfg.status;
6026 	(knp++)->value.ui32 = qlge->pci_cfg.revision;
6027 	(knp++)->value.ui32 = qlge->pci_cfg.cache_line_size;
6028 	(knp++)->value.ui32 = qlge->pci_cfg.latency_timer;
6029 	(knp++)->value.ui32 = qlge->pci_cfg.header_type;
6030 	(knp++)->value.ui32 = qlge->pci_cfg.io_base_address;
6031 	(knp++)->value.ui32 =
6032 	    qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_lower;
6033 	(knp++)->value.ui32 =
6034 	    qlge->pci_cfg.pci_cntl_reg_set_mem_base_address_upper;
6035 	(knp++)->value.ui32 =
6036 	    qlge->pci_cfg.pci_doorbell_mem_base_address_lower;
6037 	(knp++)->value.ui32 =
6038 	    qlge->pci_cfg.pci_doorbell_mem_base_address_upper;
6039 	(knp++)->value.ui32 = qlge->pci_cfg.sub_vendor_id;
6040 	(knp++)->value.ui32 = qlge->pci_cfg.sub_device_id;
6041 	(knp++)->value.ui32 = qlge->pci_cfg.pcie_device_control;
6042 	(knp++)->value.ui32 = qlge->pci_cfg.link_status;
6043 
6044 	return (0);
6045 }
6046 
6047 static const ql_ksindex_t ql_kstats_mii[] = {
6048 	/* MAC/MII related hardware information */
6049 	{ 0, "mtu"},
6050 
6051 	{ -1, NULL},
6052 };
6053 
6054 
6055 /*
6056  * kstat update function for MII related information.
6057  */
6058 static int
6059 ql_kstats_mii_update(kstat_t *ksp, int flag)
6060 {
6061 	qlge_t *qlge;
6062 	kstat_named_t *knp;
6063 
6064 	if (flag != KSTAT_READ)
6065 		return (EACCES);
6066 
6067 	qlge = ksp->ks_private;
6068 	knp = ksp->ks_data;
6069 
6070 	(knp++)->value.ui32 = qlge->mtu;
6071 
6072 	return (0);
6073 }
6074 
6075 static const ql_ksindex_t ql_kstats_reg[] = {
6076 	/* Register information */
6077 	{ 0, "System (0x08)"			},
6078 	{ 1, "Reset/Fail Over(0x0Ch"		},
6079 	{ 2, "Function Specific Control(0x10)"	},
6080 	{ 3, "Status (0x30)"			},
6081 	{ 4, "Intr Enable (0x34)"		},
6082 	{ 5, "Intr Status1 (0x3C)"		},
6083 	{ 6, "Error Status (0x54)"		},
6084 	{ 7, "XGMAC Flow Control(0x11C)"	},
6085 	{ 8, "XGMAC Tx Pause Frames(0x230)"	},
6086 	{ 9, "XGMAC Rx Pause Frames(0x388)"	},
6087 	{ 10, "XGMAC Rx FIFO Drop Count(0x5B8)"	},
6088 	{ 11, "interrupts actually allocated"	},
6089 	{ 12, "interrupts on rx ring 0"		},
6090 	{ 13, "interrupts on rx ring 1"		},
6091 	{ 14, "interrupts on rx ring 2"		},
6092 	{ 15, "interrupts on rx ring 3"		},
6093 	{ 16, "interrupts on rx ring 4"		},
6094 	{ 17, "interrupts on rx ring 5"		},
6095 	{ 18, "interrupts on rx ring 6"		},
6096 	{ 19, "interrupts on rx ring 7"		},
6097 	{ 20, "polls on rx ring 0"		},
6098 	{ 21, "polls on rx ring 1"		},
6099 	{ 22, "polls on rx ring 2"		},
6100 	{ 23, "polls on rx ring 3"		},
6101 	{ 24, "polls on rx ring 4"		},
6102 	{ 25, "polls on rx ring 5"		},
6103 	{ 26, "polls on rx ring 6"		},
6104 	{ 27, "polls on rx ring 7"		},
6105 	{ 28, "tx no resource on ring 0"	},
6106 	{ 29, "tx dma bind fail on ring 0"	},
6107 	{ 30, "tx dma no handle on ring 0"	},
6108 	{ 31, "tx dma no cookie on ring 0"	},
6109 	{ 32, "MPI firmware major version"	},
6110 	{ 33, "MPI firmware minor version"	},
6111 	{ 34, "MPI firmware sub version"	},
6112 	{ 35, "rx no resource"			},
6113 
6114 	{ -1, NULL},
6115 };
6116 
6117 
6118 /*
6119  * kstat update function for device register set
6120  */
6121 static int
6122 ql_kstats_get_reg_and_dev_stats(kstat_t *ksp, int flag)
6123 {
6124 	qlge_t *qlge;
6125 	kstat_named_t *knp;
6126 	uint32_t val32;
6127 	int i = 0;
6128 	struct tx_ring *tx_ring;
6129 	struct rx_ring *rx_ring;
6130 
6131 	if (flag != KSTAT_READ)
6132 		return (EACCES);
6133 
6134 	qlge = ksp->ks_private;
6135 	knp = ksp->ks_data;
6136 
6137 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_SYSTEM);
6138 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_RESET_FAILOVER);
6139 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_FUNCTION_SPECIFIC_CONTROL);
6140 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_STATUS);
6141 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_INTERRUPT_ENABLE);
6142 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_INTERRUPT_STATUS_1);
6143 	(knp++)->value.ui32 = ql_read_reg(qlge, REG_ERROR_STATUS);
6144 
6145 	if (ql_sem_spinlock(qlge, qlge->xgmac_sem_mask)) {
6146 		return (0);
6147 	}
6148 	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_FLOW_CONTROL, &val32);
6149 	(knp++)->value.ui32 = val32;
6150 
6151 	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_TX_PAUSE_PKTS, &val32);
6152 	(knp++)->value.ui32 = val32;
6153 
6154 	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_PAUSE_PKTS, &val32);
6155 	(knp++)->value.ui32 = val32;
6156 
6157 	(void) ql_read_xgmac_reg(qlge, REG_XGMAC_MAC_RX_FIFO_DROPS, &val32);
6158 	(knp++)->value.ui32 = val32;
6159 
6160 	ql_sem_unlock(qlge, qlge->xgmac_sem_mask);
6161 
6162 	(knp++)->value.ui32 = qlge->intr_cnt;
6163 
6164 	for (i = 0; i < 8; i++) {
6165 		(knp++)->value.ui32 = qlge->rx_interrupts[i];
6166 	}
6167 
6168 	for (i = 0; i < 8; i++) {
6169 		(knp++)->value.ui32 = qlge->rx_polls[i];
6170 	}
6171 
6172 	tx_ring = &qlge->tx_ring[0];
6173 	(knp++)->value.ui32 = tx_ring->defer;
6174 	(knp++)->value.ui32 = tx_ring->tx_fail_dma_bind;
6175 	(knp++)->value.ui32 = tx_ring->tx_no_dma_handle;
6176 	(knp++)->value.ui32 = tx_ring->tx_no_dma_cookie;
6177 
6178 	(knp++)->value.ui32 = qlge->fw_version_info.major_version;
6179 	(knp++)->value.ui32 = qlge->fw_version_info.minor_version;
6180 	(knp++)->value.ui32 = qlge->fw_version_info.sub_minor_version;
6181 
6182 	for (i = 0; i < qlge->rx_ring_count; i++) {
6183 		rx_ring = &qlge->rx_ring[i];
6184 		val32 += rx_ring->rx_packets_dropped_no_buffer;
6185 	}
6186 	(knp++)->value.ui32 = val32;
6187 
6188 	return (0);
6189 }
6190 
6191 
6192 static kstat_t *
6193 ql_setup_named_kstat(qlge_t *qlge, int instance, char *name,
6194     const ql_ksindex_t *ksip, size_t size, int (*update)(kstat_t *, int))
6195 {
6196 	kstat_t *ksp;
6197 	kstat_named_t *knp;
6198 	char *np;
6199 	int type;
6200 
6201 	size /= sizeof (ql_ksindex_t);
6202 	ksp = kstat_create(ADAPTER_NAME, instance, name, "net",
6203 	    KSTAT_TYPE_NAMED, ((uint32_t)size) - 1, KSTAT_FLAG_PERSISTENT);
6204 	if (ksp == NULL)
6205 		return (NULL);
6206 
6207 	ksp->ks_private = qlge;
6208 	ksp->ks_update = update;
6209 	for (knp = ksp->ks_data; (np = ksip->name) != NULL; ++knp, ++ksip) {
6210 		switch (*np) {
6211 		default:
6212 			type = KSTAT_DATA_UINT32;
6213 			break;
6214 		case '&':
6215 			np += 1;
6216 			type = KSTAT_DATA_CHAR;
6217 			break;
6218 		}
6219 		kstat_named_init(knp, np, (uint8_t)type);
6220 	}
6221 	kstat_install(ksp);
6222 
6223 	return (ksp);
6224 }
6225 
6226 /*
6227  * Setup various kstat
6228  */
6229 int
6230 ql_init_kstats(qlge_t *qlge)
6231 {
6232 	/* Hardware KStats */
6233 	qlge->ql_kstats[QL_KSTAT_CHIP] = ql_setup_named_kstat(qlge,
6234 	    qlge->instance, "chip", ql_kstats_hw,
6235 	    sizeof (ql_kstats_hw), ql_kstats_get_pci_regs);
6236 	if (qlge->ql_kstats[QL_KSTAT_CHIP] == NULL) {
6237 		return (DDI_FAILURE);
6238 	}
6239 
6240 	/* MII KStats */
6241 	qlge->ql_kstats[QL_KSTAT_LINK] = ql_setup_named_kstat(qlge,
6242 	    qlge->instance, "mii", ql_kstats_mii,
6243 	    sizeof (ql_kstats_mii), ql_kstats_mii_update);
6244 	if (qlge->ql_kstats[QL_KSTAT_LINK] == NULL) {
6245 		return (DDI_FAILURE);
6246 	}
6247 
6248 	/* REG KStats */
6249 	qlge->ql_kstats[QL_KSTAT_REG] = ql_setup_named_kstat(qlge,
6250 	    qlge->instance, "reg", ql_kstats_reg,
6251 	    sizeof (ql_kstats_reg), ql_kstats_get_reg_and_dev_stats);
6252 	if (qlge->ql_kstats[QL_KSTAT_REG] == NULL) {
6253 		return (DDI_FAILURE);
6254 	}
6255 	return (DDI_SUCCESS);
6256 }
6257 
6258 /*
6259  * delete all kstat
6260  */
6261 void
6262 ql_fini_kstats(qlge_t *qlge)
6263 {
6264 	int i;
6265 
6266 	for (i = 0; i < QL_KSTAT_COUNT; i++) {
6267 		if (qlge->ql_kstats[i] != NULL)
6268 			kstat_delete(qlge->ql_kstats[i]);
6269 	}
6270 }
6271 
6272 /* ************************************************************************* */
6273 /*
6274  *                                 kstat end
6275  */
6276 /* ************************************************************************* */
6277 
6278 /*
6279  * Setup the parameters for receive and transmit rings including buffer sizes
6280  * and completion queue sizes
6281  */
6282 static int
6283 ql_setup_rings(qlge_t *qlge)
6284 {
6285 	uint8_t i;
6286 	struct rx_ring *rx_ring;
6287 	struct tx_ring *tx_ring;
6288 	uint16_t lbq_buf_size;
6289 
6290 	lbq_buf_size = (uint16_t)
6291 	    ((qlge->mtu == ETHERMTU)? LRG_BUF_NORMAL_SIZE : LRG_BUF_JUMBO_SIZE);
6292 
6293 	/*
6294 	 * rx_ring[0] is always the default queue.
6295 	 */
6296 	/*
6297 	 * qlge->rx_ring_count:
6298 	 * Total number of rx_rings. This includes a number
6299 	 * of outbound completion handler rx_rings, and a
6300 	 * number of inbound completion handler rx_rings.
6301 	 * rss is only enabled if we have more than 1 rx completion
6302 	 * queue. If we have a single rx completion queue
6303 	 * then all rx completions go to this queue and
6304 	 * the last completion queue
6305 	 */
6306 
6307 	qlge->tx_ring_first_cq_id = qlge->rss_ring_count;
6308 
6309 	for (i = 0; i < qlge->tx_ring_count; i++) {
6310 		tx_ring = &qlge->tx_ring[i];
6311 		bzero((void *)tx_ring, sizeof (*tx_ring));
6312 		tx_ring->qlge = qlge;
6313 		tx_ring->wq_id = i;
6314 		tx_ring->wq_len = qlge->tx_ring_size;
6315 		tx_ring->wq_size = (uint32_t)(
6316 		    tx_ring->wq_len * sizeof (struct ob_mac_iocb_req));
6317 
6318 		/*
6319 		 * The completion queue ID for the tx rings start
6320 		 * immediately after the last rss completion queue.
6321 		 */
6322 		tx_ring->cq_id = (uint16_t)(i + qlge->tx_ring_first_cq_id);
6323 	}
6324 
6325 	for (i = 0; i < qlge->rx_ring_count; i++) {
6326 		rx_ring = &qlge->rx_ring[i];
6327 		bzero((void *)rx_ring, sizeof (*rx_ring));
6328 		rx_ring->qlge = qlge;
6329 		rx_ring->cq_id = i;
6330 		if (i != 0)
6331 			rx_ring->cpu = (i) % qlge->rx_ring_count;
6332 		else
6333 			rx_ring->cpu = 0;
6334 
6335 		if (i < qlge->rss_ring_count) {
6336 			/*
6337 			 * Inbound completions (RSS) queues
6338 			 * Default queue is queue 0 which handles
6339 			 * unicast plus bcast/mcast and async events.
6340 			 * Other inbound queues handle unicast frames only.
6341 			 */
6342 			rx_ring->cq_len = qlge->rx_ring_size;
6343 			rx_ring->cq_size = (uint32_t)
6344 			    (rx_ring->cq_len * sizeof (struct net_rsp_iocb));
6345 			rx_ring->lbq_len = NUM_LARGE_BUFFERS;
6346 			rx_ring->lbq_size = (uint32_t)
6347 			    (rx_ring->lbq_len * sizeof (uint64_t));
6348 			rx_ring->lbq_buf_size = lbq_buf_size;
6349 			rx_ring->sbq_len = NUM_SMALL_BUFFERS;
6350 			rx_ring->sbq_size = (uint32_t)
6351 			    (rx_ring->sbq_len * sizeof (uint64_t));
6352 			rx_ring->sbq_buf_size = SMALL_BUFFER_SIZE * 2;
6353 			rx_ring->type = RX_Q;
6354 
6355 			QL_PRINT(DBG_GLD,
6356 			    ("%s(%d)Allocating rss completion queue %d "
6357 			    "on cpu %d\n", __func__, qlge->instance,
6358 			    rx_ring->cq_id, rx_ring->cpu));
6359 		} else {
6360 			/*
6361 			 * Outbound queue handles outbound completions only
6362 			 */
6363 			/* outbound cq is same size as tx_ring it services. */
6364 			QL_PRINT(DBG_INIT, ("rx_ring 0x%p i %d\n", rx_ring, i));
6365 			rx_ring->cq_len = qlge->tx_ring_size;
6366 			rx_ring->cq_size = (uint32_t)
6367 			    (rx_ring->cq_len * sizeof (struct net_rsp_iocb));
6368 			rx_ring->lbq_len = 0;
6369 			rx_ring->lbq_size = 0;
6370 			rx_ring->lbq_buf_size = 0;
6371 			rx_ring->sbq_len = 0;
6372 			rx_ring->sbq_size = 0;
6373 			rx_ring->sbq_buf_size = 0;
6374 			rx_ring->type = TX_Q;
6375 
6376 			QL_PRINT(DBG_GLD,
6377 			    ("%s(%d)Allocating TX completion queue %d on"
6378 			    " cpu %d\n", __func__, qlge->instance,
6379 			    rx_ring->cq_id, rx_ring->cpu));
6380 		}
6381 	}
6382 
6383 	return (DDI_SUCCESS);
6384 }
6385 
6386 static int
6387 ql_start_rx_ring(qlge_t *qlge, struct rx_ring *rx_ring)
6388 {
6389 	struct cqicb_t *cqicb = (struct cqicb_t *)rx_ring->cqicb_dma.vaddr;
6390 	void *shadow_reg = (uint8_t *)qlge->host_copy_shadow_dma_attr.vaddr +
6391 	    (rx_ring->cq_id * sizeof (uint64_t) * RX_TX_RING_SHADOW_SPACE)
6392 	/* first shadow area is used by wqicb's host copy of consumer index */
6393 	    + sizeof (uint64_t);
6394 	uint64_t shadow_reg_dma = qlge->host_copy_shadow_dma_attr.dma_addr +
6395 	    (rx_ring->cq_id * sizeof (uint64_t) * RX_TX_RING_SHADOW_SPACE)
6396 	    + sizeof (uint64_t);
6397 	/* lrg/sml bufq pointers */
6398 	uint8_t *buf_q_base_reg =
6399 	    (uint8_t *)qlge->buf_q_ptr_base_addr_dma_attr.vaddr +
6400 	    (rx_ring->cq_id * sizeof (uint64_t) * BUF_Q_PTR_SPACE);
6401 	uint64_t buf_q_base_reg_dma =
6402 	    qlge->buf_q_ptr_base_addr_dma_attr.dma_addr +
6403 	    (rx_ring->cq_id * sizeof (uint64_t) * BUF_Q_PTR_SPACE);
6404 	caddr_t doorbell_area =
6405 	    qlge->doorbell_reg_iobase + (VM_PAGE_SIZE * (128 + rx_ring->cq_id));
6406 	int err = 0;
6407 	uint16_t bq_len;
6408 	uint64_t tmp;
6409 	uint64_t *base_indirect_ptr;
6410 	int page_entries;
6411 
6412 	/* Set up the shadow registers for this ring. */
6413 	rx_ring->prod_idx_sh_reg = shadow_reg;
6414 	rx_ring->prod_idx_sh_reg_dma = shadow_reg_dma;
6415 	rx_ring->prod_idx_sh_reg_offset = (off_t)(((rx_ring->cq_id *
6416 	    sizeof (uint64_t) * RX_TX_RING_SHADOW_SPACE) + sizeof (uint64_t)));
6417 
6418 	rx_ring->lbq_base_indirect = (uint64_t *)(void *)buf_q_base_reg;
6419 	rx_ring->lbq_base_indirect_dma = buf_q_base_reg_dma;
6420 
6421 	QL_PRINT(DBG_INIT, ("%s rx ring(%d): prod_idx virtual addr = 0x%lx,"
6422 	    " phys_addr 0x%lx\n", __func__, rx_ring->cq_id,
6423 	    rx_ring->prod_idx_sh_reg, rx_ring->prod_idx_sh_reg_dma));
6424 
6425 	buf_q_base_reg += ((BUF_Q_PTR_SPACE / 2) * sizeof (uint64_t));
6426 	buf_q_base_reg_dma += ((BUF_Q_PTR_SPACE / 2) * sizeof (uint64_t));
6427 	rx_ring->sbq_base_indirect = (uint64_t *)(void *)buf_q_base_reg;
6428 	rx_ring->sbq_base_indirect_dma = buf_q_base_reg_dma;
6429 
6430 	/* PCI doorbell mem area + 0x00 for consumer index register */
6431 	rx_ring->cnsmr_idx_db_reg = (uint32_t *)(void *)doorbell_area;
6432 	rx_ring->cnsmr_idx = 0;
6433 	*rx_ring->prod_idx_sh_reg = 0;
6434 	rx_ring->curr_entry = rx_ring->cq_dma.vaddr;
6435 
6436 	/* PCI doorbell mem area + 0x04 for valid register */
6437 	rx_ring->valid_db_reg = (uint32_t *)(void *)
6438 	    ((uint8_t *)(void *)doorbell_area + 0x04);
6439 
6440 	/* PCI doorbell mem area + 0x18 for large buffer consumer */
6441 	rx_ring->lbq_prod_idx_db_reg = (uint32_t *)(void *)
6442 	    ((uint8_t *)(void *)doorbell_area + 0x18);
6443 
6444 	/* PCI doorbell mem area + 0x1c */
6445 	rx_ring->sbq_prod_idx_db_reg = (uint32_t *)(void *)
6446 	    ((uint8_t *)(void *)doorbell_area + 0x1c);
6447 
6448 	bzero((void *)cqicb, sizeof (*cqicb));
6449 
6450 	cqicb->msix_vect = (uint8_t)rx_ring->irq;
6451 
6452 	bq_len = (uint16_t)((rx_ring->cq_len == 65536) ?
6453 	    (uint16_t)0 : (uint16_t)rx_ring->cq_len);
6454 	cqicb->len = (uint16_t)cpu_to_le16(bq_len | LEN_V | LEN_CPP_CONT);
6455 
6456 	cqicb->cq_base_addr_lo =
6457 	    cpu_to_le32(LS_64BITS(rx_ring->cq_dma.dma_addr));
6458 	cqicb->cq_base_addr_hi =
6459 	    cpu_to_le32(MS_64BITS(rx_ring->cq_dma.dma_addr));
6460 
6461 	cqicb->prod_idx_addr_lo =
6462 	    cpu_to_le32(LS_64BITS(rx_ring->prod_idx_sh_reg_dma));
6463 	cqicb->prod_idx_addr_hi =
6464 	    cpu_to_le32(MS_64BITS(rx_ring->prod_idx_sh_reg_dma));
6465 
6466 	/*
6467 	 * Set up the control block load flags.
6468 	 */
6469 	cqicb->flags = FLAGS_LC | /* Load queue base address */
6470 	    FLAGS_LV | /* Load MSI-X vector */
6471 	    FLAGS_LI;  /* Load irq delay values */
6472 	if (rx_ring->lbq_len) {
6473 		/* Load lbq values */
6474 		cqicb->flags = (uint8_t)(cqicb->flags | FLAGS_LL);
6475 		tmp = (uint64_t)rx_ring->lbq_dma.dma_addr;
6476 		base_indirect_ptr = (uint64_t *)rx_ring->lbq_base_indirect;
6477 		page_entries = 0;
6478 		do {
6479 			*base_indirect_ptr = cpu_to_le64(tmp);
6480 			tmp += VM_PAGE_SIZE;
6481 			base_indirect_ptr++;
6482 			page_entries++;
6483 		} while (page_entries < (int)(
6484 		    ((rx_ring->lbq_len * sizeof (uint64_t)) / VM_PAGE_SIZE)));
6485 
6486 		cqicb->lbq_addr_lo =
6487 		    cpu_to_le32(LS_64BITS(rx_ring->lbq_base_indirect_dma));
6488 		cqicb->lbq_addr_hi =
6489 		    cpu_to_le32(MS_64BITS(rx_ring->lbq_base_indirect_dma));
6490 		bq_len = (uint16_t)((rx_ring->lbq_buf_size == 65536) ?
6491 		    (uint16_t)0 : (uint16_t)rx_ring->lbq_buf_size);
6492 		cqicb->lbq_buf_size = (uint16_t)cpu_to_le16(bq_len);
6493 		bq_len = (uint16_t)((rx_ring->lbq_len == 65536) ? (uint16_t)0 :
6494 		    (uint16_t)rx_ring->lbq_len);
6495 		cqicb->lbq_len = (uint16_t)cpu_to_le16(bq_len);
6496 		rx_ring->lbq_prod_idx = 0;
6497 		rx_ring->lbq_curr_idx = 0;
6498 	}
6499 	if (rx_ring->sbq_len) {
6500 		/* Load sbq values */
6501 		cqicb->flags = (uint8_t)(cqicb->flags | FLAGS_LS);
6502 		tmp = (uint64_t)rx_ring->sbq_dma.dma_addr;
6503 		base_indirect_ptr = (uint64_t *)rx_ring->sbq_base_indirect;
6504 		page_entries = 0;
6505 
6506 		do {
6507 			*base_indirect_ptr = cpu_to_le64(tmp);
6508 			tmp += VM_PAGE_SIZE;
6509 			base_indirect_ptr++;
6510 			page_entries++;
6511 		} while (page_entries < (uint32_t)
6512 		    (((rx_ring->sbq_len * sizeof (uint64_t)) / VM_PAGE_SIZE)));
6513 
6514 		cqicb->sbq_addr_lo =
6515 		    cpu_to_le32(LS_64BITS(rx_ring->sbq_base_indirect_dma));
6516 		cqicb->sbq_addr_hi =
6517 		    cpu_to_le32(MS_64BITS(rx_ring->sbq_base_indirect_dma));
6518 		cqicb->sbq_buf_size = (uint16_t)
6519 		    cpu_to_le16((uint16_t)(rx_ring->sbq_buf_size/2));
6520 		bq_len = (uint16_t)((rx_ring->sbq_len == 65536) ?
6521 		    (uint16_t)0 : (uint16_t)rx_ring->sbq_len);
6522 		cqicb->sbq_len = (uint16_t)cpu_to_le16(bq_len);
6523 		rx_ring->sbq_prod_idx = 0;
6524 		rx_ring->sbq_curr_idx = 0;
6525 	}
6526 	switch (rx_ring->type) {
6527 	case TX_Q:
6528 		cqicb->irq_delay = (uint16_t)
6529 		    cpu_to_le16(qlge->tx_coalesce_usecs);
6530 		cqicb->pkt_delay = (uint16_t)
6531 		    cpu_to_le16(qlge->tx_max_coalesced_frames);
6532 		break;
6533 
6534 	case DEFAULT_Q:
6535 		cqicb->irq_delay = (uint16_t)
6536 		    cpu_to_le16(qlge->rx_coalesce_usecs);
6537 		cqicb->pkt_delay = (uint16_t)
6538 		    cpu_to_le16(qlge->rx_max_coalesced_frames);
6539 		break;
6540 
6541 	case RX_Q:
6542 		/*
6543 		 * Inbound completion handling rx_rings run in
6544 		 * separate NAPI contexts.
6545 		 */
6546 		cqicb->irq_delay = (uint16_t)
6547 		    cpu_to_le16(qlge->rx_coalesce_usecs);
6548 		cqicb->pkt_delay = (uint16_t)
6549 		    cpu_to_le16(qlge->rx_max_coalesced_frames);
6550 		break;
6551 	default:
6552 		cmn_err(CE_WARN, "Invalid rx_ring->type = %d.",
6553 		    rx_ring->type);
6554 	}
6555 	QL_PRINT(DBG_INIT, ("Initializing rx completion queue %d.\n",
6556 	    rx_ring->cq_id));
6557 	/* QL_DUMP_CQICB(qlge, cqicb); */
6558 	err = ql_write_cfg(qlge, CFG_LCQ, rx_ring->cqicb_dma.dma_addr,
6559 	    rx_ring->cq_id);
6560 	if (err) {
6561 		cmn_err(CE_WARN, "Failed to load CQICB.");
6562 		return (err);
6563 	}
6564 
6565 	rx_ring->rx_packets_dropped_no_buffer = 0;
6566 	rx_ring->rx_pkt_dropped_mac_unenabled = 0;
6567 	rx_ring->rx_failed_sbq_allocs = 0;
6568 	rx_ring->rx_failed_lbq_allocs = 0;
6569 	rx_ring->rx_packets = 0;
6570 	rx_ring->rx_bytes = 0;
6571 	rx_ring->frame_too_long = 0;
6572 	rx_ring->frame_too_short = 0;
6573 	rx_ring->fcs_err = 0;
6574 
6575 	return (err);
6576 }
6577 
6578 /*
6579  * start RSS
6580  */
6581 static int
6582 ql_start_rss(qlge_t *qlge)
6583 {
6584 	struct ricb *ricb = (struct ricb *)qlge->ricb_dma.vaddr;
6585 	int status = 0;
6586 	int i;
6587 	uint8_t *hash_id = (uint8_t *)ricb->hash_cq_id;
6588 
6589 	bzero((void *)ricb, sizeof (*ricb));
6590 
6591 	ricb->base_cq = RSS_L4K;
6592 	ricb->flags =
6593 	    (RSS_L6K | RSS_LI | RSS_LB | RSS_LM | RSS_RI4 | RSS_RI6 | RSS_RT4 |
6594 	    RSS_RT6);
6595 	ricb->mask = (uint16_t)cpu_to_le16(RSS_HASH_CQ_ID_MAX - 1);
6596 
6597 	/*
6598 	 * Fill out the Indirection Table.
6599 	 */
6600 	for (i = 0; i < RSS_HASH_CQ_ID_MAX; i++)
6601 		hash_id[i] = (uint8_t)(i & (qlge->rss_ring_count - 1));
6602 
6603 	(void) memcpy(&ricb->ipv6_hash_key[0], key_data, 40);
6604 	(void) memcpy(&ricb->ipv4_hash_key[0], key_data, 16);
6605 
6606 	QL_PRINT(DBG_INIT, ("Initializing RSS.\n"));
6607 
6608 	status = ql_write_cfg(qlge, CFG_LR, qlge->ricb_dma.dma_addr, 0);
6609 	if (status) {
6610 		cmn_err(CE_WARN, "Failed to load RICB.");
6611 		return (status);
6612 	}
6613 
6614 	return (status);
6615 }
6616 
6617 /*
6618  * load a tx ring control block to hw and start this ring
6619  */
6620 static int
6621 ql_start_tx_ring(qlge_t *qlge, struct tx_ring *tx_ring)
6622 {
6623 	struct wqicb_t *wqicb = (struct wqicb_t *)tx_ring->wqicb_dma.vaddr;
6624 	caddr_t doorbell_area =
6625 	    qlge->doorbell_reg_iobase + (VM_PAGE_SIZE * tx_ring->wq_id);
6626 	void *shadow_reg = (uint8_t *)qlge->host_copy_shadow_dma_attr.vaddr +
6627 	    (tx_ring->wq_id * sizeof (uint64_t)) * RX_TX_RING_SHADOW_SPACE;
6628 	uint64_t shadow_reg_dma = qlge->host_copy_shadow_dma_attr.dma_addr +
6629 	    (tx_ring->wq_id * sizeof (uint64_t)) * RX_TX_RING_SHADOW_SPACE;
6630 	int err = 0;
6631 
6632 	/*
6633 	 * Assign doorbell registers for this tx_ring.
6634 	 */
6635 
6636 	/* TX PCI doorbell mem area for tx producer index */
6637 	tx_ring->prod_idx_db_reg = (uint32_t *)(void *)doorbell_area;
6638 	tx_ring->prod_idx = 0;
6639 	/* TX PCI doorbell mem area + 0x04 */
6640 	tx_ring->valid_db_reg = (uint32_t *)(void *)
6641 	    ((uint8_t *)(void *)doorbell_area + 0x04);
6642 
6643 	/*
6644 	 * Assign shadow registers for this tx_ring.
6645 	 */
6646 	tx_ring->cnsmr_idx_sh_reg = shadow_reg;
6647 	tx_ring->cnsmr_idx_sh_reg_dma = shadow_reg_dma;
6648 	*tx_ring->cnsmr_idx_sh_reg = 0;
6649 
6650 	QL_PRINT(DBG_INIT, ("%s tx ring(%d): cnsmr_idx virtual addr = 0x%lx,"
6651 	    " phys_addr 0x%lx\n",
6652 	    __func__, tx_ring->wq_id, tx_ring->cnsmr_idx_sh_reg,
6653 	    tx_ring->cnsmr_idx_sh_reg_dma));
6654 
6655 	wqicb->len =
6656 	    (uint16_t)cpu_to_le16(tx_ring->wq_len | Q_LEN_V | Q_LEN_CPP_CONT);
6657 	wqicb->flags = cpu_to_le16(Q_FLAGS_LC |
6658 	    Q_FLAGS_LB | Q_FLAGS_LI | Q_FLAGS_LO);
6659 	wqicb->cq_id_rss = (uint16_t)cpu_to_le16(tx_ring->cq_id);
6660 	wqicb->rid = 0;
6661 	wqicb->wq_addr_lo = cpu_to_le32(LS_64BITS(tx_ring->wq_dma.dma_addr));
6662 	wqicb->wq_addr_hi = cpu_to_le32(MS_64BITS(tx_ring->wq_dma.dma_addr));
6663 	wqicb->cnsmr_idx_addr_lo =
6664 	    cpu_to_le32(LS_64BITS(tx_ring->cnsmr_idx_sh_reg_dma));
6665 	wqicb->cnsmr_idx_addr_hi =
6666 	    cpu_to_le32(MS_64BITS(tx_ring->cnsmr_idx_sh_reg_dma));
6667 
6668 	ql_init_tx_ring(tx_ring);
6669 	/* QL_DUMP_WQICB(qlge, wqicb); */
6670 	err = ql_write_cfg(qlge, CFG_LRQ, tx_ring->wqicb_dma.dma_addr,
6671 	    tx_ring->wq_id);
6672 
6673 	if (err) {
6674 		cmn_err(CE_WARN, "Failed to load WQICB.");
6675 		return (err);
6676 	}
6677 	return (err);
6678 }
6679 
6680 /*
6681  * Set up a MAC, multicast or VLAN address for the
6682  * inbound frame matching.
6683  */
6684 int
6685 ql_set_mac_addr_reg(qlge_t *qlge, uint8_t *addr, uint32_t type,
6686     uint16_t index)
6687 {
6688 	uint32_t offset = 0;
6689 	int status = DDI_SUCCESS;
6690 
6691 	switch (type) {
6692 	case MAC_ADDR_TYPE_MULTI_MAC:
6693 	case MAC_ADDR_TYPE_CAM_MAC: {
6694 		uint32_t cam_output;
6695 		uint32_t upper = (addr[0] << 8) | addr[1];
6696 		uint32_t lower =
6697 		    (addr[2] << 24) | (addr[3] << 16) | (addr[4] << 8) |
6698 		    (addr[5]);
6699 
6700 		QL_PRINT(DBG_INIT, ("Adding %s ", (type ==
6701 		    MAC_ADDR_TYPE_MULTI_MAC) ?
6702 		    "MULTICAST" : "UNICAST"));
6703 		QL_PRINT(DBG_INIT,
6704 		    ("addr %02x %02x %02x %02x %02x %02x at index %d in "
6705 		    "the CAM.\n",
6706 		    addr[0], addr[1], addr[2], addr[3], addr[4],
6707 		    addr[5], index));
6708 
6709 		status = ql_wait_reg_rdy(qlge,
6710 		    REG_MAC_PROTOCOL_ADDRESS_INDEX, MAC_ADDR_MW, 0);
6711 		if (status)
6712 			goto exit;
6713 		/* offset 0 - lower 32 bits of the MAC address */
6714 		ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
6715 		    (offset++) |
6716 		    (index << MAC_ADDR_IDX_SHIFT) | /* index */
6717 		    type);	/* type */
6718 		ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA, lower);
6719 		status = ql_wait_reg_rdy(qlge,
6720 		    REG_MAC_PROTOCOL_ADDRESS_INDEX, MAC_ADDR_MW, 0);
6721 		if (status)
6722 			goto exit;
6723 		/* offset 1 - upper 16 bits of the MAC address */
6724 		ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
6725 		    (offset++) |
6726 		    (index << MAC_ADDR_IDX_SHIFT) | /* index */
6727 		    type);	/* type */
6728 		ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA, upper);
6729 		status = ql_wait_reg_rdy(qlge,
6730 		    REG_MAC_PROTOCOL_ADDRESS_INDEX, MAC_ADDR_MW, 0);
6731 		if (status)
6732 			goto exit;
6733 		/* offset 2 - CQ ID associated with this MAC address */
6734 		ql_write_reg(qlge, REG_MAC_PROTOCOL_ADDRESS_INDEX,
6735 		    (offset) | (index << MAC_ADDR_IDX_SHIFT) |	/* index */
6736 		    type);	/* type */
6737 		/*
6738 		 * This field should also include the queue id
6739 		 * and possibly the function id.  Right now we hardcode
6740 		 * the route field to NIC core.
6741 		 */
6742 		if (type == MAC_ADDR_TYPE_CAM_MAC) {
6743 			cam_output = (CAM_OUT_ROUTE_NIC |
6744 			    (qlge->func_number << CAM_OUT_FUNC_SHIFT) |
6745 			    (0 <<
6746 			    CAM_OUT_CQ_ID_SHIFT));
6747 
6748 			/* route to NIC core */
6749 			ql_write_reg(qlge, REG_MAC_PROTOCOL_DATA,
6750 			    cam_output);
6751 			}
6752 		break;
6753 		}
6754 	default:
6755 		cmn_err(CE_WARN,
6756 		    "Address type %d not yet supported.", type);
6757 		status = DDI_FAILURE;
6758 	}
6759 exit:
6760 	return (status);
6761 }
6762 
6763 /*
6764  * The NIC function for this chip has 16 routing indexes.  Each one can be used
6765  * to route different frame types to various inbound queues.  We send broadcast
6766  * multicast/error frames to the default queue for slow handling,
6767  * and CAM hit/RSS frames to the fast handling queues.
6768  */
6769 static int
6770 ql_set_routing_reg(qlge_t *qlge, uint32_t index, uint32_t mask, int enable)
6771 {
6772 	int status;
6773 	uint32_t value = 0;
6774 
6775 	QL_PRINT(DBG_INIT,
6776 	    ("%s %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s mask %s the routing reg.\n",
6777 	    (enable ? "Adding" : "Removing"),
6778 	    ((index == RT_IDX_ALL_ERR_SLOT) ? "MAC ERROR/ALL ERROR" : ""),
6779 	    ((index == RT_IDX_IP_CSUM_ERR_SLOT) ? "IP CSUM ERROR" : ""),
6780 	    ((index ==
6781 	    RT_IDX_TCP_UDP_CSUM_ERR_SLOT) ? "TCP/UDP CSUM ERROR" : ""),
6782 	    ((index == RT_IDX_BCAST_SLOT) ? "BROADCAST" : ""),
6783 	    ((index == RT_IDX_MCAST_MATCH_SLOT) ? "MULTICAST MATCH" : ""),
6784 	    ((index == RT_IDX_ALLMULTI_SLOT) ? "ALL MULTICAST MATCH" : ""),
6785 	    ((index == RT_IDX_UNUSED6_SLOT) ? "UNUSED6" : ""),
6786 	    ((index == RT_IDX_UNUSED7_SLOT) ? "UNUSED7" : ""),
6787 	    ((index == RT_IDX_RSS_MATCH_SLOT) ? "RSS ALL/IPV4 MATCH" : ""),
6788 	    ((index == RT_IDX_RSS_IPV6_SLOT) ? "RSS IPV6" : ""),
6789 	    ((index == RT_IDX_RSS_TCP4_SLOT) ? "RSS TCP4" : ""),
6790 	    ((index == RT_IDX_RSS_TCP6_SLOT) ? "RSS TCP6" : ""),
6791 	    ((index == RT_IDX_CAM_HIT_SLOT) ? "CAM HIT" : ""),
6792 	    ((index == RT_IDX_UNUSED013) ? "UNUSED13" : ""),
6793 	    ((index == RT_IDX_UNUSED014) ? "UNUSED14" : ""),
6794 	    ((index == RT_IDX_PROMISCUOUS_SLOT) ? "PROMISCUOUS" : ""),
6795 	    (enable ? "to" : "from")));
6796 
6797 	switch (mask) {
6798 	case RT_IDX_CAM_HIT:
6799 		value = RT_IDX_DST_CAM_Q | /* dest */
6800 		    RT_IDX_TYPE_NICQ | /* type */
6801 		    (RT_IDX_CAM_HIT_SLOT << RT_IDX_IDX_SHIFT); /* index */
6802 		break;
6803 
6804 	case RT_IDX_VALID: /* Promiscuous Mode frames. */
6805 		value = RT_IDX_DST_DFLT_Q |	/* dest */
6806 		    RT_IDX_TYPE_NICQ |	/* type */
6807 		    (RT_IDX_PROMISCUOUS_SLOT << RT_IDX_IDX_SHIFT); /* index */
6808 		break;
6809 
6810 	case RT_IDX_ERR:	/* Pass up MAC,IP,TCP/UDP error frames. */
6811 		value = RT_IDX_DST_DFLT_Q |	/* dest */
6812 		    RT_IDX_TYPE_NICQ |	/* type */
6813 		    (RT_IDX_ALL_ERR_SLOT << RT_IDX_IDX_SHIFT); /* index */
6814 		break;
6815 
6816 	case RT_IDX_BCAST:	/* Pass up Broadcast frames to default Q. */
6817 		value = RT_IDX_DST_DFLT_Q |	/* dest */
6818 		    RT_IDX_TYPE_NICQ |	/* type */
6819 		    (RT_IDX_BCAST_SLOT << RT_IDX_IDX_SHIFT); /* index */
6820 		break;
6821 
6822 	case RT_IDX_MCAST:	/* Pass up All Multicast frames. */
6823 		value = RT_IDX_DST_CAM_Q |	/* dest */
6824 		    RT_IDX_TYPE_NICQ |	/* type */
6825 		    (RT_IDX_ALLMULTI_SLOT << RT_IDX_IDX_SHIFT); /* index */
6826 		break;
6827 
6828 	case RT_IDX_MCAST_MATCH:	/* Pass up matched Multicast frames. */
6829 		value = RT_IDX_DST_CAM_Q |	/* dest */
6830 		    RT_IDX_TYPE_NICQ |	/* type */
6831 		    (RT_IDX_MCAST_MATCH_SLOT << RT_IDX_IDX_SHIFT); /* index */
6832 		break;
6833 
6834 	case RT_IDX_RSS_MATCH:	/* Pass up matched RSS frames. */
6835 		value = RT_IDX_DST_RSS |	/* dest */
6836 		    RT_IDX_TYPE_NICQ |	/* type */
6837 		    (RT_IDX_RSS_MATCH_SLOT << RT_IDX_IDX_SHIFT); /* index */
6838 		break;
6839 
6840 	case 0:	/* Clear the E-bit on an entry. */
6841 		value = RT_IDX_DST_DFLT_Q |	/* dest */
6842 		    RT_IDX_TYPE_NICQ |	/* type */
6843 		    (index << RT_IDX_IDX_SHIFT); /* index */
6844 		break;
6845 
6846 	default:
6847 		cmn_err(CE_WARN, "Mask type %d not yet supported.",
6848 		    mask);
6849 		status = -EPERM;
6850 		goto exit;
6851 	}
6852 
6853 	if (value != 0) {
6854 		status = ql_wait_reg_rdy(qlge, REG_ROUTING_INDEX, RT_IDX_MW, 0);
6855 		if (status)
6856 			goto exit;
6857 		value |= (enable ? RT_IDX_E : 0);
6858 		ql_write_reg(qlge, REG_ROUTING_INDEX, value);
6859 		ql_write_reg(qlge, REG_ROUTING_DATA, enable ? mask : 0);
6860 	}
6861 
6862 exit:
6863 	return (status);
6864 }
6865 
6866 /*
6867  * Clear all the entries in the routing table.
6868  * Caller must get semaphore in advance.
6869  */
6870 
6871 static int
6872 ql_stop_routing(qlge_t *qlge)
6873 {
6874 	int status = 0;
6875 	int i;
6876 	/* Clear all the entries in the routing table. */
6877 	for (i = 0; i < 16; i++) {
6878 		status = ql_set_routing_reg(qlge, i, 0, 0);
6879 		if (status) {
6880 			cmn_err(CE_WARN, "Stop routing failed. ");
6881 		}
6882 	}
6883 	return (status);
6884 }
6885 
6886 /* Initialize the frame-to-queue routing. */
6887 int
6888 ql_route_initialize(qlge_t *qlge)
6889 {
6890 	int status = 0;
6891 
6892 	status = ql_sem_spinlock(qlge, SEM_RT_IDX_MASK);
6893 	if (status != DDI_SUCCESS)
6894 		return (status);
6895 
6896 	/* Clear all the entries in the routing table. */
6897 	status = ql_stop_routing(qlge);
6898 	if (status) {
6899 		goto exit;
6900 	}
6901 	status = ql_set_routing_reg(qlge, RT_IDX_BCAST_SLOT, RT_IDX_BCAST, 1);
6902 	if (status) {
6903 		cmn_err(CE_WARN,
6904 		    "Failed to init routing register for broadcast packets.");
6905 		goto exit;
6906 	}
6907 	/*
6908 	 * If we have more than one inbound queue, then turn on RSS in the
6909 	 * routing block.
6910 	 */
6911 	if (qlge->rss_ring_count > 1) {
6912 		status = ql_set_routing_reg(qlge, RT_IDX_RSS_MATCH_SLOT,
6913 		    RT_IDX_RSS_MATCH, 1);
6914 		if (status) {
6915 			cmn_err(CE_WARN,
6916 			    "Failed to init routing register for MATCH RSS "
6917 			    "packets.");
6918 			goto exit;
6919 		}
6920 	}
6921 
6922 	status = ql_set_routing_reg(qlge, RT_IDX_CAM_HIT_SLOT,
6923 	    RT_IDX_CAM_HIT, 1);
6924 	if (status) {
6925 		cmn_err(CE_WARN,
6926 		    "Failed to init routing register for CAM packets.");
6927 		goto exit;
6928 	}
6929 
6930 	status = ql_set_routing_reg(qlge, RT_IDX_MCAST_MATCH_SLOT,
6931 	    RT_IDX_MCAST_MATCH, 1);
6932 	if (status) {
6933 		cmn_err(CE_WARN,
6934 		    "Failed to init routing register for Multicast "
6935 		    "packets.");
6936 	}
6937 
6938 exit:
6939 	ql_sem_unlock(qlge, SEM_RT_IDX_MASK);
6940 	return (status);
6941 }
6942 
6943 /*
6944  * Initialize hardware
6945  */
6946 static int
6947 ql_device_initialize(qlge_t *qlge)
6948 {
6949 	uint32_t value, mask;
6950 	int i;
6951 	int status = 0;
6952 	uint16_t pause = PAUSE_MODE_DISABLED;
6953 	boolean_t update_port_config = B_FALSE;
6954 	uint32_t pause_bit_mask;
6955 	boolean_t dcbx_enable = B_FALSE;
6956 	uint32_t dcbx_bit_mask = 0x10;
6957 	/*
6958 	 * Set up the System register to halt on errors.
6959 	 */
6960 	value = SYS_EFE | SYS_FAE;
6961 	mask = value << 16;
6962 	ql_write_reg(qlge, REG_SYSTEM, mask | value);
6963 
6964 	/* Set the default queue. */
6965 	value = NIC_RCV_CFG_DFQ;
6966 	mask = NIC_RCV_CFG_DFQ_MASK;
6967 
6968 	ql_write_reg(qlge, REG_NIC_RECEIVE_CONFIGURATION, mask | value);
6969 
6970 	/* Enable the MPI interrupt. */
6971 	ql_write_reg(qlge, REG_INTERRUPT_MASK, (INTR_MASK_PI << 16)
6972 	    | INTR_MASK_PI);
6973 	/* Enable the function, set pagesize, enable error checking. */
6974 	value = FSC_FE | FSC_EPC_INBOUND | FSC_EPC_OUTBOUND |
6975 	    FSC_EC | FSC_VM_PAGE_4K | FSC_DBRST_1024;
6976 	/* Set/clear header splitting. */
6977 	if (CFG_IST(qlge, CFG_ENABLE_SPLIT_HEADER)) {
6978 		value |= FSC_SH;
6979 		ql_write_reg(qlge, REG_SPLIT_HEADER, SMALL_BUFFER_SIZE);
6980 	}
6981 	mask = FSC_VM_PAGESIZE_MASK |
6982 	    FSC_DBL_MASK | FSC_DBRST_MASK | (value << 16);
6983 	ql_write_reg(qlge, REG_FUNCTION_SPECIFIC_CONTROL, mask | value);
6984 	/*
6985 	 * check current port max frame size, if different from OS setting,
6986 	 * then we need to change
6987 	 */
6988 	qlge->max_frame_size =
6989 	    (qlge->mtu == ETHERMTU)? NORMAL_FRAME_SIZE : JUMBO_FRAME_SIZE;
6990 
6991 	mutex_enter(&qlge->mbx_mutex);
6992 	status = ql_get_port_cfg(qlge);
6993 	mutex_exit(&qlge->mbx_mutex);
6994 
6995 	if (status == DDI_SUCCESS) {
6996 		/* if current frame size is smaller than required size */
6997 		if (qlge->port_cfg_info.max_frame_size <
6998 		    qlge->max_frame_size) {
6999 			QL_PRINT(DBG_MBX,
7000 			    ("update frame size, current %d, new %d\n",
7001 			    qlge->port_cfg_info.max_frame_size,
7002 			    qlge->max_frame_size));
7003 			qlge->port_cfg_info.max_frame_size =
7004 			    qlge->max_frame_size;
7005 			qlge->port_cfg_info.link_cfg |= ENABLE_JUMBO;
7006 			update_port_config = B_TRUE;
7007 		}
7008 
7009 		if (qlge->port_cfg_info.link_cfg & STD_PAUSE)
7010 			pause = PAUSE_MODE_STANDARD;
7011 		else if (qlge->port_cfg_info.link_cfg & PP_PAUSE)
7012 			pause = PAUSE_MODE_PER_PRIORITY;
7013 
7014 		if (pause != qlge->pause) {
7015 			pause_bit_mask = 0x60;	/* bit 5-6 */
7016 			/* clear pause bits */
7017 			qlge->port_cfg_info.link_cfg &= ~pause_bit_mask;
7018 			if (qlge->pause == PAUSE_MODE_STANDARD)
7019 				qlge->port_cfg_info.link_cfg |= STD_PAUSE;
7020 			else if (qlge->pause == PAUSE_MODE_PER_PRIORITY)
7021 				qlge->port_cfg_info.link_cfg |= PP_PAUSE;
7022 			update_port_config = B_TRUE;
7023 		}
7024 
7025 		if (qlge->port_cfg_info.link_cfg & DCBX_ENABLE)
7026 			dcbx_enable = B_TRUE;
7027 		if (dcbx_enable != qlge->dcbx_enable) {
7028 			qlge->port_cfg_info.link_cfg &= ~dcbx_bit_mask;
7029 			if (qlge->dcbx_enable)
7030 				qlge->port_cfg_info.link_cfg |= DCBX_ENABLE;
7031 		}
7032 
7033 		update_port_config = B_TRUE;
7034 
7035 		/* if need to update port configuration */
7036 		if (update_port_config) {
7037 			mutex_enter(&qlge->mbx_mutex);
7038 			(void) ql_set_mpi_port_config(qlge,
7039 			    qlge->port_cfg_info);
7040 			mutex_exit(&qlge->mbx_mutex);
7041 		}
7042 	} else
7043 		cmn_err(CE_WARN, "ql_get_port_cfg failed");
7044 
7045 	/* Start up the rx queues. */
7046 	for (i = 0; i < qlge->rx_ring_count; i++) {
7047 		status = ql_start_rx_ring(qlge, &qlge->rx_ring[i]);
7048 		if (status) {
7049 			cmn_err(CE_WARN,
7050 			    "Failed to start rx ring[%d]", i);
7051 			return (status);
7052 		}
7053 	}
7054 
7055 	/*
7056 	 * If there is more than one inbound completion queue
7057 	 * then download a RICB to configure RSS.
7058 	 */
7059 	if (qlge->rss_ring_count > 1) {
7060 		status = ql_start_rss(qlge);
7061 		if (status) {
7062 			cmn_err(CE_WARN, "Failed to start RSS.");
7063 			return (status);
7064 		}
7065 	}
7066 
7067 	/* Start up the tx queues. */
7068 	for (i = 0; i < qlge->tx_ring_count; i++) {
7069 		status = ql_start_tx_ring(qlge, &qlge->tx_ring[i]);
7070 		if (status) {
7071 			cmn_err(CE_WARN,
7072 			    "Failed to start tx ring[%d]", i);
7073 			return (status);
7074 		}
7075 	}
7076 	qlge->selected_tx_ring = 0;
7077 	/* Set the frame routing filter. */
7078 	status = ql_route_initialize(qlge);
7079 	if (status) {
7080 		cmn_err(CE_WARN,
7081 		    "Failed to init CAM/Routing tables.");
7082 		return (status);
7083 	}
7084 
7085 	return (status);
7086 }
7087 /*
7088  * Issue soft reset to chip.
7089  */
7090 static int
7091 ql_asic_reset(qlge_t *qlge)
7092 {
7093 	int status = DDI_SUCCESS;
7094 
7095 	ql_write_reg(qlge, REG_RESET_FAILOVER, FUNCTION_RESET_MASK
7096 	    |FUNCTION_RESET);
7097 
7098 	if (ql_wait_reg_bit(qlge, REG_RESET_FAILOVER, FUNCTION_RESET,
7099 	    BIT_RESET, 0) != DDI_SUCCESS) {
7100 		cmn_err(CE_WARN,
7101 		    "TIMEOUT!!! errored out of resetting the chip!");
7102 		status = DDI_FAILURE;
7103 	}
7104 
7105 	return (status);
7106 }
7107 
7108 /*
7109  * If there are more than MIN_BUFFERS_ARM_COUNT small buffer descriptors in
7110  * its free list, move xMIN_BUFFERS_ARM_COUNT descriptors to its in use list
7111  * to be used by hardware.
7112  */
7113 static void
7114 ql_arm_sbuf(qlge_t *qlge, struct rx_ring *rx_ring)
7115 {
7116 	struct bq_desc *sbq_desc;
7117 	int i;
7118 	uint64_t *sbq_entry = rx_ring->sbq_dma.vaddr;
7119 	uint32_t arm_count;
7120 
7121 	if (rx_ring->sbuf_free_count > rx_ring->sbq_len-MIN_BUFFERS_ARM_COUNT)
7122 		arm_count = (rx_ring->sbq_len-MIN_BUFFERS_ARM_COUNT);
7123 	else {
7124 		/* Adjust to a multiple of 16 */
7125 		arm_count = (rx_ring->sbuf_free_count / 16) * 16;
7126 #ifdef QLGE_LOAD_UNLOAD
7127 		cmn_err(CE_NOTE, "adjust sbuf arm_count %d\n", arm_count);
7128 #endif
7129 	}
7130 	for (i = 0; i < arm_count; i++) {
7131 		sbq_desc = ql_get_sbuf_from_free_list(rx_ring);
7132 		if (sbq_desc == NULL)
7133 			break;
7134 		/* Arm asic */
7135 		*sbq_entry = cpu_to_le64(sbq_desc->bd_dma.dma_addr);
7136 		sbq_entry++;
7137 
7138 		/* link the descriptors to in_use_list */
7139 		ql_add_sbuf_to_in_use_list(rx_ring, sbq_desc);
7140 		rx_ring->sbq_prod_idx++;
7141 	}
7142 	ql_update_sbq_prod_idx(qlge, rx_ring);
7143 }
7144 
7145 /*
7146  * If there are more than MIN_BUFFERS_ARM_COUNT large buffer descriptors in
7147  * its free list, move xMIN_BUFFERS_ARM_COUNT descriptors to its in use list
7148  * to be used by hardware.
7149  */
7150 static void
7151 ql_arm_lbuf(qlge_t *qlge, struct rx_ring *rx_ring)
7152 {
7153 	struct bq_desc *lbq_desc;
7154 	int i;
7155 	uint64_t *lbq_entry = rx_ring->lbq_dma.vaddr;
7156 	uint32_t arm_count;
7157 
7158 	if (rx_ring->lbuf_free_count > rx_ring->lbq_len-MIN_BUFFERS_ARM_COUNT)
7159 		arm_count = (rx_ring->lbq_len-MIN_BUFFERS_ARM_COUNT);
7160 	else {
7161 		/* Adjust to a multiple of 16 */
7162 		arm_count = (rx_ring->lbuf_free_count / 16) * 16;
7163 #ifdef QLGE_LOAD_UNLOAD
7164 		cmn_err(CE_NOTE, "adjust lbuf arm_count %d\n", arm_count);
7165 #endif
7166 	}
7167 	for (i = 0; i < arm_count; i++) {
7168 		lbq_desc = ql_get_lbuf_from_free_list(rx_ring);
7169 		if (lbq_desc == NULL)
7170 			break;
7171 		/* Arm asic */
7172 		*lbq_entry = cpu_to_le64(lbq_desc->bd_dma.dma_addr);
7173 		lbq_entry++;
7174 
7175 		/* link the descriptors to in_use_list */
7176 		ql_add_lbuf_to_in_use_list(rx_ring, lbq_desc);
7177 		rx_ring->lbq_prod_idx++;
7178 	}
7179 	ql_update_lbq_prod_idx(qlge, rx_ring);
7180 }
7181 
7182 
7183 /*
7184  * Initializes the adapter by configuring request and response queues,
7185  * allocates and ARMs small and large receive buffers to the
7186  * hardware
7187  */
7188 static int
7189 ql_bringup_adapter(qlge_t *qlge)
7190 {
7191 	int i;
7192 
7193 	if (ql_device_initialize(qlge) != DDI_SUCCESS) {
7194 		cmn_err(CE_WARN, "?%s(%d): ql_device_initialize failed",
7195 		    __func__, qlge->instance);
7196 		goto err_bringup;
7197 	}
7198 	qlge->sequence |= INIT_ADAPTER_UP;
7199 
7200 #ifdef QLGE_TRACK_BUFFER_USAGE
7201 	for (i = 0; i < qlge->rx_ring_count; i++) {
7202 		if (qlge->rx_ring[i].type != TX_Q) {
7203 			qlge->rx_sb_low_count[i] = NUM_SMALL_BUFFERS;
7204 			qlge->rx_lb_low_count[i] = NUM_LARGE_BUFFERS;
7205 		}
7206 		qlge->cq_low_count[i] = NUM_RX_RING_ENTRIES;
7207 	}
7208 #endif
7209 	/* Arm buffers */
7210 	for (i = 0; i < qlge->rx_ring_count; i++) {
7211 		if (qlge->rx_ring[i].type != TX_Q) {
7212 			ql_arm_sbuf(qlge, &qlge->rx_ring[i]);
7213 			ql_arm_lbuf(qlge, &qlge->rx_ring[i]);
7214 		}
7215 	}
7216 
7217 	/* Enable work/request queues */
7218 	for (i = 0; i < qlge->tx_ring_count; i++) {
7219 		if (qlge->tx_ring[i].valid_db_reg)
7220 			ql_write_doorbell_reg(qlge,
7221 			    qlge->tx_ring[i].valid_db_reg,
7222 			    REQ_Q_VALID);
7223 	}
7224 
7225 	/* Enable completion queues */
7226 	for (i = 0; i < qlge->rx_ring_count; i++) {
7227 		if (qlge->rx_ring[i].valid_db_reg)
7228 			ql_write_doorbell_reg(qlge,
7229 			    qlge->rx_ring[i].valid_db_reg,
7230 			    RSP_Q_VALID);
7231 	}
7232 
7233 	for (i = 0; i < qlge->tx_ring_count; i++) {
7234 		mutex_enter(&qlge->tx_ring[i].tx_lock);
7235 		qlge->tx_ring[i].mac_flags = QL_MAC_STARTED;
7236 		mutex_exit(&qlge->tx_ring[i].tx_lock);
7237 	}
7238 
7239 	for (i = 0; i < qlge->rx_ring_count; i++) {
7240 		mutex_enter(&qlge->rx_ring[i].rx_lock);
7241 		qlge->rx_ring[i].mac_flags = QL_MAC_STARTED;
7242 		mutex_exit(&qlge->rx_ring[i].rx_lock);
7243 	}
7244 
7245 	/* This mutex will get re-acquired in enable_completion interrupt */
7246 	mutex_exit(&qlge->hw_mutex);
7247 	/* Traffic can start flowing now */
7248 	ql_enable_all_completion_interrupts(qlge);
7249 	mutex_enter(&qlge->hw_mutex);
7250 
7251 	ql_enable_global_interrupt(qlge);
7252 
7253 	qlge->sequence |= ADAPTER_INIT;
7254 	return (DDI_SUCCESS);
7255 
7256 err_bringup:
7257 	(void) ql_asic_reset(qlge);
7258 	return (DDI_FAILURE);
7259 }
7260 
7261 /*
7262  * Initialize mutexes of each rx/tx rings
7263  */
7264 static int
7265 ql_init_rx_tx_locks(qlge_t *qlge)
7266 {
7267 	struct tx_ring *tx_ring;
7268 	struct rx_ring *rx_ring;
7269 	int i;
7270 
7271 	for (i = 0; i < qlge->tx_ring_count; i++) {
7272 		tx_ring = &qlge->tx_ring[i];
7273 		mutex_init(&tx_ring->tx_lock, NULL, MUTEX_DRIVER,
7274 		    DDI_INTR_PRI(qlge->intr_pri));
7275 	}
7276 
7277 	for (i = 0; i < qlge->rx_ring_count; i++) {
7278 		rx_ring = &qlge->rx_ring[i];
7279 		mutex_init(&rx_ring->rx_lock, NULL, MUTEX_DRIVER,
7280 		    DDI_INTR_PRI(qlge->intr_pri));
7281 		mutex_init(&rx_ring->sbq_lock, NULL, MUTEX_DRIVER,
7282 		    DDI_INTR_PRI(qlge->intr_pri));
7283 		mutex_init(&rx_ring->lbq_lock, NULL, MUTEX_DRIVER,
7284 		    DDI_INTR_PRI(qlge->intr_pri));
7285 	}
7286 
7287 	return (DDI_SUCCESS);
7288 }
7289 
7290 /*ARGSUSED*/
7291 /*
7292  * Simply call pci_ereport_post which generates ereports for errors
7293  * that occur in the PCI local bus configuration status registers.
7294  */
7295 static int
7296 ql_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
7297 {
7298 	pci_ereport_post(dip, err, NULL);
7299 	return (err->fme_status);
7300 }
7301 
7302 static void
7303 ql_fm_init(qlge_t *qlge)
7304 {
7305 	ddi_iblock_cookie_t iblk;
7306 
7307 	QL_PRINT(DBG_INIT, ("ql_fm_init(%d) entered, FMA capability %x\n",
7308 	    qlge->instance, qlge->fm_capabilities));
7309 	/*
7310 	 * Register capabilities with IO Fault Services. The capabilities
7311 	 * set above may not be supported by the parent nexus, in that case
7312 	 * some capability bits may be cleared.
7313 	 */
7314 	if (qlge->fm_capabilities)
7315 		ddi_fm_init(qlge->dip, &qlge->fm_capabilities, &iblk);
7316 
7317 	/*
7318 	 * Initialize pci ereport capabilities if ereport capable
7319 	 */
7320 	if (DDI_FM_EREPORT_CAP(qlge->fm_capabilities) ||
7321 	    DDI_FM_ERRCB_CAP(qlge->fm_capabilities)) {
7322 		pci_ereport_setup(qlge->dip);
7323 	}
7324 
7325 	/* Register error callback if error callback capable */
7326 	if (DDI_FM_ERRCB_CAP(qlge->fm_capabilities)) {
7327 		ddi_fm_handler_register(qlge->dip,
7328 		    ql_fm_error_cb, (void*) qlge);
7329 	}
7330 
7331 	/*
7332 	 * DDI_FLGERR_ACC indicates:
7333 	 *  Driver will check its access handle(s) for faults on
7334 	 *   a regular basis by calling ddi_fm_acc_err_get
7335 	 *  Driver is able to cope with incorrect results of I/O
7336 	 *   operations resulted from an I/O fault
7337 	 */
7338 	if (DDI_FM_ACC_ERR_CAP(qlge->fm_capabilities)) {
7339 		ql_dev_acc_attr.devacc_attr_access = DDI_FLAGERR_ACC;
7340 	}
7341 
7342 	/*
7343 	 * DDI_DMA_FLAGERR indicates:
7344 	 *  Driver will check its DMA handle(s) for faults on a
7345 	 *   regular basis using ddi_fm_dma_err_get
7346 	 *  Driver is able to cope with incorrect results of DMA
7347 	 *   operations resulted from an I/O fault
7348 	 */
7349 	if (DDI_FM_DMA_ERR_CAP(qlge->fm_capabilities)) {
7350 		tx_mapping_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
7351 		dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
7352 	}
7353 	QL_PRINT(DBG_INIT, ("ql_fm_init(%d) done\n",
7354 	    qlge->instance));
7355 }
7356 
7357 static void
7358 ql_fm_fini(qlge_t *qlge)
7359 {
7360 	QL_PRINT(DBG_INIT, ("ql_fm_fini(%d) entered\n",
7361 	    qlge->instance));
7362 	/* Only unregister FMA capabilities if we registered some */
7363 	if (qlge->fm_capabilities) {
7364 
7365 		/*
7366 		 * Release any resources allocated by pci_ereport_setup()
7367 		 */
7368 		if (DDI_FM_EREPORT_CAP(qlge->fm_capabilities) ||
7369 		    DDI_FM_ERRCB_CAP(qlge->fm_capabilities))
7370 			pci_ereport_teardown(qlge->dip);
7371 
7372 		/*
7373 		 * Un-register error callback if error callback capable
7374 		 */
7375 		if (DDI_FM_ERRCB_CAP(qlge->fm_capabilities))
7376 			ddi_fm_handler_unregister(qlge->dip);
7377 
7378 		/* Unregister from IO Fault Services */
7379 		ddi_fm_fini(qlge->dip);
7380 	}
7381 	QL_PRINT(DBG_INIT, ("ql_fm_fini(%d) done\n",
7382 	    qlge->instance));
7383 }
7384 /*
7385  * ql_attach - Driver attach.
7386  */
7387 static int
7388 ql_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
7389 {
7390 	int instance;
7391 	qlge_t *qlge = NULL;
7392 	int rval;
7393 	uint16_t w;
7394 	mac_register_t *macp = NULL;
7395 	uint32_t data;
7396 
7397 	rval = DDI_FAILURE;
7398 
7399 	/* first get the instance */
7400 	instance = ddi_get_instance(dip);
7401 
7402 	switch (cmd) {
7403 	case DDI_ATTACH:
7404 		/*
7405 		 * Allocate our per-device-instance structure
7406 		 */
7407 		qlge = (qlge_t *)kmem_zalloc(sizeof (*qlge), KM_SLEEP);
7408 		ASSERT(qlge != NULL);
7409 		qlge->sequence |= INIT_SOFTSTATE_ALLOC;
7410 
7411 		qlge->dip = dip;
7412 		qlge->instance = instance;
7413 		/* Set up the coalescing parameters. */
7414 		qlge->ql_dbgprnt = 0;
7415 #if QL_DEBUG
7416 		qlge->ql_dbgprnt = QL_DEBUG;
7417 #endif /* QL_DEBUG */
7418 
7419 		/*
7420 		 * Initialize for fma support
7421 		 */
7422 		/* fault management (fm) capabilities. */
7423 		qlge->fm_capabilities =
7424 		    DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE;
7425 		data = ql_get_prop(qlge, "fm-capable");
7426 		if (data <= 0xf) {
7427 			qlge->fm_capabilities = data;
7428 		}
7429 		ql_fm_init(qlge);
7430 		qlge->sequence |= INIT_FM;
7431 		QL_PRINT(DBG_INIT, ("ql_attach(%d): fma init done\n",
7432 		    qlge->instance));
7433 
7434 		/*
7435 		 * Setup the ISP8x00 registers address mapping to be
7436 		 * accessed by this particular driver.
7437 		 * 0x0   Configuration Space
7438 		 * 0x1   I/O Space
7439 		 * 0x2   1st Memory Space address - Control Register Set
7440 		 * 0x3   2nd Memory Space address - Doorbell Memory Space
7441 		 */
7442 		w = 2;
7443 		if (ddi_regs_map_setup(dip, w, (caddr_t *)&qlge->iobase, 0,
7444 		    sizeof (dev_reg_t), &ql_dev_acc_attr,
7445 		    &qlge->dev_handle) != DDI_SUCCESS) {
7446 			cmn_err(CE_WARN, "%s(%d): Unable to map device "
7447 			    "registers", ADAPTER_NAME, instance);
7448 			break;
7449 		}
7450 		QL_PRINT(DBG_GLD, ("ql_attach: I/O base = 0x%x\n",
7451 		    qlge->iobase));
7452 		qlge->sequence |= INIT_REGS_SETUP;
7453 
7454 		/* map Doorbell memory space */
7455 		w = 3;
7456 		if (ddi_regs_map_setup(dip, w,
7457 		    (caddr_t *)&qlge->doorbell_reg_iobase, 0,
7458 		    0x100000 /* sizeof (dev_doorbell_reg_t) */,
7459 		    &ql_dev_acc_attr,
7460 		    &qlge->dev_doorbell_reg_handle) != DDI_SUCCESS) {
7461 			cmn_err(CE_WARN, "%s(%d): Unable to map Doorbell "
7462 			    "registers",
7463 			    ADAPTER_NAME, instance);
7464 			break;
7465 		}
7466 		QL_PRINT(DBG_GLD, ("ql_attach: Doorbell I/O base = 0x%x\n",
7467 		    qlge->doorbell_reg_iobase));
7468 		qlge->sequence |= INIT_DOORBELL_REGS_SETUP;
7469 
7470 		/*
7471 		 * Allocate a macinfo structure for this instance
7472 		 */
7473 		if ((macp = mac_alloc(MAC_VERSION)) == NULL) {
7474 			cmn_err(CE_WARN, "%s(%d): mac_alloc failed",
7475 			    __func__, instance);
7476 			break;
7477 		}
7478 		/* save adapter status to dip private data */
7479 		ddi_set_driver_private(dip, qlge);
7480 		QL_PRINT(DBG_INIT, ("%s(%d): Allocate macinfo structure done\n",
7481 		    ADAPTER_NAME, instance));
7482 		qlge->sequence |= INIT_MAC_ALLOC;
7483 
7484 		/*
7485 		 * Attach this instance of the device
7486 		 */
7487 		/* Setup PCI Local Bus Configuration resource. */
7488 		if (pci_config_setup(dip, &qlge->pci_handle) != DDI_SUCCESS) {
7489 			cmn_err(CE_WARN, "%s(%d):Unable to get PCI resources",
7490 			    ADAPTER_NAME, instance);
7491 			if (qlge->fm_enable) {
7492 				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
7493 				ddi_fm_service_impact(qlge->dip,
7494 				    DDI_SERVICE_LOST);
7495 			}
7496 			break;
7497 		}
7498 		qlge->sequence |= INIT_PCI_CONFIG_SETUP;
7499 		QL_PRINT(DBG_GLD, ("ql_attach(%d): pci_config_setup done\n",
7500 		    instance));
7501 
7502 		if (ql_init_instance(qlge) != DDI_SUCCESS) {
7503 			cmn_err(CE_WARN, "%s(%d): Unable to initialize device "
7504 			    "instance", ADAPTER_NAME, instance);
7505 			if (qlge->fm_enable) {
7506 				ql_fm_ereport(qlge, DDI_FM_DEVICE_INVAL_STATE);
7507 				ddi_fm_service_impact(qlge->dip,
7508 				    DDI_SERVICE_LOST);
7509 			}
7510 			break;
7511 		}
7512 		QL_PRINT(DBG_GLD, ("ql_attach(%d): ql_init_instance done\n",
7513 		    instance));
7514 
7515 		/* Setup interrupt vectors */
7516 		if (ql_alloc_irqs(qlge) != DDI_SUCCESS) {
7517 			break;
7518 		}
7519 		qlge->sequence |= INIT_INTR_ALLOC;
7520 		QL_PRINT(DBG_GLD, ("ql_attach(%d): ql_alloc_irqs done\n",
7521 		    instance));
7522 
7523 		/* Configure queues */
7524 		if (ql_setup_rings(qlge) != DDI_SUCCESS) {
7525 			break;
7526 		}
7527 		qlge->sequence |= INIT_SETUP_RINGS;
7528 		QL_PRINT(DBG_GLD, ("ql_attach(%d): setup rings done\n",
7529 		    instance));
7530 
7531 		/*
7532 		 * Allocate memory resources
7533 		 */
7534 		if (ql_alloc_mem_resources(qlge) != DDI_SUCCESS) {
7535 			cmn_err(CE_WARN, "%s(%d): memory allocation failed",
7536 			    __func__, qlge->instance);
7537 			break;
7538 		}
7539 		qlge->sequence |= INIT_MEMORY_ALLOC;
7540 		QL_PRINT(DBG_GLD, ("ql_alloc_mem_resources(%d) done\n",
7541 		    instance));
7542 
7543 		/*
7544 		 * Map queues to interrupt vectors
7545 		 */
7546 		ql_resolve_queues_to_irqs(qlge);
7547 
7548 		/* Initialize mutex, need the interrupt priority */
7549 		(void) ql_init_rx_tx_locks(qlge);
7550 		qlge->sequence |= INIT_LOCKS_CREATED;
7551 		QL_PRINT(DBG_INIT, ("%s(%d): ql_init_rx_tx_locks done\n",
7552 		    ADAPTER_NAME, instance));
7553 
7554 		/*
7555 		 * Use a soft interrupt to do something that we do not want
7556 		 * to do in regular network functions or with mutexs being held
7557 		 */
7558 		if (ddi_intr_add_softint(qlge->dip, &qlge->mpi_event_intr_hdl,
7559 		    DDI_INTR_SOFTPRI_MIN, ql_mpi_event_work, (caddr_t)qlge)
7560 		    != DDI_SUCCESS) {
7561 			break;
7562 		}
7563 
7564 		if (ddi_intr_add_softint(qlge->dip, &qlge->asic_reset_intr_hdl,
7565 		    DDI_INTR_SOFTPRI_MIN, ql_asic_reset_work, (caddr_t)qlge)
7566 		    != DDI_SUCCESS) {
7567 			break;
7568 		}
7569 
7570 		if (ddi_intr_add_softint(qlge->dip, &qlge->mpi_reset_intr_hdl,
7571 		    DDI_INTR_SOFTPRI_MIN, ql_mpi_reset_work, (caddr_t)qlge)
7572 		    != DDI_SUCCESS) {
7573 			break;
7574 		}
7575 		qlge->sequence |= INIT_ADD_SOFT_INTERRUPT;
7576 		QL_PRINT(DBG_INIT, ("%s(%d): ddi_intr_add_softint done\n",
7577 		    ADAPTER_NAME, instance));
7578 
7579 		/*
7580 		 * mutex to protect the adapter state structure.
7581 		 * initialize mutexes according to the interrupt priority
7582 		 */
7583 		mutex_init(&qlge->gen_mutex, NULL, MUTEX_DRIVER,
7584 		    DDI_INTR_PRI(qlge->intr_pri));
7585 		mutex_init(&qlge->hw_mutex, NULL, MUTEX_DRIVER,
7586 		    DDI_INTR_PRI(qlge->intr_pri));
7587 		mutex_init(&qlge->mbx_mutex, NULL, MUTEX_DRIVER,
7588 		    DDI_INTR_PRI(qlge->intr_pri));
7589 
7590 		/* Mailbox wait and interrupt conditional variable. */
7591 		cv_init(&qlge->cv_mbx_intr, NULL, CV_DRIVER, NULL);
7592 		qlge->sequence |= INIT_MUTEX;
7593 		QL_PRINT(DBG_INIT, ("%s(%d): mutex_init done\n",
7594 		    ADAPTER_NAME, instance));
7595 
7596 		/*
7597 		 * KStats
7598 		 */
7599 		if (ql_init_kstats(qlge) != DDI_SUCCESS) {
7600 			cmn_err(CE_WARN, "%s(%d): KState initialization failed",
7601 			    ADAPTER_NAME, instance);
7602 			break;
7603 		}
7604 		qlge->sequence |= INIT_KSTATS;
7605 		QL_PRINT(DBG_INIT, ("%s(%d): ql_init_kstats done\n",
7606 		    ADAPTER_NAME, instance));
7607 
7608 		/*
7609 		 * Initialize gld macinfo structure
7610 		 */
7611 		ql_gld3_init(qlge, macp);
7612 		/*
7613 		 * Add interrupt handlers
7614 		 */
7615 		if (ql_add_intr_handlers(qlge) != DDI_SUCCESS) {
7616 			cmn_err(CE_WARN, "Failed to add interrupt "
7617 			    "handlers");
7618 			break;
7619 		}
7620 		qlge->sequence |= INIT_ADD_INTERRUPT;
7621 		QL_PRINT(DBG_INIT, ("%s(%d): Add interrupt handler done\n",
7622 		    ADAPTER_NAME, instance));
7623 
7624 		/*
7625 		 * MAC Register
7626 		 */
7627 		if (mac_register(macp, &qlge->mh) != DDI_SUCCESS) {
7628 			cmn_err(CE_WARN, "%s(%d): mac_register failed",
7629 			    __func__, instance);
7630 			break;
7631 		}
7632 		qlge->sequence |= INIT_MAC_REGISTERED;
7633 		QL_PRINT(DBG_GLD, ("%s(%d): mac_register done\n",
7634 		    ADAPTER_NAME, instance));
7635 
7636 		mac_free(macp);
7637 		macp = NULL;
7638 
7639 		qlge->mac_flags = QL_MAC_ATTACHED;
7640 
7641 		ddi_report_dev(dip);
7642 
7643 		rval = DDI_SUCCESS;
7644 
7645 	break;
7646 /*
7647  * DDI_RESUME
7648  * When called  with  cmd  set  to  DDI_RESUME,  attach()  must
7649  * restore  the hardware state of a device (power may have been
7650  * removed from the device), allow  pending  requests  to  con-
7651  * tinue,  and  service  new requests. In this case, the driver
7652  * must not  make  any  assumptions  about  the  state  of  the
7653  * hardware,  but  must  restore the state of the device except
7654  * for the power level of components.
7655  *
7656  */
7657 	case DDI_RESUME:
7658 
7659 		if ((qlge = (qlge_t *)QL_GET_DEV(dip)) == NULL)
7660 			return (DDI_FAILURE);
7661 
7662 		QL_PRINT(DBG_GLD, ("%s(%d)-DDI_RESUME\n",
7663 		    __func__, qlge->instance));
7664 
7665 		mutex_enter(&qlge->gen_mutex);
7666 		rval = ql_do_start(qlge);
7667 		mutex_exit(&qlge->gen_mutex);
7668 		break;
7669 
7670 	default:
7671 		break;
7672 	}
7673 
7674 	/* if failed to attach */
7675 	if ((cmd == DDI_ATTACH) && (rval != DDI_SUCCESS) && (qlge != NULL)) {
7676 		cmn_err(CE_WARN, "qlge driver attach failed, sequence %x",
7677 		    qlge->sequence);
7678 		ql_free_resources(qlge);
7679 	}
7680 
7681 	return (rval);
7682 }
7683 
7684 /*
7685  * Unbind all pending tx dma handles during driver bring down
7686  */
7687 static void
7688 ql_unbind_pending_tx_dma_handle(struct tx_ring *tx_ring)
7689 {
7690 	struct tx_ring_desc *tx_ring_desc;
7691 	int i, j;
7692 
7693 	if (tx_ring->wq_desc) {
7694 		tx_ring_desc = tx_ring->wq_desc;
7695 		for (i = 0; i < tx_ring->wq_len; i++, tx_ring_desc++) {
7696 			for (j = 0; j < tx_ring_desc->tx_dma_handle_used; j++) {
7697 				if (tx_ring_desc->tx_dma_handle[j]) {
7698 					(void) ddi_dma_unbind_handle(
7699 					    tx_ring_desc->tx_dma_handle[j]);
7700 				}
7701 			}
7702 			tx_ring_desc->tx_dma_handle_used = 0;
7703 		} /* end of for loop */
7704 	}
7705 }
7706 /*
7707  * Wait for all the packets sent to the chip to finish transmission
7708  * to prevent buffers to be unmapped before or during a transmit operation
7709  */
7710 static int
7711 ql_wait_tx_quiesce(qlge_t *qlge)
7712 {
7713 	int count = MAX_TX_WAIT_COUNT, i;
7714 	int rings_done;
7715 	volatile struct tx_ring *tx_ring;
7716 	uint32_t consumer_idx;
7717 	uint32_t producer_idx;
7718 	uint32_t temp;
7719 	int done = 0;
7720 	int rval = DDI_FAILURE;
7721 
7722 	while (!done) {
7723 		rings_done = 0;
7724 
7725 		for (i = 0; i < qlge->tx_ring_count; i++) {
7726 			tx_ring = &qlge->tx_ring[i];
7727 			temp = ql_read_doorbell_reg(qlge,
7728 			    tx_ring->prod_idx_db_reg);
7729 			producer_idx = temp & 0x0000ffff;
7730 			consumer_idx = (temp >> 16);
7731 
7732 			if (qlge->isr_stride) {
7733 				struct rx_ring *ob_ring;
7734 				ob_ring = &qlge->rx_ring[tx_ring->cq_id];
7735 				if (producer_idx != ob_ring->cnsmr_idx) {
7736 					cmn_err(CE_NOTE, " force clean \n");
7737 					(void) ql_clean_outbound_rx_ring(
7738 					    ob_ring);
7739 				}
7740 			}
7741 			/*
7742 			 * Get the pending iocb count, ones which have not been
7743 			 * pulled down by the chip
7744 			 */
7745 			if (producer_idx >= consumer_idx)
7746 				temp = (producer_idx - consumer_idx);
7747 			else
7748 				temp = (tx_ring->wq_len - consumer_idx) +
7749 				    producer_idx;
7750 
7751 			if ((tx_ring->tx_free_count + temp) >= tx_ring->wq_len)
7752 				rings_done++;
7753 			else {
7754 				done = 1;
7755 				break;
7756 			}
7757 		}
7758 
7759 		/* If all the rings are done */
7760 		if (rings_done >= qlge->tx_ring_count) {
7761 #ifdef QLGE_LOAD_UNLOAD
7762 			cmn_err(CE_NOTE, "%s(%d) done successfully \n",
7763 			    __func__, qlge->instance);
7764 #endif
7765 			rval = DDI_SUCCESS;
7766 			break;
7767 		}
7768 
7769 		qlge_delay(100);
7770 
7771 		count--;
7772 		if (!count) {
7773 
7774 			count = MAX_TX_WAIT_COUNT;
7775 #ifdef QLGE_LOAD_UNLOAD
7776 			volatile struct rx_ring *rx_ring;
7777 			cmn_err(CE_NOTE, "%s(%d): Waiting for %d pending"
7778 			    " Transmits on queue %d to complete .\n",
7779 			    __func__, qlge->instance,
7780 			    (qlge->tx_ring[i].wq_len -
7781 			    qlge->tx_ring[i].tx_free_count),
7782 			    i);
7783 
7784 			rx_ring = &qlge->rx_ring[i+1];
7785 			temp = ql_read_doorbell_reg(qlge,
7786 			    rx_ring->cnsmr_idx_db_reg);
7787 			consumer_idx = temp & 0x0000ffff;
7788 			producer_idx = (temp >> 16);
7789 			cmn_err(CE_NOTE, "%s(%d): Transmit completion queue %d,"
7790 			    " Producer %d, Consumer %d\n",
7791 			    __func__, qlge->instance,
7792 			    i+1,
7793 			    producer_idx, consumer_idx);
7794 
7795 			temp = ql_read_doorbell_reg(qlge,
7796 			    tx_ring->prod_idx_db_reg);
7797 			producer_idx = temp & 0x0000ffff;
7798 			consumer_idx = (temp >> 16);
7799 			cmn_err(CE_NOTE, "%s(%d): Transmit request queue %d,"
7800 			    " Producer %d, Consumer %d\n",
7801 			    __func__, qlge->instance, i,
7802 			    producer_idx, consumer_idx);
7803 #endif
7804 
7805 			/* For now move on */
7806 			break;
7807 		}
7808 	}
7809 	/* Stop the request queue */
7810 	mutex_enter(&qlge->hw_mutex);
7811 	for (i = 0; i < qlge->tx_ring_count; i++) {
7812 		if (qlge->tx_ring[i].valid_db_reg) {
7813 			ql_write_doorbell_reg(qlge,
7814 			    qlge->tx_ring[i].valid_db_reg, 0);
7815 		}
7816 	}
7817 	mutex_exit(&qlge->hw_mutex);
7818 	return (rval);
7819 }
7820 
7821 /*
7822  * Wait for all the receives indicated to the stack to come back
7823  */
7824 static int
7825 ql_wait_rx_complete(qlge_t *qlge)
7826 {
7827 	int i;
7828 	/* Disable all the completion queues */
7829 	mutex_enter(&qlge->hw_mutex);
7830 	for (i = 0; i < qlge->rx_ring_count; i++) {
7831 		if (qlge->rx_ring[i].valid_db_reg) {
7832 			ql_write_doorbell_reg(qlge,
7833 			    qlge->rx_ring[i].valid_db_reg, 0);
7834 		}
7835 	}
7836 	mutex_exit(&qlge->hw_mutex);
7837 
7838 	/* Wait for OS to return all rx buffers */
7839 	qlge_delay(QL_ONE_SEC_DELAY);
7840 	return (DDI_SUCCESS);
7841 }
7842 
7843 /*
7844  * stop the driver
7845  */
7846 static int
7847 ql_bringdown_adapter(qlge_t *qlge)
7848 {
7849 	int i;
7850 	int status = DDI_SUCCESS;
7851 
7852 	qlge->mac_flags = QL_MAC_BRINGDOWN;
7853 	if (qlge->sequence & ADAPTER_INIT) {
7854 		/* stop forwarding external packets to driver */
7855 		status = ql_sem_spinlock(qlge, SEM_RT_IDX_MASK);
7856 		if (status)
7857 			return (status);
7858 		(void) ql_stop_routing(qlge);
7859 		ql_sem_unlock(qlge, SEM_RT_IDX_MASK);
7860 		/*
7861 		 * Set the flag for receive and transmit
7862 		 * operations to cease
7863 		 */
7864 		for (i = 0; i < qlge->tx_ring_count; i++) {
7865 			mutex_enter(&qlge->tx_ring[i].tx_lock);
7866 			qlge->tx_ring[i].mac_flags = QL_MAC_STOPPED;
7867 			mutex_exit(&qlge->tx_ring[i].tx_lock);
7868 		}
7869 
7870 		for (i = 0; i < qlge->rx_ring_count; i++) {
7871 			mutex_enter(&qlge->rx_ring[i].rx_lock);
7872 			qlge->rx_ring[i].mac_flags = QL_MAC_STOPPED;
7873 			mutex_exit(&qlge->rx_ring[i].rx_lock);
7874 		}
7875 
7876 		/*
7877 		 * Need interrupts to be running while the transmit
7878 		 * completions are cleared. Wait for the packets
7879 		 * queued to the chip to be sent out
7880 		 */
7881 		(void) ql_wait_tx_quiesce(qlge);
7882 		/* Interrupts not needed from now */
7883 		ql_disable_all_completion_interrupts(qlge);
7884 
7885 		mutex_enter(&qlge->hw_mutex);
7886 		/* Disable Global interrupt */
7887 		ql_disable_global_interrupt(qlge);
7888 		mutex_exit(&qlge->hw_mutex);
7889 
7890 		/* Wait for all the indicated packets to come back */
7891 		status = ql_wait_rx_complete(qlge);
7892 
7893 		mutex_enter(&qlge->hw_mutex);
7894 		/* Reset adapter */
7895 		(void) ql_asic_reset(qlge);
7896 		/*
7897 		 * Unbind all tx dma handles to prevent pending tx descriptors'
7898 		 * dma handles from being re-used.
7899 		 */
7900 		for (i = 0; i < qlge->tx_ring_count; i++) {
7901 			ql_unbind_pending_tx_dma_handle(&qlge->tx_ring[i]);
7902 		}
7903 
7904 		qlge->sequence &= ~ADAPTER_INIT;
7905 
7906 		mutex_exit(&qlge->hw_mutex);
7907 	}
7908 	return (status);
7909 }
7910 
7911 /*
7912  * ql_detach
7913  * Used to remove all the states associated with a given
7914  * instances of a device node prior to the removal of that
7915  * instance from the system.
7916  */
7917 static int
7918 ql_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
7919 {
7920 	qlge_t *qlge;
7921 	int rval;
7922 
7923 	rval = DDI_SUCCESS;
7924 
7925 	switch (cmd) {
7926 	case DDI_DETACH:
7927 
7928 		if ((qlge = QL_GET_DEV(dip)) == NULL)
7929 			return (DDI_FAILURE);
7930 		rval = ql_bringdown_adapter(qlge);
7931 		if (rval != DDI_SUCCESS)
7932 			break;
7933 
7934 		qlge->mac_flags = QL_MAC_DETACH;
7935 
7936 		/* free memory resources */
7937 		if (qlge->sequence & INIT_MEMORY_ALLOC) {
7938 			ql_free_mem_resources(qlge);
7939 			qlge->sequence &= ~INIT_MEMORY_ALLOC;
7940 		}
7941 		ql_free_resources(qlge);
7942 
7943 		break;
7944 
7945 	case DDI_SUSPEND:
7946 		if ((qlge = QL_GET_DEV(dip)) == NULL)
7947 			return (DDI_FAILURE);
7948 
7949 		mutex_enter(&qlge->gen_mutex);
7950 		if ((qlge->mac_flags == QL_MAC_ATTACHED) ||
7951 		    (qlge->mac_flags == QL_MAC_STARTED)) {
7952 			(void) ql_do_stop(qlge);
7953 		}
7954 		qlge->mac_flags = QL_MAC_SUSPENDED;
7955 		mutex_exit(&qlge->gen_mutex);
7956 
7957 		break;
7958 	default:
7959 		rval = DDI_FAILURE;
7960 		break;
7961 	}
7962 
7963 	return (rval);
7964 }
7965 
7966 /*
7967  * quiesce(9E) entry point.
7968  *
7969  * This function is called when the system is single-threaded at high
7970  * PIL with preemption disabled. Therefore, this function must not be
7971  * blocked.
7972  *
7973  * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure.
7974  */
7975 int
7976 ql_quiesce(dev_info_t *dip)
7977 {
7978 	qlge_t *qlge;
7979 	int i;
7980 
7981 	if ((qlge = QL_GET_DEV(dip)) == NULL)
7982 		return (DDI_FAILURE);
7983 
7984 	if (CFG_IST(qlge, CFG_CHIP_8100)) {
7985 		/* stop forwarding external packets to driver */
7986 		(void) ql_sem_spinlock(qlge, SEM_RT_IDX_MASK);
7987 		(void) ql_stop_routing(qlge);
7988 		ql_sem_unlock(qlge, SEM_RT_IDX_MASK);
7989 		/* Stop all the request queues */
7990 		for (i = 0; i < qlge->tx_ring_count; i++) {
7991 			if (qlge->tx_ring[i].valid_db_reg) {
7992 				ql_write_doorbell_reg(qlge,
7993 				    qlge->tx_ring[i].valid_db_reg, 0);
7994 			}
7995 		}
7996 		qlge_delay(QL_ONE_SEC_DELAY/4);
7997 		/* Interrupts not needed from now */
7998 		/* Disable MPI interrupt */
7999 		ql_write_reg(qlge, REG_INTERRUPT_MASK,
8000 		    (INTR_MASK_PI << 16));
8001 		ql_disable_global_interrupt(qlge);
8002 
8003 		/* Disable all the rx completion queues */
8004 		for (i = 0; i < qlge->rx_ring_count; i++) {
8005 			if (qlge->rx_ring[i].valid_db_reg) {
8006 				ql_write_doorbell_reg(qlge,
8007 				    qlge->rx_ring[i].valid_db_reg, 0);
8008 			}
8009 		}
8010 		qlge_delay(QL_ONE_SEC_DELAY/4);
8011 		qlge->mac_flags = QL_MAC_STOPPED;
8012 		/* Reset adapter */
8013 		(void) ql_asic_reset(qlge);
8014 		qlge_delay(100);
8015 	}
8016 
8017 	return (DDI_SUCCESS);
8018 }
8019 
8020 QL_STREAM_OPS(ql_ops, ql_attach, ql_detach);
8021 
8022 /*
8023  * Loadable Driver Interface Structures.
8024  * Declare and initialize the module configuration section...
8025  */
8026 static struct modldrv modldrv = {
8027 	&mod_driverops,		/* type of module: driver */
8028 	version,		/* name of module */
8029 	&ql_ops			/* driver dev_ops */
8030 };
8031 
8032 static struct modlinkage modlinkage = {
8033 	MODREV_1, 	&modldrv,	NULL
8034 };
8035 
8036 /*
8037  * Loadable Module Routines
8038  */
8039 
8040 /*
8041  * _init
8042  * Initializes a loadable module. It is called before any other
8043  * routine in a loadable module.
8044  */
8045 int
8046 _init(void)
8047 {
8048 	int rval;
8049 
8050 	mac_init_ops(&ql_ops, ADAPTER_NAME);
8051 	rval = mod_install(&modlinkage);
8052 	if (rval != DDI_SUCCESS) {
8053 		mac_fini_ops(&ql_ops);
8054 		cmn_err(CE_WARN, "?Unable to install/attach driver '%s'",
8055 		    ADAPTER_NAME);
8056 	}
8057 
8058 	return (rval);
8059 }
8060 
8061 /*
8062  * _fini
8063  * Prepares a module for unloading. It is called when the system
8064  * wants to unload a module. If the module determines that it can
8065  * be unloaded, then _fini() returns the value returned by
8066  * mod_remove(). Upon successful return from _fini() no other
8067  * routine in the module will be called before _init() is called.
8068  */
8069 int
8070 _fini(void)
8071 {
8072 	int rval;
8073 
8074 	rval = mod_remove(&modlinkage);
8075 	if (rval == DDI_SUCCESS) {
8076 		mac_fini_ops(&ql_ops);
8077 	}
8078 
8079 	return (rval);
8080 }
8081 
8082 /*
8083  * _info
8084  * Returns information about loadable module.
8085  */
8086 int
8087 _info(struct modinfo *modinfop)
8088 {
8089 	return (mod_info(&modlinkage, modinfop));
8090 }
8091