void * dma_getnextrxp(dma_info_t *di, bool forceall) { uint i; void *rxp; /* if forcing, dma engine must be disabled */ ASSERT(!forceall || !dma_rxenabled(di)); i = di->rxin; /* return if no packets posted */ if (i == di->rxout) return (NULL); /* ignore curr if forceall */ if (!forceall && (i == B2I(R_REG(&di->regs->rcvstatus) & RS_CD_MASK))) return (NULL); /* get the packet pointer that corresponds to the rx descriptor */ rxp = di->rxp[i]; ASSERT(rxp); di->rxp[i] = NULL; /* clear this packet from the descriptor ring */ DMA_UNMAP(di->dev, (BUS_SWAP32(R_SM(&di->rxd[i].addr)) - di->dataoffset), di->rxbufsize, DMA_RX, rxp); W_SM(&di->rxd[i].addr, 0); di->rxin = NEXTRXD(i); return (rxp); }
/* * Reclaim next completed txd (txds if using chained buffers) and * return associated packet. * If 'force' is true, reclaim txd(s) and return associated packet * regardless of the value of the hardware "curr" pointer. */ void* dma_getnexttxp(dma_info_t *di, bool forceall) { uint start, end, i; void *txp; DMA_TRACE(("%s: dma_getnexttxp %s\n", di->name, forceall ? "all" : "")); txp = NULL; /* if forcing, dma engine must be disabled */ ASSERT(!forceall || !dma_txenabled(di)); start = di->txin; if (forceall) end = di->txout; else end = B2I(R_REG(&di->regs->xmtstatus) & XS_CD_MASK); /* PR4738 - xmt disable/re-enable does not clear CURR */ if ((start == 0) && (end > di->txout)) goto bogus; for (i = start; i != end && !txp; i = NEXTTXD(i)) { DMA_UNMAP(di->dev, (BUS_SWAP32(R_SM(&di->txd[i].addr)) - di->dataoffset), (BUS_SWAP32(R_SM(&di->txd[i].ctrl)) & CTRL_BC_MASK), DMA_TX, di->txp[i]); W_SM(&di->txd[i].addr, 0); txp = di->txp[i]; di->txp[i] = NULL; } di->txin = i; /* tx flow control */ di->txavail = di->ntxd - NTXDACTIVE(di->txin, di->txout) - 1; return (txp); bogus: /* DMA_ERROR(("dma_getnexttxp: bogus curr: start %d end %d txout %d force %d\n", start, end, di->txout, forceall)); */ return (NULL); }
PyObject* py_mapper_message(struct message* s) { return Py_BuildValue("(s(iii)l)", s->descr, B2I(s->location_ok), B2I(s->city_ok), B2I(s->visited), (long)s->tile); }