+static int virtex2_program(struct pld_device *pld_device)
+{
+ struct virtex2_pld_device *virtex2_info = pld_device->driver_priv;
+ if (!virtex2_info)
+ return ERROR_FAIL;
+
+ int retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jshutdown);
+ if (retval != ERROR_OK)
+ return retval;
+
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jprog_b);
+ if (retval != ERROR_OK)
+ return retval;
+
+ jtag_add_runtest(62000, TAP_IDLE);
+ if (!(virtex2_info->no_jstart)) {
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jstart);
+ if (retval != ERROR_OK)
+ return retval;
+ }
+
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.bypass);
+ if (retval != ERROR_OK)
+ return retval;
+ jtag_add_runtest(2000, TAP_IDLE);
+
+ return jtag_execute_queue();
+}
+
+static int virtex2_load_prepare(struct pld_device *pld_device)
+{
+ struct virtex2_pld_device *virtex2_info = pld_device->driver_priv;
+ int retval;
+
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jprog_b);
+ if (retval != ERROR_OK)
+ return retval;
+
+ retval = jtag_execute_queue();
+ if (retval != ERROR_OK)
+ return retval;
+ jtag_add_sleep(1000);
+
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.cfg_in);
+ if (retval != ERROR_OK)
+ return retval;
+
+ return jtag_execute_queue();
+}
+
+static int virtex2_load_cleanup(struct pld_device *pld_device)
+{
+ struct virtex2_pld_device *virtex2_info = pld_device->driver_priv;
+ int retval;
+
+ jtag_add_tlr();
+
+ if (!(virtex2_info->no_jstart)) {
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jstart);
+ if (retval != ERROR_OK)
+ return retval;
+ }
+ jtag_add_runtest(13, TAP_IDLE);
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.bypass);
+ if (retval != ERROR_OK)
+ return retval;
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.bypass);
+ if (retval != ERROR_OK)
+ return retval;
+ if (!(virtex2_info->no_jstart)) {
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jstart);
+ if (retval != ERROR_OK)
+ return retval;
+ }
+ jtag_add_runtest(13, TAP_IDLE);
+ retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.bypass);
+ if (retval != ERROR_OK)
+ return retval;
+
+ return jtag_execute_queue();