提交 567110f1 编写于 作者: D David S. Miller

Merge branch 'stmmac-Fix-selftests-in-Synopsys-AXS101-board'

Jose Abreu says:

====================
net: stmmac: Fix selftests in Synopsys AXS101 board

Set of fixes for sefltests so that they work in Synopsys AXS101 board.

Final output:

$ ethtool -t eth0
The test result is PASS
The test extra info:
 1. MAC Loopback                 0
 2. PHY Loopback                 -95
 3. MMC Counters                 0
 4. EEE                          -95
 5. Hash Filter MC               0
 6. Perfect Filter UC            0
 7. MC Filter                    0
 8. UC Filter                    0
 9. Flow Control                 -95
10. RSS                          -95
11. VLAN Filtering               -95
12. VLAN Filtering (perf)        -95
13. Double VLAN Filter           -95
14. Double VLAN Filter (perf)    -95
15. Flexible RX Parser           -95
16. SA Insertion (desc)          -95
17. SA Replacement (desc)        -95
18. SA Insertion (reg)           -95
19. SA Replacement (reg)         -95
20. VLAN TX Insertion            -95
21. SVLAN TX Insertion           -95
22. L3 DA Filtering              -95
23. L3 SA Filtering              -95
24. L4 DA TCP Filtering          -95
25. L4 SA TCP Filtering          -95
26. L4 DA UDP Filtering          -95
27. L4 SA UDP Filtering          -95
28. ARP Offload                  -95
29. Jumbo Frame                  0
30. Multichannel Jumbo           -95
31. Split Header                 -95

Description:

1) Fixes the unaligned accesses that caused CPU halt in Synopsys AXS101
boards.

2) Fixes the VLAN tests when filtering failed to work.

3) Fixes the VLAN Perfect tests when filtering is not available in HW.
====================
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
...@@ -80,7 +80,7 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv, ...@@ -80,7 +80,7 @@ static struct sk_buff *stmmac_test_get_udp_skb(struct stmmac_priv *priv,
if (attr->max_size && (attr->max_size > size)) if (attr->max_size && (attr->max_size > size))
size = attr->max_size; size = attr->max_size;
skb = netdev_alloc_skb_ip_align(priv->dev, size); skb = netdev_alloc_skb(priv->dev, size);
if (!skb) if (!skb)
return NULL; return NULL;
...@@ -244,6 +244,8 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb, ...@@ -244,6 +244,8 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb,
struct net_device *orig_ndev) struct net_device *orig_ndev)
{ {
struct stmmac_test_priv *tpriv = pt->af_packet_priv; struct stmmac_test_priv *tpriv = pt->af_packet_priv;
unsigned char *src = tpriv->packet->src;
unsigned char *dst = tpriv->packet->dst;
struct stmmachdr *shdr; struct stmmachdr *shdr;
struct ethhdr *ehdr; struct ethhdr *ehdr;
struct udphdr *uhdr; struct udphdr *uhdr;
...@@ -260,15 +262,15 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb, ...@@ -260,15 +262,15 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb,
goto out; goto out;
ehdr = (struct ethhdr *)skb_mac_header(skb); ehdr = (struct ethhdr *)skb_mac_header(skb);
if (tpriv->packet->dst) { if (dst) {
if (!ether_addr_equal(ehdr->h_dest, tpriv->packet->dst)) if (!ether_addr_equal_unaligned(ehdr->h_dest, dst))
goto out; goto out;
} }
if (tpriv->packet->sarc) { if (tpriv->packet->sarc) {
if (!ether_addr_equal(ehdr->h_source, ehdr->h_dest)) if (!ether_addr_equal_unaligned(ehdr->h_source, ehdr->h_dest))
goto out; goto out;
} else if (tpriv->packet->src) { } else if (src) {
if (!ether_addr_equal(ehdr->h_source, tpriv->packet->src)) if (!ether_addr_equal_unaligned(ehdr->h_source, src))
goto out; goto out;
} }
...@@ -714,7 +716,7 @@ static int stmmac_test_flowctrl_validate(struct sk_buff *skb, ...@@ -714,7 +716,7 @@ static int stmmac_test_flowctrl_validate(struct sk_buff *skb,
struct ethhdr *ehdr; struct ethhdr *ehdr;
ehdr = (struct ethhdr *)skb_mac_header(skb); ehdr = (struct ethhdr *)skb_mac_header(skb);
if (!ether_addr_equal(ehdr->h_source, orig_ndev->dev_addr)) if (!ether_addr_equal_unaligned(ehdr->h_source, orig_ndev->dev_addr))
goto out; goto out;
if (ehdr->h_proto != htons(ETH_P_PAUSE)) if (ehdr->h_proto != htons(ETH_P_PAUSE))
goto out; goto out;
...@@ -851,12 +853,16 @@ static int stmmac_test_vlan_validate(struct sk_buff *skb, ...@@ -851,12 +853,16 @@ static int stmmac_test_vlan_validate(struct sk_buff *skb,
if (tpriv->vlan_id) { if (tpriv->vlan_id) {
if (skb->vlan_proto != htons(proto)) if (skb->vlan_proto != htons(proto))
goto out; goto out;
if (skb->vlan_tci != tpriv->vlan_id) if (skb->vlan_tci != tpriv->vlan_id) {
/* Means filter did not work. */
tpriv->ok = false;
complete(&tpriv->comp);
goto out; goto out;
}
} }
ehdr = (struct ethhdr *)skb_mac_header(skb); ehdr = (struct ethhdr *)skb_mac_header(skb);
if (!ether_addr_equal(ehdr->h_dest, tpriv->packet->dst)) if (!ether_addr_equal_unaligned(ehdr->h_dest, tpriv->packet->dst))
goto out; goto out;
ihdr = ip_hdr(skb); ihdr = ip_hdr(skb);
...@@ -965,6 +971,9 @@ static int stmmac_test_vlanfilt_perfect(struct stmmac_priv *priv) ...@@ -965,6 +971,9 @@ static int stmmac_test_vlanfilt_perfect(struct stmmac_priv *priv)
{ {
int ret, prev_cap = priv->dma_cap.vlhash; int ret, prev_cap = priv->dma_cap.vlhash;
if (!(priv->dev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
return -EOPNOTSUPP;
priv->dma_cap.vlhash = 0; priv->dma_cap.vlhash = 0;
ret = __stmmac_test_vlanfilt(priv); ret = __stmmac_test_vlanfilt(priv);
priv->dma_cap.vlhash = prev_cap; priv->dma_cap.vlhash = prev_cap;
...@@ -1057,6 +1066,9 @@ static int stmmac_test_dvlanfilt_perfect(struct stmmac_priv *priv) ...@@ -1057,6 +1066,9 @@ static int stmmac_test_dvlanfilt_perfect(struct stmmac_priv *priv)
{ {
int ret, prev_cap = priv->dma_cap.vlhash; int ret, prev_cap = priv->dma_cap.vlhash;
if (!(priv->dev->features & NETIF_F_HW_VLAN_STAG_FILTER))
return -EOPNOTSUPP;
priv->dma_cap.vlhash = 0; priv->dma_cap.vlhash = 0;
ret = __stmmac_test_dvlanfilt(priv); ret = __stmmac_test_dvlanfilt(priv);
priv->dma_cap.vlhash = prev_cap; priv->dma_cap.vlhash = prev_cap;
...@@ -1586,7 +1598,7 @@ static int stmmac_test_arp_validate(struct sk_buff *skb, ...@@ -1586,7 +1598,7 @@ static int stmmac_test_arp_validate(struct sk_buff *skb,
struct arphdr *ahdr; struct arphdr *ahdr;
ehdr = (struct ethhdr *)skb_mac_header(skb); ehdr = (struct ethhdr *)skb_mac_header(skb);
if (!ether_addr_equal(ehdr->h_dest, tpriv->packet->src)) if (!ether_addr_equal_unaligned(ehdr->h_dest, tpriv->packet->src))
goto out; goto out;
ahdr = arp_hdr(skb); ahdr = arp_hdr(skb);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册