xref: /illumos-gate/usr/src/uts/common/io/1394/adapters/hci1394_q.c (revision 1e56f352c1c208679012bca47d552e127f5b1072)
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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * hci1394_q.c
29  *    This code decouples some of the OpenHCI async descriptor logic/structures
30  *    from the async processing.  The goal was to combine as much of the
31  *    duplicate code as possible for the different type of async transfers
32  *    without going too overboard.
33  *
34  *    There are two parts to the Q, the descriptor buffer and the data buffer.
35  *    For the most part, data to be transmitted and data which is received go
36  *    in the data buffers.  The information of where to get the data and put
37  *    the data reside in the descriptor buffers. There are exceptions to this.
38  */
39 
40 
41 #include <sys/types.h>
42 #include <sys/conf.h>
43 #include <sys/ddi.h>
44 #include <sys/modctl.h>
45 #include <sys/stat.h>
46 #include <sys/sunddi.h>
47 #include <sys/cmn_err.h>
48 #include <sys/kmem.h>
49 #include <sys/note.h>
50 
51 #include <sys/1394/adapters/hci1394.h>
52 
53 
54 static int hci1394_q_reserve(hci1394_q_buf_t *qbuf, uint_t size,
55     uint32_t *io_addr);
56 static void hci1394_q_unreserve(hci1394_q_buf_t *qbuf);
57 static void hci1394_q_buf_setup(hci1394_q_buf_t *qbuf);
58 static void hci1394_q_reset(hci1394_q_handle_t q_handle);
59 static void hci1394_q_next_buf(hci1394_q_buf_t *qbuf);
60 
61 static void hci1394_q_at_write_OLI(hci1394_q_handle_t q_handle,
62     hci1394_q_buf_t *qbuf, hci1394_q_cmd_t *cmd, hci1394_basic_pkt_t *hdr,
63     uint_t hdrsize);
64 static void hci1394_q_at_write_OMI(hci1394_q_handle_t q_handle,
65     hci1394_q_buf_t *qbuf, hci1394_q_cmd_t *cmd, hci1394_basic_pkt_t *hdr,
66     uint_t hdrsize);
67 static void hci1394_q_at_write_OL(hci1394_q_handle_t q_handle,
68     hci1394_q_buf_t *qbuf, hci1394_q_cmd_t *cmd, uint32_t io_addr,
69     uint_t datasize);
70 static void hci1394_q_at_rep_put8(hci1394_q_buf_t *qbuf, hci1394_q_cmd_t *cmd,
71     uint8_t *data, uint_t datasize);
72 static void hci1394_q_at_copy_from_mblk(hci1394_q_buf_t *qbuf,
73     hci1394_q_cmd_t *cmd, h1394_mblk_t *mblk);
74 
75 static void hci1394_q_ar_write_IM(hci1394_q_handle_t q_handle,
76     hci1394_q_buf_t *qbuf, uint32_t io_addr, uint_t datasize);
77 
78 _NOTE(SCHEME_PROTECTS_DATA("unique", msgb))
79 
80 /*
81  * hci1394_q_init()
82  *    Initialize a Q.  A Q consists of a descriptor buffer and a data buffer and
83  *    can be either an AT or AR Q. hci1394_q_init() returns a handle which
84  *    should be used for the reset of the hci1394_q_* calls.
85  */
86 int
87 hci1394_q_init(hci1394_drvinfo_t *drvinfo,
88     hci1394_ohci_handle_t ohci_handle, hci1394_q_info_t *qinfo,
89     hci1394_q_handle_t *q_handle)
90 {
91 	hci1394_q_buf_t *desc;
92 	hci1394_q_buf_t *data;
93 	hci1394_buf_parms_t parms;
94 	hci1394_q_t *q;
95 	int status;
96 	int index;
97 
98 
99 	ASSERT(drvinfo != NULL);
100 	ASSERT(qinfo != NULL);
101 	ASSERT(q_handle != NULL);
102 
103 	/*
104 	 * allocate the memory to track this Q.  Initialize the internal Q
105 	 * structure.
106 	 */
107 	q = kmem_alloc(sizeof (hci1394_q_t), KM_SLEEP);
108 	q->q_drvinfo = drvinfo;
109 	q->q_info = *qinfo;
110 	q->q_ohci = ohci_handle;
111 	mutex_init(&q->q_mutex, NULL, MUTEX_DRIVER, drvinfo->di_iblock_cookie);
112 	desc = &q->q_desc;
113 	data = &q->q_data;
114 
115 	/*
116 	 * Allocate the Descriptor buffer.
117 	 *
118 	 * XXX - Only want 1 cookie for now. Change this to OHCI_MAX_COOKIE
119 	 * after we have tested the multiple cookie code on x86.
120 	 */
121 	parms.bp_length = qinfo->qi_desc_size;
122 	parms.bp_max_cookies = 1;
123 	parms.bp_alignment = 16;
124 	status = hci1394_buf_alloc(drvinfo, &parms, &desc->qb_buf,
125 	    &desc->qb_buf_handle);
126 	if (status != DDI_SUCCESS) {
127 		mutex_destroy(&q->q_mutex);
128 		kmem_free(q, sizeof (hci1394_q_t));
129 		*q_handle = NULL;
130 		return (DDI_FAILURE);
131 	}
132 
133 	/* Copy in buffer cookies into our local cookie array */
134 	desc->qb_cookie[0] = desc->qb_buf.bi_cookie;
135 	for (index = 1; index < desc->qb_buf.bi_cookie_count; index++) {
136 		ddi_dma_nextcookie(desc->qb_buf.bi_dma_handle,
137 		    &desc->qb_buf.bi_cookie);
138 		desc->qb_cookie[index] = desc->qb_buf.bi_cookie;
139 	}
140 
141 	/*
142 	 * Allocate the Data buffer.
143 	 *
144 	 * XXX - Only want 1 cookie for now. Change this to OHCI_MAX_COOKIE
145 	 * after we have tested the multiple cookie code on x86.
146 	 */
147 	parms.bp_length = qinfo->qi_data_size;
148 	parms.bp_max_cookies = 1;
149 	parms.bp_alignment = 16;
150 	status = hci1394_buf_alloc(drvinfo, &parms, &data->qb_buf,
151 	    &data->qb_buf_handle);
152 	if (status != DDI_SUCCESS) {
153 		/* Free the allocated Descriptor buffer */
154 		hci1394_buf_free(&desc->qb_buf_handle);
155 
156 		mutex_destroy(&q->q_mutex);
157 		kmem_free(q, sizeof (hci1394_q_t));
158 		*q_handle = NULL;
159 		return (DDI_FAILURE);
160 	}
161 
162 	/*
163 	 * We must have at least 2 ARQ data buffers, If we only have one, we
164 	 * will artificially create 2. We must have 2 so that we always have a
165 	 * descriptor with free data space to write AR data to. When one is
166 	 * empty, it will take us a bit to get a new descriptor back into the
167 	 * chain.
168 	 */
169 	if ((qinfo->qi_mode == HCI1394_ARQ) &&
170 	    (data->qb_buf.bi_cookie_count == 1)) {
171 		data->qb_buf.bi_cookie_count = 2;
172 		data->qb_cookie[0] = data->qb_buf.bi_cookie;
173 		data->qb_cookie[0].dmac_size /= 2;
174 		data->qb_cookie[1] = data->qb_cookie[0];
175 		data->qb_cookie[1].dmac_laddress =
176 		    data->qb_cookie[0].dmac_laddress +
177 		    data->qb_cookie[0].dmac_size;
178 		data->qb_cookie[1].dmac_address =
179 		    data->qb_cookie[0].dmac_address +
180 		    data->qb_cookie[0].dmac_size;
181 
182 	/* We have more than 1 cookie or we are an AT Q */
183 	} else {
184 		/* Copy in buffer cookies into our local cookie array */
185 		data->qb_cookie[0] = data->qb_buf.bi_cookie;
186 		for (index = 1; index < data->qb_buf.bi_cookie_count; index++) {
187 			ddi_dma_nextcookie(data->qb_buf.bi_dma_handle,
188 			    &data->qb_buf.bi_cookie);
189 			data->qb_cookie[index] = data->qb_buf.bi_cookie;
190 		}
191 	}
192 
193 	/* The top and bottom of the Q are only set once */
194 	desc->qb_ptrs.qp_top = desc->qb_buf.bi_kaddr;
195 	desc->qb_ptrs.qp_bottom = desc->qb_buf.bi_kaddr +
196 	    desc->qb_buf.bi_real_length - 1;
197 	data->qb_ptrs.qp_top = data->qb_buf.bi_kaddr;
198 	data->qb_ptrs.qp_bottom = data->qb_buf.bi_kaddr +
199 	    data->qb_buf.bi_real_length - 1;
200 
201 	/*
202 	 * reset the Q pointers to their original settings.  Setup IM
203 	 * descriptors if this is an AR Q.
204 	 */
205 	hci1394_q_reset(q);
206 
207 	/* if this is an AT Q, create a queued list for the AT descriptors */
208 	if (qinfo->qi_mode == HCI1394_ATQ) {
209 		hci1394_tlist_init(drvinfo, NULL, &q->q_queued_list);
210 	}
211 
212 	*q_handle = q;
213 
214 	return (DDI_SUCCESS);
215 }
216 
217 
218 /*
219  * hci1394_q_fini()
220  *    Cleanup after a successful hci1394_q_init(). Notice that a pointer to the
221  *    handle is used for the parameter.  fini() will set your handle to NULL
222  *    before returning.
223  */
224 void
225 hci1394_q_fini(hci1394_q_handle_t *q_handle)
226 {
227 	hci1394_q_t *q;
228 
229 	ASSERT(q_handle != NULL);
230 
231 	q = *q_handle;
232 	if (q->q_info.qi_mode == HCI1394_ATQ) {
233 		hci1394_tlist_fini(&q->q_queued_list);
234 	}
235 	mutex_destroy(&q->q_mutex);
236 	hci1394_buf_free(&q->q_desc.qb_buf_handle);
237 	hci1394_buf_free(&q->q_data.qb_buf_handle);
238 	kmem_free(q, sizeof (hci1394_q_t));
239 	*q_handle = NULL;
240 }
241 
242 
243 /*
244  * hci1394_q_buf_setup()
245  *    Initialization of buffer pointers which are present in both the descriptor
246  *    buffer and data buffer (No reason to duplicate the code)
247  */
248 static void
249 hci1394_q_buf_setup(hci1394_q_buf_t *qbuf)
250 {
251 	ASSERT(qbuf != NULL);
252 
253 	/* start with the first cookie */
254 	qbuf->qb_ptrs.qp_current_buf = 0;
255 	qbuf->qb_ptrs.qp_begin = qbuf->qb_ptrs.qp_top;
256 	qbuf->qb_ptrs.qp_end = qbuf->qb_ptrs.qp_begin +
257 	    qbuf->qb_cookie[qbuf->qb_ptrs.qp_current_buf].dmac_size - 1;
258 	qbuf->qb_ptrs.qp_current = qbuf->qb_ptrs.qp_begin;
259 	qbuf->qb_ptrs.qp_offset = 0;
260 
261 	/*
262 	 * The free_buf and free pointer will change everytime an ACK (of some
263 	 * type) is processed.  Free is the last byte in the last cookie.
264 	 */
265 	qbuf->qb_ptrs.qp_free_buf = qbuf->qb_buf.bi_cookie_count - 1;
266 	qbuf->qb_ptrs.qp_free = qbuf->qb_ptrs.qp_bottom;
267 
268 	/*
269 	 * Start with no space to write descriptors.  We first need to call
270 	 * hci1394_q_reserve() before calling hci1394_q_at_write_O*().
271 	 */
272 	qbuf->qb_ptrs.qp_resv_size = 0;
273 }
274 
275 
276 /*
277  * hci1394_q_reset()
278  *    Resets the buffers to an initial state.  This should be called during
279  *    attach and resume.
280  */
281 static void
282 hci1394_q_reset(hci1394_q_handle_t q_handle)
283 {
284 	hci1394_q_buf_t *desc;
285 	hci1394_q_buf_t *data;
286 	int index;
287 
288 	ASSERT(q_handle != NULL);
289 
290 	mutex_enter(&q_handle->q_mutex);
291 	desc = &q_handle->q_desc;
292 	data = &q_handle->q_data;
293 
294 	hci1394_q_buf_setup(desc);
295 	hci1394_q_buf_setup(data);
296 
297 	/* DMA starts off stopped, no previous descriptor to link from */
298 	q_handle->q_dma_running = B_FALSE;
299 	q_handle->q_block_cnt = 0;
300 	q_handle->q_previous = NULL;
301 
302 	/* If this is an AR Q, setup IM's for the data buffers that we have */
303 	if (q_handle->q_info.qi_mode == HCI1394_ARQ) {
304 		/*
305 		 * This points to where to find the first IM descriptor.  Since
306 		 * we just reset the pointers in hci1394_q_buf_setup(), the
307 		 * first IM we write below will be found at the top of the Q.
308 		 */
309 		q_handle->q_head = desc->qb_ptrs.qp_top;
310 
311 		for (index = 0; index < data->qb_buf.bi_cookie_count; index++) {
312 			hci1394_q_ar_write_IM(q_handle, desc,
313 			    data->qb_cookie[index].dmac_address,
314 			    data->qb_cookie[index].dmac_size);
315 		}
316 
317 		/*
318 		 * The space left in the current IM is the size of the buffer.
319 		 * The current buffer is the first buffer added to the AR Q.
320 		 */
321 		q_handle->q_space_left = data->qb_cookie[0].dmac_size;
322 	}
323 
324 	mutex_exit(&q_handle->q_mutex);
325 }
326 
327 
328 /*
329  * hci1394_q_resume()
330  *    This is called during a resume (after a successful suspend). Currently
331  *    we only call reset.  Since this is not a time critical function, we will
332  *    leave this as a separate function to increase readability.
333  */
334 void
335 hci1394_q_resume(hci1394_q_handle_t q_handle)
336 {
337 	ASSERT(q_handle != NULL);
338 	hci1394_q_reset(q_handle);
339 }
340 
341 
342 /*
343  * hci1394_q_stop()
344  *    This call informs us that a DMA engine has been stopped.  It does not
345  *    perform the actual stop. We need to know this so that when we add a
346  *    new descriptor, we do a start instead of a wake.
347  */
348 void
349 hci1394_q_stop(hci1394_q_handle_t q_handle)
350 {
351 	ASSERT(q_handle != NULL);
352 	mutex_enter(&q_handle->q_mutex);
353 	q_handle->q_dma_running = B_FALSE;
354 	mutex_exit(&q_handle->q_mutex);
355 }
356 
357 
358 /*
359  * hci1394_q_reserve()
360  *    Reserve space in the AT descriptor or data buffer. This ensures that we
361  *    can get a contiguous buffer. Descriptors have to be in a contiguous
362  *    buffer. Data does not have to be in a contiguous buffer but we do this to
363  *    reduce complexity. For systems with small page sizes (e.g. x86), this
364  *    could result in inefficient use of the data buffers when sending large
365  *    data blocks (this only applies to non-physical block write ATREQs and
366  *    block read ATRESP). Since it looks like most protocols that use large data
367  *    blocks (like SPB-2), use physical transfers to do this (due to their
368  *    efficiency), this will probably not be a real world problem.  If it turns
369  *    out to be a problem, the options are to force a single cookie for the data
370  *    buffer, allow multiple cookies and have a larger data space, or change the
371  *    data code to use a OMI, OM, OL descriptor sequence (instead of OMI, OL).
372  */
373 static int
374 hci1394_q_reserve(hci1394_q_buf_t *qbuf, uint_t size, uint32_t *io_addr)
375 {
376 	uint_t aligned_size;
377 
378 
379 	ASSERT(qbuf != NULL);
380 
381 	/* Save backup of pointers in case we have to unreserve */
382 	qbuf->qb_backup_ptrs = qbuf->qb_ptrs;
383 
384 	/*
385 	 * Make sure all alloc's are quadlet aligned. The data doesn't have to
386 	 * be, so we will force it to be.
387 	 */
388 	aligned_size = HCI1394_ALIGN_QUAD(size);
389 
390 	/*
391 	 * if the free pointer is in the current buffer and the free pointer
392 	 * is below the current pointer (i.e. has not wrapped around)
393 	 */
394 	if ((qbuf->qb_ptrs.qp_current_buf == qbuf->qb_ptrs.qp_free_buf) &&
395 	    (qbuf->qb_ptrs.qp_free >= qbuf->qb_ptrs.qp_current)) {
396 		/*
397 		 * The free pointer is in this buffer below the current pointer.
398 		 * Check to see if we have enough free space left.
399 		 */
400 		if ((qbuf->qb_ptrs.qp_current + aligned_size) <=
401 		    qbuf->qb_ptrs.qp_free) {
402 			/* Setup up our reserved size, return the IO address */
403 			qbuf->qb_ptrs.qp_resv_size = aligned_size;
404 			*io_addr = (uint32_t)(qbuf->qb_cookie[
405 			    qbuf->qb_ptrs.qp_current_buf].dmac_address +
406 			    qbuf->qb_ptrs.qp_offset);
407 
408 		/*
409 		 * The free pointer is in this buffer below the current pointer.
410 		 * We do not have enough free space for the alloc. Return
411 		 * failure.
412 		 */
413 		} else {
414 			qbuf->qb_ptrs.qp_resv_size = 0;
415 			return (DDI_FAILURE);
416 		}
417 
418 	/*
419 	 * If there is not enough room to fit in the current buffer (not
420 	 * including wrap around), we will go to the next buffer and check
421 	 * there. If we only have one buffer (i.e. one cookie), we will end up
422 	 * staying at the current buffer and wrapping the address back to the
423 	 * top.
424 	 */
425 	} else if ((qbuf->qb_ptrs.qp_current + aligned_size) >
426 	    qbuf->qb_ptrs.qp_end) {
427 		/* Go to the next buffer (or the top of ours for one cookie) */
428 		hci1394_q_next_buf(qbuf);
429 
430 		/* If the free pointer is in the new current buffer */
431 		if (qbuf->qb_ptrs.qp_current_buf == qbuf->qb_ptrs.qp_free_buf) {
432 			/*
433 			 * The free pointer is in this buffer. If we do not have
434 			 * enough free space for the alloc. Return failure.
435 			 */
436 			if ((qbuf->qb_ptrs.qp_current + aligned_size) >
437 			    qbuf->qb_ptrs.qp_free) {
438 				qbuf->qb_ptrs.qp_resv_size = 0;
439 				return (DDI_FAILURE);
440 			/*
441 			 * The free pointer is in this buffer. We have enough
442 			 * free space left.
443 			 */
444 			} else {
445 				/*
446 				 * Setup up our reserved size, return the IO
447 				 * address
448 				 */
449 				qbuf->qb_ptrs.qp_resv_size = aligned_size;
450 				*io_addr = (uint32_t)(qbuf->qb_cookie[
451 				    qbuf->qb_ptrs.qp_current_buf].dmac_address +
452 				    qbuf->qb_ptrs.qp_offset);
453 			}
454 
455 		/*
456 		 * We switched buffers and the free pointer is still in another
457 		 * buffer. We have sufficient space in this buffer for the alloc
458 		 * after changing buffers.
459 		 */
460 		} else {
461 			/* Setup up our reserved size, return the IO address */
462 			qbuf->qb_ptrs.qp_resv_size = aligned_size;
463 			*io_addr = (uint32_t)(qbuf->qb_cookie[
464 			    qbuf->qb_ptrs.qp_current_buf].dmac_address +
465 			    qbuf->qb_ptrs.qp_offset);
466 		}
467 	/*
468 	 * The free pointer is in another buffer. We have sufficient space in
469 	 * this buffer for the alloc.
470 	 */
471 	} else {
472 		/* Setup up our reserved size, return the IO address */
473 		qbuf->qb_ptrs.qp_resv_size = aligned_size;
474 		*io_addr = (uint32_t)(qbuf->qb_cookie[
475 		    qbuf->qb_ptrs.qp_current_buf].dmac_address +
476 		    qbuf->qb_ptrs.qp_offset);
477 	}
478 
479 	return (DDI_SUCCESS);
480 }
481 
482 /*
483  * hci1394_q_unreserve()
484  *    Set the buffer pointer to what they were before hci1394_reserve().  This
485  *    will be called when we encounter errors during hci1394_q_at*().
486  */
487 static void
488 hci1394_q_unreserve(hci1394_q_buf_t *qbuf)
489 {
490 	ASSERT(qbuf != NULL);
491 
492 	/* Go back to pointer setting before the reserve */
493 	qbuf->qb_ptrs = qbuf->qb_backup_ptrs;
494 }
495 
496 
497 /*
498  * hci1394_q_next_buf()
499  *    Set our current buffer to the next cookie.  If we only have one cookie, we
500  *    will go back to the top of our buffer.
501  */
502 void
503 hci1394_q_next_buf(hci1394_q_buf_t *qbuf)
504 {
505 	ASSERT(qbuf != NULL);
506 
507 	/*
508 	 * go to the next cookie, if we are >= the cookie count, go back to the
509 	 * first cookie.
510 	 */
511 	qbuf->qb_ptrs.qp_current_buf++;
512 	if (qbuf->qb_ptrs.qp_current_buf >= qbuf->qb_buf.bi_cookie_count) {
513 		qbuf->qb_ptrs.qp_current_buf = 0;
514 	}
515 
516 	/* adjust the begin, end, current, and offset pointers */
517 	qbuf->qb_ptrs.qp_begin = qbuf->qb_ptrs.qp_end + 1;
518 	if (qbuf->qb_ptrs.qp_begin > qbuf->qb_ptrs.qp_bottom) {
519 		qbuf->qb_ptrs.qp_begin = qbuf->qb_ptrs.qp_top;
520 	}
521 	qbuf->qb_ptrs.qp_end = qbuf->qb_ptrs.qp_begin +
522 	    qbuf->qb_cookie[qbuf->qb_ptrs.qp_current_buf].dmac_size - 1;
523 	qbuf->qb_ptrs.qp_current = qbuf->qb_ptrs.qp_begin;
524 	qbuf->qb_ptrs.qp_offset = 0;
525 }
526 
527 
528 /*
529  * hci1394_q_at()
530  *    Place an AT command that does NOT need the data buffer into the DMA chain.
531  *    Some examples of this are quadlet read/write, PHY packets, ATREQ Block
532  *    Read, and ATRESP block write. result is only valid on failure.
533  */
534 int
535 hci1394_q_at(hci1394_q_handle_t q_handle, hci1394_q_cmd_t *cmd,
536     hci1394_basic_pkt_t *hdr, uint_t hdrsize, int *result)
537 {
538 	int status;
539 	uint32_t ioaddr;
540 
541 
542 	ASSERT(q_handle != NULL);
543 	ASSERT(cmd != NULL);
544 	ASSERT(hdr != NULL);
545 
546 	mutex_enter(&q_handle->q_mutex);
547 
548 	/*
549 	 * Check the HAL state and generation when the AT Q is locked.  This
550 	 * will make sure that we get all the commands when we flush the Q's
551 	 * during a reset or shutdown.
552 	 */
553 	if ((hci1394_state(q_handle->q_drvinfo) != HCI1394_NORMAL) ||
554 	    (hci1394_ohci_current_busgen(q_handle->q_ohci) !=
555 	    cmd->qc_generation)) {
556 		*result = H1394_STATUS_INVALID_BUSGEN;
557 		mutex_exit(&q_handle->q_mutex);
558 		return (DDI_FAILURE);
559 	}
560 
561 	/* save away the argument to pass up when this command completes */
562 	cmd->qc_node.tln_addr = cmd;
563 
564 	/* we have not written any 16 byte blocks to the descriptor yet */
565 	q_handle->q_block_cnt = 0;
566 
567 	/* Reserve space for an OLI in the descriptor buffer */
568 	status = hci1394_q_reserve(&q_handle->q_desc,
569 	    sizeof (hci1394_desc_imm_t), &ioaddr);
570 	if (status != DDI_SUCCESS) {
571 		*result = H1394_STATUS_NOMORE_SPACE;
572 		mutex_exit(&q_handle->q_mutex);
573 		return (DDI_FAILURE);
574 	}
575 
576 	/* write the OLI to the descriptor buffer */
577 	hci1394_q_at_write_OLI(q_handle, &q_handle->q_desc, cmd, hdr, hdrsize);
578 
579 	/* Add the AT command to the queued list */
580 	hci1394_tlist_add(q_handle->q_queued_list, &cmd->qc_node);
581 
582 	mutex_exit(&q_handle->q_mutex);
583 
584 	return (DDI_SUCCESS);
585 }
586 
587 
588 /*
589  * XXX - NOTE: POSSIBLE FUTURE OPTIMIZATION
590  *    ATREQ Block read and write's that go through software are not very
591  *    efficient (one of the reasons to use physical space). A copy is forced
592  *    on all block reads due to the design of OpenHCI. Writes do not have this
593  *    same restriction.  This design forces a copy for writes too (we always
594  *    copy into a data buffer before sending). There are many reasons for this
595  *    including complexity reduction.  There is a data size threshold where a
596  *    copy is more expensive than mapping the data buffer address (or worse
597  *    case a big enough difference where it pays to do it). However, we move
598  *    block data around in mblks which means that our data may be scattered
599  *    over many buffers.  This adds to the complexity of mapping and setting
600  *    up the OpenHCI descriptors.
601  *
602  *    If someone really needs a speedup on block write ATREQs, my recommendation
603  *    would be to add an additional command type at the target interface for a
604  *    fast block write.  The target driver would pass a mapped io addr to use.
605  *    A function like "hci1394_q_at_with_ioaddr()" could be created which would
606  *    be almost an exact copy of hci1394_q_at_with_data() without the
607  *    hci1394_q_reserve() and hci1394_q_at_rep_put8() for the data buffer.
608  */
609 
610 
611 /*
612  * hci1394_q_at_with_data()
613  *    Place an AT command that does need the data buffer into the DMA chain.
614  *    The data is passed as a pointer to a kernel virtual address. An example of
615  *    this is the lock operations. result is only valid on failure.
616  */
617 int
618 hci1394_q_at_with_data(hci1394_q_handle_t q_handle, hci1394_q_cmd_t *cmd,
619     hci1394_basic_pkt_t *hdr, uint_t hdrsize, uint8_t *data, uint_t datasize,
620     int *result)
621 {
622 	uint32_t desc_ioaddr;
623 	uint32_t data_ioaddr;
624 	int status;
625 
626 
627 	ASSERT(q_handle != NULL);
628 	ASSERT(cmd != NULL);
629 	ASSERT(hdr != NULL);
630 	ASSERT(data != NULL);
631 
632 	mutex_enter(&q_handle->q_mutex);
633 
634 	/*
635 	 * Check the HAL state and generation when the AT Q is locked.  This
636 	 * will make sure that we get all the commands when we flush the Q's
637 	 * during a reset or shutdown.
638 	 */
639 	if ((hci1394_state(q_handle->q_drvinfo) != HCI1394_NORMAL) ||
640 	    (hci1394_ohci_current_busgen(q_handle->q_ohci) !=
641 	    cmd->qc_generation)) {
642 		*result = H1394_STATUS_INVALID_BUSGEN;
643 		mutex_exit(&q_handle->q_mutex);
644 		return (DDI_FAILURE);
645 	}
646 
647 	/* save away the argument to pass up when this command completes */
648 	cmd->qc_node.tln_addr = cmd;
649 
650 	/* we have not written any 16 byte blocks to the descriptor yet */
651 	q_handle->q_block_cnt = 0;
652 
653 	/* Reserve space for an OMI and OL in the descriptor buffer */
654 	status = hci1394_q_reserve(&q_handle->q_desc,
655 	    (sizeof (hci1394_desc_imm_t) + sizeof (hci1394_desc_t)),
656 	    &desc_ioaddr);
657 	if (status != DDI_SUCCESS) {
658 		*result = H1394_STATUS_NOMORE_SPACE;
659 		mutex_exit(&q_handle->q_mutex);
660 		return (DDI_FAILURE);
661 	}
662 
663 	/* allocate space for data in the data buffer */
664 	status = hci1394_q_reserve(&q_handle->q_data, datasize, &data_ioaddr);
665 	if (status != DDI_SUCCESS) {
666 		*result = H1394_STATUS_NOMORE_SPACE;
667 		hci1394_q_unreserve(&q_handle->q_desc);
668 		mutex_exit(&q_handle->q_mutex);
669 		return (DDI_FAILURE);
670 	}
671 
672 	/* Copy data into data buffer */
673 	hci1394_q_at_rep_put8(&q_handle->q_data, cmd, data, datasize);
674 
675 	/* write the OMI to the descriptor buffer */
676 	hci1394_q_at_write_OMI(q_handle, &q_handle->q_desc, cmd, hdr, hdrsize);
677 
678 	/* write the OL to the descriptor buffer */
679 	hci1394_q_at_write_OL(q_handle, &q_handle->q_desc, cmd, data_ioaddr,
680 	    datasize);
681 
682 	/* Add the AT command to the queued list */
683 	hci1394_tlist_add(q_handle->q_queued_list, &cmd->qc_node);
684 
685 	mutex_exit(&q_handle->q_mutex);
686 
687 	return (DDI_SUCCESS);
688 }
689 
690 
691 /*
692  * hci1394_q_at_with_mblk()
693  *    Place an AT command that does need the data buffer into the DMA chain.
694  *    The data is passed in mblk_t(s). Examples of this are a block write
695  *    ATREQ and a block read ATRESP. The services layer and the hal use a
696  *    private structure (h1394_mblk_t) to keep track of how much of the mblk
697  *    to send since we may have to break the transfer up into smaller blocks.
698  *    (i.e. a 1MByte block write would go out in 2KByte chunks. result is only
699  *    valid on failure.
700  */
701 int
702 hci1394_q_at_with_mblk(hci1394_q_handle_t q_handle, hci1394_q_cmd_t *cmd,
703     hci1394_basic_pkt_t *hdr, uint_t hdrsize, h1394_mblk_t *mblk, int *result)
704 {
705 	uint32_t desc_ioaddr;
706 	uint32_t data_ioaddr;
707 	int status;
708 
709 
710 	ASSERT(q_handle != NULL);
711 	ASSERT(cmd != NULL);
712 	ASSERT(hdr != NULL);
713 	ASSERT(mblk != NULL);
714 
715 	mutex_enter(&q_handle->q_mutex);
716 
717 	/*
718 	 * Check the HAL state and generation when the AT Q is locked.  This
719 	 * will make sure that we get all the commands when we flush the Q's
720 	 * during a reset or shutdown.
721 	 */
722 	if ((hci1394_state(q_handle->q_drvinfo) != HCI1394_NORMAL) ||
723 	    (hci1394_ohci_current_busgen(q_handle->q_ohci) !=
724 	    cmd->qc_generation)) {
725 		*result = H1394_STATUS_INVALID_BUSGEN;
726 		mutex_exit(&q_handle->q_mutex);
727 		return (DDI_FAILURE);
728 	}
729 
730 	/* save away the argument to pass up when this command completes */
731 	cmd->qc_node.tln_addr = cmd;
732 
733 	/* we have not written any 16 byte blocks to the descriptor yet */
734 	q_handle->q_block_cnt = 0;
735 
736 	/* Reserve space for an OMI and OL in the descriptor buffer */
737 	status = hci1394_q_reserve(&q_handle->q_desc,
738 	    (sizeof (hci1394_desc_imm_t) + sizeof (hci1394_desc_t)),
739 	    &desc_ioaddr);
740 	if (status != DDI_SUCCESS) {
741 		*result = H1394_STATUS_NOMORE_SPACE;
742 		mutex_exit(&q_handle->q_mutex);
743 		return (DDI_FAILURE);
744 	}
745 
746 	/* Reserve space for data in the data buffer */
747 	status = hci1394_q_reserve(&q_handle->q_data, mblk->length,
748 	    &data_ioaddr);
749 	if (status != DDI_SUCCESS) {
750 		*result = H1394_STATUS_NOMORE_SPACE;
751 		hci1394_q_unreserve(&q_handle->q_desc);
752 		mutex_exit(&q_handle->q_mutex);
753 		return (DDI_FAILURE);
754 	}
755 
756 	/* Copy mblk data into data buffer */
757 	hci1394_q_at_copy_from_mblk(&q_handle->q_data, cmd, mblk);
758 
759 	/* write the OMI to the descriptor buffer */
760 	hci1394_q_at_write_OMI(q_handle, &q_handle->q_desc, cmd, hdr, hdrsize);
761 
762 	/* write the OL to the descriptor buffer */
763 	hci1394_q_at_write_OL(q_handle, &q_handle->q_desc, cmd, data_ioaddr,
764 	    mblk->length);
765 
766 	/* Add the AT command to the queued list */
767 	hci1394_tlist_add(q_handle->q_queued_list, &cmd->qc_node);
768 
769 	mutex_exit(&q_handle->q_mutex);
770 
771 	return (DDI_SUCCESS);
772 }
773 
774 
775 /*
776  * hci1394_q_at_next()
777  *    Return the next completed AT command in cmd.  If flush_q is true, we will
778  *    return the command regardless if it finished or not.  We will flush
779  *    during bus reset processing, shutdown, and detach.
780  */
781 void
782 hci1394_q_at_next(hci1394_q_handle_t q_handle, boolean_t flush_q,
783     hci1394_q_cmd_t **cmd)
784 {
785 	hci1394_q_buf_t *desc;
786 	hci1394_q_buf_t *data;
787 	hci1394_tlist_node_t *node;
788 	uint32_t cmd_status;
789 
790 
791 	ASSERT(q_handle != NULL);
792 	ASSERT(cmd != NULL);
793 
794 	mutex_enter(&q_handle->q_mutex);
795 
796 	desc = &q_handle->q_desc;
797 	data = &q_handle->q_data;
798 
799 	/* Sync descriptor buffer */
800 	(void) ddi_dma_sync(desc->qb_buf.bi_dma_handle, 0,
801 	    desc->qb_buf.bi_length, DDI_DMA_SYNC_FORKERNEL);
802 
803 	/* Look at the top cmd on the queued list (without removing it) */
804 	hci1394_tlist_peek(q_handle->q_queued_list, &node);
805 	if (node == NULL) {
806 		/* There are no more commands left on the queued list */
807 		*cmd = NULL;
808 		mutex_exit(&q_handle->q_mutex);
809 		return;
810 	}
811 
812 	/*
813 	 * There is a command on the list, read its status and timestamp when
814 	 * it was sent
815 	 */
816 	*cmd = (hci1394_q_cmd_t *)node->tln_addr;
817 	cmd_status = ddi_get32(desc->qb_buf.bi_handle, (*cmd)->qc_status_addr);
818 	(*cmd)->qc_timestamp = cmd_status & DESC_ST_TIMESTAMP_MASK;
819 	cmd_status = HCI1394_DESC_EVT_GET(cmd_status);
820 
821 	/*
822 	 * If we are flushing the q (e.g. due to a bus reset), we will return
823 	 * the command regardless of its completion status. If we are not
824 	 * flushing the Q and we do not have status on the command (e.g. status
825 	 * = 0), we are done with this Q for now.
826 	 */
827 	if (flush_q == B_FALSE) {
828 		if (cmd_status == 0) {
829 			*cmd = NULL;
830 			mutex_exit(&q_handle->q_mutex);
831 			return;
832 		}
833 	}
834 
835 	/*
836 	 * The command completed, remove it from the queued list. There is not
837 	 * a race condition to delete the node in the list here.  This is the
838 	 * only place the node will be deleted so we do not need to check the
839 	 * return status.
840 	 */
841 	(void) hci1394_tlist_delete(q_handle->q_queued_list, node);
842 
843 	/*
844 	 * Free the space used by the command in the descriptor and data
845 	 * buffers.
846 	 */
847 	desc->qb_ptrs.qp_free_buf = (*cmd)->qc_descriptor_buf;
848 	desc->qb_ptrs.qp_free = (*cmd)->qc_descriptor_end;
849 	if ((*cmd)->qc_data_used == B_TRUE) {
850 		data->qb_ptrs.qp_free_buf = (*cmd)->qc_data_buf;
851 		data->qb_ptrs.qp_free = (*cmd)->qc_data_end;
852 	}
853 
854 	/* return command status */
855 	(*cmd)->qc_status = cmd_status;
856 
857 	mutex_exit(&q_handle->q_mutex);
858 }
859 
860 
861 /*
862  * hci1394_q_at_write_OMI()
863  *    Write an OMI descriptor into the AT descriptor buffer passed in as qbuf.
864  *    Buffer state information is stored in cmd.  Use the hdr and hdr size for
865  *    the additional information attached to an immediate descriptor.
866  */
867 void
868 hci1394_q_at_write_OMI(hci1394_q_handle_t q_handle, hci1394_q_buf_t *qbuf,
869     hci1394_q_cmd_t *cmd, hci1394_basic_pkt_t *hdr, uint_t hdrsize)
870 {
871 	hci1394_desc_imm_t *desc;
872 	uint32_t data;
873 
874 
875 	ASSERT(qbuf != NULL);
876 	ASSERT(cmd != NULL);
877 	ASSERT(hdr != NULL);
878 	ASSERT(MUTEX_HELD(&q_handle->q_mutex));
879 
880 	/* The only valid "header" sizes for an OMI are 8 bytes or 16 bytes */
881 	ASSERT((hdrsize == 8) || (hdrsize == 16));
882 
883 	/* Make sure enough room for OMI */
884 	ASSERT(qbuf->qb_ptrs.qp_resv_size >= sizeof (hci1394_desc_imm_t));
885 
886 	/* Store the offset of the top of this descriptor block */
887 	qbuf->qb_ptrs.qp_offset = (uint32_t)(qbuf->qb_ptrs.qp_current -
888 	    qbuf->qb_ptrs.qp_begin);
889 
890 	/* Setup OpenHCI OMI Header */
891 	desc = (hci1394_desc_imm_t *)qbuf->qb_ptrs.qp_current;
892 	data = DESC_AT_OMI | (hdrsize & DESC_HDR_REQCOUNT_MASK);
893 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->hdr, data);
894 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->data_addr, 0);
895 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->branch, 0);
896 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->status, cmd->qc_timestamp);
897 
898 	/*
899 	 * Copy in 1394 header. Size is in bytes, convert it to a 32-bit word
900 	 * count.
901 	 */
902 	ddi_rep_put32(qbuf->qb_buf.bi_handle, &hdr->q1, &desc->q1,
903 	    hdrsize >> 2, DDI_DEV_AUTOINCR);
904 
905 	/*
906 	 * We wrote 2 16 byte blocks in the descriptor buffer, update the count
907 	 * accordingly.  Update the reserved size and current pointer.
908 	 */
909 	q_handle->q_block_cnt += 2;
910 	qbuf->qb_ptrs.qp_resv_size -= sizeof (hci1394_desc_imm_t);
911 	qbuf->qb_ptrs.qp_current += sizeof (hci1394_desc_imm_t);
912 }
913 
914 
915 /*
916  * hci1394_q_at_write_OLI()
917  *    Write an OLI descriptor into the AT descriptor buffer passed in as qbuf.
918  *    Buffer state information is stored in cmd.  Use the hdr and hdr size for
919  *    the additional information attached to an immediate descriptor.
920  */
921 void
922 hci1394_q_at_write_OLI(hci1394_q_handle_t q_handle, hci1394_q_buf_t *qbuf,
923     hci1394_q_cmd_t *cmd, hci1394_basic_pkt_t *hdr, uint_t hdrsize)
924 {
925 	hci1394_desc_imm_t *desc;
926 	uint32_t data;
927 	uint32_t command_ptr;
928 	uint32_t tcode;
929 
930 
931 	ASSERT(qbuf != NULL);
932 	ASSERT(cmd != NULL);
933 	ASSERT(hdr != NULL);
934 	ASSERT(MUTEX_HELD(&q_handle->q_mutex));
935 
936 	/* The only valid "header" sizes for an OLI are 8, 12, 16 bytes */
937 	ASSERT((hdrsize == 8) || (hdrsize == 12) || (hdrsize == 16));
938 
939 	/* make sure enough room for 1 OLI */
940 	ASSERT(qbuf->qb_ptrs.qp_resv_size >= sizeof (hci1394_desc_imm_t));
941 
942 	/* Store the offset of the top of this descriptor block */
943 	qbuf->qb_ptrs.qp_offset = (uint32_t)(qbuf->qb_ptrs.qp_current -
944 	    qbuf->qb_ptrs.qp_begin);
945 
946 	/* Setup OpenHCI OLI Header */
947 	desc = (hci1394_desc_imm_t *)qbuf->qb_ptrs.qp_current;
948 	data = DESC_AT_OLI | (hdrsize & DESC_HDR_REQCOUNT_MASK);
949 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->hdr, data);
950 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->data_addr, 0);
951 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->branch, 0);
952 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->status, cmd->qc_timestamp);
953 
954 	/* Setup 1394 Header */
955 	tcode = (hdr->q1 & DESC_PKT_TCODE_MASK) >> DESC_PKT_TCODE_SHIFT;
956 	if ((tcode == IEEE1394_TCODE_WRITE_QUADLET) ||
957 	    (tcode == IEEE1394_TCODE_READ_QUADLET_RESP)) {
958 		/*
959 		 * if the tcode = a quadlet write, move the last quadlet as
960 		 * 8-bit data.  All data is treated as 8-bit data (even quadlet
961 		 * reads and writes). Therefore, target drivers MUST take that
962 		 * into consideration when accessing device registers.
963 		 */
964 		ddi_rep_put32(qbuf->qb_buf.bi_handle, &hdr->q1, &desc->q1, 3,
965 		    DDI_DEV_AUTOINCR);
966 		ddi_rep_put8(qbuf->qb_buf.bi_handle, (uint8_t *)&hdr->q4,
967 		    (uint8_t *)&desc->q4, 4, DDI_DEV_AUTOINCR);
968 	} else {
969 		ddi_rep_put32(qbuf->qb_buf.bi_handle, &hdr->q1, &desc->q1,
970 		    hdrsize >> 2, DDI_DEV_AUTOINCR);
971 	}
972 
973 	/*
974 	 * We wrote 2 16 byte blocks in the descriptor buffer, update the count
975 	 * accordingly.
976 	 */
977 	q_handle->q_block_cnt += 2;
978 
979 	/*
980 	 * Sync buffer in case DMA engine currently running. This must be done
981 	 * before writing the command pointer in the previous descriptor.
982 	 */
983 	(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
984 	    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
985 
986 	/* save away the status address for quick access in at_next() */
987 	cmd->qc_status_addr = &desc->status;
988 
989 	/*
990 	 * Setup the command pointer.  This tells the HW where to get the
991 	 * descriptor we just setup.  This includes the IO address along with
992 	 * a 4 bit 16 byte block count
993 	 */
994 	command_ptr = (uint32_t)((qbuf->qb_cookie[qbuf->qb_ptrs.qp_current_buf
995 	    ].dmac_address + qbuf->qb_ptrs.qp_offset) | (q_handle->q_block_cnt &
996 	    DESC_Z_MASK));
997 
998 	/*
999 	 * if we previously setup a descriptor, add this new descriptor into
1000 	 * the previous descriptor's "next" pointer.
1001 	 */
1002 	if (q_handle->q_previous != NULL) {
1003 		ddi_put32(qbuf->qb_buf.bi_handle, &q_handle->q_previous->branch,
1004 		    command_ptr);
1005 		/* Sync buffer again, this gets the command pointer */
1006 		(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
1007 		    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
1008 	}
1009 
1010 	/*
1011 	 * this is now the previous descriptor.  Update the current pointer,
1012 	 * clear the block count and reserved size since this is the end of
1013 	 * this command.
1014 	 */
1015 	q_handle->q_previous = (hci1394_desc_t *)desc;
1016 	qbuf->qb_ptrs.qp_current += sizeof (hci1394_desc_imm_t);
1017 	q_handle->q_block_cnt = 0;
1018 	qbuf->qb_ptrs.qp_resv_size = 0;
1019 
1020 	/* save away cleanup info when we are done with the command */
1021 	cmd->qc_descriptor_buf = qbuf->qb_ptrs.qp_current_buf;
1022 	cmd->qc_descriptor_end = qbuf->qb_ptrs.qp_current - 1;
1023 
1024 	/* If the DMA is not running, start it */
1025 	if (q_handle->q_dma_running == B_FALSE) {
1026 		q_handle->q_info.qi_start(q_handle->q_info.qi_callback_arg,
1027 		    command_ptr);
1028 		q_handle->q_dma_running = B_TRUE;
1029 	/* the DMA is running, wake it up */
1030 	} else {
1031 		q_handle->q_info.qi_wake(q_handle->q_info.qi_callback_arg);
1032 	}
1033 }
1034 
1035 
1036 /*
1037  * hci1394_q_at_write_OL()
1038  *    Write an OL descriptor into the AT descriptor buffer passed in as qbuf.
1039  *    Buffer state information is stored in cmd.  The IO address of the data
1040  *    buffer is passed in io_addr.  Size is the size of the data to be
1041  *    transferred.
1042  */
1043 void
1044 hci1394_q_at_write_OL(hci1394_q_handle_t q_handle, hci1394_q_buf_t *qbuf,
1045     hci1394_q_cmd_t *cmd, uint32_t io_addr, uint_t size)
1046 {
1047 	hci1394_desc_t *desc;
1048 	uint32_t data;
1049 	uint32_t command_ptr;
1050 
1051 
1052 	ASSERT(q_handle != NULL);
1053 	ASSERT(qbuf != NULL);
1054 	ASSERT(cmd != NULL);
1055 	ASSERT(MUTEX_HELD(&q_handle->q_mutex));
1056 
1057 	/* make sure enough room for OL */
1058 	ASSERT(qbuf->qb_ptrs.qp_resv_size >= sizeof (hci1394_desc_t));
1059 
1060 	/* Setup OpenHCI OL Header */
1061 	desc = (hci1394_desc_t *)qbuf->qb_ptrs.qp_current;
1062 	data = DESC_AT_OL | (size & DESC_HDR_REQCOUNT_MASK);
1063 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->hdr, data);
1064 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->data_addr, io_addr);
1065 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->branch, 0);
1066 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->status, 0);
1067 
1068 	/*
1069 	 * We wrote 1 16 byte block in the descriptor buffer, update the count
1070 	 * accordingly.
1071 	 */
1072 	q_handle->q_block_cnt++;
1073 
1074 	/*
1075 	 * Sync buffer in case DMA engine currently running. This must be done
1076 	 * before writing the command pointer in the previous descriptor.
1077 	 */
1078 	(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
1079 	    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
1080 
1081 	/* save away the status address for quick access in at_next() */
1082 	cmd->qc_status_addr = &desc->status;
1083 
1084 	/*
1085 	 * Setup the command pointer.  This tells the HW where to get the
1086 	 * descriptor we just setup.  This includes the IO address along with
1087 	 * a 4 bit 16 byte block count
1088 	 */
1089 	command_ptr = (uint32_t)((qbuf->qb_cookie[qbuf->qb_ptrs.qp_current_buf
1090 	    ].dmac_address + qbuf->qb_ptrs.qp_offset) | (q_handle->q_block_cnt &
1091 	    DESC_Z_MASK));
1092 
1093 	/*
1094 	 * if we previously setup a descriptor, add this new descriptor into
1095 	 * the previous descriptor's "next" pointer.
1096 	 */
1097 	if (q_handle->q_previous != NULL) {
1098 		ddi_put32(qbuf->qb_buf.bi_handle, &q_handle->q_previous->branch,
1099 		    command_ptr);
1100 		/* Sync buffer again, this gets the command pointer */
1101 		(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
1102 		    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
1103 	}
1104 
1105 	/*
1106 	 * this is now the previous descriptor.  Update the current pointer,
1107 	 * clear the block count and reserved size since this is the end of
1108 	 * this command.
1109 	 */
1110 	q_handle->q_previous = desc;
1111 	qbuf->qb_ptrs.qp_current += sizeof (hci1394_desc_t);
1112 	q_handle->q_block_cnt = 0;
1113 	qbuf->qb_ptrs.qp_resv_size = 0;
1114 
1115 	/* save away cleanup info when we are done with the command */
1116 	cmd->qc_descriptor_buf = qbuf->qb_ptrs.qp_current_buf;
1117 	cmd->qc_descriptor_end = qbuf->qb_ptrs.qp_current - 1;
1118 
1119 	/* If the DMA is not running, start it */
1120 	if (q_handle->q_dma_running == B_FALSE) {
1121 		q_handle->q_info.qi_start(q_handle->q_info.qi_callback_arg,
1122 		    command_ptr);
1123 		q_handle->q_dma_running = B_TRUE;
1124 	/* the DMA is running, wake it up */
1125 	} else {
1126 		q_handle->q_info.qi_wake(q_handle->q_info.qi_callback_arg);
1127 	}
1128 }
1129 
1130 
1131 /*
1132  * hci1394_q_at_rep_put8()
1133  *    Copy a byte stream from a kernel virtual address (data) to a IO mapped
1134  *    data buffer (qbuf).  Copy datasize bytes.  State information for the
1135  *    data buffer is kept in cmd.
1136  */
1137 void
1138 hci1394_q_at_rep_put8(hci1394_q_buf_t *qbuf, hci1394_q_cmd_t *cmd,
1139     uint8_t *data, uint_t datasize)
1140 {
1141 	ASSERT(qbuf != NULL);
1142 	ASSERT(cmd != NULL);
1143 	ASSERT(data != NULL);
1144 
1145 	/* Make sure enough room for data */
1146 	ASSERT(qbuf->qb_ptrs.qp_resv_size >= datasize);
1147 
1148 	/* Copy in data into the data buffer */
1149 	ddi_rep_put8(qbuf->qb_buf.bi_handle, data,
1150 	    (uint8_t *)qbuf->qb_ptrs.qp_current, datasize, DDI_DEV_AUTOINCR);
1151 
1152 	/* Update the current pointer, offset, and reserved size */
1153 	qbuf->qb_ptrs.qp_current += datasize;
1154 	qbuf->qb_ptrs.qp_offset = (uint32_t)(qbuf->qb_ptrs.qp_current -
1155 	    qbuf->qb_ptrs.qp_begin);
1156 	qbuf->qb_ptrs.qp_resv_size -= datasize;
1157 
1158 	/* save away cleanup info when we are done with the command */
1159 	cmd->qc_data_used = B_TRUE;
1160 	cmd->qc_data_buf = qbuf->qb_ptrs.qp_current_buf;
1161 	cmd->qc_data_end = qbuf->qb_ptrs.qp_current - 1;
1162 
1163 	/* Sync data buffer */
1164 	(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
1165 	    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
1166 }
1167 
1168 
1169 /*
1170  * hci1394_q_at_copy_from_mblk()
1171  *    Copy a byte stream from a mblk(s) to a IO mapped data buffer (qbuf).
1172  *    Copy mblk->length bytes. The services layer and the hal use a private
1173  *    structure (h1394_mblk_t) to keep track of how much of the mblk to send
1174  *    since we may have to break the transfer up into smaller blocks. (i.e. a
1175  *    1MByte block write would go out in 2KByte chunks. State information for
1176  *    the data buffer is kept in cmd.
1177  */
1178 static void
1179 hci1394_q_at_copy_from_mblk(hci1394_q_buf_t *qbuf, hci1394_q_cmd_t *cmd,
1180     h1394_mblk_t *mblk)
1181 {
1182 	uint_t bytes_left;
1183 	uint_t length;
1184 
1185 
1186 	ASSERT(qbuf != NULL);
1187 	ASSERT(cmd != NULL);
1188 	ASSERT(mblk != NULL);
1189 
1190 	/* We return these variables to the Services Layer when we are done */
1191 	mblk->next_offset = mblk->curr_offset;
1192 	mblk->next_mblk = mblk->curr_mblk;
1193 	bytes_left = mblk->length;
1194 
1195 	/* do while there are bytes left to copy */
1196 	do {
1197 		/*
1198 		 * If the entire data portion of the current block transfer is
1199 		 * contained within a single mblk.
1200 		 */
1201 		if ((mblk->next_offset + bytes_left) <=
1202 		    (mblk->next_mblk->b_wptr)) {
1203 			/* Copy the data into the data Q */
1204 			hci1394_q_at_rep_put8(qbuf, cmd,
1205 			    (uint8_t *)mblk->next_offset, bytes_left);
1206 
1207 			/* increment the mblk offset */
1208 			mblk->next_offset += bytes_left;
1209 
1210 			/* we have no more bytes to put into the buffer */
1211 			bytes_left = 0;
1212 
1213 			/*
1214 			 * If our offset is at the end of data in this mblk, go
1215 			 * to the next mblk.
1216 			 */
1217 			if (mblk->next_offset >= mblk->next_mblk->b_wptr) {
1218 				mblk->next_mblk = mblk->next_mblk->b_cont;
1219 				if (mblk->next_mblk != NULL) {
1220 					mblk->next_offset =
1221 					    mblk->next_mblk->b_rptr;
1222 				}
1223 			}
1224 
1225 		/*
1226 		 * The data portion of the current block transfer is spread
1227 		 * across two or more mblk's
1228 		 */
1229 		} else {
1230 			/*
1231 			 * Figure out how much data is in this mblk.
1232 			 */
1233 			length = mblk->next_mblk->b_wptr - mblk->next_offset;
1234 
1235 			/* Copy the data into the atreq data Q */
1236 			hci1394_q_at_rep_put8(qbuf, cmd,
1237 			    (uint8_t *)mblk->next_offset, length);
1238 
1239 			/* update the bytes left count, go to the next mblk */
1240 			bytes_left = bytes_left - length;
1241 			mblk->next_mblk = mblk->next_mblk->b_cont;
1242 			ASSERT(mblk->next_mblk != NULL);
1243 			mblk->next_offset = mblk->next_mblk->b_rptr;
1244 		}
1245 	} while (bytes_left > 0);
1246 }
1247 
1248 
1249 /*
1250  * hci1394_q_ar_next()
1251  *    Return an address to the next received AR packet.  If there are no more
1252  *    AR packets in the buffer, q_addr will be set to NULL.
1253  */
1254 void
1255 hci1394_q_ar_next(hci1394_q_handle_t q_handle, uint32_t **q_addr)
1256 {
1257 	hci1394_desc_t *desc;
1258 	hci1394_q_buf_t *descb;
1259 	hci1394_q_buf_t *datab;
1260 	uint32_t residual_count;
1261 
1262 
1263 	ASSERT(q_handle != NULL);
1264 	ASSERT(q_addr != NULL);
1265 
1266 	descb = &q_handle->q_desc;
1267 	datab = &q_handle->q_data;
1268 
1269 	/* Sync Descriptor buffer */
1270 	(void) ddi_dma_sync(descb->qb_buf.bi_dma_handle, 0,
1271 	    descb->qb_buf.bi_length, DDI_DMA_SYNC_FORKERNEL);
1272 
1273 	/*
1274 	 * Check residual in current IM count vs q_space_left to see if we have
1275 	 * received any more responses
1276 	 */
1277 	desc = (hci1394_desc_t *)q_handle->q_head;
1278 	residual_count = ddi_get32(descb->qb_buf.bi_handle, &desc->status);
1279 	residual_count &= DESC_ST_RESCOUNT_MASK;
1280 	if (residual_count >= q_handle->q_space_left) {
1281 		/* No new packets received */
1282 		*q_addr = NULL;
1283 		return;
1284 	}
1285 
1286 	/* Sync Data Q */
1287 	(void) ddi_dma_sync(datab->qb_buf.bi_dma_handle, 0,
1288 	    datab->qb_buf.bi_length, DDI_DMA_SYNC_FORKERNEL);
1289 
1290 	/*
1291 	 * We have a new packet, return the address of the start of the
1292 	 * packet.
1293 	 */
1294 	*q_addr = (uint32_t *)datab->qb_ptrs.qp_current;
1295 }
1296 
1297 
1298 /*
1299  * hci1394_q_ar_free()
1300  *    Free the space used by the AR packet at the top of the data buffer. AR
1301  *    packets are processed in the order that they are received.  This will
1302  *    free the oldest received packet which has not yet been freed.  size is
1303  *    how much space the packet takes up.
1304  */
1305 void
1306 hci1394_q_ar_free(hci1394_q_handle_t q_handle, uint_t size)
1307 {
1308 	hci1394_q_buf_t *descb;
1309 	hci1394_q_buf_t *datab;
1310 
1311 
1312 	ASSERT(q_handle != NULL);
1313 
1314 	descb = &q_handle->q_desc;
1315 	datab = &q_handle->q_data;
1316 
1317 	/*
1318 	 * Packet is in multiple buffers. Theoretically a buffer could be broken
1319 	 * in more than two buffers for an ARRESP.  Since the buffers should be
1320 	 * in at least 4K increments this will not happen since the max packet
1321 	 * size is 2KBytes.
1322 	 */
1323 	if ((datab->qb_ptrs.qp_current + size) > datab->qb_ptrs.qp_end) {
1324 		/* Add IM descriptor for used buffer back into Q */
1325 		hci1394_q_ar_write_IM(q_handle, descb,
1326 		    datab->qb_cookie[datab->qb_ptrs.qp_current_buf
1327 		    ].dmac_address,
1328 		    datab->qb_cookie[datab->qb_ptrs.qp_current_buf].dmac_size);
1329 
1330 		/* Go to the next buffer */
1331 		hci1394_q_next_buf(datab);
1332 
1333 		/* Update next buffers pointers for partial packet */
1334 		size -= q_handle->q_space_left;
1335 		datab->qb_ptrs.qp_current += size;
1336 		q_handle->q_space_left =
1337 		    datab->qb_cookie[datab->qb_ptrs.qp_current_buf].dmac_size -
1338 		    size;
1339 
1340 		/* Change the head pointer to the next IM descriptor */
1341 		q_handle->q_head += sizeof (hci1394_desc_t);
1342 		if ((q_handle->q_head + sizeof (hci1394_desc_t)) >
1343 		    (descb->qb_ptrs.qp_bottom + 1)) {
1344 			q_handle->q_head = descb->qb_ptrs.qp_top;
1345 		}
1346 
1347 	/* Packet is only in one buffer */
1348 	} else {
1349 		q_handle->q_space_left -= size;
1350 		datab->qb_ptrs.qp_current += size;
1351 	}
1352 }
1353 
1354 
1355 /*
1356  * hci1394_q_ar_get32()
1357  *    Read a quadlet of data regardless if it is in the current buffer or has
1358  *    wrapped to the top buffer.  If the address passed to this routine is
1359  *    passed the bottom of the data buffer, this routine will automatically
1360  *    wrap back to the top of the Q and look in the correct offset from the
1361  *    top. Copy the data into the kernel virtual address provided.
1362  */
1363 uint32_t
1364 hci1394_q_ar_get32(hci1394_q_handle_t q_handle, uint32_t *addr)
1365 {
1366 	hci1394_q_buf_t *data;
1367 	uintptr_t new_addr;
1368 	uint32_t data32;
1369 
1370 
1371 	ASSERT(q_handle != NULL);
1372 	ASSERT(addr != NULL);
1373 
1374 	data = &q_handle->q_data;
1375 
1376 	/*
1377 	 * if the data has wrapped to the top of the buffer, adjust the address.
1378 	 */
1379 	if ((uintptr_t)addr > (uintptr_t)data->qb_ptrs.qp_bottom) {
1380 		new_addr = (uintptr_t)data->qb_ptrs.qp_top + ((uintptr_t)addr -
1381 		    ((uintptr_t)data->qb_ptrs.qp_bottom + (uintptr_t)1));
1382 		data32 = ddi_get32(data->qb_buf.bi_handle,
1383 		    (uint32_t *)new_addr);
1384 
1385 	/* data is before end of buffer */
1386 	} else {
1387 		data32 = ddi_get32(data->qb_buf.bi_handle, addr);
1388 	}
1389 
1390 	return (data32);
1391 }
1392 
1393 
1394 /*
1395  * hci1394_q_ar_rep_get8()
1396  *    Read a byte stream of data regardless if it is contiguous or has partially
1397  *    or fully wrapped to the top buffer.  If the address passed to this routine
1398  *    is passed the bottom of the data buffer, or address + size is past the
1399  *    bottom of the data buffer. this routine will automatically wrap back to
1400  *    the top of the Q and look in the correct offset from the top. Copy the
1401  *    data into the kernel virtual address provided.
1402  */
1403 void
1404 hci1394_q_ar_rep_get8(hci1394_q_handle_t q_handle, uint8_t *dest,
1405     uint8_t *q_addr, uint_t size)
1406 {
1407 	hci1394_q_buf_t *data;
1408 	uintptr_t new_addr;
1409 	uint_t new_size;
1410 	uintptr_t new_dest;
1411 
1412 
1413 	ASSERT(q_handle != NULL);
1414 	ASSERT(dest != NULL);
1415 	ASSERT(q_addr != NULL);
1416 
1417 	data = &q_handle->q_data;
1418 
1419 	/*
1420 	 * There are three cases:
1421 	 *   1) All of the data has wrapped.
1422 	 *   2) Some of the data has not wrapped and some has wrapped.
1423 	 *   3) None of the data has wrapped.
1424 	 */
1425 
1426 	/* All of the data has wrapped, just adjust the starting address */
1427 	if ((uintptr_t)q_addr > (uintptr_t)data->qb_ptrs.qp_bottom) {
1428 		new_addr = (uintptr_t)data->qb_ptrs.qp_top +
1429 		    ((uintptr_t)q_addr - ((uintptr_t)data->qb_ptrs.qp_bottom +
1430 		    (uintptr_t)1));
1431 		ddi_rep_get8(data->qb_buf.bi_handle, dest, (uint8_t *)new_addr,
1432 		    size, DDI_DEV_AUTOINCR);
1433 
1434 	/*
1435 	 * Some of the data has wrapped. Copy the data that hasn't wrapped,
1436 	 * adjust the address, then copy the rest.
1437 	 */
1438 	} else if (((uintptr_t)q_addr + (uintptr_t)size) >
1439 	    ((uintptr_t)data->qb_ptrs.qp_bottom + (uintptr_t)1)) {
1440 		/* Copy first half */
1441 		new_size = (uint_t)(((uintptr_t)data->qb_ptrs.qp_bottom +
1442 		    (uintptr_t)1) - (uintptr_t)q_addr);
1443 		ddi_rep_get8(data->qb_buf.bi_handle, dest, q_addr, new_size,
1444 		    DDI_DEV_AUTOINCR);
1445 
1446 		/* copy second half */
1447 		new_dest = (uintptr_t)dest + (uintptr_t)new_size;
1448 		new_size = size - new_size;
1449 		new_addr = (uintptr_t)data->qb_ptrs.qp_top;
1450 		ddi_rep_get8(data->qb_buf.bi_handle, (uint8_t *)new_dest,
1451 		    (uint8_t *)new_addr, new_size, DDI_DEV_AUTOINCR);
1452 
1453 	/* None of the data has wrapped */
1454 	} else {
1455 		ddi_rep_get8(data->qb_buf.bi_handle, dest, q_addr, size,
1456 		    DDI_DEV_AUTOINCR);
1457 	}
1458 }
1459 
1460 
1461 /*
1462  * hci1394_q_ar_copy_to_mblk()
1463  *    Read a byte stream of data regardless if it is contiguous or has partially
1464  *    or fully wrapped to the top buffer.  If the address passed to this routine
1465  *    is passed the bottom of the data buffer, or address + size is passed the
1466  *    bottom of the data buffer. this routine will automatically wrap back to
1467  *    the top of the Q and look in the correct offset from the top. Copy the
1468  *    data into the mblk provided. The services layer and the hal use a private
1469  *    structure (h1394_mblk_t) to keep track of how much of the mblk to receive
1470  *    into since we may have to break the transfer up into smaller blocks.
1471  *    (i.e. a 1MByte block read would go out in 2KByte requests.
1472  */
1473 void
1474 hci1394_q_ar_copy_to_mblk(hci1394_q_handle_t q_handle, uint8_t *addr,
1475     h1394_mblk_t *mblk)
1476 {
1477 	uint8_t *new_addr;
1478 	uint_t bytes_left;
1479 	uint_t length;
1480 
1481 
1482 	ASSERT(q_handle != NULL);
1483 	ASSERT(addr != NULL);
1484 	ASSERT(mblk != NULL);
1485 
1486 	/* We return these variables to the Services Layer when we are done */
1487 	mblk->next_offset = mblk->curr_offset;
1488 	mblk->next_mblk = mblk->curr_mblk;
1489 	bytes_left = mblk->length;
1490 
1491 	/* the address we copy from will change as we change mblks */
1492 	new_addr = addr;
1493 
1494 	/* do while there are bytes left to copy */
1495 	do {
1496 		/*
1497 		 * If the entire data portion of the current block transfer is
1498 		 * contained within a single mblk.
1499 		 */
1500 		if ((mblk->next_offset + bytes_left) <=
1501 		    (mblk->next_mblk->b_datap->db_lim)) {
1502 			/* Copy the data into the mblk */
1503 			hci1394_q_ar_rep_get8(q_handle,
1504 			    (uint8_t *)mblk->next_offset, new_addr, bytes_left);
1505 
1506 			/* increment the offset */
1507 			mblk->next_offset += bytes_left;
1508 			mblk->next_mblk->b_wptr = mblk->next_offset;
1509 
1510 			/* we have no more bytes to put into the buffer */
1511 			bytes_left = 0;
1512 
1513 			/*
1514 			 * If our offset is at the end of data in this mblk, go
1515 			 * to the next mblk.
1516 			 */
1517 			if (mblk->next_offset >=
1518 			    mblk->next_mblk->b_datap->db_lim) {
1519 				mblk->next_mblk = mblk->next_mblk->b_cont;
1520 				if (mblk->next_mblk != NULL) {
1521 					mblk->next_offset =
1522 					    mblk->next_mblk->b_wptr;
1523 				}
1524 			}
1525 
1526 		/*
1527 		 * The data portion of the current block transfer is spread
1528 		 * across two or more mblk's
1529 		 */
1530 		} else {
1531 			/* Figure out how much data is in this mblk */
1532 			length = mblk->next_mblk->b_datap->db_lim -
1533 			    mblk->next_offset;
1534 
1535 			/* Copy the data into the mblk */
1536 			hci1394_q_ar_rep_get8(q_handle,
1537 			    (uint8_t *)mblk->next_offset, new_addr, length);
1538 			mblk->next_mblk->b_wptr =
1539 			    mblk->next_mblk->b_datap->db_lim;
1540 
1541 			/*
1542 			 * update the bytes left and address to copy from, go
1543 			 * to the next mblk.
1544 			 */
1545 			bytes_left = bytes_left - length;
1546 			new_addr = (uint8_t *)((uintptr_t)new_addr +
1547 			    (uintptr_t)length);
1548 			mblk->next_mblk = mblk->next_mblk->b_cont;
1549 			ASSERT(mblk->next_mblk != NULL);
1550 			mblk->next_offset = mblk->next_mblk->b_wptr;
1551 		}
1552 	} while (bytes_left > 0);
1553 }
1554 
1555 
1556 /*
1557  * hci1394_q_ar_write_IM()
1558  *    Write an IM descriptor into the AR descriptor buffer passed in as qbuf.
1559  *    The IO address of the data buffer is passed in io_addr.  datasize is the
1560  *    size of the data data buffer to receive into.
1561  */
1562 void
1563 hci1394_q_ar_write_IM(hci1394_q_handle_t q_handle, hci1394_q_buf_t *qbuf,
1564     uint32_t io_addr, uint_t datasize)
1565 {
1566 	hci1394_desc_t *desc;
1567 	uint32_t data;
1568 	uint32_t command_ptr;
1569 
1570 
1571 	ASSERT(q_handle != NULL);
1572 	ASSERT(qbuf != NULL);
1573 
1574 	/* Make sure enough room for IM */
1575 	if ((qbuf->qb_ptrs.qp_current + sizeof (hci1394_desc_t)) >
1576 	    (qbuf->qb_ptrs.qp_bottom + 1)) {
1577 		hci1394_q_next_buf(qbuf);
1578 	} else {
1579 		/* Store the offset of the top of this descriptor block */
1580 		qbuf->qb_ptrs.qp_offset = (uint32_t)(qbuf->qb_ptrs.qp_current -
1581 		    qbuf->qb_ptrs.qp_begin);
1582 	}
1583 
1584 	/* Setup OpenHCI IM Header */
1585 	desc = (hci1394_desc_t *)qbuf->qb_ptrs.qp_current;
1586 	data = DESC_AR_IM | (datasize & DESC_HDR_REQCOUNT_MASK);
1587 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->hdr, data);
1588 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->data_addr, io_addr);
1589 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->branch, 0);
1590 	ddi_put32(qbuf->qb_buf.bi_handle, &desc->status, datasize &
1591 	    DESC_ST_RESCOUNT_MASK);
1592 
1593 	/*
1594 	 * Sync buffer in case DMA engine currently running. This must be done
1595 	 * before writing the command pointer in the previous descriptor.
1596 	 */
1597 	(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
1598 	    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
1599 
1600 	/*
1601 	 * Setup the command pointer.  This tells the HW where to get the
1602 	 * descriptor we just setup.  This includes the IO address along with
1603 	 * a 4 bit 16 byte block count.  We only wrote 1 16 byte block.
1604 	 */
1605 	command_ptr = (uint32_t)((qbuf->qb_cookie[qbuf->qb_ptrs.qp_current_buf
1606 	    ].dmac_address + qbuf->qb_ptrs.qp_offset) | 1);
1607 
1608 	/*
1609 	 * if we previously setup a descriptor, add this new descriptor into
1610 	 * the previous descriptor's "next" pointer.
1611 	 */
1612 	if (q_handle->q_previous != NULL) {
1613 		ddi_put32(qbuf->qb_buf.bi_handle,
1614 		    &q_handle->q_previous->branch, command_ptr);
1615 		/* Sync buffer again, this gets the command pointer */
1616 		(void) ddi_dma_sync(qbuf->qb_buf.bi_dma_handle, 0,
1617 		    qbuf->qb_buf.bi_length, DDI_DMA_SYNC_FORDEV);
1618 	}
1619 
1620 	/* this is the new previous descriptor.  Update the current pointer */
1621 	q_handle->q_previous = desc;
1622 	qbuf->qb_ptrs.qp_current += sizeof (hci1394_desc_t);
1623 
1624 	/* If the DMA is not running, start it */
1625 	if (q_handle->q_dma_running == B_FALSE) {
1626 		q_handle->q_info.qi_start(q_handle->q_info.qi_callback_arg,
1627 		    command_ptr);
1628 		q_handle->q_dma_running = B_TRUE;
1629 	/* the DMA is running, wake it up */
1630 	} else {
1631 		q_handle->q_info.qi_wake(q_handle->q_info.qi_callback_arg);
1632 	}
1633 }
1634