Skip to contentSkip to conversation

dfu, nand: add medium specific polltimeout function

PATCH New Heiko Schocher 3 participants 3 messages Apr 11, 2014 – May 8, 2014 USB

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 dfu, nand: add medium specific polltimeout function

add a possibility to add a medium specific polltimeout function. So it is possible to define different poll timeouts.

Used on nand medium, for setting the DFU_MANIFEST_POLL_TIMEOUT only on nand ubi partitions, which is currently the only usecase.

Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Pantelis Antoniou <[email protected]>

---
- changes for v2:
- add comment from Pantelis Antoniou
- add simple accessor for getting the poll timeout dfu_get_manifest_timeout()

 drivers/dfu/dfu_nand.c     | 13 +++++++++++++
 drivers/usb/gadget/f_dfu.c | 10 +++++++++-
 include/dfu.h              |  1 +
 3 files changed, 23 insertions(+), 1 deletion(-)
drivers/dfu/dfu_nand.c +13 -0
index 2d07097..ccdbef6 100644
@@ -163,6 +163,18 @@ static int dfu_flush_medium_nand(struct dfu_entity *dfu)
 	return ret;
 }
 
+unsigned int dfu_polltimeout_nand(struct dfu_entity *dfu)
+{
+	/*
+	 * Currently, Poll Timeout != 0 is only needed on nand
+	 * ubi partition, as the not used sectors need an erase
+	 */
+	if (dfu->data.nand.ubi)
+		return DFU_MANIFEST_POLL_TIMEOUT;
+
+	return DFU_DEFAULT_POLL_TIMEOUT;
+}
+
 int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 {
 	char *st;
@@ -211,6 +223,7 @@ int dfu_fill_entity_nand(struct dfu_entity *dfu, char *s)
 	dfu->read_medium = dfu_read_medium_nand;
 	dfu->write_medium = dfu_write_medium_nand;
 	dfu->flush_medium = dfu_flush_medium_nand;
+	dfu->poll_timeout = dfu_polltimeout_nand;
 
 	/* initial state */
 	dfu->inited = 0;
drivers/usb/gadget/f_dfu.c +9 -1
index de75ff1..e32b742 100644
@@ -174,10 +174,17 @@ static void dnload_request_flush(struct usb_ep *ep, struct usb_request *req)
 		  req->length, f_dfu->blk_seq_num);
 }
 
+static inline int dfu_get_manifest_timeout(struct dfu_entity *dfu)
+{
+	return dfu->poll_timeout ? dfu->poll_timeout(dfu) :
+		DFU_MANIFEST_POLL_TIMEOUT;
+}
+
 static void handle_getstatus(struct usb_request *req)
 {
 	struct dfu_status *dstat = (struct dfu_status *)req->buf;
 	struct f_dfu *f_dfu = req->context;
+	struct dfu_entity *dfu = dfu_get_entity(f_dfu->altsetting);
 
 	dfu_set_poll_timeout(dstat, 0);
 
@@ -190,7 +197,8 @@ static void handle_getstatus(struct usb_request *req)
 		f_dfu->dfu_state = DFU_STATE_dfuMANIFEST;
 		break;
 	case DFU_STATE_dfuMANIFEST:
-		dfu_set_poll_timeout(dstat, DFU_MANIFEST_POLL_TIMEOUT);
+		dfu_set_poll_timeout(dstat, dfu_get_manifest_timeout(dfu));
+		break;
 	default:
 		break;
 	}
include/dfu.h +1 -0
index 6c71ecb..c7fd270 100644
@@ -105,6 +105,7 @@ struct dfu_entity {
 			u64 offset, void *buf, long *len);
 
 	int (*flush_medium)(struct dfu_entity *dfu);
+	unsigned int (*poll_timeout)(struct dfu_entity *dfu);
 
 	struct list_head list;
 
Signature · 1 line
1.8.3.1
#1 lore raw

PATCH v2 1/1 dfu, nand: add medium specific polltimeout function

Quoted 30 lines · Heiko Schocher

add a possibility to add a medium specific polltimeout function. So it is possible to define different poll timeouts.

Used on nand medium, for setting the DFU_MANIFEST_POLL_TIMEOUT only on nand ubi partitions, which is currently the only usecase.

Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Pantelis Antoniou <[email protected]>

---
- changes for v2:
- add comment from Pantelis Antoniou
- add simple accessor for getting the poll timeout dfu_get_manifest_timeout()

 drivers/dfu/dfu_nand.c     | 13 +++++++++++++
 drivers/usb/gadget/f_dfu.c | 10 +++++++++-
 include/dfu.h              |  1 +
 3 files changed, 23 insertions(+), 1 deletion(-)
drivers/dfu/dfu_nand.c +0 -0
index 2d07097..ccdbef6 100644

drivers/dfu/dfu_nand.c static int dfu_flush_medium_nand(struct dfu_entity · line 170

Quoted 8 lines
drivers/dfu/dfu_nand.c +5 -0
@@ -163,6 +163,18 @@ static int dfu_flush_medium_nand(struct dfu_entity
 *dfu) return ret;
 }
 
+unsigned int dfu_polltimeout_nand(struct dfu_entity *dfu)
+{
+	/*
+	 * Currently, Poll Timeout != 0 is only needed on nand
+	 * ubi partition, as the not used sectors need an erase

Don't you have to erase sectors before writing into them even on RAW NAND ? [..]

Other than that:

Best regards,
Marek Vasut

#2 lore raw

PATCH v2 1/1 dfu, nand: add medium specific polltimeout function

In reply to Heiko Schocher

Hi Heiko,

Quoted 8 lines

add a possibility to add a medium specific polltimeout function. So it is possible to define different poll timeouts.

Used on nand medium, for setting the DFU_MANIFEST_POLL_TIMEOUT only on nand ubi partitions, which is currently the only usecase.

Quoted 5 lines
Cc Lukasz Majewski <[email protected]>
Cc Kyungmin Park <[email protected]>
Cc Marek Vasut <[email protected]>
Cc Pantelis Antoniou <[email protected]>

Applied to u-boot-dfu. Thanks.

Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group