199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright(c) 2017 Intel Corporation 399a2dd95SBruce Richardson */ 499a2dd95SBruce Richardson 599a2dd95SBruce Richardson #ifndef __INCLUDE_RTE_TM_DRIVER_H__ 699a2dd95SBruce Richardson #define __INCLUDE_RTE_TM_DRIVER_H__ 799a2dd95SBruce Richardson 899a2dd95SBruce Richardson /** 999a2dd95SBruce Richardson * @file 1099a2dd95SBruce Richardson * RTE Generic Traffic Manager API (Driver Side) 1199a2dd95SBruce Richardson * 1299a2dd95SBruce Richardson * This file provides implementation helpers for internal use by PMDs, they 1399a2dd95SBruce Richardson * are not intended to be exposed to applications and are not subject to ABI 1499a2dd95SBruce Richardson * versioning. 1599a2dd95SBruce Richardson */ 1699a2dd95SBruce Richardson 1799a2dd95SBruce Richardson #include <stdint.h> 1899a2dd95SBruce Richardson 1999a2dd95SBruce Richardson #include <rte_errno.h> 2099a2dd95SBruce Richardson #include "rte_ethdev.h" 2199a2dd95SBruce Richardson #include "ethdev_driver.h" 2299a2dd95SBruce Richardson #include "rte_tm.h" 2399a2dd95SBruce Richardson 2499a2dd95SBruce Richardson #ifdef __cplusplus 2599a2dd95SBruce Richardson extern "C" { 2699a2dd95SBruce Richardson #endif 2799a2dd95SBruce Richardson 2899a2dd95SBruce Richardson /** @internal Traffic manager node ID validate and type get */ 2999a2dd95SBruce Richardson typedef int (*rte_tm_node_type_get_t)(struct rte_eth_dev *dev, 3099a2dd95SBruce Richardson uint32_t node_id, 3199a2dd95SBruce Richardson int *is_leaf, 3299a2dd95SBruce Richardson struct rte_tm_error *error); 3399a2dd95SBruce Richardson 3499a2dd95SBruce Richardson /** @internal Traffic manager capabilities get */ 3599a2dd95SBruce Richardson typedef int (*rte_tm_capabilities_get_t)(struct rte_eth_dev *dev, 3699a2dd95SBruce Richardson struct rte_tm_capabilities *cap, 3799a2dd95SBruce Richardson struct rte_tm_error *error); 3899a2dd95SBruce Richardson 3999a2dd95SBruce Richardson /** @internal Traffic manager level capabilities get */ 4099a2dd95SBruce Richardson typedef int (*rte_tm_level_capabilities_get_t)(struct rte_eth_dev *dev, 4199a2dd95SBruce Richardson uint32_t level_id, 4299a2dd95SBruce Richardson struct rte_tm_level_capabilities *cap, 4399a2dd95SBruce Richardson struct rte_tm_error *error); 4499a2dd95SBruce Richardson 4599a2dd95SBruce Richardson /** @internal Traffic manager node capabilities get */ 4699a2dd95SBruce Richardson typedef int (*rte_tm_node_capabilities_get_t)(struct rte_eth_dev *dev, 4799a2dd95SBruce Richardson uint32_t node_id, 4899a2dd95SBruce Richardson struct rte_tm_node_capabilities *cap, 4999a2dd95SBruce Richardson struct rte_tm_error *error); 5099a2dd95SBruce Richardson 5199a2dd95SBruce Richardson /** @internal Traffic manager WRED profile add */ 5299a2dd95SBruce Richardson typedef int (*rte_tm_wred_profile_add_t)(struct rte_eth_dev *dev, 5399a2dd95SBruce Richardson uint32_t wred_profile_id, 545d963566SBruce Richardson const struct rte_tm_wred_params *profile, 5599a2dd95SBruce Richardson struct rte_tm_error *error); 5699a2dd95SBruce Richardson 5799a2dd95SBruce Richardson /** @internal Traffic manager WRED profile delete */ 5899a2dd95SBruce Richardson typedef int (*rte_tm_wred_profile_delete_t)(struct rte_eth_dev *dev, 5999a2dd95SBruce Richardson uint32_t wred_profile_id, 6099a2dd95SBruce Richardson struct rte_tm_error *error); 6199a2dd95SBruce Richardson 6299a2dd95SBruce Richardson /** @internal Traffic manager shared WRED context add */ 6399a2dd95SBruce Richardson typedef int (*rte_tm_shared_wred_context_add_update_t)( 6499a2dd95SBruce Richardson struct rte_eth_dev *dev, 6599a2dd95SBruce Richardson uint32_t shared_wred_context_id, 6699a2dd95SBruce Richardson uint32_t wred_profile_id, 6799a2dd95SBruce Richardson struct rte_tm_error *error); 6899a2dd95SBruce Richardson 6999a2dd95SBruce Richardson /** @internal Traffic manager shared WRED context delete */ 7099a2dd95SBruce Richardson typedef int (*rte_tm_shared_wred_context_delete_t)( 7199a2dd95SBruce Richardson struct rte_eth_dev *dev, 7299a2dd95SBruce Richardson uint32_t shared_wred_context_id, 7399a2dd95SBruce Richardson struct rte_tm_error *error); 7499a2dd95SBruce Richardson 7599a2dd95SBruce Richardson /** @internal Traffic manager shaper profile add */ 7699a2dd95SBruce Richardson typedef int (*rte_tm_shaper_profile_add_t)(struct rte_eth_dev *dev, 7799a2dd95SBruce Richardson uint32_t shaper_profile_id, 7839533238SBruce Richardson const struct rte_tm_shaper_params *profile, 7999a2dd95SBruce Richardson struct rte_tm_error *error); 8099a2dd95SBruce Richardson 8199a2dd95SBruce Richardson /** @internal Traffic manager shaper profile delete */ 8299a2dd95SBruce Richardson typedef int (*rte_tm_shaper_profile_delete_t)(struct rte_eth_dev *dev, 8399a2dd95SBruce Richardson uint32_t shaper_profile_id, 8499a2dd95SBruce Richardson struct rte_tm_error *error); 8599a2dd95SBruce Richardson 8699a2dd95SBruce Richardson /** @internal Traffic manager shared shaper add/update */ 8799a2dd95SBruce Richardson typedef int (*rte_tm_shared_shaper_add_update_t)(struct rte_eth_dev *dev, 8899a2dd95SBruce Richardson uint32_t shared_shaper_id, 8999a2dd95SBruce Richardson uint32_t shaper_profile_id, 9099a2dd95SBruce Richardson struct rte_tm_error *error); 9199a2dd95SBruce Richardson 9299a2dd95SBruce Richardson /** @internal Traffic manager shared shaper delete */ 9399a2dd95SBruce Richardson typedef int (*rte_tm_shared_shaper_delete_t)(struct rte_eth_dev *dev, 9499a2dd95SBruce Richardson uint32_t shared_shaper_id, 9599a2dd95SBruce Richardson struct rte_tm_error *error); 9699a2dd95SBruce Richardson 9799a2dd95SBruce Richardson /** @internal Traffic manager node add */ 9899a2dd95SBruce Richardson typedef int (*rte_tm_node_add_t)(struct rte_eth_dev *dev, 9999a2dd95SBruce Richardson uint32_t node_id, 10099a2dd95SBruce Richardson uint32_t parent_node_id, 10199a2dd95SBruce Richardson uint32_t priority, 10299a2dd95SBruce Richardson uint32_t weight, 10399a2dd95SBruce Richardson uint32_t level_id, 1045d49af62SBruce Richardson const struct rte_tm_node_params *params, 10599a2dd95SBruce Richardson struct rte_tm_error *error); 10699a2dd95SBruce Richardson 10799a2dd95SBruce Richardson /** @internal Traffic manager node delete */ 10899a2dd95SBruce Richardson typedef int (*rte_tm_node_delete_t)(struct rte_eth_dev *dev, 10999a2dd95SBruce Richardson uint32_t node_id, 11099a2dd95SBruce Richardson struct rte_tm_error *error); 11199a2dd95SBruce Richardson 11299a2dd95SBruce Richardson /** @internal Traffic manager node suspend */ 11399a2dd95SBruce Richardson typedef int (*rte_tm_node_suspend_t)(struct rte_eth_dev *dev, 11499a2dd95SBruce Richardson uint32_t node_id, 11599a2dd95SBruce Richardson struct rte_tm_error *error); 11699a2dd95SBruce Richardson 11799a2dd95SBruce Richardson /** @internal Traffic manager node resume */ 11899a2dd95SBruce Richardson typedef int (*rte_tm_node_resume_t)(struct rte_eth_dev *dev, 11999a2dd95SBruce Richardson uint32_t node_id, 12099a2dd95SBruce Richardson struct rte_tm_error *error); 12199a2dd95SBruce Richardson 122*25a2a0dcSBruce Richardson /** @internal Traffic manager node query */ 123*25a2a0dcSBruce Richardson typedef int (*rte_tm_node_query_t)(const struct rte_eth_dev *dev, 124*25a2a0dcSBruce Richardson uint32_t node_id, 125*25a2a0dcSBruce Richardson uint32_t *parent_node_id, 126*25a2a0dcSBruce Richardson uint32_t *priority, 127*25a2a0dcSBruce Richardson uint32_t *weight, 128*25a2a0dcSBruce Richardson uint32_t *level_id, 129*25a2a0dcSBruce Richardson struct rte_tm_node_params *params, 130*25a2a0dcSBruce Richardson struct rte_tm_error *error); 131*25a2a0dcSBruce Richardson 13299a2dd95SBruce Richardson /** @internal Traffic manager hierarchy commit */ 13399a2dd95SBruce Richardson typedef int (*rte_tm_hierarchy_commit_t)(struct rte_eth_dev *dev, 13499a2dd95SBruce Richardson int clear_on_fail, 13599a2dd95SBruce Richardson struct rte_tm_error *error); 13699a2dd95SBruce Richardson 13799a2dd95SBruce Richardson /** @internal Traffic manager node parent update */ 13899a2dd95SBruce Richardson typedef int (*rte_tm_node_parent_update_t)(struct rte_eth_dev *dev, 13999a2dd95SBruce Richardson uint32_t node_id, 14099a2dd95SBruce Richardson uint32_t parent_node_id, 14199a2dd95SBruce Richardson uint32_t priority, 14299a2dd95SBruce Richardson uint32_t weight, 14399a2dd95SBruce Richardson struct rte_tm_error *error); 14499a2dd95SBruce Richardson 14599a2dd95SBruce Richardson /** @internal Traffic manager node shaper update */ 14699a2dd95SBruce Richardson typedef int (*rte_tm_node_shaper_update_t)(struct rte_eth_dev *dev, 14799a2dd95SBruce Richardson uint32_t node_id, 14899a2dd95SBruce Richardson uint32_t shaper_profile_id, 14999a2dd95SBruce Richardson struct rte_tm_error *error); 15099a2dd95SBruce Richardson 15199a2dd95SBruce Richardson /** @internal Traffic manager node shaper update */ 15299a2dd95SBruce Richardson typedef int (*rte_tm_node_shared_shaper_update_t)(struct rte_eth_dev *dev, 15399a2dd95SBruce Richardson uint32_t node_id, 15499a2dd95SBruce Richardson uint32_t shared_shaper_id, 15599a2dd95SBruce Richardson int32_t add, 15699a2dd95SBruce Richardson struct rte_tm_error *error); 15799a2dd95SBruce Richardson 15899a2dd95SBruce Richardson /** @internal Traffic manager node stats update */ 15999a2dd95SBruce Richardson typedef int (*rte_tm_node_stats_update_t)(struct rte_eth_dev *dev, 16099a2dd95SBruce Richardson uint32_t node_id, 16199a2dd95SBruce Richardson uint64_t stats_mask, 16299a2dd95SBruce Richardson struct rte_tm_error *error); 16399a2dd95SBruce Richardson 16499a2dd95SBruce Richardson /** @internal Traffic manager node WFQ weight mode update */ 16599a2dd95SBruce Richardson typedef int (*rte_tm_node_wfq_weight_mode_update_t)( 16699a2dd95SBruce Richardson struct rte_eth_dev *dev, 16799a2dd95SBruce Richardson uint32_t node_id, 16899a2dd95SBruce Richardson int *wfq_weight_mode, 16999a2dd95SBruce Richardson uint32_t n_sp_priorities, 17099a2dd95SBruce Richardson struct rte_tm_error *error); 17199a2dd95SBruce Richardson 17299a2dd95SBruce Richardson /** @internal Traffic manager node congestion management mode update */ 17399a2dd95SBruce Richardson typedef int (*rte_tm_node_cman_update_t)(struct rte_eth_dev *dev, 17499a2dd95SBruce Richardson uint32_t node_id, 17599a2dd95SBruce Richardson enum rte_tm_cman_mode cman, 17699a2dd95SBruce Richardson struct rte_tm_error *error); 17799a2dd95SBruce Richardson 17899a2dd95SBruce Richardson /** @internal Traffic manager node WRED context update */ 17999a2dd95SBruce Richardson typedef int (*rte_tm_node_wred_context_update_t)( 18099a2dd95SBruce Richardson struct rte_eth_dev *dev, 18199a2dd95SBruce Richardson uint32_t node_id, 18299a2dd95SBruce Richardson uint32_t wred_profile_id, 18399a2dd95SBruce Richardson struct rte_tm_error *error); 18499a2dd95SBruce Richardson 18599a2dd95SBruce Richardson /** @internal Traffic manager node WRED context update */ 18699a2dd95SBruce Richardson typedef int (*rte_tm_node_shared_wred_context_update_t)( 18799a2dd95SBruce Richardson struct rte_eth_dev *dev, 18899a2dd95SBruce Richardson uint32_t node_id, 18999a2dd95SBruce Richardson uint32_t shared_wred_context_id, 19099a2dd95SBruce Richardson int add, 19199a2dd95SBruce Richardson struct rte_tm_error *error); 19299a2dd95SBruce Richardson 19399a2dd95SBruce Richardson /** @internal Traffic manager read stats counters for specific node */ 19499a2dd95SBruce Richardson typedef int (*rte_tm_node_stats_read_t)(struct rte_eth_dev *dev, 19599a2dd95SBruce Richardson uint32_t node_id, 19699a2dd95SBruce Richardson struct rte_tm_node_stats *stats, 19799a2dd95SBruce Richardson uint64_t *stats_mask, 19899a2dd95SBruce Richardson int clear, 19999a2dd95SBruce Richardson struct rte_tm_error *error); 20099a2dd95SBruce Richardson 20199a2dd95SBruce Richardson /** @internal Traffic manager packet marking - VLAN DEI */ 20299a2dd95SBruce Richardson typedef int (*rte_tm_mark_vlan_dei_t)(struct rte_eth_dev *dev, 20399a2dd95SBruce Richardson int mark_green, 20499a2dd95SBruce Richardson int mark_yellow, 20599a2dd95SBruce Richardson int mark_red, 20699a2dd95SBruce Richardson struct rte_tm_error *error); 20799a2dd95SBruce Richardson 20899a2dd95SBruce Richardson /** @internal Traffic manager packet marking - IPv4/IPv6 ECN */ 20999a2dd95SBruce Richardson typedef int (*rte_tm_mark_ip_ecn_t)(struct rte_eth_dev *dev, 21099a2dd95SBruce Richardson int mark_green, 21199a2dd95SBruce Richardson int mark_yellow, 21299a2dd95SBruce Richardson int mark_red, 21399a2dd95SBruce Richardson struct rte_tm_error *error); 21499a2dd95SBruce Richardson 21599a2dd95SBruce Richardson /** @internal Traffic manager packet marking - IPv4/IPv6 DSCP */ 21699a2dd95SBruce Richardson typedef int (*rte_tm_mark_ip_dscp_t)(struct rte_eth_dev *dev, 21799a2dd95SBruce Richardson int mark_green, 21899a2dd95SBruce Richardson int mark_yellow, 21999a2dd95SBruce Richardson int mark_red, 22099a2dd95SBruce Richardson struct rte_tm_error *error); 22199a2dd95SBruce Richardson 22299a2dd95SBruce Richardson struct rte_tm_ops { 22399a2dd95SBruce Richardson /** Traffic manager node type get */ 22499a2dd95SBruce Richardson rte_tm_node_type_get_t node_type_get; 22599a2dd95SBruce Richardson 22699a2dd95SBruce Richardson /** Traffic manager capabilities_get */ 22799a2dd95SBruce Richardson rte_tm_capabilities_get_t capabilities_get; 22899a2dd95SBruce Richardson /** Traffic manager level capabilities_get */ 22999a2dd95SBruce Richardson rte_tm_level_capabilities_get_t level_capabilities_get; 23099a2dd95SBruce Richardson /** Traffic manager node capabilities get */ 23199a2dd95SBruce Richardson rte_tm_node_capabilities_get_t node_capabilities_get; 23299a2dd95SBruce Richardson 23399a2dd95SBruce Richardson /** Traffic manager WRED profile add */ 23499a2dd95SBruce Richardson rte_tm_wred_profile_add_t wred_profile_add; 23599a2dd95SBruce Richardson /** Traffic manager WRED profile delete */ 23699a2dd95SBruce Richardson rte_tm_wred_profile_delete_t wred_profile_delete; 23799a2dd95SBruce Richardson /** Traffic manager shared WRED context add/update */ 23899a2dd95SBruce Richardson rte_tm_shared_wred_context_add_update_t 23999a2dd95SBruce Richardson shared_wred_context_add_update; 24099a2dd95SBruce Richardson /** Traffic manager shared WRED context delete */ 24199a2dd95SBruce Richardson rte_tm_shared_wred_context_delete_t 24299a2dd95SBruce Richardson shared_wred_context_delete; 24399a2dd95SBruce Richardson 24499a2dd95SBruce Richardson /** Traffic manager shaper profile add */ 24599a2dd95SBruce Richardson rte_tm_shaper_profile_add_t shaper_profile_add; 24699a2dd95SBruce Richardson /** Traffic manager shaper profile delete */ 24799a2dd95SBruce Richardson rte_tm_shaper_profile_delete_t shaper_profile_delete; 24899a2dd95SBruce Richardson /** Traffic manager shared shaper add/update */ 24999a2dd95SBruce Richardson rte_tm_shared_shaper_add_update_t shared_shaper_add_update; 25099a2dd95SBruce Richardson /** Traffic manager shared shaper delete */ 25199a2dd95SBruce Richardson rte_tm_shared_shaper_delete_t shared_shaper_delete; 25299a2dd95SBruce Richardson 25399a2dd95SBruce Richardson /** Traffic manager node add */ 25499a2dd95SBruce Richardson rte_tm_node_add_t node_add; 25599a2dd95SBruce Richardson /** Traffic manager node delete */ 25699a2dd95SBruce Richardson rte_tm_node_delete_t node_delete; 25799a2dd95SBruce Richardson /** Traffic manager node suspend */ 25899a2dd95SBruce Richardson rte_tm_node_suspend_t node_suspend; 25999a2dd95SBruce Richardson /** Traffic manager node resume */ 26099a2dd95SBruce Richardson rte_tm_node_resume_t node_resume; 261*25a2a0dcSBruce Richardson /** Traffic manager node query */ 262*25a2a0dcSBruce Richardson rte_tm_node_query_t node_query; 26399a2dd95SBruce Richardson /** Traffic manager hierarchy commit */ 26499a2dd95SBruce Richardson rte_tm_hierarchy_commit_t hierarchy_commit; 26599a2dd95SBruce Richardson 26699a2dd95SBruce Richardson /** Traffic manager node parent update */ 26799a2dd95SBruce Richardson rte_tm_node_parent_update_t node_parent_update; 26899a2dd95SBruce Richardson /** Traffic manager node shaper update */ 26999a2dd95SBruce Richardson rte_tm_node_shaper_update_t node_shaper_update; 27099a2dd95SBruce Richardson /** Traffic manager node shared shaper update */ 27199a2dd95SBruce Richardson rte_tm_node_shared_shaper_update_t node_shared_shaper_update; 27299a2dd95SBruce Richardson /** Traffic manager node stats update */ 27399a2dd95SBruce Richardson rte_tm_node_stats_update_t node_stats_update; 27499a2dd95SBruce Richardson /** Traffic manager node WFQ weight mode update */ 27599a2dd95SBruce Richardson rte_tm_node_wfq_weight_mode_update_t node_wfq_weight_mode_update; 27699a2dd95SBruce Richardson /** Traffic manager node congestion management mode update */ 27799a2dd95SBruce Richardson rte_tm_node_cman_update_t node_cman_update; 27899a2dd95SBruce Richardson /** Traffic manager node WRED context update */ 27999a2dd95SBruce Richardson rte_tm_node_wred_context_update_t node_wred_context_update; 28099a2dd95SBruce Richardson /** Traffic manager node shared WRED context update */ 28199a2dd95SBruce Richardson rte_tm_node_shared_wred_context_update_t 28299a2dd95SBruce Richardson node_shared_wred_context_update; 28399a2dd95SBruce Richardson /** Traffic manager read statistics counters for current node */ 28499a2dd95SBruce Richardson rte_tm_node_stats_read_t node_stats_read; 28599a2dd95SBruce Richardson 28699a2dd95SBruce Richardson /** Traffic manager packet marking - VLAN DEI */ 28799a2dd95SBruce Richardson rte_tm_mark_vlan_dei_t mark_vlan_dei; 28899a2dd95SBruce Richardson /** Traffic manager packet marking - IPv4/IPv6 ECN */ 28999a2dd95SBruce Richardson rte_tm_mark_ip_ecn_t mark_ip_ecn; 29099a2dd95SBruce Richardson /** Traffic manager packet marking - IPv4/IPv6 DSCP */ 29199a2dd95SBruce Richardson rte_tm_mark_ip_dscp_t mark_ip_dscp; 29299a2dd95SBruce Richardson }; 29399a2dd95SBruce Richardson 29499a2dd95SBruce Richardson /** 29599a2dd95SBruce Richardson * Initialize generic error structure. 29699a2dd95SBruce Richardson * 29799a2dd95SBruce Richardson * This function also sets rte_errno to a given value. 29899a2dd95SBruce Richardson * 29999a2dd95SBruce Richardson * @param[out] error 30099a2dd95SBruce Richardson * Pointer to error structure (may be NULL). 30199a2dd95SBruce Richardson * @param[in] code 30299a2dd95SBruce Richardson * Related error code (rte_errno). 30399a2dd95SBruce Richardson * @param[in] type 30499a2dd95SBruce Richardson * Cause field and error type. 30599a2dd95SBruce Richardson * @param[in] cause 30699a2dd95SBruce Richardson * Object responsible for the error. 30799a2dd95SBruce Richardson * @param[in] message 30899a2dd95SBruce Richardson * Human-readable error message. 30999a2dd95SBruce Richardson * 31099a2dd95SBruce Richardson * @return 31199a2dd95SBruce Richardson * Error code. 31299a2dd95SBruce Richardson */ 31399a2dd95SBruce Richardson static inline int 31499a2dd95SBruce Richardson rte_tm_error_set(struct rte_tm_error *error, 31599a2dd95SBruce Richardson int code, 31699a2dd95SBruce Richardson enum rte_tm_error_type type, 31799a2dd95SBruce Richardson const void *cause, 31899a2dd95SBruce Richardson const char *message) 31999a2dd95SBruce Richardson { 32099a2dd95SBruce Richardson if (error) { 32199a2dd95SBruce Richardson *error = (struct rte_tm_error){ 32299a2dd95SBruce Richardson .type = type, 32399a2dd95SBruce Richardson .cause = cause, 32499a2dd95SBruce Richardson .message = message, 32599a2dd95SBruce Richardson }; 32699a2dd95SBruce Richardson } 32799a2dd95SBruce Richardson rte_errno = code; 32899a2dd95SBruce Richardson return code; 32999a2dd95SBruce Richardson } 33099a2dd95SBruce Richardson 33199a2dd95SBruce Richardson /** 33299a2dd95SBruce Richardson * Get generic traffic manager operations structure from a port 33399a2dd95SBruce Richardson * 33499a2dd95SBruce Richardson * @param[in] port_id 33599a2dd95SBruce Richardson * The port identifier of the Ethernet device. 33699a2dd95SBruce Richardson * @param[out] error 33799a2dd95SBruce Richardson * Error details 33899a2dd95SBruce Richardson * 33999a2dd95SBruce Richardson * @return 34099a2dd95SBruce Richardson * The traffic manager operations structure associated with port_id on 34199a2dd95SBruce Richardson * success, NULL otherwise. 34299a2dd95SBruce Richardson */ 34399a2dd95SBruce Richardson const struct rte_tm_ops * 34499a2dd95SBruce Richardson rte_tm_ops_get(uint16_t port_id, struct rte_tm_error *error); 34599a2dd95SBruce Richardson 34699a2dd95SBruce Richardson #ifdef __cplusplus 34799a2dd95SBruce Richardson } 34899a2dd95SBruce Richardson #endif 34999a2dd95SBruce Richardson 35099a2dd95SBruce Richardson #endif /* __INCLUDE_RTE_TM_DRIVER_H__ */ 351