QSFPのマネージメント情報の仕様であるSFF-8636 Rev 2.10aにはトランシーバーが測定機能を備えている時はそれを示すbitを立てるフィールドがあります。

 Table 6-23 Diagnostic Monitoring Type (Page 00h Byte 220)

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以外の情報は捨ててしまっているのです。

qsfp.h

/* Diagnostic Monitoring Type - 220 */
#define SFF8636_DIAG_TYPE_OFFSET 0xDC
#define SFF8636_RX_PWR_TYPE_MASK 0x8

qsfp.c

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

sff-common.h

__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では表示文面以外の機能切り替えにこの値は使用していない。


コメント欄を読み込み中