From creep@nat.dembego6.waw.pl  Sun Jul 31 22:24:40 2005
Return-Path: <creep@nat.dembego6.waw.pl>
Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP id 2653F16A41F
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 31 Jul 2005 22:24:40 +0000 (GMT)
	(envelope-from creep@nat.dembego6.waw.pl)
Received: from dembego6.waw.pl (nat.dembego6.waw.pl [62.233.200.64])
	by mx1.FreeBSD.org (Postfix) with ESMTP id EF4D443D48
	for <FreeBSD-gnats-submit@freebsd.org>; Sun, 31 Jul 2005 22:24:32 +0000 (GMT)
	(envelope-from creep@nat.dembego6.waw.pl)
Received: from nat.dembego6.waw.pl (localhost [127.0.0.1])
	by nat.dembego6.waw.pl (8.13.3/8.13.3) with ESMTP id j6VMHgkh003539
	for <FreeBSD-gnats-submit@freebsd.org>; Mon, 1 Aug 2005 00:17:43 +0200 (CEST)
	(envelope-from creep@nat.dembego6.waw.pl)
Received: (from creep@localhost)
	by nat.dembego6.waw.pl (8.13.3/8.13.3/Submit) id j6VLRabM003405;
	Sun, 31 Jul 2005 23:27:36 +0200 (CEST)
	(envelope-from creep)
Message-Id: <200507312127.j6VLRabM003405@nat.dembego6.waw.pl>
Date: Sun, 31 Jul 2005 23:27:36 +0200 (CEST)
From: Marcin Koziej <mkoziej@mion.elka.pw.edu.pl>
Reply-To: Marcin Koziej <mkoziej@mion.elka.pw.edu.pl>
To: FreeBSD-gnats-submit@freebsd.org
Cc:
Subject: [PATCH] psm drivers adds bad buttons for Synaptics touchpad
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         84411
>Category:       kern
>Synopsis:       [psm] [patch] psm drivers adds bad buttons for Synaptics touchpad
>Confidential:   no
>Severity:       serious
>Priority:       low
>Responsible:    philip
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Sun Jul 31 22:30:22 GMT 2005
>Closed-Date:    Thu Oct 10 09:12:17 UTC 2013
>Last-Modified:  Thu Oct 10 09:12:17 UTC 2013
>Originator:     Marcin Koziej <mkoziej@mion.elka.pw.edu.pl>
>Release:        FreeBSD 6.0-BETA1 i386
>Organization:
>Environment:
System: FreeBSD carnivore 6.0-BETA1 FreeBSD 6.0-BETA1 #0: Sun Jul 31 14:24:31 CEST 2005 root@carnivore:/home/src/sys/i386/compile/AVI i386

ACER ASPIRE 1525WLMi laptop with Synaptics touchpad.

>Description:
	The psm driver running Synaptics touchpad (hw.psm.synaptics_support=1) in wide mode reports extended button presses which user didn't press. 
	Extended buttons can be reported when moving mouse with right key pressed.

	This is due incorrect interpretation of packets. The extended buttons are reported only when RightButtonBit ^ ExtendedFlagBit != 0
The code incorrectly reports the extended buttons when ExtendedFlagBit != 0

	Additionally, `tapping' code is supposed to report:
		Button 1 when one finger is tapping (4 <= w)
		Button 3 when two fingers are tapping (w == 0)
		Button 2 when thre fingers are tapping (w == 1)
	In reality, button 3 is sometimes reported when tapping with one finger.
	This happens because touchpad reports two fingers, but with very little pressure ( <= 3). This situation should not trigger button 3.
	
>How-To-Repeat:
	Using touchpad with extended buttons, move mouse with right button pressed. extended buttons will be reported. (For instance, doing it over firefox window will scroll down and up or go back/forward randomly)

	Try to tap with one finger. You will get a right button press once in a while. (For instance, tap on the firefox window a little bit, the popup menu will show up)

>Fix:

	The psm-extbuttons patch fixes problems with wrong buttons being reported.
	The changes were according to excellent documentation from Synaptics (http://www.synaptics.com/support/dev_support.cfm).

	Changes: 
	psm-extbuttons.patch:
		Query for extended capability list was fixed, added query for extended buttons number. Two new fields in struct synapticshw, capMiddle (Touchad with middle button) and extButtons (Number of extended buttons).
		Improved reporting of extended buttons for touchpads
			fourButtons (Left, Right, Up, Down) (untested)
			middle button (Left, Right, Middle) (untested)
			extended buttons (up to 8 extended buttons support) (tested 4btns, correct)
	psm-tap.patch:
		Added a condition to only report right button when z value (pressure) is more then 3. (It fixes the problem completely for my touchpad. However, testing on other touchpads is propably needed)

--- psm-extbuttons.patch begins here ---
--- sys/dev/atkbdc/psm.c.orig	Sat Jul 30 17:53:18 2005
+++ sys/dev/atkbdc/psm.c	Sun Jul 31 13:25:55 2005
@@ -2511,13 +2511,14 @@
 
 	case MOUSE_MODEL_SYNAPTICS:
 	    /* TouchPad PS/2 absolute mode message format
+	     * with capFourButtons:
 	     *
 	     *  Bits:        7   6   5   4   3   2   1   0 (LSB)
 	     *  ------------------------------------------------
 	     *  ipacket[0]:  1   0  W3  W2   0  W1   R   L
 	     *  ipacket[1]: Yb  Ya  Y9  Y8  Xb  Xa  X9  X8
 	     *  ipacket[2]: Z7  Z6  Z5  Z4  Z3  Z2  Z1  Z0
-	     *  ipacket[3]:  1   1  Yc  Xc   0  W0   D   U
+	     *  ipacket[3]:  1   1  Yc  Xc   0  W0 D^R U^L
 	     *  ipacket[4]: X7  X6  X5  X4  X3  X2  X1  X0
 	     *  ipacket[5]: Y7  Y6  Y5  Y4  Y3  Y2  Y1  Y0
 	     *
@@ -2531,6 +2532,20 @@
 	     *  Y: x position
 	     *  Z: pressure
 	     *
+		 * Without capFourButtons but with extButtons and/or capMiddle
+		 *  Bits:        7   6   5   4      3      2      1      0 (LSB)
+	     *  ------------------------------------------------------
+	     *  ipacket[3]:  1   1  Yc  Xc      0     W0    E^R    M^L
+	     *  ipacket[4]: X7  X6  X5  X4  X3|b7  X2|b5  X1|b3  X0|b1
+	     *  ipacket[5]: Y7  Y6  Y5  Y4  Y3|b8  Y2|b6  Y1|b4  Y0|b2
+		 * 
+		 * Legend:
+		 * M: middle physical mouse button
+		 * E: extended mouse buttons repored instead of low bits of X and Y
+		 * b1-b8: extended mouse buttons. Only ((extButtons + 1) >> 1) bits 
+		 *        are used in packet 4 and 5, for reading X and Y value 
+		 *        they should be zeroed.
+		 *
 	     * Absolute reportable limits:    0 - 6143.
 	     * Typical bezel limits:       1472 - 5472.
 	     * Typical edge marings:       1632 - 5312.
@@ -2590,38 +2605,41 @@
 	    if (pb->ipacket[0] & 0x02)
 		  touchpad_buttons |= MOUSE_BUTTON3DOWN;
 
-	    if (sc->synhw.capExtended && sc->synhw.capFourButtons) {
-		if ((pb->ipacket[3] & 0x01) && (pb->ipacket[0] & 0x01) == 0)
-		    touchpad_buttons |= MOUSE_BUTTON4DOWN;
-		if ((pb->ipacket[3] & 0x02) && (pb->ipacket[0] & 0x02) == 0)
-		    touchpad_buttons |= MOUSE_BUTTON5DOWN;
-	    }
-
-	    /* 
-	     * In newer pads - bit 0x02 in the third byte of
-	     * the packet indicates that we have an extended
-	     * button press.
-	     */
-	    if (pb->ipacket[3] & 0x02) {
-	        /* 
-		 * if directional_scrolls is not 1, we treat
-	     	 * any of the scrolling directions as middle-click.
-	     	 */
-		if (sc->syninfo.directional_scrolls) {
-		    if (pb->ipacket[4] & 0x01)
-			touchpad_buttons |= MOUSE_BUTTON4DOWN;
-		    if (pb->ipacket[5] & 0x01)
-			touchpad_buttons |= MOUSE_BUTTON5DOWN;
-		    if (pb->ipacket[4] & 0x02)
-			touchpad_buttons |= MOUSE_BUTTON6DOWN;
-   		    if (pb->ipacket[5] & 0x02)
-			touchpad_buttons |= MOUSE_BUTTON7DOWN;
-		} else {
-		    if ((pb->ipacket[4] & 0x0F) || (pb->ipacket[5] & 0x0F))
-			touchpad_buttons |= MOUSE_BUTTON2DOWN;
+		if (sc->synhw.capExtended && sc->synhw.capFourButtons) {
+			if ((pb->ipacket[3] ^ pb->ipacket[0]) & 0x01)
+				touchpad_buttons |= MOUSE_BUTTON4DOWN;
+			if ((pb->ipacket[3] ^ pb->ipacket[0]) & 0x02)
+				touchpad_buttons |= MOUSE_BUTTON5DOWN;
+		}
+		else if (sc->synhw.capExtended)
+		{
+			/* Middle button */
+			if ((pb->ipacket[3] & sc->synhw.capMiddle) && ((pb->ipacket[0] ^ pb->ipacket[3]) & 0x01))
+				touchpad_buttons |= MOUSE_BUTTON2DOWN;
+			/* Extended buttons */
+			if (sc->synhw.extButtons > 0 && ((pb->ipacket[0] ^ pb->ipacket[3]) & 0x02))
+			{
+				if (sc->syninfo.directional_scrolls) {
+					/* Iterate over extButtons bits, see legend. */
+					int cb=0;
+					for (cb = 0; cb < sc->synhw.extButtons; cb++)
+					{
+						if (pb->ipacket[4 + (cb%2)] & (1 << (cb >> 1)) )
+							touchpad_buttons |= (MOUSE_BUTTON4DOWN << cb);
+					}
+				} else {
+					/* Or just report middle button as the user requested */
+					touchpad_buttons |= MOUSE_BUTTON2DOWN;
+				}
+				/*
+				 * Zeros out bits used by buttons.
+				 * ( sc->synhw.extButons + 1 ) >> 1  bits will be masked out in both bytes.
+				 * ( 1 << x ) - 1 computest the mask for x bits.
+				 */
+				pb->ipacket[4] &= ~((1 << ((sc->synhw.extButtons+1) >> 1)) - 1);
+				pb->ipacket[5] &= ~((1 << ((sc->synhw.extButtons+1) >> 1)) - 1);
+			}
 		}
-
-	    }
 
 	    ms.button = touchpad_buttons | guest_buttons;
 		
@@ -3247,7 +3265,8 @@
 {
     int status[3];
     KBDC kbdc;
-
+	unsigned char nExtQueries=0;
+	
     if (!synaptics_support)
 	return (FALSE);
 
@@ -3366,7 +3385,7 @@
     /* Read the extended capability bits */
     if (mouse_ext_command(kbdc, 2) == 0)
 	return (FALSE);
-    if (get_mouse_status(kbdc, status, 0, 3) != 3)
+    if (get_mouse_status(kbdc, status, 0, 2) != 2)
 	return (FALSE);
     if (status[1] != 0x47) {
 	printf("  Failed to read extended capability bits\n");
@@ -3375,13 +3394,14 @@
 
     /* Set the different capabilities when they exist */
     if ((status[0] & 0x80) >> 7) {
-	sc->synhw.capExtended    = (status[0] & 0x80) >> 7;
-    	sc->synhw.capPassthrough = (status[2] & 0x80) >> 7;
-    	sc->synhw.capSleep       = (status[2] & 0x10) >> 4;
-    	sc->synhw.capFourButtons = (status[2] & 0x08) >> 3;
-    	sc->synhw.capMultiFinger = (status[2] & 0x02) >> 1;
-    	sc->synhw.capPalmDetect  = (status[2] & 0x01);
-	
+    	sc->synhw.capExtended    = (status[0] & 0x80) >> 7;
+    	nExtQueries              = (status[0] & 0x70) >> 4;		// 3 bit.   
+    	sc->synhw.capPassthrough = (status[1] & 0x80) >> 7;
+    	sc->synhw.capSleep       = (status[1] & 0x10) >> 4;
+    	sc->synhw.capFourButtons = (status[1] & 0x08) >> 3;
+    	sc->synhw.capMultiFinger = (status[1] & 0x02) >> 1;
+    	sc->synhw.capPalmDetect  = (status[1] & 0x01);
+		sc->synhw.capMiddle		 = sc->synhw.capFourButtons ? 0 : (status[0] & 0x04) >> 2;
 	if (verbose >= 2) {
 	    printf("  Extended capabilities:\n");
 	    printf("   capExtended: %d\n", sc->synhw.capExtended);
@@ -3390,6 +3410,7 @@
 	    printf("   capFourButtons: %d\n", sc->synhw.capFourButtons);
 	    printf("   capMultiFinger: %d\n", sc->synhw.capMultiFinger);
 	    printf("   capPalmDetect: %d\n", sc->synhw.capPalmDetect);
+		printf("   Number of extended queries: %d\n", nExtQueries);
 	}
 
 	/*
@@ -3443,8 +3464,20 @@
      *
      * XXX: I'm not sure this is used anywhere.
      */
+	sc->synhw.extButtons = 0;
     if (sc->synhw.capExtended && sc->synhw.capFourButtons)
-	sc->hw.buttons = 4;
+		sc->hw.buttons = 4;
+    else if (sc->synhw.capExtended && nExtQueries>0)
+	{
+		 if (mouse_ext_command(kbdc, 9) == 0)
+			return (FALSE);
+		if (get_mouse_status(kbdc, status, 0, 3) != 3)
+			return (FALSE);
+		sc->synhw.extButtons = (status[1] & 0xf0) >> 4;
+		sc->hw.buttons = 2 + sc->synhw.capMiddle + sc->synhw.extButtons;
+	}
+	else
+		sc->hw.buttons = 2 + sc->synhw.capMiddle;
 
     return (TRUE);
 }
--- sys/sys/mouse.h.orig	Sat Jul 30 18:03:30 2005
+++ sys/sys/mouse.h	Sun Jul 31 11:56:25 2005
@@ -103,10 +103,12 @@
 	int infoGeometry;
 	int capExtended;
 	int capSleep;
+	int capMiddle;
 	int capFourButtons;
 	int capMultiFinger;
 	int capPalmDetect;
 	int capPassthrough;
+	int extButtons;
 } synapticshw_t;
 
 /* iftype */
--- psm-extbuttons.patch ends here ---

--- psm-tap.patch begins here ---
--- sys/dev/atkbdc/psm.c.orig	Sat Jul 30 17:53:18 2005
+++ sys/dev/atkbdc/psm.c	Sun Jul 31 13:25:55 2005
@@ -2741,7 +2759,7 @@
 
 		if (sc->zmax > tap_threshold &&
 		    timevalcmp(&sc->lastsoftintr, &sc->taptimeout, <=)) {
-			if (w == 0)
+			if (w == 0 && z > 3)
 			    ms.button |= MOUSE_BUTTON3DOWN;
 			else if (w == 1)
 			    ms.button |= MOUSE_BUTTON2DOWN;
--- psm-tap.patch ends here ---


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->philip 
Responsible-Changed-By: philip 
Responsible-Changed-When: Tue Oct 18 11:41:42 GMT 2005 
Responsible-Changed-Why:  
I'll take care of this. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=84411 

From: Brandon Gooch <jamesbrandongooch@gmail.com>
To: bug-followup@FreeBSD.org, mkoziej@mion.elka.pw.edu.pl
Cc: philip@freebsd.org
Subject: Re: kern/84411: [psm] [patch] psm drivers adds bad buttons for
 Synaptics touchpad
Date: Sun, 19 Aug 2012 21:49:46 -0500

 --bcaec517a4a00984f104c7a990f6
 Content-Type: text/plain; charset=ISO-8859-1
 
 In an effort to activate the middle mouse button on my Synaptics
 TouchPad (installed in a Dell M6500), I ran across this PR. The
 attached patch, while in the same spirit, actually establishes a
 functional middle mouse button, as well as fixes the strange
 "right-click mouse button + TouchPad scroll bug" talked about in at
 least a couple of places on the internet (including a post by me back
 in 2010):
 
 http://forums.freebsd.org/showthread.php?t=12941
 http://forums.freebsd.org/showthread.php?t=10125
 http://lists.freebsd.org/pipermail/freebsd-mobile/2010-February/011929.html
 
 Although I can't test the additional features this patch adds, e.g.
 extended button support, due to hardware unavailability, I can verify
 that the middle button works and the right-click spurious scroll issue
 is resolved.
 
 Also, the Synaptics PS/2 TouchPad Interfacing Guide formalizes the
 support of "guest devices", which was previously represented by a
 reserved bit. See section 5 of the guide:
 
 http://www.synaptics.com/sites/default/files/511-000275-01_RevB.pdf
 
 One important note to this is the dropped support for guest devices
 from the X.org synaptics driver as of this commit:
 
 http://cgit.freedesktop.org/xorg/driver/xf86-input-synaptics/commit/?id=b19e3782a77c171ca20fc962f95923495fdb7978
 
 The guest device in my Dell M6500 is the Synaptics TouchStyk, an
 enhanced "trackpoint"-style pointing device, which theoretically could
 be represented as another pointing device (similar to how the Linux
 kernel handles these devices from what I've read). However, the
 Synaptics support provided by the psm(4) driver needs significantly
 more work to support the devices in this manner, so this patch is more
 of a stop-gap for now.
 
 --bcaec517a4a00984f104c7a990f6
 Content-Type: application/octet-stream; 
 	name="psm-synaptics-extended-middle-button-support.patch"
 Content-Disposition: attachment; 
 	filename="psm-synaptics-extended-middle-button-support.patch"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_h62xlpzp0
 
 SW5kZXg6IHN5cy9zeXMvbW91c2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvc3lzL21vdXNlLmgJKHJl
 dmlzaW9uIDIzOTM2MSkKKysrIHN5cy9zeXMvbW91c2UuaAkod29ya2luZyBjb3B5KQpAQCAtMTAx
 LDEyICsxMDEsMTUgQEAKIAlpbnQgY2FwUGVuOwogCWludCBpbmZvU2ltcGxDOwogCWludCBpbmZv
 R2VvbWV0cnk7CisJaW50IG5FeHRlbmRlZEJ1dHRvbnM7CiAJaW50IGNhcEV4dGVuZGVkOworCWlu
 dCBuRXh0ZW5kZWRRdWVyaWVzOworCWludCBjYXBNaWRkbGU7CisJaW50IGNhcFBhc3N0aHJvdWdo
 OwogCWludCBjYXBTbGVlcDsKIAlpbnQgY2FwRm91ckJ1dHRvbnM7CiAJaW50IGNhcE11bHRpRmlu
 Z2VyOwogCWludCBjYXBQYWxtRGV0ZWN0OwotCWludCBjYXBQYXNzdGhyb3VnaDsKIH0gc3luYXB0
 aWNzaHdfdDsKIAogLyogaWZ0eXBlICovCkluZGV4OiBzeXMvZGV2L2F0a2JkYy9wc20uYwo9PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09Ci0tLSBzeXMvZGV2L2F0a2JkYy9wc20uYwkocmV2aXNpb24gMjM5MzYxKQorKysgc3lz
 L2Rldi9hdGtiZGMvcHNtLmMJKHdvcmtpbmcgY29weSkKQEAgLTI0NTQsNyArMjQ1NCw3IEBACiB7
 CiAKIAkvKgotCSAqIFBTMisrIHByb3RvY2wgcGFja2V0CisJICogUFMyKysgcHJvdG9jb2wgcGFj
 a2V0CiAJICoKIAkgKiAgICAgICAgICBiNyBiNiBiNSBiNCBiMyBiMiBiMSBiMAogCSAqIGJ5dGUg
 MTogICogIDEgIHAzIHAyIDEgICogICogICoKQEAgLTI1NTIsMTQgKzI1NTIsMTQgQEAKIAlzdGF0
 aWMgaW50IGd1ZXN0X2J1dHRvbnM7CiAJaW50IHcsIHgwLCB5MDsKIAotCS8qIFRvdWNoUGFkIFBT
 LzIgYWJzb2x1dGUgbW9kZSBtZXNzYWdlIGZvcm1hdAorCS8qIFRvdWNoUGFkIFBTLzIgYWJzb2x1
 dGUgbW9kZSBtZXNzYWdlIGZvcm1hdCB3aXRoIGNhcEZvdXJCdXR0b25zOgogCSAqCiAJICogIEJp
 dHM6ICAgICAgICA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMCAoTFNCKQogCSAqICAtLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgKiAgaXBhY2tl
 dFswXTogIDEgICAwICBXMyAgVzIgICAwICBXMSAgIFIgICBMCiAJICogIGlwYWNrZXRbMV06IFli
 ICBZYSAgWTkgIFk4ICBYYiAgWGEgIFg5ICBYOAogCSAqICBpcGFja2V0WzJdOiBaNyAgWjYgIFo1
 ICBaNCAgWjMgIFoyICBaMSAgWjAKLQkgKiAgaXBhY2tldFszXTogIDEgICAxICBZYyAgWGMgICAw
 ICBXMCAgIEQgICBVCisJICogIGlwYWNrZXRbM106ICAxICAgMSAgWWMgIFhjICAgMCAgVzAgRF5S
 IFVeTAogCSAqICBpcGFja2V0WzRdOiBYNyAgWDYgIFg1ICBYNCAgWDMgIFgyICBYMSAgWDAKIAkg
 KiAgaXBhY2tldFs1XTogWTcgIFk2ICBZNSAgWTQgIFkzICBZMiAgWTEgIFkwCiAJICoKQEAgLTI1
 NzMsNiArMjU3MywyMSBAQAogCSAqICBZOiB5IHBvc2l0aW9uCiAJICogIFo6IHByZXNzdXJlCiAJ
 ICoKKwkgKiBXaXRob3V0IGNhcEZvdXJCdXR0b25zIGJ1dCB3aXRoIG5FeHRlbmRlQnV0dG9ucyBh
 bmQvb3IgY2FwTWlkZGxlCisJICoKKwkgKiAgQml0czogICAgICAgIDcgICA2ICAgNSAgIDQgICAg
 ICAzICAgICAgMiAgICAgIDEgICAgICAwIChMU0IpCisJICogIC0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICBpcGFja2V0WzNdOiAgMSAg
 IDEgIFljICBYYyAgICAgIDAgICAgIFcwICAgIEVeUiAgICBNXkwKKwkgKiAgaXBhY2tldFs0XTog
 WDcgIFg2ICBYNSAgWDQgIFgzfGI3ICBYMnxiNSAgWDF8YjMgIFgwfGIxCisJICogIGlwYWNrZXRb
 NV06IFk3ICBZNiAgWTUgIFk0ICBZM3xiOCAgWTJ8YjYgIFkxfGI0ICBZMHxiMgorCSAqCisJICog
 TGVnZW5kOgorCSAqICBNOiBNaWRkbGUgcGh5c2ljYWwgbW91c2UgYnV0dG9uCisJICogIEU6IEV4
 dGVuZGVkIG1vdXNlIGJ1dHRvbnMgcmVwb3JlZCBpbnN0ZWFkIG9mIGxvdyBiaXRzIG9mIFggYW5k
 IFkKKwkgKiAgYjEtYjg6IEV4dGVuZGVkIG1vdXNlIGJ1dHRvbnMKKwkgKiAgICBPbmx5ICgobkV4
 dGVuZGVkQnV0dG9ucyArIDEpID4+IDEpIGJpdHMgYXJlIHVzZWQgaW4gcGFja2V0CisJICogICAg
 NCBhbmQgNSwgZm9yIHJlYWRpbmcgWCBhbmQgWSB2YWx1ZSB0aGV5IHNob3VsZCBiZSB6ZXJvZWQu
 CisJICoKIAkgKiBBYnNvbHV0ZSByZXBvcnRhYmxlIGxpbWl0czogICAgMCAtIDYxNDMuCiAJICog
 VHlwaWNhbCBiZXplbCBsaW1pdHM6ICAgICAgIDE0NzIgLSA1NDcyLgogCSAqIFR5cGljYWwgZWRn
 ZSBtYXJpbmdzOiAgICAgICAxNjMyIC0gNTMxMi4KQEAgLTI2MjYsOCArMjY0MSwxMCBAQAogCQl3
 ID0gNDsKIAl9CiAKLQkvKiBIYW5kbGUgcGFja2V0cyBmcm9tIHRoZSBndWVzdCBkZXZpY2UgKi8K
 LQkvKiBYWFggRG9jdW1lbnRhdGlvbj8gKi8KKwkvKgorCSAqIEhhbmRsZSBwYWNrZXRzIGZyb20g
 dGhlIGd1ZXN0IGRldmljZS4gU2VlOgorCSAqIFN5bmFwdGljcyBQUy8yIFRvdWNoUGFkIEludGVy
 ZmFjaW5nIEd1aWRlLCBTZWN0aW9uIDUuMQorCSAqLwogCWlmICh3ID09IDMgJiYgc2MtPnN5bmh3
 LmNhcFBhc3N0aHJvdWdoKSB7CiAJCSp4ID0gKChwYi0+aXBhY2tldFsxXSAmIDB4MTApID8KIAkJ
 ICAgIHBiLT5pcGFja2V0WzRdIC0gMjU2IDogcGItPmlwYWNrZXRbNF0pOwpAQCAtMjY1NSwzNiAr
 MjY3Miw0OSBAQAogCQl0b3VjaHBhZF9idXR0b25zIHw9IE1PVVNFX0JVVFRPTjNET1dOOwogCiAJ
 aWYgKHNjLT5zeW5ody5jYXBFeHRlbmRlZCAmJiBzYy0+c3luaHcuY2FwRm91ckJ1dHRvbnMpIHsK
 LQkJaWYgKChwYi0+aXBhY2tldFszXSAmIDB4MDEpICYmIChwYi0+aXBhY2tldFswXSAmIDB4MDEp
 ID09IDApCisJCWlmICgocGItPmlwYWNrZXRbM10gXiBwYi0+aXBhY2tldFswXSkgJiAweDAxKQog
 CQkJdG91Y2hwYWRfYnV0dG9ucyB8PSBNT1VTRV9CVVRUT040RE9XTjsKLQkJaWYgKChwYi0+aXBh
 Y2tldFszXSAmIDB4MDIpICYmIChwYi0+aXBhY2tldFswXSAmIDB4MDIpID09IDApCisJCWlmICgo
 cGItPmlwYWNrZXRbM10gXiBwYi0+aXBhY2tldFswXSkgJiAweDAyKQogCQkJdG91Y2hwYWRfYnV0
 dG9ucyB8PSBNT1VTRV9CVVRUT041RE9XTjsKLQl9CisJfSBlbHNlIGlmIChzYy0+c3luaHcuY2Fw
 RXh0ZW5kZWQgJiYgc2MtPnN5bmh3LmNhcE1pZGRsZSkgeworCQkvKiBNaWRkbGUgQnV0dG9uICov
 CisJCWlmICgocGItPmlwYWNrZXRbMF0gXiBwYi0+aXBhY2tldFszXSkgJiAweDAxKQorCQkJdG91
 Y2hwYWRfYnV0dG9ucyB8PSBNT1VTRV9CVVRUT04yRE9XTjsKKwl9IGVsc2UgaWYgKHNjLT5zeW5o
 dy5jYXBFeHRlbmRlZCAmJiAoc2MtPnN5bmh3Lm5FeHRlbmRlZEJ1dHRvbnMgPiAwKSkgeworCQkv
 KiBFeHRlbmRlZCBCdXR0b25zICovCisJCWlmICgocGItPmlwYWNrZXRbMF0gXiBwYi0+aXBhY2tl
 dFszXSkgJiAweDAyKSB7CisJCQlpZiAoc2MtPnN5bmluZm8uZGlyZWN0aW9uYWxfc2Nyb2xscykg
 eworCQkJCWlmIChwYi0+aXBhY2tldFs0XSAmIDB4MDEpCisJCQkJCXRvdWNocGFkX2J1dHRvbnMg
 fD0gTU9VU0VfQlVUVE9ONERPV047CisJCQkJaWYgKHBiLT5pcGFja2V0WzVdICYgMHgwMSkKKwkJ
 CQkJdG91Y2hwYWRfYnV0dG9ucyB8PSBNT1VTRV9CVVRUT041RE9XTjsKKwkJCQlpZiAocGItPmlw
 YWNrZXRbNF0gJiAweDAyKQorCQkJCQl0b3VjaHBhZF9idXR0b25zIHw9IE1PVVNFX0JVVFRPTjZE
 T1dOOworCQkJCWlmIChwYi0+aXBhY2tldFs1XSAmIDB4MDIpCisJCQkJCXRvdWNocGFkX2J1dHRv
 bnMgfD0gTU9VU0VfQlVUVE9ON0RPV047CisJCQl9IGVsc2UgeworCQkJCXRvdWNocGFkX2J1dHRv
 bnMgfD0gTU9VU0VfQlVUVE9OMkRPV047CisJCQl9CiAKLQkvKgotCSAqIEluIG5ld2VyIHBhZHMg
 LSBiaXQgMHgwMiBpbiB0aGUgdGhpcmQgYnl0ZSBvZgotCSAqIHRoZSBwYWNrZXQgaW5kaWNhdGVz
 IHRoYXQgd2UgaGF2ZSBhbiBleHRlbmRlZAotCSAqIGJ1dHRvbiBwcmVzcy4KLQkgKi8KLQkvKiBY
 WFggRG9jdW1lbnRhdGlvbj8gKi8KLQlpZiAocGItPmlwYWNrZXRbM10gJiAweDAyKSB7Ci0JCS8q
 Ci0JCSAqIGlmIGRpcmVjdGlvbmFsX3Njcm9sbHMgaXMgbm90IDEsIHdlIHRyZWF0IGFueSBvZgot
 CQkgKiB0aGUgc2Nyb2xsaW5nIGRpcmVjdGlvbnMgYXMgbWlkZGxlLWNsaWNrLgotCQkgKi8KLQkJ
 aWYgKHNjLT5zeW5pbmZvLmRpcmVjdGlvbmFsX3Njcm9sbHMpIHsKLQkJCWlmIChwYi0+aXBhY2tl
 dFs0XSAmIDB4MDEpCi0JCQkJdG91Y2hwYWRfYnV0dG9ucyB8PSBNT1VTRV9CVVRUT040RE9XTjsK
 LQkJCWlmIChwYi0+aXBhY2tldFs1XSAmIDB4MDEpCi0JCQkJdG91Y2hwYWRfYnV0dG9ucyB8PSBN
 T1VTRV9CVVRUT041RE9XTjsKLQkJCWlmIChwYi0+aXBhY2tldFs0XSAmIDB4MDIpCi0JCQkJdG91
 Y2hwYWRfYnV0dG9ucyB8PSBNT1VTRV9CVVRUT042RE9XTjsKLQkJCWlmIChwYi0+aXBhY2tldFs1
 XSAmIDB4MDIpCi0JCQkJdG91Y2hwYWRfYnV0dG9ucyB8PSBNT1VTRV9CVVRUT043RE9XTjsKLQkJ
 fSBlbHNlIHsKLQkJCWlmICgocGItPmlwYWNrZXRbNF0gJiAweDBGKSB8fAotCQkJICAgIChwYi0+
 aXBhY2tldFs1XSAmIDB4MEYpKQotCQkJCXRvdWNocGFkX2J1dHRvbnMgfD0gTU9VU0VfQlVUVE9O
 MkRPV047CisJCQkvKgorCQkJICogWmVybyBvdXQgYml0cyB1c2VkIGJ5IGV4dGVuZGVkIGJ1dHRv
 bnMgdG8gYXZvaWQKKwkJCSAqIG1pc2ludGVycHJldGF0aW9uIG9mIHRoZSBkYXRhIGFic29sdXRl
 IHBvc2l0aW9uLiAKKwkJCSAqCisJCQkgKiBUaGUgYml0cyByZXByZXNlbnRlZCBieQorCQkJICoK
 KwkJCSAqICAgICAobkV4dGVuZGVkQnV0dG9ucyArIDEpID4+IDEKKwkJCSAqCisJCQkgKiB3aWxs
 IGJlIG1hc2tlZCBvdXQgaW4gYm90aCBieXRlcy4KKwkJCSAqIFRoZSBtYXNrIGZvciBuIGJpdHMg
 aXMgY29tcHV0ZWQgd2l0aCB0aGUgZm9ybXVsYQorCQkJICoKKwkJCSAqICAgICAoMSA8PCBuKSAt
 IDEKKwkJCSAqLworCQkJaW50IG1hc2tlZGJpdHMgPSAwOworCQkJaW50IG1hc2sgPSAwOworCQkJ
 bWFza2VkYml0cyA9IChzYy0+c3luaHcubkV4dGVuZGVkQnV0dG9ucyArIDEpID4+IDE7CisJCQlt
 YXNrID0gKDEgPDwgbWFza2VkYml0cykgLSAxOworCQkJcGItPmlwYWNrZXRbNF0gJj0gfihtYXNr
 KTsKKwkJCXBiLT5pcGFja2V0WzVdICY9IH4obWFzayk7CiAJCX0KIAl9CiAKQEAgLTQzOTAsMTUg
 KzQ0MjAsMjAgQEAKIAlidXR0b25zID0gMDsKIAlzeW5ody5jYXBFeHRlbmRlZCA9IChzdGF0dXNb
 MF0gJiAweDgwKSAhPSAwOwogCWlmIChzeW5ody5jYXBFeHRlbmRlZCkgewotCQlzeW5ody5jYXBQ
 YXNzdGhyb3VnaCA9IChzdGF0dXNbMl0gJiAweDgwKSAhPSAwOwotCQlzeW5ody5jYXBTbGVlcCAg
 ICAgICA9IChzdGF0dXNbMl0gJiAweDEwKSAhPSAwOwotCQlzeW5ody5jYXBGb3VyQnV0dG9ucyA9
 IChzdGF0dXNbMl0gJiAweDA4KSAhPSAwOwotCQlzeW5ody5jYXBNdWx0aUZpbmdlciA9IChzdGF0
 dXNbMl0gJiAweDAyKSAhPSAwOwotCQlzeW5ody5jYXBQYWxtRGV0ZWN0ICA9IChzdGF0dXNbMl0g
 JiAweDAxKSAhPSAwOworCQlzeW5ody5uRXh0ZW5kZWRRdWVyaWVzID0gKHN0YXR1c1swXSAmIDB4
 NzApICE9IDA7CisJCXN5bmh3LmNhcE1pZGRsZSAgICAgICAgPSAoc3RhdHVzWzBdICYgMHgwNCkg
 IT0gMDsKKwkJc3luaHcuY2FwUGFzc3Rocm91Z2ggICA9IChzdGF0dXNbMl0gJiAweDgwKSAhPSAw
 OworCQlzeW5ody5jYXBTbGVlcCAgICAgICAgID0gKHN0YXR1c1syXSAmIDB4MTApICE9IDA7CisJ
 CXN5bmh3LmNhcEZvdXJCdXR0b25zICAgPSAoc3RhdHVzWzJdICYgMHgwOCkgIT0gMDsKKwkJc3lu
 aHcuY2FwTXVsdGlGaW5nZXIgICA9IChzdGF0dXNbMl0gJiAweDAyKSAhPSAwOworCQlzeW5ody5j
 YXBQYWxtRGV0ZWN0ICAgID0gKHN0YXR1c1syXSAmIDB4MDEpICE9IDA7CiAKIAkJaWYgKHZlcmJv
 c2UgPj0gMikgewogCQkJcHJpbnRmKCIgIEV4dGVuZGVkIGNhcGFiaWxpdGllczpcbiIpOwogCQkJ
 cHJpbnRmKCIgICBjYXBFeHRlbmRlZDogJWRcbiIsIHN5bmh3LmNhcEV4dGVuZGVkKTsKKwkJCXBy
 aW50ZigiICAgY2FwTWlkZGxlOiAlZFxuIiwgc3luaHcuY2FwTWlkZGxlKTsKKwkJCXByaW50Zigi
 ICAgbkV4dGVuZGVkUXVlcmllczogJWRcbiIsCisJCQkgICAgc3luaHcubkV4dGVuZGVkUXVlcmll
 cyk7CiAJCQlwcmludGYoIiAgIGNhcFBhc3N0aHJvdWdoOiAlZFxuIiwgc3luaHcuY2FwUGFzc3Ro
 cm91Z2gpOwogCQkJcHJpbnRmKCIgICBjYXBTbGVlcDogJWRcbiIsIHN5bmh3LmNhcFNsZWVwKTsK
 IAkJCXByaW50ZigiICAgY2FwRm91ckJ1dHRvbnM6ICVkXG4iLCBzeW5ody5jYXBGb3VyQnV0dG9u
 cyk7CkBAIC00NDA3LDE2ICs0NDQyLDI3IEBACiAJCX0KIAogCQkvKgotCQkgKiBJZiB3ZSBoYXZl
 IGJpdHMgc2V0IGluIHN0YXR1c1swXSAmIDB4NzAsIHRoZW4gd2UgY2FuIGxvYWQKKwkJICogSWYg
 bkV4dGVuZGVkUXVlcmllcyBpcyAxIG9yIGdyZWF0ZXIsIHRoZW4gdGhlIFRvdWNoUGFkCisJCSAq
 IHN1cHBvcnRzIHRoaXMgbnVtYmVyIG9mIGV4dGVuZGVkIHF1ZXJpZXMuIFdlIGNhbiBsb2FkCiAJ
 CSAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYnV0dG9ucyB1c2luZyBxdWVyeSAweDA5LgogCQkg
 Ki8KLQkJaWYgKChzdGF0dXNbMF0gJiAweDcwKSAhPSAwKSB7CisJCWlmIChzeW5ody5jYXBFeHRl
 bmRlZCAmJiBzeW5ody5uRXh0ZW5kZWRRdWVyaWVzKSB7CiAJCQlpZiAobW91c2VfZXh0X2NvbW1h
 bmQoa2JkYywgMHgwOSkgPT0gMCkKIAkJCQlyZXR1cm4gKEZBTFNFKTsKIAkJCWlmIChnZXRfbW91
 c2Vfc3RhdHVzKGtiZGMsIHN0YXR1cywgMCwgMykgIT0gMykKIAkJCQlyZXR1cm4gKEZBTFNFKTsK
 LQkJCWJ1dHRvbnMgPSAoc3RhdHVzWzFdICYgMHhmMCkgPj4gNDsKKwkJCXN5bmh3Lm5FeHRlbmRl
 ZEJ1dHRvbnMgPSAoc3RhdHVzWzFdICYgMHhmMCkgPj4gNDsKKwkJCS8qCisJCQkgKiBBZGQgdGhl
 IG51bWJlciBvZiBleHRlbmRlZCBidXR0b25zIHRvIHRoZSB0b3RhbAorCQkJICogYnV0dG9uIHN1
 cHBvcnQgY291bnQsIGluY2x1ZGluZyB0aGUgbWlkZGxlIGJ1dHRvbgorCQkJICogaWYgY2FwTWlk
 ZGxlIHN1cHBvcnQgYml0IGlzIHNldC4KKwkJCSAqLworCQkJYnV0dG9ucyA9IHN5bmh3Lm5FeHRl
 bmRlZEJ1dHRvbnMgKyBzeW5ody5jYXBNaWRkbGU7CiAJCX0gZWxzZQorCQkJLyoKKwkJCSAqIElm
 IHRoZSBjYXBGb3VyQnV0dG9ucyBzdXBwb3J0IGJpdCBpcyBzZXQsCisJCQkgKiBhZGQgYSBmb3Vy
 dGggYnV0dG9uIHRvIHRoZSB0b3RhbCBidXR0b24gY291bnQuCisJCQkgKi8KIAkJCWJ1dHRvbnMg
 PSBzeW5ody5jYXBGb3VyQnV0dG9ucyA/IDEgOiAwOwogCX0KIAlpZiAodmVyYm9zZSA+PSAyKSB7
 CkBAIC00NDI3LDYgKzQ0NzMsMTIgQEAKIAl9CiAKIAkvKgorCSAqIEFkZCB0aGUgZGVmYXVsdCBu
 dW1iZXIgb2YgMyBidXR0b25zIHRvIHRoZSB0b3RhbAorCSAqIGNvdW50IG9mIHN1cHBvcnRlZCBi
 dXR0b25zIHJlcG9ydGVkIGFib3ZlLgorCSAqLworCWJ1dHRvbnMgKz0gMzsKKworCS8qCiAJICog
 UmVhZCB0aGUgbW9kZSBieXRlLgogCSAqCiAJICogWFhYOiBOb3RlIHRoZSBTeW5hcHRpY3MgZG9j
 dW1lbnRhdGlvbiBhbHNvIGRlZmluZXMgdGhlIGZpcnN0CkBAIC00NDUzLDcgKzQ1MDUsNiBAQAog
 CS8qICJDb21taXQiIHRoZSBTZXQgTW9kZSBCeXRlIGNvbW1hbmQgc2VudCBhYm92ZS4gKi8KIAlz
 ZXRfbW91c2Vfc2FtcGxpbmdfcmF0ZShrYmRjLCAyMCk7CiAKLQlidXR0b25zICs9IDM7CiAJVkxP
 RygzLCAoTE9HX0RFQlVHLCAic3luYXB0aWNzOiBFTkQgaW5pdCAoJWQgYnV0dG9ucylcbiIsIGJ1
 dHRvbnMpKTsKIAogCWlmIChzYyAhPSBOVUxMKSB7Cg==
 --bcaec517a4a00984f104c7a990f6--
State-Changed-From-To: open->closed 
State-Changed-By: dumbbell 
State-Changed-When: Thu Oct 10 09:10:30 UTC 2013 
State-Changed-Why:  
Fixed in HEAD (r255153, r255154 and r255646) using the patch from 
kern/170834 

http://www.freebsd.org/cgi/query-pr.cgi?pr=84411 
>Unformatted:
