diff options
| author | Michael Buesch <mb@bu3sch.de> | 2008-06-20 11:50:29 +0200 | 
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-06-27 09:09:15 -0400 | 
| commit | f225763a7d6c92c4932dbd528437997078496fcc (patch) | |
| tree | 5d787c7c0bdabcf72e98603a85672ebe95a3682e /drivers/net/wireless | |
| parent | 316af76f3475bb73dbb11f1c6d549ae589efb3d0 (diff) | |
| download | olio-linux-3.10-f225763a7d6c92c4932dbd528437997078496fcc.tar.xz olio-linux-3.10-f225763a7d6c92c4932dbd528437997078496fcc.zip  | |
ssb, b43, b43legacy, b44: Rewrite SSB DMA API
This is a rewrite of the DMA API for SSB devices.
This is needed, because the old (non-existing) "API" made too many bad
assumptions on the API of the host-bus (PCI).
This introduces an almost complete SSB-DMA-API that maps to the lowlevel
bus-API based on the bustype.
Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
| -rw-r--r-- | drivers/net/wireless/b43/dma.c | 65 | ||||
| -rw-r--r-- | drivers/net/wireless/b43legacy/dma.c | 63 | 
2 files changed, 66 insertions, 62 deletions
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 8a09a1db08d..098f886976f 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c @@ -328,11 +328,11 @@ static inline  	dma_addr_t dmaaddr;  	if (tx) { -		dmaaddr = dma_map_single(ring->dev->dev->dma_dev, -					 buf, len, DMA_TO_DEVICE); +		dmaaddr = ssb_dma_map_single(ring->dev->dev, +					     buf, len, DMA_TO_DEVICE);  	} else { -		dmaaddr = dma_map_single(ring->dev->dev->dma_dev, -					 buf, len, DMA_FROM_DEVICE); +		dmaaddr = ssb_dma_map_single(ring->dev->dev, +					     buf, len, DMA_FROM_DEVICE);  	}  	return dmaaddr; @@ -343,11 +343,11 @@ static inline  			  dma_addr_t addr, size_t len, int tx)  {  	if (tx) { -		dma_unmap_single(ring->dev->dev->dma_dev, -				 addr, len, DMA_TO_DEVICE); +		ssb_dma_unmap_single(ring->dev->dev, +				     addr, len, DMA_TO_DEVICE);  	} else { -		dma_unmap_single(ring->dev->dev->dma_dev, -				 addr, len, DMA_FROM_DEVICE); +		ssb_dma_unmap_single(ring->dev->dev, +				     addr, len, DMA_FROM_DEVICE);  	}  } @@ -356,8 +356,8 @@ static inline  				 dma_addr_t addr, size_t len)  {  	B43_WARN_ON(ring->tx); -	dma_sync_single_for_cpu(ring->dev->dev->dma_dev, -				addr, len, DMA_FROM_DEVICE); +	ssb_dma_sync_single_for_cpu(ring->dev->dev, +				    addr, len, DMA_FROM_DEVICE);  }  static inline @@ -365,8 +365,8 @@ static inline  				    dma_addr_t addr, size_t len)  {  	B43_WARN_ON(ring->tx); -	dma_sync_single_for_device(ring->dev->dev->dma_dev, -				   addr, len, DMA_FROM_DEVICE); +	ssb_dma_sync_single_for_device(ring->dev->dev, +				       addr, len, DMA_FROM_DEVICE);  }  static inline @@ -381,7 +381,6 @@ static inline  static int alloc_ringmemory(struct b43_dmaring *ring)  { -	struct device *dma_dev = ring->dev->dev->dma_dev;  	gfp_t flags = GFP_KERNEL;  	/* The specs call for 4K buffers for 30- and 32-bit DMA with 4K @@ -392,11 +391,14 @@ static int alloc_ringmemory(struct b43_dmaring *ring)  	 * For unknown reasons - possibly a hardware error - the BCM4311 rev  	 * 02, which uses 64-bit DMA, needs the ring buffer in very low memory,  	 * which accounts for the GFP_DMA flag below. +	 * +	 * The flags here must match the flags in free_ringmemory below!  	 */  	if (ring->type == B43_DMA_64BIT)  		flags |= GFP_DMA; -	ring->descbase = dma_alloc_coherent(dma_dev, B43_DMA_RINGMEMSIZE, -					    &(ring->dmabase), flags); +	ring->descbase = ssb_dma_alloc_consistent(ring->dev->dev, +						  B43_DMA_RINGMEMSIZE, +						  &(ring->dmabase), flags);  	if (!ring->descbase) {  		b43err(ring->dev->wl, "DMA ringmemory allocation failed\n");  		return -ENOMEM; @@ -408,10 +410,13 @@ static int alloc_ringmemory(struct b43_dmaring *ring)  static void free_ringmemory(struct b43_dmaring *ring)  { -	struct device *dma_dev = ring->dev->dev->dma_dev; +	gfp_t flags = GFP_KERNEL; + +	if (ring->type == B43_DMA_64BIT) +		flags |= GFP_DMA; -	dma_free_coherent(dma_dev, B43_DMA_RINGMEMSIZE, -			  ring->descbase, ring->dmabase); +	ssb_dma_free_consistent(ring->dev->dev, B43_DMA_RINGMEMSIZE, +				ring->descbase, ring->dmabase, flags);  }  /* Reset the RX DMA channel */ @@ -518,7 +523,7 @@ static bool b43_dma_mapping_error(struct b43_dmaring *ring,  				  dma_addr_t addr,  				  size_t buffersize, bool dma_to_device)  { -	if (unlikely(dma_mapping_error(addr))) +	if (unlikely(ssb_dma_mapping_error(ring->dev->dev, addr)))  		return 1;  	switch (ring->type) { @@ -844,10 +849,10 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,  			goto err_kfree_meta;  		/* test for ability to dma to txhdr_cache */ -		dma_test = dma_map_single(dev->dev->dma_dev, -					  ring->txhdr_cache, -					  b43_txhdr_size(dev), -					  DMA_TO_DEVICE); +		dma_test = ssb_dma_map_single(dev->dev, +					      ring->txhdr_cache, +					      b43_txhdr_size(dev), +					      DMA_TO_DEVICE);  		if (b43_dma_mapping_error(ring, dma_test,  					  b43_txhdr_size(dev), 1)) { @@ -859,10 +864,10 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,  			if (!ring->txhdr_cache)  				goto err_kfree_meta; -			dma_test = dma_map_single(dev->dev->dma_dev, -						  ring->txhdr_cache, -						  b43_txhdr_size(dev), -						  DMA_TO_DEVICE); +			dma_test = ssb_dma_map_single(dev->dev, +						      ring->txhdr_cache, +						      b43_txhdr_size(dev), +						      DMA_TO_DEVICE);  			if (b43_dma_mapping_error(ring, dma_test,  						  b43_txhdr_size(dev), 1)) { @@ -873,9 +878,9 @@ struct b43_dmaring *b43_setup_dmaring(struct b43_wldev *dev,  			}  		} -		dma_unmap_single(dev->dev->dma_dev, -				 dma_test, b43_txhdr_size(dev), -				 DMA_TO_DEVICE); +		ssb_dma_unmap_single(dev->dev, +				     dma_test, b43_txhdr_size(dev), +				     DMA_TO_DEVICE);  	}  	err = alloc_ringmemory(ring); diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c index 33cc256c5ba..9736b2f56a7 100644 --- a/drivers/net/wireless/b43legacy/dma.c +++ b/drivers/net/wireless/b43legacy/dma.c @@ -393,13 +393,13 @@ dma_addr_t map_descbuffer(struct b43legacy_dmaring *ring,  	dma_addr_t dmaaddr;  	if (tx) -		dmaaddr = dma_map_single(ring->dev->dev->dma_dev, -					 buf, len, -					 DMA_TO_DEVICE); +		dmaaddr = ssb_dma_map_single(ring->dev->dev, +					     buf, len, +					     DMA_TO_DEVICE);  	else -		dmaaddr = dma_map_single(ring->dev->dev->dma_dev, -					 buf, len, -					 DMA_FROM_DEVICE); +		dmaaddr = ssb_dma_map_single(ring->dev->dev, +					     buf, len, +					     DMA_FROM_DEVICE);  	return dmaaddr;  } @@ -411,13 +411,13 @@ void unmap_descbuffer(struct b43legacy_dmaring *ring,  		      int tx)  {  	if (tx) -		dma_unmap_single(ring->dev->dev->dma_dev, -				 addr, len, -				 DMA_TO_DEVICE); +		ssb_dma_unmap_single(ring->dev->dev, +				     addr, len, +				     DMA_TO_DEVICE);  	else -		dma_unmap_single(ring->dev->dev->dma_dev, -				 addr, len, -				 DMA_FROM_DEVICE); +		ssb_dma_unmap_single(ring->dev->dev, +				     addr, len, +				     DMA_FROM_DEVICE);  }  static inline @@ -427,8 +427,8 @@ void sync_descbuffer_for_cpu(struct b43legacy_dmaring *ring,  {  	B43legacy_WARN_ON(ring->tx); -	dma_sync_single_for_cpu(ring->dev->dev->dma_dev, -				addr, len, DMA_FROM_DEVICE); +	ssb_dma_sync_single_for_cpu(ring->dev->dev, +				    addr, len, DMA_FROM_DEVICE);  }  static inline @@ -438,8 +438,8 @@ void sync_descbuffer_for_device(struct b43legacy_dmaring *ring,  {  	B43legacy_WARN_ON(ring->tx); -	dma_sync_single_for_device(ring->dev->dev->dma_dev, -				   addr, len, DMA_FROM_DEVICE); +	ssb_dma_sync_single_for_device(ring->dev->dev, +				       addr, len, DMA_FROM_DEVICE);  }  static inline @@ -458,10 +458,11 @@ void free_descriptor_buffer(struct b43legacy_dmaring *ring,  static int alloc_ringmemory(struct b43legacy_dmaring *ring)  { -	struct device *dma_dev = ring->dev->dev->dma_dev; - -	ring->descbase = dma_alloc_coherent(dma_dev, B43legacy_DMA_RINGMEMSIZE, -					    &(ring->dmabase), GFP_KERNEL); +	/* GFP flags must match the flags in free_ringmemory()! */ +	ring->descbase = ssb_dma_alloc_consistent(ring->dev->dev, +						  B43legacy_DMA_RINGMEMSIZE, +						  &(ring->dmabase), +						  GFP_KERNEL);  	if (!ring->descbase) {  		b43legacyerr(ring->dev->wl, "DMA ringmemory allocation"  			     " failed\n"); @@ -474,10 +475,8 @@ static int alloc_ringmemory(struct b43legacy_dmaring *ring)  static void free_ringmemory(struct b43legacy_dmaring *ring)  { -	struct device *dma_dev = ring->dev->dev->dma_dev; - -	dma_free_coherent(dma_dev, B43legacy_DMA_RINGMEMSIZE, -			  ring->descbase, ring->dmabase); +	ssb_dma_free_consistent(ring->dev->dev, B43legacy_DMA_RINGMEMSIZE, +				ring->descbase, ring->dmabase, GFP_KERNEL);  }  /* Reset the RX DMA channel */ @@ -589,7 +588,7 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,  					 size_t buffersize,  					 bool dma_to_device)  { -	if (unlikely(dma_mapping_error(addr))) +	if (unlikely(ssb_dma_mapping_error(ring->dev->dev, addr)))  		return 1;  	switch (ring->type) { @@ -893,9 +892,9 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev,  			goto err_kfree_meta;  		/* test for ability to dma to txhdr_cache */ -		dma_test = dma_map_single(dev->dev->dma_dev, ring->txhdr_cache, -					  sizeof(struct b43legacy_txhdr_fw3), -					  DMA_TO_DEVICE); +		dma_test = ssb_dma_map_single(dev->dev, ring->txhdr_cache, +					      sizeof(struct b43legacy_txhdr_fw3), +					      DMA_TO_DEVICE);  		if (b43legacy_dma_mapping_error(ring, dma_test,  					sizeof(struct b43legacy_txhdr_fw3), 1)) { @@ -907,7 +906,7 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev,  			if (!ring->txhdr_cache)  				goto err_kfree_meta; -			dma_test = dma_map_single(dev->dev->dma_dev, +				dma_test = ssb_dma_map_single(dev->dev,  					ring->txhdr_cache,  					sizeof(struct b43legacy_txhdr_fw3),  					DMA_TO_DEVICE); @@ -917,9 +916,9 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev,  				goto err_kfree_txhdr_cache;  		} -		dma_unmap_single(dev->dev->dma_dev, -				 dma_test, sizeof(struct b43legacy_txhdr_fw3), -				 DMA_TO_DEVICE); +		ssb_dma_unmap_single(dev->dev, dma_test, +				     sizeof(struct b43legacy_txhdr_fw3), +				     DMA_TO_DEVICE);  	}  	ring->dev = dev;  |