]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/include/usbcan.h
USB LinCAN support reworked to use lists instead of arrays.
[lincan.git] / lincan / include / usbcan.h
index 80566cdd8faefe97e74ccc727b030a0e83270fff..f29f9b8062bfcf14a47b15ca10e4134f98aff3c2 100644 (file)
@@ -15,6 +15,9 @@
 #include <asm/uaccess.h>
 #include <linux/usb.h>
 #include <linux/mutex.h>
+#include <linux/wait.h>
+
+#include "../include/kthread.h"
 
 /* our private defines. if this grows any larger, use your own .h file */
 #define MAX_TRANSFER           (PAGE_SIZE - 512)
@@ -25,8 +28,8 @@
 /* arbitrarily chosen */
 
 /* Define these values to match your devices */
-#define USBCAN_VENDOR_ID       0xDEAD
-#define USBCAN_PRODUCT_ID      0x1001
+#define USBCAN_VENDOR_ID       0x1669
+#define USBCAN_PRODUCT_ID      0x1011
 
 #define RESET_ADDR 0x0
 
@@ -61,106 +64,116 @@ int usbcan_send_msg(struct canchip_t *chip, struct msgobj_t *obj,
 int usbcan_fill_chipspecops(struct canchip_t *chip);
 int usbcan_irq_handler(int irq, struct canchip_t *chip);
 
-void usbcan_read_kthread(kthread_t *kthread);
-int usbcan_chip_queue_status(struct canchip_t *chip);
-
 int usbcan_init(void);
 void usbcan_exit(void);
-static int usbcan_probe(struct usb_interface *interface, const struct usb_device_id *id);
-static void usbcan_disconnect(struct usb_interface *interface);
 
-#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS
+int usbcan_kthread(void *data);
+int usbcan_chip_queue_status(struct canchip_t *chip);
 
-static const char *sja1000_ecc_errc_str[]={
-       "bit error",
-       "form error",
-       "stuff error",
-       "other type of error"
-};
+#ifdef CONFIG_OC_LINCAN_DETAILED_ERRORS
 
-static const char *sja1000_ecc_seg_str[]={
-       "?0?",
-       "?1?",
-       "ID.28 to ID.21",
-       "start of frame",
-       "bit SRTR",
-       "bit IDE",
-       "ID.20 to ID.18",
-       "ID.17 to ID.13",
-       "CRC sequence",
-       "reserved bit 0",
-       "data field",
-       "data length code",
-       "bit RTR",
-       "reserved bit 1",
-       "ID.4 to ID.0",
-       "ID.12 to ID.5",
-       "?16?"
-       "active error flag",
-       "intermission",
-       "tolerate dominant bits",
-       "?20?",
-       "?21?",
-       "passive error flag",
-       "error delimiter",
-       "CRC delimiter",
-       "acknowledge slot",
-       "end of frame",
-       "acknowledge delimiter",
-       "overload flag",
-       "?29?",
-       "?30?",
-       "?31?"
-};
+// static const char *sja1000_ecc_errc_str[]={
+//     "bit error",
+//     "form error",
+//     "stuff error",
+//     "other type of error"
+// };
+//
+// static const char *sja1000_ecc_seg_str[]={
+//     "?0?",
+//     "?1?",
+//     "ID.28 to ID.21",
+//     "start of frame",
+//     "bit SRTR",
+//     "bit IDE",
+//     "ID.20 to ID.18",
+//     "ID.17 to ID.13",
+//     "CRC sequence",
+//     "reserved bit 0",
+//     "data field",
+//     "data length code",
+//     "bit RTR",
+//     "reserved bit 1",
+//     "ID.4 to ID.0",
+//     "ID.12 to ID.5",
+//     "?16?"
+//     "active error flag",
+//     "intermission",
+//     "tolerate dominant bits",
+//     "?20?",
+//     "?21?",
+//     "passive error flag",
+//     "error delimiter",
+//     "CRC delimiter",
+//     "acknowledge slot",
+//     "end of frame",
+//     "acknowledge delimiter",
+//     "overload flag",
+//     "?29?",
+//     "?30?",
+//     "?31?"
+// };
 
 #endif /*CONFIG_OC_LINCAN_DETAILED_ERRORS*/
 
-/* CAN message over usb */
-struct usbcan_canmsg_t{
-       __u8 chip_id;
-       __u16 flags;
-       __u8 id[4];
-       __u8 length;
-       __u8 data[8];
-};
+struct usbcan_usb;
+
+#define USBCAN_TOT_RX_URBS 8
+#define USBCAN_TOT_TX_URBS 8
 
-/* CAN extended mask */
-struct usbcan_mask_t{
-       __u32 code;
-       __u32 mask;
+#define USBCAN_TRANSFER_SIZE 16
+
+struct usbcan_message {
+       struct urb      *u;
+       struct usbcan_usb *dev;
+       u8      msg[USBCAN_TRANSFER_SIZE];
+       struct canque_edge_t *qedge;
+       struct canque_slot_t *slot;
+       struct list_head list_node;
+       volatile long   flags;
 };
 
+#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 {
        struct usb_device       *udev;                  /* the usb device for this device */
        struct usb_interface    *interface;             /* the interface for this device */
-       struct semaphore        limit_sem;              /* limiting the number of writes in progress */
-       struct usb_anchor       submitted;              /* in case we need to retract our submissions */
        unsigned char           *bulk_in_buffer;        /* the buffer to receive data */
-       unsigned char           *ctl_in_buffer; /* the buffer to receive data */
        size_t                  bulk_in_size;           /* the size of the receive buffer */
-       size_t                  ctl_in_size;            /* the size of the receive buffer */
-       __u8                    ctl_in_endpointAddr;    /* the address of the bulk in endpoint */
-       __u8                    ctl_out_endpointAddr;   /* the address of the bulk in endpoint */
-       __u8                    bulk_in_endpointAddr;   /* the address of the bulk in endpoint */
-       __u8                    bulk_out_endpointAddr;  /* the address of the bulk out endpoint */
-       int                     errors;                 /* the last request tanked */
-       int                     open_count;             /* count the number of openers */
-       spinlock_t              err_lock;               /* lock for errors */
+       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              *rcv;
-       struct usbcan_canmsg_t rcv_msg;
-       struct usbcan_canmsg_t tx_msg;
-       kthread_t  rcvthread;                      /* usb receive kernel thread  */
 
-       struct candevice_t *candev;
-       long flags;
+       struct list_head        rx_pend_list;           /* URBs waiting for data receive */
+       struct list_head        rx_ready_list;          /* URBs with valid received data */
+       struct list_head        tx_idle_list;           /* URBs prepared to hold Tx messages */
+       struct list_head        tx_pend_list;           /* URBs holding Tx messages in progress */
+       struct list_head        tx_ready_list;          /* URBs with yet confirmed Tx messages */
+
+       spinlock_t              list_lock;                      /* list lock */
+
+       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_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)
@@ -168,21 +181,14 @@ struct usbcan_usb {
 #define USBCAN_VENDOR_CHECK_TX_STAT    (4)
 #define USBCAN_VENDOR_START_CHIP       (5)
 #define USBCAN_VENDOR_STOP_CHIP        (6)
+#define USBCAN_VENDOR_EXT_MASK_SET     (7)
+#define USBCAN_VENDOR_EXT_MASK_STATUS  (8)
 
-/* table of devices that work with this driver */
-static struct usb_device_id usbcan_table [] = {
-       { USB_DEVICE(USBCAN_VENDOR_ID, USBCAN_PRODUCT_ID) },
-       { }                                     /* Terminating entry */
-};
-MODULE_DEVICE_TABLE(usb, usbcan_table);
-
-static struct usb_driver usbcan_driver = {
-       .name =         "usbcan",
-       .id_table = usbcan_table,
-       .probe =        usbcan_probe,
-       .disconnect =   usbcan_disconnect,
+struct usbcan_devs {
+       struct usbcan_usb **devs;
+       int     count;
+       struct candevice_t *candev;
 };
 
 
-
 #endif /*USBCAN_H*/