pxa2xx_spi_write(drv_data, SSTO, 0);
 }
 
-static void int_error_stop(struct driver_data *drv_data, const char *msg)
+static void int_error_stop(struct driver_data *drv_data, const char *msg, int err)
 {
        int_stop_and_reset(drv_data);
        pxa2xx_spi_flush(drv_data);
 
        dev_err(drv_data->ssp->dev, "%s\n", msg);
 
-       drv_data->controller->cur_msg->status = -EIO;
+       drv_data->controller->cur_msg->status = err;
        spi_finalize_current_transfer(drv_data->controller);
 }
 
        u32 irq_status = pxa2xx_spi_read(drv_data, SSSR) & irq_mask;
 
        if (irq_status & SSSR_ROR) {
-               int_error_stop(drv_data, "interrupt_transfer: fifo overrun");
+               int_error_stop(drv_data, "interrupt_transfer: fifo overrun", -EIO);
                return IRQ_HANDLED;
        }
 
        if (irq_status & SSSR_TUR) {
-               int_error_stop(drv_data, "interrupt_transfer: fifo underrun");
+               int_error_stop(drv_data, "interrupt_transfer: fifo underrun", -EIO);
                return IRQ_HANDLED;
        }
 
 {
        struct driver_data *drv_data = spi_controller_get_devdata(controller);
 
-       int_stop_and_reset(drv_data);
-       pxa2xx_spi_flush(drv_data);
-       pxa2xx_spi_off(drv_data);
-
-       dev_dbg(drv_data->ssp->dev, "transfer aborted\n");
-
-       drv_data->controller->cur_msg->status = -EINTR;
-       spi_finalize_current_transfer(drv_data->controller);
+       int_error_stop(drv_data, "transfer aborted", -EINTR);
 
        return 0;
 }