Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
commit
3231d65ffe
|
@ -7277,7 +7277,6 @@ F: drivers/video/aty/aty128fb.c
|
||||||
RALINK RT2X00 WIRELESS LAN DRIVER
|
RALINK RT2X00 WIRELESS LAN DRIVER
|
||||||
P: rt2x00 project
|
P: rt2x00 project
|
||||||
M: Ivo van Doorn <IvDoorn@gmail.com>
|
M: Ivo van Doorn <IvDoorn@gmail.com>
|
||||||
M: Gertjan van Wingerde <gwingerde@gmail.com>
|
|
||||||
M: Helmut Schaa <helmut.schaa@googlemail.com>
|
M: Helmut Schaa <helmut.schaa@googlemail.com>
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
L: users@rt2x00.serialmonkey.com (moderated for non-subscribers)
|
L: users@rt2x00.serialmonkey.com (moderated for non-subscribers)
|
||||||
|
|
|
@ -82,6 +82,7 @@ static const struct usb_device_id ath3k_table[] = {
|
||||||
{ USB_DEVICE(0x04CA, 0x3004) },
|
{ USB_DEVICE(0x04CA, 0x3004) },
|
||||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||||
{ USB_DEVICE(0x04CA, 0x3006) },
|
{ USB_DEVICE(0x04CA, 0x3006) },
|
||||||
|
{ USB_DEVICE(0x04CA, 0x3007) },
|
||||||
{ USB_DEVICE(0x04CA, 0x3008) },
|
{ USB_DEVICE(0x04CA, 0x3008) },
|
||||||
{ USB_DEVICE(0x04CA, 0x300b) },
|
{ USB_DEVICE(0x04CA, 0x300b) },
|
||||||
{ USB_DEVICE(0x0930, 0x0219) },
|
{ USB_DEVICE(0x0930, 0x0219) },
|
||||||
|
@ -131,6 +132,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
|
||||||
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
|
@ -152,6 +152,7 @@ static const struct usb_device_id blacklist_table[] = {
|
||||||
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
|
@ -1485,10 +1486,8 @@ static int btusb_probe(struct usb_interface *intf,
|
||||||
if (id->driver_info & BTUSB_BCM92035)
|
if (id->driver_info & BTUSB_BCM92035)
|
||||||
hdev->setup = btusb_setup_bcm92035;
|
hdev->setup = btusb_setup_bcm92035;
|
||||||
|
|
||||||
if (id->driver_info & BTUSB_INTEL) {
|
if (id->driver_info & BTUSB_INTEL)
|
||||||
usb_enable_autosuspend(data->udev);
|
|
||||||
hdev->setup = btusb_setup_intel;
|
hdev->setup = btusb_setup_intel;
|
||||||
}
|
|
||||||
|
|
||||||
/* Interface numbers are hardcoded in the specification */
|
/* Interface numbers are hardcoded in the specification */
|
||||||
data->isoc = usb_ifnum_to_if(data->udev, 1);
|
data->isoc = usb_ifnum_to_if(data->udev, 1);
|
||||||
|
|
|
@ -86,7 +86,6 @@ static int ath_ahb_probe(struct platform_device *pdev)
|
||||||
int irq;
|
int irq;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct ath_hw *ah;
|
struct ath_hw *ah;
|
||||||
struct ath_common *common;
|
|
||||||
char hw_name[64];
|
char hw_name[64];
|
||||||
|
|
||||||
if (!dev_get_platdata(&pdev->dev)) {
|
if (!dev_get_platdata(&pdev->dev)) {
|
||||||
|
@ -146,9 +145,6 @@ static int ath_ahb_probe(struct platform_device *pdev)
|
||||||
wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
|
wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
|
||||||
hw_name, (unsigned long)mem, irq);
|
hw_name, (unsigned long)mem, irq);
|
||||||
|
|
||||||
common = ath9k_hw_common(sc->sc_ah);
|
|
||||||
/* Will be cleared in ath9k_start() */
|
|
||||||
set_bit(ATH_OP_INVALID, &common->op_flags);
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_irq:
|
err_irq:
|
||||||
|
|
|
@ -155,6 +155,9 @@ static void ath9k_hw_set_ofdm_nil(struct ath_hw *ah, u8 immunityLevel,
|
||||||
ATH9K_ANI_RSSI_THR_LOW,
|
ATH9K_ANI_RSSI_THR_LOW,
|
||||||
ATH9K_ANI_RSSI_THR_HIGH);
|
ATH9K_ANI_RSSI_THR_HIGH);
|
||||||
|
|
||||||
|
if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_OFDM_DEF_LEVEL)
|
||||||
|
immunityLevel = ATH9K_ANI_OFDM_DEF_LEVEL;
|
||||||
|
|
||||||
if (!scan)
|
if (!scan)
|
||||||
aniState->ofdmNoiseImmunityLevel = immunityLevel;
|
aniState->ofdmNoiseImmunityLevel = immunityLevel;
|
||||||
|
|
||||||
|
@ -235,6 +238,9 @@ static void ath9k_hw_set_cck_nil(struct ath_hw *ah, u_int8_t immunityLevel,
|
||||||
BEACON_RSSI(ah), ATH9K_ANI_RSSI_THR_LOW,
|
BEACON_RSSI(ah), ATH9K_ANI_RSSI_THR_LOW,
|
||||||
ATH9K_ANI_RSSI_THR_HIGH);
|
ATH9K_ANI_RSSI_THR_HIGH);
|
||||||
|
|
||||||
|
if (AR_SREV_9100(ah) && immunityLevel < ATH9K_ANI_CCK_DEF_LEVEL)
|
||||||
|
immunityLevel = ATH9K_ANI_CCK_DEF_LEVEL;
|
||||||
|
|
||||||
if (ah->opmode == NL80211_IFTYPE_STATION &&
|
if (ah->opmode == NL80211_IFTYPE_STATION &&
|
||||||
BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_LOW &&
|
BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_LOW &&
|
||||||
immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)
|
immunityLevel > ATH9K_ANI_CCK_MAX_LEVEL_LOW_RSSI)
|
||||||
|
|
|
@ -254,7 +254,6 @@ struct ath_atx_tid {
|
||||||
|
|
||||||
s8 bar_index;
|
s8 bar_index;
|
||||||
bool sched;
|
bool sched;
|
||||||
bool paused;
|
|
||||||
bool active;
|
bool active;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ static ssize_t read_file_node_aggr(struct file *file, char __user *user_buf,
|
||||||
ath_txq_lock(sc, txq);
|
ath_txq_lock(sc, txq);
|
||||||
if (tid->active) {
|
if (tid->active) {
|
||||||
len += scnprintf(buf + len, size - len,
|
len += scnprintf(buf + len, size - len,
|
||||||
"%3d%11d%10d%10d%10d%10d%9d%6d%8d\n",
|
"%3d%11d%10d%10d%10d%10d%9d%6d\n",
|
||||||
tid->tidno,
|
tid->tidno,
|
||||||
tid->seq_start,
|
tid->seq_start,
|
||||||
tid->seq_next,
|
tid->seq_next,
|
||||||
|
@ -80,8 +80,7 @@ static ssize_t read_file_node_aggr(struct file *file, char __user *user_buf,
|
||||||
tid->baw_head,
|
tid->baw_head,
|
||||||
tid->baw_tail,
|
tid->baw_tail,
|
||||||
tid->bar_index,
|
tid->bar_index,
|
||||||
tid->sched,
|
tid->sched);
|
||||||
tid->paused);
|
|
||||||
}
|
}
|
||||||
ath_txq_unlock(sc, txq);
|
ath_txq_unlock(sc, txq);
|
||||||
}
|
}
|
||||||
|
|
|
@ -787,6 +787,9 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc,
|
||||||
common = ath9k_hw_common(ah);
|
common = ath9k_hw_common(ah);
|
||||||
ath9k_set_hw_capab(sc, hw);
|
ath9k_set_hw_capab(sc, hw);
|
||||||
|
|
||||||
|
/* Will be cleared in ath9k_start() */
|
||||||
|
set_bit(ATH_OP_INVALID, &common->op_flags);
|
||||||
|
|
||||||
/* Initialize regulatory */
|
/* Initialize regulatory */
|
||||||
error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
|
error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
|
||||||
ath9k_reg_notifier);
|
ath9k_reg_notifier);
|
||||||
|
|
|
@ -784,7 +784,6 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||||
{
|
{
|
||||||
struct ath_softc *sc;
|
struct ath_softc *sc;
|
||||||
struct ieee80211_hw *hw;
|
struct ieee80211_hw *hw;
|
||||||
struct ath_common *common;
|
|
||||||
u8 csz;
|
u8 csz;
|
||||||
u32 val;
|
u32 val;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -877,10 +876,6 @@ static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||||
wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
|
wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
|
||||||
hw_name, (unsigned long)sc->mem, pdev->irq);
|
hw_name, (unsigned long)sc->mem, pdev->irq);
|
||||||
|
|
||||||
/* Will be cleared in ath9k_start() */
|
|
||||||
common = ath9k_hw_common(sc->sc_ah);
|
|
||||||
set_bit(ATH_OP_INVALID, &common->op_flags);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_init:
|
err_init:
|
||||||
|
|
|
@ -978,6 +978,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
|
||||||
u64 tsf = 0;
|
u64 tsf = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
dma_addr_t new_buf_addr;
|
dma_addr_t new_buf_addr;
|
||||||
|
unsigned int budget = 512;
|
||||||
|
|
||||||
if (edma)
|
if (edma)
|
||||||
dma_type = DMA_BIDIRECTIONAL;
|
dma_type = DMA_BIDIRECTIONAL;
|
||||||
|
@ -1116,15 +1117,17 @@ requeue_drop_frag:
|
||||||
}
|
}
|
||||||
requeue:
|
requeue:
|
||||||
list_add_tail(&bf->list, &sc->rx.rxbuf);
|
list_add_tail(&bf->list, &sc->rx.rxbuf);
|
||||||
if (flush)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (edma) {
|
if (edma) {
|
||||||
ath_rx_edma_buf_link(sc, qtype);
|
ath_rx_edma_buf_link(sc, qtype);
|
||||||
} else {
|
} else {
|
||||||
ath_rx_buf_relink(sc, bf);
|
ath_rx_buf_relink(sc, bf);
|
||||||
ath9k_hw_rxena(ah);
|
if (!flush)
|
||||||
|
ath9k_hw_rxena(ah);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!budget--)
|
||||||
|
break;
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
if (!(ah->imask & ATH9K_INT_RXEOL)) {
|
if (!(ah->imask & ATH9K_INT_RXEOL)) {
|
||||||
|
|
|
@ -107,9 +107,6 @@ static void ath_tx_queue_tid(struct ath_txq *txq, struct ath_atx_tid *tid)
|
||||||
{
|
{
|
||||||
struct ath_atx_ac *ac = tid->ac;
|
struct ath_atx_ac *ac = tid->ac;
|
||||||
|
|
||||||
if (tid->paused)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (tid->sched)
|
if (tid->sched)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1407,7 +1404,6 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||||
ath_tx_tid_change_state(sc, txtid);
|
ath_tx_tid_change_state(sc, txtid);
|
||||||
|
|
||||||
txtid->active = true;
|
txtid->active = true;
|
||||||
txtid->paused = true;
|
|
||||||
*ssn = txtid->seq_start = txtid->seq_next;
|
*ssn = txtid->seq_start = txtid->seq_next;
|
||||||
txtid->bar_index = -1;
|
txtid->bar_index = -1;
|
||||||
|
|
||||||
|
@ -1427,7 +1423,6 @@ void ath_tx_aggr_stop(struct ath_softc *sc, struct ieee80211_sta *sta, u16 tid)
|
||||||
|
|
||||||
ath_txq_lock(sc, txq);
|
ath_txq_lock(sc, txq);
|
||||||
txtid->active = false;
|
txtid->active = false;
|
||||||
txtid->paused = false;
|
|
||||||
ath_tx_flush_tid(sc, txtid);
|
ath_tx_flush_tid(sc, txtid);
|
||||||
ath_tx_tid_change_state(sc, txtid);
|
ath_tx_tid_change_state(sc, txtid);
|
||||||
ath_txq_unlock_complete(sc, txq);
|
ath_txq_unlock_complete(sc, txq);
|
||||||
|
@ -1487,7 +1482,7 @@ void ath_tx_aggr_wakeup(struct ath_softc *sc, struct ath_node *an)
|
||||||
ath_txq_lock(sc, txq);
|
ath_txq_lock(sc, txq);
|
||||||
ac->clear_ps_filter = true;
|
ac->clear_ps_filter = true;
|
||||||
|
|
||||||
if (!tid->paused && ath_tid_has_buffered(tid)) {
|
if (ath_tid_has_buffered(tid)) {
|
||||||
ath_tx_queue_tid(txq, tid);
|
ath_tx_queue_tid(txq, tid);
|
||||||
ath_txq_schedule(sc, txq);
|
ath_txq_schedule(sc, txq);
|
||||||
}
|
}
|
||||||
|
@ -1510,7 +1505,6 @@ void ath_tx_aggr_resume(struct ath_softc *sc, struct ieee80211_sta *sta,
|
||||||
ath_txq_lock(sc, txq);
|
ath_txq_lock(sc, txq);
|
||||||
|
|
||||||
tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor;
|
tid->baw_size = IEEE80211_MIN_AMPDU_BUF << sta->ht_cap.ampdu_factor;
|
||||||
tid->paused = false;
|
|
||||||
|
|
||||||
if (ath_tid_has_buffered(tid)) {
|
if (ath_tid_has_buffered(tid)) {
|
||||||
ath_tx_queue_tid(txq, tid);
|
ath_tx_queue_tid(txq, tid);
|
||||||
|
@ -1544,8 +1538,6 @@ void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
tid = ATH_AN_2_TID(an, i);
|
tid = ATH_AN_2_TID(an, i);
|
||||||
if (tid->paused)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ath_txq_lock(sc, tid->ac->txq);
|
ath_txq_lock(sc, tid->ac->txq);
|
||||||
while (nframes > 0) {
|
while (nframes > 0) {
|
||||||
|
@ -1844,9 +1836,6 @@ void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
|
||||||
list_del(&tid->list);
|
list_del(&tid->list);
|
||||||
tid->sched = false;
|
tid->sched = false;
|
||||||
|
|
||||||
if (tid->paused)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (ath_tx_sched_aggr(sc, txq, tid, &stop))
|
if (ath_tx_sched_aggr(sc, txq, tid, &stop))
|
||||||
sent = true;
|
sent = true;
|
||||||
|
|
||||||
|
@ -2698,7 +2687,6 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
|
||||||
tid->baw_size = WME_MAX_BA;
|
tid->baw_size = WME_MAX_BA;
|
||||||
tid->baw_head = tid->baw_tail = 0;
|
tid->baw_head = tid->baw_tail = 0;
|
||||||
tid->sched = false;
|
tid->sched = false;
|
||||||
tid->paused = false;
|
|
||||||
tid->active = false;
|
tid->active = false;
|
||||||
__skb_queue_head_init(&tid->buf_q);
|
__skb_queue_head_init(&tid->buf_q);
|
||||||
__skb_queue_head_init(&tid->retry_q);
|
__skb_queue_head_init(&tid->retry_q);
|
||||||
|
|
|
@ -303,10 +303,10 @@ static void brcmf_chip_ai_coredisable(struct brcmf_core_priv *core,
|
||||||
|
|
||||||
ci = core->chip;
|
ci = core->chip;
|
||||||
|
|
||||||
/* if core is already in reset, just return */
|
/* if core is already in reset, skip reset */
|
||||||
regdata = ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL);
|
regdata = ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL);
|
||||||
if ((regdata & BCMA_RESET_CTL_RESET) != 0)
|
if ((regdata & BCMA_RESET_CTL_RESET) != 0)
|
||||||
return;
|
goto in_reset_configure;
|
||||||
|
|
||||||
/* configure reset */
|
/* configure reset */
|
||||||
ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
|
ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
|
||||||
|
@ -322,6 +322,7 @@ static void brcmf_chip_ai_coredisable(struct brcmf_core_priv *core,
|
||||||
SPINWAIT(ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL) !=
|
SPINWAIT(ci->ops->read32(ci->ctx, core->wrapbase + BCMA_RESET_CTL) !=
|
||||||
BCMA_RESET_CTL_RESET, 300);
|
BCMA_RESET_CTL_RESET, 300);
|
||||||
|
|
||||||
|
in_reset_configure:
|
||||||
/* in-reset configure */
|
/* in-reset configure */
|
||||||
ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
|
ci->ops->write32(ci->ctx, core->wrapbase + BCMA_IOCTL,
|
||||||
reset | BCMA_IOCTL_FGC | BCMA_IOCTL_CLK);
|
reset | BCMA_IOCTL_FGC | BCMA_IOCTL_CLK);
|
||||||
|
|
|
@ -4948,7 +4948,7 @@ static int brcmf_enable_bw40_2g(struct brcmf_if *ifp)
|
||||||
if (!err) {
|
if (!err) {
|
||||||
/* only set 2G bandwidth using bw_cap command */
|
/* only set 2G bandwidth using bw_cap command */
|
||||||
band_bwcap.band = cpu_to_le32(WLC_BAND_2G);
|
band_bwcap.band = cpu_to_le32(WLC_BAND_2G);
|
||||||
band_bwcap.bw_cap = cpu_to_le32(WLC_BW_40MHZ_BIT);
|
band_bwcap.bw_cap = cpu_to_le32(WLC_BW_CAP_40MHZ);
|
||||||
err = brcmf_fil_iovar_data_set(ifp, "bw_cap", &band_bwcap,
|
err = brcmf_fil_iovar_data_set(ifp, "bw_cap", &band_bwcap,
|
||||||
sizeof(band_bwcap));
|
sizeof(band_bwcap));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1020,7 +1020,7 @@ static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,
|
||||||
memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);
|
memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);
|
||||||
len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4);
|
len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4);
|
||||||
|
|
||||||
ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_SYNC, len, cmd);
|
ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd);
|
||||||
if (ret)
|
if (ret)
|
||||||
IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret);
|
IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret);
|
||||||
}
|
}
|
||||||
|
@ -1036,7 +1036,7 @@ static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm)
|
||||||
if (WARN_ON_ONCE(!mvm->mcast_filter_cmd))
|
if (WARN_ON_ONCE(!mvm->mcast_filter_cmd))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ieee80211_iterate_active_interfaces(
|
ieee80211_iterate_active_interfaces_atomic(
|
||||||
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||||
iwl_mvm_mc_iface_iterator, &iter_data);
|
iwl_mvm_mc_iface_iterator, &iter_data);
|
||||||
}
|
}
|
||||||
|
@ -1829,6 +1829,11 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
mutex_lock(&mvm->mutex);
|
mutex_lock(&mvm->mutex);
|
||||||
|
|
||||||
|
if (!iwl_mvm_is_idle(mvm)) {
|
||||||
|
ret = -EBUSY;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
switch (mvm->scan_status) {
|
switch (mvm->scan_status) {
|
||||||
case IWL_MVM_SCAN_OS:
|
case IWL_MVM_SCAN_OS:
|
||||||
IWL_DEBUG_SCAN(mvm, "Stopping previous scan for sched_scan\n");
|
IWL_DEBUG_SCAN(mvm, "Stopping previous scan for sched_scan\n");
|
||||||
|
|
|
@ -1029,6 +1029,9 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
|
||||||
return mvmvif->low_latency;
|
return mvmvif->low_latency;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Assoc status */
|
||||||
|
bool iwl_mvm_is_idle(struct iwl_mvm *mvm);
|
||||||
|
|
||||||
/* Thermal management and CT-kill */
|
/* Thermal management and CT-kill */
|
||||||
void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
|
void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
|
||||||
void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
|
void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
|
||||||
|
|
|
@ -741,7 +741,7 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
|
||||||
int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels;
|
int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels;
|
||||||
int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels;
|
int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels;
|
||||||
int head = 0;
|
int head = 0;
|
||||||
int tail = band_2ghz + band_5ghz;
|
int tail = band_2ghz + band_5ghz - 1;
|
||||||
u32 ssid_bitmap;
|
u32 ssid_bitmap;
|
||||||
int cmd_len;
|
int cmd_len;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -690,3 +690,22 @@ bool iwl_mvm_low_latency(struct iwl_mvm *mvm)
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void iwl_mvm_idle_iter(void *_data, u8 *mac, struct ieee80211_vif *vif)
|
||||||
|
{
|
||||||
|
bool *idle = _data;
|
||||||
|
|
||||||
|
if (!vif->bss_conf.idle)
|
||||||
|
*idle = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool iwl_mvm_is_idle(struct iwl_mvm *mvm)
|
||||||
|
{
|
||||||
|
bool idle = true;
|
||||||
|
|
||||||
|
ieee80211_iterate_active_interfaces_atomic(
|
||||||
|
mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
|
||||||
|
iwl_mvm_idle_iter, &idle);
|
||||||
|
|
||||||
|
return idle;
|
||||||
|
}
|
||||||
|
|
|
@ -1848,6 +1848,10 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||||
* PCI Tx retries from interfering with C3 CPU state */
|
* PCI Tx retries from interfering with C3 CPU state */
|
||||||
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
|
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
|
||||||
|
|
||||||
|
trans->dev = &pdev->dev;
|
||||||
|
trans_pcie->pci_dev = pdev;
|
||||||
|
iwl_disable_interrupts(trans);
|
||||||
|
|
||||||
err = pci_enable_msi(pdev);
|
err = pci_enable_msi(pdev);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", err);
|
dev_err(&pdev->dev, "pci_enable_msi failed(0X%x)\n", err);
|
||||||
|
@ -1859,8 +1863,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
trans->dev = &pdev->dev;
|
|
||||||
trans_pcie->pci_dev = pdev;
|
|
||||||
trans->hw_rev = iwl_read32(trans, CSR_HW_REV);
|
trans->hw_rev = iwl_read32(trans, CSR_HW_REV);
|
||||||
trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
|
trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
|
||||||
snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
|
snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
|
||||||
|
@ -1886,8 +1888,6 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||||
goto out_pci_disable_msi;
|
goto out_pci_disable_msi;
|
||||||
}
|
}
|
||||||
|
|
||||||
trans_pcie->inta_mask = CSR_INI_SET_MASK;
|
|
||||||
|
|
||||||
if (iwl_pcie_alloc_ict(trans))
|
if (iwl_pcie_alloc_ict(trans))
|
||||||
goto out_free_cmd_pool;
|
goto out_free_cmd_pool;
|
||||||
|
|
||||||
|
@ -1899,6 +1899,8 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
|
||||||
goto out_free_ict;
|
goto out_free_ict;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trans_pcie->inta_mask = CSR_INI_SET_MASK;
|
||||||
|
|
||||||
return trans;
|
return trans;
|
||||||
|
|
||||||
out_free_ict:
|
out_free_ict:
|
||||||
|
|
|
@ -620,21 +620,19 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
rt2x00lib_config_intf(rt2x00dev, intf, vif->type, NULL,
|
rt2x00lib_config_intf(rt2x00dev, intf, vif->type, NULL,
|
||||||
bss_conf->bssid);
|
bss_conf->bssid);
|
||||||
|
|
||||||
/*
|
|
||||||
* Update the beacon. This is only required on USB devices. PCI
|
|
||||||
* devices fetch beacons periodically.
|
|
||||||
*/
|
|
||||||
if (changes & BSS_CHANGED_BEACON && rt2x00_is_usb(rt2x00dev))
|
|
||||||
rt2x00queue_update_beacon(rt2x00dev, vif);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Start/stop beaconing.
|
* Start/stop beaconing.
|
||||||
*/
|
*/
|
||||||
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
if (changes & BSS_CHANGED_BEACON_ENABLED) {
|
||||||
if (!bss_conf->enable_beacon && intf->enable_beacon) {
|
if (!bss_conf->enable_beacon && intf->enable_beacon) {
|
||||||
rt2x00queue_clear_beacon(rt2x00dev, vif);
|
|
||||||
rt2x00dev->intf_beaconing--;
|
rt2x00dev->intf_beaconing--;
|
||||||
intf->enable_beacon = false;
|
intf->enable_beacon = false;
|
||||||
|
/*
|
||||||
|
* Clear beacon in the H/W for this vif. This is needed
|
||||||
|
* to disable beaconing on this particular interface
|
||||||
|
* and keep it running on other interfaces.
|
||||||
|
*/
|
||||||
|
rt2x00queue_clear_beacon(rt2x00dev, vif);
|
||||||
|
|
||||||
if (rt2x00dev->intf_beaconing == 0) {
|
if (rt2x00dev->intf_beaconing == 0) {
|
||||||
/*
|
/*
|
||||||
|
@ -645,11 +643,15 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
|
||||||
rt2x00queue_stop_queue(rt2x00dev->bcn);
|
rt2x00queue_stop_queue(rt2x00dev->bcn);
|
||||||
mutex_unlock(&intf->beacon_skb_mutex);
|
mutex_unlock(&intf->beacon_skb_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else if (bss_conf->enable_beacon && !intf->enable_beacon) {
|
} else if (bss_conf->enable_beacon && !intf->enable_beacon) {
|
||||||
rt2x00dev->intf_beaconing++;
|
rt2x00dev->intf_beaconing++;
|
||||||
intf->enable_beacon = true;
|
intf->enable_beacon = true;
|
||||||
|
/*
|
||||||
|
* Upload beacon to the H/W. This is only required on
|
||||||
|
* USB devices. PCI devices fetch beacons periodically.
|
||||||
|
*/
|
||||||
|
if (rt2x00_is_usb(rt2x00dev))
|
||||||
|
rt2x00queue_update_beacon(rt2x00dev, vif);
|
||||||
|
|
||||||
if (rt2x00dev->intf_beaconing == 1) {
|
if (rt2x00dev->intf_beaconing == 1) {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -293,7 +293,7 @@ static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
|
||||||
u8 *psaddr;
|
u8 *psaddr;
|
||||||
__le16 fc;
|
__le16 fc;
|
||||||
u16 type, ufc;
|
u16 type, ufc;
|
||||||
bool match_bssid, packet_toself, packet_beacon, addr;
|
bool match_bssid, packet_toself, packet_beacon = false, addr;
|
||||||
|
|
||||||
tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
|
tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
|
||||||
|
|
||||||
|
|
|
@ -1001,7 +1001,7 @@ int rtl92cu_hw_init(struct ieee80211_hw *hw)
|
||||||
err = _rtl92cu_init_mac(hw);
|
err = _rtl92cu_init_mac(hw);
|
||||||
if (err) {
|
if (err) {
|
||||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "init mac failed!\n");
|
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "init mac failed!\n");
|
||||||
return err;
|
goto exit;
|
||||||
}
|
}
|
||||||
err = rtl92c_download_fw(hw);
|
err = rtl92c_download_fw(hw);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
|
@ -49,6 +49,12 @@ static u8 _rtl92se_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 skb_queue)
|
||||||
if (ieee80211_is_nullfunc(fc))
|
if (ieee80211_is_nullfunc(fc))
|
||||||
return QSLT_HIGH;
|
return QSLT_HIGH;
|
||||||
|
|
||||||
|
/* Kernel commit 1bf4bbb4024dcdab changed EAPOL packets to use
|
||||||
|
* queue V0 at priority 7; however, the RTL8192SE appears to have
|
||||||
|
* that queue at priority 6
|
||||||
|
*/
|
||||||
|
if (skb->priority == 7)
|
||||||
|
return QSLT_VO;
|
||||||
return skb->priority;
|
return skb->priority;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3691,6 +3691,18 @@ void cfg80211_sched_scan_results(struct wiphy *wiphy);
|
||||||
*/
|
*/
|
||||||
void cfg80211_sched_scan_stopped(struct wiphy *wiphy);
|
void cfg80211_sched_scan_stopped(struct wiphy *wiphy);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* cfg80211_sched_scan_stopped_rtnl - notify that the scheduled scan has stopped
|
||||||
|
*
|
||||||
|
* @wiphy: the wiphy on which the scheduled scan stopped
|
||||||
|
*
|
||||||
|
* The driver can call this function to inform cfg80211 that the
|
||||||
|
* scheduled scan had to be stopped, for whatever reason. The driver
|
||||||
|
* is then called back via the sched_scan_stop operation when done.
|
||||||
|
* This function should be called with rtnl locked.
|
||||||
|
*/
|
||||||
|
void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame
|
* cfg80211_inform_bss_width_frame - inform cfg80211 of a received BSS frame
|
||||||
*
|
*
|
||||||
|
|
|
@ -884,14 +884,17 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
|
||||||
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
|
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
|
||||||
struct hci_cp_auth_requested cp;
|
struct hci_cp_auth_requested cp;
|
||||||
|
|
||||||
/* encrypt must be pending if auth is also pending */
|
|
||||||
set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
|
|
||||||
|
|
||||||
cp.handle = cpu_to_le16(conn->handle);
|
cp.handle = cpu_to_le16(conn->handle);
|
||||||
hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
|
hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
|
||||||
sizeof(cp), &cp);
|
sizeof(cp), &cp);
|
||||||
|
|
||||||
|
/* If we're already encrypted set the REAUTH_PEND flag,
|
||||||
|
* otherwise set the ENCRYPT_PEND.
|
||||||
|
*/
|
||||||
if (conn->key_type != 0xff)
|
if (conn->key_type != 0xff)
|
||||||
set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
|
set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
|
||||||
|
else
|
||||||
|
set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -3388,6 +3388,12 @@ static void hci_key_refresh_complete_evt(struct hci_dev *hdev,
|
||||||
if (!conn)
|
if (!conn)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
|
/* For BR/EDR the necessary steps are taken through the
|
||||||
|
* auth_complete event.
|
||||||
|
*/
|
||||||
|
if (conn->type != LE_LINK)
|
||||||
|
goto unlock;
|
||||||
|
|
||||||
if (!ev->status)
|
if (!ev->status)
|
||||||
conn->sec_level = conn->pending_sec_level;
|
conn->sec_level = conn->pending_sec_level;
|
||||||
|
|
||||||
|
|
|
@ -1232,7 +1232,8 @@ ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
|
||||||
if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) &&
|
if (ether_addr_equal(bssid, rx->sdata->u.ibss.bssid) &&
|
||||||
test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
|
test_sta_flag(sta, WLAN_STA_AUTHORIZED)) {
|
||||||
sta->last_rx = jiffies;
|
sta->last_rx = jiffies;
|
||||||
if (ieee80211_is_data(hdr->frame_control)) {
|
if (ieee80211_is_data(hdr->frame_control) &&
|
||||||
|
!is_multicast_ether_addr(hdr->addr1)) {
|
||||||
sta->last_rx_rate_idx = status->rate_idx;
|
sta->last_rx_rate_idx = status->rate_idx;
|
||||||
sta->last_rx_rate_flag = status->flag;
|
sta->last_rx_rate_flag = status->flag;
|
||||||
sta->last_rx_rate_vht_flag = status->vht_flag;
|
sta->last_rx_rate_vht_flag = status->vht_flag;
|
||||||
|
|
|
@ -1147,7 +1147,8 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
|
||||||
atomic_dec(&ps->num_sta_ps);
|
atomic_dec(&ps->num_sta_ps);
|
||||||
|
|
||||||
/* This station just woke up and isn't aware of our SMPS state */
|
/* This station just woke up and isn't aware of our SMPS state */
|
||||||
if (!ieee80211_smps_is_restrictive(sta->known_smps_mode,
|
if (!ieee80211_vif_is_mesh(&sdata->vif) &&
|
||||||
|
!ieee80211_smps_is_restrictive(sta->known_smps_mode,
|
||||||
sdata->smps_mode) &&
|
sdata->smps_mode) &&
|
||||||
sta->known_smps_mode != sdata->bss->req_smps &&
|
sta->known_smps_mode != sdata->bss->req_smps &&
|
||||||
sta_info_tx_streams(sta) != 1) {
|
sta_info_tx_streams(sta) != 1) {
|
||||||
|
|
|
@ -314,10 +314,9 @@ ieee80211_add_tx_radiotap_header(struct ieee80211_local *local,
|
||||||
!is_multicast_ether_addr(hdr->addr1))
|
!is_multicast_ether_addr(hdr->addr1))
|
||||||
txflags |= IEEE80211_RADIOTAP_F_TX_FAIL;
|
txflags |= IEEE80211_RADIOTAP_F_TX_FAIL;
|
||||||
|
|
||||||
if ((info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) ||
|
if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
|
||||||
(info->status.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT))
|
|
||||||
txflags |= IEEE80211_RADIOTAP_F_TX_CTS;
|
txflags |= IEEE80211_RADIOTAP_F_TX_CTS;
|
||||||
else if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
|
if (info->status.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS)
|
||||||
txflags |= IEEE80211_RADIOTAP_F_TX_RTS;
|
txflags |= IEEE80211_RADIOTAP_F_TX_RTS;
|
||||||
|
|
||||||
put_unaligned_le16(txflags, pos);
|
put_unaligned_le16(txflags, pos);
|
||||||
|
|
|
@ -21,10 +21,10 @@
|
||||||
|
|
||||||
#define VIF_ENTRY __field(enum nl80211_iftype, vif_type) __field(void *, sdata) \
|
#define VIF_ENTRY __field(enum nl80211_iftype, vif_type) __field(void *, sdata) \
|
||||||
__field(bool, p2p) \
|
__field(bool, p2p) \
|
||||||
__string(vif_name, sdata->dev ? sdata->dev->name : "<nodev>")
|
__string(vif_name, sdata->name)
|
||||||
#define VIF_ASSIGN __entry->vif_type = sdata->vif.type; __entry->sdata = sdata; \
|
#define VIF_ASSIGN __entry->vif_type = sdata->vif.type; __entry->sdata = sdata; \
|
||||||
__entry->p2p = sdata->vif.p2p; \
|
__entry->p2p = sdata->vif.p2p; \
|
||||||
__assign_str(vif_name, sdata->dev ? sdata->dev->name : sdata->name)
|
__assign_str(vif_name, sdata->name)
|
||||||
#define VIF_PR_FMT " vif:%s(%d%s)"
|
#define VIF_PR_FMT " vif:%s(%d%s)"
|
||||||
#define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
|
#define VIF_PR_ARG __get_str(vif_name), __entry->vif_type, __entry->p2p ? "/p2p" : ""
|
||||||
|
|
||||||
|
|
|
@ -1777,7 +1777,7 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
||||||
mutex_unlock(&local->mtx);
|
mutex_unlock(&local->mtx);
|
||||||
|
|
||||||
if (sched_scan_stopped)
|
if (sched_scan_stopped)
|
||||||
cfg80211_sched_scan_stopped(local->hw.wiphy);
|
cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is for hw restart things are still running.
|
* If this is for hw restart things are still running.
|
||||||
|
|
|
@ -129,9 +129,12 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
|
||||||
if (!vht_cap_ie || !sband->vht_cap.vht_supported)
|
if (!vht_cap_ie || !sband->vht_cap.vht_supported)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* A VHT STA must support 40 MHz */
|
/*
|
||||||
if (!(sta->sta.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
|
* A VHT STA must support 40 MHz, but if we verify that here
|
||||||
return;
|
* then we break a few things - some APs (e.g. Netgear R6300v2
|
||||||
|
* and others based on the BCM4360 chipset) will unset this
|
||||||
|
* capability bit when operating in 20 MHz.
|
||||||
|
*/
|
||||||
|
|
||||||
vht_cap->vht_supported = true;
|
vht_cap->vht_supported = true;
|
||||||
|
|
||||||
|
|
|
@ -284,14 +284,22 @@ void cfg80211_sched_scan_results(struct wiphy *wiphy)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cfg80211_sched_scan_results);
|
EXPORT_SYMBOL(cfg80211_sched_scan_results);
|
||||||
|
|
||||||
void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
|
void cfg80211_sched_scan_stopped_rtnl(struct wiphy *wiphy)
|
||||||
{
|
{
|
||||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||||
|
|
||||||
|
ASSERT_RTNL();
|
||||||
|
|
||||||
trace_cfg80211_sched_scan_stopped(wiphy);
|
trace_cfg80211_sched_scan_stopped(wiphy);
|
||||||
|
|
||||||
rtnl_lock();
|
|
||||||
__cfg80211_stop_sched_scan(rdev, true);
|
__cfg80211_stop_sched_scan(rdev, true);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(cfg80211_sched_scan_stopped_rtnl);
|
||||||
|
|
||||||
|
void cfg80211_sched_scan_stopped(struct wiphy *wiphy)
|
||||||
|
{
|
||||||
|
rtnl_lock();
|
||||||
|
cfg80211_sched_scan_stopped_rtnl(wiphy);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
|
EXPORT_SYMBOL(cfg80211_sched_scan_stopped);
|
||||||
|
|
|
@ -234,7 +234,6 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
NULL, 0, NULL, 0,
|
NULL, 0, NULL, 0,
|
||||||
WLAN_STATUS_UNSPECIFIED_FAILURE,
|
WLAN_STATUS_UNSPECIFIED_FAILURE,
|
||||||
false, NULL);
|
false, NULL);
|
||||||
cfg80211_sme_free(wdev);
|
|
||||||
}
|
}
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
}
|
}
|
||||||
|
@ -647,6 +646,7 @@ void __cfg80211_connect_result(struct net_device *dev, const u8 *bssid,
|
||||||
cfg80211_unhold_bss(bss_from_pub(bss));
|
cfg80211_unhold_bss(bss_from_pub(bss));
|
||||||
cfg80211_put_bss(wdev->wiphy, bss);
|
cfg80211_put_bss(wdev->wiphy, bss);
|
||||||
}
|
}
|
||||||
|
cfg80211_sme_free(wdev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue