diff --git a/minichlink/microgdbstub.h b/minichlink/microgdbstub.h
index 7b6647b333d40ac8bb1b0e53f4af1ba9b348c8af..3d802f55bdfb690121ef300dcf0b0d0b2a465a66 100644
--- a/minichlink/microgdbstub.h
+++ b/minichlink/microgdbstub.h
@@ -69,6 +69,7 @@ int WSAAPI WSAPoll(struct pollfd * fdArray, ULONG       fds, INT         timeout
 #define MSG_NOSIGNAL 0
 #else
 #define closesocket close
+#include <arpa/inet.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <linux/in.h>
@@ -525,7 +526,7 @@ int MicroGDBPollServer( void * dev )
 			struct   sockaddr_in tin;
 			socklen_t addrlen  = sizeof(tin);
 			memset( &tin, 0, addrlen );
-			int tsocket = accept( serverSocket, (struct sockaddr *)&tin, (int*)&addrlen );
+			int tsocket = accept( serverSocket, (struct sockaddr *)&tin, (void*)&addrlen );
 			closesocket( serverSocket );
 			serverSocket = tsocket;
 			listenMode = 2;
diff --git a/minichlink/minichlink.c b/minichlink/minichlink.c
index c4d2dd8f08fbc28ca0b80c86f436163b9675aa9d..76b2b6c10305ceaa84af58cb4c4fb7b18442c9bc 100644
--- a/minichlink/minichlink.c
+++ b/minichlink/minichlink.c
@@ -619,7 +619,24 @@ static int DefaultWaitForDoneOp( void * dev, int ignore )
 	while( rrv & (1<<12) );
 	if( (rrv >> 8 ) & 7 )
 	{
-		if( !ignore ) fprintf( stderr, "Fault writing memory (DMABSTRACTS = %08x)\n", rrv );
+		if( !ignore )
+		{
+			const char * errortext = 0;
+			switch( (rrv>>8)&7 )
+			{
+			case 1: errortext = "Command in execution"; break;
+			case 2: errortext = "Abstract Command Unsupported"; break;
+			case 3: errortext = "Execption executing Abstract Command"; break;
+			case 4: errortext = "Processor not halted."; break;
+			case 5: errortext = "Bus Error"; break;
+			case 6: errortext = "Parity Bit"; break;
+			default: errortext = "Other Error"; break;
+			}
+
+			uint32_t temp;
+			MCF.ReadReg32( dev, DMSTATUS, &temp );
+			fprintf( stderr, "Fault writing memory (DMABSTRACTS = %08x) (%s) DMSTATUS: %08x\n", rrv, errortext, temp );
+		}
 		MCF.WriteReg32( dev, DMABSTRACTCS, 0x00000700 );
 		return -9;
 	}
@@ -1126,6 +1143,7 @@ static int DefaultReadWord( void * dev, uint32_t address_to_read, uint32_t * dat
 		iss->currentstateval += 4;
 
 	r |= MCF.ReadReg32( dev, DMDATA0, data );
+
 	if( iss->currentstateval == iss->ram_base + iss->ram_size )
 		MCF.WaitForDoneOp( dev, 1 ); // Ignore any post-errors. 
 	return r;
@@ -1364,9 +1382,14 @@ static int DefaultHaltMode( void * dev, int mode )
 	switch ( mode )
 	{
 	case 0:
+		MCF.WriteReg32( dev, DMSHDWCFGR, 0x5aa50000 | (1<<10) ); // Shadow Config Reg
+		MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // CFGR (1<<10 == Allow output from slave)
+		MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // Bug in silicon?  If coming out of cold boot, and we don't do our little "song and dance" this has to be called.
+
 		MCF.WriteReg32( dev, DMCONTROL, 0x80000001 ); // Make the debug module work properly.
 		MCF.WriteReg32( dev, DMCONTROL, 0x80000001 ); // Initiate a halt request.
-		MCF.WriteReg32( dev, DMCONTROL, 0x00000001 ); // Clear Halt Request.
+//		MCF.WriteReg32( dev, DMCONTROL, 0x00000001 ); // Clear Halt Request.  This is recommended, but not doing it seems more stable.
+		// Sometimes, even if the processor is halted but the MSB is clear, it will spuriously start?
 		MCF.FlushLLCommands( dev );
 		break;
 	case 1:
@@ -1377,6 +1400,10 @@ static int DefaultHaltMode( void * dev, int mode )
 		MCF.FlushLLCommands( dev );
 		break;
 	case 2:
+		MCF.WriteReg32( dev, DMSHDWCFGR, 0x5aa50000 | (1<<10) ); // Shadow Config Reg
+		MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // CFGR (1<<10 == Allow output from slave)
+		MCF.WriteReg32( dev, DMCFGR, 0x5aa50000 | (1<<10) ); // Bug in silicon?  If coming out of cold boot, and we don't do our little "song and dance" this has to be called.
+
 		MCF.WriteReg32( dev, DMCONTROL, 0x40000001 ); // resumereq
 		MCF.FlushLLCommands( dev );
 		break;
@@ -1396,6 +1423,17 @@ static int DefaultHaltMode( void * dev, int mode )
 		MCF.FlushLLCommands( dev );
 		break;
 	}
+#if 0
+	int i;
+	for( i = 0; i < 100; i++ )
+	{
+		uint32_t temp = 0;
+		MCF.ReadReg32( dev, DMSTATUS, &temp );
+		fprintf( stderr, "DMSTATUS: %08x\n", temp );
+		usleep( 20000);
+	}
+#endif
+
 	iss->processor_in_mode = mode;
 	return 0;
 }
diff --git a/minichlink/pgm-esp32s2-ch32xx.c b/minichlink/pgm-esp32s2-ch32xx.c
index bfb6ea1d87f2856b5e1ab9f96e7700852b278f26..6781ffb71588cb1b667fa2d08811d055499a5b06 100644
--- a/minichlink/pgm-esp32s2-ch32xx.c
+++ b/minichlink/pgm-esp32s2-ch32xx.c
@@ -159,7 +159,7 @@ int ESPReadWord( void * dev, uint32_t address_to_read, uint32_t * data )
 	Write4LE( eps, address_to_read );
 	ESPFlushLLCommands( eps );
 
-//	printf( "Got: %d\n", eps->replylen );
+//     printf( "Got: %d\n", eps->replylen );
 	if( eps->replylen < 5 )
 	{
 		return -9;