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)*/