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 (103405B)


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