/**
* 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
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);
can_msgobj_set_fl(obj,FILTCH_REQUEST);
canqueue_wake_chip_worker(qends, chip, obj);
#endif /*CAN_WITH_RTL*/
-
+
break;
}
}
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);
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 */
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)