1 /* 2 * Atheros CARL9170 driver 3 * 4 * 802.11 & command trap routines 5 * 6 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net> 7 * Copyright 2009, 2010, Christian Lamparter <chunkeey@googlemail.com> 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; see the file COPYING. If not, see 21 * http://www.gnu.org/licenses/. 22 * 23 * This file incorporates work covered by the following copyright and 24 * permission notice: 25 * Copyright (c) 2007-2008 Atheros Communications, Inc. 26 * 27 * Permission to use, copy, modify, and/or distribute this software for any 28 * purpose with or without fee is hereby granted, provided that the above 29 * copyright notice and this permission notice appear in all copies. 30 * 31 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 32 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 33 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 34 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 35 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 36 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 37 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 38 */ 39 40 #include <linux/slab.h> 41 #include <linux/module.h> 42 #include <linux/etherdevice.h> 43 #include <linux/crc32.h> 44 #include <net/mac80211.h> 45 #include "carl9170.h" 46 #include "hw.h" 47 #include "cmd.h" 48 49 static void carl9170_dbg_message(struct ar9170 *ar, const char *buf, u32 len) 50 { 51 bool restart = false; 52 enum carl9170_restart_reasons reason = CARL9170_RR_NO_REASON; 53 54 if (len > 3) { 55 if (memcmp(buf, CARL9170_ERR_MAGIC, 3) == 0) { 56 ar->fw.err_counter++; 57 if (ar->fw.err_counter > 3) { 58 restart = true; 59 reason = CARL9170_RR_TOO_MANY_FIRMWARE_ERRORS; 60 } 61 } 62 63 if (memcmp(buf, CARL9170_BUG_MAGIC, 3) == 0) { 64 ar->fw.bug_counter++; 65 restart = true; 66 reason = CARL9170_RR_FATAL_FIRMWARE_ERROR; 67 } 68 } 69 70 wiphy_info(ar->hw->wiphy, "FW: %.*s\n", len, buf); 71 72 if (restart) 73 carl9170_restart(ar, reason); 74 } 75 76 static void carl9170_handle_ps(struct ar9170 *ar, struct carl9170_rsp *rsp) 77 { 78 u32 ps; 79 bool new_ps; 80 81 ps = le32_to_cpu(rsp->psm.state); 82 83 new_ps = (ps & CARL9170_PSM_COUNTER) != CARL9170_PSM_WAKE; 84 if (ar->ps.state != new_ps) { 85 if (!new_ps) { 86 ar->ps.sleep_ms = jiffies_to_msecs(jiffies - 87 ar->ps.last_action); 88 } 89 90 ar->ps.last_action = jiffies; 91 92 ar->ps.state = new_ps; 93 } 94 } 95 96 static int carl9170_check_sequence(struct ar9170 *ar, unsigned int seq) 97 { 98 if (ar->cmd_seq < -1) 99 return 0; 100 101 /* 102 * Initialize Counter 103 */ 104 if (ar->cmd_seq < 0) 105 ar->cmd_seq = seq; 106 107 /* 108 * The sequence is strictly monotonic increasing and it never skips! 109 * 110 * Therefore we can safely assume that whenever we received an 111 * unexpected sequence we have lost some valuable data. 112 */ 113 if (seq != ar->cmd_seq) { 114 int count; 115 116 count = (seq - ar->cmd_seq) % ar->fw.cmd_bufs; 117 118 wiphy_err(ar->hw->wiphy, "lost %d command responses/traps! " 119 "w:%d g:%d\n", count, ar->cmd_seq, seq); 120 121 carl9170_restart(ar, CARL9170_RR_LOST_RSP); 122 return -EIO; 123 } 124 125 ar->cmd_seq = (ar->cmd_seq + 1) % ar->fw.cmd_bufs; 126 return 0; 127 } 128 129 static void carl9170_cmd_callback(struct ar9170 *ar, u32 len, void *buffer) 130 { 131 /* 132 * Some commands may have a variable response length 133 * and we cannot predict the correct length in advance. 134 * So we only check if we provided enough space for the data. 135 */ 136 if (unlikely(ar->readlen != (len - 4))) { 137 dev_warn(&ar->udev->dev, "received invalid command response:" 138 "got %d, instead of %d\n", len - 4, ar->readlen); 139 print_hex_dump_bytes("carl9170 cmd:", DUMP_PREFIX_OFFSET, 140 ar->cmd_buf, (ar->cmd.hdr.len + 4) & 0x3f); 141 print_hex_dump_bytes("carl9170 rsp:", DUMP_PREFIX_OFFSET, 142 buffer, len); 143 /* 144 * Do not complete. The command times out, 145 * and we get a stack trace from there. 146 */ 147 carl9170_restart(ar, CARL9170_RR_INVALID_RSP); 148 } 149 150 spin_lock(&ar->cmd_lock); 151 if (ar->readbuf) { 152 if (len >= 4) 153 memcpy(ar->readbuf, buffer + 4, len - 4); 154 155 ar->readbuf = NULL; 156 } 157 complete(&ar->cmd_wait); 158 spin_unlock(&ar->cmd_lock); 159 } 160 161 void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len) 162 { 163 struct carl9170_rsp *cmd = buf; 164 struct ieee80211_vif *vif; 165 166 if ((cmd->hdr.cmd & CARL9170_RSP_FLAG) != CARL9170_RSP_FLAG) { 167 if (!(cmd->hdr.cmd & CARL9170_CMD_ASYNC_FLAG)) 168 carl9170_cmd_callback(ar, len, buf); 169 170 return; 171 } 172 173 if (unlikely(cmd->hdr.len != (len - 4))) { 174 if (net_ratelimit()) { 175 wiphy_err(ar->hw->wiphy, "FW: received over-/under" 176 "sized event %x (%d, but should be %d).\n", 177 cmd->hdr.cmd, cmd->hdr.len, len - 4); 178 179 print_hex_dump_bytes("dump:", DUMP_PREFIX_NONE, 180 buf, len); 181 } 182 183 return; 184 } 185 186 /* hardware event handlers */ 187 switch (cmd->hdr.cmd) { 188 case CARL9170_RSP_PRETBTT: 189 /* pre-TBTT event */ 190 rcu_read_lock(); 191 vif = carl9170_get_main_vif(ar); 192 193 if (!vif) { 194 rcu_read_unlock(); 195 break; 196 } 197 198 switch (vif->type) { 199 case NL80211_IFTYPE_STATION: 200 carl9170_handle_ps(ar, cmd); 201 break; 202 203 case NL80211_IFTYPE_AP: 204 case NL80211_IFTYPE_ADHOC: 205 case NL80211_IFTYPE_MESH_POINT: 206 carl9170_update_beacon(ar, true); 207 break; 208 209 default: 210 break; 211 } 212 rcu_read_unlock(); 213 214 break; 215 216 217 case CARL9170_RSP_TXCOMP: 218 /* TX status notification */ 219 carl9170_tx_process_status(ar, cmd); 220 break; 221 222 case CARL9170_RSP_BEACON_CONFIG: 223 /* 224 * (IBSS) beacon send notification 225 * bytes: 04 c2 XX YY B4 B3 B2 B1 226 * 227 * XX always 80 228 * YY always 00 229 * B1-B4 "should" be the number of send out beacons. 230 */ 231 break; 232 233 case CARL9170_RSP_ATIM: 234 /* End of Atim Window */ 235 break; 236 237 case CARL9170_RSP_WATCHDOG: 238 /* Watchdog Interrupt */ 239 carl9170_restart(ar, CARL9170_RR_WATCHDOG); 240 break; 241 242 case CARL9170_RSP_TEXT: 243 /* firmware debug */ 244 carl9170_dbg_message(ar, (char *)buf + 4, len - 4); 245 break; 246 247 case CARL9170_RSP_HEXDUMP: 248 wiphy_dbg(ar->hw->wiphy, "FW: HD %d\n", len - 4); 249 print_hex_dump_bytes("FW:", DUMP_PREFIX_NONE, 250 (char *)buf + 4, len - 4); 251 break; 252 253 case CARL9170_RSP_RADAR: 254 if (!net_ratelimit()) 255 break; 256 257 wiphy_info(ar->hw->wiphy, "FW: RADAR! Please report this " 258 "incident to linux-wireless@vger.kernel.org !\n"); 259 break; 260 261 case CARL9170_RSP_GPIO: 262 #ifdef CONFIG_CARL9170_WPC 263 if (ar->wps.pbc) { 264 bool state = !!(cmd->gpio.gpio & cpu_to_le32( 265 AR9170_GPIO_PORT_WPS_BUTTON_PRESSED)); 266 267 if (state != ar->wps.pbc_state) { 268 ar->wps.pbc_state = state; 269 input_report_key(ar->wps.pbc, KEY_WPS_BUTTON, 270 state); 271 input_sync(ar->wps.pbc); 272 } 273 } 274 #endif /* CONFIG_CARL9170_WPC */ 275 break; 276 277 case CARL9170_RSP_BOOT: 278 complete(&ar->fw_boot_wait); 279 break; 280 281 default: 282 wiphy_err(ar->hw->wiphy, "FW: received unhandled event %x\n", 283 cmd->hdr.cmd); 284 print_hex_dump_bytes("dump:", DUMP_PREFIX_NONE, buf, len); 285 break; 286 } 287 } 288 289 static int carl9170_rx_mac_status(struct ar9170 *ar, 290 struct ar9170_rx_head *head, struct ar9170_rx_macstatus *mac, 291 struct ieee80211_rx_status *status) 292 { 293 struct ieee80211_channel *chan; 294 u8 error, decrypt; 295 296 BUILD_BUG_ON(sizeof(struct ar9170_rx_head) != 12); 297 BUILD_BUG_ON(sizeof(struct ar9170_rx_macstatus) != 4); 298 299 error = mac->error; 300 301 if (error & AR9170_RX_ERROR_WRONG_RA) { 302 if (!ar->sniffer_enabled) 303 return -EINVAL; 304 } 305 306 if (error & AR9170_RX_ERROR_PLCP) { 307 if (!(ar->filter_state & FIF_PLCPFAIL)) 308 return -EINVAL; 309 310 status->flag |= RX_FLAG_FAILED_PLCP_CRC; 311 } 312 313 if (error & AR9170_RX_ERROR_FCS) { 314 ar->tx_fcs_errors++; 315 316 if (!(ar->filter_state & FIF_FCSFAIL)) 317 return -EINVAL; 318 319 status->flag |= RX_FLAG_FAILED_FCS_CRC; 320 } 321 322 decrypt = ar9170_get_decrypt_type(mac); 323 if (!(decrypt & AR9170_RX_ENC_SOFTWARE) && 324 decrypt != AR9170_ENC_ALG_NONE) { 325 if ((decrypt == AR9170_ENC_ALG_TKIP) && 326 (error & AR9170_RX_ERROR_MMIC)) 327 status->flag |= RX_FLAG_MMIC_ERROR; 328 329 status->flag |= RX_FLAG_DECRYPTED; 330 } 331 332 if (error & AR9170_RX_ERROR_DECRYPT && !ar->sniffer_enabled) 333 return -ENODATA; 334 335 error &= ~(AR9170_RX_ERROR_MMIC | 336 AR9170_RX_ERROR_FCS | 337 AR9170_RX_ERROR_WRONG_RA | 338 AR9170_RX_ERROR_DECRYPT | 339 AR9170_RX_ERROR_PLCP); 340 341 /* drop any other error frames */ 342 if (unlikely(error)) { 343 /* TODO: update netdevice's RX dropped/errors statistics */ 344 345 if (net_ratelimit()) 346 wiphy_dbg(ar->hw->wiphy, "received frame with " 347 "suspicious error code (%#x).\n", error); 348 349 return -EINVAL; 350 } 351 352 chan = ar->channel; 353 if (chan) { 354 status->band = chan->band; 355 status->freq = chan->center_freq; 356 } 357 358 switch (mac->status & AR9170_RX_STATUS_MODULATION) { 359 case AR9170_RX_STATUS_MODULATION_CCK: 360 if (mac->status & AR9170_RX_STATUS_SHORT_PREAMBLE) 361 status->flag |= RX_FLAG_SHORTPRE; 362 switch (head->plcp[0]) { 363 case AR9170_RX_PHY_RATE_CCK_1M: 364 status->rate_idx = 0; 365 break; 366 case AR9170_RX_PHY_RATE_CCK_2M: 367 status->rate_idx = 1; 368 break; 369 case AR9170_RX_PHY_RATE_CCK_5M: 370 status->rate_idx = 2; 371 break; 372 case AR9170_RX_PHY_RATE_CCK_11M: 373 status->rate_idx = 3; 374 break; 375 default: 376 if (net_ratelimit()) { 377 wiphy_err(ar->hw->wiphy, "invalid plcp cck " 378 "rate (%x).\n", head->plcp[0]); 379 } 380 381 return -EINVAL; 382 } 383 break; 384 385 case AR9170_RX_STATUS_MODULATION_DUPOFDM: 386 case AR9170_RX_STATUS_MODULATION_OFDM: 387 switch (head->plcp[0] & 0xf) { 388 case AR9170_TXRX_PHY_RATE_OFDM_6M: 389 status->rate_idx = 0; 390 break; 391 case AR9170_TXRX_PHY_RATE_OFDM_9M: 392 status->rate_idx = 1; 393 break; 394 case AR9170_TXRX_PHY_RATE_OFDM_12M: 395 status->rate_idx = 2; 396 break; 397 case AR9170_TXRX_PHY_RATE_OFDM_18M: 398 status->rate_idx = 3; 399 break; 400 case AR9170_TXRX_PHY_RATE_OFDM_24M: 401 status->rate_idx = 4; 402 break; 403 case AR9170_TXRX_PHY_RATE_OFDM_36M: 404 status->rate_idx = 5; 405 break; 406 case AR9170_TXRX_PHY_RATE_OFDM_48M: 407 status->rate_idx = 6; 408 break; 409 case AR9170_TXRX_PHY_RATE_OFDM_54M: 410 status->rate_idx = 7; 411 break; 412 default: 413 if (net_ratelimit()) { 414 wiphy_err(ar->hw->wiphy, "invalid plcp ofdm " 415 "rate (%x).\n", head->plcp[0]); 416 } 417 418 return -EINVAL; 419 } 420 if (status->band == IEEE80211_BAND_2GHZ) 421 status->rate_idx += 4; 422 break; 423 424 case AR9170_RX_STATUS_MODULATION_HT: 425 if (head->plcp[3] & 0x80) 426 status->flag |= RX_FLAG_40MHZ; 427 if (head->plcp[6] & 0x80) 428 status->flag |= RX_FLAG_SHORT_GI; 429 430 status->rate_idx = clamp(0, 75, head->plcp[3] & 0x7f); 431 status->flag |= RX_FLAG_HT; 432 break; 433 434 default: 435 BUG(); 436 return -ENOSYS; 437 } 438 439 return 0; 440 } 441 442 static void carl9170_rx_phy_status(struct ar9170 *ar, 443 struct ar9170_rx_phystatus *phy, struct ieee80211_rx_status *status) 444 { 445 int i; 446 447 BUILD_BUG_ON(sizeof(struct ar9170_rx_phystatus) != 20); 448 449 for (i = 0; i < 3; i++) 450 if (phy->rssi[i] != 0x80) 451 status->antenna |= BIT(i); 452 453 /* post-process RSSI */ 454 for (i = 0; i < 7; i++) 455 if (phy->rssi[i] & 0x80) 456 phy->rssi[i] = ((phy->rssi[i] & 0x7f) + 1) & 0x7f; 457 458 /* TODO: we could do something with phy_errors */ 459 status->signal = ar->noise[0] + phy->rssi_combined; 460 } 461 462 static struct sk_buff *carl9170_rx_copy_data(u8 *buf, int len) 463 { 464 struct sk_buff *skb; 465 int reserved = 0; 466 struct ieee80211_hdr *hdr = (void *) buf; 467 468 if (ieee80211_is_data_qos(hdr->frame_control)) { 469 u8 *qc = ieee80211_get_qos_ctl(hdr); 470 reserved += NET_IP_ALIGN; 471 472 if (*qc & IEEE80211_QOS_CTL_A_MSDU_PRESENT) 473 reserved += NET_IP_ALIGN; 474 } 475 476 if (ieee80211_has_a4(hdr->frame_control)) 477 reserved += NET_IP_ALIGN; 478 479 reserved = 32 + (reserved & NET_IP_ALIGN); 480 481 skb = dev_alloc_skb(len + reserved); 482 if (likely(skb)) { 483 skb_reserve(skb, reserved); 484 memcpy(skb_put(skb, len), buf, len); 485 } 486 487 return skb; 488 } 489 490 static u8 *carl9170_find_ie(u8 *data, unsigned int len, u8 ie) 491 { 492 struct ieee80211_mgmt *mgmt = (void *)data; 493 u8 *pos, *end; 494 495 pos = (u8 *)mgmt->u.beacon.variable; 496 end = data + len; 497 while (pos < end) { 498 if (pos + 2 + pos[1] > end) 499 return NULL; 500 501 if (pos[0] == ie) 502 return pos; 503 504 pos += 2 + pos[1]; 505 } 506 return NULL; 507 } 508 509 /* 510 * NOTE: 511 * 512 * The firmware is in charge of waking up the device just before 513 * the AP is expected to transmit the next beacon. 514 * 515 * This leaves the driver with the important task of deciding when 516 * to set the PHY back to bed again. 517 */ 518 static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len) 519 { 520 struct ieee80211_hdr *hdr = data; 521 struct ieee80211_tim_ie *tim_ie; 522 struct ath_common *common = &ar->common; 523 u8 *tim; 524 u8 tim_len; 525 bool cam; 526 527 if (likely(!(ar->hw->conf.flags & IEEE80211_CONF_PS))) 528 return; 529 530 /* min. beacon length + FCS_LEN */ 531 if (len <= 40 + FCS_LEN) 532 return; 533 534 /* check if this really is a beacon */ 535 /* and only beacons from the associated BSSID, please */ 536 if (!ath_is_mybeacon(common, hdr) || !common->curaid) 537 return; 538 539 ar->ps.last_beacon = jiffies; 540 541 tim = carl9170_find_ie(data, len - FCS_LEN, WLAN_EID_TIM); 542 if (!tim) 543 return; 544 545 if (tim[1] < sizeof(*tim_ie)) 546 return; 547 548 tim_len = tim[1]; 549 tim_ie = (struct ieee80211_tim_ie *) &tim[2]; 550 551 if (!WARN_ON_ONCE(!ar->hw->conf.ps_dtim_period)) 552 ar->ps.dtim_counter = (tim_ie->dtim_count - 1) % 553 ar->hw->conf.ps_dtim_period; 554 555 /* Check whenever the PHY can be turned off again. */ 556 557 /* 1. What about buffered unicast traffic for our AID? */ 558 cam = ieee80211_check_tim(tim_ie, tim_len, ar->common.curaid); 559 560 /* 2. Maybe the AP wants to send multicast/broadcast data? */ 561 cam |= !!(tim_ie->bitmap_ctrl & 0x01); 562 563 if (!cam) { 564 /* back to low-power land. */ 565 ar->ps.off_override &= ~PS_OFF_BCN; 566 carl9170_ps_check(ar); 567 } else { 568 /* force CAM */ 569 ar->ps.off_override |= PS_OFF_BCN; 570 } 571 } 572 573 static void carl9170_ba_check(struct ar9170 *ar, void *data, unsigned int len) 574 { 575 struct ieee80211_bar *bar = data; 576 struct carl9170_bar_list_entry *entry; 577 unsigned int queue; 578 579 if (likely(!ieee80211_is_back(bar->frame_control))) 580 return; 581 582 if (len <= sizeof(*bar) + FCS_LEN) 583 return; 584 585 queue = TID_TO_WME_AC(((le16_to_cpu(bar->control) & 586 IEEE80211_BAR_CTRL_TID_INFO_MASK) >> 587 IEEE80211_BAR_CTRL_TID_INFO_SHIFT) & 7); 588 589 rcu_read_lock(); 590 list_for_each_entry_rcu(entry, &ar->bar_list[queue], list) { 591 struct sk_buff *entry_skb = entry->skb; 592 struct _carl9170_tx_superframe *super = (void *)entry_skb->data; 593 struct ieee80211_bar *entry_bar = (void *)super->frame_data; 594 595 #define TID_CHECK(a, b) ( \ 596 ((a) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK)) == \ 597 ((b) & cpu_to_le16(IEEE80211_BAR_CTRL_TID_INFO_MASK))) \ 598 599 if (bar->start_seq_num == entry_bar->start_seq_num && 600 TID_CHECK(bar->control, entry_bar->control) && 601 ether_addr_equal_64bits(bar->ra, entry_bar->ta) && 602 ether_addr_equal_64bits(bar->ta, entry_bar->ra)) { 603 struct ieee80211_tx_info *tx_info; 604 605 tx_info = IEEE80211_SKB_CB(entry_skb); 606 tx_info->flags |= IEEE80211_TX_STAT_ACK; 607 608 spin_lock_bh(&ar->bar_list_lock[queue]); 609 list_del_rcu(&entry->list); 610 spin_unlock_bh(&ar->bar_list_lock[queue]); 611 kfree_rcu(entry, head); 612 break; 613 } 614 } 615 rcu_read_unlock(); 616 617 #undef TID_CHECK 618 } 619 620 static bool carl9170_ampdu_check(struct ar9170 *ar, u8 *buf, u8 ms, 621 struct ieee80211_rx_status *rx_status) 622 { 623 __le16 fc; 624 625 if ((ms & AR9170_RX_STATUS_MPDU) == AR9170_RX_STATUS_MPDU_SINGLE) { 626 /* 627 * This frame is not part of an aMPDU. 628 * Therefore it is not subjected to any 629 * of the following content restrictions. 630 */ 631 return true; 632 } 633 634 rx_status->flag |= RX_FLAG_AMPDU_DETAILS | RX_FLAG_AMPDU_LAST_KNOWN; 635 rx_status->ampdu_reference = ar->ampdu_ref; 636 637 /* 638 * "802.11n - 7.4a.3 A-MPDU contents" describes in which contexts 639 * certain frame types can be part of an aMPDU. 640 * 641 * In order to keep the processing cost down, I opted for a 642 * stateless filter solely based on the frame control field. 643 */ 644 645 fc = ((struct ieee80211_hdr *)buf)->frame_control; 646 if (ieee80211_is_data_qos(fc) && ieee80211_is_data_present(fc)) 647 return true; 648 649 if (ieee80211_is_ack(fc) || ieee80211_is_back(fc) || 650 ieee80211_is_back_req(fc)) 651 return true; 652 653 if (ieee80211_is_action(fc)) 654 return true; 655 656 return false; 657 } 658 659 static int carl9170_handle_mpdu(struct ar9170 *ar, u8 *buf, int len, 660 struct ieee80211_rx_status *status) 661 { 662 struct sk_buff *skb; 663 664 /* (driver) frame trap handler 665 * 666 * Because power-saving mode handing has to be implemented by 667 * the driver/firmware. We have to check each incoming beacon 668 * from the associated AP, if there's new data for us (either 669 * broadcast/multicast or unicast) we have to react quickly. 670 * 671 * So, if you have you want to add additional frame trap 672 * handlers, this would be the perfect place! 673 */ 674 675 carl9170_ps_beacon(ar, buf, len); 676 677 carl9170_ba_check(ar, buf, len); 678 679 skb = carl9170_rx_copy_data(buf, len); 680 if (!skb) 681 return -ENOMEM; 682 683 memcpy(IEEE80211_SKB_RXCB(skb), status, sizeof(*status)); 684 ieee80211_rx(ar->hw, skb); 685 return 0; 686 } 687 688 /* 689 * If the frame alignment is right (or the kernel has 690 * CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS), and there 691 * is only a single MPDU in the USB frame, then we could 692 * submit to mac80211 the SKB directly. However, since 693 * there may be multiple packets in one SKB in stream 694 * mode, and we need to observe the proper ordering, 695 * this is non-trivial. 696 */ 697 static void carl9170_rx_untie_data(struct ar9170 *ar, u8 *buf, int len) 698 { 699 struct ar9170_rx_head *head; 700 struct ar9170_rx_macstatus *mac; 701 struct ar9170_rx_phystatus *phy = NULL; 702 struct ieee80211_rx_status status; 703 int mpdu_len; 704 u8 mac_status; 705 706 if (!IS_STARTED(ar)) 707 return; 708 709 if (unlikely(len < sizeof(*mac))) 710 goto drop; 711 712 memset(&status, 0, sizeof(status)); 713 714 mpdu_len = len - sizeof(*mac); 715 716 mac = (void *)(buf + mpdu_len); 717 mac_status = mac->status; 718 switch (mac_status & AR9170_RX_STATUS_MPDU) { 719 case AR9170_RX_STATUS_MPDU_FIRST: 720 ar->ampdu_ref++; 721 /* Aggregated MPDUs start with an PLCP header */ 722 if (likely(mpdu_len >= sizeof(struct ar9170_rx_head))) { 723 head = (void *) buf; 724 725 /* 726 * The PLCP header needs to be cached for the 727 * following MIDDLE + LAST A-MPDU packets. 728 * 729 * So, if you are wondering why all frames seem 730 * to share a common RX status information, 731 * then you have the answer right here... 732 */ 733 memcpy(&ar->rx_plcp, (void *) buf, 734 sizeof(struct ar9170_rx_head)); 735 736 mpdu_len -= sizeof(struct ar9170_rx_head); 737 buf += sizeof(struct ar9170_rx_head); 738 739 ar->rx_has_plcp = true; 740 } else { 741 if (net_ratelimit()) { 742 wiphy_err(ar->hw->wiphy, "plcp info " 743 "is clipped.\n"); 744 } 745 746 goto drop; 747 } 748 break; 749 750 case AR9170_RX_STATUS_MPDU_LAST: 751 status.flag |= RX_FLAG_AMPDU_IS_LAST; 752 753 /* 754 * The last frame of an A-MPDU has an extra tail 755 * which does contain the phy status of the whole 756 * aggregate. 757 */ 758 if (likely(mpdu_len >= sizeof(struct ar9170_rx_phystatus))) { 759 mpdu_len -= sizeof(struct ar9170_rx_phystatus); 760 phy = (void *)(buf + mpdu_len); 761 } else { 762 if (net_ratelimit()) { 763 wiphy_err(ar->hw->wiphy, "frame tail " 764 "is clipped.\n"); 765 } 766 767 goto drop; 768 } 769 770 case AR9170_RX_STATUS_MPDU_MIDDLE: 771 /* These are just data + mac status */ 772 if (unlikely(!ar->rx_has_plcp)) { 773 if (!net_ratelimit()) 774 return; 775 776 wiphy_err(ar->hw->wiphy, "rx stream does not start " 777 "with a first_mpdu frame tag.\n"); 778 779 goto drop; 780 } 781 782 head = &ar->rx_plcp; 783 break; 784 785 case AR9170_RX_STATUS_MPDU_SINGLE: 786 /* single mpdu has both: plcp (head) and phy status (tail) */ 787 head = (void *) buf; 788 789 mpdu_len -= sizeof(struct ar9170_rx_head); 790 mpdu_len -= sizeof(struct ar9170_rx_phystatus); 791 792 buf += sizeof(struct ar9170_rx_head); 793 phy = (void *)(buf + mpdu_len); 794 break; 795 796 default: 797 BUG_ON(1); 798 break; 799 } 800 801 /* FC + DU + RA + FCS */ 802 if (unlikely(mpdu_len < (2 + 2 + ETH_ALEN + FCS_LEN))) 803 goto drop; 804 805 if (unlikely(carl9170_rx_mac_status(ar, head, mac, &status))) 806 goto drop; 807 808 if (!carl9170_ampdu_check(ar, buf, mac_status, &status)) 809 goto drop; 810 811 if (phy) 812 carl9170_rx_phy_status(ar, phy, &status); 813 else 814 status.flag |= RX_FLAG_NO_SIGNAL_VAL; 815 816 if (carl9170_handle_mpdu(ar, buf, mpdu_len, &status)) 817 goto drop; 818 819 return; 820 drop: 821 ar->rx_dropped++; 822 } 823 824 static void carl9170_rx_untie_cmds(struct ar9170 *ar, const u8 *respbuf, 825 const unsigned int resplen) 826 { 827 struct carl9170_rsp *cmd; 828 int i = 0; 829 830 while (i < resplen) { 831 cmd = (void *) &respbuf[i]; 832 833 i += cmd->hdr.len + 4; 834 if (unlikely(i > resplen)) 835 break; 836 837 if (carl9170_check_sequence(ar, cmd->hdr.seq)) 838 break; 839 840 carl9170_handle_command_response(ar, cmd, cmd->hdr.len + 4); 841 } 842 843 if (unlikely(i != resplen)) { 844 if (!net_ratelimit()) 845 return; 846 847 wiphy_err(ar->hw->wiphy, "malformed firmware trap:\n"); 848 print_hex_dump_bytes("rxcmd:", DUMP_PREFIX_OFFSET, 849 respbuf, resplen); 850 } 851 } 852 853 static void __carl9170_rx(struct ar9170 *ar, u8 *buf, unsigned int len) 854 { 855 unsigned int i = 0; 856 857 /* weird thing, but this is the same in the original driver */ 858 while (len > 2 && i < 12 && buf[0] == 0xff && buf[1] == 0xff) { 859 i += 2; 860 len -= 2; 861 buf += 2; 862 } 863 864 if (unlikely(len < 4)) 865 return; 866 867 /* found the 6 * 0xffff marker? */ 868 if (i == 12) 869 carl9170_rx_untie_cmds(ar, buf, len); 870 else 871 carl9170_rx_untie_data(ar, buf, len); 872 } 873 874 static void carl9170_rx_stream(struct ar9170 *ar, void *buf, unsigned int len) 875 { 876 unsigned int tlen, wlen = 0, clen = 0; 877 struct ar9170_stream *rx_stream; 878 u8 *tbuf; 879 880 tbuf = buf; 881 tlen = len; 882 883 while (tlen >= 4) { 884 rx_stream = (void *) tbuf; 885 clen = le16_to_cpu(rx_stream->length); 886 wlen = ALIGN(clen, 4); 887 888 /* check if this is stream has a valid tag.*/ 889 if (rx_stream->tag != cpu_to_le16(AR9170_RX_STREAM_TAG)) { 890 /* 891 * TODO: handle the highly unlikely event that the 892 * corrupted stream has the TAG at the right position. 893 */ 894 895 /* check if the frame can be repaired. */ 896 if (!ar->rx_failover_missing) { 897 898 /* this is not "short read". */ 899 if (net_ratelimit()) { 900 wiphy_err(ar->hw->wiphy, 901 "missing tag!\n"); 902 } 903 904 __carl9170_rx(ar, tbuf, tlen); 905 return; 906 } 907 908 if (ar->rx_failover_missing > tlen) { 909 if (net_ratelimit()) { 910 wiphy_err(ar->hw->wiphy, 911 "possible multi " 912 "stream corruption!\n"); 913 goto err_telluser; 914 } else { 915 goto err_silent; 916 } 917 } 918 919 memcpy(skb_put(ar->rx_failover, tlen), tbuf, tlen); 920 ar->rx_failover_missing -= tlen; 921 922 if (ar->rx_failover_missing <= 0) { 923 /* 924 * nested carl9170_rx_stream call! 925 * 926 * termination is guaranteed, even when the 927 * combined frame also have an element with 928 * a bad tag. 929 */ 930 931 ar->rx_failover_missing = 0; 932 carl9170_rx_stream(ar, ar->rx_failover->data, 933 ar->rx_failover->len); 934 935 skb_reset_tail_pointer(ar->rx_failover); 936 skb_trim(ar->rx_failover, 0); 937 } 938 939 return; 940 } 941 942 /* check if stream is clipped */ 943 if (wlen > tlen - 4) { 944 if (ar->rx_failover_missing) { 945 /* TODO: handle double stream corruption. */ 946 if (net_ratelimit()) { 947 wiphy_err(ar->hw->wiphy, "double rx " 948 "stream corruption!\n"); 949 goto err_telluser; 950 } else { 951 goto err_silent; 952 } 953 } 954 955 /* 956 * save incomplete data set. 957 * the firmware will resend the missing bits when 958 * the rx - descriptor comes round again. 959 */ 960 961 memcpy(skb_put(ar->rx_failover, tlen), tbuf, tlen); 962 ar->rx_failover_missing = clen - tlen; 963 return; 964 } 965 __carl9170_rx(ar, rx_stream->payload, clen); 966 967 tbuf += wlen + 4; 968 tlen -= wlen + 4; 969 } 970 971 if (tlen) { 972 if (net_ratelimit()) { 973 wiphy_err(ar->hw->wiphy, "%d bytes of unprocessed " 974 "data left in rx stream!\n", tlen); 975 } 976 977 goto err_telluser; 978 } 979 980 return; 981 982 err_telluser: 983 wiphy_err(ar->hw->wiphy, "damaged RX stream data [want:%d, " 984 "data:%d, rx:%d, pending:%d ]\n", clen, wlen, tlen, 985 ar->rx_failover_missing); 986 987 if (ar->rx_failover_missing) 988 print_hex_dump_bytes("rxbuf:", DUMP_PREFIX_OFFSET, 989 ar->rx_failover->data, 990 ar->rx_failover->len); 991 992 print_hex_dump_bytes("stream:", DUMP_PREFIX_OFFSET, 993 buf, len); 994 995 wiphy_err(ar->hw->wiphy, "please check your hardware and cables, if " 996 "you see this message frequently.\n"); 997 998 err_silent: 999 if (ar->rx_failover_missing) { 1000 skb_reset_tail_pointer(ar->rx_failover); 1001 skb_trim(ar->rx_failover, 0); 1002 ar->rx_failover_missing = 0; 1003 } 1004 } 1005 1006 void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len) 1007 { 1008 if (ar->fw.rx_stream) 1009 carl9170_rx_stream(ar, buf, len); 1010 else 1011 __carl9170_rx(ar, buf, len); 1012 } 1013