xref: /aosp_15_r20/external/ethtool/netlink/coalesce.c (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski  * coalesce.c - netlink implementation of coalescing commands
3*1b481fc3SMaciej Żenczykowski  *
4*1b481fc3SMaciej Żenczykowski  * Implementation of "ethtool -c <dev>" and "ethtool -C <dev> ..."
5*1b481fc3SMaciej Żenczykowski  */
6*1b481fc3SMaciej Żenczykowski 
7*1b481fc3SMaciej Żenczykowski #include <errno.h>
8*1b481fc3SMaciej Żenczykowski #include <string.h>
9*1b481fc3SMaciej Żenczykowski #include <stdio.h>
10*1b481fc3SMaciej Żenczykowski 
11*1b481fc3SMaciej Żenczykowski #include "../internal.h"
12*1b481fc3SMaciej Żenczykowski #include "../common.h"
13*1b481fc3SMaciej Żenczykowski #include "netlink.h"
14*1b481fc3SMaciej Żenczykowski #include "parser.h"
15*1b481fc3SMaciej Żenczykowski 
16*1b481fc3SMaciej Żenczykowski /* COALESCE_GET */
17*1b481fc3SMaciej Żenczykowski 
coalesce_reply_cb(const struct nlmsghdr * nlhdr,void * data)18*1b481fc3SMaciej Żenczykowski int coalesce_reply_cb(const struct nlmsghdr *nlhdr, void *data)
19*1b481fc3SMaciej Żenczykowski {
20*1b481fc3SMaciej Żenczykowski 	const struct nlattr *tb[ETHTOOL_A_COALESCE_MAX + 1] = {};
21*1b481fc3SMaciej Żenczykowski 	DECLARE_ATTR_TB_INFO(tb);
22*1b481fc3SMaciej Żenczykowski 	struct nl_context *nlctx = data;
23*1b481fc3SMaciej Żenczykowski 	bool silent;
24*1b481fc3SMaciej Żenczykowski 	int err_ret;
25*1b481fc3SMaciej Żenczykowski 	int ret;
26*1b481fc3SMaciej Żenczykowski 
27*1b481fc3SMaciej Żenczykowski 	silent = nlctx->is_dump || nlctx->is_monitor;
28*1b481fc3SMaciej Żenczykowski 	err_ret = silent ? MNL_CB_OK : MNL_CB_ERROR;
29*1b481fc3SMaciej Żenczykowski 	ret = mnl_attr_parse(nlhdr, GENL_HDRLEN, attr_cb, &tb_info);
30*1b481fc3SMaciej Żenczykowski 	if (ret < 0)
31*1b481fc3SMaciej Żenczykowski 		return err_ret;
32*1b481fc3SMaciej Żenczykowski 	nlctx->devname = get_dev_name(tb[ETHTOOL_A_COALESCE_HEADER]);
33*1b481fc3SMaciej Żenczykowski 	if (!dev_ok(nlctx))
34*1b481fc3SMaciej Żenczykowski 		return err_ret;
35*1b481fc3SMaciej Żenczykowski 
36*1b481fc3SMaciej Żenczykowski 	open_json_object(NULL);
37*1b481fc3SMaciej Żenczykowski 
38*1b481fc3SMaciej Żenczykowski 	if (silent)
39*1b481fc3SMaciej Żenczykowski 		show_cr();
40*1b481fc3SMaciej Żenczykowski 	print_string(PRINT_ANY, "ifname", "Coalesce parameters for %s:\n",
41*1b481fc3SMaciej Żenczykowski 		     nlctx->devname);
42*1b481fc3SMaciej Żenczykowski 	show_bool("rx", "Adaptive RX: %s  ",
43*1b481fc3SMaciej Żenczykowski 		  tb[ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX]);
44*1b481fc3SMaciej Żenczykowski 	show_bool("tx", "TX: %s\n", tb[ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX]);
45*1b481fc3SMaciej Żenczykowski 	show_u32("stats-block-usecs", "stats-block-usecs:\t",
46*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_STATS_BLOCK_USECS]);
47*1b481fc3SMaciej Żenczykowski 	show_u32("sample-interval", "sample-interval:\t",
48*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL]);
49*1b481fc3SMaciej Żenczykowski 	show_u32("pkt-rate-low", "pkt-rate-low:\t\t",
50*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_PKT_RATE_LOW]);
51*1b481fc3SMaciej Żenczykowski 	show_u32("pkt-rate-high", "pkt-rate-high:\t\t",
52*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_PKT_RATE_HIGH]);
53*1b481fc3SMaciej Żenczykowski 	show_cr();
54*1b481fc3SMaciej Żenczykowski 	show_u32("rx-usecs", "rx-usecs:\t", tb[ETHTOOL_A_COALESCE_RX_USECS]);
55*1b481fc3SMaciej Żenczykowski 	show_u32("rx-frames", "rx-frames:\t",
56*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_MAX_FRAMES]);
57*1b481fc3SMaciej Żenczykowski 	show_u32("rx-usecs-irq", "rx-usecs-irq:\t",
58*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_USECS_IRQ]);
59*1b481fc3SMaciej Żenczykowski 	show_u32("rx-frames-irq", "rx-frames-irq:\t",
60*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ]);
61*1b481fc3SMaciej Żenczykowski 	show_cr();
62*1b481fc3SMaciej Żenczykowski 	show_u32("tx-usecs", "tx-usecs:\t", tb[ETHTOOL_A_COALESCE_TX_USECS]);
63*1b481fc3SMaciej Żenczykowski 	show_u32("tx-frames", "tx-frames:\t",
64*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_MAX_FRAMES]);
65*1b481fc3SMaciej Żenczykowski 	show_u32("tx-usecs-irq", "tx-usecs-irq:\t",
66*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_USECS_IRQ]);
67*1b481fc3SMaciej Żenczykowski 	show_u32("tx-frames-irq", "tx-frames-irq:\t",
68*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ]);
69*1b481fc3SMaciej Żenczykowski 	show_cr();
70*1b481fc3SMaciej Żenczykowski 	show_u32("rx-usecs-low", "rx-usecs-low:\t",
71*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_USECS_LOW]);
72*1b481fc3SMaciej Żenczykowski 	show_u32("rx-frame-low", "rx-frame-low:\t",
73*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW]);
74*1b481fc3SMaciej Żenczykowski 	show_u32("tx-usecs-low", "tx-usecs-low:\t",
75*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_USECS_LOW]);
76*1b481fc3SMaciej Żenczykowski 	show_u32("tx-frame-low", "tx-frame-low:\t",
77*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW]);
78*1b481fc3SMaciej Żenczykowski 	show_cr();
79*1b481fc3SMaciej Żenczykowski 	show_u32("rx-usecs-high", "rx-usecs-high:\t",
80*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_USECS_HIGH]);
81*1b481fc3SMaciej Żenczykowski 	show_u32("rx-frame-high", "rx-frame-high:\t",
82*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH]);
83*1b481fc3SMaciej Żenczykowski 	show_u32("tx-usecs-high", "tx-usecs-high:\t",
84*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_USECS_HIGH]);
85*1b481fc3SMaciej Żenczykowski 	show_u32("tx-frame-high", "tx-frame-high:\t",
86*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH]);
87*1b481fc3SMaciej Żenczykowski 	show_cr();
88*1b481fc3SMaciej Żenczykowski 	show_bool("rx", "CQE mode RX: %s  ",
89*1b481fc3SMaciej Żenczykowski 		  tb[ETHTOOL_A_COALESCE_USE_CQE_MODE_RX]);
90*1b481fc3SMaciej Żenczykowski 	show_bool("tx", "TX: %s\n", tb[ETHTOOL_A_COALESCE_USE_CQE_MODE_TX]);
91*1b481fc3SMaciej Żenczykowski 	show_cr();
92*1b481fc3SMaciej Żenczykowski 	show_u32("tx-aggr-max-bytes", "tx-aggr-max-bytes:\t",
93*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES]);
94*1b481fc3SMaciej Żenczykowski 	show_u32("tx-aggr-max-frames", "tx-aggr-max-frames:\t",
95*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES]);
96*1b481fc3SMaciej Żenczykowski 	show_u32("tx-aggr-time-usecs", "tx-aggr-time-usecs\t",
97*1b481fc3SMaciej Żenczykowski 		 tb[ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS]);
98*1b481fc3SMaciej Żenczykowski 	show_cr();
99*1b481fc3SMaciej Żenczykowski 
100*1b481fc3SMaciej Żenczykowski 	close_json_object();
101*1b481fc3SMaciej Żenczykowski 
102*1b481fc3SMaciej Żenczykowski 	return MNL_CB_OK;
103*1b481fc3SMaciej Żenczykowski }
104*1b481fc3SMaciej Żenczykowski 
nl_gcoalesce(struct cmd_context * ctx)105*1b481fc3SMaciej Żenczykowski int nl_gcoalesce(struct cmd_context *ctx)
106*1b481fc3SMaciej Żenczykowski {
107*1b481fc3SMaciej Żenczykowski 	struct nl_context *nlctx = ctx->nlctx;
108*1b481fc3SMaciej Żenczykowski 	struct nl_socket *nlsk = nlctx->ethnl_socket;
109*1b481fc3SMaciej Żenczykowski 	int ret;
110*1b481fc3SMaciej Żenczykowski 
111*1b481fc3SMaciej Żenczykowski 	if (netlink_cmd_check(ctx, ETHTOOL_MSG_COALESCE_GET, true))
112*1b481fc3SMaciej Żenczykowski 		return -EOPNOTSUPP;
113*1b481fc3SMaciej Żenczykowski 	if (ctx->argc > 0) {
114*1b481fc3SMaciej Żenczykowski 		fprintf(stderr, "ethtool: unexpected parameter '%s'\n",
115*1b481fc3SMaciej Żenczykowski 			*ctx->argp);
116*1b481fc3SMaciej Żenczykowski 		return 1;
117*1b481fc3SMaciej Żenczykowski 	}
118*1b481fc3SMaciej Żenczykowski 
119*1b481fc3SMaciej Żenczykowski 	ret = nlsock_prep_get_request(nlsk, ETHTOOL_MSG_COALESCE_GET,
120*1b481fc3SMaciej Żenczykowski 				      ETHTOOL_A_COALESCE_HEADER, 0);
121*1b481fc3SMaciej Żenczykowski 	if (ret < 0)
122*1b481fc3SMaciej Żenczykowski 		return ret;
123*1b481fc3SMaciej Żenczykowski 
124*1b481fc3SMaciej Żenczykowski 	new_json_obj(ctx->json);
125*1b481fc3SMaciej Żenczykowski 	ret = nlsock_send_get_request(nlsk, coalesce_reply_cb);
126*1b481fc3SMaciej Żenczykowski 	delete_json_obj();
127*1b481fc3SMaciej Żenczykowski 	return ret;
128*1b481fc3SMaciej Żenczykowski }
129*1b481fc3SMaciej Żenczykowski 
130*1b481fc3SMaciej Żenczykowski /* COALESCE_SET */
131*1b481fc3SMaciej Żenczykowski 
132*1b481fc3SMaciej Żenczykowski static const struct param_parser scoalesce_params[] = {
133*1b481fc3SMaciej Żenczykowski 	{
134*1b481fc3SMaciej Żenczykowski 		.arg		= "adaptive-rx",
135*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_USE_ADAPTIVE_RX,
136*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_u8bool,
137*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
138*1b481fc3SMaciej Żenczykowski 	},
139*1b481fc3SMaciej Żenczykowski 	{
140*1b481fc3SMaciej Żenczykowski 		.arg		= "adaptive-tx",
141*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_USE_ADAPTIVE_TX,
142*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_u8bool,
143*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
144*1b481fc3SMaciej Żenczykowski 	},
145*1b481fc3SMaciej Żenczykowski 	{
146*1b481fc3SMaciej Żenczykowski 		.arg		= "sample-interval",
147*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL,
148*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
149*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
150*1b481fc3SMaciej Żenczykowski 	},
151*1b481fc3SMaciej Żenczykowski 	{
152*1b481fc3SMaciej Żenczykowski 		.arg		= "stats-block-usecs",
153*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_STATS_BLOCK_USECS,
154*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
155*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
156*1b481fc3SMaciej Żenczykowski 	},
157*1b481fc3SMaciej Żenczykowski 	{
158*1b481fc3SMaciej Żenczykowski 		.arg		= "pkt-rate-low",
159*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_PKT_RATE_LOW,
160*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
161*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
162*1b481fc3SMaciej Żenczykowski 	},
163*1b481fc3SMaciej Żenczykowski 	{
164*1b481fc3SMaciej Żenczykowski 		.arg		= "pkt-rate-high",
165*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_PKT_RATE_HIGH,
166*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
167*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
168*1b481fc3SMaciej Żenczykowski 	},
169*1b481fc3SMaciej Żenczykowski 	{
170*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-usecs",
171*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_USECS,
172*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
173*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
174*1b481fc3SMaciej Żenczykowski 	},
175*1b481fc3SMaciej Żenczykowski 	{
176*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-frames",
177*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_MAX_FRAMES,
178*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
179*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
180*1b481fc3SMaciej Żenczykowski 	},
181*1b481fc3SMaciej Żenczykowski 	{
182*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-usecs-irq",
183*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_USECS_IRQ,
184*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
185*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
186*1b481fc3SMaciej Żenczykowski 	},
187*1b481fc3SMaciej Żenczykowski 	{
188*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-frames-irq",
189*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_MAX_FRAMES_IRQ,
190*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
191*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
192*1b481fc3SMaciej Żenczykowski 	},
193*1b481fc3SMaciej Żenczykowski 	{
194*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-usecs",
195*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_USECS,
196*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
197*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
198*1b481fc3SMaciej Żenczykowski 	},
199*1b481fc3SMaciej Żenczykowski 	{
200*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-frames",
201*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_MAX_FRAMES,
202*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
203*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
204*1b481fc3SMaciej Żenczykowski 	},
205*1b481fc3SMaciej Żenczykowski 	{
206*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-usecs-irq",
207*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_USECS_IRQ,
208*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
209*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
210*1b481fc3SMaciej Żenczykowski 	},
211*1b481fc3SMaciej Żenczykowski 	{
212*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-frames-irq",
213*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_MAX_FRAMES_IRQ,
214*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
215*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
216*1b481fc3SMaciej Żenczykowski 	},
217*1b481fc3SMaciej Żenczykowski 	{
218*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-usecs-low",
219*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_USECS_LOW,
220*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
221*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
222*1b481fc3SMaciej Żenczykowski 	},
223*1b481fc3SMaciej Żenczykowski 	{
224*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-frames-low",
225*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_MAX_FRAMES_LOW,
226*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
227*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
228*1b481fc3SMaciej Żenczykowski 	},
229*1b481fc3SMaciej Żenczykowski 	{
230*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-usecs-low",
231*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_USECS_LOW,
232*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
233*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
234*1b481fc3SMaciej Żenczykowski 	},
235*1b481fc3SMaciej Żenczykowski 	{
236*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-frames-low",
237*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_MAX_FRAMES_LOW,
238*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
239*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
240*1b481fc3SMaciej Żenczykowski 	},
241*1b481fc3SMaciej Żenczykowski 	{
242*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-usecs-high",
243*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_USECS_HIGH,
244*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
245*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
246*1b481fc3SMaciej Żenczykowski 	},
247*1b481fc3SMaciej Żenczykowski 	{
248*1b481fc3SMaciej Żenczykowski 		.arg		= "rx-frames-high",
249*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_RX_MAX_FRAMES_HIGH,
250*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
251*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
252*1b481fc3SMaciej Żenczykowski 	},
253*1b481fc3SMaciej Żenczykowski 	{
254*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-usecs-high",
255*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_USECS_HIGH,
256*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
257*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
258*1b481fc3SMaciej Żenczykowski 	},
259*1b481fc3SMaciej Żenczykowski 	{
260*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-frames-high",
261*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_MAX_FRAMES_HIGH,
262*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
263*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
264*1b481fc3SMaciej Żenczykowski 	},
265*1b481fc3SMaciej Żenczykowski 	{
266*1b481fc3SMaciej Żenczykowski 		.arg		= "cqe-mode-rx",
267*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_USE_CQE_MODE_RX,
268*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_u8bool,
269*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
270*1b481fc3SMaciej Żenczykowski 	},
271*1b481fc3SMaciej Żenczykowski 	{
272*1b481fc3SMaciej Żenczykowski 		.arg		= "cqe-mode-tx",
273*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_USE_CQE_MODE_TX,
274*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_u8bool,
275*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
276*1b481fc3SMaciej Żenczykowski 	},
277*1b481fc3SMaciej Żenczykowski 	{
278*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-aggr-max-bytes",
279*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_AGGR_MAX_BYTES,
280*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
281*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
282*1b481fc3SMaciej Żenczykowski 	},
283*1b481fc3SMaciej Żenczykowski 	{
284*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-aggr-max-frames",
285*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_AGGR_MAX_FRAMES,
286*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
287*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
288*1b481fc3SMaciej Żenczykowski 	},
289*1b481fc3SMaciej Żenczykowski 	{
290*1b481fc3SMaciej Żenczykowski 		.arg		= "tx-aggr-time-usecs",
291*1b481fc3SMaciej Żenczykowski 		.type		= ETHTOOL_A_COALESCE_TX_AGGR_TIME_USECS,
292*1b481fc3SMaciej Żenczykowski 		.handler	= nl_parse_direct_u32,
293*1b481fc3SMaciej Żenczykowski 		.min_argc	= 1,
294*1b481fc3SMaciej Żenczykowski 	},
295*1b481fc3SMaciej Żenczykowski 	{}
296*1b481fc3SMaciej Żenczykowski };
297*1b481fc3SMaciej Żenczykowski 
nl_scoalesce(struct cmd_context * ctx)298*1b481fc3SMaciej Żenczykowski int nl_scoalesce(struct cmd_context *ctx)
299*1b481fc3SMaciej Żenczykowski {
300*1b481fc3SMaciej Żenczykowski 	struct nl_context *nlctx = ctx->nlctx;
301*1b481fc3SMaciej Żenczykowski 	struct nl_msg_buff *msgbuff;
302*1b481fc3SMaciej Żenczykowski 	struct nl_socket *nlsk;
303*1b481fc3SMaciej Żenczykowski 	int ret;
304*1b481fc3SMaciej Żenczykowski 
305*1b481fc3SMaciej Żenczykowski 	if (netlink_cmd_check(ctx, ETHTOOL_MSG_COALESCE_SET, false))
306*1b481fc3SMaciej Żenczykowski 		return -EOPNOTSUPP;
307*1b481fc3SMaciej Żenczykowski 
308*1b481fc3SMaciej Żenczykowski 	nlctx->cmd = "-C";
309*1b481fc3SMaciej Żenczykowski 	nlctx->argp = ctx->argp;
310*1b481fc3SMaciej Żenczykowski 	nlctx->argc = ctx->argc;
311*1b481fc3SMaciej Żenczykowski 	nlctx->devname = ctx->devname;
312*1b481fc3SMaciej Żenczykowski 	nlsk = nlctx->ethnl_socket;
313*1b481fc3SMaciej Żenczykowski 	msgbuff = &nlsk->msgbuff;
314*1b481fc3SMaciej Żenczykowski 
315*1b481fc3SMaciej Żenczykowski 	ret = msg_init(nlctx, msgbuff, ETHTOOL_MSG_COALESCE_SET,
316*1b481fc3SMaciej Żenczykowski 		       NLM_F_REQUEST | NLM_F_ACK);
317*1b481fc3SMaciej Żenczykowski 	if (ret < 0)
318*1b481fc3SMaciej Żenczykowski 		return 2;
319*1b481fc3SMaciej Żenczykowski 	if (ethnla_fill_header(msgbuff, ETHTOOL_A_COALESCE_HEADER,
320*1b481fc3SMaciej Żenczykowski 			       ctx->devname, 0))
321*1b481fc3SMaciej Żenczykowski 		return -EMSGSIZE;
322*1b481fc3SMaciej Żenczykowski 
323*1b481fc3SMaciej Żenczykowski 	ret = nl_parser(nlctx, scoalesce_params, NULL, PARSER_GROUP_NONE, NULL);
324*1b481fc3SMaciej Żenczykowski 	if (ret < 0)
325*1b481fc3SMaciej Żenczykowski 		return 1;
326*1b481fc3SMaciej Żenczykowski 
327*1b481fc3SMaciej Żenczykowski 	ret = nlsock_sendmsg(nlsk, NULL);
328*1b481fc3SMaciej Żenczykowski 	if (ret < 0)
329*1b481fc3SMaciej Żenczykowski 		return 1;
330*1b481fc3SMaciej Żenczykowski 	ret = nlsock_process_reply(nlsk, nomsg_reply_cb, nlctx);
331*1b481fc3SMaciej Żenczykowski 	if (ret == 0)
332*1b481fc3SMaciej Żenczykowski 		return 0;
333*1b481fc3SMaciej Żenczykowski 	else
334*1b481fc3SMaciej Żenczykowski 		return nlctx->exit_code ?: 1;
335*1b481fc3SMaciej Żenczykowski }
336