Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Jan 2017 19:59:25 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r312720 - in projects/clang400-import: etc/devd lib/libc/aarch64/sys sbin/restore share/man/man4 share/man/man5 sys/amd64/linux sys/arm/freescale/imx sys/arm/ti/cpsw sys/arm64/arm64 sys...
Message-ID:  <201701241959.v0OJxPp9090667@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Tue Jan 24 19:59:25 2017
New Revision: 312720
URL: https://svnweb.freebsd.org/changeset/base/312720

Log:
  Merge ^/head r312624 through r312719.

Added:
  projects/clang400-import/sys/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu
     - copied unchanged from r312719, head/sys/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu
  projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_llt.c
     - copied unchanged from r312719, head/sys/dev/rtwn/rtl8192c/r92c_llt.c
  projects/clang400-import/sys/dev/rtwn/rtl8192e/
     - copied from r312719, head/sys/dev/rtwn/rtl8192e/
  projects/clang400-import/sys/modules/rtwnfw/rtwnrtl8192eu/
     - copied from r312719, head/sys/modules/rtwnfw/rtwnrtl8192eu/
  projects/clang400-import/usr.bin/truss/riscv64-freebsd.c
     - copied unchanged from r312719, head/usr.bin/truss/riscv64-freebsd.c
Modified:
  projects/clang400-import/etc/devd/usb.conf
  projects/clang400-import/lib/libc/aarch64/sys/cerror.S
  projects/clang400-import/sbin/restore/restore.8
  projects/clang400-import/share/man/man4/rtwn.4
  projects/clang400-import/share/man/man4/rtwn_usb.4
  projects/clang400-import/share/man/man4/rtwnfw.4
  projects/clang400-import/share/man/man5/tmpfs.5
  projects/clang400-import/sys/amd64/linux/linux_sysvec.c
  projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c
  projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c
  projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h
  projects/clang400-import/sys/arm64/arm64/mp_machdep.c
  projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts
  projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c
  projects/clang400-import/sys/cam/ctl/ctl_frontend.h
  projects/clang400-import/sys/cam/ctl/ctl_frontend_cam_sim.c
  projects/clang400-import/sys/cam/ctl/ctl_frontend_ioctl.c
  projects/clang400-import/sys/cam/ctl/ctl_frontend_iscsi.c
  projects/clang400-import/sys/cam/ctl/ctl_tpc_local.c
  projects/clang400-import/sys/cam/ctl/scsi_ctl.c
  projects/clang400-import/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
  projects/clang400-import/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
  projects/clang400-import/sys/cddl/dev/dtrace/dtrace_ioctl.c
  projects/clang400-import/sys/conf/files
  projects/clang400-import/sys/dev/ath/if_ath.c
  projects/clang400-import/sys/dev/ath/if_ath_tx.c
  projects/clang400-import/sys/dev/ath/if_ath_tx_edma.c
  projects/clang400-import/sys/dev/e1000/em_txrx.c
  projects/clang400-import/sys/dev/e1000/if_em.c
  projects/clang400-import/sys/dev/hyperv/netvsc/hn_nvs.c
  projects/clang400-import/sys/dev/hyperv/netvsc/hn_nvs.h
  projects/clang400-import/sys/dev/hyperv/netvsc/if_hn.c
  projects/clang400-import/sys/dev/hyperv/netvsc/if_hnreg.h
  projects/clang400-import/sys/dev/hyperv/netvsc/if_hnvar.h
  projects/clang400-import/sys/dev/mrsas/mrsas_linux.c
  projects/clang400-import/sys/dev/rtwn/if_rtwn.c
  projects/clang400-import/sys/dev/rtwn/if_rtwnvar.h
  projects/clang400-import/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c
  projects/clang400-import/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c
  projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c.h
  projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_init.c
  projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_reg.h
  projects/clang400-import/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c
  projects/clang400-import/sys/dev/rtwn/rtl8812a/r12a_beacon.c
  projects/clang400-import/sys/dev/rtwn/rtl8812a/r12a_fw.c
  projects/clang400-import/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c
  projects/clang400-import/sys/dev/rtwn/rtl8821a/r21a_init.c
  projects/clang400-import/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c
  projects/clang400-import/sys/dev/rtwn/usb/rtwn_usb_attach.h
  projects/clang400-import/sys/dev/usb/usbdevs
  projects/clang400-import/sys/kern/kern_switch.c
  projects/clang400-import/sys/kern/kern_time.c
  projects/clang400-import/sys/kern/subr_clock.c
  projects/clang400-import/sys/kern/subr_gtaskqueue.c
  projects/clang400-import/sys/kern/vfs_lookup.c
  projects/clang400-import/sys/kern/vfs_vnops.c
  projects/clang400-import/sys/libkern/bcd.c
  projects/clang400-import/sys/modules/rtwn/Makefile
  projects/clang400-import/sys/modules/rtwn_usb/Makefile
  projects/clang400-import/sys/modules/rtwnfw/Makefile
  projects/clang400-import/sys/net/ieee8023ad_lacp.c
  projects/clang400-import/sys/net/if.c
  projects/clang400-import/sys/net/iflib.c
  projects/clang400-import/sys/net80211/ieee80211.c
  projects/clang400-import/sys/powerpc/powerpc/db_trace.c
  projects/clang400-import/sys/riscv/include/frame.h
  projects/clang400-import/sys/riscv/riscv/trap.c
  projects/clang400-import/sys/sys/eventhandler.h
  projects/clang400-import/sys/sys/gtaskqueue.h
  projects/clang400-import/sys/sys/libkern.h
  projects/clang400-import/usr.bin/find/find.1
  projects/clang400-import/usr.bin/iscsictl/iscsictl.c
  projects/clang400-import/usr.bin/mail/popen.c
  projects/clang400-import/usr.bin/mail/send.c
  projects/clang400-import/usr.bin/sort/radixsort.c
  projects/clang400-import/usr.sbin/ctladm/ctladm.8
  projects/clang400-import/usr.sbin/pw/psdate.c
  projects/clang400-import/usr.sbin/pw/pw_user.c
  projects/clang400-import/usr.sbin/pw/tests/pw_usermod.sh
  projects/clang400-import/usr.sbin/wpa/wpa_cli/wpa_cli.8
Directory Properties:
  projects/clang400-import/   (props changed)
  projects/clang400-import/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/clang400-import/etc/devd/usb.conf
==============================================================================
--- projects/clang400-import/etc/devd/usb.conf	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/etc/devd/usb.conf	Tue Jan 24 19:59:25 2017	(r312720)
@@ -2753,7 +2753,7 @@ nomatch 32 {
 	match "bus" "uhub[0-9]+";
 	match "mode" "host";
 	match "vendor" "0x0bda";
-	match "product" "(0x818a|0x8191)";
+	match "product" "(0x818a|0x818b|0x8191)";
 	action "kldload -n if_rtwn_usb";
 };
 
@@ -3793,7 +3793,7 @@ nomatch 32 {
 	match "bus" "uhub[0-9]+";
 	match "mode" "host";
 	match "vendor" "0x1199";
-	match "product" "(0x68aa|0x68c0|0x9041)";
+	match "product" "(0x68aa|0x68c0|0x9041|0x9071)";
 	action "kldload -n u3g";
 };
 
@@ -3905,7 +3905,7 @@ nomatch 32 {
 	match "bus" "uhub[0-9]+";
 	match "mode" "host";
 	match "vendor" "0x12d1";
-	match "product" "(0x1573|0x1803|0x1c05|0x1c0b)";
+	match "product" "(0x1573|0x15c1|0x1803|0x1c05|0x1c0b)";
 	action "kldload -n u3g";
 };
 
@@ -5025,7 +5025,7 @@ nomatch 32 {
 	match "bus" "uhub[0-9]+";
 	match "mode" "host";
 	match "vendor" "0x2001";
-	match "product" "(0x3307|0x3308|0x3309|0x330a|0x330d|0x330f|0x3310|0x3314|0x3315|0x3316|0x3318)";
+	match "product" "(0x3307|0x3308|0x3309|0x330a|0x330d|0x330f|0x3310|0x3314|0x3315|0x3316|0x3318|0x3319)";
 	action "kldload -n if_rtwn_usb";
 };
 
@@ -5297,7 +5297,7 @@ nomatch 32 {
 	match "bus" "uhub[0-9]+";
 	match "mode" "host";
 	match "vendor" "0x2357";
-	match "product" "0x0101";
+	match "product" "(0x0101|0x0108|0x0109)";
 	action "kldload -n if_rtwn_usb";
 };
 
@@ -5889,5 +5889,5 @@ nomatch 32 {
 	action "kldload -n umass";
 };
 
-# 2743 USB entries processed
+# 2751 USB entries processed
 

Modified: projects/clang400-import/lib/libc/aarch64/sys/cerror.S
==============================================================================
--- projects/clang400-import/lib/libc/aarch64/sys/cerror.S	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/lib/libc/aarch64/sys/cerror.S	Tue Jan 24 19:59:25 2017	(r312720)
@@ -34,7 +34,7 @@ ENTRY(cerror)
 	stp	x0, lr, [sp]
 	bl	_C_LABEL(__error)
 	ldp	x1, lr, [sp]
-	str	x1, [x0]
+	str	w1, [x0]
 	movn	x0, #0
 	movn	x1, #0
 	add	sp, sp, #16

Modified: projects/clang400-import/sbin/restore/restore.8
==============================================================================
--- projects/clang400-import/sbin/restore/restore.8	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sbin/restore/restore.8	Tue Jan 24 19:59:25 2017	(r312720)
@@ -349,6 +349,8 @@ To prevent this, the
 .Fl u
 (unlink) flag causes restore to remove old entries before attempting
 to create new ones.
+This flag is recommended when using extended attributes
+to avoid improperly accumulating attributes on pre-existing files.
 .It Fl v
 Normally
 .Nm

Modified: projects/clang400-import/share/man/man4/rtwn.4
==============================================================================
--- projects/clang400-import/share/man/man4/rtwn.4	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/share/man/man4/rtwn.4	Tue Jan 24 19:59:25 2017	(r312720)
@@ -18,7 +18,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd October 17, 2016
+.Dd January 24, 2017
 .Dt RTWN 4
 .Os
 .Sh NAME
@@ -52,9 +52,9 @@ if_rtwn_usb_load="YES"
 The
 .Nm
 driver provides support for wireless network devices based on
-the Realtek RTL8192C, RTL8188E, RTL8812A and RTL8821A programming APIs.
-These APIs are used by a wide variety of chips; most chips with USB
-and some with PCI interface are supported.
+the Realtek RTL8192C, RTL8188E, RTL8192E, RTL8812A and RTL8821A
+programming APIs.  These APIs are used by a wide variety of chips;
+most chips with USB and some with PCI interface are supported.
 .Pp
 To enable use for PCI/PCIe systems, see the rtwn_pci(4) driver;
 for USB devices, use the rtwn_usb(4) driver.
@@ -98,6 +98,7 @@ when an interface is brought up:
 .It Pa /boot/kernel/rtwn-rtl8192cfwE.ko
 .It Pa /boot/kernel/rtwn-rtl8192cfwT.ko
 .It Pa /boot/kernel/rtwn-rtl8192cfwU.ko
+.It Pa /boot/kernel/rtwn-rtl8192eufw.ko
 .It Pa /boot/kernel/rtwn-rtl8812aufw.ko
 .It Pa /boot/kernel/rtwn-rtl8821aufw.ko
 .El

Modified: projects/clang400-import/share/man/man4/rtwn_usb.4
==============================================================================
--- projects/clang400-import/share/man/man4/rtwn_usb.4	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/share/man/man4/rtwn_usb.4	Tue Jan 24 19:59:25 2017	(r312720)
@@ -29,7 +29,7 @@
 .\"
 .\" $FreeBSD$
 .\"/
-.Dd January 6, 2017
+.Dd January 24, 2017
 .Dt RTWN_USB 4
 .Os
 .Sh NAME
@@ -56,7 +56,7 @@ driver.
 .Sh HARDWARE
 The
 .Nm
-driver supports Realtek RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU/RTL8812AU/RTL8821AU
+driver supports Realtek RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU/RTL8192EU/RTL8812AU/RTL8821AU
 based USB wireless network adapters, including:
 .Pp
 .Bl -column -compact "Belkin F7D1102 Surf Wireless Micro" "Bus"
@@ -70,6 +70,7 @@ based USB wireless network adapters, inc
 .It "D-Link DWA-123 rev D1" Ta USB 2.0
 .It "D-Link DWA-125 rev D1" Ta USB 2.0
 .It "D-Link DWA-131" Ta USB 2.0
+.It "D-Link DWA-131 rev E1" Ta USB 2.0
 .It "D-Link DWA-171 rev A1" Ta USB 2.0
 .It "D-Link DWA-172 rev A1" Ta USB 2.0
 .It "D-Link DWA-180 rev A1" Ta USB 2.0
@@ -94,7 +95,10 @@ based USB wireless network adapters, inc
 .It "TP-LINK TL-WN723N v3" Ta USB 2.0
 .It "TP-LINK TL-WN725N v2" Ta USB 2.0
 .It "TP-LINK TL-WN821N v4" Ta USB 2.0
+.It "TP-LINK TL-WN821N v5" Ta USB 2.0
+.It "TP-LINK TL-WN822N v4" Ta USB 2.0
 .It "TP-LINK TL-WN823N v1" Ta USB 2.0
+.It "TP-LINK TL-WN823N v2" Ta USB 2.0
 .It "TRENDnet TEW-805UB" Ta USB 3.0
 .It "ZyXEL NWD6605" Ta USB 3.0
 .El

Modified: projects/clang400-import/share/man/man4/rtwnfw.4
==============================================================================
--- projects/clang400-import/share/man/man4/rtwnfw.4	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/share/man/man4/rtwnfw.4	Tue Jan 24 19:59:25 2017	(r312720)
@@ -23,7 +23,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd October 28, 2015
+.Dd January 24, 2017
 .Dt RTWNFW 4
 .Os
 .Sh NAME
@@ -46,6 +46,7 @@ of the following:
 .Cd "device rtwn-rtl8192cfwE"
 .Cd "device rtwn-rtl8192cfwT"
 .Cd "device rtwn-rtl8192cfwU"
+.Cd "device rtwn-rtl8192eufw"
 .Cd "device rtwn-rtl8812aufw"
 .Cd "device rtwn-rtl8821aufw"
 .Ed
@@ -59,6 +60,7 @@ rtwn-rtl8192cfwE_B_load="YES"
 rtwn-rtl8192cfwE_load="YES"
 rtwn-rtl8192cfwT_load="YES"
 rtwn-rtl8192cfwU_load="YES"
+rtwn-rtl8192eufw_load="YES"
 rtwn-rtl8812aufw_load="YES"
 rtwn-rtl8821aufw_load="YES"
 .Ed
@@ -66,8 +68,8 @@ rtwn-rtl8821aufw_load="YES"
 rtwn-rtl8192cfwE and rtl8192cfwE_B modules provide access
 to firmware sets for the Realtek RTL8188CE chip based PCIe adapters.
 Other modules provide access to firmware sets for the Realtek RTL8188CUS,
-RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8812AU and RTL8821AU
-chip based USB WiFi adapters.
+RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8192EU, RTL8812AU and
+RTL8821AU chip based USB WiFi adapters.
 They may be
 statically linked into the kernel, or loaded as a modules.
 .Pp

Modified: projects/clang400-import/share/man/man5/tmpfs.5
==============================================================================
--- projects/clang400-import/share/man/man5/tmpfs.5	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/share/man/man5/tmpfs.5	Tue Jan 24 19:59:25 2017	(r312720)
@@ -54,7 +54,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd January 17, 2017
+.Dd January 20, 2017
 .Dt TMPFS 5
 .Os
 .Sh NAME
@@ -77,7 +77,7 @@ tmpfs_load="YES"
 .Sh DESCRIPTION
 The
 .Nm
-driver implements in-memory, or
+driver implements an in-memory, or
 .Tn tmpfs
 file system.
 The filesystem stores both file metadata and data in main memory.
@@ -85,22 +85,22 @@ This allows very fast and low latency ac
 The data is volatile.
 An umount or system reboot invalidates it.
 These properties make the filesystem's mounts suitable for fast
-scratch storage, e.g.
+scratch storage, like
 .Pa /tmp .
 .Pp
 If the system becomes low on memory and swap is configured (see
 .Xr swapon 8 ),
-file data may be written to the swap space, freeing memory
+the system can transfer file data to swap space, freeing memory
 for other needs.
-The current implementation never swaps out metadata, including
-the directory content.
+Metadata, including the directory content, is never swapped out by the
+current implementation.
 Keep this in mind when planning the mount limits, especially when expecting
 to place many small files on a tmpfs mount.
 .Pp
-When a file from a tmpfs mount is mmaped (see
-.Xr mmap 2 )
-into the process address space, the swap VM object which manages the file
-pages is used to implement mapping and to avoid double-copying of
+When 
+.Xr mmap 2
+is used on a file from a tmpfs mount, the swap VM object managing the 
+file pages is used to implement mapping and avoid double-copying of
 the file data.
 This quirk causes process inspection tools, like
 .Xr procstat 1 ,
@@ -120,6 +120,10 @@ Defaults to the mount point's UID.
 .It Cm mode
 Specifies the mode (in octal notation) of the root inode of the file system.
 Defaults to the mount point's mode.
+.It Cm nonc
+Do not use namecache to resolve names to files for the created mount.
+This saves memory, but currently might impair scalability for highly
+used mounts on large machines.
 .It Cm inodes
 Specifies the maximum number of nodes available to the file system.
 If not specified, the file system chooses a reasonable maximum based on

Modified: projects/clang400-import/sys/amd64/linux/linux_sysvec.c
==============================================================================
--- projects/clang400-import/sys/amd64/linux/linux_sysvec.c	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/amd64/linux/linux_sysvec.c	Tue Jan 24 19:59:25 2017	(r312720)
@@ -718,7 +718,7 @@ exec_linux_imgact_try(struct image_param
 {
 	const char *head = (const char *)imgp->image_header;
 	char *rpath;
-	int error = -1, len;
+	int error = -1;
 
 	/*
 	 * The interpreter for shell scripts run from a linux binary needs
@@ -736,17 +736,12 @@ exec_linux_imgact_try(struct image_param
 			linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
 			    imgp->interpreter_name, UIO_SYSSPACE,
 			    &rpath, 0, AT_FDCWD);
-			if (rpath != NULL) {
-				len = strlen(rpath) + 1;
-
-				if (len <= MAXSHELLCMDLEN)
-					memcpy(imgp->interpreter_name,
-					    rpath, len);
-				free(rpath, M_TEMP);
-			}
+			if (rpath != NULL)
+				imgp->args->fname_buf =
+				    imgp->interpreter_name = rpath;
 		}
 	}
-	return(error);
+	return (error);
 }
 
 #define	LINUX_VSYSCALL_START		(-10UL << 20)

Modified: projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c
==============================================================================
--- projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c	Tue Jan 24 19:59:25 2017	(r312720)
@@ -69,11 +69,18 @@ imx_wdog_cpu_reset(vm_offset_t wdcr_phys
 	 * Trigger an immediate reset by clearing the SRS bit in the watchdog
 	 * control register.  The reset happens on the next cycle of the wdog
 	 * 32KHz clock, so hang out in a spin loop until the reset takes effect.
+	 *
+	 * Imx6 erratum ERR004346 says the SRS bit has to be cleared twice
+	 * within the same cycle of the 32khz clock to reliably trigger the
+	 * reset.  Writing it 3 times in a row ensures at least 2 of the writes
+	 * happen in the same 32k clock cycle.
 	 */
 	if ((pcr = devmap_ptov(wdcr_physaddr, sizeof(*pcr))) == NULL) {
 		printf("cpu_reset() can't find its control register... locking up now.");
 	} else {
 		*pcr &= ~WDOG_CR_SRS;
+		*pcr &= ~WDOG_CR_SRS;
+		*pcr &= ~WDOG_CR_SRS;
 	}
 	for (;;)
 		continue;

Modified: projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c
==============================================================================
--- projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c	Tue Jan 24 19:59:25 2017	(r312720)
@@ -1582,14 +1582,19 @@ cpsw_intr_rx(void *arg)
 static struct mbuf *
 cpsw_rx_dequeue(struct cpsw_softc *sc)
 {
+	int nsegs, port, removed;
 	struct cpsw_cpdma_bd bd;
 	struct cpsw_slot *last, *slot;
 	struct cpswp_softc *psc;
-	struct mbuf *mb_head, *mb_tail;
-	int port, removed = 0;
+	struct mbuf *m, *m0, *mb_head, *mb_tail;
+	uint16_t m0_flags;
 
+	nsegs = 0;
+	m0 = NULL;
 	last = NULL;
-	mb_head = mb_tail = NULL;
+	mb_head = NULL;
+	mb_tail = NULL;
+	removed = 0;
 
 	/* Pull completed packets off hardware RX queue. */
 	while ((slot = STAILQ_FIRST(&sc->rx.active)) != NULL) {
@@ -1612,10 +1617,12 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
 		bus_dmamap_sync(sc->mbuf_dtag, slot->dmamap, BUS_DMASYNC_POSTREAD);
 		bus_dmamap_unload(sc->mbuf_dtag, slot->dmamap);
 
+		m = slot->mbuf;
+		slot->mbuf = NULL;
+
 		if (bd.flags & CPDMA_BD_TDOWNCMPLT) {
 			CPSW_DEBUGF(sc, ("RX teardown is complete"));
-			m_freem(slot->mbuf);
-			slot->mbuf = NULL;
+			m_freem(m);
 			sc->rx.running = 0;
 			sc->rx.teardown = 0;
 			break;
@@ -1627,28 +1634,36 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
 		psc = device_get_softc(sc->port[port].dev);
 
 		/* Set up mbuf */
-		/* TODO: track SOP/EOP bits to assemble a full mbuf
-		   out of received fragments. */
-		slot->mbuf->m_data += bd.bufoff;
-		slot->mbuf->m_len = bd.buflen;
+		m->m_data += bd.bufoff;
+		m->m_len = bd.buflen;
 		if (bd.flags & CPDMA_BD_SOP) {
-			slot->mbuf->m_pkthdr.len = bd.pktlen;
-			slot->mbuf->m_pkthdr.rcvif = psc->ifp;
-			slot->mbuf->m_flags |= M_PKTHDR;
-		}
-		slot->mbuf->m_next = NULL;
-		slot->mbuf->m_nextpkt = NULL;
-		if (bd.flags & CPDMA_BD_PASS_CRC)
-			m_adj(slot->mbuf, -ETHER_CRC_LEN);
+			m->m_pkthdr.len = bd.pktlen;
+			m->m_pkthdr.rcvif = psc->ifp;
+			m->m_flags |= M_PKTHDR;
+			m0_flags = bd.flags;
+			m0 = m;
+		}
+		nsegs++;
+		m->m_next = NULL;
+		m->m_nextpkt = NULL;
+		if (bd.flags & CPDMA_BD_EOP && m0 != NULL) {
+			if (m0_flags & CPDMA_BD_PASS_CRC)
+				m_adj(m0, -ETHER_CRC_LEN);
+			m0_flags = 0;
+			m0 = NULL;
+			if (nsegs > sc->rx.longest_chain)
+				sc->rx.longest_chain = nsegs;
+			nsegs = 0;
+		}
 
 		if ((psc->ifp->if_capenable & IFCAP_RXCSUM) != 0) {
 			/* check for valid CRC by looking into pkt_err[5:4] */
 			if ((bd.flags &
 			    (CPDMA_BD_SOP | CPDMA_BD_PKT_ERR_MASK)) ==
 			    CPDMA_BD_SOP) {
-				slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
-				slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID;
-				slot->mbuf->m_pkthdr.csum_data = 0xffff;
+				m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
+				m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
+				m->m_pkthdr.csum_data = 0xffff;
 			}
 		}
 
@@ -1661,15 +1676,21 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
 		}
 
 		/* Add mbuf to packet list to be returned. */
-		if (mb_tail) {
-			mb_tail->m_nextpkt = slot->mbuf;
+		if (mb_tail != NULL && (bd.flags & CPDMA_BD_SOP)) {
+			mb_tail->m_nextpkt = m;
+		} else if (mb_tail != NULL) {
+			mb_tail->m_next = m;
+		} else if (mb_tail == NULL && (bd.flags & CPDMA_BD_SOP) == 0) {
+			if (bootverbose)
+				printf(
+				    "%s: %s: discanding fragment packet w/o header\n",
+				    __func__, psc->ifp->if_xname);
+			m_freem(m);
+			continue;
 		} else {
-			mb_head = slot->mbuf;
+			mb_head = m;
 		}
-		mb_tail = slot->mbuf;
-		slot->mbuf = NULL;
-		if (sc->rx_batch > 0 && sc->rx_batch == removed)
-			break;
+		mb_tail = m;
 	}
 
 	if (removed != 0) {
@@ -1960,7 +1981,8 @@ cpsw_tx_dequeue(struct cpsw_softc *sc)
 			sc->tx.teardown = 1;
 		}
 
-		if ((flags & CPDMA_BD_OWNER) != 0 && sc->tx.teardown == 0)
+		if ((flags & (CPDMA_BD_SOP | CPDMA_BD_OWNER)) ==
+		    (CPDMA_BD_SOP | CPDMA_BD_OWNER) && sc->tx.teardown == 0)
 			break; /* Hardware is still using this packet. */
 
 		bus_dmamap_sync(sc->mbuf_dtag, slot->dmamap, BUS_DMASYNC_POSTWRITE);
@@ -2686,9 +2708,6 @@ cpsw_add_sysctls(struct cpsw_softc *sc)
 	SYSCTL_ADD_INT(ctx, parent, OID_AUTO, "debug",
 	    CTLFLAG_RW, &sc->debug, 0, "Enable switch debug messages");
 
-	SYSCTL_ADD_INT(ctx, parent, OID_AUTO, "rx_batch",
-	    CTLFLAG_RW, &sc->rx_batch, 0, "Set the rx batch size");
-
 	SYSCTL_ADD_PROC(ctx, parent, OID_AUTO, "attachedSecs",
 	    CTLTYPE_UINT | CTLFLAG_RD, sc, 0, cpsw_stat_attached, "IU",
 	    "Time since driver attach");

Modified: projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h
==============================================================================
--- projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h	Tue Jan 24 19:59:25 2017	(r312720)
@@ -89,7 +89,6 @@ struct cpsw_softc {
 	int		active_slave;
 	int		debug;
 	int		dualemac;
-	int		rx_batch;
 	phandle_t	node;
 	struct bintime	attach_uptime; /* system uptime when attach happened. */
 	struct cpsw_port port[2];

Modified: projects/clang400-import/sys/arm64/arm64/mp_machdep.c
==============================================================================
--- projects/clang400-import/sys/arm64/arm64/mp_machdep.c	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/arm64/arm64/mp_machdep.c	Tue Jan 24 19:59:25 2017	(r312720)
@@ -105,8 +105,6 @@ static void ipi_preempt(void *);
 static void ipi_rendezvous(void *);
 static void ipi_stop(void *);
 
-static int ipi_handler(void *arg);
-
 struct mtx ap_boot_mtx;
 struct pcb stoppcbs[MAXCPU];
 

Modified: projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts
==============================================================================
--- projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts	Tue Jan 24 19:59:25 2017	(r312720)
@@ -50,13 +50,7 @@
 };
 
 &i2c0 {
-	tda998x: hdmi-encoder {
-		compatible = "nxp,tda998x";
-		reg = <0x70>;
-
- 		pinctrl-names = "default", "off";
- 		pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
- 		pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
+	tda998x: tda19988 {
 		status = "okay";
  	};
 };

Modified: projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c
==============================================================================
--- projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c	Tue Jan 24 19:56:22 2017	(r312719)
+++ projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c	Tue Jan 24 19:59:25 2017	(r312720)
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 2003, 2008 Silicon Graphics International Corp.
  * Copyright (c) 2012 The FreeBSD Foundation
- * Copyright (c) 2014-2015 Alexander Motin <mav@FreeBSD.org>
+ * Copyright (c) 2014-2017 Alexander Motin <mav@FreeBSD.org>
  * All rights reserved.
  *
  * Portions of this software were developed by Edward Tomasz Napierala
@@ -35,7 +35,7 @@
  * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_backend_ramdisk.c#3 $
  */
 /*
- * CAM Target Layer backend for a "fake" ramdisk.
+ * CAM Target Layer black hole and RAM disk backend.
  *
  * Author: Ken Merry <ken@FreeBSD.org>
  */
@@ -48,9 +48,11 @@ __FBSDID("$FreeBSD$");
 #include <sys/kernel.h>
 #include <sys/condvar.h>
 #include <sys/types.h>
+#include <sys/limits.h>
 #include <sys/lock.h>
 #include <sys/mutex.h>
 #include <sys/malloc.h>
+#include <sys/sx.h>
 #include <sys/taskqueue.h>
 #include <sys/time.h>
 #include <sys/queue.h>
@@ -71,6 +73,29 @@ __FBSDID("$FreeBSD$");
 #include <cam/ctl/ctl_private.h>
 #include <cam/ctl/ctl_error.h>
 
+#define PRIV(io)	\
+    ((struct ctl_ptr_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_BACKEND])
+#define ARGS(io)	\
+    ((struct ctl_lba_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_LBA_LEN])
+
+#define	PPP	(PAGE_SIZE / sizeof(uint8_t **))
+#ifdef __LP64__
+#define	PPPS	(PAGE_SHIFT - 3)
+#else
+#define	PPPS	(PAGE_SHIFT - 2)
+#endif
+#define	SGPP	(PAGE_SIZE / sizeof(struct ctl_sg_entry))
+
+#define	P_UNMAPPED	NULL			/* Page is unmapped. */
+#define	P_ANCHORED	((void *)(uintptr_t)1)	/* Page is anchored. */
+
+typedef enum {
+	GP_READ,	/* Return data page or zero page. */
+	GP_WRITE,	/* Return data page, try allocate if none. */
+	GP_ANCHOR,	/* Return data page, try anchor if none. */
+	GP_OTHER,	/* Return what present, do not allocate/anchor. */
+} getpage_op_t;
+
 typedef enum {
 	CTL_BE_RAMDISK_LUN_UNCONFIGURED	= 0x01,
 	CTL_BE_RAMDISK_LUN_CONFIG_ERR	= 0x02,
@@ -79,28 +104,29 @@ typedef enum {
 
 struct ctl_be_ramdisk_lun {
 	struct ctl_lun_create_params params;
-	char lunname[32];
-	uint64_t size_bytes;
-	uint64_t size_blocks;
+	char			lunname[32];
+	int			indir;
+	uint8_t			**pages;
+	uint8_t			*zero_page;
+	struct sx		page_lock;
+	u_int			pblocksize;
+	u_int			pblockmul;
+	uint64_t		size_bytes;
+	uint64_t		size_blocks;
+	uint64_t		cap_bytes;
+	uint64_t		cap_used;
 	struct ctl_be_ramdisk_softc *softc;
 	ctl_be_ramdisk_lun_flags flags;
 	STAILQ_ENTRY(ctl_be_ramdisk_lun) links;
-	struct ctl_be_lun cbe_lun;
-	struct taskqueue *io_taskqueue;
-	struct task io_task;
+	struct ctl_be_lun	cbe_lun;
+	struct taskqueue	*io_taskqueue;
+	struct task		io_task;
 	STAILQ_HEAD(, ctl_io_hdr) cont_queue;
-	struct mtx_padalign queue_lock;
+	struct mtx_padalign	queue_lock;
 };
 
 struct ctl_be_ramdisk_softc {
 	struct mtx lock;
-	int rd_size;
-#ifdef CTL_RAMDISK_PAGES
-	uint8_t **ramdisk_pages;
-	int num_pages;
-#else
-	uint8_t *ramdisk_buffer;
-#endif
 	int num_luns;
 	STAILQ_HEAD(, ctl_be_ramdisk_lun) lun_list;
 };
@@ -111,8 +137,13 @@ extern struct ctl_softc *control_softc;
 static int ctl_backend_ramdisk_init(void);
 static int ctl_backend_ramdisk_shutdown(void);
 static int ctl_backend_ramdisk_move_done(union ctl_io *io);
+static void ctl_backend_ramdisk_compare(union ctl_io *io);
+static void ctl_backend_ramdisk_rw(union ctl_io *io);
 static int ctl_backend_ramdisk_submit(union ctl_io *io);
-static void ctl_backend_ramdisk_continue(union ctl_io *io);
+static void ctl_backend_ramdisk_worker(void *context, int pending);
+static int ctl_backend_ramdisk_config_read(union ctl_io *io);
+static int ctl_backend_ramdisk_config_write(union ctl_io *io);
+static uint64_t ctl_backend_ramdisk_lun_attr(void *be_lun, const char *attrname);
 static int ctl_backend_ramdisk_ioctl(struct cdev *dev, u_long cmd,
 				     caddr_t addr, int flag, struct thread *td);
 static int ctl_backend_ramdisk_rm(struct ctl_be_ramdisk_softc *softc,
@@ -121,12 +152,9 @@ static int ctl_backend_ramdisk_create(st
 				      struct ctl_lun_req *req);
 static int ctl_backend_ramdisk_modify(struct ctl_be_ramdisk_softc *softc,
 				  struct ctl_lun_req *req);
-static void ctl_backend_ramdisk_worker(void *context, int pending);
 static void ctl_backend_ramdisk_lun_shutdown(void *be_lun);
 static void ctl_backend_ramdisk_lun_config_status(void *be_lun,
 						  ctl_lun_config_status status);
-static int ctl_backend_ramdisk_config_write(union ctl_io *io);
-static int ctl_backend_ramdisk_config_read(union ctl_io *io);
 
 static struct ctl_backend_driver ctl_be_ramdisk_driver = 
 {
@@ -138,36 +166,21 @@ static struct ctl_backend_driver ctl_be_
 	.data_move_done = ctl_backend_ramdisk_move_done,
 	.config_read = ctl_backend_ramdisk_config_read,
 	.config_write = ctl_backend_ramdisk_config_write,
-	.ioctl = ctl_backend_ramdisk_ioctl
+	.ioctl = ctl_backend_ramdisk_ioctl,
+	.lun_attr = ctl_backend_ramdisk_lun_attr,
 };
 
 MALLOC_DEFINE(M_RAMDISK, "ramdisk", "Memory used for CTL RAMdisk");
 CTL_BACKEND_DECLARE(cbr, ctl_be_ramdisk_driver);
 
-int
+static int
 ctl_backend_ramdisk_init(void)
 {
 	struct ctl_be_ramdisk_softc *softc = &rd_softc;
-#ifdef CTL_RAMDISK_PAGES
-	int i;
-#endif
 
 	memset(softc, 0, sizeof(*softc));
 	mtx_init(&softc->lock, "ctlramdisk", NULL, MTX_DEF);
 	STAILQ_INIT(&softc->lun_list);
-	softc->rd_size = 1024 * 1024;
-#ifdef CTL_RAMDISK_PAGES
-	softc->num_pages = softc->rd_size / PAGE_SIZE;
-	softc->ramdisk_pages = (uint8_t **)malloc(sizeof(uint8_t *) *
-						  softc->num_pages, M_RAMDISK,
-						  M_WAITOK);
-	for (i = 0; i < softc->num_pages; i++)
-		softc->ramdisk_pages[i] = malloc(PAGE_SIZE, M_RAMDISK,M_WAITOK);
-#else
-	softc->ramdisk_buffer = (uint8_t *)malloc(softc->rd_size, M_RAMDISK,
-						  M_WAITOK);
-#endif
-
 	return (0);
 }
 
@@ -176,9 +189,6 @@ ctl_backend_ramdisk_shutdown(void)
 {
 	struct ctl_be_ramdisk_softc *softc = &rd_softc;
 	struct ctl_be_ramdisk_lun *lun, *next_lun;
-#ifdef CTL_RAMDISK_PAGES
-	int i;
-#endif
 
 	mtx_lock(&softc->lock);
 	STAILQ_FOREACH_SAFE(lun, &softc->lun_list, links, next_lun) {
@@ -193,30 +203,210 @@ ctl_backend_ramdisk_shutdown(void)
 		mtx_lock(&softc->lock);
 	}
 	mtx_unlock(&softc->lock);
-
-#ifdef CTL_RAMDISK_PAGES
-	for (i = 0; i < softc->num_pages; i++)
-		free(softc->ramdisk_pages[i], M_RAMDISK);
-	free(softc->ramdisk_pages, M_RAMDISK);
-#else
-	free(softc->ramdisk_buffer, M_RAMDISK);
-#endif
 	mtx_destroy(&softc->lock);
 	return (0);
 }
 
+static uint8_t *
+ctl_backend_ramdisk_getpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn,
+    getpage_op_t op)
+{
+	uint8_t **p, ***pp;
+	off_t i;
+	int s;
+
+	if (be_lun->cap_bytes == 0) {
+		switch (op) {
+		case GP_READ:
+			return (be_lun->zero_page);
+		case GP_WRITE:
+			return ((uint8_t *)be_lun->pages);
+		case GP_ANCHOR:
+			return (P_ANCHORED);
+		default:
+			return (P_UNMAPPED);
+		}
+	}
+	if (op == GP_WRITE || op == GP_ANCHOR) {
+		sx_xlock(&be_lun->page_lock);
+		pp = &be_lun->pages;
+		for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+			if (*pp == NULL) {
+				*pp = malloc(PAGE_SIZE, M_RAMDISK,
+				    M_WAITOK|M_ZERO);
+			}
+			i = pn >> s;
+			pp = (uint8_t ***)&(*pp)[i];
+			pn -= i << s;
+		}
+		if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) {
+			if (op == GP_WRITE) {
+				*pp = malloc(be_lun->pblocksize, M_RAMDISK,
+				    M_WAITOK|M_ZERO);
+			} else
+				*pp = P_ANCHORED;
+			be_lun->cap_used += be_lun->pblocksize;
+		} else if (*pp == P_ANCHORED && op == GP_WRITE) {
+			*pp = malloc(be_lun->pblocksize, M_RAMDISK,
+			    M_WAITOK|M_ZERO);
+		}
+		sx_xunlock(&be_lun->page_lock);
+		return ((uint8_t *)*pp);
+	} else {
+		sx_slock(&be_lun->page_lock);
+		p = be_lun->pages;
+		for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+			if (p == NULL)
+				break;
+			i = pn >> s;
+			p = (uint8_t **)p[i];
+			pn -= i << s;
+		}
+		sx_sunlock(&be_lun->page_lock);
+		if ((p == P_UNMAPPED || p == P_ANCHORED) && op == GP_READ)
+			return (be_lun->zero_page);
+		return ((uint8_t *)p);
+	}
+};
+
+static void
+ctl_backend_ramdisk_unmappage(struct ctl_be_ramdisk_lun *be_lun, off_t pn)
+{
+	uint8_t ***pp;
+	off_t i;
+	int s;
+
+	if (be_lun->cap_bytes == 0)
+		return;
+	sx_xlock(&be_lun->page_lock);
+	pp = &be_lun->pages;
+	for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+		if (*pp == NULL)
+			goto noindir;
+		i = pn >> s;
+		pp = (uint8_t ***)&(*pp)[i];
+		pn -= i << s;
+	}
+	if (*pp == P_ANCHORED) {
+		be_lun->cap_used -= be_lun->pblocksize;
+		*pp = P_UNMAPPED;
+	} else if (*pp != P_UNMAPPED) {
+		free(*pp, M_RAMDISK);
+		be_lun->cap_used -= be_lun->pblocksize;
+		*pp = P_UNMAPPED;
+	}
+noindir:
+	sx_xunlock(&be_lun->page_lock);
+};
+
+static void
+ctl_backend_ramdisk_anchorpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn)
+{
+	uint8_t ***pp;
+	off_t i;
+	int s;
+
+	if (be_lun->cap_bytes == 0)
+		return;
+	sx_xlock(&be_lun->page_lock);
+	pp = &be_lun->pages;
+	for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+		if (*pp == NULL)
+			goto noindir;
+		i = pn >> s;
+		pp = (uint8_t ***)&(*pp)[i];
+		pn -= i << s;
+	}
+	if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) {
+		be_lun->cap_used += be_lun->pblocksize;
+		*pp = P_ANCHORED;
+	} else if (*pp != P_ANCHORED) {
+		free(*pp, M_RAMDISK);
+		*pp = P_ANCHORED;
+	}
+noindir:
+	sx_xunlock(&be_lun->page_lock);
+};
+
+static void
+ctl_backend_ramdisk_freeallpages(uint8_t **p, int indir)
+{
+	int i;
+
+	if (p == NULL)
+		return;
+	if (indir == 0) {
+		free(p, M_RAMDISK);
+		return;
+	}
+	for (i = 0; i < PPP; i++) {
+		if (p[i] == NULL)
+			continue;
+		ctl_backend_ramdisk_freeallpages((uint8_t **)p[i], indir - 1);
+	}
+	free(p, M_RAMDISK);
+};
+
+static size_t
+cmp(uint8_t *a, uint8_t *b, size_t size)
+{
+	size_t i;
+
+	for (i = 0; i < size; i++) {
+		if (a[i] != b[i])
+			break;
+	}
+	return (i);
+}
+
+static int
+ctl_backend_ramdisk_cmp(union ctl_io *io)
+{
+	struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+	struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun;
+	uint8_t *page;
+	uint8_t info[8];
+	uint64_t lba;
+	u_int lbaoff, lbas, res, off;
+
+	lbas = io->scsiio.kern_data_len / cbe_lun->blocksize;
+	lba = ARGS(io)->lba + PRIV(io)->len - lbas;
+	off = 0;
+	for (; lbas > 0; lbas--, lba++) {
+		page = ctl_backend_ramdisk_getpage(be_lun,
+		    lba >> cbe_lun->pblockexp, GP_READ);
+		lbaoff = lba & ~(UINT_MAX << cbe_lun->pblockexp);
+		page += lbaoff * cbe_lun->blocksize;
+		res = cmp(io->scsiio.kern_data_ptr + off, page,
+		    cbe_lun->blocksize);
+		off += res;
+		if (res < cbe_lun->blocksize)
+			break;
+	}
+	if (lbas > 0) {
+		off += io->scsiio.kern_rel_offset - io->scsiio.kern_data_len;
+		scsi_u64to8b(off, info);
+		ctl_set_sense(&io->scsiio, /*current_error*/ 1,
+		    /*sense_key*/ SSD_KEY_MISCOMPARE,
+		    /*asc*/ 0x1D, /*ascq*/ 0x00,
+		    /*type*/ SSD_ELEM_INFO,
+		    /*size*/ sizeof(info), /*data*/ &info,
+		    /*type*/ SSD_ELEM_NONE);
+		return (1);
+	}
+	return (0);
+}
+
 static int
 ctl_backend_ramdisk_move_done(union ctl_io *io)
 {
-	struct ctl_be_lun *cbe_lun;
-	struct ctl_be_ramdisk_lun *be_lun;
+	struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+	struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun;
 #ifdef CTL_TIME_IO
 	struct bintime cur_bt;
 #endif
 
 	CTL_DEBUG_PRINT(("ctl_backend_ramdisk_move_done\n"));
-	cbe_lun = CTL_BACKEND_LUN(io);
-	be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun->be_lun;
 #ifdef CTL_TIME_IO
 	getbinuptime(&cur_bt);
 	bintime_sub(&cur_bt, &io->io_hdr.dma_start_bt);
@@ -240,7 +430,12 @@ ctl_backend_ramdisk_move_done(union ctl_
 		ctl_set_invalid_field_ciu(&io->scsiio);
 	} else if ((io->io_hdr.port_status == 0) &&
 	    ((io->io_hdr.status & CTL_STATUS_MASK) == CTL_STATUS_NONE)) {
-		if (io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer > 0) {
+		if (ARGS(io)->flags & CTL_LLF_COMPARE) {
+			/* We have data block ready for comparison. */
+			if (ctl_backend_ramdisk_cmp(io))
+				goto done;
+		}
+		if (ARGS(io)->len > PRIV(io)->len) {
 			mtx_lock(&be_lun->queue_lock);
 			STAILQ_INSERT_TAIL(&be_lun->cont_queue,
 			    &io->io_hdr, links);
@@ -251,75 +446,109 @@ ctl_backend_ramdisk_move_done(union ctl_
 		}
 		ctl_set_success(&io->scsiio);
 	}
+done:
 	ctl_data_submit_done(io);
 	return(0);
 }
 
-static int
-ctl_backend_ramdisk_submit(union ctl_io *io)
+static void
+ctl_backend_ramdisk_compare(union ctl_io *io)
 {
-	struct ctl_be_lun *cbe_lun;
-	struct ctl_lba_len_flags *lbalen;
+	struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+	u_int lbas, len;
 
-	cbe_lun = CTL_BACKEND_LUN(io);
-	lbalen = (struct ctl_lba_len_flags *)&io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
-	if (lbalen->flags & CTL_LLF_VERIFY) {
-		ctl_set_success(&io->scsiio);
-		ctl_data_submit_done(io);
-		return (CTL_RETVAL_COMPLETE);
-	}
-	io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer =
-	    lbalen->len * cbe_lun->blocksize;
-	ctl_backend_ramdisk_continue(io);
-	return (CTL_RETVAL_COMPLETE);
+	lbas = ARGS(io)->len - PRIV(io)->len;
+	lbas = MIN(lbas, 131072 / cbe_lun->blocksize);
+	len = lbas * cbe_lun->blocksize;
+
+	io->scsiio.be_move_done = ctl_backend_ramdisk_move_done;
+	io->scsiio.kern_data_ptr = malloc(len, M_RAMDISK, M_WAITOK);
+	io->scsiio.kern_data_len = len;
+	io->scsiio.kern_sg_entries = 0;
+	io->io_hdr.flags |= CTL_FLAG_ALLOCATED;
+	PRIV(io)->len += lbas;
+#ifdef CTL_TIME_IO
+	getbinuptime(&io->io_hdr.dma_start_bt);
+#endif
+	ctl_datamove(io);
 }
 
 static void
-ctl_backend_ramdisk_continue(union ctl_io *io)
+ctl_backend_ramdisk_rw(union ctl_io *io)
 {
-	struct ctl_be_ramdisk_softc *softc;
-	int len, len_filled, sg_filled;
-#ifdef CTL_RAMDISK_PAGES
+	struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+	struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun;
 	struct ctl_sg_entry *sg_entries;
-	int i;
-#endif
-
-	softc = &rd_softc;
-	len = io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer;
-#ifdef CTL_RAMDISK_PAGES
-	sg_filled = min(btoc(len), softc->num_pages);
-	if (sg_filled > 1) {
+	uint8_t *page;
+	uint64_t lba;
+	u_int i, len, lbaoff, lbas, sgs, off;
+	getpage_op_t op;
+
+	lba = ARGS(io)->lba + PRIV(io)->len;
+	lbaoff = lba & ~(UINT_MAX << cbe_lun->pblockexp);
+	lbas = ARGS(io)->len - PRIV(io)->len;
+	lbas = MIN(lbas, (SGPP << cbe_lun->pblockexp) - lbaoff);
+	sgs = (lbas + lbaoff + be_lun->pblockmul - 1) >> cbe_lun->pblockexp;
+	off = lbaoff * cbe_lun->blocksize;
+	op = (ARGS(io)->flags & CTL_LLF_WRITE) ? GP_WRITE : GP_READ;
+	if (sgs > 1) {
 		io->scsiio.kern_data_ptr = malloc(sizeof(struct ctl_sg_entry) *
-						  sg_filled, M_RAMDISK,
-						  M_WAITOK);
+		    sgs, M_RAMDISK, M_WAITOK);
 		sg_entries = (struct ctl_sg_entry *)io->scsiio.kern_data_ptr;
-		for (i = 0, len_filled = 0; i < sg_filled; i++) {
-			sg_entries[i].addr = softc->ramdisk_pages[i];
-			sg_entries[i].len = MIN(PAGE_SIZE, len - len_filled);
-			len_filled += sg_entries[i].len;
+		len = lbas * cbe_lun->blocksize;
+		for (i = 0; i < sgs; i++) {
+			page = ctl_backend_ramdisk_getpage(be_lun,
+			    (lba >> cbe_lun->pblockexp) + i, op);
+			if (page == P_UNMAPPED || page == P_ANCHORED) {
+				free(io->scsiio.kern_data_ptr, M_RAMDISK);
+nospc:
+				ctl_set_space_alloc_fail(&io->scsiio);
+				ctl_data_submit_done(io);
+				return;
+			}
+			sg_entries[i].addr = page + off;
+			sg_entries[i].len = MIN(len, be_lun->pblocksize - off);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701241959.v0OJxPp9090667>