svn commit: r252105 - in projects/altix2/sys: kern sys
Marcel Moolenaar
marcel at FreeBSD.org
Sun Jun 23 04:06:20 UTC 2013
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);
More information about the svn-src-projects
mailing list