FILE
tx.c
File preview with syntax highlighting.
linux-6.19.14/drivers/net/wireless/intel/iwlwifi/mld/tx.c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2/* 3 * Copyright (C) 2024 - 2025 Intel Corporation 4 */ 5#include <net/ip.h> 6 7#include "tx.h" 8#include "sta.h" 9#include "hcmd.h" 10#include "iwl-utils.h" 11#include "iface.h" 12 13#include "fw/dbg.h" 14 15#include "fw/api/tx.h" 16#include "fw/api/rs.h" 17#include "fw/api/txq.h" 18#include "fw/api/datapath.h" 19#include "fw/api/time-event.h" 20 21#define MAX_ANT_NUM 2 22 23/* Toggles between TX antennas. Receives the bitmask of valid TX antennas and 24 * the *index* used for the last TX, and returns the next valid *index* to use. 25 * In order to set it in the tx_cmd, must do BIT(idx). 26 */ 27static u8 iwl_mld_next_ant(u8 valid, u8 last_idx) 28{ 29 u8 index = last_idx; 30 31 for (int i = 0; i < MAX_ANT_NUM; i++) { 32 index = (index + 1) % MAX_ANT_NUM; 33 if (valid & BIT(index)) 34 return index; 35 } 36 37 WARN_ONCE(1, "Failed to toggle between antennas 0x%x", valid); 38 39 return last_idx; 40} 41 42void iwl_mld_toggle_tx_ant(struct iwl_mld *mld, u8 *ant) 43{ 44 *ant = iwl_mld_next_ant(iwl_mld_get_valid_tx_ant(mld), *ant); 45} 46 47static int 48iwl_mld_get_queue_size(struct iwl_mld *mld, struct ieee80211_txq *txq) 49{ 50 struct ieee80211_sta *sta = txq->sta; 51 struct ieee80211_link_sta *link_sta; 52 unsigned int link_id; 53 int max_size = IWL_DEFAULT_QUEUE_SIZE; 54 55 lockdep_assert_wiphy(mld->wiphy); 56 57 for_each_sta_active_link(txq->vif, sta, link_sta, link_id) { 58 if (link_sta->eht_cap.has_eht) { 59 max_size = IWL_DEFAULT_QUEUE_SIZE_EHT; 60 break; 61 } 62 63 if (link_sta->he_cap.has_he) 64 max_size = IWL_DEFAULT_QUEUE_SIZE_HE; 65 } 66 67 return max_size; 68} 69 70static int iwl_mld_allocate_txq(struct iwl_mld *mld, struct ieee80211_txq *txq) 71{ 72 u8 tid = txq->tid == IEEE80211_NUM_TIDS ? IWL_MGMT_TID : txq->tid; 73 u32 fw_sta_mask = iwl_mld_fw_sta_id_mask(mld, txq->sta); 74 /* We can't know when the station is asleep or awake, so we 75 * must disable the queue hang detection. 76 */ 77 unsigned int watchdog_timeout = txq->vif->type == NL80211_IFTYPE_AP ? 78 IWL_WATCHDOG_DISABLED : 79 mld->trans->mac_cfg->base->wd_timeout; 80 int queue, size; 81 82 lockdep_assert_wiphy(mld->wiphy); 83 84 if (tid == IWL_MGMT_TID) 85 size = max_t(u32, IWL_MGMT_QUEUE_SIZE, 86 mld->trans->mac_cfg->base->min_txq_size); 87 else 88 size = iwl_mld_get_queue_size(mld, txq); 89 90 queue = iwl_trans_txq_alloc(mld->trans, 0, fw_sta_mask, tid, size, 91 watchdog_timeout); 92 93 if (queue >= 0) 94 IWL_DEBUG_TX_QUEUES(mld, 95 "Enabling TXQ #%d for sta mask 0x%x tid %d\n", 96 queue, fw_sta_mask, tid); 97 return queue; 98} 99 100static int iwl_mld_add_txq(struct iwl_mld *mld, struct ieee80211_txq *txq) 101{ 102 struct iwl_mld_txq *mld_txq = iwl_mld_txq_from_mac80211(txq); 103 int id; 104 105 lockdep_assert_wiphy(mld->wiphy); 106 107 /* This will alse send the SCD_QUEUE_CONFIG_CMD */ 108 id = iwl_mld_allocate_txq(mld, txq); 109 if (id < 0) 110 return id; 111 112 mld_txq->fw_id = id; 113 mld_txq->status.allocated = true; 114 115 rcu_assign_pointer(mld->fw_id_to_txq[id], txq); 116 117 return 0; 118} 119 120void iwl_mld_add_txq_list(struct iwl_mld *mld) 121{ 122 lockdep_assert_wiphy(mld->wiphy); 123 124 while (!list_empty(&mld->txqs_to_add)) { 125 struct ieee80211_txq *txq; 126 struct iwl_mld_txq *mld_txq = 127 list_first_entry(&mld->txqs_to_add, struct iwl_mld_txq, 128 list); 129 int failed; 130 131 txq = container_of((void *)mld_txq, struct ieee80211_txq, 132 drv_priv); 133 134 failed = iwl_mld_add_txq(mld, txq); 135 136 local_bh_disable(); 137 spin_lock(&mld->add_txqs_lock); 138 list_del_init(&mld_txq->list); 139 spin_unlock(&mld->add_txqs_lock); 140 /* If the queue allocation failed, we can't transmit. Leave the 141 * frames on the txq, maybe the attempt to allocate the queue 142 * will succeed. 143 */ 144 if (!failed) 145 iwl_mld_tx_from_txq(mld, txq); 146 local_bh_enable(); 147 } 148} 149 150void iwl_mld_add_txqs_wk(struct wiphy *wiphy, struct wiphy_work *wk) 151{ 152 struct iwl_mld *mld = container_of(wk, struct iwl_mld, 153 add_txqs_wk); 154 155 /* will reschedule to run after restart */ 156 if (mld->fw_status.in_hw_restart) 157 return; 158 159 iwl_mld_add_txq_list(mld); 160} 161 162void 163iwl_mld_free_txq(struct iwl_mld *mld, u32 fw_sta_mask, u32 tid, u32 queue_id) 164{ 165 struct iwl_scd_queue_cfg_cmd remove_cmd = { 166 .operation = cpu_to_le32(IWL_SCD_QUEUE_REMOVE), 167 .u.remove.tid = cpu_to_le32(tid), 168 .u.remove.sta_mask = cpu_to_le32(fw_sta_mask), 169 }; 170 171 iwl_mld_send_cmd_pdu(mld, 172 WIDE_ID(DATA_PATH_GROUP, SCD_QUEUE_CONFIG_CMD), 173 &remove_cmd); 174 175 iwl_trans_txq_free(mld->trans, queue_id); 176} 177 178void iwl_mld_remove_txq(struct iwl_mld *mld, struct ieee80211_txq *txq) 179{ 180 struct iwl_mld_txq *mld_txq = iwl_mld_txq_from_mac80211(txq); 181 u32 sta_msk, tid; 182 183 lockdep_assert_wiphy(mld->wiphy); 184 185 spin_lock_bh(&mld->add_txqs_lock); 186 if (!list_empty(&mld_txq->list)) 187 list_del_init(&mld_txq->list); 188 spin_unlock_bh(&mld->add_txqs_lock); 189 190 if (!mld_txq->status.allocated || 191 WARN_ON(mld_txq->fw_id >= ARRAY_SIZE(mld->fw_id_to_txq))) 192 return; 193 194 sta_msk = iwl_mld_fw_sta_id_mask(mld, txq->sta); 195 196 tid = txq->tid == IEEE80211_NUM_TIDS ? IWL_MGMT_TID : 197 txq->tid; 198 199 iwl_mld_free_txq(mld, sta_msk, tid, mld_txq->fw_id); 200 201 RCU_INIT_POINTER(mld->fw_id_to_txq[mld_txq->fw_id], NULL); 202 mld_txq->status.allocated = false; 203} 204 205#define OPT_HDR(type, skb, off) \ 206 (type *)(skb_network_header(skb) + (off)) 207 208static __le32 209iwl_mld_get_offload_assist(struct sk_buff *skb, bool amsdu) 210{ 211 struct ieee80211_hdr *hdr = (void *)skb->data; 212 u16 mh_len = ieee80211_hdrlen(hdr->frame_control); 213 u16 offload_assist = 0; 214#if IS_ENABLED(CONFIG_INET) 215 u8 protocol = 0; 216 217 /* Do not compute checksum if already computed */ 218 if (skb->ip_summed != CHECKSUM_PARTIAL) 219 goto out; 220 221 /* We do not expect to be requested to csum stuff we do not support */ 222 223 /* TBD: do we also need to check 224 * !(mvm->hw->netdev_features & IWL_TX_CSUM_NETIF_FLAGS) now that all 225 * the devices we support has this flags? 226 */ 227 if (WARN_ONCE(skb->protocol != htons(ETH_P_IP) && 228 skb->protocol != htons(ETH_P_IPV6), 229 "No support for requested checksum\n")) { 230 skb_checksum_help(skb); 231 goto out; 232 } 233 234 if (skb->protocol == htons(ETH_P_IP)) { 235 protocol = ip_hdr(skb)->protocol; 236 } else { 237#if IS_ENABLED(CONFIG_IPV6) 238 struct ipv6hdr *ipv6h = 239 (struct ipv6hdr *)skb_network_header(skb); 240 unsigned int off = sizeof(*ipv6h); 241 242 protocol = ipv6h->nexthdr; 243 while (protocol != NEXTHDR_NONE && ipv6_ext_hdr(protocol)) { 244 struct ipv6_opt_hdr *hp; 245 246 /* only supported extension headers */ 247 if (protocol != NEXTHDR_ROUTING && 248 protocol != NEXTHDR_HOP && 249 protocol != NEXTHDR_DEST) { 250 skb_checksum_help(skb); 251 goto out; 252 } 253 254 hp = OPT_HDR(struct ipv6_opt_hdr, skb, off); 255 protocol = hp->nexthdr; 256 off += ipv6_optlen(hp); 257 } 258 /* if we get here - protocol now should be TCP/UDP */ 259#endif 260 } 261 262 if (protocol != IPPROTO_TCP && protocol != IPPROTO_UDP) { 263 WARN_ON_ONCE(1); 264 skb_checksum_help(skb); 265 goto out; 266 } 267 268 /* enable L4 csum */ 269 offload_assist |= BIT(TX_CMD_OFFLD_L4_EN); 270 271 /* Set offset to IP header (snap). 272 * We don't support tunneling so no need to take care of inner header. 273 * Size is in words. 274 */ 275 offload_assist |= (4 << TX_CMD_OFFLD_IP_HDR); 276 277 /* Do IPv4 csum for AMSDU only (no IP csum for Ipv6) */ 278 if (skb->protocol == htons(ETH_P_IP) && amsdu) { 279 ip_hdr(skb)->check = 0; 280 offload_assist |= BIT(TX_CMD_OFFLD_L3_EN); 281 } 282 283 /* reset UDP/TCP header csum */ 284 if (protocol == IPPROTO_TCP) 285 tcp_hdr(skb)->check = 0; 286 else 287 udp_hdr(skb)->check = 0; 288 289out: 290#endif 291 mh_len /= 2; 292 offload_assist |= mh_len << TX_CMD_OFFLD_MH_SIZE; 293 294 if (amsdu) 295 offload_assist |= BIT(TX_CMD_OFFLD_AMSDU); 296 else if (ieee80211_hdrlen(hdr->frame_control) % 4) 297 /* padding is inserted later in transport */ 298 offload_assist |= BIT(TX_CMD_OFFLD_PAD); 299 300 return cpu_to_le32(offload_assist); 301} 302 303static void iwl_mld_get_basic_rates_and_band(struct iwl_mld *mld, 304 struct ieee80211_vif *vif, 305 struct ieee80211_tx_info *info, 306 unsigned long *basic_rates, 307 u8 *band) 308{ 309 u32 link_id = u32_get_bits(info->control.flags, 310 IEEE80211_TX_CTRL_MLO_LINK); 311 312 *basic_rates = vif->bss_conf.basic_rates; 313 *band = info->band; 314 315 if (link_id == IEEE80211_LINK_UNSPECIFIED && 316 ieee80211_vif_is_mld(vif)) { 317 /* shouldn't do this when >1 link is active */ 318 WARN_ON(hweight16(vif->active_links) != 1); 319 link_id = __ffs(vif->active_links); 320 } 321 322 if (link_id < IEEE80211_LINK_UNSPECIFIED) { 323 struct ieee80211_bss_conf *link_conf; 324 325 rcu_read_lock(); 326 link_conf = rcu_dereference(vif->link_conf[link_id]); 327 if (link_conf) { 328 *basic_rates = link_conf->basic_rates; 329 if (link_conf->chanreq.oper.chan) 330 *band = link_conf->chanreq.oper.chan->band; 331 } 332 rcu_read_unlock(); 333 } 334} 335 336u8 iwl_mld_get_lowest_rate(struct iwl_mld *mld, 337 struct ieee80211_tx_info *info, 338 struct ieee80211_vif *vif) 339{ 340 struct ieee80211_supported_band *sband; 341 u16 lowest_cck = IWL_RATE_COUNT, lowest_ofdm = IWL_RATE_COUNT; 342 unsigned long basic_rates; 343 u8 band, rate; 344 u32 i; 345 346 iwl_mld_get_basic_rates_and_band(mld, vif, info, &basic_rates, &band); 347 348 if (band >= NUM_NL80211_BANDS) { 349 WARN_ON(vif->type != NL80211_IFTYPE_NAN); 350 return IWL_FIRST_OFDM_RATE; 351 } 352 353 sband = mld->hw->wiphy->bands[band]; 354 for_each_set_bit(i, &basic_rates, BITS_PER_LONG) { 355 u16 hw = sband->bitrates[i].hw_value; 356 357 if (hw >= IWL_FIRST_OFDM_RATE) { 358 if (lowest_ofdm > hw) 359 lowest_ofdm = hw; 360 } else if (lowest_cck > hw) { 361 lowest_cck = hw; 362 } 363 } 364 365 if (band == NL80211_BAND_2GHZ && !vif->p2p && 366 vif->type != NL80211_IFTYPE_P2P_DEVICE && 367 !(info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)) { 368 if (lowest_cck != IWL_RATE_COUNT) 369 rate = lowest_cck; 370 else if (lowest_ofdm != IWL_RATE_COUNT) 371 rate = lowest_ofdm; 372 else 373 rate = IWL_FIRST_CCK_RATE; 374 } else if (lowest_ofdm != IWL_RATE_COUNT) { 375 rate = lowest_ofdm; 376 } else { 377 rate = IWL_FIRST_OFDM_RATE; 378 } 379 380 return rate; 381} 382 383static u32 iwl_mld_mac80211_rate_idx_to_fw(struct iwl_mld *mld, 384 struct ieee80211_tx_info *info, 385 int rate_idx) 386{ 387 u32 rate_flags = 0; 388 u8 rate_plcp; 389 390 /* if the rate isn't a well known legacy rate, take the lowest one */ 391 if (rate_idx < 0 || rate_idx >= IWL_RATE_COUNT_LEGACY) 392 rate_idx = iwl_mld_get_lowest_rate(mld, info, 393 info->control.vif); 394 395 WARN_ON_ONCE(rate_idx < 0); 396 397 /* Set CCK or OFDM flag */ 398 if (rate_idx <= IWL_LAST_CCK_RATE) 399 rate_flags |= RATE_MCS_MOD_TYPE_CCK; 400 else 401 rate_flags |= RATE_MCS_MOD_TYPE_LEGACY_OFDM; 402 403 /* Legacy rates are indexed: 404 * 0 - 3 for CCK and 0 - 7 for OFDM 405 */ 406 rate_plcp = (rate_idx >= IWL_FIRST_OFDM_RATE ? 407 rate_idx - IWL_FIRST_OFDM_RATE : rate_idx); 408 409 return (u32)rate_plcp | rate_flags; 410} 411 412static u32 iwl_mld_get_tx_ant(struct iwl_mld *mld, 413 struct ieee80211_tx_info *info, 414 struct ieee80211_sta *sta, __le16 fc) 415{ 416 if (sta && ieee80211_is_data(fc)) { 417 struct iwl_mld_sta *mld_sta = iwl_mld_sta_from_mac80211(sta); 418 419 return BIT(mld_sta->data_tx_ant) << RATE_MCS_ANT_POS; 420 } 421 422 return BIT(mld->mgmt_tx_ant) << RATE_MCS_ANT_POS; 423} 424 425static u32 iwl_mld_get_inject_tx_rate(struct iwl_mld *mld, 426 struct ieee80211_tx_info *info, 427 struct ieee80211_sta *sta, 428 __le16 fc) 429{ 430 struct ieee80211_tx_rate *rate = &info->control.rates[0]; 431 u32 result; 432 433 if (rate->flags & IEEE80211_TX_RC_VHT_MCS) { 434 u8 mcs = ieee80211_rate_get_vht_mcs(rate); 435 u8 nss = ieee80211_rate_get_vht_nss(rate); 436 437 result = RATE_MCS_MOD_TYPE_VHT; 438 result |= u32_encode_bits(mcs, RATE_MCS_CODE_MSK); 439 result |= u32_encode_bits(nss, RATE_MCS_NSS_MSK); 440 441 if (rate->flags & IEEE80211_TX_RC_SHORT_GI) 442 result |= RATE_MCS_SGI_MSK; 443 444 if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) 445 result |= RATE_MCS_CHAN_WIDTH_40; 446 else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH) 447 result |= RATE_MCS_CHAN_WIDTH_80; 448 else if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH) 449 result |= RATE_MCS_CHAN_WIDTH_160; 450 } else if (rate->flags & IEEE80211_TX_RC_MCS) { 451 /* only MCS 0-15 are supported */ 452 u8 mcs = rate->idx & 7; 453 u8 nss = rate->idx > 7; 454 455 result = RATE_MCS_MOD_TYPE_HT; 456 result |= u32_encode_bits(mcs, RATE_MCS_CODE_MSK); 457 result |= u32_encode_bits(nss, RATE_MCS_NSS_MSK); 458 459 if (rate->flags & IEEE80211_TX_RC_SHORT_GI) 460 result |= RATE_MCS_SGI_MSK; 461 if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH) 462 result |= RATE_MCS_CHAN_WIDTH_40; 463 if (info->flags & IEEE80211_TX_CTL_LDPC) 464 result |= RATE_MCS_LDPC_MSK; 465 if (u32_get_bits(info->flags, IEEE80211_TX_CTL_STBC)) 466 result |= RATE_MCS_STBC_MSK; 467 } else { 468 result = iwl_mld_mac80211_rate_idx_to_fw(mld, info, rate->idx); 469 } 470 471 if (info->control.antennas) 472 result |= u32_encode_bits(info->control.antennas, 473 RATE_MCS_ANT_AB_MSK); 474 else 475 result |= iwl_mld_get_tx_ant(mld, info, sta, fc); 476 477 return result; 478} 479 480static __le32 iwl_mld_get_tx_rate_n_flags(struct iwl_mld *mld, 481 struct ieee80211_tx_info *info, 482 struct ieee80211_sta *sta, __le16 fc) 483{ 484 u32 rate; 485 486 if (unlikely(info->control.flags & IEEE80211_TX_CTRL_RATE_INJECT)) 487 rate = iwl_mld_get_inject_tx_rate(mld, info, sta, fc); 488 else 489 rate = iwl_mld_mac80211_rate_idx_to_fw(mld, info, -1) | 490 iwl_mld_get_tx_ant(mld, info, sta, fc); 491 492 return iwl_v3_rate_to_v2_v3(rate, mld->fw_rates_ver_3); 493} 494 495static void 496iwl_mld_fill_tx_cmd_hdr(struct iwl_tx_cmd *tx_cmd, 497 struct sk_buff *skb, bool amsdu) 498{ 499 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 500 struct ieee80211_hdr *hdr = (void *)skb->data; 501 struct ieee80211_vif *vif; 502 503 /* Copy MAC header from skb into command buffer */ 504 memcpy(tx_cmd->hdr, hdr, ieee80211_hdrlen(hdr->frame_control)); 505 506 if (!amsdu || !skb_is_gso(skb)) 507 return; 508 509 /* As described in IEEE sta 802.11-2020, table 9-30 (Address 510 * field contents), A-MSDU address 3 should contain the BSSID 511 * address. 512 * 513 * In TSO, the skb header address 3 contains the original address 3 to 514 * correctly create all the A-MSDU subframes headers from it. 515 * Override now the address 3 in the command header with the BSSID. 516 * 517 * Note: we fill in the MLD address, but the firmware will do the 518 * necessary translation to link address after encryption. 519 */ 520 vif = info->control.vif; 521 switch (vif->type) { 522 case NL80211_IFTYPE_STATION: 523 ether_addr_copy(tx_cmd->hdr->addr3, vif->cfg.ap_addr); 524 break; 525 case NL80211_IFTYPE_AP: 526 ether_addr_copy(tx_cmd->hdr->addr3, vif->addr); 527 break; 528 default: 529 break; 530 } 531} 532 533static void 534iwl_mld_fill_tx_cmd(struct iwl_mld *mld, struct sk_buff *skb, 535 struct iwl_device_tx_cmd *dev_tx_cmd, 536 struct ieee80211_sta *sta) 537{ 538 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 539 struct ieee80211_hdr *hdr = (void *)skb->data; 540 struct iwl_mld_sta *mld_sta = sta ? iwl_mld_sta_from_mac80211(sta) : 541 NULL; 542 struct iwl_tx_cmd *tx_cmd; 543 bool amsdu = ieee80211_is_data_qos(hdr->frame_control) && 544 (*ieee80211_get_qos_ctl(hdr) & 545 IEEE80211_QOS_CTL_A_MSDU_PRESENT); 546 __le32 rate_n_flags = 0; 547 u16 flags = 0; 548 549 dev_tx_cmd->hdr.cmd = TX_CMD; 550 551 if (!info->control.hw_key) 552 flags |= IWL_TX_FLAGS_ENCRYPT_DIS; 553 554 /* For data and mgmt packets rate info comes from the fw. 555 * Only set rate/antenna for injected frames with fixed rate, or 556 * when no sta is given. 557 */ 558 if (unlikely(!sta || 559 info->control.flags & IEEE80211_TX_CTRL_RATE_INJECT)) { 560 flags |= IWL_TX_FLAGS_CMD_RATE; 561 rate_n_flags = iwl_mld_get_tx_rate_n_flags(mld, info, sta, 562 hdr->frame_control); 563 } else if (!ieee80211_is_data(hdr->frame_control) || 564 (mld_sta && 565 mld_sta->sta_state < IEEE80211_STA_AUTHORIZED)) { 566 /* These are important frames */ 567 flags |= IWL_TX_FLAGS_HIGH_PRI; 568 } 569 570 tx_cmd = (void *)dev_tx_cmd->payload; 571 572 iwl_mld_fill_tx_cmd_hdr(tx_cmd, skb, amsdu); 573 574 tx_cmd->offload_assist = iwl_mld_get_offload_assist(skb, amsdu); 575 576 /* Total # bytes to be transmitted */ 577 tx_cmd->len = cpu_to_le16((u16)skb->len); 578 579 tx_cmd->flags = cpu_to_le16(flags); 580 581 tx_cmd->rate_n_flags = rate_n_flags; 582} 583 584/* Caller of this need to check that info->control.vif is not NULL */ 585static struct iwl_mld_link * 586iwl_mld_get_link_from_tx_info(struct ieee80211_tx_info *info) 587{ 588 struct iwl_mld_vif *mld_vif = 589 iwl_mld_vif_from_mac80211(info->control.vif); 590 u32 link_id = u32_get_bits(info->control.flags, 591 IEEE80211_TX_CTRL_MLO_LINK); 592 593 if (link_id == IEEE80211_LINK_UNSPECIFIED) { 594 if (info->control.vif->active_links) 595 link_id = ffs(info->control.vif->active_links) - 1; 596 else 597 link_id = 0; 598 } 599 600 return rcu_dereference(mld_vif->link[link_id]); 601} 602 603static int 604iwl_mld_get_tx_queue_id(struct iwl_mld *mld, struct ieee80211_txq *txq, 605 struct sk_buff *skb) 606{ 607 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 608 struct ieee80211_hdr *hdr = (void *)skb->data; 609 __le16 fc = hdr->frame_control; 610 struct iwl_mld_vif *mld_vif; 611 struct iwl_mld_link *link; 612 613 if (txq && txq->sta) 614 return iwl_mld_txq_from_mac80211(txq)->fw_id; 615 616 if (!info->control.vif) 617 return IWL_MLD_INVALID_QUEUE; 618 619 switch (info->control.vif->type) { 620 case NL80211_IFTYPE_AP: 621 case NL80211_IFTYPE_ADHOC: 622 link = iwl_mld_get_link_from_tx_info(info); 623 624 if (WARN_ON(!link)) 625 break; 626 627 /* ucast disassociate/deauth frames without a station might 628 * happen, especially with reason 7 ("Class 3 frame received 629 * from nonassociated STA"). 630 */ 631 if (ieee80211_is_mgmt(fc) && 632 (!ieee80211_is_bufferable_mmpdu(skb) || 633 ieee80211_is_deauth(fc) || ieee80211_is_disassoc(fc))) 634 return link->bcast_sta.queue_id; 635 636 if (is_multicast_ether_addr(hdr->addr1) && 637 !ieee80211_has_order(fc)) 638 return link->mcast_sta.queue_id; 639 640 WARN_ONCE(info->control.vif->type != NL80211_IFTYPE_ADHOC, 641 "Couldn't find a TXQ. fc=0x%02x", le16_to_cpu(fc)); 642 return link->bcast_sta.queue_id; 643 case NL80211_IFTYPE_P2P_DEVICE: 644 mld_vif = iwl_mld_vif_from_mac80211(info->control.vif); 645 646 if (mld_vif->roc_activity != ROC_ACTIVITY_P2P_DISC && 647 mld_vif->roc_activity != ROC_ACTIVITY_P2P_NEG) { 648 IWL_DEBUG_DROP(mld, 649 "Drop tx outside ROC with activity %d\n", 650 mld_vif->roc_activity); 651 return IWL_MLD_INVALID_DROP_TX; 652 } 653 654 WARN_ON(!ieee80211_is_mgmt(fc)); 655 656 return mld_vif->aux_sta.queue_id; 657 case NL80211_IFTYPE_MONITOR: 658 mld_vif = iwl_mld_vif_from_mac80211(info->control.vif); 659 return mld_vif->deflink.mon_sta.queue_id; 660 case NL80211_IFTYPE_STATION: 661 mld_vif = iwl_mld_vif_from_mac80211(info->control.vif); 662 663 if (!(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN)) { 664 IWL_DEBUG_DROP(mld, "Drop tx not off-channel\n"); 665 return IWL_MLD_INVALID_DROP_TX; 666 } 667 668 if (mld_vif->roc_activity != ROC_ACTIVITY_HOTSPOT) { 669 IWL_DEBUG_DROP(mld, "Drop tx outside ROC\n"); 670 return IWL_MLD_INVALID_DROP_TX; 671 } 672 673 WARN_ON(!ieee80211_is_mgmt(fc)); 674 return mld_vif->aux_sta.queue_id; 675 default: 676 WARN_ONCE(1, "Unsupported vif type\n"); 677 break; 678 } 679 680 return IWL_MLD_INVALID_QUEUE; 681} 682 683static void iwl_mld_probe_resp_set_noa(struct iwl_mld *mld, 684 struct sk_buff *skb) 685{ 686 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 687 struct iwl_mld_link *mld_link = 688 &iwl_mld_vif_from_mac80211(info->control.vif)->deflink; 689 struct iwl_probe_resp_data *resp_data; 690 u8 *pos; 691 692 if (!info->control.vif->p2p) 693 return; 694 695 rcu_read_lock(); 696 697 resp_data = rcu_dereference(mld_link->probe_resp_data); 698 if (!resp_data) 699 goto out; 700 701 if (!resp_data->notif.noa_active) 702 goto out; 703 704 if (skb_tailroom(skb) < resp_data->noa_len) { 705 if (pskb_expand_head(skb, 0, resp_data->noa_len, GFP_ATOMIC)) { 706 IWL_ERR(mld, 707 "Failed to reallocate probe resp\n"); 708 goto out; 709 } 710 } 711 712 pos = skb_put(skb, resp_data->noa_len); 713 714 *pos++ = WLAN_EID_VENDOR_SPECIFIC; 715 /* Set length of IE body (not including ID and length itself) */ 716 *pos++ = resp_data->noa_len - 2; 717 *pos++ = (WLAN_OUI_WFA >> 16) & 0xff; 718 *pos++ = (WLAN_OUI_WFA >> 8) & 0xff; 719 *pos++ = WLAN_OUI_WFA & 0xff; 720 *pos++ = WLAN_OUI_TYPE_WFA_P2P; 721 722 memcpy(pos, &resp_data->notif.noa_attr, 723 resp_data->noa_len - sizeof(struct ieee80211_vendor_ie)); 724 725out: 726 rcu_read_unlock(); 727} 728 729/* This function must be called with BHs disabled */ 730static int iwl_mld_tx_mpdu(struct iwl_mld *mld, struct sk_buff *skb, 731 struct ieee80211_txq *txq) 732{ 733 struct ieee80211_hdr *hdr = (void *)skb->data; 734 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 735 struct ieee80211_sta *sta = txq ? txq->sta : NULL; 736 struct iwl_device_tx_cmd *dev_tx_cmd; 737 int queue = iwl_mld_get_tx_queue_id(mld, txq, skb); 738 u8 tid = IWL_MAX_TID_COUNT; 739 740 if (WARN_ONCE(queue == IWL_MLD_INVALID_QUEUE, "Invalid TX Queue id") || 741 queue == IWL_MLD_INVALID_DROP_TX) 742 return -1; 743 744 if (unlikely(ieee80211_is_any_nullfunc(hdr->frame_control))) 745 return -1; 746 747 dev_tx_cmd = iwl_trans_alloc_tx_cmd(mld->trans); 748 if (unlikely(!dev_tx_cmd)) 749 return -1; 750 751 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control))) { 752 if (IWL_MLD_NON_TRANSMITTING_AP) 753 return -1; 754 755 iwl_mld_probe_resp_set_noa(mld, skb); 756 } 757 758 iwl_mld_fill_tx_cmd(mld, skb, dev_tx_cmd, sta); 759 760 if (ieee80211_is_data(hdr->frame_control)) { 761 if (ieee80211_is_data_qos(hdr->frame_control)) 762 tid = ieee80211_get_tid(hdr); 763 else 764 tid = IWL_TID_NON_QOS; 765 } 766 767 IWL_DEBUG_TX(mld, "TX TID:%d from Q:%d len %d\n", 768 tid, queue, skb->len); 769 770 /* From now on, we cannot access info->control */ 771 memset(&info->status, 0, sizeof(info->status)); 772 memset(info->driver_data, 0, sizeof(info->driver_data)); 773 774 info->driver_data[1] = dev_tx_cmd; 775 776 if (iwl_trans_tx(mld->trans, skb, dev_tx_cmd, queue)) 777 goto err; 778 779 /* Update low-latency counter when a packet is queued instead 780 * of after TX, it makes sense for early low-latency detection 781 */ 782 if (sta) 783 iwl_mld_low_latency_update_counters(mld, hdr, sta, 0); 784 785 return 0; 786 787err: 788 iwl_trans_free_tx_cmd(mld->trans, dev_tx_cmd); 789 IWL_DEBUG_TX(mld, "TX from Q:%d dropped\n", queue); 790 return -1; 791} 792 793#ifdef CONFIG_INET 794 795/* This function handles the segmentation of a large TSO packet into multiple 796 * MPDUs, ensuring that the resulting segments conform to AMSDU limits and 797 * constraints. 798 */ 799static int iwl_mld_tx_tso_segment(struct iwl_mld *mld, struct sk_buff *skb, 800 struct ieee80211_sta *sta, 801 struct sk_buff_head *mpdus_skbs) 802{ 803 struct ieee80211_hdr *hdr = (void *)skb->data; 804 netdev_features_t netdev_flags = NETIF_F_CSUM_MASK | NETIF_F_SG; 805 unsigned int mss = skb_shinfo(skb)->gso_size; 806 unsigned int num_subframes, tcp_payload_len, subf_len; 807 u16 snap_ip_tcp, pad, max_tid_amsdu_len; 808 u8 tid; 809 810 snap_ip_tcp = 8 + skb_network_header_len(skb) + tcp_hdrlen(skb); 811 812 if (!ieee80211_is_data_qos(hdr->frame_control) || 813 !sta->cur->max_rc_amsdu_len) 814 return iwl_tx_tso_segment(skb, 1, netdev_flags, mpdus_skbs); 815 816 /* Do not build AMSDU for IPv6 with extension headers. 817 * Ask stack to segment and checksum the generated MPDUs for us. 818 */ 819 if (skb->protocol == htons(ETH_P_IPV6) && 820 ((struct ipv6hdr *)skb_network_header(skb))->nexthdr != 821 IPPROTO_TCP) { 822 netdev_flags &= ~NETIF_F_CSUM_MASK; 823 return iwl_tx_tso_segment(skb, 1, netdev_flags, mpdus_skbs); 824 } 825 826 tid = ieee80211_get_tid(hdr); 827 if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT)) 828 return -EINVAL; 829 830 max_tid_amsdu_len = sta->cur->max_tid_amsdu_len[tid]; 831 if (!max_tid_amsdu_len) 832 return iwl_tx_tso_segment(skb, 1, netdev_flags, mpdus_skbs); 833 834 /* Sub frame header + SNAP + IP header + TCP header + MSS */ 835 subf_len = sizeof(struct ethhdr) + snap_ip_tcp + mss; 836 pad = (4 - subf_len) & 0x3; 837 838 /* If we have N subframes in the A-MSDU, then the A-MSDU's size is 839 * N * subf_len + (N - 1) * pad. 840 */ 841 num_subframes = (max_tid_amsdu_len + pad) / (subf_len + pad); 842 843 if (sta->max_amsdu_subframes && 844 num_subframes > sta->max_amsdu_subframes) 845 num_subframes = sta->max_amsdu_subframes; 846 847 tcp_payload_len = skb_tail_pointer(skb) - skb_transport_header(skb) - 848 tcp_hdrlen(skb) + skb->data_len; 849 850 /* Make sure we have enough TBs for the A-MSDU: 851 * 2 for each subframe 852 * 1 more for each fragment 853 * 1 more for the potential data in the header 854 */ 855 if ((num_subframes * 2 + skb_shinfo(skb)->nr_frags + 1) > 856 mld->trans->info.max_skb_frags) 857 num_subframes = 1; 858 859 if (num_subframes > 1) 860 *ieee80211_get_qos_ctl(hdr) |= IEEE80211_QOS_CTL_A_MSDU_PRESENT; 861 862 /* This skb fits in one single A-MSDU */ 863 if (tcp_payload_len <= num_subframes * mss) { 864 __skb_queue_tail(mpdus_skbs, skb); 865 return 0; 866 } 867 868 /* Trick the segmentation function to make it create SKBs that can fit 869 * into one A-MSDU. 870 */ 871 return iwl_tx_tso_segment(skb, num_subframes, netdev_flags, mpdus_skbs); 872} 873 874/* Manages TSO (TCP Segmentation Offload) packet transmission by segmenting 875 * large packets when necessary and transmitting each segment as MPDU. 876 */ 877static int iwl_mld_tx_tso(struct iwl_mld *mld, struct sk_buff *skb, 878 struct ieee80211_txq *txq) 879{ 880 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 881 struct sk_buff *orig_skb = skb; 882 struct sk_buff_head mpdus_skbs; 883 unsigned int payload_len; 884 int ret; 885 886 if (WARN_ON(!txq || !txq->sta)) 887 return -1; 888 889 payload_len = skb_tail_pointer(skb) - skb_transport_header(skb) - 890 tcp_hdrlen(skb) + skb->data_len; 891 892 if (payload_len <= skb_shinfo(skb)->gso_size) 893 return iwl_mld_tx_mpdu(mld, skb, txq); 894 895 if (!info->control.vif) 896 return -1; 897 898 __skb_queue_head_init(&mpdus_skbs); 899 900 ret = iwl_mld_tx_tso_segment(mld, skb, txq->sta, &mpdus_skbs); 901 if (ret) 902 return ret; 903 904 WARN_ON(skb_queue_empty(&mpdus_skbs)); 905 906 while (!skb_queue_empty(&mpdus_skbs)) { 907 skb = __skb_dequeue(&mpdus_skbs); 908 909 ret = iwl_mld_tx_mpdu(mld, skb, txq); 910 if (!ret) 911 continue; 912 913 /* Free skbs created as part of TSO logic that have not yet 914 * been dequeued 915 */ 916 __skb_queue_purge(&mpdus_skbs); 917 918 /* skb here is not necessarily same as skb that entered 919 * this method, so free it explicitly. 920 */ 921 if (skb == orig_skb) 922 ieee80211_free_txskb(mld->hw, skb); 923 else 924 kfree_skb(skb); 925 926 /* there was error, but we consumed skb one way or 927 * another, so return 0 928 */ 929 return 0; 930 } 931 932 return 0; 933} 934#else 935static int iwl_mld_tx_tso(struct iwl_mld *mld, struct sk_buff *skb, 936 struct ieee80211_txq *txq) 937{ 938 /* Impossible to get TSO without CONFIG_INET */ 939 WARN_ON(1); 940 941 return -1; 942} 943#endif /* CONFIG_INET */ 944 945void iwl_mld_tx_skb(struct iwl_mld *mld, struct sk_buff *skb, 946 struct ieee80211_txq *txq) 947{ 948 if (skb_is_gso(skb)) { 949 if (!iwl_mld_tx_tso(mld, skb, txq)) 950 return; 951 goto err; 952 } 953 954 if (likely(!iwl_mld_tx_mpdu(mld, skb, txq))) 955 return; 956 957err: 958 ieee80211_free_txskb(mld->hw, skb); 959} 960 961void iwl_mld_tx_from_txq(struct iwl_mld *mld, struct ieee80211_txq *txq) 962{ 963 struct iwl_mld_txq *mld_txq = iwl_mld_txq_from_mac80211(txq); 964 struct sk_buff *skb = NULL; 965 u8 zero_addr[ETH_ALEN] = {}; 966 967 /* 968 * No need for threads to be pending here, they can leave the first 969 * taker all the work. 970 * 971 * mld_txq->tx_request logic: 972 * 973 * If 0, no one is currently TXing, set to 1 to indicate current thread 974 * will now start TX and other threads should quit. 975 * 976 * If 1, another thread is currently TXing, set to 2 to indicate to 977 * that thread that there was another request. Since that request may 978 * have raced with the check whether the queue is empty, the TXing 979 * thread should check the queue's status one more time before leaving. 980 * This check is done in order to not leave any TX hanging in the queue 981 * until the next TX invocation (which may not even happen). 982 * 983 * If 2, another thread is currently TXing, and it will already double 984 * check the queue, so do nothing. 985 */ 986 if (atomic_fetch_add_unless(&mld_txq->tx_request, 1, 2)) 987 return; 988 989 rcu_read_lock(); 990 do { 991 while (likely(!mld_txq->status.stop_full) && 992 (skb = ieee80211_tx_dequeue(mld->hw, txq))) 993 iwl_mld_tx_skb(mld, skb, txq); 994 } while (atomic_dec_return(&mld_txq->tx_request)); 995 996 IWL_DEBUG_TX(mld, "TXQ of sta %pM tid %d is now empty\n", 997 txq->sta ? txq->sta->addr : zero_addr, txq->tid); 998 999 rcu_read_unlock(); 1000} 1001 1002static void iwl_mld_hwrate_to_tx_rate(struct iwl_mld *mld, 1003 __le32 rate_n_flags_fw, 1004 struct ieee80211_tx_info *info) 1005{ 1006 enum nl80211_band band = info->band; 1007 struct ieee80211_tx_rate *tx_rate = &info->status.rates[0]; 1008 u32 rate_n_flags = iwl_v3_rate_from_v2_v3(rate_n_flags_fw, 1009 mld->fw_rates_ver_3); 1010 u32 sgi = rate_n_flags & RATE_MCS_SGI_MSK; 1011 u32 chan_width = rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK; 1012 u32 format = rate_n_flags & RATE_MCS_MOD_TYPE_MSK; 1013 1014 if (sgi) 1015 tx_rate->flags |= IEEE80211_TX_RC_SHORT_GI; 1016 1017 switch (chan_width) { 1018 case RATE_MCS_CHAN_WIDTH_20: 1019 break; 1020 case RATE_MCS_CHAN_WIDTH_40: 1021 tx_rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; 1022 break; 1023 case RATE_MCS_CHAN_WIDTH_80: 1024 tx_rate->flags |= IEEE80211_TX_RC_80_MHZ_WIDTH; 1025 break; 1026 case RATE_MCS_CHAN_WIDTH_160: 1027 tx_rate->flags |= IEEE80211_TX_RC_160_MHZ_WIDTH; 1028 break; 1029 default: 1030 break; 1031 } 1032 1033 switch (format) { 1034 case RATE_MCS_MOD_TYPE_HT: 1035 tx_rate->flags |= IEEE80211_TX_RC_MCS; 1036 tx_rate->idx = RATE_HT_MCS_INDEX(rate_n_flags); 1037 break; 1038 case RATE_MCS_MOD_TYPE_VHT: 1039 ieee80211_rate_set_vht(tx_rate, 1040 rate_n_flags & RATE_MCS_CODE_MSK, 1041 u32_get_bits(rate_n_flags, 1042 RATE_MCS_NSS_MSK) + 1); 1043 tx_rate->flags |= IEEE80211_TX_RC_VHT_MCS; 1044 break; 1045 case RATE_MCS_MOD_TYPE_HE: 1046 case RATE_MCS_MOD_TYPE_EHT: 1047 /* mac80211 cannot do this without ieee80211_tx_status_ext() 1048 * but it only matters for radiotap 1049 */ 1050 tx_rate->idx = 0; 1051 break; 1052 default: 1053 tx_rate->idx = 1054 iwl_mld_legacy_hw_idx_to_mac80211_idx(rate_n_flags, 1055 band); 1056 break; 1057 } 1058} 1059 1060void iwl_mld_handle_tx_resp_notif(struct iwl_mld *mld, 1061 struct iwl_rx_packet *pkt) 1062{ 1063 struct iwl_tx_resp *tx_resp = (void *)pkt->data; 1064 int txq_id = le16_to_cpu(tx_resp->tx_queue); 1065 struct agg_tx_status *agg_status = &tx_resp->status; 1066 u32 status = le16_to_cpu(agg_status->status); 1067 u32 pkt_len = iwl_rx_packet_payload_len(pkt); 1068 size_t notif_size = sizeof(*tx_resp) + sizeof(u32); 1069 int sta_id = IWL_TX_RES_GET_RA(tx_resp->ra_tid); 1070 int tid = IWL_TX_RES_GET_TID(tx_resp->ra_tid); 1071 struct ieee80211_link_sta *link_sta; 1072 struct iwl_mld_sta *mld_sta; 1073 u16 ssn; 1074 struct sk_buff_head skbs; 1075 u8 skb_freed = 0; 1076 bool mgmt = false; 1077 bool tx_failure = (status & TX_STATUS_MSK) != TX_STATUS_SUCCESS; 1078 1079 if (IWL_FW_CHECK(mld, tx_resp->frame_count != 1, 1080 "Invalid tx_resp notif frame_count (%d)\n", 1081 tx_resp->frame_count)) 1082 return; 1083 1084 /* validate the size of the variable part of the notif */ 1085 if (IWL_FW_CHECK(mld, notif_size != pkt_len, 1086 "Invalid tx_resp notif size (expected=%zu got=%u)\n", 1087 notif_size, pkt_len)) 1088 return; 1089 1090 ssn = le32_to_cpup((__le32 *)agg_status + 1091 tx_resp->frame_count) & 0xFFFF; 1092 1093 __skb_queue_head_init(&skbs); 1094 1095 /* we can free until ssn % q.n_bd not inclusive */ 1096 iwl_trans_reclaim(mld->trans, txq_id, ssn, &skbs, false); 1097 1098 while (!skb_queue_empty(&skbs)) { 1099 struct sk_buff *skb = __skb_dequeue(&skbs); 1100 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1101 struct ieee80211_hdr *hdr = (void *)skb->data; 1102 1103 skb_freed++; 1104 1105 iwl_trans_free_tx_cmd(mld->trans, info->driver_data[1]); 1106 1107 memset(&info->status, 0, sizeof(info->status)); 1108 1109 info->flags &= ~(IEEE80211_TX_STAT_ACK | IEEE80211_TX_STAT_TX_FILTERED); 1110 1111 /* inform mac80211 about what happened with the frame */ 1112 switch (status & TX_STATUS_MSK) { 1113 case TX_STATUS_SUCCESS: 1114 case TX_STATUS_DIRECT_DONE: 1115 info->flags |= IEEE80211_TX_STAT_ACK; 1116 break; 1117 default: 1118 break; 1119 } 1120 1121 /* If we are freeing multiple frames, mark all the frames 1122 * but the first one as acked, since they were acknowledged 1123 * before 1124 */ 1125 if (skb_freed > 1) 1126 info->flags |= IEEE80211_TX_STAT_ACK; 1127 1128 if (tx_failure) { 1129 enum iwl_fw_ini_time_point tp = 1130 IWL_FW_INI_TIME_POINT_TX_FAILED; 1131 1132 if (ieee80211_is_action(hdr->frame_control)) 1133 tp = IWL_FW_INI_TIME_POINT_TX_WFD_ACTION_FRAME_FAILED; 1134 else if (ieee80211_is_mgmt(hdr->frame_control)) 1135 mgmt = true; 1136 1137 iwl_dbg_tlv_time_point(&mld->fwrt, tp, NULL); 1138 } 1139 1140 iwl_mld_hwrate_to_tx_rate(mld, tx_resp->initial_rate, info); 1141 1142 if (likely(!iwl_mld_time_sync_frame(mld, skb, hdr->addr1))) 1143 ieee80211_tx_status_skb(mld->hw, skb); 1144 } 1145 1146 IWL_DEBUG_TX_REPLY(mld, 1147 "TXQ %d status 0x%08x ssn=%d initial_rate 0x%x retries %d\n", 1148 txq_id, status, ssn, le32_to_cpu(tx_resp->initial_rate), 1149 tx_resp->failure_frame); 1150 1151 if (tx_failure && mgmt) 1152 iwl_mld_toggle_tx_ant(mld, &mld->mgmt_tx_ant); 1153 1154 if (IWL_FW_CHECK(mld, sta_id >= mld->fw->ucode_capa.num_stations, 1155 "Got invalid sta_id (%d)\n", sta_id)) 1156 return; 1157 1158 rcu_read_lock(); 1159 1160 link_sta = rcu_dereference(mld->fw_id_to_link_sta[sta_id]); 1161 if (!link_sta) { 1162 /* This can happen if the TX cmd was sent before pre_rcu_remove 1163 * but the TX response was received after 1164 */ 1165 IWL_DEBUG_TX_REPLY(mld, 1166 "Got valid sta_id (%d) but sta is NULL\n", 1167 sta_id); 1168 goto out; 1169 } 1170 1171 if (IS_ERR(link_sta)) 1172 goto out; 1173 1174 mld_sta = iwl_mld_sta_from_mac80211(link_sta->sta); 1175 1176 if (tx_failure && mld_sta->sta_state < IEEE80211_STA_AUTHORIZED) 1177 iwl_mld_toggle_tx_ant(mld, &mld_sta->data_tx_ant); 1178 1179 if (tid < IWL_MAX_TID_COUNT) 1180 iwl_mld_count_mpdu_tx(link_sta, 1); 1181 1182out: 1183 rcu_read_unlock(); 1184} 1185 1186static void iwl_mld_tx_reclaim_txq(struct iwl_mld *mld, int txq, int index, 1187 bool in_flush) 1188{ 1189 struct sk_buff_head reclaimed_skbs; 1190 1191 __skb_queue_head_init(&reclaimed_skbs); 1192 1193 iwl_trans_reclaim(mld->trans, txq, index, &reclaimed_skbs, in_flush); 1194 1195 while (!skb_queue_empty(&reclaimed_skbs)) { 1196 struct sk_buff *skb = __skb_dequeue(&reclaimed_skbs); 1197 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 1198 1199 iwl_trans_free_tx_cmd(mld->trans, info->driver_data[1]); 1200 1201 memset(&info->status, 0, sizeof(info->status)); 1202 1203 /* Packet was transmitted successfully, failures come as single 1204 * frames because before failing a frame the firmware transmits 1205 * it without aggregation at least once. 1206 */ 1207 if (!in_flush) 1208 info->flags |= IEEE80211_TX_STAT_ACK; 1209 else 1210 info->flags &= ~IEEE80211_TX_STAT_ACK; 1211 1212 ieee80211_tx_status_skb(mld->hw, skb); 1213 } 1214} 1215 1216int iwl_mld_flush_link_sta_txqs(struct iwl_mld *mld, u32 fw_sta_id) 1217{ 1218 struct iwl_tx_path_flush_cmd_rsp *rsp; 1219 struct iwl_tx_path_flush_cmd flush_cmd = { 1220 .sta_id = cpu_to_le32(fw_sta_id), 1221 .tid_mask = cpu_to_le16(0xffff), 1222 }; 1223 struct iwl_host_cmd cmd = { 1224 .id = TXPATH_FLUSH, 1225 .len = { sizeof(flush_cmd), }, 1226 .data = { &flush_cmd, }, 1227 .flags = CMD_WANT_SKB, 1228 }; 1229 int ret, num_flushed_queues; 1230 u32 resp_len; 1231 1232 IWL_DEBUG_TX_QUEUES(mld, "flush for sta id %d tid mask 0x%x\n", 1233 fw_sta_id, 0xffff); 1234 1235 ret = iwl_mld_send_cmd(mld, &cmd); 1236 if (ret) { 1237 IWL_ERR(mld, "Failed to send flush command (%d)\n", ret); 1238 return ret; 1239 } 1240 1241 resp_len = iwl_rx_packet_payload_len(cmd.resp_pkt); 1242 if (IWL_FW_CHECK(mld, resp_len != sizeof(*rsp), 1243 "Invalid TXPATH_FLUSH response len: %d\n", 1244 resp_len)) { 1245 ret = -EIO; 1246 goto free_rsp; 1247 } 1248 1249 rsp = (void *)cmd.resp_pkt->data; 1250 1251 if (IWL_FW_CHECK(mld, le16_to_cpu(rsp->sta_id) != fw_sta_id, 1252 "sta_id %d != rsp_sta_id %d\n", fw_sta_id, 1253 le16_to_cpu(rsp->sta_id))) { 1254 ret = -EIO; 1255 goto free_rsp; 1256 } 1257 1258 num_flushed_queues = le16_to_cpu(rsp->num_flushed_queues); 1259 if (IWL_FW_CHECK(mld, num_flushed_queues > IWL_TX_FLUSH_QUEUE_RSP, 1260 "num_flushed_queues %d\n", num_flushed_queues)) { 1261 ret = -EIO; 1262 goto free_rsp; 1263 } 1264 1265 for (int i = 0; i < num_flushed_queues; i++) { 1266 struct iwl_flush_queue_info *queue_info = &rsp->queues[i]; 1267 int read_after = le16_to_cpu(queue_info->read_after_flush); 1268 int txq_id = le16_to_cpu(queue_info->queue_num); 1269 1270 if (IWL_FW_CHECK(mld, 1271 txq_id >= ARRAY_SIZE(mld->fw_id_to_txq), 1272 "Invalid txq id %d\n", txq_id)) 1273 continue; 1274 1275 IWL_DEBUG_TX_QUEUES(mld, 1276 "tid %d txq_id %d read-before %d read-after %d\n", 1277 le16_to_cpu(queue_info->tid), txq_id, 1278 le16_to_cpu(queue_info->read_before_flush), 1279 read_after); 1280 1281 iwl_mld_tx_reclaim_txq(mld, txq_id, read_after, true); 1282 } 1283 1284free_rsp: 1285 iwl_free_resp(&cmd); 1286 return ret; 1287} 1288 1289int iwl_mld_ensure_queue(struct iwl_mld *mld, struct ieee80211_txq *txq) 1290{ 1291 struct iwl_mld_txq *mld_txq = iwl_mld_txq_from_mac80211(txq); 1292 int ret; 1293 1294 lockdep_assert_wiphy(mld->wiphy); 1295 1296 if (likely(mld_txq->status.allocated)) 1297 return 0; 1298 1299 ret = iwl_mld_add_txq(mld, txq); 1300 1301 spin_lock_bh(&mld->add_txqs_lock); 1302 if (!list_empty(&mld_txq->list)) 1303 list_del_init(&mld_txq->list); 1304 spin_unlock_bh(&mld->add_txqs_lock); 1305 1306 return ret; 1307} 1308 1309int iwl_mld_update_sta_txqs(struct iwl_mld *mld, 1310 struct ieee80211_sta *sta, 1311 u32 old_sta_mask, u32 new_sta_mask) 1312{ 1313 struct iwl_scd_queue_cfg_cmd cmd = { 1314 .operation = cpu_to_le32(IWL_SCD_QUEUE_MODIFY), 1315 .u.modify.old_sta_mask = cpu_to_le32(old_sta_mask), 1316 .u.modify.new_sta_mask = cpu_to_le32(new_sta_mask), 1317 }; 1318 1319 lockdep_assert_wiphy(mld->wiphy); 1320 1321 for (int tid = 0; tid <= IWL_MAX_TID_COUNT; tid++) { 1322 struct ieee80211_txq *txq = 1323 sta->txq[tid != IWL_MAX_TID_COUNT ? 1324 tid : IEEE80211_NUM_TIDS]; 1325 struct iwl_mld_txq *mld_txq = 1326 iwl_mld_txq_from_mac80211(txq); 1327 int ret; 1328 1329 if (!mld_txq->status.allocated) 1330 continue; 1331 1332 if (tid == IWL_MAX_TID_COUNT) 1333 cmd.u.modify.tid = cpu_to_le32(IWL_MGMT_TID); 1334 else 1335 cmd.u.modify.tid = cpu_to_le32(tid); 1336 1337 ret = iwl_mld_send_cmd_pdu(mld, 1338 WIDE_ID(DATA_PATH_GROUP, 1339 SCD_QUEUE_CONFIG_CMD), 1340 &cmd); 1341 if (ret) 1342 return ret; 1343 } 1344 1345 return 0; 1346} 1347 1348void iwl_mld_handle_compressed_ba_notif(struct iwl_mld *mld, 1349 struct iwl_rx_packet *pkt) 1350{ 1351 struct iwl_compressed_ba_notif *ba_res = (void *)pkt->data; 1352 u32 pkt_len = iwl_rx_packet_payload_len(pkt); 1353 u16 tfd_cnt = le16_to_cpu(ba_res->tfd_cnt); 1354 u8 sta_id = ba_res->sta_id; 1355 struct ieee80211_link_sta *link_sta; 1356 1357 if (!tfd_cnt) 1358 return; 1359 1360 if (IWL_FW_CHECK(mld, struct_size(ba_res, tfd, tfd_cnt) > pkt_len, 1361 "Short BA notif (tfd_cnt=%d, size:0x%x)\n", 1362 tfd_cnt, pkt_len)) 1363 return; 1364 1365 IWL_DEBUG_TX_REPLY(mld, 1366 "BA notif received from sta_id=%d, flags=0x%x, sent:%d, acked:%d\n", 1367 sta_id, le32_to_cpu(ba_res->flags), 1368 le16_to_cpu(ba_res->txed), 1369 le16_to_cpu(ba_res->done)); 1370 1371 for (int i = 0; i < tfd_cnt; i++) { 1372 struct iwl_compressed_ba_tfd *ba_tfd = &ba_res->tfd[i]; 1373 int txq_id = le16_to_cpu(ba_tfd->q_num); 1374 int index = le16_to_cpu(ba_tfd->tfd_index); 1375 1376 if (IWL_FW_CHECK(mld, 1377 txq_id >= ARRAY_SIZE(mld->fw_id_to_txq), 1378 "Invalid txq id %d\n", txq_id)) 1379 continue; 1380 1381 iwl_mld_tx_reclaim_txq(mld, txq_id, index, false); 1382 } 1383 1384 if (IWL_FW_CHECK(mld, sta_id >= mld->fw->ucode_capa.num_stations, 1385 "Got invalid sta_id (%d)\n", sta_id)) 1386 return; 1387 1388 rcu_read_lock(); 1389 1390 link_sta = rcu_dereference(mld->fw_id_to_link_sta[sta_id]); 1391 if (IWL_FW_CHECK(mld, IS_ERR_OR_NULL(link_sta), 1392 "Got valid sta_id (%d) but link_sta is NULL\n", 1393 sta_id)) 1394 goto out; 1395 1396 iwl_mld_count_mpdu_tx(link_sta, le16_to_cpu(ba_res->txed)); 1397out: 1398 rcu_read_unlock(); 1399}
~/
Read-only file preview.