hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/staging/octeon/ethernet.c
....@@ -20,24 +20,13 @@
2020
2121 #include <net/dst.h>
2222
23
-#include <asm/octeon/octeon.h>
24
-
25
-#include "ethernet-defines.h"
2623 #include "octeon-ethernet.h"
24
+#include "ethernet-defines.h"
2725 #include "ethernet-mem.h"
2826 #include "ethernet-rx.h"
2927 #include "ethernet-tx.h"
3028 #include "ethernet-mdio.h"
3129 #include "ethernet-util.h"
32
-
33
-#include <asm/octeon/cvmx-pip.h>
34
-#include <asm/octeon/cvmx-pko.h>
35
-#include <asm/octeon/cvmx-fau.h>
36
-#include <asm/octeon/cvmx-ipd.h>
37
-#include <asm/octeon/cvmx-helper.h>
38
-#include <asm/octeon/cvmx-asxx-defs.h>
39
-#include <asm/octeon/cvmx-gmxx-defs.h>
40
-#include <asm/octeon/cvmx-smix-defs.h>
4130
4231 #define OCTEON_MAX_MTU 65392
4332
....@@ -142,8 +131,8 @@
142131 if (priv->poll)
143132 priv->poll(cvm_oct_device[priv->port]);
144133
145
- cvm_oct_device[priv->port]->netdev_ops->ndo_get_stats(
146
- cvm_oct_device[priv->port]);
134
+ cvm_oct_device[priv->port]->netdev_ops->ndo_get_stats
135
+ (cvm_oct_device[priv->port]);
147136
148137 if (!atomic_read(&cvm_oct_poll_queue_stopping))
149138 schedule_delayed_work(&priv->port_periodic_work, HZ);
....@@ -184,7 +173,7 @@
184173 */
185174 int cvm_oct_free_work(void *work_queue_entry)
186175 {
187
- cvmx_wqe_t *work = work_queue_entry;
176
+ struct cvmx_wqe *work = work_queue_entry;
188177
189178 int segments = work->word2.s.bufs;
190179 union cvmx_buf_ptr segment_ptr = work->packet_ptr;
....@@ -423,7 +412,7 @@
423412 if (priv->of_node)
424413 mac = of_get_mac_address(priv->of_node);
425414
426
- if (mac)
415
+ if (!IS_ERR_OR_NULL(mac))
427416 ether_addr_copy(dev->dev_addr, mac);
428417 else
429418 eth_hw_addr_random(dev);
....@@ -472,7 +461,7 @@
472461 struct octeon_ethernet *priv = netdev_priv(dev);
473462 int interface = INTERFACE(priv->port);
474463 int index = INDEX(priv->port);
475
- cvmx_helper_link_info_t link_info;
464
+ union cvmx_helper_link_info link_info;
476465 int rv;
477466
478467 rv = cvm_oct_phy_setup_device(dev);
....@@ -508,7 +497,7 @@
508497 void cvm_oct_link_poll(struct net_device *dev)
509498 {
510499 struct octeon_ethernet *priv = netdev_priv(dev);
511
- cvmx_helper_link_info_t link_info;
500
+ union cvmx_helper_link_info link_info;
512501
513502 link_info = cvmx_helper_link_get(priv->port);
514503 if (link_info.u64 == priv->link_info)
....@@ -622,8 +611,8 @@
622611 #endif
623612 };
624613
625
-static struct device_node *cvm_oct_of_get_child(
626
- const struct device_node *parent, int reg_val)
614
+static struct device_node *cvm_oct_of_get_child
615
+ (const struct device_node *parent, int reg_val)
627616 {
628617 struct device_node *node = NULL;
629618 int size;
....@@ -655,14 +644,37 @@
655644 return np;
656645 }
657646
658
-static void cvm_set_rgmii_delay(struct device_node *np, int iface, int port)
647
+static void cvm_set_rgmii_delay(struct octeon_ethernet *priv, int iface,
648
+ int port)
659649 {
650
+ struct device_node *np = priv->of_node;
660651 u32 delay_value;
652
+ bool rx_delay;
653
+ bool tx_delay;
661654
662
- if (!of_property_read_u32(np, "rx-delay", &delay_value))
655
+ /* By default, both RX/TX delay is enabled in
656
+ * __cvmx_helper_rgmii_enable().
657
+ */
658
+ rx_delay = true;
659
+ tx_delay = true;
660
+
661
+ if (!of_property_read_u32(np, "rx-delay", &delay_value)) {
663662 cvmx_write_csr(CVMX_ASXX_RX_CLK_SETX(port, iface), delay_value);
664
- if (!of_property_read_u32(np, "tx-delay", &delay_value))
663
+ rx_delay = delay_value > 0;
664
+ }
665
+ if (!of_property_read_u32(np, "tx-delay", &delay_value)) {
665666 cvmx_write_csr(CVMX_ASXX_TX_CLK_SETX(port, iface), delay_value);
667
+ tx_delay = delay_value > 0;
668
+ }
669
+
670
+ if (!rx_delay && !tx_delay)
671
+ priv->phy_mode = PHY_INTERFACE_MODE_RGMII_ID;
672
+ else if (!rx_delay)
673
+ priv->phy_mode = PHY_INTERFACE_MODE_RGMII_RXID;
674
+ else if (!tx_delay)
675
+ priv->phy_mode = PHY_INTERFACE_MODE_RGMII_TXID;
676
+ else
677
+ priv->phy_mode = PHY_INTERFACE_MODE_RGMII;
666678 }
667679
668680 static int cvm_oct_probe(struct platform_device *pdev)
....@@ -677,8 +689,6 @@
677689 #if IS_ENABLED(CONFIG_VLAN_8021Q)
678690 mtu_overhead += VLAN_HLEN;
679691 #endif
680
-
681
- octeon_mdiobus_force_mod_depencency();
682692
683693 pip = pdev->dev.of_node;
684694 if (!pip) {
....@@ -773,7 +783,7 @@
773783 priv->imode = CVMX_HELPER_INTERFACE_MODE_DISABLED;
774784 priv->port = CVMX_PIP_NUM_INPUT_PORTS;
775785 priv->queue = -1;
776
- strcpy(dev->name, "pow%d");
786
+ strscpy(dev->name, "pow%d", sizeof(dev->name));
777787 for (qos = 0; qos < 16; qos++)
778788 skb_queue_head_init(&priv->tx_free_list[qos]);
779789 dev->min_mtu = VLAN_ETH_ZLEN - mtu_overhead;
....@@ -819,7 +829,7 @@
819829 priv = netdev_priv(dev);
820830 priv->netdev = dev;
821831 priv->of_node = cvm_oct_node_for_port(pip, interface,
822
- port_index);
832
+ port_index);
823833
824834 INIT_DELAYED_WORK(&priv->port_periodic_work,
825835 cvm_oct_periodic_worker);
....@@ -827,6 +837,7 @@
827837 priv->port = port;
828838 priv->queue = cvmx_pko_get_base_queue(priv->port);
829839 priv->fau = fau - cvmx_pko_get_num_queues(port) * 4;
840
+ priv->phy_mode = PHY_INTERFACE_MODE_NA;
830841 for (qos = 0; qos < 16; qos++)
831842 skb_queue_head_init(&priv->tx_free_list[qos]);
832843 for (qos = 0; qos < cvmx_pko_get_num_queues(port);
....@@ -844,34 +855,40 @@
844855
845856 case CVMX_HELPER_INTERFACE_MODE_NPI:
846857 dev->netdev_ops = &cvm_oct_npi_netdev_ops;
847
- strcpy(dev->name, "npi%d");
858
+ strscpy(dev->name, "npi%d", sizeof(dev->name));
848859 break;
849860
850861 case CVMX_HELPER_INTERFACE_MODE_XAUI:
851862 dev->netdev_ops = &cvm_oct_xaui_netdev_ops;
852
- strcpy(dev->name, "xaui%d");
863
+ strscpy(dev->name, "xaui%d", sizeof(dev->name));
853864 break;
854865
855866 case CVMX_HELPER_INTERFACE_MODE_LOOP:
856867 dev->netdev_ops = &cvm_oct_npi_netdev_ops;
857
- strcpy(dev->name, "loop%d");
868
+ strscpy(dev->name, "loop%d", sizeof(dev->name));
858869 break;
859870
860871 case CVMX_HELPER_INTERFACE_MODE_SGMII:
872
+ priv->phy_mode = PHY_INTERFACE_MODE_SGMII;
861873 dev->netdev_ops = &cvm_oct_sgmii_netdev_ops;
862
- strcpy(dev->name, "eth%d");
874
+ strscpy(dev->name, "eth%d", sizeof(dev->name));
863875 break;
864876
865877 case CVMX_HELPER_INTERFACE_MODE_SPI:
866878 dev->netdev_ops = &cvm_oct_spi_netdev_ops;
867
- strcpy(dev->name, "spi%d");
879
+ strscpy(dev->name, "spi%d", sizeof(dev->name));
880
+ break;
881
+
882
+ case CVMX_HELPER_INTERFACE_MODE_GMII:
883
+ priv->phy_mode = PHY_INTERFACE_MODE_GMII;
884
+ dev->netdev_ops = &cvm_oct_rgmii_netdev_ops;
885
+ strscpy(dev->name, "eth%d", sizeof(dev->name));
868886 break;
869887
870888 case CVMX_HELPER_INTERFACE_MODE_RGMII:
871
- case CVMX_HELPER_INTERFACE_MODE_GMII:
872889 dev->netdev_ops = &cvm_oct_rgmii_netdev_ops;
873
- strcpy(dev->name, "eth%d");
874
- cvm_set_rgmii_delay(priv->of_node, interface,
890
+ strscpy(dev->name, "eth%d", sizeof(dev->name));
891
+ cvm_set_rgmii_delay(priv, interface,
875892 port_index);
876893 break;
877894 }
....@@ -977,6 +994,7 @@
977994
978995 module_platform_driver(cvm_oct_driver);
979996
997
+MODULE_SOFTDEP("pre: mdio-cavium");
980998 MODULE_LICENSE("GPL");
981999 MODULE_AUTHOR("Cavium Networks <support@caviumnetworks.com>");
9821000 MODULE_DESCRIPTION("Cavium Networks Octeon ethernet driver.");