* rtlwifi: fix a regression in large skb allocation failure
iwlwifi: * fix for 7265D NVM check * fixes for scan: fix long scanning times and network discovery * new firmware API for iwlmvm supported devices * fixes in rate control -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQEcBAABAgAGBQJUsADlAAoJEG4XJFUm622b6esH/1DmWaj2Qhx+EY4o9hZIdrtR WtnRABBro/7b26UGD71+uhDlciN6pxEgWSTwEgjKsF5ALImv9aFDmX7QfL8Aet5f 8yL/hXchsgQ2c78+HGD6SAPYzLb0vY67MM4TI0DO4JuwCZjf/dYVgIvsYPaFqPzc k8Hpkf7/EFpRa0av6RnjZ13gMfi+NDnE4a++FmerMB8Kvhioz3urD7P2JBJAEAVl 6yntnKnstl6YByR3ooprjk9A4guljUvPf6chlLOgMVrxUyIrSooVR+25Vfw4Fvzl fSAl1rAongSsjEkjtsJ9G0KQlzKVOKek8vy/Jrc8THdfcb3skn1p85IlVKVzJPc= =ViiX -----END PGP SIGNATURE----- Merge tag 'wireless-drivers-for-davem-2015-01-09' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers * rtlwifi: fix a regression in large skb allocation failure iwlwifi: * fix for 7265D NVM check * fixes for scan: fix long scanning times and network discovery * new firmware API for iwlmvm supported devices * fixes in rate control Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
81a0712821
|
@ -69,8 +69,8 @@
|
|||
#include "iwl-agn-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL7260_UCODE_API_MAX 10
|
||||
#define IWL3160_UCODE_API_MAX 10
|
||||
#define IWL7260_UCODE_API_MAX 12
|
||||
#define IWL3160_UCODE_API_MAX 12
|
||||
|
||||
/* Oldest version we won't warn about */
|
||||
#define IWL7260_UCODE_API_OK 10
|
||||
|
@ -105,7 +105,7 @@
|
|||
#define IWL7265_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL7265D_FW_PRE "iwlwifi-7265D-"
|
||||
#define IWL7265D_MODULE_FIRMWARE(api) IWL7265_FW_PRE __stringify(api) ".ucode"
|
||||
#define IWL7265D_MODULE_FIRMWARE(api) IWL7265D_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define NVM_HW_SECTION_NUM_FAMILY_7000 0
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@
|
|||
#include "iwl-agn-hw.h"
|
||||
|
||||
/* Highest firmware API version supported */
|
||||
#define IWL8000_UCODE_API_MAX 10
|
||||
#define IWL8000_UCODE_API_MAX 12
|
||||
|
||||
/* Oldest version we won't warn about */
|
||||
#define IWL8000_UCODE_API_OK 10
|
||||
|
|
|
@ -243,6 +243,9 @@ enum iwl_ucode_tlv_flag {
|
|||
* @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif.
|
||||
* @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time
|
||||
* longer than the passive one, which is essential for fragmented scan.
|
||||
* @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command,
|
||||
* regardless of the band or the number of the probes. FW will calculate
|
||||
* the actual dwell time.
|
||||
*/
|
||||
enum iwl_ucode_tlv_api {
|
||||
IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID = BIT(0),
|
||||
|
@ -253,6 +256,7 @@ enum iwl_ucode_tlv_api {
|
|||
IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6),
|
||||
IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7),
|
||||
IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8),
|
||||
IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13),
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -672,6 +672,7 @@ struct iwl_scan_channel_opt {
|
|||
* @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
|
||||
* @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
|
||||
* and DS parameter set IEs into probe requests.
|
||||
* @IWL_MVM_LMAC_SCAN_FLAG_MATCH: Send match found notification on matches
|
||||
*/
|
||||
enum iwl_mvm_lmac_scan_flags {
|
||||
IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0),
|
||||
|
@ -681,6 +682,7 @@ enum iwl_mvm_lmac_scan_flags {
|
|||
IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4),
|
||||
IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5),
|
||||
IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6),
|
||||
IWL_MVM_LMAC_SCAN_FLAG_MATCH = BIT(9),
|
||||
};
|
||||
|
||||
enum iwl_scan_priority {
|
||||
|
|
|
@ -171,15 +171,21 @@ static void iwl_mvm_scan_fill_ssids(struct iwl_ssid_ie *cmd_ssid,
|
|||
* already included in the probe template, so we need to set only
|
||||
* req->n_ssids - 1 bits in addition to the first bit.
|
||||
*/
|
||||
static u16 iwl_mvm_get_active_dwell(enum ieee80211_band band, int n_ssids)
|
||||
static u16 iwl_mvm_get_active_dwell(struct iwl_mvm *mvm,
|
||||
enum ieee80211_band band, int n_ssids)
|
||||
{
|
||||
if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL)
|
||||
return 10;
|
||||
if (band == IEEE80211_BAND_2GHZ)
|
||||
return 20 + 3 * (n_ssids + 1);
|
||||
return 10 + 2 * (n_ssids + 1);
|
||||
}
|
||||
|
||||
static u16 iwl_mvm_get_passive_dwell(enum ieee80211_band band)
|
||||
static u16 iwl_mvm_get_passive_dwell(struct iwl_mvm *mvm,
|
||||
enum ieee80211_band band)
|
||||
{
|
||||
if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BASIC_DWELL)
|
||||
return 110;
|
||||
return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10;
|
||||
}
|
||||
|
||||
|
@ -331,7 +337,8 @@ static void iwl_mvm_scan_calc_params(struct iwl_mvm *mvm,
|
|||
*/
|
||||
if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
|
||||
u32 passive_dwell =
|
||||
iwl_mvm_get_passive_dwell(IEEE80211_BAND_2GHZ);
|
||||
iwl_mvm_get_passive_dwell(mvm,
|
||||
IEEE80211_BAND_2GHZ);
|
||||
params->max_out_time = passive_dwell;
|
||||
} else {
|
||||
params->passive_fragmented = true;
|
||||
|
@ -348,8 +355,8 @@ not_bound:
|
|||
params->dwell[band].passive = frag_passive_dwell;
|
||||
else
|
||||
params->dwell[band].passive =
|
||||
iwl_mvm_get_passive_dwell(band);
|
||||
params->dwell[band].active = iwl_mvm_get_active_dwell(band,
|
||||
iwl_mvm_get_passive_dwell(mvm, band);
|
||||
params->dwell[band].active = iwl_mvm_get_active_dwell(mvm, band,
|
||||
n_ssids);
|
||||
}
|
||||
}
|
||||
|
@ -1448,6 +1455,8 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
|
|||
|
||||
if (iwl_mvm_scan_pass_all(mvm, req))
|
||||
flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL;
|
||||
else
|
||||
flags |= IWL_MVM_LMAC_SCAN_FLAG_MATCH;
|
||||
|
||||
if (req->n_ssids == 1 && req->ssids[0].ssid_len != 0)
|
||||
flags |= IWL_MVM_LMAC_SCAN_FLAG_PRE_CONNECTION;
|
||||
|
|
|
@ -108,8 +108,12 @@ void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||
tx_flags &= ~TX_CMD_FLG_SEQ_CTL;
|
||||
}
|
||||
|
||||
/* tid_tspec will default to 0 = BE when QOS isn't enabled */
|
||||
ac = tid_to_mac80211_ac[tx_cmd->tid_tspec];
|
||||
/* Default to 0 (BE) when tid_spec is set to IWL_TID_NON_QOS */
|
||||
if (tx_cmd->tid_tspec < IWL_MAX_TID_COUNT)
|
||||
ac = tid_to_mac80211_ac[tx_cmd->tid_tspec];
|
||||
else
|
||||
ac = tid_to_mac80211_ac[0];
|
||||
|
||||
tx_flags |= iwl_mvm_bt_coex_tx_prio(mvm, hdr, info, ac) <<
|
||||
TX_CMD_FLG_BT_PRIO_POS;
|
||||
|
||||
|
|
|
@ -665,7 +665,7 @@ bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm)
|
|||
if (num_of_ant(mvm->fw->valid_rx_ant) == 1)
|
||||
return false;
|
||||
|
||||
if (!mvm->cfg->rx_with_siso_diversity)
|
||||
if (mvm->cfg->rx_with_siso_diversity)
|
||||
return false;
|
||||
|
||||
ieee80211_iterate_active_interfaces_atomic(
|
||||
|
|
|
@ -527,8 +527,10 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
else if (cfg == &iwl7265_n_cfg)
|
||||
cfg_7265d = &iwl7265d_n_cfg;
|
||||
if (cfg_7265d &&
|
||||
(iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D)
|
||||
(iwl_trans->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_7265D) {
|
||||
cfg = cfg_7265d;
|
||||
iwl_trans->cfg = cfg_7265d;
|
||||
}
|
||||
#endif
|
||||
|
||||
pci_set_drvdata(pdev, iwl_trans);
|
||||
|
|
|
@ -666,7 +666,8 @@ tx_status_ok:
|
|||
}
|
||||
|
||||
static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
|
||||
u8 *entry, int rxring_idx, int desc_idx)
|
||||
struct sk_buff *new_skb, u8 *entry,
|
||||
int rxring_idx, int desc_idx)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
|
@ -674,11 +675,15 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
|
|||
u8 tmp_one = 1;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (likely(new_skb)) {
|
||||
skb = new_skb;
|
||||
goto remap;
|
||||
}
|
||||
skb = dev_alloc_skb(rtlpci->rxbuffersize);
|
||||
if (!skb)
|
||||
return 0;
|
||||
rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
|
||||
|
||||
remap:
|
||||
/* just set skb->cb to mapping addr for pci_unmap_single use */
|
||||
*((dma_addr_t *)skb->cb) =
|
||||
pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
|
||||
|
@ -686,6 +691,7 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
|
|||
bufferaddress = *((dma_addr_t *)skb->cb);
|
||||
if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
|
||||
return 0;
|
||||
rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
|
||||
if (rtlpriv->use_new_trx_flow) {
|
||||
rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
|
||||
HW_DESC_RX_PREPARE,
|
||||
|
@ -781,6 +787,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|||
/*rx pkt */
|
||||
struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[
|
||||
rtlpci->rx_ring[rxring_idx].idx];
|
||||
struct sk_buff *new_skb;
|
||||
|
||||
if (rtlpriv->use_new_trx_flow) {
|
||||
rx_remained_cnt =
|
||||
|
@ -807,6 +814,13 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|||
pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
|
||||
rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
|
||||
|
||||
/* get a new skb - if fail, old one will be reused */
|
||||
new_skb = dev_alloc_skb(rtlpci->rxbuffersize);
|
||||
if (unlikely(!new_skb)) {
|
||||
pr_err("Allocation of new skb failed in %s\n",
|
||||
__func__);
|
||||
goto no_new;
|
||||
}
|
||||
if (rtlpriv->use_new_trx_flow) {
|
||||
buffer_desc =
|
||||
&rtlpci->rx_ring[rxring_idx].buffer_desc
|
||||
|
@ -911,14 +925,16 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
|
|||
schedule_work(&rtlpriv->works.lps_change_work);
|
||||
}
|
||||
end:
|
||||
skb = new_skb;
|
||||
no_new:
|
||||
if (rtlpriv->use_new_trx_flow) {
|
||||
_rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc,
|
||||
_rtl_pci_init_one_rxdesc(hw, skb, (u8 *)buffer_desc,
|
||||
rxring_idx,
|
||||
rtlpci->rx_ring[rxring_idx].idx);
|
||||
} else {
|
||||
_rtl_pci_init_one_rxdesc(hw, skb, (u8 *)pdesc,
|
||||
rxring_idx,
|
||||
rtlpci->rx_ring[rxring_idx].idx);
|
||||
} else {
|
||||
_rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx,
|
||||
rtlpci->rx_ring[rxring_idx].idx);
|
||||
|
||||
if (rtlpci->rx_ring[rxring_idx].idx ==
|
||||
rtlpci->rxringcount - 1)
|
||||
rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,
|
||||
|
@ -1307,7 +1323,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
|
|||
rtlpci->rx_ring[rxring_idx].idx = 0;
|
||||
for (i = 0; i < rtlpci->rxringcount; i++) {
|
||||
entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i];
|
||||
if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
|
||||
if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry,
|
||||
rxring_idx, i))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -1332,7 +1348,7 @@ static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
|
|||
|
||||
for (i = 0; i < rtlpci->rxringcount; i++) {
|
||||
entry = &rtlpci->rx_ring[rxring_idx].desc[i];
|
||||
if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
|
||||
if (!_rtl_pci_init_one_rxdesc(hw, NULL, (u8 *)entry,
|
||||
rxring_idx, i))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue