+ diff -u xenomai/ksrc/drivers/can/rtcan_dev.c.TXSEM xenomai/ksrc/drivers/can/rtcan_dev.c + diff -u xenomai/ksrc/drivers/can/rtcan_raw.c.TXSEM xenomai/ksrc/drivers/can/rtcan_raw.c --- xenomai/ksrc/drivers/can/rtcan_raw.c.TXSEM 2007-02-15 17:11:11.000000000 +0100 +++ xenomai/ksrc/drivers/can/rtcan_raw.c 2007-02-15 13:46:02.000000000 +0100 @@ -964,12 +964,13 @@ /* Controller should be operating */ if (!CAN_STATE_OPERATING(dev->state)) { + if (dev->state == CAN_STATE_SLEEPING) { + ret = -ECOMM; + rtdm_sem_up(&dev->tx_sem); + goto send_out2; + } ret = -ENETDOWN; goto send_out2; - } else if (dev->state == CAN_STATE_SLEEPING) { - ret = -ECOMM; - rtdm_sem_up(&dev->tx_sem); - goto send_out2; } dev->tx_count++; + 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; + diff -u xenomai/ksrc/drivers/can/rtcan_virt.c.TXSEM xenomai/ksrc/drivers/can/rtcan_virt.c --- xenomai/ksrc/drivers/can/rtcan_virt.c.TXSEM 2007-02-15 11:24:14.000000000 +0100 +++ xenomai/ksrc/drivers/can/rtcan_virt.c 2007-02-15 17:13:23.000000000 +0100 @@ -102,8 +102,7 @@ break; case CAN_MODE_START: - if (dev->state == CAN_STATE_STOPPED) - rtdm_sem_init(&dev->tx_sem, VIRT_TX_BUFS); + rtdm_sem_init(&dev->tx_sem, VIRT_TX_BUFS); dev->state = CAN_STATE_ACTIVE; break; @@ -126,7 +125,7 @@ dev->ctrl_name = virt_ctlr_name; dev->board_name = virt_board_name; - dev->state = CAN_STATE_STOPPED; + rtcan_virt_set_mode(dev, CAN_MODE_STOP, NULL); strncpy(dev->name, RTCAN_DEV_NAME, IFNAMSIZ);