diff options
author | Jesse Brandeburg <jesse.brandeburg@intel.com> | 2011-09-23 02:11:29 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-23 13:55:25 -0400 |
commit | ac5ac789ebcf5b27e9edc231f6d33c92d722c607 (patch) | |
tree | d4d43ce8f4f194f48ddc253d6f8941e0053e51e8 /drivers/net/ethernet/intel/ixgb/ixgb_main.c | |
parent | Merge branch 'davem-next.r8169' of git://violet.fr.zoreil.com/romieu/linux (diff) | |
download | linux-dev-ac5ac789ebcf5b27e9edc231f6d33c92d722c607.tar.xz linux-dev-ac5ac789ebcf5b27e9edc231f6d33c92d722c607.zip |
ixgb: eliminate checkstack warnings
Really trivial fix, use kmalloc/kfree instead of stack space.
use static const instead of const to further reduce stack usage.
V2: reflect changes suggested by Joe Perches
before:
[jbrandeb@jbrandeb-mobl2 linux-2.6]$ make checkstack|grep '\[ixgb\]'
0x00000fc1 ixgb_set_multi [ixgb]: 768
0x00001031 ixgb_set_multi [ixgb]: 768
0x000010f2 ixgb_set_multi [ixgb]: 768
0x061c ixgb_check_options [ixgb]: 448
0x09c3 ixgb_check_options [ixgb]: 448
0x0000649e ixgb_set_ringparam [ixgb]: 192
0x0000130d ixgb_xmit_frame [ixgb]: 184
0x000019e0 ixgb_xmit_frame [ixgb]: 184
0x00002267 ixgb_clean [ixgb]: 152
0x00002673 ixgb_clean [ixgb]: 152
after:
0x000064ee ixgb_set_ringparam [ixgb]: 192
0x0000135d ixgb_xmit_frame [ixgb]: 184
0x00001a30 ixgb_xmit_frame [ixgb]: 184
0x000022b7 ixgb_clean [ixgb]: 152
0x000026c3 ixgb_clean [ixgb]: 152
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/intel/ixgb/ixgb_main.c')
-rw-r--r-- | drivers/net/ethernet/intel/ixgb/ixgb_main.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ixgb/ixgb_main.c b/drivers/net/ethernet/intel/ixgb/ixgb_main.c index b8fb16304598..ca3ab4a29ac4 100644 --- a/drivers/net/ethernet/intel/ixgb/ixgb_main.c +++ b/drivers/net/ethernet/intel/ixgb/ixgb_main.c @@ -1093,7 +1093,6 @@ ixgb_set_multi(struct net_device *netdev) struct ixgb_hw *hw = &adapter->hw; struct netdev_hw_addr *ha; u32 rctl; - int i; /* Check for Promiscuous and All Multicast modes */ @@ -1120,19 +1119,27 @@ ixgb_set_multi(struct net_device *netdev) rctl |= IXGB_RCTL_MPE; IXGB_WRITE_REG(hw, RCTL, rctl); } else { - u8 mta[IXGB_MAX_NUM_MULTICAST_ADDRESSES * - IXGB_ETH_LENGTH_OF_ADDRESS]; + u8 *mta = kmalloc(IXGB_MAX_NUM_MULTICAST_ADDRESSES * + ETH_ALEN, GFP_ATOMIC); + u8 *addr; + if (!mta) { + pr_err("allocation of multicast memory failed\n"); + goto alloc_failed; + } IXGB_WRITE_REG(hw, RCTL, rctl); - i = 0; - netdev_for_each_mc_addr(ha, netdev) - memcpy(&mta[i++ * IXGB_ETH_LENGTH_OF_ADDRESS], - ha->addr, IXGB_ETH_LENGTH_OF_ADDRESS); + addr = mta; + netdev_for_each_mc_addr(ha, netdev) { + memcpy(addr, ha->addr, ETH_ALEN); + addr += ETH_ALEN; + } ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0); + kfree(mta); } +alloc_failed: if (netdev->features & NETIF_F_HW_VLAN_RX) ixgb_vlan_strip_enable(adapter); else |