Commit 427849e8 authored by Jose Abreu's avatar Jose Abreu Committed by David S. Miller

net: stmmac: selftests: Add Jumbo Frame tests

Add a test to validate the Jumbo Frame support in stmmac in single
channel and multichannel mode.
Signed-off-by: default avatarJose Abreu <joabreu@synopsys.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 8a488c3f
...@@ -43,9 +43,11 @@ struct stmmac_packet_attrs { ...@@ -43,9 +43,11 @@ struct stmmac_packet_attrs {
int dont_wait; int dont_wait;
int timeout; int timeout;
int size; int size;
int max_size;
int remove_sa; int remove_sa;
u8 id; u8 id;
int sarc; int sarc;
u16 queue_mapping;
}; };
static u8 stmmac_test_next_id; static u8 stmmac_test_next_id;
...@@ -73,12 +75,14 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv, ...@@ -73,12 +75,14 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv,
else else
size += sizeof(struct udphdr); size += sizeof(struct udphdr);
skb = netdev_alloc_skb(priv->dev, size); if (attr->max_size && (attr->max_size > size))
size = attr->max_size;
skb = netdev_alloc_skb_ip_align(priv->dev, size);
if (!skb) if (!skb)
return NULL; return NULL;
prefetchw(skb->data); prefetchw(skb->data);
skb_reserve(skb, NET_IP_ALIGN);
if (attr->vlan > 1) if (attr->vlan > 1)
ehdr = skb_push(skb, ETH_HLEN + 8); ehdr = skb_push(skb, ETH_HLEN + 8);
...@@ -147,6 +151,9 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv, ...@@ -147,6 +151,9 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv,
uhdr->source = htons(attr->sport); uhdr->source = htons(attr->sport);
uhdr->dest = htons(attr->dport); uhdr->dest = htons(attr->dport);
uhdr->len = htons(sizeof(*shdr) + sizeof(*uhdr) + attr->size); uhdr->len = htons(sizeof(*shdr) + sizeof(*uhdr) + attr->size);
if (attr->max_size)
uhdr->len = htons(attr->max_size -
(sizeof(*ihdr) + sizeof(*ehdr)));
uhdr->check = 0; uhdr->check = 0;
} }
...@@ -162,6 +169,10 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv, ...@@ -162,6 +169,10 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv,
iplen += sizeof(*thdr); iplen += sizeof(*thdr);
else else
iplen += sizeof(*uhdr); iplen += sizeof(*uhdr);
if (attr->max_size)
iplen = attr->max_size - sizeof(*ehdr);
ihdr->tot_len = htons(iplen); ihdr->tot_len = htons(iplen);
ihdr->frag_off = 0; ihdr->frag_off = 0;
ihdr->saddr = htonl(attr->ip_src); ihdr->saddr = htonl(attr->ip_src);
...@@ -178,6 +189,8 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv, ...@@ -178,6 +189,8 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv,
if (attr->size) if (attr->size)
skb_put(skb, attr->size); skb_put(skb, attr->size);
if (attr->max_size && (attr->max_size > skb->len))
skb_put(skb, attr->max_size - skb->len);
skb->csum = 0; skb->csum = 0;
skb->ip_summed = CHECKSUM_PARTIAL; skb->ip_summed = CHECKSUM_PARTIAL;
...@@ -324,7 +337,7 @@ static int __stmmac_test_loopback(struct stmmac_priv *priv, ...@@ -324,7 +337,7 @@ static int __stmmac_test_loopback(struct stmmac_priv *priv,
goto cleanup; goto cleanup;
} }
skb_set_queue_mapping(skb, 0); skb_set_queue_mapping(skb, attr->queue_mapping);
ret = dev_queue_xmit(skb); ret = dev_queue_xmit(skb);
if (ret) if (ret)
goto cleanup; goto cleanup;
...@@ -1534,6 +1547,44 @@ static int stmmac_test_arpoffload(struct stmmac_priv *priv) ...@@ -1534,6 +1547,44 @@ static int stmmac_test_arpoffload(struct stmmac_priv *priv)
return ret; return ret;
} }
static int __stmmac_test_jumbo(struct stmmac_priv *priv, u16 queue)
{
struct stmmac_packet_attrs attr = { };
int size = priv->dma_buf_sz;
/* Only XGMAC has SW support for multiple RX descs in same packet */
if (priv->plat->has_xgmac)
size = priv->dev->max_mtu;
attr.dst = priv->dev->dev_addr;
attr.max_size = size - ETH_FCS_LEN;
attr.queue_mapping = queue;
return __stmmac_test_loopback(priv, &attr);
}
static int stmmac_test_jumbo(struct stmmac_priv *priv)
{
return __stmmac_test_jumbo(priv, 0);
}
static int stmmac_test_mjumbo(struct stmmac_priv *priv)
{
u32 chan, tx_cnt = priv->plat->tx_queues_to_use;
int ret;
if (tx_cnt <= 1)
return -EOPNOTSUPP;
for (chan = 0; chan < tx_cnt; chan++) {
ret = __stmmac_test_jumbo(priv, chan);
if (ret)
return ret;
}
return 0;
}
#define STMMAC_LOOPBACK_NONE 0 #define STMMAC_LOOPBACK_NONE 0
#define STMMAC_LOOPBACK_MAC 1 #define STMMAC_LOOPBACK_MAC 1
#define STMMAC_LOOPBACK_PHY 2 #define STMMAC_LOOPBACK_PHY 2
...@@ -1647,6 +1698,14 @@ static const struct stmmac_test { ...@@ -1647,6 +1698,14 @@ static const struct stmmac_test {
.name = "ARP Offload ", .name = "ARP Offload ",
.lb = STMMAC_LOOPBACK_PHY, .lb = STMMAC_LOOPBACK_PHY,
.fn = stmmac_test_arpoffload, .fn = stmmac_test_arpoffload,
}, {
.name = "Jumbo Frame ",
.lb = STMMAC_LOOPBACK_PHY,
.fn = stmmac_test_jumbo,
}, {
.name = "Multichannel Jumbo ",
.lb = STMMAC_LOOPBACK_PHY,
.fn = stmmac_test_mjumbo,
}, },
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment