]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
ath9k_hw: Fix divide by zero cases in paprd.
authorSenthil Balasubramanian <senthilkumar@atheros.com>
Tue, 19 Oct 2010 14:31:41 +0000 (20:01 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 25 Oct 2010 18:43:14 +0000 (14:43 -0400)
We are not handling all divide by zero cases in paprd.
Add additional checks for divide by zero cases in papard.

This patch has fixes intended for kernel 2.6.36.

Cc: stable@kernel.org
Signed-off-by: Senthil Balasubramanian <senthilkumar@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar9003_paprd.c

index 7c38229ba670a28a624ab521a02820eae581c10a..716db414c258f254263a47238f45aa9fd6c2d813 100644 (file)
@@ -347,6 +347,10 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
            (((Y[6] - Y[3]) * 1 << scale_factor) +
             (x_est[6] - x_est[3])) / (x_est[6] - x_est[3]);
 
+       /* prevent division by zero */
+       if (G_fxp == 0)
+               return false;
+
        Y_intercept =
            (G_fxp * (x_est[0] - x_est[3]) +
             (1 << scale_factor)) / (1 << scale_factor) + Y[3];
@@ -356,14 +360,12 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
 
        for (i = 0; i <= 3; i++) {
                y_est[i] = i * 32;
-
-               /* prevent division by zero */
-               if (G_fxp == 0)
-                       return false;
-
                x_est[i] = ((y_est[i] * 1 << scale_factor) + G_fxp) / G_fxp;
        }
 
+       if (y_est[max_index] == 0)
+               return false;
+
        x_est_fxp1_nonlin =
            x_est[max_index] - ((1 << scale_factor) * y_est[max_index] +
                                G_fxp) / G_fxp;
@@ -457,6 +459,8 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
 
        Q_scale_B = find_proper_scale(find_expn(abs(scale_B)), 10);
        scale_B = scale_B / (1 << Q_scale_B);
+       if (scale_B == 0)
+               return false;
        Q_beta = find_proper_scale(find_expn(abs(beta_raw)), 10);
        Q_alpha = find_proper_scale(find_expn(abs(alpha_raw)), 10);
        beta_raw = beta_raw / (1 << Q_beta);