File Index
Files and directories
Sign in
FILE

dma.c

File preview with syntax highlighting.

linux-6.19.14/drivers/net/wireless/broadcom/b43legacy/dma.c C
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3
   4  Broadcom B43legacy wireless driver
   5
   6  DMA ringbuffer and descriptor allocation/management
   7
   8  Copyright (c) 2005, 2006 Michael Buesch <m@bues.ch>
   9
  10  Some code in this file is derived from the b44.c driver
  11  Copyright (C) 2002 David S. Miller
  12  Copyright (C) Pekka Pietikainen
  13
  14
  15*/
  16
  17#include "b43legacy.h"
  18#include "dma.h"
  19#include "main.h"
  20#include "debugfs.h"
  21#include "xmit.h"
  22
  23#include <linux/dma-mapping.h>
  24#include <linux/pci.h>
  25#include <linux/delay.h>
  26#include <linux/skbuff.h>
  27#include <linux/slab.h>
  28#include <net/dst.h>
  29
  30/* 32bit DMA ops. */
  31static
  32struct b43legacy_dmadesc32 *op32_idx2desc(struct b43legacy_dmaring *ring,
  33					  int slot,
  34					  struct b43legacy_dmadesc_meta **meta)
  35{
  36	struct b43legacy_dmadesc32 *desc;
  37
  38	*meta = &(ring->meta[slot]);
  39	desc = ring->descbase;
  40	desc = &(desc[slot]);
  41
  42	return desc;
  43}
  44
  45static void op32_fill_descriptor(struct b43legacy_dmaring *ring,
  46				 struct b43legacy_dmadesc32 *desc,
  47				 dma_addr_t dmaaddr, u16 bufsize,
  48				 int start, int end, int irq)
  49{
  50	struct b43legacy_dmadesc32 *descbase = ring->descbase;
  51	int slot;
  52	u32 ctl;
  53	u32 addr;
  54	u32 addrext;
  55
  56	slot = (int)(desc - descbase);
  57	B43legacy_WARN_ON(!(slot >= 0 && slot < ring->nr_slots));
  58
  59	addr = (u32)(dmaaddr & ~SSB_DMA_TRANSLATION_MASK);
  60	addrext = (u32)(dmaaddr & SSB_DMA_TRANSLATION_MASK)
  61		   >> SSB_DMA_TRANSLATION_SHIFT;
  62	addr |= ring->dev->dma.translation;
  63	ctl = (bufsize - ring->frameoffset)
  64	      & B43legacy_DMA32_DCTL_BYTECNT;
  65	if (slot == ring->nr_slots - 1)
  66		ctl |= B43legacy_DMA32_DCTL_DTABLEEND;
  67	if (start)
  68		ctl |= B43legacy_DMA32_DCTL_FRAMESTART;
  69	if (end)
  70		ctl |= B43legacy_DMA32_DCTL_FRAMEEND;
  71	if (irq)
  72		ctl |= B43legacy_DMA32_DCTL_IRQ;
  73	ctl |= (addrext << B43legacy_DMA32_DCTL_ADDREXT_SHIFT)
  74	       & B43legacy_DMA32_DCTL_ADDREXT_MASK;
  75
  76	desc->control = cpu_to_le32(ctl);
  77	desc->address = cpu_to_le32(addr);
  78}
  79
  80static void op32_poke_tx(struct b43legacy_dmaring *ring, int slot)
  81{
  82	b43legacy_dma_write(ring, B43legacy_DMA32_TXINDEX,
  83			    (u32)(slot * sizeof(struct b43legacy_dmadesc32)));
  84}
  85
  86static void op32_tx_suspend(struct b43legacy_dmaring *ring)
  87{
  88	b43legacy_dma_write(ring, B43legacy_DMA32_TXCTL,
  89			    b43legacy_dma_read(ring, B43legacy_DMA32_TXCTL)
  90			    | B43legacy_DMA32_TXSUSPEND);
  91}
  92
  93static void op32_tx_resume(struct b43legacy_dmaring *ring)
  94{
  95	b43legacy_dma_write(ring, B43legacy_DMA32_TXCTL,
  96			    b43legacy_dma_read(ring, B43legacy_DMA32_TXCTL)
  97			    & ~B43legacy_DMA32_TXSUSPEND);
  98}
  99
 100static int op32_get_current_rxslot(struct b43legacy_dmaring *ring)
 101{
 102	u32 val;
 103
 104	val = b43legacy_dma_read(ring, B43legacy_DMA32_RXSTATUS);
 105	val &= B43legacy_DMA32_RXDPTR;
 106
 107	return (val / sizeof(struct b43legacy_dmadesc32));
 108}
 109
 110static void op32_set_current_rxslot(struct b43legacy_dmaring *ring,
 111				    int slot)
 112{
 113	b43legacy_dma_write(ring, B43legacy_DMA32_RXINDEX,
 114			    (u32)(slot * sizeof(struct b43legacy_dmadesc32)));
 115}
 116
 117static inline int free_slots(struct b43legacy_dmaring *ring)
 118{
 119	return (ring->nr_slots - ring->used_slots);
 120}
 121
 122static inline int next_slot(struct b43legacy_dmaring *ring, int slot)
 123{
 124	B43legacy_WARN_ON(!(slot >= -1 && slot <= ring->nr_slots - 1));
 125	if (slot == ring->nr_slots - 1)
 126		return 0;
 127	return slot + 1;
 128}
 129
 130#ifdef CONFIG_B43LEGACY_DEBUG
 131static void update_max_used_slots(struct b43legacy_dmaring *ring,
 132				  int current_used_slots)
 133{
 134	if (current_used_slots <= ring->max_used_slots)
 135		return;
 136	ring->max_used_slots = current_used_slots;
 137	if (b43legacy_debug(ring->dev, B43legacy_DBG_DMAVERBOSE))
 138		b43legacydbg(ring->dev->wl,
 139		       "max_used_slots increased to %d on %s ring %d\n",
 140		       ring->max_used_slots,
 141		       ring->tx ? "TX" : "RX",
 142		       ring->index);
 143}
 144#else
 145static inline
 146void update_max_used_slots(struct b43legacy_dmaring *ring,
 147			   int current_used_slots)
 148{ }
 149#endif /* DEBUG */
 150
 151/* Request a slot for usage. */
 152static inline
 153int request_slot(struct b43legacy_dmaring *ring)
 154{
 155	int slot;
 156
 157	B43legacy_WARN_ON(!ring->tx);
 158	B43legacy_WARN_ON(ring->stopped);
 159	B43legacy_WARN_ON(free_slots(ring) == 0);
 160
 161	slot = next_slot(ring, ring->current_slot);
 162	ring->current_slot = slot;
 163	ring->used_slots++;
 164
 165	update_max_used_slots(ring, ring->used_slots);
 166
 167	return slot;
 168}
 169
 170/* Mac80211-queue to b43legacy-ring mapping */
 171static struct b43legacy_dmaring *priority_to_txring(
 172						struct b43legacy_wldev *dev,
 173						int queue_priority)
 174{
 175	struct b43legacy_dmaring *ring;
 176
 177/*FIXME: For now we always run on TX-ring-1 */
 178return dev->dma.tx_ring1;
 179
 180	/* 0 = highest priority */
 181	switch (queue_priority) {
 182	default:
 183		B43legacy_WARN_ON(1);
 184		fallthrough;
 185	case 0:
 186		ring = dev->dma.tx_ring3;
 187		break;
 188	case 1:
 189		ring = dev->dma.tx_ring2;
 190		break;
 191	case 2:
 192		ring = dev->dma.tx_ring1;
 193		break;
 194	case 3:
 195		ring = dev->dma.tx_ring0;
 196		break;
 197	case 4:
 198		ring = dev->dma.tx_ring4;
 199		break;
 200	case 5:
 201		ring = dev->dma.tx_ring5;
 202		break;
 203	}
 204
 205	return ring;
 206}
 207
 208static u16 b43legacy_dmacontroller_base(enum b43legacy_dmatype type,
 209					int controller_idx)
 210{
 211	static const u16 map32[] = {
 212		B43legacy_MMIO_DMA32_BASE0,
 213		B43legacy_MMIO_DMA32_BASE1,
 214		B43legacy_MMIO_DMA32_BASE2,
 215		B43legacy_MMIO_DMA32_BASE3,
 216		B43legacy_MMIO_DMA32_BASE4,
 217		B43legacy_MMIO_DMA32_BASE5,
 218	};
 219
 220	B43legacy_WARN_ON(!(controller_idx >= 0 &&
 221			  controller_idx < ARRAY_SIZE(map32)));
 222	return map32[controller_idx];
 223}
 224
 225static inline
 226dma_addr_t map_descbuffer(struct b43legacy_dmaring *ring,
 227			  unsigned char *buf,
 228			  size_t len,
 229			  int tx)
 230{
 231	dma_addr_t dmaaddr;
 232
 233	if (tx)
 234		dmaaddr = dma_map_single(ring->dev->dev->dma_dev,
 235					     buf, len,
 236					     DMA_TO_DEVICE);
 237	else
 238		dmaaddr = dma_map_single(ring->dev->dev->dma_dev,
 239					     buf, len,
 240					     DMA_FROM_DEVICE);
 241
 242	return dmaaddr;
 243}
 244
 245static inline
 246void unmap_descbuffer(struct b43legacy_dmaring *ring,
 247		      dma_addr_t addr,
 248		      size_t len,
 249		      int tx)
 250{
 251	if (tx)
 252		dma_unmap_single(ring->dev->dev->dma_dev,
 253				     addr, len,
 254				     DMA_TO_DEVICE);
 255	else
 256		dma_unmap_single(ring->dev->dev->dma_dev,
 257				     addr, len,
 258				     DMA_FROM_DEVICE);
 259}
 260
 261static inline
 262void sync_descbuffer_for_cpu(struct b43legacy_dmaring *ring,
 263			     dma_addr_t addr,
 264			     size_t len)
 265{
 266	B43legacy_WARN_ON(ring->tx);
 267
 268	dma_sync_single_for_cpu(ring->dev->dev->dma_dev,
 269				addr, len, DMA_FROM_DEVICE);
 270}
 271
 272static inline
 273void sync_descbuffer_for_device(struct b43legacy_dmaring *ring,
 274				dma_addr_t addr,
 275				size_t len)
 276{
 277	B43legacy_WARN_ON(ring->tx);
 278
 279	dma_sync_single_for_device(ring->dev->dev->dma_dev,
 280				   addr, len, DMA_FROM_DEVICE);
 281}
 282
 283static inline
 284void free_descriptor_buffer(struct b43legacy_dmaring *ring,
 285			    struct b43legacy_dmadesc_meta *meta,
 286			    int irq_context)
 287{
 288	if (meta->skb) {
 289		if (irq_context)
 290			dev_kfree_skb_irq(meta->skb);
 291		else
 292			dev_kfree_skb(meta->skb);
 293		meta->skb = NULL;
 294	}
 295}
 296
 297static int alloc_ringmemory(struct b43legacy_dmaring *ring)
 298{
 299	/* GFP flags must match the flags in free_ringmemory()! */
 300	ring->descbase = dma_alloc_coherent(ring->dev->dev->dma_dev,
 301					    B43legacy_DMA_RINGMEMSIZE,
 302					    &(ring->dmabase), GFP_KERNEL);
 303	if (!ring->descbase)
 304		return -ENOMEM;
 305
 306	return 0;
 307}
 308
 309static void free_ringmemory(struct b43legacy_dmaring *ring)
 310{
 311	dma_free_coherent(ring->dev->dev->dma_dev, B43legacy_DMA_RINGMEMSIZE,
 312			  ring->descbase, ring->dmabase);
 313}
 314
 315/* Reset the RX DMA channel */
 316static int b43legacy_dmacontroller_rx_reset(struct b43legacy_wldev *dev,
 317					    u16 mmio_base,
 318					    enum b43legacy_dmatype type)
 319{
 320	int i;
 321	u32 value;
 322	u16 offset;
 323
 324	might_sleep();
 325
 326	offset = B43legacy_DMA32_RXCTL;
 327	b43legacy_write32(dev, mmio_base + offset, 0);
 328	for (i = 0; i < 10; i++) {
 329		offset = B43legacy_DMA32_RXSTATUS;
 330		value = b43legacy_read32(dev, mmio_base + offset);
 331		value &= B43legacy_DMA32_RXSTATE;
 332		if (value == B43legacy_DMA32_RXSTAT_DISABLED) {
 333			i = -1;
 334			break;
 335		}
 336		msleep(1);
 337	}
 338	if (i != -1) {
 339		b43legacyerr(dev->wl, "DMA RX reset timed out\n");
 340		return -ENODEV;
 341	}
 342
 343	return 0;
 344}
 345
 346/* Reset the RX DMA channel */
 347static int b43legacy_dmacontroller_tx_reset(struct b43legacy_wldev *dev,
 348					    u16 mmio_base,
 349					    enum b43legacy_dmatype type)
 350{
 351	int i;
 352	u32 value;
 353	u16 offset;
 354
 355	might_sleep();
 356
 357	for (i = 0; i < 10; i++) {
 358		offset = B43legacy_DMA32_TXSTATUS;
 359		value = b43legacy_read32(dev, mmio_base + offset);
 360		value &= B43legacy_DMA32_TXSTATE;
 361		if (value == B43legacy_DMA32_TXSTAT_DISABLED ||
 362		    value == B43legacy_DMA32_TXSTAT_IDLEWAIT ||
 363		    value == B43legacy_DMA32_TXSTAT_STOPPED)
 364			break;
 365		msleep(1);
 366	}
 367	offset = B43legacy_DMA32_TXCTL;
 368	b43legacy_write32(dev, mmio_base + offset, 0);
 369	for (i = 0; i < 10; i++) {
 370		offset = B43legacy_DMA32_TXSTATUS;
 371		value = b43legacy_read32(dev, mmio_base + offset);
 372		value &= B43legacy_DMA32_TXSTATE;
 373		if (value == B43legacy_DMA32_TXSTAT_DISABLED) {
 374			i = -1;
 375			break;
 376		}
 377		msleep(1);
 378	}
 379	if (i != -1) {
 380		b43legacyerr(dev->wl, "DMA TX reset timed out\n");
 381		return -ENODEV;
 382	}
 383	/* ensure the reset is completed. */
 384	msleep(1);
 385
 386	return 0;
 387}
 388
 389/* Check if a DMA mapping address is invalid. */
 390static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,
 391					 dma_addr_t addr,
 392					 size_t buffersize,
 393					 bool dma_to_device)
 394{
 395	if (unlikely(dma_mapping_error(ring->dev->dev->dma_dev, addr)))
 396		return true;
 397
 398	switch (ring->type) {
 399	case B43legacy_DMA_30BIT:
 400		if ((u64)addr + buffersize > (1ULL << 30))
 401			goto address_error;
 402		break;
 403	case B43legacy_DMA_32BIT:
 404		if ((u64)addr + buffersize > (1ULL << 32))
 405			goto address_error;
 406		break;
 407	}
 408
 409	/* The address is OK. */
 410	return false;
 411
 412address_error:
 413	/* We can't support this address. Unmap it again. */
 414	unmap_descbuffer(ring, addr, buffersize, dma_to_device);
 415
 416	return true;
 417}
 418
 419static int setup_rx_descbuffer(struct b43legacy_dmaring *ring,
 420			       struct b43legacy_dmadesc32 *desc,
 421			       struct b43legacy_dmadesc_meta *meta,
 422			       gfp_t gfp_flags)
 423{
 424	struct b43legacy_rxhdr_fw3 *rxhdr;
 425	struct b43legacy_hwtxstatus *txstat;
 426	dma_addr_t dmaaddr;
 427	struct sk_buff *skb;
 428
 429	B43legacy_WARN_ON(ring->tx);
 430
 431	skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
 432	if (unlikely(!skb))
 433		return -ENOMEM;
 434	dmaaddr = map_descbuffer(ring, skb->data,
 435				 ring->rx_buffersize, 0);
 436	if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
 437		/* ugh. try to realloc in zone_dma */
 438		gfp_flags |= GFP_DMA;
 439
 440		dev_kfree_skb_any(skb);
 441
 442		skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
 443		if (unlikely(!skb))
 444			return -ENOMEM;
 445		dmaaddr = map_descbuffer(ring, skb->data,
 446					 ring->rx_buffersize, 0);
 447	}
 448
 449	if (b43legacy_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
 450		dev_kfree_skb_any(skb);
 451		return -EIO;
 452	}
 453
 454	meta->skb = skb;
 455	meta->dmaaddr = dmaaddr;
 456	op32_fill_descriptor(ring, desc, dmaaddr, ring->rx_buffersize, 0, 0, 0);
 457
 458	rxhdr = (struct b43legacy_rxhdr_fw3 *)(skb->data);
 459	rxhdr->frame_len = 0;
 460	txstat = (struct b43legacy_hwtxstatus *)(skb->data);
 461	txstat->cookie = 0;
 462
 463	return 0;
 464}
 465
 466/* Allocate the initial descbuffers.
 467 * This is used for an RX ring only.
 468 */
 469static int alloc_initial_descbuffers(struct b43legacy_dmaring *ring)
 470{
 471	int i;
 472	int err = -ENOMEM;
 473	struct b43legacy_dmadesc32 *desc;
 474	struct b43legacy_dmadesc_meta *meta;
 475
 476	for (i = 0; i < ring->nr_slots; i++) {
 477		desc = op32_idx2desc(ring, i, &meta);
 478
 479		err = setup_rx_descbuffer(ring, desc, meta, GFP_KERNEL);
 480		if (err) {
 481			b43legacyerr(ring->dev->wl,
 482			       "Failed to allocate initial descbuffers\n");
 483			goto err_unwind;
 484		}
 485	}
 486	mb(); /* all descbuffer setup before next line */
 487	ring->used_slots = ring->nr_slots;
 488	err = 0;
 489out:
 490	return err;
 491
 492err_unwind:
 493	for (i--; i >= 0; i--) {
 494		desc = op32_idx2desc(ring, i, &meta);
 495
 496		unmap_descbuffer(ring, meta->dmaaddr, ring->rx_buffersize, 0);
 497		dev_kfree_skb(meta->skb);
 498	}
 499	goto out;
 500}
 501
 502/* Do initial setup of the DMA controller.
 503 * Reset the controller, write the ring busaddress
 504 * and switch the "enable" bit on.
 505 */
 506static int dmacontroller_setup(struct b43legacy_dmaring *ring)
 507{
 508	int err = 0;
 509	u32 value;
 510	u32 addrext;
 511	u32 trans = ring->dev->dma.translation;
 512	u32 ringbase = (u32)(ring->dmabase);
 513
 514	if (ring->tx) {
 515		addrext = (ringbase & SSB_DMA_TRANSLATION_MASK)
 516			  >> SSB_DMA_TRANSLATION_SHIFT;
 517		value = B43legacy_DMA32_TXENABLE;
 518		value |= (addrext << B43legacy_DMA32_TXADDREXT_SHIFT)
 519			& B43legacy_DMA32_TXADDREXT_MASK;
 520		b43legacy_dma_write(ring, B43legacy_DMA32_TXCTL, value);
 521		b43legacy_dma_write(ring, B43legacy_DMA32_TXRING,
 522				    (ringbase & ~SSB_DMA_TRANSLATION_MASK)
 523				    | trans);
 524	} else {
 525		err = alloc_initial_descbuffers(ring);
 526		if (err)
 527			goto out;
 528
 529		addrext = (ringbase & SSB_DMA_TRANSLATION_MASK)
 530			  >> SSB_DMA_TRANSLATION_SHIFT;
 531		value = (ring->frameoffset <<
 532			 B43legacy_DMA32_RXFROFF_SHIFT);
 533		value |= B43legacy_DMA32_RXENABLE;
 534		value |= (addrext << B43legacy_DMA32_RXADDREXT_SHIFT)
 535			 & B43legacy_DMA32_RXADDREXT_MASK;
 536		b43legacy_dma_write(ring, B43legacy_DMA32_RXCTL, value);
 537		b43legacy_dma_write(ring, B43legacy_DMA32_RXRING,
 538				    (ringbase & ~SSB_DMA_TRANSLATION_MASK)
 539				    | trans);
 540		b43legacy_dma_write(ring, B43legacy_DMA32_RXINDEX, 200);
 541	}
 542
 543out:
 544	return err;
 545}
 546
 547/* Shutdown the DMA controller. */
 548static void dmacontroller_cleanup(struct b43legacy_dmaring *ring)
 549{
 550	if (ring->tx) {
 551		b43legacy_dmacontroller_tx_reset(ring->dev, ring->mmio_base,
 552						 ring->type);
 553		b43legacy_dma_write(ring, B43legacy_DMA32_TXRING, 0);
 554	} else {
 555		b43legacy_dmacontroller_rx_reset(ring->dev, ring->mmio_base,
 556						 ring->type);
 557		b43legacy_dma_write(ring, B43legacy_DMA32_RXRING, 0);
 558	}
 559}
 560
 561static void free_all_descbuffers(struct b43legacy_dmaring *ring)
 562{
 563	struct b43legacy_dmadesc_meta *meta;
 564	int i;
 565
 566	if (!ring->used_slots)
 567		return;
 568	for (i = 0; i < ring->nr_slots; i++) {
 569		op32_idx2desc(ring, i, &meta);
 570
 571		if (!meta->skb) {
 572			B43legacy_WARN_ON(!ring->tx);
 573			continue;
 574		}
 575		if (ring->tx)
 576			unmap_descbuffer(ring, meta->dmaaddr,
 577					 meta->skb->len, 1);
 578		else
 579			unmap_descbuffer(ring, meta->dmaaddr,
 580					 ring->rx_buffersize, 0);
 581		free_descriptor_buffer(ring, meta, 0);
 582	}
 583}
 584
 585static enum b43legacy_dmatype b43legacy_engine_type(struct b43legacy_wldev *dev)
 586{
 587	u32 tmp;
 588	u16 mmio_base;
 589
 590	mmio_base = b43legacy_dmacontroller_base(0, 0);
 591	b43legacy_write32(dev,
 592			mmio_base + B43legacy_DMA32_TXCTL,
 593			B43legacy_DMA32_TXADDREXT_MASK);
 594	tmp = b43legacy_read32(dev, mmio_base +
 595			       B43legacy_DMA32_TXCTL);
 596	if (tmp & B43legacy_DMA32_TXADDREXT_MASK)
 597		return B43legacy_DMA_32BIT;
 598	return B43legacy_DMA_30BIT;
 599}
 600
 601/* Main initialization function. */
 602static
 603struct b43legacy_dmaring *b43legacy_setup_dmaring(struct b43legacy_wldev *dev,
 604						  int controller_index,
 605						  int for_tx,
 606						  enum b43legacy_dmatype type)
 607{
 608	struct b43legacy_dmaring *ring;
 609	int err;
 610	int nr_slots;
 611	dma_addr_t dma_test;
 612
 613	ring = kzalloc(sizeof(*ring), GFP_KERNEL);
 614	if (!ring)
 615		goto out;
 616	ring->type = type;
 617	ring->dev = dev;
 618
 619	nr_slots = B43legacy_RXRING_SLOTS;
 620	if (for_tx)
 621		nr_slots = B43legacy_TXRING_SLOTS;
 622
 623	ring->meta = kcalloc(nr_slots, sizeof(struct b43legacy_dmadesc_meta),
 624			     GFP_KERNEL);
 625	if (!ring->meta)
 626		goto err_kfree_ring;
 627	if (for_tx) {
 628		ring->txhdr_cache = kcalloc(nr_slots,
 629					sizeof(struct b43legacy_txhdr_fw3),
 630					GFP_KERNEL);
 631		if (!ring->txhdr_cache)
 632			goto err_kfree_meta;
 633
 634		/* test for ability to dma to txhdr_cache */
 635		dma_test = dma_map_single(dev->dev->dma_dev, ring->txhdr_cache,
 636					      sizeof(struct b43legacy_txhdr_fw3),
 637					      DMA_TO_DEVICE);
 638
 639		if (b43legacy_dma_mapping_error(ring, dma_test,
 640					sizeof(struct b43legacy_txhdr_fw3), 1)) {
 641			/* ugh realloc */
 642			kfree(ring->txhdr_cache);
 643			ring->txhdr_cache = kcalloc(nr_slots,
 644					sizeof(struct b43legacy_txhdr_fw3),
 645					GFP_KERNEL | GFP_DMA);
 646			if (!ring->txhdr_cache)
 647				goto err_kfree_meta;
 648
 649			dma_test = dma_map_single(dev->dev->dma_dev,
 650					ring->txhdr_cache,
 651					sizeof(struct b43legacy_txhdr_fw3),
 652					DMA_TO_DEVICE);
 653
 654			if (b43legacy_dma_mapping_error(ring, dma_test,
 655					sizeof(struct b43legacy_txhdr_fw3), 1))
 656				goto err_kfree_txhdr_cache;
 657		}
 658
 659		dma_unmap_single(dev->dev->dma_dev, dma_test,
 660				 sizeof(struct b43legacy_txhdr_fw3),
 661				 DMA_TO_DEVICE);
 662	}
 663
 664	ring->nr_slots = nr_slots;
 665	ring->mmio_base = b43legacy_dmacontroller_base(type, controller_index);
 666	ring->index = controller_index;
 667	if (for_tx) {
 668		ring->tx = true;
 669		ring->current_slot = -1;
 670	} else {
 671		if (ring->index == 0) {
 672			ring->rx_buffersize = B43legacy_DMA0_RX_BUFFERSIZE;
 673			ring->frameoffset = B43legacy_DMA0_RX_FRAMEOFFSET;
 674		} else if (ring->index == 3) {
 675			ring->rx_buffersize = B43legacy_DMA3_RX_BUFFERSIZE;
 676			ring->frameoffset = B43legacy_DMA3_RX_FRAMEOFFSET;
 677		} else
 678			B43legacy_WARN_ON(1);
 679	}
 680#ifdef CONFIG_B43LEGACY_DEBUG
 681	ring->last_injected_overflow = jiffies;
 682#endif
 683
 684	err = alloc_ringmemory(ring);
 685	if (err)
 686		goto err_kfree_txhdr_cache;
 687	err = dmacontroller_setup(ring);
 688	if (err)
 689		goto err_free_ringmemory;
 690
 691out:
 692	return ring;
 693
 694err_free_ringmemory:
 695	free_ringmemory(ring);
 696err_kfree_txhdr_cache:
 697	kfree(ring->txhdr_cache);
 698err_kfree_meta:
 699	kfree(ring->meta);
 700err_kfree_ring:
 701	kfree(ring);
 702	ring = NULL;
 703	goto out;
 704}
 705
 706/* Main cleanup function. */
 707static void b43legacy_destroy_dmaring(struct b43legacy_dmaring *ring)
 708{
 709	if (!ring)
 710		return;
 711
 712	b43legacydbg(ring->dev->wl, "DMA-%u 0x%04X (%s) max used slots:"
 713		     " %d/%d\n", (unsigned int)(ring->type), ring->mmio_base,
 714		     (ring->tx) ? "TX" : "RX", ring->max_used_slots,
 715		     ring->nr_slots);
 716	/* Device IRQs are disabled prior entering this function,
 717	 * so no need to take care of concurrency with rx handler stuff.
 718	 */
 719	dmacontroller_cleanup(ring);
 720	free_all_descbuffers(ring);
 721	free_ringmemory(ring);
 722
 723	kfree(ring->txhdr_cache);
 724	kfree(ring->meta);
 725	kfree(ring);
 726}
 727
 728void b43legacy_dma_free(struct b43legacy_wldev *dev)
 729{
 730	struct b43legacy_dma *dma;
 731
 732	if (b43legacy_using_pio(dev))
 733		return;
 734	dma = &dev->dma;
 735
 736	b43legacy_destroy_dmaring(dma->rx_ring3);
 737	dma->rx_ring3 = NULL;
 738	b43legacy_destroy_dmaring(dma->rx_ring0);
 739	dma->rx_ring0 = NULL;
 740
 741	b43legacy_destroy_dmaring(dma->tx_ring5);
 742	dma->tx_ring5 = NULL;
 743	b43legacy_destroy_dmaring(dma->tx_ring4);
 744	dma->tx_ring4 = NULL;
 745	b43legacy_destroy_dmaring(dma->tx_ring3);
 746	dma->tx_ring3 = NULL;
 747	b43legacy_destroy_dmaring(dma->tx_ring2);
 748	dma->tx_ring2 = NULL;
 749	b43legacy_destroy_dmaring(dma->tx_ring1);
 750	dma->tx_ring1 = NULL;
 751	b43legacy_destroy_dmaring(dma->tx_ring0);
 752	dma->tx_ring0 = NULL;
 753}
 754
 755int b43legacy_dma_init(struct b43legacy_wldev *dev)
 756{
 757	struct b43legacy_dma *dma = &dev->dma;
 758	struct b43legacy_dmaring *ring;
 759	enum b43legacy_dmatype type = b43legacy_engine_type(dev);
 760	int err;
 761
 762	err = dma_set_mask_and_coherent(dev->dev->dma_dev, DMA_BIT_MASK(type));
 763	if (err) {
 764#ifdef CONFIG_B43LEGACY_PIO
 765		b43legacywarn(dev->wl, "DMA for this device not supported. "
 766			"Falling back to PIO\n");
 767		dev->__using_pio = true;
 768		return -EAGAIN;
 769#else
 770		b43legacyerr(dev->wl, "DMA for this device not supported and "
 771		       "no PIO support compiled in\n");
 772		return -EOPNOTSUPP;
 773#endif
 774	}
 775	dma->translation = ssb_dma_translation(dev->dev);
 776
 777	err = -ENOMEM;
 778	/* setup TX DMA channels. */
 779	ring = b43legacy_setup_dmaring(dev, 0, 1, type);
 780	if (!ring)
 781		goto out;
 782	dma->tx_ring0 = ring;
 783
 784	ring = b43legacy_setup_dmaring(dev, 1, 1, type);
 785	if (!ring)
 786		goto err_destroy_tx0;
 787	dma->tx_ring1 = ring;
 788
 789	ring = b43legacy_setup_dmaring(dev, 2, 1, type);
 790	if (!ring)
 791		goto err_destroy_tx1;
 792	dma->tx_ring2 = ring;
 793
 794	ring = b43legacy_setup_dmaring(dev, 3, 1, type);
 795	if (!ring)
 796		goto err_destroy_tx2;
 797	dma->tx_ring3 = ring;
 798
 799	ring = b43legacy_setup_dmaring(dev, 4, 1, type);
 800	if (!ring)
 801		goto err_destroy_tx3;
 802	dma->tx_ring4 = ring;
 803
 804	ring = b43legacy_setup_dmaring(dev, 5, 1, type);
 805	if (!ring)
 806		goto err_destroy_tx4;
 807	dma->tx_ring5 = ring;
 808
 809	/* setup RX DMA channels. */
 810	ring = b43legacy_setup_dmaring(dev, 0, 0, type);
 811	if (!ring)
 812		goto err_destroy_tx5;
 813	dma->rx_ring0 = ring;
 814
 815	if (dev->dev->id.revision < 5) {
 816		ring = b43legacy_setup_dmaring(dev, 3, 0, type);
 817		if (!ring)
 818			goto err_destroy_rx0;
 819		dma->rx_ring3 = ring;
 820	}
 821
 822	b43legacydbg(dev->wl, "%u-bit DMA initialized\n", (unsigned int)type);
 823	err = 0;
 824out:
 825	return err;
 826
 827err_destroy_rx0:
 828	b43legacy_destroy_dmaring(dma->rx_ring0);
 829	dma->rx_ring0 = NULL;
 830err_destroy_tx5:
 831	b43legacy_destroy_dmaring(dma->tx_ring5);
 832	dma->tx_ring5 = NULL;
 833err_destroy_tx4:
 834	b43legacy_destroy_dmaring(dma->tx_ring4);
 835	dma->tx_ring4 = NULL;
 836err_destroy_tx3:
 837	b43legacy_destroy_dmaring(dma->tx_ring3);
 838	dma->tx_ring3 = NULL;
 839err_destroy_tx2:
 840	b43legacy_destroy_dmaring(dma->tx_ring2);
 841	dma->tx_ring2 = NULL;
 842err_destroy_tx1:
 843	b43legacy_destroy_dmaring(dma->tx_ring1);
 844	dma->tx_ring1 = NULL;
 845err_destroy_tx0:
 846	b43legacy_destroy_dmaring(dma->tx_ring0);
 847	dma->tx_ring0 = NULL;
 848	goto out;
 849}
 850
 851/* Generate a cookie for the TX header. */
 852static u16 generate_cookie(struct b43legacy_dmaring *ring,
 853			   int slot)
 854{
 855	u16 cookie = 0x1000;
 856
 857	/* Use the upper 4 bits of the cookie as
 858	 * DMA controller ID and store the slot number
 859	 * in the lower 12 bits.
 860	 * Note that the cookie must never be 0, as this
 861	 * is a special value used in RX path.
 862	 */
 863	switch (ring->index) {
 864	case 0:
 865		cookie = 0xA000;
 866		break;
 867	case 1:
 868		cookie = 0xB000;
 869		break;
 870	case 2:
 871		cookie = 0xC000;
 872		break;
 873	case 3:
 874		cookie = 0xD000;
 875		break;
 876	case 4:
 877		cookie = 0xE000;
 878		break;
 879	case 5:
 880		cookie = 0xF000;
 881		break;
 882	}
 883	B43legacy_WARN_ON(!(((u16)slot & 0xF000) == 0x0000));
 884	cookie |= (u16)slot;
 885
 886	return cookie;
 887}
 888
 889/* Inspect a cookie and find out to which controller/slot it belongs. */
 890static
 891struct b43legacy_dmaring *parse_cookie(struct b43legacy_wldev *dev,
 892				      u16 cookie, int *slot)
 893{
 894	struct b43legacy_dma *dma = &dev->dma;
 895	struct b43legacy_dmaring *ring = NULL;
 896
 897	switch (cookie & 0xF000) {
 898	case 0xA000:
 899		ring = dma->tx_ring0;
 900		break;
 901	case 0xB000:
 902		ring = dma->tx_ring1;
 903		break;
 904	case 0xC000:
 905		ring = dma->tx_ring2;
 906		break;
 907	case 0xD000:
 908		ring = dma->tx_ring3;
 909		break;
 910	case 0xE000:
 911		ring = dma->tx_ring4;
 912		break;
 913	case 0xF000:
 914		ring = dma->tx_ring5;
 915		break;
 916	default:
 917		B43legacy_WARN_ON(1);
 918	}
 919	*slot = (cookie & 0x0FFF);
 920	B43legacy_WARN_ON(!(ring && *slot >= 0 && *slot < ring->nr_slots));
 921
 922	return ring;
 923}
 924
 925static int dma_tx_fragment(struct b43legacy_dmaring *ring,
 926			    struct sk_buff **in_skb)
 927{
 928	struct sk_buff *skb = *in_skb;
 929	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 930	u8 *header;
 931	int slot, old_top_slot, old_used_slots;
 932	int err;
 933	struct b43legacy_dmadesc32 *desc;
 934	struct b43legacy_dmadesc_meta *meta;
 935	struct b43legacy_dmadesc_meta *meta_hdr;
 936	struct sk_buff *bounce_skb;
 937
 938#define SLOTS_PER_PACKET  2
 939	B43legacy_WARN_ON(skb_shinfo(skb)->nr_frags != 0);
 940
 941	old_top_slot = ring->current_slot;
 942	old_used_slots = ring->used_slots;
 943
 944	/* Get a slot for the header. */
 945	slot = request_slot(ring);
 946	desc = op32_idx2desc(ring, slot, &meta_hdr);
 947	memset(meta_hdr, 0, sizeof(*meta_hdr));
 948
 949	header = &(ring->txhdr_cache[slot * sizeof(
 950			       struct b43legacy_txhdr_fw3)]);
 951	err = b43legacy_generate_txhdr(ring->dev, header,
 952				 skb->data, skb->len, info,
 953				 generate_cookie(ring, slot));
 954	if (unlikely(err)) {
 955		ring->current_slot = old_top_slot;
 956		ring->used_slots = old_used_slots;
 957		return err;
 958	}
 959
 960	meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header,
 961					   sizeof(struct b43legacy_txhdr_fw3), 1);
 962	if (b43legacy_dma_mapping_error(ring, meta_hdr->dmaaddr,
 963					sizeof(struct b43legacy_txhdr_fw3), 1)) {
 964		ring->current_slot = old_top_slot;
 965		ring->used_slots = old_used_slots;
 966		return -EIO;
 967	}
 968	op32_fill_descriptor(ring, desc, meta_hdr->dmaaddr,
 969			     sizeof(struct b43legacy_txhdr_fw3), 1, 0, 0);
 970
 971	/* Get a slot for the payload. */
 972	slot = request_slot(ring);
 973	desc = op32_idx2desc(ring, slot, &meta);
 974	memset(meta, 0, sizeof(*meta));
 975
 976	meta->skb = skb;
 977	meta->is_last_fragment = true;
 978
 979	meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
 980	/* create a bounce buffer in zone_dma on mapping failure. */
 981	if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
 982		bounce_skb = alloc_skb(skb->len, GFP_KERNEL | GFP_DMA);
 983		if (!bounce_skb) {
 984			ring->current_slot = old_top_slot;
 985			ring->used_slots = old_used_slots;
 986			err = -ENOMEM;
 987			goto out_unmap_hdr;
 988		}
 989
 990		skb_put_data(bounce_skb, skb->data, skb->len);
 991		memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb));
 992		bounce_skb->dev = skb->dev;
 993		skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb));
 994		info = IEEE80211_SKB_CB(bounce_skb);
 995
 996		dev_kfree_skb_any(skb);
 997		skb = bounce_skb;
 998		*in_skb = bounce_skb;
 999		meta->skb = skb;
1000		meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
1001		if (b43legacy_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
1002			ring->current_slot = old_top_slot;
1003			ring->used_slots = old_used_slots;
1004			err = -EIO;
1005			goto out_free_bounce;
1006		}
1007	}
1008
1009	op32_fill_descriptor(ring, desc, meta->dmaaddr,
1010			     skb->len, 0, 1, 1);
1011
1012	wmb();	/* previous stuff MUST be done */
1013	/* Now transfer the whole frame. */
1014	op32_poke_tx(ring, next_slot(ring, slot));
1015	return 0;
1016
1017out_free_bounce:
1018	dev_kfree_skb_any(skb);
1019out_unmap_hdr:
1020	unmap_descbuffer(ring, meta_hdr->dmaaddr,
1021			 sizeof(struct b43legacy_txhdr_fw3), 1);
1022	return err;
1023}
1024
1025static inline
1026int should_inject_overflow(struct b43legacy_dmaring *ring)
1027{
1028#ifdef CONFIG_B43LEGACY_DEBUG
1029	if (unlikely(b43legacy_debug(ring->dev,
1030				     B43legacy_DBG_DMAOVERFLOW))) {
1031		/* Check if we should inject another ringbuffer overflow
1032		 * to test handling of this situation in the stack. */
1033		unsigned long next_overflow;
1034
1035		next_overflow = ring->last_injected_overflow + HZ;
1036		if (time_after(jiffies, next_overflow)) {
1037			ring->last_injected_overflow = jiffies;
1038			b43legacydbg(ring->dev->wl,
1039			       "Injecting TX ring overflow on "
1040			       "DMA controller %d\n", ring->index);
1041			return 1;
1042		}
1043	}
1044#endif /* CONFIG_B43LEGACY_DEBUG */
1045	return 0;
1046}
1047
1048int b43legacy_dma_tx(struct b43legacy_wldev *dev,
1049		     struct sk_buff *skb)
1050{
1051	struct b43legacy_dmaring *ring;
1052	int err = 0;
1053
1054	ring = priority_to_txring(dev, skb_get_queue_mapping(skb));
1055	B43legacy_WARN_ON(!ring->tx);
1056
1057	if (unlikely(ring->stopped)) {
1058		/* We get here only because of a bug in mac80211.
1059		 * Because of a race, one packet may be queued after
1060		 * the queue is stopped, thus we got called when we shouldn't.
1061		 * For now, just refuse the transmit. */
1062		if (b43legacy_debug(dev, B43legacy_DBG_DMAVERBOSE))
1063			b43legacyerr(dev->wl, "Packet after queue stopped\n");
1064		return -ENOSPC;
1065	}
1066
1067	if (WARN_ON(free_slots(ring) < SLOTS_PER_PACKET)) {
1068		/* If we get here, we have a real error with the queue
1069		 * full, but queues not stopped. */
1070		b43legacyerr(dev->wl, "DMA queue overflow\n");
1071		return -ENOSPC;
1072	}
1073
1074	/* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing
1075	 * into the skb data or cb now. */
1076	err = dma_tx_fragment(ring, &skb);
1077	if (unlikely(err == -ENOKEY)) {
1078		/* Drop this packet, as we don't have the encryption key
1079		 * anymore and must not transmit it unencrypted. */
1080		dev_kfree_skb_any(skb);
1081		return 0;
1082	}
1083	if (unlikely(err)) {
1084		b43legacyerr(dev->wl, "DMA tx mapping failure\n");
1085		return err;
1086	}
1087	if ((free_slots(ring) < SLOTS_PER_PACKET) ||
1088	    should_inject_overflow(ring)) {
1089		/* This TX ring is full. */
1090		unsigned int skb_mapping = skb_get_queue_mapping(skb);
1091		ieee80211_stop_queue(dev->wl->hw, skb_mapping);
1092		dev->wl->tx_queue_stopped[skb_mapping] = 1;
1093		ring->stopped = true;
1094		if (b43legacy_debug(dev, B43legacy_DBG_DMAVERBOSE))
1095			b43legacydbg(dev->wl, "Stopped TX ring %d\n",
1096			       ring->index);
1097	}
1098	return err;
1099}
1100
1101void b43legacy_dma_handle_txstatus(struct b43legacy_wldev *dev,
1102				 const struct b43legacy_txstatus *status)
1103{
1104	struct b43legacy_dmaring *ring;
1105	struct b43legacy_dmadesc_meta *meta;
1106	int retry_limit;
1107	int slot;
1108	int firstused;
1109
1110	ring = parse_cookie(dev, status->cookie, &slot);
1111	if (unlikely(!ring))
1112		return;
1113	B43legacy_WARN_ON(!ring->tx);
1114
1115	/* Sanity check: TX packets are processed in-order on one ring.
1116	 * Check if the slot deduced from the cookie really is the first
1117	 * used slot. */
1118	firstused = ring->current_slot - ring->used_slots + 1;
1119	if (firstused < 0)
1120		firstused = ring->nr_slots + firstused;
1121	if (unlikely(slot != firstused)) {
1122		/* This possibly is a firmware bug and will result in
1123		 * malfunction, memory leaks and/or stall of DMA functionality.
1124		 */
1125		b43legacydbg(dev->wl, "Out of order TX status report on DMA "
1126			     "ring %d. Expected %d, but got %d\n",
1127			     ring->index, firstused, slot);
1128		return;
1129	}
1130
1131	while (1) {
1132		B43legacy_WARN_ON(!(slot >= 0 && slot < ring->nr_slots));
1133		op32_idx2desc(ring, slot, &meta);
1134
1135		if (meta->skb)
1136			unmap_descbuffer(ring, meta->dmaaddr,
1137					 meta->skb->len, 1);
1138		else
1139			unmap_descbuffer(ring, meta->dmaaddr,
1140					 sizeof(struct b43legacy_txhdr_fw3),
1141					 1);
1142
1143		if (meta->is_last_fragment) {
1144			struct ieee80211_tx_info *info;
1145			BUG_ON(!meta->skb);
1146			info = IEEE80211_SKB_CB(meta->skb);
1147
1148			/* preserve the confiured retry limit before clearing the status
1149			 * The xmit function has overwritten the rc's value with the actual
1150			 * retry limit done by the hardware */
1151			retry_limit = info->status.rates[0].count;
1152			ieee80211_tx_info_clear_status(info);
1153
1154			if (status->acked)
1155				info->flags |= IEEE80211_TX_STAT_ACK;
1156
1157			if (status->rts_count > dev->wl->hw->conf.short_frame_max_tx_count) {
1158				/*
1159				 * If the short retries (RTS, not data frame) have exceeded
1160				 * the limit, the hw will not have tried the selected rate,
1161				 * but will have used the fallback rate instead.
1162				 * Don't let the rate control count attempts for the selected
1163				 * rate in this case, otherwise the statistics will be off.
1164				 */
1165				info->status.rates[0].count = 0;
1166				info->status.rates[1].count = status->frame_count;
1167			} else {
1168				if (status->frame_count > retry_limit) {
1169					info->status.rates[0].count = retry_limit;
1170					info->status.rates[1].count = status->frame_count -
1171							retry_limit;
1172
1173				} else {
1174					info->status.rates[0].count = status->frame_count;
1175					info->status.rates[1].idx = -1;
1176				}
1177			}
1178
1179			/* Call back to inform the ieee80211 subsystem about the
1180			 * status of the transmission.
1181			 * Some fields of txstat are already filled in dma_tx().
1182			 */
1183			ieee80211_tx_status_irqsafe(dev->wl->hw, meta->skb);
1184			/* skb is freed by ieee80211_tx_status_irqsafe() */
1185			meta->skb = NULL;
1186		} else {
1187			/* No need to call free_descriptor_buffer here, as
1188			 * this is only the txhdr, which is not allocated.
1189			 */
1190			B43legacy_WARN_ON(meta->skb != NULL);
1191		}
1192
1193		/* Everything unmapped and free'd. So it's not used anymore. */
1194		ring->used_slots--;
1195
1196		if (meta->is_last_fragment)
1197			break;
1198		slot = next_slot(ring, slot);
1199	}
1200	dev->stats.last_tx = jiffies;
1201	if (ring->stopped) {
1202		B43legacy_WARN_ON(free_slots(ring) < SLOTS_PER_PACKET);
1203		ring->stopped = false;
1204	}
1205
1206	if (dev->wl->tx_queue_stopped[ring->queue_prio]) {
1207		dev->wl->tx_queue_stopped[ring->queue_prio] = 0;
1208	} else {
1209		/* If the driver queue is running wake the corresponding
1210		 * mac80211 queue. */
1211		ieee80211_wake_queue(dev->wl->hw, ring->queue_prio);
1212		if (b43legacy_debug(dev, B43legacy_DBG_DMAVERBOSE))
1213			b43legacydbg(dev->wl, "Woke up TX ring %d\n",
1214				     ring->index);
1215	}
1216	/* Add work to the queue. */
1217	ieee80211_queue_work(dev->wl->hw, &dev->wl->tx_work);
1218}
1219
1220static void dma_rx(struct b43legacy_dmaring *ring,
1221		   int *slot)
1222{
1223	struct b43legacy_dmadesc32 *desc;
1224	struct b43legacy_dmadesc_meta *meta;
1225	struct b43legacy_rxhdr_fw3 *rxhdr;
1226	struct sk_buff *skb;
1227	u16 len;
1228	int err;
1229	dma_addr_t dmaaddr;
1230
1231	desc = op32_idx2desc(ring, *slot, &meta);
1232
1233	sync_descbuffer_for_cpu(ring, meta->dmaaddr, ring->rx_buffersize);
1234	skb = meta->skb;
1235
1236	if (ring->index == 3) {
1237		/* We received an xmit status. */
1238		struct b43legacy_hwtxstatus *hw =
1239				(struct b43legacy_hwtxstatus *)skb->data;
1240		int i = 0;
1241
1242		while (hw->cookie == 0) {
1243			if (i > 100)
1244				break;
1245			i++;
1246			udelay(2);
1247			barrier();
1248		}
1249		b43legacy_handle_hwtxstatus(ring->dev, hw);
1250		/* recycle the descriptor buffer. */
1251		sync_descbuffer_for_device(ring, meta->dmaaddr,
1252					   ring->rx_buffersize);
1253
1254		return;
1255	}
1256	rxhdr = (struct b43legacy_rxhdr_fw3 *)skb->data;
1257	len = le16_to_cpu(rxhdr->frame_len);
1258	if (len == 0) {
1259		int i = 0;
1260
1261		do {
1262			udelay(2);
1263			barrier();
1264			len = le16_to_cpu(rxhdr->frame_len);
1265		} while (len == 0 && i++ < 5);
1266		if (unlikely(len == 0)) {
1267			/* recycle the descriptor buffer. */
1268			sync_descbuffer_for_device(ring, meta->dmaaddr,
1269						   ring->rx_buffersize);
1270			goto drop;
1271		}
1272	}
1273	if (unlikely(len > ring->rx_buffersize)) {
1274		/* The data did not fit into one descriptor buffer
1275		 * and is split over multiple buffers.
1276		 * This should never happen, as we try to allocate buffers
1277		 * big enough. So simply ignore this packet.
1278		 */
1279		int cnt = 0;
1280		s32 tmp = len;
1281
1282		while (1) {
1283			desc = op32_idx2desc(ring, *slot, &meta);
1284			/* recycle the descriptor buffer. */
1285			sync_descbuffer_for_device(ring, meta->dmaaddr,
1286						   ring->rx_buffersize);
1287			*slot = next_slot(ring, *slot);
1288			cnt++;
1289			tmp -= ring->rx_buffersize;
1290			if (tmp <= 0)
1291				break;
1292		}
1293		b43legacyerr(ring->dev->wl, "DMA RX buffer too small "
1294		       "(len: %u, buffer: %u, nr-dropped: %d)\n",
1295		       len, ring->rx_buffersize, cnt);
1296		goto drop;
1297	}
1298
1299	dmaaddr = meta->dmaaddr;
1300	err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC);
1301	if (unlikely(err)) {
1302		b43legacydbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer()"
1303			     " failed\n");
1304		sync_descbuffer_for_device(ring, dmaaddr,
1305					   ring->rx_buffersize);
1306		goto drop;
1307	}
1308
1309	unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0);
1310	skb_put(skb, len + ring->frameoffset);
1311	skb_pull(skb, ring->frameoffset);
1312
1313	b43legacy_rx(ring->dev, skb, rxhdr);
1314drop:
1315	return;
1316}
1317
1318void b43legacy_dma_rx(struct b43legacy_dmaring *ring)
1319{
1320	int slot;
1321	int current_slot;
1322	int used_slots = 0;
1323
1324	B43legacy_WARN_ON(ring->tx);
1325	current_slot = op32_get_current_rxslot(ring);
1326	B43legacy_WARN_ON(!(current_slot >= 0 && current_slot <
1327			   ring->nr_slots));
1328
1329	slot = ring->current_slot;
1330	for (; slot != current_slot; slot = next_slot(ring, slot)) {
1331		dma_rx(ring, &slot);
1332		update_max_used_slots(ring, ++used_slots);
1333	}
1334	op32_set_current_rxslot(ring, slot);
1335	ring->current_slot = slot;
1336}
1337
1338static void b43legacy_dma_tx_suspend_ring(struct b43legacy_dmaring *ring)
1339{
1340	B43legacy_WARN_ON(!ring->tx);
1341	op32_tx_suspend(ring);
1342}
1343
1344static void b43legacy_dma_tx_resume_ring(struct b43legacy_dmaring *ring)
1345{
1346	B43legacy_WARN_ON(!ring->tx);
1347	op32_tx_resume(ring);
1348}
1349
1350void b43legacy_dma_tx_suspend(struct b43legacy_wldev *dev)
1351{
1352	b43legacy_power_saving_ctl_bits(dev, -1, 1);
1353	b43legacy_dma_tx_suspend_ring(dev->dma.tx_ring0);
1354	b43legacy_dma_tx_suspend_ring(dev->dma.tx_ring1);
1355	b43legacy_dma_tx_suspend_ring(dev->dma.tx_ring2);
1356	b43legacy_dma_tx_suspend_ring(dev->dma.tx_ring3);
1357	b43legacy_dma_tx_suspend_ring(dev->dma.tx_ring4);
1358	b43legacy_dma_tx_suspend_ring(dev->dma.tx_ring5);
1359}
1360
1361void b43legacy_dma_tx_resume(struct b43legacy_wldev *dev)
1362{
1363	b43legacy_dma_tx_resume_ring(dev->dma.tx_ring5);
1364	b43legacy_dma_tx_resume_ring(dev->dma.tx_ring4);
1365	b43legacy_dma_tx_resume_ring(dev->dma.tx_ring3);
1366	b43legacy_dma_tx_resume_ring(dev->dma.tx_ring2);
1367	b43legacy_dma_tx_resume_ring(dev->dma.tx_ring1);
1368	b43legacy_dma_tx_resume_ring(dev->dma.tx_ring0);
1369	b43legacy_power_saving_ctl_bits(dev, -1, -1);
1370}
~/ Read-only file preview.