17902c8dcSWojciech Macek /*- 27902c8dcSWojciech Macek * Copyright (c) 2015,2016 Annapurna Labs Ltd. and affiliates 37902c8dcSWojciech Macek * All rights reserved. 47902c8dcSWojciech Macek * 57902c8dcSWojciech Macek * Developed by Semihalf. 67902c8dcSWojciech Macek * 77902c8dcSWojciech Macek * Redistribution and use in source and binary forms, with or without 87902c8dcSWojciech Macek * modification, are permitted provided that the following conditions 97902c8dcSWojciech Macek * are met: 107902c8dcSWojciech Macek * 1. Redistributions of source code must retain the above copyright 117902c8dcSWojciech Macek * notice, this list of conditions and the following disclaimer. 127902c8dcSWojciech Macek * 2. Redistributions in binary form must reproduce the above copyright 137902c8dcSWojciech Macek * notice, this list of conditions and the following disclaimer in the 147902c8dcSWojciech Macek * documentation and/or other materials provided with the distribution. 157902c8dcSWojciech Macek * 167902c8dcSWojciech Macek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 177902c8dcSWojciech Macek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 187902c8dcSWojciech Macek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 197902c8dcSWojciech Macek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 207902c8dcSWojciech Macek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 217902c8dcSWojciech Macek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 227902c8dcSWojciech Macek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 237902c8dcSWojciech Macek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 247902c8dcSWojciech Macek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 257902c8dcSWojciech Macek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 267902c8dcSWojciech Macek * SUCH DAMAGE. 277902c8dcSWojciech Macek */ 287902c8dcSWojciech Macek 297902c8dcSWojciech Macek /** 307902c8dcSWojciech Macek * Ethernet 317902c8dcSWojciech Macek * @{ 327902c8dcSWojciech Macek * @file al_init_eth_lm.h 337902c8dcSWojciech Macek * 347902c8dcSWojciech Macek * @brief ethernet link management common utilities 357902c8dcSWojciech Macek * 367902c8dcSWojciech Macek * Common operation example: 377902c8dcSWojciech Macek * @code 387902c8dcSWojciech Macek * int main() 397902c8dcSWojciech Macek * { 407902c8dcSWojciech Macek * struct al_eth_lm_context lm_context; 417902c8dcSWojciech Macek * struct al_eth_lm_init_params lm_params; 427902c8dcSWojciech Macek * enum al_eth_lm_link_mode old_mode; 437902c8dcSWojciech Macek * enum al_eth_lm_link_mode new_mode; 447902c8dcSWojciech Macek * al_bool fault; 457902c8dcSWojciech Macek * al_bool link_up; 467902c8dcSWojciech Macek * int rc = 0; 477902c8dcSWojciech Macek * 487902c8dcSWojciech Macek * lm_params.adapter = hal_adapter; 497902c8dcSWojciech Macek * lm_params.serdes_obj = serdes; 507902c8dcSWojciech Macek * lm_params.grp = grp; 517902c8dcSWojciech Macek * lm_params.lane = lane; 527902c8dcSWojciech Macek * lm_params.sfp_detection = true; 537902c8dcSWojciech Macek * lm_params.link_training = true; 547902c8dcSWojciech Macek * lm_params.rx_equal = true 557902c8dcSWojciech Macek * lm_params.static_values = true; 567902c8dcSWojciech Macek * lm_params.kr_fec_enable = false; 577902c8dcSWojciech Macek * lm_params.eeprom_read = &my_eeprom_read; 587902c8dcSWojciech Macek * lm_params.eeprom_context = context; 597902c8dcSWojciech Macek * lm_params.get_random_byte = &my_rand_byte; 607902c8dcSWojciech Macek * lm_params.default_mode = AL_ETH_LM_MODE_10G_DA; 617902c8dcSWojciech Macek * 627902c8dcSWojciech Macek * al_eth_lm_init(&lm_context, &lm_params); 637902c8dcSWojciech Macek * 647902c8dcSWojciech Macek * rc = al_eth_lm_link_detection(&lm_context, &fault, &old_mode, &new_mode); 657902c8dcSWojciech Macek * if (fault == false) 667902c8dcSWojciech Macek * return; // in this case the link is still up 677902c8dcSWojciech Macek * 687902c8dcSWojciech Macek * if (rc) { 697902c8dcSWojciech Macek * printf("link detection failed on error\n"); 707902c8dcSWojciech Macek * return; 717902c8dcSWojciech Macek * } 727902c8dcSWojciech Macek * 737902c8dcSWojciech Macek * if (old_mode != new_mode) { 747902c8dcSWojciech Macek * // perform serdes configuration if needed 757902c8dcSWojciech Macek * 767902c8dcSWojciech Macek * // mac stop / start / config if needed 777902c8dcSWojciech Macek * } 787902c8dcSWojciech Macek * 797902c8dcSWojciech Macek * spin_lock(lock); 807902c8dcSWojciech Macek * rc = al_eth_lm_link_establish($lm_context, &link_up); 817902c8dcSWojciech Macek * spin_unlock(lock); 827902c8dcSWojciech Macek * if (rc) { 837902c8dcSWojciech Macek * printf("establish link failed\n"); 847902c8dcSWojciech Macek * return; 857902c8dcSWojciech Macek * } 867902c8dcSWojciech Macek * 877902c8dcSWojciech Macek * if (link_up) 887902c8dcSWojciech Macek * printf("Link established successfully\n"); 897902c8dcSWojciech Macek * else 907902c8dcSWojciech Macek * printf("No signal found. probably the link partner is disconnected\n"); 917902c8dcSWojciech Macek * } 927902c8dcSWojciech Macek * @endcode 937902c8dcSWojciech Macek * 947902c8dcSWojciech Macek */ 957902c8dcSWojciech Macek 967902c8dcSWojciech Macek #ifndef __AL_INIT_ETH_LM_H__ 977902c8dcSWojciech Macek #define __AL_INIT_ETH_LM_H__ 987902c8dcSWojciech Macek 997902c8dcSWojciech Macek #include <al_serdes.h> 1007902c8dcSWojciech Macek #include <al_hal_eth.h> 1017902c8dcSWojciech Macek #include "al_init_eth_kr.h" 1027902c8dcSWojciech Macek 1037902c8dcSWojciech Macek enum al_eth_lm_link_mode { 1047902c8dcSWojciech Macek AL_ETH_LM_MODE_DISCONNECTED, 1057902c8dcSWojciech Macek AL_ETH_LM_MODE_10G_OPTIC, 1067902c8dcSWojciech Macek AL_ETH_LM_MODE_10G_DA, 1077902c8dcSWojciech Macek AL_ETH_LM_MODE_1G, 1087902c8dcSWojciech Macek AL_ETH_LM_MODE_25G, 1097902c8dcSWojciech Macek }; 1107902c8dcSWojciech Macek 1117902c8dcSWojciech Macek enum al_eth_lm_max_speed { 1127902c8dcSWojciech Macek AL_ETH_LM_MAX_SPEED_MAX, 1137902c8dcSWojciech Macek AL_ETH_LM_MAX_SPEED_25G, 1147902c8dcSWojciech Macek AL_ETH_LM_MAX_SPEED_10G, 1157902c8dcSWojciech Macek AL_ETH_LM_MAX_SPEED_1G, 1167902c8dcSWojciech Macek }; 1177902c8dcSWojciech Macek 1187902c8dcSWojciech Macek enum al_eth_lm_link_state { 1197902c8dcSWojciech Macek AL_ETH_LM_LINK_DOWN, 1207902c8dcSWojciech Macek AL_ETH_LM_LINK_DOWN_RF, 1217902c8dcSWojciech Macek AL_ETH_LM_LINK_UP, 1227902c8dcSWojciech Macek }; 1237902c8dcSWojciech Macek 1247902c8dcSWojciech Macek enum al_eth_lm_led_config_speed { 1257902c8dcSWojciech Macek AL_ETH_LM_LED_CONFIG_1G, 1267902c8dcSWojciech Macek AL_ETH_LM_LED_CONFIG_10G, 1277902c8dcSWojciech Macek AL_ETH_LM_LED_CONFIG_25G, 1287902c8dcSWojciech Macek }; 1297902c8dcSWojciech Macek 1307902c8dcSWojciech Macek struct al_eth_lm_led_config_data { 1317902c8dcSWojciech Macek enum al_eth_lm_led_config_speed speed; 1327902c8dcSWojciech Macek }; 1337902c8dcSWojciech Macek 1347902c8dcSWojciech Macek struct al_eth_lm_context { 1357902c8dcSWojciech Macek struct al_hal_eth_adapter *adapter; 1367902c8dcSWojciech Macek struct al_serdes_grp_obj *serdes_obj; 1377902c8dcSWojciech Macek enum al_serdes_lane lane; 1387902c8dcSWojciech Macek 1397902c8dcSWojciech Macek uint32_t link_training_failures; 1407902c8dcSWojciech Macek 141*463edaf4SJohn Baldwin bool tx_param_dirty; 142*463edaf4SJohn Baldwin bool serdes_tx_params_valid; 1437902c8dcSWojciech Macek struct al_serdes_adv_tx_params tx_params_override; 144*463edaf4SJohn Baldwin bool rx_param_dirty; 145*463edaf4SJohn Baldwin bool serdes_rx_params_valid; 1467902c8dcSWojciech Macek struct al_serdes_adv_rx_params rx_params_override; 1477902c8dcSWojciech Macek 1487902c8dcSWojciech Macek struct al_eth_an_adv local_adv; 1497902c8dcSWojciech Macek struct al_eth_an_adv partner_adv; 1507902c8dcSWojciech Macek 1517902c8dcSWojciech Macek enum al_eth_lm_link_mode mode; 1527902c8dcSWojciech Macek uint8_t da_len; 153*463edaf4SJohn Baldwin bool debug; 1547902c8dcSWojciech Macek 1557902c8dcSWojciech Macek /* configurations */ 156*463edaf4SJohn Baldwin bool sfp_detection; 1577902c8dcSWojciech Macek uint8_t sfp_bus_id; 1587902c8dcSWojciech Macek uint8_t sfp_i2c_addr; 1597902c8dcSWojciech Macek 1607902c8dcSWojciech Macek enum al_eth_lm_link_mode default_mode; 1617902c8dcSWojciech Macek uint8_t default_dac_len; 162*463edaf4SJohn Baldwin bool link_training; 163*463edaf4SJohn Baldwin bool rx_equal; 164*463edaf4SJohn Baldwin bool static_values; 1657902c8dcSWojciech Macek 166*463edaf4SJohn Baldwin bool retimer_exist; 1677902c8dcSWojciech Macek enum al_eth_retimer_type retimer_type; 1687902c8dcSWojciech Macek uint8_t retimer_bus_id; 1697902c8dcSWojciech Macek uint8_t retimer_i2c_addr; 1707902c8dcSWojciech Macek enum al_eth_retimer_channel retimer_channel; 1717902c8dcSWojciech Macek 1727902c8dcSWojciech Macek /* services */ 1737902c8dcSWojciech Macek int (*i2c_read)(void *handle, uint8_t bus_id, uint8_t i2c_addr, 1747902c8dcSWojciech Macek uint8_t reg_addr, uint8_t *val); 1757902c8dcSWojciech Macek int (*i2c_write)(void *handle, uint8_t bus_id, uint8_t i2c_addr, 1767902c8dcSWojciech Macek uint8_t reg_addr, uint8_t val); 1777902c8dcSWojciech Macek void *i2c_context; 1787902c8dcSWojciech Macek uint8_t (*get_random_byte)(void); 1797902c8dcSWojciech Macek 1807902c8dcSWojciech Macek int (*gpio_get)(unsigned int gpio); 1817902c8dcSWojciech Macek uint32_t gpio_present; 1827902c8dcSWojciech Macek 1837902c8dcSWojciech Macek enum al_eth_retimer_channel retimer_tx_channel; 184*463edaf4SJohn Baldwin bool retimer_configured; 1857902c8dcSWojciech Macek 1867902c8dcSWojciech Macek enum al_eth_lm_max_speed max_speed; 1877902c8dcSWojciech Macek 188*463edaf4SJohn Baldwin bool sfp_detect_force_mode; 1897902c8dcSWojciech Macek 1907902c8dcSWojciech Macek enum al_eth_lm_link_state link_state; 191*463edaf4SJohn Baldwin bool new_port; 1927902c8dcSWojciech Macek 193*463edaf4SJohn Baldwin bool (*lm_pause)(void *handle); 1947902c8dcSWojciech Macek 1957902c8dcSWojciech Macek void (*led_config)(void *handle, struct al_eth_lm_led_config_data *data); 1967902c8dcSWojciech Macek }; 1977902c8dcSWojciech Macek 1987902c8dcSWojciech Macek struct al_eth_lm_init_params { 1997902c8dcSWojciech Macek /* pointer to HAL context */ 2007902c8dcSWojciech Macek struct al_hal_eth_adapter *adapter; 2017902c8dcSWojciech Macek /* pointer to serdes object */ 2027902c8dcSWojciech Macek struct al_serdes_grp_obj *serdes_obj; 2037902c8dcSWojciech Macek /* serdes lane for this port */ 2047902c8dcSWojciech Macek enum al_serdes_lane lane; 2057902c8dcSWojciech Macek 2067902c8dcSWojciech Macek /* 2077902c8dcSWojciech Macek * set to true to perform sfp detection if the link is down. 2087902c8dcSWojciech Macek * when set to true, eeprom_read below should NOT be NULL. 2097902c8dcSWojciech Macek */ 210*463edaf4SJohn Baldwin bool sfp_detection; 2117902c8dcSWojciech Macek /* i2c bus id of the SFP for this port */ 2127902c8dcSWojciech Macek uint8_t sfp_bus_id; 2137902c8dcSWojciech Macek /* i2c addr of the SFP for this port */ 2147902c8dcSWojciech Macek uint8_t sfp_i2c_addr; 2157902c8dcSWojciech Macek /* 2167902c8dcSWojciech Macek * default mode, and dac length will be used in case sfp_detection 2177902c8dcSWojciech Macek * is not set or in case the detection failed. 2187902c8dcSWojciech Macek */ 2197902c8dcSWojciech Macek enum al_eth_lm_link_mode default_mode; 2207902c8dcSWojciech Macek uint8_t default_dac_len; 2217902c8dcSWojciech Macek 2227902c8dcSWojciech Macek /* the i2c bus id and addr of the retimer in case it exist */ 2237902c8dcSWojciech Macek uint8_t retimer_bus_id; 2247902c8dcSWojciech Macek uint8_t retimer_i2c_addr; 2257902c8dcSWojciech Macek /* retimer channel connected to this port */ 2267902c8dcSWojciech Macek enum al_eth_retimer_channel retimer_channel; 2277902c8dcSWojciech Macek enum al_eth_retimer_channel retimer_tx_channel; 2287902c8dcSWojciech Macek /* retimer type if exist */ 2297902c8dcSWojciech Macek enum al_eth_retimer_type retimer_type; 2307902c8dcSWojciech Macek 2317902c8dcSWojciech Macek /* 2327902c8dcSWojciech Macek * the following parameters control what mechanisms to run 2337902c8dcSWojciech Macek * on link_establish with the following steps: 2347902c8dcSWojciech Macek * - if retimer_exist is set, the retimer will be configured based on DA len. 2357902c8dcSWojciech Macek * - if link_training is set and DA detected run link training. if succeed return 0 2367902c8dcSWojciech Macek * - if rx_equal is set serdes equalization will be run to configure the rx parameters. 2377902c8dcSWojciech Macek * - if static_values is set, tx and rx values will be set based on static values. 2387902c8dcSWojciech Macek */ 239*463edaf4SJohn Baldwin bool retimer_exist; 240*463edaf4SJohn Baldwin bool link_training; 241*463edaf4SJohn Baldwin bool rx_equal; 242*463edaf4SJohn Baldwin bool static_values; 2437902c8dcSWojciech Macek 2447902c8dcSWojciech Macek /* enable / disable fec capabilities in AN */ 245*463edaf4SJohn Baldwin bool kr_fec_enable; 2467902c8dcSWojciech Macek 2477902c8dcSWojciech Macek /* 2487902c8dcSWojciech Macek * pointer to function that's read 1 byte from eeprom 2497902c8dcSWojciech Macek * in case no eeprom is connected should return -ETIMEDOUT 2507902c8dcSWojciech Macek */ 2517902c8dcSWojciech Macek int (*i2c_read)(void *handle, uint8_t bus_id, uint8_t i2c_addr, 2527902c8dcSWojciech Macek uint8_t reg_addr, uint8_t *val); 2537902c8dcSWojciech Macek int (*i2c_write)(void *handle, uint8_t bus_id, uint8_t i2c_addr, 2547902c8dcSWojciech Macek uint8_t reg_addr, uint8_t val); 2557902c8dcSWojciech Macek void *i2c_context; 2567902c8dcSWojciech Macek /* pointer to function that return 1 rand byte */ 2577902c8dcSWojciech Macek uint8_t (*get_random_byte)(void); 2587902c8dcSWojciech Macek 2597902c8dcSWojciech Macek /* pointer to function that gets GPIO value - if NULL gpio present won't be used */ 2607902c8dcSWojciech Macek int (*gpio_get)(unsigned int gpio); 2617902c8dcSWojciech Macek /* gpio number connected to the SFP present pin */ 2627902c8dcSWojciech Macek uint32_t gpio_present; 2637902c8dcSWojciech Macek 2647902c8dcSWojciech Macek enum al_eth_lm_max_speed max_speed; 2657902c8dcSWojciech Macek 2667902c8dcSWojciech Macek /* in case force mode is true - the default mode will be set regardless to 2677902c8dcSWojciech Macek * the SFP EEPROM content */ 268*463edaf4SJohn Baldwin bool sfp_detect_force_mode; 2697902c8dcSWojciech Macek 2707902c8dcSWojciech Macek /* lm pause callback - in case it return true the LM will try to preserve 2717902c8dcSWojciech Macek * the current link status and will not try to establish new link (and will not 2727902c8dcSWojciech Macek * access to i2c bus) */ 273*463edaf4SJohn Baldwin bool (*lm_pause)(void *handle); 2747902c8dcSWojciech Macek 2757902c8dcSWojciech Macek /* config ethernet LEDs according to data. can be NULL if no configuration needed */ 2767902c8dcSWojciech Macek void (*led_config)(void *handle, struct al_eth_lm_led_config_data *data); 2777902c8dcSWojciech Macek }; 2787902c8dcSWojciech Macek 2797902c8dcSWojciech Macek /** 2807902c8dcSWojciech Macek * initialize link management context and set configuration 2817902c8dcSWojciech Macek * 2827902c8dcSWojciech Macek * @param lm_context pointer to link management context 2837902c8dcSWojciech Macek * @param params parameters passed from upper layer 2847902c8dcSWojciech Macek * 2857902c8dcSWojciech Macek * @return 0 in case of success. otherwise on failure. 2867902c8dcSWojciech Macek */ 2877902c8dcSWojciech Macek int al_eth_lm_init(struct al_eth_lm_context *lm_context, 2887902c8dcSWojciech Macek struct al_eth_lm_init_params *params); 2897902c8dcSWojciech Macek 2907902c8dcSWojciech Macek /** 2917902c8dcSWojciech Macek * perform link status check. in case link is down perform sfp detection 2927902c8dcSWojciech Macek * 2937902c8dcSWojciech Macek * @param lm_context pointer to link management context 2947902c8dcSWojciech Macek * @param link_fault indicate if the link is down 2957902c8dcSWojciech Macek * @param old_mode the last working mode 2967902c8dcSWojciech Macek * @param new_mode the new mode detected in this call 2977902c8dcSWojciech Macek * 2987902c8dcSWojciech Macek * @return 0 in case of success. otherwise on failure. 2997902c8dcSWojciech Macek */ 3007902c8dcSWojciech Macek int al_eth_lm_link_detection(struct al_eth_lm_context *lm_context, 301*463edaf4SJohn Baldwin bool *link_fault, enum al_eth_lm_link_mode *old_mode, 3027902c8dcSWojciech Macek enum al_eth_lm_link_mode *new_mode); 3037902c8dcSWojciech Macek 3047902c8dcSWojciech Macek /** 3057902c8dcSWojciech Macek * run LT, rx equalization and static values override according to configuration 3067902c8dcSWojciech Macek * This function MUST be called inside a lock as it using common serdes registers 3077902c8dcSWojciech Macek * 3087902c8dcSWojciech Macek * @param lm_context pointer to link management context 3097902c8dcSWojciech Macek * @param link_up set to true in case link is establish successfully 3107902c8dcSWojciech Macek * 3117902c8dcSWojciech Macek * @return < 0 in case link was failed to be established 3127902c8dcSWojciech Macek */ 3137902c8dcSWojciech Macek int al_eth_lm_link_establish(struct al_eth_lm_context *lm_context, 314*463edaf4SJohn Baldwin bool *link_up); 3157902c8dcSWojciech Macek 3167902c8dcSWojciech Macek /** 3177902c8dcSWojciech Macek * override the default static parameters 3187902c8dcSWojciech Macek * 3197902c8dcSWojciech Macek * @param lm_context pointer to link management context 3207902c8dcSWojciech Macek * @param tx_params pointer to new tx params 3217902c8dcSWojciech Macek * @param rx_params pointer to new rx params 3227902c8dcSWojciech Macek * 3237902c8dcSWojciech Macek * @return 0 in case of success. otherwise on failure. 3247902c8dcSWojciech Macek **/ 3257902c8dcSWojciech Macek int al_eth_lm_static_parameters_override(struct al_eth_lm_context *lm_context, 3267902c8dcSWojciech Macek struct al_serdes_adv_tx_params *tx_params, 3277902c8dcSWojciech Macek struct al_serdes_adv_rx_params *rx_params); 3287902c8dcSWojciech Macek 3297902c8dcSWojciech Macek /** 3307902c8dcSWojciech Macek * disable serdes parameters override 3317902c8dcSWojciech Macek * 3327902c8dcSWojciech Macek * @param lm_context pointer to link management context 3337902c8dcSWojciech Macek * @param tx_params set to true to disable override of tx params 3347902c8dcSWojciech Macek * @param rx_params set to true to disable override of rx params 3357902c8dcSWojciech Macek * 3367902c8dcSWojciech Macek * @return 0 in case of success. otherwise on failure. 3377902c8dcSWojciech Macek **/ 3387902c8dcSWojciech Macek int al_eth_lm_static_parameters_override_disable(struct al_eth_lm_context *lm_context, 339*463edaf4SJohn Baldwin bool tx_params, bool rx_params); 3407902c8dcSWojciech Macek 3417902c8dcSWojciech Macek /** 3427902c8dcSWojciech Macek * get the static parameters that are being used 3437902c8dcSWojciech Macek * if the parameters was override - return the override values 3447902c8dcSWojciech Macek * else return the current values of the parameters 3457902c8dcSWojciech Macek * 3467902c8dcSWojciech Macek * @param lm_context pointer to link management context 3477902c8dcSWojciech Macek * @param tx_params pointer to new tx params 3487902c8dcSWojciech Macek * @param rx_params pointer to new rx params 3497902c8dcSWojciech Macek * 3507902c8dcSWojciech Macek * @return 0 in case of success. otherwise on failure. 3517902c8dcSWojciech Macek */ 3527902c8dcSWojciech Macek int al_eth_lm_static_parameters_get(struct al_eth_lm_context *lm_context, 3537902c8dcSWojciech Macek struct al_serdes_adv_tx_params *tx_params, 3547902c8dcSWojciech Macek struct al_serdes_adv_rx_params *rx_params); 3557902c8dcSWojciech Macek 3567902c8dcSWojciech Macek /** 3577902c8dcSWojciech Macek * convert link management mode to string 3587902c8dcSWojciech Macek * 3597902c8dcSWojciech Macek * @param val link management mode 3607902c8dcSWojciech Macek * 3617902c8dcSWojciech Macek * @return string of the mode 3627902c8dcSWojciech Macek */ 3637902c8dcSWojciech Macek const char *al_eth_lm_mode_convert_to_str(enum al_eth_lm_link_mode val); 3647902c8dcSWojciech Macek 3657902c8dcSWojciech Macek /** 3667902c8dcSWojciech Macek * print all debug messages 3677902c8dcSWojciech Macek * 3687902c8dcSWojciech Macek * @param lm_context pointer to link management context 3697902c8dcSWojciech Macek * @param enable set to true to enable debug mode 3707902c8dcSWojciech Macek */ 3717902c8dcSWojciech Macek void al_eth_lm_debug_mode_set(struct al_eth_lm_context *lm_context, 372*463edaf4SJohn Baldwin bool enable); 3737902c8dcSWojciech Macek #endif 374