diff options
Diffstat (limited to 'drivers/net')
41 files changed, 207 insertions, 99 deletions
diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c index 1ed9529e7bd1..5eb0df2e5464 100644 --- a/drivers/net/bonding/bond_alb.c +++ b/drivers/net/bonding/bond_alb.c | |||
| @@ -450,7 +450,7 @@ static void rlb_update_client(struct rlb_client_info *client_info) | |||
| 450 | { | 450 | { |
| 451 | int i; | 451 | int i; |
| 452 | 452 | ||
| 453 | if (!client_info->slave) | 453 | if (!client_info->slave || !is_valid_ether_addr(client_info->mac_dst)) |
| 454 | return; | 454 | return; |
| 455 | 455 | ||
| 456 | for (i = 0; i < RLB_ARP_BURST_SIZE; i++) { | 456 | for (i = 0; i < RLB_ARP_BURST_SIZE; i++) { |
| @@ -943,6 +943,10 @@ static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], | |||
| 943 | skb->priority = TC_PRIO_CONTROL; | 943 | skb->priority = TC_PRIO_CONTROL; |
| 944 | skb->dev = slave->dev; | 944 | skb->dev = slave->dev; |
| 945 | 945 | ||
| 946 | netdev_dbg(slave->bond->dev, | ||
| 947 | "Send learning packet: dev %s mac %pM vlan %d\n", | ||
| 948 | slave->dev->name, mac_addr, vid); | ||
| 949 | |||
| 946 | if (vid) | 950 | if (vid) |
| 947 | __vlan_hwaccel_put_tag(skb, vlan_proto, vid); | 951 | __vlan_hwaccel_put_tag(skb, vlan_proto, vid); |
| 948 | 952 | ||
| @@ -965,14 +969,13 @@ static int alb_upper_dev_walk(struct net_device *upper, void *_data) | |||
| 965 | u8 *mac_addr = data->mac_addr; | 969 | u8 *mac_addr = data->mac_addr; |
| 966 | struct bond_vlan_tag *tags; | 970 | struct bond_vlan_tag *tags; |
| 967 | 971 | ||
| 968 | if (is_vlan_dev(upper) && vlan_get_encap_level(upper) == 0) { | 972 | if (is_vlan_dev(upper) && |
| 969 | if (strict_match && | 973 | bond->nest_level == vlan_get_encap_level(upper) - 1) { |
| 970 | ether_addr_equal_64bits(mac_addr, | 974 | if (upper->addr_assign_type == NET_ADDR_STOLEN) { |
| 971 | upper->dev_addr)) { | ||
| 972 | alb_send_lp_vid(slave, mac_addr, | 975 | alb_send_lp_vid(slave, mac_addr, |
| 973 | vlan_dev_vlan_proto(upper), | 976 | vlan_dev_vlan_proto(upper), |
| 974 | vlan_dev_vlan_id(upper)); | 977 | vlan_dev_vlan_id(upper)); |
| 975 | } else if (!strict_match) { | 978 | } else { |
| 976 | alb_send_lp_vid(slave, upper->dev_addr, | 979 | alb_send_lp_vid(slave, upper->dev_addr, |
| 977 | vlan_dev_vlan_proto(upper), | 980 | vlan_dev_vlan_proto(upper), |
| 978 | vlan_dev_vlan_id(upper)); | 981 | vlan_dev_vlan_id(upper)); |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 718e4914e3a0..1f1e97b26f95 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
| @@ -1738,6 +1738,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev, | |||
| 1738 | if (bond_mode_uses_xmit_hash(bond)) | 1738 | if (bond_mode_uses_xmit_hash(bond)) |
| 1739 | bond_update_slave_arr(bond, NULL); | 1739 | bond_update_slave_arr(bond, NULL); |
| 1740 | 1740 | ||
| 1741 | bond->nest_level = dev_get_nest_level(bond_dev); | ||
| 1742 | |||
| 1741 | netdev_info(bond_dev, "Enslaving %s as %s interface with %s link\n", | 1743 | netdev_info(bond_dev, "Enslaving %s as %s interface with %s link\n", |
| 1742 | slave_dev->name, | 1744 | slave_dev->name, |
| 1743 | bond_is_active_slave(new_slave) ? "an active" : "a backup", | 1745 | bond_is_active_slave(new_slave) ? "an active" : "a backup", |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index b1779566c5bb..3c71f1cb205f 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
| @@ -605,7 +605,7 @@ void can_bus_off(struct net_device *dev) | |||
| 605 | { | 605 | { |
| 606 | struct can_priv *priv = netdev_priv(dev); | 606 | struct can_priv *priv = netdev_priv(dev); |
| 607 | 607 | ||
| 608 | netdev_dbg(dev, "bus-off\n"); | 608 | netdev_info(dev, "bus-off\n"); |
| 609 | 609 | ||
| 610 | netif_carrier_off(dev); | 610 | netif_carrier_off(dev); |
| 611 | 611 | ||
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 634c51e6b8ae..d53a45bf2a72 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c | |||
| @@ -200,6 +200,7 @@ | |||
| 200 | #define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disable Memory error detection */ | 200 | #define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disable Memory error detection */ |
| 201 | #define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */ | 201 | #define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */ |
| 202 | #define FLEXCAN_QUIRK_BROKEN_PERR_STATE BIT(6) /* No interrupt for error passive */ | 202 | #define FLEXCAN_QUIRK_BROKEN_PERR_STATE BIT(6) /* No interrupt for error passive */ |
| 203 | #define FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN BIT(7) /* default to BE register access */ | ||
| 203 | 204 | ||
| 204 | /* Structure of the message buffer */ | 205 | /* Structure of the message buffer */ |
| 205 | struct flexcan_mb { | 206 | struct flexcan_mb { |
| @@ -288,6 +289,12 @@ struct flexcan_priv { | |||
| 288 | 289 | ||
| 289 | static const struct flexcan_devtype_data fsl_p1010_devtype_data = { | 290 | static const struct flexcan_devtype_data fsl_p1010_devtype_data = { |
| 290 | .quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE | | 291 | .quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE | |
| 292 | FLEXCAN_QUIRK_BROKEN_PERR_STATE | | ||
| 293 | FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN, | ||
| 294 | }; | ||
| 295 | |||
| 296 | static const struct flexcan_devtype_data fsl_imx25_devtype_data = { | ||
| 297 | .quirks = FLEXCAN_QUIRK_BROKEN_WERR_STATE | | ||
| 291 | FLEXCAN_QUIRK_BROKEN_PERR_STATE, | 298 | FLEXCAN_QUIRK_BROKEN_PERR_STATE, |
| 292 | }; | 299 | }; |
| 293 | 300 | ||
| @@ -1251,9 +1258,9 @@ static void unregister_flexcandev(struct net_device *dev) | |||
| 1251 | static const struct of_device_id flexcan_of_match[] = { | 1258 | static const struct of_device_id flexcan_of_match[] = { |
| 1252 | { .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, }, | 1259 | { .compatible = "fsl,imx6q-flexcan", .data = &fsl_imx6q_devtype_data, }, |
| 1253 | { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, | 1260 | { .compatible = "fsl,imx28-flexcan", .data = &fsl_imx28_devtype_data, }, |
| 1254 | { .compatible = "fsl,imx53-flexcan", .data = &fsl_p1010_devtype_data, }, | 1261 | { .compatible = "fsl,imx53-flexcan", .data = &fsl_imx25_devtype_data, }, |
| 1255 | { .compatible = "fsl,imx35-flexcan", .data = &fsl_p1010_devtype_data, }, | 1262 | { .compatible = "fsl,imx35-flexcan", .data = &fsl_imx25_devtype_data, }, |
| 1256 | { .compatible = "fsl,imx25-flexcan", .data = &fsl_p1010_devtype_data, }, | 1263 | { .compatible = "fsl,imx25-flexcan", .data = &fsl_imx25_devtype_data, }, |
| 1257 | { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, | 1264 | { .compatible = "fsl,p1010-flexcan", .data = &fsl_p1010_devtype_data, }, |
| 1258 | { .compatible = "fsl,vf610-flexcan", .data = &fsl_vf610_devtype_data, }, | 1265 | { .compatible = "fsl,vf610-flexcan", .data = &fsl_vf610_devtype_data, }, |
| 1259 | { .compatible = "fsl,ls1021ar2-flexcan", .data = &fsl_ls1021a_r2_devtype_data, }, | 1266 | { .compatible = "fsl,ls1021ar2-flexcan", .data = &fsl_ls1021a_r2_devtype_data, }, |
| @@ -1337,18 +1344,13 @@ static int flexcan_probe(struct platform_device *pdev) | |||
| 1337 | 1344 | ||
| 1338 | priv = netdev_priv(dev); | 1345 | priv = netdev_priv(dev); |
| 1339 | 1346 | ||
| 1340 | if (of_property_read_bool(pdev->dev.of_node, "big-endian")) { | 1347 | if (of_property_read_bool(pdev->dev.of_node, "big-endian") || |
| 1348 | devtype_data->quirks & FLEXCAN_QUIRK_DEFAULT_BIG_ENDIAN) { | ||
| 1341 | priv->read = flexcan_read_be; | 1349 | priv->read = flexcan_read_be; |
| 1342 | priv->write = flexcan_write_be; | 1350 | priv->write = flexcan_write_be; |
| 1343 | } else { | 1351 | } else { |
| 1344 | if (of_device_is_compatible(pdev->dev.of_node, | 1352 | priv->read = flexcan_read_le; |
| 1345 | "fsl,p1010-flexcan")) { | 1353 | priv->write = flexcan_write_le; |
| 1346 | priv->read = flexcan_read_be; | ||
| 1347 | priv->write = flexcan_write_be; | ||
| 1348 | } else { | ||
| 1349 | priv->read = flexcan_read_le; | ||
| 1350 | priv->write = flexcan_write_le; | ||
| 1351 | } | ||
| 1352 | } | 1354 | } |
| 1353 | 1355 | ||
| 1354 | priv->can.clock.freq = clock_freq; | 1356 | priv->can.clock.freq = clock_freq; |
diff --git a/drivers/net/can/spi/hi311x.c b/drivers/net/can/spi/hi311x.c index 5590c559a8ca..53e320c92a8b 100644 --- a/drivers/net/can/spi/hi311x.c +++ b/drivers/net/can/spi/hi311x.c | |||
| @@ -91,6 +91,7 @@ | |||
| 91 | #define HI3110_STAT_BUSOFF BIT(2) | 91 | #define HI3110_STAT_BUSOFF BIT(2) |
| 92 | #define HI3110_STAT_ERRP BIT(3) | 92 | #define HI3110_STAT_ERRP BIT(3) |
| 93 | #define HI3110_STAT_ERRW BIT(4) | 93 | #define HI3110_STAT_ERRW BIT(4) |
| 94 | #define HI3110_STAT_TXMTY BIT(7) | ||
| 94 | 95 | ||
| 95 | #define HI3110_BTR0_SJW_SHIFT 6 | 96 | #define HI3110_BTR0_SJW_SHIFT 6 |
| 96 | #define HI3110_BTR0_BRP_SHIFT 0 | 97 | #define HI3110_BTR0_BRP_SHIFT 0 |
| @@ -427,8 +428,10 @@ static int hi3110_get_berr_counter(const struct net_device *net, | |||
| 427 | struct hi3110_priv *priv = netdev_priv(net); | 428 | struct hi3110_priv *priv = netdev_priv(net); |
| 428 | struct spi_device *spi = priv->spi; | 429 | struct spi_device *spi = priv->spi; |
| 429 | 430 | ||
| 431 | mutex_lock(&priv->hi3110_lock); | ||
| 430 | bec->txerr = hi3110_read(spi, HI3110_READ_TEC); | 432 | bec->txerr = hi3110_read(spi, HI3110_READ_TEC); |
| 431 | bec->rxerr = hi3110_read(spi, HI3110_READ_REC); | 433 | bec->rxerr = hi3110_read(spi, HI3110_READ_REC); |
| 434 | mutex_unlock(&priv->hi3110_lock); | ||
| 432 | 435 | ||
| 433 | return 0; | 436 | return 0; |
| 434 | } | 437 | } |
| @@ -735,10 +738,7 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) | |||
| 735 | } | 738 | } |
| 736 | } | 739 | } |
| 737 | 740 | ||
| 738 | if (intf == 0) | 741 | if (priv->tx_len && statf & HI3110_STAT_TXMTY) { |
| 739 | break; | ||
| 740 | |||
| 741 | if (intf & HI3110_INT_TXCPLT) { | ||
| 742 | net->stats.tx_packets++; | 742 | net->stats.tx_packets++; |
| 743 | net->stats.tx_bytes += priv->tx_len - 1; | 743 | net->stats.tx_bytes += priv->tx_len - 1; |
| 744 | can_led_event(net, CAN_LED_EVENT_TX); | 744 | can_led_event(net, CAN_LED_EVENT_TX); |
| @@ -748,6 +748,9 @@ static irqreturn_t hi3110_can_ist(int irq, void *dev_id) | |||
| 748 | } | 748 | } |
| 749 | netif_wake_queue(net); | 749 | netif_wake_queue(net); |
| 750 | } | 750 | } |
| 751 | |||
| 752 | if (intf == 0) | ||
| 753 | break; | ||
| 751 | } | 754 | } |
| 752 | mutex_unlock(&priv->hi3110_lock); | 755 | mutex_unlock(&priv->hi3110_lock); |
| 753 | return IRQ_HANDLED; | 756 | return IRQ_HANDLED; |
diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c index 63587b8e6825..daed57d3d209 100644 --- a/drivers/net/can/usb/kvaser_usb.c +++ b/drivers/net/can/usb/kvaser_usb.c | |||
| @@ -1179,7 +1179,7 @@ static void kvaser_usb_rx_can_msg(const struct kvaser_usb *dev, | |||
| 1179 | 1179 | ||
| 1180 | skb = alloc_can_skb(priv->netdev, &cf); | 1180 | skb = alloc_can_skb(priv->netdev, &cf); |
| 1181 | if (!skb) { | 1181 | if (!skb) { |
| 1182 | stats->tx_dropped++; | 1182 | stats->rx_dropped++; |
| 1183 | return; | 1183 | return; |
| 1184 | } | 1184 | } |
| 1185 | 1185 | ||
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c index 3d2091099f7f..5b4374f21d76 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c | |||
| @@ -3370,6 +3370,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3370 | .num_internal_phys = 5, | 3370 | .num_internal_phys = 5, |
| 3371 | .max_vid = 4095, | 3371 | .max_vid = 4095, |
| 3372 | .port_base_addr = 0x10, | 3372 | .port_base_addr = 0x10, |
| 3373 | .phy_base_addr = 0x0, | ||
| 3373 | .global1_addr = 0x1b, | 3374 | .global1_addr = 0x1b, |
| 3374 | .global2_addr = 0x1c, | 3375 | .global2_addr = 0x1c, |
| 3375 | .age_time_coeff = 15000, | 3376 | .age_time_coeff = 15000, |
| @@ -3391,6 +3392,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3391 | .num_internal_phys = 0, | 3392 | .num_internal_phys = 0, |
| 3392 | .max_vid = 4095, | 3393 | .max_vid = 4095, |
| 3393 | .port_base_addr = 0x10, | 3394 | .port_base_addr = 0x10, |
| 3395 | .phy_base_addr = 0x0, | ||
| 3394 | .global1_addr = 0x1b, | 3396 | .global1_addr = 0x1b, |
| 3395 | .global2_addr = 0x1c, | 3397 | .global2_addr = 0x1c, |
| 3396 | .age_time_coeff = 15000, | 3398 | .age_time_coeff = 15000, |
| @@ -3410,6 +3412,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3410 | .num_internal_phys = 8, | 3412 | .num_internal_phys = 8, |
| 3411 | .max_vid = 4095, | 3413 | .max_vid = 4095, |
| 3412 | .port_base_addr = 0x10, | 3414 | .port_base_addr = 0x10, |
| 3415 | .phy_base_addr = 0x0, | ||
| 3413 | .global1_addr = 0x1b, | 3416 | .global1_addr = 0x1b, |
| 3414 | .global2_addr = 0x1c, | 3417 | .global2_addr = 0x1c, |
| 3415 | .age_time_coeff = 15000, | 3418 | .age_time_coeff = 15000, |
| @@ -3431,6 +3434,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3431 | .num_internal_phys = 5, | 3434 | .num_internal_phys = 5, |
| 3432 | .max_vid = 4095, | 3435 | .max_vid = 4095, |
| 3433 | .port_base_addr = 0x10, | 3436 | .port_base_addr = 0x10, |
| 3437 | .phy_base_addr = 0x0, | ||
| 3434 | .global1_addr = 0x1b, | 3438 | .global1_addr = 0x1b, |
| 3435 | .global2_addr = 0x1c, | 3439 | .global2_addr = 0x1c, |
| 3436 | .age_time_coeff = 15000, | 3440 | .age_time_coeff = 15000, |
| @@ -3452,6 +3456,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3452 | .num_internal_phys = 0, | 3456 | .num_internal_phys = 0, |
| 3453 | .max_vid = 4095, | 3457 | .max_vid = 4095, |
| 3454 | .port_base_addr = 0x10, | 3458 | .port_base_addr = 0x10, |
| 3459 | .phy_base_addr = 0x0, | ||
| 3455 | .global1_addr = 0x1b, | 3460 | .global1_addr = 0x1b, |
| 3456 | .global2_addr = 0x1c, | 3461 | .global2_addr = 0x1c, |
| 3457 | .age_time_coeff = 15000, | 3462 | .age_time_coeff = 15000, |
| @@ -3472,6 +3477,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3472 | .num_gpio = 11, | 3477 | .num_gpio = 11, |
| 3473 | .max_vid = 4095, | 3478 | .max_vid = 4095, |
| 3474 | .port_base_addr = 0x10, | 3479 | .port_base_addr = 0x10, |
| 3480 | .phy_base_addr = 0x10, | ||
| 3475 | .global1_addr = 0x1b, | 3481 | .global1_addr = 0x1b, |
| 3476 | .global2_addr = 0x1c, | 3482 | .global2_addr = 0x1c, |
| 3477 | .age_time_coeff = 3750, | 3483 | .age_time_coeff = 3750, |
| @@ -3493,6 +3499,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3493 | .num_internal_phys = 5, | 3499 | .num_internal_phys = 5, |
| 3494 | .max_vid = 4095, | 3500 | .max_vid = 4095, |
| 3495 | .port_base_addr = 0x10, | 3501 | .port_base_addr = 0x10, |
| 3502 | .phy_base_addr = 0x0, | ||
| 3496 | .global1_addr = 0x1b, | 3503 | .global1_addr = 0x1b, |
| 3497 | .global2_addr = 0x1c, | 3504 | .global2_addr = 0x1c, |
| 3498 | .age_time_coeff = 15000, | 3505 | .age_time_coeff = 15000, |
| @@ -3514,6 +3521,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3514 | .num_internal_phys = 0, | 3521 | .num_internal_phys = 0, |
| 3515 | .max_vid = 4095, | 3522 | .max_vid = 4095, |
| 3516 | .port_base_addr = 0x10, | 3523 | .port_base_addr = 0x10, |
| 3524 | .phy_base_addr = 0x0, | ||
| 3517 | .global1_addr = 0x1b, | 3525 | .global1_addr = 0x1b, |
| 3518 | .global2_addr = 0x1c, | 3526 | .global2_addr = 0x1c, |
| 3519 | .age_time_coeff = 15000, | 3527 | .age_time_coeff = 15000, |
| @@ -3535,6 +3543,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3535 | .num_internal_phys = 5, | 3543 | .num_internal_phys = 5, |
| 3536 | .max_vid = 4095, | 3544 | .max_vid = 4095, |
| 3537 | .port_base_addr = 0x10, | 3545 | .port_base_addr = 0x10, |
| 3546 | .phy_base_addr = 0x0, | ||
| 3538 | .global1_addr = 0x1b, | 3547 | .global1_addr = 0x1b, |
| 3539 | .global2_addr = 0x1c, | 3548 | .global2_addr = 0x1c, |
| 3540 | .age_time_coeff = 15000, | 3549 | .age_time_coeff = 15000, |
| @@ -3557,6 +3566,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3557 | .num_gpio = 15, | 3566 | .num_gpio = 15, |
| 3558 | .max_vid = 4095, | 3567 | .max_vid = 4095, |
| 3559 | .port_base_addr = 0x10, | 3568 | .port_base_addr = 0x10, |
| 3569 | .phy_base_addr = 0x0, | ||
| 3560 | .global1_addr = 0x1b, | 3570 | .global1_addr = 0x1b, |
| 3561 | .global2_addr = 0x1c, | 3571 | .global2_addr = 0x1c, |
| 3562 | .age_time_coeff = 15000, | 3572 | .age_time_coeff = 15000, |
| @@ -3578,6 +3588,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3578 | .num_internal_phys = 5, | 3588 | .num_internal_phys = 5, |
| 3579 | .max_vid = 4095, | 3589 | .max_vid = 4095, |
| 3580 | .port_base_addr = 0x10, | 3590 | .port_base_addr = 0x10, |
| 3591 | .phy_base_addr = 0x0, | ||
| 3581 | .global1_addr = 0x1b, | 3592 | .global1_addr = 0x1b, |
| 3582 | .global2_addr = 0x1c, | 3593 | .global2_addr = 0x1c, |
| 3583 | .age_time_coeff = 15000, | 3594 | .age_time_coeff = 15000, |
| @@ -3600,6 +3611,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3600 | .num_gpio = 15, | 3611 | .num_gpio = 15, |
| 3601 | .max_vid = 4095, | 3612 | .max_vid = 4095, |
| 3602 | .port_base_addr = 0x10, | 3613 | .port_base_addr = 0x10, |
| 3614 | .phy_base_addr = 0x0, | ||
| 3603 | .global1_addr = 0x1b, | 3615 | .global1_addr = 0x1b, |
| 3604 | .global2_addr = 0x1c, | 3616 | .global2_addr = 0x1c, |
| 3605 | .age_time_coeff = 15000, | 3617 | .age_time_coeff = 15000, |
| @@ -3621,6 +3633,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3621 | .num_internal_phys = 0, | 3633 | .num_internal_phys = 0, |
| 3622 | .max_vid = 4095, | 3634 | .max_vid = 4095, |
| 3623 | .port_base_addr = 0x10, | 3635 | .port_base_addr = 0x10, |
| 3636 | .phy_base_addr = 0x0, | ||
| 3624 | .global1_addr = 0x1b, | 3637 | .global1_addr = 0x1b, |
| 3625 | .global2_addr = 0x1c, | 3638 | .global2_addr = 0x1c, |
| 3626 | .age_time_coeff = 15000, | 3639 | .age_time_coeff = 15000, |
| @@ -3641,6 +3654,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3641 | .num_gpio = 16, | 3654 | .num_gpio = 16, |
| 3642 | .max_vid = 8191, | 3655 | .max_vid = 8191, |
| 3643 | .port_base_addr = 0x0, | 3656 | .port_base_addr = 0x0, |
| 3657 | .phy_base_addr = 0x0, | ||
| 3644 | .global1_addr = 0x1b, | 3658 | .global1_addr = 0x1b, |
| 3645 | .global2_addr = 0x1c, | 3659 | .global2_addr = 0x1c, |
| 3646 | .tag_protocol = DSA_TAG_PROTO_DSA, | 3660 | .tag_protocol = DSA_TAG_PROTO_DSA, |
| @@ -3663,6 +3677,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3663 | .num_gpio = 16, | 3677 | .num_gpio = 16, |
| 3664 | .max_vid = 8191, | 3678 | .max_vid = 8191, |
| 3665 | .port_base_addr = 0x0, | 3679 | .port_base_addr = 0x0, |
| 3680 | .phy_base_addr = 0x0, | ||
| 3666 | .global1_addr = 0x1b, | 3681 | .global1_addr = 0x1b, |
| 3667 | .global2_addr = 0x1c, | 3682 | .global2_addr = 0x1c, |
| 3668 | .age_time_coeff = 3750, | 3683 | .age_time_coeff = 3750, |
| @@ -3684,6 +3699,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3684 | .num_internal_phys = 11, | 3699 | .num_internal_phys = 11, |
| 3685 | .max_vid = 8191, | 3700 | .max_vid = 8191, |
| 3686 | .port_base_addr = 0x0, | 3701 | .port_base_addr = 0x0, |
| 3702 | .phy_base_addr = 0x0, | ||
| 3687 | .global1_addr = 0x1b, | 3703 | .global1_addr = 0x1b, |
| 3688 | .global2_addr = 0x1c, | 3704 | .global2_addr = 0x1c, |
| 3689 | .age_time_coeff = 3750, | 3705 | .age_time_coeff = 3750, |
| @@ -3707,6 +3723,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3707 | .num_gpio = 15, | 3723 | .num_gpio = 15, |
| 3708 | .max_vid = 4095, | 3724 | .max_vid = 4095, |
| 3709 | .port_base_addr = 0x10, | 3725 | .port_base_addr = 0x10, |
| 3726 | .phy_base_addr = 0x0, | ||
| 3710 | .global1_addr = 0x1b, | 3727 | .global1_addr = 0x1b, |
| 3711 | .global2_addr = 0x1c, | 3728 | .global2_addr = 0x1c, |
| 3712 | .age_time_coeff = 15000, | 3729 | .age_time_coeff = 15000, |
| @@ -3730,6 +3747,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3730 | .num_gpio = 16, | 3747 | .num_gpio = 16, |
| 3731 | .max_vid = 8191, | 3748 | .max_vid = 8191, |
| 3732 | .port_base_addr = 0x0, | 3749 | .port_base_addr = 0x0, |
| 3750 | .phy_base_addr = 0x0, | ||
| 3733 | .global1_addr = 0x1b, | 3751 | .global1_addr = 0x1b, |
| 3734 | .global2_addr = 0x1c, | 3752 | .global2_addr = 0x1c, |
| 3735 | .age_time_coeff = 3750, | 3753 | .age_time_coeff = 3750, |
| @@ -3753,6 +3771,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3753 | .num_gpio = 15, | 3771 | .num_gpio = 15, |
| 3754 | .max_vid = 4095, | 3772 | .max_vid = 4095, |
| 3755 | .port_base_addr = 0x10, | 3773 | .port_base_addr = 0x10, |
| 3774 | .phy_base_addr = 0x0, | ||
| 3756 | .global1_addr = 0x1b, | 3775 | .global1_addr = 0x1b, |
| 3757 | .global2_addr = 0x1c, | 3776 | .global2_addr = 0x1c, |
| 3758 | .age_time_coeff = 15000, | 3777 | .age_time_coeff = 15000, |
| @@ -3776,6 +3795,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3776 | .num_gpio = 15, | 3795 | .num_gpio = 15, |
| 3777 | .max_vid = 4095, | 3796 | .max_vid = 4095, |
| 3778 | .port_base_addr = 0x10, | 3797 | .port_base_addr = 0x10, |
| 3798 | .phy_base_addr = 0x0, | ||
| 3779 | .global1_addr = 0x1b, | 3799 | .global1_addr = 0x1b, |
| 3780 | .global2_addr = 0x1c, | 3800 | .global2_addr = 0x1c, |
| 3781 | .age_time_coeff = 15000, | 3801 | .age_time_coeff = 15000, |
| @@ -3798,6 +3818,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3798 | .num_gpio = 11, | 3818 | .num_gpio = 11, |
| 3799 | .max_vid = 4095, | 3819 | .max_vid = 4095, |
| 3800 | .port_base_addr = 0x10, | 3820 | .port_base_addr = 0x10, |
| 3821 | .phy_base_addr = 0x10, | ||
| 3801 | .global1_addr = 0x1b, | 3822 | .global1_addr = 0x1b, |
| 3802 | .global2_addr = 0x1c, | 3823 | .global2_addr = 0x1c, |
| 3803 | .age_time_coeff = 3750, | 3824 | .age_time_coeff = 3750, |
| @@ -3820,6 +3841,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3820 | .num_internal_phys = 5, | 3841 | .num_internal_phys = 5, |
| 3821 | .max_vid = 4095, | 3842 | .max_vid = 4095, |
| 3822 | .port_base_addr = 0x10, | 3843 | .port_base_addr = 0x10, |
| 3844 | .phy_base_addr = 0x0, | ||
| 3823 | .global1_addr = 0x1b, | 3845 | .global1_addr = 0x1b, |
| 3824 | .global2_addr = 0x1c, | 3846 | .global2_addr = 0x1c, |
| 3825 | .age_time_coeff = 15000, | 3847 | .age_time_coeff = 15000, |
| @@ -3841,6 +3863,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3841 | .num_internal_phys = 5, | 3863 | .num_internal_phys = 5, |
| 3842 | .max_vid = 4095, | 3864 | .max_vid = 4095, |
| 3843 | .port_base_addr = 0x10, | 3865 | .port_base_addr = 0x10, |
| 3866 | .phy_base_addr = 0x0, | ||
| 3844 | .global1_addr = 0x1b, | 3867 | .global1_addr = 0x1b, |
| 3845 | .global2_addr = 0x1c, | 3868 | .global2_addr = 0x1c, |
| 3846 | .age_time_coeff = 15000, | 3869 | .age_time_coeff = 15000, |
| @@ -3863,6 +3886,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3863 | .num_gpio = 15, | 3886 | .num_gpio = 15, |
| 3864 | .max_vid = 4095, | 3887 | .max_vid = 4095, |
| 3865 | .port_base_addr = 0x10, | 3888 | .port_base_addr = 0x10, |
| 3889 | .phy_base_addr = 0x0, | ||
| 3866 | .global1_addr = 0x1b, | 3890 | .global1_addr = 0x1b, |
| 3867 | .global2_addr = 0x1c, | 3891 | .global2_addr = 0x1c, |
| 3868 | .age_time_coeff = 15000, | 3892 | .age_time_coeff = 15000, |
| @@ -3885,6 +3909,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3885 | .num_gpio = 16, | 3909 | .num_gpio = 16, |
| 3886 | .max_vid = 8191, | 3910 | .max_vid = 8191, |
| 3887 | .port_base_addr = 0x0, | 3911 | .port_base_addr = 0x0, |
| 3912 | .phy_base_addr = 0x0, | ||
| 3888 | .global1_addr = 0x1b, | 3913 | .global1_addr = 0x1b, |
| 3889 | .global2_addr = 0x1c, | 3914 | .global2_addr = 0x1c, |
| 3890 | .age_time_coeff = 3750, | 3915 | .age_time_coeff = 3750, |
| @@ -3907,6 +3932,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = { | |||
| 3907 | .num_gpio = 16, | 3932 | .num_gpio = 16, |
| 3908 | .max_vid = 8191, | 3933 | .max_vid = 8191, |
| 3909 | .port_base_addr = 0x0, | 3934 | .port_base_addr = 0x0, |
| 3935 | .phy_base_addr = 0x0, | ||
| 3910 | .global1_addr = 0x1b, | 3936 | .global1_addr = 0x1b, |
| 3911 | .global2_addr = 0x1c, | 3937 | .global2_addr = 0x1c, |
| 3912 | .age_time_coeff = 3750, | 3938 | .age_time_coeff = 3750, |
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h index 80490f66bc06..12b7f4649b25 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.h +++ b/drivers/net/dsa/mv88e6xxx/chip.h | |||
| @@ -114,6 +114,7 @@ struct mv88e6xxx_info { | |||
| 114 | unsigned int num_gpio; | 114 | unsigned int num_gpio; |
| 115 | unsigned int max_vid; | 115 | unsigned int max_vid; |
| 116 | unsigned int port_base_addr; | 116 | unsigned int port_base_addr; |
| 117 | unsigned int phy_base_addr; | ||
| 117 | unsigned int global1_addr; | 118 | unsigned int global1_addr; |
| 118 | unsigned int global2_addr; | 119 | unsigned int global2_addr; |
| 119 | unsigned int age_time_coeff; | 120 | unsigned int age_time_coeff; |
diff --git a/drivers/net/dsa/mv88e6xxx/global2.c b/drivers/net/dsa/mv88e6xxx/global2.c index 0ce627fded48..8d22d66d84b7 100644 --- a/drivers/net/dsa/mv88e6xxx/global2.c +++ b/drivers/net/dsa/mv88e6xxx/global2.c | |||
| @@ -1118,7 +1118,7 @@ int mv88e6xxx_g2_irq_mdio_setup(struct mv88e6xxx_chip *chip, | |||
| 1118 | err = irq; | 1118 | err = irq; |
| 1119 | goto out; | 1119 | goto out; |
| 1120 | } | 1120 | } |
| 1121 | bus->irq[chip->info->port_base_addr + phy] = irq; | 1121 | bus->irq[chip->info->phy_base_addr + phy] = irq; |
| 1122 | } | 1122 | } |
| 1123 | return 0; | 1123 | return 0; |
| 1124 | out: | 1124 | out: |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c index 32f6d2e24d66..1a1a6380c128 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c | |||
| @@ -95,6 +95,7 @@ void aq_nic_cfg_start(struct aq_nic_s *self) | |||
| 95 | /*rss rings */ | 95 | /*rss rings */ |
| 96 | cfg->vecs = min(cfg->aq_hw_caps->vecs, AQ_CFG_VECS_DEF); | 96 | cfg->vecs = min(cfg->aq_hw_caps->vecs, AQ_CFG_VECS_DEF); |
| 97 | cfg->vecs = min(cfg->vecs, num_online_cpus()); | 97 | cfg->vecs = min(cfg->vecs, num_online_cpus()); |
| 98 | cfg->vecs = min(cfg->vecs, self->irqvecs); | ||
| 98 | /* cfg->vecs should be power of 2 for RSS */ | 99 | /* cfg->vecs should be power of 2 for RSS */ |
| 99 | if (cfg->vecs >= 8U) | 100 | if (cfg->vecs >= 8U) |
| 100 | cfg->vecs = 8U; | 101 | cfg->vecs = 8U; |
| @@ -246,6 +247,8 @@ void aq_nic_ndev_init(struct aq_nic_s *self) | |||
| 246 | 247 | ||
| 247 | self->ndev->hw_features |= aq_hw_caps->hw_features; | 248 | self->ndev->hw_features |= aq_hw_caps->hw_features; |
| 248 | self->ndev->features = aq_hw_caps->hw_features; | 249 | self->ndev->features = aq_hw_caps->hw_features; |
| 250 | self->ndev->vlan_features |= NETIF_F_HW_CSUM | NETIF_F_RXCSUM | | ||
| 251 | NETIF_F_RXHASH | NETIF_F_SG | NETIF_F_LRO; | ||
| 249 | self->ndev->priv_flags = aq_hw_caps->hw_priv_flags; | 252 | self->ndev->priv_flags = aq_hw_caps->hw_priv_flags; |
| 250 | self->ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; | 253 | self->ndev->priv_flags |= IFF_LIVE_ADDR_CHANGE; |
| 251 | 254 | ||
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h index 219b550d1665..faa533a0ec47 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.h +++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.h | |||
| @@ -80,6 +80,7 @@ struct aq_nic_s { | |||
| 80 | 80 | ||
| 81 | struct pci_dev *pdev; | 81 | struct pci_dev *pdev; |
| 82 | unsigned int msix_entry_mask; | 82 | unsigned int msix_entry_mask; |
| 83 | u32 irqvecs; | ||
| 83 | }; | 84 | }; |
| 84 | 85 | ||
| 85 | static inline struct device *aq_nic_get_dev(struct aq_nic_s *self) | 86 | static inline struct device *aq_nic_get_dev(struct aq_nic_s *self) |
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c index ecc6306f940f..a50e08bb4748 100644 --- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c +++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c | |||
| @@ -267,16 +267,16 @@ static int aq_pci_probe(struct pci_dev *pdev, | |||
| 267 | numvecs = min(numvecs, num_online_cpus()); | 267 | numvecs = min(numvecs, num_online_cpus()); |
| 268 | /*enable interrupts */ | 268 | /*enable interrupts */ |
| 269 | #if !AQ_CFG_FORCE_LEGACY_INT | 269 | #if !AQ_CFG_FORCE_LEGACY_INT |
| 270 | err = pci_alloc_irq_vectors(self->pdev, numvecs, numvecs, | 270 | numvecs = pci_alloc_irq_vectors(self->pdev, 1, numvecs, |
| 271 | PCI_IRQ_MSIX); | 271 | PCI_IRQ_MSIX | PCI_IRQ_MSI | |
| 272 | 272 | PCI_IRQ_LEGACY); | |
| 273 | if (err < 0) { | 273 | |
| 274 | err = pci_alloc_irq_vectors(self->pdev, 1, 1, | 274 | if (numvecs < 0) { |
| 275 | PCI_IRQ_MSI | PCI_IRQ_LEGACY); | 275 | err = numvecs; |
| 276 | if (err < 0) | 276 | goto err_hwinit; |
| 277 | goto err_hwinit; | ||
| 278 | } | 277 | } |
| 279 | #endif | 278 | #endif |
| 279 | self->irqvecs = numvecs; | ||
| 280 | 280 | ||
| 281 | /* net device init */ | 281 | /* net device init */ |
| 282 | aq_nic_cfg_start(self); | 282 | aq_nic_cfg_start(self); |
| @@ -298,9 +298,9 @@ err_free_aq_hw: | |||
| 298 | kfree(self->aq_hw); | 298 | kfree(self->aq_hw); |
| 299 | err_ioremap: | 299 | err_ioremap: |
| 300 | free_netdev(ndev); | 300 | free_netdev(ndev); |
| 301 | err_pci_func: | ||
| 302 | pci_release_regions(pdev); | ||
| 303 | err_ndev: | 301 | err_ndev: |
| 302 | pci_release_regions(pdev); | ||
| 303 | err_pci_func: | ||
| 304 | pci_disable_device(pdev); | 304 | pci_disable_device(pdev); |
| 305 | return err; | 305 | return err; |
| 306 | } | 306 | } |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 08bbb639be1a..9f59b1270a7c 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -8733,14 +8733,15 @@ static void tg3_free_consistent(struct tg3 *tp) | |||
| 8733 | tg3_mem_rx_release(tp); | 8733 | tg3_mem_rx_release(tp); |
| 8734 | tg3_mem_tx_release(tp); | 8734 | tg3_mem_tx_release(tp); |
| 8735 | 8735 | ||
| 8736 | /* Protect tg3_get_stats64() from reading freed tp->hw_stats. */ | 8736 | /* tp->hw_stats can be referenced safely: |
| 8737 | tg3_full_lock(tp, 0); | 8737 | * 1. under rtnl_lock |
| 8738 | * 2. or under tp->lock if TG3_FLAG_INIT_COMPLETE is set. | ||
| 8739 | */ | ||
| 8738 | if (tp->hw_stats) { | 8740 | if (tp->hw_stats) { |
| 8739 | dma_free_coherent(&tp->pdev->dev, sizeof(struct tg3_hw_stats), | 8741 | dma_free_coherent(&tp->pdev->dev, sizeof(struct tg3_hw_stats), |
| 8740 | tp->hw_stats, tp->stats_mapping); | 8742 | tp->hw_stats, tp->stats_mapping); |
| 8741 | tp->hw_stats = NULL; | 8743 | tp->hw_stats = NULL; |
| 8742 | } | 8744 | } |
| 8743 | tg3_full_unlock(tp); | ||
| 8744 | } | 8745 | } |
| 8745 | 8746 | ||
| 8746 | /* | 8747 | /* |
| @@ -14178,7 +14179,7 @@ static void tg3_get_stats64(struct net_device *dev, | |||
| 14178 | struct tg3 *tp = netdev_priv(dev); | 14179 | struct tg3 *tp = netdev_priv(dev); |
| 14179 | 14180 | ||
| 14180 | spin_lock_bh(&tp->lock); | 14181 | spin_lock_bh(&tp->lock); |
| 14181 | if (!tp->hw_stats) { | 14182 | if (!tp->hw_stats || !tg3_flag(tp, INIT_COMPLETE)) { |
| 14182 | *stats = tp->net_stats_prev; | 14183 | *stats = tp->net_stats_prev; |
| 14183 | spin_unlock_bh(&tp->lock); | 14184 | spin_unlock_bh(&tp->lock); |
| 14184 | return; | 14185 | return; |
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c index 24d2865b8806..005283c7cdfe 100644 --- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c +++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | |||
| @@ -3433,8 +3433,8 @@ static int adap_config_hma(struct adapter *adapter) | |||
| 3433 | sgl = adapter->hma.sgt->sgl; | 3433 | sgl = adapter->hma.sgt->sgl; |
| 3434 | node = dev_to_node(adapter->pdev_dev); | 3434 | node = dev_to_node(adapter->pdev_dev); |
| 3435 | for_each_sg(sgl, iter, sgt->orig_nents, i) { | 3435 | for_each_sg(sgl, iter, sgt->orig_nents, i) { |
| 3436 | newpage = alloc_pages_node(node, __GFP_NOWARN | GFP_KERNEL, | 3436 | newpage = alloc_pages_node(node, __GFP_NOWARN | GFP_KERNEL | |
| 3437 | page_order); | 3437 | __GFP_ZERO, page_order); |
| 3438 | if (!newpage) { | 3438 | if (!newpage) { |
| 3439 | dev_err(adapter->pdev_dev, | 3439 | dev_err(adapter->pdev_dev, |
| 3440 | "Not enough memory for HMA page allocation\n"); | 3440 | "Not enough memory for HMA page allocation\n"); |
| @@ -5474,6 +5474,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 5474 | } | 5474 | } |
| 5475 | spin_lock_init(&adapter->mbox_lock); | 5475 | spin_lock_init(&adapter->mbox_lock); |
| 5476 | INIT_LIST_HEAD(&adapter->mlist.list); | 5476 | INIT_LIST_HEAD(&adapter->mlist.list); |
| 5477 | adapter->mbox_log->size = T4_OS_LOG_MBOX_CMDS; | ||
| 5477 | pci_set_drvdata(pdev, adapter); | 5478 | pci_set_drvdata(pdev, adapter); |
| 5478 | 5479 | ||
| 5479 | if (func != ent->driver_data) { | 5480 | if (func != ent->driver_data) { |
| @@ -5508,8 +5509,6 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 5508 | goto out_free_adapter; | 5509 | goto out_free_adapter; |
| 5509 | } | 5510 | } |
| 5510 | 5511 | ||
| 5511 | adapter->mbox_log->size = T4_OS_LOG_MBOX_CMDS; | ||
| 5512 | |||
| 5513 | /* PCI device has been enabled */ | 5512 | /* PCI device has been enabled */ |
| 5514 | adapter->flags |= DEV_ENABLED; | 5513 | adapter->flags |= DEV_ENABLED; |
| 5515 | memset(adapter->chan_map, 0xff, sizeof(adapter->chan_map)); | 5514 | memset(adapter->chan_map, 0xff, sizeof(adapter->chan_map)); |
diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c index 5909a4407e38..7c511f144ed6 100644 --- a/drivers/net/ethernet/intel/ice/ice_controlq.c +++ b/drivers/net/ethernet/intel/ice/ice_controlq.c | |||
| @@ -1014,10 +1014,10 @@ ice_clean_rq_elem(struct ice_hw *hw, struct ice_ctl_q_info *cq, | |||
| 1014 | desc = ICE_CTL_Q_DESC(cq->rq, ntc); | 1014 | desc = ICE_CTL_Q_DESC(cq->rq, ntc); |
| 1015 | desc_idx = ntc; | 1015 | desc_idx = ntc; |
| 1016 | 1016 | ||
| 1017 | cq->rq_last_status = (enum ice_aq_err)le16_to_cpu(desc->retval); | ||
| 1017 | flags = le16_to_cpu(desc->flags); | 1018 | flags = le16_to_cpu(desc->flags); |
| 1018 | if (flags & ICE_AQ_FLAG_ERR) { | 1019 | if (flags & ICE_AQ_FLAG_ERR) { |
| 1019 | ret_code = ICE_ERR_AQ_ERROR; | 1020 | ret_code = ICE_ERR_AQ_ERROR; |
| 1020 | cq->rq_last_status = (enum ice_aq_err)le16_to_cpu(desc->retval); | ||
| 1021 | ice_debug(hw, ICE_DBG_AQ_MSG, | 1021 | ice_debug(hw, ICE_DBG_AQ_MSG, |
| 1022 | "Control Receive Queue Event received with error 0x%x\n", | 1022 | "Control Receive Queue Event received with error 0x%x\n", |
| 1023 | cq->rq_last_status); | 1023 | cq->rq_last_status); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c index 68af127987bc..cead23e3db0c 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | |||
| @@ -943,8 +943,8 @@ err2: | |||
| 943 | kfree(ipsec->ip_tbl); | 943 | kfree(ipsec->ip_tbl); |
| 944 | kfree(ipsec->rx_tbl); | 944 | kfree(ipsec->rx_tbl); |
| 945 | kfree(ipsec->tx_tbl); | 945 | kfree(ipsec->tx_tbl); |
| 946 | kfree(ipsec); | ||
| 946 | err1: | 947 | err1: |
| 947 | kfree(adapter->ipsec); | ||
| 948 | netdev_err(adapter->netdev, "Unable to allocate memory for SA tables"); | 948 | netdev_err(adapter->netdev, "Unable to allocate memory for SA tables"); |
| 949 | } | 949 | } |
| 950 | 950 | ||
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c index 3123267dfba9..9592f3e3e42e 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | |||
| @@ -3427,6 +3427,9 @@ static s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw) | |||
| 3427 | hw->phy.sfp_setup_needed = false; | 3427 | hw->phy.sfp_setup_needed = false; |
| 3428 | } | 3428 | } |
| 3429 | 3429 | ||
| 3430 | if (status == IXGBE_ERR_SFP_NOT_SUPPORTED) | ||
| 3431 | return status; | ||
| 3432 | |||
| 3430 | /* Reset PHY */ | 3433 | /* Reset PHY */ |
| 3431 | if (!hw->phy.reset_disable && hw->phy.ops.reset) | 3434 | if (!hw->phy.reset_disable && hw->phy.ops.reset) |
| 3432 | hw->phy.ops.reset(hw); | 3435 | hw->phy.ops.reset(hw); |
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c index e3d04f226d57..850f8af95e49 100644 --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | |||
| @@ -4137,7 +4137,7 @@ out_drop: | |||
| 4137 | return NETDEV_TX_OK; | 4137 | return NETDEV_TX_OK; |
| 4138 | } | 4138 | } |
| 4139 | 4139 | ||
| 4140 | static int ixgbevf_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | 4140 | static netdev_tx_t ixgbevf_xmit_frame(struct sk_buff *skb, struct net_device *netdev) |
| 4141 | { | 4141 | { |
| 4142 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); | 4142 | struct ixgbevf_adapter *adapter = netdev_priv(netdev); |
| 4143 | struct ixgbevf_ring *tx_ring; | 4143 | struct ixgbevf_ring *tx_ring; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c index a30a2e95d13f..f11b45001cad 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | |||
| @@ -1027,6 +1027,22 @@ static int mlx4_en_set_coalesce(struct net_device *dev, | |||
| 1027 | if (!coal->tx_max_coalesced_frames_irq) | 1027 | if (!coal->tx_max_coalesced_frames_irq) |
| 1028 | return -EINVAL; | 1028 | return -EINVAL; |
| 1029 | 1029 | ||
| 1030 | if (coal->tx_coalesce_usecs > MLX4_EN_MAX_COAL_TIME || | ||
| 1031 | coal->rx_coalesce_usecs > MLX4_EN_MAX_COAL_TIME || | ||
| 1032 | coal->rx_coalesce_usecs_low > MLX4_EN_MAX_COAL_TIME || | ||
| 1033 | coal->rx_coalesce_usecs_high > MLX4_EN_MAX_COAL_TIME) { | ||
| 1034 | netdev_info(dev, "%s: maximum coalesce time supported is %d usecs\n", | ||
| 1035 | __func__, MLX4_EN_MAX_COAL_TIME); | ||
| 1036 | return -ERANGE; | ||
| 1037 | } | ||
| 1038 | |||
| 1039 | if (coal->tx_max_coalesced_frames > MLX4_EN_MAX_COAL_PKTS || | ||
| 1040 | coal->rx_max_coalesced_frames > MLX4_EN_MAX_COAL_PKTS) { | ||
| 1041 | netdev_info(dev, "%s: maximum coalesced frames supported is %d\n", | ||
| 1042 | __func__, MLX4_EN_MAX_COAL_PKTS); | ||
| 1043 | return -ERANGE; | ||
| 1044 | } | ||
| 1045 | |||
| 1030 | priv->rx_frames = (coal->rx_max_coalesced_frames == | 1046 | priv->rx_frames = (coal->rx_max_coalesced_frames == |
| 1031 | MLX4_EN_AUTO_CONF) ? | 1047 | MLX4_EN_AUTO_CONF) ? |
| 1032 | MLX4_EN_RX_COAL_TARGET : | 1048 | MLX4_EN_RX_COAL_TARGET : |
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c index e0adac4a9a19..9670b33fc9b1 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | |||
| @@ -3324,12 +3324,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
| 3324 | MAX_TX_RINGS, GFP_KERNEL); | 3324 | MAX_TX_RINGS, GFP_KERNEL); |
| 3325 | if (!priv->tx_ring[t]) { | 3325 | if (!priv->tx_ring[t]) { |
| 3326 | err = -ENOMEM; | 3326 | err = -ENOMEM; |
| 3327 | goto err_free_tx; | 3327 | goto out; |
| 3328 | } | 3328 | } |
| 3329 | priv->tx_cq[t] = kzalloc(sizeof(struct mlx4_en_cq *) * | 3329 | priv->tx_cq[t] = kzalloc(sizeof(struct mlx4_en_cq *) * |
| 3330 | MAX_TX_RINGS, GFP_KERNEL); | 3330 | MAX_TX_RINGS, GFP_KERNEL); |
| 3331 | if (!priv->tx_cq[t]) { | 3331 | if (!priv->tx_cq[t]) { |
| 3332 | kfree(priv->tx_ring[t]); | ||
| 3333 | err = -ENOMEM; | 3332 | err = -ENOMEM; |
| 3334 | goto out; | 3333 | goto out; |
| 3335 | } | 3334 | } |
| @@ -3582,11 +3581,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, | |||
| 3582 | 3581 | ||
| 3583 | return 0; | 3582 | return 0; |
| 3584 | 3583 | ||
| 3585 | err_free_tx: | ||
| 3586 | while (t--) { | ||
| 3587 | kfree(priv->tx_ring[t]); | ||
| 3588 | kfree(priv->tx_cq[t]); | ||
| 3589 | } | ||
| 3590 | out: | 3584 | out: |
| 3591 | mlx4_en_destroy_netdev(dev); | 3585 | mlx4_en_destroy_netdev(dev); |
| 3592 | return err; | 3586 | return err; |
diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h index f7c81133594f..ace6545f82e6 100644 --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | |||
| @@ -132,6 +132,9 @@ | |||
| 132 | #define MLX4_EN_TX_COAL_PKTS 16 | 132 | #define MLX4_EN_TX_COAL_PKTS 16 |
| 133 | #define MLX4_EN_TX_COAL_TIME 0x10 | 133 | #define MLX4_EN_TX_COAL_TIME 0x10 |
| 134 | 134 | ||
| 135 | #define MLX4_EN_MAX_COAL_PKTS U16_MAX | ||
| 136 | #define MLX4_EN_MAX_COAL_TIME U16_MAX | ||
| 137 | |||
| 135 | #define MLX4_EN_RX_RATE_LOW 400000 | 138 | #define MLX4_EN_RX_RATE_LOW 400000 |
| 136 | #define MLX4_EN_RX_COAL_TIME_LOW 0 | 139 | #define MLX4_EN_RX_COAL_TIME_LOW 0 |
| 137 | #define MLX4_EN_RX_RATE_HIGH 450000 | 140 | #define MLX4_EN_RX_RATE_HIGH 450000 |
| @@ -552,8 +555,8 @@ struct mlx4_en_priv { | |||
| 552 | u16 rx_usecs_low; | 555 | u16 rx_usecs_low; |
| 553 | u32 pkt_rate_high; | 556 | u32 pkt_rate_high; |
| 554 | u16 rx_usecs_high; | 557 | u16 rx_usecs_high; |
| 555 | u16 sample_interval; | 558 | u32 sample_interval; |
| 556 | u16 adaptive_rx_coal; | 559 | u32 adaptive_rx_coal; |
| 557 | u32 msg_enable; | 560 | u32 msg_enable; |
| 558 | u32 loopback_ok; | 561 | u32 loopback_ok; |
| 559 | u32 validate_loopback; | 562 | u32 validate_loopback; |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c index 3c534fc43400..b94276db3ce9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | |||
| @@ -1261,6 +1261,10 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, | |||
| 1261 | f->mask); | 1261 | f->mask); |
| 1262 | addr_type = key->addr_type; | 1262 | addr_type = key->addr_type; |
| 1263 | 1263 | ||
| 1264 | /* the HW doesn't support frag first/later */ | ||
| 1265 | if (mask->flags & FLOW_DIS_FIRST_FRAG) | ||
| 1266 | return -EOPNOTSUPP; | ||
| 1267 | |||
| 1264 | if (mask->flags & FLOW_DIS_IS_FRAGMENT) { | 1268 | if (mask->flags & FLOW_DIS_IS_FRAGMENT) { |
| 1265 | MLX5_SET(fte_match_set_lyr_2_4, headers_c, frag, 1); | 1269 | MLX5_SET(fte_match_set_lyr_2_4, headers_c, frag, 1); |
| 1266 | MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag, | 1270 | MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag, |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eq.c b/drivers/net/ethernet/mellanox/mlx5/core/eq.c index c1c94974e16b..1814f803bd2c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eq.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eq.c | |||
| @@ -34,6 +34,9 @@ | |||
| 34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
| 35 | #include <linux/mlx5/driver.h> | 35 | #include <linux/mlx5/driver.h> |
| 36 | #include <linux/mlx5/cmd.h> | 36 | #include <linux/mlx5/cmd.h> |
| 37 | #ifdef CONFIG_RFS_ACCEL | ||
| 38 | #include <linux/cpu_rmap.h> | ||
| 39 | #endif | ||
| 37 | #include "mlx5_core.h" | 40 | #include "mlx5_core.h" |
| 38 | #include "fpga/core.h" | 41 | #include "fpga/core.h" |
| 39 | #include "eswitch.h" | 42 | #include "eswitch.h" |
| @@ -923,3 +926,28 @@ int mlx5_core_eq_query(struct mlx5_core_dev *dev, struct mlx5_eq *eq, | |||
| 923 | MLX5_SET(query_eq_in, in, eq_number, eq->eqn); | 926 | MLX5_SET(query_eq_in, in, eq_number, eq->eqn); |
| 924 | return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen); | 927 | return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen); |
| 925 | } | 928 | } |
| 929 | |||
| 930 | /* This function should only be called after mlx5_cmd_force_teardown_hca */ | ||
| 931 | void mlx5_core_eq_free_irqs(struct mlx5_core_dev *dev) | ||
| 932 | { | ||
| 933 | struct mlx5_eq_table *table = &dev->priv.eq_table; | ||
| 934 | struct mlx5_eq *eq; | ||
| 935 | |||
| 936 | #ifdef CONFIG_RFS_ACCEL | ||
| 937 | if (dev->rmap) { | ||
| 938 | free_irq_cpu_rmap(dev->rmap); | ||
| 939 | dev->rmap = NULL; | ||
| 940 | } | ||
| 941 | #endif | ||
| 942 | list_for_each_entry(eq, &table->comp_eqs_list, list) | ||
| 943 | free_irq(eq->irqn, eq); | ||
| 944 | |||
| 945 | free_irq(table->pages_eq.irqn, &table->pages_eq); | ||
| 946 | free_irq(table->async_eq.irqn, &table->async_eq); | ||
| 947 | free_irq(table->cmd_eq.irqn, &table->cmd_eq); | ||
| 948 | #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING | ||
| 949 | if (MLX5_CAP_GEN(dev, pg)) | ||
| 950 | free_irq(table->pfault_eq.irqn, &table->pfault_eq); | ||
| 951 | #endif | ||
| 952 | pci_free_irq_vectors(dev->pdev); | ||
| 953 | } | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c index 332bc56306bf..1352d13eedb3 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | |||
| @@ -2175,26 +2175,35 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw, | |||
| 2175 | memset(vf_stats, 0, sizeof(*vf_stats)); | 2175 | memset(vf_stats, 0, sizeof(*vf_stats)); |
| 2176 | vf_stats->rx_packets = | 2176 | vf_stats->rx_packets = |
| 2177 | MLX5_GET_CTR(out, received_eth_unicast.packets) + | 2177 | MLX5_GET_CTR(out, received_eth_unicast.packets) + |
| 2178 | MLX5_GET_CTR(out, received_ib_unicast.packets) + | ||
| 2178 | MLX5_GET_CTR(out, received_eth_multicast.packets) + | 2179 | MLX5_GET_CTR(out, received_eth_multicast.packets) + |
| 2180 | MLX5_GET_CTR(out, received_ib_multicast.packets) + | ||
| 2179 | MLX5_GET_CTR(out, received_eth_broadcast.packets); | 2181 | MLX5_GET_CTR(out, received_eth_broadcast.packets); |
| 2180 | 2182 | ||
| 2181 | vf_stats->rx_bytes = | 2183 | vf_stats->rx_bytes = |
| 2182 | MLX5_GET_CTR(out, received_eth_unicast.octets) + | 2184 | MLX5_GET_CTR(out, received_eth_unicast.octets) + |
| 2185 | MLX5_GET_CTR(out, received_ib_unicast.octets) + | ||
| 2183 | MLX5_GET_CTR(out, received_eth_multicast.octets) + | 2186 | MLX5_GET_CTR(out, received_eth_multicast.octets) + |
| 2187 | MLX5_GET_CTR(out, received_ib_multicast.octets) + | ||
| 2184 | MLX5_GET_CTR(out, received_eth_broadcast.octets); | 2188 | MLX5_GET_CTR(out, received_eth_broadcast.octets); |
| 2185 | 2189 | ||
| 2186 | vf_stats->tx_packets = | 2190 | vf_stats->tx_packets = |
| 2187 | MLX5_GET_CTR(out, transmitted_eth_unicast.packets) + | 2191 | MLX5_GET_CTR(out, transmitted_eth_unicast.packets) + |
| 2192 | MLX5_GET_CTR(out, transmitted_ib_unicast.packets) + | ||
| 2188 | MLX5_GET_CTR(out, transmitted_eth_multicast.packets) + | 2193 | MLX5_GET_CTR(out, transmitted_eth_multicast.packets) + |
| 2194 | MLX5_GET_CTR(out, transmitted_ib_multicast.packets) + | ||
| 2189 | MLX5_GET_CTR(out, transmitted_eth_broadcast.packets); | 2195 | MLX5_GET_CTR(out, transmitted_eth_broadcast.packets); |
| 2190 | 2196 | ||
| 2191 | vf_stats->tx_bytes = | 2197 | vf_stats->tx_bytes = |
| 2192 | MLX5_GET_CTR(out, transmitted_eth_unicast.octets) + | 2198 | MLX5_GET_CTR(out, transmitted_eth_unicast.octets) + |
| 2199 | MLX5_GET_CTR(out, transmitted_ib_unicast.octets) + | ||
| 2193 | MLX5_GET_CTR(out, transmitted_eth_multicast.octets) + | 2200 | MLX5_GET_CTR(out, transmitted_eth_multicast.octets) + |
| 2201 | MLX5_GET_CTR(out, transmitted_ib_multicast.octets) + | ||
| 2194 | MLX5_GET_CTR(out, transmitted_eth_broadcast.octets); | 2202 | MLX5_GET_CTR(out, transmitted_eth_broadcast.octets); |
| 2195 | 2203 | ||
| 2196 | vf_stats->multicast = | 2204 | vf_stats->multicast = |
| 2197 | MLX5_GET_CTR(out, received_eth_multicast.packets); | 2205 | MLX5_GET_CTR(out, received_eth_multicast.packets) + |
| 2206 | MLX5_GET_CTR(out, received_ib_multicast.packets); | ||
| 2198 | 2207 | ||
| 2199 | vf_stats->broadcast = | 2208 | vf_stats->broadcast = |
| 2200 | MLX5_GET_CTR(out, received_eth_broadcast.packets); | 2209 | MLX5_GET_CTR(out, received_eth_broadcast.packets); |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index 63a8ea31601c..e2c465b0b3f8 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
| @@ -1587,6 +1587,14 @@ static int mlx5_try_fast_unload(struct mlx5_core_dev *dev) | |||
| 1587 | 1587 | ||
| 1588 | mlx5_enter_error_state(dev, true); | 1588 | mlx5_enter_error_state(dev, true); |
| 1589 | 1589 | ||
| 1590 | /* Some platforms requiring freeing the IRQ's in the shutdown | ||
| 1591 | * flow. If they aren't freed they can't be allocated after | ||
| 1592 | * kexec. There is no need to cleanup the mlx5_core software | ||
| 1593 | * contexts. | ||
| 1594 | */ | ||
| 1595 | mlx5_irq_clear_affinity_hints(dev); | ||
| 1596 | mlx5_core_eq_free_irqs(dev); | ||
| 1597 | |||
| 1590 | return 0; | 1598 | return 0; |
| 1591 | } | 1599 | } |
| 1592 | 1600 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h index 7d001fe6e631..023882d9a22e 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h | |||
| @@ -128,6 +128,8 @@ int mlx5_core_eq_query(struct mlx5_core_dev *dev, struct mlx5_eq *eq, | |||
| 128 | u32 *out, int outlen); | 128 | u32 *out, int outlen); |
| 129 | int mlx5_start_eqs(struct mlx5_core_dev *dev); | 129 | int mlx5_start_eqs(struct mlx5_core_dev *dev); |
| 130 | void mlx5_stop_eqs(struct mlx5_core_dev *dev); | 130 | void mlx5_stop_eqs(struct mlx5_core_dev *dev); |
| 131 | /* This function should only be called after mlx5_cmd_force_teardown_hca */ | ||
| 132 | void mlx5_core_eq_free_irqs(struct mlx5_core_dev *dev); | ||
| 131 | struct mlx5_eq *mlx5_eqn2eq(struct mlx5_core_dev *dev, int eqn); | 133 | struct mlx5_eq *mlx5_eqn2eq(struct mlx5_core_dev *dev, int eqn); |
| 132 | u32 mlx5_eq_poll_irq_disabled(struct mlx5_eq *eq); | 134 | u32 mlx5_eq_poll_irq_disabled(struct mlx5_eq *eq); |
| 133 | void mlx5_cq_tasklet_cb(unsigned long data); | 135 | void mlx5_cq_tasklet_cb(unsigned long data); |
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c index 93ea56620a24..e13ac3b8dff7 100644 --- a/drivers/net/ethernet/mellanox/mlxsw/core.c +++ b/drivers/net/ethernet/mellanox/mlxsw/core.c | |||
| @@ -1100,11 +1100,11 @@ err_emad_init: | |||
| 1100 | err_alloc_lag_mapping: | 1100 | err_alloc_lag_mapping: |
| 1101 | mlxsw_ports_fini(mlxsw_core); | 1101 | mlxsw_ports_fini(mlxsw_core); |
| 1102 | err_ports_init: | 1102 | err_ports_init: |
| 1103 | mlxsw_bus->fini(bus_priv); | ||
| 1104 | err_bus_init: | ||
| 1105 | if (!reload) | 1103 | if (!reload) |
| 1106 | devlink_resources_unregister(devlink, NULL); | 1104 | devlink_resources_unregister(devlink, NULL); |
| 1107 | err_register_resources: | 1105 | err_register_resources: |
| 1106 | mlxsw_bus->fini(bus_priv); | ||
| 1107 | err_bus_init: | ||
| 1108 | if (!reload) | 1108 | if (!reload) |
| 1109 | devlink_free(devlink); | 1109 | devlink_free(devlink); |
| 1110 | err_devlink_alloc: | 1110 | err_devlink_alloc: |
diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c index a997e34bcec2..84e3b9f5abb1 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/main.c +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c | |||
| @@ -52,8 +52,6 @@ | |||
| 52 | 52 | ||
| 53 | #define NFP_FLOWER_ALLOWED_VER 0x0001000000010000UL | 53 | #define NFP_FLOWER_ALLOWED_VER 0x0001000000010000UL |
| 54 | 54 | ||
| 55 | #define NFP_FLOWER_FRAME_HEADROOM 158 | ||
| 56 | |||
| 57 | static const char *nfp_flower_extra_cap(struct nfp_app *app, struct nfp_net *nn) | 55 | static const char *nfp_flower_extra_cap(struct nfp_app *app, struct nfp_net *nn) |
| 58 | { | 56 | { |
| 59 | return "FLOWER"; | 57 | return "FLOWER"; |
| @@ -559,22 +557,6 @@ static void nfp_flower_clean(struct nfp_app *app) | |||
| 559 | app->priv = NULL; | 557 | app->priv = NULL; |
| 560 | } | 558 | } |
| 561 | 559 | ||
| 562 | static int | ||
| 563 | nfp_flower_check_mtu(struct nfp_app *app, struct net_device *netdev, | ||
| 564 | int new_mtu) | ||
| 565 | { | ||
| 566 | /* The flower fw reserves NFP_FLOWER_FRAME_HEADROOM bytes of the | ||
| 567 | * supported max MTU to allow for appending tunnel headers. To prevent | ||
| 568 | * unexpected behaviour this needs to be accounted for. | ||
| 569 | */ | ||
| 570 | if (new_mtu > netdev->max_mtu - NFP_FLOWER_FRAME_HEADROOM) { | ||
| 571 | nfp_err(app->cpp, "New MTU (%d) is not valid\n", new_mtu); | ||
| 572 | return -EINVAL; | ||
| 573 | } | ||
| 574 | |||
| 575 | return 0; | ||
| 576 | } | ||
| 577 | |||
| 578 | static bool nfp_flower_check_ack(struct nfp_flower_priv *app_priv) | 560 | static bool nfp_flower_check_ack(struct nfp_flower_priv *app_priv) |
| 579 | { | 561 | { |
| 580 | bool ret; | 562 | bool ret; |
| @@ -656,7 +638,6 @@ const struct nfp_app_type app_flower = { | |||
| 656 | .init = nfp_flower_init, | 638 | .init = nfp_flower_init, |
| 657 | .clean = nfp_flower_clean, | 639 | .clean = nfp_flower_clean, |
| 658 | 640 | ||
| 659 | .check_mtu = nfp_flower_check_mtu, | ||
| 660 | .repr_change_mtu = nfp_flower_repr_change_mtu, | 641 | .repr_change_mtu = nfp_flower_repr_change_mtu, |
| 661 | 642 | ||
| 662 | .vnic_alloc = nfp_flower_vnic_alloc, | 643 | .vnic_alloc = nfp_flower_vnic_alloc, |
diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c index 27364b7572fc..b092894dd128 100644 --- a/drivers/net/ethernet/ni/nixge.c +++ b/drivers/net/ethernet/ni/nixge.c | |||
| @@ -1170,7 +1170,7 @@ static void *nixge_get_nvmem_address(struct device *dev) | |||
| 1170 | 1170 | ||
| 1171 | cell = nvmem_cell_get(dev, "address"); | 1171 | cell = nvmem_cell_get(dev, "address"); |
| 1172 | if (IS_ERR(cell)) | 1172 | if (IS_ERR(cell)) |
| 1173 | return cell; | 1173 | return NULL; |
| 1174 | 1174 | ||
| 1175 | mac = nvmem_cell_read(cell, &cell_size); | 1175 | mac = nvmem_cell_read(cell, &cell_size); |
| 1176 | nvmem_cell_put(cell); | 1176 | nvmem_cell_put(cell); |
| @@ -1183,7 +1183,7 @@ static int nixge_probe(struct platform_device *pdev) | |||
| 1183 | struct nixge_priv *priv; | 1183 | struct nixge_priv *priv; |
| 1184 | struct net_device *ndev; | 1184 | struct net_device *ndev; |
| 1185 | struct resource *dmares; | 1185 | struct resource *dmares; |
| 1186 | const char *mac_addr; | 1186 | const u8 *mac_addr; |
| 1187 | int err; | 1187 | int err; |
| 1188 | 1188 | ||
| 1189 | ndev = alloc_etherdev(sizeof(*priv)); | 1189 | ndev = alloc_etherdev(sizeof(*priv)); |
| @@ -1202,10 +1202,12 @@ static int nixge_probe(struct platform_device *pdev) | |||
| 1202 | ndev->max_mtu = NIXGE_JUMBO_MTU; | 1202 | ndev->max_mtu = NIXGE_JUMBO_MTU; |
| 1203 | 1203 | ||
| 1204 | mac_addr = nixge_get_nvmem_address(&pdev->dev); | 1204 | mac_addr = nixge_get_nvmem_address(&pdev->dev); |
| 1205 | if (mac_addr && is_valid_ether_addr(mac_addr)) | 1205 | if (mac_addr && is_valid_ether_addr(mac_addr)) { |
| 1206 | ether_addr_copy(ndev->dev_addr, mac_addr); | 1206 | ether_addr_copy(ndev->dev_addr, mac_addr); |
| 1207 | else | 1207 | kfree(mac_addr); |
| 1208 | } else { | ||
| 1208 | eth_hw_addr_random(ndev); | 1209 | eth_hw_addr_random(ndev); |
| 1210 | } | ||
| 1209 | 1211 | ||
| 1210 | priv = netdev_priv(ndev); | 1212 | priv = netdev_priv(ndev); |
| 1211 | priv->ndev = ndev; | 1213 | priv->ndev = ndev; |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_l2.c b/drivers/net/ethernet/qlogic/qed/qed_l2.c index e874504e8b28..8667799d0069 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_l2.c +++ b/drivers/net/ethernet/qlogic/qed/qed_l2.c | |||
| @@ -115,8 +115,7 @@ int qed_l2_alloc(struct qed_hwfn *p_hwfn) | |||
| 115 | 115 | ||
| 116 | void qed_l2_setup(struct qed_hwfn *p_hwfn) | 116 | void qed_l2_setup(struct qed_hwfn *p_hwfn) |
| 117 | { | 117 | { |
| 118 | if (p_hwfn->hw_info.personality != QED_PCI_ETH && | 118 | if (!QED_IS_L2_PERSONALITY(p_hwfn)) |
| 119 | p_hwfn->hw_info.personality != QED_PCI_ETH_ROCE) | ||
| 120 | return; | 119 | return; |
| 121 | 120 | ||
| 122 | mutex_init(&p_hwfn->p_l2_info->lock); | 121 | mutex_init(&p_hwfn->p_l2_info->lock); |
| @@ -126,8 +125,7 @@ void qed_l2_free(struct qed_hwfn *p_hwfn) | |||
| 126 | { | 125 | { |
| 127 | u32 i; | 126 | u32 i; |
| 128 | 127 | ||
| 129 | if (p_hwfn->hw_info.personality != QED_PCI_ETH && | 128 | if (!QED_IS_L2_PERSONALITY(p_hwfn)) |
| 130 | p_hwfn->hw_info.personality != QED_PCI_ETH_ROCE) | ||
| 131 | return; | 129 | return; |
| 132 | 130 | ||
| 133 | if (!p_hwfn->p_l2_info) | 131 | if (!p_hwfn->p_l2_info) |
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c index 9854aa9139af..7870ae2a6f7e 100644 --- a/drivers/net/ethernet/qlogic/qed/qed_main.c +++ b/drivers/net/ethernet/qlogic/qed/qed_main.c | |||
| @@ -680,7 +680,7 @@ static int qed_nic_stop(struct qed_dev *cdev) | |||
| 680 | tasklet_disable(p_hwfn->sp_dpc); | 680 | tasklet_disable(p_hwfn->sp_dpc); |
| 681 | p_hwfn->b_sp_dpc_enabled = false; | 681 | p_hwfn->b_sp_dpc_enabled = false; |
| 682 | DP_VERBOSE(cdev, NETIF_MSG_IFDOWN, | 682 | DP_VERBOSE(cdev, NETIF_MSG_IFDOWN, |
| 683 | "Disabled sp taskelt [hwfn %d] at %p\n", | 683 | "Disabled sp tasklet [hwfn %d] at %p\n", |
| 684 | i, p_hwfn->sp_dpc); | 684 | i, p_hwfn->sp_dpc); |
| 685 | } | 685 | } |
| 686 | } | 686 | } |
diff --git a/drivers/net/ethernet/qlogic/qede/qede_rdma.c b/drivers/net/ethernet/qlogic/qede/qede_rdma.c index 50b142fad6b8..1900bf7e67d1 100644 --- a/drivers/net/ethernet/qlogic/qede/qede_rdma.c +++ b/drivers/net/ethernet/qlogic/qede/qede_rdma.c | |||
| @@ -238,7 +238,7 @@ qede_rdma_get_free_event_node(struct qede_dev *edev) | |||
| 238 | } | 238 | } |
| 239 | 239 | ||
| 240 | if (!found) { | 240 | if (!found) { |
| 241 | event_node = kzalloc(sizeof(*event_node), GFP_KERNEL); | 241 | event_node = kzalloc(sizeof(*event_node), GFP_ATOMIC); |
| 242 | if (!event_node) { | 242 | if (!event_node) { |
| 243 | DP_NOTICE(edev, | 243 | DP_NOTICE(edev, |
| 244 | "qedr: Could not allocate memory for rdma work\n"); | 244 | "qedr: Could not allocate memory for rdma work\n"); |
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 604ae78381ae..c7aac1fc99e8 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c | |||
| @@ -4981,6 +4981,9 @@ static void rtl_pll_power_down(struct rtl8169_private *tp) | |||
| 4981 | static void rtl_pll_power_up(struct rtl8169_private *tp) | 4981 | static void rtl_pll_power_up(struct rtl8169_private *tp) |
| 4982 | { | 4982 | { |
| 4983 | rtl_generic_op(tp, tp->pll_power_ops.up); | 4983 | rtl_generic_op(tp, tp->pll_power_ops.up); |
| 4984 | |||
| 4985 | /* give MAC/PHY some time to resume */ | ||
| 4986 | msleep(20); | ||
| 4984 | } | 4987 | } |
| 4985 | 4988 | ||
| 4986 | static void rtl_init_pll_power_ops(struct rtl8169_private *tp) | 4989 | static void rtl_init_pll_power_ops(struct rtl8169_private *tp) |
diff --git a/drivers/net/ethernet/sun/niu.c b/drivers/net/ethernet/sun/niu.c index f081de4f38d7..88c12474a0c3 100644 --- a/drivers/net/ethernet/sun/niu.c +++ b/drivers/net/ethernet/sun/niu.c | |||
| @@ -3443,7 +3443,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, | |||
| 3443 | 3443 | ||
| 3444 | len = (val & RCR_ENTRY_L2_LEN) >> | 3444 | len = (val & RCR_ENTRY_L2_LEN) >> |
| 3445 | RCR_ENTRY_L2_LEN_SHIFT; | 3445 | RCR_ENTRY_L2_LEN_SHIFT; |
| 3446 | len -= ETH_FCS_LEN; | 3446 | append_size = len + ETH_HLEN + ETH_FCS_LEN; |
| 3447 | 3447 | ||
| 3448 | addr = (val & RCR_ENTRY_PKT_BUF_ADDR) << | 3448 | addr = (val & RCR_ENTRY_PKT_BUF_ADDR) << |
| 3449 | RCR_ENTRY_PKT_BUF_ADDR_SHIFT; | 3449 | RCR_ENTRY_PKT_BUF_ADDR_SHIFT; |
| @@ -3453,7 +3453,6 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, | |||
| 3453 | RCR_ENTRY_PKTBUFSZ_SHIFT]; | 3453 | RCR_ENTRY_PKTBUFSZ_SHIFT]; |
| 3454 | 3454 | ||
| 3455 | off = addr & ~PAGE_MASK; | 3455 | off = addr & ~PAGE_MASK; |
| 3456 | append_size = rcr_size; | ||
| 3457 | if (num_rcr == 1) { | 3456 | if (num_rcr == 1) { |
| 3458 | int ptype; | 3457 | int ptype; |
| 3459 | 3458 | ||
| @@ -3466,7 +3465,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, | |||
| 3466 | else | 3465 | else |
| 3467 | skb_checksum_none_assert(skb); | 3466 | skb_checksum_none_assert(skb); |
| 3468 | } else if (!(val & RCR_ENTRY_MULTI)) | 3467 | } else if (!(val & RCR_ENTRY_MULTI)) |
| 3469 | append_size = len - skb->len; | 3468 | append_size = append_size - skb->len; |
| 3470 | 3469 | ||
| 3471 | niu_rx_skb_append(skb, page, off, append_size, rcr_size); | 3470 | niu_rx_skb_append(skb, page, off, append_size, rcr_size); |
| 3472 | if ((page->index + rp->rbr_block_size) - rcr_size == addr) { | 3471 | if ((page->index + rp->rbr_block_size) - rcr_size == addr) { |
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index ecc84954c511..da07ccdf84bf 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c | |||
| @@ -1840,7 +1840,8 @@ static int netvsc_vf_join(struct net_device *vf_netdev, | |||
| 1840 | goto rx_handler_failed; | 1840 | goto rx_handler_failed; |
| 1841 | } | 1841 | } |
| 1842 | 1842 | ||
| 1843 | ret = netdev_upper_dev_link(vf_netdev, ndev, NULL); | 1843 | ret = netdev_master_upper_dev_link(vf_netdev, ndev, |
| 1844 | NULL, NULL, NULL); | ||
| 1844 | if (ret != 0) { | 1845 | if (ret != 0) { |
| 1845 | netdev_err(vf_netdev, | 1846 | netdev_err(vf_netdev, |
| 1846 | "can not set master device %s (err = %d)\n", | 1847 | "can not set master device %s (err = %d)\n", |
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index 6b127be781d9..e7ca5b5f39ed 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c | |||
| @@ -1288,7 +1288,7 @@ struct netvsc_device *rndis_filter_device_add(struct hv_device *dev, | |||
| 1288 | rndis_device->link_state ? "down" : "up"); | 1288 | rndis_device->link_state ? "down" : "up"); |
| 1289 | 1289 | ||
| 1290 | if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5) | 1290 | if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5) |
| 1291 | return net_device; | 1291 | goto out; |
| 1292 | 1292 | ||
| 1293 | rndis_filter_query_link_speed(rndis_device, net_device); | 1293 | rndis_filter_query_link_speed(rndis_device, net_device); |
| 1294 | 1294 | ||
diff --git a/drivers/net/ieee802154/atusb.c b/drivers/net/ieee802154/atusb.c index 9fb9b565a002..4f684cbcdc57 100644 --- a/drivers/net/ieee802154/atusb.c +++ b/drivers/net/ieee802154/atusb.c | |||
| @@ -1045,7 +1045,7 @@ static int atusb_probe(struct usb_interface *interface, | |||
| 1045 | atusb->tx_dr.bRequest = ATUSB_TX; | 1045 | atusb->tx_dr.bRequest = ATUSB_TX; |
| 1046 | atusb->tx_dr.wValue = cpu_to_le16(0); | 1046 | atusb->tx_dr.wValue = cpu_to_le16(0); |
| 1047 | 1047 | ||
| 1048 | atusb->tx_urb = usb_alloc_urb(0, GFP_ATOMIC); | 1048 | atusb->tx_urb = usb_alloc_urb(0, GFP_KERNEL); |
| 1049 | if (!atusb->tx_urb) | 1049 | if (!atusb->tx_urb) |
| 1050 | goto fail; | 1050 | goto fail; |
| 1051 | 1051 | ||
diff --git a/drivers/net/ieee802154/mcr20a.c b/drivers/net/ieee802154/mcr20a.c index 55a22c761808..de0d7f28a181 100644 --- a/drivers/net/ieee802154/mcr20a.c +++ b/drivers/net/ieee802154/mcr20a.c | |||
| @@ -1267,7 +1267,7 @@ mcr20a_probe(struct spi_device *spi) | |||
| 1267 | ret = mcr20a_get_platform_data(spi, pdata); | 1267 | ret = mcr20a_get_platform_data(spi, pdata); |
| 1268 | if (ret < 0) { | 1268 | if (ret < 0) { |
| 1269 | dev_crit(&spi->dev, "mcr20a_get_platform_data failed.\n"); | 1269 | dev_crit(&spi->dev, "mcr20a_get_platform_data failed.\n"); |
| 1270 | return ret; | 1270 | goto free_pdata; |
| 1271 | } | 1271 | } |
| 1272 | 1272 | ||
| 1273 | /* init reset gpio */ | 1273 | /* init reset gpio */ |
| @@ -1275,7 +1275,7 @@ mcr20a_probe(struct spi_device *spi) | |||
| 1275 | ret = devm_gpio_request_one(&spi->dev, pdata->rst_gpio, | 1275 | ret = devm_gpio_request_one(&spi->dev, pdata->rst_gpio, |
| 1276 | GPIOF_OUT_INIT_HIGH, "reset"); | 1276 | GPIOF_OUT_INIT_HIGH, "reset"); |
| 1277 | if (ret) | 1277 | if (ret) |
| 1278 | return ret; | 1278 | goto free_pdata; |
| 1279 | } | 1279 | } |
| 1280 | 1280 | ||
| 1281 | /* reset mcr20a */ | 1281 | /* reset mcr20a */ |
| @@ -1291,7 +1291,8 @@ mcr20a_probe(struct spi_device *spi) | |||
| 1291 | hw = ieee802154_alloc_hw(sizeof(*lp), &mcr20a_hw_ops); | 1291 | hw = ieee802154_alloc_hw(sizeof(*lp), &mcr20a_hw_ops); |
| 1292 | if (!hw) { | 1292 | if (!hw) { |
| 1293 | dev_crit(&spi->dev, "ieee802154_alloc_hw failed\n"); | 1293 | dev_crit(&spi->dev, "ieee802154_alloc_hw failed\n"); |
| 1294 | return -ENOMEM; | 1294 | ret = -ENOMEM; |
| 1295 | goto free_pdata; | ||
| 1295 | } | 1296 | } |
| 1296 | 1297 | ||
| 1297 | /* init mcr20a local data */ | 1298 | /* init mcr20a local data */ |
| @@ -1308,8 +1309,10 @@ mcr20a_probe(struct spi_device *spi) | |||
| 1308 | /* init buf */ | 1309 | /* init buf */ |
| 1309 | lp->buf = devm_kzalloc(&spi->dev, SPI_COMMAND_BUFFER, GFP_KERNEL); | 1310 | lp->buf = devm_kzalloc(&spi->dev, SPI_COMMAND_BUFFER, GFP_KERNEL); |
| 1310 | 1311 | ||
| 1311 | if (!lp->buf) | 1312 | if (!lp->buf) { |
| 1312 | return -ENOMEM; | 1313 | ret = -ENOMEM; |
| 1314 | goto free_dev; | ||
| 1315 | } | ||
| 1313 | 1316 | ||
| 1314 | mcr20a_setup_tx_spi_messages(lp); | 1317 | mcr20a_setup_tx_spi_messages(lp); |
| 1315 | mcr20a_setup_rx_spi_messages(lp); | 1318 | mcr20a_setup_rx_spi_messages(lp); |
| @@ -1366,6 +1369,8 @@ mcr20a_probe(struct spi_device *spi) | |||
| 1366 | 1369 | ||
| 1367 | free_dev: | 1370 | free_dev: |
| 1368 | ieee802154_free_hw(lp->hw); | 1371 | ieee802154_free_hw(lp->hw); |
| 1372 | free_pdata: | ||
| 1373 | kfree(pdata); | ||
| 1369 | 1374 | ||
| 1370 | return ret; | 1375 | return ret; |
| 1371 | } | 1376 | } |
diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c index 3bb6b66dc7bf..f9c25912eb98 100644 --- a/drivers/net/phy/broadcom.c +++ b/drivers/net/phy/broadcom.c | |||
| @@ -720,6 +720,15 @@ static struct phy_driver broadcom_drivers[] = { | |||
| 720 | .get_strings = bcm_phy_get_strings, | 720 | .get_strings = bcm_phy_get_strings, |
| 721 | .get_stats = bcm53xx_phy_get_stats, | 721 | .get_stats = bcm53xx_phy_get_stats, |
| 722 | .probe = bcm53xx_phy_probe, | 722 | .probe = bcm53xx_phy_probe, |
| 723 | }, { | ||
| 724 | .phy_id = PHY_ID_BCM89610, | ||
| 725 | .phy_id_mask = 0xfffffff0, | ||
| 726 | .name = "Broadcom BCM89610", | ||
| 727 | .features = PHY_GBIT_FEATURES, | ||
| 728 | .flags = PHY_HAS_INTERRUPT, | ||
| 729 | .config_init = bcm54xx_config_init, | ||
| 730 | .ack_interrupt = bcm_phy_ack_intr, | ||
| 731 | .config_intr = bcm_phy_config_intr, | ||
| 723 | } }; | 732 | } }; |
| 724 | 733 | ||
| 725 | module_phy_driver(broadcom_drivers); | 734 | module_phy_driver(broadcom_drivers); |
| @@ -741,6 +750,7 @@ static struct mdio_device_id __maybe_unused broadcom_tbl[] = { | |||
| 741 | { PHY_ID_BCMAC131, 0xfffffff0 }, | 750 | { PHY_ID_BCMAC131, 0xfffffff0 }, |
| 742 | { PHY_ID_BCM5241, 0xfffffff0 }, | 751 | { PHY_ID_BCM5241, 0xfffffff0 }, |
| 743 | { PHY_ID_BCM5395, 0xfffffff0 }, | 752 | { PHY_ID_BCM5395, 0xfffffff0 }, |
| 753 | { PHY_ID_BCM89610, 0xfffffff0 }, | ||
| 744 | { } | 754 | { } |
| 745 | }; | 755 | }; |
| 746 | 756 | ||
diff --git a/drivers/net/phy/sfp-bus.c b/drivers/net/phy/sfp-bus.c index 0381da78d228..fd6c23f69c2f 100644 --- a/drivers/net/phy/sfp-bus.c +++ b/drivers/net/phy/sfp-bus.c | |||
| @@ -125,7 +125,7 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, | |||
| 125 | if (id->base.br_nominal) { | 125 | if (id->base.br_nominal) { |
| 126 | if (id->base.br_nominal != 255) { | 126 | if (id->base.br_nominal != 255) { |
| 127 | br_nom = id->base.br_nominal * 100; | 127 | br_nom = id->base.br_nominal * 100; |
| 128 | br_min = br_nom + id->base.br_nominal * id->ext.br_min; | 128 | br_min = br_nom - id->base.br_nominal * id->ext.br_min; |
| 129 | br_max = br_nom + id->base.br_nominal * id->ext.br_max; | 129 | br_max = br_nom + id->base.br_nominal * id->ext.br_max; |
| 130 | } else if (id->ext.br_max) { | 130 | } else if (id->ext.br_max) { |
| 131 | br_nom = 250 * id->ext.br_max; | 131 | br_nom = 250 * id->ext.br_max; |
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 96d26cfae90b..4a017a0d71ea 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
| @@ -3236,6 +3236,7 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info) | |||
| 3236 | GENL_SET_ERR_MSG(info,"MAC is no valid source addr"); | 3236 | GENL_SET_ERR_MSG(info,"MAC is no valid source addr"); |
| 3237 | NL_SET_BAD_ATTR(info->extack, | 3237 | NL_SET_BAD_ATTR(info->extack, |
| 3238 | info->attrs[HWSIM_ATTR_PERM_ADDR]); | 3238 | info->attrs[HWSIM_ATTR_PERM_ADDR]); |
| 3239 | kfree(hwname); | ||
| 3239 | return -EINVAL; | 3240 | return -EINVAL; |
| 3240 | } | 3241 | } |
| 3241 | 3242 | ||
