mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts: drivers/net/wireless/iwlwifi/dvm/tx.c
This commit is contained in:
@@ -97,11 +97,16 @@ void __devinit bcma_core_pci_hostmode_init(struct bcma_drv_pci *pc);
|
|||||||
#ifdef CONFIG_BCMA_DRIVER_GPIO
|
#ifdef CONFIG_BCMA_DRIVER_GPIO
|
||||||
/* driver_gpio.c */
|
/* driver_gpio.c */
|
||||||
int bcma_gpio_init(struct bcma_drv_cc *cc);
|
int bcma_gpio_init(struct bcma_drv_cc *cc);
|
||||||
|
int bcma_gpio_unregister(struct bcma_drv_cc *cc);
|
||||||
#else
|
#else
|
||||||
static inline int bcma_gpio_init(struct bcma_drv_cc *cc)
|
static inline int bcma_gpio_init(struct bcma_drv_cc *cc)
|
||||||
{
|
{
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
}
|
}
|
||||||
|
static inline int bcma_gpio_unregister(struct bcma_drv_cc *cc)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_BCMA_DRIVER_GPIO */
|
#endif /* CONFIG_BCMA_DRIVER_GPIO */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -21,7 +21,7 @@ int bcma_nflash_init(struct bcma_drv_cc *cc)
|
|||||||
struct bcma_bus *bus = cc->core->bus;
|
struct bcma_bus *bus = cc->core->bus;
|
||||||
|
|
||||||
if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 &&
|
if (bus->chipinfo.id != BCMA_CHIP_ID_BCM4706 &&
|
||||||
cc->core->id.rev != 0x38) {
|
cc->core->id.rev != 38) {
|
||||||
bcma_err(bus, "NAND flash on unsupported board!\n");
|
bcma_err(bus, "NAND flash on unsupported board!\n");
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
}
|
}
|
||||||
|
@@ -107,3 +107,8 @@ int bcma_gpio_init(struct bcma_drv_cc *cc)
|
|||||||
|
|
||||||
return gpiochip_add(chip);
|
return gpiochip_add(chip);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bcma_gpio_unregister(struct bcma_drv_cc *cc)
|
||||||
|
{
|
||||||
|
return gpiochip_remove(&cc->gpio);
|
||||||
|
}
|
||||||
|
@@ -276,6 +276,13 @@ int __devinit bcma_bus_register(struct bcma_bus *bus)
|
|||||||
void bcma_bus_unregister(struct bcma_bus *bus)
|
void bcma_bus_unregister(struct bcma_bus *bus)
|
||||||
{
|
{
|
||||||
struct bcma_device *cores[3];
|
struct bcma_device *cores[3];
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = bcma_gpio_unregister(&bus->drv_cc);
|
||||||
|
if (err == -EBUSY)
|
||||||
|
bcma_err(bus, "Some GPIOs are still in use.\n");
|
||||||
|
else if (err)
|
||||||
|
bcma_err(bus, "Can not unregister GPIO driver: %i\n", err);
|
||||||
|
|
||||||
cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
|
cores[0] = bcma_find_core(bus, BCMA_CORE_MIPS_74K);
|
||||||
cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE);
|
cores[1] = bcma_find_core(bus, BCMA_CORE_PCIE);
|
||||||
|
@@ -36,6 +36,7 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
#define N_TX_QUEUES 4 /* #tx queues on mac80211<->driver interface */
|
#define N_TX_QUEUES 4 /* #tx queues on mac80211<->driver interface */
|
||||||
|
#define BRCMS_FLUSH_TIMEOUT 500 /* msec */
|
||||||
|
|
||||||
/* Flags we support */
|
/* Flags we support */
|
||||||
#define MAC_FILTERS (FIF_PROMISC_IN_BSS | \
|
#define MAC_FILTERS (FIF_PROMISC_IN_BSS | \
|
||||||
@@ -712,16 +713,29 @@ static void brcms_ops_rfkill_poll(struct ieee80211_hw *hw)
|
|||||||
wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, blocked);
|
wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, blocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool brcms_tx_flush_completed(struct brcms_info *wl)
|
||||||
|
{
|
||||||
|
bool result;
|
||||||
|
|
||||||
|
spin_lock_bh(&wl->lock);
|
||||||
|
result = brcms_c_tx_flush_completed(wl->wlc);
|
||||||
|
spin_unlock_bh(&wl->lock);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void brcms_ops_flush(struct ieee80211_hw *hw, bool drop)
|
static void brcms_ops_flush(struct ieee80211_hw *hw, bool drop)
|
||||||
{
|
{
|
||||||
struct brcms_info *wl = hw->priv;
|
struct brcms_info *wl = hw->priv;
|
||||||
|
int ret;
|
||||||
|
|
||||||
no_printk("%s: drop = %s\n", __func__, drop ? "true" : "false");
|
no_printk("%s: drop = %s\n", __func__, drop ? "true" : "false");
|
||||||
|
|
||||||
/* wait for packet queue and dma fifos to run empty */
|
ret = wait_event_timeout(wl->tx_flush_wq,
|
||||||
spin_lock_bh(&wl->lock);
|
brcms_tx_flush_completed(wl),
|
||||||
brcms_c_wait_for_tx_completion(wl->wlc, drop);
|
msecs_to_jiffies(BRCMS_FLUSH_TIMEOUT));
|
||||||
spin_unlock_bh(&wl->lock);
|
|
||||||
|
brcms_dbg_mac80211(wl->wlc->hw->d11core,
|
||||||
|
"ret=%d\n", jiffies_to_msecs(ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct ieee80211_ops brcms_ops = {
|
static const struct ieee80211_ops brcms_ops = {
|
||||||
@@ -776,6 +790,7 @@ void brcms_dpc(unsigned long data)
|
|||||||
|
|
||||||
done:
|
done:
|
||||||
spin_unlock_bh(&wl->lock);
|
spin_unlock_bh(&wl->lock);
|
||||||
|
wake_up(&wl->tx_flush_wq);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -1024,6 +1039,8 @@ static struct brcms_info *brcms_attach(struct bcma_device *pdev)
|
|||||||
|
|
||||||
atomic_set(&wl->callbacks, 0);
|
atomic_set(&wl->callbacks, 0);
|
||||||
|
|
||||||
|
init_waitqueue_head(&wl->tx_flush_wq);
|
||||||
|
|
||||||
/* setup the bottom half handler */
|
/* setup the bottom half handler */
|
||||||
tasklet_init(&wl->tasklet, brcms_dpc, (unsigned long) wl);
|
tasklet_init(&wl->tasklet, brcms_dpc, (unsigned long) wl);
|
||||||
|
|
||||||
@@ -1613,13 +1630,3 @@ bool brcms_rfkill_set_hw_state(struct brcms_info *wl)
|
|||||||
spin_lock_bh(&wl->lock);
|
spin_lock_bh(&wl->lock);
|
||||||
return blocked;
|
return blocked;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* precondition: perimeter lock has been acquired
|
|
||||||
*/
|
|
||||||
void brcms_msleep(struct brcms_info *wl, uint ms)
|
|
||||||
{
|
|
||||||
spin_unlock_bh(&wl->lock);
|
|
||||||
msleep(ms);
|
|
||||||
spin_lock_bh(&wl->lock);
|
|
||||||
}
|
|
||||||
|
@@ -68,6 +68,8 @@ struct brcms_info {
|
|||||||
spinlock_t lock; /* per-device perimeter lock */
|
spinlock_t lock; /* per-device perimeter lock */
|
||||||
spinlock_t isr_lock; /* per-device ISR synchronization lock */
|
spinlock_t isr_lock; /* per-device ISR synchronization lock */
|
||||||
|
|
||||||
|
/* tx flush */
|
||||||
|
wait_queue_head_t tx_flush_wq;
|
||||||
|
|
||||||
/* timer related fields */
|
/* timer related fields */
|
||||||
atomic_t callbacks; /* # outstanding callback functions */
|
atomic_t callbacks; /* # outstanding callback functions */
|
||||||
@@ -100,7 +102,6 @@ extern struct brcms_timer *brcms_init_timer(struct brcms_info *wl,
|
|||||||
extern void brcms_free_timer(struct brcms_timer *timer);
|
extern void brcms_free_timer(struct brcms_timer *timer);
|
||||||
extern void brcms_add_timer(struct brcms_timer *timer, uint ms, int periodic);
|
extern void brcms_add_timer(struct brcms_timer *timer, uint ms, int periodic);
|
||||||
extern bool brcms_del_timer(struct brcms_timer *timer);
|
extern bool brcms_del_timer(struct brcms_timer *timer);
|
||||||
extern void brcms_msleep(struct brcms_info *wl, uint ms);
|
|
||||||
extern void brcms_dpc(unsigned long data);
|
extern void brcms_dpc(unsigned long data);
|
||||||
extern void brcms_timer(struct brcms_timer *t);
|
extern void brcms_timer(struct brcms_timer *t);
|
||||||
extern void brcms_fatal_error(struct brcms_info *wl);
|
extern void brcms_fatal_error(struct brcms_info *wl);
|
||||||
|
@@ -1025,7 +1025,6 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)
|
|||||||
static bool
|
static bool
|
||||||
brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)
|
brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)
|
||||||
{
|
{
|
||||||
bool morepending = false;
|
|
||||||
struct bcma_device *core;
|
struct bcma_device *core;
|
||||||
struct tx_status txstatus, *txs;
|
struct tx_status txstatus, *txs;
|
||||||
u32 s1, s2;
|
u32 s1, s2;
|
||||||
@@ -1039,23 +1038,20 @@ brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)
|
|||||||
txs = &txstatus;
|
txs = &txstatus;
|
||||||
core = wlc_hw->d11core;
|
core = wlc_hw->d11core;
|
||||||
*fatal = false;
|
*fatal = false;
|
||||||
s1 = bcma_read32(core, D11REGOFFS(frmtxstatus));
|
|
||||||
while (!(*fatal)
|
|
||||||
&& (s1 & TXS_V)) {
|
|
||||||
/* !give others some time to run! */
|
|
||||||
if (n >= max_tx_num) {
|
|
||||||
morepending = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
while (n < max_tx_num) {
|
||||||
|
s1 = bcma_read32(core, D11REGOFFS(frmtxstatus));
|
||||||
if (s1 == 0xffffffff) {
|
if (s1 == 0xffffffff) {
|
||||||
brcms_err(core, "wl%d: %s: dead chip\n", wlc_hw->unit,
|
brcms_err(core, "wl%d: %s: dead chip\n", wlc_hw->unit,
|
||||||
__func__);
|
__func__);
|
||||||
*fatal = true;
|
*fatal = true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
s2 = bcma_read32(core, D11REGOFFS(frmtxstatus2));
|
/* only process when valid */
|
||||||
|
if (!(s1 & TXS_V))
|
||||||
|
break;
|
||||||
|
|
||||||
|
s2 = bcma_read32(core, D11REGOFFS(frmtxstatus2));
|
||||||
txs->status = s1 & TXS_STATUS_MASK;
|
txs->status = s1 & TXS_STATUS_MASK;
|
||||||
txs->frameid = (s1 & TXS_FID_MASK) >> TXS_FID_SHIFT;
|
txs->frameid = (s1 & TXS_FID_MASK) >> TXS_FID_SHIFT;
|
||||||
txs->sequence = s2 & TXS_SEQ_MASK;
|
txs->sequence = s2 & TXS_SEQ_MASK;
|
||||||
@@ -1063,15 +1059,12 @@ brcms_b_txstatus(struct brcms_hardware *wlc_hw, bool bound, bool *fatal)
|
|||||||
txs->lasttxtime = 0;
|
txs->lasttxtime = 0;
|
||||||
|
|
||||||
*fatal = brcms_c_dotxstatus(wlc_hw->wlc, txs);
|
*fatal = brcms_c_dotxstatus(wlc_hw->wlc, txs);
|
||||||
|
if (*fatal == true)
|
||||||
s1 = bcma_read32(core, D11REGOFFS(frmtxstatus));
|
return false;
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*fatal)
|
return n >= max_tx_num;
|
||||||
return false;
|
|
||||||
|
|
||||||
return morepending;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void brcms_c_tbtt(struct brcms_c_info *wlc)
|
static void brcms_c_tbtt(struct brcms_c_info *wlc)
|
||||||
@@ -7520,25 +7513,16 @@ int brcms_c_get_curband(struct brcms_c_info *wlc)
|
|||||||
return wlc->band->bandunit;
|
return wlc->band->bandunit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop)
|
bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc)
|
||||||
{
|
{
|
||||||
int timeout = 20;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* Kick DMA to send any pending AMPDU */
|
/* Kick DMA to send any pending AMPDU */
|
||||||
for (i = 0; i < ARRAY_SIZE(wlc->hw->di); i++)
|
for (i = 0; i < ARRAY_SIZE(wlc->hw->di); i++)
|
||||||
if (wlc->hw->di[i])
|
if (wlc->hw->di[i])
|
||||||
dma_txflush(wlc->hw->di[i]);
|
dma_kick_tx(wlc->hw->di[i]);
|
||||||
|
|
||||||
/* wait for queue and DMA fifos to run dry */
|
return !brcms_txpktpendtot(wlc);
|
||||||
while (brcms_txpktpendtot(wlc) > 0) {
|
|
||||||
brcms_msleep(wlc->wl, 1);
|
|
||||||
|
|
||||||
if (--timeout == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
WARN_ON_ONCE(timeout == 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval)
|
void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval)
|
||||||
|
@@ -314,8 +314,6 @@ extern void brcms_c_associate_upd(struct brcms_c_info *wlc, bool state);
|
|||||||
extern void brcms_c_scan_start(struct brcms_c_info *wlc);
|
extern void brcms_c_scan_start(struct brcms_c_info *wlc);
|
||||||
extern void brcms_c_scan_stop(struct brcms_c_info *wlc);
|
extern void brcms_c_scan_stop(struct brcms_c_info *wlc);
|
||||||
extern int brcms_c_get_curband(struct brcms_c_info *wlc);
|
extern int brcms_c_get_curband(struct brcms_c_info *wlc);
|
||||||
extern void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc,
|
|
||||||
bool drop);
|
|
||||||
extern int brcms_c_set_channel(struct brcms_c_info *wlc, u16 channel);
|
extern int brcms_c_set_channel(struct brcms_c_info *wlc, u16 channel);
|
||||||
extern int brcms_c_set_rate_limit(struct brcms_c_info *wlc, u16 srl, u16 lrl);
|
extern int brcms_c_set_rate_limit(struct brcms_c_info *wlc, u16 srl, u16 lrl);
|
||||||
extern void brcms_c_get_current_rateset(struct brcms_c_info *wlc,
|
extern void brcms_c_get_current_rateset(struct brcms_c_info *wlc,
|
||||||
@@ -332,5 +330,6 @@ extern int brcms_c_set_tx_power(struct brcms_c_info *wlc, int txpwr);
|
|||||||
extern int brcms_c_get_tx_power(struct brcms_c_info *wlc);
|
extern int brcms_c_get_tx_power(struct brcms_c_info *wlc);
|
||||||
extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc);
|
extern bool brcms_c_check_radio_disabled(struct brcms_c_info *wlc);
|
||||||
extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
|
extern void brcms_c_mute(struct brcms_c_info *wlc, bool on);
|
||||||
|
extern bool brcms_c_tx_flush_completed(struct brcms_c_info *wlc);
|
||||||
|
|
||||||
#endif /* _BRCM_PUB_H_ */
|
#endif /* _BRCM_PUB_H_ */
|
||||||
|
@@ -1145,6 +1145,13 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
|
|||||||
next_reclaimed = ssn;
|
next_reclaimed = ssn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tid != IWL_TID_NON_QOS) {
|
||||||
|
priv->tid_data[sta_id][tid].next_reclaimed =
|
||||||
|
next_reclaimed;
|
||||||
|
IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n",
|
||||||
|
next_reclaimed);
|
||||||
|
}
|
||||||
|
|
||||||
iwl_trans_reclaim(priv->trans, txq_id, ssn, &skbs);
|
iwl_trans_reclaim(priv->trans, txq_id, ssn, &skbs);
|
||||||
|
|
||||||
iwlagn_check_ratid_empty(priv, sta_id, tid);
|
iwlagn_check_ratid_empty(priv, sta_id, tid);
|
||||||
@@ -1195,16 +1202,6 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
|
|||||||
if (!is_agg)
|
if (!is_agg)
|
||||||
iwlagn_non_agg_tx_status(priv, ctx, hdr->addr1);
|
iwlagn_non_agg_tx_status(priv, ctx, hdr->addr1);
|
||||||
|
|
||||||
/*
|
|
||||||
* W/A for FW bug - the seq_ctl isn't updated when the
|
|
||||||
* queues are flushed. Fetch it from the packet itself
|
|
||||||
*/
|
|
||||||
if (!is_agg && status == TX_STATUS_FAIL_FIFO_FLUSHED) {
|
|
||||||
next_reclaimed = le16_to_cpu(hdr->seq_ctrl);
|
|
||||||
next_reclaimed =
|
|
||||||
SEQ_TO_SN(next_reclaimed + 0x10);
|
|
||||||
}
|
|
||||||
|
|
||||||
is_offchannel_skb =
|
is_offchannel_skb =
|
||||||
(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN);
|
(info->flags & IEEE80211_TX_CTL_TX_OFFCHAN);
|
||||||
freed++;
|
freed++;
|
||||||
|
@@ -1563,7 +1563,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|||||||
dev_err(adapter->dev, "SCAN_RESP: too many AP returned (%d)\n",
|
dev_err(adapter->dev, "SCAN_RESP: too many AP returned (%d)\n",
|
||||||
scan_rsp->number_of_sets);
|
scan_rsp->number_of_sets);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
goto done;
|
goto check_next_scan;
|
||||||
}
|
}
|
||||||
|
|
||||||
bytes_left = le16_to_cpu(scan_rsp->bss_descript_size);
|
bytes_left = le16_to_cpu(scan_rsp->bss_descript_size);
|
||||||
@@ -1634,7 +1634,8 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|||||||
if (!beacon_size || beacon_size > bytes_left) {
|
if (!beacon_size || beacon_size > bytes_left) {
|
||||||
bss_info += bytes_left;
|
bss_info += bytes_left;
|
||||||
bytes_left = 0;
|
bytes_left = 0;
|
||||||
return -1;
|
ret = -1;
|
||||||
|
goto check_next_scan;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the current working beacon pointer for this BSS
|
/* Initialize the current working beacon pointer for this BSS
|
||||||
@@ -1690,7 +1691,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|||||||
dev_err(priv->adapter->dev,
|
dev_err(priv->adapter->dev,
|
||||||
"%s: bytes left < IE length\n",
|
"%s: bytes left < IE length\n",
|
||||||
__func__);
|
__func__);
|
||||||
goto done;
|
goto check_next_scan;
|
||||||
}
|
}
|
||||||
if (element_id == WLAN_EID_DS_PARAMS) {
|
if (element_id == WLAN_EID_DS_PARAMS) {
|
||||||
channel = *(current_ptr + sizeof(struct ieee_types_header));
|
channel = *(current_ptr + sizeof(struct ieee_types_header));
|
||||||
@@ -1753,6 +1754,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check_next_scan:
|
||||||
spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
|
spin_lock_irqsave(&adapter->scan_pending_q_lock, flags);
|
||||||
if (list_empty(&adapter->scan_pending_q)) {
|
if (list_empty(&adapter->scan_pending_q)) {
|
||||||
spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
|
spin_unlock_irqrestore(&adapter->scan_pending_q_lock, flags);
|
||||||
@@ -1813,7 +1815,6 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
done:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -334,20 +334,20 @@ struct mwl8k_sta {
|
|||||||
#define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv))
|
#define MWL8K_STA(_sta) ((struct mwl8k_sta *)&((_sta)->drv_priv))
|
||||||
|
|
||||||
static const struct ieee80211_channel mwl8k_channels_24[] = {
|
static const struct ieee80211_channel mwl8k_channels_24[] = {
|
||||||
{ .center_freq = 2412, .hw_value = 1, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2412, .hw_value = 1, },
|
||||||
{ .center_freq = 2417, .hw_value = 2, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2417, .hw_value = 2, },
|
||||||
{ .center_freq = 2422, .hw_value = 3, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2422, .hw_value = 3, },
|
||||||
{ .center_freq = 2427, .hw_value = 4, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2427, .hw_value = 4, },
|
||||||
{ .center_freq = 2432, .hw_value = 5, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2432, .hw_value = 5, },
|
||||||
{ .center_freq = 2437, .hw_value = 6, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2437, .hw_value = 6, },
|
||||||
{ .center_freq = 2442, .hw_value = 7, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2442, .hw_value = 7, },
|
||||||
{ .center_freq = 2447, .hw_value = 8, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2447, .hw_value = 8, },
|
||||||
{ .center_freq = 2452, .hw_value = 9, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2452, .hw_value = 9, },
|
||||||
{ .center_freq = 2457, .hw_value = 10, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2457, .hw_value = 10, },
|
||||||
{ .center_freq = 2462, .hw_value = 11, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2462, .hw_value = 11, },
|
||||||
{ .center_freq = 2467, .hw_value = 12, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2467, .hw_value = 12, },
|
||||||
{ .center_freq = 2472, .hw_value = 13, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2472, .hw_value = 13, },
|
||||||
{ .center_freq = 2484, .hw_value = 14, },
|
{ .band = IEEE80211_BAND_2GHZ, .center_freq = 2484, .hw_value = 14, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ieee80211_rate mwl8k_rates_24[] = {
|
static const struct ieee80211_rate mwl8k_rates_24[] = {
|
||||||
@@ -368,10 +368,10 @@ static const struct ieee80211_rate mwl8k_rates_24[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct ieee80211_channel mwl8k_channels_50[] = {
|
static const struct ieee80211_channel mwl8k_channels_50[] = {
|
||||||
{ .center_freq = 5180, .hw_value = 36, },
|
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5180, .hw_value = 36, },
|
||||||
{ .center_freq = 5200, .hw_value = 40, },
|
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5200, .hw_value = 40, },
|
||||||
{ .center_freq = 5220, .hw_value = 44, },
|
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5220, .hw_value = 44, },
|
||||||
{ .center_freq = 5240, .hw_value = 48, },
|
{ .band = IEEE80211_BAND_5GHZ, .center_freq = 5240, .hw_value = 48, },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct ieee80211_rate mwl8k_rates_50[] = {
|
static const struct ieee80211_rate mwl8k_rates_50[] = {
|
||||||
|
@@ -1004,7 +1004,8 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
|
|||||||
is_tx ? "Tx" : "Rx");
|
is_tx ? "Tx" : "Rx");
|
||||||
|
|
||||||
if (is_tx) {
|
if (is_tx) {
|
||||||
rtl_lps_leave(hw);
|
schedule_work(&rtlpriv->
|
||||||
|
works.lps_leave_work);
|
||||||
ppsc->last_delaylps_stamp_jiffies =
|
ppsc->last_delaylps_stamp_jiffies =
|
||||||
jiffies;
|
jiffies;
|
||||||
}
|
}
|
||||||
@@ -1014,7 +1015,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
|
|||||||
}
|
}
|
||||||
} else if (ETH_P_ARP == ether_type) {
|
} else if (ETH_P_ARP == ether_type) {
|
||||||
if (is_tx) {
|
if (is_tx) {
|
||||||
rtl_lps_leave(hw);
|
schedule_work(&rtlpriv->works.lps_leave_work);
|
||||||
ppsc->last_delaylps_stamp_jiffies = jiffies;
|
ppsc->last_delaylps_stamp_jiffies = jiffies;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1024,7 +1025,7 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
|
|||||||
"802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
|
"802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
|
||||||
|
|
||||||
if (is_tx) {
|
if (is_tx) {
|
||||||
rtl_lps_leave(hw);
|
schedule_work(&rtlpriv->works.lps_leave_work);
|
||||||
ppsc->last_delaylps_stamp_jiffies = jiffies;
|
ppsc->last_delaylps_stamp_jiffies = jiffies;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -542,8 +542,8 @@ static void _rtl_rx_pre_process(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||||||
WARN_ON(skb_queue_empty(&rx_queue));
|
WARN_ON(skb_queue_empty(&rx_queue));
|
||||||
while (!skb_queue_empty(&rx_queue)) {
|
while (!skb_queue_empty(&rx_queue)) {
|
||||||
_skb = skb_dequeue(&rx_queue);
|
_skb = skb_dequeue(&rx_queue);
|
||||||
_rtl_usb_rx_process_agg(hw, skb);
|
_rtl_usb_rx_process_agg(hw, _skb);
|
||||||
ieee80211_rx_irqsafe(hw, skb);
|
ieee80211_rx_irqsafe(hw, _skb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -196,3 +196,15 @@ int ssb_gpio_init(struct ssb_bus *bus)
|
|||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ssb_gpio_unregister(struct ssb_bus *bus)
|
||||||
|
{
|
||||||
|
if (ssb_chipco_available(&bus->chipco) ||
|
||||||
|
ssb_extif_available(&bus->extif)) {
|
||||||
|
return gpiochip_remove(&bus->gpio);
|
||||||
|
} else {
|
||||||
|
SSB_WARN_ON(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
@@ -443,6 +443,15 @@ static void ssb_devices_unregister(struct ssb_bus *bus)
|
|||||||
|
|
||||||
void ssb_bus_unregister(struct ssb_bus *bus)
|
void ssb_bus_unregister(struct ssb_bus *bus)
|
||||||
{
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = ssb_gpio_unregister(bus);
|
||||||
|
if (err == -EBUSY)
|
||||||
|
ssb_dprintk(KERN_ERR PFX "Some GPIOs are still in use.\n");
|
||||||
|
else if (err)
|
||||||
|
ssb_dprintk(KERN_ERR PFX
|
||||||
|
"Can not unregister GPIO driver: %i\n", err);
|
||||||
|
|
||||||
ssb_buses_lock();
|
ssb_buses_lock();
|
||||||
ssb_devices_unregister(bus);
|
ssb_devices_unregister(bus);
|
||||||
list_del(&bus->list);
|
list_del(&bus->list);
|
||||||
|
@@ -267,11 +267,16 @@ static inline void ssb_extif_init(struct ssb_extif *extif)
|
|||||||
|
|
||||||
#ifdef CONFIG_SSB_DRIVER_GPIO
|
#ifdef CONFIG_SSB_DRIVER_GPIO
|
||||||
extern int ssb_gpio_init(struct ssb_bus *bus);
|
extern int ssb_gpio_init(struct ssb_bus *bus);
|
||||||
|
extern int ssb_gpio_unregister(struct ssb_bus *bus);
|
||||||
#else /* CONFIG_SSB_DRIVER_GPIO */
|
#else /* CONFIG_SSB_DRIVER_GPIO */
|
||||||
static inline int ssb_gpio_init(struct ssb_bus *bus)
|
static inline int ssb_gpio_init(struct ssb_bus *bus)
|
||||||
{
|
{
|
||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
}
|
}
|
||||||
|
static inline int ssb_gpio_unregister(struct ssb_bus *bus)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_SSB_DRIVER_GPIO */
|
#endif /* CONFIG_SSB_DRIVER_GPIO */
|
||||||
|
|
||||||
#endif /* LINUX_SSB_PRIVATE_H_ */
|
#endif /* LINUX_SSB_PRIVATE_H_ */
|
||||||
|
@@ -249,12 +249,12 @@ static void hci_conn_disconnect(struct hci_conn *conn)
|
|||||||
__u8 reason = hci_proto_disconn_ind(conn);
|
__u8 reason = hci_proto_disconn_ind(conn);
|
||||||
|
|
||||||
switch (conn->type) {
|
switch (conn->type) {
|
||||||
case ACL_LINK:
|
|
||||||
hci_acl_disconn(conn, reason);
|
|
||||||
break;
|
|
||||||
case AMP_LINK:
|
case AMP_LINK:
|
||||||
hci_amp_disconn(conn, reason);
|
hci_amp_disconn(conn, reason);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
hci_acl_disconn(conn, reason);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -859,6 +859,19 @@ int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb)
|
|||||||
|
|
||||||
skb_pull(skb, sizeof(code));
|
skb_pull(skb, sizeof(code));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The SMP context must be initialized for all other PDUs except
|
||||||
|
* pairing and security requests. If we get any other PDU when
|
||||||
|
* not initialized simply disconnect (done if this function
|
||||||
|
* returns an error).
|
||||||
|
*/
|
||||||
|
if (code != SMP_CMD_PAIRING_REQ && code != SMP_CMD_SECURITY_REQ &&
|
||||||
|
!conn->smp_chan) {
|
||||||
|
BT_ERR("Unexpected SMP command 0x%02x. Disconnecting.", code);
|
||||||
|
kfree_skb(skb);
|
||||||
|
return -ENOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case SMP_CMD_PAIRING_REQ:
|
case SMP_CMD_PAIRING_REQ:
|
||||||
reason = smp_cmd_pairing_req(conn, skb);
|
reason = smp_cmd_pairing_req(conn, skb);
|
||||||
|
@@ -2085,7 +2085,8 @@ static int ieee80211_set_mcast_rate(struct wiphy *wiphy, struct net_device *dev,
|
|||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
||||||
|
|
||||||
memcpy(sdata->vif.bss_conf.mcast_rate, rate, sizeof(rate));
|
memcpy(sdata->vif.bss_conf.mcast_rate, rate,
|
||||||
|
sizeof(int) * IEEE80211_NUM_BANDS);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -3462,6 +3462,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
|
out:
|
||||||
while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
|
while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
|
||||||
IEEE80211_CHAN_DISABLED)) {
|
IEEE80211_CHAN_DISABLED)) {
|
||||||
if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
|
if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
|
||||||
@@ -3470,14 +3471,13 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = chandef_downgrade(chandef);
|
ret |= chandef_downgrade(chandef);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chandef->width != vht_chandef.width)
|
if (chandef->width != vht_chandef.width)
|
||||||
sdata_info(sdata,
|
sdata_info(sdata,
|
||||||
"local regulatory prevented using AP HT/VHT configuration, downgraded\n");
|
"capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
|
||||||
|
|
||||||
out:
|
|
||||||
WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
|
WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -3591,8 +3591,11 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
|
|||||||
*/
|
*/
|
||||||
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
||||||
IEEE80211_CHANCTX_SHARED);
|
IEEE80211_CHANCTX_SHARED);
|
||||||
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT)
|
while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) {
|
||||||
ifmgd->flags |= chandef_downgrade(&chandef);
|
ifmgd->flags |= chandef_downgrade(&chandef);
|
||||||
|
ret = ieee80211_vif_use_channel(sdata, &chandef,
|
||||||
|
IEEE80211_CHANCTX_SHARED);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1404,7 +1404,7 @@ ieee80211_bss(struct wiphy *wiphy, struct iw_request_info *info,
|
|||||||
&iwe, IW_EV_UINT_LEN);
|
&iwe, IW_EV_UINT_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = kmalloc(30, GFP_ATOMIC);
|
buf = kmalloc(31, GFP_ATOMIC);
|
||||||
if (buf) {
|
if (buf) {
|
||||||
memset(&iwe, 0, sizeof(iwe));
|
memset(&iwe, 0, sizeof(iwe));
|
||||||
iwe.cmd = IWEVCUSTOM;
|
iwe.cmd = IWEVCUSTOM;
|
||||||
|
Reference in New Issue
Block a user