brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · ac83ce5 Raw
109 lines · c
1// SPDX-License-Identifier: ISC2/*3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>4 * Copyright (C) 2018 Lorenzo Bianconi <lorenzo.bianconi83@gmail.com>5 */6 7#include <linux/kernel.h>8#include <linux/firmware.h>9#include <linux/delay.h>10 11#include "mt76x2.h"12#include "mcu.h"13#include "eeprom.h"14 15int mt76x2_mcu_set_channel(struct mt76x02_dev *dev, u8 channel, u8 bw,16			   u8 bw_index, bool scan)17{18	struct {19		u8 idx;20		u8 scan;21		u8 bw;22		u8 _pad0;23 24		__le16 chainmask;25		u8 ext_chan;26		u8 _pad1;27 28	} __packed __aligned(4) msg = {29		.idx = channel,30		.scan = scan,31		.bw = bw,32		.chainmask = cpu_to_le16(dev->mphy.chainmask),33	};34 35	/* first set the channel without the extension channel info */36	mt76_mcu_send_msg(&dev->mt76, CMD_SWITCH_CHANNEL_OP, &msg,37			  sizeof(msg), true);38 39	usleep_range(5000, 10000);40 41	msg.ext_chan = 0xe0 + bw_index;42	return mt76_mcu_send_msg(&dev->mt76, CMD_SWITCH_CHANNEL_OP, &msg,43				 sizeof(msg), true);44}45EXPORT_SYMBOL_GPL(mt76x2_mcu_set_channel);46 47int mt76x2_mcu_load_cr(struct mt76x02_dev *dev, u8 type, u8 temp_level,48		       u8 channel)49{50	struct {51		u8 cr_mode;52		u8 temp;53		u8 ch;54		u8 _pad0;55 56		__le32 cfg;57	} __packed __aligned(4) msg = {58		.cr_mode = type,59		.temp = temp_level,60		.ch = channel,61	};62	u32 val;63 64	val = BIT(31);65	val |= (mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_0) >> 8) & 0x00ff;66	val |= (mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_1) << 8) & 0xff00;67	msg.cfg = cpu_to_le32(val);68 69	/* first set the channel without the extension channel info */70	return mt76_mcu_send_msg(&dev->mt76, CMD_LOAD_CR, &msg, sizeof(msg),71				 true);72}73EXPORT_SYMBOL_GPL(mt76x2_mcu_load_cr);74 75int mt76x2_mcu_init_gain(struct mt76x02_dev *dev, u8 channel, u32 gain,76			 bool force)77{78	struct {79		__le32 channel;80		__le32 gain_val;81	} __packed __aligned(4) msg = {82		.channel = cpu_to_le32(channel),83		.gain_val = cpu_to_le32(gain),84	};85 86	if (force)87		msg.channel |= cpu_to_le32(BIT(31));88 89	return mt76_mcu_send_msg(&dev->mt76, CMD_INIT_GAIN_OP, &msg,90				 sizeof(msg), true);91}92EXPORT_SYMBOL_GPL(mt76x2_mcu_init_gain);93 94int mt76x2_mcu_tssi_comp(struct mt76x02_dev *dev,95			 struct mt76x2_tssi_comp *tssi_data)96{97	struct {98		__le32 id;99		struct mt76x2_tssi_comp data;100	} __packed __aligned(4) msg = {101		.id = cpu_to_le32(MCU_CAL_TSSI_COMP),102		.data = *tssi_data,103	};104 105	return mt76_mcu_send_msg(&dev->mt76, CMD_CALIBRATION_OP, &msg,106				 sizeof(msg), true);107}108EXPORT_SYMBOL_GPL(mt76x2_mcu_tssi_comp);109