#include "realtek.h"
 
 /* Chip-specific data and limits */
-#define RTL8365MB_CHIP_ID_8365MB_VC            0x6367
-#define RTL8365MB_LEARN_LIMIT_MAX_8365MB_VC    2112
-static const int rtl8365mb_extint_port_map[] = { -1, -1, -1, -1, -1, -1, 1 };
+#define RTL8365MB_CHIP_ID_8365MB_VC    0x6367
+#define RTL8365MB_CHIP_VER_8365MB_VC   0x0040
+
+#define RTL8365MB_CHIP_ID_8367S                0x6367
+#define RTL8365MB_CHIP_VER_8367S       0x00A0
 
 /* Family-specific data and limits */
-#define RTL8365MB_PHYADDRMAX   7
-#define RTL8365MB_NUM_PHYREGS  32
-#define RTL8365MB_PHYREGMAX    (RTL8365MB_NUM_PHYREGS - 1)
-#define RTL8365MB_MAX_NUM_PORTS  7
+#define RTL8365MB_PHYADDRMAX           7
+#define RTL8365MB_NUM_PHYREGS          32
+#define RTL8365MB_PHYREGMAX            (RTL8365MB_NUM_PHYREGS - 1)
+/* RTL8370MB and RTL8310SR, possibly suportable by this driver, have 10 ports */
+#define RTL8365MB_MAX_NUM_PORTS                10
+#define RTL8365MB_LEARN_LIMIT_MAX      2112
+
+/* valid for all 6-port or less variants */
+static const int rtl8365mb_extint_port_map[]  = { -1, -1, -1, -1, -1, -1, 1, 2, -1, -1};
 
 /* Chip identification registers */
 #define RTL8365MB_CHIP_ID_REG          0x1300
 
        switch (chip_id) {
        case RTL8365MB_CHIP_ID_8365MB_VC:
-               dev_info(priv->dev,
-                        "found an RTL8365MB-VC switch (ver=0x%04x)\n",
-                        chip_ver);
+               switch (chip_ver) {
+               case RTL8365MB_CHIP_VER_8365MB_VC:
+                       dev_info(priv->dev,
+                                "found an RTL8365MB-VC switch (ver=0x%04x)\n",
+                                chip_ver);
+                       break;
+               case RTL8365MB_CHIP_VER_8367S:
+                       dev_info(priv->dev,
+                                "found an RTL8367S switch (ver=0x%04x)\n",
+                                chip_ver);
+                       break;
+               default:
+                       dev_err(priv->dev, "unrecognized switch version (ver=0x%04x)",
+                               chip_ver);
+                       return -ENODEV;
+               }
 
                priv->num_ports = RTL8365MB_MAX_NUM_PORTS;
 
                mb->chip_id = chip_id;
                mb->chip_ver = chip_ver;
                mb->port_mask = GENMASK(priv->num_ports - 1, 0);
-               mb->learn_limit_max = RTL8365MB_LEARN_LIMIT_MAX_8365MB_VC;
+               mb->learn_limit_max = RTL8365MB_LEARN_LIMIT_MAX;
                mb->jam_table = rtl8365mb_init_jam_8365mb_vc;
                mb->jam_size = ARRAY_SIZE(rtl8365mb_init_jam_8365mb_vc);