Michael, I think I took care of your comments in the previous version. Larry --- In bcm43xx-mac80211, the mechanism for decreasing the transmit rate cannot be triggered. This may be shown by walking away from the AP with a laptop. At some distance, communications will be lost and never recovered because the rate decreasing mechanism of rc80211_simple needs to see excessive_retries set in the ieee80211_tx_status struct. With this patch, the transmit rate will decrease until communications restart. Signed-off-by: Larry Finger <Larry.Finger@xxxxxxxxxxxx> --- Index: wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_dma.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_dma.c +++ wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_dma.c @@ -1311,6 +1311,16 @@ void bcm43xx_dma_handle_txstatus(struct */ if (status->acked) meta->txstat.flags |= IEEE80211_TX_STATUS_ACK; + else + if (dev->short_preamble) { + if (status->frame_count >= + dev->short_retry_limit) + meta->txstat.excessive_retries = 1; + } else { + if (status->frame_count >= + dev->long_retry_limit) + meta->txstat.excessive_retries = 1; + } meta->txstat.retry_count = status->frame_count - 1; ieee80211_tx_status_irqsafe(dev->wl->hw, meta->skb, &(meta->txstat)); /* skb is freed by ieee80211_tx_status_irqsafe() */ Index: wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx.h =================================================================== --- wireless-dev.orig/drivers/net/wireless/bcm43xx-mac80211/bcm43xx.h +++ wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx.h @@ -707,6 +707,8 @@ struct bcm43xx_wldev { bool short_preamble; /* TRUE, if short preamble is enabled. */ bool short_slot; /* TRUE, if short slot timing is enabled. */ bool radio_hw_enable; /* saved state of radio hardware enabled state */ + u8 short_retry_limit; + u8 long_retry_limit; /* PHY/Radio device. */ struct bcm43xx_phy phy; Index: wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_main.c =================================================================== --- wireless-dev.orig/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_main.c +++ wireless-dev/drivers/net/wireless/bcm43xx-mac80211/bcm43xx_main.c @@ -3333,10 +3333,12 @@ static int bcm43xx_wireless_core_init(st tmp = limit_value(modparam_short_retry, 0, 0xF); bcm43xx_shm_write16(dev, BCM43xx_SHM_SCRATCH, BCM43xx_SHM_SC_SRLIMIT, tmp); + dev->short_retry_limit = tmp; tmp = limit_value(modparam_long_retry, 0, 0xF); bcm43xx_shm_write16(dev, BCM43xx_SHM_SCRATCH, BCM43xx_SHM_SC_LRLIMIT, tmp); + dev->long_retry_limit = tmp; bcm43xx_shm_write16(dev, BCM43xx_SHM_SHARED, BCM43xx_SHM_SH_SFFBLIM, 3); bcm43xx_shm_write16(dev, BCM43xx_SHM_SHARED, - To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html