git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ath9k: Fix TX poll cancelling
[pandora-kernel.git]
/
drivers
/
net
/
wireless
/
ath
/
ath9k
/
main.c
diff --git
a/drivers/net/wireless/ath/ath9k/main.c
b/drivers/net/wireless/ath/ath9k/main.c
index
a9e43f7
..
fddda20
100644
(file)
--- a/
drivers/net/wireless/ath/ath9k/main.c
+++ b/
drivers/net/wireless/ath/ath9k/main.c
@@
-968,9
+968,9
@@
static void ath_led_blink_work(struct work_struct *work)
if ((sc->led_on_duration == ATH_LED_ON_DURATION_IDLE) ||
(sc->led_off_duration == ATH_LED_OFF_DURATION_IDLE))
if ((sc->led_on_duration == ATH_LED_ON_DURATION_IDLE) ||
(sc->led_off_duration == ATH_LED_OFF_DURATION_IDLE))
- ath9k_hw_set_gpio(sc->sc_ah,
ATH_LED_PIN
, 0);
+ ath9k_hw_set_gpio(sc->sc_ah,
sc->sc_ah->led_pin
, 0);
else
else
- ath9k_hw_set_gpio(sc->sc_ah,
ATH_LED_PIN
,
+ ath9k_hw_set_gpio(sc->sc_ah,
sc->sc_ah->led_pin
,
(sc->sc_flags & SC_OP_LED_ON) ? 1 : 0);
ieee80211_queue_delayed_work(sc->hw,
(sc->sc_flags & SC_OP_LED_ON) ? 1 : 0);
ieee80211_queue_delayed_work(sc->hw,
@@
-1002,7
+1002,7
@@
static void ath_led_brightness(struct led_classdev *led_cdev,
case LED_OFF:
if (led->led_type == ATH_LED_ASSOC ||
led->led_type == ATH_LED_RADIO) {
case LED_OFF:
if (led->led_type == ATH_LED_ASSOC ||
led->led_type == ATH_LED_RADIO) {
- ath9k_hw_set_gpio(sc->sc_ah,
ATH_LED_PIN
,
+ ath9k_hw_set_gpio(sc->sc_ah,
sc->sc_ah->led_pin
,
(led->led_type == ATH_LED_RADIO));
sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
if (led->led_type == ATH_LED_RADIO)
(led->led_type == ATH_LED_RADIO));
sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
if (led->led_type == ATH_LED_RADIO)
@@
-1017,7
+1017,7
@@
static void ath_led_brightness(struct led_classdev *led_cdev,
ieee80211_queue_delayed_work(sc->hw,
&sc->ath_led_blink_work, 0);
} else if (led->led_type == ATH_LED_RADIO) {
ieee80211_queue_delayed_work(sc->hw,
&sc->ath_led_blink_work, 0);
} else if (led->led_type == ATH_LED_RADIO) {
- ath9k_hw_set_gpio(sc->sc_ah,
ATH_LED_PIN
, 0);
+ ath9k_hw_set_gpio(sc->sc_ah,
sc->sc_ah->led_pin
, 0);
sc->sc_flags |= SC_OP_LED_ON;
} else {
sc->led_on_cnt++;
sc->sc_flags |= SC_OP_LED_ON;
} else {
sc->led_on_cnt++;
@@
-1062,7
+1062,7
@@
static void ath_deinit_leds(struct ath_softc *sc)
ath_unregister_led(&sc->tx_led);
ath_unregister_led(&sc->rx_led);
ath_unregister_led(&sc->radio_led);
ath_unregister_led(&sc->tx_led);
ath_unregister_led(&sc->rx_led);
ath_unregister_led(&sc->radio_led);
- ath9k_hw_set_gpio(sc->sc_ah,
ATH_LED_PIN
, 1);
+ ath9k_hw_set_gpio(sc->sc_ah,
sc->sc_ah->led_pin
, 1);
}
static void ath_init_leds(struct ath_softc *sc)
}
static void ath_init_leds(struct ath_softc *sc)
@@
-1070,11
+1070,16
@@
static void ath_init_leds(struct ath_softc *sc)
char *trigger;
int ret;
char *trigger;
int ret;
+ if (AR_SREV_9287(sc->sc_ah))
+ sc->sc_ah->led_pin = ATH_LED_PIN_9287;
+ else
+ sc->sc_ah->led_pin = ATH_LED_PIN_DEF;
+
/* Configure gpio 1 for output */
/* Configure gpio 1 for output */
- ath9k_hw_cfg_output(sc->sc_ah,
ATH_LED_PIN
,
+ ath9k_hw_cfg_output(sc->sc_ah,
sc->sc_ah->led_pin
,
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
/* LED off, active low */
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
/* LED off, active low */
- ath9k_hw_set_gpio(sc->sc_ah,
ATH_LED_PIN
, 1);
+ ath9k_hw_set_gpio(sc->sc_ah,
sc->sc_ah->led_pin
, 1);
INIT_DELAYED_WORK(&sc->ath_led_blink_work, ath_led_blink_work);
INIT_DELAYED_WORK(&sc->ath_led_blink_work, ath_led_blink_work);
@@
-1153,9
+1158,9
@@
void ath_radio_enable(struct ath_softc *sc)
ath9k_hw_set_interrupts(ah, sc->imask);
/* Enable LED */
ath9k_hw_set_interrupts(ah, sc->imask);
/* Enable LED */
- ath9k_hw_cfg_output(ah,
ATH_LED_PIN
,
+ ath9k_hw_cfg_output(ah,
ah->led_pin
,
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
- ath9k_hw_set_gpio(ah,
ATH_LED_PIN
, 0);
+ ath9k_hw_set_gpio(ah,
ah->led_pin
, 0);
ieee80211_wake_queues(sc->hw);
ath9k_ps_restore(sc);
ieee80211_wake_queues(sc->hw);
ath9k_ps_restore(sc);
@@
-1171,8
+1176,8
@@
void ath_radio_disable(struct ath_softc *sc)
ieee80211_stop_queues(sc->hw);
/* Disable LED */
ieee80211_stop_queues(sc->hw);
/* Disable LED */
- ath9k_hw_set_gpio(ah,
ATH_LED_PIN
, 1);
- ath9k_hw_cfg_gpio_input(ah,
ATH_LED_PIN
);
+ ath9k_hw_set_gpio(ah,
ah->led_pin
, 1);
+ ath9k_hw_cfg_gpio_input(ah,
ah->led_pin
);
/* Disable interrupts */
ath9k_hw_set_interrupts(ah, 0);
/* Disable interrupts */
ath9k_hw_set_interrupts(ah, 0);
@@
-1327,7
+1332,7
@@
static int ath_init_softc(u16 devid, struct ath_softc *sc)
*/
ath_read_cachesize(sc, &csz);
/* XXX assert csz is non-zero */
*/
ath_read_cachesize(sc, &csz);
/* XXX assert csz is non-zero */
- sc->c
achelsz = csz << 2;
/* convert to bytes */
+ sc->c
ommon.cachelsz = csz << 2;
/* convert to bytes */
ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
if (!ah) {
ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
if (!ah) {
@@
-2100,6
+2105,8
@@
static void ath9k_stop(struct ieee80211_hw *hw)
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
+ mutex_lock(&sc->mutex);
+
aphy->state = ATH_WIPHY_INACTIVE;
cancel_delayed_work_sync(&sc->ath_led_blink_work);
aphy->state = ATH_WIPHY_INACTIVE;
cancel_delayed_work_sync(&sc->ath_led_blink_work);
@@
-2112,13
+2119,10
@@
static void ath9k_stop(struct ieee80211_hw *hw)
if (sc->sc_flags & SC_OP_INVALID) {
DPRINTF(sc, ATH_DBG_ANY, "Device not present\n");
if (sc->sc_flags & SC_OP_INVALID) {
DPRINTF(sc, ATH_DBG_ANY, "Device not present\n");
+ mutex_unlock(&sc->mutex);
return;
}
return;
}
- mutex_lock(&sc->mutex);
-
- cancel_delayed_work_sync(&sc->tx_complete_work);
-
if (ath9k_wiphy_started(sc)) {
mutex_unlock(&sc->mutex);
return; /* another wiphy still in use */
if (ath9k_wiphy_started(sc)) {
mutex_unlock(&sc->mutex);
return; /* another wiphy still in use */
@@
-2140,6
+2144,7
@@
static void ath9k_stop(struct ieee80211_hw *hw)
/* disable HAL and put h/w to sleep */
ath9k_hw_disable(sc->sc_ah);
ath9k_hw_configpcipowersave(sc->sc_ah, 1);
/* disable HAL and put h/w to sleep */
ath9k_hw_disable(sc->sc_ah);
ath9k_hw_configpcipowersave(sc->sc_ah, 1);
+ ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
sc->sc_flags |= SC_OP_INVALID;
sc->sc_flags |= SC_OP_INVALID;
@@
-2214,8
+2219,7
@@
static int ath9k_add_interface(struct ieee80211_hw *hw,
if ((conf->type == NL80211_IFTYPE_STATION) ||
(conf->type == NL80211_IFTYPE_ADHOC) ||
(conf->type == NL80211_IFTYPE_MESH_POINT)) {
if ((conf->type == NL80211_IFTYPE_STATION) ||
(conf->type == NL80211_IFTYPE_ADHOC) ||
(conf->type == NL80211_IFTYPE_MESH_POINT)) {
- if (ath9k_hw_phycounters(sc->sc_ah))
- sc->imask |= ATH9K_INT_MIB;
+ sc->imask |= ATH9K_INT_MIB;
sc->imask |= ATH9K_INT_TSFOOR;
}
sc->imask |= ATH9K_INT_TSFOOR;
}
@@
-2380,6
+2384,7
@@
skip_chan_change:
(FIF_PROMISC_IN_BSS | \
FIF_ALLMULTI | \
FIF_CONTROL | \
(FIF_PROMISC_IN_BSS | \
FIF_ALLMULTI | \
FIF_CONTROL | \
+ FIF_PSPOLL | \
FIF_OTHER_BSS | \
FIF_BCN_PRBRESP_PROMISC | \
FIF_FCSFAIL)
FIF_OTHER_BSS | \
FIF_BCN_PRBRESP_PROMISC | \
FIF_FCSFAIL)
@@
-2388,8
+2393,7
@@
skip_chan_change:
static void ath9k_configure_filter(struct ieee80211_hw *hw,
unsigned int changed_flags,
unsigned int *total_flags,
static void ath9k_configure_filter(struct ieee80211_hw *hw,
unsigned int changed_flags,
unsigned int *total_flags,
- int mc_count,
- struct dev_mc_list *mclist)
+ u64 multicast)
{
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;
{
struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc;