1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2019-2021 Xilinx, Inc.
4 * Copyright(c) 2019 Solarflare Communications Inc.
6 * This software was jointly developed between OKTET Labs (under contract
7 * for Solarflare) and Solarflare Communications, Inc.
10 #include <rte_service.h>
11 #include <rte_service_component.h>
14 #include "sfc_service.h"
15 #include "sfc_repr_proxy.h"
16 #include "sfc_repr_proxy_api.h"
23 * Amount of time to wait for the representor proxy routine (which is
24 * running on a service core) to handle a request sent via mbox.
26 #define SFC_REPR_PROXY_MBOX_POLL_TIMEOUT_MS 1000
28 static struct sfc_repr_proxy *
29 sfc_repr_proxy_by_adapter(struct sfc_adapter *sa)
31 return &sa->repr_proxy;
34 static struct sfc_adapter *
35 sfc_get_adapter_by_pf_port_id(uint16_t pf_port_id)
37 struct rte_eth_dev *dev;
38 struct sfc_adapter *sa;
40 SFC_ASSERT(pf_port_id < RTE_MAX_ETHPORTS);
42 dev = &rte_eth_devices[pf_port_id];
43 sa = sfc_adapter_by_eth_dev(dev);
51 sfc_put_adapter(struct sfc_adapter *sa)
53 sfc_adapter_unlock(sa);
57 sfc_repr_proxy_mbox_send(struct sfc_repr_proxy_mbox *mbox,
58 struct sfc_repr_proxy_port *port,
59 enum sfc_repr_proxy_mbox_op op)
61 const unsigned int wait_ms = SFC_REPR_PROXY_MBOX_POLL_TIMEOUT_MS;
69 * Release ordering enforces marker set after data is populated.
70 * Paired with acquire ordering in sfc_repr_proxy_mbox_handle().
72 __atomic_store_n(&mbox->write_marker, true, __ATOMIC_RELEASE);
75 * Wait for the representor routine to process the request.
78 for (i = 0; i < wait_ms; i++) {
80 * Paired with release ordering in sfc_repr_proxy_mbox_handle()
81 * on acknowledge write.
83 if (__atomic_load_n(&mbox->ack, __ATOMIC_ACQUIRE))
91 "%s() failed to wait for representor proxy routine ack",
100 sfc_repr_proxy_mbox_handle(struct sfc_repr_proxy *rp)
102 struct sfc_repr_proxy_mbox *mbox = &rp->mbox;
105 * Paired with release ordering in sfc_repr_proxy_mbox_send()
108 if (!__atomic_load_n(&mbox->write_marker, __ATOMIC_ACQUIRE))
111 mbox->write_marker = false;
114 case SFC_REPR_PROXY_MBOX_ADD_PORT:
115 TAILQ_INSERT_TAIL(&rp->ports, mbox->port, entries);
117 case SFC_REPR_PROXY_MBOX_DEL_PORT:
118 TAILQ_REMOVE(&rp->ports, mbox->port, entries);
126 * Paired with acquire ordering in sfc_repr_proxy_mbox_send()
127 * on acknowledge read.
129 __atomic_store_n(&mbox->ack, true, __ATOMIC_RELEASE);
133 sfc_repr_proxy_routine(void *arg)
135 struct sfc_repr_proxy *rp = arg;
137 sfc_repr_proxy_mbox_handle(rp);
143 sfc_repr_proxy_txq_attach(struct sfc_adapter *sa)
145 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
146 struct sfc_repr_proxy *rp = &sa->repr_proxy;
149 sfc_log_init(sa, "entry");
151 for (i = 0; i < sfc_repr_nb_txq(sas); i++) {
152 sfc_sw_index_t sw_index = sfc_repr_txq_sw_index(sas, i);
154 rp->dp_txq[i].sw_index = sw_index;
157 sfc_log_init(sa, "done");
163 sfc_repr_proxy_txq_detach(struct sfc_adapter *sa)
165 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
166 struct sfc_repr_proxy *rp = &sa->repr_proxy;
169 sfc_log_init(sa, "entry");
171 for (i = 0; i < sfc_repr_nb_txq(sas); i++)
172 rp->dp_txq[i].sw_index = 0;
174 sfc_log_init(sa, "done");
178 sfc_repr_proxy_txq_init(struct sfc_adapter *sa)
180 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
181 struct sfc_repr_proxy *rp = &sa->repr_proxy;
182 const struct rte_eth_txconf tx_conf = {
183 .tx_free_thresh = SFC_REPR_PROXY_TXQ_FREE_THRESH,
185 struct sfc_txq_info *txq_info;
190 sfc_log_init(sa, "entry");
192 if (!sfc_repr_available(sas)) {
193 sfc_log_init(sa, "representors not supported - skip");
197 for (init_i = 0; init_i < sfc_repr_nb_txq(sas); init_i++) {
198 struct sfc_repr_proxy_dp_txq *txq = &rp->dp_txq[init_i];
200 txq_info = &sfc_sa2shared(sa)->txq_info[txq->sw_index];
201 if (txq_info->state == SFC_TXQ_INITIALIZED) {
203 "representor proxy TxQ %u is already initialized - skip",
208 sfc_tx_qinit_info(sa, txq->sw_index);
210 rc = sfc_tx_qinit(sa, txq->sw_index,
211 SFC_REPR_PROXY_TX_DESC_COUNT, sa->socket_id,
215 sfc_err(sa, "failed to init representor proxy TxQ %u",
221 sfc_log_init(sa, "done");
226 for (i = 0; i < init_i; i++) {
227 struct sfc_repr_proxy_dp_txq *txq = &rp->dp_txq[i];
229 txq_info = &sfc_sa2shared(sa)->txq_info[txq->sw_index];
230 if (txq_info->state == SFC_TXQ_INITIALIZED)
231 sfc_tx_qfini(sa, txq->sw_index);
233 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
239 sfc_repr_proxy_txq_fini(struct sfc_adapter *sa)
241 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
242 struct sfc_repr_proxy *rp = &sa->repr_proxy;
243 struct sfc_txq_info *txq_info;
246 sfc_log_init(sa, "entry");
248 if (!sfc_repr_available(sas)) {
249 sfc_log_init(sa, "representors not supported - skip");
253 for (i = 0; i < sfc_repr_nb_txq(sas); i++) {
254 struct sfc_repr_proxy_dp_txq *txq = &rp->dp_txq[i];
256 txq_info = &sfc_sa2shared(sa)->txq_info[txq->sw_index];
257 if (txq_info->state != SFC_TXQ_INITIALIZED) {
259 "representor proxy TxQ %u is already finalized - skip",
264 sfc_tx_qfini(sa, txq->sw_index);
267 sfc_log_init(sa, "done");
271 sfc_repr_proxy_txq_start(struct sfc_adapter *sa)
273 struct sfc_repr_proxy *rp = &sa->repr_proxy;
275 sfc_log_init(sa, "entry");
279 sfc_log_init(sa, "done");
285 sfc_repr_proxy_txq_stop(struct sfc_adapter *sa)
287 sfc_log_init(sa, "entry");
288 sfc_log_init(sa, "done");
292 sfc_repr_proxy_rxq_attach(struct sfc_adapter *sa)
294 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
295 struct sfc_repr_proxy *rp = &sa->repr_proxy;
298 sfc_log_init(sa, "entry");
300 for (i = 0; i < sfc_repr_nb_rxq(sas); i++) {
301 sfc_sw_index_t sw_index = sfc_repr_rxq_sw_index(sas, i);
303 rp->dp_rxq[i].sw_index = sw_index;
306 sfc_log_init(sa, "done");
312 sfc_repr_proxy_rxq_detach(struct sfc_adapter *sa)
314 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
315 struct sfc_repr_proxy *rp = &sa->repr_proxy;
318 sfc_log_init(sa, "entry");
320 for (i = 0; i < sfc_repr_nb_rxq(sas); i++)
321 rp->dp_rxq[i].sw_index = 0;
323 sfc_log_init(sa, "done");
327 sfc_repr_proxy_rxq_init(struct sfc_adapter *sa,
328 struct sfc_repr_proxy_dp_rxq *rxq)
330 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
331 uint16_t nb_rx_desc = SFC_REPR_PROXY_RX_DESC_COUNT;
332 struct sfc_rxq_info *rxq_info;
333 struct rte_eth_rxconf rxconf = {
334 .rx_free_thresh = SFC_REPR_PROXY_RXQ_REFILL_LEVEL,
339 sfc_log_init(sa, "entry");
341 rxq_info = &sas->rxq_info[rxq->sw_index];
342 if (rxq_info->state & SFC_RXQ_INITIALIZED) {
343 sfc_log_init(sa, "RxQ is already initialized - skip");
347 nb_rx_desc = RTE_MIN(nb_rx_desc, sa->rxq_max_entries);
348 nb_rx_desc = RTE_MAX(nb_rx_desc, sa->rxq_min_entries);
350 rc = sfc_rx_qinit_info(sa, rxq->sw_index, EFX_RXQ_FLAG_INGRESS_MPORT);
352 sfc_err(sa, "failed to init representor proxy RxQ info");
353 goto fail_repr_rxq_init_info;
356 rc = sfc_rx_qinit(sa, rxq->sw_index, nb_rx_desc, sa->socket_id, &rxconf,
359 sfc_err(sa, "failed to init representor proxy RxQ");
360 goto fail_repr_rxq_init;
363 sfc_log_init(sa, "done");
368 fail_repr_rxq_init_info:
369 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
375 sfc_repr_proxy_rxq_fini(struct sfc_adapter *sa)
377 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
378 struct sfc_repr_proxy *rp = &sa->repr_proxy;
379 struct sfc_rxq_info *rxq_info;
382 sfc_log_init(sa, "entry");
384 if (!sfc_repr_available(sas)) {
385 sfc_log_init(sa, "representors not supported - skip");
389 for (i = 0; i < sfc_repr_nb_rxq(sas); i++) {
390 struct sfc_repr_proxy_dp_rxq *rxq = &rp->dp_rxq[i];
392 rxq_info = &sas->rxq_info[rxq->sw_index];
393 if (rxq_info->state != SFC_RXQ_INITIALIZED) {
395 "representor RxQ %u is already finalized - skip",
400 sfc_rx_qfini(sa, rxq->sw_index);
403 sfc_log_init(sa, "done");
407 sfc_repr_proxy_rxq_stop(struct sfc_adapter *sa)
409 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
412 sfc_log_init(sa, "entry");
414 for (i = 0; i < sfc_repr_nb_rxq(sas); i++)
415 sfc_rx_qstop(sa, sa->repr_proxy.dp_rxq[i].sw_index);
417 sfc_repr_proxy_rxq_fini(sa);
419 sfc_log_init(sa, "done");
423 sfc_repr_proxy_rxq_start(struct sfc_adapter *sa)
425 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
426 struct sfc_repr_proxy *rp = &sa->repr_proxy;
430 sfc_log_init(sa, "entry");
432 if (!sfc_repr_available(sas)) {
433 sfc_log_init(sa, "representors not supported - skip");
437 for (i = 0; i < sfc_repr_nb_rxq(sas); i++) {
438 struct sfc_repr_proxy_dp_rxq *rxq = &rp->dp_rxq[i];
440 rc = sfc_repr_proxy_rxq_init(sa, rxq);
442 sfc_err(sa, "failed to init representor proxy RxQ %u",
447 rc = sfc_rx_qstart(sa, rxq->sw_index);
449 sfc_err(sa, "failed to start representor proxy RxQ %u",
455 sfc_log_init(sa, "done");
461 sfc_repr_proxy_rxq_stop(sa);
462 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
467 sfc_repr_proxy_ports_init(struct sfc_adapter *sa)
469 struct sfc_repr_proxy *rp = &sa->repr_proxy;
472 sfc_log_init(sa, "entry");
474 rc = efx_mcdi_mport_alloc_alias(sa->nic, &rp->mport_alias, NULL);
476 sfc_err(sa, "failed to alloc mport alias: %s",
478 goto fail_alloc_mport_alias;
481 TAILQ_INIT(&rp->ports);
483 sfc_log_init(sa, "done");
487 fail_alloc_mport_alias:
489 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
494 sfc_repr_proxy_pre_detach(struct sfc_adapter *sa)
496 struct sfc_repr_proxy *rp = &sa->repr_proxy;
497 bool close_ports[RTE_MAX_ETHPORTS] = {0};
498 struct sfc_repr_proxy_port *port;
501 SFC_ASSERT(!sfc_adapter_is_locked(sa));
503 sfc_adapter_lock(sa);
505 if (sfc_repr_available(sfc_sa2shared(sa))) {
506 TAILQ_FOREACH(port, &rp->ports, entries)
507 close_ports[port->rte_port_id] = true;
509 sfc_log_init(sa, "representors not supported - skip");
512 sfc_adapter_unlock(sa);
514 for (i = 0; i < RTE_DIM(close_ports); i++) {
515 if (close_ports[i]) {
517 rte_eth_dev_close(i);
523 sfc_repr_proxy_ports_fini(struct sfc_adapter *sa)
525 struct sfc_repr_proxy *rp = &sa->repr_proxy;
527 efx_mae_mport_free(sa->nic, &rp->mport_alias);
531 sfc_repr_proxy_attach(struct sfc_adapter *sa)
533 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
534 struct sfc_repr_proxy *rp = &sa->repr_proxy;
535 struct rte_service_spec service;
540 sfc_log_init(sa, "entry");
542 if (!sfc_repr_available(sas)) {
543 sfc_log_init(sa, "representors not supported - skip");
547 rc = sfc_repr_proxy_rxq_attach(sa);
549 goto fail_rxq_attach;
551 rc = sfc_repr_proxy_txq_attach(sa);
553 goto fail_txq_attach;
555 rc = sfc_repr_proxy_ports_init(sa);
557 goto fail_ports_init;
559 cid = sfc_get_service_lcore(sa->socket_id);
560 if (cid == RTE_MAX_LCORE && sa->socket_id != SOCKET_ID_ANY) {
561 /* Warn and try to allocate on any NUMA node */
563 "repr proxy: unable to get service lcore at socket %d",
566 cid = sfc_get_service_lcore(SOCKET_ID_ANY);
568 if (cid == RTE_MAX_LCORE) {
570 sfc_err(sa, "repr proxy: failed to get service lcore");
571 goto fail_get_service_lcore;
574 memset(&service, 0, sizeof(service));
575 snprintf(service.name, sizeof(service.name),
576 "net_sfc_%hu_repr_proxy", sfc_sa2shared(sa)->port_id);
577 service.socket_id = rte_lcore_to_socket_id(cid);
578 service.callback = sfc_repr_proxy_routine;
579 service.callback_userdata = rp;
581 rc = rte_service_component_register(&service, &sid);
584 sfc_err(sa, "repr proxy: failed to register service component");
588 rc = rte_service_map_lcore_set(sid, cid, 1);
591 sfc_err(sa, "repr proxy: failed to map lcore");
595 rp->service_core_id = cid;
596 rp->service_id = sid;
598 sfc_log_init(sa, "done");
603 rte_service_component_unregister(sid);
607 * No need to rollback service lcore get since
608 * it just makes socket_id based search and remembers it.
611 fail_get_service_lcore:
612 sfc_repr_proxy_ports_fini(sa);
615 sfc_repr_proxy_txq_detach(sa);
618 sfc_repr_proxy_rxq_detach(sa);
621 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
626 sfc_repr_proxy_detach(struct sfc_adapter *sa)
628 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
629 struct sfc_repr_proxy *rp = &sa->repr_proxy;
631 sfc_log_init(sa, "entry");
633 if (!sfc_repr_available(sas)) {
634 sfc_log_init(sa, "representors not supported - skip");
638 rte_service_map_lcore_set(rp->service_id, rp->service_core_id, 0);
639 rte_service_component_unregister(rp->service_id);
640 sfc_repr_proxy_ports_fini(sa);
641 sfc_repr_proxy_rxq_detach(sa);
642 sfc_repr_proxy_txq_detach(sa);
644 sfc_log_init(sa, "done");
648 sfc_repr_proxy_start(struct sfc_adapter *sa)
650 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
651 struct sfc_repr_proxy *rp = &sa->repr_proxy;
654 sfc_log_init(sa, "entry");
657 * The condition to start the proxy is insufficient. It will be
658 * complemented with representor port start/stop support.
660 if (!sfc_repr_available(sas)) {
661 sfc_log_init(sa, "representors not supported - skip");
665 rc = sfc_repr_proxy_rxq_start(sa);
669 rc = sfc_repr_proxy_txq_start(sa);
673 /* Service core may be in "stopped" state, start it */
674 rc = rte_service_lcore_start(rp->service_core_id);
675 if (rc != 0 && rc != -EALREADY) {
677 sfc_err(sa, "failed to start service core for %s: %s",
678 rte_service_get_name(rp->service_id),
680 goto fail_start_core;
683 /* Run the service */
684 rc = rte_service_component_runstate_set(rp->service_id, 1);
687 sfc_err(sa, "failed to run %s component: %s",
688 rte_service_get_name(rp->service_id),
690 goto fail_component_runstate_set;
692 rc = rte_service_runstate_set(rp->service_id, 1);
695 sfc_err(sa, "failed to run %s: %s",
696 rte_service_get_name(rp->service_id),
698 goto fail_runstate_set;
703 sfc_log_init(sa, "done");
708 rte_service_component_runstate_set(rp->service_id, 0);
710 fail_component_runstate_set:
711 /* Service lcore may be shared and we never stop it */
714 sfc_repr_proxy_txq_stop(sa);
717 sfc_repr_proxy_rxq_stop(sa);
720 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
725 sfc_repr_proxy_stop(struct sfc_adapter *sa)
727 struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
728 struct sfc_repr_proxy *rp = &sa->repr_proxy;
731 sfc_log_init(sa, "entry");
733 if (!sfc_repr_available(sas)) {
734 sfc_log_init(sa, "representors not supported - skip");
738 rc = rte_service_runstate_set(rp->service_id, 0);
740 sfc_err(sa, "failed to stop %s: %s",
741 rte_service_get_name(rp->service_id),
745 rc = rte_service_component_runstate_set(rp->service_id, 0);
747 sfc_err(sa, "failed to stop %s component: %s",
748 rte_service_get_name(rp->service_id),
752 /* Service lcore may be shared and we never stop it */
754 sfc_repr_proxy_rxq_stop(sa);
755 sfc_repr_proxy_txq_stop(sa);
759 sfc_log_init(sa, "done");
762 static struct sfc_repr_proxy_port *
763 sfc_repr_proxy_find_port(struct sfc_repr_proxy *rp, uint16_t repr_id)
765 struct sfc_repr_proxy_port *port;
767 TAILQ_FOREACH(port, &rp->ports, entries) {
768 if (port->repr_id == repr_id)
776 sfc_repr_proxy_add_port(uint16_t pf_port_id, uint16_t repr_id,
777 uint16_t rte_port_id, const efx_mport_sel_t *mport_sel)
779 struct sfc_repr_proxy_port *port;
780 struct sfc_repr_proxy *rp;
781 struct sfc_adapter *sa;
784 sa = sfc_get_adapter_by_pf_port_id(pf_port_id);
785 rp = sfc_repr_proxy_by_adapter(sa);
787 sfc_log_init(sa, "entry");
788 TAILQ_FOREACH(port, &rp->ports, entries) {
789 if (port->rte_port_id == rte_port_id) {
791 sfc_err(sa, "%s() failed: port exists", __func__);
792 goto fail_port_exists;
796 port = rte_zmalloc("sfc-repr-proxy-port", sizeof(*port),
800 sfc_err(sa, "failed to alloc memory for proxy port");
801 goto fail_alloc_port;
804 rc = efx_mae_mport_id_by_selector(sa->nic, mport_sel,
805 &port->egress_mport);
808 "failed get MAE mport id by selector (repr_id %u): %s",
809 repr_id, rte_strerror(rc));
813 port->rte_port_id = rte_port_id;
814 port->repr_id = repr_id;
817 rc = sfc_repr_proxy_mbox_send(&rp->mbox, port,
818 SFC_REPR_PROXY_MBOX_ADD_PORT);
820 sfc_err(sa, "failed to add proxy port %u",
825 TAILQ_INSERT_TAIL(&rp->ports, port, entries);
828 sfc_log_init(sa, "done");
838 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
845 sfc_repr_proxy_del_port(uint16_t pf_port_id, uint16_t repr_id)
847 struct sfc_repr_proxy_port *port;
848 struct sfc_repr_proxy *rp;
849 struct sfc_adapter *sa;
852 sa = sfc_get_adapter_by_pf_port_id(pf_port_id);
853 rp = sfc_repr_proxy_by_adapter(sa);
855 sfc_log_init(sa, "entry");
857 port = sfc_repr_proxy_find_port(rp, repr_id);
859 sfc_err(sa, "failed: no such port");
865 rc = sfc_repr_proxy_mbox_send(&rp->mbox, port,
866 SFC_REPR_PROXY_MBOX_DEL_PORT);
868 sfc_err(sa, "failed to remove proxy port %u",
870 goto fail_port_remove;
873 TAILQ_REMOVE(&rp->ports, port, entries);
878 sfc_log_init(sa, "done");
886 sfc_log_init(sa, "failed: %s", rte_strerror(rc));
893 sfc_repr_proxy_add_rxq(uint16_t pf_port_id, uint16_t repr_id,
894 uint16_t queue_id, struct rte_ring *rx_ring,
895 struct rte_mempool *mp)
897 struct sfc_repr_proxy_port *port;
898 struct sfc_repr_proxy_rxq *rxq;
899 struct sfc_repr_proxy *rp;
900 struct sfc_adapter *sa;
902 sa = sfc_get_adapter_by_pf_port_id(pf_port_id);
903 rp = sfc_repr_proxy_by_adapter(sa);
905 sfc_log_init(sa, "entry");
907 port = sfc_repr_proxy_find_port(rp, repr_id);
909 sfc_err(sa, "%s() failed: no such port", __func__);
913 rxq = &port->rxq[queue_id];
914 if (rp->dp_rxq[queue_id].mp != NULL && rp->dp_rxq[queue_id].mp != mp) {
915 sfc_err(sa, "multiple mempools per queue are not supported");
922 rp->dp_rxq[queue_id].mp = mp;
923 rp->dp_rxq[queue_id].ref_count++;
925 sfc_log_init(sa, "done");
932 sfc_repr_proxy_del_rxq(uint16_t pf_port_id, uint16_t repr_id,
935 struct sfc_repr_proxy_port *port;
936 struct sfc_repr_proxy_rxq *rxq;
937 struct sfc_repr_proxy *rp;
938 struct sfc_adapter *sa;
940 sa = sfc_get_adapter_by_pf_port_id(pf_port_id);
941 rp = sfc_repr_proxy_by_adapter(sa);
943 sfc_log_init(sa, "entry");
945 port = sfc_repr_proxy_find_port(rp, repr_id);
947 sfc_err(sa, "%s() failed: no such port", __func__);
951 rxq = &port->rxq[queue_id];
955 rp->dp_rxq[queue_id].ref_count--;
956 if (rp->dp_rxq[queue_id].ref_count == 0)
957 rp->dp_rxq[queue_id].mp = NULL;
959 sfc_log_init(sa, "done");
964 sfc_repr_proxy_add_txq(uint16_t pf_port_id, uint16_t repr_id,
965 uint16_t queue_id, struct rte_ring *tx_ring,
966 efx_mport_id_t *egress_mport)
968 struct sfc_repr_proxy_port *port;
969 struct sfc_repr_proxy_txq *txq;
970 struct sfc_repr_proxy *rp;
971 struct sfc_adapter *sa;
973 sa = sfc_get_adapter_by_pf_port_id(pf_port_id);
974 rp = sfc_repr_proxy_by_adapter(sa);
976 sfc_log_init(sa, "entry");
978 port = sfc_repr_proxy_find_port(rp, repr_id);
980 sfc_err(sa, "%s() failed: no such port", __func__);
984 txq = &port->txq[queue_id];
988 *egress_mport = port->egress_mport;
990 sfc_log_init(sa, "done");
997 sfc_repr_proxy_del_txq(uint16_t pf_port_id, uint16_t repr_id,
1000 struct sfc_repr_proxy_port *port;
1001 struct sfc_repr_proxy_txq *txq;
1002 struct sfc_repr_proxy *rp;
1003 struct sfc_adapter *sa;
1005 sa = sfc_get_adapter_by_pf_port_id(pf_port_id);
1006 rp = sfc_repr_proxy_by_adapter(sa);
1008 sfc_log_init(sa, "entry");
1010 port = sfc_repr_proxy_find_port(rp, repr_id);
1012 sfc_err(sa, "%s() failed: no such port", __func__);
1016 txq = &port->txq[queue_id];
1020 sfc_log_init(sa, "done");
1021 sfc_put_adapter(sa);