in fboss/util/wedge_qsfp_util.cpp [1872:2066]
void printCmisDetail(const DOMDataUnion& domDataUnion, unsigned int port) {
int i = 0; // For the index of lane
CmisData cmisData = domDataUnion.get_cmis();
const uint8_t *lowerBuf, *page0Buf, *page01Buf, *page10Buf, *page11Buf,
*page14Buf;
lowerBuf = cmisData.lower()->data();
page0Buf = cmisData.page0()->data();
// Some CMIS optics like Blanco bypass modules have flat memory so we need
// to exclude other pages for these modules
bool flatMem = ((lowerBuf[2] & 0x80) != 0);
if (!flatMem) {
page01Buf = can_throw(cmisData.page01())->data();
page10Buf = can_throw(cmisData.page10())->data();
page11Buf = can_throw(cmisData.page11())->data();
page14Buf = can_throw(cmisData.page14())->data();
}
printf("Port %d\n", port);
printf(" Module Interface Type: CMIS (200G or above)\n");
printf(
" Module State: %s\n",
getStateNameString(lowerBuf[3] >> 1, kCmisModuleStateMapping).c_str());
if (!flatMem) {
auto ApSel = page11Buf[78] >> 4;
auto ApCode = lowerBuf[86 + (ApSel - 1) * 4 + 1];
printf(
" Application Selected: %s\n",
getStateNameString(ApCode, kCmisAppNameMapping).c_str());
}
printf(" Low power: 0x%x\n", (lowerBuf[26] >> 6) & 0x1);
printf(" Low power forced: 0x%x\n", (lowerBuf[26] >> 4) & 0x1);
printf(" Module FW Version: %x.%x\n", lowerBuf[39], lowerBuf[40]);
if (!flatMem) {
printf(" DSP FW Version: %x.%x\n", page01Buf[66], page01Buf[67]);
printf(" Build Rev: %x.%x\n", page01Buf[68], page01Buf[69]);
}
printf(" Firmware fault: 0x%x\n", (lowerBuf[8] >> 1) & 0x3);
auto vendor = sfpString(page0Buf, 1, 16);
auto vendorPN = sfpString(page0Buf, 20, 16);
auto vendorRev = sfpString(page0Buf, 36, 2);
auto vendorSN = sfpString(page0Buf, 38, 16);
auto vendorDate = sfpString(page0Buf, 54, 8);
printf(" Vendor: %s\n", vendor.str().c_str());
printf(" Vendor PN: %s\n", vendorPN.str().c_str());
printf(" Vendor Rev: %s\n", vendorRev.str().c_str());
printf(" Vendor SN: %s\n", vendorSN.str().c_str());
printf(" Date Code: %s\n", vendorDate.str().c_str());
printf(
" EEPROM Checksum: %s\n",
getEepromCsumStatus(domDataUnion) ? "Valid" : "Invalid");
auto temp = static_cast<int8_t>(lowerBuf[14]) + (lowerBuf[15] / 256.0);
printf(" Temperature: %f C\n", temp);
printf(
" VCC: %f V\n", CmisFieldInfo::getVcc(lowerBuf[16] << 8 | lowerBuf[17]));
if (!flatMem) {
printf("\nPer Lane status: \n");
printf(
"Lanes 1 2 3 4 5 6 7 8\n");
printf("Datapath de-init ");
for (i = 0; i < 8; i++) {
printf("%d ", (page10Buf[0] >> i) & 1);
}
printf("\nTx disable ");
for (i = 0; i < 8; i++) {
printf("%d ", (page10Buf[2] >> i) & 1);
}
printf("\nTx squelch bmap ");
for (i = 0; i < 8; i++) {
printf("%d ", (page10Buf[4] >> i) & 1);
}
printf("\nRx Out disable ");
for (i = 0; i < 8; i++) {
printf("%d ", (page10Buf[10] >> i) & 1);
}
printf("\nRx Sqlch disable ");
for (i = 0; i < 8; i++) {
printf("%d ", (page10Buf[11] >> i) & 1);
}
printf("\nHost lane state ");
for (i = 0; i < 4; i++) {
printf(
"%-7s %-7s ",
getStateNameString(page11Buf[i] & 0xf, kCmisLaneStateMapping).c_str(),
getStateNameString((page11Buf[i] >> 4) & 0xf, kCmisLaneStateMapping)
.c_str());
}
printf("\nTx fault ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[7] >> i) & 1);
}
printf("\nTx LOS ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[8] >> i) & 1);
}
printf("\nTx LOL ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[9] >> i) & 1);
}
printf("\nTx PWR alarm Hi ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[11] >> i) & 1);
}
printf("\nTx PWR alarm Lo ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[12] >> i) & 1);
}
printf("\nTx PWR warn Hi ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[13] >> i) & 1);
}
printf("\nTx PWR warn Lo ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[14] >> i) & 1);
}
printf("\nRx LOS ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[19] >> i) & 1);
}
printf("\nRx LOL ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[20] >> i) & 1);
}
printf("\nRx PWR alarm Hi ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[21] >> i) & 1);
}
printf("\nRx PWR alarm Lo ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[22] >> i) & 1);
}
printf("\nRx PWR warn Hi ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[23] >> i) & 1);
}
printf("\nRx PWR warn Lo ");
for (i = 0; i < 8; i++) {
printf("%d ", (page11Buf[24] >> i) & 1);
}
printf("\nTX Power (mW) ");
for (i = 0; i < 8; i++) {
printf(
"%.3f ",
((page11Buf[26 + i * 2] << 8 | page11Buf[27 + i * 2])) * 0.0001);
}
printf("\nRX Power (mW) ");
for (i = 0; i < 8; i++) {
printf(
"%.3f ",
((page11Buf[58 + i * 2] << 8 | page11Buf[59 + i * 2])) * 0.0001);
}
printf("\nRx SNR ");
for (i = 0; i < 8; i++) {
printf(
"%05.04g ",
(CmisFieldInfo::getSnr(
page14Buf[113 + i * 2] << 8 | page14Buf[112 + i * 2])));
}
printf("\nRX PreCur (dB) ");
for (i = 0; i < 8; i++) {
printf(
"%.1f ",
CmisFieldInfo::getPreCursor(
(page11Buf[95 + i / 2] >> ((i % 2) * 4)) & 0x0f));
}
printf("\nRX PostCur (dB) ");
for (i = 0; i < 8; i++) {
printf(
"%.1f ",
CmisFieldInfo::getPostCursor(
(page11Buf[99 + i / 2] >> ((i % 2) * 4)) & 0x0f));
}
printf("\nRX Ampl (mV) ");
for (i = 0; i < 8; i++) {
auto ampRange = CmisFieldInfo::getAmplitude(
(page11Buf[103 + i / 2] >> ((i % 2) * 4)) & 0x0f);
char rangeStr[16];
sprintf(rangeStr, "%d-%d ", ampRange.first, ampRange.second);
rangeStr[9] = 0;
printf("%s", rangeStr);
}
}
if (auto timeCollected = cmisData.timeCollected()) {
printf("\nTime collected: %s", getLocalTime(*timeCollected).c_str());
}
printf("\n\n");
}