diff options
Diffstat (limited to 'drivers/net/wireless/ath5k/base.c')
-rw-r--r-- | drivers/net/wireless/ath5k/base.c | 46 |
1 files changed, 25 insertions, 21 deletions
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index cad3ccf61b00..5d57d774e466 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -685,13 +685,6 @@ ath5k_pci_resume(struct pci_dev *pdev) | |||
685 | if (err) | 685 | if (err) |
686 | return err; | 686 | return err; |
687 | 687 | ||
688 | /* | ||
689 | * Suspend/Resume resets the PCI configuration space, so we have to | ||
690 | * re-disable the RETRY_TIMEOUT register (0x41) to keep | ||
691 | * PCI Tx retries from interfering with C3 CPU state | ||
692 | */ | ||
693 | pci_write_config_byte(pdev, 0x41, 0); | ||
694 | |||
695 | err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); | 688 | err = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc); |
696 | if (err) { | 689 | if (err) { |
697 | ATH5K_ERR(sc, "request_irq failed\n"); | 690 | ATH5K_ERR(sc, "request_irq failed\n"); |
@@ -1095,9 +1088,18 @@ ath5k_mode_setup(struct ath5k_softc *sc) | |||
1095 | static inline int | 1088 | static inline int |
1096 | ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix) | 1089 | ath5k_hw_to_driver_rix(struct ath5k_softc *sc, int hw_rix) |
1097 | { | 1090 | { |
1098 | WARN(hw_rix < 0 || hw_rix >= AR5K_MAX_RATES, | 1091 | int rix; |
1099 | "hw_rix out of bounds: %x\n", hw_rix); | 1092 | |
1100 | return sc->rate_idx[sc->curband->band][hw_rix]; | 1093 | /* return base rate on errors */ |
1094 | if (WARN(hw_rix < 0 || hw_rix >= AR5K_MAX_RATES, | ||
1095 | "hw_rix out of bounds: %x\n", hw_rix)) | ||
1096 | return 0; | ||
1097 | |||
1098 | rix = sc->rate_idx[sc->curband->band][hw_rix]; | ||
1099 | if (WARN(rix < 0, "invalid hw_rix: %x\n", hw_rix)) | ||
1100 | rix = 0; | ||
1101 | |||
1102 | return rix; | ||
1101 | } | 1103 | } |
1102 | 1104 | ||
1103 | /***************\ | 1105 | /***************\ |
@@ -1216,6 +1218,9 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) | |||
1216 | 1218 | ||
1217 | pktlen = skb->len; | 1219 | pktlen = skb->len; |
1218 | 1220 | ||
1221 | /* FIXME: If we are in g mode and rate is a CCK rate | ||
1222 | * subtract ah->ah_txpower.txp_cck_ofdm_pwr_delta | ||
1223 | * from tx power (value is in dB units already) */ | ||
1219 | if (info->control.hw_key) { | 1224 | if (info->control.hw_key) { |
1220 | keyidx = info->control.hw_key->hw_key_idx; | 1225 | keyidx = info->control.hw_key->hw_key_idx; |
1221 | pktlen += info->control.hw_key->icv_len; | 1226 | pktlen += info->control.hw_key->icv_len; |
@@ -2044,6 +2049,9 @@ ath5k_beacon_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) | |||
2044 | antenna = sc->bsent & 4 ? 2 : 1; | 2049 | antenna = sc->bsent & 4 ? 2 : 1; |
2045 | } | 2050 | } |
2046 | 2051 | ||
2052 | /* FIXME: If we are in g mode and rate is a CCK rate | ||
2053 | * subtract ah->ah_txpower.txp_cck_ofdm_pwr_delta | ||
2054 | * from tx power (value is in dB units already) */ | ||
2047 | ds->ds_data = bf->skbaddr; | 2055 | ds->ds_data = bf->skbaddr; |
2048 | ret = ah->ah_setup_tx_desc(ah, ds, skb->len, | 2056 | ret = ah->ah_setup_tx_desc(ah, ds, skb->len, |
2049 | ieee80211_get_hdrlen_from_skb(skb), | 2057 | ieee80211_get_hdrlen_from_skb(skb), |
@@ -2305,7 +2313,7 @@ ath5k_init(struct ath5k_softc *sc) | |||
2305 | sc->curband = &sc->sbands[sc->curchan->band]; | 2313 | sc->curband = &sc->sbands[sc->curchan->band]; |
2306 | sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL | | 2314 | sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL | |
2307 | AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL | | 2315 | AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL | |
2308 | AR5K_INT_FATAL | AR5K_INT_GLOBAL | AR5K_INT_MIB; | 2316 | AR5K_INT_FATAL | AR5K_INT_GLOBAL; |
2309 | ret = ath5k_reset(sc, false, false); | 2317 | ret = ath5k_reset(sc, false, false); |
2310 | if (ret) | 2318 | if (ret) |
2311 | goto done; | 2319 | goto done; |
@@ -2554,7 +2562,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
2554 | if (skb_headroom(skb) < padsize) { | 2562 | if (skb_headroom(skb) < padsize) { |
2555 | ATH5K_ERR(sc, "tx hdrlen not %%4: %d not enough" | 2563 | ATH5K_ERR(sc, "tx hdrlen not %%4: %d not enough" |
2556 | " headroom to pad %d\n", hdrlen, padsize); | 2564 | " headroom to pad %d\n", hdrlen, padsize); |
2557 | return NETDEV_TX_BUSY; | 2565 | goto drop_packet; |
2558 | } | 2566 | } |
2559 | skb_push(skb, padsize); | 2567 | skb_push(skb, padsize); |
2560 | memmove(skb->data, skb->data+padsize, hdrlen); | 2568 | memmove(skb->data, skb->data+padsize, hdrlen); |
@@ -2565,7 +2573,7 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
2565 | ATH5K_ERR(sc, "no further txbuf available, dropping packet\n"); | 2573 | ATH5K_ERR(sc, "no further txbuf available, dropping packet\n"); |
2566 | spin_unlock_irqrestore(&sc->txbuflock, flags); | 2574 | spin_unlock_irqrestore(&sc->txbuflock, flags); |
2567 | ieee80211_stop_queue(hw, skb_get_queue_mapping(skb)); | 2575 | ieee80211_stop_queue(hw, skb_get_queue_mapping(skb)); |
2568 | return NETDEV_TX_BUSY; | 2576 | goto drop_packet; |
2569 | } | 2577 | } |
2570 | bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list); | 2578 | bf = list_first_entry(&sc->txbuf, struct ath5k_buf, list); |
2571 | list_del(&bf->list); | 2579 | list_del(&bf->list); |
@@ -2582,10 +2590,12 @@ ath5k_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
2582 | list_add_tail(&bf->list, &sc->txbuf); | 2590 | list_add_tail(&bf->list, &sc->txbuf); |
2583 | sc->txbuf_len++; | 2591 | sc->txbuf_len++; |
2584 | spin_unlock_irqrestore(&sc->txbuflock, flags); | 2592 | spin_unlock_irqrestore(&sc->txbuflock, flags); |
2585 | dev_kfree_skb_any(skb); | 2593 | goto drop_packet; |
2586 | return NETDEV_TX_OK; | ||
2587 | } | 2594 | } |
2595 | return NETDEV_TX_OK; | ||
2588 | 2596 | ||
2597 | drop_packet: | ||
2598 | dev_kfree_skb_any(skb); | ||
2589 | return NETDEV_TX_OK; | 2599 | return NETDEV_TX_OK; |
2590 | } | 2600 | } |
2591 | 2601 | ||
@@ -2608,12 +2618,6 @@ ath5k_reset(struct ath5k_softc *sc, bool stop, bool change_channel) | |||
2608 | goto err; | 2618 | goto err; |
2609 | } | 2619 | } |
2610 | 2620 | ||
2611 | /* | ||
2612 | * This is needed only to setup initial state | ||
2613 | * but it's best done after a reset. | ||
2614 | */ | ||
2615 | ath5k_hw_set_txpower_limit(sc->ah, 0); | ||
2616 | |||
2617 | ret = ath5k_rx_start(sc); | 2621 | ret = ath5k_rx_start(sc); |
2618 | if (ret) { | 2622 | if (ret) { |
2619 | ATH5K_ERR(sc, "can't start recv logic\n"); | 2623 | ATH5K_ERR(sc, "can't start recv logic\n"); |