Commit a7fe0881 authored by Paolo Abeni's avatar Paolo Abeni
Browse files


Merge in late fixes to prepare for the 6.8 net-next PR

No conflicts.

Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 9b0f5109 ac631873
Loading
Loading
Loading
Loading
+2 −13
Original line number Diff line number Diff line
@@ -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
+13 −13
Original line number Diff line number Diff line
@@ -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);
	phy_start(phydev);

	err = mlxbf_gige_tx_init(priv);
	if (err)
		goto free_irqs;
	err = mlxbf_gige_tx_init(priv);
	err = mlxbf_gige_rx_init(priv);
	if (err)
		goto rx_deinit;

	phy_start(phydev);
		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;
+3 −3
Original line number Diff line number Diff line
@@ -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:
+2 −7
Original line number Diff line number Diff line
@@ -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);
		}
	}
+13 −13
Original line number Diff line number Diff line
@@ -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 (nexthdr == NEXTHDR_DEST) {
			u16 i = 2;

			/* Remember : hdr is no longer valid at this point. */
		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;

			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;
Loading