hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c
....@@ -85,6 +85,7 @@
8585 int rx;
8686 int final_tx;
8787 int final_rx;
88
+ int max_delay;
8889 };
8990
9091 #define DMA_CONTROL_OSP BIT(4)
....@@ -545,15 +546,15 @@
545546 static void dwmac_rk_rx_clean(struct stmmac_priv *priv,
546547 struct dwmac_rk_lb_priv *lb_priv)
547548 {
548
- struct sk_buff *skb;
549
-
550
- skb = lb_priv->rx_skbuff;
551
-
552
- if (likely(lb_priv->rx_skbuff)) {
549
+ if (likely(lb_priv->rx_skbuff_dma)) {
553550 dma_unmap_single(priv->device,
554551 lb_priv->rx_skbuff_dma,
555552 lb_priv->dma_buf_sz, DMA_FROM_DEVICE);
556
- dev_kfree_skb(skb);
553
+ lb_priv->rx_skbuff_dma = 0;
554
+ }
555
+
556
+ if (likely(lb_priv->rx_skbuff)) {
557
+ dev_consume_skb_any(lb_priv->rx_skbuff);
557558 lb_priv->rx_skbuff = NULL;
558559 }
559560 }
....@@ -582,7 +583,12 @@
582583 }
583584
584585 frame_len -= ETH_FCS_LEN;
586
+ prefetch(skb->data - NET_IP_ALIGN);
585587 skb_put(skb, frame_len);
588
+ dma_unmap_single(priv->device,
589
+ lb_priv->rx_skbuff_dma,
590
+ lb_priv->dma_buf_sz,
591
+ DMA_FROM_DEVICE);
586592
587593 return dwmac_rk_loopback_validate(priv, lb_priv, skb);
588594 }
....@@ -616,10 +622,9 @@
616622 static void dwmac_rk_tx_clean(struct stmmac_priv *priv,
617623 struct dwmac_rk_lb_priv *lb_priv)
618624 {
619
- struct sk_buff *skb;
625
+ struct sk_buff *skb = lb_priv->tx_skbuff;
620626 struct dma_desc *p;
621627
622
- skb = lb_priv->tx_skbuff;
623628 p = lb_priv->dma_tx;
624629
625630 if (likely(lb_priv->tx_skbuff_dma)) {
....@@ -631,7 +636,7 @@
631636 }
632637
633638 if (likely(skb)) {
634
- dev_kfree_skb(skb);
639
+ dev_consume_skb_any(skb);
635640 lb_priv->tx_skbuff = NULL;
636641 }
637642
....@@ -655,9 +660,10 @@
655660 lb_priv->tx_skbuff = skb;
656661
657662 des = dma_map_single(priv->device, skb->data,
658
- nopaged_len, DMA_TO_DEVICE);
663
+ nopaged_len, DMA_TO_DEVICE);
659664 if (dma_mapping_error(priv->device, des))
660665 goto dma_map_err;
666
+ lb_priv->tx_skbuff_dma = des;
661667
662668 stmmac_set_desc_addr(priv, desc, des);
663669 lb_priv->tx_skbuff_dma_len = nopaged_len;
....@@ -771,9 +777,20 @@
771777 return __dwmac_rk_loopback_run(priv, lb_priv);
772778 }
773779
774
-static inline bool dwmac_rk_delayline_is_valid(int tx, int rx)
780
+static inline bool dwmac_rk_delayline_is_txvalid(struct dwmac_rk_lb_priv *lb_priv,
781
+ int tx)
775782 {
776
- if ((tx > 0 && tx < MAX_DELAYLINE) && (rx > 0 && rx < MAX_DELAYLINE))
783
+ if (tx > 0 && tx < lb_priv->max_delay)
784
+ return true;
785
+ else
786
+ return false;
787
+}
788
+
789
+static inline bool dwmac_rk_delayline_is_valid(struct dwmac_rk_lb_priv *lb_priv,
790
+ int tx, int rx)
791
+{
792
+ if ((tx > 0 && tx < lb_priv->max_delay) &&
793
+ (rx > 0 && rx < lb_priv->max_delay))
777794 return true;
778795 else
779796 return false;
....@@ -784,7 +801,7 @@
784801 {
785802 int tx_left, tx_right, rx_up, rx_down;
786803 int i, j, tx_index, rx_index;
787
- int tx_mid, rx_mid;
804
+ int tx_mid = 0, rx_mid = 0;
788805
789806 /* initiation */
790807 tx_index = SCAN_STEP;
....@@ -792,12 +809,12 @@
792809
793810 re_scan:
794811 /* start from rx based on the experience */
795
- for (i = rx_index; i <= (MAX_DELAYLINE - SCAN_STEP); i += SCAN_STEP) {
812
+ for (i = rx_index; i <= (lb_priv->max_delay - SCAN_STEP); i += SCAN_STEP) {
796813 tx_left = 0;
797814 tx_right = 0;
798815 tx_mid = 0;
799816
800
- for (j = tx_index; j <= (MAX_DELAYLINE - SCAN_STEP);
817
+ for (j = tx_index; j <= (lb_priv->max_delay - SCAN_STEP);
801818 j += SCAN_STEP) {
802819 if (!dwmac_rk_loopback_with_identify(priv,
803820 lb_priv, j, i)) {
....@@ -815,14 +832,14 @@
815832 }
816833
817834 /* Worst case: reach the end */
818
- if (i >= (MAX_DELAYLINE - SCAN_STEP))
835
+ if (i >= (lb_priv->max_delay - SCAN_STEP))
819836 goto end;
820837
821838 rx_up = 0;
822839 rx_down = 0;
823840
824841 /* look for rx_mid base on the tx_mid */
825
- for (i = SCAN_STEP; i <= (MAX_DELAYLINE - SCAN_STEP);
842
+ for (i = SCAN_STEP; i <= (lb_priv->max_delay - SCAN_STEP);
826843 i += SCAN_STEP) {
827844 if (!dwmac_rk_loopback_with_identify(priv, lb_priv,
828845 tx_mid, i)) {
....@@ -841,23 +858,24 @@
841858 goto re_scan;
842859 }
843860
844
- if (dwmac_rk_delayline_is_valid(tx_mid, rx_mid)) {
861
+ if (dwmac_rk_delayline_is_valid(lb_priv, tx_mid, rx_mid)) {
845862 lb_priv->final_tx = tx_mid;
846863 lb_priv->final_rx = rx_mid;
847864
848
- pr_info("Find suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n",
865
+ pr_info("Find available tx_delay = 0x%02x, rx_delay = 0x%02x\n",
849866 lb_priv->final_tx, lb_priv->final_rx);
850867
851868 return 0;
852869 }
853870 end:
854
- pr_err("Can't find suitable delayline\n");
871
+ pr_err("Can't find available delayline\n");
855872 return -ENXIO;
856873 }
857874
858875 static int dwmac_rk_delayline_scan(struct stmmac_priv *priv,
859876 struct dwmac_rk_lb_priv *lb_priv)
860877 {
878
+ int phy_iface = dwmac_rk_get_phy_interface(priv);
861879 int tx, rx, tx_sum, rx_sum, count;
862880 int tx_mid, rx_mid;
863881 int ret = -ENXIO;
....@@ -866,9 +884,11 @@
866884 rx_sum = 0;
867885 count = 0;
868886
869
- for (rx = 0x0; rx <= MAX_DELAYLINE; rx++) {
870
- printk(KERN_CONT "RX(0x%02x):", rx);
871
- for (tx = 0x0; tx <= MAX_DELAYLINE; tx++) {
887
+ for (rx = 0x0; rx <= lb_priv->max_delay; rx++) {
888
+ if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID)
889
+ rx = -1;
890
+ printk(KERN_CONT "RX(%03d):", rx);
891
+ for (tx = 0x0; tx <= lb_priv->max_delay; tx++) {
872892 if (!dwmac_rk_loopback_with_identify(priv,
873893 lb_priv, tx, rx)) {
874894 tx_sum += tx;
....@@ -880,24 +900,40 @@
880900 }
881901 }
882902 printk(KERN_CONT "\n");
903
+
904
+ if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID)
905
+ break;
883906 }
884907
885908 if (tx_sum && rx_sum && count) {
886909 tx_mid = tx_sum / count;
887910 rx_mid = rx_sum / count;
888911
889
- if (dwmac_rk_delayline_is_valid(tx_mid, rx_mid)) {
890
- lb_priv->final_tx = tx_mid;
891
- lb_priv->final_rx = rx_mid;
892
- ret = 0;
912
+ if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID) {
913
+ if (dwmac_rk_delayline_is_txvalid(lb_priv, tx_mid)) {
914
+ lb_priv->final_tx = tx_mid;
915
+ lb_priv->final_rx = -1;
916
+ ret = 0;
917
+ }
918
+ } else {
919
+ if (dwmac_rk_delayline_is_valid(lb_priv, tx_mid, rx_mid)) {
920
+ lb_priv->final_tx = tx_mid;
921
+ lb_priv->final_rx = rx_mid;
922
+ ret = 0;
923
+ }
893924 }
894925 }
895926
896
- if (ret)
927
+ if (ret) {
897928 pr_err("\nCan't find suitable delayline\n");
898
- else
899
- pr_info("\nFind suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n",
900
- lb_priv->final_tx, lb_priv->final_rx);
929
+ } else {
930
+ if (phy_iface == PHY_INTERFACE_MODE_RGMII_RXID)
931
+ pr_info("Find available tx_delay = 0x%02x, rx_delay = disable\n",
932
+ lb_priv->final_tx);
933
+ else
934
+ pr_info("\nFind suitable tx_delay = 0x%02x, rx_delay = 0x%02x\n",
935
+ lb_priv->final_tx, lb_priv->final_rx);
936
+ }
901937
902938 return ret;
903939 }
....@@ -1173,6 +1209,11 @@
11731209 dwmac_rk_free_dma_desc_resources(priv, lb_priv);
11741210 }
11751211
1212
+static int dwmac_rk_get_max_delayline(struct stmmac_priv *priv)
1213
+{
1214
+ return MAX_DELAYLINE;
1215
+}
1216
+
11761217 static int dwmac_rk_loopback_run(struct stmmac_priv *priv,
11771218 struct dwmac_rk_lb_priv *lb_priv)
11781219 {
....@@ -1183,6 +1224,8 @@
11831224
11841225 if (!ndev || !priv->mii)
11851226 return -EINVAL;
1227
+
1228
+ lb_priv->max_delay = dwmac_rk_get_max_delayline(priv);
11861229
11871230 rtnl_lock();
11881231 /* check the netdevice up or not */
....@@ -1224,7 +1267,9 @@
12241267 if (lb_priv->scan) {
12251268 /* scan only support for rgmii mode */
12261269 if (phy_iface != PHY_INTERFACE_MODE_RGMII &&
1227
- phy_iface != PHY_INTERFACE_MODE_RGMII_ID) {
1270
+ phy_iface != PHY_INTERFACE_MODE_RGMII_ID &&
1271
+ phy_iface != PHY_INTERFACE_MODE_RGMII_RXID &&
1272
+ phy_iface != PHY_INTERFACE_MODE_RGMII_TXID) {
12281273 ret = -EINVAL;
12291274 goto out;
12301275 }
....@@ -1286,10 +1331,10 @@
12861331 *data = 0;
12871332 data++;
12881333
1289
- if (kstrtoint(tmp, 0, &tx) || tx > MAX_DELAYLINE)
1334
+ if (kstrtoint(tmp, 0, &tx) || tx > dwmac_rk_get_max_delayline(priv))
12901335 goto out;
12911336
1292
- if (kstrtoint(data, 0, &rx) || rx > MAX_DELAYLINE)
1337
+ if (kstrtoint(data, 0, &rx) || rx > dwmac_rk_get_max_delayline(priv))
12931338 goto out;
12941339
12951340 dwmac_rk_set_rgmii_delayline(priv, tx, rx);