summaryrefslogtreecommitdiff
path: root/libhw_cr/w5500_ll.h
diff options
context:
space:
mode:
Diffstat (limited to 'libhw_cr/w5500_ll.h')
-rw-r--r--libhw_cr/w5500_ll.h63
1 files changed, 14 insertions, 49 deletions
diff --git a/libhw_cr/w5500_ll.h b/libhw_cr/w5500_ll.h
index 8f5f9ec..2506cd2 100644
--- a/libhw_cr/w5500_ll.h
+++ b/libhw_cr/w5500_ll.h
@@ -93,39 +93,15 @@ w5500ll_writev(
(uint8_t)(addr & 0xFF),
(block & CTL_MASK_BLOCK) | CTL_W | CTL_OM_VDM,
};
- struct duplex_iovec *inner = alloca(sizeof(struct duplex_iovec)*(iovcnt+1));
+ int inner_cnt = 1+io_slice_cnt(iov, iovcnt, skip, max);
+ struct duplex_iovec *inner = alloca(sizeof(struct duplex_iovec)*inner_cnt);
inner[0] = (struct duplex_iovec){
- .iov_read_dst = NULL,
- .iov_write_src = header,
- .iov_len = sizeof(header),
+ .iov_read_to = IOVEC_DISCARD,
+ .iov_write_from = header,
+ .iov_len = sizeof(header),
};
- int j = 1;
- size_t skipped = 0, done = 0;
- for (int i = 0; i < iovcnt && (max == 0 || done < max); i++) {
- if (skipped < skip) {
- if (skip - skipped >= iov[i].iov_len) {
- skipped += iov[i].iov_len;
- continue;
- }
- inner[j] = (struct duplex_iovec){
- .iov_read_dst = NULL,
- .iov_write_src = iov[i].iov_base+(skip-skipped),
- .iov_len = iov[i].iov_len-(skip-skipped),
- };
- skipped = skip;
- } else {
- inner[j] = (struct duplex_iovec){
- .iov_read_dst = NULL,
- .iov_write_src = iov[i].iov_base,
- .iov_len = iov[i].iov_len,
- };
- }
- done += inner[j].iov_len;
- if (max > 0 && done > max)
- inner[j].iov_len -= done - max;
- j++;
- };
- LO_CALL(spidev, readwritev, inner, j);
+ io_slice_wr_to_duplex(&inner[1], iov, iovcnt, skip, max);
+ LO_CALL(spidev, readwritev, inner, inner_cnt);
}
static inline void
@@ -154,26 +130,15 @@ w5500ll_readv(
(uint8_t)(addr & 0xFF),
(block & CTL_MASK_BLOCK) | CTL_R | CTL_OM_VDM,
};
- struct duplex_iovec *inner = alloca(sizeof(struct duplex_iovec)*(iovcnt+1));
+ int inner_cnt = 1+io_slice_cnt(iov, iovcnt, 0, max);
+ struct duplex_iovec *inner = alloca(sizeof(struct duplex_iovec)*inner_cnt);
inner[0] = (struct duplex_iovec){
- .iov_read_dst = NULL,
- .iov_write_src = header,
- .iov_len = sizeof(header),
- };
- int j = 1;
- size_t done = 0;
- for (int i = 0; i < iovcnt && (max == 0 || done < max); i++) {
- inner[j] = (struct duplex_iovec){
- .iov_read_dst = iov[i].iov_base,
- .iov_write_src = NULL,
- .iov_len = iov[i].iov_len,
- };
- done += inner[j].iov_len;
- if (max > 0 && done > max)
- inner[j].iov_len -= done - max;
- j++;
+ .iov_read_to = IOVEC_DISCARD,
+ .iov_write_from = header,
+ .iov_len = sizeof(header),
};
- LO_CALL(spidev, readwritev, inner, j);
+ io_slice_rd_to_duplex(&inner[1], iov, iovcnt, 0, max);
+ LO_CALL(spidev, readwritev, inner, inner_cnt);
}
/* Common chip-wide registers. ***********************************************/