diff options
Diffstat (limited to 'libhw_cr/w5500_ll.h')
-rw-r--r-- | libhw_cr/w5500_ll.h | 63 |
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. ***********************************************/ |