You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Fix multiqueue in stmmac driver on PCI, from Andy Shevchenko.
2) cdc_ncm doesn't actually fully zero out the padding area is
allocates on TX, from Jim Baxter.
3) Don't leak map addresses in BPF verifier, from Daniel Borkmann.
4) If we randomize TCP timestamps, we have to do it everywhere
including SYN cookies. From Eric Dumazet.
5) Fix "ethtool -S" crash in aquantia driver, from Pavel Belous.
6) Fix allocation size for ntp filter bitmap in bnxt_en driver, from
Dan Carpenter.
7) Add missing memory allocation return value check to DSA loop driver,
from Christophe Jaillet.
8) Fix XDP leak on driver unload in qed driver, from Suddarsana Reddy
Kalluru.
9) Don't inherit MC list from parent inet connection sockets, another
syzkaller spotted gem. Fix from Eric Dumazet.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (43 commits)
dccp/tcp: do not inherit mc_list from parent
qede: Split PF/VF ndos.
qed: Correct doorbell configuration for !4Kb pages
qed: Tell QM the number of tasks
qed: Fix VF removal sequence
qede: Fix XDP memory leak on unload
net/mlx4_core: Reduce harmless SRIOV error message to debug level
net/mlx4_en: Avoid adding steering rules with invalid ring
net/mlx4_en: Change the error print to debug print
drivers: net: wimax: i2400m: i2400m-usb: Use time_after for time comparison
DECnet: Use container_of() for embedded struct
Revert "ipv4: restore rt->fi for reference counting"
net: mdio-mux: bcm-iproc: call mdiobus_free() in error path
net: ethernet: ti: cpsw: adjust cpsw fifos depth for fullduplex flow control
ipv6: reorder ip6_route_dev_notifier after ipv6_dev_notf
net: cdc_ncm: Fix TX zero padding
stmmac: pci: split out common_default_data() helper
stmmac: pci: RX queue routing configuration
stmmac: pci: TX and RX queue priority configuration
stmmac: pci: set default number of rx and tx queues
...
This commit is contained in:
@@ -549,7 +549,8 @@ static int bond_fill_info(struct sk_buff *skb,
|
||||
targets_added = 0;
|
||||
for (i = 0; i < BOND_MAX_ARP_TARGETS; i++) {
|
||||
if (bond->params.arp_targets[i]) {
|
||||
nla_put_be32(skb, i, bond->params.arp_targets[i]);
|
||||
if (nla_put_be32(skb, i, bond->params.arp_targets[i]))
|
||||
goto nla_put_failure;
|
||||
targets_added = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,6 +256,9 @@ static int dsa_loop_drv_probe(struct mdio_device *mdiodev)
|
||||
return -ENOMEM;
|
||||
|
||||
ps = devm_kzalloc(&mdiodev->dev, sizeof(*ps), GFP_KERNEL);
|
||||
if (!ps)
|
||||
return -ENOMEM;
|
||||
|
||||
ps->netdev = dev_get_by_name(&init_net, pdata->netdev);
|
||||
if (!ps->netdev)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
@@ -755,7 +755,7 @@ void aq_nic_get_stats(struct aq_nic_s *self, u64 *data)
|
||||
count = 0U;
|
||||
|
||||
for (i = 0U, aq_vec = self->aq_vec[0];
|
||||
self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) {
|
||||
aq_vec && self->aq_vecs > i; ++i, aq_vec = self->aq_vec[i]) {
|
||||
data += count;
|
||||
aq_vec_get_sw_stats(aq_vec, data, &count);
|
||||
}
|
||||
@@ -959,8 +959,10 @@ void aq_nic_free_hot_resources(struct aq_nic_s *self)
|
||||
goto err_exit;
|
||||
|
||||
for (i = AQ_DIMOF(self->aq_vec); i--;) {
|
||||
if (self->aq_vec[i])
|
||||
if (self->aq_vec[i]) {
|
||||
aq_vec_free(self->aq_vec[i]);
|
||||
self->aq_vec[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
err_exit:;
|
||||
|
||||
@@ -838,7 +838,7 @@ static int alx_enable_msix(struct alx_priv *alx)
|
||||
|
||||
err = pci_alloc_irq_vectors(alx->hw.pdev, num_vec, num_vec,
|
||||
PCI_IRQ_MSIX);
|
||||
if (err) {
|
||||
if (err < 0) {
|
||||
netdev_warn(alx->dev, "Enabling MSI-X interrupts failed!\n");
|
||||
return err;
|
||||
}
|
||||
@@ -904,7 +904,7 @@ static int alx_init_intr(struct alx_priv *alx)
|
||||
|
||||
ret = pci_alloc_irq_vectors(alx->hw.pdev, 1, 1,
|
||||
PCI_IRQ_MSI | PCI_IRQ_LEGACY);
|
||||
if (ret)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
alx->num_vec = 1;
|
||||
|
||||
@@ -3000,7 +3000,8 @@ static int bnxt_alloc_ntp_fltrs(struct bnxt *bp)
|
||||
INIT_HLIST_HEAD(&bp->ntp_fltr_hash_tbl[i]);
|
||||
|
||||
bp->ntp_fltr_count = 0;
|
||||
bp->ntp_fltr_bmap = kzalloc(BITS_TO_LONGS(BNXT_NTP_FLTR_MAX_FLTR),
|
||||
bp->ntp_fltr_bmap = kcalloc(BITS_TO_LONGS(BNXT_NTP_FLTR_MAX_FLTR),
|
||||
sizeof(long),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!bp->ntp_fltr_bmap)
|
||||
|
||||
@@ -2845,7 +2845,7 @@ bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver)
|
||||
static void
|
||||
bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer)
|
||||
{
|
||||
memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
|
||||
strncpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -547,8 +547,8 @@ bnad_get_strings(struct net_device *netdev, u32 stringset, u8 *string)
|
||||
for (i = 0; i < BNAD_ETHTOOL_STATS_NUM; i++) {
|
||||
BUG_ON(!(strlen(bnad_net_stats_strings[i]) <
|
||||
ETH_GSTRING_LEN));
|
||||
memcpy(string, bnad_net_stats_strings[i],
|
||||
ETH_GSTRING_LEN);
|
||||
strncpy(string, bnad_net_stats_strings[i],
|
||||
ETH_GSTRING_LEN);
|
||||
string += ETH_GSTRING_LEN;
|
||||
}
|
||||
bmap = bna_tx_rid_mask(&bnad->bna);
|
||||
|
||||
@@ -108,6 +108,12 @@ enum {
|
||||
PAUSE_AUTONEG = 1 << 2
|
||||
};
|
||||
|
||||
enum {
|
||||
FEC_AUTO = 1 << 0, /* IEEE 802.3 "automatic" */
|
||||
FEC_RS = 1 << 1, /* Reed-Solomon */
|
||||
FEC_BASER_RS = 1 << 2 /* BaseR/Reed-Solomon */
|
||||
};
|
||||
|
||||
struct port_stats {
|
||||
u64 tx_octets; /* total # of octets in good frames */
|
||||
u64 tx_frames; /* all good frames */
|
||||
@@ -432,6 +438,9 @@ struct link_config {
|
||||
unsigned int speed; /* actual link speed */
|
||||
unsigned char requested_fc; /* flow control user has requested */
|
||||
unsigned char fc; /* actual link flow control */
|
||||
unsigned char auto_fec; /* Forward Error Correction: */
|
||||
unsigned char requested_fec; /* "automatic" (IEEE 802.3), */
|
||||
unsigned char fec; /* requested, and actual in use */
|
||||
unsigned char autoneg; /* autonegotiating? */
|
||||
unsigned char link_ok; /* link up? */
|
||||
unsigned char link_down_rc; /* link down reason */
|
||||
|
||||
@@ -3707,7 +3707,8 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
|
||||
struct link_config *lc)
|
||||
{
|
||||
struct fw_port_cmd c;
|
||||
unsigned int fc = 0, mdi = FW_PORT_CAP_MDI_V(FW_PORT_CAP_MDI_AUTO);
|
||||
unsigned int mdi = FW_PORT_CAP_MDI_V(FW_PORT_CAP_MDI_AUTO);
|
||||
unsigned int fc = 0, fec = 0, fw_fec = 0;
|
||||
|
||||
lc->link_ok = 0;
|
||||
if (lc->requested_fc & PAUSE_RX)
|
||||
@@ -3715,6 +3716,13 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
|
||||
if (lc->requested_fc & PAUSE_TX)
|
||||
fc |= FW_PORT_CAP_FC_TX;
|
||||
|
||||
fec = lc->requested_fec & FEC_AUTO ? lc->auto_fec : lc->requested_fec;
|
||||
|
||||
if (fec & FEC_RS)
|
||||
fw_fec |= FW_PORT_CAP_FEC_RS;
|
||||
if (fec & FEC_BASER_RS)
|
||||
fw_fec |= FW_PORT_CAP_FEC_BASER_RS;
|
||||
|
||||
memset(&c, 0, sizeof(c));
|
||||
c.op_to_portid = cpu_to_be32(FW_CMD_OP_V(FW_PORT_CMD) |
|
||||
FW_CMD_REQUEST_F | FW_CMD_EXEC_F |
|
||||
@@ -3725,13 +3733,15 @@ int t4_link_l1cfg(struct adapter *adap, unsigned int mbox, unsigned int port,
|
||||
|
||||
if (!(lc->supported & FW_PORT_CAP_ANEG)) {
|
||||
c.u.l1cfg.rcap = cpu_to_be32((lc->supported & ADVERT_MASK) |
|
||||
fc);
|
||||
fc | fw_fec);
|
||||
lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
|
||||
} else if (lc->autoneg == AUTONEG_DISABLE) {
|
||||
c.u.l1cfg.rcap = cpu_to_be32(lc->requested_speed | fc | mdi);
|
||||
c.u.l1cfg.rcap = cpu_to_be32(lc->requested_speed | fc |
|
||||
fw_fec | mdi);
|
||||
lc->fc = lc->requested_fc & (PAUSE_RX | PAUSE_TX);
|
||||
} else
|
||||
c.u.l1cfg.rcap = cpu_to_be32(lc->advertising | fc | mdi);
|
||||
c.u.l1cfg.rcap = cpu_to_be32(lc->advertising | fc |
|
||||
fw_fec | mdi);
|
||||
|
||||
return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
|
||||
}
|
||||
@@ -7407,13 +7417,26 @@ static void get_pci_mode(struct adapter *adapter, struct pci_params *p)
|
||||
* Initializes the SW state maintained for each link, including the link's
|
||||
* capabilities and default speed/flow-control/autonegotiation settings.
|
||||
*/
|
||||
static void init_link_config(struct link_config *lc, unsigned int caps)
|
||||
static void init_link_config(struct link_config *lc, unsigned int pcaps,
|
||||
unsigned int acaps)
|
||||
{
|
||||
lc->supported = caps;
|
||||
lc->supported = pcaps;
|
||||
lc->lp_advertising = 0;
|
||||
lc->requested_speed = 0;
|
||||
lc->speed = 0;
|
||||
lc->requested_fc = lc->fc = PAUSE_RX | PAUSE_TX;
|
||||
lc->auto_fec = 0;
|
||||
|
||||
/* For Forward Error Control, we default to whatever the Firmware
|
||||
* tells us the Link is currently advertising.
|
||||
*/
|
||||
if (acaps & FW_PORT_CAP_FEC_RS)
|
||||
lc->auto_fec |= FEC_RS;
|
||||
if (acaps & FW_PORT_CAP_FEC_BASER_RS)
|
||||
lc->auto_fec |= FEC_BASER_RS;
|
||||
lc->requested_fec = FEC_AUTO;
|
||||
lc->fec = lc->auto_fec;
|
||||
|
||||
if (lc->supported & FW_PORT_CAP_ANEG) {
|
||||
lc->advertising = lc->supported & ADVERT_MASK;
|
||||
lc->autoneg = AUTONEG_ENABLE;
|
||||
@@ -7991,7 +8014,8 @@ int t4_init_portinfo(struct port_info *pi, int mbox,
|
||||
pi->port_type = FW_PORT_CMD_PTYPE_G(ret);
|
||||
pi->mod_type = FW_PORT_MOD_TYPE_NA;
|
||||
|
||||
init_link_config(&pi->link_cfg, be16_to_cpu(c.u.info.pcap));
|
||||
init_link_config(&pi->link_cfg, be16_to_cpu(c.u.info.pcap),
|
||||
be16_to_cpu(c.u.info.acap));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2263,9 +2263,9 @@ enum fw_port_cap {
|
||||
FW_PORT_CAP_ANEG = 0x0100,
|
||||
FW_PORT_CAP_MDIX = 0x0200,
|
||||
FW_PORT_CAP_MDIAUTO = 0x0400,
|
||||
FW_PORT_CAP_FEC = 0x0800,
|
||||
FW_PORT_CAP_TECHKR = 0x1000,
|
||||
FW_PORT_CAP_TECHKX4 = 0x2000,
|
||||
FW_PORT_CAP_FEC_RS = 0x0800,
|
||||
FW_PORT_CAP_FEC_BASER_RS = 0x1000,
|
||||
FW_PORT_CAP_FEC_RESERVED = 0x2000,
|
||||
FW_PORT_CAP_802_3_PAUSE = 0x4000,
|
||||
FW_PORT_CAP_802_3_ASM_DIR = 0x8000,
|
||||
};
|
||||
|
||||
@@ -1789,9 +1789,17 @@ static int mlx4_master_process_vhcr(struct mlx4_dev *dev, int slave,
|
||||
}
|
||||
|
||||
if (err) {
|
||||
if (!(dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR))
|
||||
mlx4_warn(dev, "vhcr command:0x%x slave:%d failed with error:%d, status %d\n",
|
||||
vhcr->op, slave, vhcr->errno, err);
|
||||
if (!(dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR)) {
|
||||
if (vhcr->op == MLX4_CMD_ALLOC_RES &&
|
||||
(vhcr->in_modifier & 0xff) == RES_COUNTER &&
|
||||
err == -EDQUOT)
|
||||
mlx4_dbg(dev,
|
||||
"Unable to allocate counter for slave %d (%d)\n",
|
||||
slave, err);
|
||||
else
|
||||
mlx4_warn(dev, "vhcr command:0x%x slave:%d failed with error:%d, status %d\n",
|
||||
vhcr->op, slave, vhcr->errno, err);
|
||||
}
|
||||
vhcr_cmd->status = mlx4_errno_to_status(err);
|
||||
goto out_status;
|
||||
}
|
||||
|
||||
@@ -1562,6 +1562,11 @@ static int mlx4_en_flow_replace(struct net_device *dev,
|
||||
qpn = priv->drop_qp.qpn;
|
||||
else if (cmd->fs.ring_cookie & EN_ETHTOOL_QP_ATTACH) {
|
||||
qpn = cmd->fs.ring_cookie & (EN_ETHTOOL_QP_ATTACH - 1);
|
||||
if (qpn < priv->rss_map.base_qpn ||
|
||||
qpn >= priv->rss_map.base_qpn + priv->rx_ring_num) {
|
||||
en_warn(priv, "rxnfc: QP (0x%x) doesn't exist\n", qpn);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else {
|
||||
if (cmd->fs.ring_cookie >= priv->rx_ring_num) {
|
||||
en_warn(priv, "rxnfc: RX ring (%llu) doesn't exist\n",
|
||||
|
||||
@@ -997,7 +997,8 @@ void mlx4_en_calc_rx_buf(struct net_device *dev)
|
||||
en_dbg(DRV, priv, "Rx buffer scatter-list (effective-mtu:%d num_frags:%d):\n",
|
||||
eff_mtu, priv->num_frags);
|
||||
for (i = 0; i < priv->num_frags; i++) {
|
||||
en_err(priv,
|
||||
en_dbg(DRV,
|
||||
priv,
|
||||
" frag:%d - size:%d stride:%d\n",
|
||||
i,
|
||||
priv->frag_info[i].frag_size,
|
||||
|
||||
@@ -311,7 +311,7 @@ static inline int mlx4_grant_resource(struct mlx4_dev *dev, int slave,
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
struct resource_allocator *res_alloc =
|
||||
&priv->mfunc.master.res_tracker.res_alloc[res_type];
|
||||
int err = -EINVAL;
|
||||
int err = -EDQUOT;
|
||||
int allocated, free, reserved, guaranteed, from_free;
|
||||
int from_rsvd;
|
||||
|
||||
|
||||
@@ -1460,6 +1460,7 @@ void qed_qm_init_pf(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
|
||||
params.is_first_pf = p_hwfn->first_on_engine;
|
||||
params.num_pf_cids = iids.cids;
|
||||
params.num_vf_cids = iids.vf_cids;
|
||||
params.num_tids = iids.tids;
|
||||
params.start_pq = qm_info->start_pq;
|
||||
params.num_pf_pqs = qm_info->num_pqs - qm_info->num_vf_pqs;
|
||||
params.num_vf_pqs = qm_info->num_vf_pqs;
|
||||
|
||||
@@ -1370,7 +1370,7 @@ qed_hw_init_pf_doorbell_bar(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
|
||||
NULL) +
|
||||
qed_cxt_get_proto_cid_count(p_hwfn, PROTOCOLID_ETH,
|
||||
NULL);
|
||||
norm_regsize = roundup(QED_PF_DEMS_SIZE * non_pwm_conn, 4096);
|
||||
norm_regsize = roundup(QED_PF_DEMS_SIZE * non_pwm_conn, PAGE_SIZE);
|
||||
min_addr_reg1 = norm_regsize / 4096;
|
||||
pwm_regsize = db_bar_size - norm_regsize;
|
||||
|
||||
|
||||
@@ -1093,11 +1093,13 @@ static int qed_slowpath_stop(struct qed_dev *cdev)
|
||||
qed_free_stream_mem(cdev);
|
||||
if (IS_QED_ETH_IF(cdev))
|
||||
qed_sriov_disable(cdev, true);
|
||||
|
||||
qed_nic_stop(cdev);
|
||||
qed_slowpath_irq_free(cdev);
|
||||
}
|
||||
|
||||
qed_nic_stop(cdev);
|
||||
|
||||
if (IS_PF(cdev))
|
||||
qed_slowpath_irq_free(cdev);
|
||||
|
||||
qed_disable_msix(cdev);
|
||||
|
||||
qed_resc_free(cdev);
|
||||
|
||||
@@ -1028,11 +1028,6 @@ int qede_xdp(struct net_device *dev, struct netdev_xdp *xdp)
|
||||
{
|
||||
struct qede_dev *edev = netdev_priv(dev);
|
||||
|
||||
if (IS_VF(edev)) {
|
||||
DP_NOTICE(edev, "VFs don't support XDP\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
switch (xdp->command) {
|
||||
case XDP_SETUP_PROG:
|
||||
return qede_xdp_set(edev, xdp->prog);
|
||||
|
||||
@@ -563,6 +563,23 @@ static const struct net_device_ops qede_netdev_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct net_device_ops qede_netdev_vf_ops = {
|
||||
.ndo_open = qede_open,
|
||||
.ndo_stop = qede_close,
|
||||
.ndo_start_xmit = qede_start_xmit,
|
||||
.ndo_set_rx_mode = qede_set_rx_mode,
|
||||
.ndo_set_mac_address = qede_set_mac_addr,
|
||||
.ndo_validate_addr = eth_validate_addr,
|
||||
.ndo_change_mtu = qede_change_mtu,
|
||||
.ndo_vlan_rx_add_vid = qede_vlan_rx_add_vid,
|
||||
.ndo_vlan_rx_kill_vid = qede_vlan_rx_kill_vid,
|
||||
.ndo_set_features = qede_set_features,
|
||||
.ndo_get_stats64 = qede_get_stats64,
|
||||
.ndo_udp_tunnel_add = qede_udp_tunnel_add,
|
||||
.ndo_udp_tunnel_del = qede_udp_tunnel_del,
|
||||
.ndo_features_check = qede_features_check,
|
||||
};
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
* START OF PROBE / REMOVE
|
||||
* -------------------------------------------------------------------------
|
||||
@@ -622,7 +639,10 @@ static void qede_init_ndev(struct qede_dev *edev)
|
||||
|
||||
ndev->watchdog_timeo = TX_TIMEOUT;
|
||||
|
||||
ndev->netdev_ops = &qede_netdev_ops;
|
||||
if (IS_VF(edev))
|
||||
ndev->netdev_ops = &qede_netdev_vf_ops;
|
||||
else
|
||||
ndev->netdev_ops = &qede_netdev_ops;
|
||||
|
||||
qede_set_ethtool_ops(ndev);
|
||||
|
||||
@@ -1313,6 +1333,9 @@ static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp)
|
||||
if (fp->type & QEDE_FASTPATH_RX)
|
||||
qede_free_mem_rxq(edev, fp->rxq);
|
||||
|
||||
if (fp->type & QEDE_FASTPATH_XDP)
|
||||
qede_free_mem_txq(edev, fp->xdp_tx);
|
||||
|
||||
if (fp->type & QEDE_FASTPATH_TX)
|
||||
qede_free_mem_txq(edev, fp->txq);
|
||||
}
|
||||
|
||||
@@ -765,7 +765,7 @@ int ql_core_dump(struct ql_adapter *qdev, struct ql_mpi_coredump *mpi_coredump)
|
||||
sizeof(struct mpi_coredump_global_header);
|
||||
mpi_coredump->mpi_global_header.imageSize =
|
||||
sizeof(struct ql_mpi_coredump);
|
||||
memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
|
||||
strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
|
||||
sizeof(mpi_coredump->mpi_global_header.idString));
|
||||
|
||||
/* Get generic NIC reg dump */
|
||||
@@ -1255,7 +1255,7 @@ static void ql_gen_reg_dump(struct ql_adapter *qdev,
|
||||
sizeof(struct mpi_coredump_global_header);
|
||||
mpi_coredump->mpi_global_header.imageSize =
|
||||
sizeof(struct ql_reg_dump);
|
||||
memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
|
||||
strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
|
||||
sizeof(mpi_coredump->mpi_global_header.idString));
|
||||
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user