QSFPのマネージメント情報の仕様であるSFF-8636 Rev 2.10aにはトランシーバーが測定機能を備えている時はそれを示すbitを立てるフィールドがあります。
Ta ble 6-23 Dia gnos tic Moni tori ng T ype (Pag e 00 h By te 2 20)
Bits | Description |
---|---|
7-6 | Reserved |
5 | Temperature monitoring implemented (0b=Not implemented or pre-Rev 2.8, 1b=Implemented) |
4 | Supply voltage monitoring implemented (0b=Not implemented or pre-Rev 2.8, 1b=Implemented) |
3 | Received power measurements type. 0=OMA, 1=Average Power |
2 | Transmitter power measurement. 0=Not supported, 1=Supported |
1-0 | Reserved |
-
Module temperature
-
Module voltage
-
Transmit avg optical power
-
Rcvr signal avg optical power
すべてが測定可能であれば0x3Cが設定され、Rev2.8以前対応品であれば0x0Cになります。
ところがethtool-5.4のソースコードをみると読み込んだ値を0x08でmaskしてしまっています。つまりbit 3のrx power type以外の情報は捨ててしまっているのです。
/* Diagnostic Monitoring Type - 220 */ #define SFF8636_DIAG_TYPE_OFFSET 0xDC #define SFF8636_RX_PWR_TYPE_MASK 0x8
sd.rx_power_type = id[SFF8636_DIAG_TYPE_OFFSET] & SFF8636_RX_PWR_TYPE_MASK; sd.tx_power_type = id[SFF8636_DIAG_TYPE_OFFSET] & SFF8636_RX_PWR_TYPE_MASK; if (!sd.rx_power_type) rx_power_string = "Receiver signal OMA"; else rx_power_string = "Rcvr signal avg optical power";
従って、トランシーバーが0x08以外の値をセットしてもethtoolの動作には何も影響を与えません。
考えられることは。"Tx Power diagnostic"のbitはJanuary 27, 2014のRev 1.9からサポートされておりそれ以前の仕様に基づく実装であるため。
Rev 2.9はApril 21, 2017でありtemp,VCCがサポートされていないのはまぁ仕方がない。
ちなみにsd.tx_power_typeは一切参照されていません。
dBm表示の処理
# define PRINT_xX_PWR(string, var) \ printf("\t%-41s : %.4f mW / %.2f dBm\n", (string), \ (double)((var) / 10000.), \ convert_mw_to_dbm((double)((var) / 10000.))) |
Transmit avg optical power (Channel 1) : 0.9796 mW / -0.09 dBm
もし修正するなら
#define SFF8636_TX_PWR_ENABLE_MASK 0x20 #define SFF8636_TEMP_ENABLE_MASK 0x04 #define SFF8636_VCC_ENABLE_MASK 0x10
__u8 rev_comliance; __u8 tx_power_impremented; __u8 temp_impremented; __u8 vcc_impremented;
sff8636_show_dom()
sd.rev_comliance = id[SFF8636_REV_COMPLIANCE_OFFSET]; sd.tx_power_impremented = id[SFF8636_DIAG_TYPE_OFFSET] & SFF8636_TX_PWR_ENABLE_MASK; sd.temp_impremented = id[SFF8636_DIAG_TYPE_OFFSET] & SFF8636_TEMP_ENABLE_MASK; sd.vcc_impremented = id[SFF8636_DIAG_TYPE_OFFSET] & SFF8636_VCC_ENABLE_MASK; /* Rev Compliance up 2.8(0x08) */ if(sd.temp_impremented || sd.rev_comliance < 0x08) PRINT_TEMP("Module temperature", sd.sfp_temp[MCURR]); else printf("Temperature monitoring not implemented\n"); if(sd.vcc_impremented || sd.rev_comliance < 0x08) PRINT_VCC("Module voltage", sd.sfp_voltage[MCURR]); else printf("Supply voltage monitoring not implemented\n"); /* Rev Comiance up 1.9(0x06) */ if(sd.tx_power_impremented || sd.rev_comliance < 0x06){ for (i = 0; i < MAX_CHANNEL_NUM; i++) { snprintf(power_string, MAX_DESC_SIZE, "%s (Channel %d)", "Transmit avg optical power", i+1); PRINT_xX_PWR(power_string, sd.scd[i].tx_power); } }else{ printf("Transmitter power measurement not supported\n"); }
Table 6-3 Revision Compliance (Page 00h Byte 1)
Value | Memory Map Version |
---|---|
05h | SFF-8636 Rev 1.5 |
06h | SFF-8636 Rev 2.0 |
07h | SFF-8636 Rev 2.5, 2.6 and 2.7 |
08h | SFF-8636 Rev 2.8, 2.9 and 2.10 |
をチェック、現行のethtoolでは表示文面以外の機能切り替えにこの値は使用していない。
コメント欄を読み込み中