mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-02-08 12:28:27 +00:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
Conflicts: drivers/net/wireless/iwlwifi/iwl-tx.c
This commit is contained in:
commit
3be3fdb58a
@ -34,6 +34,7 @@
|
|||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
@ -53,10 +54,10 @@
|
|||||||
#define IWL100_UCODE_API_MIN 5
|
#define IWL100_UCODE_API_MIN 5
|
||||||
|
|
||||||
#define IWL1000_FW_PRE "iwlwifi-1000-"
|
#define IWL1000_FW_PRE "iwlwifi-1000-"
|
||||||
#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE #api ".ucode"
|
#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL100_FW_PRE "iwlwifi-100-"
|
#define IWL100_FW_PRE "iwlwifi-100-"
|
||||||
#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE #api ".ucode"
|
#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
@ -56,13 +57,13 @@
|
|||||||
#define IWL105_UCODE_API_MIN 5
|
#define IWL105_UCODE_API_MIN 5
|
||||||
|
|
||||||
#define IWL2030_FW_PRE "iwlwifi-2030-"
|
#define IWL2030_FW_PRE "iwlwifi-2030-"
|
||||||
#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE #api ".ucode"
|
#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL2000_FW_PRE "iwlwifi-2000-"
|
#define IWL2000_FW_PRE "iwlwifi-2000-"
|
||||||
#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE #api ".ucode"
|
#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL105_FW_PRE "iwlwifi-105-"
|
#define IWL105_FW_PRE "iwlwifi-105-"
|
||||||
#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE #api ".ucode"
|
#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
|
static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
@ -55,10 +56,10 @@
|
|||||||
#define IWL5150_UCODE_API_MIN 1
|
#define IWL5150_UCODE_API_MIN 1
|
||||||
|
|
||||||
#define IWL5000_FW_PRE "iwlwifi-5000-"
|
#define IWL5000_FW_PRE "iwlwifi-5000-"
|
||||||
#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE #api ".ucode"
|
#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL5150_FW_PRE "iwlwifi-5150-"
|
#define IWL5150_FW_PRE "iwlwifi-5150-"
|
||||||
#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE #api ".ucode"
|
#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
/* NIC configuration for 5000 series */
|
/* NIC configuration for 5000 series */
|
||||||
static void iwl5000_nic_config(struct iwl_priv *priv)
|
static void iwl5000_nic_config(struct iwl_priv *priv)
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <net/mac80211.h>
|
#include <net/mac80211.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <asm/unaligned.h>
|
#include <asm/unaligned.h>
|
||||||
|
#include <linux/stringify.h>
|
||||||
|
|
||||||
#include "iwl-eeprom.h"
|
#include "iwl-eeprom.h"
|
||||||
#include "iwl-dev.h"
|
#include "iwl-dev.h"
|
||||||
@ -56,16 +57,16 @@
|
|||||||
#define IWL6000G2_UCODE_API_MIN 4
|
#define IWL6000G2_UCODE_API_MIN 4
|
||||||
|
|
||||||
#define IWL6000_FW_PRE "iwlwifi-6000-"
|
#define IWL6000_FW_PRE "iwlwifi-6000-"
|
||||||
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode"
|
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL6050_FW_PRE "iwlwifi-6050-"
|
#define IWL6050_FW_PRE "iwlwifi-6050-"
|
||||||
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"
|
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
|
#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
|
||||||
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE #api ".ucode"
|
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
|
#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
|
||||||
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE #api ".ucode"
|
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode"
|
||||||
|
|
||||||
static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
|
static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
|
@ -1704,6 +1704,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||||||
struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
|
struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
|
||||||
struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
||||||
struct iwl_rxon_context *tmp;
|
struct iwl_rxon_context *tmp;
|
||||||
|
enum nl80211_iftype newviftype = newtype;
|
||||||
u32 interface_modes;
|
u32 interface_modes;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
@ -1759,7 +1760,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||||||
|
|
||||||
/* success */
|
/* success */
|
||||||
iwl_teardown_interface(priv, vif, true);
|
iwl_teardown_interface(priv, vif, true);
|
||||||
vif->type = newtype;
|
vif->type = newviftype;
|
||||||
vif->p2p = newp2p;
|
vif->p2p = newp2p;
|
||||||
err = iwl_setup_interface(priv, ctx);
|
err = iwl_setup_interface(priv, ctx);
|
||||||
WARN_ON(err);
|
WARN_ON(err);
|
||||||
|
@ -126,7 +126,7 @@ static inline u8 iwl_tfd_get_num_tbs(struct iwl_tfd *tfd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
||||||
struct iwl_tfd *tfd)
|
struct iwl_tfd *tfd, enum dma_data_direction dma_dir)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int num_tbs;
|
int num_tbs;
|
||||||
@ -150,7 +150,7 @@ static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
|||||||
/* Unmap chunks, if any. */
|
/* Unmap chunks, if any. */
|
||||||
for (i = 1; i < num_tbs; i++)
|
for (i = 1; i < num_tbs; i++)
|
||||||
dma_unmap_single(priv->bus.dev, iwl_tfd_tb_get_addr(tfd, i),
|
dma_unmap_single(priv->bus.dev, iwl_tfd_tb_get_addr(tfd, i),
|
||||||
iwl_tfd_tb_get_len(tfd, i), DMA_TO_DEVICE);
|
iwl_tfd_tb_get_len(tfd, i), dma_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -166,7 +166,8 @@ void iwlagn_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
|
|||||||
struct iwl_tfd *tfd_tmp = txq->tfds;
|
struct iwl_tfd *tfd_tmp = txq->tfds;
|
||||||
int index = txq->q.read_ptr;
|
int index = txq->q.read_ptr;
|
||||||
|
|
||||||
iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index]);
|
iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index],
|
||||||
|
DMA_TO_DEVICE);
|
||||||
|
|
||||||
/* free SKB */
|
/* free SKB */
|
||||||
if (txq->txb) {
|
if (txq->txb) {
|
||||||
@ -309,7 +310,8 @@ void iwl_cmd_queue_unmap(struct iwl_priv *priv)
|
|||||||
i = get_cmd_index(q, q->read_ptr);
|
i = get_cmd_index(q, q->read_ptr);
|
||||||
|
|
||||||
if (txq->meta[i].flags & CMD_MAPPED) {
|
if (txq->meta[i].flags & CMD_MAPPED) {
|
||||||
iwlagn_unmap_tfd(priv, &txq->meta[i], &txq->tfds[i]);
|
iwlagn_unmap_tfd(priv, &txq->meta[i], &txq->tfds[i],
|
||||||
|
DMA_BIDIRECTIONAL);
|
||||||
txq->meta[i].flags = 0;
|
txq->meta[i].flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -531,12 +533,7 @@ out_free_arrays:
|
|||||||
void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
||||||
int slots_num, u32 txq_id)
|
int slots_num, u32 txq_id)
|
||||||
{
|
{
|
||||||
int actual_slots = slots_num;
|
memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * slots_num);
|
||||||
|
|
||||||
if (txq_id == priv->cmd_queue)
|
|
||||||
actual_slots++;
|
|
||||||
|
|
||||||
memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * actual_slots);
|
|
||||||
|
|
||||||
txq->need_update = 0;
|
txq->need_update = 0;
|
||||||
|
|
||||||
@ -696,10 +693,11 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||||||
if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
|
if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
|
||||||
continue;
|
continue;
|
||||||
phys_addr = dma_map_single(priv->bus.dev, (void *)cmd->data[i],
|
phys_addr = dma_map_single(priv->bus.dev, (void *)cmd->data[i],
|
||||||
cmd->len[i], DMA_TO_DEVICE);
|
cmd->len[i], DMA_BIDIRECTIONAL);
|
||||||
if (dma_mapping_error(priv->bus.dev, phys_addr)) {
|
if (dma_mapping_error(priv->bus.dev, phys_addr)) {
|
||||||
iwlagn_unmap_tfd(priv, out_meta,
|
iwlagn_unmap_tfd(priv, out_meta,
|
||||||
&txq->tfds[q->write_ptr]);
|
&txq->tfds[q->write_ptr],
|
||||||
|
DMA_BIDIRECTIONAL);
|
||||||
idx = -ENOMEM;
|
idx = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -803,7 +801,7 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
|
|||||||
cmd = txq->cmd[cmd_index];
|
cmd = txq->cmd[cmd_index];
|
||||||
meta = &txq->meta[cmd_index];
|
meta = &txq->meta[cmd_index];
|
||||||
|
|
||||||
iwlagn_unmap_tfd(priv, meta, &txq->tfds[index]);
|
iwlagn_unmap_tfd(priv, meta, &txq->tfds[index], DMA_BIDIRECTIONAL);
|
||||||
|
|
||||||
/* Input error checking is done when commands are added to queue. */
|
/* Input error checking is done when commands are added to queue. */
|
||||||
if (meta->flags & CMD_WANT_SKB) {
|
if (meta->flags & CMD_WANT_SKB) {
|
||||||
|
@ -1288,6 +1288,8 @@ int mwifiex_register_cfg80211(struct net_device *dev, u8 *mac,
|
|||||||
|
|
||||||
*(unsigned long *) wdev_priv = (unsigned long) priv;
|
*(unsigned long *) wdev_priv = (unsigned long) priv;
|
||||||
|
|
||||||
|
set_wiphy_dev(wdev->wiphy, (struct device *) priv->adapter->dev);
|
||||||
|
|
||||||
ret = wiphy_register(wdev->wiphy);
|
ret = wiphy_register(wdev->wiphy);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(priv->adapter->dev, "%s: registering cfg80211 device\n",
|
dev_err(priv->adapter->dev, "%s: registering cfg80211 device\n",
|
||||||
|
@ -2474,6 +2474,7 @@ struct mwl8k_cmd_set_hw_spec {
|
|||||||
* faster client.
|
* faster client.
|
||||||
*/
|
*/
|
||||||
#define MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY 0x00000400
|
#define MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY 0x00000400
|
||||||
|
#define MWL8K_SET_HW_SPEC_FLAG_GENERATE_CCMP_HDR 0x00000200
|
||||||
#define MWL8K_SET_HW_SPEC_FLAG_HOST_DECR_MGMT 0x00000080
|
#define MWL8K_SET_HW_SPEC_FLAG_HOST_DECR_MGMT 0x00000080
|
||||||
#define MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_PROBERESP 0x00000020
|
#define MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_PROBERESP 0x00000020
|
||||||
#define MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_BEACON 0x00000010
|
#define MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_BEACON 0x00000010
|
||||||
@ -2510,7 +2511,8 @@ static int mwl8k_cmd_set_hw_spec(struct ieee80211_hw *hw)
|
|||||||
cmd->flags = cpu_to_le32(MWL8K_SET_HW_SPEC_FLAG_HOST_DECR_MGMT |
|
cmd->flags = cpu_to_le32(MWL8K_SET_HW_SPEC_FLAG_HOST_DECR_MGMT |
|
||||||
MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_PROBERESP |
|
MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_PROBERESP |
|
||||||
MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_BEACON |
|
MWL8K_SET_HW_SPEC_FLAG_HOSTFORM_BEACON |
|
||||||
MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY);
|
MWL8K_SET_HW_SPEC_FLAG_ENABLE_LIFE_TIME_EXPIRY |
|
||||||
|
MWL8K_SET_HW_SPEC_FLAG_GENERATE_CCMP_HDR);
|
||||||
cmd->num_tx_desc_per_queue = cpu_to_le32(MWL8K_TX_DESCS);
|
cmd->num_tx_desc_per_queue = cpu_to_le32(MWL8K_TX_DESCS);
|
||||||
cmd->total_rxd = cpu_to_le32(MWL8K_RX_DESCS);
|
cmd->total_rxd = cpu_to_le32(MWL8K_RX_DESCS);
|
||||||
|
|
||||||
|
@ -1615,6 +1615,16 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
|||||||
pci_read_config_byte(pdev, 0x8, &revisionid);
|
pci_read_config_byte(pdev, 0x8, &revisionid);
|
||||||
pci_read_config_word(pdev, 0x3C, &irqline);
|
pci_read_config_word(pdev, 0x3C, &irqline);
|
||||||
|
|
||||||
|
/* PCI ID 0x10ec:0x8192 occurs for both RTL8192E, which uses
|
||||||
|
* r8192e_pci, and RTL8192SE, which uses this driver. If the
|
||||||
|
* revision ID is RTL_PCI_REVISION_ID_8192PCIE (0x01), then
|
||||||
|
* the correct driver is r8192e_pci, thus this routine should
|
||||||
|
* return false.
|
||||||
|
*/
|
||||||
|
if (deviceid == RTL_PCI_8192SE_DID &&
|
||||||
|
revisionid == RTL_PCI_REVISION_ID_8192PCIE)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (deviceid == RTL_PCI_8192_DID ||
|
if (deviceid == RTL_PCI_8192_DID ||
|
||||||
deviceid == RTL_PCI_0044_DID ||
|
deviceid == RTL_PCI_0044_DID ||
|
||||||
deviceid == RTL_PCI_0047_DID ||
|
deviceid == RTL_PCI_0047_DID ||
|
||||||
@ -1847,7 +1857,8 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
|
|||||||
pci_write_config_byte(pdev, 0x04, 0x07);
|
pci_write_config_byte(pdev, 0x04, 0x07);
|
||||||
|
|
||||||
/* find adapter */
|
/* find adapter */
|
||||||
_rtl_pci_find_adapter(pdev, hw);
|
if (!_rtl_pci_find_adapter(pdev, hw))
|
||||||
|
goto fail3;
|
||||||
|
|
||||||
/* Init IO handler */
|
/* Init IO handler */
|
||||||
_rtl_pci_io_handler_init(&pdev->dev, hw);
|
_rtl_pci_io_handler_init(&pdev->dev, hw);
|
||||||
|
@ -53,6 +53,8 @@ MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
|
|||||||
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||||
{
|
{
|
||||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||||
|
const struct firmware *firmware;
|
||||||
|
int err;
|
||||||
|
|
||||||
rtlpriv->dm.dm_initialgain_enable = 1;
|
rtlpriv->dm.dm_initialgain_enable = 1;
|
||||||
rtlpriv->dm.dm_flag = 0;
|
rtlpriv->dm.dm_flag = 0;
|
||||||
@ -64,6 +66,24 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
|||||||
("Can't alloc buffer for fw.\n"));
|
("Can't alloc buffer for fw.\n"));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
/* request fw */
|
||||||
|
err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
|
||||||
|
rtlpriv->io.dev);
|
||||||
|
if (err) {
|
||||||
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||||
|
("Failed to request firmware!\n"));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (firmware->size > 0x4000) {
|
||||||
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||||
|
("Firmware is too big!\n"));
|
||||||
|
release_firmware(firmware);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
|
||||||
|
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||||
|
release_firmware(firmware);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2697,7 +2697,7 @@ void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
|
|||||||
* @dev: network device
|
* @dev: network device
|
||||||
* @addr: The source MAC address of the frame
|
* @addr: The source MAC address of the frame
|
||||||
* @key_type: The key type that the received frame used
|
* @key_type: The key type that the received frame used
|
||||||
* @key_id: Key identifier (0..3)
|
* @key_id: Key identifier (0..3). Can be -1 if missing.
|
||||||
* @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
|
* @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
|
||||||
* @gfp: allocation flags
|
* @gfp: allocation flags
|
||||||
*
|
*
|
||||||
|
@ -154,7 +154,13 @@ update_iv:
|
|||||||
return RX_CONTINUE;
|
return RX_CONTINUE;
|
||||||
|
|
||||||
mic_fail:
|
mic_fail:
|
||||||
mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,
|
/*
|
||||||
|
* In some cases the key can be unset - e.g. a multicast packet, in
|
||||||
|
* a driver that supports HW encryption. Send up the key idx only if
|
||||||
|
* the key is set.
|
||||||
|
*/
|
||||||
|
mac80211_ev_michael_mic_failure(rx->sdata,
|
||||||
|
rx->key ? rx->key->conf.keyidx : -1,
|
||||||
(void *) skb->data, NULL, GFP_ATOMIC);
|
(void *) skb->data, NULL, GFP_ATOMIC);
|
||||||
return RX_DROP_UNUSABLE;
|
return RX_DROP_UNUSABLE;
|
||||||
}
|
}
|
||||||
|
@ -6566,7 +6566,8 @@ void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
|
|||||||
if (addr)
|
if (addr)
|
||||||
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
|
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
|
||||||
NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
|
NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
|
||||||
NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
|
if (key_id != -1)
|
||||||
|
NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
|
||||||
if (tsc)
|
if (tsc)
|
||||||
NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
|
NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user