Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 361458
b: refs/heads/master
c: 1e8bbe6
h: refs/heads/master
v: v3
  • Loading branch information
Bjørn Mork authored and David S. Miller committed Mar 17, 2013
1 parent edd9927 commit 183663b
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a5b8db91442fce9c9713fcd656c3698f1adde1d6
refs/heads/master: 1e8bbe6cd02fc300c88bd48244ce61ad9c7d1776
11 changes: 1 addition & 10 deletions trunk/drivers/net/usb/cdc_mbim.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,18 +68,9 @@ static int cdc_mbim_bind(struct usbnet *dev, struct usb_interface *intf)
struct cdc_ncm_ctx *ctx;
struct usb_driver *subdriver = ERR_PTR(-ENODEV);
int ret = -ENODEV;
u8 data_altsetting = CDC_NCM_DATA_ALTSETTING_NCM;
u8 data_altsetting = cdc_ncm_select_altsetting(dev, intf);
struct cdc_mbim_state *info = (void *)&dev->data;

/* see if interface supports MBIM alternate setting */
if (intf->num_altsetting == 2) {
if (!cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting))
usb_set_interface(dev->udev,
intf->cur_altsetting->desc.bInterfaceNumber,
CDC_NCM_COMM_ALTSETTING_MBIM);
data_altsetting = CDC_NCM_DATA_ALTSETTING_MBIM;
}

/* Probably NCM, defer for cdc_ncm_bind */
if (!cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting))
goto err;
Expand Down
49 changes: 32 additions & 17 deletions trunk/drivers/net/usb/cdc_ncm.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@

#define DRIVER_VERSION "14-Mar-2012"

#if IS_ENABLED(CONFIG_USB_NET_CDC_MBIM)
static bool prefer_mbim = true;
#else
static bool prefer_mbim;
#endif
module_param(prefer_mbim, bool, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(prefer_mbim, "Prefer MBIM setting on dual NCM/MBIM functions");

static void cdc_ncm_txpath_bh(unsigned long param);
static void cdc_ncm_tx_timeout_start(struct cdc_ncm_ctx *ctx);
static enum hrtimer_restart cdc_ncm_tx_timer_cb(struct hrtimer *hr_timer);
Expand Down Expand Up @@ -550,9 +558,12 @@ void cdc_ncm_unbind(struct usbnet *dev, struct usb_interface *intf)
}
EXPORT_SYMBOL_GPL(cdc_ncm_unbind);

static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
/* Select the MBIM altsetting iff it is preferred and available,
* returning the number of the corresponding data interface altsetting
*/
u8 cdc_ncm_select_altsetting(struct usbnet *dev, struct usb_interface *intf)
{
int ret;
struct usb_host_interface *alt;

/* The MBIM spec defines a NCM compatible default altsetting,
* which we may have matched:
Expand All @@ -568,23 +579,27 @@ static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
* endpoint descriptors, shall be constructed according to
* the rules given in section 6 (USB Device Model) of this
* specification."
*
* Do not bind to such interfaces, allowing cdc_mbim to handle
* them
*/
#if IS_ENABLED(CONFIG_USB_NET_CDC_MBIM)
if ((intf->num_altsetting == 2) &&
!usb_set_interface(dev->udev,
intf->cur_altsetting->desc.bInterfaceNumber,
CDC_NCM_COMM_ALTSETTING_MBIM)) {
if (cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting))
return -ENODEV;
else
usb_set_interface(dev->udev,
intf->cur_altsetting->desc.bInterfaceNumber,
CDC_NCM_COMM_ALTSETTING_NCM);
if (prefer_mbim && intf->num_altsetting == 2) {
alt = usb_altnum_to_altsetting(intf, CDC_NCM_COMM_ALTSETTING_MBIM);
if (alt && cdc_ncm_comm_intf_is_mbim(alt) &&
!usb_set_interface(dev->udev,
intf->cur_altsetting->desc.bInterfaceNumber,
CDC_NCM_COMM_ALTSETTING_MBIM))
return CDC_NCM_DATA_ALTSETTING_MBIM;
}
#endif
return CDC_NCM_DATA_ALTSETTING_NCM;
}
EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting);

static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
{
int ret;

/* MBIM backwards compatible function? */
cdc_ncm_select_altsetting(dev, intf);
if (cdc_ncm_comm_intf_is_mbim(intf->cur_altsetting))
return -ENODEV;

/* NCM data altsetting is always 1 */
ret = cdc_ncm_bind_common(dev, intf, 1);
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/usb/cdc_ncm.h
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ struct cdc_ncm_ctx {
u16 connected;
};

extern 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);
extern 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);
Expand Down

0 comments on commit 183663b

Please sign in to comment.