1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2f988d640SKalle Valo /* Copyright (C) 2007, Red Hat, Inc. */
3f988d640SKalle Valo 
4f988d640SKalle Valo #ifndef _LBS_CMD_H_
5f988d640SKalle Valo #define _LBS_CMD_H_
6f988d640SKalle Valo 
7f988d640SKalle Valo #include <net/cfg80211.h>
8f988d640SKalle Valo 
9f988d640SKalle Valo #include "host.h"
10f988d640SKalle Valo #include "dev.h"
11f988d640SKalle Valo 
12f988d640SKalle Valo 
13f988d640SKalle Valo /* Command & response transfer between host and card */
14f988d640SKalle Valo 
15f988d640SKalle Valo struct cmd_ctrl_node {
16f988d640SKalle Valo 	struct list_head list;
17f988d640SKalle Valo 	int result;
18f988d640SKalle Valo 	/* command response */
19f988d640SKalle Valo 	int (*callback)(struct lbs_private *,
20f988d640SKalle Valo 			unsigned long,
21f988d640SKalle Valo 			struct cmd_header *);
22f988d640SKalle Valo 	unsigned long callback_arg;
23f988d640SKalle Valo 	/* command data */
24f988d640SKalle Valo 	struct cmd_header *cmdbuf;
25f988d640SKalle Valo 	/* wait queue */
26f988d640SKalle Valo 	u16 cmdwaitqwoken;
27f988d640SKalle Valo 	wait_queue_head_t cmdwait_q;
28f988d640SKalle Valo };
29f988d640SKalle Valo 
30f988d640SKalle Valo 
31f988d640SKalle Valo /* lbs_cmd() infers the size of the buffer to copy data back into, from
32f988d640SKalle Valo    the size of the target of the pointer. Since the command to be sent
33f988d640SKalle Valo    may often be smaller, that size is set in cmd->size by the caller.*/
34f988d640SKalle Valo #define lbs_cmd(priv, cmdnr, cmd, cb, cb_arg)	({		\
35f988d640SKalle Valo 	uint16_t __sz = le16_to_cpu((cmd)->hdr.size);		\
36f988d640SKalle Valo 	(cmd)->hdr.size = cpu_to_le16(sizeof(*(cmd)));		\
37f988d640SKalle Valo 	__lbs_cmd(priv, cmdnr, &(cmd)->hdr, __sz, cb, cb_arg);	\
38f988d640SKalle Valo })
39f988d640SKalle Valo 
40f988d640SKalle Valo #define lbs_cmd_with_response(priv, cmdnr, cmd)	\
41f988d640SKalle Valo 	lbs_cmd(priv, cmdnr, cmd, lbs_cmd_copyback, (unsigned long) (cmd))
42f988d640SKalle Valo 
43f988d640SKalle Valo void lbs_cmd_async(struct lbs_private *priv, uint16_t command,
44f988d640SKalle Valo 	struct cmd_header *in_cmd, int in_cmd_size);
45f988d640SKalle Valo 
46f988d640SKalle Valo int __lbs_cmd(struct lbs_private *priv, uint16_t command,
47f988d640SKalle Valo 	      struct cmd_header *in_cmd, int in_cmd_size,
48f988d640SKalle Valo 	      int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
49f988d640SKalle Valo 	      unsigned long callback_arg);
50f988d640SKalle Valo 
51f988d640SKalle Valo struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
52f988d640SKalle Valo 	uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
53f988d640SKalle Valo 	int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
54f988d640SKalle Valo 	unsigned long callback_arg);
55f988d640SKalle Valo 
56f988d640SKalle Valo int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
57f988d640SKalle Valo 		     struct cmd_header *resp);
58f988d640SKalle Valo 
59f988d640SKalle Valo int lbs_allocate_cmd_buffer(struct lbs_private *priv);
60f988d640SKalle Valo int lbs_free_cmd_buffer(struct lbs_private *priv);
61f988d640SKalle Valo 
62f988d640SKalle Valo int lbs_execute_next_command(struct lbs_private *priv);
63f988d640SKalle Valo void __lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
64f988d640SKalle Valo 			    int result);
65f988d640SKalle Valo void lbs_complete_command(struct lbs_private *priv, struct cmd_ctrl_node *cmd,
66f988d640SKalle Valo 			  int result);
67f988d640SKalle Valo int lbs_process_command_response(struct lbs_private *priv, u8 *data, u32 len);
68f988d640SKalle Valo 
69f988d640SKalle Valo 
70f988d640SKalle Valo /* From cmdresp.c */
71f988d640SKalle Valo 
72f988d640SKalle Valo void lbs_mac_event_disconnected(struct lbs_private *priv,
73f988d640SKalle Valo 				bool locally_generated);
74f988d640SKalle Valo 
75f988d640SKalle Valo 
76f988d640SKalle Valo 
77f988d640SKalle Valo /* Events */
78f988d640SKalle Valo 
7999cd87d6SJason Yan void lbs_process_event(struct lbs_private *priv, u32 event);
80f988d640SKalle Valo 
81f988d640SKalle Valo 
82f988d640SKalle Valo /* Actual commands */
83f988d640SKalle Valo 
84f988d640SKalle Valo int lbs_update_hw_spec(struct lbs_private *priv);
85f988d640SKalle Valo 
86f988d640SKalle Valo int lbs_set_channel(struct lbs_private *priv, u8 channel);
87f988d640SKalle Valo 
88f988d640SKalle Valo int lbs_update_channel(struct lbs_private *priv);
89f988d640SKalle Valo 
90f988d640SKalle Valo int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
91f988d640SKalle Valo 		struct wol_config *p_wol_config);
92f988d640SKalle Valo 
93f988d640SKalle Valo int lbs_cmd_802_11_sleep_params(struct lbs_private *priv, uint16_t cmd_action,
94f988d640SKalle Valo 				struct sleep_params *sp);
95f988d640SKalle Valo 
96f988d640SKalle Valo void lbs_ps_confirm_sleep(struct lbs_private *priv);
97f988d640SKalle Valo 
98f988d640SKalle Valo int lbs_set_radio(struct lbs_private *priv, u8 preamble, u8 radio_on);
99f988d640SKalle Valo 
100f988d640SKalle Valo void lbs_set_mac_control(struct lbs_private *priv);
101f988d640SKalle Valo int lbs_set_mac_control_sync(struct lbs_private *priv);
102f988d640SKalle Valo 
103f988d640SKalle Valo int lbs_get_tx_power(struct lbs_private *priv, s16 *curlevel, s16 *minlevel,
104f988d640SKalle Valo 		     s16 *maxlevel);
105f988d640SKalle Valo 
106f988d640SKalle Valo int lbs_set_snmp_mib(struct lbs_private *priv, u32 oid, u16 val);
107f988d640SKalle Valo 
108f988d640SKalle Valo int lbs_get_snmp_mib(struct lbs_private *priv, u32 oid, u16 *out_val);
109f988d640SKalle Valo 
110f988d640SKalle Valo 
111f988d640SKalle Valo /* Commands only used in wext.c, assoc. and scan.c */
112f988d640SKalle Valo 
113f988d640SKalle Valo int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
114f988d640SKalle Valo 		int8_t p1, int8_t p2);
115f988d640SKalle Valo 
116f988d640SKalle Valo int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
117f988d640SKalle Valo 		int8_t p2, int usesnr);
118f988d640SKalle Valo 
119f988d640SKalle Valo int lbs_set_data_rate(struct lbs_private *priv, u8 rate);
120f988d640SKalle Valo 
121f988d640SKalle Valo int lbs_cmd_802_11_rate_adapt_rateset(struct lbs_private *priv,
122f988d640SKalle Valo 				      uint16_t cmd_action);
123f988d640SKalle Valo 
124f988d640SKalle Valo int lbs_set_tx_power(struct lbs_private *priv, s16 dbm);
125f988d640SKalle Valo 
126f988d640SKalle Valo int lbs_set_deep_sleep(struct lbs_private *priv, int deep_sleep);
127f988d640SKalle Valo 
128f988d640SKalle Valo int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep);
129f988d640SKalle Valo 
130f988d640SKalle Valo int lbs_set_monitor_mode(struct lbs_private *priv, int enable);
131f988d640SKalle Valo 
132f988d640SKalle Valo int lbs_get_rssi(struct lbs_private *priv, s8 *snr, s8 *nf);
133f988d640SKalle Valo 
134f988d640SKalle Valo int lbs_set_11d_domain_info(struct lbs_private *priv);
135f988d640SKalle Valo 
136f988d640SKalle Valo int lbs_get_reg(struct lbs_private *priv, u16 reg, u16 offset, u32 *value);
137f988d640SKalle Valo 
138f988d640SKalle Valo int lbs_set_reg(struct lbs_private *priv, u16 reg, u16 offset, u32 value);
139f988d640SKalle Valo 
140f988d640SKalle Valo int lbs_set_ps_mode(struct lbs_private *priv, u16 cmd_action, bool block);
141f988d640SKalle Valo 
142f988d640SKalle Valo #endif /* _LBS_CMD_H */
143