diff options
author | Michal Simek <michal.simek@xilinx.com> | 2020-02-06 14:36:46 +0100 |
---|---|---|
committer | Michal Simek <michal.simek@xilinx.com> | 2020-02-28 12:04:10 +0100 |
commit | 58ecd9ad0be3b0c4c3e278b718dada687f7e0d9d (patch) | |
tree | e306851d81f134db04699d69583b501d123f9daa /drivers | |
parent | 380376520f726ee7544c2fcd3c114187f01a6f27 (diff) | |
download | u-boot-58ecd9ad0be3b0c4c3e278b718dada687f7e0d9d.tar.gz |
net: zynq: Free allocated buffers in case of error
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/zynq_gem.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/net/zynq_gem.c b/drivers/net/zynq_gem.c index 7f9dc3435b..5f2f87d352 100644 --- a/drivers/net/zynq_gem.c +++ b/drivers/net/zynq_gem.c @@ -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) |