openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

ptp.h (106102B)


      1 /*
      2  * 
      3  * 
      4  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      5  * 
      6  * Copyright 2007-2020 Broadcom Inc. All rights reserved.
      7  */
      8 
      9 #ifndef __BCM_INT_PTP_H__
     10 #define __BCM_INT_PTP_H__
     11 
     12 #include <shared/bsl.h>
     13 
     14 #include <soc/defs.h>
     15 #include <soc/drv.h>
     16 
     17 #if defined(INCLUDE_PTP)
     18 
     19 #include <shared/rdpc.h>
     20 #include <bcm/ptp.h>
     21 
     22 #define PTP_TIMESOURCE_TODIN_MGMTMSG_FORMAT_LENGTH                     (32)
     23 #define PTP_TIMESOURCE_TODIN_MGMTMSG_MASK_LENGTH (BCM_PTP_MAX_TOD_FORMAT_STRING)
     24 
     25 #ifndef MIN
     26 #define MIN(a,b) ((a) < (b) ? (a) : (b))
     27 #endif
     28 
     29 #ifndef BCM_PTP_MAX_BUFFERS
     30 /* BCM_PTP_MAX_BUFFERS: number of message buffers usable by CMICm */
     31 #define BCM_PTP_MAX_BUFFERS (48)
     32 #endif
     33 
     34 #ifndef BCM_PTP_MAX_LOG
     35 /* BCM_PTP_MAX_LOG: size of debug log from CMICm */
     36 #define BCM_PTP_MAX_LOG (1024)
     37 #endif
     38 
     39 #ifdef BCM_WARM_BOOT_SUPPORT
     40 extern int _bcm_common_ptp_sync(int unit);
     41 #endif
     42 #ifdef BCM_WARM_BOOT_SUPPORT_SW_DUMP
     43 extern void _bcm_ptp_sw_dump(int unit);
     44 #endif /* BCM_WARM_BOOT_SUPPORT_SW_DUMP */
     45 
     46 #if defined(BCM_KATANA_SUPPORT)
     47  #define PTP_CONDITIONAL_IS_KATANA(unit) (SOC_IS_KATANA(unit))
     48 #else
     49  #define PTP_CONDITIONAL_IS_KATANA(unit) (0)
     50 #endif
     51 
     52 #if defined(BCM_TRIUMPH3_SUPPORT)
     53  #define PTP_CONDITIONAL_IS_TRIUMPH3(unit) (SOC_IS_TRIUMPH3(unit))
     54 #else
     55  #define PTP_CONDITIONAL_IS_TRIUMPH3(unit) (0)
     56 #endif
     57 
     58 #if defined(BCM_TRIDENT2_SUPPORT)
     59  #define PTP_CONDITIONAL_IS_TRIDENT2(unit) (SOC_IS_TD2_TT2(unit))
     60 #else
     61  #define PTP_CONDITIONAL_IS_TRIDENT2(unit) (0)
     62 #endif
     63 
     64 #if defined(BCM_ARAD_SUPPORT)
     65  #define PTP_CONDITIONAL_IS_ARAD(unit) (SOC_IS_ARAD(unit))
     66 #else
     67  #define PTP_CONDITIONAL_IS_ARAD(unit) (0)
     68 #endif
     69 
     70 #if defined(BCM_KATANA2_SUPPORT)
     71  #define PTP_CONDITIONAL_IS_KATANA2(unit) (SOC_IS_KATANA2(unit))
     72 #else
     73  #define PTP_CONDITIONAL_IS_KATANA2(unit) (0)
     74 #endif
     75 
     76 #if defined(BCM_HURRICANE2_SUPPORT)
     77  #define PTP_CONDITIONAL_IS_HURRICANE2(unit) (SOC_IS_HURRICANE2(unit))
     78 #else
     79  #define PTP_CONDITIONAL_IS_HURRICANE2(unit) (0)
     80 #endif
     81 
     82 #if defined(BCM_GREYHOUND_SUPPORT)
     83  #define PTP_CONDITIONAL_IS_GREYHOUND(unit) (SOC_IS_GREYHOUND(unit))
     84 #else
     85  #define PTP_CONDITIONAL_IS_GREYHOUND(unit) (0)
     86 #endif
     87 
     88 #if defined(BCM_GREYHOUND2_SUPPORT)
     89  #define PTP_CONDITIONAL_IS_GREYHOUND2(unit) (SOC_IS_GREYHOUND2(unit))
     90 #else
     91  #define PTP_CONDITIONAL_IS_GREYHOUND2(unit) (0)
     92 #endif
     93 
     94 #if defined(BCM_SABER2_SUPPORT)
     95  #define PTP_CONDITIONAL_IS_SABER2(unit) (SOC_IS_SABER2(unit))
     96 #else
     97  #define PTP_CONDITIONAL_IS_SABER2(unit) (0)
     98 #endif
     99 
    100 #if defined(BCM_TOMAHAWK_SUPPORT)
    101  #define PTP_CONDITIONAL_IS_TOMAHAWK(unit) (SOC_IS_TOMAHAWKX(unit))
    102 #else
    103  #define PTP_CONDITIONAL_IS_TOMAHAWK(unit) (0)
    104 #endif
    105 
    106 #if defined(BCM_APACHE_SUPPORT)
    107  #define PTP_CONDITIONAL_IS_APACHE(unit) (SOC_IS_APACHE(unit))
    108 #else
    109  #define PTP_CONDITIONAL_IS_APACHE(unit) (0)
    110 #endif
    111 
    112 #if defined(BCM_HURRICANE3_SUPPORT)
    113  #define PTP_CONDITIONAL_IS_HURRICANE3(unit) (SOC_IS_HURRICANE3(unit))
    114 #else
    115  #define PTP_CONDITIONAL_IS_HURRICANE3(unit) (0)
    116 #endif
    117 
    118 #if defined(BCM_QAX_SUPPORT)
    119  #define PTP_CONDITIONAL_IS_QAX(unit) (SOC_IS_QAX(unit))
    120 #else
    121  #define PTP_CONDITIONAL_IS_QAX(unit) (0)
    122 #endif
    123 
    124 #if defined(BCM_QUX_SUPPORT)
    125  #define PTP_CONDITIONAL_IS_QUX(unit) (SOC_IS_QUX(unit))
    126 #else
    127  #define PTP_CONDITIONAL_IS_QUX(unit) (0)
    128 #endif
    129 
    130 #if defined(BCM_MONTEREY_SUPPORT)
    131  #define PTP_CONDITIONAL_IS_MONTEREY(unit) (SOC_IS_MONTEREY(unit))
    132 #define BCM_TDPLL_FREQUENCY (625)
    133 #else
    134  #define PTP_CONDITIONAL_IS_MONTEREY(unit) (0)
    135 #endif
    136 
    137 /* define SOC which support internal stack */
    138 #if defined(BCM_KATANA_SUPPORT) || defined(BCM_TRIUMPH3_SUPPORT) || defined(BCM_TRIDENT2_SUPPORT) || \
    139     defined(BCM_ARAD_SUPPORT) || defined(BCM_KATANA2_SUPPORT) || defined(BCM_HURRICANE2_SUPPORT) ||  \
    140     defined(BCM_GREYHOUND_SUPPORT) || defined(BCM_SABER2_SUPPORT) || defined(BCM_TOMAHAWK_SUPPORT) || \
    141     defined(BCM_APACHE_SUPPORT) || defined(BCM_HURRICANE3_SUPPORT)|| defined(BCM_QAX_SUPPORT) || \
    142     defined(BCM_QUX_SUPPORT)
    143  /* For compile-time decision: */
    144  #define BCM_PTP_INTERNAL_STACK_SUPPORT (1)
    145  /* For run-time per-unit decisions: */
    146 #define SOC_HAS_PTP_INTERNAL_STACK_SUPPORT(unit)  (PTP_CONDITIONAL_IS_KATANA(unit) || PTP_CONDITIONAL_IS_TRIUMPH3(unit) ||    \
    147                                                    PTP_CONDITIONAL_IS_TRIDENT2(unit) || PTP_CONDITIONAL_IS_ARAD(unit) ||      \
    148                                                    PTP_CONDITIONAL_IS_KATANA2(unit) || PTP_CONDITIONAL_IS_HURRICANE2(unit) || \
    149                                                    PTP_CONDITIONAL_IS_GREYHOUND(unit) || PTP_CONDITIONAL_IS_SABER2(unit) ||   \
    150                                                    PTP_CONDITIONAL_IS_TOMAHAWK(unit) || PTP_CONDITIONAL_IS_APACHE(unit)  ||   \
    151                                                    PTP_CONDITIONAL_IS_HURRICANE3(unit) || PTP_CONDITIONAL_IS_QAX(unit)   ||   \
    152                                                    PTP_CONDITIONAL_IS_QUX(unit) || PTP_CONDITIONAL_IS_GREYHOUND2(unit)   ||   \
    153                                                    PTP_CONDITIONAL_IS_MONTEREY(unit))
    154 #else
    155  #undef BCM_PTP_INTERNAL_STACK_SUPPORT
    156  #define SOC_HAS_PTP_INTERNAL_STACK_SUPPORT(unit)          (0)
    157 #endif
    158 
    159 /* define SOC which should include external stack support */
    160 #if defined(PTP_KEYSTONE_STACK) && defined(BCM_ENDURO_SUPPORT)
    161  /* For compile-time decisions: */
    162  #define BCM_PTP_EXTERNAL_STACK_SUPPORT (1)
    163  /* For run-time per-unit decisions: */
    164  #define SOC_HAS_PTP_EXTERNAL_STACK_SUPPORT(unit)          (SOC_IS_ENDURO(unit))
    165 #else
    166  #undef BCM_PTP_EXTERNAL_STACK_SUPPORT
    167  #define SOC_HAS_PTP_EXTERNAL_STACK_SUPPORT(unit)          (SOC_IS_ENDURO(unit))
    168 #endif
    169 
    170 #define PTP_ERROR(errmsg)      BSL_LOG( BSL_LS_BCM_PTP | BSL_ERROR, \
    171                                 ("%s() FAILED %s\n", FUNCTION_NAME(), errmsg))
    172 
    173 #define PTP_ERROR_FUNC(func)   BSL_LOG( BSL_LS_BCM_PTP | BSL_ERROR, \
    174                                 ("%s() FAILED: %s returned %d : %s\n", \
    175                                 FUNCTION_NAME(),func, rv, bcm_errmsg(rv)))
    176 
    177 #define PTP_WARN(warnmsg)      BSL_LOG( BSL_LS_BCM_PTP | BSL_WARN, \
    178                                 ("%s() failed %s\n", FUNCTION_NAME(), warnmsg))
    179 
    180 #define PTP_WARN_FUNC(func)    BSL_LOG( BSL_LS_BCM_PTP | BSL_WARN,  \
    181                                 ("%s() failed %s returned %d : %s\n", \
    182                                 FUNCTION_NAME(), func, rv, bcm_errmsg(rv)))
    183 
    184 #define CONFIG_RCPU_OFFSET (0)
    185 #define CONFIG_RCPU_SIZE (4 + 4 + 4 + 4 + 4 + 4 + 6 + 2)
    186 #define CONFIG_VLAN_OFFSET (CONFIG_RCPU_OFFSET + CONFIG_RCPU_SIZE)
    187 #define CONFIG_VLAN_SIZE (2 + 2)
    188 #define CONFIG_MPLS_OFFSET (CONFIG_VLAN_OFFSET + CONFIG_VLAN_SIZE)
    189 #define CONFIG_MPLS_SIZE (2 + 2)
    190 #define CONFIG_HOST_OFFSET (CONFIG_MPLS_OFFSET + CONFIG_MPLS_SIZE)
    191 #define CONFIG_HOST_SIZE (6 + 2 + 6 + 2 + 4 + 4 + 2 + 2)
    192 #define CONFIG_DEBUG_OFFSET (CONFIG_HOST_OFFSET + CONFIG_HOST_SIZE)
    193 #define CONFIG_DEBUG_SIZE (4)
    194 #define CONFIG_PPSOUT_OFFSET (CONFIG_DEBUG_OFFSET + CONFIG_DEBUG_SIZE)
    195 #define CONFIG_PPSOUT_SIZE (4 + 4 + 4 + 4 + 4 + 4)
    196 #define CONFIG_TIMESOURCE_OFFSET (CONFIG_PPSOUT_OFFSET + CONFIG_PPSOUT_SIZE)
    197 #define CONFIG_TIMESOURCE_SIZE (4)
    198 #define CONFIG_EXTRA_SIZE (256)
    199 
    200 #define CONFIG_TOTAL_SIZE (CONFIG_RCPU_SIZE + CONFIG_VLAN_SIZE + CONFIG_MPLS_SIZE + \
    201                            CONFIG_HOST_SIZE + CONFIG_DEBUG_SIZE + CONFIG_PPSOUT_SIZE + \
    202                            CONFIG_TIMESOURCE_SIZE + CONFIG_EXTRA_SIZE)
    203 
    204 #define INFO_BASE_ADDR    (0x19000bac)
    205 #define CONFIG_BASE       (0x19000c2c)
    206                            
    207 #define BOOT_STATUS_ADDR  (0x19000500)
    208 #define FAULT_STATUS_ADDR (0x19000504)
    209 #define BKPT_LOCATION_ADDR (0x019000508)
    210 
    211 #define MAX_BOOT_ITER (1000)    /* cycles of 1ms to wait for the ToP boot to complete */
    212 
    213 /* 
    214  * All ports identifier.
    215  * Ref. IEEE Std. 1588-2008, Chapters 13.12.1 and 15.3.1. 
    216  */
    217 #define PTP_IEEE1588_ALL_PORTS (0xffff) 
    218 
    219 /* 
    220  * PTP management message actions.
    221  * Ref. IEEE Std. 1588-2008, Chapter 15.4.1.6, Table 38. 
    222  */
    223 #define PTP_MGMTMSG_GET           (0)
    224 #define PTP_MGMTMSG_SET           (1)
    225 #define PTP_MGMTMSG_RESP          (2)
    226 #define PTP_MGMTMSG_CMD           (3)
    227 #define PTP_MGMTMSG_ACK           (4)
    228     
    229 /* 
    230  * PTP management message ID (i.e. managementId) values.
    231  * Ref. IEEE Std. 1588-2008, Chapter 15.5.2.3, Table 40. 
    232  */
    233 #define PTP_MGMTMSG_ID_CLOCK_DESCRIPTION                           (0x0001)
    234 #define PTP_MGMTMSG_ID_USER_DESCRIPTION                            (0x0002)
    235                            
    236 #define PTP_MGMTMSG_ID_DEFAULT_DATASET                             (0x2000)
    237 #define PTP_MGMTMSG_ID_CURRENT_DATASET                             (0x2001)
    238 #define PTP_MGMTMSG_ID_PARENT_DATASET                              (0x2002)
    239 #define PTP_MGMTMSG_ID_TIME_PROPERTIES_DATASET                     (0x2003)
    240 #define PTP_MGMTMSG_ID_PORT_DATASET                                (0x2004)
    241                            
    242 #define PTP_MGMTMSG_ID_PRIORITY1                                   (0x2005)
    243 #define PTP_MGMTMSG_ID_PRIORITY2                                   (0x2006)
    244 #define PTP_MGMTMSG_ID_DOMAIN                                      (0x2007)                           
    245 #define PTP_MGMTMSG_ID_SLAVE_ONLY                                  (0x2008)
    246 #define PTP_MGMTMSG_ID_LOG_ANNOUNCE_INTERVAL                       (0x2009)
    247 #define PTP_MGMTMSG_ID_ANNOUNCE_RECEIPT_TIMEOUT                    (0x200a)
    248 #define PTP_MGMTMSG_ID_LOG_SYNC_INTERVAL                           (0x200b)
    249 #define PTP_MGMTMSG_ID_VERSION_NUMBER                              (0x200c)
    250 
    251 #define PTP_MGMTMSG_ID_ENABLE_PORT                                 (0x200d)
    252 #define PTP_MGMTMSG_ID_DISABLE_PORT                                (0x200e)
    253                            
    254 #define PTP_MGMTMSG_ID_TIME                                        (0x200f)                   
    255 #define PTP_MGMTMSG_ID_CLOCK_ACCURACY                              (0x2010)
    256 #define PTP_MGMTMSG_ID_UTC_PROPERTIES                              (0x2011)                           
    257 #define PTP_MGMTMSG_ID_TRACEABILITY_PROPERTIES                     (0x2012)
    258 #define PTP_MGMTMSG_ID_TIMESCALE_PROPERTIES                        (0x2013)
    259  
    260 #define PTP_MGMTMSG_ID_UNICAST_MASTER_TABLE                        (0x2018)
    261 #define PTP_MGMTMSG_ID_UNICAST_MASTER_MAX_TABLE_SIZE               (0x2019)
    262 
    263 #define PTP_MGMTMSG_ID_ACCEPTABLE_MASTER_TABLE                     (0x201a)
    264 #define PTP_MGMTMSG_ID_ACCEPTABLE_MASTER_TABLE_ENABLED             (0x201b)
    265 #define PTP_MGMTMSG_ID_ACCEPTABLE_MASTER_MAX_TABLE_SIZE            (0x201c)
    266    
    267 #define PTP_MGMTMSG_ID_TRANSPARENT_CLOCK_DEFAULT_DATASET           (0x4000)
    268 #define PTP_MGMTMSG_ID_TRANSPARENT_CLOCK_PORT_DATASET              (0x4001)
    269 #define PTP_MGMTMSG_ID_PRIMARY_DOMAIN                              (0x4002)
    270                            
    271 #define PTP_MGMTMSG_ID_DELAY_MECHANISM                             (0x6000)
    272 #define PTP_MGMTMSG_ID_LOG_MIN_PDELAY_REQ_INTERVAL                 (0x6001)
    273                            
    274 /* 
    275  * Implementation-specific PTP management message IDs.
    276  * Hits the standard management message get/set code. 
    277  */
    278 
    279 /* For now using from impln. specific range or can use the  
    280 range (E000-FFFE) to be assigned by an alternate PTP profile if required */
    281 #define PTP_MGMTMSG_ID_CLOCK_QUALITY                               (0xDF00)
    282 #define PTP_MGMTMSG_ID_CLOCK_LOCAL_PRIORITY                        (0xDF01)
    283 #define PTP_MGMTMSG_ID_CLOCK_PEER_AGE_TIMER                        (0xDF02)
    284 #define PTP_MGMTMSG_ID_CLOCK_FLAG_FIELD_OVERRIDE                   (0xDF03)
    285 #define PTP_MGMTMSG_ID_CLOCK_MAX_STEPS_REMOVED                     (0xDF04)
    286 #define PTP_MGMTMSG_ID_CLOCK_PORTS_DROP_COUNT                      (0xDF05)
    287 #define PTP_MGMTMSG_ID_PORT_PTSF_UNUSABLE                          (0xDF06)
    288 #define PTP_MGMTMSG_ID_CLOCK_BMCA_FLAG_OVERRIDE                    (0xdF07)
    289 #define PTP_MGMTMSG_ID_CLOCK_APTS_MODE_CHANGED                     (0xdF08)
    290 
    291 #define PTP_MGMTMSG_ID_MODULAR_SYSTEM_ENABLED                      (0xdff4)
    292 #define PTP_MGMTMSG_ID_PHYSYNC_STATE                               (0xdff5)
    293 #define PTP_MGMTMSG_ID_OUTPUT_SYNCE                                (0xdff6)
    294 #define PTP_MGMTMSG_ID_CLOCK_CLASS                                 (0xdff7)
    295 #define PTP_MGMTMSG_ID_TELECOM_PROFILE_ENABLED                     (0xdff8)
    296 #define PTP_MGMTMSG_ID_PACKET_STATS                                (0xdff9)
    297 #define PTP_MGMTMSG_ID_OUTPUT_SIGNALS                              (0xdffa)
    298 #define PTP_MGMTMSG_ID_CHANNELS                                    (0xdffb)
    299 #define PTP_MGMTMSG_ID_PEER_DATASET_FIRST                          (0xdffc)
    300 #define PTP_MGMTMSG_ID_PEER_DATASET_NEXT                           (0xdffd)
    301 #define PTP_MGMTMSG_ID_FOREIGN_MASTER_DATASET                      (0xdffe)
    302 #define PTP_MGMTMSG_ID_LOG_MIN_DELAY_REQ_INTERVAL                  (0xdfff)  
    303 
    304 /* 
    305  * Implementation-specific PTP management message IDs.
    306  * Following hit the custom handler that does not depend on having an
    307  * instantiated clock or correctly configured ports.
    308  */
    309 #define PTP_MGMTMSG_ID_CREATE_CLOCK_INSTANCE                       (0xd000)  
    310 #define PTP_MGMTMSG_ID_CONFIGURE_CLOCK_PORT                        (0xd002)  
    311 #define PTP_MGMTMSG_ID_CONFIGURE_TOD_OUT                           (0xd004)  
    312 #define PTP_MGMTMSG_ID_CONFIGURE_TOD_IN                            (0xd005)
    313 #define PTP_MGMTMSG_ID_SYNC_PHY                                    (0xd006)
    314 #define PTP_MGMTMSG_ID_SYNC_PHYTIME                                (0xd007)
    315 
    316 #define PTP_MGMTMSG_ID_SERVO_START                                 (0xd00d)
    317 #define PTP_MGMTMSG_ID_SERVO_RESTART                               (0xd00e)
    318 #define PTP_MGMTMSG_ID_SERVO_STOP                                  (0xd00f)
    319 #define PTP_MGMTMSG_ID_SERVO_CONFIGURATION                         (0xd010)
    320 #define PTP_MGMTMSG_ID_SERVO_IPDV_CONFIGURATION                    (0xd011)
    321 #define PTP_MGMTMSG_ID_SERVO_IPDV_PERFORMANCE                      (0xd012)
    322 #define PTP_MGMTMSG_ID_SERVO_PERFORMANCE                           (0xd013)
    323 #define PTP_MGMTMSG_ID_SERVO_COUNTERS_CLEAR                        (0xd014)
    324 #define PTP_MGMTMSG_ID_SERVO_STATUS                                (0xd015)
    325 #define PTP_MGMTMSG_ID_SERVO_THRESHOLD                             (0xd016)
    326            
    327 #define PTP_MGMTMSG_ID_PORT_LATENCY                                (0xd017)
    328 #define PTP_MGMTMSG_ID_LOG_LEVEL                                   (0xd018)
    329                        
    330 #define PTP_MGMTMSG_ID_TUNNEL_ARP                                  (0xd019)
    331 #define PTP_MGMTMSG_ID_SHOW_SYSTEM_INFO                            (0xd01a)
    332 
    333 #define PTP_MGMTMSG_ID_CHANNEL_STATUS                              (0xd01b)
    334 
    335 #define PTP_MGMTMSG_ID_FREQUENCY                                   (0xd01c)
    336 
    337 /* T-DPLL support. */
    338 #define PTP_MGMTMSG_ID_TDPLL_BINDINGS                              (0xd01d)
    339 #define PTP_MGMTMSG_ID_TDPLL_REFERENCE                             (0xd01e)
    340 
    341 #define PTP_MGMTMSG_ID_TDPLL_PHASE_CONTROL                         (0xd01f)
    342 #define PTP_MGMTMSG_ID_TDPLL_BANDWIDTH                             (0xd020)
    343 
    344 #define PTP_MGMTMSG_ID_INPUT_CLOCK_ENABLED                         (0xd021)
    345 #define PTP_MGMTMSG_ID_INPUT_CLOCK_L1MUX                           (0xd022)
    346 #define PTP_MGMTMSG_ID_INPUT_CLOCK_FREQUENCY                       (0xd023)
    347 #define PTP_MGMTMSG_ID_INPUT_CLOCK_MONITOR_DATA                    (0xd024)
    348 
    349 #define PTP_MGMTMSG_ID_OUTPUT_CLOCK_ENABLED                        (0xd025)
    350 #define PTP_MGMTMSG_ID_OUTPUT_CLOCK_SYNTH_FREQUENCY                (0xd026)
    351 #define PTP_MGMTMSG_ID_OUTPUT_CLOCK_DERIV_FREQUENCY                (0xd027)
    352 
    353 #define PTP_MGMTMSG_ID_HOLDOVER_DATA                               (0xd028)
    354 #define PTP_MGMTMSG_ID_HOLDOVER_FREQUENCY                          (0xd029)
    355 #define PTP_MGMTMSG_ID_HOLDOVER_MODE                               (0xd02a)
    356 #define PTP_MGMTMSG_ID_HOLDOVER_RESET                              (0xd02b)
    357 
    358 #define PTP_MGMTMSG_ID_ESMC_TUNNEL                                 (0xd02c)
    359 #define PTP_MGMTMSG_ID_ESMC_MAC                                    (0xd02d)
    360 
    361 #define PTP_MGMTMSG_ID_SERVO_PHASE_OFFSET                          (0xd02e)
    362 
    363 #define PTP_MGMTMSG_ID_PHASE_OFFSET                                (0xd0ff)
    364 
    365 #define PTP_MGMTMSG_ID_CLOCK_INFO_FLAGS                            (0xd100)
    366 
    367 #define PTP_MGMTMSG_ID_SHUTDOWN                                    (0xd101)
    368 
    369 /* Management message maximum response size (octets). */
    370 #define PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS                             (1024)
    371 
    372 /* Management message empty TLV payload size (octets). */
    373 #define PTP_MGMTMSG_PAYLOAD_NULL_SIZE_OCTETS                            (0) 
    374 /* Management message minimum, non-empty TLV payload size (octets). */
    375 #define PTP_MGMTMSG_PAYLOAD_MIN_SIZE_OCTETS                             (2) 
    376 /* Management message CLOCK QUALITY size (octets) */
    377 #define PTP_MGMTMSG_PAYLOAD_CLOCK_QUALITY_MSG_SIZE_OCTETS             (8)
    378 /* Management message PEER_AGE_TIMER size (octets) */
    379 #define PTP_MGMTMSG_PAYLOAD_CLOCK_PEER_AGE_TIMER_SIZE_OCTETS            (2)
    380 /* Management message FLAG_FIELD_OVERRIDE size (octets) */
    381 #define PTP_MGMTMSG_PAYLOAD_CLOCK_FLAG_FIELD_OVERRIDE_SIZE_OCTETS       (8)
    382 /* Management message proprietary message TLV minimum payload size (octets). */
    383 #define PTP_MGMTMSG_PAYLOAD_MIN_PROPRIETARY_MSG_SIZE_OCTETS             (6)
    384 /* Management message proprietary message TLV indexed-get payload size (octets). */
    385 #define PTP_MGMTMSG_PAYLOAD_INDEXED_PROPRIETARY_MSG_SIZE_OCTETS         (8)
    386 /* Management message maximum USER_DESCIPTION TLV payload size (octets). */
    387 #define PTP_MGMTMSG_PAYLOAD_MAX_USER_DESCRIPTION_SIZE_OCTETS           (32)
    388 /* Management message DEFAULT_DATA_SET TLV payload size (octets). */
    389 #define PTP_MGMTMSG_PAYLOAD_DEFAULT_DATASET_SIZE_OCTETS                (20) 
    390 /* Management message CURRENT_DATA_SET TLV payload size (octets). */
    391 #define PTP_MGMTMSG_PAYLOAD_CURRENT_DATASET_SIZE_OCTETS                (18)
    392 /* Management message PARENT_DATA_SET TLV payload size (octets). */
    393 #define PTP_MGMTMSG_PAYLOAD_PARENT_DATASET_SIZE_OCTETS                 (32) 
    394 /* Management message TIME TLV payload size (octets). */
    395 #define PTP_MGMTMSG_PAYLOAD_TIME_SIZE_OCTETS                           (10) 
    396 /* Management message UTC_PROPERTIES TLV payload size (octets). */                           
    397 #define PTP_MGMTMSG_PAYLOAD_UTC_PROPERTIES_SIZE_OCTETS                  (4) 
    398 /* Management message UNICAST_MASTER_TABLE TLV payload size (octets). */
    399 #define PTP_MGMTMSG_PAYLOAD_MAX_UNICAST_MASTER_TABLE_SIZE_OCTETS     (1404) 
    400 /* Management message ACCEPTABLE_MASTER_TABLE TLV payload size (octets). */
    401 #define PTP_MGMTMSG_PAYLOAD_MAX_ACCEPTABLE_MASTER_TABLE_SIZE_OCTETS  (1404) 
    402 /* Management message UNICAST_SLAVE_TABLE TLV payload size (octets). */
    403 #define PTP_MGMTMSG_PAYLOAD_MAX_UNICAST_SLAVE_TABLE_SIZE_OCTETS      (1404) 
    404 /* Management message clock instance creation TLV payload size (octets). */
    405 #define PTP_MGMTMSG_PAYLOAD_CLOCK_INSTANCE_SIZE_OCTETS                 (56)
    406 /* Management message configure clock port TLV payload size (octets). */
    407 #define PTP_MGMTMSG_PAYLOAD_CONFIGURE_CLOCK_PORT_SIZE_OCTETS          (371)
    408 /* Management message PORT_LATENCY TLV payload size (octets). */
    409 #define PTP_MGMTMSG_PAYLOAD_PORT_LATENCY_SIZE_OCTETS                   (22) 
    410 /* Management message LOG_LEVEL TLV payload size (octets). */
    411 #define PTP_MGMTMSG_PAYLOAD_LOG_LEVEL_SIZE_OCTETS                      (45)
    412 /* Management message CHANNELS TLV payload size (octets). */
    413 #define PTP_MGMTMSG_PAYLOAD_CHANNELS_SIZE_OCTETS                       (83)
    414 /* Management message OUTPUT_SIGNALS TLV payload size (octets). */
    415 #define PTP_MGMTMSG_PAYLOAD_OUTPUT_SIGNALS_SIZE_OCTETS                (102) 
    416 /* Management message CONFIGURE_TOD_OUT TLV payload size (octets). */
    417 #define PTP_MGMTMSG_PAYLOAD_CONFIGURE_TOD_OUT_SIZE_OCTETS             (180)
    418 /* Management message CONFIGURE_TOD_IN TLV payload size (octets). */
    419 #define PTP_MGMTMSG_PAYLOAD_CONFIGURE_TOD_IN_SIZE_OCTETS              (196)
    420 /* Management message SYNC_PHY TLV payload size (octets). */
    421 #define PTP_MGMTMSG_PAYLOAD_SYNC_PHY_SIZE_OCTETS                       (16)
    422 /* Management message servo configuration TLV payload size (octets). */
    423 #define PTP_MGMTMSG_PAYLOAD_SERVO_CONFIGURATION_SIZE_OCTETS            (58)
    424 /* Management message servo IPDV configuration TLV payload size (octets). */
    425 #define PTP_MGMTMSG_PAYLOAD_SERVO_IPDV_CONFIGURATION_SIZE_OCTETS       (14)
    426 /* Management message servo performance data TLV payload size (octets). */
    427 #define PTP_MGMTMSG_PAYLOAD_SERVO_PERFORMANCE_SIZE_OCTETS             (223) 
    428 /* Management message servo IPDV performance data TLV payload size (octets). */                           
    429 #define PTP_MGMTMSG_PAYLOAD_SERVO_IPDV_PERFORMANCE_SIZE_OCTETS         (54) 
    430 /* Management message servo status TVL payload size (octets). */
    431 #define PTP_MGMTMSG_PAYLOAD_SERVO_STATUS_SIZE_OCTETS                   (15)
    432 /* Management message servo threshold payload size (octets). */
    433 #define PTP_MGMTMSG_PAYLOAD_SERVO_THRESHOLD_SIZE_OCTETS                (22)
    434 /* Management message TLV phase offset payload size (octets). */
    435 #define PTP_MGMTMSG_PAYLOAD_PHASE_OFFSET_SIZE_OCTETS                   (54)
    436 /* Management message TLV phase offset payload size (octets). */
    437 #define PTP_MGMTMSG_PAYLOAD_SERVO_PHASE_OFFSET_SIZE_OCTETS             (34)
    438 /* Management message TLV frequency offset payload size (octets). */
    439 #define PTP_MGMTMSG_PAYLOAD_FREQUENCY_SIZE_OCTETS                   (34)
    440 /* Management message modular system enabled TLV payload size (octets). */
    441 #define PTP_MGMTMSG_PAYLOAD_MODULAR_SYSTEM_ENABLED_SIZE_OCTETS          (8)
    442 /* Management message PTP clock class TLV payload size (octets). */
    443 #define PTP_MGMTMSG_PAYLOAD_CLOCK_CLASS_SIZE_OCTETS                     (8)
    444 /* Management message telecom profile enabled TLV payload size (octets). */
    445 #define PTP_MGMTMSG_PAYLOAD_TELECOM_PROFILE_ENABLED_SIZE_OCTETS         (8)
    446 /* Management message packet statistics TLV minimum payload size (octets). */
    447 #define PTP_MGMTMSG_PAYLOAD_PACKET_STATS_MIN_SIZE_OCTETS               (64)
    448 /* Management message packet statistics clear payload size (octets). */
    449 #define PTP_MGMTMSG_PAYLOAD_PACKET_STATS_CLEAR_SIZE_OCTETS              (8)
    450 /* Management message packet drop stats payload size (octets). */
    451 #define PTP_MGMTMSG_PAYLOAD_PACKET_DROP_STATS_ENABLE_SIZE_OCTETS        (2)
    452 /* Management message tunnel ARP TLV payload size (octets). */
    453 #define PTP_MGMTMSG_PAYLOAD_TUNNEL_ARP_SIZE_OCTETS                      (8)
    454 /* Management message channel status get TLV payload size (octets). */
    455 #define PTP_MGMTMSG_PAYLOAD_CHANNEL_STATUS_SIZE_OCTETS                 (104)
    456 /* Management message SyncE output state TLV payload size (octets). */
    457 #define PTP_MGMTMSG_PAYLOAD_OUTPUT_SYNCE_SIZE_OCTETS                    (4)
    458 /* Management message T-DPLL logical DPLL bindings TLV payload size (octets). */
    459 #define PTP_MGMTMSG_PAYLOAD_TDPLL_BINDINGS_SIZE_OCTETS                 (266)
    460 /* Management message T-DPLL logical DPLL reference clocks TLV payload size (octets). */
    461 #define PTP_MGMTMSG_PAYLOAD_TDPLL_REFERENCE_SIZE_OCTETS                (13)
    462 /* Management message T-DPLL logical DPLL phase control TLV payload size (octets). */
    463 #define PTP_MGMTMSG_PAYLOAD_TDPLL_PHASE_CONTROL_SIZE_OCTETS            (12)
    464 /* Management message T-DPLL logical DPLL bandwidth TLV payload size (octets). */
    465 #define PTP_MGMTMSG_PAYLOAD_TDPLL_BANDWIDTH_SIZE_OCTETS                (12)
    466 /* Management message T-DPLL input clock enabled payload size (octets). */
    467 #define PTP_MGMTMSG_PAYLOAD_INPUT_CLOCK_ENABLED_SIZE_OCTETS             (8)
    468 /* Management message T-DPLL input clock L1 mux payload size (octets). */
    469 #define PTP_MGMTMSG_PAYLOAD_INPUT_CLOCK_L1MUX_SIZE_OCTETS              (10)
    470 /* Management message T-DPLL input clock frequency TLV payload size (octets). */
    471 #define PTP_MGMTMSG_PAYLOAD_INPUT_CLOCK_FREQUENCY_SIZE_OCTETS          (16)
    472 /* Management message T-DPLL input clock monitoring data TLV payload size (octets). */
    473 #define PTP_MGMTMSG_PAYLOAD_INPUT_CLOCK_MONITOR_DATA_SIZE_OCTETS      (286)
    474 /* Management message T-DPLL output clock enabled payload size (octets) */
    475 #define PTP_MGMTMSG_PAYLOAD_OUTPUT_CLOCK_ENABLED_SIZE_OCTETS            (8)
    476 /* Management message T-DPLL output clock synthesizer frequency TLV payload size (octets). */
    477 #define PTP_MGMTMSG_PAYLOAD_OUTPUT_CLOCK_SYNTH_FREQUENCY_SIZE_OCTETS   (16)
    478 /* Management message T-DPLL output clock derivative frequency TLV payload size (octets). */
    479 #define PTP_MGMTMSG_PAYLOAD_OUTPUT_CLOCK_DERIV_FREQUENCY_SIZE_OCTETS   (12)
    480 /* Management message T-DPLL holdover data TLV payload size (octets). */
    481 #define PTP_MGMTMSG_PAYLOAD_HOLDOVER_DATA_SIZE_OCTETS                  (32)
    482 /* Management message T-DPLL holdover frequency TLV payload size (octets). */
    483 #define PTP_MGMTMSG_PAYLOAD_HOLDOVER_FREQUENCY_SIZE_OCTETS             (12)
    484 /* Management message T-DPLL holdover mode TLV payload size (octets). */
    485 #define PTP_MGMTMSG_PAYLOAD_HOLDOVER_MODE_SIZE_OCTETS                   (8)
    486 /* Management message T-DPLL reset TLV payload size (octets). */
    487 #define PTP_MGMTMSG_PAYLOAD_HOLDOVER_RESET_SIZE_OCTETS                  (8)
    488 /* Management message ESMC tunnel TLV payload size (octets). */
    489 #define PTP_MGMTMSG_PAYLOAD_ESMC_TUNNEL_SIZE_OCTETS                     (8)
    490 /* Management message ESMC MAC address TLV payload size (octets). */
    491 #define PTP_MGMTMSG_PAYLOAD_ESMC_MAC_SIZE_OCTETS                       (14)
    492 /* Management message PTSF UNUSABLE size (octets) */
    493 #define PTP_MGMTMSG_PAYLOAD_PTSF_UNUSABLE_MSG_SIZE_OCTETS              (14)
    494 /* Management message BMCA_FLAG_OVERRIDE size (octets) */
    495 #define PTP_MGMTMSG_PAYLOAD_CLOCK_BMCA_FLAG_OVERRIDE_SIZE_OCTETS       (8)
    496 /* Management message APTS_MODE_CHANGED size (octets) */
    497 #define PTP_MGMTMSG_PAYLOAD_CLOCK_APTS_MODE_CHANGED_SIZE_OCTETS        (8)
    498 /* Management message PTP CLOCK INFO FLAGS size (octets) */
    499 #define PTP_MGMTMSG_PAYLOAD_CLOCK_INFO_FLAGS_SIZE_OCTETS               (10)
    500 
    501 /* PTP Header parameters and constants.*/
    502 /* L2 header size (octets). */
    503 #define PTP_L2HDR_SIZE_OCTETS                                          (12) 
    504 /* IEEE 802.1Q, VLAN tagging header size (octets). */
    505 #define PTP_VLANHDR_SIZE_OCTETS                                         (4) 
    506 /*
    507  * VLAN identifier (VID) size (octets). 
    508  * NOTICE: VID is 12-bit value. 
    509  */
    510 #define PTP_VLANHDR_VID_SIZE_OCTETS                                     (2) 
    511 /* VLAN identifier (VID) offset (octets). */
    512 #define PTP_VLANHDR_VID_OFFSET_OCTETS                                   (2) 
    513 
    514 /* Ethertype size (octets). */
    515 #define PTP_ETHHDR_SIZE_OCTETS                                          (2) 
    516 
    517 /* 
    518  * IPv4 header start index.
    519  * NOTICE: Assumes single VLAN tag.
    520  */
    521 #define PTP_IPV4HDR_START_IDX                  (PTP_L2HDR_SIZE_OCTETS + \
    522                                                 PTP_VLANHDR_SIZE_OCTETS + \
    523                                                   PTP_ETHHDR_SIZE_OCTETS)
    524                                                 
    525 /* IPv4 header offset of total message length (octets). */
    526 #define PTP_IPV4HDR_MSGLEN_OFFSET_OCTETS                                (2) 
    527 /* IPv4 header offset of source IP address (octets). */
    528 #define PTP_IPV4HDR_SRC_IPADDR_OFFSET_OCTETS                           (12) 
    529 /* IPv4 header offset of header checksum (octets). */
    530 #define PTP_IPV4HDR_HDR_CHKSUM_OFFSET_OCTETS                           (10) 
    531 /* 
    532  * IPv4 header size (octets). 
    533  * ASSUMPTION: Field 13 (Options) omitted. 
    534  */
    535 #define PTP_IPV4HDR_SIZE_OCTETS                                        (20) 
    536 
    537 #define PTP_UDPHDR_START_IDX                     (PTP_IPV4HDR_START_IDX + \
    538                                                   PTP_IPV4HDR_SIZE_OCTETS)
    539                                                   
    540 /* UDP header size (octets). */
    541 #define PTP_UDPHDR_SIZE_OCTETS                                          (8) 
    542 /* UDP header offset of destination port (octets). */
    543 #define PTP_UDPHDR_DESTPORT_OFFSET_OCTETS                               (2) 
    544 /* UDP header offset of message length (octets). */
    545 #define PTP_UDPHDR_MSGLEN_OFFSET_OCTETS                                 (4) 
    546 /* UDP header offset of checksum (octets). */
    547 #define PTP_UDPHDR_CHKSUM_OFFSET_OCTETS                                 (6) 
    548 
    549 #define PTP_PTPHDR_START_IDX                      (PTP_UDPHDR_START_IDX + \
    550                                                    PTP_UDPHDR_SIZE_OCTETS)
    551 /* PTP header size (octets). */
    552 #define PTP_PTPHDR_SIZE_OCTETS                                         (34) 
    553 /* PTP header offset of PTP message length (octets). */
    554 #define PTP_PTPHDR_MSGLEN_OFFSET_OCTETS                                 (2) 
    555 /* PTP header offset of PTP domain (octets). */
    556 #define PTP_PTPHDR_DOMAIN_OFFSET_OCTETS                                 (4) 
    557 /* PTP header offset of source port identity (octets). */
    558 #define PTP_PTPHDR_SRCPORT_OFFSET_OCTETS                               (20) 
    559 /* PTP header offset of PTP sequence ID (octets). */
    560 #define PTP_PTPHDR_SEQID_OFFSET_OCTETS                                 (30) 
    561 
    562 #define PTP_MGMTHDR_START_IDX                     (PTP_PTPHDR_START_IDX + \
    563                                                    PTP_PTPHDR_SIZE_OCTETS)
    564                                                    
    565 /* Management header size (octets). */
    566 #define PTP_MGMTHDR_SIZE_OCTETS                                        (14) 
    567 /* Management header offset of management message actions (octets). */
    568 #define PTP_MGMTHDR_ACTION_OFFSET_OCTETS                               (12) 
    569 
    570 /* 
    571  * Message TLV header size (octets).  
    572  * NOTICE: Excludes message payload. 
    573  */
    574 #define PTP_TLVHDR_SIZE_OCTETS                                          (6) 
    575 /* Message TLV header offset of message TLV type (octets). */
    576 #define PTP_TLVHDR_TYP_OFFSET_OCTETS                                    (0) 
    577 /* Message TLV header offset of message TLV length (octets). */
    578 #define PTP_TLVHDR_LEN_OFFSET_OCTETS                                    (2) 
    579 /* 
    580  * Message TLV header offset of message TLV value prefix, 
    581  * i.e. management ID (octets). 
    582  */
    583 #define PTP_TLVHDR_VAL_PREFIX_OFFSET_OCTETS                             (4) 
    584 /* Message TLV header TLV value prefix size (octets). */
    585 #define PTP_TLVHDR_VAL_PREFIX_SIZE_OCTETS                               (2) 
    586 
    587 /* Management message maximum size (octets). */
    588 #define PTP_MGMTMSG_TOTAL_SIZE_OCTETS                                (1500) 
    589 
    590 #define PTP_MGMTMSG_TOTAL_HEADER_SIZE          (PTP_MGMTHDR_START_IDX + \
    591                                                 PTP_MGMTHDR_SIZE_OCTETS + \
    592                                                 PTP_TLVHDR_SIZE_OCTETS)
    593 
    594 /* Payload maximum size (octets). */
    595 #define PTP_MGMTMSG_PAYLOAD_MAX_SIZE_OCTETS  (PTP_MGMTMSG_TOTAL_SIZE_OCTETS - ( \
    596                                               PTP_L2HDR_SIZE_OCTETS + \
    597                                               PTP_VLANHDR_SIZE_OCTETS + \
    598                                               PTP_ETHHDR_SIZE_OCTETS + \
    599                                               PTP_IPV4HDR_SIZE_OCTETS + \
    600                                               PTP_UDPHDR_SIZE_OCTETS + \
    601                                               PTP_PTPHDR_SIZE_OCTETS + \
    602                                               PTP_MGMTHDR_SIZE_OCTETS + \
    603                                               PTP_TLVHDR_SIZE_OCTETS))
    604                                                  
    605 
    606 #define PTP_SIGHDR_START_IDX                 (PTP_PTPHDR_START_IDX)
    607 #define PTP_SIGHDR_TGTCLOCK_OFFSET_OCTETS    (PTP_PTPHDR_SIZE_OCTETS)
    608 #define PTP_SIGHDR_TGTPORT_OFFSET_OCTETS     (PTP_PTPHDR_SIZE_OCTETS + \
    609                                               BCM_PTP_CLOCK_EUID_IEEE1588_SIZE)
    610 /* 
    611  * PTP signaling message header size (octets).
    612  * NOTICE: Includes PTP header and target port identity. 
    613  * Ref. IEEE Std. 1588-2008, Sect. 13.12.2.
    614  */
    615 #define PTP_SIGHDR_SIZE_OCTETS       (PTP_PTPHDR_SIZE_OCTETS + \
    616                                       BCM_PTP_CLOCK_EUID_IEEE1588_SIZE + 2)
    617                                                     
    618 
    619 #define PTP_UCSIG_TLV_START_IDX                (PTP_L2HDR_SIZE_OCTETS + \
    620                                                 PTP_VLANHDR_SIZE_OCTETS + \
    621                                                 PTP_ETHHDR_SIZE_OCTETS + \
    622                                                 PTP_IPV4HDR_SIZE_OCTETS + \
    623                                                 PTP_UDPHDR_SIZE_OCTETS + \
    624                                                 PTP_SIGHDR_SIZE_OCTETS)
    625 /* 
    626  * PTP unicast transmission signaling message 
    627  * REQUEST_UNICAST_TRANSMISSION TLV size (octets). 
    628  */
    629 #define PTP_UCSIG_REQUEST_TLV_SIZE_OCTETS   ((2 * PTP_MAX_NETW_ADDR_SIZE) + \
    630                                              PTP_MAX_L2_HEADER_LENGTH + 12)
    631 /* 
    632  * PTP unicast transmission signaling message 
    633  * CANCEL_UNICAST_TRANSMISSION TLV size (octets).
    634  */
    635 #define PTP_UCSIG_CANCEL_TLV_SIZE_OCTETS       (PTP_MAX_NETW_ADDR_SIZE + 7)    
    636 
    637 /* 
    638  * PTP unicast transmission signaling message TLV 
    639  * offset of TLV length (octets). 
    640  */
    641 #define PTP_UCSIG_TLVLEN_OFFSET_OCTETS                                  (2)
    642 /* 
    643  * PTP unicast transmission signaling message TLV 
    644  * offset of message type (octets). 
    645  */
    646 #define PTP_UCSIG_MSGTYPE_OFFSET_OCTETS                                 (4)
    647 /* 
    648  * PTP unicast transmission signaling message TLV 
    649  * offset of interval parameter (octets). 
    650  */
    651 #define PTP_UCSIG_INTERVAL_OFFSET_OCTETS                                (5)
    652 /* 
    653  * PTP unicast transmission signaling message TLV
    654  * offset of duration parameter (octets). 
    655  */
    656 #define PTP_UCSIG_DURATION_OFFSET_OCTETS                                (6)
    657 /* 
    658  * PTP unicast transmission signaling message TLV 
    659  * offset of address type (octets). 
    660  */
    661 #define PTP_UCSIG_ADDRTYPE_OFFSET_OCTETS                               (10)
    662 /* 
    663  * PTP unicast transmission signaling message TLV 
    664  * offset of peer address (octets). 
    665  */
    666 #define PTP_UCSIG_PEERADDR_OFFSET_OCTETS                               (11)
    667 /* 
    668  * PTP unicast transmission signaling message TLV 
    669  * offset of L2 header length value (octets). 
    670  */
    671 #define PTP_UCSIG_L2HDRLEN_OFFSET_OCTETS                               (27)
    672 /* 
    673  * PTP unicast transmission signaling message TLV 
    674  * offset of L2 header (octets).
    675  */
    676 #define PTP_UCSIG_L2HDR_OFFSET_OCTETS                                  (28)   
    677 
    678 /* 
    679  * PTP cancel unicast transmission signaling message TLV 
    680  * offset of reserved field (octets). 
    681  */
    682 #define PTP_UCSIG_CANCEL_RESERVED_OFFSET_OCTETS                         (5)
    683 /* 
    684  * PTP cancel unicast transmission signaling message TLV 
    685  * offset of address type (octets). 
    686  * NOTICE: Address type and peer address data are custom 
    687  *         additions to TLV data.
    688  */
    689 #define PTP_UCSIG_CANCEL_ADDRTYPE_OFFSET_OCTETS                         (6)
    690 /* 
    691  * PTP cancel unicast transmission signaling message TLV 
    692  * offset of peer address (octets). 
    693  * NOTICE: Address type and peer address data are custom 
    694  *         additions to TLV data.
    695  */
    696 #define PTP_UCSIG_CANCEL_PEERADDR_OFFSET_OCTETS                         (7)
    697 
    698 /* 
    699  * PTP unicast transmission signaling message 
    700  * REQUEST_UNICAST_TRANSMISSION TLV total size (octets).
    701  */
    702 #define PTP_UCSIG_REQUEST_TOTAL_SIZE_OCTETS  (PTP_UCSIG_TLV_START_IDX + \
    703                                               PTP_UCSIG_REQUEST_TLV_SIZE_OCTETS)
    704 
    705 /* 
    706  * PTP unicast transmission signaling message 
    707  * CANCEL_UNICAST_TRANSMISSION TLV total size (octets).
    708  */
    709 #define PTP_UCSIG_CANCEL_TOTAL_SIZE_OCTETS   (PTP_UCSIG_TLV_START_IDX + \
    710                                               PTP_UCSIG_CANCEL_TLV_SIZE_OCTETS)
    711 
    712 /* PTP clock presets. */
    713 #define PTP_CLOCK_PRESETS_ANNOUNCE_RECEIPT_TIMEOUT_MINIMUM              (2)
    714 #define PTP_CLOCK_PRESETS_ANNOUNCE_RECEIPT_TIMEOUT_DEFAULT              (3)
    715 #define PTP_CLOCK_PRESETS_ANNOUNCE_RECEIPT_TIMEOUT_MAXIMUM            (255)
    716 
    717 #define PTP_CLOCK_PRESETS_LOG_ANNOUNCE_INTERVAL_MINIMUM                (-2)
    718 #define PTP_CLOCK_PRESETS_LOG_ANNOUNCE_INTERVAL_DEFAULT                 (1)
    719 #define PTP_CLOCK_PRESETS_LOG_ANNOUNCE_INTERVAL_MAXIMUM                 (4)
    720    
    721 #define PTP_CLOCK_PRESETS_LOG_SYNC_INTERVAL_MINIMUM                    (-7)
    722 #define PTP_CLOCK_PRESETS_LOG_SYNC_INTERVAL_DEFAULT                    (-5)
    723 #define PTP_CLOCK_PRESETS_LOG_SYNC_INTERVAL_MAXIMUM                     (1)
    724       
    725 #define PTP_CLOCK_PRESETS_LOG_MIN_DELAY_REQ_INTERVAL_MINIMUM           (-7)
    726 #define PTP_CLOCK_PRESETS_LOG_MIN_DELAY_REQ_INTERVAL_DEFAULT           (-5)
    727 #define PTP_CLOCK_PRESETS_LOG_MIN_DELAY_REQ_INTERVAL_MAXIMUM            (5)
    728 
    729 #define PTP_CLOCK_PRESETS_DOMAIN_NUMBER_MINIMUM                         (0)
    730 #define PTP_CLOCK_PRESETS_DOMAIN_NUMBER_DEFAULT                         (0)
    731 #define PTP_CLOCK_PRESETS_DOMAIN_NUMBER_MAXIMUM                       (255)
    732 
    733 #define PTP_CLOCK_PRESETS_PRIORITY1_MINIMUM                             (0)
    734 #define PTP_CLOCK_PRESETS_PRIORITY1_DEFAULT                           (128)
    735 #define PTP_CLOCK_PRESETS_PRIORITY1_MAXIMUM                           (255)
    736 
    737 #define PTP_CLOCK_PRESETS_PRIORITY2_MINIMUM                             (0)
    738 #define PTP_CLOCK_PRESETS_PRIORITY2_DEFAULT                           (128)
    739 #define PTP_CLOCK_PRESETS_PRIORITY2_MAXIMUM                           (255)
    740 
    741 #define PTP_CLOCK_PRESETS_TELECOM_LOG_ANNOUNCE_INTERVAL_MINIMUM        (-3)
    742 #define PTP_CLOCK_PRESETS_TELECOM_LOG_ANNOUNCE_INTERVAL_DEFAULT         (1)
    743 #define PTP_CLOCK_PRESETS_TELECOM_LOG_ANNOUNCE_INTERVAL_MAXIMUM         (4)
    744    
    745 #define PTP_CLOCK_PRESETS_TELECOM_LOG_SYNC_INTERVAL_MINIMUM            (-7)
    746 #define PTP_CLOCK_PRESETS_TELECOM_LOG_SYNC_INTERVAL_DEFAULT            (-5)
    747 #define PTP_CLOCK_PRESETS_TELECOM_LOG_SYNC_INTERVAL_MAXIMUM             (4)
    748       
    749 #define PTP_CLOCK_PRESETS_TELECOM_LOG_MIN_DELAY_REQ_INTERVAL_MINIMUM   (-7)
    750 #define PTP_CLOCK_PRESETS_TELECOM_LOG_MIN_DELAY_REQ_INTERVAL_DEFAULT   (-5)
    751 #define PTP_CLOCK_PRESETS_TELECOM_LOG_MIN_DELAY_REQ_INTERVAL_MAXIMUM    (4)
    752 
    753 #define PTP_CLOCK_PRESETS_TELECOM_DOMAIN_NUMBER_MINIMUM                 (4)
    754 #define PTP_CLOCK_PRESETS_TELECOM_DOMAIN_NUMBER_DEFAULT                 (4)
    755 #define PTP_CLOCK_PRESETS_TELECOM_DOMAIN_NUMBER_MAXIMUM                (23)
    756 
    757 /* PTP clock presets for TELECOM PHASE PROFILE - ITU-T 8275.1 */
    758 
    759 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_DOMAIN_NUMBER_MINIMUM          (24)
    760 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_DOMAIN_NUMBER_DEFAULT          (24)
    761 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_DOMAIN_NUMBER_MAXIMUM          (43)
    762 
    763 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_PRIORITY2_TSC_DEFAULT          (255)
    764 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_PRIORITY2_TBC_DEFAULT          (128)
    765  
    766 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_LOG_ANNOUNCE_INTERVAL_DEFAULT        (-3)
    767 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_LOG_SYNC_INTERVAL_DEFAULT            (-4)
    768 #define PTP_CLOCK_PRESETS_TELECOM_PHASE_LOG_MIN_DELAY_REQ_INTERVAL_DEFAULT   (-4)
    769 
    770 #define PTP_CLOCK_PRESETS_TELECOM_MAX_STEPS_REMOVED_DEFAULT            (255)
    771 
    772 /* PTP clock presets for G8275.2 PROFILE - ITU-T 8275.2 */
    773 
    774 #define PTP_CLOCK_PRESETS_G8275P2_DOMAIN_NUMBER_MINIMUM          (44)
    775 #define PTP_CLOCK_PRESETS_G8275P2_DOMAIN_NUMBER_DEFAULT          (44)
    776 #define PTP_CLOCK_PRESETS_G8275P2_DOMAIN_NUMBER_MAXIMUM          (63)
    777 
    778 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY1_MINIMUM   (128)
    779 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY1_DEFAULT   (128)
    780 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY1_MAXIMUM   (128)
    781 
    782 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY2_MINIMUM    (0)
    783 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY2_DEFAULT    (128)
    784 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY2_MAXIMUM    (255)
    785 
    786 #define PTP_CLOCK_PRESETS_G8275P2_LOG_ANNOUNCE_INTERVAL_MINIMUM                (-3)
    787 #define PTP_CLOCK_PRESETS_G8275P2_LOG_ANNOUNCE_INTERVAL_DEFAULT                (0)
    788 #define PTP_CLOCK_PRESETS_G8275P2_LOG_ANNOUNCE_INTERVAL_MAXIMUM                (0)
    789 
    790 #define PTP_CLOCK_PRESETS_G8275P2_LOG_SYNC_INTERVAL_MINIMUM                    (-7)
    791 #define PTP_CLOCK_PRESETS_G8275P2_LOG_SYNC_INTERVAL_DEFAULT                    (-4)
    792 #define PTP_CLOCK_PRESETS_G8275P2_LOG_SYNC_INTERVAL_MAXIMUM                     (0)
    793 
    794 #define PTP_CLOCK_PRESETS_G8275P2_LOG_MIN_DELAY_REQ_INTERVAL_MINIMUM           (-7)
    795 #define PTP_CLOCK_PRESETS_G8275P2_LOG_MIN_DELAY_REQ_INTERVAL_DEFAULT           (-4)
    796 #define PTP_CLOCK_PRESETS_G8275P2_LOG_MIN_DELAY_REQ_INTERVAL_MAXIMUM           (0)
    797 
    798 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY2_TSC_DEFAULT          (255)
    799 #define PTP_CLOCK_PRESETS_G8275P2_PRIORITY2_TBC_DEFAULT          (128)
    800 
    801 #define BCM_PTP_SIGNAL_G8275P2_REQUEST_UC_MINIMUM_DURATION_SEC (60)
    802 #define BCM_PTP_SIGNAL_G8275P2_REQUEST_UC_DEFAULT_DURATION_SEC (300)
    803 #define BCM_PTP_SIGNAL_G8275P2_REQUEST_UC_MAXIMUM_DURATION_SEC (1000)
    804 
    805 #define PTP_CLOCK_PRESETS_G8275P2_ANNOUNCE_RECEIPT_TIMEOUT_DEFAULT              (2)
    806 /*
    807  * PTP clock configuration flags.
    808  * NOTE: Flags complement those defined in /include/bcm/ptp.h.
    809  */
    810 
    811 /* Sync-triggered Delay Requests */
    812 #define PTP_CLOCK_FLAGS_TRIGGERED_DELREQ                               (1u)
    813 /* Fixed-interval Delay Requests */
    814 #define PTP_CLOCK_FLAGS_FIXED_DELREQ                                   (2u)
    815 /* One-way operation bit. */
    816 #define PTP_CLOCK_FLAGS_ONEWAY_BIT                                     (3u)
    817 /* Telecom profile bit. */
    818 #define PTP_CLOCK_FLAGS_TELECOM_PROFILE_BIT                            (4u)
    819 /* Bit 5 currently unused */
    820 /* */
    821 /* Alternate master Delay_Req messages bit. */
    822 #define PTP_CLOCK_FLAGS_DELREQ_ALTMASTER_BIT                           (6u)
    823 /* Set Sync OAM register, and override servo-reported phase */
    824 #define PTP_CLOCK_FLAGS_SYNCOAM_BIT                                    (7u)
    825 
    826 /* Bits#8-11 : used to represent profile type */
    827 #define PTP_CLOCK_FLAGS_PROFILE_TYPE_START_BIT                              (8u)
    828 
    829 /* Bits#12 : G.8275.1 profile: Currently developed for DNX devices only - Used
    830  * to represent new feature to reduce replication of Delay request and Delay Resp.
    831  * packets over pipeline which have following feature:
    832  * a) for ptp slave ports, delay request will be sent to rx port of master's
    833  * announce packets.
    834  * b) for ptp master ports, delay response will be sent to rx port of slave's
    835  * delay request packets.
    836  * d) This feature not applicable to other ptp packets
    837  */
    838 #define PTP_CLOCK_FLAGS_TARGETED_DELREQ_DELRESP_TX_BIT             (12u)
    839 
    840 /* Bits#13 :  G.8275.1 profile: Currently developed for DNX devices only -
    841  * can be used to send untagged delay request and delay resp. packets
    842  * if ptp port is configured tagged port, -  mainly used with
    843  * TARGETED_DELREQ_DELRESP_BIT flag as vlan translation
    844  * is not available at EP for packets sent directly without EP processing.
    845  */
    846 #define PTP_CLOCK_FLAGS_UNTAGGED_DELREQ_DELRESP_TX_BIT               (13u)
    847 
    848 /* Not passed through to TOP: */
    849 /* Multi-TLV signaling message support bit. */
    850 #define PTP_CLOCK_FLAGS_SIGNALING_MULTI_TLV_BIT                       (30u)
    851 
    852 /* PTP clock MAC address size (bytes). */
    853 #define PTP_MAC_ADDR_SIZE_BYTES   (6)
    854 /* PTP clock IPv4 address size. */
    855 #define PTP_IPV4_ADDR_SIZE_BYTES  (4)
    856 /* PTP clock IPv6 address size. */
    857 #define PTP_IPV6_ADDR_SIZE_BYTES (16)
    858 /* Maximum size of address (octets). */
    859 #define PTP_MAX_NETW_ADDR_SIZE   (16)
    860 /*
    861  * Maximum length of packet header before IPv4/IPv6 header.
    862  * NOTE: Device-side compliant L2 header size. 
    863  */
    864 #define PTP_MAX_L2_HEADER_LENGTH (32)
    865 /* Size of L2 headers used in messaging to TOP */
    866 #define PTP_MSG_L2_HEADER_LENGTH (64)
    867 /*
    868  * Maximum number of entries in a unicast master table of a PTP clock.
    869  * NOTICE: This value may not be configurable for some ToP Firmwares.
    870  */
    871 #ifndef PTP_MAX_UNICAST_MASTER_TABLE_ENTRIES
    872 #define PTP_MAX_UNICAST_MASTER_TABLE_ENTRIES      (10)
    873 #endif
    874 
    875 /* Maximum number of entries in an acceptable master table of a PTP clock.
    876  * NOTICE: This value may not be configurable for some ToP Firmwares.
    877  */
    878 #ifndef PTP_MAX_ACCEPTABLE_MASTER_TABLE_ENTRIES
    879 #define PTP_MAX_ACCEPTABLE_MASTER_TABLE_ENTRIES   (PTP_MAX_UNICAST_MASTER_TABLE_ENTRIES)
    880 #endif
    881 
    882 /* Maximum total number of unicast slave entries
    883  * NOTICE: This value may not be configurable for some ToP Firmwares.
    884  */
    885 #if defined(PTP_KEYSTONE_STACK)
    886 /* Smaller limits on peers & slaves for Keystone stack */
    887  #ifndef PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES
    888   #define PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES       (50)
    889  #endif /* PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES */
    890 #else
    891  /* Non-Keystone stack */
    892  #ifndef PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES
    893   #define PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES       (250)   
    894  #endif /* PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES */
    895 #endif /* PTP_KEYSTONE_STACK */
    896 
    897 /* Maximum number of multicast slave stats entries.
    898  * NOTICE: This value may not be configurable for some ToP Firmwares.
    899  */
    900 #ifndef PTP_MAX_MULTICAST_SLAVE_STATS_ENTRIES
    901 #define PTP_MAX_MULTICAST_SLAVE_STATS_ENTRIES       (40)
    902 #endif
    903 
    904 /* Infinite unicast message transmission duration. */
    905 #define PTP_UNICAST_NEVER_EXPIRE (0xffffffff)
    906 
    907 /* Flags. */
    908 #define PTP_SIGNALING_ANNOUNCE_SERVICE_BIT                             (0u)
    909 #define PTP_SIGNALING_SYNC_SERVICE_BIT                                 (1u)
    910 #define PTP_SIGNALING_DELAYRESP_SERVICE_BIT                            (2u)
    911 
    912 /* Size of outgoing tunneled signaling/management packet buffer (bytes) */
    913 #define BCM_PTP_TUNNEL_QUEUE_SIZE (10240)
    914 
    915 /* Size of timestamp packet pointers buffer */
    916 #define BCM_PTP_TIMESTAMP_QUEUE_SIZE (256)
    917 
    918 /* Data protection macros. */
    919 #define PTP_MUTEX_TAKE(__mutex__, __usec__)                                      \
    920     do {                                                                         \
    921         int __rv__ = _bcm_ptp_mutex_take(__mutex__, __usec__);                   \
    922         if (BCM_FAILURE(__rv__)) {                                               \
    923             bsl_printf("%s() failed _bcm_ptp_mutex_take() returned %d : %s\n", \
    924                        FUNCTION_NAME(), __rv__, bcm_errmsg(__rv__));    \
    925             return BCM_E_INTERNAL;                                               \
    926         }                                                                        \
    927     } while (0)
    928 
    929 #define PTP_MUTEX_GIVE(__mutex__)                                                \
    930     do {                                                                         \
    931         int __rv__ = _bcm_ptp_mutex_give(__mutex__);                             \
    932         if (BCM_FAILURE(__rv__)) {                                               \
    933             bsl_printf("%s() failed _bcm_ptp_mutex_give() returned %d : %s\n", \
    934                        FUNCTION_NAME(), __rv__, bcm_errmsg(__rv__));    \
    935             return BCM_E_INTERNAL;                                               \
    936         }                                                                        \
    937     } while (0)
    938 
    939 #define PTP_MUTEX_RELEASE_RETURN(__mutex__, __rv__) \
    940     do {                                            \
    941         _bcm_ptp_mutex_give(__mutex__);             \
    942         return __rv__;                              \
    943     } while (0)
    944 
    945 /* Types. */
    946 typedef enum _bcm_ptp_memstate_e
    947 {
    948     PTP_MEMSTATE_FAILURE     = -1,
    949     PTP_MEMSTATE_STARTUP     =  0,
    950     PTP_MEMSTATE_INITIALIZED =  1,
    951     PTP_MEMSTATE_HALTING     =  2
    952 } _bcm_ptp_memstate_t;
    953 
    954 /* dispatchable: initialize the transport mechanism to the ToP */
    955 typedef int _bcm_ptp_transport_init_t(
    956     int unit, 
    957     bcm_ptp_stack_id_t ptp_id,
    958     bcm_mac_t *src_mac,
    959     bcm_mac_t *dest_mac,
    960     bcm_ip_t src_ip,
    961     bcm_ip_t dest_ip,
    962     uint16 vlan,
    963     uint8 prio,
    964     bcm_pbmp_t top_bitmap);
    965 
    966 typedef enum _bcm_ptp_transport_type_e {
    967     PTP_MESSAGE_TO_TOP,
    968     PTP_TUNNEL_TO_TOP,
    969     PTP_TUNNEL_FROM_TOP,
    970     PTP_TUNNEL_SINGLE_TO_TOP   /* same as _TO_TOP, but with no port index header */
    971 } _bcm_ptp_transport_type_t;
    972 
    973 /* dispatchable: transmit a command to the ToP */
    974 typedef int _bcm_ptp_transport_tx_t(
    975     int unit,
    976     bcm_ptp_stack_id_t ptp_id,
    977     int clock_num,
    978     _bcm_ptp_transport_type_t transport,
    979     uint8 *hdr,
    980     int hdr_len,
    981     uint8 *message,
    982     int message_len);
    983 
    984 /* dispatchable: wait (if applicable) until the last command to the ToP has been received */
    985 typedef int _bcm_ptp_transport_tx_completion_t(
    986     int unit,
    987     bcm_ptp_stack_id_t ptp_id);
    988 
    989 /* dispatchable: free a buffer containing a received response */
    990 typedef int _bcm_ptp_transport_rx_free_t(
    991     int unit,
    992     bcm_ptp_stack_id_t ptp_id,
    993     uint8 *data);
    994 
    995 /* dispatchable: tear down the transport mechanism to the ToP */
    996 typedef int _bcm_ptp_transport_terminate_t(
    997     int unit,
    998     bcm_ptp_stack_id_t ptp_id);
    999 
   1000 
   1001 /****************************************************/
   1002 /* constants shared with firmware */
   1003 
   1004 #define MBOX_STATUS_EMPTY                    (0)
   1005 #define MBOX_STATUS_ATTN_TOP_CMD             (1)
   1006 #define MBOX_STATUS_ATTN_TOP_TUNNEL_TO_TOP   (2)
   1007 #define MBOX_STATUS_ATTN_TOP_TUNNEL_EXTERNAL (3)
   1008 #define MBOX_STATUS_ATTN_HOST_RESP           (4)
   1009 #define MBOX_STATUS_ATTN_HOST_EVENT          (5)
   1010 #define MBOX_STATUS_ATTN_HOST_TUNNEL         (6)
   1011 #define MBOX_STATUS_PENDING_TOP              (7)
   1012 #define MBOX_STATUS_PENDING_HOST             (8)
   1013 #define MBOX_STATUS_ATTN_HOST_TIMESTAMPS     (9)
   1014 
   1015 #define MBOX_TUNNEL_MSG_TYPE_OFFSET      (0)
   1016 #define MBOX_TUNNEL_PORT_NUM_OFFSET      (2)
   1017 #define MBOX_TUNNEL_PROTOCOL_OFFSET      (4)
   1018 #define MBOX_TUNNEL_SRC_ADDR_OFFS_OFFSET (6)
   1019 #define MBOX_TUNNEL_PTP_OFFS_OFFSET      (8)
   1020 #define MBOX_TUNNEL_PACKET_OFFSET        (10)
   1021 
   1022 /* Servo fixed-point conversion factors. */
   1023 #define PTP_SERVO_OCXO_FREQ_OFFSET_FIXEDPOINT_SCALEFACTOR            (1000)
   1024 #define PTP_SERVO_FWD_FLOW_WEIGHT_FIXEDPOINT_SCALEFACTOR             (1000)
   1025 #define PTP_SERVO_FWD_FLOW_TRANSACTIONS_PCT_FIXEDPOINT_SCALEFACTOR   (1000)
   1026 #define PTP_SERVO_FWD_MIN_TDEV_FIXEDPOINT_SCALEFACTOR                (1000)
   1027 #define PTP_SERVO_FWD_MAFIE_FIXEDPOINT_SCALEFACTOR                   (1000)
   1028 #define PTP_SERVO_FWD_MIN_CLUSTER_WIDTH_FIXEDPOINT_SCALEFACTOR       (1000)
   1029 #define PTP_SERVO_FWD_MODE_WIDTH_FIXEDPOINT_SCALEFACTOR              (1000)
   1030 #define PTP_SERVO_REV_FLOW_WEIGHT_FIXEDPOINT_SCALEFACTOR             (1000)
   1031 #define PTP_SERVO_REV_FLOW_TRANSACTIONS_PCT_FIXEDPOINT_SCALEFACTOR   (1000)
   1032 #define PTP_SERVO_REV_MIN_TDEV_FIXEDPOINT_SCALEFACTOR                (1000)
   1033 #define PTP_SERVO_REV_MAFIE_FIXEDPOINT_SCALEFACTOR                   (1000)
   1034 #define PTP_SERVO_REV_MIN_CLUSTER_WIDTH_FIXEDPOINT_SCALEFACTOR       (1000)
   1035 #define PTP_SERVO_REV_MODE_WIDTH_FIXEDPOINT_SCALEFACTOR              (1000)
   1036 #define PTP_SERVO_FREQ_CORRECTION_FIXEDPOINT_SCALEFACTOR             (1000)
   1037 #define PTP_SERVO_PHASE_CORRECTION_FIXEDPOINT_SCALEFACTOR            (1000)
   1038 #define PTP_SERVO_TDEV_ESTIMATE_FIXEDPOINT_SCALEFACTOR               (1000)
   1039 #define PTP_SERVO_MDEV_ESTIMATE_FIXEDPOINT_SCALEFACTOR               (1000)
   1040 #define PTP_SERVO_RESIDUAL_PHASE_ERROR_FIXEDPOINT_SCALEFACTOR        (1000)
   1041 #define PTP_SERVO_MIN_ROUNDTRIP_DELAY_FIXEDPOINT_SCALEFACTOR         (1000)
   1042 #define PTP_SERVO_FWD_IPDVPCT_FIXEDPOINT_SCALEFACTOR                 (1000)
   1043 #define PTP_SERVO_FWD_IPDVMAX_FIXEDPOINT_SCALEFACTOR                 (1000)
   1044 #define PTP_SERVO_FWD_INTERPKT_JITTER_FIXEDPOINT_SCALEFACTOR         (1000)
   1045 #define PTP_SERVO_REV_IPDVPCT_FIXEDPOINT_SCALEFACTOR                 (1000)
   1046 #define PTP_SERVO_REV_IPDVMAX_FIXEDPOINT_SCALEFACTOR                 (1000)
   1047 #define PTP_SERVO_REV_INTERPKT_JITTER_FIXEDPOINT_SCALEFACTOR         (1000)
   1048 
   1049 /* Legacy flags that can be added to oscillator type instead */
   1050 #define BCM_PTP_FLAG_LOCK_ENDURO_FREQ_MULT   (64)
   1051 #define BCM_PTP_FLAG_IGNORE_SERVO_OUTPUT     (128)                  
   1052 
   1053 typedef struct _bcm_ptp_servo_configuration_s {
   1054     /* Local oscillator type. */
   1055     bcm_ptp_osc_type_t osc_type;
   1056     /* PTP transport mode. */
   1057     bcm_ptp_transport_mode_t transport_mode;
   1058     /* Bit-mapped phase mode of servo loop. */
   1059     uint32 ptp_phase_mode;
   1060     /* OCXO frequency offset */
   1061     int32 freq_corr;
   1062     /* Timestamp for frequency offset.*/
   1063     bcm_ptp_timestamp_t freq_corr_time;
   1064     /* Bridge time in nanoseconds. */
   1065     uint32 bridge_time;
   1066     uint32 flags;
   1067 } _bcm_ptp_servo_configuration_t;
   1068  
   1069 
   1070 /****************************************************/
   1071 /* structures shared with firmware */
   1072 
   1073 /*   mbox 0 is for cmd/resp.  Others are for async event & msg to host */
   1074 
   1075 typedef struct _bcm_ptp_internal_stack_mbox_s {
   1076     volatile uint32 status;     /* MBOX_STATUS_x value */
   1077     volatile uint32 clock_num;  /* clock number that the message is addressed to/from */
   1078     volatile uint32 data_len;
   1079     volatile uint32 rfu_mbox;
   1080 #if defined BCM_PTP_DMA_ALIGNMENT
   1081     uint8 alignment[BCM_PTP_DMA_ALIGNMENT - 16];  /* 16 bytes in the above already */
   1082 #endif /* BCM_PTP_DMA_ALIGNMENT */
   1083     volatile uint8 data[1536];  /* at offset of 'mbox_offset' from start of struct */
   1084 } _bcm_ptp_internal_stack_mbox_t;
   1085 
   1086 #define GET_MBOX_STATUS(stack,idx)                                               \
   1087     ( soc_cm_sinval(unit, (void*)&(stack)->int_state.mboxes->mbox[(idx)].status, \
   1088                     sizeof((stack)->int_state.mboxes->mbox[(idx)].status)),      \
   1089       soc_ntohl((stack)->int_state.mboxes->mbox[(idx)].status)          \
   1090     )
   1091 
   1092 #define SET_MBOX_STATUS(stack,idx,val)                                           \
   1093     ( (stack)->int_state.mboxes->mbox[(idx)].status = soc_htonl(val),            \
   1094       soc_cm_sflush(unit, (void*)&(stack)->int_state.mboxes->mbox[(idx)].status, \
   1095                     sizeof((stack)->int_state.mboxes->mbox[(idx)].status))       \
   1096     )
   1097 
   1098 typedef struct _bcm_ptp_internal_stack_mboxes_s {
   1099     volatile uint32 num_mboxes;                     /* == BCM_PTP_MAX_BUFFERS */
   1100     volatile uint32 mbox_size;
   1101     volatile uint32 mbox_offset;  /* for both 'mbox' field and 'data' field in mbo struct */
   1102     volatile uint32 rfu;
   1103 #if defined BCM_PTP_DMA_ALIGNMENT
   1104     uint8 alignment[BCM_PTP_DMA_ALIGNMENT - 16];  /* 16 bytes in the above already */
   1105 #endif /* BCM_PTP_DMA_ALIGNMENT */
   1106     /* note: now at offset of 'mbox_offset' */
   1107     volatile _bcm_ptp_internal_stack_mbox_t mbox[BCM_PTP_MAX_BUFFERS]; /* contents of mbox */
   1108 } _bcm_ptp_internal_stack_mboxes_t;
   1109 
   1110 typedef struct _bcm_ptp_internal_stack_log_s {
   1111     volatile uint32 size;                         /* allocated size of buf (below)              */
   1112     volatile uint32 head;                         /* host-read, updated by CMICm                */
   1113     volatile uint8 buf[4];                        /* '4' is placeholder.  Actual size is 'size' */
   1114 } _bcm_ptp_internal_stack_log_t;
   1115 
   1116 typedef struct _bcm_ptp_internal_stack_state_s {
   1117     /* network-byte-ordered physical memory addresses of the shared structures */
   1118     volatile uint32 mbox_ptr;
   1119     volatile uint32 log_ptr;
   1120 
   1121     _bcm_ptp_internal_stack_mboxes_t * mboxes;
   1122     _bcm_ptp_internal_stack_log_t * log;
   1123 
   1124     /* Elements after this point are not accessed by firmware */
   1125     int core_num;
   1126     uint32 log_tail;
   1127 } _bcm_ptp_internal_stack_state_t;
   1128 
   1129 
   1130 typedef struct _bcm_ptp_ext_stack_processor_info_s {
   1131     /*  System information. */
   1132     uint32 cpu_usage;          /* Value 0..1000.  50 => 5% ToP CPU utilization. */
   1133     uint32 max_cpu_usage;      /* Maximum value of cpuUsage, reset on ClearSysInfo(). */
   1134     uint32 mem_free;           /* Memory available in system heap, in bytes. */
   1135     uint32 min_mem_free;       /* Minimum value of memFree, reset on ClearSysInfo(). */
   1136     uint32 tick_buffer;        /* Time buffer between tick task. */
   1137     uint32 min_tick_buffer;    /* Minimum value of tickBuffer. */
   1138     uint32 one_sec_buffer;     /* Time buffer between one second task. */
   1139     uint32 min_one_sec_buffer; /* Minimum value of oneSecBuffer. */
   1140     uint32 one_min_buffer;     /* Time buffer between one minute task. */
   1141     uint32 min_one_min_buffer; /* Minimum value of oneMinBuffer. */
   1142     uint32 stack_free[10];     /* Stack free space, per task. */
   1143     uint32 sub_heap_free[10];  /* Space available in individual heaps. */
   1144 } _bcm_ptp_ext_stack_processor_info_t;
   1145 
   1146 typedef struct _bcm_ptp_ext_fw_info_s {
   1147     /* PTP firmware information. */
   1148     char firmware_version[128];
   1149     char servo_version[128];
   1150 
   1151     uint32 ptp_stack_timer_hz;
   1152 
   1153     uint8 ptp_clocks_max;
   1154     uint8 ptp_ports_per_clock_max;
   1155 
   1156     uint8 unicast_masters_max;
   1157     uint8 unicast_slaves_max;
   1158     uint8 foreign_master_dataset_entries_max;
   1159 } _bcm_ptp_ext_fw_info_t;
   1160 
   1161 /****************************************************/
   1162 
   1163 #define PTP_MAX_STACKS_PER_UNIT       (1)
   1164 #define PTP_MAX_CLOCKS_PER_STACK      (1)
   1165 #define PTP_MAX_CLOCK_INSTANCES       (1)
   1166 #define PTP_MAX_CLOCK_INSTANCE_PORTS  (32)                  
   1167 #define PTP_MAX_ORDINARY_CLOCK_PORTS  (1)
   1168 #define PTP_MAX_TIME_SOURCES          (3)
   1169 #define PTP_MAX_OUTPUT_SIGNALS        (7)
   1170 #define PTP_GPIO_OUTPUT_SIGNALS       (6)
   1171 #if defined(BCM_PTP_INTERNAL_STACK_SUPPORT)
   1172 #define PTP_OUTPUT_SIGNAL_SYNCE       (6)
   1173 #else
   1174 #define PTP_OUTPUT_SIGNAL_SYNCE       (-1)
   1175 #endif
   1176 #define PTP_MAX_TOD_INPUTS            (1)
   1177 #define PTP_MAX_TOD_OUTPUTS           (5)
   1178 
   1179 #define PTP_UNIT_NUMBER_DEFAULT       (0)
   1180 #define PTP_STACK_ID_DEFAULT          (0)
   1181 #define PTP_CLOCK_NUMBER_DEFAULT      (0)
   1182 #define PTP_CLOCK_PORT_NUMBER_DEFAULT (1)
   1183 
   1184 #if defined(PTP_KEYSTONE_STACK)
   1185 /* Smaller limits on peers & slaves for Keystone stack */
   1186 #define _PTP_MAX_PEER_DATASET_ENTRIES           100
   1187 #define _PTP_MAX_PEER_DATASET_CHUNK_SIZE        10
   1188 #define _PTP_MAX_FOREIGN_MASTER_DATASET_ENTRIES 10
   1189 #else
   1190 /* Non-Keystone stack */
   1191 #define _PTP_MAX_PEER_DATASET_CHUNK_SIZE        10
   1192 #define _PTP_MAX_FOREIGN_MASTER_DATASET_ENTRIES 10
   1193 #define _PTP_MAX_PEER_DATASET_ENTRIES           PTP_MAX_UNICAST_SLAVE_TABLE_ENTRIES + \
   1194                                                 PTP_MAX_CLOCK_INSTANCE_PORTS + \
   1195                                                 _PTP_MAX_FOREIGN_MASTER_DATASET_ENTRIES
   1196 #endif  /* PTP_KEYSTONE_STACK */
   1197 
   1198 /* Peer Dataset */
   1199 typedef struct bcm_ptp_peer_dataset_s {
   1200     sal_mutex_t lock;
   1201     uint16 num_peers;
   1202     bcm_ptp_peer_entry_t peer[_PTP_MAX_PEER_DATASET_ENTRIES];
   1203 } bcm_ptp_peer_dataset_t;
   1204 
   1205 
   1206 /*
   1207  * PTP state enumeration.
   1208  * Ref. IEEE Std. 1588-2008, Chapter 8.2.5.3.1.
   1209  */
   1210 typedef enum _bcm_ptp_port_state_e {
   1211     _bcm_ptp_state_initializing = 1,
   1212     _bcm_ptp_state_faulty       = 2,
   1213     _bcm_ptp_state_disabled     = 3,
   1214     _bcm_ptp_state_listening    = 4,
   1215     _bcm_ptp_state_pre_master   = 5,
   1216     _bcm_ptp_state_master       = 6,
   1217     _bcm_ptp_state_passive      = 7,
   1218     _bcm_ptp_state_uncalibrated = 8,
   1219     _bcm_ptp_state_slave        = 9
   1220 } _bcm_ptp_port_state_t;
   1221 
   1222 typedef enum
   1223 {
   1224     e_PtpProfType_8265p1,
   1225     e_PtpProfType_8275p1,
   1226     e_PtpProfType_8275p2,
   1227     /*e_PtpProfType_8273p2,*/
   1228     e_PtpProfType_None
   1229 } e_PTP_Profiletype;
   1230 
   1231 /*
   1232  * PTP Boot type enumeration.
   1233  */
   1234 typedef enum _bcmPTPBootType_e {
   1235     BCM_PTP_COLDSTART,
   1236     BCM_PTP_WARMSTART
   1237 } _bcmPTPBootType_t;
   1238 
   1239 /* Enumeration of events which can generate a callback */
   1240 typedef enum _bcm_ptp_event_e {
   1241     _bcm_ptp_state_change_event    = 0x01,
   1242     _bcm_ptp_master_change_event   = 0x02,
   1243     _bcm_ptp_master_avail_event    = 0x03,
   1244     _bcm_ptp_master_unavail_event  = 0x04,
   1245     _bcm_ptp_slave_avail_event     = 0x05,
   1246     _bcm_ptp_slave_unavail_event   = 0x06,
   1247     _bcm_ptp_top_oom_event         = 0x07,
   1248     _bcm_ptp_top_watchdog_event    = 0x08,
   1249     _bcm_ptp_top_ready_event       = 0x09,
   1250     _bcm_ptp_top_misc_event        = 0x0a,
   1251     _bcm_ptp_top_tod_avail_event   = 0x0b,
   1252     _bcm_ptp_top_tod_unavail_event = 0x0c,
   1253     _bcm_ptp_ieee1588_warn_event   = 0x0d,
   1254     _bcm_ptp_servo_state_event     = 0x0e,
   1255     _bcm_ptp_pps_in_state_event    = 0x0f,
   1256     _bcm_ptp_tdev_event            = 0x10,
   1257     _bcm_ptp_servo_log_event       = 0x11,
   1258     _bcm_ptp_servo_lock_event      = 0x12,
   1259     _bcm_ptp_synce_loss_event      = 0x13,
   1260     _bcm_ptp_ts1_offset_event      = 0x14,
   1261 #ifdef BCM_PTP_EXT_SERVO_SUPPORT
   1262     _bcm_ptp_qual_timer_exp_event  = 0x15,
   1263 #endif /* BCM_PTP_EXT_SERVO_SUPPORT */
   1264     _bcm_ptp_last_event
   1265 } _bcm_ptp_event_t;
   1266 
   1267 /*
   1268  * Event support (STATE CHANGE).
   1269  * Reason for a change in PTP port state.
   1270  */
   1271 typedef enum _bcm_ptp_state_change_reason_e {
   1272    /* Startup, instance creation. */
   1273    _bcm_ptp_state_change_reason_startup         = 0,
   1274    /* Port initialization. */
   1275    _bcm_ptp_state_change_reason_port_init       = 1,
   1276    /* Fault detected. */
   1277    _bcm_ptp_state_change_reason_fault           = 2,
   1278    /* BMCA state transition. */
   1279    _bcm_ptp_state_change_reason_bmca            = 3,
   1280    /* Enable port management message. */
   1281    _bcm_ptp_state_change_reason_mnt_enable      = 4,
   1282    /* Disable port management message. */
   1283    _bcm_ptp_state_change_reason_mnt_disable     = 5,
   1284    /* Network interface re-initialization. */
   1285    _bcm_ptp_state_change_reason_netw_reinit     = 6,
   1286    /* Timestamp difference, master-to-slave. */
   1287    _bcm_ptp_state_change_reason_dt_master_slave = 7,
   1288    _bcm_ptp_state_change_reason_last
   1289 } _bcm_ptp_state_change_reason_t;
   1290 
   1291 /*
   1292  * Event support (IEEE Std. 1588-2008 WARNING).
   1293  * Reason for a warning related to IEEE Std. 1588-2008.
   1294  */
   1295 typedef enum _bcm_ptp_ieee1588_warn_reason_e {
   1296    /* Non-uniform logAnnounceInterval in a PTP domain. */
   1297    _bcm_ptp_ieee1588_warn_reason_logAnnounceInterval = 0,
   1298    _bcm_ptp_ieee1588_warn_reason_last
   1299 } _bcm_ptp_ieee1588_warn_reason_t;
   1300 
   1301 /* Misc Events */
   1302 typedef enum _bcm_ptp_top_misc_reason_e {
   1303    /* Non-uniform logAnnounceInterval in a PTP domain. */
   1304    _bcm_ptp_top_misc_reason_anncFlagChange = 0,
   1305    _bcm_ptp_top_misc_reason_last
   1306 } _bcm_ptp_top_misc_reason_t;
   1307 
   1308 
   1309 /* Event support (PPS-IN STATE). */
   1310 typedef enum _bcm_ptp_pps_in_state_e {
   1311    _bcm_ptp_pps_in_state_missing            = 0,
   1312    _bcm_ptp_pps_in_state_active_missing_tod = 1,
   1313    _bcm_ptp_pps_in_state_valid              = 2
   1314 } _bcm_ptp_pps_in_state_t;
   1315 
   1316 /* Enumeration of events for ext-servo which can generate a callback */
   1317 typedef enum _bcm_ptp_ext_servo_event_e {
   1318     _bcm_ptp_ext_servo_downlink_ts_event     = 0x00,
   1319     _bcm_ptp_ext_servo_uplink_ts_event       = 0x01,
   1320     _bcm_ptp_ext_servo_master_change_event   = 0x02,
   1321     _bcm_ptp_ext_servo_master_avail_event    = 0x03,
   1322     _bcm_ptp_ext_servo_master_unavail_event  = 0x04,
   1323     _bcm_ptp_ext_servo_gps_avail_event       = 0x05,
   1324     _bcm_ptp_ext_servo_gps_unavail_event     = 0x06,
   1325     _bcm_ptp_ext_servo_gps_ts_event          = 0x07,
   1326     _bcm_ptp_ext_servo_last_event
   1327 } _bcm_ptp_ext_servo_event_t;
   1328 
   1329 
   1330 typedef struct bcm_ptp_mbox_tsevent_stats_s {
   1331     unsigned int event_queued;
   1332     unsigned int event_dequeued;
   1333     unsigned int event_dl_ts;
   1334     unsigned int event_dl_ts_handled;
   1335     unsigned int event_dl_ts_above_thres;
   1336     unsigned int event_ul_ts;
   1337     unsigned int event_ul_ts_handled;
   1338     unsigned int event_ul_ts_above_thres;
   1339     unsigned int event_master_add;
   1340     unsigned int event_master_remove;
   1341     unsigned int event_master_change;
   1342     unsigned int event_unknown;
   1343     unsigned int error_queue_add;
   1344     unsigned int ts_rpc_livecount;
   1345 } bcm_ptp_mbox_tsevent_stats_t;
   1346 
   1347 typedef struct _bcm_ptp_tunnel_queue_s {
   1348     sal_mutex_t lock;
   1349     shr_rdpc_t rdpc;
   1350     int head;
   1351     int tail;
   1352     uint8 buf[BCM_PTP_TUNNEL_QUEUE_SIZE];
   1353 } _bcm_ptp_tunnel_queue_t;
   1354 
   1355 #define EXT_SERVO_TS_RATE_MAX 128
   1356 
   1357 typedef enum _bcm_ptp_ts_type_e {
   1358     _bcm_ptp_ts_type_uplink = 0,
   1359     _bcm_ptp_ts_type_downlink = 1
   1360 } _bcm_ptp_ts_type_t;
   1361 
   1362 typedef struct _bcm_ptp_timestamp_node_s
   1363 {
   1364     bcm_ptp_port_identity_t  portId;
   1365     uint16                   msgSeqId;
   1366     uint16                   flags;
   1367     uint16                   numTs;
   1368     uint32                   tsType;
   1369     int                      first_TS[12];
   1370     int64                    tsDiff[EXT_SERVO_TS_RATE_MAX];
   1371 }_bcm_ptp_timestamp_node_t;
   1372 
   1373 #define PTP_EXT_SERVO_TS_OFFSET 32
   1374 #define PTP_EXT_SERVO_MSTR_INST_UNKNOWN 0xffff
   1375 
   1376 typedef struct  _bcm_ptp_timestamp_list_s 
   1377 {
   1378     _bcm_ptp_timestamp_node_t *data;
   1379 } _bcm_ptp_timestamp_list_t;
   1380 
   1381 typedef struct _bcm_ptp_timestamp_queue_s {
   1382     sal_mutex_t lock;
   1383     shr_rdpc_t rdpc;
   1384     int head;
   1385     int tail;
   1386     _bcm_ptp_timestamp_list_t *ts_list;
   1387 } _bcm_ptp_timestamp_queue_t;
   1388 
   1389 /* PTP stack information. */
   1390 typedef struct _bcm_ptp_stack_info_s
   1391 {
   1392     int in_use;
   1393     _bcm_ptp_memstate_t memstate;
   1394     bcm_ptp_external_stack_info_t ext_info;
   1395     _bcm_ptp_internal_stack_state_t int_state;
   1396 
   1397     int unit;
   1398     bcm_ptp_stack_id_t stack_id;
   1399     int unicast_master_table_size;
   1400     int acceptable_master_table_size;
   1401     int unicast_slave_table_size;
   1402     int multicast_slave_stats_size;
   1403 
   1404     uint32 flags;
   1405 #if defined(PTP_KEYSTONE_STACK)
   1406     void *cookie;
   1407     uint8 persistent_config[CONFIG_TOTAL_SIZE];
   1408 #endif    
   1409 
   1410     _bcm_ptp_tunnel_queue_t tunnel_queue;
   1411     _bcm_ptp_timestamp_queue_t timestamp_queue;
   1412 
   1413     /* dispatch table */
   1414     _bcm_ptp_transport_init_t *transport_init;
   1415     _bcm_ptp_transport_tx_t *tx;                            /* transmit a message to the ToP */
   1416     _bcm_ptp_transport_tx_completion_t *tx_completion;      /* wait until last tx has been received by ToP */
   1417     _bcm_ptp_transport_rx_free_t *rx_free;                  /* release a received message from the ToP */
   1418     _bcm_ptp_transport_terminate_t *transport_terminate;
   1419 
   1420 } _bcm_ptp_stack_info_t;
   1421 
   1422 typedef struct _bcm_ptp_info_s
   1423 {
   1424     _bcm_ptp_memstate_t memstate;
   1425     sal_mutex_t mutex;
   1426     _bcm_ptp_stack_info_t *stack_info;
   1427 } _bcm_ptp_info_t;
   1428 
   1429 extern _bcm_ptp_info_t _bcm_common_ptp_info[BCM_MAX_NUM_UNITS];
   1430 #define SET_PTP_INFO ptp_info_p = &_bcm_common_ptp_info[unit]
   1431 
   1432 
   1433 /* PTP clock and clock port information cache. */
   1434 typedef struct _bcm_ptp_clock_cache_s
   1435 {
   1436     int in_use;
   1437     int max_num_ports;   /* Set on initial clock configuration.  Clock can be reconfigured with fewer, but not more */
   1438     bcm_ptp_clock_info_t  clock_info;
   1439     bcm_ptp_signal_output_t signal_output[PTP_MAX_OUTPUT_SIGNALS];
   1440     bcm_ptp_tod_input_t tod_input[PTP_MAX_TOD_INPUTS];
   1441     bcm_ptp_tod_output_t tod_output[PTP_MAX_TOD_OUTPUTS];
   1442     bcm_ptp_clock_port_info_t port_info[PTP_MAX_CLOCK_INSTANCE_PORTS];
   1443     _bcm_ptp_port_state_t portState[PTP_MAX_CLOCK_INSTANCE_PORTS];
   1444     bcm_ptp_peer_dataset_t peerTable;
   1445 #ifdef BCM_PTP_EXT_SERVO_SUPPORT
   1446     bcm_ptp_servo_type_t servo_type;
   1447 #endif /* BCM_PTP_EXT_SERVO_SUPPORT */
   1448 } _bcm_ptp_clock_cache_t;
   1449 
   1450 /* PTP stack clock and port information caches. */
   1451 typedef struct _bcm_ptp_stack_cache_s
   1452 {
   1453     _bcm_ptp_memstate_t memstate;
   1454     _bcm_ptp_clock_cache_t *clock_array;
   1455 } _bcm_ptp_stack_cache_t;
   1456 
   1457 /* Unit clock and port information caches. */
   1458 typedef struct _bcm_ptp_unit_cache_s
   1459 {
   1460     _bcm_ptp_memstate_t memstate;
   1461     _bcm_ptp_stack_cache_t *stack_array;
   1462 } _bcm_ptp_unit_cache_t;
   1463 
   1464 /* PTP PCI setconfig */
   1465 typedef int (*bcm_ptp_pci_setconfig_t) (uint32 pci_dev_id, uint32 pciconfig_register, uint32 value);
   1466 
   1467 typedef struct _bcm_ptp_ipdv_config_s {
   1468     uint16  observation_interval; /* IPDV observation interval. */
   1469     int32   threshold;            /* IPDV threshold (nsec).     */
   1470     uint16  pacing_factor;        /* IPDV pacing factor.        */
   1471 } _bcm_ptp_ipdv_config_t;
   1472 
   1473 typedef struct _bcm_ptp_ipdv_performance_s {
   1474     uint64  fwd_pct;    /* Forward IPDV % below threshold.     */
   1475     uint64  fwd_max;    /* Forward maximum IPDV (usec).        */
   1476     uint64  fwd_jitter; /* Forward interpacket jitter (usec).  */
   1477     uint64  rev_pct;    /* Reverse IPDV % below threshold.     */
   1478     uint64  rev_max;    /* Reverse maximum IPDV (usec).        */
   1479     uint64  rev_jitter; /* Reverse interpacket jitter (usec).  */
   1480 } _bcm_ptp_ipdv_performance_t;
   1481 
   1482 typedef enum _bcm_ptp_channel_sub_status_e {
   1483     _bcm_ptp_channel_status_ok = 0,
   1484     _bcm_ptp_channel_status_fault = 1,
   1485     _bcm_ptp_channel_status_disabled = 2
   1486 } _bcm_ptp_channel_sub_status_t;
   1487 
   1488 typedef struct _bcm_ptp_channel_status_s {
   1489     _bcm_ptp_channel_sub_status_t freq_status;
   1490     _bcm_ptp_channel_sub_status_t time_status;
   1491     int freq_weight;
   1492     int time_weight;
   1493     int freq_QL;
   1494     int time_QL;
   1495     int ql_read_externally;
   1496     uint32 fault_map;
   1497 } _bcm_ptp_channel_status_t;
   1498 
   1499 
   1500 typedef struct _bcm_ptp_servo_performance_s {
   1501     /* FLL state data. */
   1502     bcm_ptp_servo_status_t status;
   1503     /* Forward flow weight. */
   1504     uint64 fwd_weight;         
   1505     /* Forward flow transient-free out of 900 sec. */  
   1506     uint32 fwd_trans_free_900;
   1507     /* Forward flow transient-free out of 3600 sec. */  
   1508     uint32 fwd_trans_free_3600;
   1509     /* Forward flow transactions used (%). */
   1510     uint64 fwd_pct;             
   1511     /* Forward flow operational minimum TDEV (nsec). */
   1512     uint64 fwd_min_Tdev;        
   1513     /* Forward Mafie. */
   1514     uint64 fwd_Mafie;
   1515     /* Forward flow minimum cluster width (nsec).*/
   1516     uint64 fwd_min_cluster_width;
   1517     /* Forward flow mode width (nsec). */
   1518     uint64 fwd_mode_width;       
   1519     /* Reverse flow weight. */
   1520     uint64 rev_weight;           
   1521     /* Reverse flow transient-free out of 900 sec. */  
   1522     uint32 rev_trans_free_900;
   1523     /* Reverse flow transient-free out of 3600 sec. */  
   1524     uint32 rev_trans_free_3600;
   1525     /* Reverse flow transactions used (%). */
   1526     uint64 rev_pct;
   1527     /* Reverse flow operational minimum TDEV (nsec). */
   1528     uint64 rev_min_Tdev;
   1529     /* Reverse Mafie. */
   1530     uint64 rev_Mafie;
   1531     /* Reverse flow minimum cluster width (nsec).*/
   1532     uint64 rev_min_cluster_width;
   1533     /* Reverse flow mode width (nsec). */
   1534     uint64 rev_mode_width;
   1535     /* Frequency correction (ppb). */
   1536     int64 freq_correction; 
   1537     /* Phase correction (ppb).*/
   1538     int64 phase_correction;     
   1539     /* Output TDEV estimate (nsec). */
   1540     uint64 tdev_estimate;  
   1541     /* Output MDEV estimate (ppb). */
   1542     uint64 mdev_estimate;  
   1543     /* Residual phase error (nsec). */
   1544     int64 residual_phase_error;   
   1545     /* Minimum round trip delay (nsec). */
   1546     uint64 min_round_trip_delay;
   1547     /* Sync packet rate (pkts/sec). */
   1548     uint16 fwd_pkt_rate;  
   1549     /* Delay packet rate (pkts/sec). */
   1550     uint16 rev_pkt_rate;
   1551     /* IPDV performance data / metrics. */
   1552     _bcm_ptp_ipdv_performance_t ipdv_data;   
   1553 } _bcm_ptp_servo_performance_t;
   1554 
   1555 /* Extended Peer Info Structure.  Includes local port address, for use with wildcard port */
   1556 typedef struct _bcm_ptp_clock_peer_ext_s {
   1557     bcm_ptp_clock_peer_t peer;
   1558     bcm_ptp_clock_port_address_t local_address;
   1559 } _bcm_ptp_clock_peer_ext_t;
   1560 
   1561 /* Phase Holdover state, for nulling asymmetry offsets on master/path changes */
   1562 
   1563 typedef struct bcm_ptp_phase_holdover_state_s {
   1564     /* Current servo-reported phase offset between local timestamper and master */
   1565     int64 reported_phase_offset;
   1566     /* User-supplied offset applied in addition to servo's fixed or reported offset */
   1567     int64 delta_phase_offset;
   1568     /* Fixed offset to be applied in place of reported phase offset */
   1569     int64 fixed_phase_offset;
   1570     /* 1: Use fixed_phase_offset,  0: Use reported_phase_offset
   1571      * Note: switching masters will cause a 0->1 transition, while also latching
   1572      *       reported_phase_offset into fixed_phase_offset
   1573      */
   1574     int use_fixed_phase_offset;
   1575     /* max slew rate when supplied phase offset is changed */
   1576     int32 phase_slew_rate_ppb;
   1577     /* max offset to adjust by slew.  Larger offset will cause phase jump */
   1578     uint32 sync_phase_offset_ns;
   1579     /* Switching offset computed by FW. */
   1580     int64 gps_to_ptp_offset_auto;
   1581     /* Switching offset provided by user. */
   1582     int64 gps_to_ptp_offset_manual;
   1583     /* Enable usage of auto offset. */
   1584     int enable_gps_to_ptp_auto;
   1585 } bcm_ptp_phase_holdover_state_t;
   1586 
   1587 /* Telecom profile definitions and data types. */
   1588 #define PTP_TELECOM_NETWORKING_OPTION_DEFAULT (bcm_ptp_telecom_g8265_network_option_II)
   1589 #define PTP_TELECOM_MAX_NUMBER_PKTMASTERS (PTP_MAX_UNICAST_MASTER_TABLE_ENTRIES)
   1590 #define PTP_TELECOM_ANNOUNCE_RECEIPT_TIMEOUT_MSEC_DEFAULT                 (6000)
   1591 #define PTP_TELECOM_SYNC_RECEIPT_TIMEOUT_MSEC_DEFAULT                     (1000)
   1592 #define PTP_TELECOM_DELAYRESP_RECEIPT_TIMEOUT_MSEC_DEFAULT                (1000)
   1593 #define PTP_TELECOM_PDV_SCALED_ALLAN_VARIANCE_THRESHOLD_NSECSQ_DEFAULT (1000000000)
   1594 #define PTP_TELECOM_NON_REVERSION_MODE_DEFAULT                               (0)
   1595 #define PTP_TELECOM_WAIT_TO_RESTORE_SEC_DEFAULT                            (300)
   1596 
   1597 #define PTP_TELECOM_EVENT_FIFO_SIZE                                         (30)
   1598  
   1599 #define PTP_TELECOM_EVENT_PTSF_LOSS_ANNOUNCE_BIT                            (0u)
   1600 #define PTP_TELECOM_EVENT_PTSF_LOSS_SYNC_BIT                                (1u)
   1601 #define PTP_TELECOM_EVENT_PTSF_LOSS_SYNC_TS_BIT                             (2u)
   1602 #define PTP_TELECOM_EVENT_PTSF_LOSS_DELAY_RESP_BIT                          (3u)
   1603 #define PTP_TELECOM_EVENT_PTSF_UNUSABLE_BIT                                 (4u)
   1604 #define PTP_TELECOM_EVENT_QL_DEGRADED_BIT                                   (8u)
   1605 #define PTP_TELECOM_EVENT_GM_ADDED_BIT                                     (16u)
   1606 #define PTP_TELECOM_EVENT_GM_REMOVED_BIT                                   (17u)
   1607 #define PTP_TELECOM_EVENT_GM_SELECTED_BIT                                  (18u)
   1608 
   1609 /* Telecom events. */
   1610 typedef struct _bcm_ptp_telecom_g8265_event_s {
   1611     uint32 type;
   1612     sal_time_t timestamp;
   1613     bcm_ptp_telecom_g8265_pktmaster_t pktmaster;
   1614 } _bcm_ptp_telecom_g8265_event_t;
   1615 
   1616 typedef struct _bcm_ptp_telecom_g8265_event_fifo_s {
   1617     int head;
   1618     _bcm_ptp_telecom_g8265_event_t events[PTP_TELECOM_EVENT_FIFO_SIZE];
   1619 } _bcm_ptp_telecom_g8265_event_fifo_t;
   1620 
   1621 
   1622 /* T-DPLL definitions and data types. */
   1623 #define TDPLL_INPUT_CLOCK_NUM_GPIO  (BCM_TDPLL_INPUT_CLOCK_NUM_GPIO)
   1624 #define TDPLL_INPUT_CLOCK_NUM_SYNCE (BCM_TDPLL_INPUT_CLOCK_NUM_SYNCE)
   1625 #define TDPLL_INPUT_CLOCK_NUM_1588  (BCM_TDPLL_INPUT_CLOCK_NUM_1588)
   1626 #define TDPLL_INPUT_CLOCK_NUM_MAX   (BCM_TDPLL_INPUT_CLOCK_NUM_MAX)
   1627 
   1628 #define TDPLL_OUTPUT_CLOCK_NUM_BROADSYNC (BCM_TDPLL_OUTPUT_CLOCK_NUM_BROADSYNC)
   1629 #define TDPLL_OUTPUT_CLOCK_NUM_SYNCE     (BCM_TDPLL_OUTPUT_CLOCK_NUM_SYNCE)
   1630 #define TDPLL_OUTPUT_CLOCK_NUM_1588      (BCM_TDPLL_OUTPUT_CLOCK_NUM_1588)
   1631 #define TDPLL_OUTPUT_CLOCK_NUM_GPIO      (BCM_TDPLL_OUTPUT_CLOCK_NUM_GPIO)
   1632 #define TDPLL_OUTPUT_CLOCK_NUM_MAX       (BCM_TDPLL_OUTPUT_CLOCK_NUM_MAX)
   1633 
   1634 #define TDPLL_INPUT_CLOCK_IDX_GPIO4 (4)/*TDPLL INPUTClk GPIO4 Pin*/
   1635 #define TDPLL_INPUT_CLOCK_IDX_GPIO5 (5)/*TDPLL INPUTClk GPIO5 Pin*/
   1636 
   1637 /* Apache, there are 2 more XGPLLs for TDPLL/SyncE output clocks
   1638    TDPLL output clock indices are as indicated below
   1639    XGPLL3 XGPLL2 GP5 GP4 GP3 GP2 GP1 GP0 1588 XGPLL1 XGPLL0 BS1 BS0 */
   1640 
   1641 /* Qumran-AX, possible QUX total 3 SyncE output clocks
   1642    PML0,PML1 and PMH PLLs
   1643 
   1644    PMHPLL GP5 GP4 GP3 GP2 GP1 GP0 1588 PML1PLL PML0PLL BS1 BS0
   1645 */
   1646 
   1647 #define TDPLL_OUTPUT_CLOCK_IDX_GPIO4 (9)/*TDPLL OUTPUTClk GPIO4 Pin*/
   1648 #define TDPLL_OUTPUT_CLOCK_IDX_GPIO5 (10)/*TDPLL OUTPUTClk GPIO5 Pin*/
   1649 #define TDPLL_OUTPUT_CLOCK_IDX_SYNCE3 (11)/*Apache- XGPLL2, QAX/QUX-PMHPLL */
   1650 #define TDPLL_OUTPUT_CLOCK_IDX_XGPLL3 (12)/*only in Apache */
   1651 
   1652 #define TDPLL_OUTPUT_CLOCK_MASK_SYNCE3_PLL (1<<TDPLL_OUTPUT_CLOCK_IDX_SYNCE3) /*Apache- XGPLL2, QAX/QUX-PMHPLL */
   1653 #define TDPLL_OUTPUT_CLOCK_SYNCE3_PLL_ENABLED(x) ((x) & TDPLL_OUTPUT_CLOCK_MASK_SYNCE3_PLL) /*Apache- XGPLL2, QAX/QUX-PMHPLL */
   1654 
   1655 #define TDPLL_OUTPUT_CLOCK_MASK_SYNCE_XGPLL3 (1<<TDPLL_OUTPUT_CLOCK_IDX_XGPLL3)
   1656 #define TDPLL_OUTPUT_CLOCK_SYNCE_XGPLL3_ENABLED(x) ((x) & TDPLL_OUTPUT_CLOCK_MASK_SYNCE_XGPLL3)
   1657 
   1658 #define TDPLL_DPLL_INSTANCE_NUM_MAX (BCM_TDPLL_DPLL_INSTANCE_NUM_MAX)
   1659 
   1660 #if !defined(BCM_TDPLL_FREQUENCY)
   1661 #define BCM_TDPLL_FREQUENCY (100)
   1662 #endif /* !defined(BCM_TDPLL_FREQUENCY) */
   1663 
   1664 typedef struct bcm_tdpll_dpll_instance_data_s {
   1665     bcm_tdpll_dpll_instance_t dpll_instance[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1666 } bcm_tdpll_dpll_instance_data_t;
   1667 
   1668 typedef struct bcm_tdpll_input_clock_monitor_options_s {
   1669     uint32 interval;
   1670 
   1671     uint32 soft_warn_threshold_ppb;
   1672     uint32 hard_accept_threshold_ppb;
   1673     uint32 hard_reject_threshold_ppb;
   1674 } bcm_tdpll_input_clock_monitor_options_t;
   1675 
   1676 typedef struct bcm_tdpll_input_clock_selector_options_s {
   1677     int ql_enabled[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1678 } bcm_tdpll_input_clock_selector_options_t;
   1679 
   1680 typedef struct bcm_tdpll_input_clock_switching_options_s {
   1681     int revertive[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1682 } bcm_tdpll_input_clock_switching_options_t;
   1683 
   1684 typedef struct bcm_tdpll_input_clock_selector_state_s {
   1685     int prior_selected_clock[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1686     int selected_clock[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1687     int reference_clock[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1688 } bcm_tdpll_input_clock_selector_state_t;
   1689 
   1690 typedef struct bcm_tdpll_input_clock_data_s {
   1691     int prescreen_valid[TDPLL_INPUT_CLOCK_NUM_MAX];
   1692     bcm_tdpll_input_clock_t input_clock[TDPLL_INPUT_CLOCK_NUM_MAX];
   1693     int phy_port[TDPLL_INPUT_CLOCK_NUM_MAX];
   1694     bcm_tdpll_input_clock_monitor_options_t monitor_options;
   1695     bcm_tdpll_input_clock_selector_options_t selector_options;
   1696     bcm_tdpll_input_clock_switching_options_t switching_options;
   1697 
   1698     bcm_tdpll_input_clock_selector_state_t selector_state;
   1699 
   1700     bcm_tdpll_input_clock_monitor_cb monitor_callback;
   1701     bcm_tdpll_input_clock_selector_cb selector_callback;
   1702 
   1703     bcm_tdpll_input_clock_cb callback[bcmTdpllCallbackTypeNotification+1];
   1704 
   1705 } bcm_tdpll_input_clock_data_t;
   1706 
   1707 typedef struct bcm_tdpll_output_clock_data_s {
   1708     bcm_tdpll_output_clock_t output_clock[TDPLL_OUTPUT_CLOCK_NUM_MAX];
   1709 } bcm_tdpll_output_clock_data_t;
   1710 
   1711 typedef struct bcm_tdpll_esmc_data_s {
   1712     int rx_enable;
   1713     int tx_enable[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1714 
   1715     bcm_pbmp_t rx_pbmp[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1716     bcm_pbmp_t tx_pbmp[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1717 
   1718     bcm_esmc_pdu_data_t pdu_data[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1719 
   1720     bcm_esmc_network_option_t network_option;
   1721     bcm_esmc_quality_level_t holdover_ql[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1722     uint8 holdover_ssm_code[TDPLL_DPLL_INSTANCE_NUM_MAX];
   1723     bcm_tdpll_input_clock_ql_change_cb ql_change_callback;
   1724 } bcm_tdpll_esmc_data_t;
   1725 
   1726 extern int _bcm_ptp_external_stack_create(
   1727     int unit, 
   1728     bcm_ptp_stack_info_t *info,
   1729     bcm_ptp_stack_id_t ptp_id);
   1730 
   1731 extern int _bcm_ptp_internal_stack_create(
   1732     int unit, 
   1733     bcm_ptp_stack_info_t *info,
   1734     bcm_ptp_stack_id_t ptp_id);
   1735 
   1736 extern int _bcm_ptp_stack_shutdown(
   1737     int unit,
   1738     bcm_ptp_stack_id_t ptp_id);
   1739 
   1740 extern int _bcm_ptp_stack_cleanup(
   1741     int unit,
   1742     bcm_ptp_stack_id_t ptp_id);
   1743 
   1744 extern int _bcm_ptp_internal_stack_shutdown(
   1745     int unit,
   1746     bcm_ptp_stack_id_t ptp_id);
   1747 
   1748 extern int _bcm_ptp_internal_stack_cleanup(
   1749     int unit,
   1750     bcm_ptp_stack_id_t ptp_id);
   1751 
   1752 extern int _bcm_ptp_ext_stack_fault_status_get(
   1753     int pci_idx,
   1754     uint32 *boot_status,
   1755     uint32 *fault_status);
   1756 
   1757 extern int _bcm_ptp_ext_fw_info_set(
   1758     int unit,
   1759     bcm_ptp_stack_id_t ptp_id,
   1760     uint8 *msg);
   1761 
   1762 extern int _bcm_ptp_ext_fw_info_get(
   1763     int unit,
   1764     bcm_ptp_stack_id_t ptp_id,
   1765     _bcm_ptp_ext_fw_info_t *info);
   1766 
   1767 #if defined(BCM_PTP_INTERNAL_STACK_SUPPORT)
   1768 extern int _bcm_ptp_stack_deinit_callback(
   1769     int unit,
   1770     int uC,
   1771     soc_cmic_uc_shutdown_stage_t stage,
   1772     void *user_data);
   1773 #endif /* BCM_PTP_INTERNAL_STACK_SUPPORT */
   1774 
   1775 extern int
   1776 _bcm_ptp_clock_cache_init(
   1777     int unit);
   1778 
   1779 extern int
   1780 _bcm_ptp_clock_cache_detach(
   1781     int unit);
   1782 
   1783 extern int
   1784 _bcm_ptp_clock_cache_stack_create(
   1785     int unit,
   1786     bcm_ptp_stack_id_t ptp_id);
   1787 
   1788 extern int
   1789 _bcm_ptp_clock_cache_stack_destroy(
   1790     int unit,
   1791     bcm_ptp_stack_id_t ptp_id);
   1792 
   1793 extern int
   1794 _bcm_ptp_clock_cache_info_create(
   1795     int unit,
   1796     bcm_ptp_stack_id_t ptp_id,
   1797     int clock_num);
   1798 
   1799 extern int _bcm_ptp_clock_cache_info_get(
   1800     int unit, 
   1801     bcm_ptp_stack_id_t ptp_id,
   1802     int clock_num,
   1803     bcm_ptp_clock_info_t *clock_info);
   1804 
   1805 extern int _bcm_ptp_clock_cache_info_set(
   1806     int unit, 
   1807     bcm_ptp_stack_id_t ptp_id,
   1808     int clock_num,
   1809     const bcm_ptp_clock_info_t *clock_info);
   1810 
   1811 extern int _bcm_ptp_clock_cache_signal_get(
   1812     int unit, 
   1813     bcm_ptp_stack_id_t ptp_id,
   1814     int clock_num,
   1815     int signal_num,
   1816     bcm_ptp_signal_output_t *signal);
   1817 
   1818 extern int _bcm_ptp_clock_cache_signal_set(
   1819     int unit, 
   1820     bcm_ptp_stack_id_t ptp_id,
   1821     int clock_num,
   1822     int signal_num,
   1823     const bcm_ptp_signal_output_t *signal);
   1824 
   1825 extern int _bcm_ptp_clock_cache_tod_input_get(
   1826     int unit,
   1827     bcm_ptp_stack_id_t ptp_id,
   1828     int clock_num,
   1829     int tod_input_num,
   1830     bcm_ptp_tod_input_t *tod_input);
   1831 
   1832 extern int _bcm_ptp_clock_cache_tod_input_set(
   1833     int unit,
   1834     bcm_ptp_stack_id_t ptp_id,
   1835     int clock_num,
   1836     int tod_input_num,
   1837     const bcm_ptp_tod_input_t *tod_input);
   1838 
   1839 extern int _bcm_ptp_clock_cache_tod_output_get(
   1840     int unit,
   1841     bcm_ptp_stack_id_t ptp_id,
   1842     int clock_num,
   1843     int tod_output_num,
   1844     bcm_ptp_tod_output_t *tod_output);
   1845 
   1846 extern int _bcm_ptp_clock_cache_tod_output_set(
   1847     int unit,
   1848     bcm_ptp_stack_id_t ptp_id,
   1849     int clock_num,
   1850     int tod_output_num,
   1851     const bcm_ptp_tod_output_t *tod_output);
   1852 
   1853 extern int _bcm_ptp_clock_port_cache_info_get(
   1854     int unit, 
   1855     bcm_ptp_stack_id_t ptp_id,
   1856     int clock_num,
   1857     uint32 clock_port,
   1858     bcm_ptp_clock_port_info_t *port_info);
   1859 
   1860 extern int _bcm_ptp_clock_port_cache_info_set(
   1861     int unit, 
   1862     bcm_ptp_stack_id_t ptp_id,
   1863     int clock_num,
   1864     uint32 clock_port,
   1865     const bcm_ptp_clock_port_info_t *port_info);
   1866 
   1867 extern int _bcm_ptp_clock_cache_port_state_get(
   1868     int unit,
   1869     bcm_ptp_stack_id_t ptp_id,
   1870     int clock_num,
   1871     uint32 clock_port,
   1872     _bcm_ptp_port_state_t *portState);
   1873 
   1874 extern int _bcm_ptp_clock_cache_port_state_set(
   1875     int unit,
   1876     bcm_ptp_stack_id_t ptp_id,
   1877     int clock_num,
   1878     uint32 clock_port,
   1879     const _bcm_ptp_port_state_t portState);
   1880 
   1881 extern int _bcm_ptp_rx_init(
   1882     int unit);
   1883 
   1884 extern int _bcm_ptp_rx_detach(
   1885     int unit);
   1886 
   1887 extern int _bcm_ptp_rx_stack_create(
   1888     int unit,
   1889     bcm_ptp_stack_id_t ptp_id,
   1890     bcm_mac_t *host_mac,
   1891     bcm_mac_t *top_mac,
   1892     int tpid,
   1893     int vlan);
   1894 
   1895 extern int _bcm_ptp_rx_stack_destroy(
   1896     int unit,
   1897     bcm_ptp_stack_id_t ptp_id);
   1898 
   1899 extern int _bcm_ptp_rx_clock_create(
   1900     int unit,
   1901     bcm_ptp_stack_id_t ptp_id,
   1902     int clock_num);
   1903 
   1904 extern int _bcm_ptp_rx_clock_destroy(
   1905     int unit,
   1906     bcm_ptp_stack_id_t ptp_id,
   1907     int clock_num);
   1908 
   1909 extern int _bcm_ptp_rx_response_get(
   1910     int unit,
   1911     bcm_ptp_stack_id_t ptp_id,
   1912     int clock_num,
   1913     int usec,
   1914     uint8 **data,
   1915     int *data_len);
   1916 
   1917 extern int _bcm_ptp_external_rx_response_free(
   1918     int unit,
   1919     int ptp_id,
   1920     uint8 *resp_data);
   1921 
   1922 extern int _bcm_ptp_internal_rx_response_free(
   1923     int unit,
   1924     int ptp_id,
   1925     uint8 *resp_data);
   1926 
   1927 extern int _bcm_ptp_rx_response_flush(
   1928     int unit,
   1929     bcm_ptp_stack_id_t ptp_id, 
   1930     int clock_num);
   1931 
   1932 extern int _bcm_ptp_management_init(
   1933     int unit);
   1934 
   1935 extern int _bcm_ptp_management_detach(
   1936     int unit);
   1937 
   1938 extern int _bcm_ptp_management_stack_create(
   1939     int unit, 
   1940     bcm_ptp_stack_id_t ptp_id,
   1941     bcm_mac_t *src_mac,
   1942     bcm_mac_t *dest_mac,
   1943     bcm_ip_t src_ip,
   1944     bcm_ip_t dest_ip,
   1945     uint16 vlan,
   1946     uint8 prio,
   1947     bcm_pbmp_t top_bitmap);
   1948 
   1949 extern int _bcm_ptp_management_stack_destroy(
   1950     int unit, 
   1951     bcm_ptp_stack_id_t ptp_id);
   1952 
   1953 extern int _bcm_ptp_management_clock_create(
   1954     int unit, 
   1955     bcm_ptp_stack_id_t ptp_id,
   1956     int clock_num);
   1957 
   1958 extern int _bcm_ptp_management_message_send(
   1959     int unit, 
   1960     bcm_ptp_stack_id_t ptp_id, 
   1961     int clock_num, 
   1962     const bcm_ptp_port_identity_t* dest_clock_port, 
   1963     uint8 action,
   1964     uint16 cmd, 
   1965     uint8* payload, 
   1966     int payload_len,
   1967     uint8* resp, 
   1968     int* resp_len);
   1969 
   1970 extern int _bcm_ptp_unicast_slave_subscribe(
   1971     int unit, 
   1972     bcm_ptp_stack_id_t ptp_id, 
   1973     int clock_num, 
   1974     uint32 clock_port, 
   1975     _bcm_ptp_clock_peer_ext_t *slave_info,
   1976     bcm_ptp_message_type_t msg_type,
   1977     bcm_ptp_tlv_type_t tlv_type,
   1978     int interval);
   1979 
   1980 extern int _bcm_ptp_management_domain_get(
   1981     int unit, 
   1982     bcm_ptp_stack_id_t ptp_id,
   1983     int clock_num,
   1984     uint8 *domain);
   1985 
   1986 
   1987 extern int _bcm_ptp_management_domain_set(
   1988     int unit, 
   1989     bcm_ptp_stack_id_t ptp_id,
   1990     int clock_num,
   1991     uint8 domain);
   1992 
   1993 extern int _bcm_ptp_management_message_domain_get(
   1994 	uint8 *message, 
   1995 	uint8 *domain);
   1996 
   1997 extern int _bcm_ptp_management_message_domain_set(
   1998 	uint8 *message, 
   1999 	uint8 domain);
   2000 
   2001 extern int _bcm_ptp_tunnel_message_to_top(
   2002     int unit, 
   2003     bcm_ptp_stack_id_t ptp_id, 
   2004     int clock_index,
   2005     int port_index,
   2006     unsigned payload_len,
   2007     uint8 *payload,
   2008     int async);
   2009 
   2010 extern int _bcm_ptp_tunnel_message_to_world(
   2011     int unit, 
   2012     bcm_ptp_stack_id_t ptp_id, 
   2013     int clock_index,
   2014     unsigned payload_len,
   2015     uint8 *payload,
   2016     int async);
   2017 
   2018 extern int _bcm_ptp_timestamp_queue_add(
   2019     int unit, 
   2020     bcm_ptp_stack_id_t ptp_id, 
   2021     int clock_index,
   2022     unsigned payload_len,
   2023     uint8 *payload);
   2024 
   2025 extern int _bcm_ptp_unicast_master_table_init(
   2026     int unit);
   2027 
   2028 extern int _bcm_ptp_unicast_master_table_detach(
   2029     int unit);
   2030 
   2031 extern int _bcm_ptp_unicast_master_table_stack_create(
   2032     int unit,
   2033     bcm_ptp_stack_id_t ptp_id);
   2034 
   2035 extern int _bcm_ptp_unicast_master_table_stack_destroy(
   2036     int unit,
   2037     bcm_ptp_stack_id_t ptp_id);
   2038 
   2039 extern int _bcm_ptp_unicast_master_table_clock_create(
   2040     int unit,
   2041     bcm_ptp_stack_id_t ptp_id,
   2042     int clock_num);
   2043 
   2044 extern int _bcm_ptp_unicast_slave_table_init(
   2045     int unit);
   2046 
   2047 extern int _bcm_ptp_unicast_slave_table_detach(
   2048     int unit);
   2049 
   2050 extern int _bcm_ptp_unicast_slave_table_stack_create(
   2051     int unit,
   2052     bcm_ptp_stack_id_t ptp_id);
   2053 
   2054 extern int _bcm_ptp_unicast_slave_table_stack_destroy(
   2055     int unit,
   2056     bcm_ptp_stack_id_t ptp_id);
   2057 
   2058 extern int _bcm_ptp_unicast_slave_table_clock_create(
   2059     int unit,
   2060     bcm_ptp_stack_id_t ptp_id,
   2061     int clock_num);
   2062 
   2063 extern int _bcm_ptp_unicast_slave_table_clock_destroy(
   2064     int unit,
   2065     bcm_ptp_stack_id_t ptp_id,
   2066     int clock_num);
   2067 
   2068 extern int _bcm_ptp_acceptable_master_table_init(
   2069     int unit);
   2070 
   2071 extern int _bcm_ptp_acceptable_master_table_detach(
   2072     int unit);
   2073 
   2074 extern int _bcm_ptp_acceptable_master_table_stack_create(
   2075     int unit,
   2076     bcm_ptp_stack_id_t ptp_id);
   2077 
   2078 extern int _bcm_ptp_acceptable_master_table_stack_destroy(
   2079     int unit,
   2080     bcm_ptp_stack_id_t ptp_id);
   2081 
   2082 extern int _bcm_ptp_acceptable_master_table_clock_create(
   2083     int unit,
   2084     bcm_ptp_stack_id_t ptp_id,
   2085     int clock_num);
   2086 
   2087 extern int _bcm_ptp_servo_start(
   2088     int unit, 
   2089     bcm_ptp_stack_id_t ptp_id,
   2090     int clock_num);
   2091 
   2092 extern int _bcm_ptp_servo_restart(
   2093     int unit, 
   2094     bcm_ptp_stack_id_t ptp_id,
   2095     int clock_num);
   2096 
   2097 extern int _bcm_ptp_servo_stop(
   2098     int unit, 
   2099     bcm_ptp_stack_id_t ptp_id,
   2100     int clock_num);
   2101 
   2102 extern int _bcm_ptp_servo_ipdv_configuration_get(
   2103     int unit, 
   2104     bcm_ptp_stack_id_t ptp_id,
   2105     int clock_num,
   2106     _bcm_ptp_ipdv_config_t *config);
   2107 
   2108 extern int _bcm_ptp_servo_ipdv_configuration_set(
   2109     int unit, 
   2110     bcm_ptp_stack_id_t ptp_id,
   2111     int clock_num,
   2112     const _bcm_ptp_ipdv_config_t config);
   2113 
   2114 extern int _bcm_ptp_servo_performance_get(
   2115     int unit, 
   2116     bcm_ptp_stack_id_t ptp_id,
   2117     int clock_num,
   2118     _bcm_ptp_servo_performance_t *perf);
   2119 
   2120 extern int _bcm_ptp_servo_ipdv_performance_get(
   2121     int unit, 
   2122     bcm_ptp_stack_id_t ptp_id,
   2123     int clock_num,
   2124     _bcm_ptp_ipdv_performance_t *perf);
   2125     
   2126 extern int _bcm_ptp_servo_performance_data_clear(
   2127     int unit, 
   2128     bcm_ptp_stack_id_t ptp_id,
   2129     int clock_num);
   2130 
   2131 extern int
   2132 _bcm_ptp_servo_type_get(
   2133     uint32 profile_type,
   2134     uint32 *servo);
   2135 
   2136 extern int _bcm_ptp_phase_holdover_get(
   2137     int unit,
   2138     bcm_ptp_stack_id_t ptp_id,
   2139     int clock_num,
   2140     bcm_ptp_phase_holdover_state_t *state);
   2141 
   2142 extern int _bcm_ptp_phase_holdover_set(
   2143     int unit,
   2144     bcm_ptp_stack_id_t ptp_id,
   2145     int clock_num,
   2146     const bcm_ptp_phase_holdover_state_t *state);
   2147 
   2148 extern int _bcm_ptp_freq_corr_get(
   2149     int unit,
   2150     bcm_ptp_stack_id_t ptp_id,
   2151     int clock_num,
   2152     int32 *freq_corr_ppt,
   2153     int32 *offset_freq_ppt);
   2154 
   2155 #ifdef BCM_PTP_EXT_SERVO_SUPPORT
   2156 extern int _bcm_ptp_freq_corr_set(
   2157     int unit,
   2158     bcm_ptp_stack_id_t ptp_id,
   2159     int clock_num,
   2160     double freq_corr_ppb,
   2161     double freq_offset_ppb);
   2162 #else
   2163 extern int _bcm_ptp_freq_corr_set(
   2164     int unit,
   2165     bcm_ptp_stack_id_t ptp_id,
   2166     int clock_num,
   2167     int32 freq_corr_ppt,
   2168     int32 freq_offset_ppt);
   2169 #endif /* BCM_PTP_EXT_SERVO_SUPPORT */
   2170 
   2171 extern int _bcm_ptp_bcm_servo_synce_freq_corr_get_in_combined_mode(
   2172     int unit,
   2173     int stack_id,
   2174     int64* servo_freq_correction_pbb);
   2175 
   2176 extern int _bcm_ptp_telecom_g8265_map_QL_clockClass(
   2177     bcm_ptp_telecom_g8265_quality_level_t QL,
   2178     uint8 *clockClass);
   2179 
   2180 extern int _bcm_ptp_telecom_g8265_map_clockClass_QL(
   2181     uint8 clockClass,
   2182     bcm_ptp_telecom_g8265_quality_level_t *QL);
   2183 
   2184 extern int _bcm_ptp_telecom_g8265_verbose_level_set(
   2185     uint32 flags);
   2186 
   2187 extern int _bcm_ptp_clock_class_set(
   2188     int unit,
   2189     bcm_ptp_stack_id_t ptp_id,
   2190     int clock_num,
   2191     uint8 clockClass);
   2192 
   2193 extern int _bcm_ptp_system_log_configure(int unit, bcm_ptp_stack_id_t ptp_id, int clock_num,
   2194     uint32 debug_mask, uint64 udp_log_mask,
   2195     bcm_mac_t src_mac, bcm_mac_t dest_mac,
   2196     uint16 tpid, uint16 vid, uint8 ttl,
   2197     bcm_ip_t src_addr, bcm_ip_t dest_addr,
   2198     uint16 udp_port);
   2199 
   2200 extern int _bcm_ptp_tunnel_arp_set(
   2201     int unit, 
   2202     bcm_ptp_stack_id_t ptp_id,
   2203     uint8 flag);
   2204 
   2205 /* ESMC functions. */
   2206 extern int bcm_esmc_init(
   2207     int unit,
   2208     int stack_id);
   2209 
   2210 extern int bcm_esmc_cleanup(
   2211     int unit,
   2212     int stack_id);
   2213 
   2214 extern int bcm_esmc_rx(
   2215     int unit,
   2216     int stack_id,
   2217     int ingress_port,
   2218     int ethertype,
   2219     int esmc_pdu_len,
   2220     uint8 *esmc_pdu);
   2221 
   2222 extern int bcm_esmc_pdu_port_data_get(
   2223     int unit,
   2224     int stack_id,
   2225     int port_num,
   2226     bcm_esmc_pdu_data_t *pdu_data,
   2227     sal_time_t *timestamp);
   2228 
   2229 /* T-DPLL functions. */
   2230 extern int bcm_tdpll_dpll_instance_init(
   2231     int unit,
   2232     int stack_id);
   2233 
   2234 extern int bcm_tdpll_dpll_instance_cleanup(
   2235     int unit,
   2236     int stack_id);
   2237 
   2238 extern int bcm_tdpll_dpll_reference_set(
   2239     int unit,
   2240     int stack_id,
   2241     int num_dpll,
   2242     int *dpll_ref);
   2243 
   2244 extern int bcm_tdpll_input_clock_init(
   2245     int unit,
   2246     int stack_id);
   2247 
   2248 extern int bcm_tdpll_input_clock_cleanup(
   2249     int unit);
   2250 
   2251 extern int bcm_tdpll_input_clock_port_lookup(
   2252     int unit,
   2253     int stack_id,
   2254     int port_num,
   2255     int *clock_index);
   2256 
   2257 extern int bcm_tdpll_input_clock_mac_lookup(
   2258     int unit,
   2259     int stack_id,
   2260     bcm_mac_t *mac,
   2261     int *clock_index);
   2262 
   2263 extern int bcm_tdpll_input_clock_reference_mac_get(
   2264     int unit,
   2265     int stack_id,
   2266     int dpll_index,
   2267     bcm_mac_t *mac);
   2268 
   2269 extern int bcm_tdpll_input_clock_dpll_use_get(
   2270     int unit,
   2271     int stack_id,
   2272     int clock_index,
   2273     int dpll_index,
   2274     int *dpll_use);
   2275 
   2276 extern int bcm_tdpll_input_clock_dpll_use_set(
   2277     int unit,
   2278     int stack_id,
   2279     int clock_index,
   2280     int dpll_index,
   2281     int dpll_use);
   2282 
   2283 extern int bcm_tdpll_input_clock_dpll_reference_get(
   2284     int unit,
   2285     int stack_id,
   2286     int dpll_index,
   2287     int *reference);
   2288 
   2289 extern int bcm_tdpll_output_clock_init(
   2290     int unit,
   2291     int stack_id);
   2292 
   2293 extern int bcm_tdpll_output_clock_cleanup(
   2294     int unit,
   2295     int stack_id);
   2296 
   2297 extern int bcm_tdpll_esmc_init(
   2298     int unit,
   2299     int stack_id);
   2300 
   2301 extern int bcm_tdpll_esmc_cleanup(
   2302     int unit,
   2303     int stack_id);
   2304 
   2305 extern int bcm_tdpll_esmc_holdover_event_send(
   2306     int unit,
   2307     int stack_id,
   2308     int dpll_index);
   2309 
   2310 extern int bcm_tdpll_esmc_switch_event_send(
   2311     int unit,
   2312     int stack_id,
   2313     int dpll_index,
   2314     bcm_esmc_quality_level_t ql);
   2315 
   2316 extern int _bcm_ptp_modular_init(
   2317     int unit,
   2318     bcm_ptp_stack_id_t ptp_id,
   2319     int clock_num,
   2320     uint32 flags);
   2321 
   2322 extern int _bcm_ptp_modular_shutdown(
   2323     int unit,
   2324     bcm_ptp_stack_id_t ptp_id,
   2325     int clock_num);
   2326 
   2327 extern int _bcm_ptp_ctdev_init(
   2328     int unit,
   2329     bcm_ptp_stack_id_t ptp_id,
   2330     int clock_num,
   2331     uint32 p);
   2332 
   2333 extern int
   2334 _bcm_ptp_ctdev_gateway(
   2335     int unit,
   2336     bcm_ptp_stack_id_t ptp_id,
   2337     int clock_num,
   2338     int ev_data_len,
   2339     uint8 *ev_data);
   2340 
   2341 extern int _bcm_ptp_ctdev_phase_accumulator(
   2342     int unit,
   2343     bcm_ptp_stack_id_t ptp_id,
   2344     int clock_num,
   2345     const int64 freq_corr_ppt);
   2346 
   2347 extern int _bcm_ptp_ctdev_calculator(
   2348     int unit,
   2349     bcm_ptp_stack_id_t ptp_id,
   2350     int clock_num);
   2351 
   2352 extern int _bcm_ptp_ctdev_get(
   2353     int unit,
   2354     bcm_ptp_stack_id_t ptp_id,
   2355     int clock_num,
   2356     unsigned timescale_sec,
   2357     uint64 *tdev_psec);
   2358 
   2359 extern uint64 _bcm_ptp_llu_div(
   2360     uint64 num,
   2361     uint16 den);
   2362 
   2363 extern uint32 _bcm_ptp_llu_isqrt(
   2364     uint64 x);
   2365 
   2366 extern uint32 _bcm_ptp_xorshift_rand(
   2367     void);
   2368 
   2369 extern uint16 _bcm_ptp_uint16_read(
   2370     uint8* buffer);
   2371 
   2372 extern uint32 _bcm_ptp_uint32_read(
   2373     uint8* buffer);
   2374 
   2375 extern uint64 _bcm_ptp_uint64_read(
   2376     uint8* buffer);
   2377 
   2378 extern int64 _bcm_ptp_int64_read(
   2379     uint8* buffer);
   2380 
   2381 extern int64 _bcm_ptp_uint64_to_int64(
   2382     const uint64 value);
   2383 
   2384 extern uint64 _bcm_ptp_int64_to_uint64(
   2385     const int64 value);
   2386 
   2387 extern void _bcm_ptp_uint16_write(
   2388     uint8* buffer, 
   2389     const uint16 value);
   2390 
   2391 extern void _bcm_ptp_uint32_write(
   2392     uint8* buffer, 
   2393     const uint32 value);
   2394 
   2395 extern void _bcm_ptp_uint64_write(
   2396     uint8* buffer, 
   2397     const uint64 value);
   2398 
   2399 extern void _bcm_ptp_int64_write(
   2400     uint8* buffer, 
   2401     const int64 value);
   2402 
   2403 extern int _bcm_ptp_function_precheck(
   2404     int unit, 
   2405     bcm_ptp_stack_id_t ptp_id, 
   2406     int clock_num, 
   2407     uint32 clock_port);
   2408 
   2409 extern int _bcm_ptp_clock_lookup(
   2410     const bcm_ptp_clock_identity_t clock_identity,
   2411     int unit,
   2412     bcm_ptp_stack_id_t ptp_id,
   2413     int *clock_num);
   2414 
   2415 extern int _bcm_ptp_peer_address_convert(
   2416     bcm_ptp_clock_peer_address_t *peer_addr,
   2417     bcm_ptp_clock_port_address_t *port_addr);
   2418 
   2419 extern int _bcm_ptp_port_address_convert(
   2420      bcm_ptp_clock_port_address_t *port_addr,
   2421      bcm_ptp_clock_peer_address_t *peer_addr);
   2422 
   2423 extern int _bcm_ptp_peer_address_raw_compare(
   2424     const bcm_ptp_clock_peer_address_t *a,
   2425     uint8 *b,
   2426     bcm_ptp_protocol_t protocol);
   2427 
   2428 extern int _bcm_ptp_peer_address_compare(
   2429     const bcm_ptp_clock_peer_address_t *a, 
   2430     const bcm_ptp_clock_peer_address_t *b);
   2431 
   2432 extern int _bcm_ptp_port_address_compare(
   2433     const bcm_ptp_clock_port_address_t *a,
   2434     const bcm_ptp_clock_port_address_t *b);
   2435 
   2436 #ifdef BCM_PTP_EXT_SERVO_SUPPORT
   2437 extern void _bcm_ptp_dump_mbox_tsevent_stats(void);
   2438 
   2439 extern int _bcm_ptp_peer_portid_compare(
   2440     const bcm_ptp_port_identity_t *a, 
   2441     const bcm_ptp_port_identity_t *b);
   2442 
   2443 extern int _bcm_ptp_signaled_unicast_master_index_get(
   2444     int unit,
   2445     bcm_ptp_stack_id_t ptp_id,
   2446     int clock_num,
   2447     bcm_ptp_port_identity_t *portId,
   2448     int *inst_num);
   2449   
   2450 uint32 _bcm_ptp_servo_usecintv_get(int8 log_int);
   2451 
   2452 extern int _bcm_ptp_telecom_g8265_packet_master_best_get(
   2453     int unit,
   2454     bcm_ptp_stack_id_t ptp_id,
   2455     int clock_num,
   2456     bcm_ptp_port_identity_t *      master_portId);
   2457 
   2458 extern void _bcm_ptp_servo_state_notify( int unit, bcm_ptp_stack_id_t ptp_id, int clock_num);
   2459 
   2460 extern int _bcm_ptp_servo_state_set( int unit, bcm_ptp_stack_id_t ptp_id, int clock_num, int servo_state);
   2461 extern int _bcm_ptp_telecom_g8265_packet_master_ptsf_unusable_set(    int unit,    bcm_ptp_stack_id_t ptp_id,
   2462     int clock_num,     bcm_ptp_port_identity_t *      master_portId,    int ptsf_state);
   2463 extern void _bcm_ptp_ext_servo_def_evt_hdlr(int unit, bcm_ptp_stack_id_t ptp_id, int clock_num);
   2464 
   2465 #endif /* BCM_PTP_EXT_SERVO_SUPPORT */
   2466 
   2467 extern void _bcm_ptp_send_event_cb(int, bcm_ptp_stack_id_t, int, uint8 *, uint16);
   2468 
   2469 extern void _bcm_ptp_dump_hex(
   2470     uint8 *buf,
   2471     int len,
   2472     int indent);
   2473 
   2474 #if defined(BCM_PTP_INTERNAL_STACK_SUPPORT)
   2475 extern int _bcm_ptp_check_firmware_exist(
   2476     char* fw_str);
   2477 #endif /* defined(BCM_PTP_INTERNAL_STACK_SUPPORT) */
   2478 /* monotonic time in seconds */
   2479 extern sal_time_t _bcm_ptp_monotonic_time(void);
   2480 
   2481 /* Prototypes for esw functions */
   2482 extern void esw_set_ext_stack_config_uint32(
   2483     _bcm_ptp_stack_info_t *stack_p,
   2484     uint32 offset, uint32 value);
   2485 
   2486 extern void esw_set_ext_stack_config_array(
   2487     _bcm_ptp_stack_info_t* stack_p,
   2488     uint32 offset,
   2489     const uint8 * array,
   2490     int len);
   2491 
   2492 extern uint8 _bcm_ptp_read_pcishared_uint8(
   2493     bcm_ptp_external_stack_info_t *stack_p, 
   2494     uint32 addr);
   2495 
   2496 extern void _bcm_ptp_write_pcishared_uint8(
   2497     bcm_ptp_external_stack_info_t *stack_p,
   2498     uint32 addr, 
   2499     uint8 val);
   2500 
   2501 extern int _bcm_ptp_write_pcishared_uint32(
   2502     void *cookie,
   2503     uint32 addr,
   2504     uint32 val);
   2505 
   2506 extern int _bcm_ptp_read_pcishared_uint32(
   2507     void *cookie,
   2508     uint32 addr,
   2509     uint32 *val);
   2510 
   2511 extern void _bcm_ptp_write_pcishared_uint8_aligned_array(
   2512     int pci_idx,
   2513     uint32 addr,
   2514     uint8 * array,
   2515     int array_len);
   2516 
   2517 extern int _bcm_ptp_rcpu_configuration_set(
   2518     int unit,
   2519     bcm_ptp_stack_id_t ptp_id,
   2520     uint16 rcpu_ethertype,
   2521     uint16 rcpu_signature,
   2522     uint16 rcpu_tpid,
   2523     uint16 rcpu_vlan,
   2524     int top_port,
   2525     uint16 rcpu_reflected_ethertype,
   2526     bcm_mac_t switch_mac);
   2527 
   2528 int _bcm_ptp_ext_stack_reset(int pci_idx);
   2529 int _bcm_ptp_ext_stack_start(int pci_idx);
   2530 
   2531 int _bcm_ptp_ext_stack_processor_status_get(
   2532     int pci_idx,
   2533     _bcm_ptp_ext_stack_processor_info_t *info);
   2534 
   2535 int _bcm_ptp_ext_stack_system_status_get(
   2536     int pci_idx,
   2537     _bcm_ptp_ext_stack_processor_info_t *info);
   2538 
   2539 int _bcm_ptp_ext_stack_task_status_get(
   2540     int pci_idx,
   2541     _bcm_ptp_ext_stack_processor_info_t *info);
   2542 
   2543 int _bcm_ptp_ext_stack_fault_information_get(
   2544     int pci_idx,
   2545     int max_size,
   2546     uint8 *fault_info,
   2547     int *fault_info_size);
   2548 
   2549 extern int _bcm_ptp_set_max_unicast_masters(
   2550     int unit,
   2551     bcm_ptp_stack_id_t ptp_id,
   2552     int max_masters);
   2553 
   2554 extern int _bcm_ptp_set_max_acceptable_masters(
   2555     int unit,
   2556     bcm_ptp_stack_id_t ptp_id,
   2557     int max_masters);
   2558 
   2559 extern int _bcm_ptp_set_max_unicast_slaves(
   2560     int unit,
   2561     bcm_ptp_stack_id_t ptp_id,
   2562     int max_slaves);
   2563 
   2564 extern int _bcm_ptp_set_max_multicast_slave_stats(
   2565     int unit,
   2566     bcm_ptp_stack_id_t ptp_id,
   2567     int max_entries);
   2568 
   2569 
   2570 extern int _bcm_ptp_register_management_callback(
   2571     int unit, 
   2572     bcm_ptp_cb cb, 
   2573     void *user_data);
   2574 
   2575 extern int _bcm_ptp_register_event_callback(
   2576     int unit, 
   2577     bcm_ptp_cb cb, 
   2578     void *user_data);
   2579 
   2580 extern int _bcm_ptp_register_peers_callback(
   2581     int unit, 
   2582     bcm_ptp_cb cb, 
   2583     void *user_data);
   2584 
   2585 extern int _bcm_ptp_register_fault_callback(
   2586     int unit, 
   2587     bcm_ptp_cb cb, 
   2588     void *user_data);
   2589 
   2590 extern int _bcm_ptp_register_signal_callback(
   2591     int unit, 
   2592     bcm_ptp_cb cb, 
   2593     void *user_data);
   2594 
   2595 extern int _bcm_ptp_register_signaling_arbiter(
   2596     int unit, 
   2597     bcm_ptp_signaling_arbiter_t arb,
   2598     void *user_data);
   2599 
   2600 extern int _bcm_ptp_unregister_management_callback(
   2601     int unit);
   2602 
   2603 extern int _bcm_ptp_unregister_event_callback(
   2604     int unit);
   2605 
   2606 extern int _bcm_ptp_unregister_peers_callback(
   2607     int unit);
   2608 
   2609 extern int _bcm_ptp_unregister_fault_callback(
   2610     int unit);
   2611 
   2612 extern int _bcm_ptp_unregister_signal_callback(
   2613     int unit);
   2614 
   2615 extern int _bcm_ptp_unregister_signaling_arbiter(
   2616     int unit);
   2617 
   2618 /* external-specific transport functions */
   2619 extern _bcm_ptp_transport_init_t _bcm_ptp_external_transport_init;
   2620 extern _bcm_ptp_transport_tx_t _bcm_ptp_external_tx;
   2621 extern _bcm_ptp_transport_tx_completion_t _bcm_ptp_external_tx_completion;
   2622 extern _bcm_ptp_transport_terminate_t _bcm_ptp_external_transport_terminate;
   2623 
   2624 /* internal-specific transport functions */
   2625 extern _bcm_ptp_transport_init_t _bcm_ptp_internal_transport_init;
   2626 extern _bcm_ptp_transport_tx_t _bcm_ptp_internal_tx;
   2627 extern _bcm_ptp_transport_tx_completion_t _bcm_ptp_internal_tx_completion;
   2628 extern _bcm_ptp_transport_terminate_t _bcm_ptp_internal_transport_terminate;
   2629 
   2630 extern int _bcm_ptp_tunnel_queue_init(int unit, bcm_ptp_stack_id_t ptp_id);
   2631 extern int _bcm_ptp_tunnel_queue_cleanup(int unit, bcm_ptp_stack_id_t ptp_id);
   2632 
   2633 extern int _bcm_ptp_timestamp_queue_init(int unit, bcm_ptp_stack_id_t ptp_id);
   2634 extern int _bcm_ptp_timestamp_queue_cleanup(int unit, bcm_ptp_stack_id_t ptp_id);
   2635 
   2636 /* internal-specific signaling functions */
   2637 
   2638 extern int _bcm_ptp_signaling_init( int unit, bcm_ptp_stack_id_t ptp_id);
   2639 extern int _bcm_ptp_signaling_cleanup( int unit, bcm_ptp_stack_id_t ptp_id);
   2640 extern int _bcm_ptp_signaling_manager(int unit, bcm_ptp_stack_id_t ptp_id,
   2641     int clock_num, int en_telecom);
   2642 
   2643 extern int _bcm_ptp_signaled_unicast_master_table_reset(int unit, bcm_ptp_stack_id_t ptp_id);
   2644 extern int _bcm_ptp_signaled_unicast_master_table_search(int unit, bcm_ptp_stack_id_t ptp_id, int port_num,
   2645                                                                 const bcm_ptp_clock_peer_address_t *addr);
   2646 extern int _bcm_ptp_signaled_unicast_slave_table_reset(int unit, bcm_ptp_stack_id_t ptp_id);
   2647 extern int _bcm_ptp_unicast_slave_host_reset(int unit, bcm_ptp_stack_id_t ptp_id, int clock_num, int port_num);
   2648 extern int _bcm_ptp_unicast_slave_stack_restore(int unit, bcm_ptp_stack_id_t ptp_id, int clock_num, int port_num);
   2649 
   2650 extern int _bcm_ptp_construct_signaling_msg(bcm_ptp_port_identity_t *from_port,
   2651                                             bcm_ptp_clock_identity_t to_clock,
   2652                                             uint16 to_port, int domain, uint16 sequenceId,
   2653                                             uint8* tlv_payload, int tlv_payload_len,
   2654                                             uint8* udp_payload, int *udp_payload_len);
   2655 
   2656 extern int _bcm_ptp_construct_signaling_request_tlv(int type, int interval, unsigned duration,
   2657                                                     uint8* tlv_payload, int *tlv_payload_len);
   2658 
   2659 extern int _bcm_ptp_construct_udp_packet(bcm_ptp_clock_peer_t *peer, bcm_ptp_clock_port_address_t *local_port,
   2660                                          uint8* udp_payload, int udp_payload_len, uint8* packet, int *packet_len,
   2661                                          uint8 ip_dscp, uint8 ttl);
   2662 
   2663 extern int _bcm_ptp_construct_signaling_cancel_tlv(int type, uint8* tlv_payload, int *tlv_payload_len);
   2664 extern int _bcm_ptp_construct_signaling_ack_cancel_tlv(int type, uint8* tlv_payload, int *tlv_payload_len);
   2665 extern int _bcm_ptp_construct_signaling_grant_tlv(int type, int interval, unsigned duration, int invite_renewal,
   2666                                                   uint8* tlv_payload, int *tlv_payload_len);
   2667 
   2668 extern int _bcm_ptp_signaling_message_append_tlv(uint8 *msg, int *msgLength,
   2669     uint8 *tlv, int tlvLength);
   2670 
   2671 extern int _bcm_ptp_append_tlv_to_grant_unicast_tx(bcm_ptp_tlv_type_t input_tlv_type, uint8* input_payload, int input_len,
   2672     uint8* tlv_payload, int *tlv_payload_len);
   2673 
   2674 extern bcm_ptp_callback_t _bcm_ptp_process_incoming_signaling_msg(
   2675     int unit, bcm_ptp_stack_id_t ptp_id, int clock_num, int port_num, bcm_ptp_protocol_t protocol,
   2676     int src_addr_offset, int ptp_msg_offset, unsigned data_length, uint8* data);
   2677 
   2678 /* For use by diag shell */
   2679 extern _bcm_ptp_unit_cache_t _bcm_common_ptp_unit_array[BCM_MAX_NUM_UNITS];
   2680 
   2681 /* For use by diag shell */
   2682 extern int _bcm_common_ptp_log_level_set(int unit, bcm_ptp_stack_id_t ptp_id, 
   2683                 int clock_num, uint32 level);
   2684 
   2685 /* For use by diag shell */
   2686 extern int _bcm_common_ptp_input_channels_status_get(int unit,
   2687                 bcm_ptp_stack_id_t ptp_id, int clock_num,
   2688                 int *num_chan, _bcm_ptp_channel_status_t *chan_status);
   2689 
   2690 /* For use by diag shell */
   2691 extern int _bcm_ptp_show_system_info(int unit,
   2692                 bcm_ptp_stack_id_t ptp_id,
   2693                 int clock_num);
   2694 
   2695 /* For use by diag shell */
   2696 typedef struct _bcm_ptp_clock_description_s {
   2697     uint16 size;
   2698     uint8  *data;
   2699 } _bcm_ptp_clock_description_t;
   2700 
   2701 extern int _bcm_ptp_clock_description_get(int unit, 
   2702                                    bcm_ptp_stack_id_t ptp_id,
   2703                                    int clock_num, 
   2704                                    int port_num, 
   2705                                    _bcm_ptp_clock_description_t *description);
   2706 
   2707 extern int _bcm_ptp_update_peer_counts(
   2708     int unit, bcm_ptp_stack_id_t ptp_id, int clock_num,
   2709     uint16 localPortNum, bcm_ptp_clock_identity_t *clockID,
   2710     bcm_ptp_clock_port_address_t *port_addr, int isMaster,
   2711     unsigned announces, unsigned syncs, unsigned followups, unsigned delayreqs,
   2712     unsigned delayresps, unsigned mgmts, unsigned signals, unsigned rejected,
   2713     bcm_gport_t *phy_port);
   2714 
   2715 extern int _bcm_ptp_update_peer_dataset(int unit, bcm_ptp_stack_id_t ptp_id, int clock_num, int port_num);
   2716 
   2717 extern int _bcm_ptp_port_address_cmp(bcm_ptp_clock_port_address_t *a, bcm_ptp_clock_port_address_t *b);
   2718 extern int _bcm_ptp_is_clockid_null(bcm_ptp_clock_identity_t clockID);
   2719 
   2720 /* Diag-shell reference C-TDEV alarm function. */
   2721 extern uint32
   2722 _bcm_ptp_ctdev_g823_mask(
   2723     int tau);
   2724 
   2725 /* For use protecting us from sal syncronization function issues */
   2726 
   2727 typedef sal_mutex_t _bcm_ptp_mutex_t;
   2728 
   2729 _bcm_ptp_mutex_t _bcm_ptp_mutex_create(char *desc);
   2730 void _bcm_ptp_mutex_destroy(_bcm_ptp_mutex_t m);
   2731 int _bcm_ptp_mutex_take(_bcm_ptp_mutex_t m, int usec);
   2732 int _bcm_ptp_mutex_give(_bcm_ptp_mutex_t m);
   2733 
   2734 typedef sal_sem_t _bcm_ptp_sem_t;
   2735 
   2736 _bcm_ptp_sem_t _bcm_ptp_sem_create(char *desc, int binary, int initial_count);
   2737 void _bcm_ptp_sem_destroy(_bcm_ptp_sem_t b);
   2738 int _bcm_ptp_sem_take(_bcm_ptp_sem_t b, int usec);
   2739 int _bcm_ptp_sem_give(_bcm_ptp_sem_t b);
   2740 
   2741 /* For use by diag shell, to register ARP handler if no other L3 handling is in place: */
   2742 extern void (*_bcm_ptp_arp_callback)(int unit, bcm_ptp_stack_id_t ptp_id, int protocol, int l3_offset, int payload_offset, int msg_len, uint8 *msg);
   2743 
   2744 void ptp_printf(const char *, ...)
   2745 #if defined(__GNUC__) || defined(__GNUG__)
   2746     __attribute__ ((format (printf, 1, 2)))
   2747 #endif
   2748     ;
   2749 
   2750 extern int _bcm_ptp_addr_len(int addr_type);
   2751 extern int _bcm_ptp_running(int unit);
   2752 
   2753 /* PHY synchronization state to maintain proper PHY timestamps */
   2754 typedef enum _bcm_ptp_physync_state_e {
   2755     _bcm_ptp_physync_state_init         = 0,
   2756     _bcm_ptp_physync_state_required     = 1, /* FW-initiated state change: PHY synchronization is required. */
   2757     _bcm_ptp_physync_state_pending      = 2, /* Host-initiated state change: PHY synchronization is pending. */
   2758     _bcm_ptp_physync_state_synchronized = 3  /* FW-initiated state change: PHYs are synchronized. */
   2759 } _bcm_ptp_physync_state_t;
   2760 
   2761 
   2762 /*APTS structures*/
   2763 
   2764 #define BCM_PTP_APTS_SYNCE_SOURCE_ID    0
   2765 #define BCM_PTP_APTS_GPS_SOURCE_ID      1
   2766 #define BCM_PTP_APTS_PTP_SOURCE_ID      2
   2767 
   2768 /* Enumeration of current time source availability */
   2769 typedef enum _bcm_ptp_apts_source_avail_e {
   2770     _bcm_ptp_apts_avail_none = 0x0,
   2771     _bcm_ptp_apts_avail_synce = 0x1,
   2772     _bcm_ptp_apts_avail_gps = 0x2,
   2773     _bcm_ptp_apts_avail_gps_synce = 0x3,
   2774     _bcm_ptp_apts_avail_ptp = 0x4,
   2775     _bcm_ptp_apts_avail_ptp_synce = 0x5,
   2776     _bcm_ptp_apts_avail_ptp_gps = 0x6,
   2777     _bcm_ptp_apts_avail_ptp_gps_synce = 0x7
   2778 } _bcm_ptp_apts_source_avail_t;
   2779 
   2780 extern int g_apts_enabled;
   2781 extern bcm_ptp_clock_apts_mode_t g_apts_current_op_mode;
   2782 extern _bcm_ptp_apts_source_avail_t g_apts_current_source_state;
   2783 extern bcm_ptp_clock_apts_source_t g_apts_usr_cfgd_source_state;
   2784 extern int g_apts_gps_offset;
   2785 extern bcm_ptp_port_identity_t g_gps_port_id;
   2786 extern bcm_ptp_port_identity_t g_ptp_best_master_portId;
   2787 
   2788 extern void _bcm_ptp_apts_update_current_mode(void);
   2789 
   2790 /* current datset offset from master scale factor as per 1588v2 std.*/
   2791 #define PTP_CURRENT_DATASET_OFFSET_FROM_MASTER_SCALEFACTOR      65536
   2792 
   2793 
   2794 #endif /* INCLUDE_PTP */
   2795 #endif /* !__BCM_INT_PTP_H__ */