int mt7601u_burst_write_regs(struct mt7601u_dev *dev, u32 offset, const u32 *data, int n) { const int max_regs_per_cmd = INBAND_PACKET_MAX_LEN / 4 - 1; struct sk_buff *skb; int cnt, i, ret; if (!n) return 0; cnt = min(max_regs_per_cmd, n); skb = alloc_skb(cnt * 4 + MT_DMA_HDR_LEN + 4, GFP_KERNEL); if (!skb) return -ENOMEM; skb_reserve(skb, MT_DMA_HDR_LEN); skb_put_le32(skb, MT_MCU_MEMMAP_WLAN + offset); for (i = 0; i < cnt; i++) skb_put_le32(skb, data[i]); ret = mt7601u_mcu_msg_send(dev, skb, CMD_BURST_WRITE, cnt == n); if (ret) return ret; return mt7601u_burst_write_regs(dev, offset + cnt * 4, data + cnt, n - cnt); }
static int mt76x02u_mcu_wr_rp(struct mt76_dev *dev, u32 base, const struct mt76_reg_pair *data, int n) { const int CMD_RANDOM_WRITE = 12; const int max_vals_per_cmd = MT_INBAND_PACKET_MAX_LEN / 8; struct mt76_usb *usb = &dev->usb; struct sk_buff *skb; int cnt, i, ret; if (!n) return 0; cnt = min(max_vals_per_cmd, n); skb = alloc_skb(cnt * 8 + MT_DMA_HDR_LEN + 4, GFP_KERNEL); if (!skb) return -ENOMEM; skb_reserve(skb, MT_DMA_HDR_LEN); for (i = 0; i < cnt; i++) { skb_put_le32(skb, base + data[i].reg); skb_put_le32(skb, data[i].value); } mutex_lock(&usb->mcu.mutex); ret = __mt76x02u_mcu_send_msg(dev, skb, CMD_RANDOM_WRITE, cnt == n); mutex_unlock(&usb->mcu.mutex); if (ret) return ret; return mt76x02u_mcu_wr_rp(dev, base, data + cnt, n - cnt); }
int mt7601u_write_reg_pairs(struct mt7601u_dev *dev, u32 base, const struct mt76_reg_pair *data, int n) { const int max_vals_per_cmd = INBAND_PACKET_MAX_LEN / 8; struct sk_buff *skb; int cnt, i, ret; if (!n) return 0; cnt = min(max_vals_per_cmd, n); skb = alloc_skb(cnt * 8 + MT_DMA_HDR_LEN + 4, GFP_KERNEL); if (!skb) return -ENOMEM; skb_reserve(skb, MT_DMA_HDR_LEN); for (i = 0; i < cnt; i++) { skb_put_le32(skb, base + data[i].reg); skb_put_le32(skb, data[i].value); } ret = mt7601u_mcu_msg_send(dev, skb, CMD_RANDOM_WRITE, cnt == n); if (ret) return ret; return mt7601u_write_reg_pairs(dev, base, data + cnt, n - cnt); }
static int mt76x02u_mcu_rd_rp(struct mt76_dev *dev, u32 base, struct mt76_reg_pair *data, int n) { const int CMD_RANDOM_READ = 10; const int max_vals_per_cmd = MT_INBAND_PACKET_MAX_LEN / 8; struct mt76_usb *usb = &dev->usb; struct sk_buff *skb; int cnt, i, ret; if (!n) return 0; cnt = min(max_vals_per_cmd, n); if (cnt != n) return -EINVAL; skb = alloc_skb(cnt * 8 + MT_DMA_HDR_LEN + 4, GFP_KERNEL); if (!skb) return -ENOMEM; skb_reserve(skb, MT_DMA_HDR_LEN); for (i = 0; i < cnt; i++) { skb_put_le32(skb, base + data[i].reg); skb_put_le32(skb, data[i].value); } mutex_lock(&usb->mcu.mutex); usb->mcu.rp = data; usb->mcu.rp_len = n; usb->mcu.base = base; usb->mcu.burst = false; ret = __mt76x02u_mcu_send_msg(dev, skb, CMD_RANDOM_READ, true); usb->mcu.rp = NULL; mutex_unlock(&usb->mcu.mutex); return ret; }