Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
Коммит
a261af927d
|
@ -1214,6 +1214,7 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||
struct ath5k_hw *ah = sc->ah;
|
||||
struct sk_buff *skb = bf->skb;
|
||||
struct ath5k_desc *ds;
|
||||
int ret;
|
||||
|
||||
if (!skb) {
|
||||
skb = ath5k_rx_skb_alloc(sc, &bf->skbaddr);
|
||||
|
@ -1240,9 +1241,9 @@ ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf)
|
|||
ds = bf->desc;
|
||||
ds->ds_link = bf->daddr; /* link to self */
|
||||
ds->ds_data = bf->skbaddr;
|
||||
ah->ah_setup_rx_desc(ah, ds,
|
||||
skb_tailroom(skb), /* buffer size */
|
||||
0);
|
||||
ret = ah->ah_setup_rx_desc(ah, ds, ah->common.rx_bufsize, 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (sc->rxlink != NULL)
|
||||
*sc->rxlink = bf->daddr;
|
||||
|
|
|
@ -76,22 +76,13 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp,
|
|||
ds = bf->bf_desc;
|
||||
flags = ATH9K_TXDESC_NOACK;
|
||||
|
||||
if (((sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
|
||||
(sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) &&
|
||||
(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
|
||||
ds->ds_link = bf->bf_daddr; /* self-linked */
|
||||
flags |= ATH9K_TXDESC_VEOL;
|
||||
/* Let hardware handle antenna switching. */
|
||||
antenna = 0;
|
||||
} else {
|
||||
ds->ds_link = 0;
|
||||
/*
|
||||
* Switch antenna every beacon.
|
||||
* Should only switch every beacon period, not for every SWBA
|
||||
* XXX assumes two antennae
|
||||
*/
|
||||
antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
|
||||
}
|
||||
ds->ds_link = 0;
|
||||
/*
|
||||
* Switch antenna every beacon.
|
||||
* Should only switch every beacon period, not for every SWBA
|
||||
* XXX assumes two antennae
|
||||
*/
|
||||
antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1);
|
||||
|
||||
sband = &sc->sbands[common->hw->conf.channel->band];
|
||||
rate = sband->bitrates[rateidx].hw_value;
|
||||
|
@ -215,36 +206,6 @@ static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw,
|
|||
return bf;
|
||||
}
|
||||
|
||||
/*
|
||||
* Startup beacon transmission for adhoc mode when they are sent entirely
|
||||
* by the hardware using the self-linked descriptor + veol trick.
|
||||
*/
|
||||
static void ath_beacon_start_adhoc(struct ath_softc *sc,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_buf *bf;
|
||||
struct ath_vif *avp;
|
||||
struct sk_buff *skb;
|
||||
|
||||
avp = (void *)vif->drv_priv;
|
||||
|
||||
if (avp->av_bcbuf == NULL)
|
||||
return;
|
||||
|
||||
bf = avp->av_bcbuf;
|
||||
skb = bf->bf_mpdu;
|
||||
|
||||
ath_beacon_setup(sc, avp, bf, 0);
|
||||
|
||||
/* NB: caller is known to have already stopped tx dma */
|
||||
ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr);
|
||||
ath9k_hw_txstart(ah, sc->beacon.beaconq);
|
||||
ath_print(common, ATH_DBG_BEACON, "TXDP%u = %llx (%p)\n",
|
||||
sc->beacon.beaconq, ito64(bf->bf_daddr), bf->bf_desc);
|
||||
}
|
||||
|
||||
int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath_softc *sc = aphy->sc;
|
||||
|
@ -265,7 +226,8 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
|
|||
list_del(&avp->av_bcbuf->list);
|
||||
|
||||
if (sc->sc_ah->opmode == NL80211_IFTYPE_AP ||
|
||||
!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)) {
|
||||
sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC ||
|
||||
sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) {
|
||||
int slot;
|
||||
/*
|
||||
* Assign the vif to a beacon xmit slot. As
|
||||
|
@ -274,17 +236,11 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
|
|||
avp->av_bslot = 0;
|
||||
for (slot = 0; slot < ATH_BCBUF; slot++)
|
||||
if (sc->beacon.bslot[slot] == NULL) {
|
||||
/*
|
||||
* XXX hack, space out slots to better
|
||||
* deal with misses
|
||||
*/
|
||||
if (slot+1 < ATH_BCBUF &&
|
||||
sc->beacon.bslot[slot+1] == NULL) {
|
||||
avp->av_bslot = slot+1;
|
||||
break;
|
||||
}
|
||||
avp->av_bslot = slot;
|
||||
|
||||
/* NB: keep looking for a double slot */
|
||||
if (slot == 0 || !sc->beacon.bslot[slot-1])
|
||||
break;
|
||||
}
|
||||
BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL);
|
||||
sc->beacon.bslot[avp->av_bslot] = vif;
|
||||
|
@ -721,8 +677,7 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
|
|||
* self-linked tx descriptor and let the hardware deal with things.
|
||||
*/
|
||||
intval |= ATH9K_BEACON_ENA;
|
||||
if (!(ah->caps.hw_caps & ATH9K_HW_CAP_VEOL))
|
||||
ah->imask |= ATH9K_INT_SWBA;
|
||||
ah->imask |= ATH9K_INT_SWBA;
|
||||
|
||||
ath_beaconq_config(sc);
|
||||
|
||||
|
@ -732,10 +687,6 @@ static void ath_beacon_config_adhoc(struct ath_softc *sc,
|
|||
ath9k_beacon_init(sc, nexttbtt, intval);
|
||||
sc->beacon.bmisscnt = 0;
|
||||
ath9k_hw_set_interrupts(ah, ah->imask);
|
||||
|
||||
/* FIXME: Handle properly when vif is NULL */
|
||||
if (vif && ah->caps.hw_caps & ATH9K_HW_CAP_VEOL)
|
||||
ath_beacon_start_adhoc(sc, vif);
|
||||
}
|
||||
|
||||
void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
|
||||
|
|
|
@ -107,12 +107,14 @@ static inline void ath9k_skb_queue_purge(struct hif_device_usb *hif_dev,
|
|||
static void hif_usb_tx_cb(struct urb *urb)
|
||||
{
|
||||
struct tx_buf *tx_buf = (struct tx_buf *) urb->context;
|
||||
struct hif_device_usb *hif_dev = tx_buf->hif_dev;
|
||||
struct hif_device_usb *hif_dev;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (!hif_dev || !tx_buf)
|
||||
if (!tx_buf || !tx_buf->hif_dev)
|
||||
return;
|
||||
|
||||
hif_dev = tx_buf->hif_dev;
|
||||
|
||||
switch (urb->status) {
|
||||
case 0:
|
||||
break;
|
||||
|
@ -607,6 +609,10 @@ static int ath9k_hif_usb_alloc_tx_urbs(struct hif_device_usb *hif_dev)
|
|||
|
||||
return 0;
|
||||
err:
|
||||
if (tx_buf) {
|
||||
kfree(tx_buf->buf);
|
||||
kfree(tx_buf);
|
||||
}
|
||||
ath9k_hif_usb_dealloc_tx_urbs(hif_dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/skbuff.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/slab.h>
|
||||
#include <net/mac80211.h>
|
||||
|
||||
#include "common.h"
|
||||
|
|
|
@ -752,7 +752,6 @@ static int ath_key_config(struct ath_common *common,
|
|||
struct ath_hw *ah = common->ah;
|
||||
struct ath9k_keyval hk;
|
||||
const u8 *mac = NULL;
|
||||
u8 gmac[ETH_ALEN];
|
||||
int ret = 0;
|
||||
int idx;
|
||||
|
||||
|
@ -776,30 +775,9 @@ static int ath_key_config(struct ath_common *common,
|
|||
memcpy(hk.kv_val, key->key, key->keylen);
|
||||
|
||||
if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
|
||||
|
||||
if (key->ap_addr) {
|
||||
/*
|
||||
* Group keys on hardware that supports multicast frame
|
||||
* key search use a mac that is the sender's address with
|
||||
* the high bit set instead of the app-specified address.
|
||||
*/
|
||||
memcpy(gmac, key->ap_addr, ETH_ALEN);
|
||||
gmac[0] |= 0x80;
|
||||
mac = gmac;
|
||||
|
||||
if (key->alg == ALG_TKIP)
|
||||
idx = ath_reserve_key_cache_slot_tkip(common);
|
||||
else
|
||||
idx = ath_reserve_key_cache_slot(common);
|
||||
if (idx < 0)
|
||||
mac = NULL; /* no free key cache entries */
|
||||
}
|
||||
|
||||
if (!mac) {
|
||||
/* For now, use the default keys for broadcast keys. This may
|
||||
* need to change with virtual interfaces. */
|
||||
idx = key->keyidx;
|
||||
}
|
||||
/* For now, use the default keys for broadcast keys. This may
|
||||
* need to change with virtual interfaces. */
|
||||
idx = key->keyidx;
|
||||
} else if (key->keyidx) {
|
||||
if (WARN_ON(!sta))
|
||||
return -EOPNOTSUPP;
|
||||
|
|
|
@ -28,7 +28,6 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
|
|||
{ PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */
|
||||
{ PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E AR9300 */
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
|
|
|
@ -19,6 +19,12 @@
|
|||
|
||||
#define SKB_CB_ATHBUF(__skb) (*((struct ath_buf **)__skb->cb))
|
||||
|
||||
static inline bool ath9k_check_auto_sleep(struct ath_softc *sc)
|
||||
{
|
||||
return sc->ps_enabled &&
|
||||
(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP);
|
||||
}
|
||||
|
||||
static struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc,
|
||||
struct ieee80211_hdr *hdr)
|
||||
{
|
||||
|
@ -616,8 +622,8 @@ static void ath_rx_ps(struct ath_softc *sc, struct sk_buff *skb)
|
|||
hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
/* Process Beacon and CAB receive in PS state */
|
||||
if ((sc->ps_flags & PS_WAIT_FOR_BEACON) &&
|
||||
ieee80211_is_beacon(hdr->frame_control))
|
||||
if (((sc->ps_flags & PS_WAIT_FOR_BEACON) || ath9k_check_auto_sleep(sc))
|
||||
&& ieee80211_is_beacon(hdr->frame_control))
|
||||
ath_rx_ps_beacon(sc, skb);
|
||||
else if ((sc->ps_flags & PS_WAIT_FOR_CAB) &&
|
||||
(ieee80211_is_data(hdr->frame_control) ||
|
||||
|
@ -932,9 +938,10 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
|
|||
sc->rx.rxotherant = 0;
|
||||
}
|
||||
|
||||
if (unlikely(sc->ps_flags & (PS_WAIT_FOR_BEACON |
|
||||
PS_WAIT_FOR_CAB |
|
||||
PS_WAIT_FOR_PSPOLL_DATA)))
|
||||
if (unlikely(ath9k_check_auto_sleep(sc) ||
|
||||
(sc->ps_flags & (PS_WAIT_FOR_BEACON |
|
||||
PS_WAIT_FOR_CAB |
|
||||
PS_WAIT_FOR_PSPOLL_DATA))))
|
||||
ath_rx_ps(sc, skb);
|
||||
|
||||
ath_rx_send_to_mac80211(hw, sc, skb, rxs);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <net/mac80211.h>
|
||||
|
||||
#include "iwl-dev.h"
|
||||
|
|
|
@ -376,6 +376,11 @@ void iwl_bg_start_internal_scan(struct work_struct *work)
|
|||
|
||||
mutex_lock(&priv->mutex);
|
||||
|
||||
if (priv->is_internal_short_scan == true) {
|
||||
IWL_DEBUG_SCAN(priv, "Internal scan already in progress\n");
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (!iwl_is_ready_rf(priv)) {
|
||||
IWL_DEBUG_SCAN(priv, "not ready or exit pending\n");
|
||||
goto unlock;
|
||||
|
@ -497,17 +502,27 @@ void iwl_bg_scan_completed(struct work_struct *work)
|
|||
{
|
||||
struct iwl_priv *priv =
|
||||
container_of(work, struct iwl_priv, scan_completed);
|
||||
bool internal = false;
|
||||
|
||||
IWL_DEBUG_SCAN(priv, "SCAN complete scan\n");
|
||||
|
||||
cancel_delayed_work(&priv->scan_check);
|
||||
|
||||
if (!priv->is_internal_short_scan)
|
||||
ieee80211_scan_completed(priv->hw, false);
|
||||
else {
|
||||
mutex_lock(&priv->mutex);
|
||||
if (priv->is_internal_short_scan) {
|
||||
priv->is_internal_short_scan = false;
|
||||
IWL_DEBUG_SCAN(priv, "internal short scan completed\n");
|
||||
internal = true;
|
||||
}
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
/*
|
||||
* Do not hold mutex here since this will cause mac80211 to call
|
||||
* into driver again into functions that will attempt to take
|
||||
* mutex.
|
||||
*/
|
||||
if (!internal)
|
||||
ieee80211_scan_completed(priv->hw, false);
|
||||
|
||||
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
|
||||
return;
|
||||
|
|
|
@ -431,7 +431,7 @@ int iwl_add_bssid_station(struct iwl_priv *priv, const u8 *addr, bool init_rs,
|
|||
struct iwl_link_quality_cmd *link_cmd;
|
||||
unsigned long flags;
|
||||
|
||||
if (*sta_id_r)
|
||||
if (sta_id_r)
|
||||
*sta_id_r = IWL_INVALID_STATION;
|
||||
|
||||
ret = iwl_add_station_common(priv, addr, 0, NULL, &sta_id);
|
||||
|
|
|
@ -2572,14 +2572,18 @@ static void rndis_wlan_do_link_up_work(struct usbnet *usbdev)
|
|||
|
||||
static void rndis_wlan_do_link_down_work(struct usbnet *usbdev)
|
||||
{
|
||||
union iwreq_data evt;
|
||||
struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev);
|
||||
|
||||
if (priv->connected) {
|
||||
priv->connected = false;
|
||||
memset(priv->bssid, 0, ETH_ALEN);
|
||||
|
||||
deauthenticate(usbdev);
|
||||
|
||||
cfg80211_disconnected(usbdev->net, 0, NULL, 0, GFP_KERNEL);
|
||||
}
|
||||
|
||||
netif_carrier_off(usbdev->net);
|
||||
|
||||
evt.data.flags = 0;
|
||||
evt.data.length = 0;
|
||||
memset(evt.ap_addr.sa_data, 0, ETH_ALEN);
|
||||
wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL);
|
||||
}
|
||||
|
||||
static void rndis_wlan_worker(struct work_struct *work)
|
||||
|
|
|
@ -926,7 +926,7 @@ static void rt2400pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
|||
static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
enum dev_state state)
|
||||
{
|
||||
u32 reg;
|
||||
u32 reg, reg2;
|
||||
unsigned int i;
|
||||
char put_to_sleep;
|
||||
char bbp_state;
|
||||
|
@ -947,11 +947,12 @@ static int rt2400pci_set_state(struct rt2x00_dev *rt2x00dev,
|
|||
* device has entered the correct state.
|
||||
*/
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®);
|
||||
bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
|
||||
rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||
bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
|
||||
rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
|
||||
if (bbp_state == state && rf_state == state)
|
||||
return 0;
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
|
|
|
@ -1084,7 +1084,7 @@ static void rt2500pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
|||
static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
||||
enum dev_state state)
|
||||
{
|
||||
u32 reg;
|
||||
u32 reg, reg2;
|
||||
unsigned int i;
|
||||
char put_to_sleep;
|
||||
char bbp_state;
|
||||
|
@ -1105,11 +1105,12 @@ static int rt2500pci_set_state(struct rt2x00_dev *rt2x00dev,
|
|||
* device has entered the correct state.
|
||||
*/
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®);
|
||||
bbp_state = rt2x00_get_field32(reg, PWRCSR1_BBP_CURR_STATE);
|
||||
rf_state = rt2x00_get_field32(reg, PWRCSR1_RF_CURR_STATE);
|
||||
rt2x00pci_register_read(rt2x00dev, PWRCSR1, ®2);
|
||||
bbp_state = rt2x00_get_field32(reg2, PWRCSR1_BBP_CURR_STATE);
|
||||
rf_state = rt2x00_get_field32(reg2, PWRCSR1_RF_CURR_STATE);
|
||||
if (bbp_state == state && rf_state == state)
|
||||
return 0;
|
||||
rt2x00pci_register_write(rt2x00dev, PWRCSR1, reg);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
|
|
|
@ -413,7 +413,7 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev,
|
|||
*/
|
||||
rt2x00_desc_read(txi, 0, &word);
|
||||
rt2x00_set_field32(&word, TXINFO_W0_USB_DMA_TX_PKT_LEN,
|
||||
skb->len + TXWI_DESC_SIZE);
|
||||
skb->len - TXINFO_DESC_SIZE);
|
||||
rt2x00_set_field32(&word, TXINFO_W0_WIV,
|
||||
!test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
|
||||
rt2x00_set_field32(&word, TXINFO_W0_QSEL, 2);
|
||||
|
|
|
@ -206,7 +206,7 @@ void rt2x00pci_uninitialize(struct rt2x00_dev *rt2x00dev)
|
|||
/*
|
||||
* Free irq line.
|
||||
*/
|
||||
free_irq(to_pci_dev(rt2x00dev->dev)->irq, rt2x00dev);
|
||||
free_irq(rt2x00dev->irq, rt2x00dev);
|
||||
|
||||
/*
|
||||
* Free DMA
|
||||
|
|
|
@ -1689,7 +1689,7 @@ static void rt61pci_disable_radio(struct rt2x00_dev *rt2x00dev)
|
|||
|
||||
static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||
{
|
||||
u32 reg;
|
||||
u32 reg, reg2;
|
||||
unsigned int i;
|
||||
char put_to_sleep;
|
||||
|
||||
|
@ -1706,10 +1706,11 @@ static int rt61pci_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
|||
* device has entered the correct state.
|
||||
*/
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00pci_register_read(rt2x00dev, MAC_CSR12, ®);
|
||||
state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
|
||||
rt2x00pci_register_read(rt2x00dev, MAC_CSR12, ®2);
|
||||
state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
|
||||
if (state == !put_to_sleep)
|
||||
return 0;
|
||||
rt2x00pci_register_write(rt2x00dev, MAC_CSR12, reg);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
|
|
|
@ -1366,7 +1366,7 @@ static void rt73usb_disable_radio(struct rt2x00_dev *rt2x00dev)
|
|||
|
||||
static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
||||
{
|
||||
u32 reg;
|
||||
u32 reg, reg2;
|
||||
unsigned int i;
|
||||
char put_to_sleep;
|
||||
|
||||
|
@ -1383,10 +1383,11 @@ static int rt73usb_set_state(struct rt2x00_dev *rt2x00dev, enum dev_state state)
|
|||
* device has entered the correct state.
|
||||
*/
|
||||
for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
|
||||
rt2x00usb_register_read(rt2x00dev, MAC_CSR12, ®);
|
||||
state = rt2x00_get_field32(reg, MAC_CSR12_BBP_CURRENT_STATE);
|
||||
rt2x00usb_register_read(rt2x00dev, MAC_CSR12, ®2);
|
||||
state = rt2x00_get_field32(reg2, MAC_CSR12_BBP_CURRENT_STATE);
|
||||
if (state == !put_to_sleep)
|
||||
return 0;
|
||||
rt2x00usb_register_write(rt2x00dev, MAC_CSR12, reg);
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
|
|
|
@ -113,6 +113,8 @@ static void wl1271_rx_handle_data(struct wl1271 *wl, u32 length)
|
|||
wl1271_debug(DEBUG_RX, "rx skb 0x%p: %d B %s", skb, skb->len,
|
||||
beacon ? "beacon" : "");
|
||||
|
||||
skb_trim(skb, skb->len - desc->pad_len);
|
||||
|
||||
memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_ni(wl->hw, skb);
|
||||
}
|
||||
|
|
|
@ -815,6 +815,7 @@ enum ieee80211_key_flags {
|
|||
* encrypted in hardware.
|
||||
* @alg: The key algorithm.
|
||||
* @flags: key flags, see &enum ieee80211_key_flags.
|
||||
* @ap_addr: AP's MAC address
|
||||
* @keyidx: the key index (0-3)
|
||||
* @keylen: key material length
|
||||
* @key: key material. For ALG_TKIP the key is encoded as a 256-bit (32 byte)
|
||||
|
@ -831,7 +832,6 @@ struct ieee80211_key_conf {
|
|||
u8 iv_len;
|
||||
u8 hw_key_idx;
|
||||
u8 flags;
|
||||
u8 *ap_addr;
|
||||
s8 keyidx;
|
||||
u8 keylen;
|
||||
u8 key[0];
|
||||
|
@ -1638,6 +1638,8 @@ enum ieee80211_ampdu_mlme_action {
|
|||
* Returns a negative error code on failure.
|
||||
* The callback must be atomic.
|
||||
*
|
||||
* @get_survey: Return per-channel survey information
|
||||
*
|
||||
* @rfkill_poll: Poll rfkill hardware state. If you need this, you also
|
||||
* need to set wiphy->rfkill_poll to %true before registration,
|
||||
* and need to call wiphy_rfkill_set_hw_state() in the callback.
|
||||
|
|
|
@ -140,7 +140,6 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
|||
struct ieee80211_sub_if_data,
|
||||
u.ap);
|
||||
|
||||
key->conf.ap_addr = sdata->dev->dev_addr;
|
||||
ret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf);
|
||||
|
||||
if (!ret) {
|
||||
|
|
|
@ -145,7 +145,7 @@ enum plink_state {
|
|||
/**
|
||||
* struct sta_ampdu_mlme - STA aggregation information.
|
||||
*
|
||||
* @tid_state_rx: TID's state in Rx session state machine.
|
||||
* @tid_active_rx: TID's state in Rx session state machine.
|
||||
* @tid_rx: aggregation info for Rx per TID
|
||||
* @tid_state_tx: TID's state in Tx session state machine.
|
||||
* @tid_tx: aggregation info for Tx per TID
|
||||
|
|
|
@ -50,7 +50,7 @@ int cfg80211_set_freq(struct cfg80211_registered_device *rdev,
|
|||
struct ieee80211_channel *chan;
|
||||
int result;
|
||||
|
||||
if (wdev->iftype == NL80211_IFTYPE_MONITOR)
|
||||
if (wdev && wdev->iftype == NL80211_IFTYPE_MONITOR)
|
||||
wdev = NULL;
|
||||
|
||||
if (wdev) {
|
||||
|
|
|
@ -4443,9 +4443,10 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
|
|||
if (channel_type != NL80211_CHAN_NO_HT &&
|
||||
channel_type != NL80211_CHAN_HT20 &&
|
||||
channel_type != NL80211_CHAN_HT40PLUS &&
|
||||
channel_type != NL80211_CHAN_HT40MINUS)
|
||||
channel_type != NL80211_CHAN_HT40MINUS) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
|
||||
|
@ -4717,9 +4718,10 @@ static int nl80211_action(struct sk_buff *skb, struct genl_info *info)
|
|||
if (channel_type != NL80211_CHAN_NO_HT &&
|
||||
channel_type != NL80211_CHAN_HT20 &&
|
||||
channel_type != NL80211_CHAN_HT40PLUS &&
|
||||
channel_type != NL80211_CHAN_HT40MINUS)
|
||||
channel_type != NL80211_CHAN_HT40MINUS) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]);
|
||||
|
|
|
@ -515,7 +515,7 @@ cfg80211_inform_bss(struct wiphy *wiphy,
|
|||
|
||||
privsz = wiphy->bss_priv_size;
|
||||
|
||||
if (WARN_ON(wiphy->signal_type == NL80211_BSS_SIGNAL_UNSPEC &&
|
||||
if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
|
||||
(signal < 0 || signal > 100)))
|
||||
return NULL;
|
||||
|
||||
|
@ -571,7 +571,7 @@ cfg80211_inform_bss_frame(struct wiphy *wiphy,
|
|||
u.probe_resp.variable);
|
||||
size_t privsz = wiphy->bss_priv_size;
|
||||
|
||||
if (WARN_ON(wiphy->signal_type == NL80211_BSS_SIGNAL_UNSPEC &&
|
||||
if (WARN_ON(wiphy->signal_type == CFG80211_SIGNAL_TYPE_UNSPEC &&
|
||||
(signal < 0 || signal > 100)))
|
||||
return NULL;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче