cnic, bnx2x, bnx2: Simplify cnic probing.
authorMichael Chan <mchan@broadcom.com>
Thu, 6 Dec 2012 10:33:12 +0000 (10:33 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Dec 2012 17:44:02 +0000 (12:44 -0500)
Instead of using symbol_get(), cnic can now directly call the cnic_probe
functions in struct bnx2x and struct bnx2.  symbol_get() is not reliable
as it fails when the module is still initializing.

Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2.c
drivers/net/ethernet/broadcom/bnx2.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
drivers/net/ethernet/broadcom/cnic.c
drivers/net/ethernet/broadcom/cnic_if.h

index a9b2feaf2879cbaccd295f14af89e8f20fe7b76e..c16526d3046fc7b3574073c89564afa012620241 100644 (file)
@@ -434,7 +434,6 @@ struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev)
 
        return cp;
 }
-EXPORT_SYMBOL(bnx2_cnic_probe);
 
 static void
 bnx2_cnic_stop(struct bnx2 *bp)
@@ -8422,6 +8421,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev)
                bp->cnic_eth_dev.max_iscsi_conn =
                        (bnx2_shmem_rd(bp, BNX2_ISCSI_MAX_CONN) &
                         BNX2_ISCSI_MAX_CONN_MASK) >> BNX2_ISCSI_MAX_CONN_SHIFT;
+       bp->cnic_probe = bnx2_cnic_probe;
 #endif
        pci_save_state(pdev);
 
index 38a640df58f712212d3a79d59342223a4de9baa2..172efbecfea2b502c26cf8043770575b229743d4 100644 (file)
@@ -6984,6 +6984,7 @@ struct bnx2 {
 #ifdef BCM_CNIC
        struct mutex            cnic_lock;
        struct cnic_eth_dev     cnic_eth_dev;
+       struct cnic_eth_dev     *(*cnic_probe)(struct net_device *);
 #endif
 
        const struct firmware   *mips_firmware;
index 02ea644573caa5bfbc0cd2a26017909bb253740f..defa7d647126c4eab39e8d74bb96a20c766102a7 100644 (file)
@@ -1337,6 +1337,7 @@ struct bnx2x {
        u8                      cnic_support;
        bool                    cnic_enabled;
        bool                    cnic_loaded;
+       struct cnic_eth_dev     *(*cnic_probe)(struct net_device *);
 
        /* Flag that indicates that we can start looking for FCoE L2 queue
         * completions in the default status block.
index 75aea83ee68d2716d02661e48d6d9f2d171825b8..f34ff59a80954350327c3f7d0140c4944531919d 100644 (file)
@@ -12018,6 +12018,8 @@ static int bnx2x_get_num_non_def_sbs(struct pci_dev *pdev,
        return control & PCI_MSIX_FLAGS_QSIZE;
 }
 
+struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *);
+
 static int bnx2x_init_one(struct pci_dev *pdev,
                                    const struct pci_device_id *ent)
 {
@@ -12097,6 +12099,7 @@ static int bnx2x_init_one(struct pci_dev *pdev,
        bp->igu_sb_cnt = max_non_def_sbs;
        bp->msg_enable = debug;
        bp->cnic_support = cnic_cnt;
+       bp->cnic_probe = bnx2x_cnic_probe;
 
        pci_set_drvdata(pdev, dev);
 
@@ -13038,6 +13041,5 @@ struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev)
           cp->starting_cid);
        return cp;
 }
-EXPORT_SYMBOL(bnx2x_cnic_probe);
 
 
index b8650939a4bec1668b55fb1a35a7c10337211229..df8c30d1a52cc4d1fc35e6fb8f7cf6c1b73d31c3 100644 (file)
@@ -40,6 +40,7 @@
 #include <net/ip6_checksum.h>
 #include <scsi/iscsi_if.h>
 
+#define BCM_CNIC       1
 #include "cnic_if.h"
 #include "bnx2.h"
 #include "bnx2x/bnx2x.h"
@@ -5449,14 +5450,12 @@ static struct cnic_dev *init_bnx2_cnic(struct net_device *dev)
        struct pci_dev *pdev;
        struct cnic_dev *cdev;
        struct cnic_local *cp;
+       struct bnx2 *bp = netdev_priv(dev);
        struct cnic_eth_dev *ethdev = NULL;
-       struct cnic_eth_dev *(*probe)(struct net_device *) = NULL;
 
-       probe = symbol_get(bnx2_cnic_probe);
-       if (probe) {
-               ethdev = (*probe)(dev);
-               symbol_put(bnx2_cnic_probe);
-       }
+       if (bp->cnic_probe)
+               ethdev = (bp->cnic_probe)(dev);
+
        if (!ethdev)
                return NULL;
 
@@ -5511,14 +5510,12 @@ static struct cnic_dev *init_bnx2x_cnic(struct net_device *dev)
        struct pci_dev *pdev;
        struct cnic_dev *cdev;
        struct cnic_local *cp;
+       struct bnx2x *bp = netdev_priv(dev);
        struct cnic_eth_dev *ethdev = NULL;
-       struct cnic_eth_dev *(*probe)(struct net_device *) = NULL;
 
-       probe = symbol_get(bnx2x_cnic_probe);
-       if (probe) {
-               ethdev = (*probe)(dev);
-               symbol_put(bnx2x_cnic_probe);
-       }
+       if (bp->cnic_probe)
+               ethdev = bp->cnic_probe(dev);
+
        if (!ethdev)
                return NULL;
 
index 502e11ef6373b0b9891548116657725c3b632e7b..2a35436f90956744a2efa443062001a4acde1727 100644 (file)
@@ -14,8 +14,8 @@
 
 #include "bnx2x/bnx2x_mfw_req.h"
 
-#define CNIC_MODULE_VERSION    "2.5.15"
-#define CNIC_MODULE_RELDATE    "Dec 04, 2012"
+#define CNIC_MODULE_VERSION    "2.5.16"
+#define CNIC_MODULE_RELDATE    "Dec 05, 2012"
 
 #define CNIC_ULP_RDMA          0
 #define CNIC_ULP_ISCSI         1
@@ -353,7 +353,4 @@ extern int cnic_register_driver(int ulp_type, struct cnic_ulp_ops *ulp_ops);
 
 extern int cnic_unregister_driver(int ulp_type);
 
-extern struct cnic_eth_dev *bnx2_cnic_probe(struct net_device *dev);
-extern struct cnic_eth_dev *bnx2x_cnic_probe(struct net_device *dev);
-
 #endif