Search Linux Wireless

Re: [PATCH] rtl8187: Change rate-control feedback

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



--- On Sun, 27/2/11, Larry Finger <Larry.Finger@xxxxxxxxxxxx> wrote:

> The driver for the RTL8187L chips
> returns IEEE80211_TX_STAT_ACK for all
> packets, even if the maximum number of retries was
> exhausted. In addition
> it fails to setup max_rates in the ieee80211_hw struct,
> This behavior
> may be responsible for the problems noted in Bug 14168. As
> the bug is very
> old, testers have not been found, and I do not have the
> case where the
> indicated signal is less than -70 dBm.


Possibility of division by zero? The while loop dequeues - does this code always get invoked with a non-empty queue? Also it worrys me a little if tmp < retry?

> +    avg_retry = (tmp - retry) /
> skb_queue_len(&priv->b_tx_status.queue);
>      while
> (skb_queue_len(&priv->b_tx_status.queue) > 0) {



> 
> Signed-off-by: Larry Finger <Larry.Finger@xxxxxxxxxxxx>
> Cc: Stable <stable@xxxxxxxxxx>
> ---
> 
> Index:
> wireless-testing/drivers/net/wireless/rtl818x/rtl8187/dev.c
> ===================================================================
> ---
> wireless-testing.orig/drivers/net/wireless/rtl818x/rtl8187/dev.c
> +++
> wireless-testing/drivers/net/wireless/rtl818x/rtl8187/dev.c
> @@ -869,23 +869,29 @@ static void rtl8187_work(struct
> work_str
>      /* The RTL8187 returns the retry count
> through register 0xFFFA. In
>       * addition, it appears to be
> a cumulative retry count, not the
>       * value for the current TX
> packet. When multiple TX entries are
> -     * queued, the retry count
> will be valid for the last one in the queue.
> -     * The "error" should not
> matter for purposes of rate setting. */
> +     * waiting in the queue, the
> retry count will be the total for all.
> +     * The "error" may matter for
> purposes of rate setting, but there is
> +     * no other choice with this
> hardware.
> +     */
>      struct rtl8187_priv *priv =
> container_of(work, struct rtl8187_priv,
>             
>         work.work);
>      struct ieee80211_tx_info *info;
>      struct ieee80211_hw *dev =
> priv->dev;
>      static u16 retry;
>      u16 tmp;
> +    u16 avg_retry;
>  
>      mutex_lock(&priv->conf_mutex);
>      tmp = rtl818x_ioread16(priv, (__le16
> *)0xFFFA);
> +    avg_retry = (tmp - retry) /
> skb_queue_len(&priv->b_tx_status.queue);
>      while
> (skb_queue_len(&priv->b_tx_status.queue) > 0) {
>          struct sk_buff
> *old_skb;
>  
>          old_skb =
> skb_dequeue(&priv->b_tx_status.queue);
>          info =
> IEEE80211_SKB_CB(old_skb);
> -       
> info->status.rates[0].count = tmp - retry + 1;
> +       
> info->status.rates[0].count = avg_retry + 1;
> +        if
> (info->status.rates[0].count > RETRY_COUNT)
> +           
> info->flags &= ~IEEE80211_TX_STAT_ACK;
>         
> ieee80211_tx_status_irqsafe(dev, old_skb);
>      }
>      retry = tmp;
> @@ -931,8 +937,8 @@ static int rtl8187_start(struct
> ieee8021
>         
> rtl818x_iowrite32(priv, &priv->map->TX_CONF,
>             
>       RTL818X_TX_CONF_HW_SEQNUM |
>             
>       RTL818X_TX_CONF_DISREQQSIZE |
> -           
>       (7 << 8  /* short retry
> limit */) |
> -           
>       (7 << 0  /* long retry
> limit */) |
> +           
>       (RETRY_COUNT << 8  /*
> short retry limit */) |
> +           
>       (RETRY_COUNT << 0  /*
> long retry limit */) |
>             
>       (7 << 21 /* MAX TX DMA
> */));
>         
> rtl8187_init_urbs(dev);
>         
> rtl8187b_init_status_urb(dev);
> @@ -1376,6 +1382,9 @@ static int __devinit
> rtl8187_probe(struc
>      dev->flags =
> IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
>           
>    IEEE80211_HW_SIGNAL_DBM |
>           
>    IEEE80211_HW_RX_INCLUDES_FCS;
> +    /* Initialize rate-control variables
> */
> +    dev->max_rates = 1;
> +    dev->max_rate_tries = RETRY_COUNT;
>  
>      eeprom.data = dev;
>      eeprom.register_read =
> rtl8187_eeprom_register_read;
> Index:
> wireless-testing/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
> ===================================================================
> ---
> wireless-testing.orig/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
> +++
> wireless-testing/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
> @@ -35,6 +35,8 @@
>  #define RFKILL_MASK_8187_89_97    0x2
>  #define RFKILL_MASK_8198    0x4
>  
> +#define RETRY_COUNT       
> 7
> +
>  struct rtl8187_rx_info {
>      struct urb *urb;
>      struct ieee80211_hw *dev;
> 


      
--
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


[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux