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;