Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Merge in late fixes to prepare for the 6.8 net-next PR No conflicts. Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
commit
a7fe0881d9
@ -79,8 +79,7 @@ MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)");
|
||||
#define GMAC0_IRQ4_8 (GMAC0_MIB_INT_BIT | GMAC0_RX_OVERRUN_INT_BIT)
|
||||
|
||||
#define GMAC_OFFLOAD_FEATURES (NETIF_F_SG | NETIF_F_IP_CSUM | \
|
||||
NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | \
|
||||
NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
|
||||
NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM)
|
||||
|
||||
/**
|
||||
* struct gmac_queue_page - page buffer per-page info
|
||||
@ -1143,23 +1142,13 @@ static int gmac_map_tx_bufs(struct net_device *netdev, struct sk_buff *skb,
|
||||
struct gmac_txdesc *txd;
|
||||
skb_frag_t *skb_frag;
|
||||
dma_addr_t mapping;
|
||||
unsigned short mtu;
|
||||
void *buffer;
|
||||
int ret;
|
||||
|
||||
mtu = ETH_HLEN;
|
||||
mtu += netdev->mtu;
|
||||
if (skb->protocol == htons(ETH_P_8021Q))
|
||||
mtu += VLAN_HLEN;
|
||||
|
||||
/* TODO: implement proper TSO using MTU in word3 */
|
||||
word1 = skb->len;
|
||||
word3 = SOF_BIT;
|
||||
|
||||
if (word1 > mtu) {
|
||||
word1 |= TSS_MTU_ENABLE_BIT;
|
||||
word3 |= mtu;
|
||||
}
|
||||
|
||||
if (skb->len >= ETH_FRAME_LEN) {
|
||||
/* Hardware offloaded checksumming isn't working on frames
|
||||
* bigger than 1514 bytes. A hypothesis about this is that the
|
||||
|
@ -130,9 +130,15 @@ static int mlxbf_gige_open(struct net_device *netdev)
|
||||
{
|
||||
struct mlxbf_gige *priv = netdev_priv(netdev);
|
||||
struct phy_device *phydev = netdev->phydev;
|
||||
u64 control;
|
||||
u64 int_en;
|
||||
int err;
|
||||
|
||||
/* Perform general init of GigE block */
|
||||
control = readq(priv->base + MLXBF_GIGE_CONTROL);
|
||||
control |= MLXBF_GIGE_CONTROL_PORT_EN;
|
||||
writeq(control, priv->base + MLXBF_GIGE_CONTROL);
|
||||
|
||||
err = mlxbf_gige_request_irqs(priv);
|
||||
if (err)
|
||||
return err;
|
||||
@ -147,14 +153,14 @@ static int mlxbf_gige_open(struct net_device *netdev)
|
||||
*/
|
||||
priv->valid_polarity = 0;
|
||||
|
||||
err = mlxbf_gige_rx_init(priv);
|
||||
if (err)
|
||||
goto free_irqs;
|
||||
phy_start(phydev);
|
||||
|
||||
err = mlxbf_gige_tx_init(priv);
|
||||
if (err)
|
||||
goto rx_deinit;
|
||||
|
||||
phy_start(phydev);
|
||||
goto free_irqs;
|
||||
err = mlxbf_gige_rx_init(priv);
|
||||
if (err)
|
||||
goto tx_deinit;
|
||||
|
||||
netif_napi_add(netdev, &priv->napi, mlxbf_gige_poll);
|
||||
napi_enable(&priv->napi);
|
||||
@ -176,8 +182,8 @@ static int mlxbf_gige_open(struct net_device *netdev)
|
||||
|
||||
return 0;
|
||||
|
||||
rx_deinit:
|
||||
mlxbf_gige_rx_deinit(priv);
|
||||
tx_deinit:
|
||||
mlxbf_gige_tx_deinit(priv);
|
||||
|
||||
free_irqs:
|
||||
mlxbf_gige_free_irqs(priv);
|
||||
@ -365,7 +371,6 @@ static int mlxbf_gige_probe(struct platform_device *pdev)
|
||||
void __iomem *plu_base;
|
||||
void __iomem *base;
|
||||
int addr, phy_irq;
|
||||
u64 control;
|
||||
int err;
|
||||
|
||||
base = devm_platform_ioremap_resource(pdev, MLXBF_GIGE_RES_MAC);
|
||||
@ -380,11 +385,6 @@ static int mlxbf_gige_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(plu_base))
|
||||
return PTR_ERR(plu_base);
|
||||
|
||||
/* Perform general init of GigE block */
|
||||
control = readq(base + MLXBF_GIGE_CONTROL);
|
||||
control |= MLXBF_GIGE_CONTROL_PORT_EN;
|
||||
writeq(control, base + MLXBF_GIGE_CONTROL);
|
||||
|
||||
netdev = devm_alloc_etherdev(&pdev->dev, sizeof(*priv));
|
||||
if (!netdev)
|
||||
return -ENOMEM;
|
||||
|
@ -142,6 +142,9 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv)
|
||||
writeq(MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS_EN,
|
||||
priv->base + MLXBF_GIGE_RX_MAC_FILTER_COUNT_PASS);
|
||||
|
||||
writeq(ilog2(priv->rx_q_entries),
|
||||
priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2);
|
||||
|
||||
/* Clear MLXBF_GIGE_INT_MASK 'receive pkt' bit to
|
||||
* indicate readiness to receive interrupts
|
||||
*/
|
||||
@ -154,9 +157,6 @@ int mlxbf_gige_rx_init(struct mlxbf_gige *priv)
|
||||
data |= MLXBF_GIGE_RX_DMA_EN;
|
||||
writeq(data, priv->base + MLXBF_GIGE_RX_DMA);
|
||||
|
||||
writeq(ilog2(priv->rx_q_entries),
|
||||
priv->base + MLXBF_GIGE_RX_WQE_SIZE_LOG2);
|
||||
|
||||
return 0;
|
||||
|
||||
free_wqe_and_skb:
|
||||
|
@ -553,15 +553,12 @@ static void stmmac_get_per_qstats(struct stmmac_priv *priv, u64 *data)
|
||||
u32 rx_cnt = priv->plat->rx_queues_to_use;
|
||||
unsigned int start;
|
||||
int q, stat;
|
||||
u64 *pos;
|
||||
char *p;
|
||||
|
||||
pos = data;
|
||||
for (q = 0; q < tx_cnt; q++) {
|
||||
struct stmmac_txq_stats *txq_stats = &priv->xstats.txq_stats[q];
|
||||
struct stmmac_txq_stats snapshot;
|
||||
|
||||
data = pos;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&txq_stats->syncp);
|
||||
snapshot = *txq_stats;
|
||||
@ -569,17 +566,15 @@ static void stmmac_get_per_qstats(struct stmmac_priv *priv, u64 *data)
|
||||
|
||||
p = (char *)&snapshot + offsetof(struct stmmac_txq_stats, tx_pkt_n);
|
||||
for (stat = 0; stat < STMMAC_TXQ_STATS; stat++) {
|
||||
*data++ += (*(u64 *)p);
|
||||
*data++ = (*(u64 *)p);
|
||||
p += sizeof(u64);
|
||||
}
|
||||
}
|
||||
|
||||
pos = data;
|
||||
for (q = 0; q < rx_cnt; q++) {
|
||||
struct stmmac_rxq_stats *rxq_stats = &priv->xstats.rxq_stats[q];
|
||||
struct stmmac_rxq_stats snapshot;
|
||||
|
||||
data = pos;
|
||||
do {
|
||||
start = u64_stats_fetch_begin(&rxq_stats->syncp);
|
||||
snapshot = *rxq_stats;
|
||||
@ -587,7 +582,7 @@ static void stmmac_get_per_qstats(struct stmmac_priv *priv, u64 *data)
|
||||
|
||||
p = (char *)&snapshot + offsetof(struct stmmac_rxq_stats, rx_pkt_n);
|
||||
for (stat = 0; stat < STMMAC_RXQ_STATS; stat++) {
|
||||
*data++ += (*(u64 *)p);
|
||||
*data++ = (*(u64 *)p);
|
||||
p += sizeof(u64);
|
||||
}
|
||||
}
|
||||
|
@ -399,7 +399,7 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw)
|
||||
const struct ipv6hdr *ipv6h = (const struct ipv6hdr *)raw;
|
||||
unsigned int nhoff = raw - skb->data;
|
||||
unsigned int off = nhoff + sizeof(*ipv6h);
|
||||
u8 next, nexthdr = ipv6h->nexthdr;
|
||||
u8 nexthdr = ipv6h->nexthdr;
|
||||
|
||||
while (ipv6_ext_hdr(nexthdr) && nexthdr != NEXTHDR_NONE) {
|
||||
struct ipv6_opt_hdr *hdr;
|
||||
@ -410,26 +410,26 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw)
|
||||
|
||||
hdr = (struct ipv6_opt_hdr *)(skb->data + off);
|
||||
if (nexthdr == NEXTHDR_FRAGMENT) {
|
||||
struct frag_hdr *frag_hdr = (struct frag_hdr *) hdr;
|
||||
if (frag_hdr->frag_off)
|
||||
break;
|
||||
optlen = 8;
|
||||
} else if (nexthdr == NEXTHDR_AUTH) {
|
||||
optlen = ipv6_authlen(hdr);
|
||||
} else {
|
||||
optlen = ipv6_optlen(hdr);
|
||||
}
|
||||
/* cache hdr->nexthdr, since pskb_may_pull() might
|
||||
* invalidate hdr
|
||||
*/
|
||||
next = hdr->nexthdr;
|
||||
|
||||
if (!pskb_may_pull(skb, off + optlen))
|
||||
break;
|
||||
|
||||
hdr = (struct ipv6_opt_hdr *)(skb->data + off);
|
||||
if (nexthdr == NEXTHDR_FRAGMENT) {
|
||||
struct frag_hdr *frag_hdr = (struct frag_hdr *)hdr;
|
||||
|
||||
if (frag_hdr->frag_off)
|
||||
break;
|
||||
}
|
||||
if (nexthdr == NEXTHDR_DEST) {
|
||||
u16 i = 2;
|
||||
|
||||
/* Remember : hdr is no longer valid at this point. */
|
||||
if (!pskb_may_pull(skb, off + optlen))
|
||||
break;
|
||||
|
||||
while (1) {
|
||||
struct ipv6_tlv_tnl_enc_lim *tel;
|
||||
|
||||
@ -449,7 +449,7 @@ __u16 ip6_tnl_parse_tlv_enc_lim(struct sk_buff *skb, __u8 *raw)
|
||||
i++;
|
||||
}
|
||||
}
|
||||
nexthdr = next;
|
||||
nexthdr = hdr->nexthdr;
|
||||
off += optlen;
|
||||
}
|
||||
return 0;
|
||||
|
@ -545,8 +545,8 @@ void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace why)
|
||||
*/
|
||||
static void rxrpc_cleanup_ring(struct rxrpc_call *call)
|
||||
{
|
||||
skb_queue_purge(&call->recvmsg_queue);
|
||||
skb_queue_purge(&call->rx_oos_queue);
|
||||
rxrpc_purge_queue(&call->recvmsg_queue);
|
||||
rxrpc_purge_queue(&call->rx_oos_queue);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -850,7 +850,6 @@ static int tcf_ct_handle_fragments(struct net *net, struct sk_buff *skb,
|
||||
if (err || !frag)
|
||||
return err;
|
||||
|
||||
skb_get(skb);
|
||||
err = nf_ct_handle_fragments(net, skb, zone, family, &proto, &mru);
|
||||
if (err)
|
||||
return err;
|
||||
@ -999,12 +998,8 @@ TC_INDIRECT_SCOPE int tcf_ct_act(struct sk_buff *skb, const struct tc_action *a,
|
||||
nh_ofs = skb_network_offset(skb);
|
||||
skb_pull_rcsum(skb, nh_ofs);
|
||||
err = tcf_ct_handle_fragments(net, skb, family, p->zone, &defrag);
|
||||
if (err == -EINPROGRESS) {
|
||||
retval = TC_ACT_STOLEN;
|
||||
goto out_clear;
|
||||
}
|
||||
if (err)
|
||||
goto drop;
|
||||
goto out_frag;
|
||||
|
||||
err = nf_ct_skb_network_trim(skb, family);
|
||||
if (err)
|
||||
@ -1091,6 +1086,11 @@ out_clear:
|
||||
qdisc_skb_cb(skb)->pkt_len = skb->len;
|
||||
return retval;
|
||||
|
||||
out_frag:
|
||||
if (err != -EINPROGRESS)
|
||||
tcf_action_inc_drop_qstats(&c->common);
|
||||
return TC_ACT_CONSUMED;
|
||||
|
||||
drop:
|
||||
tcf_action_inc_drop_qstats(&c->common);
|
||||
return TC_ACT_SHOT;
|
||||
|
Loading…
Reference in New Issue
Block a user