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

tc_config.c (8253B)


      1 /*
      2  * 
      3  * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file.
      4  * 
      5  * Copyright 2007-2019 Broadcom Inc. All rights reserved.
      6  *
      7  * File:    tc_config.c
      8  *
      9  * Purpose: 
     10  *
     11  * Functions:
     12  *      bcm_common_ptp_primary_domain_get
     13  *      bcm_common_ptp_primary_domain_set
     14  *      bcm_common_ptp_transparent_clock_default_dataset_get
     15  *      bcm_common_ptp_transparent_clock_port_dataset_get
     16  */
     17 
     18 #if defined(INCLUDE_PTP)
     19 
     20 #include <soc/defs.h>
     21 #include <soc/drv.h>
     22 
     23 #include <bcm/ptp.h>
     24 #include <bcm_int/common/ptp.h>
     25 #include <bcm_int/ptp_common.h>
     26 #include <bcm/error.h>
     27 
     28 /*
     29  * Function:
     30  *      bcm_common_ptp_primary_domain_get
     31  * Purpose:
     32  *      Get primary domain member of a PTP transparent clock default dataset.
     33  * Parameters:
     34  *      unit           - (IN)  Unit number.
     35  *      ptp_id         - (IN)  PTP stack ID.
     36  *      clock_num      - (IN)  PTP clock number.
     37  *      primary_domain - (OUT) PTP transparent clock primary domain.
     38  * Returns:
     39  *      BCM_E_XXX
     40  * Notes:
     41  *      Ref. IEEE Std. 1588-2008, Chapters 8.3.2 and 15.5.3.9.1.
     42  */
     43 int 
     44 bcm_common_ptp_primary_domain_get(
     45     int unit, 
     46     bcm_ptp_stack_id_t ptp_id, 
     47     int clock_num, 
     48     int *primary_domain)
     49 {
     50     int rv = BCM_E_UNAVAIL;
     51     
     52     uint8 resp[PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS];
     53     int resp_len = PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS; 
     54 
     55     bcm_ptp_port_identity_t portid;     
     56     
     57     if (BCM_FAILURE(rv = _bcm_ptp_function_precheck(unit, ptp_id, clock_num,
     58             PTP_CLOCK_PORT_NUMBER_DEFAULT)))
     59     {
     60         return rv;   
     61     }
     62         
     63     if (BCM_FAILURE(rv = bcm_common_ptp_clock_port_identity_get(unit, ptp_id, 
     64             clock_num, PTP_IEEE1588_ALL_PORTS, &portid)))
     65     {
     66         return rv;
     67     }
     68 
     69     rv = _bcm_ptp_management_message_send(unit, ptp_id, clock_num, &portid, 
     70             PTP_MGMTMSG_GET, PTP_MGMTMSG_ID_PRIMARY_DOMAIN, 
     71             0, 0, resp, &resp_len);
     72 
     73     if (rv == BCM_E_NONE) 
     74     {
     75         /* 
     76          * Parse response.
     77          *    Octet 0 : Primary domain.
     78          *    Octet 1 : Reserved.
     79          */
     80         *primary_domain = (int8)resp[0];
     81     }
     82     
     83     return rv;
     84 }
     85 
     86 /*
     87  * Function:
     88  *       bcm_common_ptp_primary_domain_set
     89  * Purpose:
     90  *      Set primary domain member of a PTP transparent clock default dataset.
     91  * Parameters:
     92  *      unit           - (IN) Unit number.
     93  *      ptp_id         - (IN) PTP stack ID.
     94  *      clock_num      - (IN) PTP clock number.
     95  *      primary_domain - (IN) PTP transparent clock primary domain.
     96  * Returns:
     97  *      BCM_E_XXX
     98  * Notes:
     99  *      Ref. IEEE Std. 1588-2008, Chapters 8.3.2 and 15.5.3.9.1.
    100  */
    101 int 
    102 bcm_common_ptp_primary_domain_set(
    103     int unit, 
    104     bcm_ptp_stack_id_t ptp_id, 
    105     int clock_num, 
    106     int primary_domain)
    107 {
    108     int rv = BCM_E_UNAVAIL;
    109     
    110     uint8 payload[PTP_MGMTMSG_PAYLOAD_MIN_SIZE_OCTETS] = {0};
    111     uint8 resp[PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS];
    112     int resp_len = PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS; 
    113 
    114     bcm_ptp_port_identity_t portid;     
    115     
    116     if (BCM_FAILURE(rv = _bcm_ptp_function_precheck(unit, ptp_id, clock_num,
    117             PTP_CLOCK_PORT_NUMBER_DEFAULT)))
    118     {
    119         return rv;   
    120     }
    121           
    122     if (BCM_FAILURE(rv = bcm_common_ptp_clock_port_identity_get(unit, ptp_id, 
    123             clock_num, PTP_IEEE1588_ALL_PORTS, &portid)))
    124     {
    125         return rv;
    126     }
    127 
    128     /* 
    129      * Make payload.
    130      *    Octet 0 : Primary domain.
    131      *    Octet 1 : Reserved.
    132      */
    133     payload[0] = (uint8)primary_domain;
    134 
    135     rv = _bcm_ptp_management_message_send(unit, ptp_id, clock_num, &portid, 
    136             PTP_MGMTMSG_SET, PTP_MGMTMSG_ID_PRIMARY_DOMAIN, 
    137             payload, PTP_MGMTMSG_PAYLOAD_MIN_SIZE_OCTETS, 
    138             resp, &resp_len);
    139     
    140     return rv;
    141 }
    142 
    143 /*
    144  * Function:
    145  *      bcm_common_ptp_transparent_clock_default_dataset_get
    146  * Purpose:
    147  *      Get PTP Transparent clock default dataset
    148  * Parameters:
    149  *      unit      - (IN) Unit number.
    150  *      ptp_id    - (IN) PTP stack ID.
    151  *      clock_num - (IN) PTP clock number.
    152  *      dataset   - (OUT) PTP transparent clock default dataset.
    153  * Returns:
    154  *      BCM_E_XXX
    155  * Notes:
    156  *      The transparent clock default dataset is relevant to PTP transparent 
    157  *      clocks.
    158  *      Ref. IEEE Std. 1588-2008, Chapters 8.3.2 and 15.5.3.8.1.
    159  */
    160 int 
    161 bcm_common_ptp_transparent_clock_default_dataset_get(
    162     int unit, 
    163     bcm_ptp_stack_id_t ptp_id, 
    164     int clock_num, 
    165     bcm_ptp_transparent_clock_default_dataset_t *dataset)
    166 {
    167     int rv = BCM_E_UNAVAIL;
    168     
    169     uint8 resp[PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS];
    170     int resp_len = PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS; 
    171     int i = 0;
    172 
    173     bcm_ptp_port_identity_t portid;     
    174     
    175     if (BCM_FAILURE(rv = _bcm_ptp_function_precheck(unit, ptp_id, clock_num,
    176             PTP_CLOCK_PORT_NUMBER_DEFAULT)))
    177     {
    178         return rv;   
    179     }
    180         
    181     if (BCM_FAILURE(rv = bcm_common_ptp_clock_port_identity_get(unit, ptp_id, 
    182             clock_num, PTP_IEEE1588_ALL_PORTS, &portid)))
    183     {
    184         return rv;
    185     }
    186 
    187     rv = _bcm_ptp_management_message_send(unit, ptp_id, clock_num, &portid, 
    188             PTP_MGMTMSG_GET, PTP_MGMTMSG_ID_TRANSPARENT_CLOCK_DEFAULT_DATASET, 
    189             0, 0, resp, &resp_len);
    190 
    191     if (rv == BCM_E_NONE) 
    192     {
    193         /* 
    194          * Parse response.
    195          *    Octet 0...7 : Clock identity.
    196          *    Octet 8...9 : Number of ports.
    197          *    Octet 10    : Delay mechanism.
    198          *    Octet 11    : Primary domain.
    199          */
    200         i = 0;
    201         sal_memcpy(dataset->clock_identity, resp, 
    202                    sizeof(bcm_ptp_clock_identity_t));
    203         i += sizeof(bcm_ptp_clock_identity_t);
    204 
    205         dataset->number_ports = _bcm_ptp_uint16_read(resp+i);
    206         i += 2;
    207 
    208         dataset->delay_mechanism = resp[i++];
    209         dataset->primary_domain = resp[i];
    210     }
    211     
    212     return rv;
    213 }
    214 
    215 /*
    216  * Function:
    217  *      bcm_common_ptp_transparent_clock_port_dataset_get
    218  * Purpose:
    219  *      Get PTP transparent clock port dataset. 
    220  * Parameters:
    221  *      unit      -  (IN)  Unit number.
    222  *      ptp_id    -  (IN)  PTP stack ID.
    223  *      clock_num -  (IN)  PTP clock number.
    224  *      clock_port - (IN)  PTP clock port number.
    225  *      dataset   -  (OUT) PTP transparent clock port dataset.
    226  * Returns:
    227  *      BCM_E_XXX
    228  * Notes:
    229  *      The transparent clock port dataset is relevant to PTP transparent 
    230  *      clocks.
    231  *      Ref. IEEE Std. 1588-2008, Chapters 8.3.3 and 15.5.3.10.1.
    232  */
    233 int 
    234 bcm_common_ptp_transparent_clock_port_dataset_get(
    235     int unit, 
    236     bcm_ptp_stack_id_t ptp_id, 
    237     int clock_num, 
    238     uint16 clock_port, 
    239     bcm_ptp_transparent_clock_port_dataset_t *dataset)
    240 {
    241     int rv = BCM_E_UNAVAIL;
    242     
    243     uint8 resp[PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS];
    244     int resp_len = PTP_MGMTMSG_RESP_MAX_SIZE_OCTETS; 
    245     int i = 0;
    246     
    247     bcm_ptp_port_identity_t portid;     
    248     
    249     if (BCM_FAILURE(rv = _bcm_ptp_function_precheck(unit, ptp_id, clock_num,
    250             (uint32)clock_port)))
    251     {
    252         return rv;   
    253     }
    254 
    255     if (BCM_FAILURE(rv = bcm_common_ptp_clock_port_identity_get(unit, ptp_id, 
    256             clock_num, clock_port, &portid)))
    257     {
    258         return rv;
    259     }
    260 
    261     rv = _bcm_ptp_management_message_send(unit, ptp_id, clock_num, &portid, 
    262             PTP_MGMTMSG_GET, PTP_MGMTMSG_ID_TRANSPARENT_CLOCK_PORT_DATASET, 
    263             0, 0, resp, &resp_len);
    264 
    265     if (rv == BCM_E_NONE) 
    266     {
    267         /* 
    268          * Parse response.
    269          *    Octet 0...9   : PTP port identity.
    270          *    Octet 10      : Faulty (FLT) Boolean.
    271          *                    |B7|B6|B5|B4|B3|B2|B1|B0| = |0|0|0|0|0|0|0|FLT|
    272          *    Octet 11      : Log minimum peer delay request interval.
    273          *    Octet 12...19 : Peer mean path delay (nanoseconds).
    274          */
    275         i = 0;
    276         sal_memcpy(dataset->port_identity.clock_identity, resp, 
    277                    sizeof(bcm_ptp_clock_identity_t));
    278         i += sizeof(bcm_ptp_clock_identity_t);
    279 
    280         dataset->port_identity.port_number = _bcm_ptp_uint16_read(resp+i);
    281         i += 2;
    282 
    283         dataset->faulty = (0x01 & resp[i++]);
    284 
    285         dataset->log_min_pdelay_req_interval = resp[i++];
    286         dataset->peer_mean_path_delay = _bcm_ptp_uint64_read(resp+i);
    287     }
    288     
    289     return rv;
    290 }
    291 #endif /* defined(INCLUDE_PTP)*/