pcs_node = of_parse_phandle(dn, "pcs-handle", 0);
phy_node = of_parse_phandle(dn, "phy-handle", 0);
- if (!phy_node) {
- if (pn != priv->cpu_port)
- dev_err(priv->dev, "Port node %d misses phy-handle\n", pn);
+ if (pn != priv->cpu_port && !phy_node && !pcs_node) {
+ dev_err(priv->dev, "Port node %d has neither pcs-handle nor phy-handle\n", pn);
continue;
}
}
}
+ if (!phy_node) {
+ if (priv->pcs[pn])
+ priv->ports[pn].phy_is_integrated = true;
+
+ continue;
+ }
+
/* Check for the integrated SerDes of the RTL8380M first */
if (of_property_read_bool(phy_node, "phy-is-integrated")
&& priv->id == 0x8380 && pn >= 24) {
msleep(1000);
/* Enable all ports with a PHY, including the SFP-ports */
for (int i = 0; i < priv->cpu_port; i++) {
- if (priv->ports[i].phy)
+ if (priv->ports[i].phy || priv->pcs[i])
v |= BIT_ULL(i);
}
* they will work in isolated mode (only traffic between port and CPU).
*/
for (int i = 0; i < priv->cpu_port; i++) {
- if (priv->ports[i].phy) {
+ if (priv->ports[i].phy || priv->pcs[i]) {
priv->ports[i].pm = BIT_ULL(priv->cpu_port);
priv->r->traffic_set(i, BIT_ULL(i));
}
* they will work in isolated mode (only traffic between port and CPU).
*/
for (int i = 0; i < priv->cpu_port; i++) {
- if (priv->ports[i].phy) {
+ if (priv->ports[i].phy || priv->pcs[i]) {
priv->ports[i].pm = BIT_ULL(priv->cpu_port);
priv->r->traffic_set(i, BIT_ULL(i));
}
struct rtldsa_counter_state *counters;
for (int i = 0; i < priv->cpu_port; i++) {
- if (!priv->ports[i].phy)
+ if (!priv->ports[i].phy && !priv->pcs[i])
continue;
counters = &priv->ports[i].counters;
struct rtldsa_counter_state *counters;
for (int i = 0; i < priv->cpu_port; i++) {
- if (!priv->ports[i].phy)
+ if (!priv->ports[i].phy && !priv->pcs[i])
continue;
counters = &priv->ports[i].counters;
sw_w32_mask(0x3 << pos, 0, RTL930X_LED_PORT_FIB_SET_SEL_CTRL(i));
sw_w32_mask(0x3 << pos, 0, RTL930X_LED_PORT_COPR_SET_SEL_CTRL(i));
- if (!priv->ports[i].phy && !(forced_leds_per_port[i]))
+ if (!priv->ports[i].phy && !priv->pcs[i] && !(forced_leds_per_port[i]))
continue;
if (forced_leds_per_port[i] > 0)
sw_w32_mask(0x3 << pos, 0, RTL931X_LED_PORT_COPR_SET_SEL_CTRL(i));
/* Skip port if not present (auto-detect) or not in forced mask */
- if (!priv->ports[i].phy && !(forced_leds_per_port[i]))
+ if (!priv->ports[i].phy && !priv->pcs[i] && !(forced_leds_per_port[i]))
continue;
if (forced_leds_per_port[i] > 0)