diff options
Diffstat (limited to 'sys/contrib/dev/mediatek/mt76/mt7915/mcu.c')
| -rw-r--r-- | sys/contrib/dev/mediatek/mt76/mt7915/mcu.c | 86 | 
1 files changed, 59 insertions, 27 deletions
| diff --git a/sys/contrib/dev/mediatek/mt76/mt7915/mcu.c b/sys/contrib/dev/mediatek/mt76/mt7915/mcu.c index 03dfe2ed4682..f83f4eaa8a24 100644 --- a/sys/contrib/dev/mediatek/mt76/mt7915/mcu.c +++ b/sys/contrib/dev/mediatek/mt76/mt7915/mcu.c @@ -197,6 +197,8 @@ mt7915_mcu_parse_response(struct mt76_dev *mdev, int cmd,  static void  mt7915_mcu_set_timeout(struct mt76_dev *mdev, int cmd)  { +	mdev->mcu.timeout = 5 * HZ; +  	if ((cmd & __MCU_CMD_FIELD_ID) != MCU_CMD_EXT_CID)  		return; @@ -208,6 +210,9 @@ mt7915_mcu_set_timeout(struct mt76_dev *mdev, int cmd)  	case MCU_EXT_CMD_BSS_INFO_UPDATE:  		mdev->mcu.timeout = 2 * HZ;  		return; +	case MCU_EXT_CMD_EFUSE_BUFFER_MODE: +		mdev->mcu.timeout = 10 * HZ; +		return;  	default:  		break;  	} @@ -303,17 +308,35 @@ mt7915_mcu_rx_radar_detected(struct mt7915_dev *dev, struct sk_buff *skb)  {  	struct mt76_phy *mphy = &dev->mt76.phy;  	struct mt7915_mcu_rdd_report *r; +	u32 sku;  	r = (struct mt7915_mcu_rdd_report *)skb->data; -	if (r->band_idx > MT_RX_SEL2) +	switch (r->rdd_idx) { +	case MT_RDD_IDX_BAND0: +		break; +	case MT_RDD_IDX_BAND1: +		sku = mt7915_check_adie(dev, true); +		/* the main phy is bound to band 1 for this sku */ +		if (is_mt7986(&dev->mt76) && +		    (sku == MT7975_ONE_ADIE || sku == MT7976_ONE_ADIE)) +			break; +		mphy = dev->mt76.phys[MT_BAND1]; +		break; +	case MT_RDD_IDX_BACKGROUND: +		if (!dev->rdd2_phy) +			return; +		mphy = dev->rdd2_phy->mt76; +		break; +	default: +		dev_err(dev->mt76.dev, "Unknown RDD idx %d\n", r->rdd_idx);  		return; +	} -	if ((r->band_idx && !dev->phy.mt76->band_idx) && -	    dev->mt76.phys[MT_BAND1]) -		mphy = dev->mt76.phys[MT_BAND1]; +	if (!mphy) +		return; -	if (r->band_idx == MT_RX_SEL2) +	if (r->rdd_idx == MT_RDD_IDX_BACKGROUND)  		cfg80211_background_radar_event(mphy->hw->wiphy,  						&dev->rdd2_chandef,  						GFP_ATOMIC); @@ -2098,16 +2121,21 @@ static int mt7915_load_firmware(struct mt7915_dev *dev)  {  	int ret; -	/* make sure fw is download state */ -	if (mt7915_firmware_state(dev, false)) { -		/* restart firmware once */ -		mt76_connac_mcu_restart(&dev->mt76); -		ret = mt7915_firmware_state(dev, false); -		if (ret) { -			dev_err(dev->mt76.dev, -				"Firmware is not ready for download\n"); -			return ret; -		} +	/* Release Semaphore if taken by previous failed attempt */ +	ret = mt76_connac_mcu_patch_sem_ctrl(&dev->mt76, false); +	if (ret != PATCH_REL_SEM_SUCCESS) { +		dev_err(dev->mt76.dev, "Could not release semaphore\n"); +		/* Continue anyways */ +	} + +	/* Always restart MCU firmware */ +	mt76_connac_mcu_restart(&dev->mt76); + +	/* Check if MCU is ready */ +	ret = mt7915_firmware_state(dev, false); +	if (ret) { +		dev_err(dev->mt76.dev, "Firmware did not enter download state\n"); +		return ret;  	}  	ret = mt76_connac2_load_patch(&dev->mt76, fw_name_var(dev, ROM_PATCH)); @@ -2703,11 +2731,14 @@ int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,  				     struct cfg80211_chan_def *chandef)  {  	struct mt7915_dev *dev = phy->dev; -	int err, region; +	int err, region, rdd_idx; + +	rdd_idx = mt7915_get_rdd_idx(phy, true); +	if (rdd_idx < 0) +		return -EINVAL;  	if (!chandef) { /* disable offchain */ -		err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_STOP, MT_RX_SEL2, -					      0, 0); +		err = mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_STOP, rdd_idx, 0, 0);  		if (err)  			return err; @@ -2733,8 +2764,7 @@ int mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy,  		break;  	} -	return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, MT_RX_SEL2, -				       0, region); +	return mt76_connac_mcu_rdd_cmd(&dev->mt76, RDD_START, rdd_idx, 0, region);  }  int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) @@ -2865,7 +2895,7 @@ int mt7915_mcu_set_eeprom(struct mt7915_dev *dev)  				 &req, sizeof(req), true);  } -int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset) +int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset, u8 *read_buf)  {  	struct mt7915_mcu_eeprom_info req = {  		.addr = cpu_to_le32(round_down(offset, @@ -2873,8 +2903,8 @@ int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)  	};  	struct mt7915_mcu_eeprom_info *res;  	struct sk_buff *skb; +	u8 *buf = read_buf;  	int ret; -	u8 *buf;  	ret = mt76_mcu_send_and_get_msg(&dev->mt76,  					MCU_EXT_QUERY(EFUSE_ACCESS), @@ -2883,12 +2913,14 @@ int mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset)  		return ret;  	res = (struct mt7915_mcu_eeprom_info *)skb->data; +	if (!buf)  #if defined(__linux__) -	buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr); +		buf = dev->mt76.eeprom.data + le32_to_cpu(res->addr);  #elif defined(__FreeBSD__) -	buf = (u8 *)dev->mt76.eeprom.data + le32_to_cpu(res->addr); +		buf = (u8 *)dev->mt76.eeprom.data + le32_to_cpu(res->addr);  #endif  	memcpy(buf, res->data, MT7915_EEPROM_BLOCK_SIZE); +  	dev_kfree_skb(skb);  	return 0; @@ -3333,7 +3365,7 @@ int mt7915_mcu_set_txpower_frame(struct mt7915_phy *phy,  	if (ret)  		return ret; -	txpower = mt7915_get_power_bound(phy, txpower); +	txpower = mt76_get_power_bound(mphy, txpower);  	if (txpower > mphy->txpower_cur || txpower < 0)  		return -EINVAL; @@ -3383,7 +3415,7 @@ int mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy)  	int i, idx;  	int tx_power; -	tx_power = mt7915_get_power_bound(phy, hw->conf.power_level); +	tx_power = mt76_get_power_bound(mphy, hw->conf.power_level);  	tx_power = mt76_get_rate_power_limits(mphy, mphy->chandef.chan,  					      &limits_array, tx_power);  	mphy->txpower_cur = tx_power; @@ -3974,7 +4006,7 @@ int mt7915_mcu_wed_wa_tx_stats(struct mt7915_dev *dev, u16 wlan_idx)  	rcu_read_lock(); -	wcid = rcu_dereference(dev->mt76.wcid[wlan_idx]); +	wcid = mt76_wcid_ptr(dev, wlan_idx);  	if (wcid)  		wcid->stats.tx_packets += le32_to_cpu(res->tx_packets);  	else | 
