1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(C) 2021 Marvell.
3 */
4
5 #include "roc_api.h"
6 #include "roc_priv.h"
7
8 int
roc_nix_npc_promisc_ena_dis(struct roc_nix * roc_nix,int enable)9 roc_nix_npc_promisc_ena_dis(struct roc_nix *roc_nix, int enable)
10 {
11 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
12 struct dev *dev = &nix->dev;
13 struct mbox *mbox = mbox_get(dev->mbox);
14 struct nix_rx_mode *req;
15 int rc = -ENOSPC;
16
17 if (roc_nix_is_vf_or_sdp(roc_nix)) {
18 rc = NIX_ERR_PARAM;
19 goto exit;
20 }
21
22 req = mbox_alloc_msg_nix_set_rx_mode(mbox);
23 if (req == NULL)
24 goto exit;
25
26 if (enable)
27 req->mode = NIX_RX_MODE_UCAST | NIX_RX_MODE_PROMISC;
28
29 rc = mbox_process(mbox);
30 exit:
31 mbox_put(mbox);
32 return rc;
33 }
34
35 int
roc_nix_npc_mac_addr_set(struct roc_nix * roc_nix,uint8_t addr[])36 roc_nix_npc_mac_addr_set(struct roc_nix *roc_nix, uint8_t addr[])
37 {
38 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
39 struct dev *dev = &nix->dev;
40 struct mbox *mbox = mbox_get(dev->mbox);
41 struct nix_set_mac_addr *req;
42 int rc;
43
44 req = mbox_alloc_msg_nix_set_mac_addr(mbox);
45 mbox_memcpy(req->mac_addr, addr, PLT_ETHER_ADDR_LEN);
46 rc = mbox_process(mbox);
47 mbox_put(mbox);
48 return rc;
49 }
50
51 int
roc_nix_npc_mac_addr_get(struct roc_nix * roc_nix,uint8_t * addr)52 roc_nix_npc_mac_addr_get(struct roc_nix *roc_nix, uint8_t *addr)
53 {
54 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
55 struct dev *dev = &nix->dev;
56 struct mbox *mbox = mbox_get(dev->mbox);
57 struct nix_get_mac_addr_rsp *rsp;
58 int rc;
59
60 mbox_alloc_msg_nix_get_mac_addr(mbox);
61 rc = mbox_process_msg(mbox, (void *)&rsp);
62 if (rc)
63 goto exit;
64
65 mbox_memcpy(addr, rsp->mac_addr, PLT_ETHER_ADDR_LEN);
66 rc = 0;
67 exit:
68 mbox_put(mbox);
69 return rc;
70 }
71
72 int
roc_nix_npc_rx_ena_dis(struct roc_nix * roc_nix,bool enable)73 roc_nix_npc_rx_ena_dis(struct roc_nix *roc_nix, bool enable)
74 {
75 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
76 struct dev *dev = &nix->dev;
77 struct mbox *mbox = mbox_get(dev->mbox);
78 int rc;
79
80 if (enable)
81 mbox_alloc_msg_nix_lf_start_rx(mbox);
82 else
83 mbox_alloc_msg_nix_lf_stop_rx(mbox);
84
85 rc = mbox_process(mbox);
86 if (!rc)
87 roc_nix->io_enabled = enable;
88
89 mbox_put(mbox);
90 return rc;
91 }
92
93 int
roc_nix_npc_mcast_config(struct roc_nix * roc_nix,bool mcast_enable,bool prom_enable)94 roc_nix_npc_mcast_config(struct roc_nix *roc_nix, bool mcast_enable,
95 bool prom_enable)
96
97 {
98 struct nix *nix = roc_nix_to_nix_priv(roc_nix);
99 struct dev *dev = &nix->dev;
100 struct mbox *mbox = mbox_get(dev->mbox);
101 struct nix_rx_mode *req;
102 int rc = -ENOSPC;
103
104 if (roc_nix_is_vf_or_sdp(roc_nix)) {
105 rc = 0;
106 goto exit;
107 }
108
109 req = mbox_alloc_msg_nix_set_rx_mode(mbox);
110 if (req == NULL)
111 goto exit;
112
113 if (mcast_enable)
114 req->mode = NIX_RX_MODE_ALLMULTI;
115 if (prom_enable)
116 req->mode = NIX_RX_MODE_PROMISC;
117
118 rc = mbox_process(mbox);
119 exit:
120 mbox_put(mbox);
121 return rc;
122 }
123