Module Name:    src
Committed By:   maya
Date:           Thu Aug  8 06:16:40 UTC 2019

Modified Files:
        src/sys/dev/ic: rndisreg.h
        src/sys/dev/usb: if_urndis.c

Log Message:
Teach urndis to handle some REMOTE_NDIS_INDICATE_STATUS_MSG. If the status
is reasonable, don't tell userland we got an error. Stops spurious EIO.
>From openbsd.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/rndisreg.h
cvs rdiff -u -r1.23 -r1.24 src/sys/dev/usb/if_urndis.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/rndisreg.h
diff -u src/sys/dev/ic/rndisreg.h:1.2 src/sys/dev/ic/rndisreg.h:1.3
--- src/sys/dev/ic/rndisreg.h:1.2	Fri Feb 15 08:54:02 2019
+++ src/sys/dev/ic/rndisreg.h	Thu Aug  8 06:16:39 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: rndisreg.h,v 1.2 2019/02/15 08:54:02 nonaka Exp $ */
+/*	$NetBSD: rndisreg.h,v 1.3 2019/08/08 06:16:39 maya Exp $ */
 /*	NetBSD: if_urndisreg.h,v 1.4 2018/11/09 21:57:09 maya Exp */
 /*	$OpenBSD: if_urndisreg.h,v 1.14 2010/07/08 18:22:01 ckuethe Exp $ */
 
@@ -267,6 +267,15 @@ struct rndis_reset_comp {
 /* 802.3 link-state or undefined message error. */
 #define REMOTE_NDIS_INDICATE_STATUS_MSG	0x00000007
 
+struct rndis_status_msg {
+	uint32_t	rm_type;
+	uint32_t	rm_len;
+	uint32_t	rm_status;
+	uint32_t	rm_stbuflen;
+	uint32_t	rm_stbufoffset;
+	/* rndis_diag_info */
+};
+
 /* Keepalive messsage.  May be sent by device. */
 #define REMOTE_NDIS_KEEPALIVE_MSG	0x00000008
 #define REMOTE_NDIS_KEEPALIVE_CMPLT	0x80000008

Index: src/sys/dev/usb/if_urndis.c
diff -u src/sys/dev/usb/if_urndis.c:1.23 src/sys/dev/usb/if_urndis.c:1.24
--- src/sys/dev/usb/if_urndis.c:1.23	Wed Aug  7 22:26:28 2019
+++ src/sys/dev/usb/if_urndis.c	Thu Aug  8 06:16:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_urndis.c,v 1.23 2019/08/07 22:26:28 macallan Exp $ */
+/*	$NetBSD: if_urndis.c,v 1.24 2019/08/08 06:16:40 maya Exp $ */
 /*	$OpenBSD: if_urndis.c,v 1.31 2011/07/03 15:47:17 matthew Exp $ */
 
 /*
@@ -21,7 +21,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.23 2019/08/07 22:26:28 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.24 2019/08/08 06:16:40 maya Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -143,6 +143,8 @@ static uint32_t urndis_ctrl_handle_query
     const struct rndis_comp_hdr *, void **, size_t *);
 static uint32_t urndis_ctrl_handle_reset(struct urndis_softc *,
     const struct rndis_comp_hdr *);
+static uint32_t urndis_ctrl_handle_status(struct urndis_softc *,
+    const struct rndis_comp_hdr *);
 
 static uint32_t urndis_ctrl_init(struct urndis_softc *);
 #if 0
@@ -278,6 +280,10 @@ urndis_ctrl_handle(struct urndis_softc *
 			rval = le32toh(hdr->rm_status);
 			break;
 
+		case REMOTE_NDIS_INDICATE_STATUS_MSG:
+			rval = urndis_ctrl_handle_status(sc, hdr);
+			break;
+
 		default:
 			printf("%s: ctrl message error: unknown event 0x%x\n",
 			    DEVNAME(sc), le32toh(hdr->rm_type));
@@ -451,6 +457,38 @@ urndis_ctrl_handle_reset(struct urndis_s
 }
 
 static uint32_t
+urndis_ctrl_handle_status(struct urndis_softc *sc,
+    const struct rndis_comp_hdr *hdr)
+{
+	const struct rndis_status_msg	*msg;
+	uint32_t			rval;
+
+	msg = (const struct rndis_status_msg *)hdr;
+
+	rval = le32toh(msg->rm_status);
+
+	DPRINTF(("%s: urndis_ctrl_handle_status: len %u status 0x%x "
+	    "stbuflen %u\n",
+	    DEVNAME(sc),
+	    le32toh(msg->rm_len),
+	    rval,
+	    le32toh(msg->rm_stbuflen)));
+
+	switch (rval) {
+		case RNDIS_STATUS_MEDIA_CONNECT:
+		case RNDIS_STATUS_MEDIA_DISCONNECT:
+		case RNDIS_STATUS_OFFLOAD_CURRENT_CONFIG:
+			rval = RNDIS_STATUS_SUCCESS;
+			break;
+
+		default:
+		        printf("%s: status 0x%x\n", DEVNAME(sc), rval);
+	}
+
+	return rval;
+}
+
+static uint32_t
 urndis_ctrl_init(struct urndis_softc *sc)
 {
 	struct rndis_init_req	*msg;

Reply via email to