// SPDX-License-Identifier: ISC
/* Copyright (C) 2020 Felix Fietkau <nbd@nbd.name> */
#ifndef __MT76_TEST_H
#define __MT76_TEST_H

#include <stdbool.h>
#include <stdint.h>

#include <linux/nl80211.h>
#include <unl.h>

#include "../testmode.h"

#ifndef ARRAY_SIZE
#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
#endif

#ifndef DIV_ROUND_UP
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#endif

#define EEPROM_FILE_PATH_FMT	"/tmp/mt76-test-%s"
#define EEPROM_PART_SIZE	20480

struct nl_msg;
struct nlattr;

struct tm_field {
	const char *name;
	const char *prefix;

	bool (*parse)(const struct tm_field *field, int idx, struct nl_msg *msg,
		      const char *val);
	void (*print)(const struct tm_field *field, struct nlattr *attr);

	union {
		struct {
			const char * const *enum_str;
			int enum_len;
		};
		struct {
			bool (*parse2)(const struct tm_field *field, int idx,
				       struct nl_msg *msg, const char *val);
			void (*print2)(const struct tm_field *field,
				       struct nlattr *attr);
		};
		struct {
			void (*print_extra)(const struct tm_field *field,
					    struct nlattr **tb);
			const struct tm_field *fields;
			struct nla_policy *policy;
			int len;
		};
	};
};

extern struct unl unl;
extern const struct tm_field msg_field;
extern unsigned char *eeprom_data;

void usage(void);
int mt76_eeprom(int phy, int argc, char **argv);
int mt76_fwlog(const char *phyname, int argc, char **argv);

#endif
