Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=1dc4d1e6a1e81fee0d488cec4fcd39269ec51318
Commit:     1dc4d1e6a1e81fee0d488cec4fcd39269ec51318
Parent:     90d501d610c0065dce43120c26744a49d8e0490c
Author:     Stefano Brivio <[EMAIL PROTECTED]>
AuthorDate: Wed Dec 19 01:26:52 2007 +0100
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Jan 28 14:59:43 2008 -0800

    rc80211-pid: add sharpening factor
    
    This patch introduces a PID sharpening factor for faster response after
    association and low activity events.
    
    Signed-off-by: Stefano Brivio <[EMAIL PROTECTED]>
    Signed-off-by: Mattias Nissler <[EMAIL PROTECTED]>
    Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/mac80211/rc80211_pid.c |   35 +++++++++++++++++++++++++++--------
 1 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/net/mac80211/rc80211_pid.c b/net/mac80211/rc80211_pid.c
index 1116dc6..7f8cf27 100644
--- a/net/mac80211/rc80211_pid.c
+++ b/net/mac80211/rc80211_pid.c
@@ -23,13 +23,16 @@
  *
  * The controller basically computes the following:
  *
- * adj = CP * err + CI * err_avg + CD * (err - last_err)
+ * adj = CP * err + CI * err_avg + CD * (err - last_err) * (1 + sharpening)
  *
  * where
  *     adj     adjustment value that is used to switch TX rate (see below)
  *     err     current error: target vs. current failed frames percentage
  *     last_err        last error
  *     err_avg average (i.e. poor man's integral) of recent errors
+ *     sharpening      non-zero when fast response is needed (i.e. right after
+ *                     association or no frames sent for a long time), heading
+ *                     to zero over time
  *     CP      Proportional coefficient
  *     CI      Integral coefficient
  *     CD      Derivative coefficient
@@ -65,6 +68,10 @@
 #define RC_PID_SMOOTHING_SHIFT 3
 #define RC_PID_SMOOTHING (1 << RC_PID_SMOOTHING_SHIFT)
 
+/* Sharpening factor (used for D part of PID controller) */
+#define RC_PID_SHARPENING_FACTOR 0
+#define RC_PID_SHARPENING_DURATION 0
+
 /* Fixed point arithmetic shifting amount. */
 #define RC_PID_ARITH_SHIFT 8
 
@@ -131,8 +138,11 @@ struct rc_pid_sta_info {
         */
        s32 err_avg_sc;
 
-       /* Last framed failes percentage sample */
+       /* Last framed failes percentage sample. */
        u32 last_pf;
+
+       /* Sharpening needed. */
+       u8 sharp_cnt;
 };
 
 /* Algorithm parameters. We keep them on a per-algorithm approach, so they can
@@ -267,20 +277,26 @@ static void rate_control_pid_sample(struct rc_pid_info 
*pinfo,
 
        mode = local->oper_hw_mode;
        spinfo = sta->rate_ctrl_priv;
+
+       /* In case nothing happened during the previous control interval, turn
+        * the sharpening factor on. */
+       if (jiffies - spinfo->last_sample > 2 * RC_PID_INTERVAL)
+               spinfo->sharp_cnt = RC_PID_SHARPENING_DURATION;
+
        spinfo->last_sample = jiffies;
 
-       /* If no frames were transmitted, we assume the old sample is
+       /* This should never happen, but in case, we assume the old sample is
         * still a good measurement and copy it. */
-       if (spinfo->tx_num_xmit == 0)
+       if (unlikely(spinfo->tx_num_xmit == 0))
                pf = spinfo->last_pf;
        else {
                pf = spinfo->tx_num_failed * 100 / spinfo->tx_num_xmit;
                pf <<= RC_PID_ARITH_SHIFT;
-
-               spinfo->tx_num_xmit = 0;
-               spinfo->tx_num_failed = 0;
        }
 
+       spinfo->tx_num_xmit = 0;
+       spinfo->tx_num_failed = 0;
+
        /* If we just switched rate, update the rate behaviour info. */
        if (pinfo->oldrate != sta->txrate) {
 
@@ -302,8 +318,11 @@ static void rate_control_pid_sample(struct rc_pid_info 
*pinfo,
        spinfo->err_avg_sc = spinfo->err_avg_sc - err_avg + err_prop;
        err_int = spinfo->err_avg_sc >> RC_PID_SMOOTHING_SHIFT;
 
-       err_der = pf - spinfo->last_pf;
+       err_der = pf - spinfo->last_pf
+                 * (1 + RC_PID_SHARPENING_FACTOR * spinfo->sharp_cnt);
        spinfo->last_pf = pf;
+       if (spinfo->sharp_cnt)
+                       spinfo->sharp_cnt--;
 
        /* Compute the controller output. */
        adj = (err_prop * pinfo->coeff_p + err_int * pinfo->coeff_i
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to