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