static int rave_sp_write(struct rave_sp *sp, const u8 *data, u8 data_size) { const size_t checksum_length = sp->variant->checksum->length; unsigned char frame[RAVE_SP_TX_BUFFER_SIZE]; unsigned char crc[RAVE_SP_CHECKSUM_SIZE]; unsigned char *dest = frame; size_t length; if (WARN_ON(checksum_length > sizeof(crc))) return -ENOMEM; if (WARN_ON(data_size > sizeof(frame))) return -ENOMEM; sp->variant->checksum->subroutine(data, data_size, crc); *dest++ = RAVE_SP_STX; dest = stuff(dest, data, data_size); dest = stuff(dest, crc, checksum_length); *dest++ = RAVE_SP_ETX; length = dest - frame; print_hex_dump_debug("rave-sp tx: ", DUMP_PREFIX_NONE, 16, 1, frame, length, false); return serdev_device_write(sp->serdev, frame, length, HZ); }
static int sirf_write_raw(struct gnss_device *gdev, const unsigned char *buf, size_t count) { struct sirf_data *data = gnss_get_drvdata(gdev); struct serdev_device *serdev = data->serdev; int ret; /* write is only buffered synchronously */ ret = serdev_device_write(serdev, buf, count, 0); if (ret < 0) return ret; /* FIXME: determine if interrupted? */ serdev_device_wait_until_sent(serdev, 0); return count; }