diff --git a/ChangeLog b/ChangeLog index b555d636..29e6e605 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2011-08-26 Joerg Wunsch + + bug #33114: Segfault after setting the DWEN fuse with Dragon + * jtagII.c (jtagmkII_getsync): Instead of exit()ing from + deep within the tree when detecting the "need debugWIRE" + situation, properly pass this up as a return code. + * jtagII_private.h (JTAGII_GETSYNC_FAIL_GRACEFUL): New constant. + * stk500v2.c (stk500v2_jtagmkII_open): Don't tell anything + anymore when receiving a JTAGII_GETSYNC_FAIL_GRACEFUL from + jtagmkII_getsync(); silently give up (all necessary has been + said already). + 2011-08-26 Joerg Wunsch Reported by Jason Hecker: diff --git a/jtagmkII.c b/jtagmkII.c index 34876cfc..268b4198 100644 --- a/jtagmkII.c +++ b/jtagmkII.c @@ -843,12 +843,11 @@ int jtagmkII_getsync(PROGRAMMER * pgm, int mode) { * program. */ (void)jtagmkII_reset(pgm, 0x04); - jtagmkII_close(pgm); fprintf(stderr, "%s: Target prepared for ISP, signed off.\n" "%s: Please restart %s without power-cycling the target.\n", progname, progname, progname); - exit(0); + return JTAGII_GETSYNC_FAIL_GRACEFUL; } } else { return -1; diff --git a/jtagmkII_private.h b/jtagmkII_private.h index de12c214..f5b423c1 100644 --- a/jtagmkII_private.h +++ b/jtagmkII_private.h @@ -356,3 +356,8 @@ struct device_descriptor unsigned char EECRAddress[2]; /* EECR memory-mapped IO address */ }; #endif /* JTAGMKII_PRIVATE_EXPORTED */ + +/* return code from jtagmkII_getsync() to indicate a "graceful" + * failure, i.e. an attempt to enable ISP failed and should be + * eventually retried */ +#define JTAGII_GETSYNC_FAIL_GRACEFUL (-2) diff --git a/stk500v2.c b/stk500v2.c index 5da77e33..401af733 100644 --- a/stk500v2.c +++ b/stk500v2.c @@ -2816,6 +2816,7 @@ static int stk500v2_jtagmkII_open(PROGRAMMER * pgm, char * port) { long baud; void *mycookie; + int rv; if (verbose >= 2) fprintf(stderr, "%s: stk500v2_jtagmkII_open()\n", progname); @@ -2856,9 +2857,11 @@ static int stk500v2_jtagmkII_open(PROGRAMMER * pgm, char * port) mycookie = pgm->cookie; pgm->cookie = PDATA(pgm)->chained_pdata; - if (jtagmkII_getsync(pgm, EMULATOR_MODE_SPI) != 0) { - fprintf(stderr, "%s: failed to sync with the JTAG ICE mkII in ISP mode\n", - progname); + if ((rv = jtagmkII_getsync(pgm, EMULATOR_MODE_SPI)) != 0) { + if (rv != JTAGII_GETSYNC_FAIL_GRACEFUL) + fprintf(stderr, + "%s: failed to sync with the JTAG ICE mkII in ISP mode\n", + progname); pgm->cookie = mycookie; return -1; }