* [v3,1/4] Simplify usbnet_cdc_update_filter
@ 2018-07-01 9:05 Miguel Rodríguez Pérez
0 siblings, 0 replies; 4+ messages in thread
From: Miguel Rodríguez Pérez @ 2018-07-01 9:05 UTC (permalink / raw)
To: oliver, linux-usb, netdev, gregkh; +Cc: Miguel Rodríguez Pérez
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@det.uvigo.gal>
---
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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [v3,1/4] Simplify usbnet_cdc_update_filter
@ 2018-07-02 8:25 Oliver Neukum
0 siblings, 0 replies; 4+ messages in thread
From: Oliver Neukum @ 2018-07-02 8:25 UTC (permalink / raw)
To: Miguel Rodríguez Pérez, gregkh, linux-usb, netdev
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@det.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@suse.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
---
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 4+ messages in thread
* [v3,1/4] Simplify usbnet_cdc_update_filter
@ 2018-07-02 11:19 Miguel Rodríguez Pérez
0 siblings, 0 replies; 4+ messages in thread
From: Miguel Rodríguez Pérez @ 2018-07-02 11:19 UTC (permalink / raw)
To: Oliver Neukum, gregkh, linux-usb, netdev
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@det.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@suse.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
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [v3,1/4] Simplify usbnet_cdc_update_filter
@ 2018-07-02 17:13 Bjørn Mork
0 siblings, 0 replies; 4+ messages in thread
From: Bjørn Mork @ 2018-07-02 17:13 UTC (permalink / raw)
To: Oliver Neukum; +Cc: Miguel Rodríguez Pérez, gregkh, linux-usb, netdev
Oliver Neukum <oneukum@suse.com> writes:
> 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@det.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.
Right. I knew there had to be some reason this was left out when the
rest of these were converted. But I don't think the reason is
valid... usbnet_write_cmd() will never call kmemdup when data is NULL.
There is of course also little advantage in using usbnet_write_cmd when
we don't need to allocate a buffer. But I'd still prefer to see it for
consistency, power management and debug logging.
Or if it is left as-is: Maybe add a comment so that I don't ask the same
stupid questions in 3 weeks time? :-) My memory is los^Husy...
> The simplest solution is to leave out this patch in the sequence.
As Miguel noted: That won't work. The switch from dev->data->control to
dev->intf is necessary to make this function reusable by other
minidrivers.
Bjørn
---
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-07-02 17:13 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-02 8:25 [v3,1/4] Simplify usbnet_cdc_update_filter Oliver Neukum
-- strict thread matches above, loose matches on Subject: below --
2018-07-02 17:13 Bjørn Mork
2018-07-02 11:19 Miguel Rodríguez Pérez
2018-07-01 9:05 Miguel Rodríguez Pérez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).