summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cleopatre/u-boot-1.1.6/net/spidupd.c35
-rw-r--r--cleopatre/u-boot-1.1.6/net/spidupd.h2
2 files changed, 36 insertions, 1 deletions
diff --git a/cleopatre/u-boot-1.1.6/net/spidupd.c b/cleopatre/u-boot-1.1.6/net/spidupd.c
index 16d77f89d5..ac616b70c2 100644
--- a/cleopatre/u-boot-1.1.6/net/spidupd.c
+++ b/cleopatre/u-boot-1.1.6/net/spidupd.c
@@ -71,9 +71,11 @@
#define STATE_UPD_START 1
#define STATE_UPD_TRANSFER 2
#define STATE_UPD_END 3
+#define STATE_UPD_IND 4
#define UPD_START STATE_UPD_START
#define UPD_TRANSFER STATE_UPD_TRANSFER
#define UPD_END STATE_UPD_END
+#define UPD_IND STATE_UPD_IND
/** Informations about place to update image */
struct update_place {
@@ -106,6 +108,7 @@ struct update_process {
VsUpdStartCnf_t start_cnf;
VsUpdTransfCnf_t transfer_cnf;
VsUpdEndCnf_t end_cnf;
+ VsUpdEndInd_t end_ind;
};
/** Global processus structure */
@@ -582,6 +585,7 @@ static void SpidupdSend(int rsp_type)
VsUpdStartCnf_t *vs_update_start_cnf;
VsUpdTransfCnf_t *vs_update_transfer_cnf;
VsUpdEndCnf_t *vs_update_end_cnf;
+ VsUpdEndCnf_t *vs_update_end_ind;
/* Set structures pointers */
pkt = NetTxPacket;
@@ -589,6 +593,7 @@ static void SpidupdSend(int rsp_type)
vs_update_start_cnf = (VsUpdStartCnf_t *)(mme+1);
vs_update_transfer_cnf = (VsUpdTransfCnf_t *)(mme+1);
vs_update_end_cnf = (VsUpdEndCnf_t *)(mme+1);
+ vs_update_end_ind = (VsUpdEndInd_t *)(mme+1);
/* Set the MME version, FMI and OUI */
mme->mmv = MME_MMV;
@@ -639,6 +644,17 @@ static void SpidupdSend(int rsp_type)
transfer_end = 1;
break;
+ case UPD_IND:
+ /* Set mmtype to VS_UPDATE_END_IND */
+ mme->mmtype = htommes(VS_UPDATE_END_IND);
+
+ /* Append the message */
+ vs_update_end_ind->result = ctx.end_ind.result;
+
+ /* This is the end of packet, determine length */
+ len = ((ulong)vs_update_end_ind - (ulong)pkt) + sizeof(VsUpdEndInd_t);
+ break;
+
default :
/* WOW - How the hell did we get here ? */
printf("Error (Unknown State).\n");
@@ -735,6 +751,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len
ctx.modem_busy = 0;
ctx.start_cnf.start_update = SPIDUPD_BAD_ARCH;
ctx.state = STATE_UPD_START;
+
+ /* Abort the update */
+ NetState = NETLOOP_FAIL;
break;
}
if(place->correct_type != vs_update_start_req->upd_type)
@@ -744,6 +763,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len
ctx.modem_busy = 0;
ctx.start_cnf.start_update = SPIDUPD_BAD_UPD_TYPE;
ctx.state = STATE_UPD_START;
+
+ /* Abort the update */
+ NetState = NETLOOP_FAIL;
break;
}
@@ -753,6 +775,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len
ctx.modem_busy = 0;
ctx.start_cnf.start_update = SPIDUPD_BAD_VERSION;
ctx.state = STATE_UPD_START;
+
+ /* Abort the update */
+ NetState = NETLOOP_FAIL;
break;
}
@@ -770,6 +795,9 @@ static void SpidupdHandler(uchar *pkt, unsigned dest, unsigned src, unsigned len
ctx.modem_busy = 0;
ctx.start_cnf.start_update = SPIDUPD_BAD_VERSION;
ctx.state = STATE_UPD_START;
+
+ /* update is finished */
+ NetState = NETLOOP_SUCCESS;
break;
}
}
@@ -928,6 +956,13 @@ static void SpidupdTimeout(void)
printf("Timeout.\n");
/* TIMEOUT occurred. */
+ /* Send to client an error message */
+ if(ctx.state != STATE_UPD_START)
+ {
+ ctx.end_ind.result = SPIDUPD_TOUT;
+ SpidupdSend(UPD_IND);
+ }
+
/* Stop eth driver */
eth_halt();
/* Go out of NETLOOP and notify the caller about failure */
diff --git a/cleopatre/u-boot-1.1.6/net/spidupd.h b/cleopatre/u-boot-1.1.6/net/spidupd.h
index 433ce94f98..b97b0015e9 100644
--- a/cleopatre/u-boot-1.1.6/net/spidupd.h
+++ b/cleopatre/u-boot-1.1.6/net/spidupd.h
@@ -116,7 +116,7 @@ typedef struct
#define SPIDUPD_FLASH_WRITE_ERROR 0x02
/* end_ind */
-#define SPIDUPD_FLASH_WRITE_TOUT 0x03
+#define SPIDUPD_TOUT 0x03