diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index bb0cb8eb2e5862beeda2a6c3352cf3671a4973d8..43d01d3dc64a17155df6be2874be7e72c4e68024 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -100,8 +100,8 @@ Planner planner;
  * A ring buffer of moves described in steps
  */
 block_t Planner::block_buffer[BLOCK_BUFFER_SIZE];
-volatile uint8_t Planner::block_buffer_head = 0,           // Index of the next block to be pushed
-                 Planner::block_buffer_tail = 0;
+volatile uint8_t Planner::block_buffer_head, // Index of the next block to be pushed
+                 Planner::block_buffer_tail;
 
 float Planner::max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second
       Planner::axis_steps_per_mm[XYZE_N],
@@ -207,7 +207,6 @@ float Planner::previous_speed[NUM_AXIS],
 Planner::Planner() { init(); }
 
 void Planner::init() {
-  block_buffer_head = block_buffer_tail = 0;
   ZERO(position);
   #if HAS_POSITION_FLOAT
     ZERO(position_float);
@@ -217,6 +216,7 @@ void Planner::init() {
   #if ABL_PLANAR
     bed_level_matrix.set_to_identity();
   #endif
+  clear_block_buffer();
 }
 
 #if ENABLED(BEZIER_JERK_CONTROL)
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index 17c133a1d01e1168341f51e4fe709e18fea74445..0b594fff61d9ae2357f772e0f6c647fdf5ef5627 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -309,6 +309,8 @@ class Planner {
      */
     FORCE_INLINE static uint8_t movesplanned() { return BLOCK_MOD(block_buffer_head - block_buffer_tail + BLOCK_BUFFER_SIZE); }
 
+    FORCE_INLINE static void clear_block_buffer() { block_buffer_head = block_buffer_tail = 0; }
+
     FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); }
 
     // Update multipliers based on new diameter measurements
@@ -594,7 +596,7 @@ class Planner {
         return bbru;
       }
 
-      static void clear_block_buffer_runtime(){
+      static void clear_block_buffer_runtime() {
         CRITICAL_SECTION_START
           block_buffer_runtime_us = 0;
         CRITICAL_SECTION_END
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index 7be9c9ead28741dc70d5d078077fae40fde1e03c..f6f28fe4bdef49fd7e6e2607db4eaa792383956e 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -2083,10 +2083,11 @@ void Stepper::finish_and_disable() {
 }
 
 void Stepper::quick_stop() {
-  cleaning_buffer_counter = 5000;
   DISABLE_STEPPER_DRIVER_INTERRUPT();
-  while (planner.has_blocks_queued()) planner.discard_current_block();
+  kill_current_block();
   current_block = NULL;
+  cleaning_buffer_counter = 5000;
+  planner.clear_block_buffer();
   ENABLE_STEPPER_DRIVER_INTERRUPT();
   #if ENABLED(ULTRA_LCD)
     planner.clear_block_buffer_runtime();