+ memset(&spi_hdr_xfer, 0, sizeof(spi_hdr_xfer));
+ spi_hdr_xfer.tx_buf = &hdr;
+ spi_hdr_xfer.len = sizeof(hdr);
+ spi_message_add_tail(&spi_hdr_xfer, &spi_msg);
+
+ memset(&spi_data_xfer, 0, sizeof(spi_data_xfer));
+ spi_data_xfer.tx_buf = buf;
+ spi_data_xfer.len = size;
+ spi_message_add_tail(&spi_data_xfer, &spi_msg);
+
+ /* Send the message, including header. */
+ err = spi_sync(ucmb->sdev, &spi_msg);
+ if (err)
+ goto out_free;
+
+ /* The microcontroller deserves some time to process the message. */
+ msleep(1);
+
+ /* Get the status code. */
+ err = spi_read(ucmb->sdev, (u8 *)&status, sizeof(status));
+ if (err)
+ goto out_free;
+ err = -EPROTO;
+ if (status.magic != cpu_to_le16(UCMB_MAGIC))
+ goto out_free;
+ err = ucmb_status_code_to_errno(le16_to_cpu(status.code));
+ if (err)
+ goto out_free;