diff --git a/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd b/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd
index 346fa6ea9d96688c341e366bc4b75ac0112f34dd..c4211c9f661910c66043ac319260751cc1da292e 100644
--- a/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd
+++ b/libraries/io/ddr/src/vhdl/io_ddr_driver.vhd
@@ -172,6 +172,8 @@ BEGIN
   rd_src_out.valid <= ctlr_miso.rdval;
   rd_src_out.data <= RESIZE_DP_DATA(ctlr_miso.rddata);
   
+  wr_snk_out.xon <= ctlr_miso.done;                                  -- xon when controller init is done so ready for access
+  
   p_state : PROCESS(prev_state, state,
                     dvr_en, dvr_wr_not_rd, dvr_start_address, dvr_nof_data,
                     ctlr_miso, wr_snk_in, rd_src_in, 
@@ -186,7 +188,6 @@ BEGIN
     ctlr_mosi.burstbegin   <= burstbegin_evt;                        -- only used for legacy DDR controllers, because the controller can derive it internally by counting wr and rd accesses
     ctlr_mosi.burstsize    <= TO_MEM_CTLR_BURSTSIZE(burst_size);     -- burstsize >= 1,
                                                                      -- no need to hold during burst, because the Avalon constantBurstBehaviour=FALSE (default) of the DDR IP slave
-    wr_snk_out.xon         <= '1';                                   -- xon is fixed '1'
     wr_snk_out.ready       <= '0';
     nxt_dvr_done           <= '0';
     nxt_cur_address        <= cur_address;