Skip site navigation (1)Skip section navigation (2)
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>