.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
---|
1 | 2 | /* |
---|
2 | 3 | * Keystone GBE and XGBE subsystem code |
---|
3 | 4 | * |
---|
.. | .. |
---|
7 | 8 | * Cyril Chemparathy <cyril@ti.com> |
---|
8 | 9 | * Santosh Shilimkar <santosh.shilimkar@ti.com> |
---|
9 | 10 | * Wingman Kwok <w-kwok2@ti.com> |
---|
10 | | - * |
---|
11 | | - * This program is free software; you can redistribute it and/or |
---|
12 | | - * modify it under the terms of the GNU General Public License as |
---|
13 | | - * published by the Free Software Foundation version 2. |
---|
14 | | - * |
---|
15 | | - * This program is distributed "as is" WITHOUT ANY WARRANTY of any |
---|
16 | | - * kind, whether express or implied; without even the implied warranty |
---|
17 | | - * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
18 | | - * GNU General Public License for more details. |
---|
19 | 11 | */ |
---|
20 | 12 | |
---|
21 | 13 | #include <linux/io.h> |
---|
.. | .. |
---|
59 | 51 | #define GBE13_CPTS_OFFSET 0x500 |
---|
60 | 52 | #define GBE13_ALE_OFFSET 0x600 |
---|
61 | 53 | #define GBE13_HOST_PORT_NUM 0 |
---|
62 | | -#define GBE13_NUM_ALE_ENTRIES 1024 |
---|
63 | 54 | |
---|
64 | 55 | /* 1G Ethernet NU SS defines */ |
---|
65 | 56 | #define GBENU_MODULE_NAME "netcp-gbenu" |
---|
.. | .. |
---|
109 | 100 | #define XGBE10_ALE_OFFSET 0x700 |
---|
110 | 101 | #define XGBE10_HW_STATS_OFFSET 0x800 |
---|
111 | 102 | #define XGBE10_HOST_PORT_NUM 0 |
---|
112 | | -#define XGBE10_NUM_ALE_ENTRIES 2048 |
---|
113 | 103 | |
---|
114 | 104 | #define GBE_TIMER_INTERVAL (HZ / 2) |
---|
115 | 105 | |
---|
.. | .. |
---|
719 | 709 | struct netcp_device *netcp_device; |
---|
720 | 710 | struct timer_list timer; |
---|
721 | 711 | u32 num_slaves; |
---|
722 | | - u32 ale_entries; |
---|
723 | 712 | u32 ale_ports; |
---|
724 | 713 | bool enable_ale; |
---|
725 | 714 | u8 max_num_slaves; |
---|
.. | .. |
---|
763 | 752 | |
---|
764 | 753 | int cpts_registered; |
---|
765 | 754 | struct cpts *cpts; |
---|
| 755 | + int rx_ts_enabled; |
---|
| 756 | + int tx_ts_enabled; |
---|
766 | 757 | }; |
---|
767 | 758 | |
---|
768 | 759 | struct gbe_intf { |
---|
.. | .. |
---|
789 | 780 | #define GBE_STATSA_INFO(field) \ |
---|
790 | 781 | { \ |
---|
791 | 782 | "GBE_A:"#field, GBE_STATSA_MODULE, \ |
---|
792 | | - FIELD_SIZEOF(struct gbe_hw_stats, field), \ |
---|
| 783 | + sizeof_field(struct gbe_hw_stats, field), \ |
---|
793 | 784 | offsetof(struct gbe_hw_stats, field) \ |
---|
794 | 785 | } |
---|
795 | 786 | |
---|
796 | 787 | #define GBE_STATSB_INFO(field) \ |
---|
797 | 788 | { \ |
---|
798 | 789 | "GBE_B:"#field, GBE_STATSB_MODULE, \ |
---|
799 | | - FIELD_SIZEOF(struct gbe_hw_stats, field), \ |
---|
| 790 | + sizeof_field(struct gbe_hw_stats, field), \ |
---|
800 | 791 | offsetof(struct gbe_hw_stats, field) \ |
---|
801 | 792 | } |
---|
802 | 793 | |
---|
803 | 794 | #define GBE_STATSC_INFO(field) \ |
---|
804 | 795 | { \ |
---|
805 | 796 | "GBE_C:"#field, GBE_STATSC_MODULE, \ |
---|
806 | | - FIELD_SIZEOF(struct gbe_hw_stats, field), \ |
---|
| 797 | + sizeof_field(struct gbe_hw_stats, field), \ |
---|
807 | 798 | offsetof(struct gbe_hw_stats, field) \ |
---|
808 | 799 | } |
---|
809 | 800 | |
---|
810 | 801 | #define GBE_STATSD_INFO(field) \ |
---|
811 | 802 | { \ |
---|
812 | 803 | "GBE_D:"#field, GBE_STATSD_MODULE, \ |
---|
813 | | - FIELD_SIZEOF(struct gbe_hw_stats, field), \ |
---|
| 804 | + sizeof_field(struct gbe_hw_stats, field), \ |
---|
814 | 805 | offsetof(struct gbe_hw_stats, field) \ |
---|
815 | 806 | } |
---|
816 | 807 | |
---|
.. | .. |
---|
963 | 954 | #define GBENU_STATS_HOST(field) \ |
---|
964 | 955 | { \ |
---|
965 | 956 | "GBE_HOST:"#field, GBENU_STATS0_MODULE, \ |
---|
966 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 957 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
967 | 958 | offsetof(struct gbenu_hw_stats, field) \ |
---|
968 | 959 | } |
---|
969 | 960 | |
---|
.. | .. |
---|
973 | 964 | #define GBENU_STATS_P1(field) \ |
---|
974 | 965 | { \ |
---|
975 | 966 | "GBE_P1:"#field, GBENU_STATS1_MODULE, \ |
---|
976 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 967 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
977 | 968 | offsetof(struct gbenu_hw_stats, field) \ |
---|
978 | 969 | } |
---|
979 | 970 | |
---|
980 | 971 | #define GBENU_STATS_P2(field) \ |
---|
981 | 972 | { \ |
---|
982 | 973 | "GBE_P2:"#field, GBENU_STATS2_MODULE, \ |
---|
983 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 974 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
984 | 975 | offsetof(struct gbenu_hw_stats, field) \ |
---|
985 | 976 | } |
---|
986 | 977 | |
---|
987 | 978 | #define GBENU_STATS_P3(field) \ |
---|
988 | 979 | { \ |
---|
989 | 980 | "GBE_P3:"#field, GBENU_STATS3_MODULE, \ |
---|
990 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 981 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
991 | 982 | offsetof(struct gbenu_hw_stats, field) \ |
---|
992 | 983 | } |
---|
993 | 984 | |
---|
994 | 985 | #define GBENU_STATS_P4(field) \ |
---|
995 | 986 | { \ |
---|
996 | 987 | "GBE_P4:"#field, GBENU_STATS4_MODULE, \ |
---|
997 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 988 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
998 | 989 | offsetof(struct gbenu_hw_stats, field) \ |
---|
999 | 990 | } |
---|
1000 | 991 | |
---|
1001 | 992 | #define GBENU_STATS_P5(field) \ |
---|
1002 | 993 | { \ |
---|
1003 | 994 | "GBE_P5:"#field, GBENU_STATS5_MODULE, \ |
---|
1004 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 995 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
1005 | 996 | offsetof(struct gbenu_hw_stats, field) \ |
---|
1006 | 997 | } |
---|
1007 | 998 | |
---|
1008 | 999 | #define GBENU_STATS_P6(field) \ |
---|
1009 | 1000 | { \ |
---|
1010 | 1001 | "GBE_P6:"#field, GBENU_STATS6_MODULE, \ |
---|
1011 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 1002 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
1012 | 1003 | offsetof(struct gbenu_hw_stats, field) \ |
---|
1013 | 1004 | } |
---|
1014 | 1005 | |
---|
1015 | 1006 | #define GBENU_STATS_P7(field) \ |
---|
1016 | 1007 | { \ |
---|
1017 | 1008 | "GBE_P7:"#field, GBENU_STATS7_MODULE, \ |
---|
1018 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 1009 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
1019 | 1010 | offsetof(struct gbenu_hw_stats, field) \ |
---|
1020 | 1011 | } |
---|
1021 | 1012 | |
---|
1022 | 1013 | #define GBENU_STATS_P8(field) \ |
---|
1023 | 1014 | { \ |
---|
1024 | 1015 | "GBE_P8:"#field, GBENU_STATS8_MODULE, \ |
---|
1025 | | - FIELD_SIZEOF(struct gbenu_hw_stats, field), \ |
---|
| 1016 | + sizeof_field(struct gbenu_hw_stats, field), \ |
---|
1026 | 1017 | offsetof(struct gbenu_hw_stats, field) \ |
---|
1027 | 1018 | } |
---|
1028 | 1019 | |
---|
.. | .. |
---|
1613 | 1604 | #define XGBE_STATS0_INFO(field) \ |
---|
1614 | 1605 | { \ |
---|
1615 | 1606 | "GBE_0:"#field, XGBE_STATS0_MODULE, \ |
---|
1616 | | - FIELD_SIZEOF(struct xgbe_hw_stats, field), \ |
---|
| 1607 | + sizeof_field(struct xgbe_hw_stats, field), \ |
---|
1617 | 1608 | offsetof(struct xgbe_hw_stats, field) \ |
---|
1618 | 1609 | } |
---|
1619 | 1610 | |
---|
1620 | 1611 | #define XGBE_STATS1_INFO(field) \ |
---|
1621 | 1612 | { \ |
---|
1622 | 1613 | "GBE_1:"#field, XGBE_STATS1_MODULE, \ |
---|
1623 | | - FIELD_SIZEOF(struct xgbe_hw_stats, field), \ |
---|
| 1614 | + sizeof_field(struct xgbe_hw_stats, field), \ |
---|
1624 | 1615 | offsetof(struct xgbe_hw_stats, field) \ |
---|
1625 | 1616 | } |
---|
1626 | 1617 | |
---|
1627 | 1618 | #define XGBE_STATS2_INFO(field) \ |
---|
1628 | 1619 | { \ |
---|
1629 | 1620 | "GBE_2:"#field, XGBE_STATS2_MODULE, \ |
---|
1630 | | - FIELD_SIZEOF(struct xgbe_hw_stats, field), \ |
---|
| 1621 | + sizeof_field(struct xgbe_hw_stats, field), \ |
---|
1631 | 1622 | offsetof(struct xgbe_hw_stats, field) \ |
---|
1632 | 1623 | } |
---|
1633 | 1624 | |
---|
.. | .. |
---|
2297 | 2288 | struct gbe_slave *slave = gbe_intf->slave; |
---|
2298 | 2289 | phy_interface_t phy_mode; |
---|
2299 | 2290 | bool has_phy = false; |
---|
| 2291 | + int err; |
---|
2300 | 2292 | |
---|
2301 | 2293 | void (*hndlr)(struct net_device *) = gbe_adjust_link; |
---|
2302 | 2294 | |
---|
.. | .. |
---|
2326 | 2318 | slave->phy_port_t = PORT_MII; |
---|
2327 | 2319 | } else if (slave->link_interface == RGMII_LINK_MAC_PHY) { |
---|
2328 | 2320 | has_phy = true; |
---|
2329 | | - phy_mode = of_get_phy_mode(slave->node); |
---|
| 2321 | + err = of_get_phy_mode(slave->node, &phy_mode); |
---|
2330 | 2322 | /* if phy-mode is not present, default to |
---|
2331 | 2323 | * PHY_INTERFACE_MODE_RGMII |
---|
2332 | 2324 | */ |
---|
2333 | | - if (phy_mode < 0) |
---|
| 2325 | + if (err) |
---|
2334 | 2326 | phy_mode = PHY_INTERFACE_MODE_RGMII; |
---|
2335 | 2327 | |
---|
2336 | 2328 | if (!phy_interface_mode_is_rgmii(phy_mode)) { |
---|
.. | .. |
---|
2538 | 2530 | } |
---|
2539 | 2531 | |
---|
2540 | 2532 | #if IS_ENABLED(CONFIG_TI_CPTS) |
---|
2541 | | -#define HAS_PHY_TXTSTAMP(p) ((p)->drv && (p)->drv->txtstamp) |
---|
2542 | | -#define HAS_PHY_RXTSTAMP(p) ((p)->drv && (p)->drv->rxtstamp) |
---|
2543 | 2533 | |
---|
2544 | 2534 | static void gbe_txtstamp(void *context, struct sk_buff *skb) |
---|
2545 | 2535 | { |
---|
.. | .. |
---|
2564 | 2554 | struct gbe_priv *gbe_dev = gbe_intf->gbe_dev; |
---|
2565 | 2555 | |
---|
2566 | 2556 | if (!(skb_shinfo(p_info->skb)->tx_flags & SKBTX_HW_TSTAMP) || |
---|
2567 | | - !cpts_is_tx_enabled(gbe_dev->cpts)) |
---|
| 2557 | + !gbe_dev->tx_ts_enabled) |
---|
2568 | 2558 | return 0; |
---|
2569 | 2559 | |
---|
2570 | 2560 | /* If phy has the txtstamp api, assume it will do it. |
---|
2571 | 2561 | * We mark it here because skb_tx_timestamp() is called |
---|
2572 | 2562 | * after all the txhooks are called. |
---|
2573 | 2563 | */ |
---|
2574 | | - if (phydev && HAS_PHY_TXTSTAMP(phydev)) { |
---|
| 2564 | + if (phy_has_txtstamp(phydev)) { |
---|
2575 | 2565 | skb_shinfo(p_info->skb)->tx_flags |= SKBTX_IN_PROGRESS; |
---|
2576 | 2566 | return 0; |
---|
2577 | 2567 | } |
---|
.. | .. |
---|
2593 | 2583 | if (p_info->rxtstamp_complete) |
---|
2594 | 2584 | return 0; |
---|
2595 | 2585 | |
---|
2596 | | - if (phydev && HAS_PHY_RXTSTAMP(phydev)) { |
---|
| 2586 | + if (phy_has_rxtstamp(phydev)) { |
---|
2597 | 2587 | p_info->rxtstamp_complete = true; |
---|
2598 | 2588 | return 0; |
---|
2599 | 2589 | } |
---|
2600 | 2590 | |
---|
2601 | | - cpts_rx_timestamp(gbe_dev->cpts, p_info->skb); |
---|
| 2591 | + if (gbe_dev->rx_ts_enabled) |
---|
| 2592 | + cpts_rx_timestamp(gbe_dev->cpts, p_info->skb); |
---|
| 2593 | + |
---|
2602 | 2594 | p_info->rxtstamp_complete = true; |
---|
2603 | 2595 | |
---|
2604 | 2596 | return 0; |
---|
.. | .. |
---|
2614 | 2606 | return -EOPNOTSUPP; |
---|
2615 | 2607 | |
---|
2616 | 2608 | cfg.flags = 0; |
---|
2617 | | - cfg.tx_type = cpts_is_tx_enabled(cpts) ? |
---|
2618 | | - HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; |
---|
2619 | | - cfg.rx_filter = (cpts_is_rx_enabled(cpts) ? |
---|
2620 | | - cpts->rx_enable : HWTSTAMP_FILTER_NONE); |
---|
| 2609 | + cfg.tx_type = gbe_dev->tx_ts_enabled ? HWTSTAMP_TX_ON : HWTSTAMP_TX_OFF; |
---|
| 2610 | + cfg.rx_filter = gbe_dev->rx_ts_enabled; |
---|
2621 | 2611 | |
---|
2622 | 2612 | return copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg)) ? -EFAULT : 0; |
---|
2623 | 2613 | } |
---|
.. | .. |
---|
2628 | 2618 | struct gbe_slave *slave = gbe_intf->slave; |
---|
2629 | 2619 | u32 ts_en, seq_id, ctl; |
---|
2630 | 2620 | |
---|
2631 | | - if (!cpts_is_rx_enabled(gbe_dev->cpts) && |
---|
2632 | | - !cpts_is_tx_enabled(gbe_dev->cpts)) { |
---|
| 2621 | + if (!gbe_dev->rx_ts_enabled && |
---|
| 2622 | + !gbe_dev->tx_ts_enabled) { |
---|
2633 | 2623 | writel(0, GBE_REG_ADDR(slave, port_regs, ts_ctl)); |
---|
2634 | 2624 | return; |
---|
2635 | 2625 | } |
---|
.. | .. |
---|
2641 | 2631 | (slave->ts_ctl.uni ? TS_UNI_EN : |
---|
2642 | 2632 | slave->ts_ctl.maddr_map << TS_CTL_MADDR_SHIFT); |
---|
2643 | 2633 | |
---|
2644 | | - if (cpts_is_tx_enabled(gbe_dev->cpts)) |
---|
| 2634 | + if (gbe_dev->tx_ts_enabled) |
---|
2645 | 2635 | ts_en |= (TS_TX_ANX_ALL_EN | TS_TX_VLAN_LT1_EN); |
---|
2646 | 2636 | |
---|
2647 | | - if (cpts_is_rx_enabled(gbe_dev->cpts)) |
---|
| 2637 | + if (gbe_dev->rx_ts_enabled) |
---|
2648 | 2638 | ts_en |= (TS_RX_ANX_ALL_EN | TS_RX_VLAN_LT1_EN); |
---|
2649 | 2639 | |
---|
2650 | 2640 | writel(ts_en, GBE_REG_ADDR(slave, port_regs, ts_ctl)); |
---|
.. | .. |
---|
2670 | 2660 | |
---|
2671 | 2661 | switch (cfg.tx_type) { |
---|
2672 | 2662 | case HWTSTAMP_TX_OFF: |
---|
2673 | | - cpts_tx_enable(cpts, 0); |
---|
| 2663 | + gbe_dev->tx_ts_enabled = 0; |
---|
2674 | 2664 | break; |
---|
2675 | 2665 | case HWTSTAMP_TX_ON: |
---|
2676 | | - cpts_tx_enable(cpts, 1); |
---|
| 2666 | + gbe_dev->tx_ts_enabled = 1; |
---|
2677 | 2667 | break; |
---|
2678 | 2668 | default: |
---|
2679 | 2669 | return -ERANGE; |
---|
.. | .. |
---|
2681 | 2671 | |
---|
2682 | 2672 | switch (cfg.rx_filter) { |
---|
2683 | 2673 | case HWTSTAMP_FILTER_NONE: |
---|
2684 | | - cpts_rx_enable(cpts, 0); |
---|
| 2674 | + gbe_dev->rx_ts_enabled = HWTSTAMP_FILTER_NONE; |
---|
2685 | 2675 | break; |
---|
2686 | 2676 | case HWTSTAMP_FILTER_PTP_V1_L4_EVENT: |
---|
2687 | 2677 | case HWTSTAMP_FILTER_PTP_V1_L4_SYNC: |
---|
2688 | 2678 | case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ: |
---|
2689 | | - cpts_rx_enable(cpts, HWTSTAMP_FILTER_PTP_V1_L4_EVENT); |
---|
| 2679 | + gbe_dev->rx_ts_enabled = HWTSTAMP_FILTER_PTP_V1_L4_EVENT; |
---|
2690 | 2680 | cfg.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT; |
---|
2691 | 2681 | break; |
---|
2692 | 2682 | case HWTSTAMP_FILTER_PTP_V2_L4_EVENT: |
---|
.. | .. |
---|
2698 | 2688 | case HWTSTAMP_FILTER_PTP_V2_EVENT: |
---|
2699 | 2689 | case HWTSTAMP_FILTER_PTP_V2_SYNC: |
---|
2700 | 2690 | case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: |
---|
2701 | | - cpts_rx_enable(cpts, HWTSTAMP_FILTER_PTP_V2_EVENT); |
---|
| 2691 | + gbe_dev->rx_ts_enabled = HWTSTAMP_FILTER_PTP_V2_EVENT; |
---|
2702 | 2692 | cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT; |
---|
2703 | 2693 | break; |
---|
2704 | 2694 | default: |
---|
.. | .. |
---|
2835 | 2825 | struct gbe_intf *gbe_intf = intf_priv; |
---|
2836 | 2826 | struct phy_device *phy = gbe_intf->slave->phy; |
---|
2837 | 2827 | |
---|
2838 | | - if (!phy || !phy->drv->hwtstamp) { |
---|
| 2828 | + if (!phy_has_hwtstamp(phy)) { |
---|
2839 | 2829 | switch (cmd) { |
---|
2840 | 2830 | case SIOCGHWTSTAMP: |
---|
2841 | 2831 | return gbe_hwtstamp_get(gbe_intf, req); |
---|
.. | .. |
---|
3137 | 3127 | for_each_child_of_node(node, port) { |
---|
3138 | 3128 | slave = devm_kzalloc(dev, sizeof(*slave), GFP_KERNEL); |
---|
3139 | 3129 | if (!slave) { |
---|
3140 | | - dev_err(dev, "memory alloc failed for secondary port(%s), skipping...\n", |
---|
3141 | | - port->name); |
---|
| 3130 | + dev_err(dev, "memory alloc failed for secondary port(%pOFn), skipping...\n", |
---|
| 3131 | + port); |
---|
3142 | 3132 | continue; |
---|
3143 | 3133 | } |
---|
3144 | 3134 | |
---|
3145 | 3135 | if (init_slave(gbe_dev, slave, port)) { |
---|
3146 | 3136 | dev_err(dev, |
---|
3147 | | - "Failed to initialize secondary port(%s), skipping...\n", |
---|
3148 | | - port->name); |
---|
| 3137 | + "Failed to initialize secondary port(%pOFn), skipping...\n", |
---|
| 3138 | + port); |
---|
3149 | 3139 | devm_kfree(dev, slave); |
---|
3150 | 3140 | continue; |
---|
3151 | 3141 | } |
---|
.. | .. |
---|
3239 | 3229 | ret = of_address_to_resource(node, XGBE_SS_REG_INDEX, &res); |
---|
3240 | 3230 | if (ret) { |
---|
3241 | 3231 | dev_err(gbe_dev->dev, |
---|
3242 | | - "Can't xlate xgbe of node(%s) ss address at %d\n", |
---|
3243 | | - node->name, XGBE_SS_REG_INDEX); |
---|
| 3232 | + "Can't xlate xgbe of node(%pOFn) ss address at %d\n", |
---|
| 3233 | + node, XGBE_SS_REG_INDEX); |
---|
3244 | 3234 | return ret; |
---|
3245 | 3235 | } |
---|
3246 | 3236 | |
---|
.. | .. |
---|
3254 | 3244 | ret = of_address_to_resource(node, XGBE_SM_REG_INDEX, &res); |
---|
3255 | 3245 | if (ret) { |
---|
3256 | 3246 | dev_err(gbe_dev->dev, |
---|
3257 | | - "Can't xlate xgbe of node(%s) sm address at %d\n", |
---|
3258 | | - node->name, XGBE_SM_REG_INDEX); |
---|
| 3247 | + "Can't xlate xgbe of node(%pOFn) sm address at %d\n", |
---|
| 3248 | + node, XGBE_SM_REG_INDEX); |
---|
3259 | 3249 | return ret; |
---|
3260 | 3250 | } |
---|
3261 | 3251 | |
---|
.. | .. |
---|
3269 | 3259 | ret = of_address_to_resource(node, XGBE_SERDES_REG_INDEX, &res); |
---|
3270 | 3260 | if (ret) { |
---|
3271 | 3261 | dev_err(gbe_dev->dev, |
---|
3272 | | - "Can't xlate xgbe serdes of node(%s) address at %d\n", |
---|
3273 | | - node->name, XGBE_SERDES_REG_INDEX); |
---|
| 3262 | + "Can't xlate xgbe serdes of node(%pOFn) address at %d\n", |
---|
| 3263 | + node, XGBE_SERDES_REG_INDEX); |
---|
3274 | 3264 | return ret; |
---|
3275 | 3265 | } |
---|
3276 | 3266 | |
---|
.. | .. |
---|
3316 | 3306 | gbe_dev->cpts_reg = gbe_dev->switch_regs + XGBE10_CPTS_OFFSET; |
---|
3317 | 3307 | gbe_dev->ale_ports = gbe_dev->max_num_ports; |
---|
3318 | 3308 | gbe_dev->host_port = XGBE10_HOST_PORT_NUM; |
---|
3319 | | - gbe_dev->ale_entries = XGBE10_NUM_ALE_ENTRIES; |
---|
3320 | 3309 | gbe_dev->stats_en_mask = (1 << (gbe_dev->max_num_ports)) - 1; |
---|
3321 | 3310 | |
---|
3322 | 3311 | /* Subsystem registers */ |
---|
.. | .. |
---|
3347 | 3336 | ret = of_address_to_resource(node, GBE_SS_REG_INDEX, &res); |
---|
3348 | 3337 | if (ret) { |
---|
3349 | 3338 | dev_err(gbe_dev->dev, |
---|
3350 | | - "Can't translate of node(%s) of gbe ss address at %d\n", |
---|
3351 | | - node->name, GBE_SS_REG_INDEX); |
---|
| 3339 | + "Can't translate of node(%pOFn) of gbe ss address at %d\n", |
---|
| 3340 | + node, GBE_SS_REG_INDEX); |
---|
3352 | 3341 | return ret; |
---|
3353 | 3342 | } |
---|
3354 | 3343 | |
---|
.. | .. |
---|
3372 | 3361 | ret = of_address_to_resource(node, GBE_SGMII34_REG_INDEX, &res); |
---|
3373 | 3362 | if (ret) { |
---|
3374 | 3363 | dev_err(gbe_dev->dev, |
---|
3375 | | - "Can't translate of gbe node(%s) address at index %d\n", |
---|
3376 | | - node->name, GBE_SGMII34_REG_INDEX); |
---|
| 3364 | + "Can't translate of gbe node(%pOFn) address at index %d\n", |
---|
| 3365 | + node, GBE_SGMII34_REG_INDEX); |
---|
3377 | 3366 | return ret; |
---|
3378 | 3367 | } |
---|
3379 | 3368 | |
---|
.. | .. |
---|
3388 | 3377 | ret = of_address_to_resource(node, GBE_SM_REG_INDEX, &res); |
---|
3389 | 3378 | if (ret) { |
---|
3390 | 3379 | dev_err(gbe_dev->dev, |
---|
3391 | | - "Can't translate of gbe node(%s) address at index %d\n", |
---|
3392 | | - node->name, GBE_SM_REG_INDEX); |
---|
| 3380 | + "Can't translate of gbe node(%pOFn) address at index %d\n", |
---|
| 3381 | + node, GBE_SM_REG_INDEX); |
---|
3393 | 3382 | return ret; |
---|
3394 | 3383 | } |
---|
3395 | 3384 | |
---|
.. | .. |
---|
3440 | 3429 | gbe_dev->ale_reg = gbe_dev->switch_regs + GBE13_ALE_OFFSET; |
---|
3441 | 3430 | gbe_dev->ale_ports = gbe_dev->max_num_ports; |
---|
3442 | 3431 | gbe_dev->host_port = GBE13_HOST_PORT_NUM; |
---|
3443 | | - gbe_dev->ale_entries = GBE13_NUM_ALE_ENTRIES; |
---|
3444 | 3432 | gbe_dev->stats_en_mask = GBE13_REG_VAL_STAT_ENABLE_ALL; |
---|
3445 | 3433 | |
---|
3446 | 3434 | /* Subsystem registers */ |
---|
.. | .. |
---|
3498 | 3486 | ret = of_address_to_resource(node, GBENU_SM_REG_INDEX, &res); |
---|
3499 | 3487 | if (ret) { |
---|
3500 | 3488 | dev_err(gbe_dev->dev, |
---|
3501 | | - "Can't translate of gbenu node(%s) addr at index %d\n", |
---|
3502 | | - node->name, GBENU_SM_REG_INDEX); |
---|
| 3489 | + "Can't translate of gbenu node(%pOFn) addr at index %d\n", |
---|
| 3490 | + node, GBENU_SM_REG_INDEX); |
---|
3503 | 3491 | return ret; |
---|
3504 | 3492 | } |
---|
3505 | 3493 | |
---|
.. | .. |
---|
3560 | 3548 | static int gbe_probe(struct netcp_device *netcp_device, struct device *dev, |
---|
3561 | 3549 | struct device_node *node, void **inst_priv) |
---|
3562 | 3550 | { |
---|
3563 | | - struct device_node *interfaces, *interface; |
---|
| 3551 | + struct device_node *interfaces, *interface, *cpts_node; |
---|
3564 | 3552 | struct device_node *secondary_ports; |
---|
3565 | 3553 | struct cpsw_ale_params ale_params; |
---|
3566 | 3554 | struct gbe_priv *gbe_dev; |
---|
.. | .. |
---|
3621 | 3609 | return -EINVAL; |
---|
3622 | 3610 | } |
---|
3623 | 3611 | |
---|
3624 | | - if (!strcmp(node->name, "gbe")) { |
---|
| 3612 | + if (of_node_name_eq(node, "gbe")) { |
---|
3625 | 3613 | ret = get_gbe_resource_version(gbe_dev, node); |
---|
3626 | 3614 | if (ret) |
---|
3627 | 3615 | return ret; |
---|
.. | .. |
---|
3635 | 3623 | else |
---|
3636 | 3624 | ret = -ENODEV; |
---|
3637 | 3625 | |
---|
3638 | | - } else if (!strcmp(node->name, "xgbe")) { |
---|
| 3626 | + } else if (of_node_name_eq(node, "xgbe")) { |
---|
3639 | 3627 | ret = set_xgbe_ethss10_priv(gbe_dev, node); |
---|
3640 | 3628 | if (ret) |
---|
3641 | 3629 | return ret; |
---|
3642 | 3630 | ret = netcp_xgbe_serdes_init(gbe_dev->xgbe_serdes_regs, |
---|
3643 | 3631 | gbe_dev->ss_regs); |
---|
3644 | 3632 | } else { |
---|
3645 | | - dev_err(dev, "unknown GBE node(%s)\n", node->name); |
---|
| 3633 | + dev_err(dev, "unknown GBE node(%pOFn)\n", node); |
---|
3646 | 3634 | ret = -ENODEV; |
---|
3647 | 3635 | } |
---|
3648 | 3636 | |
---|
.. | .. |
---|
3671 | 3659 | for_each_child_of_node(interfaces, interface) { |
---|
3672 | 3660 | ret = of_property_read_u32(interface, "slave-port", &slave_num); |
---|
3673 | 3661 | if (ret) { |
---|
3674 | | - dev_err(dev, "missing slave-port parameter, skipping interface configuration for %s\n", |
---|
3675 | | - interface->name); |
---|
| 3662 | + dev_err(dev, "missing slave-port parameter, skipping interface configuration for %pOFn\n", |
---|
| 3663 | + interface); |
---|
3676 | 3664 | continue; |
---|
3677 | 3665 | } |
---|
3678 | 3666 | gbe_dev->num_slaves++; |
---|
.. | .. |
---|
3704 | 3692 | ale_params.dev = gbe_dev->dev; |
---|
3705 | 3693 | ale_params.ale_regs = gbe_dev->ale_reg; |
---|
3706 | 3694 | ale_params.ale_ageout = GBE_DEFAULT_ALE_AGEOUT; |
---|
3707 | | - ale_params.ale_entries = gbe_dev->ale_entries; |
---|
3708 | 3695 | ale_params.ale_ports = gbe_dev->ale_ports; |
---|
3709 | | - if (IS_SS_ID_MU(gbe_dev)) { |
---|
3710 | | - ale_params.major_ver_mask = 0x7; |
---|
3711 | | - ale_params.nu_switch_ale = true; |
---|
3712 | | - } |
---|
| 3696 | + ale_params.dev_id = "cpsw"; |
---|
| 3697 | + if (IS_SS_ID_NU(gbe_dev)) |
---|
| 3698 | + ale_params.dev_id = "66ak2el"; |
---|
| 3699 | + else if (IS_SS_ID_2U(gbe_dev)) |
---|
| 3700 | + ale_params.dev_id = "66ak2g"; |
---|
| 3701 | + else if (IS_SS_ID_XGBE(gbe_dev)) |
---|
| 3702 | + ale_params.dev_id = "66ak2h-xgbe"; |
---|
| 3703 | + |
---|
3713 | 3704 | gbe_dev->ale = cpsw_ale_create(&ale_params); |
---|
3714 | | - if (!gbe_dev->ale) { |
---|
| 3705 | + if (IS_ERR(gbe_dev->ale)) { |
---|
3715 | 3706 | dev_err(gbe_dev->dev, "error initializing ale engine\n"); |
---|
3716 | | - ret = -ENODEV; |
---|
| 3707 | + ret = PTR_ERR(gbe_dev->ale); |
---|
3717 | 3708 | goto free_sec_ports; |
---|
3718 | 3709 | } else { |
---|
3719 | 3710 | dev_dbg(gbe_dev->dev, "Created a gbe ale engine\n"); |
---|
3720 | 3711 | } |
---|
3721 | 3712 | |
---|
3722 | | - gbe_dev->cpts = cpts_create(gbe_dev->dev, gbe_dev->cpts_reg, node); |
---|
| 3713 | + cpts_node = of_get_child_by_name(node, "cpts"); |
---|
| 3714 | + if (!cpts_node) |
---|
| 3715 | + cpts_node = of_node_get(node); |
---|
| 3716 | + |
---|
| 3717 | + gbe_dev->cpts = cpts_create(gbe_dev->dev, gbe_dev->cpts_reg, |
---|
| 3718 | + cpts_node, 0); |
---|
| 3719 | + of_node_put(cpts_node); |
---|
3723 | 3720 | if (IS_ENABLED(CONFIG_TI_CPTS) && IS_ERR(gbe_dev->cpts)) { |
---|
3724 | 3721 | ret = PTR_ERR(gbe_dev->cpts); |
---|
3725 | 3722 | goto free_sec_ports; |
---|