/******************************************************************************
 *
 * Copyright(c) 2007 - 2008 Intel Corporation. All rights reserved.
 *
 * Portions of this file are derived from the ipw3945 project, as well
 * as portions of the ieee80211 subsystem header files.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
 *
 * The full GNU General Public License is included in this distribution in the
 * file called LICENSE.
 *
 * Contact Information:
 * James P. Ketrenos <ipw2100-admin@linux.intel.com>
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *****************************************************************************/


#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/init.h>

#include <net/mac80211.h>

#include "iwl-eeprom.h"
#include "iwl-dev.h"
#include "iwl-core.h"
#include "iwl-commands.h"
#include "iwl-debug.h"
#include "iwl-power.h"
#include "iwl-helpers.h"

/*
 * Setting power level allow the card to go to sleep when not busy
 * there are three factor that decide the power level to go to, they
 * are list here with its priority
 *  1- critical_power_setting this will be set according to card temperature.
 *  2- system_power_setting this will be set by system PM manager.
 *  3- user_power_setting this will be set by user either by writing to sys or
 *  	mac80211
 *
 * if system_power_setting and user_power_setting is set to auto
 * the power level will be decided according to association status and battery
 * status.
 *
 */

#define MSEC_TO_USEC 1024
#define IWL_POWER_RANGE_0_MAX  (2)
#define IWL_POWER_RANGE_1_MAX  (10)


#define NOSLP __constant_cpu_to_le16(0), 0, 0
#define SLP IWL_POWER_DRIVER_ALLOW_SLEEP_MSK, 0, 0
#define SLP_TOUT(T) __constant_cpu_to_le32((T) * MSEC_TO_USEC)
#define SLP_VEC(X0, X1, X2, X3, X4) {__constant_cpu_to_le32(X0), \
				     __constant_cpu_to_le32(X1), \
				     __constant_cpu_to_le32(X2), \
				     __constant_cpu_to_le32(X3), \
				     __constant_cpu_to_le32(X4)}

#define IWL_POWER_ON_BATTERY		IWL_POWER_INDEX_5
#define IWL_POWER_ON_AC_DISASSOC	IWL_POWER_MODE_CAM
#define IWL_POWER_ON_AC_ASSOC		IWL_POWER_MODE_CAM


#define IWL_CT_KILL_TEMPERATURE		110
#define IWL_MIN_POWER_TEMPERATURE	100
#define IWL_REDUCED_POWER_TEMPERATURE	95

/* default power management (not Tx power) table values */
/* for tim  0-10 */
static struct iwl_power_vec_entry range_0[IWL_POWER_AC] = {
	{{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0},
	{{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0},
	{{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 2, 2, 0xFF)}, 0},
	{{SLP, SLP_TOUT(50), SLP_TOUT(100), SLP_VEC(2, 2, 2, 2, 0xFF)}, 0},
	{{SLP, SLP_TOUT(50), SLP_TOUT(25), SLP_VEC(2, 2, 4, 4, 0xFF)}, 1},
	{{SLP, SLP_TOUT(25), SLP_TOUT(25), SLP_VEC(2, 2, 4, 6, 0xFF)}, 2}
};


/* for tim = 3-10 */
static struct iwl_power_vec_entry range_1[IWL_POWER_AC] = {
	{{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0},
	{{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 4)}, 0},
	{{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(1, 2, 3, 4, 7)}, 0},
	{{SLP, SLP_TOUT(50), SLP_TOUT(100), SLP_VEC(2, 4, 6, 7, 9)}, 0},
	{{SLP, SLP_TOUT(50), SLP_TOUT(25), SLP_VEC(2, 4, 6, 9, 10)}, 1},
	{{SLP, SLP_TOUT(25), SLP_TOUT(25), SLP_VEC(2, 4, 7, 10, 10)}, 2}
};

/* for tim > 11 */
static struct iwl_power_vec_entry range_2[IWL_POWER_AC] = {
	{{NOSLP, SLP_TOUT(0), SLP_TOUT(0), SLP_VEC(0, 0, 0, 0, 0)}, 0},
	{{SLP, SLP_TOUT(200), SLP_TOUT(500), SLP_VEC(1, 2, 3, 4, 0xFF)}, 0},
	{{SLP, SLP_TOUT(200), SLP_TOUT(300), SLP_VEC(2, 4, 6, 7, 0xFF)}, 0},
	{{SLP, SLP_TOUT(50), SLP_TOUT(100), SLP_VEC(2, 7, 9, 9, 0xFF)}, 0},
	{{SLP, SLP_TOUT(50), SLP_TOUT(25), SLP_VEC(2, 7, 9, 9, 0xFF)}, 0},
	{{SLP, SLP_TOUT(25), SLP_TOUT(25), SLP_VEC(4, 7, 10, 10, 0xFF)}, 0}
};

/* decide the right power level according to association status
 * and battery status
 */
static u16 iwl_get_auto_power_mode(struct iwl_priv *priv)
{
	u16 mode = priv->power_data.user_power_setting;

	switch (priv->power_data.user_power_setting) {
	case IWL_POWER_AUTO:
		/* if running on battery */
		if (priv->power_data.is_battery_active)
			mode = IWL_POWER_ON_BATTERY;
		else if (iwl_is_associated(priv))
			mode = IWL_POWER_ON_AC_ASSOC;
		else
			mode = IWL_POWER_ON_AC_DISASSOC;
		break;
	case IWL_POWER_BATTERY:
		mode = IWL_POWER_INDEX_3;
		break;
	case IWL_POWER_AC:
		mode = IWL_POWER_MODE_CAM;
		break;
	}
	return mode;
}

/* initialize to default */
static int iwl_power_init_handle(struct iwl_priv *priv)
{
	int ret = 0, i;
	struct iwl_power_mgr *pow_data;
	int size = sizeof(struct iwl_power_vec_entry) * IWL_POWER_AC;
	u16 pci_pm;

	IWL_DEBUG_POWER("Initialize power \n");

	pow_data = &(priv->power_data);

	memset(pow_data, 0, sizeof(*pow_data));

	memcpy(&pow_data->pwr_range_0[0], &range_0[0], size);
	memcpy(&pow_data->pwr_range_1[0], &range_1[0], size);
	memcpy(&pow_data->pwr_range_2[0], &range_2[0], size);

	ret = pci_read_config_word(priv->pci_dev,
				  PCI_LINK_CTRL, &pci_pm);
	if (ret != 0)
		return 0;
	else {
		struct iwl4965_powertable_cmd *cmd;

		IWL_DEBUG_POWER("adjust power command flags\n");

		for (i = 0; i < IWL_POWER_AC; i++) {
			cmd = &pow_data->pwr_range_0[i].cmd;

			if (pci_pm & 0x1)
				cmd->flags &= ~IWL_POWER_PCI_PM_MSK;
			else
				cmd->flags |= IWL_POWER_PCI_PM_MSK;
		}
	}
	return ret;
}

/* adjust power command according to dtim period and power level*/
static int iwl_update_power_command(struct iwl_priv *priv,
				    struct iwl4965_powertable_cmd *cmd,
				    u16 mode)
{
	int ret = 0, i;
	u8 skip;
	u32 max_sleep = 0;
	struct iwl_power_vec_entry *range;
	u8 period = 0;
	struct iwl_power_mgr *pow_data;

	if (mode > IWL_POWER_INDEX_5) {
		IWL_DEBUG_POWER("Error invalid power mode \n");
		return -1;
	}
	pow_data = &(priv->power_data);

	if (pow_data->dtim_period <= IWL_POWER_RANGE_0_MAX)
		range = &pow_data->pwr_range_0[0];
	else if (pow_data->dtim_period <= IWL_POWER_RANGE_1_MAX)
		range = &pow_data->pwr_range_1[0];
	else
		range = &pow_data->pwr_range_2[0];

	period = pow_data->dtim_period;
	memcpy(cmd, &range[mode].cmd, sizeof(struct iwl4965_powertable_cmd));

	if (period == 0) {
		period = 1;
		skip = 0;
	} else
		skip = range[mode].no_dtim;

	if (skip == 0) {
		max_sleep = period;
		cmd->flags &= ~IWL_POWER_SLEEP_OVER_DTIM_MSK;
	} else {
		__le32 slp_itrvl = cmd->sleep_interval[IWL_POWER_VEC_SIZE - 1];
		max_sleep = le32_to_cpu(slp_itrvl);
		if (max_sleep == 0xFF)
			max_sleep = period * (skip + 1);
		else if (max_sleep >  period)
			max_sleep = (le32_to_cpu(slp_itrvl) / period) * period;
		cmd->flags |= IWL_POWER_SLEEP_OVER_DTIM_MSK;
	}

	for (i = 0; i < IWL_POWER_VEC_SIZE; i++) {
		if (le32_to_cpu(cmd->sleep_interval[i]) > max_sleep)
			cmd->sleep_interval[i] = cpu_to_le32(max_sleep);
	}

	IWL_DEBUG_POWER("Flags value = 0x%08X\n", cmd->flags);
	IWL_DEBUG_POWER("Tx timeout = %u\n", le32_to_cpu(cmd->tx_data_timeout));
	IWL_DEBUG_POWER("Rx timeout = %u\n", le32_to_cpu(cmd->rx_data_timeout));
	IWL_DEBUG_POWER("Sleep interval vector = { %d , %d , %d , %d , %d }\n",
			le32_to_cpu(cmd->sleep_interval[0]),
			le32_to_cpu(cmd->sleep_interval[1]),
			le32_to_cpu(cmd->sleep_interval[2]),
			le32_to_cpu(cmd->sleep_interval[3]),
			le32_to_cpu(cmd->sleep_interval[4]));

	return ret;
}


/*
 * calucaute the final power mode index
 */
int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh)
{
	struct iwl_power_mgr *setting = &(priv->power_data);
	int ret = 0;
	u16 uninitialized_var(final_mode);

       /* If on battery, set to 3,
	* if plugged into AC power, set to CAM ("continuously aware mode"),
	* else user level */

	switch (setting->system_power_setting) {
	case IWL_POWER_AUTO:
		final_mode = iwl_get_auto_power_mode(priv);
		break;
	case IWL_POWER_BATTERY:
		final_mode = IWL_POWER_INDEX_3;
		break;
	case IWL_POWER_AC:
		final_mode = IWL_POWER_MODE_CAM;
		break;
	default:
		final_mode = setting->system_power_setting;
	}

	if (setting->critical_power_setting > final_mode)
		final_mode = setting->critical_power_setting;

	/* driver only support CAM for non STA network */
	if (priv->iw_mode != IEEE80211_IF_TYPE_STA)
		final_mode = IWL_POWER_MODE_CAM;

	if (!iwl_is_rfkill(priv) && !setting->power_disabled &&
	    ((setting->power_mode != final_mode) || refresh)) {
		struct iwl4965_powertable_cmd cmd;

		if (final_mode != IWL_POWER_MODE_CAM)
			set_bit(STATUS_POWER_PMI, &priv->status);

		iwl_update_power_command(priv, &cmd, final_mode);
		cmd.keep_alive_beacons = 0;

		if (final_mode == IWL_POWER_INDEX_5)
			cmd.flags |= IWL_POWER_FAST_PD;

		if (priv->cfg->ops->lib->set_power)
			ret = priv->cfg->ops->lib->set_power(priv, &cmd);

		if (final_mode == IWL_POWER_MODE_CAM)
			clear_bit(STATUS_POWER_PMI, &priv->status);
		else
			set_bit(STATUS_POWER_PMI, &priv->status);

		if (priv->cfg->ops->lib->update_chain_flags)
			priv->cfg->ops->lib->update_chain_flags(priv);

		if (!ret)
			setting->power_mode = final_mode;
	}

	return ret;
}
EXPORT_SYMBOL(iwl_power_update_mode);

/* Allow other iwl code to disable/enable power management active
 * this will be usefull for rate scale to disable PM during heavy
 * Tx/Rx activities
 */
int iwl_power_disable_management(struct iwl_priv *priv)
{
	u16 prev_mode;
	int ret = 0;

	if (priv->power_data.power_disabled)
		return -EBUSY;

	prev_mode = priv->power_data.user_power_setting;
	priv->power_data.user_power_setting = IWL_POWER_MODE_CAM;
	ret = iwl_power_update_mode(priv, 0);
	priv->power_data.power_disabled = 1;
	priv->power_data.user_power_setting = prev_mode;

	return ret;
}
EXPORT_SYMBOL(iwl_power_disable_management);

/* Allow other iwl code to disable/enable power management active
 * this will be usefull for rate scale to disable PM during hight
 * valume activities
 */
int iwl_power_enable_management(struct iwl_priv *priv)
{
	int ret = 0;

	priv->power_data.power_disabled = 0;
	ret = iwl_power_update_mode(priv, 0);
	return ret;
}
EXPORT_SYMBOL(iwl_power_enable_management);

/* set user_power_setting */
int iwl_power_set_user_mode(struct iwl_priv *priv, u16 mode)
{
	int ret = 0;

	if (mode > IWL_POWER_LIMIT)
		return -EINVAL;

	priv->power_data.user_power_setting = mode;

	ret = iwl_power_update_mode(priv, 0);

	return ret;
}
EXPORT_SYMBOL(iwl_power_set_user_mode);


/* set system_power_setting. This should be set by over all
 * PM application.
 */
int iwl_power_set_system_mode(struct iwl_priv *priv, u16 mode)
{
	int ret = 0;

	if (mode > IWL_POWER_LIMIT)
		return -EINVAL;

	priv->power_data.system_power_setting = mode;

	ret = iwl_power_update_mode(priv, 0);

	return ret;
}
EXPORT_SYMBOL(iwl_power_set_system_mode);

/* initilize to default */
void iwl_power_initialize(struct iwl_priv *priv)
{

	iwl_power_init_handle(priv);
	priv->power_data.user_power_setting = IWL_POWER_AUTO;
	priv->power_data.power_disabled = 0;
	priv->power_data.system_power_setting = IWL_POWER_AUTO;
	priv->power_data.is_battery_active = 0;
	priv->power_data.power_disabled = 0;
	priv->power_data.critical_power_setting = 0;
}
EXPORT_SYMBOL(iwl_power_initialize);

/* set critical_power_setting according to temperature value */
int iwl_power_temperature_change(struct iwl_priv *priv)
{
	int ret = 0;
	u16 new_critical = priv->power_data.critical_power_setting;
	s32 temperature = KELVIN_TO_CELSIUS(priv->last_temperature);

	if (temperature > IWL_CT_KILL_TEMPERATURE)
		return 0;
	else if (temperature > IWL_MIN_POWER_TEMPERATURE)
		new_critical = IWL_POWER_INDEX_5;
	else if (temperature > IWL_REDUCED_POWER_TEMPERATURE)
		new_critical = IWL_POWER_INDEX_3;
	else
		new_critical = IWL_POWER_MODE_CAM;

	if (new_critical != priv->power_data.critical_power_setting)
		priv->power_data.critical_power_setting = new_critical;

	if (priv->power_data.critical_power_setting >
				priv->power_data.power_mode)
		ret = iwl_power_update_mode(priv, 0);

	return ret;
}
EXPORT_SYMBOL(iwl_power_temperature_change);
