Lines Matching +full:super +full:- +full:frames
25 * Copyright (c) 2007-2008 Atheros Communications, Inc.
56 ar->fw.err_counter++; in carl9170_dbg_message()
57 if (ar->fw.err_counter > 3) { in carl9170_dbg_message()
64 ar->fw.bug_counter++; in carl9170_dbg_message()
70 wiphy_info(ar->hw->wiphy, "FW: %.*s\n", len, buf); in carl9170_dbg_message()
81 ps = le32_to_cpu(rsp->psm.state); in carl9170_handle_ps()
84 if (ar->ps.state != new_ps) { in carl9170_handle_ps()
86 ar->ps.sleep_ms = jiffies_to_msecs(jiffies - in carl9170_handle_ps()
87 ar->ps.last_action); in carl9170_handle_ps()
90 ar->ps.last_action = jiffies; in carl9170_handle_ps()
92 ar->ps.state = new_ps; in carl9170_handle_ps()
98 if (ar->cmd_seq < -1) in carl9170_check_sequence()
104 if (ar->cmd_seq < 0) in carl9170_check_sequence()
105 ar->cmd_seq = seq; in carl9170_check_sequence()
113 if (seq != ar->cmd_seq) { in carl9170_check_sequence()
116 count = (seq - ar->cmd_seq) % ar->fw.cmd_bufs; in carl9170_check_sequence()
118 wiphy_err(ar->hw->wiphy, "lost %d command responses/traps! " in carl9170_check_sequence()
119 "w:%d g:%d\n", count, ar->cmd_seq, seq); in carl9170_check_sequence()
122 return -EIO; in carl9170_check_sequence()
125 ar->cmd_seq = (ar->cmd_seq + 1) % ar->fw.cmd_bufs; in carl9170_check_sequence()
136 if (unlikely(ar->readlen != (len - 4))) { in carl9170_cmd_callback()
137 dev_warn(&ar->udev->dev, "received invalid command response:" in carl9170_cmd_callback()
138 "got %d, instead of %d\n", len - 4, ar->readlen); in carl9170_cmd_callback()
140 ar->cmd_buf, (ar->cmd.hdr.len + 4) & 0x3f); in carl9170_cmd_callback()
150 spin_lock(&ar->cmd_lock); in carl9170_cmd_callback()
151 if (ar->readbuf) { in carl9170_cmd_callback()
153 memcpy(ar->readbuf, buffer + 4, len - 4); in carl9170_cmd_callback()
155 ar->readbuf = NULL; in carl9170_cmd_callback()
157 complete(&ar->cmd_wait); in carl9170_cmd_callback()
158 spin_unlock(&ar->cmd_lock); in carl9170_cmd_callback()
166 if ((cmd->hdr.cmd & CARL9170_RSP_FLAG) != CARL9170_RSP_FLAG) { in carl9170_handle_command_response()
167 if (!(cmd->hdr.cmd & CARL9170_CMD_ASYNC_FLAG)) in carl9170_handle_command_response()
173 if (unlikely(cmd->hdr.len != (len - 4))) { in carl9170_handle_command_response()
175 wiphy_err(ar->hw->wiphy, "FW: received over-/under" in carl9170_handle_command_response()
177 cmd->hdr.cmd, cmd->hdr.len, len - 4); in carl9170_handle_command_response()
187 switch (cmd->hdr.cmd) { in carl9170_handle_command_response()
189 /* pre-TBTT event */ in carl9170_handle_command_response()
198 switch (vif->type) { in carl9170_handle_command_response()
229 * B1-B4 "should" be the number of send out beacons. in carl9170_handle_command_response()
244 carl9170_dbg_message(ar, (char *)buf + 4, len - 4); in carl9170_handle_command_response()
248 wiphy_dbg(ar->hw->wiphy, "FW: HD %d\n", len - 4); in carl9170_handle_command_response()
250 (char *)buf + 4, len - 4); in carl9170_handle_command_response()
257 wiphy_info(ar->hw->wiphy, "FW: RADAR! Please report this " in carl9170_handle_command_response()
258 "incident to linux-[email protected] !\n"); in carl9170_handle_command_response()
263 if (ar->wps.pbc) { in carl9170_handle_command_response()
264 bool state = !!(cmd->gpio.gpio & cpu_to_le32( in carl9170_handle_command_response()
267 if (state != ar->wps.pbc_state) { in carl9170_handle_command_response()
268 ar->wps.pbc_state = state; in carl9170_handle_command_response()
269 input_report_key(ar->wps.pbc, KEY_WPS_BUTTON, in carl9170_handle_command_response()
271 input_sync(ar->wps.pbc); in carl9170_handle_command_response()
278 complete(&ar->fw_boot_wait); in carl9170_handle_command_response()
282 wiphy_err(ar->hw->wiphy, "FW: received unhandled event %x\n", in carl9170_handle_command_response()
283 cmd->hdr.cmd); in carl9170_handle_command_response()
299 error = mac->error; in carl9170_rx_mac_status()
302 if (!ar->sniffer_enabled) in carl9170_rx_mac_status()
303 return -EINVAL; in carl9170_rx_mac_status()
307 if (!(ar->filter_state & FIF_PLCPFAIL)) in carl9170_rx_mac_status()
308 return -EINVAL; in carl9170_rx_mac_status()
310 status->flag |= RX_FLAG_FAILED_PLCP_CRC; in carl9170_rx_mac_status()
314 ar->tx_fcs_errors++; in carl9170_rx_mac_status()
316 if (!(ar->filter_state & FIF_FCSFAIL)) in carl9170_rx_mac_status()
317 return -EINVAL; in carl9170_rx_mac_status()
319 status->flag |= RX_FLAG_FAILED_FCS_CRC; in carl9170_rx_mac_status()
327 status->flag |= RX_FLAG_MMIC_ERROR; in carl9170_rx_mac_status()
329 status->flag |= RX_FLAG_DECRYPTED; in carl9170_rx_mac_status()
332 if (error & AR9170_RX_ERROR_DECRYPT && !ar->sniffer_enabled) in carl9170_rx_mac_status()
333 return -ENODATA; in carl9170_rx_mac_status()
341 /* drop any other error frames */ in carl9170_rx_mac_status()
346 wiphy_dbg(ar->hw->wiphy, "received frame with " in carl9170_rx_mac_status()
349 return -EINVAL; in carl9170_rx_mac_status()
352 chan = ar->channel; in carl9170_rx_mac_status()
354 status->band = chan->band; in carl9170_rx_mac_status()
355 status->freq = chan->center_freq; in carl9170_rx_mac_status()
358 switch (mac->status & AR9170_RX_STATUS_MODULATION) { in carl9170_rx_mac_status()
360 if (mac->status & AR9170_RX_STATUS_SHORT_PREAMBLE) in carl9170_rx_mac_status()
361 status->enc_flags |= RX_ENC_FLAG_SHORTPRE; in carl9170_rx_mac_status()
362 switch (head->plcp[0]) { in carl9170_rx_mac_status()
364 status->rate_idx = 0; in carl9170_rx_mac_status()
367 status->rate_idx = 1; in carl9170_rx_mac_status()
370 status->rate_idx = 2; in carl9170_rx_mac_status()
373 status->rate_idx = 3; in carl9170_rx_mac_status()
377 wiphy_err(ar->hw->wiphy, "invalid plcp cck " in carl9170_rx_mac_status()
378 "rate (%x).\n", head->plcp[0]); in carl9170_rx_mac_status()
381 return -EINVAL; in carl9170_rx_mac_status()
387 switch (head->plcp[0] & 0xf) { in carl9170_rx_mac_status()
389 status->rate_idx = 0; in carl9170_rx_mac_status()
392 status->rate_idx = 1; in carl9170_rx_mac_status()
395 status->rate_idx = 2; in carl9170_rx_mac_status()
398 status->rate_idx = 3; in carl9170_rx_mac_status()
401 status->rate_idx = 4; in carl9170_rx_mac_status()
404 status->rate_idx = 5; in carl9170_rx_mac_status()
407 status->rate_idx = 6; in carl9170_rx_mac_status()
410 status->rate_idx = 7; in carl9170_rx_mac_status()
414 wiphy_err(ar->hw->wiphy, "invalid plcp ofdm " in carl9170_rx_mac_status()
415 "rate (%x).\n", head->plcp[0]); in carl9170_rx_mac_status()
418 return -EINVAL; in carl9170_rx_mac_status()
420 if (status->band == NL80211_BAND_2GHZ) in carl9170_rx_mac_status()
421 status->rate_idx += 4; in carl9170_rx_mac_status()
425 if (head->plcp[3] & 0x80) in carl9170_rx_mac_status()
426 status->bw = RATE_INFO_BW_40; in carl9170_rx_mac_status()
427 if (head->plcp[6] & 0x80) in carl9170_rx_mac_status()
428 status->enc_flags |= RX_ENC_FLAG_SHORT_GI; in carl9170_rx_mac_status()
430 status->rate_idx = clamp(head->plcp[3] & 0x7f, 0, 75); in carl9170_rx_mac_status()
431 status->encoding = RX_ENC_HT; in carl9170_rx_mac_status()
436 return -ENOSYS; in carl9170_rx_mac_status()
450 if (phy->rssi[i] != 0x80) in carl9170_rx_phy_status()
451 status->antenna |= BIT(i); in carl9170_rx_phy_status()
453 /* post-process RSSI */ in carl9170_rx_phy_status()
455 if (phy->rssi[i] & 0x80) in carl9170_rx_phy_status()
456 phy->rssi[i] = ((~phy->rssi[i] & 0x7f) + 1) & 0x7f; in carl9170_rx_phy_status()
459 status->signal = ar->noise[0] + phy->rssi_combined; in carl9170_rx_phy_status()
468 if (ieee80211_is_data_qos(hdr->frame_control)) { in carl9170_rx_copy_data()
476 if (ieee80211_has_a4(hdr->frame_control)) in carl9170_rx_copy_data()
495 pos = (u8 *)mgmt->u.beacon.variable; in carl9170_find_ie()
522 struct ath_common *common = &ar->common; in carl9170_ps_beacon()
527 if (likely(!(ar->hw->conf.flags & IEEE80211_CONF_PS))) in carl9170_ps_beacon()
536 if (!ath_is_mybeacon(common, hdr) || !common->curaid) in carl9170_ps_beacon()
539 ar->ps.last_beacon = jiffies; in carl9170_ps_beacon()
541 tim = carl9170_find_ie(data, len - FCS_LEN, WLAN_EID_TIM); in carl9170_ps_beacon()
551 if (!WARN_ON_ONCE(!ar->hw->conf.ps_dtim_period)) in carl9170_ps_beacon()
552 ar->ps.dtim_counter = (tim_ie->dtim_count - 1) % in carl9170_ps_beacon()
553 ar->hw->conf.ps_dtim_period; in carl9170_ps_beacon()
558 cam = ieee80211_check_tim(tim_ie, tim_len, ar->common.curaid); in carl9170_ps_beacon()
561 cam |= !!(tim_ie->bitmap_ctrl & 0x01); in carl9170_ps_beacon()
564 /* back to low-power land. */ in carl9170_ps_beacon()
565 ar->ps.off_override &= ~PS_OFF_BCN; in carl9170_ps_beacon()
569 ar->ps.off_override |= PS_OFF_BCN; in carl9170_ps_beacon()
579 if (likely(!ieee80211_is_back(bar->frame_control))) in carl9170_ba_check()
585 queue = TID_TO_WME_AC(((le16_to_cpu(bar->control) & in carl9170_ba_check()
590 list_for_each_entry_rcu(entry, &ar->bar_list[queue], list) { in carl9170_ba_check()
591 struct sk_buff *entry_skb = entry->skb; in carl9170_ba_check()
592 struct _carl9170_tx_superframe *super = (void *)entry_skb->data; in carl9170_ba_check() local
593 struct ieee80211_bar *entry_bar = (void *)super->frame_data; in carl9170_ba_check()
599 if (bar->start_seq_num == entry_bar->start_seq_num && in carl9170_ba_check()
600 TID_CHECK(bar->control, entry_bar->control) && in carl9170_ba_check()
601 ether_addr_equal_64bits(bar->ra, entry_bar->ta) && in carl9170_ba_check()
602 ether_addr_equal_64bits(bar->ta, entry_bar->ra)) { in carl9170_ba_check()
606 tx_info->flags |= IEEE80211_TX_STAT_ACK; in carl9170_ba_check()
608 spin_lock_bh(&ar->bar_list_lock[queue]); in carl9170_ba_check()
609 list_del_rcu(&entry->list); in carl9170_ba_check()
610 spin_unlock_bh(&ar->bar_list_lock[queue]); in carl9170_ba_check()
634 rx_status->flag |= RX_FLAG_AMPDU_DETAILS | RX_FLAG_AMPDU_LAST_KNOWN; in carl9170_ampdu_check()
635 rx_status->ampdu_reference = ar->ampdu_ref; in carl9170_ampdu_check()
638 * "802.11n - 7.4a.3 A-MPDU contents" describes in which contexts in carl9170_ampdu_check()
645 fc = ((struct ieee80211_hdr *)buf)->frame_control; in carl9170_ampdu_check()
666 * Because power-saving mode handing has to be implemented by in carl9170_handle_mpdu()
681 return -ENOMEM; in carl9170_handle_mpdu()
684 ieee80211_rx(ar->hw, skb); in carl9170_handle_mpdu()
695 * this is non-trivial.
714 mpdu_len = len - sizeof(*mac); in carl9170_rx_untie_data()
717 mac_status = mac->status; in carl9170_rx_untie_data()
720 ar->ampdu_ref++; in carl9170_rx_untie_data()
727 * following MIDDLE + LAST A-MPDU packets. in carl9170_rx_untie_data()
729 * So, if you are wondering why all frames seem in carl9170_rx_untie_data()
733 memcpy(&ar->rx_plcp, (void *) buf, in carl9170_rx_untie_data()
736 mpdu_len -= sizeof(struct ar9170_rx_head); in carl9170_rx_untie_data()
739 ar->rx_has_plcp = true; in carl9170_rx_untie_data()
742 wiphy_err(ar->hw->wiphy, "plcp info " in carl9170_rx_untie_data()
754 * The last frame of an A-MPDU has an extra tail in carl9170_rx_untie_data()
759 mpdu_len -= sizeof(struct ar9170_rx_phystatus); in carl9170_rx_untie_data()
763 wiphy_err(ar->hw->wiphy, "frame tail " in carl9170_rx_untie_data()
773 if (unlikely(!ar->rx_has_plcp)) { in carl9170_rx_untie_data()
777 wiphy_err(ar->hw->wiphy, "rx stream does not start " in carl9170_rx_untie_data()
783 head = &ar->rx_plcp; in carl9170_rx_untie_data()
790 mpdu_len -= sizeof(struct ar9170_rx_head); in carl9170_rx_untie_data()
791 mpdu_len -= sizeof(struct ar9170_rx_phystatus); in carl9170_rx_untie_data()
822 ar->rx_dropped++; in carl9170_rx_untie_data()
834 i += cmd->hdr.len + 4; in carl9170_rx_untie_cmds()
838 if (carl9170_check_sequence(ar, cmd->hdr.seq)) in carl9170_rx_untie_cmds()
841 carl9170_handle_command_response(ar, cmd, cmd->hdr.len + 4); in carl9170_rx_untie_cmds()
848 wiphy_err(ar->hw->wiphy, "malformed firmware trap:\n"); in carl9170_rx_untie_cmds()
861 len -= 2; in __carl9170_rx()
886 clen = le16_to_cpu(rx_stream->length); in carl9170_rx_stream()
890 if (rx_stream->tag != cpu_to_le16(AR9170_RX_STREAM_TAG)) { in carl9170_rx_stream()
897 if (!ar->rx_failover_missing) { in carl9170_rx_stream()
901 wiphy_err(ar->hw->wiphy, in carl9170_rx_stream()
909 if (ar->rx_failover_missing > tlen) { in carl9170_rx_stream()
911 wiphy_err(ar->hw->wiphy, in carl9170_rx_stream()
920 skb_put_data(ar->rx_failover, tbuf, tlen); in carl9170_rx_stream()
921 ar->rx_failover_missing -= tlen; in carl9170_rx_stream()
923 if (ar->rx_failover_missing <= 0) { in carl9170_rx_stream()
932 ar->rx_failover_missing = 0; in carl9170_rx_stream()
933 carl9170_rx_stream(ar, ar->rx_failover->data, in carl9170_rx_stream()
934 ar->rx_failover->len); in carl9170_rx_stream()
936 skb_reset_tail_pointer(ar->rx_failover); in carl9170_rx_stream()
937 skb_trim(ar->rx_failover, 0); in carl9170_rx_stream()
944 if (wlen > tlen - 4) { in carl9170_rx_stream()
945 if (ar->rx_failover_missing) { in carl9170_rx_stream()
948 wiphy_err(ar->hw->wiphy, "double rx " in carl9170_rx_stream()
959 * the rx - descriptor comes round again. in carl9170_rx_stream()
962 skb_put_data(ar->rx_failover, tbuf, tlen); in carl9170_rx_stream()
963 ar->rx_failover_missing = clen - tlen; in carl9170_rx_stream()
966 __carl9170_rx(ar, rx_stream->payload, clen); in carl9170_rx_stream()
969 tlen -= wlen + 4; in carl9170_rx_stream()
974 wiphy_err(ar->hw->wiphy, "%d bytes of unprocessed " in carl9170_rx_stream()
984 wiphy_err(ar->hw->wiphy, "damaged RX stream data [want:%d, " in carl9170_rx_stream()
986 ar->rx_failover_missing); in carl9170_rx_stream()
988 if (ar->rx_failover_missing) in carl9170_rx_stream()
990 ar->rx_failover->data, in carl9170_rx_stream()
991 ar->rx_failover->len); in carl9170_rx_stream()
996 wiphy_err(ar->hw->wiphy, "please check your hardware and cables, if " in carl9170_rx_stream()
1000 if (ar->rx_failover_missing) { in carl9170_rx_stream()
1001 skb_reset_tail_pointer(ar->rx_failover); in carl9170_rx_stream()
1002 skb_trim(ar->rx_failover, 0); in carl9170_rx_stream()
1003 ar->rx_failover_missing = 0; in carl9170_rx_stream()
1009 if (ar->fw.rx_stream) in carl9170_rx()