diff --git a/avrdude/ChangeLog b/avrdude/ChangeLog
index b11202d9..70b231df 100644
--- a/avrdude/ChangeLog
+++ b/avrdude/ChangeLog
@@ -1,3 +1,12 @@
+2010-01-08  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
+
+	bug #28516: Linux/Dragon: Error message on exit
+	* stk500v2.c: Fix the "bad response to GO command:
+	RSP_ILLEGAL_EMULATOR_MODE" message.  jtagmkII_close()
+	has been called with the wrong pgm->cookie.  Wrap it
+	inside stk500v2_jtagmkII_close(), adjusting the cookie
+	data appropriately.
+
 2010-01-08  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
 
 	Submitted by Doug:
diff --git a/avrdude/stk500v2.c b/avrdude/stk500v2.c
index 31bdf8f1..b9211c33 100644
--- a/avrdude/stk500v2.c
+++ b/avrdude/stk500v2.c
@@ -2794,6 +2794,23 @@ static int stk500v2_jtagmkII_open(PROGRAMMER * pgm, char * port)
 }
 
 
+/*
+ * Close an AVR Dragon or JTAG ICE mkII in ISP/HVSP/PP mode.
+ */
+static void stk500v2_jtagmkII_close(PROGRAMMER * pgm)
+{
+  void *mycookie;
+
+  if (verbose >= 2)
+    fprintf(stderr, "%s: stk500v2_jtagmkII_close()\n", progname);
+
+  mycookie = pgm->cookie;
+  pgm->cookie = PDATA(pgm)->chained_pdata;
+  jtagmkII_close(pgm);
+  pgm->cookie = mycookie;
+}
+
+
 /*
  * Wrapper functions for the AVR Dragon in ISP mode.  This mode
  * uses the normal JTAG ICE mkII packet stream to communicate with the
@@ -3543,7 +3560,7 @@ void stk500v2_jtagmkII_initpgm(PROGRAMMER * pgm)
   pgm->chip_erase     = stk500v2_chip_erase;
   pgm->cmd            = stk500v2_cmd;
   pgm->open           = stk500v2_jtagmkII_open;
-  pgm->close          = jtagmkII_close;
+  pgm->close          = stk500v2_jtagmkII_close;
   pgm->read_byte      = avr_read_byte_default;
   pgm->write_byte     = avr_write_byte_default;
 
@@ -3575,7 +3592,7 @@ void stk500v2_dragon_isp_initpgm(PROGRAMMER * pgm)
   pgm->chip_erase     = stk500v2_chip_erase;
   pgm->cmd            = stk500v2_cmd;
   pgm->open           = stk500v2_dragon_isp_open;
-  pgm->close          = jtagmkII_close;
+  pgm->close          = stk500v2_jtagmkII_close;
   pgm->read_byte      = avr_read_byte_default;
   pgm->write_byte     = avr_write_byte_default;
 
@@ -3605,7 +3622,7 @@ void stk500v2_dragon_pp_initpgm(PROGRAMMER * pgm)
   pgm->program_enable = stk500pp_program_enable;
   pgm->chip_erase     = stk500pp_chip_erase;
   pgm->open           = stk500v2_dragon_hv_open;
-  pgm->close          = jtagmkII_close;
+  pgm->close          = stk500v2_jtagmkII_close;
   pgm->read_byte      = stk500pp_read_byte;
   pgm->write_byte     = stk500pp_write_byte;
 
@@ -3638,7 +3655,7 @@ void stk500v2_dragon_hvsp_initpgm(PROGRAMMER * pgm)
   pgm->program_enable = stk500hvsp_program_enable;
   pgm->chip_erase     = stk500hvsp_chip_erase;
   pgm->open           = stk500v2_dragon_hv_open;
-  pgm->close          = jtagmkII_close;
+  pgm->close          = stk500v2_jtagmkII_close;
   pgm->read_byte      = stk500hvsp_read_byte;
   pgm->write_byte     = stk500hvsp_write_byte;