diff options
| -rw-r--r-- | drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c | 98 |
1 files changed, 97 insertions, 1 deletions
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c index abab84f2ef8b..acfab86431b1 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_selftests.c | |||
| @@ -45,6 +45,7 @@ struct stmmac_packet_attrs { | |||
| 45 | int size; | 45 | int size; |
| 46 | int remove_sa; | 46 | int remove_sa; |
| 47 | u8 id; | 47 | u8 id; |
| 48 | int sarc; | ||
| 48 | }; | 49 | }; |
| 49 | 50 | ||
| 50 | static u8 stmmac_test_next_id; | 51 | static u8 stmmac_test_next_id; |
| @@ -230,7 +231,10 @@ static int stmmac_test_loopback_validate(struct sk_buff *skb, | |||
| 230 | if (!ether_addr_equal(ehdr->h_dest, tpriv->packet->dst)) | 231 | if (!ether_addr_equal(ehdr->h_dest, tpriv->packet->dst)) |
| 231 | goto out; | 232 | goto out; |
| 232 | } | 233 | } |
| 233 | if (tpriv->packet->src) { | 234 | if (tpriv->packet->sarc) { |
| 235 | if (!ether_addr_equal(ehdr->h_source, ehdr->h_dest)) | ||
| 236 | goto out; | ||
| 237 | } else if (tpriv->packet->src) { | ||
| 234 | if (!ether_addr_equal(ehdr->h_source, tpriv->packet->src)) | 238 | if (!ether_addr_equal(ehdr->h_source, tpriv->packet->src)) |
| 235 | goto out; | 239 | goto out; |
| 236 | } | 240 | } |
| @@ -1004,6 +1008,82 @@ static int stmmac_test_rxp(struct stmmac_priv *priv) | |||
| 1004 | } | 1008 | } |
| 1005 | #endif | 1009 | #endif |
| 1006 | 1010 | ||
| 1011 | static int stmmac_test_desc_sai(struct stmmac_priv *priv) | ||
| 1012 | { | ||
| 1013 | unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
| 1014 | struct stmmac_packet_attrs attr = { }; | ||
| 1015 | int ret; | ||
| 1016 | |||
| 1017 | attr.remove_sa = true; | ||
| 1018 | attr.sarc = true; | ||
| 1019 | attr.src = src; | ||
| 1020 | attr.dst = priv->dev->dev_addr; | ||
| 1021 | |||
| 1022 | priv->sarc_type = 0x1; | ||
| 1023 | |||
| 1024 | ret = __stmmac_test_loopback(priv, &attr); | ||
| 1025 | |||
| 1026 | priv->sarc_type = 0x0; | ||
| 1027 | return ret; | ||
| 1028 | } | ||
| 1029 | |||
| 1030 | static int stmmac_test_desc_sar(struct stmmac_priv *priv) | ||
| 1031 | { | ||
| 1032 | unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
| 1033 | struct stmmac_packet_attrs attr = { }; | ||
| 1034 | int ret; | ||
| 1035 | |||
| 1036 | attr.sarc = true; | ||
| 1037 | attr.src = src; | ||
| 1038 | attr.dst = priv->dev->dev_addr; | ||
| 1039 | |||
| 1040 | priv->sarc_type = 0x2; | ||
| 1041 | |||
| 1042 | ret = __stmmac_test_loopback(priv, &attr); | ||
| 1043 | |||
| 1044 | priv->sarc_type = 0x0; | ||
| 1045 | return ret; | ||
| 1046 | } | ||
| 1047 | |||
| 1048 | static int stmmac_test_reg_sai(struct stmmac_priv *priv) | ||
| 1049 | { | ||
| 1050 | unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
| 1051 | struct stmmac_packet_attrs attr = { }; | ||
| 1052 | int ret; | ||
| 1053 | |||
| 1054 | attr.remove_sa = true; | ||
| 1055 | attr.sarc = true; | ||
| 1056 | attr.src = src; | ||
| 1057 | attr.dst = priv->dev->dev_addr; | ||
| 1058 | |||
| 1059 | if (stmmac_sarc_configure(priv, priv->ioaddr, 0x2)) | ||
| 1060 | return -EOPNOTSUPP; | ||
| 1061 | |||
| 1062 | ret = __stmmac_test_loopback(priv, &attr); | ||
| 1063 | |||
| 1064 | stmmac_sarc_configure(priv, priv->ioaddr, 0x0); | ||
| 1065 | return ret; | ||
| 1066 | } | ||
| 1067 | |||
| 1068 | static int stmmac_test_reg_sar(struct stmmac_priv *priv) | ||
| 1069 | { | ||
| 1070 | unsigned char src[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; | ||
| 1071 | struct stmmac_packet_attrs attr = { }; | ||
| 1072 | int ret; | ||
| 1073 | |||
| 1074 | attr.sarc = true; | ||
| 1075 | attr.src = src; | ||
| 1076 | attr.dst = priv->dev->dev_addr; | ||
| 1077 | |||
| 1078 | if (stmmac_sarc_configure(priv, priv->ioaddr, 0x3)) | ||
| 1079 | return -EOPNOTSUPP; | ||
| 1080 | |||
| 1081 | ret = __stmmac_test_loopback(priv, &attr); | ||
| 1082 | |||
| 1083 | stmmac_sarc_configure(priv, priv->ioaddr, 0x0); | ||
| 1084 | return ret; | ||
| 1085 | } | ||
| 1086 | |||
| 1007 | #define STMMAC_LOOPBACK_NONE 0 | 1087 | #define STMMAC_LOOPBACK_NONE 0 |
| 1008 | #define STMMAC_LOOPBACK_MAC 1 | 1088 | #define STMMAC_LOOPBACK_MAC 1 |
| 1009 | #define STMMAC_LOOPBACK_PHY 2 | 1089 | #define STMMAC_LOOPBACK_PHY 2 |
| @@ -1065,6 +1145,22 @@ static const struct stmmac_test { | |||
| 1065 | .name = "Flexible RX Parser ", | 1145 | .name = "Flexible RX Parser ", |
| 1066 | .lb = STMMAC_LOOPBACK_PHY, | 1146 | .lb = STMMAC_LOOPBACK_PHY, |
| 1067 | .fn = stmmac_test_rxp, | 1147 | .fn = stmmac_test_rxp, |
| 1148 | }, { | ||
| 1149 | .name = "SA Insertion (desc) ", | ||
| 1150 | .lb = STMMAC_LOOPBACK_PHY, | ||
| 1151 | .fn = stmmac_test_desc_sai, | ||
| 1152 | }, { | ||
| 1153 | .name = "SA Replacement (desc)", | ||
| 1154 | .lb = STMMAC_LOOPBACK_PHY, | ||
| 1155 | .fn = stmmac_test_desc_sar, | ||
| 1156 | }, { | ||
| 1157 | .name = "SA Insertion (reg) ", | ||
| 1158 | .lb = STMMAC_LOOPBACK_PHY, | ||
| 1159 | .fn = stmmac_test_reg_sai, | ||
| 1160 | }, { | ||
| 1161 | .name = "SA Replacement (reg)", | ||
| 1162 | .lb = STMMAC_LOOPBACK_PHY, | ||
| 1163 | .fn = stmmac_test_reg_sar, | ||
| 1068 | }, | 1164 | }, |
| 1069 | }; | 1165 | }; |
| 1070 | 1166 | ||
