mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Pull networking fixes from Jakub Kicinski: - fix failure to add bond interfaces to a bridge, the offload-handling code was too defensive there and recent refactoring unearthed that. Users complained (Ido) - fix unnecessarily reflecting ECN bits within TOS values / QoS marking in TCP ACK and reset packets (Wei) - fix a deadlock with bpf iterator. Hopefully we're in the clear on this front now... (Yonghong) - BPF fix for clobbering r2 in bpf_gen_ld_abs (Daniel) - fix AQL on mt76 devices with FW rate control and add a couple of AQL issues in mac80211 code (Felix) - fix authentication issue with mwifiex (Maximilian) - WiFi connectivity fix: revert IGTK support in ti/wlcore (Mauro) - fix exception handling for multipath routes via same device (David Ahern) - revert back to a BH spin lock flavor for nsid_lock: there are paths which do require the BH context protection (Taehee) - fix interrupt / queue / NAPI handling in the lantiq driver (Hauke) - fix ife module load deadlock (Cong) - make an adjustment to netlink reply message type for code added in this release (the sole change touching uAPI here) (Michal) - a number of fixes for small NXP and Microchip switches (Vladimir) [ Pull request acked by David: "you can expect more of this in the future as I try to delegate more things to Jakub" ] * git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net: (167 commits) net: mscc: ocelot: fix some key offsets for IP4_TCP_UDP VCAP IS2 entries net: dsa: seville: fix some key offsets for IP4_TCP_UDP VCAP IS2 entries net: dsa: felix: fix some key offsets for IP4_TCP_UDP VCAP IS2 entries inet_diag: validate INET_DIAG_REQ_PROTOCOL attribute net: bridge: br_vlan_get_pvid_rcu() should dereference the VLAN group under RCU net: Update MAINTAINERS for MediaTek switch driver net/mlx5e: mlx5e_fec_in_caps() returns a boolean net/mlx5e: kTLS, Avoid kzalloc(GFP_KERNEL) under spinlock net/mlx5e: kTLS, Fix leak on resync error flow net/mlx5e: kTLS, Add missing dma_unmap in RX resync net/mlx5e: kTLS, Fix napi sync and possible use-after-free net/mlx5e: TLS, Do not expose FPGA TLS counter if not supported net/mlx5e: Fix using wrong stats_grps in mlx5e_update_ndo_stats() net/mlx5e: Fix multicast counter not up-to-date in "ip -s" net/mlx5e: Fix endianness when calculating pedit mask first bit net/mlx5e: Enable adding peer miss rules only if merged eswitch is supported net/mlx5e: CT: Fix freeing ct_label mapping net/mlx5e: Fix memory leak of tunnel info when rule under multipath not ready net/mlx5e: Use synchronize_rcu to sync with NAPI net/mlx5e: Use RCU to protect rq->xdp_prog ...
This commit is contained in:
@@ -182,9 +182,6 @@ in the order of reservations, but only after all previous records where
|
||||
already committed. It is thus possible for slow producers to temporarily hold
|
||||
off submitted records, that were reserved later.
|
||||
|
||||
Reservation/commit/consumer protocol is verified by litmus tests in
|
||||
Documentation/litmus_tests/bpf-rb/_.
|
||||
|
||||
One interesting implementation bit, that significantly simplifies (and thus
|
||||
speeds up as well) implementation of both producers and consumers is how data
|
||||
area is mapped twice contiguously back-to-back in the virtual memory. This
|
||||
@@ -200,7 +197,7 @@ a self-pacing notifications of new data being availability.
|
||||
being available after commit only if consumer has already caught up right up to
|
||||
the record being committed. If not, consumer still has to catch up and thus
|
||||
will see new data anyways without needing an extra poll notification.
|
||||
Benchmarks (see tools/testing/selftests/bpf/benchs/bench_ringbuf.c_) show that
|
||||
Benchmarks (see tools/testing/selftests/bpf/benchs/bench_ringbufs.c) show that
|
||||
this allows to achieve a very high throughput without having to resort to
|
||||
tricks like "notify only every Nth sample", which are necessary with perf
|
||||
buffer. For extreme cases, when BPF program wants more manual control of
|
||||
|
||||
@@ -206,6 +206,7 @@ Userspace to kernel:
|
||||
``ETHTOOL_MSG_TSINFO_GET`` get timestamping info
|
||||
``ETHTOOL_MSG_CABLE_TEST_ACT`` action start cable test
|
||||
``ETHTOOL_MSG_CABLE_TEST_TDR_ACT`` action start raw TDR cable test
|
||||
``ETHTOOL_MSG_TUNNEL_INFO_GET`` get tunnel offload info
|
||||
===================================== ================================
|
||||
|
||||
Kernel to userspace:
|
||||
@@ -239,6 +240,7 @@ Kernel to userspace:
|
||||
``ETHTOOL_MSG_TSINFO_GET_REPLY`` timestamping info
|
||||
``ETHTOOL_MSG_CABLE_TEST_NTF`` Cable test results
|
||||
``ETHTOOL_MSG_CABLE_TEST_TDR_NTF`` Cable test TDR results
|
||||
``ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY`` tunnel offload info
|
||||
===================================== =================================
|
||||
|
||||
``GET`` requests are sent by userspace applications to retrieve device
|
||||
@@ -1363,4 +1365,5 @@ are netlink only.
|
||||
``ETHTOOL_SFECPARAM`` n/a
|
||||
n/a ''ETHTOOL_MSG_CABLE_TEST_ACT''
|
||||
n/a ''ETHTOOL_MSG_CABLE_TEST_TDR_ACT''
|
||||
n/a ``ETHTOOL_MSG_TUNNEL_INFO_GET``
|
||||
=================================== =====================================
|
||||
|
||||
15
MAINTAINERS
15
MAINTAINERS
@@ -4408,12 +4408,6 @@ T: git git://git.infradead.org/users/hch/configfs.git
|
||||
F: fs/configfs/
|
||||
F: include/linux/configfs.h
|
||||
|
||||
CONNECTOR
|
||||
M: Evgeniy Polyakov <zbr@ioremap.net>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/connector/
|
||||
|
||||
CONSOLE SUBSYSTEM
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
S: Supported
|
||||
@@ -8329,8 +8323,9 @@ S: Supported
|
||||
F: drivers/pci/hotplug/rpaphp*
|
||||
|
||||
IBM Power SRIOV Virtual NIC Device Driver
|
||||
M: Thomas Falcon <tlfalcon@linux.ibm.com>
|
||||
M: John Allen <jallen@linux.ibm.com>
|
||||
M: Dany Madden <drt@linux.ibm.com>
|
||||
M: Lijun Pan <ljp@linux.ibm.com>
|
||||
M: Sukadev Bhattiprolu <sukadev@linux.ibm.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/ibm/ibmvnic.*
|
||||
@@ -8344,7 +8339,7 @@ F: arch/powerpc/platforms/powernv/copy-paste.h
|
||||
F: arch/powerpc/platforms/powernv/vas*
|
||||
|
||||
IBM Power Virtual Ethernet Device Driver
|
||||
M: Thomas Falcon <tlfalcon@linux.ibm.com>
|
||||
M: Cristobal Forno <cforno12@linux.ibm.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/ibm/ibmveth.*
|
||||
@@ -11042,6 +11037,7 @@ F: drivers/char/hw_random/mtk-rng.c
|
||||
|
||||
MEDIATEK SWITCH DRIVER
|
||||
M: Sean Wang <sean.wang@mediatek.com>
|
||||
M: Landen Chao <Landen.Chao@mediatek.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/dsa/mt7530.*
|
||||
@@ -12055,6 +12051,7 @@ Q: http://patchwork.ozlabs.org/project/netdev/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
|
||||
F: Documentation/devicetree/bindings/net/
|
||||
F: drivers/connector/
|
||||
F: drivers/net/
|
||||
F: include/linux/etherdevice.h
|
||||
F: include/linux/fcdevice.h
|
||||
|
||||
@@ -116,7 +116,6 @@
|
||||
switch0: ksz8563@0 {
|
||||
compatible = "microchip,ksz8563";
|
||||
reg = <0>;
|
||||
phy-mode = "mii";
|
||||
reset-gpios = <&pioA PIN_PD4 GPIO_ACTIVE_LOW>;
|
||||
|
||||
spi-max-frequency = <500000>;
|
||||
@@ -140,6 +139,7 @@
|
||||
reg = <2>;
|
||||
label = "cpu";
|
||||
ethernet = <&macb0>;
|
||||
phy-mode = "mii";
|
||||
fixed-link {
|
||||
speed = <100>;
|
||||
full-duplex;
|
||||
|
||||
@@ -2224,7 +2224,7 @@ static int eni_init_one(struct pci_dev *pci_dev,
|
||||
|
||||
rc = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(32));
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
goto err_disable;
|
||||
|
||||
rc = -ENOMEM;
|
||||
eni_dev = kmalloc(sizeof(struct eni_dev), GFP_KERNEL);
|
||||
|
||||
@@ -932,11 +932,19 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
||||
ksz_port_cfg(dev, port, P_PRIO_CTRL, PORT_802_1P_ENABLE, true);
|
||||
|
||||
if (cpu_port) {
|
||||
if (!p->interface && dev->compat_interface) {
|
||||
dev_warn(dev->dev,
|
||||
"Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
|
||||
"Please update your device tree.\n",
|
||||
port);
|
||||
p->interface = dev->compat_interface;
|
||||
}
|
||||
|
||||
/* Configure MII interface for proper network communication. */
|
||||
ksz_read8(dev, REG_PORT_5_CTRL_6, &data8);
|
||||
data8 &= ~PORT_INTERFACE_TYPE;
|
||||
data8 &= ~PORT_GMII_1GPS_MODE;
|
||||
switch (dev->interface) {
|
||||
switch (p->interface) {
|
||||
case PHY_INTERFACE_MODE_MII:
|
||||
p->phydev.speed = SPEED_100;
|
||||
break;
|
||||
@@ -952,11 +960,11 @@ static void ksz8795_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
||||
default:
|
||||
data8 &= ~PORT_RGMII_ID_IN_ENABLE;
|
||||
data8 &= ~PORT_RGMII_ID_OUT_ENABLE;
|
||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
dev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||
data8 |= PORT_RGMII_ID_IN_ENABLE;
|
||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
dev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||
data8 |= PORT_RGMII_ID_OUT_ENABLE;
|
||||
data8 |= PORT_GMII_1GPS_MODE;
|
||||
data8 |= PORT_INTERFACE_RGMII;
|
||||
@@ -1252,7 +1260,7 @@ static int ksz8795_switch_init(struct ksz_device *dev)
|
||||
}
|
||||
|
||||
/* set the real number of ports */
|
||||
dev->ds->num_ports = dev->port_cnt;
|
||||
dev->ds->num_ports = dev->port_cnt + 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1208,7 +1208,7 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
||||
|
||||
/* configure MAC to 1G & RGMII mode */
|
||||
ksz_pread8(dev, port, REG_PORT_XMII_CTRL_1, &data8);
|
||||
switch (dev->interface) {
|
||||
switch (p->interface) {
|
||||
case PHY_INTERFACE_MODE_MII:
|
||||
ksz9477_set_xmii(dev, 0, &data8);
|
||||
ksz9477_set_gbit(dev, false, &data8);
|
||||
@@ -1229,11 +1229,11 @@ static void ksz9477_port_setup(struct ksz_device *dev, int port, bool cpu_port)
|
||||
ksz9477_set_gbit(dev, true, &data8);
|
||||
data8 &= ~PORT_RGMII_ID_IG_ENABLE;
|
||||
data8 &= ~PORT_RGMII_ID_EG_ENABLE;
|
||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
dev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
p->interface == PHY_INTERFACE_MODE_RGMII_RXID)
|
||||
data8 |= PORT_RGMII_ID_IG_ENABLE;
|
||||
if (dev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
dev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||
if (p->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
p->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||
data8 |= PORT_RGMII_ID_EG_ENABLE;
|
||||
p->phydev.speed = SPEED_1000;
|
||||
break;
|
||||
@@ -1269,23 +1269,32 @@ static void ksz9477_config_cpu_port(struct dsa_switch *ds)
|
||||
dev->cpu_port = i;
|
||||
dev->host_mask = (1 << dev->cpu_port);
|
||||
dev->port_mask |= dev->host_mask;
|
||||
p = &dev->ports[i];
|
||||
|
||||
/* Read from XMII register to determine host port
|
||||
* interface. If set specifically in device tree
|
||||
* note the difference to help debugging.
|
||||
*/
|
||||
interface = ksz9477_get_interface(dev, i);
|
||||
if (!dev->interface)
|
||||
dev->interface = interface;
|
||||
if (interface && interface != dev->interface)
|
||||
if (!p->interface) {
|
||||
if (dev->compat_interface) {
|
||||
dev_warn(dev->dev,
|
||||
"Using legacy switch \"phy-mode\" property, because it is missing on port %d node. "
|
||||
"Please update your device tree.\n",
|
||||
i);
|
||||
p->interface = dev->compat_interface;
|
||||
} else {
|
||||
p->interface = interface;
|
||||
}
|
||||
}
|
||||
if (interface && interface != p->interface)
|
||||
dev_info(dev->dev,
|
||||
"use %s instead of %s\n",
|
||||
phy_modes(dev->interface),
|
||||
phy_modes(p->interface),
|
||||
phy_modes(interface));
|
||||
|
||||
/* enable cpu port */
|
||||
ksz9477_port_setup(dev, i, true);
|
||||
p = &dev->ports[dev->cpu_port];
|
||||
p->vid_member = dev->port_mask;
|
||||
p->on = 1;
|
||||
}
|
||||
|
||||
@@ -388,6 +388,8 @@ int ksz_switch_register(struct ksz_device *dev,
|
||||
const struct ksz_dev_ops *ops)
|
||||
{
|
||||
phy_interface_t interface;
|
||||
struct device_node *port;
|
||||
unsigned int port_num;
|
||||
int ret;
|
||||
|
||||
if (dev->pdata)
|
||||
@@ -421,10 +423,19 @@ int ksz_switch_register(struct ksz_device *dev,
|
||||
/* Host port interface will be self detected, or specifically set in
|
||||
* device tree.
|
||||
*/
|
||||
for (port_num = 0; port_num < dev->port_cnt; ++port_num)
|
||||
dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA;
|
||||
if (dev->dev->of_node) {
|
||||
ret = of_get_phy_mode(dev->dev->of_node, &interface);
|
||||
if (ret == 0)
|
||||
dev->interface = interface;
|
||||
dev->compat_interface = interface;
|
||||
for_each_available_child_of_node(dev->dev->of_node, port) {
|
||||
if (of_property_read_u32(port, "reg", &port_num))
|
||||
continue;
|
||||
if (port_num >= dev->port_cnt)
|
||||
return -EINVAL;
|
||||
of_get_phy_mode(port, &dev->ports[port_num].interface);
|
||||
}
|
||||
dev->synclko_125 = of_property_read_bool(dev->dev->of_node,
|
||||
"microchip,synclko-125");
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ struct ksz_port {
|
||||
u32 freeze:1; /* MIB counter freeze is enabled */
|
||||
|
||||
struct ksz_port_mib mib;
|
||||
phy_interface_t interface;
|
||||
};
|
||||
|
||||
struct ksz_device {
|
||||
@@ -72,7 +73,7 @@ struct ksz_device {
|
||||
int mib_cnt;
|
||||
int mib_port_cnt;
|
||||
int last_port; /* ports after that not used */
|
||||
phy_interface_t interface;
|
||||
phy_interface_t compat_interface;
|
||||
u32 regs_size;
|
||||
bool phy_errata_9477;
|
||||
bool synclko_125;
|
||||
|
||||
@@ -585,7 +585,10 @@ static int felix_setup(struct dsa_switch *ds)
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ocelot_init(ocelot);
|
||||
err = ocelot_init(ocelot);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (ocelot->ptp) {
|
||||
err = ocelot_init_timestamp(ocelot, &ocelot_ptp_clock_info);
|
||||
if (err) {
|
||||
@@ -640,10 +643,13 @@ static void felix_teardown(struct dsa_switch *ds)
|
||||
{
|
||||
struct ocelot *ocelot = ds->priv;
|
||||
struct felix *felix = ocelot_to_felix(ocelot);
|
||||
int port;
|
||||
|
||||
if (felix->info->mdio_bus_free)
|
||||
felix->info->mdio_bus_free(ocelot);
|
||||
|
||||
for (port = 0; port < ocelot->num_phys_ports; port++)
|
||||
ocelot_deinit_port(ocelot, port);
|
||||
ocelot_deinit_timestamp(ocelot);
|
||||
/* stop workqueue thread */
|
||||
ocelot_deinit(ocelot);
|
||||
|
||||
@@ -645,17 +645,17 @@ static struct vcap_field vsc9959_vcap_is2_keys[] = {
|
||||
[VCAP_IS2_HK_DIP_EQ_SIP] = {118, 1},
|
||||
/* IP4_TCP_UDP (TYPE=100) */
|
||||
[VCAP_IS2_HK_TCP] = {119, 1},
|
||||
[VCAP_IS2_HK_L4_SPORT] = {120, 16},
|
||||
[VCAP_IS2_HK_L4_DPORT] = {136, 16},
|
||||
[VCAP_IS2_HK_L4_DPORT] = {120, 16},
|
||||
[VCAP_IS2_HK_L4_SPORT] = {136, 16},
|
||||
[VCAP_IS2_HK_L4_RNG] = {152, 8},
|
||||
[VCAP_IS2_HK_L4_SPORT_EQ_DPORT] = {160, 1},
|
||||
[VCAP_IS2_HK_L4_SEQUENCE_EQ0] = {161, 1},
|
||||
[VCAP_IS2_HK_L4_URG] = {162, 1},
|
||||
[VCAP_IS2_HK_L4_ACK] = {163, 1},
|
||||
[VCAP_IS2_HK_L4_PSH] = {164, 1},
|
||||
[VCAP_IS2_HK_L4_RST] = {165, 1},
|
||||
[VCAP_IS2_HK_L4_SYN] = {166, 1},
|
||||
[VCAP_IS2_HK_L4_FIN] = {167, 1},
|
||||
[VCAP_IS2_HK_L4_FIN] = {162, 1},
|
||||
[VCAP_IS2_HK_L4_SYN] = {163, 1},
|
||||
[VCAP_IS2_HK_L4_RST] = {164, 1},
|
||||
[VCAP_IS2_HK_L4_PSH] = {165, 1},
|
||||
[VCAP_IS2_HK_L4_ACK] = {166, 1},
|
||||
[VCAP_IS2_HK_L4_URG] = {167, 1},
|
||||
[VCAP_IS2_HK_L4_1588_DOM] = {168, 8},
|
||||
[VCAP_IS2_HK_L4_1588_VER] = {176, 4},
|
||||
/* IP4_OTHER (TYPE=101) */
|
||||
|
||||
@@ -659,17 +659,17 @@ static struct vcap_field vsc9953_vcap_is2_keys[] = {
|
||||
[VCAP_IS2_HK_DIP_EQ_SIP] = {122, 1},
|
||||
/* IP4_TCP_UDP (TYPE=100) */
|
||||
[VCAP_IS2_HK_TCP] = {123, 1},
|
||||
[VCAP_IS2_HK_L4_SPORT] = {124, 16},
|
||||
[VCAP_IS2_HK_L4_DPORT] = {140, 16},
|
||||
[VCAP_IS2_HK_L4_DPORT] = {124, 16},
|
||||
[VCAP_IS2_HK_L4_SPORT] = {140, 16},
|
||||
[VCAP_IS2_HK_L4_RNG] = {156, 8},
|
||||
[VCAP_IS2_HK_L4_SPORT_EQ_DPORT] = {164, 1},
|
||||
[VCAP_IS2_HK_L4_SEQUENCE_EQ0] = {165, 1},
|
||||
[VCAP_IS2_HK_L4_URG] = {166, 1},
|
||||
[VCAP_IS2_HK_L4_ACK] = {167, 1},
|
||||
[VCAP_IS2_HK_L4_PSH] = {168, 1},
|
||||
[VCAP_IS2_HK_L4_RST] = {169, 1},
|
||||
[VCAP_IS2_HK_L4_SYN] = {170, 1},
|
||||
[VCAP_IS2_HK_L4_FIN] = {171, 1},
|
||||
[VCAP_IS2_HK_L4_FIN] = {166, 1},
|
||||
[VCAP_IS2_HK_L4_SYN] = {167, 1},
|
||||
[VCAP_IS2_HK_L4_RST] = {168, 1},
|
||||
[VCAP_IS2_HK_L4_PSH] = {169, 1},
|
||||
[VCAP_IS2_HK_L4_ACK] = {170, 1},
|
||||
[VCAP_IS2_HK_L4_URG] = {171, 1},
|
||||
/* IP4_OTHER (TYPE=101) */
|
||||
[VCAP_IS2_HK_IP4_L3_PROTO] = {123, 8},
|
||||
[VCAP_IS2_HK_L3_PAYLOAD] = {131, 56},
|
||||
@@ -1008,7 +1008,7 @@ static const struct felix_info seville_info_vsc9953 = {
|
||||
.vcap_is2_keys = vsc9953_vcap_is2_keys,
|
||||
.vcap_is2_actions = vsc9953_vcap_is2_actions,
|
||||
.vcap = vsc9953_vcap_props,
|
||||
.shared_queue_sz = 128 * 1024,
|
||||
.shared_queue_sz = 2048 * 1024,
|
||||
.num_mact_rows = 2048,
|
||||
.num_ports = 10,
|
||||
.mdio_bus_alloc = vsc9953_mdio_bus_alloc,
|
||||
|
||||
@@ -452,13 +452,19 @@ int rtl8366_vlan_del(struct dsa_switch *ds, int port,
|
||||
return ret;
|
||||
|
||||
if (vid == vlanmc.vid) {
|
||||
/* clear VLAN member configurations */
|
||||
vlanmc.vid = 0;
|
||||
vlanmc.priority = 0;
|
||||
vlanmc.member = 0;
|
||||
vlanmc.untag = 0;
|
||||
vlanmc.fid = 0;
|
||||
|
||||
/* Remove this port from the VLAN */
|
||||
vlanmc.member &= ~BIT(port);
|
||||
vlanmc.untag &= ~BIT(port);
|
||||
/*
|
||||
* If no ports are members of this VLAN
|
||||
* anymore then clear the whole member
|
||||
* config so it can be reused.
|
||||
*/
|
||||
if (!vlanmc.member && vlanmc.untag) {
|
||||
vlanmc.vid = 0;
|
||||
vlanmc.priority = 0;
|
||||
vlanmc.fid = 0;
|
||||
}
|
||||
ret = smi->ops->set_vlan_mc(smi, i, &vlanmc);
|
||||
if (ret) {
|
||||
dev_err(smi->dev,
|
||||
|
||||
@@ -3782,6 +3782,7 @@ static int bnxt_hwrm_func_qstat_ext(struct bnxt *bp,
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FUNC_QSTATS_EXT, -1, -1);
|
||||
req.fid = cpu_to_le16(0xffff);
|
||||
req.flags = FUNC_QSTATS_EXT_REQ_FLAGS_COUNTER_MASK;
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
@@ -3852,7 +3853,7 @@ static void bnxt_init_stats(struct bnxt *bp)
|
||||
tx_masks = stats->hw_masks;
|
||||
tx_count = sizeof(struct tx_port_stats_ext) / 8;
|
||||
|
||||
flags = FUNC_QSTATS_EXT_REQ_FLAGS_COUNTER_MASK;
|
||||
flags = PORT_QSTATS_EXT_REQ_FLAGS_COUNTER_MASK;
|
||||
rc = bnxt_hwrm_port_qstats_ext(bp, flags);
|
||||
if (rc) {
|
||||
mask = (1ULL << 40) - 1;
|
||||
@@ -4305,7 +4306,7 @@ static int bnxt_hwrm_do_send_msg(struct bnxt *bp, void *msg, u32 msg_len,
|
||||
u32 bar_offset = BNXT_GRCPF_REG_CHIMP_COMM;
|
||||
u16 dst = BNXT_HWRM_CHNL_CHIMP;
|
||||
|
||||
if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
||||
if (BNXT_NO_FW_ACCESS(bp))
|
||||
return -EBUSY;
|
||||
|
||||
if (msg_len > BNXT_HWRM_MAX_REQ_LEN) {
|
||||
@@ -5723,7 +5724,7 @@ static int hwrm_ring_free_send_msg(struct bnxt *bp,
|
||||
struct hwrm_ring_free_output *resp = bp->hwrm_cmd_resp_addr;
|
||||
u16 error_code;
|
||||
|
||||
if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
||||
if (BNXT_NO_FW_ACCESS(bp))
|
||||
return 0;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_RING_FREE, cmpl_ring_id, -1);
|
||||
@@ -7817,7 +7818,7 @@ static int bnxt_set_tpa(struct bnxt *bp, bool set_tpa)
|
||||
|
||||
if (set_tpa)
|
||||
tpa_flags = bp->flags & BNXT_FLAG_TPA;
|
||||
else if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
|
||||
else if (BNXT_NO_FW_ACCESS(bp))
|
||||
return 0;
|
||||
for (i = 0; i < bp->nr_vnics; i++) {
|
||||
rc = bnxt_hwrm_vnic_set_tpa(bp, i, tpa_flags);
|
||||
@@ -9311,18 +9312,16 @@ static ssize_t bnxt_show_temp(struct device *dev,
|
||||
struct hwrm_temp_monitor_query_output *resp;
|
||||
struct bnxt *bp = dev_get_drvdata(dev);
|
||||
u32 len = 0;
|
||||
int rc;
|
||||
|
||||
resp = bp->hwrm_cmd_resp_addr;
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_TEMP_MONITOR_QUERY, -1, -1);
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
if (!_hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT))
|
||||
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
if (!rc)
|
||||
len = sprintf(buf, "%u\n", resp->temp * 1000); /* display millidegree */
|
||||
mutex_unlock(&bp->hwrm_cmd_lock);
|
||||
|
||||
if (len)
|
||||
return len;
|
||||
|
||||
return sprintf(buf, "unknown\n");
|
||||
return rc ?: len;
|
||||
}
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, 0444, bnxt_show_temp, NULL, 0);
|
||||
|
||||
@@ -9342,7 +9341,16 @@ static void bnxt_hwmon_close(struct bnxt *bp)
|
||||
|
||||
static void bnxt_hwmon_open(struct bnxt *bp)
|
||||
{
|
||||
struct hwrm_temp_monitor_query_input req = {0};
|
||||
struct pci_dev *pdev = bp->pdev;
|
||||
int rc;
|
||||
|
||||
bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_TEMP_MONITOR_QUERY, -1, -1);
|
||||
rc = hwrm_send_message_silent(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
if (rc == -EACCES || rc == -EOPNOTSUPP) {
|
||||
bnxt_hwmon_close(bp);
|
||||
return;
|
||||
}
|
||||
|
||||
if (bp->hwmon_dev)
|
||||
return;
|
||||
@@ -11779,6 +11787,10 @@ static void bnxt_remove_one(struct pci_dev *pdev)
|
||||
if (BNXT_PF(bp))
|
||||
bnxt_sriov_disable(bp);
|
||||
|
||||
clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
||||
bnxt_cancel_sp_work(bp);
|
||||
bp->sp_event = 0;
|
||||
|
||||
bnxt_dl_fw_reporters_destroy(bp, true);
|
||||
if (BNXT_PF(bp))
|
||||
devlink_port_type_clear(&bp->dl_port);
|
||||
@@ -11786,9 +11798,6 @@ static void bnxt_remove_one(struct pci_dev *pdev)
|
||||
unregister_netdev(dev);
|
||||
bnxt_dl_unregister(bp);
|
||||
bnxt_shutdown_tc(bp);
|
||||
clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
|
||||
bnxt_cancel_sp_work(bp);
|
||||
bp->sp_event = 0;
|
||||
|
||||
bnxt_clear_int_mode(bp);
|
||||
bnxt_hwrm_func_drv_unrgtr(bp);
|
||||
@@ -12089,7 +12098,7 @@ static int bnxt_init_mac_addr(struct bnxt *bp)
|
||||
static void bnxt_vpd_read_info(struct bnxt *bp)
|
||||
{
|
||||
struct pci_dev *pdev = bp->pdev;
|
||||
int i, len, pos, ro_size;
|
||||
int i, len, pos, ro_size, size;
|
||||
ssize_t vpd_size;
|
||||
u8 *vpd_data;
|
||||
|
||||
@@ -12124,7 +12133,8 @@ static void bnxt_vpd_read_info(struct bnxt *bp)
|
||||
if (len + pos > vpd_size)
|
||||
goto read_sn;
|
||||
|
||||
strlcpy(bp->board_partno, &vpd_data[pos], min(len, BNXT_VPD_FLD_LEN));
|
||||
size = min(len, BNXT_VPD_FLD_LEN - 1);
|
||||
memcpy(bp->board_partno, &vpd_data[pos], size);
|
||||
|
||||
read_sn:
|
||||
pos = pci_vpd_find_info_keyword(vpd_data, i, ro_size,
|
||||
@@ -12137,7 +12147,8 @@ read_sn:
|
||||
if (len + pos > vpd_size)
|
||||
goto exit;
|
||||
|
||||
strlcpy(bp->board_serialno, &vpd_data[pos], min(len, BNXT_VPD_FLD_LEN));
|
||||
size = min(len, BNXT_VPD_FLD_LEN - 1);
|
||||
memcpy(bp->board_serialno, &vpd_data[pos], size);
|
||||
exit:
|
||||
kfree(vpd_data);
|
||||
}
|
||||
|
||||
@@ -1737,6 +1737,10 @@ struct bnxt {
|
||||
#define BNXT_STATE_FW_FATAL_COND 6
|
||||
#define BNXT_STATE_DRV_REGISTERED 7
|
||||
|
||||
#define BNXT_NO_FW_ACCESS(bp) \
|
||||
(test_bit(BNXT_STATE_FW_FATAL_COND, &(bp)->state) || \
|
||||
pci_channel_offline((bp)->pdev))
|
||||
|
||||
struct bnxt_irq *irq_tbl;
|
||||
int total_irqs;
|
||||
u8 mac_addr[ETH_ALEN];
|
||||
|
||||
@@ -1322,6 +1322,9 @@ static int bnxt_get_regs_len(struct net_device *dev)
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
int reg_len;
|
||||
|
||||
if (!BNXT_PF(bp))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
reg_len = BNXT_PXP_REG_LEN;
|
||||
|
||||
if (bp->fw_cap & BNXT_FW_CAP_PCIE_STATS_SUPPORTED)
|
||||
@@ -1788,9 +1791,12 @@ static int bnxt_set_pauseparam(struct net_device *dev,
|
||||
if (!BNXT_PHY_CFG_ABLE(bp))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&bp->link_lock);
|
||||
if (epause->autoneg) {
|
||||
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED))
|
||||
return -EINVAL;
|
||||
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
|
||||
rc = -EINVAL;
|
||||
goto pause_exit;
|
||||
}
|
||||
|
||||
link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
|
||||
if (bp->hwrm_spec_code >= 0x10201)
|
||||
@@ -1811,11 +1817,11 @@ static int bnxt_set_pauseparam(struct net_device *dev,
|
||||
if (epause->tx_pause)
|
||||
link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_TX;
|
||||
|
||||
if (netif_running(dev)) {
|
||||
mutex_lock(&bp->link_lock);
|
||||
if (netif_running(dev))
|
||||
rc = bnxt_hwrm_set_pause(bp);
|
||||
mutex_unlock(&bp->link_lock);
|
||||
}
|
||||
|
||||
pause_exit:
|
||||
mutex_unlock(&bp->link_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -2552,8 +2558,7 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata)
|
||||
struct bnxt *bp = netdev_priv(dev);
|
||||
struct ethtool_eee *eee = &bp->eee;
|
||||
struct bnxt_link_info *link_info = &bp->link_info;
|
||||
u32 advertising =
|
||||
_bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
|
||||
u32 advertising;
|
||||
int rc = 0;
|
||||
|
||||
if (!BNXT_PHY_CFG_ABLE(bp))
|
||||
@@ -2562,19 +2567,23 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata)
|
||||
if (!(bp->flags & BNXT_FLAG_EEE_CAP))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&bp->link_lock);
|
||||
advertising = _bnxt_fw_to_ethtool_adv_spds(link_info->advertising, 0);
|
||||
if (!edata->eee_enabled)
|
||||
goto eee_ok;
|
||||
|
||||
if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
|
||||
netdev_warn(dev, "EEE requires autoneg\n");
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto eee_exit;
|
||||
}
|
||||
if (edata->tx_lpi_enabled) {
|
||||
if (bp->lpi_tmr_hi && (edata->tx_lpi_timer > bp->lpi_tmr_hi ||
|
||||
edata->tx_lpi_timer < bp->lpi_tmr_lo)) {
|
||||
netdev_warn(dev, "Valid LPI timer range is %d and %d microsecs\n",
|
||||
bp->lpi_tmr_lo, bp->lpi_tmr_hi);
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto eee_exit;
|
||||
} else if (!bp->lpi_tmr_hi) {
|
||||
edata->tx_lpi_timer = eee->tx_lpi_timer;
|
||||
}
|
||||
@@ -2584,7 +2593,8 @@ static int bnxt_set_eee(struct net_device *dev, struct ethtool_eee *edata)
|
||||
} else if (edata->advertised & ~advertising) {
|
||||
netdev_warn(dev, "EEE advertised %x must be a subset of autoneg advertised speeds %x\n",
|
||||
edata->advertised, advertising);
|
||||
return -EINVAL;
|
||||
rc = -EINVAL;
|
||||
goto eee_exit;
|
||||
}
|
||||
|
||||
eee->advertised = edata->advertised;
|
||||
@@ -2596,6 +2606,8 @@ eee_ok:
|
||||
if (netif_running(dev))
|
||||
rc = bnxt_hwrm_set_link_setting(bp, false, true);
|
||||
|
||||
eee_exit:
|
||||
mutex_unlock(&bp->link_lock);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
||||
@@ -647,8 +647,7 @@ static void macb_mac_link_up(struct phylink_config *config,
|
||||
ctrl |= GEM_BIT(GBE);
|
||||
}
|
||||
|
||||
/* We do not support MLO_PAUSE_RX yet */
|
||||
if (tx_pause)
|
||||
if (rx_pause)
|
||||
ctrl |= MACB_BIT(PAE);
|
||||
|
||||
macb_set_tx_clk(bp->tx_clk, speed, ndev);
|
||||
|
||||
@@ -1911,13 +1911,16 @@ out:
|
||||
static int configure_filter_tcb(struct adapter *adap, unsigned int tid,
|
||||
struct filter_entry *f)
|
||||
{
|
||||
if (f->fs.hitcnts)
|
||||
if (f->fs.hitcnts) {
|
||||
set_tcb_field(adap, f, tid, TCB_TIMESTAMP_W,
|
||||
TCB_TIMESTAMP_V(TCB_TIMESTAMP_M) |
|
||||
TCB_TIMESTAMP_V(TCB_TIMESTAMP_M),
|
||||
TCB_TIMESTAMP_V(0ULL),
|
||||
1);
|
||||
set_tcb_field(adap, f, tid, TCB_RTT_TS_RECENT_AGE_W,
|
||||
TCB_RTT_TS_RECENT_AGE_V(TCB_RTT_TS_RECENT_AGE_M),
|
||||
TCB_TIMESTAMP_V(0ULL) |
|
||||
TCB_RTT_TS_RECENT_AGE_V(0ULL),
|
||||
1);
|
||||
}
|
||||
|
||||
if (f->fs.newdmac)
|
||||
set_tcb_tflag(adap, f, tid, TF_CCTRL_ECE_S, 1,
|
||||
|
||||
@@ -229,7 +229,7 @@ void cxgb4_free_mps_ref_entries(struct adapter *adap)
|
||||
{
|
||||
struct mps_entries_ref *mps_entry, *tmp;
|
||||
|
||||
if (!list_empty(&adap->mps_ref))
|
||||
if (list_empty(&adap->mps_ref))
|
||||
return;
|
||||
|
||||
spin_lock(&adap->mps_ref_lock);
|
||||
|
||||
@@ -85,7 +85,7 @@ MODULE_PARM_DESC (rx_copybreak, "de2104x Breakpoint at which Rx packets are copi
|
||||
#define DSL CONFIG_DE2104X_DSL
|
||||
#endif
|
||||
|
||||
#define DE_RX_RING_SIZE 64
|
||||
#define DE_RX_RING_SIZE 128
|
||||
#define DE_TX_RING_SIZE 64
|
||||
#define DE_RING_BYTES \
|
||||
((sizeof(struct de_desc) * DE_RX_RING_SIZE) + \
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user