ISPTarget_EnableTargetISP();
 
        ISPTarget_ChangeTargetResetLine(true);
+       ISPProtocol_DelayMS(Enter_ISP_Params.PinStabDelayMS);
 
        /* Continuously attempt to synchronize with the target until either the number of attempts specified
         * by the host has exceeded, or the the device sends back the expected response values */
-       while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus != STATUS_CMD_OK) && !(TimeoutExpired))
+       while (Enter_ISP_Params.SynchLoops-- && !(TimeoutExpired))
        {
                uint8_t ResponseBytes[4];
 
                if (!(Enter_ISP_Params.PollIndex) || (ResponseBytes[Enter_ISP_Params.PollIndex - 1] == Enter_ISP_Params.PollValue))
                {
                        ResponseStatus = STATUS_CMD_OK;
+                       break;
                }
                else
                {
                        ISPTarget_ChangeTargetResetLine(false);
                        ISPProtocol_DelayMS(Enter_ISP_Params.PinStabDelayMS);
                        ISPTarget_ChangeTargetResetLine(true);
+                       ISPProtocol_DelayMS(Enter_ISP_Params.PinStabDelayMS);
                }
        }
 
        Endpoint_Read_Stream_LE(&Write_Memory_Params, (sizeof(Write_Memory_Params) -
                                                       sizeof(Write_Memory_Params.ProgData)), NULL);
        Write_Memory_Params.BytesToWrite = SwapEndian_16(Write_Memory_Params.BytesToWrite);
-       
+
        if (Write_Memory_Params.BytesToWrite > sizeof(Write_Memory_Params.ProgData))
        {
                Endpoint_ClearOUT();
                        /* Must reset the polling address afterwards, so it is not erroneously used for the next byte */
                        PollAddress = 0;
                }
-               
+
                /* EEPROM just increments the address each byte, flash needs to increment on each word and
                 * also check to ensure that a LOAD EXTENDED ADDRESS command is issued each time the extended
-                * address boundary has been crossed */
+                * address boundary has been crossed during FLASH memory programming */
                if ((CurrentByte & 0x01) || (V2Command == CMD_PROGRAM_EEPROM_ISP))
                {
                        CurrentAddress++;
 
-                       if ((V2Command != CMD_PROGRAM_EEPROM_ISP) && !(CurrentAddress & 0xFFFF))
+                       if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
                          MustLoadExtendedAddress = true;
                }
        }
-       
+
        /* If the current page must be committed, send the PROGRAM PAGE command to the target */
        if (Write_Memory_Params.ProgrammingMode & PROG_MODE_COMMIT_PAGE_MASK)
        {
                /* Check to see if the FLASH address has crossed the extended address boundary */
                if ((V2Command == CMD_PROGRAM_FLASH_ISP) && !(CurrentAddress & 0xFFFF))
                  MustLoadExtendedAddress = true;
-       }       
+       }
 
        Endpoint_Write_8(V2Command);
        Endpoint_Write_8(ProgrammingStatus);
 
        Endpoint_Read_Stream_LE(&Read_Memory_Params, sizeof(Read_Memory_Params), NULL);
        Read_Memory_Params.BytesToRead = SwapEndian_16(Read_Memory_Params.BytesToRead);
-       
+
        Endpoint_ClearOUT();
        Endpoint_SelectEndpoint(AVRISP_DATA_IN_EPNUM);
        Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
        }
 }
 
-/** Blocking delay for a given number of milliseconds.
+/** Blocking delay for a given number of milliseconds. This provides a simple wrapper around
+ *  the avr-libc provided delay function, so that the delay function can be called with a
+ *  constant value (to prevent run-time floating point operations being required).
  *
  *  \param[in] DelayMS  Number of milliseconds to delay for
  */
 }
 
 #endif
+