1*4882a593SmuzhiyunFrom bab595e38295dcafcfc17a011d3d51f2df1618e6 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: AnilKumar Ch <anilkumar@ti.com> 3*4882a593SmuzhiyunDate: Tue, 10 Jan 2012 18:55:11 +0530 4*4882a593SmuzhiyunSubject: [PATCH] canutils: candump: Add error frame's handling 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunThis patch adds the error handling capability to candump utility 7*4882a593Smuzhiyunby adding error flags for displaying all kind of error frames 8*4882a593Smuzhiyunlike tx_timeout, lost arbitration, controller problems, buserrors, 9*4882a593Smuzhiyunbus warnings etc. 10*4882a593Smuzhiyun 11*4882a593SmuzhiyunUsage of candump for error frame display on console: 12*4882a593Smuzhiyuncandump [<can-interface>] [Options] 13*4882a593SmuzhiyunEx: candump can0 --error 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunThis patch is created on top of canutils-4.0.6 tag from 16*4882a593Smuzhiyunhttp://git.pengutronix.de/?p=tools/canutils.git 17*4882a593Smuzhiyun 18*4882a593SmuzhiyunSigned-off-by: AnilKumar Ch <anilkumar@ti.com> 19*4882a593SmuzhiyunSigned-off-by: Marc Kleine-Budde <mkl@pengutronix.de> 20*4882a593Smuzhiyun--- 21*4882a593SmuzhiyunUpstream-Status: Backport 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun src/candump.c | 20 ++++++++++++++++++++ 24*4882a593Smuzhiyun 1 file changed, 20 insertions(+) 25*4882a593Smuzhiyun 26*4882a593Smuzhiyundiff --git a/src/candump.c b/src/candump.c 27*4882a593Smuzhiyunindex 259d442..c16425b 100644 28*4882a593Smuzhiyun--- a/src/candump.c 29*4882a593Smuzhiyun+++ b/src/candump.c 30*4882a593Smuzhiyun@@ -20,6 +20,7 @@ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #include <linux/can.h> 33*4882a593Smuzhiyun #include <linux/can/raw.h> 34*4882a593Smuzhiyun+#include <linux/can/error.h> 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun extern int optind, opterr, optopt; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun@@ -40,6 +41,7 @@ static void print_usage(char *prg) 39*4882a593Smuzhiyun " -p, --protocol=PROTO\t" "CAN protocol (default CAN_RAW = %d)\n" 40*4882a593Smuzhiyun " --filter=id:mask[:id:mask]...\n" 41*4882a593Smuzhiyun "\t\t\t" "apply filter\n" 42*4882a593Smuzhiyun+ " -e, --error\t\t" "dump error frames along with data frames\n" 43*4882a593Smuzhiyun " -h, --help\t\t" "this help\n" 44*4882a593Smuzhiyun " -o <filename>\t\t" "output into filename\n" 45*4882a593Smuzhiyun " -d\t\t\t" "daemonize\n" 46*4882a593Smuzhiyun@@ -86,6 +88,11 @@ int main(int argc, char **argv) 47*4882a593Smuzhiyun int nbytes, i; 48*4882a593Smuzhiyun int opt, optdaemon = 0; 49*4882a593Smuzhiyun uint32_t id, mask; 50*4882a593Smuzhiyun+ int error = 0; 51*4882a593Smuzhiyun+ can_err_mask_t err_mask = (CAN_ERR_TX_TIMEOUT | CAN_ERR_LOSTARB | 52*4882a593Smuzhiyun+ CAN_ERR_CRTL | CAN_ERR_PROT | 53*4882a593Smuzhiyun+ CAN_ERR_TRX | CAN_ERR_ACK | CAN_ERR_BUSOFF | 54*4882a593Smuzhiyun+ CAN_ERR_BUSERROR); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun signal(SIGPIPE, SIG_IGN); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun@@ -95,6 +102,7 @@ int main(int argc, char **argv) 59*4882a593Smuzhiyun { "protocol", required_argument, 0, 'p' }, 60*4882a593Smuzhiyun { "type", required_argument, 0, 't' }, 61*4882a593Smuzhiyun { "filter", required_argument, 0, FILTER_OPTION }, 62*4882a593Smuzhiyun+ { "error", no_argument, 0, 'e' }, 63*4882a593Smuzhiyun { "version", no_argument, 0, VERSION_OPTION}, 64*4882a593Smuzhiyun { 0, 0, 0, 0}, 65*4882a593Smuzhiyun }; 66*4882a593Smuzhiyun@@ -121,6 +129,10 @@ int main(int argc, char **argv) 67*4882a593Smuzhiyun proto = strtoul(optarg, NULL, 0); 68*4882a593Smuzhiyun break; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun+ case 'e': 71*4882a593Smuzhiyun+ error = 1; 72*4882a593Smuzhiyun+ break; 73*4882a593Smuzhiyun+ 74*4882a593Smuzhiyun case 'o': 75*4882a593Smuzhiyun optout = optarg; 76*4882a593Smuzhiyun break; 77*4882a593Smuzhiyun@@ -186,6 +198,14 @@ int main(int argc, char **argv) 78*4882a593Smuzhiyun } 79*4882a593Smuzhiyun } 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun+ if (error) { 82*4882a593Smuzhiyun+ if (setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &err_mask, 83*4882a593Smuzhiyun+ sizeof(err_mask)) != 0) { 84*4882a593Smuzhiyun+ perror("setsockopt"); 85*4882a593Smuzhiyun+ exit(1); 86*4882a593Smuzhiyun+ } 87*4882a593Smuzhiyun+ } 88*4882a593Smuzhiyun+ 89*4882a593Smuzhiyun if (optdaemon) 90*4882a593Smuzhiyun daemon(1, 0); 91*4882a593Smuzhiyun else { 92*4882a593Smuzhiyun-- 93*4882a593Smuzhiyun1.8.3.1 94*4882a593Smuzhiyun 95