]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
This patch ensures that can_calc_bittiming() returns an error (-EDOM) if
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Fri, 24 Oct 2008 13:42:42 +0000 (13:42 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Fri, 24 Oct 2008 13:42:42 +0000 (13:42 +0000)
the bit-rate error is greater than 5%. In that case, it's very unlikely
that the determined bit-timing works properly anyhow.

Signed-off-by: Wolfgang Grandegger <wg@grandegger.com>
Signed-off-by: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
git-svn-id: svn://svn.berlios.de//socketcan/trunk@851 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/drivers/net/can/dev.c

index cd7dd0c675194dc883f509a58b635f935274af42..1c1a96c9e66c6e0c7cfca87f0673c2ab9f1b19fd 100644 (file)
@@ -36,6 +36,8 @@ MODULE_DESCRIPTION(MOD_DESC);
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");
 
+#define CAN_CALC_MAX_ERROR 50 /* in one-tenth of a percent */
+
 /*
  * Bit-timing calculation derived from:
  *
@@ -122,6 +124,19 @@ static int can_calc_bittiming(struct net_device *dev)
                        break;
        }
 
+       if (best_error) {
+               /* Error in one-tenth of a percent */
+               error = (best_error * 1000) / bt->bitrate;
+               if (error > CAN_CALC_MAX_ERROR) {
+                       dev_err(ND2D(dev), "bitrate error %ld.%ld%% too high\n",
+                               error / 10, error % 10);
+                       return -EDOM;
+               } else {
+                       dev_warn(ND2D(dev), "bitrate error %ld.%ld%%\n",
+                                error / 10, error % 10);
+               }
+       }
+
        spt = can_update_spt(btc, sampl_pt, best_tseg, &tseg1, &tseg2);
 
        v64 = (u64)best_brp * 1000000000UL;
@@ -133,13 +148,6 @@ static int can_calc_bittiming(struct net_device *dev)
        bt->sjw = 1;
        bt->brp = best_brp;
 
-       if (best_error) {
-               error = best_error * 1000;
-               error /= bt->bitrate;
-               dev_warn(ND2D(dev), "bitrate error %ld.%ld%%\n",
-                        error / 10, error % 10);
-       }
-
        return 0;
 }