aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ixgb/ixgb_main.c
diff options
context:
space:
mode:
authorJesse Brandeburg <jesse.brandeburg@intel.com>2011-09-22 22:11:29 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-23 13:55:25 -0400
commitac5ac789ebcf5b27e9edc231f6d33c92d722c607 (patch)
treed4d43ce8f4f194f48ddc253d6f8941e0053e51e8 /drivers/net/ethernet/intel/ixgb/ixgb_main.c
parent120deefa0bef266d4e01e986f272de2f0f5d3ef3 (diff)
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.c21
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)
1093 struct ixgb_hw *hw = &adapter->hw; 1093 struct ixgb_hw *hw = &adapter->hw;
1094 struct netdev_hw_addr *ha; 1094 struct netdev_hw_addr *ha;
1095 u32 rctl; 1095 u32 rctl;
1096 int i;
1097 1096
1098 /* Check for Promiscuous and All Multicast modes */ 1097 /* Check for Promiscuous and All Multicast modes */
1099 1098
@@ -1120,19 +1119,27 @@ ixgb_set_multi(struct net_device *netdev)
1120 rctl |= IXGB_RCTL_MPE; 1119 rctl |= IXGB_RCTL_MPE;
1121 IXGB_WRITE_REG(hw, RCTL, rctl); 1120 IXGB_WRITE_REG(hw, RCTL, rctl);
1122 } else { 1121 } else {
1123 u8 mta[IXGB_MAX_NUM_MULTICAST_ADDRESSES * 1122 u8 *mta = kmalloc(IXGB_MAX_NUM_MULTICAST_ADDRESSES *
1124 IXGB_ETH_LENGTH_OF_ADDRESS]; 1123 ETH_ALEN, GFP_ATOMIC);
1124 u8 *addr;
1125 if (!mta) {
1126 pr_err("allocation of multicast memory failed\n");
1127 goto alloc_failed;
1128 }
1125 1129
1126 IXGB_WRITE_REG(hw, RCTL, rctl); 1130 IXGB_WRITE_REG(hw, RCTL, rctl);
1127 1131
1128 i = 0; 1132 addr = mta;
1129 netdev_for_each_mc_addr(ha, netdev) 1133 netdev_for_each_mc_addr(ha, netdev) {
1130 memcpy(&mta[i++ * IXGB_ETH_LENGTH_OF_ADDRESS], 1134 memcpy(addr, ha->addr, ETH_ALEN);
1131 ha->addr, IXGB_ETH_LENGTH_OF_ADDRESS); 1135 addr += ETH_ALEN;
1136 }
1132 1137
1133 ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0); 1138 ixgb_mc_addr_list_update(hw, mta, netdev_mc_count(netdev), 0);
1139 kfree(mta);
1134 } 1140 }
1135 1141
1142alloc_failed:
1136 if (netdev->features & NETIF_F_HW_VLAN_RX) 1143 if (netdev->features & NETIF_F_HW_VLAN_RX)
1137 ixgb_vlan_strip_enable(adapter); 1144 ixgb_vlan_strip_enable(adapter);
1138 else 1145 else