static int mt7601u_init_key_mem(struct mt7601u_dev *dev) { u32 vals[4] = {}; return mt7601u_burst_write_regs(dev, MT_SKEY_MODE_BASE_0, vals, ARRAY_SIZE(vals)); }
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); }
void mt7601u_wr_copy(struct mt7601u_dev *dev, u32 offset, const void *data, int len) { WARN_ONCE(offset & 3, "unaligned write copy off:%08x", offset); WARN_ONCE(len & 3, "short write copy off:%08x", offset); mt7601u_burst_write_regs(dev, offset, data, len / 4); }
static int mt7601u_init_wcid_attr_mem(struct mt7601u_dev *dev) { u32 *vals; int i, ret; vals = kmalloc(sizeof(*vals) * N_WCIDS * 2, GFP_KERNEL); if (!vals) return -ENOMEM; for (i = 0; i < N_WCIDS * 2; i++) vals[i] = 1; ret = mt7601u_burst_write_regs(dev, MT_WCID_ATTR_BASE, vals, N_WCIDS * 2); kfree(vals); return ret; }
static int mt7601u_init_wcid_mem(struct mt7601u_dev *dev) { u32 *vals; int i, ret; vals = kmalloc(sizeof(*vals) * N_WCIDS * 2, GFP_KERNEL); if (!vals) return -ENOMEM; for (i = 0; i < N_WCIDS; i++) { vals[i * 2] = 0xffffffff; vals[i * 2 + 1] = 0x00ffffff; } ret = mt7601u_burst_write_regs(dev, MT_WCID_ADDR_BASE, vals, N_WCIDS * 2); kfree(vals); return ret; }