diff options
Diffstat (limited to 'drivers/net/wireless/ipw2x00/ipw2200.c')
| -rw-r--r-- | drivers/net/wireless/ipw2x00/ipw2200.c | 20 | 
1 files changed, 18 insertions, 2 deletions
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 63c2a7ade5f..8d72e3d1958 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c @@ -31,6 +31,7 @@  ******************************************************************************/  #include <linux/sched.h> +#include <linux/slab.h>  #include "ipw2200.h" @@ -3177,14 +3178,27 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)  	int total_nr = 0;  	int i;  	struct pci_pool *pool; -	u32 *virts[CB_NUMBER_OF_ELEMENTS_SMALL]; -	dma_addr_t phys[CB_NUMBER_OF_ELEMENTS_SMALL]; +	void **virts; +	dma_addr_t *phys;  	IPW_DEBUG_TRACE("<< : \n"); +	virts = kmalloc(sizeof(void *) * CB_NUMBER_OF_ELEMENTS_SMALL, +			GFP_KERNEL); +	if (!virts) +		return -ENOMEM; + +	phys = kmalloc(sizeof(dma_addr_t) * CB_NUMBER_OF_ELEMENTS_SMALL, +			GFP_KERNEL); +	if (!phys) { +		kfree(virts); +		return -ENOMEM; +	}  	pool = pci_pool_create("ipw2200", priv->pci_dev, CB_MAX_LENGTH, 0, 0);  	if (!pool) {  		IPW_ERROR("pci_pool_create failed\n"); +		kfree(phys); +		kfree(virts);  		return -ENOMEM;  	} @@ -3254,6 +3268,8 @@ static int ipw_load_firmware(struct ipw_priv *priv, u8 * data, size_t len)  		pci_pool_free(pool, virts[i], phys[i]);  	pci_pool_destroy(pool); +	kfree(phys); +	kfree(virts);  	return ret;  }  |