brintos

brintos / linux-shallow public Read only

0
0
Text · 3.8 KiB · 14b8aa5 Raw
186 lines · c
1// SPDX-License-Identifier: GPL-2.0+2/*3 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.4 * All rights reserved.5 *6 * Purpose: Handles the management command interface functions7 *8 * Author: Lyndon Chen9 *10 * Date: May 8, 200311 *12 * Functions:13 *	vnt_cmd_complete - Command Complete function14 *	vnt_schedule_command - Push Command and wait Command Scheduler to do15 *	vnt_cmd_timer_wait- Call back timer16 *17 * Revision History:18 *19 */20 21#include "device.h"22#include "mac.h"23#include "wcmd.h"24#include "power.h"25#include "usbpipe.h"26#include "rxtx.h"27#include "rf.h"28 29static void vnt_cmd_timer_wait(struct vnt_private *priv, unsigned long msecs)30{31	schedule_delayed_work(&priv->run_command_work, msecs_to_jiffies(msecs));32}33 34static u32 add_one_with_wrap_around(u32 var, u8 modulo)35{36	if (var >= (modulo - 1))37		var = 0;38	else39		var++;40	return var;41}42 43static int vnt_cmd_complete(struct vnt_private *priv)44{45	priv->command_state = WLAN_CMD_IDLE;46	if (priv->free_cmd_queue == CMD_Q_SIZE) {47		/* Command Queue Empty */48		priv->cmd_running = false;49		return true;50	}51 52	priv->command = priv->cmd_queue[priv->cmd_dequeue_idx];53 54	priv->cmd_dequeue_idx = add_one_with_wrap_around(priv->cmd_dequeue_idx, CMD_Q_SIZE);55	priv->free_cmd_queue++;56	priv->cmd_running = true;57 58	switch (priv->command) {59	case WLAN_CMD_INIT_MAC80211:60		priv->command_state = WLAN_CMD_INIT_MAC80211_START;61		break;62 63	case WLAN_CMD_TBTT_WAKEUP:64		priv->command_state = WLAN_CMD_TBTT_WAKEUP_START;65		break;66 67	case WLAN_CMD_BECON_SEND:68		priv->command_state = WLAN_CMD_BECON_SEND_START;69		break;70 71	case WLAN_CMD_SETPOWER:72		priv->command_state = WLAN_CMD_SETPOWER_START;73		break;74 75	case WLAN_CMD_CHANGE_ANTENNA:76		priv->command_state = WLAN_CMD_CHANGE_ANTENNA_START;77		break;78 79	default:80		break;81	}82 83	vnt_cmd_timer_wait(priv, 0);84 85	return true;86}87 88void vnt_run_command(struct work_struct *work)89{90	struct vnt_private *priv =91		container_of(work, struct vnt_private, run_command_work.work);92 93	if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags))94		return;95 96	if (!priv->cmd_running)97		return;98 99	switch (priv->command_state) {100	case WLAN_CMD_INIT_MAC80211_START:101		if (priv->mac_hw)102			break;103 104		dev_info(&priv->usb->dev, "Starting mac80211\n");105 106		if (vnt_init(priv)) {107			/* If fail all ends TODO retry */108			dev_err(&priv->usb->dev, "failed to start\n");109			usb_set_intfdata(priv->intf, NULL);110			ieee80211_free_hw(priv->hw);111			return;112		}113 114		break;115 116	case WLAN_CMD_TBTT_WAKEUP_START:117		vnt_next_tbtt_wakeup(priv);118		break;119 120	case WLAN_CMD_BECON_SEND_START:121		if (!priv->vif)122			break;123 124		vnt_beacon_make(priv, priv->vif);125 126		vnt_mac_reg_bits_on(priv, MAC_REG_TCR, TCR_AUTOBCNTX);127 128		break;129 130	case WLAN_CMD_SETPOWER_START:131 132		vnt_rf_setpower(priv, priv->hw->conf.chandef.chan);133 134		break;135 136	case WLAN_CMD_CHANGE_ANTENNA_START:137		dev_dbg(&priv->usb->dev, "Change from Antenna%d to",138			priv->rx_antenna_sel);139 140		if (priv->rx_antenna_sel == 0) {141			priv->rx_antenna_sel = 1;142			if (priv->tx_rx_ant_inv)143				vnt_set_antenna_mode(priv, ANT_RXA);144			else145				vnt_set_antenna_mode(priv, ANT_RXB);146		} else {147			priv->rx_antenna_sel = 0;148			if (priv->tx_rx_ant_inv)149				vnt_set_antenna_mode(priv, ANT_RXB);150			else151				vnt_set_antenna_mode(priv, ANT_RXA);152		}153		break;154 155	default:156		break;157	}158 159	vnt_cmd_complete(priv);160}161 162int vnt_schedule_command(struct vnt_private *priv, enum vnt_cmd command)163{164	if (priv->free_cmd_queue == 0)165		return false;166 167	priv->cmd_queue[priv->cmd_enqueue_idx] = command;168 169	priv->cmd_enqueue_idx = add_one_with_wrap_around(priv->cmd_enqueue_idx, CMD_Q_SIZE);170	priv->free_cmd_queue--;171 172	if (!priv->cmd_running)173		vnt_cmd_complete(priv);174 175	return true;176}177 178void vnt_reset_command_timer(struct vnt_private *priv)179{180	priv->free_cmd_queue = CMD_Q_SIZE;181	priv->cmd_dequeue_idx = 0;182	priv->cmd_enqueue_idx = 0;183	priv->command_state = WLAN_CMD_IDLE;184	priv->cmd_running = false;185}186