#include <asm/uaccess.h>
#include <linux/usb.h>
#include <linux/mutex.h>
+#include <linux/wait.h>
#include "../include/kthread.h"
int usbcan_init(void);
void usbcan_exit(void);
-int usbcan_read_kthread(void *data);
+int usbcan_kthread(void *data);
int usbcan_chip_queue_status(struct canchip_t *chip);
#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS
#endif /*CONFIG_OC_LINCAN_DETAILED_ERRORS*/
+struct usbcan_usb;
+
+#define USBCAN_TOT_RX_URBS 8
+#define USBCAN_TOT_TX_URBS 8
+
+#define USBCAN_TRANSFER_SIZE 16
+
struct usbcan_message {
struct urb *u;
- u8 msg[16];
+ struct usbcan_usb *dev;
+ u8 msg[USBCAN_TRANSFER_SIZE];
spinlock_t acc; /* access lock */
+ struct canque_edge_t *qedge;
+ struct canque_slot_t *slot;
volatile long flags;
};
-#define USBCAN_MESSAGE_FREE (1)
-#define USBCAN_MESSAGE_READY_TO_SEND (2)
-#define USBCAN_MESSAGE_SENDING (3)
-#define USBCAN_MESSAGE_TERMINATE (4)
-#define USBCAN_MESSAGE_ERROR (5)
-#define USBCAN_MESSAGE_DATA_READ (6)
-
-#define USBCAN_TOT_RX_URBS 8
-#define USBCAN_TOT_TX_URBS 8
+#define USBCAN_MESSAGE_FREE (1)
+#define USBCAN_MESSAGE_URB_PENDING (2)
+#define USBCAN_MESSAGE_TERMINATE (3)
+#define USBCAN_MESSAGE_ERROR (4)
+#define USBCAN_MESSAGE_DATA_OK (5)
+#define USBCAN_MESSAGE_TYPE_RX (6)
+#define USBCAN_MESSAGE_TYPE_TX (7)
/* Structure to hold all of our device specific stuff */
struct usbcan_usb {
u8 bulk_in_endpointAddr; /* the address of the bulk in endpoint */
u8 bulk_out_endpointAddr; /* the address of the bulk out endpoint */
struct mutex io_mutex; /* synchronize I/O with disconnect */
- struct urb *rx;
- struct urb *tx;
- u8 rx_msg[16];
- u8 tx_msg[16];
+ struct usbcan_message rx[USBCAN_TOT_RX_URBS];
+ struct usbcan_message tx[USBCAN_TOT_TX_URBS];
struct task_struct *comthread; /* usb communication kernel thread */
+ wait_queue_head_t queue;
struct canchip_t *chip;
volatile long flags;
};
-#define USBCAN_DATA_READ (1)
-#define USBCAN_TERMINATE (2)
-#define USBCAN_ERROR (3)
-#define USBCAN_TX_PENDING (4)
-#define USBCAN_THREAD_RUNNING (5)
+#define USBCAN_DATA_OK (1)
+#define USBCAN_DATA_RX (2)
+#define USBCAN_DATA_TX (3)
+#define USBCAN_TERMINATE (4)
+#define USBCAN_ERROR (5)
+#define USBCAN_TX_PENDING (6)
+#define USBCAN_THREAD_RUNNING (7)
+#define USBCAN_FREE_TX_URB (8)
#define USBCAN_VENDOR_BAUD_RATE_SET (1)
#define USBCAN_VENDOR_BAUD_RATE_STATUS (2)