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