static int __mt7603_mcu_msg_send(struct mt7603_dev *dev, struct sk_buff *skb, int cmd, int query, int *wait_seq) { int hdrlen = dev->mcu_running ? sizeof(struct mt7603_mcu_txd) : 12; struct mt76_dev *mdev = &dev->mt76; struct mt7603_mcu_txd *txd; u8 seq; if (!skb) return -EINVAL; seq = ++mdev->mmio.mcu.msg_seq & 0xf; if (!seq) seq = ++mdev->mmio.mcu.msg_seq & 0xf; txd = (struct mt7603_mcu_txd *)skb_push(skb, hdrlen); memset(txd, 0, hdrlen); txd->len = cpu_to_le16(skb->len); if (cmd == -MCU_CMD_FW_SCATTER) txd->pq_id = cpu_to_le16(MCU_PORT_QUEUE_FW); else txd->pq_id = cpu_to_le16(MCU_PORT_QUEUE); txd->pkt_type = MCU_PKT_ID; txd->seq = seq; if (cmd < 0) { txd->cid = -cmd; } else { txd->cid = MCU_CMD_EXT_CID; txd->ext_cid = cmd; if (query != MCU_Q_NA) txd->ext_cid_ack = 1; } txd->set_query = query; if (wait_seq) *wait_seq = seq; return mt76_tx_queue_skb_raw(dev, MT_TXQ_MCU, skb, 0); }
static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb, int cmd, int query, int dest, int *wait_seq) { struct mt7615_mcu_txd *mcu_txd; u8 seq, q_idx, pkt_fmt; enum mt76_txq_id qid; u32 val; __le32 *txd; if (!skb) return -EINVAL; seq = ++dev->mt76.mmio.mcu.msg_seq & 0xf; if (!seq) seq = ++dev->mt76.mmio.mcu.msg_seq & 0xf; mcu_txd = (struct mt7615_mcu_txd *)skb_push(skb, sizeof(struct mt7615_mcu_txd)); memset(mcu_txd, 0, sizeof(struct mt7615_mcu_txd)); if (cmd != -MCU_CMD_FW_SCATTER) { q_idx = MT_TX_MCU_PORT_RX_Q0; pkt_fmt = MT_TX_TYPE_CMD; } else { q_idx = MT_TX_MCU_PORT_RX_FWDL; pkt_fmt = MT_TX_TYPE_FW; } txd = mcu_txd->txd; val = FIELD_PREP(MT_TXD0_TX_BYTES, cpu_to_le16(skb->len)) | FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) | FIELD_PREP(MT_TXD0_Q_IDX, q_idx); txd[0] = cpu_to_le32(val); val = MT_TXD1_LONG_FORMAT | FIELD_PREP(MT_TXD1_HDR_FORMAT, MT_HDR_FORMAT_CMD) | FIELD_PREP(MT_TXD1_PKT_FMT, pkt_fmt); txd[1] = cpu_to_le32(val); mcu_txd->len = cpu_to_le16(skb->len - sizeof(mcu_txd->txd)); mcu_txd->pq_id = cpu_to_le16(MCU_PQ_ID(MT_TX_PORT_IDX_MCU, q_idx)); mcu_txd->pkt_type = MCU_PKT_ID; mcu_txd->seq = seq; if (cmd < 0) { mcu_txd->cid = -cmd; } else { mcu_txd->cid = MCU_CMD_EXT_CID; mcu_txd->ext_cid = cmd; if (query != MCU_Q_NA) mcu_txd->ext_cid_ack = 1; } mcu_txd->set_query = query; mcu_txd->s2d_index = dest; if (wait_seq) *wait_seq = seq; if (test_bit(MT76_STATE_MCU_RUNNING, &dev->mt76.state)) qid = MT_TXQ_MCU; else qid = MT_TXQ_FWDL; return mt76_tx_queue_skb_raw(dev, qid, skb, 0); }