author | xiaoliang.wang <xiaoliang.wang@amlogic.com> | 2018-10-24 08:40:26 (GMT) |
---|---|---|
committer | xiaoliang.wang <xiaoliang.wang@amlogic.com> | 2018-10-24 12:54:54 (GMT) |
commit | 686d817a2e10fee8c2bc600bc4f5879d84cbee8c (patch) | |
tree | 3bde0cbc69aef6fe06a61204149426b7f098b385 | |
parent | 156bcf78b9464ba6bf60b788a5b2352bd90a9cdb (diff) | |
download | common-686d817a2e10fee8c2bc600bc4f5879d84cbee8c.zip common-686d817a2e10fee8c2bc600bc4f5879d84cbee8c.tar.gz common-686d817a2e10fee8c2bc600bc4f5879d84cbee8c.tar.bz2 |
usb: patch for adb push fail[1/1]
PD#174155
patch for adb push fail
Change-Id: I8ee93156c2b9145659ff3d5eb0c4d6bd04f62e1e
Signed-off-by: xiaoliang.wang <xiaoliang.wang@amlogic.com>
-rw-r--r-- | drivers/usb/gadget/function/f_fs.c | 48 | ||||
-rw-r--r-- | drivers/usb/gadget/function/u_fs.h | 4 |
2 files changed, 42 insertions, 10 deletions
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 5b8b367..b72bf32 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -262,11 +262,22 @@ static int ffs_ready(struct ffs_data *ffs); static void ffs_closed(struct ffs_data *ffs); #ifdef CONFIG_AMLOGIC_USB -static int ffs_malloc_buffer(struct ffs_data *ffs) +static int ffs_malloc_buffer_init(struct ffs_data *ffs, int cout) { int i; + pr_info("assign_ffs_buffer FFS_BUFFER_MAX=%d!!!\n", FFS_BUFFER_MAX); for (i = 0; i < FFS_BUFFER_MAX; i++) { + ffs->buffer[i].data_ep = NULL; + ffs->buffer[i].data_state = -1; + } + + for (i = 0; i < cout; i++) { + if (i >= FFS_BUFFER_MAX) { + pr_err("<%s>wait alloc (%d) > define (%d)!!!\n", + __func__, cout, FFS_BUFFER_MAX); + break; + } ffs->buffer[i].data_ep = kzalloc(MAX_PAYLOAD_EPS, GFP_KERNEL); if (!ffs->buffer[i].data_ep) return -ENOMEM; @@ -276,14 +287,36 @@ static int ffs_malloc_buffer(struct ffs_data *ffs) return 0; } +struct ffs_data_buffer *ffs_retry_malloc_buffer(struct ffs_data *ffs) +{ + int i; + + pr_info("ffs_retry_malloc_buffer\n"); + for (i = 0; i < FFS_BUFFER_MAX; i++) { + if (ffs->buffer[i].data_state == -1) { + ffs->buffer[i].data_ep + = kzalloc(MAX_PAYLOAD_EPS, GFP_KERNEL); + if (!ffs->buffer[i].data_ep) + return NULL; + ffs->buffer[i].data_state = 0; + return &(ffs->buffer[i]); + } + } + pr_info("assign_ffs_buffer failed, FFS_BUFFER_MAX(%d) is too small!!!\n", + FFS_BUFFER_MAX); + return NULL; +} + static void ffs_free_buffer(struct ffs_data *ffs) { int i; for (i = 0; i < FFS_BUFFER_MAX; i++) { - kfree(ffs->buffer[i].data_ep); - ffs->buffer[i].data_ep = NULL; - ffs->buffer[i].data_state = 0; + if (ffs->buffer[i].data_state != -1) { + kfree(ffs->buffer[i].data_ep); + ffs->buffer[i].data_ep = NULL; + ffs->buffer[i].data_state = 0; + } } } @@ -298,8 +331,7 @@ static struct ffs_data_buffer *assign_ffs_buffer(struct ffs_data *ffs) } } - pr_info("assign_ffs_buffer failed!!!\n"); - return NULL; + return ffs_retry_malloc_buffer(ffs); } static void release_ffs_buffer(struct ffs_data *ffs, @@ -1073,7 +1105,7 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) *reboot adb disconnect,so buffer aways used assign_ffs_buffer. */ buffer = assign_ffs_buffer(epfile->ffs); - data_aio_flag = -1; + data_aio_flag = 1; if (unlikely(!buffer)) { ret = -ENOMEM; spin_unlock_irq(&epfile->ffs->eps_lock); @@ -1653,7 +1685,7 @@ ffs_fs_mount(struct file_system_type *t, int flags, if (unlikely(!ffs->data_ep0)) return ERR_PTR(-ENOMEM); - ret = ffs_malloc_buffer(ffs); + ret = ffs_malloc_buffer_init(ffs, 10); if (ret < 0) return ERR_PTR(ret); diff --git a/drivers/usb/gadget/function/u_fs.h b/drivers/usb/gadget/function/u_fs.h index 1ddb963..f9fea06 100644 --- a/drivers/usb/gadget/function/u_fs.h +++ b/drivers/usb/gadget/function/u_fs.h @@ -147,10 +147,10 @@ enum ffs_setup_state { FFS_SETUP_CANCELLED }; -#define FFS_BUFFER_MAX 10 +#define FFS_BUFFER_MAX 100 struct ffs_data_buffer { char *data_ep; - bool data_state; + int data_state; }; struct ffs_data { |