OSDN Git Service

be2net: dynamically allocate adapter->vf_cfg
authorAjit Khaparde <ajit.khaparde@emulex.com>
Wed, 6 Apr 2011 18:08:30 +0000 (18:08 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 7 Apr 2011 22:04:45 +0000 (15:04 -0700)
Instead of a fixed sized array for vf_cfg, allocate the size dynamically
depending on number of VFs the device supports.

Signed-off-by: Ajit Khaparde <ajit.khaparde@emulex.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/benet/be.h
drivers/net/benet/be_main.c

index 7e20400..d2c42f5 100644 (file)
@@ -92,8 +92,6 @@ static inline char *nic_name(struct pci_dev *pdev)
 
 #define FW_VER_LEN             32
 
-#define BE_MAX_VF              32
-
 struct be_dma_mem {
        void *va;
        dma_addr_t dma;
@@ -336,7 +334,7 @@ struct be_adapter {
 
        bool be3_native;
        bool sriov_enabled;
-       struct be_vf_cfg vf_cfg[BE_MAX_VF];
+       struct be_vf_cfg *vf_cfg;
        u8 is_virtfn;
        u32 sli_family;
        u8 hba_port_num;
index bc11078..6e7df0d 100644 (file)
@@ -2838,6 +2838,7 @@ static void __devexit be_remove(struct pci_dev *pdev)
 
        be_ctrl_cleanup(adapter);
 
+       kfree(adapter->vf_cfg);
        be_sriov_disable(adapter);
 
        be_msix_disable(adapter);
@@ -3022,16 +3023,23 @@ static int __devinit be_probe(struct pci_dev *pdev,
        }
 
        be_sriov_enable(adapter);
+       if (adapter->sriov_enabled) {
+               adapter->vf_cfg = kcalloc(num_vfs,
+                       sizeof(struct be_vf_cfg), GFP_KERNEL);
+
+               if (!adapter->vf_cfg)
+                       goto free_netdev;
+       }
 
        status = be_ctrl_init(adapter);
        if (status)
-               goto free_netdev;
+               goto free_vf_cfg;
 
        if (lancer_chip(adapter)) {
                status = lancer_test_and_set_rdy_state(adapter);
                if (status) {
                        dev_err(&pdev->dev, "Adapter in non recoverable error\n");
-                       goto free_netdev;
+                       goto ctrl_clean;
                }
        }
 
@@ -3093,6 +3101,8 @@ stats_clean:
        be_stats_cleanup(adapter);
 ctrl_clean:
        be_ctrl_cleanup(adapter);
+free_vf_cfg:
+       kfree(adapter->vf_cfg);
 free_netdev:
        be_sriov_disable(adapter);
        free_netdev(netdev);