QSFP28 ve QSFP-DD kodlama: SFF-8472 A0h/A2h'yi terk edince kimlik bloğu nerede yaşıyor
Entegratörler için küçük partiler halinde modül yeniden kodlaması yapıyorum, ve şimdiye kadar tezgahımdaki her şey SFP şeklindeydi: ilk yarısında seri kimliği olan A0h'deki 256 byte'ı oku, diagnostik ve eşikler için A2h'yi oku, kimlik bloğunu yaz, bitti. Şimdi bir müşteri 100G ve 400G parçalarla ortaya çıktı ve düzeneğim açıkça yetersiz kalıyor.
- yeniden kodlanacak modüller: bir tepsi QSFP28, birkaç QSFP-DD ve bir OSFP örneği
- mevcut programlayıcı: sade I2C, A0h ve A2h'yi okuyup yazıyor, hiç page select yok
- uzak uçtaki host'lar portu yakmadan önce vendor name, part number ve seri numarasını kontrol ediyor
Belleğin nasıl düzenlendiğine dair çalışma notlarım, ki asıl kontrol edilmesini istediğim bu:
SFP/SFP+/SFP28 (SFF-8472): A0h 256B, serial ID in first 128B; A2h 256B diagnostics + thresholds, optional 128B pages
QSFP+/QSFP28 (SFF-8636): single A0h, 128B pages selected by byte 7Fh, page 00h mandatory
XFP (INF-8077i): byte 7Fh picks the active table, with serial ID in table 01h and user EEPROM in 02h
OSFP/QSFP-DD/SFP-DD (CMIS 5.x): lower 128B fixed, upper memory by bank and page via 7Eh and 7Fh
Denediklerim:
- bir QSFP28'i SFP profilimle dump ettim, bu bana alt yarıyı artı o anda hangi sayfa seçiliyse onu veriyor
- bellek kendi kendine hangi byte'ların hareket ettiğini görmek için aynı modülün art arda iki dump'ını aldım
Bu harita doğru mu, ve bellek sayfalandığında ve banklandığında vendor kodlaması için gerçekte hangi alanları yazmam gerekiyor?
Comments 5
Harita özünde doğru. Düzeneğinde eksik olan şey, SFF-8636'da tek bir adres olduğu ve üst 128 byte'ın bir pencere olduğu: page numarasını byte 7Fh'ye yazıyorsun, sonra üst yarıyı okuyorsun ve o sayfayı alıyorsun. Page 00h zorunlu olanı ve kimlik bloğunu tutuyor, yani kodlama için nadiren başka bir yere gitmen gerekiyor. CMIS bunun üzerine bir bank koyuyor - 7Eh bank'ı seçiyor, 7Fh page'i, ve alt 128 byte sabit ve her zaman okunabilir kalıyor. Page select olmadan aracın sana modülün park edildiği hangi sayfaysa onu vermeye devam ediyor, ki bu tam olarak tarif ettiğin davranış.
Vendor kodlaması için önemli olan alanlar her yerde aynı: vendor name, part number, revizyon, seri, OUI ve checksum'lar. Bir checksum'ı yanlış al ve titiz bir host, her string bir hex dump'ta mükemmel görünse bile modülü dışarı atar. Hazır olunması gereken bir şey daha: bazı modüller vendor fonksiyonlarını üretici ve host parolalarının arkasında korurken sade okumalar açık kalıyor, yani yazamadığın bir parçayı mutlulukla dump edebilirsin.
İlk denemede beni tam olarak checksum'lar ısırdı - string'ler bilinen iyi bir modülle byte byte eşleşti ve host yine de parçayı reddetti. Page 00h'nin kimlik bloğu için yeterli olduğunu bilmek iyi, bu işin kapsamını küçük tutuyor.
Dürüst özet o zaman şu ki, programlayıcım bunu hiç yapamıyor, çünkü bir okumadan önce byte 7Fh'yi yazmanın hiçbir yolu yok. Tek bir sipariş için ev yapımı bir düzeneğe page select cıvatalamaktansa bir kart satın alırım. Piyasada CMIS bank'larını düzgün ele alan bir şey var mı, yoksa bu daha çok bir datasheet özelliği mi?
Ticari kartlar bunu gerçekten reklam ediyor - SFPTotal Plus X, Reveltronics ekipmanı (REVELPROG-IS), EDGE programlayıcıları ve Flexoptix, hepsi QSFP-DD ve OSFP'yi özellik listesine koyuyor, ve bir vendor kod veritabanını da işin içine katıyorlar. SFPTotal, Cisco, Huawei ve HPE dahil 25.000'in üzerinde kod iddia ediyor.
Bunun ne kadarının tezgahındaki belirli parçalarla örtüştüğü ayrı bir soru, ve buna da sözümü güvenme derim. Yapabiliyorsan, satın almayı taahhüt etmeden önce müşterinin QSFP-DD'sinden bir örneği kartın önüne koy. Bir datasheet'teki form faktör desteği, elindeki belirli modülün desteğiyle aynı şey değil, ve o boşluğun göründüğü yer banklanmış parçalar.
Karşılaştırma için, sade SFP işi her zamanki kadar ilkel: 256 byte'lık dump'ın sadece ilk 128 byte'ı gerçekten önemli, gerisi üretici rezervi, ve insanlar yıllardır jenerik CWDM parçalarını bir Catalyst 3560, bir HP J8692A ya da bir EX4200-24F'e kabul ettirmek için üzerlerine GLC-LX ya da GLC-BX-D/GLC-BX-U image'ları yazıyor. Bunun için ev yapımı programlayıcı şemaları elden ele dolaştı, benim yaptığım serp-0.3 idi, ve bir Finisar FCMJ-8521-3'ten, bir HP J4858C ya da J4859C'den ya da bir D-Link DEM-310GT'den dump'lar olağan referans noktalarıydı.
Farklı bir hayvan, ama tezgahına GPON çubukları düşerse bilmeye değer: orada dışarıdan hiç kodlama yapmıyorsun. Nokia G-010S-A'nın bir akrabası olan bir FS GPON-ONU-34-20BI'de, çubuğun kendisinde bir shell alıyorsun - fiber takılıyken 192.168.1.10'da ONTUSER olarak yanıt veriyor - seri ve MAC'i uci ile ayarla, ve EEPROM vendor string'lerini içeriden sfp_i2c ile yeniden yaz.
QDD ve OSFP, CMIS yapısına sahip ve Page 0'da sadece tek bir checksum byte'ı içeriyor.