[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <e3e25aa6-9f9a-0643-a644-e8efdf12a562@det.uvigo.gal>
Date: Mon, 2 Jul 2018 13:19:20 +0200
From: Miguel Rodríguez Pérez <miguel@....uvigo.gal>
To: Oliver Neukum <oneukum@...e.com>, gregkh@...uxfoundation.org,
linux-usb@...r.kernel.org, netdev@...r.kernel.org
Subject: Re: [PATCH v3 1/4] Simplify usbnet_cdc_update_filter
I get a panic if I remove this patch, because intf comes NULL for
cdc_ncm devices. I'll send an updated patch that solves this issue while
still using usb_control_msg.
On 02/07/18 10:25, Oliver Neukum wrote:
> On So, 2018-07-01 at 11:05 +0200, Miguel Rodríguez Pérez wrote:
>> Remove some unneded varibles to make the code easier to read
>> and, replace the generic usb_control_msg function for the
>> more specific usbnet_write_cmd.
>>
>> Signed-off-by: Miguel Rodríguez Pérez <miguel@....uvigo.gal>
>
> No,
>
> sorry, but this is not good. The reason is a bit subtle.
> Drivers need to reset the filters when handling post_reset()
> [ and reset_resume() ] usbnet_write_cmd() falls back to
> kmemdup() with GFP_KERNEL. Usbnet is a framework with class
> drivers and some of the devices we drive have a storage
> interface. Thence we are on the block error handling path here.
>
> The simplest solution is to leave out this patch in the sequence.
>
> Regards
> Oliver
>
>
> NACKED-BY: Oliver Neukum <oneukum@...e.com>
>
>
>> ---
>> drivers/net/usb/cdc_ether.c | 15 +++++----------
>> 1 file changed, 5 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
>> index 178b956501a7..815ed0dc18fe 100644
>> --- a/drivers/net/usb/cdc_ether.c
>> +++ b/drivers/net/usb/cdc_ether.c
>> @@ -77,9 +77,7 @@ static const u8 mbm_guid[16] = {
>>
>> static void usbnet_cdc_update_filter(struct usbnet *dev)
>> {
>> - struct cdc_state *info = (void *) &dev->data;
>> - struct usb_interface *intf = info->control;
>> - struct net_device *net = dev->net;
>> + struct net_device *net = dev->net;
>>
>> u16 cdc_filter = USB_CDC_PACKET_TYPE_DIRECTED
>> | USB_CDC_PACKET_TYPE_BROADCAST;
>> @@ -93,16 +91,13 @@ static void usbnet_cdc_update_filter(struct usbnet *dev)
>> if (!netdev_mc_empty(net) || (net->flags & IFF_ALLMULTI))
>> cdc_filter |= USB_CDC_PACKET_TYPE_ALL_MULTICAST;
>>
>> - usb_control_msg(dev->udev,
>> - usb_sndctrlpipe(dev->udev, 0),
>> + usbnet_write_cmd(dev,
>> USB_CDC_SET_ETHERNET_PACKET_FILTER,
>> - USB_TYPE_CLASS | USB_RECIP_INTERFACE,
>> + USB_TYPE_CLASS | USB_DIR_OUT | USB_RECIP_INTERFACE,
>> cdc_filter,
>> - intf->cur_altsetting->desc.bInterfaceNumber,
>> + dev->intf->cur_altsetting->desc.bInterfaceNumber,
>> NULL,
>> - 0,
>> - USB_CTRL_SET_TIMEOUT
>> - );
>> + 0);
>> }
>>
>> /* probes control interface, claims data interface, collects the bulk
>
--
Miguel Rodríguez Pérez
Laboratorio de Redes
EE Telecomunicación – Universidade de Vigo
Powered by blists - more mailing lists