···137137 even if the microcode doesn't advertise it.138138139139 Say Y only if you want to experiment with MFP.140140-141141-config IWLWIFI_UCODE16142142- bool "support uCode 16.0"143143- depends on IWLWIFI144144- help145145- This option enables support for uCode version 16.0.146146-147147- Say Y if you want to use 16.0 microcode.
···772772 ~IWL_STA_DRIVER_ACTIVE;773773 priv->stations[i].used &=774774 ~IWL_STA_UCODE_INPROGRESS;775775- spin_unlock_bh(&priv->sta_lock);775775+ continue;776776 }777777 /*778778 * Rate scaling has already been initialized, send
+9-9
drivers/net/wireless/iwlwifi/iwl-drv.c
···657657 return -EINVAL;658658}659659660660-static int alloc_pci_desc(struct iwl_drv *drv,661661- struct iwl_firmware_pieces *pieces,662662- enum iwl_ucode_type type)660660+static int iwl_alloc_ucode(struct iwl_drv *drv,661661+ struct iwl_firmware_pieces *pieces,662662+ enum iwl_ucode_type type)663663{664664 int i;665665 for (i = 0;666666 i < IWL_UCODE_SECTION_MAX && get_sec_size(pieces, type, i);667667 i++)668668 if (iwl_alloc_fw_desc(drv, &(drv->fw.img[type].sec[i]),669669- get_sec(pieces, type, i)))670670- return -1;669669+ get_sec(pieces, type, i)))670670+ return -ENOMEM;671671 return 0;672672}673673···825825 * 1) unmodified from disk826826 * 2) backup cache for save/restore during power-downs */827827 for (i = 0; i < IWL_UCODE_TYPE_MAX; i++)828828- if (alloc_pci_desc(drv, &pieces, i))829829- goto err_pci_alloc;828828+ if (iwl_alloc_ucode(drv, &pieces, i))829829+ goto out_free_fw;830830831831 /* Now that we can no longer fail, copy information */832832···866866 drv->op_mode = iwl_dvm_ops.start(drv->trans, drv->cfg, &drv->fw);867867868868 if (!drv->op_mode)869869- goto out_unbind;869869+ goto out_free_fw;870870871871 return;872872···877877 goto out_unbind;878878 return;879879880880- err_pci_alloc:880880+ out_free_fw:881881 IWL_ERR(drv, "failed to allocate pci memory\n");882882 iwl_dealloc_ucode(drv);883883 release_firmware(ucode_raw);
-288
drivers/net/wireless/iwlwifi/iwl-phy-db.c
···11-/******************************************************************************22- *33- * This file is provided under a dual BSD/GPLv2 license. When using or44- * redistributing this file, you may do so under either license.55- *66- * GPL LICENSE SUMMARY77- *88- * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.99- *1010- * This program is free software; you can redistribute it and/or modify1111- * it under the terms of version 2 of the GNU General Public License as1212- * published by the Free Software Foundation.1313- *1414- * This program is distributed in the hope that it will be useful, but1515- * WITHOUT ANY WARRANTY; without even the implied warranty of1616- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU1717- * General Public License for more details.1818- *1919- * You should have received a copy of the GNU General Public License2020- * along with this program; if not, write to the Free Software2121- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,2222- * USA2323- *2424- * The full GNU General Public License is included in this distribution2525- * in the file called LICENSE.GPL.2626- *2727- * Contact Information:2828- * Intel Linux Wireless <ilw@linux.intel.com>2929- * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-64973030- *3131- * BSD LICENSE3232- *3333- * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.3434- * All rights reserved.3535- *3636- * Redistribution and use in source and binary forms, with or without3737- * modification, are permitted provided that the following conditions3838- * are met:3939- *4040- * * Redistributions of source code must retain the above copyright4141- * notice, this list of conditions and the following disclaimer.4242- * * Redistributions in binary form must reproduce the above copyright4343- * notice, this list of conditions and the following disclaimer in4444- * the documentation and/or other materials provided with the4545- * distribution.4646- * * Neither the name Intel Corporation nor the names of its4747- * contributors may be used to endorse or promote products derived4848- * from this software without specific prior written permission.4949- *5050- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS5151- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT5252- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR5353- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT5454- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,5555- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT5656- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,5757- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY5858- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT5959- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE6060- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.6161- *6262- *****************************************************************************/6363-6464-#include <linux/slab.h>6565-#include <linux/string.h>6666-6767-#include "iwl-debug.h"6868-#include "iwl-dev.h"6969-7070-#include "iwl-phy-db.h"7171-7272-#define CHANNEL_NUM_SIZE 4 /* num of channels in calib_ch size */7373-7474-struct iwl_phy_db *iwl_phy_db_init(struct device *dev)7575-{7676- struct iwl_phy_db *phy_db = kzalloc(sizeof(struct iwl_phy_db),7777- GFP_KERNEL);7878-7979- if (!phy_db)8080- return phy_db;8181-8282- phy_db->dev = dev;8383-8484- /* TODO: add default values of the phy db. */8585- return phy_db;8686-}8787-8888-/*8989- * get phy db section: returns a pointer to a phy db section specified by9090- * type and channel group id.9191- */9292-static struct iwl_phy_db_entry *9393-iwl_phy_db_get_section(struct iwl_phy_db *phy_db,9494- enum iwl_phy_db_section_type type,9595- u16 chg_id)9696-{9797- if (!phy_db || type < 0 || type >= IWL_PHY_DB_MAX)9898- return NULL;9999-100100- switch (type) {101101- case IWL_PHY_DB_CFG:102102- return &phy_db->cfg;103103- case IWL_PHY_DB_CALIB_NCH:104104- return &phy_db->calib_nch;105105- case IWL_PHY_DB_CALIB_CH:106106- return &phy_db->calib_ch;107107- case IWL_PHY_DB_CALIB_CHG_PAPD:108108- if (chg_id < 0 || chg_id >= IWL_NUM_PAPD_CH_GROUPS)109109- return NULL;110110- return &phy_db->calib_ch_group_papd[chg_id];111111- case IWL_PHY_DB_CALIB_CHG_TXP:112112- if (chg_id < 0 || chg_id >= IWL_NUM_TXP_CH_GROUPS)113113- return NULL;114114- return &phy_db->calib_ch_group_txp[chg_id];115115- default:116116- return NULL;117117- }118118- return NULL;119119-}120120-121121-static void iwl_phy_db_free_section(struct iwl_phy_db *phy_db,122122- enum iwl_phy_db_section_type type,123123- u16 chg_id)124124-{125125- struct iwl_phy_db_entry *entry =126126- iwl_phy_db_get_section(phy_db, type, chg_id);127127- if (!entry)128128- return;129129-130130- kfree(entry->data);131131- entry->data = NULL;132132- entry->size = 0;133133-}134134-135135-void iwl_phy_db_free(struct iwl_phy_db *phy_db)136136-{137137- int i;138138-139139- if (!phy_db)140140- return;141141-142142- iwl_phy_db_free_section(phy_db, IWL_PHY_DB_CFG, 0);143143- iwl_phy_db_free_section(phy_db, IWL_PHY_DB_CALIB_NCH, 0);144144- iwl_phy_db_free_section(phy_db, IWL_PHY_DB_CALIB_CH, 0);145145- for (i = 0; i < IWL_NUM_PAPD_CH_GROUPS; i++)146146- iwl_phy_db_free_section(phy_db, IWL_PHY_DB_CALIB_CHG_PAPD, i);147147- for (i = 0; i < IWL_NUM_TXP_CH_GROUPS; i++)148148- iwl_phy_db_free_section(phy_db, IWL_PHY_DB_CALIB_CHG_TXP, i);149149-150150- kfree(phy_db);151151-}152152-153153-int iwl_phy_db_set_section(struct iwl_phy_db *phy_db,154154- enum iwl_phy_db_section_type type, u8 *data,155155- u16 size, gfp_t alloc_ctx)156156-{157157- struct iwl_phy_db_entry *entry;158158- u16 chg_id = 0;159159-160160- if (!phy_db)161161- return -EINVAL;162162-163163- if (type == IWL_PHY_DB_CALIB_CHG_PAPD ||164164- type == IWL_PHY_DB_CALIB_CHG_TXP)165165- chg_id = le16_to_cpup((__le16 *)data);166166-167167- entry = iwl_phy_db_get_section(phy_db, type, chg_id);168168- if (!entry)169169- return -EINVAL;170170-171171- kfree(entry->data);172172- entry->data = kmemdup(data, size, alloc_ctx);173173- if (!entry->data) {174174- entry->size = 0;175175- return -ENOMEM;176176- }177177-178178- entry->size = size;179179-180180- if (type == IWL_PHY_DB_CALIB_CH) {181181- phy_db->channel_num = le32_to_cpup((__le32 *)data);182182- phy_db->channel_size =183183- (size - CHANNEL_NUM_SIZE) / phy_db->channel_num;184184- }185185-186186- return 0;187187-}188188-189189-static int is_valid_channel(u16 ch_id)190190-{191191- if (ch_id <= 14 ||192192- (36 <= ch_id && ch_id <= 64 && ch_id % 4 == 0) ||193193- (100 <= ch_id && ch_id <= 140 && ch_id % 4 == 0) ||194194- (145 <= ch_id && ch_id <= 165 && ch_id % 4 == 1))195195- return 1;196196- return 0;197197-}198198-199199-static u8 ch_id_to_ch_index(u16 ch_id)200200-{201201- if (WARN_ON(!is_valid_channel(ch_id)))202202- return 0xff;203203-204204- if (ch_id <= 14)205205- return ch_id - 1;206206- if (ch_id <= 64)207207- return (ch_id + 20) / 4;208208- if (ch_id <= 140)209209- return (ch_id - 12) / 4;210210- return (ch_id - 13) / 4;211211-}212212-213213-214214-static u16 channel_id_to_papd(u16 ch_id)215215-{216216- if (WARN_ON(!is_valid_channel(ch_id)))217217- return 0xff;218218-219219- if (1 <= ch_id && ch_id <= 14)220220- return 0;221221- if (36 <= ch_id && ch_id <= 64)222222- return 1;223223- if (100 <= ch_id && ch_id <= 140)224224- return 2;225225- return 3;226226-}227227-228228-static u16 channel_id_to_txp(struct iwl_phy_db *phy_db, u16 ch_id)229229-{230230- struct iwl_phy_db_chg_txp *txp_chg;231231- int i;232232- u8 ch_index = ch_id_to_ch_index(ch_id);233233- if (ch_index == 0xff)234234- return 0xff;235235-236236- for (i = 0; i < IWL_NUM_TXP_CH_GROUPS; i++) {237237- txp_chg = (void *)phy_db->calib_ch_group_txp[i].data;238238- if (!txp_chg)239239- return 0xff;240240- /*241241- * Looking for the first channel group that its max channel is242242- * higher then wanted channel.243243- */244244- if (le16_to_cpu(txp_chg->max_channel_idx) >= ch_index)245245- return i;246246- }247247- return 0xff;248248-}249249-250250-int iwl_phy_db_get_section_data(struct iwl_phy_db *phy_db,251251- enum iwl_phy_db_section_type type, u8 **data,252252- u16 *size, u16 ch_id)253253-{254254- struct iwl_phy_db_entry *entry;255255- u32 channel_num;256256- u32 channel_size;257257- u16 ch_group_id = 0;258258- u16 index;259259-260260- if (!phy_db)261261- return -EINVAL;262262-263263- /* find wanted channel group */264264- if (type == IWL_PHY_DB_CALIB_CHG_PAPD)265265- ch_group_id = channel_id_to_papd(ch_id);266266- else if (type == IWL_PHY_DB_CALIB_CHG_TXP)267267- ch_group_id = channel_id_to_txp(phy_db, ch_id);268268-269269- entry = iwl_phy_db_get_section(phy_db, type, ch_group_id);270270- if (!entry)271271- return -EINVAL;272272-273273- if (type == IWL_PHY_DB_CALIB_CH) {274274- index = ch_id_to_ch_index(ch_id);275275- channel_num = phy_db->channel_num;276276- channel_size = phy_db->channel_size;277277- if (index >= channel_num) {278278- IWL_ERR(phy_db, "Wrong channel number %d", ch_id);279279- return -EINVAL;280280- }281281- *data = entry->data + CHANNEL_NUM_SIZE + index * channel_size;282282- *size = channel_size;283283- } else {284284- *data = entry->data;285285- *size = entry->size;286286- }287287- return 0;288288-}
-129
drivers/net/wireless/iwlwifi/iwl-phy-db.h
···11-/******************************************************************************22- *33- * This file is provided under a dual BSD/GPLv2 license. When using or44- * redistributing this file, you may do so under either license.55- *66- * GPL LICENSE SUMMARY77- *88- * Copyright(c) 2007 - 2012 Intel Corporation. All rights reserved.99- *1010- * This program is free software; you can redistribute it and/or modify1111- * it under the terms of version 2 of the GNU General Public License as1212- * published by the Free Software Foundation.1313- *1414- * This program is distributed in the hope that it will be useful, but1515- * WITHOUT ANY WARRANTY; without even the implied warranty of1616- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU1717- * General Public License for more details.1818- *1919- * You should have received a copy of the GNU General Public License2020- * along with this program; if not, write to the Free Software2121- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,2222- * USA2323- *2424- * The full GNU General Public License is included in this distribution2525- * in the file called LICENSE.GPL.2626- *2727- * Contact Information:2828- * Intel Linux Wireless <ilw@linux.intel.com>2929- * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-64973030- *3131- * BSD LICENSE3232- *3333- * Copyright(c) 2005 - 2012 Intel Corporation. All rights reserved.3434- * All rights reserved.3535- *3636- * Redistribution and use in source and binary forms, with or without3737- * modification, are permitted provided that the following conditions3838- * are met:3939- *4040- * * Redistributions of source code must retain the above copyright4141- * notice, this list of conditions and the following disclaimer.4242- * * Redistributions in binary form must reproduce the above copyright4343- * notice, this list of conditions and the following disclaimer in4444- * the documentation and/or other materials provided with the4545- * distribution.4646- * * Neither the name Intel Corporation nor the names of its4747- * contributors may be used to endorse or promote products derived4848- * from this software without specific prior written permission.4949- *5050- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS5151- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT5252- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR5353- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT5454- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,5555- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT5656- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,5757- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY5858- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT5959- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE6060- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.6161- *6262- *****************************************************************************/6363-6464-#ifndef __IWL_PHYDB_H__6565-#define __IWL_PHYDB_H__6666-6767-#include <linux/types.h>6868-6969-#define IWL_NUM_PAPD_CH_GROUPS 47070-#define IWL_NUM_TXP_CH_GROUPS 87171-7272-struct iwl_phy_db_entry {7373- u16 size;7474- u8 *data;7575-};7676-7777-struct iwl_shared;7878-7979-/**8080- * struct iwl_phy_db - stores phy configuration and calibration data.8181- *8282- * @cfg: phy configuration.8383- * @calib_nch: non channel specific calibration data.8484- * @calib_ch: channel specific calibration data.8585- * @calib_ch_group_papd: calibration data related to papd channel group.8686- * @calib_ch_group_txp: calibration data related to tx power chanel group.8787- */8888-struct iwl_phy_db {8989- struct iwl_phy_db_entry cfg;9090- struct iwl_phy_db_entry calib_nch;9191- struct iwl_phy_db_entry calib_ch;9292- struct iwl_phy_db_entry calib_ch_group_papd[IWL_NUM_PAPD_CH_GROUPS];9393- struct iwl_phy_db_entry calib_ch_group_txp[IWL_NUM_TXP_CH_GROUPS];9494-9595- u32 channel_num;9696- u32 channel_size;9797-9898- /* for an access to the logger */9999- struct device *dev;100100-};101101-102102-enum iwl_phy_db_section_type {103103- IWL_PHY_DB_CFG = 1,104104- IWL_PHY_DB_CALIB_NCH,105105- IWL_PHY_DB_CALIB_CH,106106- IWL_PHY_DB_CALIB_CHG_PAPD,107107- IWL_PHY_DB_CALIB_CHG_TXP,108108- IWL_PHY_DB_MAX109109-};110110-111111-/* for parsing of tx power channel group data that comes from the firmware*/112112-struct iwl_phy_db_chg_txp {113113- __le32 space;114114- __le16 max_channel_idx;115115-} __packed;116116-117117-struct iwl_phy_db *iwl_phy_db_init(struct device *dev);118118-119119-void iwl_phy_db_free(struct iwl_phy_db *phy_db);120120-121121-int iwl_phy_db_set_section(struct iwl_phy_db *phy_db,122122- enum iwl_phy_db_section_type type, u8 *data,123123- u16 size, gfp_t alloc_ctx);124124-125125-int iwl_phy_db_get_section_data(struct iwl_phy_db *phy_db,126126- enum iwl_phy_db_section_type type, u8 **data,127127- u16 *size, u16 ch_id);128128-129129-#endif /* __IWL_PHYDB_H__ */
+1-1
drivers/net/wireless/iwlwifi/iwl-trans-pcie-int.h
···347347void iwl_trans_pcie_tx_agg_setup(struct iwl_trans *trans, int queue, int fifo,348348 int sta_id, int tid, int frame_limit, u16 ssn);349349void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,350350- int index, enum dma_data_direction dma_dir);350350+ enum dma_data_direction dma_dir);351351int iwl_tx_queue_reclaim(struct iwl_trans *trans, int txq_id, int index,352352 struct sk_buff_head *skbs);353353int iwl_queue_space(const struct iwl_queue *q);
+14-8
drivers/net/wireless/iwlwifi/iwl-trans-pcie-tx.c
···204204 for (i = 1; i < num_tbs; i++)205205 dma_unmap_single(trans->dev, iwl_tfd_tb_get_addr(tfd, i),206206 iwl_tfd_tb_get_len(tfd, i), dma_dir);207207+208208+ tfd->num_tbs = 0;207209}208210209211/**210212 * iwlagn_txq_free_tfd - Free all chunks referenced by TFD [txq->q.read_ptr]211213 * @trans - transport private data212214 * @txq - tx queue213213- * @index - the index of the TFD to be freed214214- *@dma_dir - the direction of the DMA mapping215215+ * @dma_dir - the direction of the DMA mapping215216 *216217 * Does NOT advance any TFD circular buffer read/write indexes217218 * Does NOT free the TFD itself (which is within circular buffer)218219 */219220void iwlagn_txq_free_tfd(struct iwl_trans *trans, struct iwl_tx_queue *txq,220220- int index, enum dma_data_direction dma_dir)221221+ enum dma_data_direction dma_dir)221222{222223 struct iwl_tfd *tfd_tmp = txq->tfds;223224225225+ /* rd_ptr is bounded by n_bd and idx is bounded by n_window */226226+ int rd_ptr = txq->q.read_ptr;227227+ int idx = get_cmd_index(&txq->q, rd_ptr);228228+224229 lockdep_assert_held(&txq->lock);225230226226- iwlagn_unmap_tfd(trans, &txq->entries[index].meta,227227- &tfd_tmp[index], dma_dir);231231+ /* We have only q->n_window txq->entries, but we use q->n_bd tfds */232232+ iwlagn_unmap_tfd(trans, &txq->entries[idx].meta,233233+ &tfd_tmp[rd_ptr], dma_dir);228234229235 /* free SKB */230236 if (txq->entries) {231237 struct sk_buff *skb;232238233233- skb = txq->entries[index].skb;239239+ skb = txq->entries[idx].skb;234240235241 /* Can be called from irqs-disabled context236242 * If skb is not NULL, it means that the whole queue is being···244238 */245239 if (skb) {246240 iwl_op_mode_free_skb(trans->op_mode, skb);247247- txq->entries[index].skb = NULL;241241+ txq->entries[idx].skb = NULL;248242 }249243 }250244}···979973980974 iwlagn_txq_inval_byte_cnt_tbl(trans, txq);981975982982- iwlagn_txq_free_tfd(trans, txq, txq->q.read_ptr, DMA_TO_DEVICE);976976+ iwlagn_txq_free_tfd(trans, txq, DMA_TO_DEVICE);983977 freed++;984978 }985979
+1-3
drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
···435435436436 spin_lock_bh(&txq->lock);437437 while (q->write_ptr != q->read_ptr) {438438- /* The read_ptr needs to bound by q->n_window */439439- iwlagn_txq_free_tfd(trans, txq, get_cmd_index(q, q->read_ptr),440440- dma_dir);438438+ iwlagn_txq_free_tfd(trans, txq, dma_dir);441439 q->read_ptr = iwl_queue_inc_wrap(q->read_ptr, q->n_bd);442440 }443441 spin_unlock_bh(&txq->lock);
···15221522 * anymore. The timeout will be reset if the frame is ACKed by15231523 * the AP.15241524 */15251525+ ifmgd->probe_send_count++;15261526+15251527 if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS) {15261528 ifmgd->nullfunc_failed = false;15271529 ieee80211_send_nullfunc(sdata->local, sdata, 0);···15401538 0, (u32) -1, true, false);15411539 }1542154015431543- ifmgd->probe_send_count++;15441541 ifmgd->probe_timeout = jiffies + msecs_to_jiffies(probe_wait_ms);15451542 run_again(ifmgd, ifmgd->probe_timeout);15461543 if (sdata->local->hw.flags & IEEE80211_HW_REPORTS_TX_ACK_STATUS)
+1-1
net/mac80211/tx.c
···153153154154 /* Don't calculate ACKs for QoS Frames with NoAck Policy set */155155 if (ieee80211_is_data_qos(hdr->frame_control) &&156156- *(ieee80211_get_qos_ctl(hdr)) | IEEE80211_QOS_CTL_ACK_POLICY_NOACK)156156+ *(ieee80211_get_qos_ctl(hdr)) & IEEE80211_QOS_CTL_ACK_POLICY_NOACK)157157 dur = 0;158158 else159159 /* Time needed to transmit ACK
+6-6
net/mac80211/util.c
···13711371 }13721372 }1373137313741374+ /* add back keys */13751375+ list_for_each_entry(sdata, &local->interfaces, list)13761376+ if (ieee80211_sdata_running(sdata))13771377+ ieee80211_enable_keys(sdata);13781378+13791379+ wake_up:13741380 /*13751381 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation13761382 * sessions can be established after a resume.···13981392 mutex_unlock(&local->sta_mtx);13991393 }1400139414011401- /* add back keys */14021402- list_for_each_entry(sdata, &local->interfaces, list)14031403- if (ieee80211_sdata_running(sdata))14041404- ieee80211_enable_keys(sdata);14051405-14061406- wake_up:14071395 ieee80211_wake_queues_by_reason(hw,14081396 IEEE80211_QUEUE_STOP_REASON_SUSPEND);14091397