- set_bit(USBCAN_DATA_OK,&mess->dev->flags);
- set_bit(USBCAN_MESSAGE_DATA_OK,&mess->flags);
- if (test_bit(USBCAN_MESSAGE_TYPE_RX,&mess->flags)){
- DEBUGMSG("%s > RX flag set\n", __FUNCTION__);
- set_bit(USBCAN_DATA_RX,&mess->dev->flags);
- }
- if (test_bit(USBCAN_MESSAGE_TYPE_TX,&mess->flags))
- DEBUGMSG("%s > TX flag set\n", __FUNCTION__);
- set_bit(USBCAN_DATA_TX,&mess->dev->flags);
- clear_bit(USBCAN_MESSAGE_URB_PENDING,&mess->flags);
- if (test_bit(USBCAN_THREAD_RUNNING,&mess->dev->flags))
- wake_up_process(mess->dev->comthread);
+ set_bit(USBCAN_DATA_OK,&m->dev->flags);
+ set_bit(USBCAN_MESSAGE_DATA_OK,&m->flags);
+ DEBUGMSG("%s > TX flag set\n", __FUNCTION__);
+ set_bit(USBCAN_DATA_TX,&m->dev->flags);
+ clear_bit(USBCAN_MESSAGE_URB_PENDING,&m->flags);
+ usbcan_usb_message_move_list(m->dev, m, &m->dev->tx_ready_list);
+ if (test_bit(USBCAN_THREAD_RUNNING,&m->dev->flags))
+ wake_up_process(m->dev->comthread);
+ else
+ CANMSG("%s > USBCAN thread not running\n", __FUNCTION__);
+ return;
+ case -ECONNRESET:
+ case -ENOENT:
+ case -ESHUTDOWN:
+ /* this urb is terminated, clean up */
+ CANMSG("%s > Urb shutting down with status: %d\n", __FUNCTION__, urb->status);
+ set_bit(USBCAN_TERMINATE,&m->dev->flags);
+ set_bit(USBCAN_MESSAGE_TERMINATE,&m->flags);
+ clear_bit(USBCAN_MESSAGE_URB_PENDING,&m->flags);
+ return;
+ default:
+ //CANMSG("%s > Nonzero status received: %d\n", __FUNCTION__, urb->status);
+ break;
+ }
+
+ // Try to send urb again on non significant errors
+ retval = usb_submit_urb (urb, GFP_ATOMIC);
+ if (retval<0){
+ CANMSG("%s > Retrying urb failed with result %d\n", __FUNCTION__, retval);
+ set_bit(USBCAN_ERROR,&m->dev->flags);
+ clear_bit(USBCAN_MESSAGE_URB_PENDING,&m->flags);
+ usbcan_usb_message_move_list(m->dev, m, &m->dev->tx_ready_list);
+ if (test_bit(USBCAN_THREAD_RUNNING,&m->dev->flags))
+ wake_up_process(m->dev->comthread);
+ }
+}
+
+static void usbcan_rx_callback(struct urb *urb)
+{
+ struct usbcan_message *m = urb->context;
+ int retval;
+
+ if (!test_bit(USBCAN_THREAD_RUNNING,&m->dev->flags))
+ return;
+ if (test_bit(USBCAN_MESSAGE_TERMINATE,&m->flags))
+ return;
+
+ switch (urb->status) {
+ case 0:
+ /* success */
+ DEBUGMSG("%s > Message OK\n", __FUNCTION__);
+ set_bit(USBCAN_DATA_OK,&m->dev->flags);
+ set_bit(USBCAN_MESSAGE_DATA_OK,&m->flags);
+ DEBUGMSG("%s > RX flag set\n", __FUNCTION__);
+ set_bit(USBCAN_DATA_RX,&m->dev->flags);
+ clear_bit(USBCAN_MESSAGE_URB_PENDING,&m->flags);
+ usbcan_usb_message_move_list(m->dev, m, &m->dev->rx_ready_list);
+ if (test_bit(USBCAN_THREAD_RUNNING,&m->dev->flags))
+ wake_up_process(m->dev->comthread);