1/* 2 * Generic Broadcom Home Networking Division (HND) DMA engine SW interface 3 * This supports the following chips: BCM42xx, 44xx, 47xx . 4 * 5 * Copyright 2007, Broadcom Corporation 6 * All Rights Reserved. 7 * 8 * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY 9 * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM 10 * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS 11 * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE. 12 * $Id: hnddma.h,v 1.1.1.1 2008/10/15 03:25:54 james26_jang Exp $ 13 */ 14 15#ifndef _hnddma_h_ 16#define _hnddma_h_ 17 18typedef const struct hnddma_pub hnddma_t; 19 20/* dma function type */ 21typedef void (*di_detach_t)(hnddma_t *dmah); 22typedef bool (*di_txreset_t)(hnddma_t *dmah); 23typedef bool (*di_rxreset_t)(hnddma_t *dmah); 24typedef bool (*di_rxidle_t)(hnddma_t *dmah); 25typedef void (*di_txinit_t)(hnddma_t *dmah); 26typedef bool (*di_txenabled_t)(hnddma_t *dmah); 27typedef void (*di_rxinit_t)(hnddma_t *dmah); 28typedef void (*di_txsuspend_t)(hnddma_t *dmah); 29typedef void (*di_txresume_t)(hnddma_t *dmah); 30typedef bool (*di_txsuspended_t)(hnddma_t *dmah); 31typedef bool (*di_txsuspendedidle_t)(hnddma_t *dmah); 32typedef int (*di_txfast_t)(hnddma_t *dmah, void *p, bool commit); 33typedef void (*di_fifoloopbackenable_t)(hnddma_t *dmah); 34typedef bool (*di_txstopped_t)(hnddma_t *dmah); 35typedef bool (*di_rxstopped_t)(hnddma_t *dmah); 36typedef bool (*di_rxenable_t)(hnddma_t *dmah); 37typedef bool (*di_rxenabled_t)(hnddma_t *dmah); 38typedef void* (*di_rx_t)(hnddma_t *dmah); 39typedef void (*di_rxfill_t)(hnddma_t *dmah); 40typedef void (*di_txreclaim_t)(hnddma_t *dmah, bool forceall); 41typedef void (*di_rxreclaim_t)(hnddma_t *dmah); 42typedef uintptr (*di_getvar_t)(hnddma_t *dmah, const char *name); 43typedef void* (*di_getnexttxp_t)(hnddma_t *dmah, bool forceall); 44typedef void* (*di_getnextrxp_t)(hnddma_t *dmah, bool forceall); 45typedef void* (*di_peeknexttxp_t)(hnddma_t *dmah); 46typedef void (*di_txblock_t)(hnddma_t *dmah); 47typedef void (*di_txunblock_t)(hnddma_t *dmah); 48typedef uint (*di_txactive_t)(hnddma_t *dmah); 49typedef void (*di_txrotate_t)(hnddma_t *dmah); 50typedef void (*di_counterreset_t)(hnddma_t *dmah); 51typedef char* (*di_dump_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring); 52typedef char* (*di_dumptx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring); 53typedef char* (*di_dumprx_t)(hnddma_t *dmah, struct bcmstrbuf *b, bool dumpring); 54 55/* dma opsvec */ 56typedef struct di_fcn_s { 57 di_detach_t detach; 58 di_txinit_t txinit; 59 di_txreset_t txreset; 60 di_txenabled_t txenabled; 61 di_txsuspend_t txsuspend; 62 di_txresume_t txresume; 63 di_txsuspended_t txsuspended; 64 di_txsuspendedidle_t txsuspendedidle; 65 di_txfast_t txfast; 66 di_txstopped_t txstopped; 67 di_txreclaim_t txreclaim; 68 di_getnexttxp_t getnexttxp; 69 di_peeknexttxp_t peeknexttxp; 70 di_txblock_t txblock; 71 di_txunblock_t txunblock; 72 di_txactive_t txactive; 73 di_txrotate_t txrotate; 74 75 di_rxinit_t rxinit; 76 di_rxreset_t rxreset; 77 di_rxidle_t rxidle; 78 di_rxstopped_t rxstopped; 79 di_rxenable_t rxenable; 80 di_rxenabled_t rxenabled; 81 di_rx_t rx; 82 di_rxfill_t rxfill; 83 di_rxreclaim_t rxreclaim; 84 di_getnextrxp_t getnextrxp; 85 86 di_fifoloopbackenable_t fifoloopbackenable; 87 di_getvar_t d_getvar; 88 di_counterreset_t counterreset; 89 di_dump_t dump; 90 di_dumptx_t dumptx; 91 di_dumprx_t dumprx; 92 uint endnum; 93} di_fcn_t; 94 95/* 96 * Exported data structure (read-only) 97 */ 98/* export structure */ 99struct hnddma_pub { 100 di_fcn_t di_fn; /* DMA function pointers */ 101 uint txavail; /* # free tx descriptors */ 102 103 /* rx error counters */ 104 uint rxgiants; /* rx giant frames */ 105 uint rxnobuf; /* rx out of dma descriptors */ 106 /* tx error counters */ 107 uint txnobuf; /* tx out of dma descriptors */ 108}; 109 110 111extern hnddma_t * dma_attach(osl_t *osh, char *name, sb_t *sbh, void *dmaregstx, void *dmaregsrx, 112 uint ntxd, uint nrxd, uint rxbufsize, uint nrxpost, uint rxoffset, 113 uint *msg_level); 114#define dma_detach(di) ((di)->di_fn.detach(di)) 115#define dma_txreset(di) ((di)->di_fn.txreset(di)) 116#define dma_rxreset(di) ((di)->di_fn.rxreset(di)) 117#define dma_rxidle(di) ((di)->di_fn.rxidle(di)) 118#define dma_txinit(di) ((di)->di_fn.txinit(di)) 119#define dma_txenabled(di) ((di)->di_fn.txenabled(di)) 120#define dma_rxinit(di) ((di)->di_fn.rxinit(di)) 121#define dma_txsuspend(di) ((di)->di_fn.txsuspend(di)) 122#define dma_txresume(di) ((di)->di_fn.txresume(di)) 123#define dma_txsuspended(di) ((di)->di_fn.txsuspended(di)) 124#define dma_txsuspendedidle(di) ((di)->di_fn.txsuspendedidle(di)) 125#define dma_txfast(di, p, commit) ((di)->di_fn.txfast(di, p, commit)) 126#define dma_fifoloopbackenable(di) ((di)->di_fn.fifoloopbackenable(di)) 127#define dma_txstopped(di) ((di)->di_fn.txstopped(di)) 128#define dma_rxstopped(di) ((di)->di_fn.rxstopped(di)) 129#define dma_rxenable(di) ((di)->di_fn.rxenable(di)) 130#define dma_rxenabled(di) ((di)->di_fn.rxenabled(di)) 131#define dma_rx(di) ((di)->di_fn.rx(di)) 132#define dma_rxfill(di) ((di)->di_fn.rxfill(di)) 133#define dma_txreclaim(di, forceall) ((di)->di_fn.txreclaim(di, forceall)) 134#define dma_rxreclaim(di) ((di)->di_fn.rxreclaim(di)) 135#define dma_getvar(di, name) ((di)->di_fn.d_getvar(di, name)) 136#define dma_getnexttxp(di, forceall) ((di)->di_fn.getnexttxp(di, forceall)) 137#define dma_getnextrxp(di, forceall) ((di)->di_fn.getnextrxp(di, forceall)) 138#define dma_peeknexttxp(di) ((di)->di_fn.peeknexttxp(di)) 139#define dma_txblock(di) ((di)->di_fn.txblock(di)) 140#define dma_txunblock(di) ((di)->di_fn.txunblock(di)) 141#define dma_txactive(di) ((di)->di_fn.txactive(di)) 142#define dma_txrotate(di) ((di)->di_fn.txrotate(di)) 143#define dma_counterreset(di) ((di)->di_fn.counterreset(di)) 144 145/* return addresswidth allowed 146 * This needs to be done after SB attach but before dma attach. 147 * SB attach provides ability to probe backplane and dma core capabilities 148 * This info is needed by DMA_ALLOC_CONSISTENT in dma attach 149 */ 150extern uint dma_addrwidth(sb_t *sbh, void *dmaregs); 151 152/* pio helpers */ 153void dma_txpioloopback(osl_t *osh, dma32regs_t *); 154 155#endif /* _hnddma_h_ */ 156