cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

stmmac_selftests.c (46377B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (c) 2019 Synopsys, Inc. and/or its affiliates.
      4 * stmmac Selftests Support
      5 *
      6 * Author: Jose Abreu <joabreu@synopsys.com>
      7 */
      8
      9#include <linux/bitrev.h>
     10#include <linux/completion.h>
     11#include <linux/crc32.h>
     12#include <linux/ethtool.h>
     13#include <linux/ip.h>
     14#include <linux/phy.h>
     15#include <linux/udp.h>
     16#include <net/pkt_cls.h>
     17#include <net/pkt_sched.h>
     18#include <net/tcp.h>
     19#include <net/udp.h>
     20#include <net/tc_act/tc_gact.h>
     21#include "stmmac.h"
     22
     23struct stmmachdr {
     24	__be32 version;
     25	__be64 magic;
     26	u8 id;
     27} __packed;
     28
     29#define STMMAC_TEST_PKT_SIZE (sizeof(struct ethhdr) + sizeof(struct iphdr) + \
     30			      sizeof(struct stmmachdr))
     31#define STMMAC_TEST_PKT_MAGIC	0xdeadcafecafedeadULL
     32#define STMMAC_LB_TIMEOUT	msecs_to_jiffies(200)
     33
     34struct stmmac_packet_attrs {
     35	int vlan;
     36	int vlan_id_in;
     37	int vlan_id_out;
     38	unsigned char *src;
     39	const unsigned char *dst;
     40	u32 ip_src;
     41	u32 ip_dst;
     42	int tcp;
     43	int sport;
     44	int dport;
     45	u32 exp_hash;
     46	int dont_wait;
     47	int timeout;
     48	int size;
     49	int max_size;
     50	int remove_sa;
     51	u8 id;
     52	int sarc;
     53	u16 queue_mapping;
     54	u64 timestamp;
     55};
     56
     57static u8 stmmac_test_next_id;
     58
     59static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv,
     60					       struct stmmac_packet_attrs *attr)
     61{
     62	struct sk_buff *skb = NULL;
     63	struct udphdr *uhdr = NULL;
     64	struct tcphdr *thdr = NULL;
     65	struct stmmachdr *shdr;
     66	struct ethhdr *ehdr;
     67	struct iphdr *ihdr;
     68	int iplen, size;
     69
     70	size = attr->size + STMMAC_TEST_PKT_SIZE;
     71	if (attr->vlan) {
     72		size += 4;
     73		if (attr->vlan > 1)
     74			size += 4;
     75	}
     76
     77	if (attr->tcp)
     78		size += sizeof(struct tcphdr);
     79	else
     80		size += sizeof(struct udphdr);
     81
     82	if (attr->max_size && (attr->max_size > size))
     83		size = attr->max_size;
     84
     85	skb = netdev_alloc_skb(priv->dev, size);
     86	if (!skb)
     87		return NULL;
     88
     89	prefetchw(skb->data);
     90
     91	if (attr->vlan > 1)
     92		ehdr = skb_push(skb, ETH_HLEN + 8);
     93	else if (attr->vlan)
     94		ehdr = skb_push(skb, ETH_HLEN + 4);
     95	else if (attr->remove_sa)
     96		ehdr = skb_push(skb, ETH_HLEN - 6);
     97	else
     98		ehdr = skb_push(skb, ETH_HLEN);
     99	skb_reset_mac_header(skb);
    100
    101	skb_set_network_header(skb, skb->len);
    102	ihdr = skb_put(skb, sizeof(*ihdr));
    103
    104	skb_set_transport_header(skb, skb->len);
    105	if (attr->tcp)
    106		thdr = skb_put(skb, sizeof(*thdr));
    107	else
    108		uhdr = skb_put(skb, sizeof(*uhdr));
    109
    110	if (!attr->remove_sa)
    111		eth_zero_addr(ehdr->h_source);
    112	eth_zero_addr(ehdr->h_dest);
    113	if (attr->src && !attr->remove_sa)
    114		ether_addr_copy(ehdr->h_source, attr->src);
    115	if (attr->dst)
    116		ether_addr_copy(ehdr->h_dest, attr->dst);
    117
    118	if (!attr->remove_sa) {
    119		ehdr->h_proto = htons(ETH_P_IP);
    120	} else {
    121		__be16 *ptr = (__be16 *)ehdr;
    122
    123		/* HACK */
    124		ptr[3] = htons(ETH_P_IP);
    125	}
    126
    127	if (attr->vlan) {
    128		__be16 *tag, *proto;
    129
    130		if (!attr->remove_sa) {
    131			tag = (void *)ehdr + ETH_HLEN;
    132			proto = (void *)ehdr + (2 * ETH_ALEN);
    133		} else {
    134			tag = (void *)ehdr + ETH_HLEN - 6;
    135			proto = (void *)ehdr + ETH_ALEN;
    136		}
    137
    138		proto[0] = htons(ETH_P_8021Q);
    139		tag[0] = htons(attr->vlan_id_out);
    140		tag[1] = htons(ETH_P_IP);
    141		if (attr->vlan > 1) {
    142			proto[0] = htons(ETH_P_8021AD);
    143			tag[1] = htons(ETH_P_8021Q);
    144			tag[2] = htons(attr->vlan_id_in);
    145			tag[3] = htons(ETH_P_IP);
    146		}
    147	}
    148
    149	if (attr->tcp) {
    150		thdr->source = htons(attr->sport);
    151		thdr->dest = htons(attr->dport);
    152		thdr->doff = sizeof(struct tcphdr) / 4;
    153		thdr->check = 0;
    154	} else {
    155		uhdr->source = htons(attr->sport);
    156		uhdr->dest = htons(attr->dport);
    157		uhdr->len = htons(sizeof(*shdr) + sizeof(*uhdr) + attr->size);
    158		if (attr->max_size)
    159			uhdr->len = htons(attr->max_size -
    160					  (sizeof(*ihdr) + sizeof(*ehdr)));
    161		uhdr->check = 0;
    162	}
    163
    164	ihdr->ihl = 5;
    165	ihdr->ttl = 32;
    166	ihdr->version = 4;
    167	if (attr->tcp)
    168		ihdr->protocol = IPPROTO_TCP;
    169	else
    170		ihdr->protocol = IPPROTO_UDP;
    171	iplen = sizeof(*ihdr) + sizeof(*shdr) + attr->size;
    172	if (attr->tcp)
    173		iplen += sizeof(*thdr);
    174	else
    175		iplen += sizeof(*uhdr);
    176
    177	if (attr->max_size)
    178		iplen = attr->max_size - sizeof(*ehdr);
    179
    180	ihdr->tot_len = htons(iplen);
    181	ihdr->frag_off = 0;
    182	ihdr->saddr = htonl(attr->ip_src);
    183	ihdr->daddr = htonl(attr->ip_dst);
    184	ihdr->tos = 0;
    185	ihdr->id = 0;
    186	ip_send_check(ihdr);
    187
    188	shdr = skb_put(skb, sizeof(*shdr));
    189	shdr->version = 0;
    190	shdr->magic = cpu_to_be64(STMMAC_TEST_PKT_MAGIC);
    191	attr->id = stmmac_test_next_id;
    192	shdr->id = stmmac_test_next_id++;
    193
    194	if (attr->size)
    195		skb_put(skb, attr->size);
    196	if (attr->max_size && (attr->max_size > skb->len))
    197		skb_put(skb, attr->max_size - skb->len);
    198
    199	skb->csum = 0;
    200	skb->ip_summed = CHECKSUM_PARTIAL;
    201	if (attr->tcp) {
    202		thdr->check = ~tcp_v4_check(skb->len, ihdr->saddr, ihdr->daddr, 0);
    203		skb->csum_start = skb_transport_header(skb) - skb->head;
    204		skb->csum_offset = offsetof(struct tcphdr, check);
    205	} else {
    206		udp4_hwcsum(skb, ihdr->saddr, ihdr->daddr);
    207	}
    208
    209	skb->protocol = htons(ETH_P_IP);
    210	skb->pkt_type = PACKET_HOST;
    211	skb->dev = priv->dev;
    212
    213	if (attr->timestamp)
    214		skb->tstamp = ns_to_ktime(attr->timestamp);
    215
    216	return skb;
    217}
    218
    219static struct sk_buff *stmmac_test_get_arp_skb(struct stmmac_priv *priv,
    220					       struct stmmac_packet_attrs *attr)
    221{
    222	__be32 ip_src = htonl(attr->ip_src);
    223	__be32 ip_dst = htonl(attr->ip_dst);
    224	struct sk_buff *skb = NULL;
    225
    226	skb = arp_create(ARPOP_REQUEST, ETH_P_ARP, ip_dst, priv->dev, ip_src,
    227			 NULL, attr->src, attr->dst);
    228	if (!skb)
    229		return NULL;
    230
    231	skb->pkt_type = PACKET_HOST;
    232	skb->dev = priv->dev;
    233
    234	return skb;
    235}
    236
    237struct stmmac_test_priv {
    238	struct stmmac_packet_attrs *packet;
    239	struct packet_type pt;
    240	struct completion comp;
    241	int double_vlan;
    242	int vlan_id;
    243	int ok;
    244};
    245
    246static int stmmac_test_loopback_validate(struct sk_buff *skb,
    247					 struct net_device *ndev,
    248					 struct packet_type *pt,
    249					 struct net_device *orig_ndev)
    250{
    251	struct stmmac_test_priv *tpriv = pt->af_packet_priv;
    252	const unsigned char *dst = tpriv->packet->dst;
    253	unsigned char *src = tpriv->packet->src;
    254	struct stmmachdr *shdr;
    255	struct ethhdr *ehdr;
    256	struct udphdr *uhdr;
    257	struct tcphdr *thdr;
    258	struct iphdr *ihdr;
    259
    260	skb = skb_unshare(skb, GFP_ATOMIC);
    261	if (!skb)
    262		goto out;
    263
    264	if (skb_linearize(skb))
    265		goto out;
    266	if (skb_headlen(skb) < (STMMAC_TEST_PKT_SIZE - ETH_HLEN))
    267		goto out;
    268
    269	ehdr = (struct ethhdr *)skb_mac_header(skb);
    270	if (dst) {
    271		if (!ether_addr_equal_unaligned(ehdr->h_dest, dst))
    272			goto out;
    273	}
    274	if (tpriv->packet->sarc) {
    275		if (!ether_addr_equal_unaligned(ehdr->h_source, ehdr->h_dest))
    276			goto out;
    277	} else if (src) {
    278		if (!ether_addr_equal_unaligned(ehdr->h_source, src))
    279			goto out;
    280	}
    281
    282	ihdr = ip_hdr(skb);
    283	if (tpriv->double_vlan)
    284		ihdr = (struct iphdr *)(skb_network_header(skb) + 4);
    285
    286	if (tpriv->packet->tcp) {
    287		if (ihdr->protocol != IPPROTO_TCP)
    288			goto out;
    289
    290		thdr = (struct tcphdr *)((u8 *)ihdr + 4 * ihdr->ihl);
    291		if (thdr->dest != htons(tpriv->packet->dport))
    292			goto out;
    293
    294		shdr = (struct stmmachdr *)((u8 *)thdr + sizeof(*thdr));
    295	} else {
    296		if (ihdr->protocol != IPPROTO_UDP)
    297			goto out;
    298
    299		uhdr = (struct udphdr *)((u8 *)ihdr + 4 * ihdr->ihl);
    300		if (uhdr->dest != htons(tpriv->packet->dport))
    301			goto out;
    302
    303		shdr = (struct stmmachdr *)((u8 *)uhdr + sizeof(*uhdr));
    304	}
    305
    306	if (shdr->magic != cpu_to_be64(STMMAC_TEST_PKT_MAGIC))
    307		goto out;
    308	if (tpriv->packet->exp_hash && !skb->hash)
    309		goto out;
    310	if (tpriv->packet->id != shdr->id)
    311		goto out;
    312
    313	tpriv->ok = true;
    314	complete(&tpriv->comp);
    315out:
    316	kfree_skb(skb);
    317	return 0;
    318}
    319
    320static int __stmmac_test_loopback(struct stmmac_priv *priv,
    321				  struct stmmac_packet_attrs *attr)
    322{
    323	struct stmmac_test_priv *tpriv;
    324	struct sk_buff *skb = NULL;
    325	int ret = 0;
    326
    327	tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
    328	if (!tpriv)
    329		return -ENOMEM;
    330
    331	tpriv->ok = false;
    332	init_completion(&tpriv->comp);
    333
    334	tpriv->pt.type = htons(ETH_P_IP);
    335	tpriv->pt.func = stmmac_test_loopback_validate;
    336	tpriv->pt.dev = priv->dev;
    337	tpriv->pt.af_packet_priv = tpriv;
    338	tpriv->packet = attr;
    339
    340	if (!attr->dont_wait)
    341		dev_add_pack(&tpriv->pt);
    342
    343	skb = stmmac_test_get_udp_skb(priv, attr);
    344	if (!skb) {
    345		ret = -ENOMEM;
    346		goto cleanup;
    347	}
    348
    349	ret = dev_direct_xmit(skb, attr->queue_mapping);
    350	if (ret)
    351		goto cleanup;
    352
    353	if (attr->dont_wait)
    354		goto cleanup;
    355
    356	if (!attr->timeout)
    357		attr->timeout = STMMAC_LB_TIMEOUT;
    358
    359	wait_for_completion_timeout(&tpriv->comp, attr->timeout);
    360	ret = tpriv->ok ? 0 : -ETIMEDOUT;
    361
    362cleanup:
    363	if (!attr->dont_wait)
    364		dev_remove_pack(&tpriv->pt);
    365	kfree(tpriv);
    366	return ret;
    367}
    368
    369static int stmmac_test_mac_loopback(struct stmmac_priv *priv)
    370{
    371	struct stmmac_packet_attrs attr = { };
    372
    373	attr.dst = priv->dev->dev_addr;
    374	return __stmmac_test_loopback(priv, &attr);
    375}
    376
    377static int stmmac_test_phy_loopback(struct stmmac_priv *priv)
    378{
    379	struct stmmac_packet_attrs attr = { };
    380	int ret;
    381
    382	if (!priv->dev->phydev)
    383		return -EOPNOTSUPP;
    384
    385	ret = phy_loopback(priv->dev->phydev, true);
    386	if (ret)
    387		return ret;
    388
    389	attr.dst = priv->dev->dev_addr;
    390	ret = __stmmac_test_loopback(priv, &attr);
    391
    392	phy_loopback(priv->dev->phydev, false);
    393	return ret;
    394}
    395
    396static int stmmac_test_mmc(struct stmmac_priv *priv)
    397{
    398	struct stmmac_counters initial, final;
    399	int ret;
    400
    401	memset(&initial, 0, sizeof(initial));
    402	memset(&final, 0, sizeof(final));
    403
    404	if (!priv->dma_cap.rmon)
    405		return -EOPNOTSUPP;
    406
    407	/* Save previous results into internal struct */
    408	stmmac_mmc_read(priv, priv->mmcaddr, &priv->mmc);
    409
    410	ret = stmmac_test_mac_loopback(priv);
    411	if (ret)
    412		return ret;
    413
    414	/* These will be loopback results so no need to save them */
    415	stmmac_mmc_read(priv, priv->mmcaddr, &final);
    416
    417	/*
    418	 * The number of MMC counters available depends on HW configuration
    419	 * so we just use this one to validate the feature. I hope there is
    420	 * not a version without this counter.
    421	 */
    422	if (final.mmc_tx_framecount_g <= initial.mmc_tx_framecount_g)
    423		return -EINVAL;
    424
    425	return 0;
    426}
    427
    428static int stmmac_test_eee(struct stmmac_priv *priv)
    429{
    430	struct stmmac_extra_stats *initial, *final;
    431	int retries = 10;
    432	int ret;
    433
    434	if (!priv->dma_cap.eee || !priv->eee_active)
    435		return -EOPNOTSUPP;
    436
    437	initial = kzalloc(sizeof(*initial), GFP_KERNEL);
    438	if (!initial)
    439		return -ENOMEM;
    440
    441	final = kzalloc(sizeof(*final), GFP_KERNEL);
    442	if (!final) {
    443		ret = -ENOMEM;
    444		goto out_free_initial;
    445	}
    446
    447	memcpy(initial, &priv->xstats, sizeof(*initial));
    448
    449	ret = stmmac_test_mac_loopback(priv);
    450	if (ret)
    451		goto out_free_final;
    452
    453	/* We have no traffic in the line so, sooner or later it will go LPI */
    454	while (--retries) {
    455		memcpy(final, &priv->xstats, sizeof(*final));
    456
    457		if (final->irq_tx_path_in_lpi_mode_n >
    458		    initial->irq_tx_path_in_lpi_mode_n)
    459			break;
    460		msleep(100);
    461	}
    462
    463	if (!retries) {
    464		ret = -ETIMEDOUT;
    465		goto out_free_final;
    466	}
    467
    468	if (final->irq_tx_path_in_lpi_mode_n <=
    469	    initial->irq_tx_path_in_lpi_mode_n) {
    470		ret = -EINVAL;
    471		goto out_free_final;
    472	}
    473
    474	if (final->irq_tx_path_exit_lpi_mode_n <=
    475	    initial->irq_tx_path_exit_lpi_mode_n) {
    476		ret = -EINVAL;
    477		goto out_free_final;
    478	}
    479
    480out_free_final:
    481	kfree(final);
    482out_free_initial:
    483	kfree(initial);
    484	return ret;
    485}
    486
    487static int stmmac_filter_check(struct stmmac_priv *priv)
    488{
    489	if (!(priv->dev->flags & IFF_PROMISC))
    490		return 0;
    491
    492	netdev_warn(priv->dev, "Test can't be run in promiscuous mode!\n");
    493	return -EOPNOTSUPP;
    494}
    495
    496static bool stmmac_hash_check(struct stmmac_priv *priv, unsigned char *addr)
    497{
    498	int mc_offset = 32 - priv->hw->mcast_bits_log2;
    499	struct netdev_hw_addr *ha;
    500	u32 hash, hash_nr;
    501
    502	/* First compute the hash for desired addr */
    503	hash = bitrev32(~crc32_le(~0, addr, 6)) >> mc_offset;
    504	hash_nr = hash >> 5;
    505	hash = 1 << (hash & 0x1f);
    506
    507	/* Now, check if it collides with any existing one */
    508	netdev_for_each_mc_addr(ha, priv->dev) {
    509		u32 nr = bitrev32(~crc32_le(~0, ha->addr, ETH_ALEN)) >> mc_offset;
    510		if (((nr >> 5) == hash_nr) && ((1 << (nr & 0x1f)) == hash))
    511			return false;
    512	}
    513
    514	/* No collisions, address is good to go */
    515	return true;
    516}
    517
    518static bool stmmac_perfect_check(struct stmmac_priv *priv, unsigned char *addr)
    519{
    520	struct netdev_hw_addr *ha;
    521
    522	/* Check if it collides with any existing one */
    523	netdev_for_each_uc_addr(ha, priv->dev) {
    524		if (!memcmp(ha->addr, addr, ETH_ALEN))
    525			return false;
    526	}
    527
    528	/* No collisions, address is good to go */
    529	return true;
    530}
    531
    532static int stmmac_test_hfilt(struct stmmac_priv *priv)
    533{
    534	unsigned char gd_addr[ETH_ALEN] = {0xf1, 0xee, 0xdd, 0xcc, 0xbb, 0xaa};
    535	unsigned char bd_addr[ETH_ALEN] = {0xf1, 0xff, 0xff, 0xff, 0xff, 0xff};
    536	struct stmmac_packet_attrs attr = { };
    537	int ret, tries = 256;
    538
    539	ret = stmmac_filter_check(priv);
    540	if (ret)
    541		return ret;
    542
    543	if (netdev_mc_count(priv->dev) >= priv->hw->multicast_filter_bins)
    544		return -EOPNOTSUPP;
    545
    546	while (--tries) {
    547		/* We only need to check the bd_addr for collisions */
    548		bd_addr[ETH_ALEN - 1] = tries;
    549		if (stmmac_hash_check(priv, bd_addr))
    550			break;
    551	}
    552
    553	if (!tries)
    554		return -EOPNOTSUPP;
    555
    556	ret = dev_mc_add(priv->dev, gd_addr);
    557	if (ret)
    558		return ret;
    559
    560	attr.dst = gd_addr;
    561
    562	/* Shall receive packet */
    563	ret = __stmmac_test_loopback(priv, &attr);
    564	if (ret)
    565		goto cleanup;
    566
    567	attr.dst = bd_addr;
    568
    569	/* Shall NOT receive packet */
    570	ret = __stmmac_test_loopback(priv, &attr);
    571	ret = ret ? 0 : -EINVAL;
    572
    573cleanup:
    574	dev_mc_del(priv->dev, gd_addr);
    575	return ret;
    576}
    577
    578static int stmmac_test_pfilt(struct stmmac_priv *priv)
    579{
    580	unsigned char gd_addr[ETH_ALEN] = {0xf0, 0x01, 0x44, 0x55, 0x66, 0x77};
    581	unsigned char bd_addr[ETH_ALEN] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff};
    582	struct stmmac_packet_attrs attr = { };
    583	int ret, tries = 256;
    584
    585	if (stmmac_filter_check(priv))
    586		return -EOPNOTSUPP;
    587	if (netdev_uc_count(priv->dev) >= priv->hw->unicast_filter_entries)
    588		return -EOPNOTSUPP;
    589
    590	while (--tries) {
    591		/* We only need to check the bd_addr for collisions */
    592		bd_addr[ETH_ALEN - 1] = tries;
    593		if (stmmac_perfect_check(priv, bd_addr))
    594			break;
    595	}
    596
    597	if (!tries)
    598		return -EOPNOTSUPP;
    599
    600	ret = dev_uc_add(priv->dev, gd_addr);
    601	if (ret)
    602		return ret;
    603
    604	attr.dst = gd_addr;
    605
    606	/* Shall receive packet */
    607	ret = __stmmac_test_loopback(priv, &attr);
    608	if (ret)
    609		goto cleanup;
    610
    611	attr.dst = bd_addr;
    612
    613	/* Shall NOT receive packet */
    614	ret = __stmmac_test_loopback(priv, &attr);
    615	ret = ret ? 0 : -EINVAL;
    616
    617cleanup:
    618	dev_uc_del(priv->dev, gd_addr);
    619	return ret;
    620}
    621
    622static int stmmac_test_mcfilt(struct stmmac_priv *priv)
    623{
    624	unsigned char uc_addr[ETH_ALEN] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff};
    625	unsigned char mc_addr[ETH_ALEN] = {0xf1, 0xff, 0xff, 0xff, 0xff, 0xff};
    626	struct stmmac_packet_attrs attr = { };
    627	int ret, tries = 256;
    628
    629	if (stmmac_filter_check(priv))
    630		return -EOPNOTSUPP;
    631	if (netdev_uc_count(priv->dev) >= priv->hw->unicast_filter_entries)
    632		return -EOPNOTSUPP;
    633	if (netdev_mc_count(priv->dev) >= priv->hw->multicast_filter_bins)
    634		return -EOPNOTSUPP;
    635
    636	while (--tries) {
    637		/* We only need to check the mc_addr for collisions */
    638		mc_addr[ETH_ALEN - 1] = tries;
    639		if (stmmac_hash_check(priv, mc_addr))
    640			break;
    641	}
    642
    643	if (!tries)
    644		return -EOPNOTSUPP;
    645
    646	ret = dev_uc_add(priv->dev, uc_addr);
    647	if (ret)
    648		return ret;
    649
    650	attr.dst = uc_addr;
    651
    652	/* Shall receive packet */
    653	ret = __stmmac_test_loopback(priv, &attr);
    654	if (ret)
    655		goto cleanup;
    656
    657	attr.dst = mc_addr;
    658
    659	/* Shall NOT receive packet */
    660	ret = __stmmac_test_loopback(priv, &attr);
    661	ret = ret ? 0 : -EINVAL;
    662
    663cleanup:
    664	dev_uc_del(priv->dev, uc_addr);
    665	return ret;
    666}
    667
    668static int stmmac_test_ucfilt(struct stmmac_priv *priv)
    669{
    670	unsigned char uc_addr[ETH_ALEN] = {0xf0, 0xff, 0xff, 0xff, 0xff, 0xff};
    671	unsigned char mc_addr[ETH_ALEN] = {0xf1, 0xff, 0xff, 0xff, 0xff, 0xff};
    672	struct stmmac_packet_attrs attr = { };
    673	int ret, tries = 256;
    674
    675	if (stmmac_filter_check(priv))
    676		return -EOPNOTSUPP;
    677	if (netdev_uc_count(priv->dev) >= priv->hw->unicast_filter_entries)
    678		return -EOPNOTSUPP;
    679	if (netdev_mc_count(priv->dev) >= priv->hw->multicast_filter_bins)
    680		return -EOPNOTSUPP;
    681
    682	while (--tries) {
    683		/* We only need to check the uc_addr for collisions */
    684		uc_addr[ETH_ALEN - 1] = tries;
    685		if (stmmac_perfect_check(priv, uc_addr))
    686			break;
    687	}
    688
    689	if (!tries)
    690		return -EOPNOTSUPP;
    691
    692	ret = dev_mc_add(priv->dev, mc_addr);
    693	if (ret)
    694		return ret;
    695
    696	attr.dst = mc_addr;
    697
    698	/* Shall receive packet */
    699	ret = __stmmac_test_loopback(priv, &attr);
    700	if (ret)
    701		goto cleanup;
    702
    703	attr.dst = uc_addr;
    704
    705	/* Shall NOT receive packet */
    706	ret = __stmmac_test_loopback(priv, &attr);
    707	ret = ret ? 0 : -EINVAL;
    708
    709cleanup:
    710	dev_mc_del(priv->dev, mc_addr);
    711	return ret;
    712}
    713
    714static int stmmac_test_flowctrl_validate(struct sk_buff *skb,
    715					 struct net_device *ndev,
    716					 struct packet_type *pt,
    717					 struct net_device *orig_ndev)
    718{
    719	struct stmmac_test_priv *tpriv = pt->af_packet_priv;
    720	struct ethhdr *ehdr;
    721
    722	ehdr = (struct ethhdr *)skb_mac_header(skb);
    723	if (!ether_addr_equal_unaligned(ehdr->h_source, orig_ndev->dev_addr))
    724		goto out;
    725	if (ehdr->h_proto != htons(ETH_P_PAUSE))
    726		goto out;
    727
    728	tpriv->ok = true;
    729	complete(&tpriv->comp);
    730out:
    731	kfree_skb(skb);
    732	return 0;
    733}
    734
    735static int stmmac_test_flowctrl(struct stmmac_priv *priv)
    736{
    737	unsigned char paddr[ETH_ALEN] = {0x01, 0x80, 0xC2, 0x00, 0x00, 0x01};
    738	struct phy_device *phydev = priv->dev->phydev;
    739	u32 rx_cnt = priv->plat->rx_queues_to_use;
    740	struct stmmac_test_priv *tpriv;
    741	unsigned int pkt_count;
    742	int i, ret = 0;
    743
    744	if (!phydev || (!phydev->pause && !phydev->asym_pause))
    745		return -EOPNOTSUPP;
    746
    747	tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
    748	if (!tpriv)
    749		return -ENOMEM;
    750
    751	tpriv->ok = false;
    752	init_completion(&tpriv->comp);
    753	tpriv->pt.type = htons(ETH_P_PAUSE);
    754	tpriv->pt.func = stmmac_test_flowctrl_validate;
    755	tpriv->pt.dev = priv->dev;
    756	tpriv->pt.af_packet_priv = tpriv;
    757	dev_add_pack(&tpriv->pt);
    758
    759	/* Compute minimum number of packets to make FIFO full */
    760	pkt_count = priv->plat->rx_fifo_size;
    761	if (!pkt_count)
    762		pkt_count = priv->dma_cap.rx_fifo_size;
    763	pkt_count /= 1400;
    764	pkt_count *= 2;
    765
    766	for (i = 0; i < rx_cnt; i++)
    767		stmmac_stop_rx(priv, priv->ioaddr, i);
    768
    769	ret = dev_set_promiscuity(priv->dev, 1);
    770	if (ret)
    771		goto cleanup;
    772
    773	ret = dev_mc_add(priv->dev, paddr);
    774	if (ret)
    775		goto cleanup;
    776
    777	for (i = 0; i < pkt_count; i++) {
    778		struct stmmac_packet_attrs attr = { };
    779
    780		attr.dst = priv->dev->dev_addr;
    781		attr.dont_wait = true;
    782		attr.size = 1400;
    783
    784		ret = __stmmac_test_loopback(priv, &attr);
    785		if (ret)
    786			goto cleanup;
    787		if (tpriv->ok)
    788			break;
    789	}
    790
    791	/* Wait for some time in case RX Watchdog is enabled */
    792	msleep(200);
    793
    794	for (i = 0; i < rx_cnt; i++) {
    795		struct stmmac_channel *ch = &priv->channel[i];
    796		u32 tail;
    797
    798		tail = priv->rx_queue[i].dma_rx_phy +
    799			(priv->dma_rx_size * sizeof(struct dma_desc));
    800
    801		stmmac_set_rx_tail_ptr(priv, priv->ioaddr, tail, i);
    802		stmmac_start_rx(priv, priv->ioaddr, i);
    803
    804		local_bh_disable();
    805		napi_reschedule(&ch->rx_napi);
    806		local_bh_enable();
    807	}
    808
    809	wait_for_completion_timeout(&tpriv->comp, STMMAC_LB_TIMEOUT);
    810	ret = tpriv->ok ? 0 : -ETIMEDOUT;
    811
    812cleanup:
    813	dev_mc_del(priv->dev, paddr);
    814	dev_set_promiscuity(priv->dev, -1);
    815	dev_remove_pack(&tpriv->pt);
    816	kfree(tpriv);
    817	return ret;
    818}
    819
    820static int stmmac_test_rss(struct stmmac_priv *priv)
    821{
    822	struct stmmac_packet_attrs attr = { };
    823
    824	if (!priv->dma_cap.rssen || !priv->rss.enable)
    825		return -EOPNOTSUPP;
    826
    827	attr.dst = priv->dev->dev_addr;
    828	attr.exp_hash = true;
    829	attr.sport = 0x321;
    830	attr.dport = 0x123;
    831
    832	return __stmmac_test_loopback(priv, &attr);
    833}
    834
    835static int stmmac_test_vlan_validate(struct sk_buff *skb,
    836				     struct net_device *ndev,
    837				     struct packet_type *pt,
    838				     struct net_device *orig_ndev)
    839{
    840	struct stmmac_test_priv *tpriv = pt->af_packet_priv;
    841	struct stmmachdr *shdr;
    842	struct ethhdr *ehdr;
    843	struct udphdr *uhdr;
    844	struct iphdr *ihdr;
    845	u16 proto;
    846
    847	proto = tpriv->double_vlan ? ETH_P_8021AD : ETH_P_8021Q;
    848
    849	skb = skb_unshare(skb, GFP_ATOMIC);
    850	if (!skb)
    851		goto out;
    852
    853	if (skb_linearize(skb))
    854		goto out;
    855	if (skb_headlen(skb) < (STMMAC_TEST_PKT_SIZE - ETH_HLEN))
    856		goto out;
    857	if (tpriv->vlan_id) {
    858		if (skb->vlan_proto != htons(proto))
    859			goto out;
    860		if (skb->vlan_tci != tpriv->vlan_id) {
    861			/* Means filter did not work. */
    862			tpriv->ok = false;
    863			complete(&tpriv->comp);
    864			goto out;
    865		}
    866	}
    867
    868	ehdr = (struct ethhdr *)skb_mac_header(skb);
    869	if (!ether_addr_equal_unaligned(ehdr->h_dest, tpriv->packet->dst))
    870		goto out;
    871
    872	ihdr = ip_hdr(skb);
    873	if (tpriv->double_vlan)
    874		ihdr = (struct iphdr *)(skb_network_header(skb) + 4);
    875	if (ihdr->protocol != IPPROTO_UDP)
    876		goto out;
    877
    878	uhdr = (struct udphdr *)((u8 *)ihdr + 4 * ihdr->ihl);
    879	if (uhdr->dest != htons(tpriv->packet->dport))
    880		goto out;
    881
    882	shdr = (struct stmmachdr *)((u8 *)uhdr + sizeof(*uhdr));
    883	if (shdr->magic != cpu_to_be64(STMMAC_TEST_PKT_MAGIC))
    884		goto out;
    885
    886	tpriv->ok = true;
    887	complete(&tpriv->comp);
    888
    889out:
    890	kfree_skb(skb);
    891	return 0;
    892}
    893
    894static int __stmmac_test_vlanfilt(struct stmmac_priv *priv)
    895{
    896	struct stmmac_packet_attrs attr = { };
    897	struct stmmac_test_priv *tpriv;
    898	struct sk_buff *skb = NULL;
    899	int ret = 0, i;
    900
    901	tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
    902	if (!tpriv)
    903		return -ENOMEM;
    904
    905	tpriv->ok = false;
    906	init_completion(&tpriv->comp);
    907
    908	tpriv->pt.type = htons(ETH_P_IP);
    909	tpriv->pt.func = stmmac_test_vlan_validate;
    910	tpriv->pt.dev = priv->dev;
    911	tpriv->pt.af_packet_priv = tpriv;
    912	tpriv->packet = &attr;
    913
    914	/*
    915	 * As we use HASH filtering, false positives may appear. This is a
    916	 * specially chosen ID so that adjacent IDs (+4) have different
    917	 * HASH values.
    918	 */
    919	tpriv->vlan_id = 0x123;
    920	dev_add_pack(&tpriv->pt);
    921
    922	ret = vlan_vid_add(priv->dev, htons(ETH_P_8021Q), tpriv->vlan_id);
    923	if (ret)
    924		goto cleanup;
    925
    926	for (i = 0; i < 4; i++) {
    927		attr.vlan = 1;
    928		attr.vlan_id_out = tpriv->vlan_id + i;
    929		attr.dst = priv->dev->dev_addr;
    930		attr.sport = 9;
    931		attr.dport = 9;
    932
    933		skb = stmmac_test_get_udp_skb(priv, &attr);
    934		if (!skb) {
    935			ret = -ENOMEM;
    936			goto vlan_del;
    937		}
    938
    939		ret = dev_direct_xmit(skb, 0);
    940		if (ret)
    941			goto vlan_del;
    942
    943		wait_for_completion_timeout(&tpriv->comp, STMMAC_LB_TIMEOUT);
    944		ret = tpriv->ok ? 0 : -ETIMEDOUT;
    945		if (ret && !i) {
    946			goto vlan_del;
    947		} else if (!ret && i) {
    948			ret = -EINVAL;
    949			goto vlan_del;
    950		} else {
    951			ret = 0;
    952		}
    953
    954		tpriv->ok = false;
    955	}
    956
    957vlan_del:
    958	vlan_vid_del(priv->dev, htons(ETH_P_8021Q), tpriv->vlan_id);
    959cleanup:
    960	dev_remove_pack(&tpriv->pt);
    961	kfree(tpriv);
    962	return ret;
    963}
    964
    965static int stmmac_test_vlanfilt(struct stmmac_priv *priv)
    966{
    967	if (!priv->dma_cap.vlhash)
    968		return -EOPNOTSUPP;
    969
    970	return __stmmac_test_vlanfilt(priv);
    971}
    972
    973static int stmmac_test_vlanfilt_perfect(struct stmmac_priv *priv)
    974{
    975	int ret, prev_cap = priv->dma_cap.vlhash;
    976
    977	if (!(priv->dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
    978		return -EOPNOTSUPP;
    979
    980	priv->dma_cap.vlhash = 0;
    981	ret = __stmmac_test_vlanfilt(priv);
    982	priv->dma_cap.vlhash = prev_cap;
    983
    984	return ret;
    985}
    986
    987static int __stmmac_test_dvlanfilt(struct stmmac_priv *priv)
    988{
    989	struct stmmac_packet_attrs attr = { };
    990	struct stmmac_test_priv *tpriv;
    991	struct sk_buff *skb = NULL;
    992	int ret = 0, i;
    993
    994	tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
    995	if (!tpriv)
    996		return -ENOMEM;
    997
    998	tpriv->ok = false;
    999	tpriv->double_vlan = true;
   1000	init_completion(&tpriv->comp);
   1001
   1002	tpriv->pt.type = htons(ETH_P_8021Q);
   1003	tpriv->pt.func = stmmac_test_vlan_validate;
   1004	tpriv->pt.dev = priv->dev;
   1005	tpriv->pt.af_packet_priv = tpriv;
   1006	tpriv->packet = &attr;
   1007
   1008	/*
   1009	 * As we use HASH filtering, false positives may appear. This is a
   1010	 * specially chosen ID so that adjacent IDs (+4) have different
   1011	 * HASH values.
   1012	 */
   1013	tpriv->vlan_id = 0x123;
   1014	dev_add_pack(&tpriv->pt);
   1015
   1016	ret = vlan_vid_add(priv->dev, htons(ETH_P_8021AD), tpriv->vlan_id);
   1017	if (ret)
   1018		goto cleanup;
   1019
   1020	for (i = 0; i < 4; i++) {
   1021		attr.vlan = 2;
   1022		attr.vlan_id_out = tpriv->vlan_id + i;
   1023		attr.dst = priv->dev->dev_addr;
   1024		attr.sport = 9;
   1025		attr.dport = 9;
   1026
   1027		skb = stmmac_test_get_udp_skb(priv, &attr);
   1028		if (!skb) {
   1029			ret = -ENOMEM;
   1030			goto vlan_del;
   1031		}
   1032
   1033		ret = dev_direct_xmit(skb, 0);
   1034		if (ret)
   1035			goto vlan_del;
   1036
   1037		wait_for_completion_timeout(&tpriv->comp, STMMAC_LB_TIMEOUT);
   1038		ret = tpriv->ok ? 0 : -ETIMEDOUT;
   1039		if (ret && !i) {
   1040			goto vlan_del;
   1041		} else if (!ret && i) {
   1042			ret = -EINVAL;
   1043			goto vlan_del;
   1044		} else {
   1045			ret = 0;
   1046		}
   1047
   1048		tpriv->ok = false;
   1049	}
   1050
   1051vlan_del:
   1052	vlan_vid_del(priv->dev, htons(ETH_P_8021AD), tpriv->vlan_id);
   1053cleanup:
   1054	dev_remove_pack(&tpriv->pt);
   1055	kfree(tpriv);
   1056	return ret;
   1057}
   1058
   1059static int stmmac_test_dvlanfilt(struct stmmac_priv *priv)
   1060{
   1061	if (!priv->dma_cap.vlhash)
   1062		return -EOPNOTSUPP;
   1063
   1064	return __stmmac_test_dvlanfilt(priv);
   1065}
   1066
   1067static int stmmac_test_dvlanfilt_perfect(struct stmmac_priv *priv)
   1068{
   1069	int ret, prev_cap = priv->dma_cap.vlhash;
   1070
   1071	if (!(priv->dev->features & NETIF_F_HW_VLAN_STAG_FILTER))
   1072		return -EOPNOTSUPP;
   1073
   1074	priv->dma_cap.vlhash = 0;
   1075	ret = __stmmac_test_dvlanfilt(priv);
   1076	priv->dma_cap.vlhash = prev_cap;
   1077
   1078	return ret;
   1079}
   1080
   1081#ifdef CONFIG_NET_CLS_ACT
   1082static int stmmac_test_rxp(struct stmmac_priv *priv)
   1083{
   1084	unsigned char addr[ETH_ALEN] = {0xde, 0xad, 0xbe, 0xef, 0x00, 0x00};
   1085	struct tc_cls_u32_offload cls_u32 = { };
   1086	struct stmmac_packet_attrs attr = { };
   1087	struct tc_action **actions;
   1088	struct tc_u32_sel *sel;
   1089	struct tcf_gact *gact;
   1090	struct tcf_exts *exts;
   1091	int ret, i, nk = 1;
   1092
   1093	if (!tc_can_offload(priv->dev))
   1094		return -EOPNOTSUPP;
   1095	if (!priv->dma_cap.frpsel)
   1096		return -EOPNOTSUPP;
   1097
   1098	sel = kzalloc(struct_size(sel, keys, nk), GFP_KERNEL);
   1099	if (!sel)
   1100		return -ENOMEM;
   1101
   1102	exts = kzalloc(sizeof(*exts), GFP_KERNEL);
   1103	if (!exts) {
   1104		ret = -ENOMEM;
   1105		goto cleanup_sel;
   1106	}
   1107
   1108	actions = kcalloc(nk, sizeof(*actions), GFP_KERNEL);
   1109	if (!actions) {
   1110		ret = -ENOMEM;
   1111		goto cleanup_exts;
   1112	}
   1113
   1114	gact = kcalloc(nk, sizeof(*gact), GFP_KERNEL);
   1115	if (!gact) {
   1116		ret = -ENOMEM;
   1117		goto cleanup_actions;
   1118	}
   1119
   1120	cls_u32.command = TC_CLSU32_NEW_KNODE;
   1121	cls_u32.common.chain_index = 0;
   1122	cls_u32.common.protocol = htons(ETH_P_ALL);
   1123	cls_u32.knode.exts = exts;
   1124	cls_u32.knode.sel = sel;
   1125	cls_u32.knode.handle = 0x123;
   1126
   1127	exts->nr_actions = nk;
   1128	exts->actions = actions;
   1129	for (i = 0; i < nk; i++) {
   1130		actions[i] = (struct tc_action *)&gact[i];
   1131		gact->tcf_action = TC_ACT_SHOT;
   1132	}
   1133
   1134	sel->nkeys = nk;
   1135	sel->offshift = 0;
   1136	sel->keys[0].off = 6;
   1137	sel->keys[0].val = htonl(0xdeadbeef);
   1138	sel->keys[0].mask = ~0x0;
   1139
   1140	ret = stmmac_tc_setup_cls_u32(priv, priv, &cls_u32);
   1141	if (ret)
   1142		goto cleanup_act;
   1143
   1144	attr.dst = priv->dev->dev_addr;
   1145	attr.src = addr;
   1146
   1147	ret = __stmmac_test_loopback(priv, &attr);
   1148	ret = ret ? 0 : -EINVAL; /* Shall NOT receive packet */
   1149
   1150	cls_u32.command = TC_CLSU32_DELETE_KNODE;
   1151	stmmac_tc_setup_cls_u32(priv, priv, &cls_u32);
   1152
   1153cleanup_act:
   1154	kfree(gact);
   1155cleanup_actions:
   1156	kfree(actions);
   1157cleanup_exts:
   1158	kfree(exts);
   1159cleanup_sel:
   1160	kfree(sel);
   1161	return ret;
   1162}
   1163#else
   1164static int stmmac_test_rxp(struct stmmac_priv *priv)
   1165{
   1166	return -EOPNOTSUPP;
   1167}
   1168#endif
   1169
   1170static int stmmac_test_desc_sai(struct stmmac_priv *priv)
   1171{
   1172	unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
   1173	struct stmmac_packet_attrs attr = { };
   1174	int ret;
   1175
   1176	if (!priv->dma_cap.vlins)
   1177		return -EOPNOTSUPP;
   1178
   1179	attr.remove_sa = true;
   1180	attr.sarc = true;
   1181	attr.src = src;
   1182	attr.dst = priv->dev->dev_addr;
   1183
   1184	priv->sarc_type = 0x1;
   1185
   1186	ret = __stmmac_test_loopback(priv, &attr);
   1187
   1188	priv->sarc_type = 0x0;
   1189	return ret;
   1190}
   1191
   1192static int stmmac_test_desc_sar(struct stmmac_priv *priv)
   1193{
   1194	unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
   1195	struct stmmac_packet_attrs attr = { };
   1196	int ret;
   1197
   1198	if (!priv->dma_cap.vlins)
   1199		return -EOPNOTSUPP;
   1200
   1201	attr.sarc = true;
   1202	attr.src = src;
   1203	attr.dst = priv->dev->dev_addr;
   1204
   1205	priv->sarc_type = 0x2;
   1206
   1207	ret = __stmmac_test_loopback(priv, &attr);
   1208
   1209	priv->sarc_type = 0x0;
   1210	return ret;
   1211}
   1212
   1213static int stmmac_test_reg_sai(struct stmmac_priv *priv)
   1214{
   1215	unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
   1216	struct stmmac_packet_attrs attr = { };
   1217	int ret;
   1218
   1219	if (!priv->dma_cap.vlins)
   1220		return -EOPNOTSUPP;
   1221
   1222	attr.remove_sa = true;
   1223	attr.sarc = true;
   1224	attr.src = src;
   1225	attr.dst = priv->dev->dev_addr;
   1226
   1227	if (stmmac_sarc_configure(priv, priv->ioaddr, 0x2))
   1228		return -EOPNOTSUPP;
   1229
   1230	ret = __stmmac_test_loopback(priv, &attr);
   1231
   1232	stmmac_sarc_configure(priv, priv->ioaddr, 0x0);
   1233	return ret;
   1234}
   1235
   1236static int stmmac_test_reg_sar(struct stmmac_priv *priv)
   1237{
   1238	unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
   1239	struct stmmac_packet_attrs attr = { };
   1240	int ret;
   1241
   1242	if (!priv->dma_cap.vlins)
   1243		return -EOPNOTSUPP;
   1244
   1245	attr.sarc = true;
   1246	attr.src = src;
   1247	attr.dst = priv->dev->dev_addr;
   1248
   1249	if (stmmac_sarc_configure(priv, priv->ioaddr, 0x3))
   1250		return -EOPNOTSUPP;
   1251
   1252	ret = __stmmac_test_loopback(priv, &attr);
   1253
   1254	stmmac_sarc_configure(priv, priv->ioaddr, 0x0);
   1255	return ret;
   1256}
   1257
   1258static int stmmac_test_vlanoff_common(struct stmmac_priv *priv, bool svlan)
   1259{
   1260	struct stmmac_packet_attrs attr = { };
   1261	struct stmmac_test_priv *tpriv;
   1262	struct sk_buff *skb = NULL;
   1263	int ret = 0;
   1264	u16 proto;
   1265
   1266	if (!priv->dma_cap.vlins)
   1267		return -EOPNOTSUPP;
   1268
   1269	tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
   1270	if (!tpriv)
   1271		return -ENOMEM;
   1272
   1273	proto = svlan ? ETH_P_8021AD : ETH_P_8021Q;
   1274
   1275	tpriv->ok = false;
   1276	tpriv->double_vlan = svlan;
   1277	init_completion(&tpriv->comp);
   1278
   1279	tpriv->pt.type = svlan ? htons(ETH_P_8021Q) : htons(ETH_P_IP);
   1280	tpriv->pt.func = stmmac_test_vlan_validate;
   1281	tpriv->pt.dev = priv->dev;
   1282	tpriv->pt.af_packet_priv = tpriv;
   1283	tpriv->packet = &attr;
   1284	tpriv->vlan_id = 0x123;
   1285	dev_add_pack(&tpriv->pt);
   1286
   1287	ret = vlan_vid_add(priv->dev, htons(proto), tpriv->vlan_id);
   1288	if (ret)
   1289		goto cleanup;
   1290
   1291	attr.dst = priv->dev->dev_addr;
   1292
   1293	skb = stmmac_test_get_udp_skb(priv, &attr);
   1294	if (!skb) {
   1295		ret = -ENOMEM;
   1296		goto vlan_del;
   1297	}
   1298
   1299	__vlan_hwaccel_put_tag(skb, htons(proto), tpriv->vlan_id);
   1300	skb->protocol = htons(proto);
   1301
   1302	ret = dev_direct_xmit(skb, 0);
   1303	if (ret)
   1304		goto vlan_del;
   1305
   1306	wait_for_completion_timeout(&tpriv->comp, STMMAC_LB_TIMEOUT);
   1307	ret = tpriv->ok ? 0 : -ETIMEDOUT;
   1308
   1309vlan_del:
   1310	vlan_vid_del(priv->dev, htons(proto), tpriv->vlan_id);
   1311cleanup:
   1312	dev_remove_pack(&tpriv->pt);
   1313	kfree(tpriv);
   1314	return ret;
   1315}
   1316
   1317static int stmmac_test_vlanoff(struct stmmac_priv *priv)
   1318{
   1319	return stmmac_test_vlanoff_common(priv, false);
   1320}
   1321
   1322static int stmmac_test_svlanoff(struct stmmac_priv *priv)
   1323{
   1324	if (!priv->dma_cap.dvlan)
   1325		return -EOPNOTSUPP;
   1326	return stmmac_test_vlanoff_common(priv, true);
   1327}
   1328
   1329#ifdef CONFIG_NET_CLS_ACT
   1330static int __stmmac_test_l3filt(struct stmmac_priv *priv, u32 dst, u32 src,
   1331				u32 dst_mask, u32 src_mask)
   1332{
   1333	struct flow_dissector_key_ipv4_addrs key, mask;
   1334	unsigned long dummy_cookie = 0xdeadbeef;
   1335	struct stmmac_packet_attrs attr = { };
   1336	struct flow_dissector *dissector;
   1337	struct flow_cls_offload *cls;
   1338	int ret, old_enable = 0;
   1339	struct flow_rule *rule;
   1340
   1341	if (!tc_can_offload(priv->dev))
   1342		return -EOPNOTSUPP;
   1343	if (!priv->dma_cap.l3l4fnum)
   1344		return -EOPNOTSUPP;
   1345	if (priv->rss.enable) {
   1346		old_enable = priv->rss.enable;
   1347		priv->rss.enable = false;
   1348		stmmac_rss_configure(priv, priv->hw, NULL,
   1349				     priv->plat->rx_queues_to_use);
   1350	}
   1351
   1352	dissector = kzalloc(sizeof(*dissector), GFP_KERNEL);
   1353	if (!dissector) {
   1354		ret = -ENOMEM;
   1355		goto cleanup_rss;
   1356	}
   1357
   1358	dissector->used_keys |= (1 << FLOW_DISSECTOR_KEY_IPV4_ADDRS);
   1359	dissector->offset[FLOW_DISSECTOR_KEY_IPV4_ADDRS] = 0;
   1360
   1361	cls = kzalloc(sizeof(*cls), GFP_KERNEL);
   1362	if (!cls) {
   1363		ret = -ENOMEM;
   1364		goto cleanup_dissector;
   1365	}
   1366
   1367	cls->common.chain_index = 0;
   1368	cls->command = FLOW_CLS_REPLACE;
   1369	cls->cookie = dummy_cookie;
   1370
   1371	rule = kzalloc(struct_size(rule, action.entries, 1), GFP_KERNEL);
   1372	if (!rule) {
   1373		ret = -ENOMEM;
   1374		goto cleanup_cls;
   1375	}
   1376
   1377	rule->match.dissector = dissector;
   1378	rule->match.key = (void *)&key;
   1379	rule->match.mask = (void *)&mask;
   1380
   1381	key.src = htonl(src);
   1382	key.dst = htonl(dst);
   1383	mask.src = src_mask;
   1384	mask.dst = dst_mask;
   1385
   1386	cls->rule = rule;
   1387
   1388	rule->action.entries[0].id = FLOW_ACTION_DROP;
   1389	rule->action.entries[0].hw_stats = FLOW_ACTION_HW_STATS_ANY;
   1390	rule->action.num_entries = 1;
   1391
   1392	attr.dst = priv->dev->dev_addr;
   1393	attr.ip_dst = dst;
   1394	attr.ip_src = src;
   1395
   1396	/* Shall receive packet */
   1397	ret = __stmmac_test_loopback(priv, &attr);
   1398	if (ret)
   1399		goto cleanup_rule;
   1400
   1401	ret = stmmac_tc_setup_cls(priv, priv, cls);
   1402	if (ret)
   1403		goto cleanup_rule;
   1404
   1405	/* Shall NOT receive packet */
   1406	ret = __stmmac_test_loopback(priv, &attr);
   1407	ret = ret ? 0 : -EINVAL;
   1408
   1409	cls->command = FLOW_CLS_DESTROY;
   1410	stmmac_tc_setup_cls(priv, priv, cls);
   1411cleanup_rule:
   1412	kfree(rule);
   1413cleanup_cls:
   1414	kfree(cls);
   1415cleanup_dissector:
   1416	kfree(dissector);
   1417cleanup_rss:
   1418	if (old_enable) {
   1419		priv->rss.enable = old_enable;
   1420		stmmac_rss_configure(priv, priv->hw, &priv->rss,
   1421				     priv->plat->rx_queues_to_use);
   1422	}
   1423
   1424	return ret;
   1425}
   1426#else
   1427static int __stmmac_test_l3filt(struct stmmac_priv *priv, u32 dst, u32 src,
   1428				u32 dst_mask, u32 src_mask)
   1429{
   1430	return -EOPNOTSUPP;
   1431}
   1432#endif
   1433
   1434static int stmmac_test_l3filt_da(struct stmmac_priv *priv)
   1435{
   1436	u32 addr = 0x10203040;
   1437
   1438	return __stmmac_test_l3filt(priv, addr, 0, ~0, 0);
   1439}
   1440
   1441static int stmmac_test_l3filt_sa(struct stmmac_priv *priv)
   1442{
   1443	u32 addr = 0x10203040;
   1444
   1445	return __stmmac_test_l3filt(priv, 0, addr, 0, ~0);
   1446}
   1447
   1448#ifdef CONFIG_NET_CLS_ACT
   1449static int __stmmac_test_l4filt(struct stmmac_priv *priv, u32 dst, u32 src,
   1450				u32 dst_mask, u32 src_mask, bool udp)
   1451{
   1452	struct {
   1453		struct flow_dissector_key_basic bkey;
   1454		struct flow_dissector_key_ports key;
   1455	} __aligned(BITS_PER_LONG / 8) keys;
   1456	struct {
   1457		struct flow_dissector_key_basic bmask;
   1458		struct flow_dissector_key_ports mask;
   1459	} __aligned(BITS_PER_LONG / 8) masks;
   1460	unsigned long dummy_cookie = 0xdeadbeef;
   1461	struct stmmac_packet_attrs attr = { };
   1462	struct flow_dissector *dissector;
   1463	struct flow_cls_offload *cls;
   1464	int ret, old_enable = 0;
   1465	struct flow_rule *rule;
   1466
   1467	if (!tc_can_offload(priv->dev))
   1468		return -EOPNOTSUPP;
   1469	if (!priv->dma_cap.l3l4fnum)
   1470		return -EOPNOTSUPP;
   1471	if (priv->rss.enable) {
   1472		old_enable = priv->rss.enable;
   1473		priv->rss.enable = false;
   1474		stmmac_rss_configure(priv, priv->hw, NULL,
   1475				     priv->plat->rx_queues_to_use);
   1476	}
   1477
   1478	dissector = kzalloc(sizeof(*dissector), GFP_KERNEL);
   1479	if (!dissector) {
   1480		ret = -ENOMEM;
   1481		goto cleanup_rss;
   1482	}
   1483
   1484	dissector->used_keys |= (1 << FLOW_DISSECTOR_KEY_BASIC);
   1485	dissector->used_keys |= (1 << FLOW_DISSECTOR_KEY_PORTS);
   1486	dissector->offset[FLOW_DISSECTOR_KEY_BASIC] = 0;
   1487	dissector->offset[FLOW_DISSECTOR_KEY_PORTS] = offsetof(typeof(keys), key);
   1488
   1489	cls = kzalloc(sizeof(*cls), GFP_KERNEL);
   1490	if (!cls) {
   1491		ret = -ENOMEM;
   1492		goto cleanup_dissector;
   1493	}
   1494
   1495	cls->common.chain_index = 0;
   1496	cls->command = FLOW_CLS_REPLACE;
   1497	cls->cookie = dummy_cookie;
   1498
   1499	rule = kzalloc(struct_size(rule, action.entries, 1), GFP_KERNEL);
   1500	if (!rule) {
   1501		ret = -ENOMEM;
   1502		goto cleanup_cls;
   1503	}
   1504
   1505	rule->match.dissector = dissector;
   1506	rule->match.key = (void *)&keys;
   1507	rule->match.mask = (void *)&masks;
   1508
   1509	keys.bkey.ip_proto = udp ? IPPROTO_UDP : IPPROTO_TCP;
   1510	keys.key.src = htons(src);
   1511	keys.key.dst = htons(dst);
   1512	masks.mask.src = src_mask;
   1513	masks.mask.dst = dst_mask;
   1514
   1515	cls->rule = rule;
   1516
   1517	rule->action.entries[0].id = FLOW_ACTION_DROP;
   1518	rule->action.entries[0].hw_stats = FLOW_ACTION_HW_STATS_ANY;
   1519	rule->action.num_entries = 1;
   1520
   1521	attr.dst = priv->dev->dev_addr;
   1522	attr.tcp = !udp;
   1523	attr.sport = src;
   1524	attr.dport = dst;
   1525	attr.ip_dst = 0;
   1526
   1527	/* Shall receive packet */
   1528	ret = __stmmac_test_loopback(priv, &attr);
   1529	if (ret)
   1530		goto cleanup_rule;
   1531
   1532	ret = stmmac_tc_setup_cls(priv, priv, cls);
   1533	if (ret)
   1534		goto cleanup_rule;
   1535
   1536	/* Shall NOT receive packet */
   1537	ret = __stmmac_test_loopback(priv, &attr);
   1538	ret = ret ? 0 : -EINVAL;
   1539
   1540	cls->command = FLOW_CLS_DESTROY;
   1541	stmmac_tc_setup_cls(priv, priv, cls);
   1542cleanup_rule:
   1543	kfree(rule);
   1544cleanup_cls:
   1545	kfree(cls);
   1546cleanup_dissector:
   1547	kfree(dissector);
   1548cleanup_rss:
   1549	if (old_enable) {
   1550		priv->rss.enable = old_enable;
   1551		stmmac_rss_configure(priv, priv->hw, &priv->rss,
   1552				     priv->plat->rx_queues_to_use);
   1553	}
   1554
   1555	return ret;
   1556}
   1557#else
   1558static int __stmmac_test_l4filt(struct stmmac_priv *priv, u32 dst, u32 src,
   1559				u32 dst_mask, u32 src_mask, bool udp)
   1560{
   1561	return -EOPNOTSUPP;
   1562}
   1563#endif
   1564
   1565static int stmmac_test_l4filt_da_tcp(struct stmmac_priv *priv)
   1566{
   1567	u16 dummy_port = 0x123;
   1568
   1569	return __stmmac_test_l4filt(priv, dummy_port, 0, ~0, 0, false);
   1570}
   1571
   1572static int stmmac_test_l4filt_sa_tcp(struct stmmac_priv *priv)
   1573{
   1574	u16 dummy_port = 0x123;
   1575
   1576	return __stmmac_test_l4filt(priv, 0, dummy_port, 0, ~0, false);
   1577}
   1578
   1579static int stmmac_test_l4filt_da_udp(struct stmmac_priv *priv)
   1580{
   1581	u16 dummy_port = 0x123;
   1582
   1583	return __stmmac_test_l4filt(priv, dummy_port, 0, ~0, 0, true);
   1584}
   1585
   1586static int stmmac_test_l4filt_sa_udp(struct stmmac_priv *priv)
   1587{
   1588	u16 dummy_port = 0x123;
   1589
   1590	return __stmmac_test_l4filt(priv, 0, dummy_port, 0, ~0, true);
   1591}
   1592
   1593static int stmmac_test_arp_validate(struct sk_buff *skb,
   1594				    struct net_device *ndev,
   1595				    struct packet_type *pt,
   1596				    struct net_device *orig_ndev)
   1597{
   1598	struct stmmac_test_priv *tpriv = pt->af_packet_priv;
   1599	struct ethhdr *ehdr;
   1600	struct arphdr *ahdr;
   1601
   1602	ehdr = (struct ethhdr *)skb_mac_header(skb);
   1603	if (!ether_addr_equal_unaligned(ehdr->h_dest, tpriv->packet->src))
   1604		goto out;
   1605
   1606	ahdr = arp_hdr(skb);
   1607	if (ahdr->ar_op != htons(ARPOP_REPLY))
   1608		goto out;
   1609
   1610	tpriv->ok = true;
   1611	complete(&tpriv->comp);
   1612out:
   1613	kfree_skb(skb);
   1614	return 0;
   1615}
   1616
   1617static int stmmac_test_arpoffload(struct stmmac_priv *priv)
   1618{
   1619	unsigned char src[ETH_ALEN] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
   1620	unsigned char dst[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
   1621	struct stmmac_packet_attrs attr = { };
   1622	struct stmmac_test_priv *tpriv;
   1623	struct sk_buff *skb = NULL;
   1624	u32 ip_addr = 0xdeadcafe;
   1625	u32 ip_src = 0xdeadbeef;
   1626	int ret;
   1627
   1628	if (!priv->dma_cap.arpoffsel)
   1629		return -EOPNOTSUPP;
   1630
   1631	tpriv = kzalloc(sizeof(*tpriv), GFP_KERNEL);
   1632	if (!tpriv)
   1633		return -ENOMEM;
   1634
   1635	tpriv->ok = false;
   1636	init_completion(&tpriv->comp);
   1637
   1638	tpriv->pt.type = htons(ETH_P_ARP);
   1639	tpriv->pt.func = stmmac_test_arp_validate;
   1640	tpriv->pt.dev = priv->dev;
   1641	tpriv->pt.af_packet_priv = tpriv;
   1642	tpriv->packet = &attr;
   1643	dev_add_pack(&tpriv->pt);
   1644
   1645	attr.src = src;
   1646	attr.ip_src = ip_src;
   1647	attr.dst = dst;
   1648	attr.ip_dst = ip_addr;
   1649
   1650	skb = stmmac_test_get_arp_skb(priv, &attr);
   1651	if (!skb) {
   1652		ret = -ENOMEM;
   1653		goto cleanup;
   1654	}
   1655
   1656	ret = stmmac_set_arp_offload(priv, priv->hw, true, ip_addr);
   1657	if (ret)
   1658		goto cleanup;
   1659
   1660	ret = dev_set_promiscuity(priv->dev, 1);
   1661	if (ret)
   1662		goto cleanup;
   1663
   1664	ret = dev_direct_xmit(skb, 0);
   1665	if (ret)
   1666		goto cleanup_promisc;
   1667
   1668	wait_for_completion_timeout(&tpriv->comp, STMMAC_LB_TIMEOUT);
   1669	ret = tpriv->ok ? 0 : -ETIMEDOUT;
   1670
   1671cleanup_promisc:
   1672	dev_set_promiscuity(priv->dev, -1);
   1673cleanup:
   1674	stmmac_set_arp_offload(priv, priv->hw, false, 0x0);
   1675	dev_remove_pack(&tpriv->pt);
   1676	kfree(tpriv);
   1677	return ret;
   1678}
   1679
   1680static int __stmmac_test_jumbo(struct stmmac_priv *priv, u16 queue)
   1681{
   1682	struct stmmac_packet_attrs attr = { };
   1683	int size = priv->dma_buf_sz;
   1684
   1685	attr.dst = priv->dev->dev_addr;
   1686	attr.max_size = size - ETH_FCS_LEN;
   1687	attr.queue_mapping = queue;
   1688
   1689	return __stmmac_test_loopback(priv, &attr);
   1690}
   1691
   1692static int stmmac_test_jumbo(struct stmmac_priv *priv)
   1693{
   1694	return __stmmac_test_jumbo(priv, 0);
   1695}
   1696
   1697static int stmmac_test_mjumbo(struct stmmac_priv *priv)
   1698{
   1699	u32 chan, tx_cnt = priv->plat->tx_queues_to_use;
   1700	int ret;
   1701
   1702	if (tx_cnt <= 1)
   1703		return -EOPNOTSUPP;
   1704
   1705	for (chan = 0; chan < tx_cnt; chan++) {
   1706		ret = __stmmac_test_jumbo(priv, chan);
   1707		if (ret)
   1708			return ret;
   1709	}
   1710
   1711	return 0;
   1712}
   1713
   1714static int stmmac_test_sph(struct stmmac_priv *priv)
   1715{
   1716	unsigned long cnt_end, cnt_start = priv->xstats.rx_split_hdr_pkt_n;
   1717	struct stmmac_packet_attrs attr = { };
   1718	int ret;
   1719
   1720	if (!priv->sph)
   1721		return -EOPNOTSUPP;
   1722
   1723	/* Check for UDP first */
   1724	attr.dst = priv->dev->dev_addr;
   1725	attr.tcp = false;
   1726
   1727	ret = __stmmac_test_loopback(priv, &attr);
   1728	if (ret)
   1729		return ret;
   1730
   1731	cnt_end = priv->xstats.rx_split_hdr_pkt_n;
   1732	if (cnt_end <= cnt_start)
   1733		return -EINVAL;
   1734
   1735	/* Check for TCP now */
   1736	cnt_start = cnt_end;
   1737
   1738	attr.dst = priv->dev->dev_addr;
   1739	attr.tcp = true;
   1740
   1741	ret = __stmmac_test_loopback(priv, &attr);
   1742	if (ret)
   1743		return ret;
   1744
   1745	cnt_end = priv->xstats.rx_split_hdr_pkt_n;
   1746	if (cnt_end <= cnt_start)
   1747		return -EINVAL;
   1748
   1749	return 0;
   1750}
   1751
   1752static int stmmac_test_tbs(struct stmmac_priv *priv)
   1753{
   1754#define STMMAC_TBS_LT_OFFSET		(500 * 1000 * 1000) /* 500 ms*/
   1755	struct stmmac_packet_attrs attr = { };
   1756	struct tc_etf_qopt_offload qopt;
   1757	u64 start_time, curr_time = 0;
   1758	unsigned long flags;
   1759	int ret, i;
   1760
   1761	if (!priv->hwts_tx_en)
   1762		return -EOPNOTSUPP;
   1763
   1764	/* Find first TBS enabled Queue, if any */
   1765	for (i = 0; i < priv->plat->tx_queues_to_use; i++)
   1766		if (priv->tx_queue[i].tbs & STMMAC_TBS_AVAIL)
   1767			break;
   1768
   1769	if (i >= priv->plat->tx_queues_to_use)
   1770		return -EOPNOTSUPP;
   1771
   1772	qopt.enable = true;
   1773	qopt.queue = i;
   1774
   1775	ret = stmmac_tc_setup_etf(priv, priv, &qopt);
   1776	if (ret)
   1777		return ret;
   1778
   1779	read_lock_irqsave(&priv->ptp_lock, flags);
   1780	stmmac_get_systime(priv, priv->ptpaddr, &curr_time);
   1781	read_unlock_irqrestore(&priv->ptp_lock, flags);
   1782
   1783	if (!curr_time) {
   1784		ret = -EOPNOTSUPP;
   1785		goto fail_disable;
   1786	}
   1787
   1788	start_time = curr_time;
   1789	curr_time += STMMAC_TBS_LT_OFFSET;
   1790
   1791	attr.dst = priv->dev->dev_addr;
   1792	attr.timestamp = curr_time;
   1793	attr.timeout = nsecs_to_jiffies(2 * STMMAC_TBS_LT_OFFSET);
   1794	attr.queue_mapping = i;
   1795
   1796	ret = __stmmac_test_loopback(priv, &attr);
   1797	if (ret)
   1798		goto fail_disable;
   1799
   1800	/* Check if expected time has elapsed */
   1801	read_lock_irqsave(&priv->ptp_lock, flags);
   1802	stmmac_get_systime(priv, priv->ptpaddr, &curr_time);
   1803	read_unlock_irqrestore(&priv->ptp_lock, flags);
   1804
   1805	if ((curr_time - start_time) < STMMAC_TBS_LT_OFFSET)
   1806		ret = -EINVAL;
   1807
   1808fail_disable:
   1809	qopt.enable = false;
   1810	stmmac_tc_setup_etf(priv, priv, &qopt);
   1811	return ret;
   1812}
   1813
   1814#define STMMAC_LOOPBACK_NONE	0
   1815#define STMMAC_LOOPBACK_MAC	1
   1816#define STMMAC_LOOPBACK_PHY	2
   1817
   1818static const struct stmmac_test {
   1819	char name[ETH_GSTRING_LEN];
   1820	int lb;
   1821	int (*fn)(struct stmmac_priv *priv);
   1822} stmmac_selftests[] = {
   1823	{
   1824		.name = "MAC Loopback               ",
   1825		.lb = STMMAC_LOOPBACK_MAC,
   1826		.fn = stmmac_test_mac_loopback,
   1827	}, {
   1828		.name = "PHY Loopback               ",
   1829		.lb = STMMAC_LOOPBACK_NONE, /* Test will handle it */
   1830		.fn = stmmac_test_phy_loopback,
   1831	}, {
   1832		.name = "MMC Counters               ",
   1833		.lb = STMMAC_LOOPBACK_PHY,
   1834		.fn = stmmac_test_mmc,
   1835	}, {
   1836		.name = "EEE                        ",
   1837		.lb = STMMAC_LOOPBACK_PHY,
   1838		.fn = stmmac_test_eee,
   1839	}, {
   1840		.name = "Hash Filter MC             ",
   1841		.lb = STMMAC_LOOPBACK_PHY,
   1842		.fn = stmmac_test_hfilt,
   1843	}, {
   1844		.name = "Perfect Filter UC          ",
   1845		.lb = STMMAC_LOOPBACK_PHY,
   1846		.fn = stmmac_test_pfilt,
   1847	}, {
   1848		.name = "MC Filter                  ",
   1849		.lb = STMMAC_LOOPBACK_PHY,
   1850		.fn = stmmac_test_mcfilt,
   1851	}, {
   1852		.name = "UC Filter                  ",
   1853		.lb = STMMAC_LOOPBACK_PHY,
   1854		.fn = stmmac_test_ucfilt,
   1855	}, {
   1856		.name = "Flow Control               ",
   1857		.lb = STMMAC_LOOPBACK_PHY,
   1858		.fn = stmmac_test_flowctrl,
   1859	}, {
   1860		.name = "RSS                        ",
   1861		.lb = STMMAC_LOOPBACK_PHY,
   1862		.fn = stmmac_test_rss,
   1863	}, {
   1864		.name = "VLAN Filtering             ",
   1865		.lb = STMMAC_LOOPBACK_PHY,
   1866		.fn = stmmac_test_vlanfilt,
   1867	}, {
   1868		.name = "VLAN Filtering (perf)      ",
   1869		.lb = STMMAC_LOOPBACK_PHY,
   1870		.fn = stmmac_test_vlanfilt_perfect,
   1871	}, {
   1872		.name = "Double VLAN Filter         ",
   1873		.lb = STMMAC_LOOPBACK_PHY,
   1874		.fn = stmmac_test_dvlanfilt,
   1875	}, {
   1876		.name = "Double VLAN Filter (perf)  ",
   1877		.lb = STMMAC_LOOPBACK_PHY,
   1878		.fn = stmmac_test_dvlanfilt_perfect,
   1879	}, {
   1880		.name = "Flexible RX Parser         ",
   1881		.lb = STMMAC_LOOPBACK_PHY,
   1882		.fn = stmmac_test_rxp,
   1883	}, {
   1884		.name = "SA Insertion (desc)        ",
   1885		.lb = STMMAC_LOOPBACK_PHY,
   1886		.fn = stmmac_test_desc_sai,
   1887	}, {
   1888		.name = "SA Replacement (desc)      ",
   1889		.lb = STMMAC_LOOPBACK_PHY,
   1890		.fn = stmmac_test_desc_sar,
   1891	}, {
   1892		.name = "SA Insertion (reg)         ",
   1893		.lb = STMMAC_LOOPBACK_PHY,
   1894		.fn = stmmac_test_reg_sai,
   1895	}, {
   1896		.name = "SA Replacement (reg)       ",
   1897		.lb = STMMAC_LOOPBACK_PHY,
   1898		.fn = stmmac_test_reg_sar,
   1899	}, {
   1900		.name = "VLAN TX Insertion          ",
   1901		.lb = STMMAC_LOOPBACK_PHY,
   1902		.fn = stmmac_test_vlanoff,
   1903	}, {
   1904		.name = "SVLAN TX Insertion         ",
   1905		.lb = STMMAC_LOOPBACK_PHY,
   1906		.fn = stmmac_test_svlanoff,
   1907	}, {
   1908		.name = "L3 DA Filtering            ",
   1909		.lb = STMMAC_LOOPBACK_PHY,
   1910		.fn = stmmac_test_l3filt_da,
   1911	}, {
   1912		.name = "L3 SA Filtering            ",
   1913		.lb = STMMAC_LOOPBACK_PHY,
   1914		.fn = stmmac_test_l3filt_sa,
   1915	}, {
   1916		.name = "L4 DA TCP Filtering        ",
   1917		.lb = STMMAC_LOOPBACK_PHY,
   1918		.fn = stmmac_test_l4filt_da_tcp,
   1919	}, {
   1920		.name = "L4 SA TCP Filtering        ",
   1921		.lb = STMMAC_LOOPBACK_PHY,
   1922		.fn = stmmac_test_l4filt_sa_tcp,
   1923	}, {
   1924		.name = "L4 DA UDP Filtering        ",
   1925		.lb = STMMAC_LOOPBACK_PHY,
   1926		.fn = stmmac_test_l4filt_da_udp,
   1927	}, {
   1928		.name = "L4 SA UDP Filtering        ",
   1929		.lb = STMMAC_LOOPBACK_PHY,
   1930		.fn = stmmac_test_l4filt_sa_udp,
   1931	}, {
   1932		.name = "ARP Offload                ",
   1933		.lb = STMMAC_LOOPBACK_PHY,
   1934		.fn = stmmac_test_arpoffload,
   1935	}, {
   1936		.name = "Jumbo Frame                ",
   1937		.lb = STMMAC_LOOPBACK_PHY,
   1938		.fn = stmmac_test_jumbo,
   1939	}, {
   1940		.name = "Multichannel Jumbo         ",
   1941		.lb = STMMAC_LOOPBACK_PHY,
   1942		.fn = stmmac_test_mjumbo,
   1943	}, {
   1944		.name = "Split Header               ",
   1945		.lb = STMMAC_LOOPBACK_PHY,
   1946		.fn = stmmac_test_sph,
   1947	}, {
   1948		.name = "TBS (ETF Scheduler)        ",
   1949		.lb = STMMAC_LOOPBACK_PHY,
   1950		.fn = stmmac_test_tbs,
   1951	},
   1952};
   1953
   1954void stmmac_selftest_run(struct net_device *dev,
   1955			 struct ethtool_test *etest, u64 *buf)
   1956{
   1957	struct stmmac_priv *priv = netdev_priv(dev);
   1958	int count = stmmac_selftest_get_count(priv);
   1959	int i, ret;
   1960
   1961	memset(buf, 0, sizeof(*buf) * count);
   1962	stmmac_test_next_id = 0;
   1963
   1964	if (etest->flags != ETH_TEST_FL_OFFLINE) {
   1965		netdev_err(priv->dev, "Only offline tests are supported\n");
   1966		etest->flags |= ETH_TEST_FL_FAILED;
   1967		return;
   1968	} else if (!netif_carrier_ok(dev)) {
   1969		netdev_err(priv->dev, "You need valid Link to execute tests\n");
   1970		etest->flags |= ETH_TEST_FL_FAILED;
   1971		return;
   1972	}
   1973
   1974	/* Wait for queues drain */
   1975	msleep(200);
   1976
   1977	for (i = 0; i < count; i++) {
   1978		ret = 0;
   1979
   1980		switch (stmmac_selftests[i].lb) {
   1981		case STMMAC_LOOPBACK_PHY:
   1982			ret = -EOPNOTSUPP;
   1983			if (dev->phydev)
   1984				ret = phy_loopback(dev->phydev, true);
   1985			if (!ret)
   1986				break;
   1987			fallthrough;
   1988		case STMMAC_LOOPBACK_MAC:
   1989			ret = stmmac_set_mac_loopback(priv, priv->ioaddr, true);
   1990			break;
   1991		case STMMAC_LOOPBACK_NONE:
   1992			break;
   1993		default:
   1994			ret = -EOPNOTSUPP;
   1995			break;
   1996		}
   1997
   1998		/*
   1999		 * First tests will always be MAC / PHY loobpack. If any of
   2000		 * them is not supported we abort earlier.
   2001		 */
   2002		if (ret) {
   2003			netdev_err(priv->dev, "Loopback is not supported\n");
   2004			etest->flags |= ETH_TEST_FL_FAILED;
   2005			break;
   2006		}
   2007
   2008		ret = stmmac_selftests[i].fn(priv);
   2009		if (ret && (ret != -EOPNOTSUPP))
   2010			etest->flags |= ETH_TEST_FL_FAILED;
   2011		buf[i] = ret;
   2012
   2013		switch (stmmac_selftests[i].lb) {
   2014		case STMMAC_LOOPBACK_PHY:
   2015			ret = -EOPNOTSUPP;
   2016			if (dev->phydev)
   2017				ret = phy_loopback(dev->phydev, false);
   2018			if (!ret)
   2019				break;
   2020			fallthrough;
   2021		case STMMAC_LOOPBACK_MAC:
   2022			stmmac_set_mac_loopback(priv, priv->ioaddr, false);
   2023			break;
   2024		default:
   2025			break;
   2026		}
   2027	}
   2028}
   2029
   2030void stmmac_selftest_get_strings(struct stmmac_priv *priv, u8 *data)
   2031{
   2032	u8 *p = data;
   2033	int i;
   2034
   2035	for (i = 0; i < stmmac_selftest_get_count(priv); i++) {
   2036		snprintf(p, ETH_GSTRING_LEN, "%2d. %s", i + 1,
   2037			 stmmac_selftests[i].name);
   2038		p += ETH_GSTRING_LEN;
   2039	}
   2040}
   2041
   2042int stmmac_selftest_get_count(struct stmmac_priv *priv)
   2043{
   2044	return ARRAY_SIZE(stmmac_selftests);
   2045}