aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMichael Buesch <mb@bu3sch.de>2007-10-28 11:19:44 -0400
committerDavid S. Miller <davem@davemloft.net>2008-01-28 18:03:30 -0500
commit74cfdba7ce7b601559a4bcdc9054baf1bdc6948d (patch)
tree72eef3f57fbc3cf4d2170a45a179e7d89a5c5429 /drivers
parentc6dfc9a8ec236957eea3a1cf4613e90c45e1475b (diff)
b43: Use the retry limit parameters from mac80211
Use the limits provided by mac80211. Signed-off-by: Michael Buesch <mb@bu3sch.de> Cc: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/b43/main.c80
-rw-r--r--drivers/net/wireless/b43/xmit.c3
2 files changed, 53 insertions, 30 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 9568ab17fe71..178ad9120107 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -75,14 +75,6 @@ module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
75MODULE_PARM_DESC(bad_frames_preempt, 75MODULE_PARM_DESC(bad_frames_preempt,
76 "enable(1) / disable(0) Bad Frames Preemption"); 76 "enable(1) / disable(0) Bad Frames Preemption");
77 77
78static int modparam_short_retry = B43_DEFAULT_SHORT_RETRY_LIMIT;
79module_param_named(short_retry, modparam_short_retry, int, 0444);
80MODULE_PARM_DESC(short_retry, "Short-Retry-Limit (0 - 15)");
81
82static int modparam_long_retry = B43_DEFAULT_LONG_RETRY_LIMIT;
83module_param_named(long_retry, modparam_long_retry, int, 0444);
84MODULE_PARM_DESC(long_retry, "Long-Retry-Limit (0 - 15)");
85
86static char modparam_fwpostfix[16]; 78static char modparam_fwpostfix[16];
87module_param_string(fwpostfix, modparam_fwpostfix, 16, 0444); 79module_param_string(fwpostfix, modparam_fwpostfix, 16, 0444);
88MODULE_PARM_DESC(fwpostfix, "Postfix for the .fw files to load."); 80MODULE_PARM_DESC(fwpostfix, "Postfix for the .fw files to load.");
@@ -3257,6 +3249,22 @@ static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev)
3257#endif /* CONFIG_SSB_DRIVER_PCICORE */ 3249#endif /* CONFIG_SSB_DRIVER_PCICORE */
3258} 3250}
3259 3251
3252/* Write the short and long frame retry limit values. */
3253static void b43_set_retry_limits(struct b43_wldev *dev,
3254 unsigned int short_retry,
3255 unsigned int long_retry)
3256{
3257 /* The retry limit is a 4-bit counter. Enforce this to avoid overflowing
3258 * the chip-internal counter. */
3259 short_retry = min(short_retry, (unsigned int)0xF);
3260 long_retry = min(long_retry, (unsigned int)0xF);
3261
3262 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_SRLIMIT,
3263 short_retry);
3264 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_LRLIMIT,
3265 long_retry);
3266}
3267
3260/* Shutdown a wireless core */ 3268/* Shutdown a wireless core */
3261/* Locking: wl->mutex */ 3269/* Locking: wl->mutex */
3262static void b43_wireless_core_exit(struct b43_wldev *dev) 3270static void b43_wireless_core_exit(struct b43_wldev *dev)
@@ -3342,15 +3350,8 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
3342 } 3350 }
3343 b43_hf_write(dev, hf); 3351 b43_hf_write(dev, hf);
3344 3352
3345 /* Short/Long Retry Limit. 3353 b43_set_retry_limits(dev, B43_DEFAULT_SHORT_RETRY_LIMIT,
3346 * The retry-limit is a 4-bit counter. Enforce this to avoid overflowing 3354 B43_DEFAULT_LONG_RETRY_LIMIT);
3347 * the chip-internal counter.
3348 */
3349 tmp = limit_value(modparam_short_retry, 0, 0xF);
3350 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_SRLIMIT, tmp);
3351 tmp = limit_value(modparam_long_retry, 0, 0xF);
3352 b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_LRLIMIT, tmp);
3353
3354 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SFFBLIM, 3); 3355 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SFFBLIM, 3);
3355 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_LFFBLIM, 2); 3356 b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_LFFBLIM, 2);
3356 3357
@@ -3533,19 +3534,40 @@ static void b43_stop(struct ieee80211_hw *hw)
3533 mutex_unlock(&wl->mutex); 3534 mutex_unlock(&wl->mutex);
3534} 3535}
3535 3536
3537static int b43_op_set_retry_limit(struct ieee80211_hw *hw,
3538 u32 short_retry_limit, u32 long_retry_limit)
3539{
3540 struct b43_wl *wl = hw_to_b43_wl(hw);
3541 struct b43_wldev *dev;
3542 int err = 0;
3543
3544 mutex_lock(&wl->mutex);
3545 dev = wl->current_dev;
3546 if (unlikely(!dev || (b43_status(dev) < B43_STAT_INITIALIZED))) {
3547 err = -ENODEV;
3548 goto out_unlock;
3549 }
3550 b43_set_retry_limits(dev, short_retry_limit, long_retry_limit);
3551out_unlock:
3552 mutex_unlock(&wl->mutex);
3553
3554 return err;
3555}
3556
3536static const struct ieee80211_ops b43_hw_ops = { 3557static const struct ieee80211_ops b43_hw_ops = {
3537 .tx = b43_tx, 3558 .tx = b43_tx,
3538 .conf_tx = b43_conf_tx, 3559 .conf_tx = b43_conf_tx,
3539 .add_interface = b43_add_interface, 3560 .add_interface = b43_add_interface,
3540 .remove_interface = b43_remove_interface, 3561 .remove_interface = b43_remove_interface,
3541 .config = b43_dev_config, 3562 .config = b43_dev_config,
3542 .config_interface = b43_config_interface, 3563 .config_interface = b43_config_interface,
3543 .configure_filter = b43_configure_filter, 3564 .configure_filter = b43_configure_filter,
3544 .set_key = b43_dev_set_key, 3565 .set_key = b43_dev_set_key,
3545 .get_stats = b43_get_stats, 3566 .get_stats = b43_get_stats,
3546 .get_tx_stats = b43_get_tx_stats, 3567 .get_tx_stats = b43_get_tx_stats,
3547 .start = b43_start, 3568 .start = b43_start,
3548 .stop = b43_stop, 3569 .stop = b43_stop,
3570 .set_retry_limit = b43_op_set_retry_limit,
3549}; 3571};
3550 3572
3551/* Hard-reset the chip. Do not call this directly. 3573/* Hard-reset the chip. Do not call this directly.
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c
index bcbb32872e85..3659438e637c 100644
--- a/drivers/net/wireless/b43/xmit.c
+++ b/drivers/net/wireless/b43/xmit.c
@@ -294,6 +294,8 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
294 mac_ctl |= B43_TX4_MAC_STMSDU; 294 mac_ctl |= B43_TX4_MAC_STMSDU;
295 if (phy->type == B43_PHYTYPE_A) 295 if (phy->type == B43_PHYTYPE_A)
296 mac_ctl |= B43_TX4_MAC_5GHZ; 296 mac_ctl |= B43_TX4_MAC_5GHZ;
297 if (txctl->flags & IEEE80211_TXCTL_LONG_RETRY_LIMIT)
298 mac_ctl |= B43_TX4_MAC_LONGFRAME;
297 299
298 /* Generate the RTS or CTS-to-self frame */ 300 /* Generate the RTS or CTS-to-self frame */
299 if ((txctl->flags & IEEE80211_TXCTL_USE_RTS_CTS) || 301 if ((txctl->flags & IEEE80211_TXCTL_USE_RTS_CTS) ||
@@ -342,7 +344,6 @@ static void generate_txhdr_fw4(struct b43_wldev *dev,
342 b43_plcp_get_ratecode_cck(rts_rate); 344 b43_plcp_get_ratecode_cck(rts_rate);
343 if (rts_rate_fb_ofdm) 345 if (rts_rate_fb_ofdm)
344 extra_ft |= B43_TX4_EFT_RTSFBOFDM; 346 extra_ft |= B43_TX4_EFT_RTSFBOFDM;
345 mac_ctl |= B43_TX4_MAC_LONGFRAME;
346 } 347 }
347 348
348 /* Magic cookie */ 349 /* Magic cookie */