aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2005-11-29 12:04:24 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-04 16:51:40 -0500
commita21d4fed4b00eaf7e7c3b2e2b25de24f540bfa66 (patch)
treeb903c111c0319e44ba5a724d6d87f7754c5a4fcc /drivers
parentbd39b7f195e5a780a3c6710eb1c1450f158a1f31 (diff)
[PATCH] USB Gadget: file_storage: remove "volatile" declarations
This patch (as612) removes the "volatile" declarations from the file-storage gadget. It turns out that they aren't needed for anything much; adding a few memory barriers does a sufficient job. The patch also removes a wait_queue. Not much point having a queue when only one task is ever going to be on it! Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/usb/gadget/file_storage.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index f6c49b717d3f..0cea9782d7d4 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -239,7 +239,6 @@
239#include <linux/string.h> 239#include <linux/string.h>
240#include <linux/suspend.h> 240#include <linux/suspend.h>
241#include <linux/utsname.h> 241#include <linux/utsname.h>
242#include <linux/wait.h>
243 242
244#include <linux/usb_ch9.h> 243#include <linux/usb_ch9.h>
245#include <linux/usb_gadget.h> 244#include <linux/usb_gadget.h>
@@ -251,7 +250,7 @@
251 250
252#define DRIVER_DESC "File-backed Storage Gadget" 251#define DRIVER_DESC "File-backed Storage Gadget"
253#define DRIVER_NAME "g_file_storage" 252#define DRIVER_NAME "g_file_storage"
254#define DRIVER_VERSION "20 October 2004" 253#define DRIVER_VERSION "28 November 2005"
255 254
256static const char longname[] = DRIVER_DESC; 255static const char longname[] = DRIVER_DESC;
257static const char shortname[] = DRIVER_NAME; 256static const char shortname[] = DRIVER_NAME;
@@ -588,7 +587,7 @@ enum fsg_buffer_state {
588struct fsg_buffhd { 587struct fsg_buffhd {
589 void *buf; 588 void *buf;
590 dma_addr_t dma; 589 dma_addr_t dma;
591 volatile enum fsg_buffer_state state; 590 enum fsg_buffer_state state;
592 struct fsg_buffhd *next; 591 struct fsg_buffhd *next;
593 592
594 /* The NetChip 2280 is faster, and handles some protocol faults 593 /* The NetChip 2280 is faster, and handles some protocol faults
@@ -597,9 +596,9 @@ struct fsg_buffhd {
597 unsigned int bulk_out_intended_length; 596 unsigned int bulk_out_intended_length;
598 597
599 struct usb_request *inreq; 598 struct usb_request *inreq;
600 volatile int inreq_busy; 599 int inreq_busy;
601 struct usb_request *outreq; 600 struct usb_request *outreq;
602 volatile int outreq_busy; 601 int outreq_busy;
603}; 602};
604 603
605enum fsg_state { 604enum fsg_state {
@@ -637,11 +636,11 @@ struct fsg_dev {
637 636
638 struct usb_ep *ep0; // Handy copy of gadget->ep0 637 struct usb_ep *ep0; // Handy copy of gadget->ep0
639 struct usb_request *ep0req; // For control responses 638 struct usb_request *ep0req; // For control responses
640 volatile unsigned int ep0_req_tag; 639 unsigned int ep0_req_tag;
641 const char *ep0req_name; 640 const char *ep0req_name;
642 641
643 struct usb_request *intreq; // For interrupt responses 642 struct usb_request *intreq; // For interrupt responses
644 volatile int intreq_busy; 643 int intreq_busy;
645 struct fsg_buffhd *intr_buffhd; 644 struct fsg_buffhd *intr_buffhd;
646 645
647 unsigned int bulk_out_maxpacket; 646 unsigned int bulk_out_maxpacket;
@@ -671,7 +670,6 @@ struct fsg_dev {
671 struct fsg_buffhd *next_buffhd_to_drain; 670 struct fsg_buffhd *next_buffhd_to_drain;
672 struct fsg_buffhd buffhds[NUM_BUFFERS]; 671 struct fsg_buffhd buffhds[NUM_BUFFERS];
673 672
674 wait_queue_head_t thread_wqh;
675 int thread_wakeup_needed; 673 int thread_wakeup_needed;
676 struct completion thread_notifier; 674 struct completion thread_notifier;
677 struct task_struct *thread_task; 675 struct task_struct *thread_task;
@@ -1076,11 +1074,13 @@ static int populate_config_buf(struct usb_gadget *gadget,
1076 1074
1077/* These routines may be called in process context or in_irq */ 1075/* These routines may be called in process context or in_irq */
1078 1076
1077/* Caller must hold fsg->lock */
1079static void wakeup_thread(struct fsg_dev *fsg) 1078static void wakeup_thread(struct fsg_dev *fsg)
1080{ 1079{
1081 /* Tell the main thread that something has happened */ 1080 /* Tell the main thread that something has happened */
1082 fsg->thread_wakeup_needed = 1; 1081 fsg->thread_wakeup_needed = 1;
1083 wake_up_all(&fsg->thread_wqh); 1082 if (fsg->thread_task)
1083 wake_up_process(fsg->thread_task);
1084} 1084}
1085 1085
1086 1086
@@ -1167,11 +1167,12 @@ static void bulk_in_complete(struct usb_ep *ep, struct usb_request *req)
1167 usb_ep_fifo_flush(ep); 1167 usb_ep_fifo_flush(ep);
1168 1168
1169 /* Hold the lock while we update the request and buffer states */ 1169 /* Hold the lock while we update the request and buffer states */
1170 smp_wmb();
1170 spin_lock(&fsg->lock); 1171 spin_lock(&fsg->lock);
1171 bh->inreq_busy = 0; 1172 bh->inreq_busy = 0;
1172 bh->state = BUF_STATE_EMPTY; 1173 bh->state = BUF_STATE_EMPTY;
1173 spin_unlock(&fsg->lock);
1174 wakeup_thread(fsg); 1174 wakeup_thread(fsg);
1175 spin_unlock(&fsg->lock);
1175} 1176}
1176 1177
1177static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req) 1178static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req)
@@ -1188,11 +1189,12 @@ static void bulk_out_complete(struct usb_ep *ep, struct usb_request *req)
1188 usb_ep_fifo_flush(ep); 1189 usb_ep_fifo_flush(ep);
1189 1190
1190 /* Hold the lock while we update the request and buffer states */ 1191 /* Hold the lock while we update the request and buffer states */
1192 smp_wmb();
1191 spin_lock(&fsg->lock); 1193 spin_lock(&fsg->lock);
1192 bh->outreq_busy = 0; 1194 bh->outreq_busy = 0;
1193 bh->state = BUF_STATE_FULL; 1195 bh->state = BUF_STATE_FULL;
1194 spin_unlock(&fsg->lock);
1195 wakeup_thread(fsg); 1196 wakeup_thread(fsg);
1197 spin_unlock(&fsg->lock);
1196} 1198}
1197 1199
1198 1200
@@ -1209,11 +1211,12 @@ static void intr_in_complete(struct usb_ep *ep, struct usb_request *req)
1209 usb_ep_fifo_flush(ep); 1211 usb_ep_fifo_flush(ep);
1210 1212
1211 /* Hold the lock while we update the request and buffer states */ 1213 /* Hold the lock while we update the request and buffer states */
1214 smp_wmb();
1212 spin_lock(&fsg->lock); 1215 spin_lock(&fsg->lock);
1213 fsg->intreq_busy = 0; 1216 fsg->intreq_busy = 0;
1214 bh->state = BUF_STATE_EMPTY; 1217 bh->state = BUF_STATE_EMPTY;
1215 spin_unlock(&fsg->lock);
1216 wakeup_thread(fsg); 1218 wakeup_thread(fsg);
1219 spin_unlock(&fsg->lock);
1217} 1220}
1218 1221
1219#else 1222#else
@@ -1264,8 +1267,8 @@ static void received_cbi_adsc(struct fsg_dev *fsg, struct fsg_buffhd *bh)
1264 fsg->cbbuf_cmnd_size = req->actual; 1267 fsg->cbbuf_cmnd_size = req->actual;
1265 memcpy(fsg->cbbuf_cmnd, req->buf, fsg->cbbuf_cmnd_size); 1268 memcpy(fsg->cbbuf_cmnd, req->buf, fsg->cbbuf_cmnd_size);
1266 1269
1267 spin_unlock(&fsg->lock);
1268 wakeup_thread(fsg); 1270 wakeup_thread(fsg);
1271 spin_unlock(&fsg->lock);
1269} 1272}
1270 1273
1271#else 1274#else
@@ -1517,8 +1520,8 @@ static int fsg_setup(struct usb_gadget *gadget,
1517 1520
1518/* Use this for bulk or interrupt transfers, not ep0 */ 1521/* Use this for bulk or interrupt transfers, not ep0 */
1519static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep, 1522static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
1520 struct usb_request *req, volatile int *pbusy, 1523 struct usb_request *req, int *pbusy,
1521 volatile enum fsg_buffer_state *state) 1524 enum fsg_buffer_state *state)
1522{ 1525{
1523 int rc; 1526 int rc;
1524 1527
@@ -1526,8 +1529,11 @@ static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
1526 dump_msg(fsg, "bulk-in", req->buf, req->length); 1529 dump_msg(fsg, "bulk-in", req->buf, req->length);
1527 else if (ep == fsg->intr_in) 1530 else if (ep == fsg->intr_in)
1528 dump_msg(fsg, "intr-in", req->buf, req->length); 1531 dump_msg(fsg, "intr-in", req->buf, req->length);
1532
1533 spin_lock_irq(&fsg->lock);
1529 *pbusy = 1; 1534 *pbusy = 1;
1530 *state = BUF_STATE_BUSY; 1535 *state = BUF_STATE_BUSY;
1536 spin_unlock_irq(&fsg->lock);
1531 rc = usb_ep_queue(ep, req, GFP_KERNEL); 1537 rc = usb_ep_queue(ep, req, GFP_KERNEL);
1532 if (rc != 0) { 1538 if (rc != 0) {
1533 *pbusy = 0; 1539 *pbusy = 0;
@@ -1547,14 +1553,23 @@ static void start_transfer(struct fsg_dev *fsg, struct usb_ep *ep,
1547 1553
1548static int sleep_thread(struct fsg_dev *fsg) 1554static int sleep_thread(struct fsg_dev *fsg)
1549{ 1555{
1550 int rc; 1556 int rc = 0;
1551 1557
1552 /* Wait until a signal arrives or we are woken up */ 1558 /* Wait until a signal arrives or we are woken up */
1553 rc = wait_event_interruptible(fsg->thread_wqh, 1559 for (;;) {
1554 fsg->thread_wakeup_needed); 1560 try_to_freeze();
1561 set_current_state(TASK_INTERRUPTIBLE);
1562 if (signal_pending(current)) {
1563 rc = -EINTR;
1564 break;
1565 }
1566 if (fsg->thread_wakeup_needed)
1567 break;
1568 schedule();
1569 }
1570 __set_current_state(TASK_RUNNING);
1555 fsg->thread_wakeup_needed = 0; 1571 fsg->thread_wakeup_needed = 0;
1556 try_to_freeze(); 1572 return rc;
1557 return (rc ? -EINTR : 0);
1558} 1573}
1559 1574
1560 1575
@@ -1791,6 +1806,7 @@ static int do_write(struct fsg_dev *fsg)
1791 if (bh->state == BUF_STATE_EMPTY && !get_some_more) 1806 if (bh->state == BUF_STATE_EMPTY && !get_some_more)
1792 break; // We stopped early 1807 break; // We stopped early
1793 if (bh->state == BUF_STATE_FULL) { 1808 if (bh->state == BUF_STATE_FULL) {
1809 smp_rmb();
1794 fsg->next_buffhd_to_drain = bh->next; 1810 fsg->next_buffhd_to_drain = bh->next;
1795 bh->state = BUF_STATE_EMPTY; 1811 bh->state = BUF_STATE_EMPTY;
1796 1812
@@ -2359,6 +2375,7 @@ static int throw_away_data(struct fsg_dev *fsg)
2359 2375
2360 /* Throw away the data in a filled buffer */ 2376 /* Throw away the data in a filled buffer */
2361 if (bh->state == BUF_STATE_FULL) { 2377 if (bh->state == BUF_STATE_FULL) {
2378 smp_rmb();
2362 bh->state = BUF_STATE_EMPTY; 2379 bh->state = BUF_STATE_EMPTY;
2363 fsg->next_buffhd_to_drain = bh->next; 2380 fsg->next_buffhd_to_drain = bh->next;
2364 2381
@@ -3024,6 +3041,7 @@ static int get_next_command(struct fsg_dev *fsg)
3024 if ((rc = sleep_thread(fsg)) != 0) 3041 if ((rc = sleep_thread(fsg)) != 0)
3025 return rc; 3042 return rc;
3026 } 3043 }
3044 smp_rmb();
3027 rc = received_cbw(fsg, bh); 3045 rc = received_cbw(fsg, bh);
3028 bh->state = BUF_STATE_EMPTY; 3046 bh->state = BUF_STATE_EMPTY;
3029 3047
@@ -4072,7 +4090,6 @@ static int __init fsg_alloc(void)
4072 spin_lock_init(&fsg->lock); 4090 spin_lock_init(&fsg->lock);
4073 init_rwsem(&fsg->filesem); 4091 init_rwsem(&fsg->filesem);
4074 kref_init(&fsg->ref); 4092 kref_init(&fsg->ref);
4075 init_waitqueue_head(&fsg->thread_wqh);
4076 init_completion(&fsg->thread_notifier); 4093 init_completion(&fsg->thread_notifier);
4077 4094
4078 the_fsg = fsg; 4095 the_fsg = fsg;