dsc->dscr_a = phys | 
dsc->dscr_a = phys | 
static int sbdma_add_txbuffer(sbmacdma_t *d,struct sk_buff *sb){	sbdmadscr_t *dsc;	sbdmadscr_t *nextdsc;	uint64_t phys;	uint64_t ncb;	int length;		/* get pointer to our current place in the ring */		dsc = d->sbdma_addptr;	nextdsc = SBDMA_NEXTBUF(d,sbdma_addptr);		/*	 * figure out if the ring is full - if the next descriptor	 * is the same as the one that we're going to remove from	 * the ring, the ring is full	 */		if (nextdsc == d->sbdma_remptr) {		return -ENOSPC;	}		/*	 * Under Linux, it's not necessary to copy/coalesce buffers	 * like it is on NetBSD.  We think they're all contiguous,	 * but that may not be true for GBE.	 */		length = sb->len;		/*	 * fill in the descriptor.  Note that the number of cache	 * blocks in the descriptor is the number of blocks	 * *spanned*, so we need to add in the offset (if any)	 * while doing the calculation.	 */		phys = virt_to_phys(sb->data);	ncb = NUMCACHEBLKS(length+(phys & (SMP_CACHE_BYTES - 1)));	dsc->dscr_a = phys | 		V_DMA_DSCRA_A_SIZE(ncb) |#ifndef CONFIG_SBMAC_COALESCE		M_DMA_DSCRA_INTERRUPT |#endif		M_DMA_ETHTX_SOP;		/* transmitting: set outbound options and length */	dsc->dscr_b = V_DMA_DSCRB_OPTIONS(K_DMA_ETHTX_APPENDCRC_APPENDPAD) |		V_DMA_DSCRB_PKT_SIZE(length);		/*	 * fill in the context 	 */		d->sbdma_ctxtable[dsc-d->sbdma_dscrtable] = sb;		/* 	 * point at next packet 	 */		d->sbdma_addptr = nextdsc;		/* 	 * Give the buffer to the DMA engine.	 */		__raw_writeq(1, d->sbdma_dscrcnt);		return 0;					/* we did it */}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/74b0247fbd4b6ed1693a420d85cf50267d840ef4/sb1250-mac.c/buggy/drivers/net/sb1250-mac.c