diff options
author | John Baldwin <jhb@FreeBSD.org> | 2023-06-28 18:10:05 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2023-06-28 18:10:05 +0000 |
commit | 78cb8841f0853e8059537c32ec4bd31d1fec7134 (patch) | |
tree | 28b0965ba00cbb7c11ec18e2caf9f2d1f2d5c9e4 /sys | |
parent | 3767de83974206e4267dabf7fbe66b151c1a0b14 (diff) | |
download | src-78cb8841f0853e8059537c32ec4bd31d1fec7134.tar.gz src-78cb8841f0853e8059537c32ec4bd31d1fec7134.zip |
mrsas: Use mrsas_sge64 instead of iovec for the S/G list for passthru.
The DMA scatter/gather list for mrsas passthrough ioctl commands is
stored in a SGL at the end of the DCMD frame. Given the SGL member at
the end of the DCMD frame it seems likely this S/G list is formatted
as a fixed-width structure such as the type mrsas_sge64 and not as a
iovec which contains a kernel pointer and length that vary with the
native architecture size.
Reviewed by: imp
Obtained from: CheriBSD
Sponsored by: DARPA
Differential Revision: https://reviews.freebsd.org/D40727
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/mrsas/mrsas_ioctl.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/sys/dev/mrsas/mrsas_ioctl.c b/sys/dev/mrsas/mrsas_ioctl.c index 9d3699df5b7b..6f27d18ccab9 100644 --- a/sys/dev/mrsas/mrsas_ioctl.c +++ b/sys/dev/mrsas/mrsas_ioctl.c @@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); #include <dev/mrsas/mrsas_ioctl.h> struct mrsas_passthru_cmd { - struct iovec *kern_sge; + struct mrsas_sge64 *kern_sge; struct mrsas_softc *sc; struct mrsas_mfi_cmd *cmd; bus_dma_tag_t ioctl_data_tag; @@ -112,8 +112,8 @@ mrsas_passthru_load_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error) } for (i = 0; i < nseg; i++) { - cb->kern_sge[i].iov_base = PTRIN(segs[i].ds_addr); - cb->kern_sge[i].iov_len = segs[i].ds_len; + cb->kern_sge[i].phys_addr = htole64(segs[i].ds_addr); + cb->kern_sge[i].length = htole32(segs[i].ds_len); } cb->sge_count = nseg; @@ -421,7 +421,7 @@ mrsas_user_command(struct mrsas_softc *sc, struct mfi_ioc_passthru *ioc) bus_dma_tag_t ioctl_data_tag; bus_dmamap_t ioctl_data_dmamap; bus_addr_t ioctl_data_phys_addr; - struct iovec *kern_sge; + struct mrsas_sge64 *kern_sge; int ret, ioctl_data_size; char *ioctl_temp_data_mem; @@ -457,11 +457,11 @@ mrsas_user_command(struct mrsas_softc *sc, struct mfi_ioc_passthru *ioc) if (sizeof(bus_addr_t) == 8) cmd->frame->hdr.flags |= MFI_FRAME_SGL64 | MFI_FRAME_SENSE64; - kern_sge = (struct iovec *)(&dcmd->sgl); + kern_sge = (struct mrsas_sge64 *)(&dcmd->sgl); if (ioctl_data_size == 0) { - kern_sge[0].iov_base = 0; - kern_sge[0].iov_len = 0; + kern_sge[0].phys_addr = 0; + kern_sge[0].length = 0; } else { ioctl_temp_data_mem = malloc(ioc->buf_size, M_MRSAS, M_WAITOK); if (ioctl_temp_data_mem == NULL) { |