return ret;
 }
 
+static int qca8k_find_cpu_port(struct dsa_switch *ds)
+{
+       struct qca8k_priv *priv = ds->priv;
+
+       /* Find the connected cpu port. Valid port are 0 or 6 */
+       if (dsa_is_cpu_port(ds, 0))
+               return 0;
+
+       dev_dbg(priv->dev, "port 0 is not the CPU port. Checking port 6");
+
+       if (dsa_is_cpu_port(ds, 6))
+               return 6;
+
+       return -EINVAL;
+}
+
 static int
 qca8k_parse_port_config(struct qca8k_priv *priv)
 {
 qca8k_setup(struct dsa_switch *ds)
 {
        struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
-       int ret, i;
+       int cpu_port, ret, i;
        u32 mask;
 
-       /* Make sure that port 0 is the cpu port */
-       if (!dsa_is_cpu_port(ds, 0)) {
-               dev_err(priv->dev, "port 0 is not the CPU port");
-               return -EINVAL;
+       cpu_port = qca8k_find_cpu_port(ds);
+       if (cpu_port < 0) {
+               dev_err(priv->dev, "No cpu port configured in both cpu port0 and port6");
+               return cpu_port;
        }
 
        /* Parse CPU port config to be later used in phy_link mac_config */
                dev_warn(priv->dev, "mib init failed");
 
        /* Enable QCA header mode on the cpu port */
-       ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(QCA8K_CPU_PORT),
+       ret = qca8k_write(priv, QCA8K_REG_PORT_HDR_CTRL(cpu_port),
                          QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_TX_S |
                          QCA8K_PORT_HDR_CTRL_ALL << QCA8K_PORT_HDR_CTRL_RX_S);
        if (ret) {
 
        /* Forward all unknown frames to CPU port for Linux processing */
        ret = qca8k_write(priv, QCA8K_REG_GLOBAL_FW_CTRL1,
-                         BIT(0) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S |
-                         BIT(0) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S |
-                         BIT(0) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S |
-                         BIT(0) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S);
+                         BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_IGMP_DP_S |
+                         BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_BC_DP_S |
+                         BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_MC_DP_S |
+                         BIT(cpu_port) << QCA8K_GLOBAL_FW_CTRL1_UC_DP_S);
        if (ret)
                return ret;
 
        for (i = 0; i < QCA8K_NUM_PORTS; i++) {
                /* CPU port gets connected to all user ports of the switch */
                if (dsa_is_cpu_port(ds, i)) {
-                       ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(QCA8K_CPU_PORT),
+                       ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(cpu_port),
                                        QCA8K_PORT_LOOKUP_MEMBER, dsa_user_ports(ds));
                        if (ret)
                                return ret;
 
                        ret = qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(i),
                                        QCA8K_PORT_LOOKUP_MEMBER,
-                                       BIT(QCA8K_CPU_PORT));
+                                       BIT(cpu_port));
                        if (ret)
                                return ret;
 
 qca8k_port_bridge_join(struct dsa_switch *ds, int port, struct net_device *br)
 {
        struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
-       int port_mask = BIT(QCA8K_CPU_PORT);
+       int port_mask, cpu_port;
        int i, ret;
 
+       cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
+       port_mask = BIT(cpu_port);
+
        for (i = 1; i < QCA8K_NUM_PORTS; i++) {
                if (dsa_to_port(ds, i)->bridge_dev != br)
                        continue;
 qca8k_port_bridge_leave(struct dsa_switch *ds, int port, struct net_device *br)
 {
        struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
-       int i;
+       int cpu_port, i;
+
+       cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
 
        for (i = 1; i < QCA8K_NUM_PORTS; i++) {
                if (dsa_to_port(ds, i)->bridge_dev != br)
         * this port
         */
        qca8k_rmw(priv, QCA8K_PORT_LOOKUP_CTRL(port),
-                 QCA8K_PORT_LOOKUP_MEMBER, BIT(QCA8K_CPU_PORT));
+                 QCA8K_PORT_LOOKUP_MEMBER, BIT(cpu_port));
 }
 
 static int