diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c index 097f37df118e..ff9ffd20e3ba 100644 --- a/drivers/usb/gadget/function/f_rndis.c +++ b/drivers/usb/gadget/function/f_rndis.c @@ -512,6 +512,20 @@ rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) } break; + case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8) + | USB_CDC_SET_ETHERNET_PACKET_FILTER: + /* + * see 6.2.30: no data, wIndex = interface, wValue = packet + * filter bitmap. However, we don't really set cdc_filter to + * wValue for rndis, because cdc_filter is not RNDIS-specific. + * Return value 0 to avoid usb controllers stall ep0. + */ + if (w_length != 0 || w_index != rndis->ctrl_id) + goto invalid; + DBG(cdev, "packet filter %02x\n", w_value); + value = 0; + break; + default: invalid: VDBG(cdev, "invalid control req%02x.%02x v%04x i%04x l%d\n",