From: Lukasz Majewski <l.majewski@samsung.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 2/3] usb: dfu: introduce dfuMANIFEST state
Date: Mon, 17 Mar 2014 11:42:45 +0100 [thread overview]
Message-ID: <20140317114245.773f6871@amdc2363> (raw)
In-Reply-To: <5326CA43.3080805@denx.de>
Hi Heiko,
> Hello Lukasz,
>
> Am 17.03.2014 10:46, schrieb Lukasz Majewski:
> > Hi Heiko,
> >
> >> Hello Lukasz,
> >>
> >> Am 14.03.2014 11:47, schrieb Lukasz Majewski:
> >>> Hi Heiko,
> >>>
> >>>> on nand flash using ubi, after the download of the new image into
> >>>> the flash, the "rest" of the nand sectors get erased while
> >>>> flushing the medium. With current u-boot version dfu-util may
> >>>> show:
> >>>>
> >>>> Starting download:
> >>>> [##################################################] finished!
> >>>> state(7) = dfuMANIFEST, status(0) = No error condition is present
> >>>> unable to read DFU status
> >>>>
> >>>> as get_status is not answered while erasing sectors, if erasing
> >>>> needs some time.
> >>>>
> >>>> So do the following changes to prevent this:
> >>>>
> >>>> - introduce dfuManifest state
> >>>> According to dfu specification
> >>>> ( http://www.usb.org/developers/devclass_docs/usbdfu10.pdf )
> >>>> section 7: "the device enters the dfuMANIFEST-SYNC state and
> >>>> awaits the solicitation of the status report by the host. Upon
> >>>> receipt of the anticipated DFU_GETSTATUS, the device enters the
> >>>> dfuMANIFEST state, where it completes its reprogramming
> >>>> operations."
> >>>>
> >>>> - when stepping into dfuManifest state, sending a PollTimeout
> >>>> DFU_MANIFEST_POLL_TIMEOUT in ms, to the host, so the host
> >>>> (dfu-util) waits the PollTimeout before sending a get_status
> >>>> again.
> >>>>
> >>>> Signed-off-by: Heiko Schocher<hs@denx.de>
> >>>> Cc: Lukasz Majewski<l.majewski@samsung.com>
> >>>> Cc: Kyungmin Park<kyungmin.park@samsung.com>
> >>>> Cc: Marek Vasut<marex@denx.de>
> >>>> ---
> >>>> README | 5 ++++
> >>>> drivers/dfu/dfu.c | 1 -
> >>>> drivers/usb/gadget/f_dfu.c | 60
> >>>> +++++++++++++++++++++++++++++++++++++++-------
> >>>> include/dfu.h | 3 +++ 4 files changed, 59
> >>>> insertions(+), 10 deletions(-)
> >>>>
> [...]
> >>>> diff --git a/drivers/usb/gadget/f_dfu.c
> >>>> b/drivers/usb/gadget/f_dfu.c index a045864..f4bf918 100644
> >>>> --- a/drivers/usb/gadget/f_dfu.c
> >>>> +++ b/drivers/usb/gadget/f_dfu.c
> [...]
> >>>> @@ -463,6 +478,33 @@ static int state_dfu_manifest_sync(struct
> >>>> f_dfu *f_dfu, return value;
> >>>> }
> >>>>
> >>>> +static int state_dfu_manifest(struct f_dfu *f_dfu,
> >>>> + const struct usb_ctrlrequest
> >>>> *ctrl,
> >>>> + struct usb_gadget *gadget,
> >>>> + struct usb_request *req)
> >>>> +{
> >>>> + int value = 0;
> >>>> +
> >>>> + switch (ctrl->bRequest) {
> >>>> + case USB_REQ_DFU_GETSTATUS:
> >>>> + /* We're MainfestationTolerant */
> >>>
> >>> Please look into the comments globally - we do now support the
> >>> DFU_STATE_dfuMANIFEST_* states
> >>
> >> Hmm.. Yes, but we are MainfestationTolerant ... so the comment is
> >> Ok, or?
> >
> > My understanding of "ManifestationTolerant" is as follow:
> >
> > "We didn't used the dfuMANIFEST state and immediately went to
> > dfuIDLE state from dfuDOWNLOAD-IDLE, so we are
> > 'ManifestationTolerant'".
>
> [...]
> >>> I'm looking forward for v2.
> >>
> >> I am ready for sending it, but need response from you as I think
> >> the comment is correct ...
> >
> > Please explain why it is correct in your opinion.
>
> Hmm..
>
> http://www.usb.org/developers/devclass_docs/usbdfu10.pdf on page 26
> "Figure A.1 Interface state transition diagram":
>
> State 7 bitManifestationTolerant = 1 (=ManifestationTolerant?), if
> PollTimeout is reached go back to state 6, and after DFU_GET_STATUS
> go to state 2
>
> if State 7 and "bitManifestationTolerant = 0" and PollTimeout reached,
> go to state 8 ... and wait there forever?
>
> So we are in the "bitManifestationTolerant = 1" case as before my
> changes ... nothing changed ...
>
> before my changes there was immediately the transition from state 6
> to state 2 and this is only possible if "bitManifestationTolerant = 1"
> is set ... I only added the dfuMANIFEST state, not changed the
> "bitManifestationTolerant = 1"
>
> I interpretate 'ManifestationTolerant' as:
> multiple dfu downloads are possible, no need for reseting the device
> after a download was successful ...
>
Thanks for very in depth explanation. You seem to be right :-). Lets
not change the comment.
> >> BTW:
> >> With the DFU_MANIFEST_POLL_TIMEOUT solution, we have a static
> >> timeout, which is suboptimal, as we have a big MTD partittion and
> >> we must have a "big" timeout for erasing (in the worst case) the
> >> complete partition. Also this big timeout is (on nand using ubi)
> >> only needed for the nand ubi partiton, not for the raw partitions
> >> containing for example u-boot ... where it could be 0 ...
> >
> > So, the problem is with setting a worst case value for all kinds of
> > your dfu entities?
>
> Yes. At least each dfu entity needs an own Timeout ... think of
> an 1MiB Partition and a 900MiB Partition on one device ... we
> currently use the Polltimeout for the 900MiB Partition also when
> updating the 1 MiB Partition ...
Yes, it is a pain... to wait.
>
> >> Better would be, to have the information how long does it take to
> >> erase one sector (define?) and how many sectors we have to erase,
> >> and sending this value to the host... Do you see a chance to get
> >> this information within the dfu code?
> >
> > We have f_dfu->poll_timeout field in the dfu function. Value from
> > it sets the poll timeout to be waited by the host.
> >
> > Maybe it would be better to reuse this field to set it accordingly
> > for MANIFEST_POLL_TIMEOUT. Now it is used for setting timeout when
> > we store big chunks of data (32 MiB).
> >
> >>
> >> Thinking about it, possibly we need a callback from the mtd layer,
> >> which gives back the info, how long the flush would take, as this
> >> is a media/partition size dependent timeout ...
> >
> > I think that we could add this callback - called e.g.
> > (*poll_timeout) to the struct [mmc|nand]_internal_data. Then some
> > helper functions would be defined at dfu_[mmc|nand].c and used at
> > f_dfu.c
>
> Yep ... I look into this...
>
> > Other question is if we accept current patches and wait for above
> > improvement to follow of drop them and wait for solution addressing
> > those issues.
> >
> > What do you think?
>
> I prefer to accept current patches (I can post v2), as they are an
> improvement. On top of that the optimzation of the PollTimeout
> settings is a seperate patch.
Ok, lets proceed in this way.
>
> bye,
> Heiko
--
Best regards,
Lukasz Majewski
Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
next prev parent reply other threads:[~2014-03-17 10:42 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-12 10:01 [U-Boot] [PATCH 0/3] usb: dfu: introduce dfuMANIFEST state Heiko Schocher
2014-03-12 10:01 ` [U-Boot] [PATCH 1/3] usb, dfu: extract flush code into seperate function Heiko Schocher
2014-03-12 11:43 ` Marek Vasut
2014-03-13 5:31 ` Heiko Schocher
2014-03-13 12:38 ` Marek Vasut
2014-03-14 10:36 ` Lukasz Majewski
2014-03-12 10:01 ` [U-Boot] [PATCH 2/3] usb: dfu: introduce dfuMANIFEST state Heiko Schocher
2014-03-14 10:47 ` Lukasz Majewski
2014-03-17 6:34 ` Heiko Schocher
2014-03-17 9:46 ` Lukasz Majewski
2014-03-17 10:11 ` Heiko Schocher
2014-03-17 10:42 ` Lukasz Majewski [this message]
2014-03-12 10:01 ` [U-Boot] [PATCH 3/3] am335x, dfu: add DFU_MANIFEST_POLL_TIMEOUT to the siemens boards Heiko Schocher
2014-03-14 10:48 ` Lukasz Majewski
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=20140317114245.773f6871@amdc2363 \
--to=l.majewski@samsung.com \
--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.