+ diff -u xenomai/ksrc/drivers/can/rtcan_dev.c.TXSEM xenomai/ksrc/drivers/can/rtcan_dev.c --- xenomai/ksrc/drivers/can/rtcan_dev.c.TXSEM 2007-02-15 11:21:43.000000000 +0100 +++ xenomai/ksrc/drivers/can/rtcan_dev.c 2007-02-15 14:52:20.000000000 +0100 @@ -176,9 +176,9 @@ rtdm_lock_init(&dev->device_lock); - /* Init TX Semaphore, will be destroyed forthwith - * when setting stop mode */ + /* Init and destroy TX semaphore to mark TX unavailable. */ rtdm_sem_init(&dev->tx_sem, 0); + rtdm_sem_destroy(&dev->tx_sem); #ifdef RTCAN_USE_REFCOUNT atomic_set(&dev->refcount, 0); #endif + diff -u xenomai/ksrc/drivers/can/rtcan_raw_dev.c.TXSEM xenomai/ksrc/drivers/can/rtcan_raw_dev.c --- xenomai/ksrc/drivers/can/rtcan_raw_dev.c.TXSEM 2007-02-15 11:21:43.000000000 +0100 +++ xenomai/ksrc/drivers/can/rtcan_raw_dev.c 2007-02-15 14:16:16.000000000 +0100 @@ -193,7 +193,8 @@ switch (request) { case SIOCSCANMODE: mode = (can_mode_t *)&ifr->ifr_ifru; - if (dev->do_set_mode) + if (dev->do_set_mode && + !(*mode == CAN_MODE_START && CAN_STATE_OPERATING(dev->state))) ret = dev->do_set_mode(dev, *mode, &lock_ctx); break;