root/drivers/net/wireless/broadcom/b43/pio.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. generate_cookie
  2. parse_cookie
  3. index_to_pioqueue_base
  4. pio_txqueue_offset
  5. pio_rxqueue_offset
  6. b43_setup_pioqueue_tx
  7. b43_setup_pioqueue_rx
  8. b43_pio_cancel_tx_packets
  9. b43_destroy_pioqueue_tx
  10. b43_destroy_pioqueue_rx
  11. b43_pio_free
  12. b43_pio_init
  13. select_queue_by_priority
  14. tx_write_2byte_queue
  15. pio_tx_frame_2byte_queue
  16. tx_write_4byte_queue
  17. pio_tx_frame_4byte_queue
  18. pio_tx_frame
  19. b43_pio_tx
  20. b43_pio_handle_txstatus
  21. pio_rx_frame
  22. b43_pio_rx
  23. b43_pio_tx_suspend_queue
  24. b43_pio_tx_resume_queue
  25. b43_pio_tx_suspend
  26. b43_pio_tx_resume

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3 
   4   Broadcom B43 wireless driver
   5 
   6   PIO data transfer
   7 
   8   Copyright (c) 2005-2008 Michael Buesch <m@bues.ch>
   9 
  10 
  11 */
  12 
  13 #include "b43.h"
  14 #include "pio.h"
  15 #include "dma.h"
  16 #include "main.h"
  17 #include "xmit.h"
  18 
  19 #include <linux/delay.h>
  20 #include <linux/sched.h>
  21 #include <linux/slab.h>
  22 
  23 
  24 static u16 generate_cookie(struct b43_pio_txqueue *q,
  25                            struct b43_pio_txpacket *pack)
  26 {
  27         u16 cookie;
  28 
  29         /* Use the upper 4 bits of the cookie as
  30          * PIO controller ID and store the packet index number
  31          * in the lower 12 bits.
  32          * Note that the cookie must never be 0, as this
  33          * is a special value used in RX path.
  34          * It can also not be 0xFFFF because that is special
  35          * for multicast frames.
  36          */
  37         cookie = (((u16)q->index + 1) << 12);
  38         cookie |= pack->index;
  39 
  40         return cookie;
  41 }
  42 
  43 static
  44 struct b43_pio_txqueue *parse_cookie(struct b43_wldev *dev,
  45                                      u16 cookie,
  46                                       struct b43_pio_txpacket **pack)
  47 {
  48         struct b43_pio *pio = &dev->pio;
  49         struct b43_pio_txqueue *q = NULL;
  50         unsigned int pack_index;
  51 
  52         switch (cookie & 0xF000) {
  53         case 0x1000:
  54                 q = pio->tx_queue_AC_BK;
  55                 break;
  56         case 0x2000:
  57                 q = pio->tx_queue_AC_BE;
  58                 break;
  59         case 0x3000:
  60                 q = pio->tx_queue_AC_VI;
  61                 break;
  62         case 0x4000:
  63                 q = pio->tx_queue_AC_VO;
  64                 break;
  65         case 0x5000:
  66                 q = pio->tx_queue_mcast;
  67                 break;
  68         }
  69         if (B43_WARN_ON(!q))
  70                 return NULL;
  71         pack_index = (cookie & 0x0FFF);
  72         if (B43_WARN_ON(pack_index >= ARRAY_SIZE(q->packets)))
  73                 return NULL;
  74         *pack = &q->packets[pack_index];
  75 
  76         return q;
  77 }
  78 
  79 static u16 index_to_pioqueue_base(struct b43_wldev *dev,
  80                                   unsigned int index)
  81 {
  82         static const u16 bases[] = {
  83                 B43_MMIO_PIO_BASE0,
  84                 B43_MMIO_PIO_BASE1,
  85                 B43_MMIO_PIO_BASE2,
  86                 B43_MMIO_PIO_BASE3,
  87                 B43_MMIO_PIO_BASE4,
  88                 B43_MMIO_PIO_BASE5,
  89                 B43_MMIO_PIO_BASE6,
  90                 B43_MMIO_PIO_BASE7,
  91         };
  92         static const u16 bases_rev11[] = {
  93                 B43_MMIO_PIO11_BASE0,
  94                 B43_MMIO_PIO11_BASE1,
  95                 B43_MMIO_PIO11_BASE2,
  96                 B43_MMIO_PIO11_BASE3,
  97                 B43_MMIO_PIO11_BASE4,
  98                 B43_MMIO_PIO11_BASE5,
  99         };
 100 
 101         if (dev->dev->core_rev >= 11) {
 102                 B43_WARN_ON(index >= ARRAY_SIZE(bases_rev11));
 103                 return bases_rev11[index];
 104         }
 105         B43_WARN_ON(index >= ARRAY_SIZE(bases));
 106         return bases[index];
 107 }
 108 
 109 static u16 pio_txqueue_offset(struct b43_wldev *dev)
 110 {
 111         if (dev->dev->core_rev >= 11)
 112                 return 0x18;
 113         return 0;
 114 }
 115 
 116 static u16 pio_rxqueue_offset(struct b43_wldev *dev)
 117 {
 118         if (dev->dev->core_rev >= 11)
 119                 return 0x38;
 120         return 8;
 121 }
 122 
 123 static struct b43_pio_txqueue *b43_setup_pioqueue_tx(struct b43_wldev *dev,
 124                                                      unsigned int index)
 125 {
 126         struct b43_pio_txqueue *q;
 127         struct b43_pio_txpacket *p;
 128         unsigned int i;
 129 
 130         q = kzalloc(sizeof(*q), GFP_KERNEL);
 131         if (!q)
 132                 return NULL;
 133         q->dev = dev;
 134         q->rev = dev->dev->core_rev;
 135         q->mmio_base = index_to_pioqueue_base(dev, index) +
 136                        pio_txqueue_offset(dev);
 137         q->index = index;
 138 
 139         q->free_packet_slots = B43_PIO_MAX_NR_TXPACKETS;
 140         if (q->rev >= 8) {
 141                 q->buffer_size = 1920; //FIXME this constant is wrong.
 142         } else {
 143                 q->buffer_size = b43_piotx_read16(q, B43_PIO_TXQBUFSIZE);
 144                 q->buffer_size -= 80;
 145         }
 146 
 147         INIT_LIST_HEAD(&q->packets_list);
 148         for (i = 0; i < ARRAY_SIZE(q->packets); i++) {
 149                 p = &(q->packets[i]);
 150                 INIT_LIST_HEAD(&p->list);
 151                 p->index = i;
 152                 p->queue = q;
 153                 list_add(&p->list, &q->packets_list);
 154         }
 155 
 156         return q;
 157 }
 158 
 159 static struct b43_pio_rxqueue *b43_setup_pioqueue_rx(struct b43_wldev *dev,
 160                                                      unsigned int index)
 161 {
 162         struct b43_pio_rxqueue *q;
 163 
 164         q = kzalloc(sizeof(*q), GFP_KERNEL);
 165         if (!q)
 166                 return NULL;
 167         q->dev = dev;
 168         q->rev = dev->dev->core_rev;
 169         q->mmio_base = index_to_pioqueue_base(dev, index) +
 170                        pio_rxqueue_offset(dev);
 171 
 172         /* Enable Direct FIFO RX (PIO) on the engine. */
 173         b43_dma_direct_fifo_rx(dev, index, 1);
 174 
 175         return q;
 176 }
 177 
 178 static void b43_pio_cancel_tx_packets(struct b43_pio_txqueue *q)
 179 {
 180         struct b43_pio_txpacket *pack;
 181         unsigned int i;
 182 
 183         for (i = 0; i < ARRAY_SIZE(q->packets); i++) {
 184                 pack = &(q->packets[i]);
 185                 if (pack->skb) {
 186                         ieee80211_free_txskb(q->dev->wl->hw, pack->skb);
 187                         pack->skb = NULL;
 188                 }
 189         }
 190 }
 191 
 192 static void b43_destroy_pioqueue_tx(struct b43_pio_txqueue *q,
 193                                     const char *name)
 194 {
 195         if (!q)
 196                 return;
 197         b43_pio_cancel_tx_packets(q);
 198         kfree(q);
 199 }
 200 
 201 static void b43_destroy_pioqueue_rx(struct b43_pio_rxqueue *q,
 202                                     const char *name)
 203 {
 204         if (!q)
 205                 return;
 206         kfree(q);
 207 }
 208 
 209 #define destroy_queue_tx(pio, queue) do {                               \
 210         b43_destroy_pioqueue_tx((pio)->queue, __stringify(queue));      \
 211         (pio)->queue = NULL;                                            \
 212   } while (0)
 213 
 214 #define destroy_queue_rx(pio, queue) do {                               \
 215         b43_destroy_pioqueue_rx((pio)->queue, __stringify(queue));      \
 216         (pio)->queue = NULL;                                            \
 217   } while (0)
 218 
 219 void b43_pio_free(struct b43_wldev *dev)
 220 {
 221         struct b43_pio *pio;
 222 
 223         if (!b43_using_pio_transfers(dev))
 224                 return;
 225         pio = &dev->pio;
 226 
 227         destroy_queue_rx(pio, rx_queue);
 228         destroy_queue_tx(pio, tx_queue_mcast);
 229         destroy_queue_tx(pio, tx_queue_AC_VO);
 230         destroy_queue_tx(pio, tx_queue_AC_VI);
 231         destroy_queue_tx(pio, tx_queue_AC_BE);
 232         destroy_queue_tx(pio, tx_queue_AC_BK);
 233 }
 234 
 235 int b43_pio_init(struct b43_wldev *dev)
 236 {
 237         struct b43_pio *pio = &dev->pio;
 238         int err = -ENOMEM;
 239 
 240         b43_write32(dev, B43_MMIO_MACCTL, b43_read32(dev, B43_MMIO_MACCTL)
 241                     & ~B43_MACCTL_BE);
 242         b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_RXPADOFF, 0);
 243 
 244         pio->tx_queue_AC_BK = b43_setup_pioqueue_tx(dev, 0);
 245         if (!pio->tx_queue_AC_BK)
 246                 goto out;
 247 
 248         pio->tx_queue_AC_BE = b43_setup_pioqueue_tx(dev, 1);
 249         if (!pio->tx_queue_AC_BE)
 250                 goto err_destroy_bk;
 251 
 252         pio->tx_queue_AC_VI = b43_setup_pioqueue_tx(dev, 2);
 253         if (!pio->tx_queue_AC_VI)
 254                 goto err_destroy_be;
 255 
 256         pio->tx_queue_AC_VO = b43_setup_pioqueue_tx(dev, 3);
 257         if (!pio->tx_queue_AC_VO)
 258                 goto err_destroy_vi;
 259 
 260         pio->tx_queue_mcast = b43_setup_pioqueue_tx(dev, 4);
 261         if (!pio->tx_queue_mcast)
 262                 goto err_destroy_vo;
 263 
 264         pio->rx_queue = b43_setup_pioqueue_rx(dev, 0);
 265         if (!pio->rx_queue)
 266                 goto err_destroy_mcast;
 267 
 268         b43dbg(dev->wl, "PIO initialized\n");
 269         err = 0;
 270 out:
 271         return err;
 272 
 273 err_destroy_mcast:
 274         destroy_queue_tx(pio, tx_queue_mcast);
 275 err_destroy_vo:
 276         destroy_queue_tx(pio, tx_queue_AC_VO);
 277 err_destroy_vi:
 278         destroy_queue_tx(pio, tx_queue_AC_VI);
 279 err_destroy_be:
 280         destroy_queue_tx(pio, tx_queue_AC_BE);
 281 err_destroy_bk:
 282         destroy_queue_tx(pio, tx_queue_AC_BK);
 283         return err;
 284 }
 285 
 286 /* Static mapping of mac80211's queues (priorities) to b43 PIO queues. */
 287 static struct b43_pio_txqueue *select_queue_by_priority(struct b43_wldev *dev,
 288                                                         u8 queue_prio)
 289 {
 290         struct b43_pio_txqueue *q;
 291 
 292         if (dev->qos_enabled) {
 293                 /* 0 = highest priority */
 294                 switch (queue_prio) {
 295                 default:
 296                         B43_WARN_ON(1);
 297                         /* fallthrough */
 298                 case 0:
 299                         q = dev->pio.tx_queue_AC_VO;
 300                         break;
 301                 case 1:
 302                         q = dev->pio.tx_queue_AC_VI;
 303                         break;
 304                 case 2:
 305                         q = dev->pio.tx_queue_AC_BE;
 306                         break;
 307                 case 3:
 308                         q = dev->pio.tx_queue_AC_BK;
 309                         break;
 310                 }
 311         } else
 312                 q = dev->pio.tx_queue_AC_BE;
 313 
 314         return q;
 315 }
 316 
 317 static u16 tx_write_2byte_queue(struct b43_pio_txqueue *q,
 318                                 u16 ctl,
 319                                 const void *_data,
 320                                 unsigned int data_len)
 321 {
 322         struct b43_wldev *dev = q->dev;
 323         struct b43_wl *wl = dev->wl;
 324         const u8 *data = _data;
 325 
 326         ctl |= B43_PIO_TXCTL_WRITELO | B43_PIO_TXCTL_WRITEHI;
 327         b43_piotx_write16(q, B43_PIO_TXCTL, ctl);
 328 
 329         b43_block_write(dev, data, (data_len & ~1),
 330                         q->mmio_base + B43_PIO_TXDATA,
 331                         sizeof(u16));
 332         if (data_len & 1) {
 333                 u8 *tail = wl->pio_tailspace;
 334                 BUILD_BUG_ON(sizeof(wl->pio_tailspace) < 2);
 335 
 336                 /* Write the last byte. */
 337                 ctl &= ~B43_PIO_TXCTL_WRITEHI;
 338                 b43_piotx_write16(q, B43_PIO_TXCTL, ctl);
 339                 tail[0] = data[data_len - 1];
 340                 tail[1] = 0;
 341                 b43_block_write(dev, tail, 2,
 342                                 q->mmio_base + B43_PIO_TXDATA,
 343                                 sizeof(u16));
 344         }
 345 
 346         return ctl;
 347 }
 348 
 349 static void pio_tx_frame_2byte_queue(struct b43_pio_txpacket *pack,
 350                                      const u8 *hdr, unsigned int hdrlen)
 351 {
 352         struct b43_pio_txqueue *q = pack->queue;
 353         const char *frame = pack->skb->data;
 354         unsigned int frame_len = pack->skb->len;
 355         u16 ctl;
 356 
 357         ctl = b43_piotx_read16(q, B43_PIO_TXCTL);
 358         ctl |= B43_PIO_TXCTL_FREADY;
 359         ctl &= ~B43_PIO_TXCTL_EOF;
 360 
 361         /* Transfer the header data. */
 362         ctl = tx_write_2byte_queue(q, ctl, hdr, hdrlen);
 363         /* Transfer the frame data. */
 364         ctl = tx_write_2byte_queue(q, ctl, frame, frame_len);
 365 
 366         ctl |= B43_PIO_TXCTL_EOF;
 367         b43_piotx_write16(q, B43_PIO_TXCTL, ctl);
 368 }
 369 
 370 static u32 tx_write_4byte_queue(struct b43_pio_txqueue *q,
 371                                 u32 ctl,
 372                                 const void *_data,
 373                                 unsigned int data_len)
 374 {
 375         struct b43_wldev *dev = q->dev;
 376         struct b43_wl *wl = dev->wl;
 377         const u8 *data = _data;
 378 
 379         ctl |= B43_PIO8_TXCTL_0_7 | B43_PIO8_TXCTL_8_15 |
 380                B43_PIO8_TXCTL_16_23 | B43_PIO8_TXCTL_24_31;
 381         b43_piotx_write32(q, B43_PIO8_TXCTL, ctl);
 382 
 383         b43_block_write(dev, data, (data_len & ~3),
 384                         q->mmio_base + B43_PIO8_TXDATA,
 385                         sizeof(u32));
 386         if (data_len & 3) {
 387                 u8 *tail = wl->pio_tailspace;
 388                 BUILD_BUG_ON(sizeof(wl->pio_tailspace) < 4);
 389 
 390                 memset(tail, 0, 4);
 391                 /* Write the last few bytes. */
 392                 ctl &= ~(B43_PIO8_TXCTL_8_15 | B43_PIO8_TXCTL_16_23 |
 393                          B43_PIO8_TXCTL_24_31);
 394                 switch (data_len & 3) {
 395                 case 3:
 396                         ctl |= B43_PIO8_TXCTL_16_23 | B43_PIO8_TXCTL_8_15;
 397                         tail[0] = data[data_len - 3];
 398                         tail[1] = data[data_len - 2];
 399                         tail[2] = data[data_len - 1];
 400                         break;
 401                 case 2:
 402                         ctl |= B43_PIO8_TXCTL_8_15;
 403                         tail[0] = data[data_len - 2];
 404                         tail[1] = data[data_len - 1];
 405                         break;
 406                 case 1:
 407                         tail[0] = data[data_len - 1];
 408                         break;
 409                 }
 410                 b43_piotx_write32(q, B43_PIO8_TXCTL, ctl);
 411                 b43_block_write(dev, tail, 4,
 412                                 q->mmio_base + B43_PIO8_TXDATA,
 413                                 sizeof(u32));
 414         }
 415 
 416         return ctl;
 417 }
 418 
 419 static void pio_tx_frame_4byte_queue(struct b43_pio_txpacket *pack,
 420                                      const u8 *hdr, unsigned int hdrlen)
 421 {
 422         struct b43_pio_txqueue *q = pack->queue;
 423         const char *frame = pack->skb->data;
 424         unsigned int frame_len = pack->skb->len;
 425         u32 ctl;
 426 
 427         ctl = b43_piotx_read32(q, B43_PIO8_TXCTL);
 428         ctl |= B43_PIO8_TXCTL_FREADY;
 429         ctl &= ~B43_PIO8_TXCTL_EOF;
 430 
 431         /* Transfer the header data. */
 432         ctl = tx_write_4byte_queue(q, ctl, hdr, hdrlen);
 433         /* Transfer the frame data. */
 434         ctl = tx_write_4byte_queue(q, ctl, frame, frame_len);
 435 
 436         ctl |= B43_PIO8_TXCTL_EOF;
 437         b43_piotx_write32(q, B43_PIO_TXCTL, ctl);
 438 }
 439 
 440 static int pio_tx_frame(struct b43_pio_txqueue *q,
 441                         struct sk_buff *skb)
 442 {
 443         struct b43_wldev *dev = q->dev;
 444         struct b43_wl *wl = dev->wl;
 445         struct b43_pio_txpacket *pack;
 446         u16 cookie;
 447         int err;
 448         unsigned int hdrlen;
 449         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 450         struct b43_txhdr *txhdr = (struct b43_txhdr *)wl->pio_scratchspace;
 451 
 452         B43_WARN_ON(list_empty(&q->packets_list));
 453         pack = list_entry(q->packets_list.next,
 454                           struct b43_pio_txpacket, list);
 455 
 456         cookie = generate_cookie(q, pack);
 457         hdrlen = b43_txhdr_size(dev);
 458         BUILD_BUG_ON(sizeof(wl->pio_scratchspace) < sizeof(struct b43_txhdr));
 459         B43_WARN_ON(sizeof(wl->pio_scratchspace) < hdrlen);
 460         err = b43_generate_txhdr(dev, (u8 *)txhdr, skb,
 461                                  info, cookie);
 462         if (err)
 463                 return err;
 464 
 465         if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
 466                 /* Tell the firmware about the cookie of the last
 467                  * mcast frame, so it can clear the more-data bit in it. */
 468                 b43_shm_write16(dev, B43_SHM_SHARED,
 469                                 B43_SHM_SH_MCASTCOOKIE, cookie);
 470         }
 471 
 472         pack->skb = skb;
 473         if (q->rev >= 8)
 474                 pio_tx_frame_4byte_queue(pack, (const u8 *)txhdr, hdrlen);
 475         else
 476                 pio_tx_frame_2byte_queue(pack, (const u8 *)txhdr, hdrlen);
 477 
 478         /* Remove it from the list of available packet slots.
 479          * It will be put back when we receive the status report. */
 480         list_del(&pack->list);
 481 
 482         /* Update the queue statistics. */
 483         q->buffer_used += roundup(skb->len + hdrlen, 4);
 484         q->free_packet_slots -= 1;
 485 
 486         return 0;
 487 }
 488 
 489 int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
 490 {
 491         struct b43_pio_txqueue *q;
 492         struct ieee80211_hdr *hdr;
 493         unsigned int hdrlen, total_len;
 494         int err = 0;
 495         struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 496 
 497         hdr = (struct ieee80211_hdr *)skb->data;
 498 
 499         if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
 500                 /* The multicast queue will be sent after the DTIM. */
 501                 q = dev->pio.tx_queue_mcast;
 502                 /* Set the frame More-Data bit. Ucode will clear it
 503                  * for us on the last frame. */
 504                 hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREDATA);
 505         } else {
 506                 /* Decide by priority where to put this frame. */
 507                 q = select_queue_by_priority(dev, skb_get_queue_mapping(skb));
 508         }
 509 
 510         hdrlen = b43_txhdr_size(dev);
 511         total_len = roundup(skb->len + hdrlen, 4);
 512 
 513         if (unlikely(total_len > q->buffer_size)) {
 514                 err = -ENOBUFS;
 515                 b43dbg(dev->wl, "PIO: TX packet longer than queue.\n");
 516                 goto out;
 517         }
 518         if (unlikely(q->free_packet_slots == 0)) {
 519                 err = -ENOBUFS;
 520                 b43warn(dev->wl, "PIO: TX packet overflow.\n");
 521                 goto out;
 522         }
 523         B43_WARN_ON(q->buffer_used > q->buffer_size);
 524 
 525         if (total_len > (q->buffer_size - q->buffer_used)) {
 526                 /* Not enough memory on the queue. */
 527                 err = -EBUSY;
 528                 ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
 529                 q->stopped = true;
 530                 goto out;
 531         }
 532 
 533         /* Assign the queue number to the ring (if not already done before)
 534          * so TX status handling can use it. The mac80211-queue to b43-queue
 535          * mapping is static, so we don't need to store it per frame. */
 536         q->queue_prio = skb_get_queue_mapping(skb);
 537 
 538         err = pio_tx_frame(q, skb);
 539         if (unlikely(err == -ENOKEY)) {
 540                 /* Drop this packet, as we don't have the encryption key
 541                  * anymore and must not transmit it unencrypted. */
 542                 ieee80211_free_txskb(dev->wl->hw, skb);
 543                 err = 0;
 544                 goto out;
 545         }
 546         if (unlikely(err)) {
 547                 b43err(dev->wl, "PIO transmission failure\n");
 548                 goto out;
 549         }
 550 
 551         B43_WARN_ON(q->buffer_used > q->buffer_size);
 552         if (((q->buffer_size - q->buffer_used) < roundup(2 + 2 + 6, 4)) ||
 553             (q->free_packet_slots == 0)) {
 554                 /* The queue is full. */
 555                 ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
 556                 q->stopped = true;
 557         }
 558 
 559 out:
 560         return err;
 561 }
 562 
 563 void b43_pio_handle_txstatus(struct b43_wldev *dev,
 564                              const struct b43_txstatus *status)
 565 {
 566         struct b43_pio_txqueue *q;
 567         struct b43_pio_txpacket *pack = NULL;
 568         unsigned int total_len;
 569         struct ieee80211_tx_info *info;
 570 
 571         q = parse_cookie(dev, status->cookie, &pack);
 572         if (unlikely(!q))
 573                 return;
 574         B43_WARN_ON(!pack);
 575 
 576         info = IEEE80211_SKB_CB(pack->skb);
 577 
 578         b43_fill_txstatus_report(dev, info, status);
 579 
 580         total_len = pack->skb->len + b43_txhdr_size(dev);
 581         total_len = roundup(total_len, 4);
 582         q->buffer_used -= total_len;
 583         q->free_packet_slots += 1;
 584 
 585         ieee80211_tx_status(dev->wl->hw, pack->skb);
 586         pack->skb = NULL;
 587         list_add(&pack->list, &q->packets_list);
 588 
 589         if (q->stopped) {
 590                 ieee80211_wake_queue(dev->wl->hw, q->queue_prio);
 591                 q->stopped = false;
 592         }
 593 }
 594 
 595 /* Returns whether we should fetch another frame. */
 596 static bool pio_rx_frame(struct b43_pio_rxqueue *q)
 597 {
 598         struct b43_wldev *dev = q->dev;
 599         struct b43_wl *wl = dev->wl;
 600         u16 len;
 601         u32 macstat = 0;
 602         unsigned int i, padding;
 603         struct sk_buff *skb;
 604         const char *err_msg = NULL;
 605         struct b43_rxhdr_fw4 *rxhdr =
 606                 (struct b43_rxhdr_fw4 *)wl->pio_scratchspace;
 607         size_t rxhdr_size = sizeof(*rxhdr);
 608 
 609         BUILD_BUG_ON(sizeof(wl->pio_scratchspace) < sizeof(*rxhdr));
 610         switch (dev->fw.hdr_format) {
 611         case B43_FW_HDR_410:
 612         case B43_FW_HDR_351:
 613                 rxhdr_size -= sizeof(rxhdr->format_598) -
 614                         sizeof(rxhdr->format_351);
 615                 break;
 616         case B43_FW_HDR_598:
 617                 break;
 618         }
 619         memset(rxhdr, 0, rxhdr_size);
 620 
 621         /* Check if we have data and wait for it to get ready. */
 622         if (q->rev >= 8) {
 623                 u32 ctl;
 624 
 625                 ctl = b43_piorx_read32(q, B43_PIO8_RXCTL);
 626                 if (!(ctl & B43_PIO8_RXCTL_FRAMERDY))
 627                         return false;
 628                 b43_piorx_write32(q, B43_PIO8_RXCTL,
 629                                   B43_PIO8_RXCTL_FRAMERDY);
 630                 for (i = 0; i < 10; i++) {
 631                         ctl = b43_piorx_read32(q, B43_PIO8_RXCTL);
 632                         if (ctl & B43_PIO8_RXCTL_DATARDY)
 633                                 goto data_ready;
 634                         udelay(10);
 635                 }
 636         } else {
 637                 u16 ctl;
 638 
 639                 ctl = b43_piorx_read16(q, B43_PIO_RXCTL);
 640                 if (!(ctl & B43_PIO_RXCTL_FRAMERDY))
 641                         return false;
 642                 b43_piorx_write16(q, B43_PIO_RXCTL,
 643                                   B43_PIO_RXCTL_FRAMERDY);
 644                 for (i = 0; i < 10; i++) {
 645                         ctl = b43_piorx_read16(q, B43_PIO_RXCTL);
 646                         if (ctl & B43_PIO_RXCTL_DATARDY)
 647                                 goto data_ready;
 648                         udelay(10);
 649                 }
 650         }
 651         b43dbg(q->dev->wl, "PIO RX timed out\n");
 652         return true;
 653 data_ready:
 654 
 655         /* Get the preamble (RX header) */
 656         if (q->rev >= 8) {
 657                 b43_block_read(dev, rxhdr, rxhdr_size,
 658                                q->mmio_base + B43_PIO8_RXDATA,
 659                                sizeof(u32));
 660         } else {
 661                 b43_block_read(dev, rxhdr, rxhdr_size,
 662                                q->mmio_base + B43_PIO_RXDATA,
 663                                sizeof(u16));
 664         }
 665         /* Sanity checks. */
 666         len = le16_to_cpu(rxhdr->frame_len);
 667         if (unlikely(len > 0x700)) {
 668                 err_msg = "len > 0x700";
 669                 goto rx_error;
 670         }
 671         if (unlikely(len == 0)) {
 672                 err_msg = "len == 0";
 673                 goto rx_error;
 674         }
 675 
 676         switch (dev->fw.hdr_format) {
 677         case B43_FW_HDR_598:
 678                 macstat = le32_to_cpu(rxhdr->format_598.mac_status);
 679                 break;
 680         case B43_FW_HDR_410:
 681         case B43_FW_HDR_351:
 682                 macstat = le32_to_cpu(rxhdr->format_351.mac_status);
 683                 break;
 684         }
 685         if (macstat & B43_RX_MAC_FCSERR) {
 686                 if (!(q->dev->wl->filter_flags & FIF_FCSFAIL)) {
 687                         /* Drop frames with failed FCS. */
 688                         err_msg = "Frame FCS error";
 689                         goto rx_error;
 690                 }
 691         }
 692 
 693         /* We always pad 2 bytes, as that's what upstream code expects
 694          * due to the RX-header being 30 bytes. In case the frame is
 695          * unaligned, we pad another 2 bytes. */
 696         padding = (macstat & B43_RX_MAC_PADDING) ? 2 : 0;
 697         skb = dev_alloc_skb(len + padding + 2);
 698         if (unlikely(!skb)) {
 699                 err_msg = "Out of memory";
 700                 goto rx_error;
 701         }
 702         skb_reserve(skb, 2);
 703         skb_put(skb, len + padding);
 704         if (q->rev >= 8) {
 705                 b43_block_read(dev, skb->data + padding, (len & ~3),
 706                                q->mmio_base + B43_PIO8_RXDATA,
 707                                sizeof(u32));
 708                 if (len & 3) {
 709                         u8 *tail = wl->pio_tailspace;
 710                         BUILD_BUG_ON(sizeof(wl->pio_tailspace) < 4);
 711 
 712                         /* Read the last few bytes. */
 713                         b43_block_read(dev, tail, 4,
 714                                        q->mmio_base + B43_PIO8_RXDATA,
 715                                        sizeof(u32));
 716                         switch (len & 3) {
 717                         case 3:
 718                                 skb->data[len + padding - 3] = tail[0];
 719                                 skb->data[len + padding - 2] = tail[1];
 720                                 skb->data[len + padding - 1] = tail[2];
 721                                 break;
 722                         case 2:
 723                                 skb->data[len + padding - 2] = tail[0];
 724                                 skb->data[len + padding - 1] = tail[1];
 725                                 break;
 726                         case 1:
 727                                 skb->data[len + padding - 1] = tail[0];
 728                                 break;
 729                         }
 730                 }
 731         } else {
 732                 b43_block_read(dev, skb->data + padding, (len & ~1),
 733                                q->mmio_base + B43_PIO_RXDATA,
 734                                sizeof(u16));
 735                 if (len & 1) {
 736                         u8 *tail = wl->pio_tailspace;
 737                         BUILD_BUG_ON(sizeof(wl->pio_tailspace) < 2);
 738 
 739                         /* Read the last byte. */
 740                         b43_block_read(dev, tail, 2,
 741                                        q->mmio_base + B43_PIO_RXDATA,
 742                                        sizeof(u16));
 743                         skb->data[len + padding - 1] = tail[0];
 744                 }
 745         }
 746 
 747         b43_rx(q->dev, skb, rxhdr);
 748 
 749         return true;
 750 
 751 rx_error:
 752         if (err_msg)
 753                 b43dbg(q->dev->wl, "PIO RX error: %s\n", err_msg);
 754         if (q->rev >= 8)
 755                 b43_piorx_write32(q, B43_PIO8_RXCTL, B43_PIO8_RXCTL_DATARDY);
 756         else
 757                 b43_piorx_write16(q, B43_PIO_RXCTL, B43_PIO_RXCTL_DATARDY);
 758 
 759         return true;
 760 }
 761 
 762 void b43_pio_rx(struct b43_pio_rxqueue *q)
 763 {
 764         unsigned int count = 0;
 765         bool stop;
 766 
 767         while (1) {
 768                 stop = (pio_rx_frame(q) == 0);
 769                 if (stop)
 770                         break;
 771                 cond_resched();
 772                 if (WARN_ON_ONCE(++count > 10000))
 773                         break;
 774         }
 775 }
 776 
 777 static void b43_pio_tx_suspend_queue(struct b43_pio_txqueue *q)
 778 {
 779         if (q->rev >= 8) {
 780                 b43_piotx_write32(q, B43_PIO8_TXCTL,
 781                                   b43_piotx_read32(q, B43_PIO8_TXCTL)
 782                                   | B43_PIO8_TXCTL_SUSPREQ);
 783         } else {
 784                 b43_piotx_write16(q, B43_PIO_TXCTL,
 785                                   b43_piotx_read16(q, B43_PIO_TXCTL)
 786                                   | B43_PIO_TXCTL_SUSPREQ);
 787         }
 788 }
 789 
 790 static void b43_pio_tx_resume_queue(struct b43_pio_txqueue *q)
 791 {
 792         if (q->rev >= 8) {
 793                 b43_piotx_write32(q, B43_PIO8_TXCTL,
 794                                   b43_piotx_read32(q, B43_PIO8_TXCTL)
 795                                   & ~B43_PIO8_TXCTL_SUSPREQ);
 796         } else {
 797                 b43_piotx_write16(q, B43_PIO_TXCTL,
 798                                   b43_piotx_read16(q, B43_PIO_TXCTL)
 799                                   & ~B43_PIO_TXCTL_SUSPREQ);
 800         }
 801 }
 802 
 803 void b43_pio_tx_suspend(struct b43_wldev *dev)
 804 {
 805         b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
 806         b43_pio_tx_suspend_queue(dev->pio.tx_queue_AC_BK);
 807         b43_pio_tx_suspend_queue(dev->pio.tx_queue_AC_BE);
 808         b43_pio_tx_suspend_queue(dev->pio.tx_queue_AC_VI);
 809         b43_pio_tx_suspend_queue(dev->pio.tx_queue_AC_VO);
 810         b43_pio_tx_suspend_queue(dev->pio.tx_queue_mcast);
 811 }
 812 
 813 void b43_pio_tx_resume(struct b43_wldev *dev)
 814 {
 815         b43_pio_tx_resume_queue(dev->pio.tx_queue_mcast);
 816         b43_pio_tx_resume_queue(dev->pio.tx_queue_AC_VO);
 817         b43_pio_tx_resume_queue(dev->pio.tx_queue_AC_VI);
 818         b43_pio_tx_resume_queue(dev->pio.tx_queue_AC_BE);
 819         b43_pio_tx_resume_queue(dev->pio.tx_queue_AC_BK);
 820         b43_power_saving_ctl_bits(dev, 0);
 821 }

/* [<][>][^][v][top][bottom][index][help] */