Don't pass ctrl_msg/bulk_msg structures through async paths

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.
This commit is contained in:
Daniel Drake
2007-12-12 23:32:54 +00:00
parent a8d2881eb7
commit dfac6756fa
4 changed files with 29 additions and 29 deletions

View 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);

View 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);

View 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;

View 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("");