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