struct spi_transfer t[2] = {};
        struct spi_message m;
        int cmd_sz = m25p_cmdsz(nor);
+       ssize_t ret;
 
        spi_message_init(&m);
 
        t[1].len = len;
        spi_message_add_tail(&t[1], &m);
 
-       spi_sync(spi, &m);
+       ret = spi_sync(spi, &m);
+       if (ret)
+               return ret;
 
-       *retlen += m.actual_length - cmd_sz;
-       return 0;
+       ret = m.actual_length - cmd_sz;
+       if (ret < 0)
+               return -EIO;
+       *retlen += ret;
+       return ret;
 }
 
 static inline unsigned int m25p80_rx_nbits(struct spi_nor *nor)
        struct spi_transfer t[2];
        struct spi_message m;
        unsigned int dummy = nor->read_dummy;
+       ssize_t ret;
 
        /* convert the dummy cycles to the number of bytes */
        dummy /= 8;
 
        if (spi_flash_read_supported(spi)) {
                struct spi_flash_read_message msg;
-               int ret;
 
                memset(&msg, 0, sizeof(msg));
 
 
                ret = spi_flash_read(spi, &msg);
                *retlen = msg.retlen;
-               return ret;
+               if (ret < 0)
+                       return ret;
+               return msg.retlen;
        }
 
        spi_message_init(&m);
        t[1].len = len;
        spi_message_add_tail(&t[1], &m);
 
-       spi_sync(spi, &m);
+       ret = spi_sync(spi, &m);
+       if (ret)
+               return ret;
 
-       *retlen = m.actual_length - m25p_cmdsz(nor) - dummy;
-       return 0;
+       ret = m.actual_length - m25p_cmdsz(nor) - dummy;
+       if (ret < 0)
+               return -EIO;
+       *retlen += ret;
+       return ret;
 }
 
 /*