Final batch of iwlwifi patches for 4.18
* Some bugzilla fixes; * Some kernel warning fixes; * Fix for an (ETSI) WMM limits bug; * Fix for a Bluetooth coexistence problem on 9000 devices; * Fix for an interoperability bug related to block-ack sessions; -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEF3LNfgb2BPWm68smoUecoho8xfoFAlsOp44ACgkQoUecoho8 xfpvKw/8D269aA5C+n8R5wWjWr9S0TDaS+ohb7ydExI3BzsEc+PFpNc+IWpBCpeC 4CFyl9hzg39hVveiv/usPI4ARbrKmY+EoKulPBpcZGYdRRWsm2hK91kJ1qyfNwbU IR4jn2aqdGEmC3HfjNBWn6kqqv36NOvVj96mjytcOvWGDL7RFSRwPXcVnWhRq4nn zIge4MsYNhaDP6tatSOo0AvCSKpuxysL57B2yFtCcpYdWdfCLNIK9oCk+G4fc8fg WOsERKebBU4unWmRdat8JtbW/hKNpj5GdqiR45aVz5q/vkveQyFeJnNp6i+wpWOh GDf/VxMqeHSM5DWeXy1gHJdNybYP/9c5SQ+hWE03dTyzs3sPfjvvlG/1fVAYHRvt VYS8r8eseymGiNNexEjuiDvsQaLBlHtu7prY0cSBZPZf/oE0SrjHrAAFngFud8Ue E9OiHS6YVUpFSpu4K7Gl4Q99f/IrqiMrG1u87XoLTBUaqWaubuRr2tKhWal2TfXa ycOrnh2YX73NvfcCEntWEC0LRaZ6x+g189EChp++/bxKt20SBbBWTopNhscQAGZa skrKcPK7jxvQLeP370UYtviV+cCvMliPml8NQyHm0JTepsiqUY+8W5mOi4Bygk5B h9yQs0IHjFyw8Qlp9y2DL4EkyClqA2aNhRA9VM5mj0QPnaEeq8A= =oIAR -----END PGP SIGNATURE----- Merge tag 'iwlwifi-next-for-kalle-2018-05-30' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next Final batch of iwlwifi patches for 4.18 * Some bugzilla fixes; * Some kernel warning fixes; * Fix for an (ETSI) WMM limits bug; * Fix for a Bluetooth coexistence problem on 9000 devices; * Fix for an interoperability bug related to block-ack sessions;
This commit is contained in:
commit
206641355d
@ -373,6 +373,7 @@ const struct iwl_cfg iwl6000_3agn_cfg = {
|
||||
.eeprom_params = &iwl6000_eeprom_params,
|
||||
.ht_params = &iwl6000_ht_params,
|
||||
.led_mode = IWL_LED_BLINK,
|
||||
.csr = &iwl_csr_v1,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX));
|
||||
|
@ -137,7 +137,7 @@ static const struct iwl_tt_params iwl9000_tt_params = {
|
||||
.base_params = &iwl9000_base_params, \
|
||||
.led_mode = IWL_LED_RF_STATE, \
|
||||
.nvm_hw_section_num = NVM_HW_SECTION_NUM_FAMILY_9000, \
|
||||
.non_shared_ant = ANT_A, \
|
||||
.non_shared_ant = ANT_B, \
|
||||
.dccm_offset = IWL9000_DCCM_OFFSET, \
|
||||
.dccm_len = IWL9000_DCCM_LEN, \
|
||||
.dccm2_offset = IWL9000_DCCM2_OFFSET, \
|
||||
|
@ -295,6 +295,7 @@ enum iwl_rx_mpdu_status {
|
||||
IWL_RX_MPDU_STATUS_MIC_OK = BIT(6),
|
||||
IWL_RX_MPDU_RES_STATUS_TTAK_OK = BIT(7),
|
||||
IWL_RX_MPDU_STATUS_SEC_MASK = 0x7 << 8,
|
||||
IWL_RX_MPDU_STATUS_SEC_UNKNOWN = IWL_RX_MPDU_STATUS_SEC_MASK,
|
||||
IWL_RX_MPDU_STATUS_SEC_NONE = 0x0 << 8,
|
||||
IWL_RX_MPDU_STATUS_SEC_WEP = 0x1 << 8,
|
||||
IWL_RX_MPDU_STATUS_SEC_CCM = 0x2 << 8,
|
||||
|
@ -1025,8 +1025,7 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
||||
continue;
|
||||
|
||||
copy_rd->reg_rules[i].wmm_rule = d_wmm +
|
||||
(regd->reg_rules[i].wmm_rule - s_wmm) /
|
||||
sizeof(struct ieee80211_wmm_rule);
|
||||
(regd->reg_rules[i].wmm_rule - s_wmm);
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -2685,7 +2685,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
/* track whether or not the station is associated */
|
||||
mvm_sta->associated = new_state >= IEEE80211_STA_ASSOC;
|
||||
mvm_sta->sta_state = new_state;
|
||||
|
||||
if (old_state == IEEE80211_STA_NOTEXIST &&
|
||||
new_state == IEEE80211_STA_NONE) {
|
||||
@ -2737,8 +2737,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
||||
iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
|
||||
}
|
||||
|
||||
iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band,
|
||||
true);
|
||||
iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band);
|
||||
ret = iwl_mvm_update_sta(mvm, vif, sta);
|
||||
} else if (old_state == IEEE80211_STA_ASSOC &&
|
||||
new_state == IEEE80211_STA_AUTHORIZED) {
|
||||
@ -2754,8 +2753,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
||||
/* enable beacon filtering */
|
||||
WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
|
||||
|
||||
iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band,
|
||||
false);
|
||||
iwl_mvm_rs_rate_init(mvm, sta, mvmvif->phy_ctxt->channel->band);
|
||||
|
||||
ret = 0;
|
||||
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
|
||||
|
@ -3,6 +3,7 @@
|
||||
* Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2016 - 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
@ -13,10 +14,6 @@
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
@ -651,9 +648,10 @@ static void rs_tl_turn_on_agg(struct iwl_mvm *mvm, struct iwl_mvm_sta *mvmsta,
|
||||
}
|
||||
|
||||
tid_data = &mvmsta->tid_data[tid];
|
||||
if ((tid_data->state == IWL_AGG_OFF) &&
|
||||
if (mvmsta->sta_state >= IEEE80211_STA_AUTHORIZED &&
|
||||
tid_data->state == IWL_AGG_OFF &&
|
||||
(lq_sta->tx_agg_tid_en & BIT(tid)) &&
|
||||
(tid_data->tx_count_last >= IWL_MVM_RS_AGG_START_THRESHOLD)) {
|
||||
tid_data->tx_count_last >= IWL_MVM_RS_AGG_START_THRESHOLD) {
|
||||
IWL_DEBUG_RATE(mvm, "try to aggregate tid %d\n", tid);
|
||||
if (rs_tl_turn_on_agg_for_tid(mvm, lq_sta, tid, sta) == 0)
|
||||
tid_data->state = IWL_AGG_QUEUED;
|
||||
@ -1257,7 +1255,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
(unsigned long)(lq_sta->last_tx +
|
||||
(IWL_MVM_RS_IDLE_TIMEOUT * HZ)))) {
|
||||
IWL_DEBUG_RATE(mvm, "Tx idle for too long. reinit rs\n");
|
||||
iwl_mvm_rs_rate_init(mvm, sta, info->band, false);
|
||||
iwl_mvm_rs_rate_init(mvm, sta, info->band);
|
||||
return;
|
||||
}
|
||||
lq_sta->last_tx = jiffies;
|
||||
@ -2690,9 +2688,9 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm,
|
||||
struct ieee80211_sta *sta,
|
||||
struct iwl_lq_sta *lq_sta,
|
||||
enum nl80211_band band,
|
||||
struct rs_rate *rate,
|
||||
bool init)
|
||||
struct rs_rate *rate)
|
||||
{
|
||||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
int i, nentries;
|
||||
unsigned long active_rate;
|
||||
s8 best_rssi = S8_MIN;
|
||||
@ -2754,7 +2752,8 @@ static void rs_get_initial_rate(struct iwl_mvm *mvm,
|
||||
* bandwidth rate, and after authorization, when the phy context
|
||||
* is already up-to-date, re-init rs with the correct bw.
|
||||
*/
|
||||
u32 bw = init ? RATE_MCS_CHAN_WIDTH_20 : rs_bw_from_sta_bw(sta);
|
||||
u32 bw = mvmsta->sta_state < IEEE80211_STA_AUTHORIZED ?
|
||||
RATE_MCS_CHAN_WIDTH_20 : rs_bw_from_sta_bw(sta);
|
||||
|
||||
switch (bw) {
|
||||
case RATE_MCS_CHAN_WIDTH_40:
|
||||
@ -2839,9 +2838,9 @@ void rs_update_last_rssi(struct iwl_mvm *mvm,
|
||||
static void rs_initialize_lq(struct iwl_mvm *mvm,
|
||||
struct ieee80211_sta *sta,
|
||||
struct iwl_lq_sta *lq_sta,
|
||||
enum nl80211_band band,
|
||||
bool init)
|
||||
enum nl80211_band band)
|
||||
{
|
||||
struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
struct iwl_scale_tbl_info *tbl;
|
||||
struct rs_rate *rate;
|
||||
u8 active_tbl = 0;
|
||||
@ -2857,7 +2856,7 @@ static void rs_initialize_lq(struct iwl_mvm *mvm,
|
||||
tbl = &(lq_sta->lq_info[active_tbl]);
|
||||
rate = &tbl->rate;
|
||||
|
||||
rs_get_initial_rate(mvm, sta, lq_sta, band, rate, init);
|
||||
rs_get_initial_rate(mvm, sta, lq_sta, band, rate);
|
||||
rs_init_optimal_rate(mvm, sta, lq_sta);
|
||||
|
||||
WARN_ONCE(rate->ant != ANT_A && rate->ant != ANT_B,
|
||||
@ -2870,7 +2869,8 @@ static void rs_initialize_lq(struct iwl_mvm *mvm,
|
||||
rs_set_expected_tpt_table(lq_sta, tbl);
|
||||
rs_fill_lq_cmd(mvm, sta, lq_sta, rate);
|
||||
/* TODO restore station should remember the lq cmd */
|
||||
iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, init);
|
||||
iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq,
|
||||
mvmsta->sta_state < IEEE80211_STA_AUTHORIZED);
|
||||
}
|
||||
|
||||
static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
|
||||
@ -3123,7 +3123,7 @@ void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg)
|
||||
* Called after adding a new station to initialize rate scaling
|
||||
*/
|
||||
static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
enum nl80211_band band, bool init)
|
||||
enum nl80211_band band)
|
||||
{
|
||||
int i, j;
|
||||
struct ieee80211_hw *hw = mvm->hw;
|
||||
@ -3203,7 +3203,7 @@ static void rs_drv_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
iwl_mvm_reset_frame_stats(mvm);
|
||||
#endif
|
||||
rs_initialize_lq(mvm, sta, lq_sta, band, init);
|
||||
rs_initialize_lq(mvm, sta, lq_sta, band);
|
||||
}
|
||||
|
||||
static void rs_drv_rate_update(void *mvm_r,
|
||||
@ -3223,7 +3223,7 @@ static void rs_drv_rate_update(void *mvm_r,
|
||||
for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++)
|
||||
ieee80211_stop_tx_ba_session(sta, tid);
|
||||
|
||||
iwl_mvm_rs_rate_init(mvm, sta, sband->band, false);
|
||||
iwl_mvm_rs_rate_init(mvm, sta, sband->band);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
@ -4069,12 +4069,12 @@ static const struct rate_control_ops rs_mvm_ops_drv = {
|
||||
};
|
||||
|
||||
void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
enum nl80211_band band, bool init)
|
||||
enum nl80211_band band)
|
||||
{
|
||||
if (iwl_mvm_has_tlc_offload(mvm))
|
||||
rs_fw_rate_init(mvm, sta, band);
|
||||
else
|
||||
rs_drv_rate_init(mvm, sta, band, init);
|
||||
rs_drv_rate_init(mvm, sta, band);
|
||||
}
|
||||
|
||||
int iwl_mvm_rate_control_register(void)
|
||||
|
@ -3,6 +3,7 @@
|
||||
* Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2015 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
@ -13,10 +14,6 @@
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
@ -410,7 +407,7 @@ struct iwl_lq_sta {
|
||||
|
||||
/* Initialize station's rate scaling information after adding station */
|
||||
void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
enum nl80211_band band, bool init);
|
||||
enum nl80211_band band);
|
||||
|
||||
/* Notify RS about Tx status */
|
||||
void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
|
@ -227,12 +227,24 @@ static void iwl_mvm_get_signal_strength(struct iwl_mvm *mvm,
|
||||
}
|
||||
|
||||
static int iwl_mvm_rx_crypto(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
|
||||
struct ieee80211_rx_status *stats,
|
||||
struct iwl_rx_mpdu_desc *desc, u32 pkt_flags,
|
||||
int queue, u8 *crypt_len)
|
||||
struct ieee80211_rx_status *stats, u16 phy_info,
|
||||
struct iwl_rx_mpdu_desc *desc,
|
||||
u32 pkt_flags, int queue, u8 *crypt_len)
|
||||
{
|
||||
u16 status = le16_to_cpu(desc->status);
|
||||
|
||||
/*
|
||||
* Drop UNKNOWN frames in aggregation, unless in monitor mode
|
||||
* (where we don't have the keys).
|
||||
* We limit this to aggregation because in TKIP this is a valid
|
||||
* scenario, since we may not have the (correct) TTAK (phase 1
|
||||
* key) in the firmware.
|
||||
*/
|
||||
if (phy_info & IWL_RX_MPDU_PHY_AMPDU &&
|
||||
(status & IWL_RX_MPDU_STATUS_SEC_MASK) ==
|
||||
IWL_RX_MPDU_STATUS_SEC_UNKNOWN && !mvm->monitor_on)
|
||||
return -1;
|
||||
|
||||
if (!ieee80211_has_protected(hdr->frame_control) ||
|
||||
(status & IWL_RX_MPDU_STATUS_SEC_MASK) ==
|
||||
IWL_RX_MPDU_STATUS_SEC_NONE)
|
||||
@ -578,14 +590,10 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
|
||||
notif = (void *)pkt->data;
|
||||
internal_notif = (void *)notif->payload;
|
||||
|
||||
if (internal_notif->sync) {
|
||||
if (mvm->queue_sync_cookie != internal_notif->cookie) {
|
||||
WARN_ONCE(1,
|
||||
"Received expired RX queue sync message\n");
|
||||
return;
|
||||
}
|
||||
if (!atomic_dec_return(&mvm->queue_sync_counter))
|
||||
wake_up(&mvm->rx_sync_waitq);
|
||||
if (internal_notif->sync &&
|
||||
mvm->queue_sync_cookie != internal_notif->cookie) {
|
||||
WARN_ONCE(1, "Received expired RX queue sync message\n");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (internal_notif->type) {
|
||||
@ -597,6 +605,10 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
|
||||
default:
|
||||
WARN_ONCE(1, "Invalid identifier %d", internal_notif->type);
|
||||
}
|
||||
|
||||
if (internal_notif->sync &&
|
||||
!atomic_dec_return(&mvm->queue_sync_counter))
|
||||
wake_up(&mvm->rx_sync_waitq);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -870,7 +882,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
|
||||
rx_status = IEEE80211_SKB_RXCB(skb);
|
||||
|
||||
if (iwl_mvm_rx_crypto(mvm, hdr, rx_status, desc,
|
||||
if (iwl_mvm_rx_crypto(mvm, hdr, rx_status, phy_info, desc,
|
||||
le32_to_cpu(pkt->len_n_flags), queue,
|
||||
&crypt_len)) {
|
||||
kfree_skb(skb);
|
||||
|
@ -216,7 +216,7 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
cpu_to_le32(agg_size << STA_FLG_MAX_AGG_SIZE_SHIFT);
|
||||
add_sta_cmd.station_flags |=
|
||||
cpu_to_le32(mpdu_dens << STA_FLG_AGG_MPDU_DENS_SHIFT);
|
||||
if (mvm_sta->associated)
|
||||
if (mvm_sta->sta_state >= IEEE80211_STA_ASSOC)
|
||||
add_sta_cmd.assoc_id = cpu_to_le16(sta->aid);
|
||||
|
||||
if (sta->wme) {
|
||||
|
@ -8,6 +8,7 @@
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2015 - 2016 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -18,11 +19,6 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
|
||||
* USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution
|
||||
* in the file called COPYING.
|
||||
*
|
||||
@ -35,6 +31,7 @@
|
||||
* Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
|
||||
* Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2015 - 2016 Intel Deutschland GmbH
|
||||
* Copyright(c) 2018 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -376,6 +373,7 @@ struct iwl_mvm_rxq_dup_data {
|
||||
* tid.
|
||||
* @max_agg_bufsize: the maximal size of the AGG buffer for this station
|
||||
* @sta_type: station type
|
||||
* @sta_state: station state according to enum %ieee80211_sta_state
|
||||
* @bt_reduced_txpower: is reduced tx power enabled for this station
|
||||
* @next_status_eosp: the next reclaimed packet is a PS-Poll response and
|
||||
* we need to signal the EOSP
|
||||
@ -416,6 +414,7 @@ struct iwl_mvm_sta {
|
||||
u16 tid_disable_agg;
|
||||
u8 max_agg_bufsize;
|
||||
enum iwl_sta_type sta_type;
|
||||
enum ieee80211_sta_state sta_state;
|
||||
bool bt_reduced_txpower;
|
||||
bool next_status_eosp;
|
||||
spinlock_t lock;
|
||||
@ -441,7 +440,6 @@ struct iwl_mvm_sta {
|
||||
u16 amsdu_enabled;
|
||||
u16 max_amsdu_len;
|
||||
bool sleeping;
|
||||
bool associated;
|
||||
u8 agg_tids;
|
||||
u8 sleep_tx_count;
|
||||
u8 avg_energy;
|
||||
|
@ -7,6 +7,7 @@
|
||||
*
|
||||
* Copyright(c) 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(C) 2018 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of version 2 of the GNU General Public License as
|
||||
@ -18,9 +19,7 @@
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
|
||||
* USA
|
||||
* along with this program.
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution
|
||||
* in the file called COPYING.
|
||||
@ -33,6 +32,7 @@
|
||||
*
|
||||
* Copyright(c) 2014 Intel Mobile Communications GmbH
|
||||
* Copyright(c) 2017 Intel Deutschland GmbH
|
||||
* Copyright(C) 2018 Intel Corporation
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@ -188,8 +188,14 @@ void iwl_mvm_recalc_tdls_state(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||
if (tdls_sta_cnt == 1 && sta_added)
|
||||
iwl_mvm_power_update_mac(mvm);
|
||||
|
||||
/* configure the FW with TDLS peer info */
|
||||
iwl_mvm_tdls_config(mvm, vif);
|
||||
/* Configure the FW with TDLS peer info only if TDLS channel switch
|
||||
* capability is set.
|
||||
* TDLS config data is used currently only in TDLS channel switch code.
|
||||
* Supposed to serve also TDLS buffer station which is not implemneted
|
||||
* yet in FW*/
|
||||
if (fw_has_capa(&mvm->fw->ucode_capa,
|
||||
IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH))
|
||||
iwl_mvm_tdls_config(mvm, vif);
|
||||
|
||||
/* when the last peer leaves, send a power update last */
|
||||
if (tdls_sta_cnt == 0 && !sta_added)
|
||||
|
@ -843,8 +843,10 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
* N * subf_len + (N - 1) * pad.
|
||||
*/
|
||||
num_subframes = (max_amsdu_len + pad) / (subf_len + pad);
|
||||
if (num_subframes > 1)
|
||||
*ieee80211_get_qos_ctl(hdr) |= IEEE80211_QOS_CTL_A_MSDU_PRESENT;
|
||||
|
||||
if (sta->max_amsdu_subframes &&
|
||||
num_subframes > sta->max_amsdu_subframes)
|
||||
num_subframes = sta->max_amsdu_subframes;
|
||||
|
||||
tcp_payload_len = skb_tail_pointer(skb) - skb_transport_header(skb) -
|
||||
tcp_hdrlen(skb) + skb->data_len;
|
||||
@ -855,10 +857,12 @@ static int iwl_mvm_tx_tso(struct iwl_mvm *mvm, struct sk_buff *skb,
|
||||
* 1 more for each fragment
|
||||
* 1 more for the potential data in the header
|
||||
*/
|
||||
num_subframes =
|
||||
min_t(unsigned int, num_subframes,
|
||||
(mvm->trans->max_skb_frags - 1 -
|
||||
skb_shinfo(skb)->nr_frags) / 2);
|
||||
if ((num_subframes * 2 + skb_shinfo(skb)->nr_frags + 1) >
|
||||
mvm->trans->max_skb_frags)
|
||||
num_subframes = 1;
|
||||
|
||||
if (num_subframes > 1)
|
||||
*ieee80211_get_qos_ctl(hdr) |= IEEE80211_QOS_CTL_A_MSDU_PRESENT;
|
||||
|
||||
/* This skb fits in one single A-MSDU */
|
||||
if (num_subframes * mss >= tcp_payload_len) {
|
||||
|
@ -836,6 +836,9 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
struct iwl_trans *iwl_trans;
|
||||
int ret;
|
||||
|
||||
if (WARN_ONCE(!cfg->csr, "CSR addresses aren't configured\n"))
|
||||
return -EINVAL;
|
||||
|
||||
iwl_trans = iwl_trans_pcie_alloc(pdev, ent, cfg);
|
||||
if (IS_ERR(iwl_trans))
|
||||
return PTR_ERR(iwl_trans);
|
||||
|
@ -902,6 +902,8 @@ static int _iwl_pcie_rx_init(struct iwl_trans *trans)
|
||||
}
|
||||
def_rxq = trans_pcie->rxq;
|
||||
|
||||
cancel_work_sync(&rba->rx_alloc);
|
||||
|
||||
spin_lock(&rba->lock);
|
||||
atomic_set(&rba->req_pending, 0);
|
||||
atomic_set(&rba->req_ready, 0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user