oce_tx.c revision 5b9d3151a4426af9ad6ef2c2a178f13476b884b3
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * CDDL HEADER START
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * The contents of this file are subject to the terms of the
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * Common Development and Distribution License (the "License").
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * You may not use this file except in compliance with the License.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * or http://www.opensolaris.org/os/licensing.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * See the License for the specific language governing permissions
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * and limitations under the License.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * When distributing Covered Code, include this CDDL HEADER in each
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * If applicable, add the following below this CDDL HEADER, with the
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * fields enclosed by brackets "[]" replaced with your own identifying
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * information: Portions Copyright [yyyy] [name of copyright owner]
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * CDDL HEADER END
80e2ca8596e3435bc3b76f3c597833ea0a87f85e * Copyright 2010 Emulex. All rights reserved.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * Use is subject to license terms.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * Source file containing the implementation of the Transmit
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_free_wqed(struct oce_wq *wq, oce_wqe_desc_t *wqed);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic int oce_map_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic int oce_bcopy_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed, mblk_t *mp,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_wqb_dtor(struct oce_wq *wq, oce_wq_bdesc_t *wqbd);
80e2ca8596e3435bc3b76f3c597833ea0a87f85estatic int oce_wqb_ctor(oce_wq_bdesc_t *wqbd, struct oce_wq *wq,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic inline oce_wq_bdesc_t *oce_wqb_alloc(struct oce_wq *wq);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_wqb_free(struct oce_wq *wq, oce_wq_bdesc_t *wqbd);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_wqmd_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_wqm_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic oce_wq_mdesc_t *oce_wqm_alloc(struct oce_wq *wq);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic int oce_wqm_ctor(oce_wq_mdesc_t *wqmd, struct oce_wq *wq);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_wqm_dtor(struct oce_wq *wq, oce_wq_mdesc_t *wqmd);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_fill_ring_descs(struct oce_wq *wq, oce_wqe_desc_t *wqed);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic void oce_insert_vtag(mblk_t *mp, uint16_t vlan_tag);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic inline int oce_process_tx_compl(struct oce_wq *wq, boolean_t rearm);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner 0x0000000000010000ull, /* dma counter max */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner 0x00000000FFFFFFFFull, /* maximum transfer size */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner 0xFFFFFFFFFFFFFFFFull, /* maximum segment size */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner OCE_MAX_TXDMA_COOKIES, /* scatter/gather list length */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner 0x00000000FFFFFFFFull, /* dma counter max */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner 0x00000000FFFFFFFFull, /* maximum transfer size */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner 0xFFFFFFFFFFFFFFFFull, /* maximum segment size */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * WQ map handle destructor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - Pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqmd - pointer to WQE mapping handle descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqm_dtor(struct oce_wq *wq, oce_wq_mdesc_t *wqmd)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* Free the DMA handle */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner (void) ddi_dma_free_handle(&(wqmd->dma_handle));
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner} /* oce_wqm_dtor */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * WQ map handles contructor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqmd - pointer to WQE mapping handle descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - Pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return DDI_SUCCESS=>success, DDI_FAILURE=>error
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqm_ctor(oce_wq_mdesc_t *wqmd, struct oce_wq *wq)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* Allocate DMA handle */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner ret = ddi_dma_alloc_handle(dev->dip, &tx_map_dma_attr,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner DDI_DMA_DONTWAIT, NULL, &wqmd->dma_handle);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner} /* oce_wqm_ctor */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to create WQ mapping handles cache
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return DDI_SUCCESS=>success, DDI_FAILURE=>error
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner size = wq->cfg.nhdl * sizeof (oce_wq_mdesc_t);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wq->wq_mdesc_array = kmem_zalloc(size, KM_NOSLEEP);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* Create the free buffer list */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner OCE_LIST_CREATE(&wq->wq_mdesc_list, DDI_INTR_PRI(dev->intr_pri));
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner for (cnt = 0; cnt < wq->cfg.nhdl; cnt++) {
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner ret = oce_wqm_ctor(&wq->wq_mdesc_array[cnt], wq);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to destroy WQ mapping handles cache
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner while ((wqmd = OCE_LIST_REM_HEAD(&wq->wq_mdesc_list)) != NULL) {
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to create WQ buffer cache
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * buf_size - size of the buffer
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return DDI_SUCCESS=>success, DDI_FAILURE=>error
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqb_cache_create(struct oce_wq *wq, size_t buf_size)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner size = wq->cfg.nbufs * sizeof (oce_wq_bdesc_t);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wq->wq_bdesc_array = kmem_zalloc(size, KM_NOSLEEP);
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner /* Create the free buffer list */
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner OCE_LIST_CREATE(&wq->wq_buf_list, DDI_INTR_PRI(dev->intr_pri));
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner for (cnt = 0; cnt < wq->cfg.nbufs; cnt++) {
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner ret = oce_wqb_ctor(&wq->wq_bdesc_array[cnt],
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to destroy WQ buffer cache
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner while ((wqbd = OCE_LIST_REM_HEAD(&wq->wq_buf_list)) != NULL) {
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * WQ buffer constructor
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * wqbd - pointer to WQ buffer descriptor
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * wq - pointer to WQ structure
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * size - size of the buffer
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * flags - KM_SLEEP or KM_NOSLEEP
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * return DDI_SUCCESS=>success, DDI_FAILURE=>error
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkneroce_wqb_ctor(oce_wq_bdesc_t *wqbd, struct oce_wq *wq, size_t size, int flags)
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner wqbd->wqb = oce_alloc_dma_buffer(dev, size, &oce_tx_dma_buf_attr,
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner wqbd->frag_addr.dw.addr_lo = ADDR_LO(wqbd->wqb->addr);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wqbd->frag_addr.dw.addr_hi = ADDR_HI(wqbd->wqb->addr);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * WQ buffer destructor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqbd - pointer to WQ buffer descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqb_dtor(struct oce_wq *wq, oce_wq_bdesc_t *wqbd)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner oce_free_dma_buffer(wq->parent, wqbd->wqb);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to alloc WQE buffer descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return pointer to WQE buffer descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner return (OCE_LIST_REM_HEAD(&wq->wq_buf_list));
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to free WQE buffer descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqbd - pointer to WQ buffer descriptor
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulknerstatic inline void
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkneroce_wqb_free(struct oce_wq *wq, oce_wq_bdesc_t *wqbd)
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner OCE_LIST_INSERT_TAIL(&wq->wq_buf_list, wqbd);
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner} /* oce_wqb_free */
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * function to allocate WQE mapping descriptor
794f0adb050e571bbfde4d2a19b9f88b852079ddRoger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return pointer to WQE mapping descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner return (OCE_LIST_REM_HEAD(&wq->wq_mdesc_list));
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner} /* oce_wqm_alloc */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to insert WQE mapping descriptor to the list
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqmd - Pointer to WQ mapping descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulknerstatic inline void
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqm_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner OCE_LIST_INSERT_TAIL(&wq->wq_mdesc_list, wqmd);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to free WQE mapping descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ structure
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqmd - Pointer to WQ mapping descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqmd_free(struct oce_wq *wq, oce_wq_mdesc_t *wqmd)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner (void) ddi_dma_unbind_handle(wqmd->dma_handle);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * WQED kmem_cache constructor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * buf - pointer to WQE descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return DDI_SUCCESS
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_wqe_desc_ctor(void *buf, void *arg, int kmflags)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * WQED kmem_cache destructor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * buf - pointer to WQE descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to choose a WQ given a mblk depending on priority, flowID etc.
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * dev - software handle to device
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * mp - the mblk to send
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return pointer to the WQ selected
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_get_wq(struct oce_dev *dev, mblk_t *mp)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner qidx = mac_pkt_hash(DL_ETHER, mp, oce_tx_hash_policy, B_TRUE);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* for the time being hardcode */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner} /* oce_get_wq */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to populate the single WQE
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to wq
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqed - pointer to WQ entry descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_fill_ring_descs(struct oce_wq *wq, oce_wqe_desc_t *wqed)
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* Copy the precreate WQE descs to the ring desc */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner} /* oce_fill_ring_descs */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to copy the packet to preallocated Tx buffer
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqed - Pointer to WQE descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * mp - Pointer to packet chain
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * pktlen - Size of the packet
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return 0=>success, error code otherwise
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_bcopy_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed, mblk_t *mp,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner "wqb pool empty");
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* create a fragment wqe for the packet */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wqed->frag[wqed->frag_idx].u0.s.frag_pa_hi = wqbd->frag_addr.dw.addr_hi;
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wqed->frag[wqed->frag_idx].u0.s.frag_pa_lo = wqbd->frag_addr.dw.addr_lo;
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* copy pkt into buffer */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner for (len = 0; mp != NULL && len < pkt_len; mp = mp->b_cont) {
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner (void) ddi_dma_sync(DBUF_DHDL(wqbd->wqb), 0, pkt_len,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner if (oce_fm_check_dma_handle(dev, DBUF_DHDL(wqbd->wqb))) {
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner ddi_fm_service_impact(dev->dip, DDI_SERVICE_DEGRADED);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner /* Free the buffer */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wqed->frag[wqed->frag_idx].u0.s.frag_len = pkt_len;
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner wqed->hdesc[wqed->nhdl].hdl = (void *)(wqbd);
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner} /* oce_bcopy_wqe */
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * function to copy the packet or dma map on the fly depending on size
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wq - pointer to WQ
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * wqed - Pointer to WQE descriptor
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * mp - Pointer to packet chain
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner * return DDI_SUCCESS=>success, DDI_FAILURE=>error
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkneroce_map_wqe(struct oce_wq *wq, oce_wqe_desc_t *wqed, mblk_t *mp,
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner "wqm pool empty");
8fd04b8338ed5093ec2d1e668fa620b7de44c177Roger A. Faulkner ret = ddi_dma_addr_bind_handle(wqmd->dma_handle,
ret);
return (ENOMEM);
if (--ncookies > 0)
&cookie);
} while (ncookies > 0);
int wqe_freed = 0;
struct oce_nic_tx_cqe);
num_cqe++;
if (num_cqe)
return (num_cqe);
return (num_cqe);
mblk_t *
int num_mblks = 0;
int ret = 0;
int len = 0;
return (mp);
num_mblks++;
return (NULL);
return (NULL);
return (NULL);
if (len == 0) {
if (ret != 0)
if (ret != 0) {
return (NULL);
if (tagged) {
num_wqes++;
goto wqe_fail;
return (NULL);
if (tagged) {
return (mp);
#pragma inline(oce_free_wqed)
return (DDI_SUCCESS);
int ti;