From e510592d98153d95faea77c2c57ec72ed052dba7 Mon Sep 17 00:00:00 2001 From: Chiranjeevi Velempati Date: Thu, 19 Jan 2012 12:25:26 +0530 Subject: [PATCH] USB: u_bam: Avoid workqueue for data received from BAM DMUX layer BAM DMUX driver gives the data to the USB in work context and USB is once again scheduling work for sending the data to the host. This change avoid's the double work queue scheduling for the data received from BAM DMUX, which might reduce the cpu usage and improve the throughputs. Change-Id: Ib66bc7f46f9436704e0d28b72771de50462ddf4b Signed-off-by: Chiranjeevi Velempati --- drivers/usb/gadget/u_bam.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/usb/gadget/u_bam.c b/drivers/usb/gadget/u_bam.c index 23e0da80a88..30f30cf4d4c 100644 --- a/drivers/usb/gadget/u_bam.c +++ b/drivers/usb/gadget/u_bam.c @@ -177,19 +177,15 @@ static int gbam_alloc_requests(struct usb_ep *ep, struct list_head *head, /*--------------------------------------------- */ /*------------data_path----------------------------*/ -static void gbam_write_data_tohost(struct work_struct *w) +static void gbam_write_data_tohost(struct gbam_port *port) { unsigned long flags; - struct bam_ch_info *d; - struct gbam_port *port; + struct bam_ch_info *d = &port->data_ch; struct sk_buff *skb; int ret; struct usb_request *req; struct usb_ep *ep; - d = container_of(w, struct bam_ch_info, write_tohost_w); - port = d->port; - spin_lock_irqsave(&port->port_lock_dl, flags); if (!port->port_usb) { spin_unlock_irqrestore(&port->port_lock_dl, flags); @@ -234,6 +230,17 @@ static void gbam_write_data_tohost(struct work_struct *w) spin_unlock_irqrestore(&port->port_lock_dl, flags); } +static void gbam_write_data_tohost_w(struct work_struct *w) +{ + struct bam_ch_info *d; + struct gbam_port *port; + + d = container_of(w, struct bam_ch_info, write_tohost_w); + port = d->port; + + gbam_write_data_tohost(port); +} + void gbam_data_recv_cb(void *p, struct sk_buff *skb) { struct gbam_port *port = p; @@ -266,7 +273,7 @@ void gbam_data_recv_cb(void *p, struct sk_buff *skb) __skb_queue_tail(&d->tx_skb_q, skb); spin_unlock_irqrestore(&port->port_lock_dl, flags); - queue_work(gbam_wq, &d->write_tohost_w); + gbam_write_data_tohost(port); } void gbam_data_write_done(void *p, struct sk_buff *skb) @@ -877,7 +884,7 @@ static int gbam_port_alloc(int portno) INIT_LIST_HEAD(&d->tx_idle); INIT_LIST_HEAD(&d->rx_idle); INIT_WORK(&d->write_tobam_w, gbam_data_write_tobam); - INIT_WORK(&d->write_tohost_w, gbam_write_data_tohost); + INIT_WORK(&d->write_tohost_w, gbam_write_data_tohost_w); skb_queue_head_init(&d->tx_skb_q); skb_queue_head_init(&d->rx_skb_q); d->id = bam_ch_ids[portno];