return 0;
 }
 
+static void bcm_sf2_crossbar_setup(struct bcm_sf2_priv *priv)
+{
+       struct device *dev = priv->dev->ds->dev;
+       int shift;
+       u32 mask;
+       u32 reg;
+       int i;
+
+       mask = BIT(priv->num_crossbar_int_ports) - 1;
+
+       reg = reg_readl(priv, REG_CROSSBAR);
+       switch (priv->type) {
+       case BCM4908_DEVICE_ID:
+               shift = CROSSBAR_BCM4908_INT_P7 * priv->num_crossbar_int_ports;
+               reg &= ~(mask << shift);
+               if (0) /* FIXME */
+                       reg |= CROSSBAR_BCM4908_EXT_SERDES << shift;
+               else if (priv->int_phy_mask & BIT(7))
+                       reg |= CROSSBAR_BCM4908_EXT_GPHY4 << shift;
+               else if (phy_interface_mode_is_rgmii(priv->port_sts[7].mode))
+                       reg |= CROSSBAR_BCM4908_EXT_RGMII << shift;
+               else if (WARN(1, "Invalid port mode\n"))
+                       return;
+               break;
+       default:
+               return;
+       }
+       reg_writel(priv, reg, REG_CROSSBAR);
+
+       reg = reg_readl(priv, REG_CROSSBAR);
+       for (i = 0; i < priv->num_crossbar_int_ports; i++) {
+               shift = i * priv->num_crossbar_int_ports;
+
+               dev_dbg(dev, "crossbar int port #%d - ext port #%d\n", i,
+                       (reg >> shift) & mask);
+       }
+}
+
 static void bcm_sf2_intr_disable(struct bcm_sf2_priv *priv)
 {
        intrl2_0_mask_set(priv, 0xffffffff);
                return ret;
        }
 
+       bcm_sf2_crossbar_setup(priv);
+
        ret = bcm_sf2_cfp_resume(ds);
        if (ret)
                return ret;
        const u16 *reg_offsets;
        unsigned int core_reg_align;
        unsigned int num_cfp_rules;
+       unsigned int num_crossbar_int_ports;
 };
 
 static const u16 bcm_sf2_4908_reg_offsets[] = {
        .core_reg_align = 0,
        .reg_offsets    = bcm_sf2_4908_reg_offsets,
        .num_cfp_rules  = 0, /* FIXME */
+       .num_crossbar_int_ports = 2,
 };
 
 /* Register offsets for the SWITCH_REG_* block */
        priv->reg_offsets = data->reg_offsets;
        priv->core_reg_align = data->core_reg_align;
        priv->num_cfp_rules = data->num_cfp_rules;
+       priv->num_crossbar_int_ports = data->num_crossbar_int_ports;
 
        priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev,
                                                                "switch");
                goto out_clk_mdiv;
        }
 
+       bcm_sf2_crossbar_setup(priv);
+
        bcm_sf2_gphy_enable_set(priv->dev->ds, true);
 
        ret = bcm_sf2_mdio_register(ds);
 
 #define  PHY_PHYAD_SHIFT               8
 #define  PHY_PHYAD_MASK                        0x1F
 
+/* Relative to REG_CROSSBAR */
+#define CROSSBAR_BCM4908_INT_P7                0
+#define CROSSBAR_BCM4908_INT_RUNNER    1
+#define CROSSBAR_BCM4908_EXT_SERDES    0
+#define CROSSBAR_BCM4908_EXT_GPHY4     1
+#define CROSSBAR_BCM4908_EXT_RGMII     2
+
 #define REG_RGMII_CNTRL_P(x)           (REG_RGMII_0_CNTRL + (x))
 
 /* Relative to REG_RGMII_CNTRL */