[PATCH 2/2] usb: gadget: storage: make FSG_BUFLEN configurable on Kconfig

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



By making that configurable on Kconfig, we won't
need to modify source code when we want to change
the way f_mass_storage behaves for a specific
product.

Signed-off-by: Felipe Balbi <balbi@xxxxxx>
---
 drivers/usb/gadget/Kconfig          | 15 +++++++++++++++
 drivers/usb/gadget/f_mass_storage.c | 17 ++++++++++-------
 drivers/usb/gadget/storage_common.h |  3 ---
 3 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 0ae2e65..f3b9702 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -127,6 +127,21 @@ config USB_GADGET_STORAGE_NUM_BUFFERS
 	   a module parameter as well.
 	   If unsure, say 2.
 
+config USB_GADGET_STORAGE_BUFLEN
+	int "Size of each storage pipeline buffer"
+	range 4096 131072
+	default 16384
+	help
+	  For USB2-based device controllers, 16KiB of buffer space is
+	  usually enough to maintain the HW FIFOs full during an entire
+	  session.
+
+	  When dealing with USB3 device controllers, however, 16KiB is
+	  not enough.
+
+	  Change this to match your device requirements. If unsure, say
+	  16384.
+
 #
 # USB Peripheral Controller Support
 #
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index a03ba2c..fee97c9 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -675,7 +675,7 @@ static int do_read(struct fsg_common *common)
 		 * But don't read more than the buffer size.
 		 * And don't try to read past the end of the file.
 		 */
-		amount = min(amount_left, FSG_BUFLEN);
+		amount = min_t(u32, amount_left, CONFIG_USB_GADGET_STORAGE_BUFLEN);
 		amount = min((loff_t)amount,
 			     curlun->file_length - file_offset);
 
@@ -825,7 +825,8 @@ static int do_write(struct fsg_common *common)
 			 * Try to get the remaining amount,
 			 * but not more than the buffer size.
 			 */
-			amount = min(amount_left_to_req, FSG_BUFLEN);
+			amount = min_t(u32, amount_left_to_req,
+					CONFIG_USB_GADGET_STORAGE_BUFLEN);
 
 			/* Beyond the end of the backing file? */
 			if (usb_offset >= curlun->file_length) {
@@ -1029,7 +1030,8 @@ static int do_verify(struct fsg_common *common)
 		 * the buffer size.
 		 * And don't try to read past the end of the file.
 		 */
-		amount = min(amount_left, FSG_BUFLEN);
+		amount = min_t(u32, amount_left,
+				CONFIG_USB_GADGET_STORAGE_BUFLEN);
 		amount = min((loff_t)amount,
 			     curlun->file_length - file_offset);
 		if (amount == 0) {
@@ -1260,7 +1262,7 @@ static int do_mode_sense(struct fsg_common *common, struct fsg_buffhd *bh)
 	} else {			/* MODE_SENSE_10 */
 		buf[3] = (curlun->ro ? 0x80 : 0x00);		/* WP, DPOFUA */
 		buf += 8;
-		limit = 65535;		/* Should really be FSG_BUFLEN */
+		limit = 65535;		/* Should really be CONFIG_USB_GADGET_STORAGE_BUFLEN */
 	}
 
 	/* No block descriptors */
@@ -1487,7 +1489,8 @@ static int throw_away_data(struct fsg_common *common)
 		bh = common->next_buffhd_to_fill;
 		if (bh->state == BUF_STATE_EMPTY
 		 && common->usb_amount_left > 0) {
-			amount = min(common->usb_amount_left, FSG_BUFLEN);
+			amount = min_t(u32, common->usb_amount_left,
+					CONFIG_USB_GADGET_STORAGE_BUFLEN);
 
 			/*
 			 * Except at the end of the transfer, amount will be
@@ -2721,7 +2724,7 @@ int fsg_common_set_num_buffers(struct fsg_common *common, unsigned int n)
 		bh->next = bh + 1;
 		++bh;
 buffhds_first_it:
-		bh->buf = kmalloc(FSG_BUFLEN, GFP_KERNEL);
+		bh->buf = kmalloc(CONFIG_USB_GADGET_STORAGE_BUFLEN, GFP_KERNEL);
 		if (unlikely(!bh->buf))
 			goto error_release;
 	} while (--i);
@@ -3146,7 +3149,7 @@ static int fsg_bind(struct usb_configuration *c, struct usb_function *f)
 		fsg_fs_bulk_out_desc.bEndpointAddress;
 
 	/* Calculate bMaxBurst, we know packet size is 1024 */
-	max_burst = min_t(unsigned, FSG_BUFLEN / 1024, 15);
+	max_burst = min_t(u32, CONFIG_USB_GADGET_STORAGE_BUFLEN / 1024, 15);
 
 	fsg_ss_bulk_in_desc.bEndpointAddress =
 		fsg_fs_bulk_in_desc.bEndpointAddress;
diff --git a/drivers/usb/gadget/storage_common.h b/drivers/usb/gadget/storage_common.h
index c74c2fd..4610260 100644
--- a/drivers/usb/gadget/storage_common.h
+++ b/drivers/usb/gadget/storage_common.h
@@ -123,9 +123,6 @@ static inline bool fsg_lun_is_open(struct fsg_lun *curlun)
 #define EP0_BUFSIZE	256
 #define DELAYED_STATUS	(EP0_BUFSIZE + 999)	/* An impossibly large value */
 
-/* Default size of buffer length. */
-#define FSG_BUFLEN	((u32)16384)
-
 /* Maximal number of LUNs supported in mass storage function */
 #define FSG_MAX_LUNS	8
 
-- 
1.8.4.GIT

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux