Commit 64db880e authored by David S. Miller's avatar David S. Miller
parents 5ca3b72c 7a73b08b
...@@ -169,10 +169,8 @@ int bcma_bus_register(struct bcma_bus *bus) ...@@ -169,10 +169,8 @@ int bcma_bus_register(struct bcma_bus *bus)
err = bcma_sprom_get(bus); err = bcma_sprom_get(bus);
if (err == -ENOENT) { if (err == -ENOENT) {
pr_err("No SPROM available\n"); pr_err("No SPROM available\n");
} else if (err) { } else if (err)
pr_err("Failed to get SPROM: %d\n", err); pr_err("Failed to get SPROM: %d\n", err);
return -ENOENT;
}
/* Register found cores */ /* Register found cores */
bcma_register_cores(bus); bcma_register_cores(bus);
......
...@@ -1037,13 +1037,16 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah) ...@@ -1037,13 +1037,16 @@ void ath9k_hw_init_global_settings(struct ath_hw *ah)
/* /*
* Workaround for early ACK timeouts, add an offset to match the * Workaround for early ACK timeouts, add an offset to match the
* initval's 64us ack timeout value. * initval's 64us ack timeout value. Use 48us for the CTS timeout.
* This was initially only meant to work around an issue with delayed * This was initially only meant to work around an issue with delayed
* BA frames in some implementations, but it has been found to fix ACK * BA frames in some implementations, but it has been found to fix ACK
* timeout issues in other cases as well. * timeout issues in other cases as well.
*/ */
if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) {
acktimeout += 64 - sifstime - ah->slottime; acktimeout += 64 - sifstime - ah->slottime;
ctstimeout += 48 - sifstime - ah->slottime;
}
ath9k_hw_set_sifs_time(ah, sifstime); ath9k_hw_set_sifs_time(ah, sifstime);
ath9k_hw_setslottime(ah, slottime); ath9k_hw_setslottime(ah, slottime);
......
...@@ -822,6 +822,11 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, ...@@ -822,6 +822,11 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc,
ARRAY_SIZE(ath9k_tpt_blink)); ARRAY_SIZE(ath9k_tpt_blink));
#endif #endif
INIT_WORK(&sc->hw_reset_work, ath_reset_work);
INIT_WORK(&sc->hw_check_work, ath_hw_check);
INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
/* Register with mac80211 */ /* Register with mac80211 */
error = ieee80211_register_hw(hw); error = ieee80211_register_hw(hw);
if (error) if (error)
...@@ -840,10 +845,6 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, ...@@ -840,10 +845,6 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc,
goto error_world; goto error_world;
} }
INIT_WORK(&sc->hw_reset_work, ath_reset_work);
INIT_WORK(&sc->hw_check_work, ath_hw_check);
INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
sc->last_rssi = ATH_RSSI_DUMMY_MARKER; sc->last_rssi = ATH_RSSI_DUMMY_MARKER;
ath_init_leds(sc); ath_init_leds(sc);
......
...@@ -694,7 +694,7 @@ static u8 ath_rc_get_highest_rix(struct ath_softc *sc, ...@@ -694,7 +694,7 @@ static u8 ath_rc_get_highest_rix(struct ath_softc *sc,
return rate; return rate;
/* This should not happen */ /* This should not happen */
WARN_ON(1); WARN_ON_ONCE(1);
rate = ath_rc_priv->valid_rate_index[0]; rate = ath_rc_priv->valid_rate_index[0];
......
...@@ -822,6 +822,14 @@ static bool ath9k_rx_accept(struct ath_common *common, ...@@ -822,6 +822,14 @@ static bool ath9k_rx_accept(struct ath_common *common,
(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC | (ATH9K_RXERR_DECRYPT | ATH9K_RXERR_CRC | ATH9K_RXERR_MIC |
ATH9K_RXERR_KEYMISS)); ATH9K_RXERR_KEYMISS));
/*
* Key miss events are only relevant for pairwise keys where the
* descriptor does contain a valid key index. This has been observed
* mostly with CCMP encryption.
*/
if (rx_stats->rs_keyix == ATH9K_RXKEYIX_INVALID)
rx_stats->rs_status &= ~ATH9K_RXERR_KEYMISS;
if (!rx_stats->rs_datalen) if (!rx_stats->rs_datalen)
return false; return false;
/* /*
......
...@@ -382,7 +382,8 @@ mwifiex_free_adapter(struct mwifiex_adapter *adapter) ...@@ -382,7 +382,8 @@ mwifiex_free_adapter(struct mwifiex_adapter *adapter)
adapter->if_ops.cleanup_if(adapter); adapter->if_ops.cleanup_if(adapter);
dev_kfree_skb_any(adapter->sleep_cfm); if (adapter->sleep_cfm)
dev_kfree_skb_any(adapter->sleep_cfm);
} }
/* /*
......
...@@ -822,7 +822,9 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem) ...@@ -822,7 +822,9 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
continue; continue;
rtnl_lock(); rtnl_lock();
mwifiex_del_virtual_intf(priv->wdev->wiphy, priv->netdev); if (priv->wdev && priv->netdev)
mwifiex_del_virtual_intf(priv->wdev->wiphy,
priv->netdev);
rtnl_unlock(); rtnl_unlock();
} }
...@@ -830,9 +832,11 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem) ...@@ -830,9 +832,11 @@ int mwifiex_remove_card(struct mwifiex_adapter *adapter, struct semaphore *sem)
if (!priv) if (!priv)
goto exit_remove; goto exit_remove;
wiphy_unregister(priv->wdev->wiphy); if (priv->wdev) {
wiphy_free(priv->wdev->wiphy); wiphy_unregister(priv->wdev->wiphy);
kfree(priv->wdev); wiphy_free(priv->wdev->wiphy);
kfree(priv->wdev);
}
mwifiex_terminate_workqueue(adapter); mwifiex_terminate_workqueue(adapter);
......
...@@ -54,7 +54,7 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist, ...@@ -54,7 +54,7 @@ int mwifiex_copy_mcast_addr(struct mwifiex_multicast_list *mlist,
int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter) int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
{ {
bool cancel_flag = false; bool cancel_flag = false;
int status = adapter->cmd_wait_q.status; int status;
struct cmd_ctrl_node *cmd_queued; struct cmd_ctrl_node *cmd_queued;
if (!adapter->cmd_queued) if (!adapter->cmd_queued)
...@@ -79,6 +79,8 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter) ...@@ -79,6 +79,8 @@ int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter)
mwifiex_cancel_pending_ioctl(adapter); mwifiex_cancel_pending_ioctl(adapter);
dev_dbg(adapter->dev, "cmd cancel\n"); dev_dbg(adapter->dev, "cmd cancel\n");
} }
status = adapter->cmd_wait_q.status;
adapter->cmd_wait_q.status = 0; adapter->cmd_wait_q.status = 0;
return status; return status;
...@@ -240,6 +242,8 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, ...@@ -240,6 +242,8 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
if (!netif_queue_stopped(priv->netdev)) if (!netif_queue_stopped(priv->netdev))
mwifiex_stop_net_dev_queue(priv->netdev, adapter); mwifiex_stop_net_dev_queue(priv->netdev, adapter);
if (netif_carrier_ok(priv->netdev))
netif_carrier_off(priv->netdev);
/* Clear any past association response stored for /* Clear any past association response stored for
* application retrieval */ * application retrieval */
...@@ -271,6 +275,8 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, ...@@ -271,6 +275,8 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
if (!netif_queue_stopped(priv->netdev)) if (!netif_queue_stopped(priv->netdev))
mwifiex_stop_net_dev_queue(priv->netdev, adapter); mwifiex_stop_net_dev_queue(priv->netdev, adapter);
if (netif_carrier_ok(priv->netdev))
netif_carrier_off(priv->netdev);
if (!ret) { if (!ret) {
dev_dbg(adapter->dev, "info: network found in scan" dev_dbg(adapter->dev, "info: network found in scan"
......
...@@ -866,6 +866,14 @@ static int fill_ctrlset(struct zd_mac *mac, ...@@ -866,6 +866,14 @@ static int fill_ctrlset(struct zd_mac *mac,
ZD_ASSERT(frag_len <= 0xffff); ZD_ASSERT(frag_len <= 0xffff);
/*
* Firmware computes the duration itself (for all frames except PSPoll)
* and needs the field set to 0 at input, otherwise firmware messes up
* duration_id and sets bits 14 and 15 on.
*/
if (!ieee80211_is_pspoll(hdr->frame_control))
hdr->duration_id = 0;
txrate = ieee80211_get_tx_rate(mac->hw, info); txrate = ieee80211_get_tx_rate(mac->hw, info);
cs->modulation = txrate->hw_value; cs->modulation = txrate->hw_value;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment