mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 09:14:07 -04:00
octeontx2-pf: RVU representor driver
Adds basic driver for the RVU representor. Driver on probe does pci specific initialization and does hw resources configuration. Introduces RVU_ESWITCH kernel config to enable/disable the driver. Representor and NIC shares the code but representors netdev support subset of NIC functionality. Hence "otx2_rep_dev" API helps to skip the features initialization that are not supported by the representors. Signed-off-by: Geetha sowjanya <gakula@marvell.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
ef04d290c0
commit
222a4eea9c
@@ -46,3 +46,11 @@ config OCTEONTX2_VF
|
||||
depends on OCTEONTX2_PF
|
||||
help
|
||||
This driver supports Marvell's OcteonTX2 NIC virtual function.
|
||||
|
||||
config RVU_ESWITCH
|
||||
tristate "Marvell RVU E-Switch support"
|
||||
depends on OCTEONTX2_PF
|
||||
default m
|
||||
help
|
||||
This driver supports Marvell's RVU E-Switch that
|
||||
provides internal SRIOV packet steering and switching.
|
||||
|
||||
@@ -11,4 +11,5 @@ rvu_mbox-y := mbox.o rvu_trace.o
|
||||
rvu_af-y := cgx.o rvu.o rvu_cgx.o rvu_npa.o rvu_nix.o \
|
||||
rvu_reg.o rvu_npc.o rvu_debugfs.o ptp.o rvu_npc_fs.o \
|
||||
rvu_cpt.o rvu_devlink.o rpm.o rvu_cn10k.o rvu_switch.o \
|
||||
rvu_sdp.o rvu_npc_hash.o mcs.o mcs_rvu_if.o mcs_cnf10kb.o
|
||||
rvu_sdp.o rvu_npc_hash.o mcs.o mcs_rvu_if.o mcs_cnf10kb.o \
|
||||
rvu_rep.o
|
||||
|
||||
@@ -144,6 +144,7 @@ M(LMTST_TBL_SETUP, 0x00a, lmtst_tbl_setup, lmtst_tbl_setup_req, \
|
||||
msg_rsp) \
|
||||
M(SET_VF_PERM, 0x00b, set_vf_perm, set_vf_perm, msg_rsp) \
|
||||
M(PTP_GET_CAP, 0x00c, ptp_get_cap, msg_req, ptp_get_cap_rsp) \
|
||||
M(GET_REP_CNT, 0x00d, get_rep_cnt, msg_req, get_rep_cnt_rsp) \
|
||||
/* CGX mbox IDs (range 0x200 - 0x3FF) */ \
|
||||
M(CGX_START_RXTX, 0x200, cgx_start_rxtx, msg_req, msg_rsp) \
|
||||
M(CGX_STOP_RXTX, 0x201, cgx_stop_rxtx, msg_req, msg_rsp) \
|
||||
@@ -1525,6 +1526,13 @@ struct ptp_get_cap_rsp {
|
||||
u64 cap;
|
||||
};
|
||||
|
||||
struct get_rep_cnt_rsp {
|
||||
struct mbox_msghdr hdr;
|
||||
u16 rep_cnt;
|
||||
u16 rep_pf_map[64];
|
||||
u64 rsvd;
|
||||
};
|
||||
|
||||
struct flow_msg {
|
||||
unsigned char dmac[6];
|
||||
unsigned char smac[6];
|
||||
|
||||
@@ -595,6 +595,9 @@ struct rvu {
|
||||
spinlock_t cpt_intr_lock;
|
||||
|
||||
struct mutex mbox_lock; /* Serialize mbox up and down msgs */
|
||||
u16 rep_pcifunc;
|
||||
int rep_cnt;
|
||||
u16 *rep2pfvf_map;
|
||||
};
|
||||
|
||||
static inline void rvu_write64(struct rvu *rvu, u64 block, u64 offset, u64 val)
|
||||
@@ -853,6 +856,14 @@ bool is_sdp_pfvf(u16 pcifunc);
|
||||
bool is_sdp_pf(u16 pcifunc);
|
||||
bool is_sdp_vf(struct rvu *rvu, u16 pcifunc);
|
||||
|
||||
static inline bool is_rep_dev(struct rvu *rvu, u16 pcifunc)
|
||||
{
|
||||
if (rvu->rep_pcifunc && rvu->rep_pcifunc == pcifunc)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* CGX APIs */
|
||||
static inline bool is_pf_cgxmapped(struct rvu *rvu, u8 pf)
|
||||
{
|
||||
|
||||
@@ -31,6 +31,7 @@ static int nix_free_all_bandprof(struct rvu *rvu, u16 pcifunc);
|
||||
static void nix_clear_ratelimit_aggr(struct rvu *rvu, struct nix_hw *nix_hw,
|
||||
u32 leaf_prof);
|
||||
static const char *nix_get_ctx_name(int ctype);
|
||||
static int nix_get_tx_link(struct rvu *rvu, u16 pcifunc);
|
||||
|
||||
enum mc_tbl_sz {
|
||||
MC_TBL_SZ_256,
|
||||
@@ -312,7 +313,9 @@ static bool is_valid_txschq(struct rvu *rvu, int blkaddr,
|
||||
|
||||
/* TLs aggegating traffic are shared across PF and VFs */
|
||||
if (lvl >= hw->cap.nix_tx_aggr_lvl) {
|
||||
if (rvu_get_pf(map_func) != rvu_get_pf(pcifunc))
|
||||
if ((nix_get_tx_link(rvu, map_func) !=
|
||||
nix_get_tx_link(rvu, pcifunc)) &&
|
||||
(rvu_get_pf(map_func) != rvu_get_pf(pcifunc)))
|
||||
return false;
|
||||
else
|
||||
return true;
|
||||
@@ -1614,6 +1617,12 @@ int rvu_mbox_handler_nix_lf_alloc(struct rvu *rvu,
|
||||
cfg = NPC_TX_DEF_PKIND;
|
||||
rvu_write64(rvu, blkaddr, NIX_AF_LFX_TX_PARSE_CFG(nixlf), cfg);
|
||||
|
||||
if (is_rep_dev(rvu, pcifunc)) {
|
||||
pfvf->tx_chan_base = RVU_SWITCH_LBK_CHAN;
|
||||
pfvf->tx_chan_cnt = 1;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
intf = is_lbk_vf(rvu, pcifunc) ? NIX_INTF_TYPE_LBK : NIX_INTF_TYPE_CGX;
|
||||
if (is_sdp_pfvf(pcifunc))
|
||||
intf = NIX_INTF_TYPE_SDP;
|
||||
@@ -1684,6 +1693,9 @@ int rvu_mbox_handler_nix_lf_free(struct rvu *rvu, struct nix_lf_free_req *req,
|
||||
if (nixlf < 0)
|
||||
return NIX_AF_ERR_AF_LF_INVALID;
|
||||
|
||||
if (is_rep_dev(rvu, pcifunc))
|
||||
goto free_lf;
|
||||
|
||||
if (req->flags & NIX_LF_DISABLE_FLOWS)
|
||||
rvu_npc_disable_mcam_entries(rvu, pcifunc, nixlf);
|
||||
else
|
||||
@@ -1695,6 +1707,7 @@ int rvu_mbox_handler_nix_lf_free(struct rvu *rvu, struct nix_lf_free_req *req,
|
||||
|
||||
nix_interface_deinit(rvu, pcifunc, nixlf);
|
||||
|
||||
free_lf:
|
||||
/* Reset this NIX LF */
|
||||
err = rvu_lf_reset(rvu, block, nixlf);
|
||||
if (err) {
|
||||
@@ -2007,7 +2020,8 @@ static void nix_get_txschq_range(struct rvu *rvu, u16 pcifunc,
|
||||
struct rvu_hwinfo *hw = rvu->hw;
|
||||
int pf = rvu_get_pf(pcifunc);
|
||||
|
||||
if (is_lbk_vf(rvu, pcifunc)) { /* LBK links */
|
||||
/* LBK links */
|
||||
if (is_lbk_vf(rvu, pcifunc) || is_rep_dev(rvu, pcifunc)) {
|
||||
*start = hw->cap.nix_txsch_per_cgx_lmac * link;
|
||||
*end = *start + hw->cap.nix_txsch_per_lbk_lmac;
|
||||
} else if (is_pf_cgxmapped(rvu, pf)) { /* CGX links */
|
||||
@@ -4555,7 +4569,7 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
|
||||
if (!nix_hw)
|
||||
return NIX_AF_ERR_INVALID_NIXBLK;
|
||||
|
||||
if (is_lbk_vf(rvu, pcifunc))
|
||||
if (is_lbk_vf(rvu, pcifunc) || is_rep_dev(rvu, pcifunc))
|
||||
rvu_get_lbk_link_max_frs(rvu, &max_mtu);
|
||||
else
|
||||
rvu_get_lmac_link_max_frs(rvu, &max_mtu);
|
||||
@@ -4583,6 +4597,8 @@ int rvu_mbox_handler_nix_set_hw_frs(struct rvu *rvu, struct nix_frs_cfg *req,
|
||||
/* For VFs of PF0 ingress is LBK port, so config LBK link */
|
||||
pfvf = rvu_get_pfvf(rvu, pcifunc);
|
||||
link = hw->cgx_links + pfvf->lbkid;
|
||||
} else if (is_rep_dev(rvu, pcifunc)) {
|
||||
link = hw->cgx_links + 0;
|
||||
}
|
||||
|
||||
if (link < 0)
|
||||
|
||||
48
drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c
Normal file
48
drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c
Normal file
@@ -0,0 +1,48 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Marvell RVU Admin Function driver
|
||||
*
|
||||
* Copyright (C) 2024 Marvell.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "rvu.h"
|
||||
#include "rvu_reg.h"
|
||||
|
||||
int rvu_mbox_handler_get_rep_cnt(struct rvu *rvu, struct msg_req *req,
|
||||
struct get_rep_cnt_rsp *rsp)
|
||||
{
|
||||
int pf, vf, numvfs, hwvf, rep = 0;
|
||||
u16 pcifunc;
|
||||
|
||||
rvu->rep_pcifunc = req->hdr.pcifunc;
|
||||
rsp->rep_cnt = rvu->cgx_mapped_pfs + rvu->cgx_mapped_vfs;
|
||||
rvu->rep_cnt = rsp->rep_cnt;
|
||||
|
||||
rvu->rep2pfvf_map = devm_kzalloc(rvu->dev, rvu->rep_cnt *
|
||||
sizeof(u16), GFP_KERNEL);
|
||||
if (!rvu->rep2pfvf_map)
|
||||
return -ENOMEM;
|
||||
|
||||
for (pf = 0; pf < rvu->hw->total_pfs; pf++) {
|
||||
if (!is_pf_cgxmapped(rvu, pf))
|
||||
continue;
|
||||
pcifunc = pf << RVU_PFVF_PF_SHIFT;
|
||||
rvu->rep2pfvf_map[rep] = pcifunc;
|
||||
rsp->rep_pf_map[rep] = pcifunc;
|
||||
rep++;
|
||||
rvu_get_pf_numvfs(rvu, pf, &numvfs, &hwvf);
|
||||
for (vf = 0; vf < numvfs; vf++) {
|
||||
rvu->rep2pfvf_map[rep] = pcifunc |
|
||||
((vf + 1) & RVU_PFVF_FUNC_MASK);
|
||||
rsp->rep_pf_map[rep] = rvu->rep2pfvf_map[rep];
|
||||
rep++;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -5,11 +5,13 @@
|
||||
|
||||
obj-$(CONFIG_OCTEONTX2_PF) += rvu_nicpf.o otx2_ptp.o
|
||||
obj-$(CONFIG_OCTEONTX2_VF) += rvu_nicvf.o otx2_ptp.o
|
||||
obj-$(CONFIG_RVU_ESWITCH) += rvu_rep.o
|
||||
|
||||
rvu_nicpf-y := otx2_pf.o otx2_common.o otx2_txrx.o otx2_ethtool.o \
|
||||
otx2_flows.o otx2_tc.o cn10k.o otx2_dmac_flt.o \
|
||||
otx2_devlink.o qos_sq.o qos.o
|
||||
rvu_nicvf-y := otx2_vf.o
|
||||
rvu_rep-y := rep.o
|
||||
|
||||
rvu_nicpf-$(CONFIG_DCB) += otx2_dcbnl.o
|
||||
rvu_nicpf-$(CONFIG_MACSEC) += cn10k_macsec.o
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "otx2_devlink.h"
|
||||
#include <rvu_trace.h>
|
||||
#include "qos.h"
|
||||
#include "rep.h"
|
||||
|
||||
/* IPv4 flag more fragment bit */
|
||||
#define IPV4_FLAG_MORE 0x20
|
||||
@@ -466,6 +467,7 @@ struct otx2_nic {
|
||||
#define OTX2_FLAG_PTP_ONESTEP_SYNC BIT_ULL(15)
|
||||
#define OTX2_FLAG_ADPTV_INT_COAL_ENABLED BIT_ULL(16)
|
||||
#define OTX2_FLAG_TC_MARK_ENABLED BIT_ULL(17)
|
||||
#define OTX2_FLAG_REP_MODE_ENABLED BIT_ULL(18)
|
||||
u64 flags;
|
||||
u64 *cq_op_addr;
|
||||
|
||||
@@ -533,11 +535,19 @@ struct otx2_nic {
|
||||
#if IS_ENABLED(CONFIG_MACSEC)
|
||||
struct cn10k_mcs_cfg *macsec_cfg;
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_RVU_ESWITCH)
|
||||
struct rep_dev **reps;
|
||||
int rep_cnt;
|
||||
u16 rep_pf_map[RVU_MAX_REP];
|
||||
u16 esw_mode;
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline bool is_otx2_lbkvf(struct pci_dev *pdev)
|
||||
{
|
||||
return pdev->device == PCI_DEVID_OCTEONTX2_RVU_AFVF;
|
||||
return (pdev->device == PCI_DEVID_OCTEONTX2_RVU_AFVF) ||
|
||||
(pdev->device == PCI_DEVID_RVU_REP);
|
||||
}
|
||||
|
||||
static inline bool is_96xx_A0(struct pci_dev *pdev)
|
||||
|
||||
@@ -1016,6 +1016,7 @@ void otx2_disable_mbox_intr(struct otx2_nic *pf)
|
||||
otx2_write64(pf, RVU_PF_INT_ENA_W1C, BIT_ULL(0));
|
||||
free_irq(vector, pf);
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_disable_mbox_intr);
|
||||
|
||||
int otx2_register_mbox_intr(struct otx2_nic *pf, bool probe_af)
|
||||
{
|
||||
@@ -1076,6 +1077,7 @@ void otx2_pfaf_mbox_destroy(struct otx2_nic *pf)
|
||||
otx2_mbox_destroy(&mbox->mbox);
|
||||
otx2_mbox_destroy(&mbox->mbox_up);
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_pfaf_mbox_destroy);
|
||||
|
||||
int otx2_pfaf_mbox_init(struct otx2_nic *pf)
|
||||
{
|
||||
@@ -1496,10 +1498,11 @@ int otx2_init_hw_resources(struct otx2_nic *pf)
|
||||
hw->sqpool_cnt = otx2_get_total_tx_queues(pf);
|
||||
hw->pool_cnt = hw->rqpool_cnt + hw->sqpool_cnt;
|
||||
|
||||
/* Maximum hardware supported transmit length */
|
||||
pf->tx_max_pktlen = pf->netdev->max_mtu + OTX2_ETH_HLEN;
|
||||
|
||||
pf->rbsize = otx2_get_rbuf_size(pf, pf->netdev->mtu);
|
||||
if (!otx2_rep_dev(pf->pdev)) {
|
||||
/* Maximum hardware supported transmit length */
|
||||
pf->tx_max_pktlen = pf->netdev->max_mtu + OTX2_ETH_HLEN;
|
||||
pf->rbsize = otx2_get_rbuf_size(pf, pf->netdev->mtu);
|
||||
}
|
||||
|
||||
mutex_lock(&mbox->lock);
|
||||
/* NPA init */
|
||||
@@ -1627,11 +1630,12 @@ void otx2_free_hw_resources(struct otx2_nic *pf)
|
||||
otx2_pfc_txschq_stop(pf);
|
||||
#endif
|
||||
|
||||
otx2_clean_qos_queues(pf);
|
||||
if (!otx2_rep_dev(pf->pdev))
|
||||
otx2_clean_qos_queues(pf);
|
||||
|
||||
mutex_lock(&mbox->lock);
|
||||
/* Disable backpressure */
|
||||
if (!(pf->pcifunc & RVU_PFVF_FUNC_MASK))
|
||||
if (!is_otx2_lbkvf(pf->pdev))
|
||||
otx2_nix_config_bp(pf, false);
|
||||
mutex_unlock(&mbox->lock);
|
||||
|
||||
@@ -1663,7 +1667,8 @@ void otx2_free_hw_resources(struct otx2_nic *pf)
|
||||
otx2_free_cq_res(pf);
|
||||
|
||||
/* Free all ingress bandwidth profiles allocated */
|
||||
cn10k_free_all_ipolicers(pf);
|
||||
if (!otx2_rep_dev(pf->pdev))
|
||||
cn10k_free_all_ipolicers(pf);
|
||||
|
||||
mutex_lock(&mbox->lock);
|
||||
/* Reset NIX LF */
|
||||
@@ -2976,6 +2981,7 @@ int otx2_init_rsrc(struct pci_dev *pdev, struct otx2_nic *pf)
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(otx2_init_rsrc);
|
||||
|
||||
static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
|
||||
173
drivers/net/ethernet/marvell/octeontx2/nic/rep.c
Normal file
173
drivers/net/ethernet/marvell/octeontx2/nic/rep.c
Normal file
@@ -0,0 +1,173 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/* Marvell RVU representor driver
|
||||
*
|
||||
* Copyright (C) 2024 Marvell.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/net_tstamp.h>
|
||||
|
||||
#include "otx2_common.h"
|
||||
#include "cn10k.h"
|
||||
#include "otx2_reg.h"
|
||||
#include "rep.h"
|
||||
|
||||
#define DRV_NAME "rvu_rep"
|
||||
#define DRV_STRING "Marvell RVU Representor Driver"
|
||||
|
||||
static const struct pci_device_id rvu_rep_id_table[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_CAVIUM, PCI_DEVID_RVU_REP) },
|
||||
{ }
|
||||
};
|
||||
|
||||
MODULE_AUTHOR("Marvell International Ltd.");
|
||||
MODULE_DESCRIPTION(DRV_STRING);
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DEVICE_TABLE(pci, rvu_rep_id_table);
|
||||
|
||||
static int rvu_get_rep_cnt(struct otx2_nic *priv)
|
||||
{
|
||||
struct get_rep_cnt_rsp *rsp;
|
||||
struct mbox_msghdr *msghdr;
|
||||
struct msg_req *req;
|
||||
int err, rep;
|
||||
|
||||
mutex_lock(&priv->mbox.lock);
|
||||
req = otx2_mbox_alloc_msg_get_rep_cnt(&priv->mbox);
|
||||
if (!req) {
|
||||
mutex_unlock(&priv->mbox.lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
err = otx2_sync_mbox_msg(&priv->mbox);
|
||||
if (err)
|
||||
goto exit;
|
||||
|
||||
msghdr = otx2_mbox_get_rsp(&priv->mbox.mbox, 0, &req->hdr);
|
||||
if (IS_ERR(msghdr)) {
|
||||
err = PTR_ERR(msghdr);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
rsp = (struct get_rep_cnt_rsp *)msghdr;
|
||||
priv->hw.tx_queues = rsp->rep_cnt;
|
||||
priv->hw.rx_queues = rsp->rep_cnt;
|
||||
priv->rep_cnt = rsp->rep_cnt;
|
||||
for (rep = 0; rep < priv->rep_cnt; rep++)
|
||||
priv->rep_pf_map[rep] = rsp->rep_pf_map[rep];
|
||||
|
||||
exit:
|
||||
mutex_unlock(&priv->mbox.lock);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int rvu_rep_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct otx2_nic *priv;
|
||||
struct otx2_hw *hw;
|
||||
int err;
|
||||
|
||||
err = pcim_enable_device(pdev);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to enable PCI device\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = pci_request_regions(pdev, DRV_NAME);
|
||||
if (err) {
|
||||
dev_err(dev, "PCI request regions failed 0x%x\n", err);
|
||||
return err;
|
||||
}
|
||||
|
||||
err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(48));
|
||||
if (err) {
|
||||
dev_err(dev, "DMA mask config failed, abort\n");
|
||||
goto err_release_regions;
|
||||
}
|
||||
|
||||
pci_set_master(pdev);
|
||||
|
||||
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
err = -ENOMEM;
|
||||
goto err_release_regions;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, priv);
|
||||
priv->pdev = pdev;
|
||||
priv->dev = dev;
|
||||
priv->flags |= OTX2_FLAG_INTF_DOWN;
|
||||
priv->flags |= OTX2_FLAG_REP_MODE_ENABLED;
|
||||
|
||||
hw = &priv->hw;
|
||||
hw->pdev = pdev;
|
||||
hw->max_queues = OTX2_MAX_CQ_CNT;
|
||||
hw->rbuf_len = OTX2_DEFAULT_RBUF_LEN;
|
||||
hw->xqe_size = 128;
|
||||
|
||||
err = otx2_init_rsrc(pdev, priv);
|
||||
if (err)
|
||||
goto err_release_regions;
|
||||
|
||||
priv->iommu_domain = iommu_get_domain_for_dev(dev);
|
||||
|
||||
err = rvu_get_rep_cnt(priv);
|
||||
if (err)
|
||||
goto err_detach_rsrc;
|
||||
|
||||
return 0;
|
||||
|
||||
err_detach_rsrc:
|
||||
if (priv->hw.lmt_info)
|
||||
free_percpu(priv->hw.lmt_info);
|
||||
if (test_bit(CN10K_LMTST, &priv->hw.cap_flag))
|
||||
qmem_free(priv->dev, priv->dync_lmt);
|
||||
otx2_detach_resources(&priv->mbox);
|
||||
otx2_disable_mbox_intr(priv);
|
||||
otx2_pfaf_mbox_destroy(priv);
|
||||
pci_free_irq_vectors(pdev);
|
||||
err_release_regions:
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
pci_release_regions(pdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void rvu_rep_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct otx2_nic *priv = pci_get_drvdata(pdev);
|
||||
|
||||
otx2_detach_resources(&priv->mbox);
|
||||
if (priv->hw.lmt_info)
|
||||
free_percpu(priv->hw.lmt_info);
|
||||
if (test_bit(CN10K_LMTST, &priv->hw.cap_flag))
|
||||
qmem_free(priv->dev, priv->dync_lmt);
|
||||
otx2_disable_mbox_intr(priv);
|
||||
otx2_pfaf_mbox_destroy(priv);
|
||||
pci_free_irq_vectors(priv->pdev);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
pci_release_regions(pdev);
|
||||
}
|
||||
|
||||
static struct pci_driver rvu_rep_driver = {
|
||||
.name = DRV_NAME,
|
||||
.id_table = rvu_rep_id_table,
|
||||
.probe = rvu_rep_probe,
|
||||
.remove = rvu_rep_remove,
|
||||
.shutdown = rvu_rep_remove,
|
||||
};
|
||||
|
||||
static int __init rvu_rep_init_module(void)
|
||||
{
|
||||
return pci_register_driver(&rvu_rep_driver);
|
||||
}
|
||||
|
||||
static void __exit rvu_rep_cleanup_module(void)
|
||||
{
|
||||
pci_unregister_driver(&rvu_rep_driver);
|
||||
}
|
||||
|
||||
module_init(rvu_rep_init_module);
|
||||
module_exit(rvu_rep_cleanup_module);
|
||||
31
drivers/net/ethernet/marvell/octeontx2/nic/rep.h
Normal file
31
drivers/net/ethernet/marvell/octeontx2/nic/rep.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/* Marvell RVU REPRESENTOR driver
|
||||
*
|
||||
* Copyright (C) 2024 Marvell.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef REP_H
|
||||
#define REP_H
|
||||
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "otx2_reg.h"
|
||||
#include "otx2_txrx.h"
|
||||
#include "otx2_common.h"
|
||||
|
||||
#define PCI_DEVID_RVU_REP 0xA0E0
|
||||
|
||||
#define RVU_MAX_REP OTX2_MAX_CQ_CNT
|
||||
struct rep_dev {
|
||||
struct otx2_nic *mdev;
|
||||
struct net_device *netdev;
|
||||
u16 rep_id;
|
||||
u16 pcifunc;
|
||||
};
|
||||
|
||||
static inline bool otx2_rep_dev(struct pci_dev *pdev)
|
||||
{
|
||||
return pdev->device == PCI_DEVID_RVU_REP;
|
||||
}
|
||||
#endif /* REP_H */
|
||||
Reference in New Issue
Block a user