/* * RQ buffer constructor function * * rqbd - pointer to rq buffer descriptor * rq - pointer to RQ structure * size - size of the buffer * flags - KM_SLEEP OR KM_NOSLEEP * * return DDI_SUCCESS => success, DDI_FAILURE otherwise */ static int oce_rqb_ctor(oce_rq_bdesc_t *rqbd, struct oce_rq *rq, size_t size, int flags) { struct oce_dev *dev; oce_dma_buf_t *dbuf; dev = rq->parent; dbuf = oce_alloc_dma_buffer(dev, size, &oce_rx_buf_attr, flags); if (dbuf == NULL) { return (DDI_FAILURE); } /* Set the call back function parameters */ rqbd->fr_rtn.free_func = (void (*)())oce_rx_pool_free; rqbd->fr_rtn.free_arg = (caddr_t)(void *)rqbd; rqbd->mp = desballoc((uchar_t *)(dbuf->base), dbuf->size, 0, &rqbd->fr_rtn); if (rqbd->mp == NULL) { oce_free_dma_buffer(dev, dbuf); return (DDI_FAILURE); } rqbd->rqb = dbuf; rqbd->rq = rq; rqbd->frag_addr.dw.addr_lo = ADDR_LO(dbuf->addr + OCE_RQE_BUF_HEADROOM); rqbd->frag_addr.dw.addr_hi = ADDR_HI(dbuf->addr + OCE_RQE_BUF_HEADROOM); rqbd->mp->b_rptr = (uchar_t *)rqbd->rqb->base + OCE_RQE_BUF_HEADROOM; return (DDI_SUCCESS); } /* oce_rqb_ctor */
void oce_hw_fini(struct oce_dev *dev) { if (dev->bmbx != NULL) { oce_free_dma_buffer(dev, dev->bmbx); dev->bmbx = NULL; } }
/* * function to undo initialization done in oce_stat_init * * dev - software handle to the device * * return none */ void oce_stat_fini(struct oce_dev *dev) { oce_free_dma_buffer(dev, dev->stats_dbuf); dev->hw_stats = NULL; dev->stats_dbuf = NULL; kstat_delete(dev->oce_kstats); dev->oce_kstats = NULL; } /* oce_stat_fini */
/* * RQ buffer destructor function * * rqbd - pointer to rq buffer descriptor * * return none */ static void oce_rqb_dtor(oce_rq_bdesc_t *rqbd) { if ((rqbd == NULL) || (rqbd->rq == NULL)) { return; } if (rqbd->mp != NULL) { rqbd->fr_rtn.free_arg = NULL; freemsg(rqbd->mp); rqbd->mp = NULL; } oce_free_dma_buffer(rqbd->rq->parent, rqbd->rqb); } /* oce_rqb_dtor */
/* * function to destroy a ring buffer * * dev - software handle to teh device * ring - the ring buffer to delete * * return none */ void destroy_ring_buffer(struct oce_dev *dev, oce_ring_buffer_t *ring) { ASSERT(dev != NULL); ASSERT(ring != NULL); /* free the dbuf associated with the ring */ oce_free_dma_buffer(dev, ring->dbuf); ring->dbuf = NULL; /* free the ring itself */ kmem_free(ring, sizeof (oce_ring_buffer_t)); } /* destroy_ring_buffer */
/* * WQ buffer destructor * * wq - pointer to WQ structure * wqbd - pointer to WQ buffer descriptor * * return none */ static void oce_wqb_dtor(struct oce_wq *wq, oce_wq_bdesc_t *wqbd) { oce_free_dma_buffer(wq->parent, wqbd->wqb); }