1221167Sgnn/*-
2221167Sgnn * Copyright(c) 2002-2011 Exar Corp.
3221167Sgnn * All rights reserved.
4221167Sgnn *
5221167Sgnn * Redistribution and use in source and binary forms, with or without
6221167Sgnn * modification are permitted provided the following conditions are met:
7221167Sgnn *
8221167Sgnn *    1. Redistributions of source code must retain the above copyright notice,
9221167Sgnn *       this list of conditions and the following disclaimer.
10221167Sgnn *
11221167Sgnn *    2. Redistributions in binary form must reproduce the above copyright
12221167Sgnn *       notice, this list of conditions and the following disclaimer in the
13221167Sgnn *       documentation and/or other materials provided with the distribution.
14221167Sgnn *
15221167Sgnn *    3. Neither the name of the Exar Corporation nor the names of its
16221167Sgnn *       contributors may be used to endorse or promote products derived from
17221167Sgnn *       this software without specific prior written permission.
18221167Sgnn *
19221167Sgnn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20221167Sgnn * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21221167Sgnn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22221167Sgnn * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23221167Sgnn * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24221167Sgnn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25221167Sgnn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26221167Sgnn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27221167Sgnn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28221167Sgnn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29221167Sgnn * POSSIBILITY OF SUCH DAMAGE.
30221167Sgnn */
31221167Sgnn/*$FreeBSD: releng/10.2/sys/dev/vxge/vxgehal/vxgehal-channel.c 221167 2011-04-28 14:33:15Z gnn $*/
32221167Sgnn
33221167Sgnn#include <dev/vxge/vxgehal/vxgehal.h>
34221167Sgnn
35221167Sgnn
36221167Sgnn/*
37221167Sgnn * vxge_hal_channel_allocate - Allocate memory for channel
38221167Sgnn * @devh: Handle to the device object
39221167Sgnn * @vph: Handle to Virtual Path
40221167Sgnn * @type: Type of channel
41221167Sgnn * @length: Lengths of arrays
42221167Sgnn * @per_dtr_space: ULD requested per dtr space to be allocated in priv
43221167Sgnn * @userdata: User data to be passed back in the callback
44221167Sgnn *
45221167Sgnn * This function allocates required memory for the channel and various arrays
46221167Sgnn * in the channel
47221167Sgnn */
48221167Sgnn__hal_channel_t *
49221167Sgnnvxge_hal_channel_allocate(
50221167Sgnn    vxge_hal_device_h devh,
51221167Sgnn    vxge_hal_vpath_h vph,
52221167Sgnn    __hal_channel_type_e type,
53221167Sgnn    u32 length,
54221167Sgnn    u32 per_dtr_space,
55221167Sgnn    void *userdata)
56221167Sgnn{
57221167Sgnn	vxge_hal_device_t *hldev = (vxge_hal_device_t *) devh;
58221167Sgnn	__hal_channel_t *channel;
59221167Sgnn	u32 i, size = 0;
60221167Sgnn
61221167Sgnn	vxge_assert((devh != NULL) && (vph != NULL));
62221167Sgnn
63221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
64221167Sgnn	    __FILE__, __func__, __LINE__);
65221167Sgnn
66221167Sgnn	vxge_hal_trace_log_channel("devh = 0x"VXGE_OS_STXFMT", vph = "
67221167Sgnn	    "0x"VXGE_OS_STXFMT", type = %d, length = %d, "
68221167Sgnn	    "per_dtr_space = %d, userdata = 0x"VXGE_OS_STXFMT,
69221167Sgnn	    (ptr_t) devh, (ptr_t) vph, type, length, per_dtr_space,
70221167Sgnn	    (ptr_t) userdata);
71221167Sgnn
72221167Sgnn	switch (type) {
73221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_FIFO:
74221167Sgnn		size = sizeof(__hal_fifo_t);
75221167Sgnn		break;
76221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_RING:
77221167Sgnn		size = sizeof(__hal_ring_t);
78221167Sgnn		break;
79221167Sgnn
80221167Sgnn
81221167Sgnn	default:
82221167Sgnn		vxge_assert(size);
83221167Sgnn		break;
84221167Sgnn
85221167Sgnn	}
86221167Sgnn
87221167Sgnn	channel = (__hal_channel_t *) vxge_os_malloc(hldev->pdev, size);
88221167Sgnn	if (channel == NULL) {
89221167Sgnn		vxge_hal_trace_log_channel("<== %s:%s:%d  Result: %d",
90221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_OUT_OF_MEMORY);
91221167Sgnn		return (NULL);
92221167Sgnn	}
93221167Sgnn
94221167Sgnn	vxge_os_memzero(channel, size);
95221167Sgnn	vxge_list_init(&channel->item);
96221167Sgnn
97221167Sgnn	channel->pdev = hldev->pdev;
98221167Sgnn	channel->type = type;
99221167Sgnn	channel->devh = devh;
100221167Sgnn	channel->vph = vph;
101221167Sgnn
102221167Sgnn	channel->userdata = userdata;
103221167Sgnn	channel->per_dtr_space = per_dtr_space;
104221167Sgnn
105221167Sgnn	channel->length = length;
106221167Sgnn
107221167Sgnn	channel->dtr_arr = (__hal_dtr_item_t *) vxge_os_malloc(hldev->pdev,
108221167Sgnn	    sizeof(__hal_dtr_item_t)*length);
109221167Sgnn	if (channel->dtr_arr == NULL) {
110221167Sgnn		vxge_hal_channel_free(channel);
111221167Sgnn		vxge_hal_trace_log_channel("<== %s:%s:%d  Result: %d",
112221167Sgnn		    __FILE__, __func__, __LINE__, VXGE_HAL_ERR_OUT_OF_MEMORY);
113221167Sgnn		return (NULL);
114221167Sgnn	}
115221167Sgnn
116221167Sgnn	vxge_os_memzero(channel->dtr_arr, sizeof(__hal_dtr_item_t)*length);
117221167Sgnn
118221167Sgnn	channel->compl_index = 0;
119221167Sgnn	channel->reserve_index = 0;
120221167Sgnn
121221167Sgnn	for (i = 0; i < length; i++)
122221167Sgnn		channel->dtr_arr[i].state = VXGE_HAL_CHANNEL_DTR_FREE;
123221167Sgnn
124221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
125221167Sgnn	    __FILE__, __func__, __LINE__);
126221167Sgnn	return (channel);
127221167Sgnn}
128221167Sgnn
129221167Sgnn/*
130221167Sgnn * __hal_channel_free - Free memory allocated for channel
131221167Sgnn * @channel: channel to be freed
132221167Sgnn *
133221167Sgnn * This function deallocates memory from the channel and various arrays
134221167Sgnn * in the channel
135221167Sgnn */
136221167Sgnnvoid
137221167Sgnnvxge_hal_channel_free(
138221167Sgnn    __hal_channel_t *channel)
139221167Sgnn{
140221167Sgnn	int size = 0;
141221167Sgnn	vxge_hal_device_t *hldev;
142221167Sgnn
143221167Sgnn	vxge_assert(channel != NULL);
144221167Sgnn
145221167Sgnn	hldev = (vxge_hal_device_t *) channel->devh;
146221167Sgnn
147221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
148221167Sgnn	    __FILE__, __func__, __LINE__);
149221167Sgnn
150221167Sgnn	vxge_hal_trace_log_channel("channel = 0x"VXGE_OS_STXFMT,
151221167Sgnn	    (ptr_t) channel);
152221167Sgnn
153221167Sgnn	vxge_assert(channel->pdev);
154221167Sgnn
155221167Sgnn	if (channel->dtr_arr) {
156221167Sgnn		vxge_os_free(channel->pdev, channel->dtr_arr,
157221167Sgnn		    sizeof(__hal_dtr_item_t)*channel->length);
158221167Sgnn		channel->dtr_arr = NULL;
159221167Sgnn	}
160221167Sgnn
161221167Sgnn	switch (channel->type) {
162221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_FIFO:
163221167Sgnn		size = sizeof(__hal_fifo_t);
164221167Sgnn		break;
165221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_RING:
166221167Sgnn		size = sizeof(__hal_ring_t);
167221167Sgnn		break;
168221167Sgnn	default:
169221167Sgnn		break;
170221167Sgnn	}
171221167Sgnn
172221167Sgnn	vxge_os_free(channel->pdev, channel, size);
173221167Sgnn
174221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
175221167Sgnn	    __FILE__, __func__, __LINE__);
176221167Sgnn}
177221167Sgnn
178221167Sgnn/*
179221167Sgnn * __hal_channel_initialize - Initialize a channel
180221167Sgnn * @channel: channel to be initialized
181221167Sgnn *
182221167Sgnn * This function initializes a channel by properly
183221167Sgnn *		setting the various references
184221167Sgnn */
185221167Sgnnvxge_hal_status_e
186221167Sgnnvxge_hal_channel_initialize(
187221167Sgnn    __hal_channel_t *channel)
188221167Sgnn{
189221167Sgnn	vxge_hal_device_t *hldev;
190221167Sgnn	__hal_virtualpath_t *vpath;
191221167Sgnn
192221167Sgnn	vxge_assert(channel != NULL);
193221167Sgnn
194221167Sgnn	hldev = (vxge_hal_device_t *) channel->devh;
195221167Sgnn	vpath = (__hal_virtualpath_t *)
196221167Sgnn	    ((__hal_vpath_handle_t *) channel->vph)->vpath;
197221167Sgnn
198221167Sgnn	vxge_assert(vpath != NULL);
199221167Sgnn
200221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
201221167Sgnn	    __FILE__, __func__, __LINE__);
202221167Sgnn
203221167Sgnn	vxge_hal_trace_log_channel("channel = 0x"VXGE_OS_STXFMT,
204221167Sgnn	    (ptr_t) channel);
205221167Sgnn
206221167Sgnn	switch (channel->type) {
207221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_FIFO:
208221167Sgnn		vpath->fifoh = (vxge_hal_fifo_h) channel;
209221167Sgnn		channel->stats =
210221167Sgnn		    &((__hal_fifo_t *) channel)->stats->common_stats;
211221167Sgnn		break;
212221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_RING:
213221167Sgnn		vpath->ringh = (vxge_hal_ring_h) channel;
214221167Sgnn		channel->stats =
215221167Sgnn		    &((__hal_ring_t *) channel)->stats->common_stats;
216221167Sgnn		break;
217221167Sgnn
218221167Sgnn
219221167Sgnn	default:
220221167Sgnn		break;
221221167Sgnn	}
222221167Sgnn
223221167Sgnn	channel->is_initd = 1;
224221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
225221167Sgnn	    __FILE__, __func__, __LINE__);
226221167Sgnn
227221167Sgnn	return (VXGE_HAL_OK);
228221167Sgnn}
229221167Sgnn
230221167Sgnn/*
231221167Sgnn * __hal_channel_reset - Resets a channel
232221167Sgnn * @channel: channel to be reset
233221167Sgnn *
234221167Sgnn * This function resets a channel by properly setting the various references
235221167Sgnn */
236221167Sgnnvxge_hal_status_e
237221167Sgnn__hal_channel_reset(
238221167Sgnn    __hal_channel_t *channel)
239221167Sgnn{
240221167Sgnn	u32 i;
241221167Sgnn	__hal_device_t *hldev;
242221167Sgnn
243221167Sgnn	vxge_assert(channel != NULL);
244221167Sgnn
245221167Sgnn	hldev = (__hal_device_t *) channel->devh;
246221167Sgnn
247221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
248221167Sgnn	    __FILE__, __func__, __LINE__);
249221167Sgnn
250221167Sgnn	vxge_hal_trace_log_channel("channel = 0x"VXGE_OS_STXFMT,
251221167Sgnn	    (ptr_t) channel);
252221167Sgnn
253221167Sgnn	vxge_assert(channel->pdev);
254221167Sgnn
255221167Sgnn	channel->compl_index = 0;
256221167Sgnn	channel->reserve_index = 0;
257221167Sgnn
258221167Sgnn	for (i = 0; i < channel->length; i++) {
259221167Sgnn		channel->dtr_arr[i].state =
260221167Sgnn		    VXGE_HAL_CHANNEL_DTR_FREE;
261221167Sgnn	}
262221167Sgnn
263221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
264221167Sgnn	    __FILE__, __func__, __LINE__);
265221167Sgnn
266221167Sgnn	return (VXGE_HAL_OK);
267221167Sgnn}
268221167Sgnn
269221167Sgnn/*
270221167Sgnn * vxge_hal_channel_terminate - Deinitializes a channel
271221167Sgnn * @channel: channel to be deinitialized
272221167Sgnn *
273221167Sgnn * This function deinitializes a channel by properly
274221167Sgnn *		setting the various references
275221167Sgnn */
276221167Sgnnvoid
277221167Sgnnvxge_hal_channel_terminate(
278221167Sgnn    __hal_channel_t *channel)
279221167Sgnn{
280221167Sgnn	__hal_device_t *hldev;
281221167Sgnn	__hal_virtualpath_t *vpath;
282221167Sgnn
283221167Sgnn	vxge_assert(channel != NULL);
284221167Sgnn
285221167Sgnn	if (!channel || !channel->is_initd)
286221167Sgnn		return;
287221167Sgnn
288221167Sgnn	hldev = (__hal_device_t *) channel->devh;
289221167Sgnn	vpath = (__hal_virtualpath_t *)
290221167Sgnn	    ((__hal_vpath_handle_t *) channel->vph)->vpath;
291221167Sgnn
292221167Sgnn	vxge_assert(vpath != NULL);
293221167Sgnn
294221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
295221167Sgnn	    __FILE__, __func__, __LINE__);
296221167Sgnn
297221167Sgnn	vxge_hal_trace_log_channel("channel = 0x"VXGE_OS_STXFMT,
298221167Sgnn	    (ptr_t) channel);
299221167Sgnn
300221167Sgnn	switch (channel->type) {
301221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_FIFO:
302221167Sgnn		vpath->fifoh = 0;
303221167Sgnn		break;
304221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_RING:
305221167Sgnn		vpath->ringh = 0;
306221167Sgnn		break;
307221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_SEND_QUEUE:
308221167Sgnn		vxge_list_remove(&channel->item);
309221167Sgnn		vpath->sw_stats->obj_counts.no_sqs--;
310221167Sgnn		break;
311221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_RECEIVE_QUEUE:
312221167Sgnn		vxge_list_remove(&channel->item);
313221167Sgnn		vpath->sw_stats->obj_counts.no_srqs--;
314221167Sgnn		break;
315221167Sgnn	case VXGE_HAL_CHANNEL_TYPE_COMPLETION_QUEUE:
316221167Sgnn		vxge_list_remove(&channel->item);
317221167Sgnn		vpath->sw_stats->obj_counts.no_cqrqs--;
318221167Sgnn		break;
319221167Sgnn	default:
320221167Sgnn		break;
321221167Sgnn	}
322221167Sgnn
323221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
324221167Sgnn	    __FILE__, __func__, __LINE__);
325221167Sgnn}
326221167Sgnn
327221167Sgnnvoid
328221167Sgnn__hal_channel_init_pending_list(
329221167Sgnn    vxge_hal_device_h devh)
330221167Sgnn{
331221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
332221167Sgnn
333221167Sgnn	vxge_assert(devh != NULL);
334221167Sgnn
335221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
336221167Sgnn	    __FILE__, __func__, __LINE__);
337221167Sgnn
338221167Sgnn	vxge_hal_trace_log_channel("devh = 0x"VXGE_OS_STXFMT,
339221167Sgnn	    (ptr_t) devh);
340221167Sgnn	vxge_list_init(&hldev->pending_channel_list);
341221167Sgnn
342221167Sgnn#if defined(VXGE_HAL_VP_CHANNELS)
343221167Sgnn	vxge_os_spin_lock_init(&hldev->pending_channel_lock, hldev->pdev);
344221167Sgnn#elif defined(VXGE_HAL_VP_CHANNELS_IRQ)
345221167Sgnn	vxge_os_spin_lock_init_irq(&hldev->pending_channel_lock, hldev->irqh);
346221167Sgnn#endif
347221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
348221167Sgnn	    __FILE__, __func__, __LINE__);
349221167Sgnn}
350221167Sgnn
351221167Sgnnvoid
352221167Sgnn__hal_channel_insert_pending_list(
353221167Sgnn    __hal_channel_t * channel)
354221167Sgnn{
355221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) channel->devh;
356221167Sgnn
357221167Sgnn	vxge_assert(channel != NULL);
358221167Sgnn
359221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
360221167Sgnn	    __FILE__, __func__, __LINE__);
361221167Sgnn
362221167Sgnn	vxge_hal_trace_log_channel("channel = 0x"VXGE_OS_STXFMT,
363221167Sgnn	    (ptr_t) channel);
364221167Sgnn
365221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
366221167Sgnn	vxge_os_spin_lock(&hldev->pending_channel_lock);
367221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
368221167Sgnn	vxge_os_spin_lock_irq(&hldev->pending_channel_lock, flags);
369221167Sgnn#endif
370221167Sgnn
371221167Sgnn	vxge_list_insert_before(&channel->item, &hldev->pending_channel_list);
372221167Sgnn
373221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
374221167Sgnn	vxge_os_spin_unlock(&hldev->pending_channel_lock);
375221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
376221167Sgnn	vxge_os_spin_unlock_irq(&hldev->pending_channel_lock, flags);
377221167Sgnn#endif
378221167Sgnn
379221167Sgnn	__hal_channel_process_pending_list(channel->devh);
380221167Sgnn
381221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
382221167Sgnn	    __FILE__, __func__, __LINE__);
383221167Sgnn}
384221167Sgnn
385221167Sgnnvoid
386221167Sgnn__hal_channel_process_pending_list(
387221167Sgnn    vxge_hal_device_h devh)
388221167Sgnn{
389221167Sgnn	vxge_hal_status_e status;
390221167Sgnn	__hal_channel_t *channel;
391221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
392221167Sgnn
393221167Sgnn	vxge_assert(devh != NULL);
394221167Sgnn
395221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
396221167Sgnn	    __FILE__, __func__, __LINE__);
397221167Sgnn
398221167Sgnn	vxge_hal_trace_log_channel("devh = 0x"VXGE_OS_STXFMT,
399221167Sgnn	    (ptr_t) devh);
400221167Sgnn
401221167Sgnn	for (;;) {
402221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
403221167Sgnn		vxge_os_spin_lock(&hldev->pending_channel_lock);
404221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
405221167Sgnn		vxge_os_spin_lock_irq(&hldev->pending_channel_lock, flags);
406221167Sgnn#endif
407221167Sgnn
408221167Sgnn		channel = (__hal_channel_t *)
409221167Sgnn		    vxge_list_first_get(&hldev->pending_channel_list);
410221167Sgnn
411221167Sgnn		if (channel != NULL)
412221167Sgnn			vxge_list_remove(&channel->item);
413221167Sgnn
414221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
415221167Sgnn		vxge_os_spin_unlock(&hldev->pending_channel_lock);
416221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
417221167Sgnn		vxge_os_spin_unlock_irq(&hldev->pending_channel_lock, flags);
418221167Sgnn#endif
419221167Sgnn
420221167Sgnn		if (channel == NULL) {
421221167Sgnn			vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
422221167Sgnn			    __FILE__, __func__, __LINE__);
423221167Sgnn			return;
424221167Sgnn		}
425221167Sgnn
426221167Sgnn		switch (channel->type) {
427221167Sgnn		default:
428221167Sgnn			status = VXGE_HAL_OK;
429221167Sgnn			break;
430221167Sgnn		}
431221167Sgnn
432221167Sgnn		if (status == VXGE_HAL_ERR_OUT_OF_MEMORY) {
433221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
434221167Sgnn			vxge_os_spin_lock(&hldev->pending_channel_lock);
435221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
436221167Sgnn			vxge_os_spin_lock_irq(&hldev->pending_channel_lock,
437221167Sgnn			    flags);
438221167Sgnn#endif
439221167Sgnn
440221167Sgnn			vxge_list_insert(&channel->item,
441221167Sgnn			    &hldev->pending_channel_list);
442221167Sgnn
443221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
444221167Sgnn			vxge_os_spin_unlock(&hldev->pending_channel_lock);
445221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
446221167Sgnn			vxge_os_spin_unlock_irq(&hldev->pending_channel_lock,
447221167Sgnn			    flags);
448221167Sgnn#endif
449221167Sgnn			vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
450221167Sgnn			    __FILE__, __func__, __LINE__);
451221167Sgnn
452221167Sgnn			return;
453221167Sgnn		}
454221167Sgnn
455221167Sgnn	}
456221167Sgnn}
457221167Sgnn
458221167Sgnnvoid
459221167Sgnn__hal_channel_destroy_pending_list(
460221167Sgnn    vxge_hal_device_h devh)
461221167Sgnn{
462221167Sgnn	vxge_list_t *p, *n;
463221167Sgnn	__hal_device_t *hldev = (__hal_device_t *) devh;
464221167Sgnn
465221167Sgnn	vxge_assert(devh != NULL);
466221167Sgnn
467221167Sgnn	vxge_hal_trace_log_channel("==> %s:%s:%d",
468221167Sgnn	    __FILE__, __func__, __LINE__);
469221167Sgnn
470221167Sgnn	vxge_hal_trace_log_channel("devh = 0x"VXGE_OS_STXFMT,
471221167Sgnn	    (ptr_t) devh);
472221167Sgnn
473221167Sgnn	vxge_list_for_each_safe(p, n, &hldev->pending_channel_list) {
474221167Sgnn
475221167Sgnn		vxge_list_remove(p);
476221167Sgnn
477221167Sgnn		switch (((__hal_channel_t *) p)->type) {
478221167Sgnn		default:
479221167Sgnn			break;
480221167Sgnn		}
481221167Sgnn
482221167Sgnn	}
483221167Sgnn
484221167Sgnn#if defined(VXGE_HAL_PENDING_CHANNELS)
485221167Sgnn	vxge_os_spin_lock_destroy(&hldev->pending_channel_lock,
486221167Sgnn	    hldev->header.pdev);
487221167Sgnn#elif defined(VXGE_HAL_PENDING_CHANNELS_IRQ)
488221167Sgnn	vxge_os_spin_lock_destroy_irq(&hldev->pending_channel_lock,
489221167Sgnn	    hldev->header.pdev);
490221167Sgnn#endif
491221167Sgnn	vxge_hal_trace_log_channel("<== %s:%s:%d  Result: 0",
492221167Sgnn	    __FILE__, __func__, __LINE__);
493221167Sgnn}
494