rb_in_proc->buffer.data, data_len);
 
 error_wake_up:
+               /* Free the buffer since we copied data or didn't need it */
+               ishtp_cl_io_rb_recycle(rb_in_proc);
+               rb_in_proc = NULL;
+
                /* Set flag before waking up the caller */
                client_data->response.received = true;
 
                break;
 
        case CROS_MKBP_EVENT:
+               /* Free the buffer. This is just an event without data */
+               ishtp_cl_io_rb_recycle(rb_in_proc);
+               rb_in_proc = NULL;
                /*
                 * Set timestamp from beginning of function since we actually
                 * got an incoming MKBP event
                 */
                client_data->ec_dev->last_event_time = timestamp;
-               /* The event system doesn't send any data in buffer */
                schedule_work(&client_data->work_ec_evt);
 
                break;
        }
 
 end_error:
-       /* Free the buffer */
-       ishtp_cl_io_rb_recycle(rb_in_proc);
+       /* Free the buffer if we already haven't */
+       if (rb_in_proc)
+               ishtp_cl_io_rb_recycle(rb_in_proc);
 
        up_read(&init_lock);
 }