static int mlxsw_pci_sdq_init(struct mlxsw_pci *mlxsw_pci, char *mbox,
                              struct mlxsw_pci_queue *q)
 {
+       int tclass;
        int i;
        int err;
 
        q->producer_counter = 0;
        q->consumer_counter = 0;
+       tclass = q->num == MLXSW_PCI_SDQ_EMAD_INDEX ? MLXSW_PCI_SDQ_EMAD_TC :
+                                                     MLXSW_PCI_SDQ_CTL_TC;
 
        /* Set CQ of same number of this SDQ. */
        mlxsw_cmd_mbox_sw2hw_dq_cq_set(mbox, q->num);
-       mlxsw_cmd_mbox_sw2hw_dq_sdq_tclass_set(mbox, 3);
+       mlxsw_cmd_mbox_sw2hw_dq_sdq_tclass_set(mbox, tclass);
        mlxsw_cmd_mbox_sw2hw_dq_log2_dq_sz_set(mbox, 3); /* 8 pages */
        for (i = 0; i < MLXSW_PCI_AQ_PAGES; i++) {
                dma_addr_t mapaddr = __mlxsw_pci_queue_page_get(q, i);
        eq_log2sz = mlxsw_cmd_mbox_query_aq_cap_log_max_eq_sz_get(mbox);
 
        if (num_sdqs + num_rdqs > num_cqs ||
+           num_sdqs < MLXSW_PCI_SDQS_MIN ||
            num_cqs > MLXSW_PCI_CQS_MAX || num_eqs != MLXSW_PCI_EQS_COUNT) {
                dev_err(&pdev->dev, "Unsupported number of queues\n");
                return -EINVAL;
 mlxsw_pci_sdq_pick(struct mlxsw_pci *mlxsw_pci,
                   const struct mlxsw_tx_info *tx_info)
 {
-       u8 sdqn = tx_info->local_port % mlxsw_pci_sdq_count(mlxsw_pci);
+       u8 ctl_sdq_count = mlxsw_pci_sdq_count(mlxsw_pci) - 1;
+       u8 sdqn;
+
+       if (tx_info->is_emad) {
+               sdqn = MLXSW_PCI_SDQ_EMAD_INDEX;
+       } else {
+               BUILD_BUG_ON(MLXSW_PCI_SDQ_EMAD_INDEX != 0);
+               sdqn = 1 + (tx_info->local_port % ctl_sdq_count);
+       }
 
        return mlxsw_pci_sdq_get(mlxsw_pci, sdqn);
 }
 
 #define MLXSW_PCI_EQ_ASYNC_NUM 0
 #define MLXSW_PCI_EQ_COMP_NUM  1
 
+#define MLXSW_PCI_SDQS_MIN     2 /* EMAD and control traffic */
+#define MLXSW_PCI_SDQ_EMAD_INDEX       0
+#define MLXSW_PCI_SDQ_EMAD_TC  0
+#define MLXSW_PCI_SDQ_CTL_TC   3
+
 #define MLXSW_PCI_AQ_PAGES     8
 #define MLXSW_PCI_AQ_SIZE      (MLXSW_PCI_PAGE_SIZE * MLXSW_PCI_AQ_PAGES)
 #define MLXSW_PCI_WQE_SIZE     32 /* 32 bytes per element */