Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -4247,7 +4247,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.name = "Marvell 88E6190",
|
||||
.num_databases = 4096,
|
||||
.num_ports = 11, /* 10 + Z80 */
|
||||
.num_internal_phys = 11,
|
||||
.num_internal_phys = 9,
|
||||
.num_gpio = 16,
|
||||
.max_vid = 8191,
|
||||
.port_base_addr = 0x0,
|
||||
@@ -4270,7 +4270,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.name = "Marvell 88E6190X",
|
||||
.num_databases = 4096,
|
||||
.num_ports = 11, /* 10 + Z80 */
|
||||
.num_internal_phys = 11,
|
||||
.num_internal_phys = 9,
|
||||
.num_gpio = 16,
|
||||
.max_vid = 8191,
|
||||
.port_base_addr = 0x0,
|
||||
@@ -4293,7 +4293,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.name = "Marvell 88E6191",
|
||||
.num_databases = 4096,
|
||||
.num_ports = 11, /* 10 + Z80 */
|
||||
.num_internal_phys = 11,
|
||||
.num_internal_phys = 9,
|
||||
.max_vid = 8191,
|
||||
.port_base_addr = 0x0,
|
||||
.phy_base_addr = 0x0,
|
||||
@@ -4340,7 +4340,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.name = "Marvell 88E6290",
|
||||
.num_databases = 4096,
|
||||
.num_ports = 11, /* 10 + Z80 */
|
||||
.num_internal_phys = 11,
|
||||
.num_internal_phys = 9,
|
||||
.num_gpio = 16,
|
||||
.max_vid = 8191,
|
||||
.port_base_addr = 0x0,
|
||||
@@ -4502,7 +4502,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.name = "Marvell 88E6390",
|
||||
.num_databases = 4096,
|
||||
.num_ports = 11, /* 10 + Z80 */
|
||||
.num_internal_phys = 11,
|
||||
.num_internal_phys = 9,
|
||||
.num_gpio = 16,
|
||||
.max_vid = 8191,
|
||||
.port_base_addr = 0x0,
|
||||
@@ -4525,7 +4525,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
|
||||
.name = "Marvell 88E6390X",
|
||||
.num_databases = 4096,
|
||||
.num_ports = 11, /* 10 + Z80 */
|
||||
.num_internal_phys = 11,
|
||||
.num_internal_phys = 9,
|
||||
.num_gpio = 16,
|
||||
.max_vid = 8191,
|
||||
.port_base_addr = 0x0,
|
||||
|
@@ -190,7 +190,7 @@ int mv88e6xxx_port_set_duplex(struct mv88e6xxx_chip *chip, int port, int dup)
|
||||
/* normal duplex detection */
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_MAC_CTL, reg);
|
||||
|
@@ -267,6 +267,7 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
|
||||
struct phy *serdes;
|
||||
void __iomem *regs;
|
||||
char res_name[8];
|
||||
int phy_mode;
|
||||
u32 port;
|
||||
|
||||
if (of_property_read_u32(portnp, "reg", &port))
|
||||
@@ -292,11 +293,11 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = of_get_phy_mode(portnp);
|
||||
if (err < 0)
|
||||
phy_mode = of_get_phy_mode(portnp);
|
||||
if (phy_mode < 0)
|
||||
ocelot->ports[port]->phy_mode = PHY_INTERFACE_MODE_NA;
|
||||
else
|
||||
ocelot->ports[port]->phy_mode = err;
|
||||
ocelot->ports[port]->phy_mode = phy_mode;
|
||||
|
||||
switch (ocelot->ports[port]->phy_mode) {
|
||||
case PHY_INTERFACE_MODE_NA:
|
||||
@@ -304,6 +305,13 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
/* Ensure clock signals and speed is set on all
|
||||
* QSGMII links
|
||||
*/
|
||||
ocelot_port_writel(ocelot->ports[port],
|
||||
DEV_CLOCK_CFG_LINK_SPEED
|
||||
(OCELOT_SPEED_1000),
|
||||
DEV_CLOCK_CFG);
|
||||
break;
|
||||
default:
|
||||
dev_err(ocelot->dev,
|
||||
|
@@ -976,6 +976,13 @@ static const struct usb_device_id products[] = {
|
||||
0xff),
|
||||
.driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr,
|
||||
},
|
||||
{ /* Quectel EG12/EM12 */
|
||||
USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x0512,
|
||||
USB_CLASS_VENDOR_SPEC,
|
||||
USB_SUBCLASS_VENDOR_SPEC,
|
||||
0xff),
|
||||
.driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr,
|
||||
},
|
||||
|
||||
/* 3. Combined interface devices matching on interface number */
|
||||
{QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
|
||||
@@ -1343,17 +1350,20 @@ static bool quectel_ec20_detected(struct usb_interface *intf)
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool quectel_ep06_diag_detected(struct usb_interface *intf)
|
||||
static bool quectel_diag_detected(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
struct usb_interface_descriptor intf_desc = intf->cur_altsetting->desc;
|
||||
u16 id_vendor = le16_to_cpu(dev->descriptor.idVendor);
|
||||
u16 id_product = le16_to_cpu(dev->descriptor.idProduct);
|
||||
|
||||
if (le16_to_cpu(dev->descriptor.idVendor) == 0x2c7c &&
|
||||
le16_to_cpu(dev->descriptor.idProduct) == 0x0306 &&
|
||||
intf_desc.bNumEndpoints == 2)
|
||||
if (id_vendor != 0x2c7c || intf_desc.bNumEndpoints != 2)
|
||||
return false;
|
||||
|
||||
if (id_product == 0x0306 || id_product == 0x0512)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
static int qmi_wwan_probe(struct usb_interface *intf,
|
||||
@@ -1390,13 +1400,13 @@ static int qmi_wwan_probe(struct usb_interface *intf,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Quectel EP06/EM06/EG06 supports dynamic interface configuration, so
|
||||
/* Several Quectel modems supports dynamic interface configuration, so
|
||||
* we need to match on class/subclass/protocol. These values are
|
||||
* identical for the diagnostic- and QMI-interface, but bNumEndpoints is
|
||||
* different. Ignore the current interface if the number of endpoints
|
||||
* the number for the diag interface (two).
|
||||
*/
|
||||
if (quectel_ep06_diag_detected(intf))
|
||||
if (quectel_diag_detected(intf))
|
||||
return -ENODEV;
|
||||
|
||||
return usbnet_probe(intf, id);
|
||||
|
Reference in New Issue
Block a user