diff --git a/doc/devices/F7008-2.5.md b/doc/devices/F7008-2.5.md
new file mode 100644
index 00000000..f069d250
--- /dev/null
+++ b/doc/devices/F7008-2.5.md
@@ -0,0 +1,70 @@
+# F7008-2.5
+
+Documentation for the unmanaged 8 + 1 switch sold as `7018-2.5G` by Guangnianwei
+(光年微), board marking `F7008-2.5`, PCB `F7008-2.5GPOE-V1.2`.
+
+### Brands
+
+| Brand | Type | Managed | PCB | Flash | Chip RTL |
+|-------|------|---------|-----|-------|----------|
+| Guangnianwei (光年微) | 7018-2.5G | No | F7008-2.5GPOE-V1.2 | W25Q64JVSSIQ | 8373N + 8224N |
+
+### What works
+
+- All eight 2.5GBASE-T RJ45 ports at 10/100/1000/2500 Mbps
+- SFP+ port with 1G/2.5G/10G modules
+- LEDs of the eight RJ45 ports
+
+### Not verified
+
+- The LED pads for the SFP+ cage are not mapped yet. The SFP+ lamps are left
+ undriven, so an inserted module lights nothing.
+- The UART header footprint is present but unpopulated, and no boot log could be
+ captured from it, so the baud rate is unknown. There are most likely
+ unpopulated 0-Ohm resistors next to the header; bridging those should bring
+ the console to life.
+
+### Build target
+
+```
+make MACHINE=F7008_2_5
+```
+
+### LED wiring
+
+Measured pad to lamp map (`led_mux` index -> lamp):
+
+| Port | green lamp | yellow lamp |
+|------|-----------|-------------|
+| 1 | pad 0 | pad 1 |
+| 2 | pad 2 | pad 3 |
+| 3 | pad 4 | pad 5 |
+| 4 | pad 6 | pad 8 |
+| 5 | pad 9 | pad 10 |
+| 6 | pad 12 | pad 15 |
+| 7 | pad 18 | pad 21 |
+| 8 | pad 24 | pad 25 |
+
+Pads 7, 11, 13, 14, 16, 17, 19, 20, 22, 23, 26 and 27 do not drive an RJ45 lamp.
+
+The front panel is silkscreened `2.5G: Green / 10/100M: Yellow`, and the target
+follows it: the green lamp is on while the port is linked at 2.5G, the yellow
+lamp blinks while data is flowing.
+
+### PCB overview
+
+The board is marked `F7008-2.5GPOE-V1.2`.
+
+Top side:
+
+
+
+Bottom side:
+
+
+
+### Hardware notes
+
+- 4 x `RT4802SNE` magnetics
+- Unpopulated UART header footprint, next to the magnetics
+- Power input 12V 1A, 180 x 84 x 29 mm metal case
diff --git a/doc/devices/photos/F7008-2.5/PCB-bottom.jpg b/doc/devices/photos/F7008-2.5/PCB-bottom.jpg
new file mode 100644
index 00000000..c4b34c13
Binary files /dev/null and b/doc/devices/photos/F7008-2.5/PCB-bottom.jpg differ
diff --git a/doc/devices/photos/F7008-2.5/PCB-top.jpg b/doc/devices/photos/F7008-2.5/PCB-top.jpg
new file mode 100644
index 00000000..c8f73825
Binary files /dev/null and b/doc/devices/photos/F7008-2.5/PCB-top.jpg differ
diff --git a/doc/supported_devices.md b/doc/supported_devices.md
index dbb217ee..7a08013b 100644
--- a/doc/supported_devices.md
+++ b/doc/supported_devices.md
@@ -36,6 +36,7 @@ The following devices have been tested and are fully working:
| Xikestore| SKS3200M-4GPY2XF| Yes | [SWTG024AS-v1.0](devices/SWTG024AS.md) | | 4 + 2 |
| XikeStor | SKS3200-8E1X | Yes | [SWTG118AS-V2.1-17462](devices/SWTGW218AS.md) | 2M | 8 + 1 |
| Ztyuav | Z-QWYT0402 | No | [PCB-K0402WS-V3.0](devices/PCB-K0402WS-V3.0.md) | | 4 + 2 |
+| Guangnianwei | 7018-2.5G | No | [F7008-2.5GPOE-V1.2](devices/F7008-2.5.md) | 8M | 8 + 1 |
For KP-9000-6XH-X2 / KP-9000-6XHML-X2 / Mokerlink 2G040210GSM devices, select
the machine target by PCB revision. The ML/non-ML or managed/unmanaged label
diff --git a/machine.c b/machine.c
index 23e7ca41..a2746fe2 100644
--- a/machine.c
+++ b/machine.c
@@ -1325,6 +1325,47 @@ __code const struct machine machine = {
},
};
+#elif defined MACHINE_F7008_2_5
+__code const struct machine machine = {
+ .machine_name = "F7008-2.5 8+1 SFP Port Switch",
+ .isRTL8373 = 1,
+ .min_port = 0,
+ .max_port = 8,
+ .n_sfp = 1,
+ .log_to_phys_port = {1, 2, 3, 4, 5, 6, 7, 8, 9},
+ .phys_to_log_port = {0, 1, 2, 3, 4, 5, 6, 7, 8},
+ .is_sfp = {0, 0, 0, 0, 0, 0, 0, 0, 1},
+ .sfp_port[0].pin_detect = GPIO30_ACL_BIT3_EN,
+ .sfp_port[0].pin_los = GPIO37,
+ .sfp_port[0].pin_tx_disable = GPIO_NA,
+ .sfp_port[0].sds = 1,
+ .sfp_port[0].i2c = I2CBUS( GPIO39_I2C_SDA4, GPIO40_I2C_SCL3_MDC1 ),
+ .reset_pin = GPIO_NA,
+ .high_leds = { .mux = LED_27 | LED_29, .enable = LED_28_SYS | LED_29 },
+ .port_led_set = {0, 0, 0, 0, 0, 0, 0, 0, 1},
+ .led_sets = {
+ { /* SET0 */
+ LEDS_2G5 | LEDS_LINK, /* LEDID0 - green: 2.5G link */
+ LEDS_2G5 | LEDS_1G | LEDS_100M | LEDS_10M | LEDS_LINK | LEDS_ACT, /* LEDID1 - yellow: traffic */
+ 0,
+ 0,
+ },
+ { /* SET1 - SFP+ */
+ LEDS_10G | LEDS_5G | LEDS_2G5 | LEDS_LINK,
+ LEDS_10G | LEDS_5G | LEDS_2G5 | LEDS_1G | LEDS_LINK | LEDS_ACT,
+ 0,
+ 0,
+ },
+ },
+ .led_mux_custom = 1,
+ .led_mux = {
+ 0x00, 0x01, 0x04, 0x05, 0x08, 0x09, 0x0c, 0x02,
+ 0x0d, 0x10, 0x11, 0x02, 0x14, 0x02, 0x02, 0x15,
+ 0x02, 0x02, 0x18, 0x02, 0x02, 0x19, 0x02, 0x02,
+ 0x1c, 0x1d, 0x02, 0x02,
+ },
+};
+
#else
#error "Please select a machine type in machine.h"
#endif
diff --git a/machine.h b/machine.h
index ecf5f617..4867b8a2 100644
--- a/machine.h
+++ b/machine.h
@@ -48,6 +48,7 @@
// #define MACHINE_POE_2G080110GS
// #define MACHINE_PB_2132
// #define MACHINE_HASIVO_S600W_4GT_2XGT_SE
+// #define MACHINE_F7008_2_5
#define LED_27 1
// SYSTEM LED