diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2008-10-14 13:17:54 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2008-10-31 19:00:14 -0400 |
commit | 9124b07740c51cbc6e358dd0c4abc6ee8ded084d (patch) | |
tree | 5746885ca90399588f0735aa1a5511648f0be329 /drivers/net/wireless/b43legacy/main.c | |
parent | 525181891fb5ed323b6ba0f141c422f1395acfb9 (diff) |
mac80211: make retry limits part of hw config
Instead of having a separate callback, use the HW config callback
with a new flag to change retry limits.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/b43legacy/main.c')
-rw-r--r-- | drivers/net/wireless/b43legacy/main.c | 59 |
1 files changed, 22 insertions, 37 deletions
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 793cc396562f..78e46365f69e 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -2556,6 +2556,20 @@ init_failure: | |||
2556 | return err; | 2556 | return err; |
2557 | } | 2557 | } |
2558 | 2558 | ||
2559 | /* Write the short and long frame retry limit values. */ | ||
2560 | static void b43legacy_set_retry_limits(struct b43legacy_wldev *dev, | ||
2561 | unsigned int short_retry, | ||
2562 | unsigned int long_retry) | ||
2563 | { | ||
2564 | /* The retry limit is a 4-bit counter. Enforce this to avoid overflowing | ||
2565 | * the chip-internal counter. */ | ||
2566 | short_retry = min(short_retry, (unsigned int)0xF); | ||
2567 | long_retry = min(long_retry, (unsigned int)0xF); | ||
2568 | |||
2569 | b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0006, short_retry); | ||
2570 | b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0007, long_retry); | ||
2571 | } | ||
2572 | |||
2559 | static int b43legacy_op_dev_config(struct ieee80211_hw *hw, | 2573 | static int b43legacy_op_dev_config(struct ieee80211_hw *hw, |
2560 | u32 changed) | 2574 | u32 changed) |
2561 | { | 2575 | { |
@@ -2577,6 +2591,14 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw, | |||
2577 | dev = wl->current_dev; | 2591 | dev = wl->current_dev; |
2578 | phy = &dev->phy; | 2592 | phy = &dev->phy; |
2579 | 2593 | ||
2594 | if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) | ||
2595 | b43legacy_set_retry_limits(dev, | ||
2596 | conf->short_frame_max_tx_count, | ||
2597 | conf->long_frame_max_tx_count); | ||
2598 | changed &= ~IEEE80211_CONF_CHANGE_RETRY_LIMITS; | ||
2599 | if (!changed) | ||
2600 | goto out_unlock_mutex; | ||
2601 | |||
2580 | /* Switch the PHY mode (if necessary). */ | 2602 | /* Switch the PHY mode (if necessary). */ |
2581 | switch (conf->channel->band) { | 2603 | switch (conf->channel->band) { |
2582 | case IEEE80211_BAND_2GHZ: | 2604 | case IEEE80211_BAND_2GHZ: |
@@ -2989,20 +3011,6 @@ static void b43legacy_imcfglo_timeouts_workaround(struct b43legacy_wldev *dev) | |||
2989 | #endif /* CONFIG_SSB_DRIVER_PCICORE */ | 3011 | #endif /* CONFIG_SSB_DRIVER_PCICORE */ |
2990 | } | 3012 | } |
2991 | 3013 | ||
2992 | /* Write the short and long frame retry limit values. */ | ||
2993 | static void b43legacy_set_retry_limits(struct b43legacy_wldev *dev, | ||
2994 | unsigned int short_retry, | ||
2995 | unsigned int long_retry) | ||
2996 | { | ||
2997 | /* The retry limit is a 4-bit counter. Enforce this to avoid overflowing | ||
2998 | * the chip-internal counter. */ | ||
2999 | short_retry = min(short_retry, (unsigned int)0xF); | ||
3000 | long_retry = min(long_retry, (unsigned int)0xF); | ||
3001 | |||
3002 | b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0006, short_retry); | ||
3003 | b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, 0x0007, long_retry); | ||
3004 | } | ||
3005 | |||
3006 | static void b43legacy_set_synth_pu_delay(struct b43legacy_wldev *dev, | 3014 | static void b43legacy_set_synth_pu_delay(struct b43legacy_wldev *dev, |
3007 | bool idle) { | 3015 | bool idle) { |
3008 | u16 pu_delay = 1050; | 3016 | u16 pu_delay = 1050; |
@@ -3367,28 +3375,6 @@ static void b43legacy_op_stop(struct ieee80211_hw *hw) | |||
3367 | mutex_unlock(&wl->mutex); | 3375 | mutex_unlock(&wl->mutex); |
3368 | } | 3376 | } |
3369 | 3377 | ||
3370 | static int b43legacy_op_set_retry_limit(struct ieee80211_hw *hw, | ||
3371 | u32 short_retry_limit, | ||
3372 | u32 long_retry_limit) | ||
3373 | { | ||
3374 | struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); | ||
3375 | struct b43legacy_wldev *dev; | ||
3376 | int err = 0; | ||
3377 | |||
3378 | mutex_lock(&wl->mutex); | ||
3379 | dev = wl->current_dev; | ||
3380 | if (unlikely(!dev || | ||
3381 | (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED))) { | ||
3382 | err = -ENODEV; | ||
3383 | goto out_unlock; | ||
3384 | } | ||
3385 | b43legacy_set_retry_limits(dev, short_retry_limit, long_retry_limit); | ||
3386 | out_unlock: | ||
3387 | mutex_unlock(&wl->mutex); | ||
3388 | |||
3389 | return err; | ||
3390 | } | ||
3391 | |||
3392 | static int b43legacy_op_beacon_set_tim(struct ieee80211_hw *hw, | 3378 | static int b43legacy_op_beacon_set_tim(struct ieee80211_hw *hw, |
3393 | struct ieee80211_sta *sta, bool set) | 3379 | struct ieee80211_sta *sta, bool set) |
3394 | { | 3380 | { |
@@ -3414,7 +3400,6 @@ static const struct ieee80211_ops b43legacy_hw_ops = { | |||
3414 | .get_tx_stats = b43legacy_op_get_tx_stats, | 3400 | .get_tx_stats = b43legacy_op_get_tx_stats, |
3415 | .start = b43legacy_op_start, | 3401 | .start = b43legacy_op_start, |
3416 | .stop = b43legacy_op_stop, | 3402 | .stop = b43legacy_op_stop, |
3417 | .set_retry_limit = b43legacy_op_set_retry_limit, | ||
3418 | .set_tim = b43legacy_op_beacon_set_tim, | 3403 | .set_tim = b43legacy_op_beacon_set_tim, |
3419 | }; | 3404 | }; |
3420 | 3405 | ||