All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marek Vasut <marex@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v5 2/2] common: usb_storage : Implement logic to calculate optimal usb maximum trasfer blocks
Date: Tue, 14 Jun 2016 14:11:16 +0200	[thread overview]
Message-ID: <575FF464.7030405@denx.de> (raw)
In-Reply-To: <HE1PR0401MB202820873DA742FB8730322BE3540@HE1PR0401MB2028.eurprd04.prod.outlook.com>

On 06/14/2016 05:41 AM, Rajesh Bhagat wrote:
> 
> 
>> -----Original Message-----
>> From: Marek Vasut [mailto:marex at denx.de]
>> Sent: Monday, June 13, 2016 7:07 PM
>> To: Rajesh Bhagat <rajesh.bhagat@nxp.com>; u-boot at lists.denx.de
>> Cc: sjg at chromium.org; york sun <york.sun@nxp.com>; Sriram Dash
>> <sriram.dash@nxp.com>; Rajesh Bhagat <rajesh.bhagat@freescale.com>
>> Subject: Re: [PATCH v5 2/2] common: usb_storage : Implement logic to calculate
>> optimal usb maximum trasfer blocks
>>
>> On 06/13/2016 06:03 AM, Rajesh Bhagat wrote:
>>> From: Rajesh Bhagat <rajesh.bhagat@freescale.com>
>>>
>>> Implements the logic to calculate the optimal usb maximum trasfer
>>> blocks instead of sending USB_MAX_XFER_BLK blocks which is 65535 and
>>> 20 in case of EHCI and other USB protocols respectively.
>>>
>>> It defines USB_MIN_XFER_BLK/USB_MAX_XFER_BLK trasfer blocks that
>>> should be checked for success starting from minimum to maximum, and
>>> rest of the read/write are performed with that optimal value. It tries
>>> to increase/ decrease the blocks in follwing scenarios:
>>>
>>> 1.decrease blocks: when read/write for a particular number of blocks
>>> fails.
>>> 2. increase blocks: when read/write for a particular number of blocks
>>> pass and amount left to trasfer is greater than current number of
>>> blocks.
>>>
>>> Currently changes are done for EHCI where min = 4096 and max = 65535
>>> is taken. And for other cases code is left unchanged by keeping min =
>>> max = 20.
>>>
>>> Signed-off-by: Sriram Dash <sriram.dash@nxp.com>
>>> Signed-off-by: Rajesh Bhagat <rajesh.bhagat@nxp.com>
>>> ---
>>> Changes in v5:
>>>  - None
>>>
>>> Changes in v4:
>>>  - Adds udev paramater in dec/inc_cur_xfer_blks function and adds
>>>    sanity check on it.
>>>  - Changes type of pos varible to unsigned int in
>>> dec/inc_cur_xfer_blks
>>>  - Removes usage of pos varible from usb_stor_read/write
>>>
>>> Changes in v3:
>>>  - Adds cur_xfer_blks in struct usb_device to retain values
>>>  - Adds functions dec/inc_cur_xfer_blks to remove code duplication
>>>  - Moves check from macro to calling functions
>>>
>>> Changes in v2:
>>>  - Removes table to store blocks and use formula (1 << (12 + n)) - 1
>>>  - Adds logic to start from minimum, go to maximum in each read/write
>>>
>>>  common/usb_storage.c |   67
>> ++++++++++++++++++++++++++++++++++++++++++++++---
>>>  include/usb.h        |    1 +
>>>  2 files changed, 63 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/common/usb_storage.c b/common/usb_storage.c index
>>> f060637..9b09412 100644
>>> --- a/common/usb_storage.c
>>> +++ b/common/usb_storage.c
>>> @@ -106,11 +106,16 @@ struct us_data {
>>>   * enough free heap space left, but the SCSI READ(10) and WRITE(10) commands
>> are
>>>   * limited to 65535 blocks.
>>>   */
>>> +#define USB_MIN_XFER_BLK	4095
>>>  #define USB_MAX_XFER_BLK	65535
>>>  #else
>>> +#define USB_MIN_XFER_BLK	20
>>>  #define USB_MAX_XFER_BLK	20
>>>  #endif
>>>
>>> +#define GET_CUR_XFER_BLKS(blks)	(LOG2((blks + 1) /
>> (USB_MIN_XFER_BLK + 1)))
>>> +#define CALC_CUR_XFER_BLKS(pos)	((1 << (12 + pos)) - 1)
> 
> Hello Marek,
> 
>>
>> Parenthesis around variables are missing.
>>
> 
> Will take care in v6. 
> 
>>>  #ifndef CONFIG_BLK
>>>  static struct us_data usb_stor[USB_MAX_STOR_DEV];  #endif @@ -141,6
>>> +146,44 @@ static void usb_show_progress(void)
>>>  	debug(".");
>>>  }
>>>
>>> +static int dec_cur_xfer_blks(struct usb_device *udev) {
>>> +	/* decrease the cur_xfer_blks */
>>> +	unsigned int pos;
>>> +	unsigned short size;
>>> +
>>> +	if (!udev)
>>> +		return -EINVAL;
>>> +
>>> +	pos = GET_CUR_XFER_BLKS(udev->cur_xfer_blks);
>>> +	size  = pos ? CALC_CUR_XFER_BLKS(pos - 1) : 0;
>>
>> If pos == 0 , the condition below will be true (size will be 2047), so this extra ternary
>> is unnecessary.
>>
> 
> Will take care in v6. Will remove the extra ternary operator used, as 2047 will follow the 
> below check (size < USB_MIN_XFER_BLK) and code will work fine. 
> 
>>> +	if (size < USB_MIN_XFER_BLK)
>>> +		return -EINVAL;
>>> +
>>> +	udev->cur_xfer_blks = size;
>>> +	return 0;
>>> +}
>>> +
>>> +static int inc_cur_xfer_blks(struct usb_device *udev, lbaint_t blks)
>>> +{
>>> +	/* try to increase the cur_xfer_blks */
>>> +	unsigned int pos;
>>> +	unsigned short size;
>>> +
>>> +	if (!udev)
>>> +		return -EINVAL;
>>> +
>>> +	pos = GET_CUR_XFER_BLKS(udev->cur_xfer_blks);
>>> +	size = CALC_CUR_XFER_BLKS(pos + 1);
>>> +
>>> +	if (size > blks || size > USB_MAX_XFER_BLK)
>>> +		return -EINVAL;
>>
>> Why don't you clamp the size to min(blks, USB_MAX_XFER_BLK) instead ?
>>
> 
> Do you mean below statement?
> 
> if (size > min(blks, USB_MAX_XFER_BLK))
> 	return -EINVAL;

Yes, if that makes sense.


-- 
Best regards,
Marek Vasut

  reply	other threads:[~2016-06-14 12:11 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-13  4:03 [U-Boot] [PATCH v5 0/2] common: usb_storage : Implement logic to calculate optimal Rajesh Bhagat
2016-06-13  4:03 ` [U-Boot] [PATCH v5 1/2] common: usb_storage: Make common function for usb_stor_read/usb_stor_write Rajesh Bhagat
2016-06-13 13:30   ` Marek Vasut
2016-06-14  3:41     ` Rajesh Bhagat
2016-06-13  4:03 ` [U-Boot] [PATCH v5 2/2] common: usb_storage : Implement logic to calculate optimal usb maximum trasfer blocks Rajesh Bhagat
2016-06-13 13:36   ` Marek Vasut
2016-06-14  3:41     ` Rajesh Bhagat
2016-06-14 12:11       ` Marek Vasut [this message]
2016-06-14 13:04         ` Rajesh Bhagat

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=575FF464.7030405@denx.de \
    --to=marex@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.