|  | @@ -2090,10 +2090,8 @@ bool check_commands() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /// @brief Safely move Z-axis by distance delta (mm)
 | 
	
		
			
				|  |  |  /// @param delta travel distance in mm
 | 
	
		
			
				|  |  | -/// @param plan plan the move if the axis is homed (non-blocking)
 | 
	
		
			
				|  |  | -/// @returns The actual travel distance in mm. Endstop may limit the requested move. Note that
 | 
	
		
			
				|  |  | -/// when plan = true and the printer is homed, the function returns 0.
 | 
	
		
			
				|  |  | -float raise_z(float delta, bool plan)
 | 
	
		
			
				|  |  | +/// @returns The actual travel distance in mm. Endstop may limit the requested move.
 | 
	
		
			
				|  |  | +float raise_z(float delta)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      float travel_z = current_position[Z_AXIS];
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2111,34 +2109,38 @@ float raise_z(float delta, bool plan)
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |          // current position is known or very low, it's safe to raise Z
 | 
	
		
			
				|  |  |          clamp_to_software_endstops(current_position);
 | 
	
		
			
				|  |  | -        if(plan) plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
 | 
	
		
			
				|  |  | -        return 0;
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +        plan_buffer_line_curposXYZE(max_feedrate[Z_AXIS]);
 | 
	
		
			
				|  |  | +        st_synchronize();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // ensure Z is powered in normal mode to overcome initial load
 | 
	
		
			
				|  |  | -    enable_z();
 | 
	
		
			
				|  |  | -    st_synchronize();
 | 
	
		
			
				|  |  | +        // Get the final travel distance
 | 
	
		
			
				|  |  | +        travel_z = current_position[Z_AXIS] - travel_z;
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +        // ensure Z is powered in normal mode to overcome initial load
 | 
	
		
			
				|  |  | +        enable_z();
 | 
	
		
			
				|  |  | +        st_synchronize();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // rely on crashguard to limit damage
 | 
	
		
			
				|  |  | -    bool z_endstop_enabled = enable_z_endstop(true);
 | 
	
		
			
				|  |  | +        // rely on crashguard to limit damage
 | 
	
		
			
				|  |  | +        bool z_endstop_enabled = enable_z_endstop(true);
 | 
	
		
			
				|  |  |  #ifdef TMC2130
 | 
	
		
			
				|  |  | -    tmc2130_home_enter(Z_AXIS_MASK);
 | 
	
		
			
				|  |  | +        tmc2130_home_enter(Z_AXIS_MASK);
 | 
	
		
			
				|  |  |  #endif //TMC2130
 | 
	
		
			
				|  |  | -    plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
 | 
	
		
			
				|  |  | -    st_synchronize();
 | 
	
		
			
				|  |  | +        plan_buffer_line_curposXYZE(homing_feedrate[Z_AXIS] / 60);
 | 
	
		
			
				|  |  | +        st_synchronize();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // Get the final travel distance
 | 
	
		
			
				|  |  | -    travel_z = st_get_position_mm(Z_AXIS) - travel_z;
 | 
	
		
			
				|  |  | +        // Get the final travel distance
 | 
	
		
			
				|  |  | +        travel_z = current_position[Z_AXIS] - travel_z;
 | 
	
		
			
				|  |  |  #ifdef TMC2130
 | 
	
		
			
				|  |  | -    if (endstop_z_hit_on_purpose())
 | 
	
		
			
				|  |  | -    {
 | 
	
		
			
				|  |  | -        // not necessarily exact, but will avoid further vertical moves
 | 
	
		
			
				|  |  | -        current_position[Z_AXIS] = max_pos[Z_AXIS];
 | 
	
		
			
				|  |  | -        plan_set_position_curposXYZE();
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    tmc2130_home_exit();
 | 
	
		
			
				|  |  | +        if (endstop_z_hit_on_purpose())
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            // not necessarily exact, but will avoid further vertical moves
 | 
	
		
			
				|  |  | +            current_position[Z_AXIS] = max_pos[Z_AXIS];
 | 
	
		
			
				|  |  | +            plan_set_position_curposXYZE();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        tmc2130_home_exit();
 | 
	
		
			
				|  |  |  #endif //TMC2130
 | 
	
		
			
				|  |  | -    enable_z_endstop(z_endstop_enabled);
 | 
	
		
			
				|  |  | +        enable_z_endstop(z_endstop_enabled);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      return travel_z;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2147,13 +2149,13 @@ float raise_z(float delta, bool plan)
 | 
	
		
			
				|  |  |  // contrarily to a simple move, this function will carefully plan a move
 | 
	
		
			
				|  |  |  // when the current Z position is unknown. In such cases, stallguard is
 | 
	
		
			
				|  |  |  // enabled and will prevent prolonged pushing against the Z tops
 | 
	
		
			
				|  |  | -void raise_z_above(float target, bool plan)
 | 
	
		
			
				|  |  | +void raise_z_above(float target)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      if (current_position[Z_AXIS] >= target)
 | 
	
		
			
				|  |  |          return;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Use absolute value in case the current position is unknown
 | 
	
		
			
				|  |  | -    raise_z(fabs(current_position[Z_AXIS] - target), plan);
 | 
	
		
			
				|  |  | +    raise_z(fabs(current_position[Z_AXIS] - target));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3558,7 +3560,7 @@ static void gcode_M600(bool automatic, float x_position, float y_position, float
 | 
	
		
			
				|  |  |      st_synchronize();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Raise the Z axis
 | 
	
		
			
				|  |  | -    float delta = raise_z(z_shift, false);
 | 
	
		
			
				|  |  | +    float delta = raise_z(z_shift);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // Move XY to side
 | 
	
		
			
				|  |  |      current_position[X_AXIS] = x_position;
 | 
	
	
		
			
				|  | @@ -3631,7 +3633,7 @@ static void gcode_M600(bool automatic, float x_position, float y_position, float
 | 
	
		
			
				|  |  |          // and raise_z seems to have no affect after XY move for unknown reasons.
 | 
	
		
			
				|  |  |          // This needs to be looked into.
 | 
	
		
			
				|  |  |          // Recover Z axis
 | 
	
		
			
				|  |  | -        raise_z(-delta, false);
 | 
	
		
			
				|  |  | +        raise_z(-delta);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Move XY back
 | 
	
		
			
				|  |  |          plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], FILAMENTCHANGE_XYFEED, active_extruder);
 | 
	
	
		
			
				|  | @@ -8579,7 +8581,7 @@ Sigma_Exit:
 | 
	
		
			
				|  |  |          if (code_seen('Z')) z_target = fabs(code_value());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Raise the Z axis
 | 
	
		
			
				|  |  | -        float delta = raise_z(z_target, false);
 | 
	
		
			
				|  |  | +        float delta = raise_z(z_target);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Load filament
 | 
	
		
			
				|  |  |          gcode_M701(fastLoadLength, mmuSlotIndex);
 | 
	
	
		
			
				|  | @@ -8609,11 +8611,11 @@ Sigma_Exit:
 | 
	
		
			
				|  |  |          if (code_seen('Z')) z_target = fabs(code_value());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Raise the Z axis
 | 
	
		
			
				|  |  | -        float delta = raise_z(z_target, false);
 | 
	
		
			
				|  |  | +        float delta = raise_z(z_target);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Unload filament
 | 
	
		
			
				|  |  |          if (MMU2::mmu2.Enabled())  MMU2::mmu2.unload();
 | 
	
		
			
				|  |  | -        else unload_filament(unloadLength, false);
 | 
	
		
			
				|  |  | +        else unload_filament(unloadLength);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Restore Z axis
 | 
	
		
			
				|  |  |          raise_z(-delta);
 |