| .. | .. |
|---|
| 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; |
|---|