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 79*99cd87d6SJason 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