Commit f99f4f8b authored by David S. Miller's avatar David S. Miller

Merge branch 'cdc_ncm'

Bjørn Mork says:

====================
cdc_ncm: many small and mostly trivial fixes

This series ended up longer than expected, and it is still not
complete. There is more to come when time allows...

Most changes are trivial. Notable non-trivial changes are
 - removed filtering of identical speed notifications
 - tx_max calulation is changed to count the pad byte if
   necessary, and respect the device limit as an absolute
   upper limit even if it is too low according to the spec
 - remove the bug preventing SET_MAX_DATAGRAM_SIZE from having
   any effect
 - drop the pad-to-max if ZLPs are enabled
 - the driver specific VERSION is dropped
 - dev->hard_mtu is set to tx_max instead of max_datagram_size
   causing usbnet to calculate the qlen based on the real max
   size of tx skbs

This series has been tested, along with the previously posted
cdc_mbim series, on the NCM and MBIM devices I have:
 - Ericsson F5521gw (NCM)
 - Huawei E367 (MBIM)
 - D-Link DWM-156 A7 (MBIM w/ too low dwNtb{In,Out}MaxSize bug)
 - Sierra Wireless MC7710 (MBIM w/ ZLP and CDC Union bugs)

Apart from the D-Link modem dropping a lot less oversized
frames with the fix dedicated to it, there are no end user
noticable functional changes as a result of this series.  But
all the non-trivial changes I listed above are of course
detectable by users looking at that specific area (except maybe
the removed speed notification, which requires a device sending
duplicates to be noticable - I don't have any such device).
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents c1a2e954 a6fe6708
...@@ -175,7 +175,7 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skb ...@@ -175,7 +175,7 @@ static struct sk_buff *cdc_mbim_tx_fixup(struct usbnet *dev, struct sk_buff *skb
} }
spin_lock_bh(&ctx->mtx); spin_lock_bh(&ctx->mtx);
skb_out = cdc_ncm_fill_tx_frame(ctx, skb, sign); skb_out = cdc_ncm_fill_tx_frame(dev, skb, sign);
spin_unlock_bh(&ctx->mtx); spin_unlock_bh(&ctx->mtx);
return skb_out; return skb_out;
......
This diff is collapsed.
...@@ -36,6 +36,9 @@ ...@@ -36,6 +36,9 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#ifndef __LINUX_USB_CDC_NCM_H
#define __LINUX_USB_CDC_NCM_H
#define CDC_NCM_COMM_ALTSETTING_NCM 0 #define CDC_NCM_COMM_ALTSETTING_NCM 0
#define CDC_NCM_COMM_ALTSETTING_MBIM 1 #define CDC_NCM_COMM_ALTSETTING_MBIM 1
...@@ -85,22 +88,13 @@ ...@@ -85,22 +88,13 @@
#define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB) #define cdc_ncm_data_intf_is_mbim(x) ((x)->desc.bInterfaceProtocol == USB_CDC_MBIM_PROTO_NTB)
struct cdc_ncm_ctx { struct cdc_ncm_ctx {
struct usb_cdc_ncm_ntb_parameters ncm_parm;
struct hrtimer tx_timer; struct hrtimer tx_timer;
struct tasklet_struct bh; struct tasklet_struct bh;
const struct usb_cdc_ncm_desc *func_desc; const struct usb_cdc_ncm_desc *func_desc;
const struct usb_cdc_mbim_desc *mbim_desc; const struct usb_cdc_mbim_desc *mbim_desc;
const struct usb_cdc_header_desc *header_desc;
const struct usb_cdc_union_desc *union_desc;
const struct usb_cdc_ether_desc *ether_desc; const struct usb_cdc_ether_desc *ether_desc;
struct net_device *netdev;
struct usb_device *udev;
struct usb_host_endpoint *in_ep;
struct usb_host_endpoint *out_ep;
struct usb_host_endpoint *status_ep;
struct usb_interface *intf;
struct usb_interface *control; struct usb_interface *control;
struct usb_interface *data; struct usb_interface *data;
...@@ -113,8 +107,6 @@ struct cdc_ncm_ctx { ...@@ -113,8 +107,6 @@ struct cdc_ncm_ctx {
u32 tx_timer_pending; u32 tx_timer_pending;
u32 tx_curr_frame_num; u32 tx_curr_frame_num;
u32 rx_speed;
u32 tx_speed;
u32 rx_max; u32 rx_max;
u32 tx_max; u32 tx_max;
u32 max_datagram_size; u32 max_datagram_size;
...@@ -127,9 +119,11 @@ struct cdc_ncm_ctx { ...@@ -127,9 +119,11 @@ struct cdc_ncm_ctx {
u16 connected; u16 connected;
}; };
extern u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf); u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf);
extern int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting); int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_altsetting);
extern void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf); void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf);
extern struct sk_buff *cdc_ncm_fill_tx_frame(struct cdc_ncm_ctx *ctx, struct sk_buff *skb, __le32 sign); struct sk_buff *cdc_ncm_fill_tx_frame(struct usbnet *dev, struct sk_buff *skb, __le32 sign);
extern int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in); int cdc_ncm_rx_verify_nth16(struct cdc_ncm_ctx *ctx, struct sk_buff *skb_in);
extern int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset); int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset);
#endif /* __LINUX_USB_CDC_NCM_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment