Applied patch to make USB g_file_storage driver work in both read and write modes. Corrected a problem related to the USB endpoint not generating an interrupt, found this post:

http://www.arm9home.net/simple/index.php?t1753.html
------------ snip -------------
This is a patch that seems to make the USB hangs on the S3C2440 go away. At
least a good amount of ping torture didn't make them come back so far.

The issue is that, if there are several back-to-back packets,
sometimes no interrupt is generated for one of them. This
seems to be caused by the mysterious dual packet mode, which
the USB hardware enters automatically if the endpoint size is
half that of the FIFO. (On the 2440, this is the normal
situation for bulk data endpoints.)

There is also a timing factor in this. I think what happens is
that the USB hardware automatically sends an acknowledgement
if there is only one packet in the FIFO (the FIFO has space
for two). If another packet arrives before the host has
retrieved and acknowledged the previous one, no interrupt is
generated for that second one.

However, there may be an indication. There is one undocumented
bit (none of the 244x manuals document it), OUT_CRS1_REG[1],
that seems to be set suspiciously often when this condition
occurs. There is also CLR_DATA_TOGGLE, OUT_CRS1_REG[7], which
may have a function related to this. (The Samsung manual is
rather terse on that, as usual.)

This needs to be examined further. For now, the patch seems to do the
trick.

Note that this is not a clean solution by any means, because we
might potentially get stuck in that interrupt for quite a while.

Index: linux-2.6.28.8/drivers/usb/gadget/s3c2410_udc.c
===================================================================
--- linux-2.6.28.8.orig/drivers/usb/gadget/s3c2410_udc.c    2009-03-17 21:14:28.000000000 +0100
+++ linux-2.6.28.8/drivers/usb/gadget/s3c2410_udc.c    2009-03-17 21:14:46.000000000 +0100
@@ -843,6 +843,7 @@
     u32            ep_csr1;
     u32            idx;

+handle_ep_again:
     if (likely (!list_empty(&ep->queue)))
         req = list_entry(ep->queue.next,
                 struct s3c2410_request, queue);
@@ -882,6 +883,8 @@

         if ((ep_csr1 & S3C2410_UDC_OCSR1_PKTRDY) && req) {
             s3c2410_udc_read_fifo(ep,req);
+            if (s3c2410_udc_fifo_count_out())
+                goto handle_ep_again;
         }
     }
}
---------------- snip ----------------