.release = tb_switch_release,
 };
 
+static int tb_switch_get_generation(struct tb_switch *sw)
+{
+       switch (sw->config.device_id) {
+       case PCI_DEVICE_ID_INTEL_LIGHT_RIDGE:
+       case PCI_DEVICE_ID_INTEL_EAGLE_RIDGE:
+       case PCI_DEVICE_ID_INTEL_LIGHT_PEAK:
+       case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_2C:
+       case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C:
+       case PCI_DEVICE_ID_INTEL_PORT_RIDGE:
+       case PCI_DEVICE_ID_INTEL_REDWOOD_RIDGE_2C_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_REDWOOD_RIDGE_4C_BRIDGE:
+               return 1;
+
+       case PCI_DEVICE_ID_INTEL_WIN_RIDGE_2C_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE:
+               return 2;
+
+       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_LP_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_4C_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_BRIDGE:
+       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_BRIDGE:
+               return 3;
+
+       default:
+               /*
+                * For unknown switches assume generation to be 1 to be
+                * on the safe side.
+                */
+               tb_sw_warn(sw, "unsupported switch device id %#x\n",
+                          sw->config.device_id);
+               return 1;
+       }
+}
+
 /**
  * tb_switch_alloc() - allocate a switch
  * @tb: Pointer to the owning domain
                sw->ports[i].port = i;
        }
 
+       sw->generation = tb_switch_get_generation(sw);
+
        cap = tb_switch_find_vse_cap(sw, TB_VSE_CAP_PLUG_EVENTS);
        if (cap < 0) {
                tb_sw_warn(sw, "cannot find TB_VSE_CAP_PLUG_EVENTS aborting\n");
                tb_sw_warn(sw, "unknown switch vendor id %#x\n",
                           sw->config.vendor_id);
 
-       switch (sw->config.device_id) {
-       case PCI_DEVICE_ID_INTEL_LIGHT_RIDGE:
-       case PCI_DEVICE_ID_INTEL_CACTUS_RIDGE_4C:
-       case PCI_DEVICE_ID_INTEL_PORT_RIDGE:
-       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_2C_BRIDGE:
-       case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_BRIDGE:
-       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_2C_BRIDGE:
-       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_4C_BRIDGE:
-       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_2C_BRIDGE:
-       case PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_BRIDGE:
-               break;
-
-       default:
-               tb_sw_warn(sw, "unsupported switch device id %#x\n",
-                          sw->config.device_id);
-       }
-
        sw->config.enabled = 1;
 
        /* upload configuration */
 
  * @device: Device ID of the switch
  * @vendor_name: Name of the vendor (or %NULL if not known)
  * @device_name: Name of the device (or %NULL if not known)
+ * @generation: Switch Thunderbolt generation
  * @cap_plug_events: Offset to the plug events capability (%0 if not found)
  * @is_unplugged: The switch is going away
  * @drom: DROM of the switch (%NULL if not found)
        u16 device;
        const char *vendor_name;
        const char *device_name;
+       unsigned int generation;
        int cap_plug_events;
        bool is_unplugged;
        u8 *drom;