From 8a3b29f17483c98e116e6352176cd30b2c76019b Mon Sep 17 00:00:00 2001 From: Jan Kriz Date: Mon, 4 Aug 2008 11:12:38 +0200 Subject: [PATCH] Fixed errors when device gets disconnected during communication --- embedded/app/usbcan/can_quesysless.c | 2 +- embedded/app/usbcan/can_queue.c | 4 ++-- embedded/app/usbcan/usb_vend.c | 2 +- lincan/src/devcommon.c | 13 ++++++++----- lincan/src/finish.c | 4 +++- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/embedded/app/usbcan/can_quesysless.c b/embedded/app/usbcan/can_quesysless.c index 89dcabf..26c6db7 100644 --- a/embedded/app/usbcan/can_quesysless.c +++ b/embedded/app/usbcan/can_quesysless.c @@ -10,7 +10,7 @@ #include "./can/can_sysdep.h" #include "./can/can_queue.h" -#define CAN_DEBUG +// #define CAN_DEBUG extern atomic_t edge_num_cnt; diff --git a/embedded/app/usbcan/can_queue.c b/embedded/app/usbcan/can_queue.c index 91077d7..9815fd0 100644 --- a/embedded/app/usbcan/can_queue.c +++ b/embedded/app/usbcan/can_queue.c @@ -20,8 +20,8 @@ extern int processlocal; atomic_t edge_num_cnt; -#define CAN_DEBUG -// #undef CAN_DEBUG +// #define CAN_DEBUG +#undef CAN_DEBUG #ifdef CAN_DEBUG #define DEBUGQUE(fmt,args...) can_printk(KERN_ERR "can_queue (debug): " fmt,\ diff --git a/embedded/app/usbcan/usb_vend.c b/embedded/app/usbcan/usb_vend.c index 0fec9b3..29cd74b 100644 --- a/embedded/app/usbcan/usb_vend.c +++ b/embedded/app/usbcan/usb_vend.c @@ -1,4 +1,4 @@ -#define CAN_DEBUG +// #define CAN_DEBUG #include #include diff --git a/lincan/src/devcommon.c b/lincan/src/devcommon.c index 2af0f86..bc4157d 100644 --- a/lincan/src/devcommon.c +++ b/lincan/src/devcommon.c @@ -36,7 +36,7 @@ void canqueue_wake_chip_worker(struct canque_ends_t *qends, struct canchip_t *ch /** * canqueue_notify_chip - notification callback handler for CAN chips ends of queues * @qends: pointer to the callback side ends structure - * @qedge: edge which invoked notification + * @qedge: edge which invoked notification * @what: notification type * * This function has to deal with more possible cases. It can be called from @@ -59,7 +59,10 @@ void canqueue_notify_chip(struct canque_ends_t *qends, struct canque_edge_t *qed case CANQUEUE_NOTIFY_PROC: #ifndef CAN_WITH_RTL /*wake_up(&qends->endinfo.chipinfo.daemonq);*/ - chip->chipspecops->wakeup_tx(chip, obj); + if(canque_fifo_test_fl(&qedge->fifo, READY)){ + if ((chip) && (chip->flags & CHIP_ATTACHED)) + chip->chipspecops->wakeup_tx(chip, obj); + } #else /*CAN_WITH_RTL*/ can_msgobj_set_fl(obj,TX_REQUEST); canqueue_wake_chip_worker(qends, chip, obj); @@ -81,7 +84,7 @@ void canqueue_notify_chip(struct canque_ends_t *qends, struct canque_edge_t *qed can_msgobj_set_fl(obj,FILTCH_REQUEST); canqueue_wake_chip_worker(qends, chip, obj); #endif /*CAN_WITH_RTL*/ - + break; } } @@ -98,7 +101,7 @@ int canqueue_ends_init_chip(struct canque_ends_t *qends, struct canchip_t *chip, int ret; ret=canqueue_ends_init_gen(qends); if(ret<0) return ret; - + qends->context=NULL; #ifndef CAN_WITH_RTL init_waitqueue_head(&qends->endinfo.chipinfo.daemonq); @@ -121,7 +124,7 @@ int canqueue_ends_init_chip(struct canque_ends_t *qends, struct canchip_t *chip, int canqueue_ends_done_chip(struct canque_ends_t *qends) { int delayed; - + /* Finish or kill all outgoing edges listed in inends */ delayed=canqueue_ends_kill_inlist(qends, 1); /* Kill all incoming edges listed in outends */ diff --git a/lincan/src/finish.c b/lincan/src/finish.c index bccf06b..5e789ae 100644 --- a/lincan/src/finish.c +++ b/lincan/src/finish.c @@ -69,8 +69,10 @@ void canchip_done(struct canchip_t *chip) int i; struct msgobj_t *obj; - if(chip->flags & CHIP_ATTACHED) + if(chip->flags & CHIP_ATTACHED){ chip->chipspecops->release_chip(chip); + chip->flags &= ~CHIP_ATTACHED; + } if((chip->hostdevice) && (chip->chip_idx>=0)) { if(chip->hostdevice->chip[chip->chip_idx] == chip) -- 2.39.2