net: zynq: Free allocated buffers in case of error
authorMichal Simek <michal.simek@xilinx.com>
Thu, 6 Feb 2020 13:36:46 +0000 (14:36 +0100)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 28 Feb 2020 11:04:10 +0000 (12:04 +0100)
Driver probe function is called again and again in case of error.
Malloc space is getting full which is is reported by:
 Insufficient RAM for page table: 0x15000 > 0x14000.
 Please increase the size in get_page_table_size()
 ### ERROR ### Please RESET the board ###

The patch is freeing allocated buffers on error path to avoid panic.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
drivers/net/zynq_gem.c

index 7f9dc3435bf228eef9142aaebe67cbad16852201..5f2f87d352c401d7fb343c3b463ba03a2948929b 100644 (file)
@@ -661,8 +661,10 @@ static int zynq_gem_probe(struct udevice *dev)
 
        /* Align bd_space to MMU_SECTION_SHIFT */
        bd_space = memalign(1 << MMU_SECTION_SHIFT, BD_SPACE);
-       if (!bd_space)
-               return -ENOMEM;
+       if (!bd_space) {
+               ret = -ENOMEM;
+               goto err1;
+       }
 
        mmu_set_region_dcache_behaviour((phys_addr_t)bd_space,
                                        BD_SPACE, DCACHE_OFF);
@@ -674,7 +676,7 @@ static int zynq_gem_probe(struct udevice *dev)
        ret = clk_get_by_name(dev, "tx_clk", &priv->clk);
        if (ret < 0) {
                dev_err(dev, "failed to get clock\n");
-               return -EINVAL;
+               goto err1;
        }
 
        priv->bus = mdio_alloc();
@@ -684,9 +686,19 @@ static int zynq_gem_probe(struct udevice *dev)
 
        ret = mdio_register_seq(priv->bus, dev->seq);
        if (ret)
-               return ret;
+               goto err2;
 
-       return zynq_phy_init(dev);
+       ret = zynq_phy_init(dev);
+       if (ret)
+               goto err2;
+
+       return ret;
+
+err2:
+       free(priv->rxbuffers);
+err1:
+       free(priv->tx_bd);
+       return ret;
 }
 
 static int zynq_gem_remove(struct udevice *dev)