Don't pass ctrl_msg/bulk_msg structures through async paths
authorDaniel Drake <dsd@gentoo.org>
Wed, 12 Dec 2007 23:32:54 +0000 (23:32 +0000)
committerDaniel Drake <dsd@gentoo.org>
Wed, 12 Dec 2007 23:32:54 +0000 (23:32 +0000)
These are easiest to construct on the stack, but in the async case it is
likely that the submitting function returns (hence stack is destroyed)
before URB completion.

examples/dpfp.c
libfpusb/fpusb.h
libfpusb/fpusbi.h
libfpusb/io.c

index bc883c6..fe1445c 100644 (file)
@@ -205,8 +205,8 @@ static int set_mode(unsigned char data)
 }
 
 static void cb_mode_changed(struct fpusb_dev_handle *_devh,
-       struct fpusb_urb_handle *urbh, struct fpusb_ctrl_msg *msg,
-       enum fp_urb_cb_status status, unsigned char *data, int actual_length,
+       struct fpusb_urb_handle *urbh, enum fp_urb_cb_status status,
+       struct usb_ctrl_setup *setup, unsigned char *data, int actual_length,
        void *user_data)
 {
        if (status != FP_URB_COMPLETED) {
@@ -336,10 +336,10 @@ static int next_state(void)
 }
 
 static void cb_irq(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
-       struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
-       int actual_length, void *user_data)
+       enum fp_urb_cb_status status, unsigned char endpoint, int rqlength,
+       unsigned char *data, int actual_length, void *user_data)
 {
-       unsigned char irqtype = msg->data[0];
+       unsigned char irqtype = data[0];
 
        if (status != FP_URB_COMPLETED) {
                fprintf(stderr, "irq URB status %d?\n", status);
@@ -375,8 +375,8 @@ static void cb_irq(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
 }
 
 static void cb_img(fpusb_dev_handle *_devh, fpusb_urb_handle *urbh,
-       struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
-       int actual_length, void *user_data)
+       enum fp_urb_cb_status status, unsigned char endpoint, int rqlength,
+       unsigned char *data, int actual_length, void *user_data)
 {
        if (status != FP_URB_COMPLETED) {
                fprintf(stderr, "img URB status %d?\n", status);
index 0d54be5..abcb6c9 100644 (file)
@@ -165,6 +165,16 @@ struct usb_config_descriptor {
        int extralen;
 };
 
+/* off-the-wire structures */
+
+struct usb_ctrl_setup {
+       uint8_t  bRequestType;
+       uint8_t  bRequest;
+       uint16_t wValue;
+       uint16_t wIndex;
+       uint16_t wLength;
+} __attribute__((packed));
+
 /* fpusb */
 
 struct fpusb_dev;
@@ -193,7 +203,7 @@ struct fpusb_ctrl_msg {
 };
 
 typedef void (*fpusb_ctrl_cb_fn)(fpusb_dev_handle *devh, fpusb_urb_handle *urbh,
-       struct fpusb_ctrl_msg *msg, enum fp_urb_cb_status status,
+       enum fp_urb_cb_status status, struct usb_ctrl_setup *setup,
        unsigned char *data, int actual_length, void *user_data);
 
 struct fpusb_bulk_msg {
@@ -203,8 +213,8 @@ struct fpusb_bulk_msg {
 };
 
 typedef void (*fpusb_bulk_cb_fn)(fpusb_dev_handle *devh, fpusb_urb_handle *urbh,
-       struct fpusb_bulk_msg *msg, enum fp_urb_cb_status status,
-       int actual_length, void *user_data);
+       enum fp_urb_cb_status status, unsigned char endpoint,
+       int rqlength, unsigned char *data, int actual_length, void *user_data);
 
 int fpusb_init(int signum);
 void fpusb_exit(void);
index ea5a24a..4c9f9d2 100644 (file)
@@ -175,7 +175,6 @@ struct fpusb_urb_handle {
        timer_t timer;
        unsigned char urb_type;
        unsigned char endpoint;
-       void *msg;
        int transfer_len;
        int transferred;
        unsigned char *buffer;
@@ -186,14 +185,6 @@ struct fpusb_urb_handle {
 
 /* bus structures */
 
-struct usb_ctrl_setup {
-       uint8_t  bRequestType;
-       uint8_t  bRequest;
-       uint16_t wValue;
-       uint16_t wIndex;
-       uint16_t wLength;
-} __attribute__((packed));
-
 /* All standard descriptors have these 2 fields in common */
 struct usb_descriptor_header {
        uint8_t  bLength;
index 88a83e8..f5949ea 100644 (file)
@@ -240,7 +240,6 @@ API_EXPORTED struct fpusb_urb_handle *fpusb_submit_ctrl_msg(
                memcpy(urbdata + sizeof(struct usb_ctrl_setup), msg->data, msg->length);
 
        urbh->urb_type = USB_URB_TYPE_CONTROL;
-       urbh->msg = msg;
        urbh->buffer = urbdata;
        urbh->transfer_len = urbdata_length;
 
@@ -275,7 +274,6 @@ static struct fpusb_urb_handle *submit_bulk_msg(struct fpusb_dev_handle *devh,
        urbh->callback = callback;
        urbh->user_data = user_data;
        urbh->flags |= FPUSB_URBH_DATA_BELONGS_TO_USER;
-       urbh->msg = msg;
        urbh->endpoint = msg->endpoint;
        urbh->urb_type = urbtype;
        urbh->buffer = msg->data;
@@ -352,15 +350,15 @@ int handle_transfer_completion(struct fpusb_dev_handle *devh,
        if (urb->type == USB_URB_TYPE_CONTROL) {
                fpusb_ctrl_cb_fn callback = urbh->callback;
                if (callback)
-                       callback(devh, urbh, urbh->msg, status,
+                       callback(devh, urbh, status, urb->buffer,
                                urb->buffer + sizeof(struct usb_ctrl_setup), urbh->transferred,
                                urbh->user_data);
        } else if (urb->type == USB_URB_TYPE_BULK ||
                        urb->type == USB_URB_TYPE_INTERRUPT) {
                fpusb_bulk_cb_fn callback = urbh->callback;
                if (callback)
-                       callback(devh, urbh, urbh->msg, status, urbh->transferred,
-                               urbh->user_data);
+                       callback(devh, urbh, status, urbh->endpoint, urbh->transfer_len,
+                               urbh->buffer, urbh->transferred, urbh->user_data);
        }
        return 0;
 }
@@ -570,8 +568,8 @@ struct sync_ctrl_handle {
 };
 
 static void ctrl_msg_cb(struct fpusb_dev_handle *devh,
-       struct fpusb_urb_handle *urbh, struct fpusb_ctrl_msg *msg,
-       enum fp_urb_cb_status status, unsigned char *data, int actual_length,
+       struct fpusb_urb_handle *urbh, enum fp_urb_cb_status status,
+       struct usb_ctrl_setup *setup, unsigned char *data, int actual_length,
        void *user_data)
 {
        struct sync_ctrl_handle *ctrlh = (struct sync_ctrl_handle *) user_data;
@@ -579,7 +577,7 @@ static void ctrl_msg_cb(struct fpusb_dev_handle *devh,
 
        if (status == FP_URB_COMPLETED) {
                /* copy results into user-defined buffer */
-               if (msg->requesttype & USB_ENDPOINT_IN)
+               if (setup->bRequestType & USB_ENDPOINT_IN)
                        memcpy(ctrlh->data, data, actual_length);
        }
 
@@ -628,8 +626,9 @@ struct sync_bulk_handle {
 };
 
 static void bulk_msg_cb(struct fpusb_dev_handle *devh,
-       struct fpusb_urb_handle *urbh, struct fpusb_bulk_msg *msg,
-       enum fp_urb_cb_status status, int actual_length, void *user_data)
+       struct fpusb_urb_handle *urbh, enum fp_urb_cb_status status,
+       unsigned char endpoint, int rqlength, unsigned char *data,
+       int actual_length, void *user_data)
 {
        struct sync_bulk_handle *bulkh = (struct sync_bulk_handle *) user_data;
        fp_dbg("");