tg3: Dynamically allocate VPD data memory
authorMatt Carlson <mcarlson@broadcom.com>
Wed, 15 Sep 2010 09:00:00 +0000 (09:00 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Sep 2010 21:16:15 +0000 (14:16 -0700)
This patch eases stack pressure by dynamically allocating the memory
used to temporarily store VPD data.

Reviewed-by: Benjamin Li <benli@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/tg3.c

index a4fbe4f85ffeb6fbe910825a9a187dd20ee24272..0d0deaae5f4c1f0c4eea55ed03234d9adf9a07ac 100644 (file)
@@ -12415,14 +12415,18 @@ skip_phy_reset:
 
 static void __devinit tg3_read_vpd(struct tg3 *tp)
 {
-       u8 vpd_data[TG3_NVM_VPD_LEN];
+       u8 *vpd_data;
        unsigned int block_end, rosize, len;
        int j, i = 0;
        u32 magic;
 
        if ((tp->tg3_flags3 & TG3_FLG3_NO_NVRAM) ||
            tg3_nvram_read(tp, 0x0, &magic))
-               goto out_not_found;
+               goto out_no_vpd;
+
+       vpd_data = kmalloc(TG3_NVM_VPD_LEN, GFP_KERNEL);
+       if (!vpd_data)
+               goto out_no_vpd;
 
        if (magic == TG3_EEPROM_MAGIC) {
                for (i = 0; i < TG3_NVM_VPD_LEN; i += 4) {
@@ -12506,9 +12510,12 @@ partno:
 
        memcpy(tp->board_part_number, &vpd_data[i], len);
 
-       return;
-
 out_not_found:
+       kfree(vpd_data);
+       if (!tp->board_part_number[0])
+               return;
+
+out_no_vpd:
        if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906)
                strcpy(tp->board_part_number, "BCM95906");
        else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_57780 &&