Patchwork : vxge: Fix checkstack warning in vxge_probe()

login
register
mail settings
Submitter Prarit Bhargava
Date May 28, 2010, 6:01 p.m.
Message ID <20100528175735.30903.21134.sendpatchset@prarit.bos.redhat.com>
Download mbox | patch
Permalink /patch/53937/
State Accepted
Delegated to: David Miller
Headers show

Comments

Prarit Bhargava - May 28, 2010, 6:01 p.m.
Linux 2.6.33 reports this checkstack warning:

drivers/net/vxge/vxge-main.c: In function 'vxge_probe':
drivers/net/vxge/vxge-main.c:4409: warning: the frame size of 1028 bytes is larger than 1024 bytes

This warning does not occur in the latest linux-2.6 or linux-next, however,
when I do a 'make -j32 CONFIG_FRAME_WARN=512' instead of 1024 I see

drivers/net/vxge/vxge-main.c: In function ‘vxge_probe’:
drivers/net/vxge/vxge-main.c:4423: warning: the frame size of 1024 bytes is larger than 512 bytes

This patch moves the large vxge_config struct off the stack.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jon Mason - June 2, 2010, 3:03 a.m.
On Fri, 2010-05-28 at 14:01 -0400, Prarit Bhargava wrote:
> Linux 2.6.33 reports this checkstack warning:
> 
> drivers/net/vxge/vxge-main.c: In function 'vxge_probe':
> drivers/net/vxge/vxge-main.c:4409: warning: the frame size of 1028 bytes is larger than 1024 bytes
> 
> This warning does not occur in the latest linux-2.6 or linux-next, however,
> when I do a 'make -j32 CONFIG_FRAME_WARN=512' instead of 1024 I see
> 
> drivers/net/vxge/vxge-main.c: In function ‘vxge_probe’:
> drivers/net/vxge/vxge-main.c:4423: warning: the frame size of 1024 bytes is larger than 512 bytes
> 
> This patch moves the large vxge_config struct off the stack.

The patch is sufficient, but I think it doesn't go far enough.  The
struct vxge_config in struct vxgedev should be malloc'd as well.  struct
vxgedev is entirely too big and needs to be smaller, for cache perf and
other reasons.

Thanks,
Jon

> 
> Signed-off-by: Prarit Bhargava <prarit@redhat.com>
> 
> diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c
> index 2bab364..b955802 100644
> --- a/drivers/net/vxge/vxge-main.c
> +++ b/drivers/net/vxge/vxge-main.c
> @@ -4016,7 +4016,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  	int high_dma = 0;
>  	u64 vpath_mask = 0;
>  	struct vxgedev *vdev;
> -	struct vxge_config ll_config;
> +	struct vxge_config *ll_config = NULL;
>  	struct vxge_hw_device_config *device_config = NULL;
>  	struct vxge_hw_device_attr attr;
>  	int i, j, no_of_vpath = 0, max_vpath_supported = 0;
> @@ -4075,17 +4075,24 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  		goto _exit0;
>  	}
>  
> -	memset(&ll_config, 0, sizeof(struct vxge_config));
> -	ll_config.tx_steering_type = TX_MULTIQ_STEERING;
> -	ll_config.intr_type = MSI_X;
> -	ll_config.napi_weight = NEW_NAPI_WEIGHT;
> -	ll_config.rth_steering = RTH_STEERING;
> +	ll_config = kzalloc(sizeof(*ll_config), GFP_KERNEL);
> +	if (!ll_config) {
> +		ret = -ENOMEM;
> +		vxge_debug_init(VXGE_ERR,
> +			"ll_config : malloc failed %s %d",
> +			__FILE__, __LINE__);
> +		goto _exit0;
> +	}
> +	ll_config->tx_steering_type = TX_MULTIQ_STEERING;
> +	ll_config->intr_type = MSI_X;
> +	ll_config->napi_weight = NEW_NAPI_WEIGHT;
> +	ll_config->rth_steering = RTH_STEERING;
>  
>  	/* get the default configuration parameters */
>  	vxge_hw_device_config_default_get(device_config);
>  
>  	/* initialize configuration parameters */
> -	vxge_device_config_init(device_config, &ll_config.intr_type);
> +	vxge_device_config_init(device_config, &ll_config->intr_type);
>  
>  	ret = pci_enable_device(pdev);
>  	if (ret) {
> @@ -4138,7 +4145,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  		(unsigned long long)pci_resource_start(pdev, 0));
>  
>  	status = vxge_hw_device_hw_info_get(attr.bar0,
> -			&ll_config.device_hw_info);
> +			&ll_config->device_hw_info);
>  	if (status != VXGE_HW_OK) {
>  		vxge_debug_init(VXGE_ERR,
>  			"%s: Reading of hardware info failed."
> @@ -4147,7 +4154,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  		goto _exit3;
>  	}
>  
> -	if (ll_config.device_hw_info.fw_version.major !=
> +	if (ll_config->device_hw_info.fw_version.major !=
>  		VXGE_DRIVER_FW_VERSION_MAJOR) {
>  		vxge_debug_init(VXGE_ERR,
>  			"%s: Incorrect firmware version."
> @@ -4157,7 +4164,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  		goto _exit3;
>  	}
>  
> -	vpath_mask = ll_config.device_hw_info.vpath_mask;
> +	vpath_mask = ll_config->device_hw_info.vpath_mask;
>  	if (vpath_mask == 0) {
>  		vxge_debug_ll_config(VXGE_TRACE,
>  			"%s: No vpaths available in device", VXGE_DRIVER_NAME);
> @@ -4169,10 +4176,10 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  		"%s:%d  Vpath mask = %llx", __func__, __LINE__,
>  		(unsigned long long)vpath_mask);
>  
> -	function_mode = ll_config.device_hw_info.function_mode;
> -	host_type = ll_config.device_hw_info.host_type;
> +	function_mode = ll_config->device_hw_info.function_mode;
> +	host_type = ll_config->device_hw_info.host_type;
>  	is_privileged = __vxge_hw_device_is_privilaged(host_type,
> -		ll_config.device_hw_info.func_id);
> +		ll_config->device_hw_info.func_id);
>  
>  	/* Check how many vpaths are available */
>  	for (i = 0; i < VXGE_HW_MAX_VIRTUAL_PATHS; i++) {
> @@ -4186,7 +4193,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  
>  	/* Enable SRIOV mode, if firmware has SRIOV support and if it is a PF */
>  	if (is_sriov(function_mode) && (max_config_dev > 1) &&
> -		(ll_config.intr_type != INTA) &&
> +		(ll_config->intr_type != INTA) &&
>  		(is_privileged == VXGE_HW_OK)) {
>  		ret = pci_enable_sriov(pdev, ((max_config_dev - 1) < num_vfs)
>  			? (max_config_dev - 1) : num_vfs);
> @@ -4199,7 +4206,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  	 * Configure vpaths and get driver configured number of vpaths
>  	 * which is less than or equal to the maximum vpaths per function.
>  	 */
> -	no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, &ll_config);
> +	no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, ll_config);
>  	if (!no_of_vpath) {
>  		vxge_debug_ll_config(VXGE_ERR,
>  			"%s: No more vpaths to configure", VXGE_DRIVER_NAME);
> @@ -4234,21 +4241,21 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  	/* set private device info */
>  	pci_set_drvdata(pdev, hldev);
>  
> -	ll_config.gro_enable = VXGE_GRO_ALWAYS_AGGREGATE;
> -	ll_config.fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS;
> -	ll_config.addr_learn_en = addr_learn_en;
> -	ll_config.rth_algorithm = RTH_ALG_JENKINS;
> -	ll_config.rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4;
> -	ll_config.rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE;
> -	ll_config.rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
> -	ll_config.rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
> -	ll_config.rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
> -	ll_config.rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
> -	ll_config.rth_bkt_sz = RTH_BUCKET_SIZE;
> -	ll_config.tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
> -	ll_config.rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
> -
> -	if (vxge_device_register(hldev, &ll_config, high_dma, no_of_vpath,
> +	ll_config->gro_enable = VXGE_GRO_ALWAYS_AGGREGATE;
> +	ll_config->fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS;
> +	ll_config->addr_learn_en = addr_learn_en;
> +	ll_config->rth_algorithm = RTH_ALG_JENKINS;
> +	ll_config->rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4;
> +	ll_config->rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE;
> +	ll_config->rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
> +	ll_config->rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
> +	ll_config->rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
> +	ll_config->rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
> +	ll_config->rth_bkt_sz = RTH_BUCKET_SIZE;
> +	ll_config->tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
> +	ll_config->rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
> +
> +	if (vxge_device_register(hldev, ll_config, high_dma, no_of_vpath,
>  		&vdev)) {
>  		ret = -EINVAL;
>  		goto _exit4;
> @@ -4279,7 +4286,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  		vdev->vpaths[j].vdev = vdev;
>  		vdev->vpaths[j].max_mac_addr_cnt = max_mac_vpath;
>  		memcpy((u8 *)vdev->vpaths[j].macaddr,
> -				(u8 *)ll_config.device_hw_info.mac_addrs[i],
> +				ll_config->device_hw_info.mac_addrs[i],
>  				ETH_ALEN);
>  
>  		/* Initialize the mac address list header */
> @@ -4300,18 +4307,18 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  
>  	macaddr = (u8 *)vdev->vpaths[0].macaddr;
>  
> -	ll_config.device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0';
> -	ll_config.device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0';
> -	ll_config.device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0';
> +	ll_config->device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0';
> +	ll_config->device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0';
> +	ll_config->device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0';
>  
>  	vxge_debug_init(VXGE_TRACE, "%s: SERIAL NUMBER: %s",
> -		vdev->ndev->name, ll_config.device_hw_info.serial_number);
> +		vdev->ndev->name, ll_config->device_hw_info.serial_number);
>  
>  	vxge_debug_init(VXGE_TRACE, "%s: PART NUMBER: %s",
> -		vdev->ndev->name, ll_config.device_hw_info.part_number);
> +		vdev->ndev->name, ll_config->device_hw_info.part_number);
>  
>  	vxge_debug_init(VXGE_TRACE, "%s: Neterion %s Server Adapter",
> -		vdev->ndev->name, ll_config.device_hw_info.product_desc);
> +		vdev->ndev->name, ll_config->device_hw_info.product_desc);
>  
>  	vxge_debug_init(VXGE_TRACE, "%s: MAC ADDR: %pM",
>  		vdev->ndev->name, macaddr);
> @@ -4321,11 +4328,11 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  
>  	vxge_debug_init(VXGE_TRACE,
>  		"%s: Firmware version : %s Date : %s", vdev->ndev->name,
> -		ll_config.device_hw_info.fw_version.version,
> -		ll_config.device_hw_info.fw_date.date);
> +		ll_config->device_hw_info.fw_version.version,
> +		ll_config->device_hw_info.fw_date.date);
>  
>  	if (new_device) {
> -		switch (ll_config.device_hw_info.function_mode) {
> +		switch (ll_config->device_hw_info.function_mode) {
>  		case VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION:
>  			vxge_debug_init(VXGE_TRACE,
>  			"%s: Single Function Mode Enabled", vdev->ndev->name);
> @@ -4348,7 +4355,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  	vxge_print_parm(vdev, vpath_mask);
>  
>  	/* Store the fw version for ethttool option */
> -	strcpy(vdev->fw_version, ll_config.device_hw_info.fw_version.version);
> +	strcpy(vdev->fw_version, ll_config->device_hw_info.fw_version.version);
>  	memcpy(vdev->ndev->dev_addr, (u8 *)vdev->vpaths[0].macaddr, ETH_ALEN);
>  	memcpy(vdev->ndev->perm_addr, vdev->ndev->dev_addr, ETH_ALEN);
>  
> @@ -4387,7 +4394,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  	 * present to prevent such a failure.
>  	 */
>  
> -	if (ll_config.device_hw_info.function_mode ==
> +	if (ll_config->device_hw_info.function_mode ==
>  		VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION)
>  		if (vdev->config.intr_type == INTA)
>  			vxge_hw_device_unmask_all(hldev);
> @@ -4399,6 +4406,7 @@ vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
>  	VXGE_COPY_DEBUG_INFO_TO_LL(vdev, vxge_hw_device_error_level_get(hldev),
>  		vxge_hw_device_trace_level_get(hldev));
>  
> +	kfree(ll_config);
>  	return 0;
>  
>  _exit5:
> @@ -4416,6 +4424,7 @@ _exit2:
>  _exit1:
>  	pci_disable_device(pdev);
>  _exit0:
> +	kfree(ll_config);
>  	kfree(device_config);
>  	driver_config->config_dev_cnt--;
>  	pci_set_drvdata(pdev, NULL);
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
David Miller - June 2, 2010, 12:51 p.m.
From: Prarit Bhargava <prarit@redhat.com>

Date: Fri, 28 May 2010 14:01:49 -0400

> Linux 2.6.33 reports this checkstack warning:

> 

> drivers/net/vxge/vxge-main.c: In function 'vxge_probe':

> drivers/net/vxge/vxge-main.c:4409: warning: the frame size of 1028 bytes is larger than 1024 bytes

> 

> This warning does not occur in the latest linux-2.6 or linux-next, however,

> when I do a 'make -j32 CONFIG_FRAME_WARN=512' instead of 1024 I see

> 

> drivers/net/vxge/vxge-main.c: In function ‘vxge_probe’:

> drivers/net/vxge/vxge-main.c:4423: warning: the frame size of 1024 bytes is larger than 512 bytes

> 

> This patch moves the large vxge_config struct off the stack.

> 

> Signed-off-by: Prarit Bhargava <prarit@redhat.com>


Applied to net-next-2.6, thanks.

Patch

diff --git a/drivers/net/vxge/vxge-main.c b/drivers/net/vxge/vxge-main.c
index 2bab364..b955802 100644
--- a/drivers/net/vxge/vxge-main.c
+++ b/drivers/net/vxge/vxge-main.c
@@ -4016,7 +4016,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 	int high_dma = 0;
 	u64 vpath_mask = 0;
 	struct vxgedev *vdev;
-	struct vxge_config ll_config;
+	struct vxge_config *ll_config = NULL;
 	struct vxge_hw_device_config *device_config = NULL;
 	struct vxge_hw_device_attr attr;
 	int i, j, no_of_vpath = 0, max_vpath_supported = 0;
@@ -4075,17 +4075,24 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 		goto _exit0;
 	}
 
-	memset(&ll_config, 0, sizeof(struct vxge_config));
-	ll_config.tx_steering_type = TX_MULTIQ_STEERING;
-	ll_config.intr_type = MSI_X;
-	ll_config.napi_weight = NEW_NAPI_WEIGHT;
-	ll_config.rth_steering = RTH_STEERING;
+	ll_config = kzalloc(sizeof(*ll_config), GFP_KERNEL);
+	if (!ll_config) {
+		ret = -ENOMEM;
+		vxge_debug_init(VXGE_ERR,
+			"ll_config : malloc failed %s %d",
+			__FILE__, __LINE__);
+		goto _exit0;
+	}
+	ll_config->tx_steering_type = TX_MULTIQ_STEERING;
+	ll_config->intr_type = MSI_X;
+	ll_config->napi_weight = NEW_NAPI_WEIGHT;
+	ll_config->rth_steering = RTH_STEERING;
 
 	/* get the default configuration parameters */
 	vxge_hw_device_config_default_get(device_config);
 
 	/* initialize configuration parameters */
-	vxge_device_config_init(device_config, &ll_config.intr_type);
+	vxge_device_config_init(device_config, &ll_config->intr_type);
 
 	ret = pci_enable_device(pdev);
 	if (ret) {
@@ -4138,7 +4145,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 		(unsigned long long)pci_resource_start(pdev, 0));
 
 	status = vxge_hw_device_hw_info_get(attr.bar0,
-			&ll_config.device_hw_info);
+			&ll_config->device_hw_info);
 	if (status != VXGE_HW_OK) {
 		vxge_debug_init(VXGE_ERR,
 			"%s: Reading of hardware info failed."
@@ -4147,7 +4154,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 		goto _exit3;
 	}
 
-	if (ll_config.device_hw_info.fw_version.major !=
+	if (ll_config->device_hw_info.fw_version.major !=
 		VXGE_DRIVER_FW_VERSION_MAJOR) {
 		vxge_debug_init(VXGE_ERR,
 			"%s: Incorrect firmware version."
@@ -4157,7 +4164,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 		goto _exit3;
 	}
 
-	vpath_mask = ll_config.device_hw_info.vpath_mask;
+	vpath_mask = ll_config->device_hw_info.vpath_mask;
 	if (vpath_mask == 0) {
 		vxge_debug_ll_config(VXGE_TRACE,
 			"%s: No vpaths available in device", VXGE_DRIVER_NAME);
@@ -4169,10 +4176,10 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 		"%s:%d  Vpath mask = %llx", __func__, __LINE__,
 		(unsigned long long)vpath_mask);
 
-	function_mode = ll_config.device_hw_info.function_mode;
-	host_type = ll_config.device_hw_info.host_type;
+	function_mode = ll_config->device_hw_info.function_mode;
+	host_type = ll_config->device_hw_info.host_type;
 	is_privileged = __vxge_hw_device_is_privilaged(host_type,
-		ll_config.device_hw_info.func_id);
+		ll_config->device_hw_info.func_id);
 
 	/* Check how many vpaths are available */
 	for (i = 0; i < VXGE_HW_MAX_VIRTUAL_PATHS; i++) {
@@ -4186,7 +4193,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 
 	/* Enable SRIOV mode, if firmware has SRIOV support and if it is a PF */
 	if (is_sriov(function_mode) && (max_config_dev > 1) &&
-		(ll_config.intr_type != INTA) &&
+		(ll_config->intr_type != INTA) &&
 		(is_privileged == VXGE_HW_OK)) {
 		ret = pci_enable_sriov(pdev, ((max_config_dev - 1) < num_vfs)
 			? (max_config_dev - 1) : num_vfs);
@@ -4199,7 +4206,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 	 * Configure vpaths and get driver configured number of vpaths
 	 * which is less than or equal to the maximum vpaths per function.
 	 */
-	no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, &ll_config);
+	no_of_vpath = vxge_config_vpaths(device_config, vpath_mask, ll_config);
 	if (!no_of_vpath) {
 		vxge_debug_ll_config(VXGE_ERR,
 			"%s: No more vpaths to configure", VXGE_DRIVER_NAME);
@@ -4234,21 +4241,21 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 	/* set private device info */
 	pci_set_drvdata(pdev, hldev);
 
-	ll_config.gro_enable = VXGE_GRO_ALWAYS_AGGREGATE;
-	ll_config.fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS;
-	ll_config.addr_learn_en = addr_learn_en;
-	ll_config.rth_algorithm = RTH_ALG_JENKINS;
-	ll_config.rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4;
-	ll_config.rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE;
-	ll_config.rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
-	ll_config.rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
-	ll_config.rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
-	ll_config.rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
-	ll_config.rth_bkt_sz = RTH_BUCKET_SIZE;
-	ll_config.tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
-	ll_config.rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
-
-	if (vxge_device_register(hldev, &ll_config, high_dma, no_of_vpath,
+	ll_config->gro_enable = VXGE_GRO_ALWAYS_AGGREGATE;
+	ll_config->fifo_indicate_max_pkts = VXGE_FIFO_INDICATE_MAX_PKTS;
+	ll_config->addr_learn_en = addr_learn_en;
+	ll_config->rth_algorithm = RTH_ALG_JENKINS;
+	ll_config->rth_hash_type_tcpipv4 = VXGE_HW_RING_HASH_TYPE_TCP_IPV4;
+	ll_config->rth_hash_type_ipv4 = VXGE_HW_RING_HASH_TYPE_NONE;
+	ll_config->rth_hash_type_tcpipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
+	ll_config->rth_hash_type_ipv6 = VXGE_HW_RING_HASH_TYPE_NONE;
+	ll_config->rth_hash_type_tcpipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
+	ll_config->rth_hash_type_ipv6ex = VXGE_HW_RING_HASH_TYPE_NONE;
+	ll_config->rth_bkt_sz = RTH_BUCKET_SIZE;
+	ll_config->tx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
+	ll_config->rx_pause_enable = VXGE_PAUSE_CTRL_ENABLE;
+
+	if (vxge_device_register(hldev, ll_config, high_dma, no_of_vpath,
 		&vdev)) {
 		ret = -EINVAL;
 		goto _exit4;
@@ -4279,7 +4286,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 		vdev->vpaths[j].vdev = vdev;
 		vdev->vpaths[j].max_mac_addr_cnt = max_mac_vpath;
 		memcpy((u8 *)vdev->vpaths[j].macaddr,
-				(u8 *)ll_config.device_hw_info.mac_addrs[i],
+				ll_config->device_hw_info.mac_addrs[i],
 				ETH_ALEN);
 
 		/* Initialize the mac address list header */
@@ -4300,18 +4307,18 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 
 	macaddr = (u8 *)vdev->vpaths[0].macaddr;
 
-	ll_config.device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0';
-	ll_config.device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0';
-	ll_config.device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0';
+	ll_config->device_hw_info.serial_number[VXGE_HW_INFO_LEN - 1] = '\0';
+	ll_config->device_hw_info.product_desc[VXGE_HW_INFO_LEN - 1] = '\0';
+	ll_config->device_hw_info.part_number[VXGE_HW_INFO_LEN - 1] = '\0';
 
 	vxge_debug_init(VXGE_TRACE, "%s: SERIAL NUMBER: %s",
-		vdev->ndev->name, ll_config.device_hw_info.serial_number);
+		vdev->ndev->name, ll_config->device_hw_info.serial_number);
 
 	vxge_debug_init(VXGE_TRACE, "%s: PART NUMBER: %s",
-		vdev->ndev->name, ll_config.device_hw_info.part_number);
+		vdev->ndev->name, ll_config->device_hw_info.part_number);
 
 	vxge_debug_init(VXGE_TRACE, "%s: Neterion %s Server Adapter",
-		vdev->ndev->name, ll_config.device_hw_info.product_desc);
+		vdev->ndev->name, ll_config->device_hw_info.product_desc);
 
 	vxge_debug_init(VXGE_TRACE, "%s: MAC ADDR: %pM",
 		vdev->ndev->name, macaddr);
@@ -4321,11 +4328,11 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 
 	vxge_debug_init(VXGE_TRACE,
 		"%s: Firmware version : %s Date : %s", vdev->ndev->name,
-		ll_config.device_hw_info.fw_version.version,
-		ll_config.device_hw_info.fw_date.date);
+		ll_config->device_hw_info.fw_version.version,
+		ll_config->device_hw_info.fw_date.date);
 
 	if (new_device) {
-		switch (ll_config.device_hw_info.function_mode) {
+		switch (ll_config->device_hw_info.function_mode) {
 		case VXGE_HW_FUNCTION_MODE_SINGLE_FUNCTION:
 			vxge_debug_init(VXGE_TRACE,
 			"%s: Single Function Mode Enabled", vdev->ndev->name);
@@ -4348,7 +4355,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 	vxge_print_parm(vdev, vpath_mask);
 
 	/* Store the fw version for ethttool option */
-	strcpy(vdev->fw_version, ll_config.device_hw_info.fw_version.version);
+	strcpy(vdev->fw_version, ll_config->device_hw_info.fw_version.version);
 	memcpy(vdev->ndev->dev_addr, (u8 *)vdev->vpaths[0].macaddr, ETH_ALEN);
 	memcpy(vdev->ndev->perm_addr, vdev->ndev->dev_addr, ETH_ALEN);
 
@@ -4387,7 +4394,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 	 * present to prevent such a failure.
 	 */
 
-	if (ll_config.device_hw_info.function_mode ==
+	if (ll_config->device_hw_info.function_mode ==
 		VXGE_HW_FUNCTION_MODE_MULTI_FUNCTION)
 		if (vdev->config.intr_type == INTA)
 			vxge_hw_device_unmask_all(hldev);
@@ -4399,6 +4406,7 @@  vxge_probe(struct pci_dev *pdev, const struct pci_device_id *pre)
 	VXGE_COPY_DEBUG_INFO_TO_LL(vdev, vxge_hw_device_error_level_get(hldev),
 		vxge_hw_device_trace_level_get(hldev));
 
+	kfree(ll_config);
 	return 0;
 
 _exit5:
@@ -4416,6 +4424,7 @@  _exit2:
 _exit1:
 	pci_disable_device(pdev);
 _exit0:
+	kfree(ll_config);
 	kfree(device_config);
 	driver_config->config_dev_cnt--;
 	pci_set_drvdata(pdev, NULL);