Skip to content

The XGS 3300

Measured on a Sophos XGS 3300, board revision 1 - the string XGS 17 the firmware carries is the board's revision, not a model. This page is the appliance as an object: what it is, where each part of it is written up, the board photographed part by part, and the one reading of it that was on no page until now. The long pages are under families/, because the coprocessor family, not the chassis, is what the driver is written against.

What it is

Two computers in one box, like the rest of the range:

host         AMD Ryzen Embedded V1780B (x86), 8 threads, 16 GB, its own disk, OPNsense on it
coprocessor  Cavium OCTEON TX CN8365 (CN83XX, ARM), 20 cores, its own Linux, its own storage
link         PCIe, 177d:a300 with eight VFs at 177d:a303: an SDP endpoint - the host sees
             rings, not a NIC
front        twelve ports: Port1 to Port8 and PortF3/PortF4 behind an 88E6193X switch,
             PortF1/PortF2 at 10G direct to the coprocessor's BGX2 through an 88X5113 PHY
assembly     AMDA0202-0004, platform xgs1us

The coprocessor owns every front port. The host reaches them only through the SDP rings and the control channel, which is what families/octeon-tx.md describes end to end: the handshake, the ring, the port tags, and the order bring-up has to happen in.

Where each part is written up

part page
the carrier board's name; the CPLD and what it holds; the front panel and its protocol; the bypass relays; the service headers; the management NIC; the sensors, and how far the host gets toward them families/octeon-tx-peripherals.md
the three parts the work is about, on their photographs: the CN8365 at U11, the 88X5113 at U42, the V1780B the-road.md
the two channels that opened it: the CPLD on the coprocessor's SPI, and the three UARTs the-road.md
the port tags, the NetAgent operations, the datapath frame, the output queue, what does not work families/octeon-tx-reference.md
the control channel and the LIF gate behind the return direction families/octeon-tx-rpc.md
the crypto path, and why a host frame is refused families/octeon-tx-crypto-path.md
every number taken on it, with how and what it does not mean measurements/xgs3300.md
the USB-to-SPI bridge: fitted here, and it holds nothing npuep/npu-bring-up.md
capturing it under its own firmware before switching back octeontx/sfos-capture-plan.md
where the OCTEON TX knowledge came from octeontx/provenance.md

The board, photographed

Opened and photographed on 2026-10-01, with a second set taken later in better light. Everything in the pages above was read over a wire or out of a file; these are the same board, and three of the pictures settled questions that reading could not. Serial numbers and barcodes are blurred by hand - the private-data checker reads text and skips .jpg by design - and part markings are left, because they describe the design and not this unit.

The XGS 3300 opened, with its parts numbered

1 the coprocessor's carrier, NCB-XG330D on its silkscreen 8 the one blue indicator the board shows without software
2 two SO-DIMMs beside the host's cooler: the host's, by position 9 the Lattice part the board file calls the CPLD
3 the host, under its cooler, by position 10 the host's M.2 drive, marked EDILOC EN206
4 the coprocessor's heatsink, the larger of the two 11 a third SO-DIMM, beside the coprocessor's heatsink; whose it is, no page says
5 the relay bank, nine relays 12 the power supply
6 the four SFP cages down the right edge 13 the coprocessor's eMMC, the BGA beside the CPLD; its marking is not legible here
7 a third, smaller heatsink; what it covers, no page says

The numbers are placed by eye on the photograph. Where a row says "by position" or "no page says", that is all the evidence there is; the rest is named from the close-ups below and the pages above.

The XGS 3300, part by part

The carrier board

NCB-XG330D V0.3, dated 2022-10-04: the daughterboard at the top of the chassis is the coprocessor's carrier, and it carries its own name. Its barcode is the assembly this project quotes from the firmware, AMDA0202-0004, revision 17 - so the carrier board of an XGS 3300 is an engineering part named for the XG 330. The name on the silkscreen is not the name in the sales catalogue, and anyone matching boards to models should know it.

The OCTEON TX coprocessor

MARVELL OCTEON TX, CN8365-1500BG1676-SCP-G, at U11: the coprocessor that owns the twelve front ports, and everything in this repository is about reaching it. The platform database named it; this is the die cap saying the same thing.

The 88X5113 PHY

88X5113-BVM4, 2244 A1F, at U42: the 10G PHY behind PortF1 and PortF2, which the board file reaches at mdio45:0:7. A claim about this part was withdrawn once in this project, over a register that was never the indicator it was taken for; the part itself was never in doubt, and now it is on a photograph.

The host CPU

AMD Ryzen YE1780C3T4MFB: the V1780B, the x86 host, and the other end of the PCIe link. Its unit codes and data matrix are blurred; the model number is the evidence and stays.

The Lattice device

LATTICE
LCMXO3LF-2100C
5BG256C
MALAYSIA 2404

A MachXO3LF with 2,100 logic cells in a 256-ball BGA: an FPGA with its configuration flash on board rather than a CPLD in the old sense, which is why it answers a protocol of its own design over SPI with 32-bit registers. The vendor ships its image - amda0202-0004r03_0x05000008.vme, Lattice's own deployment format, and 0x05000008 is exactly what register 0x01 reports on this appliance - so the part, the toolchain, the image and a live register all agree. None of which is a reason to write it: the device holds the SFP cage pins, the fail-to-wire relays and the board's housekeeping, and reprogramming it is how an appliance stops being one.

The GIFAR bridge on the front panel board

GIFAR
GMRU20X4
U9010G2

On the front panel board, beside its own crystal: the EZIO interface itself, a serial-to-HD44780 bridge implemented in a programmable micro-controller. The LCD is not on the other end of the host's uart1; this micro-controller is, and the protocol is its own. The vendor's daemon sends 0xFE and then an HD44780 instruction to this very panel and it works, which is what an EZIO device accepts. The panel runs at 9600, not the 2400 the vendor's script appears to set - the script sets the input speed only, on a UART with a single divisor - and the display is 20 columns by 2 lines, read off the panel on 2026-10-02.

The front panel, end to end

The bypass relays

Nine of them, RELAY1 to RELAY9, each a NEXEM JAPAN UD2-3SNUN, 5A2414F, a two-form-C signal relay. The silkscreen beside them names pairs - LAN3, A10 B10, C10 D10 - which is what a bypass pair looks like laid out: one relay per differential pair, two pairs per port. This is the hardware behind CPLD registers 0x39, 0x3a and 0x3b, which this project reads and has decided not to write.

The service headers

The board brings out more than the console: JUART1, JTAG1 and JTAG2, JSPI1 and JSPI2, four selection jumpers JSW1 to JSW4, and one labelled PASS_CLEAR. Pin counts and pin-1 marks are read off the board; what each pin carries is not established and is not guessed.

What each header is and what it takes

JUART1 and its transceiver

JUART1 is at RS-232 levels, not logic levels: a SIPEX SP3232 transceiver sits immediately beside the header, so a 3.3 V adapter on it would see several volts. Which of the three host UARTs it carries - 0x3f8, 0x2f8 or 0x3e8 - is not established; the way to find out needs no soldering, a known pattern written to each in turn and the pins watched.

The Intel i210

WGI210AT, the Intel i210-AT: 8086:157b at pci0:2:0:0, igb0 under FreeBSD, the management port. It is the only Intel part on the board.

Inside the appliance

The first photograph, with the lid off: the two heatsinks, the SFP cages down the right edge, the relay bank beside them, and the single blue indicator that is the only light this board shows without software.

The markings, in one table

part marking as photographed designator what it is read from
the carrier board NCB-XG330D V0.3, 2022-10-04 - the coprocessor's carrier, an engineering part named for the XG 330 silkscreen; the barcode matches the firmware's assembly number
the coprocessor MARVELL OCTEON TX CN8365-1500BG1676-SCP-G U11 the OCTEON TX, owner of the twelve front ports the platform database, confirmed by the marking
the 10G PHY 88X5113-BVM4, 2244 A1F U42 behind PortF1 and PortF2 the board file, mdio45:0:7, confirmed by the marking
the host AMD Ryzen YE1780C3T4MFB - the V1780B, the x86 host software, confirmed by the marking
the CPLD LATTICE LCMXO3LF-2100C 5BG256C - a MachXO3LF FPGA holding the cages' pins and the relays marking; the vendor's .vme image and register 0x01 agree
the front panel's controller GIFAR GMRU20X4 U9010G2 - the EZIO bridge, a micro-controller driving a 20x2 HD44780 display marking; the rate and the width measured on the panel
the relays NEXEM JAPAN UD2-3SNUN 5A2414F RELAY1 to RELAY9 two-form-C signal relays, the fail-to-wire pairs marking; the registers behind them from the board file
the console transceiver SIPEX SP3232 beside JUART1 RS-232 levels on the header marking
the management NIC WGI210AT - Intel i210-AT, igb0 software, confirmed by the marking
the host's drive EDILOC EN206 - the host's M.2 drive the photograph only
the coprocessor's eMMC not legible - mmcblk1 on the coprocessor read on the coprocessor; the package by eye

The coprocessor's storage, read on the coprocessor

Read on 2026-09-29 from the coprocessor's own Linux, under the vendor's firmware, and on no page until now; the survey it comes from is in the inventory, which stays local.

The coprocessor boots from a SPI NOR flash, a Winbond w25q128 at spi0.0 - the CPLD is spi0.1 on the same bus, which is the spi:0:1:3 of the board file seen from the other side - in three MTD partitions:

device size offset name
mtd0 15,663,104 0 Firmware
mtd1 65,536 0xef0000 Misc config
mtd2 32,768 0xf00000 U-Boot env

The erase size is 4,096 bytes, not 64 KB. Nothing in this repository writes any of the three, and the U-Boot environment least of all: it is what the coprocessor boots by.

Its root is on the eMMC, mmcblk1, 7,634,944 KB (7.28 GB), with mmcblk1boot0 and mmcblk1boot1 of 4 MB each beside it, in four partitions:

partition blocks size what
p1 512,000 500 MB
p2 1,572,864 1.5 GB root, slot A
p3 1,572,864 1.5 GB root, slot B
p4 92,158 90 MB

Two root slots, so an upgrade writes the one not running. What p1 and p4 hold was not read.

The same reading took the fans: raising eight ports changed nothing measurable - the host's CPU 49 to 48 C, the coprocessor 64 C flat, the inlet 28 C, the two fans 6,900 and 7,200 rpm before and 6,900 and 6,900 after, against a 600 rpm minimum, with no under-speed flag. All eight switch PHYs share one die sensor, at 44 C; the two 10G PHYs read 49 C. The fans do not follow load.

And the port LEDs' colour scheme, as the firmware's own tool documents it: xgs-led <phy|all> <left> <right> on the coprocessor takes, for each of a port's two LEDs, 0 off, 1 the low-speed colour, 2 the high-speed colour, 3 resume normal, 4 the medium speed. A 1G copper port shows green at the low speed and amber at the high; a 2.5G port green on the left, and on the right green low and amber high; a 10G copper port green on the left, and on the right green low, amber medium and blue high; an SFP cage green on the left at both speeds, and an SFP+ cage amber low and blue high on the right. xgs-led-event register [value] is the event side. Neither was written to; this is what the tool's own usage text says.

The expansion bay belongs to the coprocessor

Measured on 2026-10-02, and kept out of the pages until 2026-10-12 as a research note; it is here now because a reading that is not published is a reading nobody can argue with.

The front expansion bay, with its PCIe-like edge, is the coprocessor's slot and not the host's. The board file says so in two keys:

npu0.slotA.presdet = cpld:8:20      presence: CPLD register 0x08, bit 20
npu0.slotA.vpd     = i2c1:1:0x50    the module's VPD EEPROM, on the coprocessor's I2C bus 1

An eight-port Intel FleXi module out of an XG 330 was fitted with the unit powered down, and it appeared in none of the five places it could have:

CPLD 0x08, bit 20 0; the register byte-identical to its baseline, 0x082471e0
all nineteen CPLD registers identical to the baseline
i2c1:1:0x50, and a scan of bus 1 from 0x08 to 0x77 no device at any address
host PCI only 8086:157b, the i210 management port; no free PCIe root port exists
the port table, the switch ports, the interfaces 13 records, the same status registers, 12 interfaces

An XG-generation module is a host PCIe NIC, and this bay is a coprocessor slot: they are not the same kind of thing, and the vendor's own catalogue lists XGS modules as a separate line from the XG and SG ones. If a module of the right kind is ever fitted it adds eight ports and the port table passes thirteen; OCTEP_DP_IF_MAX in contrib/octep/octep.h is 13, so that is one constant and one reboot. It was not one constant: a module of the right kind added its ports to the coprocessor and none to the host, because the host bound a fixed list of twelve - see below. The baseline for any later comparison: CPLD 0x08 = 0x082471e0, 0x25 = 0x00386aeb, switch ports 0f4d 0e0f 0e0f 000f x6 0249 0249.

A module of the right kind, fitted

A 4x10G SFP+ FleXi module, assembly AMDA0207-0001 revision 02, was fitted on 2026-10-15 to the first XGS 3300 and is in the second one now (board revision 09). The coprocessor sees it in every place the first module was absent from:

CPLD 0x08 0x083471e0 - the baseline plus bit 20, the bay's presence
I2C bus 1 answers at 0x50 to 0x57, where nothing did
the platform database npu0.slotA.present=1, slotA.assembly.partno=AMDA0207-0001, slotA.eth.macs=4, and four more ports: eth12 to eth15, lifports 12 to 15, 10G, named A4 to A1
xgs-ports -b sixteen ports: 1 to 8, F3, F4, F1, F2, A4, A3, A2, A1
NetAgent's discover eighteen entries, the module's at tags 3 to 6

The host presented twelve until the bring-up was taught to bind whatever the coprocessor reports and to name it from the platform database; it presents sixteen now, the module's as oxp12 to oxp15 named A4 to A1. How, and what is not yet measured (traffic through a module port), is in octep/expansion-modules.md.

The XGS 136, the other appliance here, has its own page: xgs136.md.

Discussion

The discussion of this page is held in the project's GitHub Discussions. Showing it here loads giscus from giscus.app and GitHub, and writing in it needs a GitHub account - what that means.