Merge 3.9-rc5 into tty-next
We need the fixes here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -268,7 +268,7 @@ config USB_NET_SMSC75XX
|
||||
select CRC16
|
||||
select CRC32
|
||||
help
|
||||
This option adds support for SMSC LAN95XX based USB 2.0
|
||||
This option adds support for SMSC LAN75XX based USB 2.0
|
||||
Gigabit Ethernet adapters.
|
||||
|
||||
config USB_NET_SMSC95XX
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
@@ -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:
|
||||
@@ -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);
|
||||
|
||||
@@ -139,16 +139,9 @@ static int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
|
||||
BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) < sizeof(struct qmi_wwan_state)));
|
||||
|
||||
/* control and data is shared? */
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints == 3) {
|
||||
info->control = intf;
|
||||
info->data = intf;
|
||||
goto shared;
|
||||
}
|
||||
|
||||
/* else require a single interrupt status endpoint on control intf */
|
||||
if (intf->cur_altsetting->desc.bNumEndpoints != 1)
|
||||
goto err;
|
||||
/* set up initial state */
|
||||
info->control = intf;
|
||||
info->data = intf;
|
||||
|
||||
/* and a number of CDC descriptors */
|
||||
while (len > 3) {
|
||||
@@ -207,25 +200,14 @@ next_desc:
|
||||
buf += h->bLength;
|
||||
}
|
||||
|
||||
/* did we find all the required ones? */
|
||||
if (!(found & (1 << USB_CDC_HEADER_TYPE)) ||
|
||||
!(found & (1 << USB_CDC_UNION_TYPE))) {
|
||||
dev_err(&intf->dev, "CDC functional descriptors missing\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* verify CDC Union */
|
||||
if (desc->bInterfaceNumber != cdc_union->bMasterInterface0) {
|
||||
dev_err(&intf->dev, "bogus CDC Union: master=%u\n", cdc_union->bMasterInterface0);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* need to save these for unbind */
|
||||
info->control = intf;
|
||||
info->data = usb_ifnum_to_if(dev->udev, cdc_union->bSlaveInterface0);
|
||||
if (!info->data) {
|
||||
dev_err(&intf->dev, "bogus CDC Union: slave=%u\n", cdc_union->bSlaveInterface0);
|
||||
goto err;
|
||||
/* Use separate control and data interfaces if we found a CDC Union */
|
||||
if (cdc_union) {
|
||||
info->data = usb_ifnum_to_if(dev->udev, cdc_union->bSlaveInterface0);
|
||||
if (desc->bInterfaceNumber != cdc_union->bMasterInterface0 || !info->data) {
|
||||
dev_err(&intf->dev, "bogus CDC Union: master=%u, slave=%u\n",
|
||||
cdc_union->bMasterInterface0, cdc_union->bSlaveInterface0);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
/* errors aren't fatal - we can live with the dynamic address */
|
||||
@@ -235,11 +217,12 @@ next_desc:
|
||||
}
|
||||
|
||||
/* claim data interface and set it up */
|
||||
status = usb_driver_claim_interface(driver, info->data, dev);
|
||||
if (status < 0)
|
||||
goto err;
|
||||
if (info->control != info->data) {
|
||||
status = usb_driver_claim_interface(driver, info->data, dev);
|
||||
if (status < 0)
|
||||
goto err;
|
||||
}
|
||||
|
||||
shared:
|
||||
status = qmi_wwan_register_subdriver(dev);
|
||||
if (status < 0 && info->control != info->data) {
|
||||
usb_set_intfdata(info->data, NULL);
|
||||
|
||||
Reference in New Issue
Block a user