Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Bring in the 'net' tree so that we can get some ipv4/ipv6 bug fixes that some net-next work will build upon. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -374,6 +374,21 @@ static const struct driver_info cdc_mbim_info = {
|
||||
.tx_fixup = cdc_mbim_tx_fixup,
|
||||
};
|
||||
|
||||
/* MBIM and NCM devices should not need a ZLP after NTBs with
|
||||
* dwNtbOutMaxSize length. This driver_info is for the exceptional
|
||||
* devices requiring it anyway, allowing them to be supported without
|
||||
* forcing the performance penalty on all the sane devices.
|
||||
*/
|
||||
static const struct driver_info cdc_mbim_info_zlp = {
|
||||
.description = "CDC MBIM",
|
||||
.flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN | FLAG_SEND_ZLP,
|
||||
.bind = cdc_mbim_bind,
|
||||
.unbind = cdc_mbim_unbind,
|
||||
.manage_power = cdc_mbim_manage_power,
|
||||
.rx_fixup = cdc_mbim_rx_fixup,
|
||||
.tx_fixup = cdc_mbim_tx_fixup,
|
||||
};
|
||||
|
||||
static const struct usb_device_id mbim_devs[] = {
|
||||
/* This duplicate NCM entry is intentional. MBIM devices can
|
||||
* be disguised as NCM by default, and this is necessary to
|
||||
@@ -385,6 +400,10 @@ static const struct usb_device_id mbim_devs[] = {
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info,
|
||||
},
|
||||
/* Sierra Wireless MC7710 need ZLPs */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x68a2, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info_zlp,
|
||||
},
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&cdc_mbim_info,
|
||||
},
|
||||
|
@@ -435,6 +435,13 @@ advance:
|
||||
len -= temp;
|
||||
}
|
||||
|
||||
/* some buggy devices have an IAD but no CDC Union */
|
||||
if (!ctx->union_desc && intf->intf_assoc && intf->intf_assoc->bInterfaceCount == 2) {
|
||||
ctx->control = intf;
|
||||
ctx->data = usb_ifnum_to_if(dev->udev, intf->cur_altsetting->desc.bInterfaceNumber + 1);
|
||||
dev_dbg(&intf->dev, "CDC Union missing - got slave from IAD\n");
|
||||
}
|
||||
|
||||
/* check if we got everything */
|
||||
if ((ctx->control == NULL) || (ctx->data == NULL) ||
|
||||
((!ctx->mbim_desc) && ((ctx->ether_desc == NULL) || (ctx->control != intf))))
|
||||
@@ -497,7 +504,8 @@ advance:
|
||||
error2:
|
||||
usb_set_intfdata(ctx->control, NULL);
|
||||
usb_set_intfdata(ctx->data, NULL);
|
||||
usb_driver_release_interface(driver, ctx->data);
|
||||
if (ctx->data != ctx->control)
|
||||
usb_driver_release_interface(driver, ctx->data);
|
||||
error:
|
||||
cdc_ncm_free((struct cdc_ncm_ctx *)dev->data[0]);
|
||||
dev->data[0] = 0;
|
||||
@@ -1155,6 +1163,20 @@ static const struct driver_info wwan_info = {
|
||||
.tx_fixup = cdc_ncm_tx_fixup,
|
||||
};
|
||||
|
||||
/* Same as wwan_info, but with FLAG_NOARP */
|
||||
static const struct driver_info wwan_noarp_info = {
|
||||
.description = "Mobile Broadband Network Device (NO ARP)",
|
||||
.flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET
|
||||
| FLAG_WWAN | FLAG_NOARP,
|
||||
.bind = cdc_ncm_bind,
|
||||
.unbind = cdc_ncm_unbind,
|
||||
.check_connect = cdc_ncm_check_connect,
|
||||
.manage_power = usbnet_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
|
||||
@@ -1194,6 +1216,13 @@ static const struct usb_device_id cdc_devs[] = {
|
||||
.driver_info = (unsigned long)&wwan_info,
|
||||
},
|
||||
|
||||
/* Infineon(now Intel) HSPA Modem platform */
|
||||
{ USB_DEVICE_AND_INTERFACE_INFO(0x1519, 0x0443,
|
||||
USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
|
||||
.driver_info = (unsigned long)&wwan_noarp_info,
|
||||
},
|
||||
|
||||
/* Generic CDC-NCM devices */
|
||||
{ USB_INTERFACE_INFO(USB_CLASS_COMM,
|
||||
USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
|
||||
|
@@ -45,6 +45,12 @@
|
||||
#define DM_MCAST_ADDR 0x16 /* 8 bytes */
|
||||
#define DM_GPR_CTRL 0x1e
|
||||
#define DM_GPR_DATA 0x1f
|
||||
#define DM_CHIP_ID 0x2c
|
||||
#define DM_MODE_CTRL 0x91 /* only on dm9620 */
|
||||
|
||||
/* chip id values */
|
||||
#define ID_DM9601 0
|
||||
#define ID_DM9620 1
|
||||
|
||||
#define DM_MAX_MCAST 64
|
||||
#define DM_MCAST_SIZE 8
|
||||
@@ -53,7 +59,6 @@
|
||||
#define DM_RX_OVERHEAD 7 /* 3 byte header + 4 byte crc tail */
|
||||
#define DM_TIMEOUT 1000
|
||||
|
||||
|
||||
static int dm_read(struct usbnet *dev, u8 reg, u16 length, void *data)
|
||||
{
|
||||
int err;
|
||||
@@ -84,32 +89,23 @@ static int dm_write(struct usbnet *dev, u8 reg, u16 length, void *data)
|
||||
|
||||
static int dm_write_reg(struct usbnet *dev, u8 reg, u8 value)
|
||||
{
|
||||
return usbnet_write_cmd(dev, DM_WRITE_REGS,
|
||||
return usbnet_write_cmd(dev, DM_WRITE_REG,
|
||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
value, reg, NULL, 0);
|
||||
}
|
||||
|
||||
static void dm_write_async_helper(struct usbnet *dev, u8 reg, u8 value,
|
||||
u16 length, void *data)
|
||||
static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)
|
||||
{
|
||||
usbnet_write_cmd_async(dev, DM_WRITE_REGS,
|
||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
value, reg, data, length);
|
||||
}
|
||||
|
||||
static void dm_write_async(struct usbnet *dev, u8 reg, u16 length, void *data)
|
||||
{
|
||||
netdev_dbg(dev->net, "dm_write_async() reg=0x%02x length=%d\n", reg, length);
|
||||
|
||||
dm_write_async_helper(dev, reg, 0, length, data);
|
||||
0, reg, data, length);
|
||||
}
|
||||
|
||||
static void dm_write_reg_async(struct usbnet *dev, u8 reg, u8 value)
|
||||
{
|
||||
netdev_dbg(dev->net, "dm_write_reg_async() reg=0x%02x value=0x%02x\n",
|
||||
reg, value);
|
||||
|
||||
dm_write_async_helper(dev, reg, value, 0, NULL);
|
||||
usbnet_write_cmd_async(dev, DM_WRITE_REG,
|
||||
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
||||
value, reg, NULL, 0);
|
||||
}
|
||||
|
||||
static int dm_read_shared_word(struct usbnet *dev, int phy, u8 reg, __le16 *value)
|
||||
@@ -358,7 +354,7 @@ static const struct net_device_ops dm9601_netdev_ops = {
|
||||
static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
{
|
||||
int ret;
|
||||
u8 mac[ETH_ALEN];
|
||||
u8 mac[ETH_ALEN], id;
|
||||
|
||||
ret = usbnet_get_endpoints(dev, intf);
|
||||
if (ret)
|
||||
@@ -399,6 +395,24 @@ static int dm9601_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
__dm9601_set_mac_address(dev);
|
||||
}
|
||||
|
||||
if (dm_read_reg(dev, DM_CHIP_ID, &id) < 0) {
|
||||
netdev_err(dev->net, "Error reading chip ID\n");
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* put dm9620 devices in dm9601 mode */
|
||||
if (id == ID_DM9620) {
|
||||
u8 mode;
|
||||
|
||||
if (dm_read_reg(dev, DM_MODE_CTRL, &mode) < 0) {
|
||||
netdev_err(dev->net, "Error reading MODE_CTRL\n");
|
||||
ret = -ENODEV;
|
||||
goto out;
|
||||
}
|
||||
dm_write_reg(dev, DM_MODE_CTRL, mode & 0x7f);
|
||||
}
|
||||
|
||||
/* power up phy */
|
||||
dm_write_reg(dev, DM_GPR_CTRL, 1);
|
||||
dm_write_reg(dev, DM_GPR_DATA, 0);
|
||||
@@ -581,6 +595,10 @@ static const struct usb_device_id products[] = {
|
||||
USB_DEVICE(0x0a46, 0x9000), /* DM9000E */
|
||||
.driver_info = (unsigned long)&dm9601_info,
|
||||
},
|
||||
{
|
||||
USB_DEVICE(0x0a46, 0x9620), /* DM9620 USB to Fast Ethernet Adapter */
|
||||
.driver_info = (unsigned long)&dm9601_info,
|
||||
},
|
||||
{}, // END
|
||||
};
|
||||
|
||||
|
@@ -433,6 +433,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0199, 1)}, /* ZTE MF820S */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0200, 1)},
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0257, 3)}, /* ZTE MF821 */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0265, 4)}, /* ONDA MT8205 4G LTE */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0284, 4)}, /* ZTE MF880 */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x0326, 4)}, /* ZTE MF821D */
|
||||
{QMI_FIXED_INTF(0x19d2, 0x1008, 4)}, /* ZTE (Vodafone) K3570-Z */
|
||||
@@ -459,6 +460,7 @@ static const struct usb_device_id products[] = {
|
||||
{QMI_FIXED_INTF(0x1199, 0x68a2, 19)}, /* Sierra Wireless MC7710 in QMI mode */
|
||||
{QMI_FIXED_INTF(0x1199, 0x901c, 8)}, /* Sierra Wireless EM7700 */
|
||||
{QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */
|
||||
{QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
|
||||
|
||||
/* 4. Gobi 1000 devices */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
|
@@ -1448,6 +1448,10 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
|
||||
if ((dev->driver_info->flags & FLAG_WWAN) != 0)
|
||||
strcpy(net->name, "wwan%d");
|
||||
|
||||
/* devices that cannot do ARP */
|
||||
if ((dev->driver_info->flags & FLAG_NOARP) != 0)
|
||||
net->flags |= IFF_NOARP;
|
||||
|
||||
/* maybe the remote can't receive an Ethernet MTU */
|
||||
if (net->mtu > (dev->hard_mtu - net->hard_header_len))
|
||||
net->mtu = dev->hard_mtu - net->hard_header_len;
|
||||
|
Reference in New Issue
Block a user