/* * __hal_rxd_db_post - Post rxd doorbell * * @vpath_handle: vpath handle * @num_bytes: The number of bytes * * This function posts a rxd doorbell * */ void __hal_rxd_db_post(vxge_hal_vpath_h vpath_handle, u32 num_bytes) { __hal_device_t *hldev; __hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle; vxge_assert(vpath_handle != NULL); hldev = (__hal_device_t *) vp->vpath->hldev; vxge_hal_trace_log_ring("==> %s:%s:%d", __FILE__, __func__, __LINE__); vxge_hal_trace_log_fifo( "vpath_handle = 0x"VXGE_OS_STXFMT", num_bytes = %d", (ptr_t) vpath_handle, num_bytes); vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, vp->vpath->hldev->header.regh0, VXGE_HAL_PRC_RXD_DOORBELL_NEW_QW_CNT((num_bytes >> 3)), &vp->vpath->vp_reg->prc_rxd_doorbell); vxge_hal_trace_log_ring("<== %s:%s:%d Result: 0", __FILE__, __func__, __LINE__); }
/* * __hal_ring_item_dma_offset - Return the dma offset of an item * @mempoolh: Handle to the memory pool of the ring * @item: Item for which to get the dma offset * * This function returns the dma offset of a given item */ static ptrdiff_t __hal_ring_item_dma_offset( vxge_hal_mempool_h mempoolh, void *item) { u32 memblock_idx; void *memblock; vxge_hal_mempool_t *mempool = (vxge_hal_mempool_t *) mempoolh; __hal_device_t *hldev; vxge_assert((mempoolh != NULL) && (item != NULL) && (dma_handle != NULL)); hldev = (__hal_device_t *) mempool->devh; vxge_hal_trace_log_ring("==> %s:%s:%d", __FILE__, __func__, __LINE__); vxge_hal_trace_log_ring( "mempoolh = 0x"VXGE_OS_STXFMT", item = 0x"VXGE_OS_STXFMT, (ptr_t) mempoolh, (ptr_t) item); /* get owner memblock index */ memblock_idx = __hal_ring_block_memblock_idx(item); /* get owner memblock by memblock index */ memblock = __hal_mempool_memblock(mempoolh, memblock_idx); vxge_hal_trace_log_ring("<== %s:%s:%d Result: 0", __FILE__, __func__, __LINE__); return ((u8 *) item - (u8 *) memblock); }
/* * __hal_ring_item_dma_addr - Return the dma address of an item * @mempoolh: Handle to the memory pool of the ring * @item: Item for which to get the dma offset * @dma_handle: dma handle * * This function returns the dma address of a given item */ static dma_addr_t __hal_ring_item_dma_addr( vxge_hal_mempool_h mempoolh, void *item, pci_dma_h *dma_handle) { u32 memblock_idx; void *memblock; vxge_hal_mempool_dma_t *memblock_dma_object; vxge_hal_mempool_t *mempool = (vxge_hal_mempool_t *) mempoolh; __hal_device_t *hldev; ptrdiff_t dma_item_offset; vxge_assert((mempoolh != NULL) && (item != NULL) && (dma_handle != NULL)); hldev = (__hal_device_t *) mempool->devh; vxge_hal_trace_log_ring("==> %s:%s:%d", __FILE__, __func__, __LINE__); vxge_hal_trace_log_ring( "mempoolh = 0x"VXGE_OS_STXFMT", item = 0x"VXGE_OS_STXFMT", " "dma_handle = 0x"VXGE_OS_STXFMT, (ptr_t) mempoolh, (ptr_t) item, (ptr_t) dma_handle); /* get owner memblock index */ memblock_idx = __hal_ring_block_memblock_idx((u8 *) item); /* get owner memblock by memblock index */ memblock = __hal_mempool_memblock( (vxge_hal_mempool_t *) mempoolh, memblock_idx); /* get memblock DMA object by memblock index */ memblock_dma_object = __hal_mempool_memblock_dma( (vxge_hal_mempool_t *) mempoolh, memblock_idx); /* calculate offset in the memblock of this item */ /* LINTED */ dma_item_offset = (u8 *) item - (u8 *) memblock; *dma_handle = memblock_dma_object->handle; vxge_hal_trace_log_ring("<== %s:%s:%d Result: 0", __FILE__, __func__, __LINE__); return (memblock_dma_object->addr + dma_item_offset); }
/* * __hal_ring_initial_replenish - Initial replenish of RxDs * @ring: ring * @reopen: Flag to denote if it is open or repopen * * This function replenishes the RxDs from reserve array to work array */ static vxge_hal_status_e __hal_ring_initial_replenish( __hal_ring_t *ring, vxge_hal_reopen_e reopen) { vxge_hal_rxd_h rxd; void *uld_priv; __hal_device_t *hldev; vxge_hal_status_e status; vxge_assert(ring != NULL); hldev = (__hal_device_t *) ring->channel.devh; vxge_hal_trace_log_ring("==> %s:%s:%d", __FILE__, __func__, __LINE__); vxge_hal_trace_log_ring("ring = 0x"VXGE_OS_STXFMT", reopen = %d", (ptr_t) ring, reopen); while (vxge_hal_ring_rxd_reserve(ring->channel.vph, &rxd, &uld_priv) == VXGE_HAL_OK) { if (ring->rxd_init) { status = ring->rxd_init(ring->channel.vph, rxd, uld_priv, VXGE_HAL_RING_RXD_INDEX(rxd), ring->channel.userdata, reopen); if (status != VXGE_HAL_OK) { vxge_hal_ring_rxd_free(ring->channel.vph, rxd); vxge_hal_trace_log_ring("<== %s:%s:%d \ Result: %d", __FILE__, __func__, __LINE__, status); return (status); } }
/* * __hal_ring_rxdblock_link - Link the RxD blocks * @mempoolh: Handle to the memory pool of the ring * @ring: ring * @from: RxD block from which to link * @to: RxD block to which to link to * * This function returns the dma address of a given item */ static void __hal_ring_rxdblock_link( vxge_hal_mempool_h mempoolh, __hal_ring_t *ring, u32 from, u32 to) { vxge_hal_ring_block_t *to_item, *from_item; dma_addr_t to_dma, from_dma; pci_dma_h to_dma_handle, from_dma_handle; __hal_device_t *hldev; vxge_assert((mempoolh != NULL) && (ring != NULL)); hldev = (__hal_device_t *) ring->channel.devh; vxge_hal_trace_log_ring("==> %s:%s:%d", __FILE__, __func__, __LINE__); vxge_hal_trace_log_ring( "mempoolh = 0x"VXGE_OS_STXFMT", ring = 0x"VXGE_OS_STXFMT", " "from = %d, to = %d", (ptr_t) mempoolh, (ptr_t) ring, from, to); /* get "from" RxD block */ from_item = (vxge_hal_ring_block_t *) __hal_mempool_item( (vxge_hal_mempool_t *) mempoolh, from); vxge_assert(from_item); /* get "to" RxD block */ to_item = (vxge_hal_ring_block_t *) __hal_mempool_item( (vxge_hal_mempool_t *) mempoolh, to); vxge_assert(to_item); /* return address of the beginning of previous RxD block */ to_dma = __hal_ring_item_dma_addr(mempoolh, to_item, &to_dma_handle); /* * set next pointer for this RxD block to point on * previous item's DMA start address */ __hal_ring_block_next_pointer_set(from_item, to_dma); /* return "from" RxD block's DMA start address */ from_dma = __hal_ring_item_dma_addr( mempoolh, from_item, &from_dma_handle); #if defined(VXGE_OS_DMA_REQUIRES_SYNC) && defined(VXGE_HAL_DMA_RXD_STREAMING) /* we must sync "from" RxD block, so hardware will see it */ vxge_os_dma_sync(ring->channel.pdev, from_dma_handle, from_dma + VXGE_HAL_RING_NEXT_BLOCK_POINTER_OFFSET, __hal_ring_item_dma_offset(mempoolh, from_item) + VXGE_HAL_RING_NEXT_BLOCK_POINTER_OFFSET, sizeof(u64), VXGE_OS_DMA_DIR_TODEVICE); #endif vxge_hal_info_log_ring( "block%d:0x"VXGE_OS_STXFMT" => block%d:0x"VXGE_OS_STXFMT, from, (ptr_t) from_dma, to, (ptr_t) to_dma); vxge_hal_trace_log_ring("<== %s:%s:%d Result: 0", __FILE__, __func__, __LINE__); }