nfp: keep MIP object around
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 9 Jun 2017 03:56:13 +0000 (20:56 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 9 Jun 2017 16:52:08 +0000 (12:52 -0400)
Microcode Information Page contains some useful information, like
application firmware build name.  Keep it around, similar to RTSym
and HWInfo.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_main.c
drivers/net/ethernet/netronome/nfp/nfp_main.h
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nffw.h
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c

index 94211e245257c119598171a44e31a9b894e82286..4e59dcb78c3697ed12f9e7511a687ccddd4f91dc 100644 (file)
@@ -375,7 +375,8 @@ static int nfp_pci_probe(struct pci_dev *pdev,
        if (err)
                goto err_devlink_unreg;
 
-       pf->rtbl = nfp_rtsym_table_read(pf->cpp);
+       pf->mip = nfp_mip_open(pf->cpp);
+       pf->rtbl = __nfp_rtsym_table_read(pf->cpp, pf->mip);
 
        err = nfp_pcie_sriov_read_nfd_limit(pf);
        if (err)
@@ -399,6 +400,7 @@ err_sriov_unlimit:
        pci_sriov_set_totalvfs(pf->pdev, 0);
 err_fw_unload:
        kfree(pf->rtbl);
+       nfp_mip_close(pf->mip);
        if (pf->fw_loaded)
                nfp_fw_unload(pf);
        kfree(pf->eth_tbl);
@@ -437,6 +439,7 @@ static void nfp_pci_remove(struct pci_dev *pdev)
        devlink_unregister(devlink);
 
        kfree(pf->rtbl);
+       nfp_mip_close(pf->mip);
        if (pf->fw_loaded)
                nfp_fw_unload(pf);
 
index 041643807f7e63975abba35ace2c4609ddbb1974..88724f8d0dcdd91ed8734d2d299b366f189b9afb 100644 (file)
@@ -55,6 +55,7 @@ struct nfp_cpp;
 struct nfp_cpp_area;
 struct nfp_eth_table;
 struct nfp_hwinfo;
+struct nfp_mip;
 struct nfp_net;
 struct nfp_nsp_identify;
 struct nfp_rtsym_table;
@@ -72,6 +73,7 @@ struct nfp_rtsym_table;
  * @num_vfs:           Number of SR-IOV VFs enabled
  * @fw_loaded:         Is the firmware loaded?
  * @ctrl_vnic:         Pointer to the control vNIC if available
+ * @mip:               MIP handle
  * @rtbl:              RTsym table
  * @hwinfo:            HWInfo table
  * @eth_tbl:           NSP ETH table
@@ -105,6 +107,7 @@ struct nfp_pf {
 
        struct nfp_net *ctrl_vnic;
 
+       const struct nfp_mip *mip;
        struct nfp_rtsym_table *rtbl;
        struct nfp_hwinfo *hwinfo;
        struct nfp_eth_table *eth_tbl;
index f845cf5dd7629149c600505ffdd725ef1cffbde5..c7266baec0eb5b8a11b22a35fb537b891f10d06f 100644 (file)
@@ -90,6 +90,8 @@ struct nfp_rtsym {
 struct nfp_rtsym_table;
 
 struct nfp_rtsym_table *nfp_rtsym_table_read(struct nfp_cpp *cpp);
+struct nfp_rtsym_table *
+__nfp_rtsym_table_read(struct nfp_cpp *cpp, const struct nfp_mip *mip);
 int nfp_rtsym_count(struct nfp_rtsym_table *rtbl);
 const struct nfp_rtsym *nfp_rtsym_get(struct nfp_rtsym_table *rtbl, int idx);
 const struct nfp_rtsym *
index ef3566163cb008e1df227731bb9a9d98df47b3ed..203f9cbae0fbc79271f4e6c724a90acb89a20137 100644 (file)
@@ -108,22 +108,32 @@ nfp_rtsym_sw_entry_init(struct nfp_rtsym_table *cache, u32 strtab_size,
 }
 
 struct nfp_rtsym_table *nfp_rtsym_table_read(struct nfp_cpp *cpp)
+{
+       struct nfp_rtsym_table *rtbl;
+       const struct nfp_mip *mip;
+
+       mip = nfp_mip_open(cpp);
+       rtbl = __nfp_rtsym_table_read(cpp, mip);
+       nfp_mip_close(mip);
+
+       return rtbl;
+}
+
+struct nfp_rtsym_table *
+__nfp_rtsym_table_read(struct nfp_cpp *cpp, const struct nfp_mip *mip)
 {
        const u32 dram = NFP_CPP_ID(NFP_CPP_TARGET_MU, NFP_CPP_ACTION_RW, 0) |
                NFP_ISL_EMEM0;
        u32 strtab_addr, symtab_addr, strtab_size, symtab_size;
        struct nfp_rtsym_entry *rtsymtab;
        struct nfp_rtsym_table *cache;
-       const struct nfp_mip *mip;
        int err, n, size;
 
-       mip = nfp_mip_open(cpp);
        if (!mip)
                return NULL;
 
        nfp_mip_strtab(mip, &strtab_addr, &strtab_size);
        nfp_mip_symtab(mip, &symtab_addr, &symtab_size);
-       nfp_mip_close(mip);
 
        if (!symtab_size || !strtab_size || symtab_size % sizeof(*rtsymtab))
                return NULL;