static int am65_cpsw_nuss_common_open(struct am65_cpsw_common *common)
 {
        struct am65_cpsw_host *host_p = am65_common_get_host(common);
-       int port_idx, i, ret;
+       int port_idx, i, ret, tx;
        struct sk_buff *skb;
        u32 val, port_mask;
 
                                                  AM65_CPSW_MAX_PACKET_SIZE,
                                                  GFP_KERNEL);
                if (!skb) {
+                       ret = -ENOMEM;
                        dev_err(common->dev, "cannot allocate skb\n");
-                       return -ENOMEM;
+                       if (i)
+                               goto fail_rx;
+
+                       return ret;
                }
 
                ret = am65_cpsw_nuss_rx_push(common, skb);
                                "cannot submit skb to channel rx, error %d\n",
                                ret);
                        kfree_skb(skb);
+                       if (i)
+                               goto fail_rx;
+
                        return ret;
                }
-               kmemleak_not_leak(skb);
        }
-       k3_udma_glue_enable_rx_chn(common->rx_chns.rx_chn);
 
-       for (i = 0; i < common->tx_ch_num; i++) {
-               ret = k3_udma_glue_enable_tx_chn(common->tx_chns[i].tx_chn);
-               if (ret)
-                       return ret;
-               napi_enable(&common->tx_chns[i].napi_tx);
+       ret = k3_udma_glue_enable_rx_chn(common->rx_chns.rx_chn);
+       if (ret) {
+               dev_err(common->dev, "couldn't enable rx chn: %d\n", ret);
+               goto fail_rx;
+       }
+
+       for (tx = 0; tx < common->tx_ch_num; tx++) {
+               ret = k3_udma_glue_enable_tx_chn(common->tx_chns[tx].tx_chn);
+               if (ret) {
+                       dev_err(common->dev, "couldn't enable tx chn %d: %d\n",
+                               tx, ret);
+                       tx--;
+                       goto fail_tx;
+               }
+               napi_enable(&common->tx_chns[tx].napi_tx);
        }
 
        napi_enable(&common->napi_rx);
 
        dev_dbg(common->dev, "cpsw_nuss started\n");
        return 0;
+
+fail_tx:
+       while (tx >= 0) {
+               napi_disable(&common->tx_chns[tx].napi_tx);
+               k3_udma_glue_disable_tx_chn(common->tx_chns[tx].tx_chn);
+               tx--;
+       }
+
+       k3_udma_glue_disable_rx_chn(common->rx_chns.rx_chn);
+
+fail_rx:
+       k3_udma_glue_reset_rx_chn(common->rx_chns.rx_chn, 0,
+                                 &common->rx_chns,
+                                 am65_cpsw_nuss_rx_cleanup, 0);
+       return ret;
 }
 
 static int am65_cpsw_nuss_common_stop(struct am65_cpsw_common *common)