diff options
Diffstat (limited to 'drivers/net/ethernet/freescale/gianfar.c')
| -rw-r--r-- | drivers/net/ethernet/freescale/gianfar.c | 14 | 
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c index 19ac096cb07..bffb2edd685 100644 --- a/drivers/net/ethernet/freescale/gianfar.c +++ b/drivers/net/ethernet/freescale/gianfar.c @@ -210,7 +210,7 @@ static int gfar_init_bds(struct net_device *ndev)  				skb = gfar_new_skb(ndev);  				if (!skb) {  					netdev_err(ndev, "Can't allocate RX buffers\n"); -					goto err_rxalloc_fail; +					return -ENOMEM;  				}  				rx_queue->rx_skbuff[j] = skb; @@ -223,10 +223,6 @@ static int gfar_init_bds(struct net_device *ndev)  	}  	return 0; - -err_rxalloc_fail: -	free_skb_resources(priv); -	return -ENOMEM;  }  static int gfar_alloc_skb_resources(struct net_device *ndev) @@ -1359,7 +1355,11 @@ static int gfar_restore(struct device *dev)  		return 0;  	} -	gfar_init_bds(ndev); +	if (gfar_init_bds(ndev)) { +		free_skb_resources(priv); +		return -ENOMEM; +	} +  	init_registers(ndev);  	gfar_set_mac_address(ndev);  	gfar_init_mac(ndev); @@ -1712,6 +1712,7 @@ static void free_skb_tx_queue(struct gfar_priv_tx_q *tx_queue)  		tx_queue->tx_skbuff[i] = NULL;  	}  	kfree(tx_queue->tx_skbuff); +	tx_queue->tx_skbuff = NULL;  }  static void free_skb_rx_queue(struct gfar_priv_rx_q *rx_queue) @@ -1735,6 +1736,7 @@ static void free_skb_rx_queue(struct gfar_priv_rx_q *rx_queue)  		rxbdp++;  	}  	kfree(rx_queue->rx_skbuff); +	rx_queue->rx_skbuff = NULL;  }  /* If there are any tx skbs or rx skbs still around, free them.  |