xref: /dpdk/drivers/common/sfc_efx/base/rhead_tx.c (revision 672386c1e9e1f64f7aa3b1360ad22dc737ea8d72)
14fd0181fSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
24fd0181fSAndrew Rybchenko  *
3*672386c1SAndrew Rybchenko  * Copyright(c) 2019-2021 Xilinx, Inc.
44fd0181fSAndrew Rybchenko  * Copyright(c) 2018-2019 Solarflare Communications Inc.
54fd0181fSAndrew Rybchenko  */
64fd0181fSAndrew Rybchenko 
74fd0181fSAndrew Rybchenko #include "efx.h"
84fd0181fSAndrew Rybchenko #include "efx_impl.h"
94fd0181fSAndrew Rybchenko 
104fd0181fSAndrew Rybchenko 
114fd0181fSAndrew Rybchenko #if EFSYS_OPT_RIVERHEAD
124fd0181fSAndrew Rybchenko 
134fd0181fSAndrew Rybchenko 	__checkReturn	efx_rc_t
rhead_tx_init(__in efx_nic_t * enp)144fd0181fSAndrew Rybchenko rhead_tx_init(
154fd0181fSAndrew Rybchenko 	__in		efx_nic_t *enp)
164fd0181fSAndrew Rybchenko {
174fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(enp))
184fd0181fSAndrew Rybchenko 	/* Nothing to do here */
194fd0181fSAndrew Rybchenko 	return (0);
204fd0181fSAndrew Rybchenko }
214fd0181fSAndrew Rybchenko 
224fd0181fSAndrew Rybchenko 			void
rhead_tx_fini(__in efx_nic_t * enp)234fd0181fSAndrew Rybchenko rhead_tx_fini(
244fd0181fSAndrew Rybchenko 	__in		efx_nic_t *enp)
254fd0181fSAndrew Rybchenko {
264fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(enp))
274fd0181fSAndrew Rybchenko 	/* Nothing to do here */
284fd0181fSAndrew Rybchenko }
294fd0181fSAndrew Rybchenko 
304fd0181fSAndrew Rybchenko 	__checkReturn	efx_rc_t
rhead_tx_qcreate(__in efx_nic_t * enp,__in unsigned int index,__in unsigned int label,__in efsys_mem_t * esmp,__in size_t ndescs,__in uint32_t id,__in uint16_t flags,__in efx_evq_t * eep,__in efx_txq_t * etp,__out unsigned int * addedp)314fd0181fSAndrew Rybchenko rhead_tx_qcreate(
324fd0181fSAndrew Rybchenko 	__in		efx_nic_t *enp,
334fd0181fSAndrew Rybchenko 	__in		unsigned int index,
344fd0181fSAndrew Rybchenko 	__in		unsigned int label,
354fd0181fSAndrew Rybchenko 	__in		efsys_mem_t *esmp,
364fd0181fSAndrew Rybchenko 	__in		size_t ndescs,
374fd0181fSAndrew Rybchenko 	__in		uint32_t id,
384fd0181fSAndrew Rybchenko 	__in		uint16_t flags,
394fd0181fSAndrew Rybchenko 	__in		efx_evq_t *eep,
404fd0181fSAndrew Rybchenko 	__in		efx_txq_t *etp,
414fd0181fSAndrew Rybchenko 	__out		unsigned int *addedp)
424fd0181fSAndrew Rybchenko {
434fd0181fSAndrew Rybchenko 	efx_rc_t rc;
444fd0181fSAndrew Rybchenko 
454fd0181fSAndrew Rybchenko 	/*
464fd0181fSAndrew Rybchenko 	 * NMC manages the NMMU entries, and so buffer table IDs are
474fd0181fSAndrew Rybchenko 	 * ignored here
484fd0181fSAndrew Rybchenko 	 */
494fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(id))
504fd0181fSAndrew Rybchenko 
514fd0181fSAndrew Rybchenko 	if ((rc = efx_mcdi_init_txq(enp, ndescs, eep->ee_index, label, index,
524fd0181fSAndrew Rybchenko 	    flags, esmp)) != 0)
534fd0181fSAndrew Rybchenko 		goto fail1;
544fd0181fSAndrew Rybchenko 
554fd0181fSAndrew Rybchenko 	/*
564fd0181fSAndrew Rybchenko 	 * Return the initial queue index which is zero since no option
574fd0181fSAndrew Rybchenko 	 * descriptors are sent at start of day.
584fd0181fSAndrew Rybchenko 	 */
594fd0181fSAndrew Rybchenko 	*addedp = 0;
604fd0181fSAndrew Rybchenko 
614fd0181fSAndrew Rybchenko 	return (0);
624fd0181fSAndrew Rybchenko 
634fd0181fSAndrew Rybchenko fail1:
644fd0181fSAndrew Rybchenko 	EFSYS_PROBE1(fail1, efx_rc_t, rc);
654fd0181fSAndrew Rybchenko 
664fd0181fSAndrew Rybchenko 	return (rc);
674fd0181fSAndrew Rybchenko }
684fd0181fSAndrew Rybchenko 
694fd0181fSAndrew Rybchenko 		void
rhead_tx_qdestroy(__in efx_txq_t * etp)704fd0181fSAndrew Rybchenko rhead_tx_qdestroy(
714fd0181fSAndrew Rybchenko 	__in	efx_txq_t *etp)
724fd0181fSAndrew Rybchenko {
734fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(etp))
744fd0181fSAndrew Rybchenko 	/* Nothing to do here */
754fd0181fSAndrew Rybchenko }
764fd0181fSAndrew Rybchenko 
774fd0181fSAndrew Rybchenko 	__checkReturn		efx_rc_t
rhead_tx_qpost(__in efx_txq_t * etp,__in_ecount (ndescs)efx_buffer_t * eb,__in unsigned int ndescs,__in unsigned int completed,__inout unsigned int * addedp)784fd0181fSAndrew Rybchenko rhead_tx_qpost(
794fd0181fSAndrew Rybchenko 	__in			efx_txq_t *etp,
804fd0181fSAndrew Rybchenko 	__in_ecount(ndescs)	efx_buffer_t *eb,
814fd0181fSAndrew Rybchenko 	__in			unsigned int ndescs,
824fd0181fSAndrew Rybchenko 	__in			unsigned int completed,
834fd0181fSAndrew Rybchenko 	__inout			unsigned int *addedp)
844fd0181fSAndrew Rybchenko {
854fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(etp))
864fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(eb))
874fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(ndescs))
884fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(completed))
894fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(addedp))
904fd0181fSAndrew Rybchenko 
914fd0181fSAndrew Rybchenko 	/* FIXME Implement the method for Riverhead */
924fd0181fSAndrew Rybchenko 
934fd0181fSAndrew Rybchenko 	return (ENOTSUP);
944fd0181fSAndrew Rybchenko }
954fd0181fSAndrew Rybchenko 
964fd0181fSAndrew Rybchenko 			void
rhead_tx_qpush(__in efx_txq_t * etp,__in unsigned int added,__in unsigned int pushed)974fd0181fSAndrew Rybchenko rhead_tx_qpush(
984fd0181fSAndrew Rybchenko 	__in		efx_txq_t *etp,
994fd0181fSAndrew Rybchenko 	__in		unsigned int added,
1004fd0181fSAndrew Rybchenko 	__in		unsigned int pushed)
1014fd0181fSAndrew Rybchenko {
1024fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(etp, added, pushed))
1034fd0181fSAndrew Rybchenko 
1044fd0181fSAndrew Rybchenko 	/* FIXME Implement the method for Riverhead */
1054fd0181fSAndrew Rybchenko 	EFSYS_ASSERT(B_FALSE);
1064fd0181fSAndrew Rybchenko }
1074fd0181fSAndrew Rybchenko 
1084fd0181fSAndrew Rybchenko 	__checkReturn	efx_rc_t
rhead_tx_qpace(__in efx_txq_t * etp,__in unsigned int ns)1094fd0181fSAndrew Rybchenko rhead_tx_qpace(
1104fd0181fSAndrew Rybchenko 	__in		efx_txq_t *etp,
1114fd0181fSAndrew Rybchenko 	__in		unsigned int ns)
1124fd0181fSAndrew Rybchenko {
1134fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(etp))
1144fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(ns))
1154fd0181fSAndrew Rybchenko 
1164fd0181fSAndrew Rybchenko 	/* FIXME Implement the method for Riverhead */
1174fd0181fSAndrew Rybchenko 
1184fd0181fSAndrew Rybchenko 	return (ENOTSUP);
1194fd0181fSAndrew Rybchenko }
1204fd0181fSAndrew Rybchenko 
1214fd0181fSAndrew Rybchenko 	__checkReturn	efx_rc_t
rhead_tx_qflush(__in efx_txq_t * etp)1224fd0181fSAndrew Rybchenko rhead_tx_qflush(
1234fd0181fSAndrew Rybchenko 	__in		efx_txq_t *etp)
1244fd0181fSAndrew Rybchenko {
1254fd0181fSAndrew Rybchenko 	efx_nic_t *enp = etp->et_enp;
1264fd0181fSAndrew Rybchenko 	efx_rc_t rc;
1274fd0181fSAndrew Rybchenko 
1284fd0181fSAndrew Rybchenko 	if ((rc = efx_mcdi_fini_txq(enp, etp->et_index)) != 0)
1294fd0181fSAndrew Rybchenko 		goto fail1;
1304fd0181fSAndrew Rybchenko 
1314fd0181fSAndrew Rybchenko 	return (0);
1324fd0181fSAndrew Rybchenko 
1334fd0181fSAndrew Rybchenko fail1:
1344fd0181fSAndrew Rybchenko 	/*
1354fd0181fSAndrew Rybchenko 	 * EALREADY is not an error, but indicates that the MC has rebooted and
1364fd0181fSAndrew Rybchenko 	 * that the TXQ has already been destroyed. Callers need to know that
1374fd0181fSAndrew Rybchenko 	 * the TXQ flush has completed to avoid waiting until timeout for a
1384fd0181fSAndrew Rybchenko 	 * flush done event that will not be delivered.
1394fd0181fSAndrew Rybchenko 	 */
1404fd0181fSAndrew Rybchenko 	if (rc != EALREADY)
1414fd0181fSAndrew Rybchenko 		EFSYS_PROBE1(fail1, efx_rc_t, rc);
1424fd0181fSAndrew Rybchenko 
1434fd0181fSAndrew Rybchenko 	return (rc);
1444fd0181fSAndrew Rybchenko }
1454fd0181fSAndrew Rybchenko 
1464fd0181fSAndrew Rybchenko 			void
rhead_tx_qenable(__in efx_txq_t * etp)1474fd0181fSAndrew Rybchenko rhead_tx_qenable(
1484fd0181fSAndrew Rybchenko 	__in		efx_txq_t *etp)
1494fd0181fSAndrew Rybchenko {
1504fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(etp))
1514fd0181fSAndrew Rybchenko 	/* Nothing to do here */
1524fd0181fSAndrew Rybchenko }
1534fd0181fSAndrew Rybchenko 
1544fd0181fSAndrew Rybchenko 	__checkReturn		efx_rc_t
rhead_tx_qdesc_post(__in efx_txq_t * etp,__in_ecount (ndescs)efx_desc_t * ed,__in unsigned int ndescs,__in unsigned int completed,__inout unsigned int * addedp)1554fd0181fSAndrew Rybchenko rhead_tx_qdesc_post(
1564fd0181fSAndrew Rybchenko 	__in			efx_txq_t *etp,
1574fd0181fSAndrew Rybchenko 	__in_ecount(ndescs)	efx_desc_t *ed,
1584fd0181fSAndrew Rybchenko 	__in			unsigned int ndescs,
1594fd0181fSAndrew Rybchenko 	__in			unsigned int completed,
1604fd0181fSAndrew Rybchenko 	__inout			unsigned int *addedp)
1614fd0181fSAndrew Rybchenko {
1624fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(etp))
1634fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(ed))
1644fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(ndescs))
1654fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(completed))
1664fd0181fSAndrew Rybchenko 	_NOTE(ARGUNUSED(addedp))
1674fd0181fSAndrew Rybchenko 
1684fd0181fSAndrew Rybchenko 	/* FIXME Implement the method for Riverhead */
1694fd0181fSAndrew Rybchenko 
1704fd0181fSAndrew Rybchenko 	return (ENOTSUP);
1714fd0181fSAndrew Rybchenko }
1724fd0181fSAndrew Rybchenko 
1734fd0181fSAndrew Rybchenko #if EFSYS_OPT_QSTATS
1744fd0181fSAndrew Rybchenko 
1754fd0181fSAndrew Rybchenko 			void
rhead_tx_qstats_update(__in efx_txq_t * etp,__inout_ecount (TX_NQSTATS)efsys_stat_t * stat)1764fd0181fSAndrew Rybchenko rhead_tx_qstats_update(
1774fd0181fSAndrew Rybchenko 	__in				efx_txq_t *etp,
1784fd0181fSAndrew Rybchenko 	__inout_ecount(TX_NQSTATS)	efsys_stat_t *stat)
1794fd0181fSAndrew Rybchenko {
1804fd0181fSAndrew Rybchenko 	unsigned int id;
1814fd0181fSAndrew Rybchenko 
1824fd0181fSAndrew Rybchenko 	for (id = 0; id < TX_NQSTATS; id++) {
1834fd0181fSAndrew Rybchenko 		efsys_stat_t *essp = &stat[id];
1844fd0181fSAndrew Rybchenko 
1854fd0181fSAndrew Rybchenko 		EFSYS_STAT_INCR(essp, etp->et_stat[id]);
1864fd0181fSAndrew Rybchenko 		etp->et_stat[id] = 0;
1874fd0181fSAndrew Rybchenko 	}
1884fd0181fSAndrew Rybchenko }
1894fd0181fSAndrew Rybchenko 
1904fd0181fSAndrew Rybchenko #endif /* EFSYS_OPT_QSTATS */
1914fd0181fSAndrew Rybchenko 
1924fd0181fSAndrew Rybchenko #endif /* EFSYS_OPT_RIVERHEAD */
193