@@ -274,6 +274,12 @@ static int mlxreg_hotplug_attr_init(struct mlxreg_hotplug_priv_data *priv)
if (ret)
return ret;
+ if (!regval)
+ continue;
+
+ /* Remove non-relevant bits. */
+ if (item->capability_mask)
+ regval = (regval & item->capability_mask) << item->capability_bit;
item->mask = GENMASK((regval & item->mask) - 1, 0);
}
@@ -294,7 +300,19 @@ static int mlxreg_hotplug_attr_init(struct mlxreg_hotplug_priv_data *priv)
if (ret)
return ret;
- if (!(regval & data->bit)) {
+ /*
+ * In case slot field is provided, capability
+ * register contains counter, otherwise bitmask.
+ * Skip non-relevant entries if slot set and
+ * exceeds counter. Othewise validate entry by
+ * matching bitmask.
+ */
+ if (data->capability_mask)
+ regval = (regval & item->capability_mask) <<
+ item->capability_bit;
+ if (data->slot > regval) {
+ break;
+ } else if (!(regval & data->bit) && !data->slot) {
data++;
continue;
}
@@ -611,7 +629,7 @@ static int mlxreg_hotplug_set_irq(struct mlxreg_hotplug_priv_data *priv)
if (ret)
goto out;
- if (!(regval & data->bit))
+ if (!(regval & data->bit) && !data->slot)
item->mask &= ~BIT(j);
}
}