Date: Sun, 23 Jun 2013 04:06:20 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r252105 - in projects/altix2/sys: kern sys Message-ID: <201306230406.r5N46KjE090617@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marcel Date: Sun Jun 23 04:06:19 2013 New Revision: 252105 URL: http://svnweb.freebsd.org/changeset/base/252105 Log: Provide a bare-bones implementation for busdma_md_load_ccb(). Modified: projects/altix2/sys/kern/subr_busdma.c projects/altix2/sys/sys/busdma.h Modified: projects/altix2/sys/kern/subr_busdma.c ============================================================================== --- projects/altix2/sys/kern/subr_busdma.c Sun Jun 23 02:51:22 2013 (r252104) +++ projects/altix2/sys/kern/subr_busdma.c Sun Jun 23 04:06:19 2013 (r252105) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012 Marcel Moolenaar + * Copyright (c) 2012-2013 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -35,6 +35,8 @@ __FBSDID("$FreeBSD$"); #include <sys/ktr.h> #include <sys/queue.h> #include <machine/stdarg.h> +#include <cam/cam.h> +#include <cam/cam_ccb.h> #include <vm/uma.h> #include <vm/vm.h> #include <vm/vm_extern.h> @@ -740,6 +742,70 @@ busdma_md_get_vaddr(struct busdma_md *md } int +busdma_md_load_ccb(busdma_md_t md, union ccb *ccb, busdma_callback_f cb, + void *arg, u_int flags) +{ + struct ccb_hdr *ccb_h; + void *buf; + size_t cnt, len; + int error; + + CTR6(KTR_BUSDMA, "%s: md=%p, ccb=%p, cb=%p, arg=%p, flags=%#x", + __func__, md, ccb, cb, arg, flags); + + flags = _busdma_flags(__func__, md->md_tag->dt_device, flags); + + if (md == NULL || ccb == NULL) + return (EINVAL); + + ccb_h = &ccb->ccb_h; + if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_NONE) { + (*cb)(arg, NULL, 0); + return (0); + } + + switch (ccb_h->func_code) { + case XPT_SCSI_IO: + buf = ccb->csio.data_ptr; + len = ccb->csio.dxfer_len; + cnt = ccb->csio.sglist_cnt; + break; + case XPT_CONT_TARGET_IO: + buf = ccb->ctio.data_ptr; + len = ccb->ctio.dxfer_len; + cnt = ccb->ctio.sglist_cnt; + break; + case XPT_ATA_IO: + buf = ccb->ataio.data_ptr; + len = ccb->ataio.dxfer_len; + cnt = 0; + break; + default: + return (EINVAL); + } + + switch (ccb_h->flags & CAM_DATA_MASK) { + case CAM_DATA_VADDR: + error = _busdma_md_load(md, NULL, (uintptr_t)buf, len); + break; + case CAM_DATA_PADDR: + case CAM_DATA_SG: + case CAM_DATA_SG_PADDR: + case CAM_DATA_BIO: + default: + panic(__func__); + } + + if (!error) { + error = _busdma_iommu_map(md->md_tag->dt_device, md); + if (error) + printf("_busdma_iommu_map: error=%d\n", error); + } + (*cb)(arg, md, error); + return (0); +} + +int busdma_md_load_linear(struct busdma_md *md, void *buf, size_t len, busdma_callback_f cb, void *arg, u_int flags) { Modified: projects/altix2/sys/sys/busdma.h ============================================================================== --- projects/altix2/sys/sys/busdma.h Sun Jun 23 02:51:22 2013 (r252104) +++ projects/altix2/sys/sys/busdma.h Sun Jun 23 04:06:19 2013 (r252105) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2012 Marcel Moolenaar + * Copyright (c) 2012-2013 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -98,6 +98,7 @@ bus_addr_t busdma_tag_get_maxaddr(busdma /* * */ +union ccb; struct mbuf; struct uio; @@ -105,14 +106,16 @@ typedef void (*busdma_callback_f)(void * int busdma_md_create(busdma_tag_t tag, u_int flags, busdma_md_t *md_p); int busdma_md_destroy(busdma_md_t md); +int busdma_md_load_ccb(busdma_md_t md, union ccb *ccb, busdma_callback_f cb, + void *arg, u_int flags); int busdma_md_load_linear(busdma_md_t md, void *buf, size_t size, busdma_callback_f cb, void *arg, u_int flags); int busdma_md_load_mbuf(busdma_md_t md, struct mbuf *mbuf, busdma_callback_f cb, void *arg, u_int flags); int busdma_md_load_phys(busdma_md_t md, vm_paddr_t buf, size_t size, busdma_callback_f cb, void *arg, u_int flags); -int busdma_md_load_uio(busdma_md_t md, struct uio *uio, - busdma_callback_f cb, void *arg, u_int flags); +int busdma_md_load_uio(busdma_md_t md, struct uio *uio, busdma_callback_f cb, + void *arg, u_int flags); int busdma_md_unload(busdma_md_t md); u_int busdma_md_get_flags(busdma_md_t md); u_int busdma_md_get_nsegs(busdma_md_t md);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306230406.r5N46KjE090617>