| 639 | } |
| 640 | |
| 641 | static void sff_8636_show_dom(const uint8_t *data, uint32_t eeprom_len, struct rte_tel_data *d) |
| 642 | { |
| 643 | struct sff_diags sd = {0}; |
| 644 | const char *rx_power_string = NULL; |
| 645 | char power_string[SFF_MAX_DESC_SIZE]; |
| 646 | char val_string[SFF_ITEM_VAL_COMPOSE_SIZE]; |
| 647 | int i; |
| 648 | |
| 649 | /* |
| 650 | * There is no clear identifier to signify the existence of |
| 651 | * optical diagnostics similar to SFF-8472. So checking existence |
| 652 | * of page 3, will provide the guarantee for existence of alarms |
| 653 | * and thresholds |
| 654 | * If pagging support exists, then supports_alarms is marked as 1 |
| 655 | */ |
| 656 | |
| 657 | if (eeprom_len == RTE_ETH_MODULE_SFF_8636_MAX_LEN) { |
| 658 | if (!(data[SFF_8636_STATUS_2_OFFSET] & |
| 659 | SFF_8636_STATUS_PAGE_3_PRESENT)) { |
| 660 | sd.supports_alarms = 1; |
| 661 | } |
| 662 | } |
| 663 | |
| 664 | sd.rx_power_type = data[SFF_8636_DIAG_TYPE_OFFSET] & |
| 665 | SFF_8636_RX_PWR_TYPE_MASK; |
| 666 | sd.tx_power_type = data[SFF_8636_DIAG_TYPE_OFFSET] & |
| 667 | SFF_8636_RX_PWR_TYPE_MASK; |
| 668 | |
| 669 | sff_8636_dom_parse(data, &sd); |
| 670 | |
| 671 | SFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_MCURR]); |
| 672 | ssf_add_dict_string(d, "Module temperature", val_string); |
| 673 | |
| 674 | SFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_MCURR]); |
| 675 | ssf_add_dict_string(d, "Module voltage", val_string); |
| 676 | |
| 677 | /* |
| 678 | * SFF-8636/8436 spec is not clear whether RX power/ TX bias |
| 679 | * current fields are supported or not. A valid temperature |
| 680 | * reading is used as existence for TX/RX power. |
| 681 | */ |
| 682 | if ((sd.sfp_temp[SFF_MCURR] == 0x0) || |
| 683 | (sd.sfp_temp[SFF_MCURR] == (int16_t)0xFFFF)) |
| 684 | return; |
| 685 | |
| 686 | ssf_add_dict_string(d, "Alarm/warning flags implemented", |
| 687 | (sd.supports_alarms ? "Yes" : "No")); |
| 688 | |
| 689 | for (i = 0; i < SFF_MAX_CHANNEL_NUM; i++) { |
| 690 | snprintf(power_string, SFF_MAX_DESC_SIZE, "%s (Channel %d)", |
| 691 | "Laser tx bias current", i+1); |
| 692 | SFF_SPRINT_BIAS(val_string, sd.scd[i].bias_cur); |
| 693 | ssf_add_dict_string(d, power_string, val_string); |
| 694 | } |
| 695 | |
| 696 | for (i = 0; i < SFF_MAX_CHANNEL_NUM; i++) { |
| 697 | snprintf(power_string, SFF_MAX_DESC_SIZE, "%s (Channel %d)", |
| 698 | "Transmit avg optical power", i+1); |
no test coverage detected