|
@@ -138,20 +138,7 @@ struct cdc_ncm_ctx {
|
|
|
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);
|
|
|
-static const struct driver_info cdc_ncm_info;
|
|
|
static struct usb_driver cdc_ncm_driver;
|
|
|
-static const struct ethtool_ops cdc_ncm_ethtool_ops;
|
|
|
-
|
|
|
-static const struct usb_device_id cdc_devs[] = {
|
|
|
- { USB_INTERFACE_INFO(USB_CLASS_COMM,
|
|
|
- USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
|
|
|
- .driver_info = (unsigned long)&cdc_ncm_info,
|
|
|
- },
|
|
|
- {
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-MODULE_DEVICE_TABLE(usb, cdc_devs);
|
|
|
|
|
|
static void
|
|
|
cdc_ncm_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)
|
|
@@ -454,6 +441,16 @@ static void cdc_ncm_free(struct cdc_ncm_ctx *ctx)
|
|
|
kfree(ctx);
|
|
|
}
|
|
|
|
|
|
+static const struct ethtool_ops cdc_ncm_ethtool_ops = {
|
|
|
+ .get_drvinfo = cdc_ncm_get_drvinfo,
|
|
|
+ .get_link = usbnet_get_link,
|
|
|
+ .get_msglevel = usbnet_get_msglevel,
|
|
|
+ .set_msglevel = usbnet_set_msglevel,
|
|
|
+ .get_settings = usbnet_get_settings,
|
|
|
+ .set_settings = usbnet_set_settings,
|
|
|
+ .nway_reset = usbnet_nway_reset,
|
|
|
+};
|
|
|
+
|
|
|
static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf)
|
|
|
{
|
|
|
struct cdc_ncm_ctx *ctx;
|
|
@@ -1203,6 +1200,41 @@ static const struct driver_info cdc_ncm_info = {
|
|
|
.tx_fixup = cdc_ncm_tx_fixup,
|
|
|
};
|
|
|
|
|
|
+/* Same as cdc_ncm_info, but with FLAG_WWAN */
|
|
|
+static const struct driver_info wwan_info = {
|
|
|
+ .description = "Mobile Broadband Network Device",
|
|
|
+ .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
|
|
|
+ | FLAG_WWAN,
|
|
|
+ .bind = cdc_ncm_bind,
|
|
|
+ .unbind = cdc_ncm_unbind,
|
|
|
+ .check_connect = cdc_ncm_check_connect,
|
|
|
+ .manage_power = cdc_ncm_manage_power,
|
|
|
+ .status = cdc_ncm_status,
|
|
|
+ .rx_fixup = cdc_ncm_rx_fixup,
|
|
|
+ .tx_fixup = cdc_ncm_tx_fixup,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct usb_device_id cdc_devs[] = {
|
|
|
+ /* Ericsson MBM devices like F5521gw */
|
|
|
+ { .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
|
|
|
+ | USB_DEVICE_ID_MATCH_VENDOR,
|
|
|
+ .idVendor = 0x0bdb,
|
|
|
+ .bInterfaceClass = USB_CLASS_COMM,
|
|
|
+ .bInterfaceSubClass = USB_CDC_SUBCLASS_NCM,
|
|
|
+ .bInterfaceProtocol = USB_CDC_PROTO_NONE,
|
|
|
+ .driver_info = (unsigned long) &wwan_info,
|
|
|
+ },
|
|
|
+
|
|
|
+ /* Generic CDC-NCM devices */
|
|
|
+ { USB_INTERFACE_INFO(USB_CLASS_COMM,
|
|
|
+ USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
|
|
|
+ .driver_info = (unsigned long)&cdc_ncm_info,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ },
|
|
|
+};
|
|
|
+MODULE_DEVICE_TABLE(usb, cdc_devs);
|
|
|
+
|
|
|
static struct usb_driver cdc_ncm_driver = {
|
|
|
.name = "cdc_ncm",
|
|
|
.id_table = cdc_devs,
|
|
@@ -1215,16 +1247,6 @@ static struct usb_driver cdc_ncm_driver = {
|
|
|
.disable_hub_initiated_lpm = 1,
|
|
|
};
|
|
|
|
|
|
-static const struct ethtool_ops cdc_ncm_ethtool_ops = {
|
|
|
- .get_drvinfo = cdc_ncm_get_drvinfo,
|
|
|
- .get_link = usbnet_get_link,
|
|
|
- .get_msglevel = usbnet_get_msglevel,
|
|
|
- .set_msglevel = usbnet_set_msglevel,
|
|
|
- .get_settings = usbnet_get_settings,
|
|
|
- .set_settings = usbnet_set_settings,
|
|
|
- .nway_reset = usbnet_nway_reset,
|
|
|
-};
|
|
|
-
|
|
|
module_usb_driver(cdc_ncm_driver);
|
|
|
|
|
|
MODULE_AUTHOR("Hans Petter Selasky");
|