diff options
Diffstat (limited to 'drivers/net/wireless/b43legacy/dma.c')
| -rw-r--r-- | drivers/net/wireless/b43legacy/dma.c | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c index e87b427d5e43..c990f87b107a 100644 --- a/drivers/net/wireless/b43legacy/dma.c +++ b/drivers/net/wireless/b43legacy/dma.c | |||
| @@ -393,11 +393,11 @@ dma_addr_t map_descbuffer(struct b43legacy_dmaring *ring, | |||
| 393 | dma_addr_t dmaaddr; | 393 | dma_addr_t dmaaddr; |
| 394 | 394 | ||
| 395 | if (tx) | 395 | if (tx) |
| 396 | dmaaddr = dma_map_single(ring->dev->dev->dev, | 396 | dmaaddr = dma_map_single(ring->dev->dev->dma_dev, |
| 397 | buf, len, | 397 | buf, len, |
| 398 | DMA_TO_DEVICE); | 398 | DMA_TO_DEVICE); |
| 399 | else | 399 | else |
| 400 | dmaaddr = dma_map_single(ring->dev->dev->dev, | 400 | dmaaddr = dma_map_single(ring->dev->dev->dma_dev, |
| 401 | buf, len, | 401 | buf, len, |
| 402 | DMA_FROM_DEVICE); | 402 | DMA_FROM_DEVICE); |
| 403 | 403 | ||
| @@ -411,11 +411,11 @@ void unmap_descbuffer(struct b43legacy_dmaring *ring, | |||
| 411 | int tx) | 411 | int tx) |
| 412 | { | 412 | { |
| 413 | if (tx) | 413 | if (tx) |
| 414 | dma_unmap_single(ring->dev->dev->dev, | 414 | dma_unmap_single(ring->dev->dev->dma_dev, |
| 415 | addr, len, | 415 | addr, len, |
| 416 | DMA_TO_DEVICE); | 416 | DMA_TO_DEVICE); |
| 417 | else | 417 | else |
| 418 | dma_unmap_single(ring->dev->dev->dev, | 418 | dma_unmap_single(ring->dev->dev->dma_dev, |
| 419 | addr, len, | 419 | addr, len, |
| 420 | DMA_FROM_DEVICE); | 420 | DMA_FROM_DEVICE); |
| 421 | } | 421 | } |
| @@ -427,7 +427,7 @@ void sync_descbuffer_for_cpu(struct b43legacy_dmaring *ring, | |||
| 427 | { | 427 | { |
| 428 | B43legacy_WARN_ON(ring->tx); | 428 | B43legacy_WARN_ON(ring->tx); |
| 429 | 429 | ||
| 430 | dma_sync_single_for_cpu(ring->dev->dev->dev, | 430 | dma_sync_single_for_cpu(ring->dev->dev->dma_dev, |
| 431 | addr, len, DMA_FROM_DEVICE); | 431 | addr, len, DMA_FROM_DEVICE); |
| 432 | } | 432 | } |
| 433 | 433 | ||
| @@ -438,7 +438,7 @@ void sync_descbuffer_for_device(struct b43legacy_dmaring *ring, | |||
| 438 | { | 438 | { |
| 439 | B43legacy_WARN_ON(ring->tx); | 439 | B43legacy_WARN_ON(ring->tx); |
| 440 | 440 | ||
| 441 | dma_sync_single_for_device(ring->dev->dev->dev, | 441 | dma_sync_single_for_device(ring->dev->dev->dma_dev, |
| 442 | addr, len, DMA_FROM_DEVICE); | 442 | addr, len, DMA_FROM_DEVICE); |
| 443 | } | 443 | } |
| 444 | 444 | ||
| @@ -458,9 +458,9 @@ void free_descriptor_buffer(struct b43legacy_dmaring *ring, | |||
| 458 | 458 | ||
| 459 | static int alloc_ringmemory(struct b43legacy_dmaring *ring) | 459 | static int alloc_ringmemory(struct b43legacy_dmaring *ring) |
| 460 | { | 460 | { |
| 461 | struct device *dev = ring->dev->dev->dev; | 461 | struct device *dma_dev = ring->dev->dev->dma_dev; |
| 462 | 462 | ||
| 463 | ring->descbase = dma_alloc_coherent(dev, B43legacy_DMA_RINGMEMSIZE, | 463 | ring->descbase = dma_alloc_coherent(dma_dev, B43legacy_DMA_RINGMEMSIZE, |
| 464 | &(ring->dmabase), GFP_KERNEL); | 464 | &(ring->dmabase), GFP_KERNEL); |
| 465 | if (!ring->descbase) { | 465 | if (!ring->descbase) { |
| 466 | b43legacyerr(ring->dev->wl, "DMA ringmemory allocation" | 466 | b43legacyerr(ring->dev->wl, "DMA ringmemory allocation" |
| @@ -474,9 +474,9 @@ static int alloc_ringmemory(struct b43legacy_dmaring *ring) | |||
| 474 | 474 | ||
| 475 | static void free_ringmemory(struct b43legacy_dmaring *ring) | 475 | static void free_ringmemory(struct b43legacy_dmaring *ring) |
| 476 | { | 476 | { |
| 477 | struct device *dev = ring->dev->dev->dev; | 477 | struct device *dma_dev = ring->dev->dev->dma_dev; |
| 478 | 478 | ||
| 479 | dma_free_coherent(dev, B43legacy_DMA_RINGMEMSIZE, | 479 | dma_free_coherent(dma_dev, B43legacy_DMA_RINGMEMSIZE, |
| 480 | ring->descbase, ring->dmabase); | 480 | ring->descbase, ring->dmabase); |
| 481 | } | 481 | } |
| 482 | 482 | ||
| @@ -585,8 +585,9 @@ static int b43legacy_dmacontroller_tx_reset(struct b43legacy_wldev *dev, | |||
| 585 | 585 | ||
| 586 | /* Check if a DMA mapping address is invalid. */ | 586 | /* Check if a DMA mapping address is invalid. */ |
| 587 | static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring, | 587 | static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring, |
| 588 | dma_addr_t addr, | 588 | dma_addr_t addr, |
| 589 | size_t buffersize) | 589 | size_t buffersize, |
| 590 | bool dma_to_device) | ||
| 590 | { | 591 | { |
| 591 | if (unlikely(dma_mapping_error(addr))) | 592 | if (unlikely(dma_mapping_error(addr))) |
| 592 | return 1; | 593 | return 1; |
| @@ -594,11 +595,11 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring, | |||
| 594 | switch (ring->type) { | 595 | switch (ring->type) { |
| 595 | case B43legacy_DMA_30BIT: | 596 | case B43legacy_DMA_30BIT: |
| 596 | if ((u64)addr + buffersize > (1ULL << 30)) | 597 | if ((u64)addr + buffersize > (1ULL << 30)) |
| 597 | return 1; | 598 | goto address_error; |
| 598 | break; | 599 | break; |
| 599 | case B43legacy_DMA_32BIT: | 600 | case B43legacy_DMA_32BIT: |
| 600 | if ((u64)addr + buffersize > (1ULL << 32)) | 601 | if ((u64)addr + buffersize > (1ULL << 32)) |
| 601 | return 1; | 602 | goto address_error; |
| 602 | break; | 603 | break; |
| 603 | case B43legacy_DMA_64BIT: | 604 | case B43legacy_DMA_64BIT: |
| 604 | /* Currently we can't have addresses beyond 64 bits in the kernel. */ | 605 | /* Currently we can't have addresses beyond 64 bits in the kernel. */ |
| @@ -607,6 +608,12 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring, | |||
| 607 | 608 | ||
| 608 | /* The address is OK. */ | 609 | /* The address is OK. */ |
| 609 | return 0; | 610 | return 0; |
| 611 | |||
| 612 | address_error: | ||
| 613 | /* We can't support this address. Unmap it again. */ | ||
| 614 | unmap_descbuffer(ring, addr, buffersize, dma_to_device); | ||
| 615 | |||
| 616 | return 1; | ||
| 610 | } | 617 | } |
| 611 | 618 | ||
| 612 | static int setup_rx_descbuffer(struct b43legacy_dmaring *ring, | 619 | static int setup_rx_descbuffer(struct b43legacy_dmaring *ring, |
| @@ -626,7 +633,7 @@ static int setup_rx_descbuffer(struct b43legacy_dmaring *ring, | |||
| 626 | return -ENOMEM; | 633 | return -ENOMEM; |
| 627 | dmaaddr = map_descbuffer(ring, skb->data, | 634 | dmaaddr = map_descbuffer(ring, skb->data, |
| 628 | ring->rx_buffersize, 0); | 635 | ring->rx_buffersize, 0); |
| 629 | if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) { | 636 | if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { |
| 630 | /* ugh. try to realloc in zone_dma */ | 637 | /* ugh. try to realloc in zone_dma */ |
| 631 | gfp_flags |= GFP_DMA; | 638 | gfp_flags |= GFP_DMA; |
| 632 | 639 | ||
| @@ -639,7 +646,7 @@ static int setup_rx_descbuffer(struct b43legacy_dmaring *ring, | |||
| 639 | ring->rx_buffersize, 0); | 646 | ring->rx_buffersize, 0); |
| 640 | } | 647 | } |
| 641 | 648 | ||
| 642 | if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize)) { | 649 | if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) { |
| 643 | dev_kfree_skb_any(skb); | 650 | dev_kfree_skb_any(skb); |
| 644 | return -EIO; | 651 | return -EIO; |
| 645 | } | 652 | } |
| @@ -886,12 +893,12 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev, | |||
| 886 | goto err_kfree_meta; | 893 | goto err_kfree_meta; |
| 887 | 894 | ||
| 888 | /* test for ability to dma to txhdr_cache */ | 895 | /* test for ability to dma to txhdr_cache */ |
| 889 | dma_test = dma_map_single(dev->dev->dev, ring->txhdr_cache, | 896 | dma_test = dma_map_single(dev->dev->dma_dev, ring->txhdr_cache, |
| 890 | sizeof(struct b43legacy_txhdr_fw3), | 897 | sizeof(struct b43legacy_txhdr_fw3), |
| 891 | DMA_TO_DEVICE); | 898 | DMA_TO_DEVICE); |
| 892 | 899 | ||
| 893 | if (b43legacy_dma_mapping_error(ring, dma_test, | 900 | if (b43legacy_dma_mapping_error(ring, dma_test, |
| 894 | sizeof(struct b43legacy_txhdr_fw3))) { | 901 | sizeof(struct b43legacy_txhdr_fw3), 1)) { |
| 895 | /* ugh realloc */ | 902 | /* ugh realloc */ |
| 896 | kfree(ring->txhdr_cache); | 903 | kfree(ring->txhdr_cache); |
| 897 | ring->txhdr_cache = kcalloc(nr_slots, | 904 | ring->txhdr_cache = kcalloc(nr_slots, |
| @@ -900,17 +907,17 @@ struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev, | |||
| 900 | if (!ring->txhdr_cache) | 907 | if (!ring->txhdr_cache) |
| 901 | goto err_kfree_meta; | 908 | goto err_kfree_meta; |
| 902 | 909 | ||
| 903 | dma_test = dma_map_single(dev->dev->dev, | 910 | dma_test = dma_map_single(dev->dev->dma_dev, |
| 904 | ring->txhdr_cache, | 911 | ring->txhdr_cache, |
| 905 | sizeof(struct b43legacy_txhdr_fw3), | 912 | sizeof(struct b43legacy_txhdr_fw3), |
| 906 | DMA_TO_DEVICE); | 913 | DMA_TO_DEVICE); |
| 907 | 914 | ||
| 908 | if (b43legacy_dma_mapping_error(ring, dma_test, | 915 | if (b43legacy_dma_mapping_error(ring, dma_test, |
| 909 | sizeof(struct b43legacy_txhdr_fw3))) | 916 | sizeof(struct b43legacy_txhdr_fw3), 1)) |
| 910 | goto err_kfree_txhdr_cache; | 917 | goto err_kfree_txhdr_cache; |
| 911 | } | 918 | } |
| 912 | 919 | ||
| 913 | dma_unmap_single(dev->dev->dev, | 920 | dma_unmap_single(dev->dev->dma_dev, |
| 914 | dma_test, sizeof(struct b43legacy_txhdr_fw3), | 921 | dma_test, sizeof(struct b43legacy_txhdr_fw3), |
| 915 | DMA_TO_DEVICE); | 922 | DMA_TO_DEVICE); |
| 916 | } | 923 | } |
| @@ -1235,7 +1242,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring, | |||
| 1235 | meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header, | 1242 | meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header, |
| 1236 | sizeof(struct b43legacy_txhdr_fw3), 1); | 1243 | sizeof(struct b43legacy_txhdr_fw3), 1); |
| 1237 | if (b43legacy_dma_mapping_error(ring, meta_hdr->dmaaddr, | 1244 | if (b43legacy_dma_mapping_error(ring, meta_hdr->dmaaddr, |
| 1238 | sizeof(struct b43legacy_txhdr_fw3))) { | 1245 | sizeof(struct b43legacy_txhdr_fw3), 1)) { |
| 1239 | ring->current_slot = old_top_slot; | 1246 | ring->current_slot = old_top_slot; |
| 1240 | ring->used_slots = old_used_slots; | 1247 | ring->used_slots = old_used_slots; |
| 1241 | return -EIO; | 1248 | return -EIO; |
| @@ -1254,7 +1261,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring, | |||
| 1254 | 1261 | ||
| 1255 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | 1262 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); |
| 1256 | /* create a bounce buffer in zone_dma on mapping failure. */ | 1263 | /* create a bounce buffer in zone_dma on mapping failure. */ |
| 1257 | if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len)) { | 1264 | if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { |
| 1258 | bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA); | 1265 | bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA); |
| 1259 | if (!bounce_skb) { | 1266 | if (!bounce_skb) { |
| 1260 | ring->current_slot = old_top_slot; | 1267 | ring->current_slot = old_top_slot; |
| @@ -1268,7 +1275,7 @@ static int dma_tx_fragment(struct b43legacy_dmaring *ring, | |||
| 1268 | skb = bounce_skb; | 1275 | skb = bounce_skb; |
| 1269 | meta->skb = skb; | 1276 | meta->skb = skb; |
| 1270 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | 1277 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); |
| 1271 | if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len)) { | 1278 | if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { |
| 1272 | ring->current_slot = old_top_slot; | 1279 | ring->current_slot = old_top_slot; |
| 1273 | ring->used_slots = old_used_slots; | 1280 | ring->used_slots = old_used_slots; |
| 1274 | err = -EIO; | 1281 | err = -EIO; |
