/* * device_mode.h * * Created on: 31 October 2012 * Author: Arthur Tiv */ #ifndef DEVICE_MODE_H_ #define DEVICE_MODE_H_ #include #include #include #include #include #include "nl80211.h" #define ETH_ALEN 6 #ifndef CONFIG_LIBNL20 # define nl_sock nl_handle #endif enum plt_mode { PLT_OFF = 0, PLT_ON = 1, PLT_FEM_DETECT = 2, PLT_CHIP_AWAKE = 3, }; enum command_identify_by { CIB_NONE, CIB_PHY, CIB_NETDEV, }; enum id_input { II_NONE, II_NETDEV, II_PHY_NAME, II_PHY_IDX, }; enum wl1271_tm_commands { WL1271_TM_CMD_UNSPEC, WL1271_TM_CMD_TEST, WL1271_TM_CMD_INTERROGATE, WL1271_TM_CMD_CONFIGURE, WL1271_TM_CMD_NVS_PUSH, WL1271_TM_CMD_SET_PLT_MODE, WL1271_TM_CMD_RECOVER, WL1271_TM_CMD_GET_MAC, __WL1271_TM_CMD_AFTER_LAST }; enum wl1271_tm_attrs { WL1271_TM_ATTR_UNSPEC, WL1271_TM_ATTR_CMD_ID, WL1271_TM_ATTR_ANSWER, WL1271_TM_ATTR_DATA, WL1271_TM_ATTR_IE_ID, WL1271_TM_ATTR_PLT_MODE, __WL1271_TM_ATTR_AFTER_LAST }; //#define WL1271_TM_ATTR_MAX (__WL1271_TM_ATTR_AFTER_LAST - 1) struct wl1271_cmd_header { __u16 id; __u16 status; /* payload */ unsigned char data[0]; } __attribute__((packed)); struct nl80211_state { struct nl_sock *nl_sock; struct nl_cache *nl_cache; struct genl_family *nl80211; }; struct cmd { const char *name; const char *args; const char *help; const enum nl80211_commands cmd; int nl_msg_flags; int hidden; const enum command_identify_by idby; /* * The handler should return a negative error code, * zero on success, 1 if the arguments were wrong * and the usage message should and 2 otherwise. */ int (*handler)(struct nl80211_state *state, struct nl_cb *cb, struct nl_msg *msg, int argc, char **argv); const struct cmd *parent; }; #define __COMMAND(_section, _symname, _name, _args, _nlcmd, _flags, _hidden, _idby, _handler, _help)\ static struct cmd \ __cmd ## _ ## _symname ## _ ## _handler ## _ ## _nlcmd ## _ ## _idby ## _ ## _hidden\ __attribute__((used)) __attribute__((section("__cmd"))) = { \ .name = (_name), \ .args = (_args), \ .cmd = (_nlcmd), \ .nl_msg_flags = (_flags), \ .hidden = (_hidden), \ .idby = (_idby), \ .handler = (_handler), \ .help = (_help), \ .parent = _section, \ } #define COMMAND(section, name, args, cmd, flags, idby, handler, help) \ __COMMAND(&(__section ## _ ## section), name, #name, args, cmd, flags, 0, idby, handler, help) #define SECTION(_name) \ struct cmd __section ## _ ## _name \ __attribute__((used)) __attribute__((section("__cmd"))) = { \ .name = (#_name), \ .hidden = 1, \ } #define DECLARE_SECTION(_name) \ extern struct cmd __section ## _ ## _name; int chip_awake(int mode); int handle_cmd(struct nl80211_state *state, enum id_input idby, int argc, char **argv); DECLARE_SECTION(set); DECLARE_SECTION(get); DECLARE_SECTION(plt); #endif /* DEVICE_MODE_H_ */