Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller: "Several bug fixes, many are quick merge-window regression cures: - When NLM_F_EXCL is not set, allow same fib rule insertion. From Hangbin Liu. - Several cures in sja1105 DSA driver (while loop exit condition fix, return of negative u8, etc.) from Vladimir Oltean. - Handle tx/rx delays in realtek PHY driver properly, from Serge Semin. - Double free in cls_matchall, from Pieter Jansen van Vuuren. - Disable SIOCSHWTSTAMP in macvlan/vlan containers, from Hangbin Liu. - Endainness fixes in aqc111, from Oliver Neukum. - Handle errors in packet_init properly, from Haibing Yue. - Various W=1 warning fixes in kTLS, from Jakub Kicinski" * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (34 commits) nfp: add missing kdoc net/tls: handle errors from padding_length() net/tls: remove set but not used variables docs/btf: fix the missing section marks nfp: bpf: fix static check error through tightening shift amount adjustment selftests: bpf: initialize bpf_object pointers where needed packet: Fix error path in packet_init net/tcp: use deferred jump label for TCP acked data hook net: aquantia: fix undefined devm_hwmon_device_register_with_info reference aqc111: fix double endianness swap on BE aqc111: fix writing to the phy on BE aqc111: fix endianness issue in aqc111_change_mtu vlan: disable SIOCSHWTSTAMP in container macvlan: disable SIOCSHWTSTAMP in container tipc: fix hanging clients using poll with EPOLLOUT flag tuntap: synchronize through tfiles array instead of tun->numqueues tuntap: fix dividing by zero in ebpf queue selection dwmac4_prog_mtl_tx_algorithms() missing write operation ptp_qoriq: fix NULL access if ptp dt node missing net/sched: avoid double free on matchall reoffload ...
This commit is contained in:
commit
601e6bcc4e
|
@ -578,6 +578,7 @@ For line_info, the line number and column number are defined as below:
|
|||
#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff)
|
||||
|
||||
3.4 BPF_{PROG,MAP}_GET_NEXT_ID
|
||||
==============================
|
||||
|
||||
In kernel, every loaded program, map or btf has a unique id. The id won't
|
||||
change during the lifetime of a program, map, or btf.
|
||||
|
@ -587,6 +588,7 @@ each command, to user space, for bpf program or maps, respectively, so an
|
|||
inspection tool can inspect all programs and maps.
|
||||
|
||||
3.5 BPF_{PROG,MAP}_GET_FD_BY_ID
|
||||
===============================
|
||||
|
||||
An introspection tool cannot use id to get details about program or maps.
|
||||
A file descriptor needs to be obtained first for reference-counting purpose.
|
||||
|
|
|
@ -1235,7 +1235,7 @@ static void gswip_port_fast_age(struct dsa_switch *ds, int port)
|
|||
|
||||
err = gswip_pce_table_entry_read(priv, &mac_bridge);
|
||||
if (err) {
|
||||
dev_err(priv->dev, "failed to read mac brigde: %d\n",
|
||||
dev_err(priv->dev, "failed to read mac bridge: %d\n",
|
||||
err);
|
||||
return;
|
||||
}
|
||||
|
@ -1252,7 +1252,7 @@ static void gswip_port_fast_age(struct dsa_switch *ds, int port)
|
|||
mac_bridge.valid = false;
|
||||
err = gswip_pce_table_entry_write(priv, &mac_bridge);
|
||||
if (err) {
|
||||
dev_err(priv->dev, "failed to write mac brigde: %d\n",
|
||||
dev_err(priv->dev, "failed to write mac bridge: %d\n",
|
||||
err);
|
||||
return;
|
||||
}
|
||||
|
@ -1328,7 +1328,7 @@ static int gswip_port_fdb(struct dsa_switch *ds, int port,
|
|||
|
||||
err = gswip_pce_table_entry_write(priv, &mac_bridge);
|
||||
if (err)
|
||||
dev_err(priv->dev, "failed to write mac brigde: %d\n", err);
|
||||
dev_err(priv->dev, "failed to write mac bridge: %d\n", err);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -1360,7 +1360,7 @@ static int gswip_port_fdb_dump(struct dsa_switch *ds, int port,
|
|||
|
||||
err = gswip_pce_table_entry_read(priv, &mac_bridge);
|
||||
if (err) {
|
||||
dev_err(priv->dev, "failed to write mac brigde: %d\n",
|
||||
dev_err(priv->dev, "failed to write mac bridge: %d\n",
|
||||
err);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -1070,7 +1070,11 @@ static u8 sja1105_stp_state_get(struct sja1105_private *priv, int port)
|
|||
return BR_STATE_LEARNING;
|
||||
if (mac[port].ingress && mac[port].egress && mac[port].dyn_learn)
|
||||
return BR_STATE_FORWARDING;
|
||||
return -EINVAL;
|
||||
/* This is really an error condition if the MAC was in none of the STP
|
||||
* states above. But treating the port as disabled does nothing, which
|
||||
* is adequate, and it also resets the MAC to a known state later on.
|
||||
*/
|
||||
return BR_STATE_DISABLED;
|
||||
}
|
||||
|
||||
/* For situations where we need to change a setting at runtime that is only
|
||||
|
|
|
@ -466,14 +466,15 @@ int sja1105_static_config_upload(struct sja1105_private *priv)
|
|||
"invalid, retrying...\n");
|
||||
continue;
|
||||
}
|
||||
} while (--retries && (status.crcchkl == 1 || status.crcchkg == 1 ||
|
||||
status.configs == 0 || status.ids == 1));
|
||||
/* Success! */
|
||||
break;
|
||||
} while (--retries);
|
||||
|
||||
if (!retries) {
|
||||
rc = -EIO;
|
||||
dev_err(dev, "Failed to upload config to device, giving up\n");
|
||||
goto out;
|
||||
} else if (retries != RETRIES - 1) {
|
||||
} else if (retries != RETRIES) {
|
||||
dev_info(dev, "Succeeded after %d tried\n", RETRIES - retries);
|
||||
}
|
||||
|
||||
|
@ -483,7 +484,7 @@ out:
|
|||
return rc;
|
||||
}
|
||||
|
||||
struct sja1105_regs sja1105et_regs = {
|
||||
static struct sja1105_regs sja1105et_regs = {
|
||||
.device_id = 0x0,
|
||||
.prod_id = 0x100BC3,
|
||||
.status = 0x1,
|
||||
|
@ -508,7 +509,7 @@ struct sja1105_regs sja1105et_regs = {
|
|||
.rmii_ext_tx_clk = {0x100018, 0x10001F, 0x100026, 0x10002D, 0x100034},
|
||||
};
|
||||
|
||||
struct sja1105_regs sja1105pqrs_regs = {
|
||||
static struct sja1105_regs sja1105pqrs_regs = {
|
||||
.device_id = 0x0,
|
||||
.prod_id = 0x100BC3,
|
||||
.status = 0x1,
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
|
||||
#include "aq_drvinfo.h"
|
||||
|
||||
#if IS_REACHABLE(CONFIG_HWMON)
|
||||
static int aq_hwmon_read(struct device *dev, enum hwmon_sensor_types type,
|
||||
u32 attr, int channel, long *value)
|
||||
{
|
||||
|
@ -123,3 +124,7 @@ int aq_drvinfo_init(struct net_device *ndev)
|
|||
|
||||
return err;
|
||||
}
|
||||
|
||||
#else
|
||||
int aq_drvinfo_init(struct net_device *ndev) { return 0; }
|
||||
#endif
|
||||
|
|
|
@ -810,7 +810,7 @@ static int hns3_set_l2l3l4(struct sk_buff *skb, u8 ol4_proto,
|
|||
u8 il4_proto, u32 *type_cs_vlan_tso,
|
||||
u32 *ol_type_vlan_len_msec)
|
||||
{
|
||||
unsigned char *l2_hdr = l2_hdr = skb->data;
|
||||
unsigned char *l2_hdr = skb->data;
|
||||
u32 l4_proto = ol4_proto;
|
||||
union l4_hdr_info l4;
|
||||
union l3_hdr_info l3;
|
||||
|
|
|
@ -328,7 +328,18 @@ __emit_shf(struct nfp_prog *nfp_prog, u16 dst, enum alu_dst_ab dst_ab,
|
|||
return;
|
||||
}
|
||||
|
||||
if (sc == SHF_SC_L_SHF)
|
||||
/* NFP shift instruction has something special. If shift direction is
|
||||
* left then shift amount of 1 to 31 is specified as 32 minus the amount
|
||||
* to shift.
|
||||
*
|
||||
* But no need to do this for indirect shift which has shift amount be
|
||||
* 0. Even after we do this subtraction, shift amount 0 will be turned
|
||||
* into 32 which will eventually be encoded the same as 0 because only
|
||||
* low 5 bits are encoded, but shift amount be 32 will fail the
|
||||
* FIELD_PREP check done later on shift mask (0x1f), due to 32 is out of
|
||||
* mask range.
|
||||
*/
|
||||
if (sc == SHF_SC_L_SHF && shift)
|
||||
shift = 32 - shift;
|
||||
|
||||
insn = OP_SHF_BASE |
|
||||
|
|
|
@ -54,6 +54,8 @@ static inline unsigned int nfp_ccm_get_tag(struct sk_buff *skb)
|
|||
|
||||
/**
|
||||
* struct nfp_ccm - common control message handling
|
||||
* @app: APP handle
|
||||
*
|
||||
* @tag_allocator: bitmap of control message tags in use
|
||||
* @tag_alloc_next: next tag bit to allocate
|
||||
* @tag_alloc_last: next tag bit to be freed
|
||||
|
|
|
@ -273,6 +273,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
|
|||
.ndo_fix_features = nfp_repr_fix_features,
|
||||
.ndo_set_features = nfp_port_set_features,
|
||||
.ndo_set_mac_address = eth_mac_addr,
|
||||
.ndo_get_port_parent_id = nfp_port_get_port_parent_id,
|
||||
.ndo_get_devlink_port = nfp_devlink_get_devlink_port,
|
||||
};
|
||||
|
||||
|
|
|
@ -30,6 +30,22 @@ struct nfp_port *nfp_port_from_netdev(struct net_device *netdev)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int nfp_port_get_port_parent_id(struct net_device *netdev,
|
||||
struct netdev_phys_item_id *ppid)
|
||||
{
|
||||
struct nfp_port *port;
|
||||
const u8 *serial;
|
||||
|
||||
port = nfp_port_from_netdev(netdev);
|
||||
if (!port)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
ppid->id_len = nfp_cpp_serial(port->app->cpp, &serial);
|
||||
memcpy(&ppid->id, serial, ppid->id_len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type,
|
||||
void *type_data)
|
||||
{
|
||||
|
|
|
@ -192,6 +192,8 @@ static void dwmac4_prog_mtl_tx_algorithms(struct mac_device_info *hw,
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
writel(value, ioaddr + MTL_OPERATION_MODE);
|
||||
}
|
||||
|
||||
static void dwmac4_set_mtl_tx_queue_weight(struct mac_device_info *hw,
|
||||
|
|
|
@ -836,6 +836,8 @@ static int macvlan_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
|
||||
switch (cmd) {
|
||||
case SIOCSHWTSTAMP:
|
||||
if (!net_eq(dev_net(dev), &init_net))
|
||||
break;
|
||||
case SIOCGHWTSTAMP:
|
||||
if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
|
||||
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
|
||||
|
|
|
@ -23,11 +23,15 @@
|
|||
|
||||
#define RTL821x_INSR 0x13
|
||||
|
||||
#define RTL821x_EXT_PAGE_SELECT 0x1e
|
||||
#define RTL821x_PAGE_SELECT 0x1f
|
||||
|
||||
#define RTL8211F_INSR 0x1d
|
||||
|
||||
#define RTL8211F_TX_DELAY BIT(8)
|
||||
#define RTL8211E_TX_DELAY BIT(1)
|
||||
#define RTL8211E_RX_DELAY BIT(2)
|
||||
#define RTL8211E_MODE_MII_GMII BIT(3)
|
||||
|
||||
#define RTL8201F_ISR 0x1e
|
||||
#define RTL8201F_IER 0x13
|
||||
|
@ -157,16 +161,73 @@ static int rtl8211c_config_init(struct phy_device *phydev)
|
|||
|
||||
static int rtl8211f_config_init(struct phy_device *phydev)
|
||||
{
|
||||
u16 val = 0;
|
||||
u16 val;
|
||||
|
||||
/* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */
|
||||
if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
|
||||
phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
|
||||
/* enable TX-delay for rgmii-{id,txid}, and disable it for rgmii and
|
||||
* rgmii-rxid. The RX-delay can be enabled by the external RXDLY pin.
|
||||
*/
|
||||
switch (phydev->interface) {
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
case PHY_INTERFACE_MODE_RGMII_RXID:
|
||||
val = 0;
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
case PHY_INTERFACE_MODE_RGMII_TXID:
|
||||
val = RTL8211F_TX_DELAY;
|
||||
break;
|
||||
default: /* the rest of the modes imply leaving delay as is. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
return phy_modify_paged(phydev, 0xd08, 0x11, RTL8211F_TX_DELAY, val);
|
||||
}
|
||||
|
||||
static int rtl8211e_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int ret = 0, oldpage;
|
||||
u16 val;
|
||||
|
||||
/* enable TX/RX delay for rgmii-* modes, and disable them for rgmii. */
|
||||
switch (phydev->interface) {
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
val = 0;
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
val = RTL8211E_TX_DELAY | RTL8211E_RX_DELAY;
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_RGMII_RXID:
|
||||
val = RTL8211E_RX_DELAY;
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_RGMII_TXID:
|
||||
val = RTL8211E_TX_DELAY;
|
||||
break;
|
||||
default: /* the rest of the modes imply leaving delays as is. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* According to a sample driver there is a 0x1c config register on the
|
||||
* 0xa4 extension page (0x7) layout. It can be used to disable/enable
|
||||
* the RX/TX delays otherwise controlled by RXDLY/TXDLY pins. It can
|
||||
* also be used to customize the whole configuration register:
|
||||
* 8:6 = PHY Address, 5:4 = Auto-Negotiation, 3 = Interface Mode Select,
|
||||
* 2 = RX Delay, 1 = TX Delay, 0 = SELRGV (see original PHY datasheet
|
||||
* for details).
|
||||
*/
|
||||
oldpage = phy_select_page(phydev, 0x7);
|
||||
if (oldpage < 0)
|
||||
goto err_restore_page;
|
||||
|
||||
ret = phy_write(phydev, RTL821x_EXT_PAGE_SELECT, 0xa4);
|
||||
if (ret)
|
||||
goto err_restore_page;
|
||||
|
||||
ret = phy_modify(phydev, 0x1c, RTL8211E_TX_DELAY | RTL8211E_RX_DELAY,
|
||||
val);
|
||||
|
||||
err_restore_page:
|
||||
return phy_restore_page(phydev, oldpage, ret);
|
||||
}
|
||||
|
||||
static int rtl8211b_suspend(struct phy_device *phydev)
|
||||
{
|
||||
phy_write(phydev, MII_MMD_DATA, BIT(9));
|
||||
|
@ -239,6 +300,7 @@ static struct phy_driver realtek_drvs[] = {
|
|||
}, {
|
||||
PHY_ID_MATCH_EXACT(0x001cc915),
|
||||
.name = "RTL8211E Gigabit Ethernet",
|
||||
.config_init = &rtl8211e_config_init,
|
||||
.ack_interrupt = &rtl821x_ack_interrupt,
|
||||
.config_intr = &rtl8211e_config_intr,
|
||||
.suspend = genphy_suspend,
|
||||
|
|
|
@ -596,13 +596,18 @@ static u16 tun_automq_select_queue(struct tun_struct *tun, struct sk_buff *skb)
|
|||
static u16 tun_ebpf_select_queue(struct tun_struct *tun, struct sk_buff *skb)
|
||||
{
|
||||
struct tun_prog *prog;
|
||||
u32 numqueues;
|
||||
u16 ret = 0;
|
||||
|
||||
numqueues = READ_ONCE(tun->numqueues);
|
||||
if (!numqueues)
|
||||
return 0;
|
||||
|
||||
prog = rcu_dereference(tun->steering_prog);
|
||||
if (prog)
|
||||
ret = bpf_prog_run_clear_cb(prog->prog, skb);
|
||||
|
||||
return ret % tun->numqueues;
|
||||
return ret % numqueues;
|
||||
}
|
||||
|
||||
static u16 tun_select_queue(struct net_device *dev, struct sk_buff *skb,
|
||||
|
@ -699,6 +704,8 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
|
|||
tun->tfiles[tun->numqueues - 1]);
|
||||
ntfile = rtnl_dereference(tun->tfiles[index]);
|
||||
ntfile->queue_index = index;
|
||||
rcu_assign_pointer(tun->tfiles[tun->numqueues - 1],
|
||||
NULL);
|
||||
|
||||
--tun->numqueues;
|
||||
if (clean) {
|
||||
|
@ -1081,7 +1088,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
tfile = rcu_dereference(tun->tfiles[txq]);
|
||||
|
||||
/* Drop packet if interface is not attached */
|
||||
if (txq >= tun->numqueues)
|
||||
if (!tfile)
|
||||
goto drop;
|
||||
|
||||
if (!rcu_dereference(tun->steering_prog))
|
||||
|
@ -1304,6 +1311,7 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
|
|||
|
||||
rcu_read_lock();
|
||||
|
||||
resample:
|
||||
numqueues = READ_ONCE(tun->numqueues);
|
||||
if (!numqueues) {
|
||||
rcu_read_unlock();
|
||||
|
@ -1312,6 +1320,8 @@ static int tun_xdp_xmit(struct net_device *dev, int n,
|
|||
|
||||
tfile = rcu_dereference(tun->tfiles[smp_processor_id() %
|
||||
numqueues]);
|
||||
if (unlikely(!tfile))
|
||||
goto resample;
|
||||
|
||||
spin_lock(&tfile->tx_ring.producer_lock);
|
||||
for (i = 0; i < n; i++) {
|
||||
|
|
|
@ -320,6 +320,7 @@ static int aqc111_get_link_ksettings(struct net_device *net,
|
|||
static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed)
|
||||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
aqc111_data->phy_cfg &= ~AQ_ADV_MASK;
|
||||
aqc111_data->phy_cfg |= AQ_PAUSE;
|
||||
|
@ -361,7 +362,8 @@ static void aqc111_set_phy_speed(struct usbnet *dev, u8 autoneg, u16 speed)
|
|||
}
|
||||
}
|
||||
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, &aqc111_data->phy_cfg);
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0, &phy_on_the_wire);
|
||||
}
|
||||
|
||||
static int aqc111_set_link_ksettings(struct net_device *net,
|
||||
|
@ -453,6 +455,8 @@ static int aqc111_change_mtu(struct net_device *net, int new_mtu)
|
|||
reg16 = 0x1420;
|
||||
else if (dev->net->mtu <= 16334)
|
||||
reg16 = 0x1A20;
|
||||
else
|
||||
return 0;
|
||||
|
||||
aqc111_write16_cmd(dev, AQ_ACCESS_MAC, SFR_PAUSE_WATERLVL_LOW,
|
||||
2, ®16);
|
||||
|
@ -753,6 +757,7 @@ static void aqc111_unbind(struct usbnet *dev, struct usb_interface *intf)
|
|||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u16 reg16;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
/* Force bz */
|
||||
reg16 = SFR_PHYPWR_RSTCTL_BZ;
|
||||
|
@ -766,8 +771,9 @@ static void aqc111_unbind(struct usbnet *dev, struct usb_interface *intf)
|
|||
aqc111_data->phy_cfg &= ~AQ_ADV_MASK;
|
||||
aqc111_data->phy_cfg |= AQ_LOW_POWER;
|
||||
aqc111_data->phy_cfg &= ~AQ_PHY_POWER_EN;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd_nopm(dev, AQ_PHY_OPS, 0, 0,
|
||||
&aqc111_data->phy_cfg);
|
||||
&phy_on_the_wire);
|
||||
|
||||
kfree(aqc111_data);
|
||||
}
|
||||
|
@ -990,6 +996,7 @@ static int aqc111_reset(struct usbnet *dev)
|
|||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u8 reg8 = 0;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
dev->rx_urb_size = URB_SIZE;
|
||||
|
||||
|
@ -1002,8 +1009,9 @@ static int aqc111_reset(struct usbnet *dev)
|
|||
|
||||
/* Power up ethernet PHY */
|
||||
aqc111_data->phy_cfg = AQ_PHY_POWER_EN;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&aqc111_data->phy_cfg);
|
||||
&phy_on_the_wire);
|
||||
|
||||
/* Set the MAC address */
|
||||
aqc111_write_cmd(dev, AQ_ACCESS_MAC, SFR_NODE_ID, ETH_ALEN,
|
||||
|
@ -1034,6 +1042,7 @@ static int aqc111_stop(struct usbnet *dev)
|
|||
{
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u16 reg16 = 0;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
aqc111_read16_cmd(dev, AQ_ACCESS_MAC, SFR_MEDIUM_STATUS_MODE,
|
||||
2, ®16);
|
||||
|
@ -1045,8 +1054,9 @@ static int aqc111_stop(struct usbnet *dev)
|
|||
|
||||
/* Put PHY to low power*/
|
||||
aqc111_data->phy_cfg |= AQ_LOW_POWER;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&aqc111_data->phy_cfg);
|
||||
&phy_on_the_wire);
|
||||
|
||||
netif_carrier_off(dev->net);
|
||||
|
||||
|
@ -1322,6 +1332,7 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)
|
|||
u16 temp_rx_ctrl = 0x00;
|
||||
u16 reg16;
|
||||
u8 reg8;
|
||||
u32 phy_on_the_wire;
|
||||
|
||||
usbnet_suspend(intf, message);
|
||||
|
||||
|
@ -1393,12 +1404,14 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message)
|
|||
|
||||
aqc111_write_cmd(dev, AQ_WOL_CFG, 0, 0,
|
||||
WOL_CFG_SIZE, &wol_cfg);
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&aqc111_data->phy_cfg);
|
||||
&phy_on_the_wire);
|
||||
} else {
|
||||
aqc111_data->phy_cfg |= AQ_LOW_POWER;
|
||||
phy_on_the_wire = aqc111_data->phy_cfg;
|
||||
aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
|
||||
&aqc111_data->phy_cfg);
|
||||
&phy_on_the_wire);
|
||||
|
||||
/* Disable RX path */
|
||||
aqc111_read16_cmd_nopm(dev, AQ_ACCESS_MAC,
|
||||
|
@ -1415,7 +1428,7 @@ static int aqc111_resume(struct usb_interface *intf)
|
|||
{
|
||||
struct usbnet *dev = usb_get_intfdata(intf);
|
||||
struct aqc111_data *aqc111_data = dev->driver_priv;
|
||||
u16 reg16;
|
||||
u16 reg16, oldreg16;
|
||||
u8 reg8;
|
||||
|
||||
netif_carrier_off(dev->net);
|
||||
|
@ -1431,9 +1444,11 @@ static int aqc111_resume(struct usb_interface *intf)
|
|||
/* Configure RX control register => start operation */
|
||||
reg16 = aqc111_data->rxctl;
|
||||
reg16 &= ~SFR_RX_CTL_START;
|
||||
/* needs to be saved in case endianness is swapped */
|
||||
oldreg16 = reg16;
|
||||
aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, ®16);
|
||||
|
||||
reg16 |= SFR_RX_CTL_START;
|
||||
reg16 = oldreg16 | SFR_RX_CTL_START;
|
||||
aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC, SFR_RX_CTL, 2, ®16);
|
||||
|
||||
aqc111_set_phy_speed(dev, aqc111_data->autoneg,
|
||||
|
|
|
@ -467,6 +467,9 @@ int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
|
|||
unsigned long flags;
|
||||
u32 tmr_ctrl;
|
||||
|
||||
if (!node)
|
||||
return -ENODEV;
|
||||
|
||||
ptp_qoriq->base = base;
|
||||
ptp_qoriq->caps = *caps;
|
||||
|
||||
|
|
|
@ -2198,7 +2198,7 @@ extern struct static_key_false tcp_have_smc;
|
|||
void clean_acked_data_enable(struct inet_connection_sock *icsk,
|
||||
void (*cad)(struct sock *sk, u32 ack_seq));
|
||||
void clean_acked_data_disable(struct inet_connection_sock *icsk);
|
||||
|
||||
void clean_acked_data_flush(void);
|
||||
#endif
|
||||
|
||||
#endif /* _TCP_H */
|
||||
|
|
|
@ -370,10 +370,12 @@ static int vlan_dev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
|
|||
ifrr.ifr_ifru = ifr->ifr_ifru;
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSHWTSTAMP:
|
||||
if (!net_eq(dev_net(dev), &init_net))
|
||||
break;
|
||||
case SIOCGMIIPHY:
|
||||
case SIOCGMIIREG:
|
||||
case SIOCSMIIREG:
|
||||
case SIOCSHWTSTAMP:
|
||||
case SIOCGHWTSTAMP:
|
||||
if (netif_device_present(real_dev) && ops->ndo_do_ioctl)
|
||||
err = ops->ndo_do_ioctl(real_dev, &ifrr, cmd);
|
||||
|
|
|
@ -168,6 +168,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
|
|||
spin_lock_init(&bat_priv->tt.commit_lock);
|
||||
spin_lock_init(&bat_priv->gw.list_lock);
|
||||
#ifdef CONFIG_BATMAN_ADV_MCAST
|
||||
spin_lock_init(&bat_priv->mcast.mla_lock);
|
||||
spin_lock_init(&bat_priv->mcast.want_lists_lock);
|
||||
#endif
|
||||
spin_lock_init(&bat_priv->tvlv.container_list_lock);
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#define BATADV_DRIVER_DEVICE "batman-adv"
|
||||
|
||||
#ifndef BATADV_SOURCE_VERSION
|
||||
#define BATADV_SOURCE_VERSION "2019.1"
|
||||
#define BATADV_SOURCE_VERSION "2019.2"
|
||||
#endif
|
||||
|
||||
/* B.A.T.M.A.N. parameters */
|
||||
|
|
|
@ -314,8 +314,6 @@ static void batadv_mcast_mla_list_free(struct hlist_head *mcast_list)
|
|||
* translation table except the ones listed in the given mcast_list.
|
||||
*
|
||||
* If mcast_list is NULL then all are retracted.
|
||||
*
|
||||
* Do not call outside of the mcast worker! (or cancel mcast worker first)
|
||||
*/
|
||||
static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
|
||||
struct hlist_head *mcast_list)
|
||||
|
@ -323,8 +321,6 @@ static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
|
|||
struct batadv_hw_addr *mcast_entry;
|
||||
struct hlist_node *tmp;
|
||||
|
||||
WARN_ON(delayed_work_pending(&bat_priv->mcast.work));
|
||||
|
||||
hlist_for_each_entry_safe(mcast_entry, tmp, &bat_priv->mcast.mla_list,
|
||||
list) {
|
||||
if (mcast_list &&
|
||||
|
@ -348,8 +344,6 @@ static void batadv_mcast_mla_tt_retract(struct batadv_priv *bat_priv,
|
|||
*
|
||||
* Adds multicast listener announcements from the given mcast_list to the
|
||||
* translation table if they have not been added yet.
|
||||
*
|
||||
* Do not call outside of the mcast worker! (or cancel mcast worker first)
|
||||
*/
|
||||
static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv,
|
||||
struct hlist_head *mcast_list)
|
||||
|
@ -357,8 +351,6 @@ static void batadv_mcast_mla_tt_add(struct batadv_priv *bat_priv,
|
|||
struct batadv_hw_addr *mcast_entry;
|
||||
struct hlist_node *tmp;
|
||||
|
||||
WARN_ON(delayed_work_pending(&bat_priv->mcast.work));
|
||||
|
||||
if (!mcast_list)
|
||||
return;
|
||||
|
||||
|
@ -647,7 +639,10 @@ static void batadv_mcast_mla_update(struct work_struct *work)
|
|||
priv_mcast = container_of(delayed_work, struct batadv_priv_mcast, work);
|
||||
bat_priv = container_of(priv_mcast, struct batadv_priv, mcast);
|
||||
|
||||
spin_lock(&bat_priv->mcast.mla_lock);
|
||||
__batadv_mcast_mla_update(bat_priv);
|
||||
spin_unlock(&bat_priv->mcast.mla_lock);
|
||||
|
||||
batadv_mcast_start_timer(bat_priv);
|
||||
}
|
||||
|
||||
|
|
|
@ -1211,6 +1211,11 @@ struct batadv_priv_mcast {
|
|||
/** @bridged: whether the soft interface has a bridge on top */
|
||||
unsigned char bridged:1;
|
||||
|
||||
/**
|
||||
* @mla_lock: a lock protecting mla_list and mla_flags
|
||||
*/
|
||||
spinlock_t mla_lock;
|
||||
|
||||
/**
|
||||
* @num_want_all_unsnoopables: number of nodes wanting unsnoopable IP
|
||||
* traffic
|
||||
|
|
|
@ -757,9 +757,9 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|||
if (err)
|
||||
goto errout;
|
||||
|
||||
if ((nlh->nlmsg_flags & NLM_F_EXCL) &&
|
||||
rule_exists(ops, frh, tb, rule)) {
|
||||
err = -EEXIST;
|
||||
if (rule_exists(ops, frh, tb, rule)) {
|
||||
if (nlh->nlmsg_flags & NLM_F_EXCL)
|
||||
err = -EEXIST;
|
||||
goto errout_free;
|
||||
}
|
||||
|
||||
|
|
|
@ -173,6 +173,7 @@ static int icmp_filter(const struct sock *sk, const struct sk_buff *skb)
|
|||
static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
|
||||
{
|
||||
int sdif = inet_sdif(skb);
|
||||
int dif = inet_iif(skb);
|
||||
struct sock *sk;
|
||||
struct hlist_head *head;
|
||||
int delivered = 0;
|
||||
|
@ -185,8 +186,7 @@ static int raw_v4_input(struct sk_buff *skb, const struct iphdr *iph, int hash)
|
|||
|
||||
net = dev_net(skb->dev);
|
||||
sk = __raw_v4_lookup(net, __sk_head(head), iph->protocol,
|
||||
iph->saddr, iph->daddr,
|
||||
skb->dev->ifindex, sdif);
|
||||
iph->saddr, iph->daddr, dif, sdif);
|
||||
|
||||
while (sk) {
|
||||
delivered = 1;
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
#include <asm/unaligned.h>
|
||||
#include <linux/errqueue.h>
|
||||
#include <trace/events/tcp.h>
|
||||
#include <linux/static_key.h>
|
||||
#include <linux/jump_label_ratelimit.h>
|
||||
#include <net/busy_poll.h>
|
||||
|
||||
int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
|
||||
|
@ -113,22 +113,28 @@ int sysctl_tcp_max_orphans __read_mostly = NR_FILE;
|
|||
#define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */
|
||||
|
||||
#if IS_ENABLED(CONFIG_TLS_DEVICE)
|
||||
static DEFINE_STATIC_KEY_FALSE(clean_acked_data_enabled);
|
||||
static DEFINE_STATIC_KEY_DEFERRED_FALSE(clean_acked_data_enabled, HZ);
|
||||
|
||||
void clean_acked_data_enable(struct inet_connection_sock *icsk,
|
||||
void (*cad)(struct sock *sk, u32 ack_seq))
|
||||
{
|
||||
icsk->icsk_clean_acked = cad;
|
||||
static_branch_inc(&clean_acked_data_enabled);
|
||||
static_branch_inc(&clean_acked_data_enabled.key);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clean_acked_data_enable);
|
||||
|
||||
void clean_acked_data_disable(struct inet_connection_sock *icsk)
|
||||
{
|
||||
static_branch_dec(&clean_acked_data_enabled);
|
||||
static_branch_slow_dec_deferred(&clean_acked_data_enabled);
|
||||
icsk->icsk_clean_acked = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clean_acked_data_disable);
|
||||
|
||||
void clean_acked_data_flush(void)
|
||||
{
|
||||
static_key_deferred_flush(&clean_acked_data_enabled);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clean_acked_data_flush);
|
||||
#endif
|
||||
|
||||
static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb,
|
||||
|
@ -3598,7 +3604,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
|
|||
icsk->icsk_retransmits = 0;
|
||||
|
||||
#if IS_ENABLED(CONFIG_TLS_DEVICE)
|
||||
if (static_branch_unlikely(&clean_acked_data_enabled))
|
||||
if (static_branch_unlikely(&clean_acked_data_enabled.key))
|
||||
if (icsk->icsk_clean_acked)
|
||||
icsk->icsk_clean_acked(sk, ack);
|
||||
#endif
|
||||
|
|
|
@ -1322,7 +1322,7 @@ static int ovs_ct_add_helper(struct ovs_conntrack_info *info, const char *name,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
if (info->nat) {
|
||||
ret = nf_nat_helper_try_module_get(name, info->family,
|
||||
key->ip.proto);
|
||||
|
@ -1811,7 +1811,7 @@ void ovs_ct_free_action(const struct nlattr *a)
|
|||
static void __ovs_ct_free_action(struct ovs_conntrack_info *ct_info)
|
||||
{
|
||||
if (ct_info->helper) {
|
||||
#ifdef CONFIG_NF_NAT_NEEDED
|
||||
#if IS_ENABLED(CONFIG_NF_NAT)
|
||||
if (ct_info->nat)
|
||||
nf_nat_helper_put(ct_info->helper);
|
||||
#endif
|
||||
|
|
|
@ -4598,14 +4598,29 @@ static void __exit packet_exit(void)
|
|||
|
||||
static int __init packet_init(void)
|
||||
{
|
||||
int rc = proto_register(&packet_proto, 0);
|
||||
int rc;
|
||||
|
||||
if (rc != 0)
|
||||
rc = proto_register(&packet_proto, 0);
|
||||
if (rc)
|
||||
goto out;
|
||||
rc = sock_register(&packet_family_ops);
|
||||
if (rc)
|
||||
goto out_proto;
|
||||
rc = register_pernet_subsys(&packet_net_ops);
|
||||
if (rc)
|
||||
goto out_sock;
|
||||
rc = register_netdevice_notifier(&packet_netdev_notifier);
|
||||
if (rc)
|
||||
goto out_pernet;
|
||||
|
||||
sock_register(&packet_family_ops);
|
||||
register_pernet_subsys(&packet_net_ops);
|
||||
register_netdevice_notifier(&packet_netdev_notifier);
|
||||
return 0;
|
||||
|
||||
out_pernet:
|
||||
unregister_pernet_subsys(&packet_net_ops);
|
||||
out_sock:
|
||||
sock_unregister(PF_PACKET);
|
||||
out_proto:
|
||||
proto_unregister(&packet_proto);
|
||||
out:
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -308,6 +308,7 @@ static int mall_reoffload(struct tcf_proto *tp, bool add, tc_setup_cb_t *cb,
|
|||
NL_SET_ERR_MSG_MOD(extack, "Failed to setup flow action");
|
||||
return err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = cb(TC_SETUP_CLSMATCHALL, &cls_mall, cb_priv);
|
||||
|
|
|
@ -736,11 +736,11 @@ static __poll_t tipc_poll(struct file *file, struct socket *sock,
|
|||
|
||||
switch (sk->sk_state) {
|
||||
case TIPC_ESTABLISHED:
|
||||
case TIPC_CONNECTING:
|
||||
if (!tsk->cong_link_cnt && !tsk_conn_cong(tsk))
|
||||
revents |= EPOLLOUT;
|
||||
/* fall through */
|
||||
case TIPC_LISTEN:
|
||||
case TIPC_CONNECTING:
|
||||
if (!skb_queue_empty(&sk->sk_receive_queue))
|
||||
revents |= EPOLLIN | EPOLLRDNORM;
|
||||
break;
|
||||
|
@ -2043,7 +2043,7 @@ static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
|
|||
if (msg_data_sz(hdr))
|
||||
return true;
|
||||
/* Empty ACK-, - wake up sleeping connect() and drop */
|
||||
sk->sk_data_ready(sk);
|
||||
sk->sk_state_change(sk);
|
||||
msg_set_dest_droppable(hdr, 1);
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -541,14 +541,11 @@ static int tls_device_push_pending_record(struct sock *sk, int flags)
|
|||
|
||||
void tls_device_write_space(struct sock *sk, struct tls_context *ctx)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (!sk->sk_write_pending && tls_is_partially_sent_record(ctx)) {
|
||||
gfp_t sk_allocation = sk->sk_allocation;
|
||||
|
||||
sk->sk_allocation = GFP_ATOMIC;
|
||||
rc = tls_push_partial_record(sk, ctx,
|
||||
MSG_DONTWAIT | MSG_NOSIGNAL);
|
||||
tls_push_partial_record(sk, ctx, MSG_DONTWAIT | MSG_NOSIGNAL);
|
||||
sk->sk_allocation = sk_allocation;
|
||||
}
|
||||
}
|
||||
|
@ -1036,4 +1033,5 @@ void __exit tls_device_cleanup(void)
|
|||
{
|
||||
unregister_netdevice_notifier(&tls_dev_notifier);
|
||||
flush_work(&tls_device_gc_work);
|
||||
clean_acked_data_flush();
|
||||
}
|
||||
|
|
|
@ -119,23 +119,25 @@ static int skb_nsg(struct sk_buff *skb, int offset, int len)
|
|||
}
|
||||
|
||||
static int padding_length(struct tls_sw_context_rx *ctx,
|
||||
struct tls_context *tls_ctx, struct sk_buff *skb)
|
||||
struct tls_prot_info *prot, struct sk_buff *skb)
|
||||
{
|
||||
struct strp_msg *rxm = strp_msg(skb);
|
||||
int sub = 0;
|
||||
|
||||
/* Determine zero-padding length */
|
||||
if (tls_ctx->prot_info.version == TLS_1_3_VERSION) {
|
||||
if (prot->version == TLS_1_3_VERSION) {
|
||||
char content_type = 0;
|
||||
int err;
|
||||
int back = 17;
|
||||
|
||||
while (content_type == 0) {
|
||||
if (back > rxm->full_len)
|
||||
if (back > rxm->full_len - prot->prepend_size)
|
||||
return -EBADMSG;
|
||||
err = skb_copy_bits(skb,
|
||||
rxm->offset + rxm->full_len - back,
|
||||
&content_type, 1);
|
||||
if (err)
|
||||
return err;
|
||||
if (content_type)
|
||||
break;
|
||||
sub++;
|
||||
|
@ -170,9 +172,17 @@ static void tls_decrypt_done(struct crypto_async_request *req, int err)
|
|||
tls_err_abort(skb->sk, err);
|
||||
} else {
|
||||
struct strp_msg *rxm = strp_msg(skb);
|
||||
rxm->full_len -= padding_length(ctx, tls_ctx, skb);
|
||||
rxm->offset += prot->prepend_size;
|
||||
rxm->full_len -= prot->overhead_size;
|
||||
int pad;
|
||||
|
||||
pad = padding_length(ctx, prot, skb);
|
||||
if (pad < 0) {
|
||||
ctx->async_wait.err = pad;
|
||||
tls_err_abort(skb->sk, pad);
|
||||
} else {
|
||||
rxm->full_len -= pad;
|
||||
rxm->offset += prot->prepend_size;
|
||||
rxm->full_len -= prot->overhead_size;
|
||||
}
|
||||
}
|
||||
|
||||
/* After using skb->sk to propagate sk through crypto async callback
|
||||
|
@ -1478,7 +1488,7 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
|
|||
struct tls_prot_info *prot = &tls_ctx->prot_info;
|
||||
int version = prot->version;
|
||||
struct strp_msg *rxm = strp_msg(skb);
|
||||
int err = 0;
|
||||
int pad, err = 0;
|
||||
|
||||
if (!ctx->decrypted) {
|
||||
#ifdef CONFIG_TLS_DEVICE
|
||||
|
@ -1501,7 +1511,11 @@ static int decrypt_skb_update(struct sock *sk, struct sk_buff *skb,
|
|||
*zc = false;
|
||||
}
|
||||
|
||||
rxm->full_len -= padding_length(ctx, tls_ctx, skb);
|
||||
pad = padding_length(ctx, prot, skb);
|
||||
if (pad < 0)
|
||||
return pad;
|
||||
|
||||
rxm->full_len -= pad;
|
||||
rxm->offset += prot->prepend_size;
|
||||
rxm->full_len -= prot->overhead_size;
|
||||
tls_advance_record_sn(sk, &tls_ctx->rx, version);
|
||||
|
|
|
@ -4649,7 +4649,7 @@ static int selinux_socket_connect_helper(struct socket *sock,
|
|||
struct lsm_network_audit net = {0,};
|
||||
struct sockaddr_in *addr4 = NULL;
|
||||
struct sockaddr_in6 *addr6 = NULL;
|
||||
unsigned short snum;
|
||||
unsigned short snum = 0;
|
||||
u32 sid, perm;
|
||||
|
||||
/* sctp_connectx(3) calls via selinux_sctp_bind_connect()
|
||||
|
@ -4674,12 +4674,12 @@ static int selinux_socket_connect_helper(struct socket *sock,
|
|||
break;
|
||||
default:
|
||||
/* Note that SCTP services expect -EINVAL, whereas
|
||||
* others expect -EAFNOSUPPORT.
|
||||
* others must handle this at the protocol level:
|
||||
* connect(AF_UNSPEC) on a connected socket is
|
||||
* a documented way disconnect the socket.
|
||||
*/
|
||||
if (sksec->sclass == SECCLASS_SCTP_SOCKET)
|
||||
return -EINVAL;
|
||||
else
|
||||
return -EAFNOSUPPORT;
|
||||
}
|
||||
|
||||
err = sel_netport_sid(sk->sk_protocol, snum, &sid);
|
||||
|
|
|
@ -15,7 +15,7 @@ static int libbpf_debug_print(enum libbpf_print_level level,
|
|||
static int check_load(const char *file)
|
||||
{
|
||||
struct bpf_prog_load_attr attr;
|
||||
struct bpf_object *obj;
|
||||
struct bpf_object *obj = NULL;
|
||||
int err, prog_fd;
|
||||
|
||||
memset(&attr, 0, sizeof(struct bpf_prog_load_attr));
|
||||
|
|
|
@ -9,7 +9,7 @@ static void test_task_fd_query_tp_core(const char *probe_name,
|
|||
struct perf_event_attr attr = {};
|
||||
__u64 probe_offset, probe_addr;
|
||||
__u32 len, prog_id, fd_type;
|
||||
struct bpf_object *obj;
|
||||
struct bpf_object *obj = NULL;
|
||||
__u32 duration = 0;
|
||||
char buf[256];
|
||||
|
||||
|
|
|
@ -13,6 +13,9 @@ void test_tp_attach_query(void)
|
|||
struct bpf_prog_info prog_info;
|
||||
char buf[256];
|
||||
|
||||
for (i = 0; i < num_progs; i++)
|
||||
obj[i] = NULL;
|
||||
|
||||
snprintf(buf, sizeof(buf),
|
||||
"/sys/kernel/debug/tracing/events/sched/sched_switch/id");
|
||||
efd = open(buf, O_RDONLY, 0);
|
||||
|
|
Loading…
Reference in New Issue