Loading drivers/usb/gadget/function/f_mtp.c +26 −6 Original line number Diff line number Diff line Loading @@ -73,6 +73,9 @@ #define MTP_RESPONSE_DEVICE_BUSY 0x2019 #define DRIVER_NAME "mtp" unsigned int mtp_rx_req_len = MTP_BULK_BUFFER_SIZE; module_param(mtp_rx_req_len, uint, 0644); static const char mtp_shortname[] = DRIVER_NAME "_usb"; struct mtp_dev { Loading Loading @@ -508,10 +511,27 @@ static int mtp_create_bulk_endpoints(struct mtp_dev *dev, req->complete = mtp_complete_in; mtp_req_put(dev, &dev->tx_idle, req); } /* * The RX buffer should be aligned to EP max packet for * some controllers. At bind time, we don't know the * operational speed. Hence assuming super speed max * packet size. */ if (mtp_rx_req_len % 1024) mtp_rx_req_len = MTP_BULK_BUFFER_SIZE; retry_rx_alloc: for (i = 0; i < RX_REQ_MAX; i++) { req = mtp_request_new(dev->ep_out, MTP_BULK_BUFFER_SIZE); if (!req) req = mtp_request_new(dev->ep_out, mtp_rx_req_len); if (!req) { if (mtp_rx_req_len <= MTP_BULK_BUFFER_SIZE) goto fail; for (; i > 0; i--) mtp_request_free(dev->rx_req[i], dev->ep_out); mtp_rx_req_len = MTP_BULK_BUFFER_SIZE; goto retry_rx_alloc; } req->complete = mtp_complete_out; dev->rx_req[i] = req; } Loading Loading @@ -541,7 +561,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, DBG(cdev, "mtp_read(%zu)\n", count); if (count > MTP_BULK_BUFFER_SIZE) if (count > mtp_rx_req_len) return -EINVAL; if (!IS_ALIGNED(count, dev->ep_out->maxpacket)) Loading Loading @@ -569,7 +589,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, requeue_req: /* queue a request */ req = dev->rx_req[0]; req->length = MTP_BULK_BUFFER_SIZE; req->length = mtp_rx_req_len; dev->rx_done = 0; ret = usb_ep_queue(dev->ep_out, req, GFP_KERNEL); if (ret < 0) { Loading Loading @@ -837,7 +857,7 @@ static void receive_file_work(struct work_struct *data) cur_buf = (cur_buf + 1) % RX_REQ_MAX; /* some h/w expects size to be aligned to ep's MTU */ read_req->length = MTP_BULK_BUFFER_SIZE; read_req->length = mtp_rx_req_len; dev->rx_done = 0; ret = usb_ep_queue(dev->ep_out, read_req, GFP_KERNEL); Loading Loading
drivers/usb/gadget/function/f_mtp.c +26 −6 Original line number Diff line number Diff line Loading @@ -73,6 +73,9 @@ #define MTP_RESPONSE_DEVICE_BUSY 0x2019 #define DRIVER_NAME "mtp" unsigned int mtp_rx_req_len = MTP_BULK_BUFFER_SIZE; module_param(mtp_rx_req_len, uint, 0644); static const char mtp_shortname[] = DRIVER_NAME "_usb"; struct mtp_dev { Loading Loading @@ -508,10 +511,27 @@ static int mtp_create_bulk_endpoints(struct mtp_dev *dev, req->complete = mtp_complete_in; mtp_req_put(dev, &dev->tx_idle, req); } /* * The RX buffer should be aligned to EP max packet for * some controllers. At bind time, we don't know the * operational speed. Hence assuming super speed max * packet size. */ if (mtp_rx_req_len % 1024) mtp_rx_req_len = MTP_BULK_BUFFER_SIZE; retry_rx_alloc: for (i = 0; i < RX_REQ_MAX; i++) { req = mtp_request_new(dev->ep_out, MTP_BULK_BUFFER_SIZE); if (!req) req = mtp_request_new(dev->ep_out, mtp_rx_req_len); if (!req) { if (mtp_rx_req_len <= MTP_BULK_BUFFER_SIZE) goto fail; for (; i > 0; i--) mtp_request_free(dev->rx_req[i], dev->ep_out); mtp_rx_req_len = MTP_BULK_BUFFER_SIZE; goto retry_rx_alloc; } req->complete = mtp_complete_out; dev->rx_req[i] = req; } Loading Loading @@ -541,7 +561,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, DBG(cdev, "mtp_read(%zu)\n", count); if (count > MTP_BULK_BUFFER_SIZE) if (count > mtp_rx_req_len) return -EINVAL; if (!IS_ALIGNED(count, dev->ep_out->maxpacket)) Loading Loading @@ -569,7 +589,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, requeue_req: /* queue a request */ req = dev->rx_req[0]; req->length = MTP_BULK_BUFFER_SIZE; req->length = mtp_rx_req_len; dev->rx_done = 0; ret = usb_ep_queue(dev->ep_out, req, GFP_KERNEL); if (ret < 0) { Loading Loading @@ -837,7 +857,7 @@ static void receive_file_work(struct work_struct *data) cur_buf = (cur_buf + 1) % RX_REQ_MAX; /* some h/w expects size to be aligned to ep's MTU */ read_req->length = MTP_BULK_BUFFER_SIZE; read_req->length = mtp_rx_req_len; dev->rx_done = 0; ret = usb_ep_queue(dev->ep_out, read_req, GFP_KERNEL); Loading