Skip to content

Commit 2b288b8

Browse files
LorenzoBianconiPaolo Abeni
authored andcommitted
net: airoha: Introduce ndo_select_queue callback
Airoha EN7581 SoC supports 32 Tx DMA rings used to feed packets to QoS channels. Each channels supports 8 QoS queues where the user can apply QoS scheduling policies. In a similar way, the user can configure hw rate shaping for each QoS channel. Introduce ndo_select_queue callback in order to select the tx queue based on QoS channel and QoS queue. In particular, for dsa device select QoS channel according to the dsa user port index, rely on port id otherwise. Select QoS queue based on the skb priority. Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Paolo Abeni <pabeni@redhat.com>
1 parent 5f79559 commit 2b288b8

File tree

1 file changed

+28
-2
lines changed

1 file changed

+28
-2
lines changed

drivers/net/ethernet/mediatek/airoha_eth.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#define AIROHA_MAX_NUM_XSI_RSTS 5
2424
#define AIROHA_MAX_MTU 2000
2525
#define AIROHA_MAX_PACKET_SIZE 2048
26+
#define AIROHA_NUM_QOS_CHANNELS 4
27+
#define AIROHA_NUM_QOS_QUEUES 8
2628
#define AIROHA_NUM_TX_RING 32
2729
#define AIROHA_NUM_RX_RING 32
2830
#define AIROHA_FE_MC_MAX_VLAN_TABLE 64
@@ -2429,21 +2431,44 @@ static void airoha_dev_get_stats64(struct net_device *dev,
24292431
} while (u64_stats_fetch_retry(&port->stats.syncp, start));
24302432
}
24312433

2434+
static u16 airoha_dev_select_queue(struct net_device *dev, struct sk_buff *skb,
2435+
struct net_device *sb_dev)
2436+
{
2437+
struct airoha_gdm_port *port = netdev_priv(dev);
2438+
int queue, channel;
2439+
2440+
/* For dsa device select QoS channel according to the dsa user port
2441+
* index, rely on port id otherwise. Select QoS queue based on the
2442+
* skb priority.
2443+
*/
2444+
channel = netdev_uses_dsa(dev) ? skb_get_queue_mapping(skb) : port->id;
2445+
channel = channel % AIROHA_NUM_QOS_CHANNELS;
2446+
queue = (skb->priority - 1) % AIROHA_NUM_QOS_QUEUES; /* QoS queue */
2447+
queue = channel * AIROHA_NUM_QOS_QUEUES + queue;
2448+
2449+
return queue < dev->num_tx_queues ? queue : 0;
2450+
}
2451+
24322452
static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb,
24332453
struct net_device *dev)
24342454
{
24352455
struct skb_shared_info *sinfo = skb_shinfo(skb);
24362456
struct airoha_gdm_port *port = netdev_priv(dev);
2437-
u32 msg0 = 0, msg1, len = skb_headlen(skb);
2438-
int i, qid = skb_get_queue_mapping(skb);
2457+
u32 msg0, msg1, len = skb_headlen(skb);
24392458
struct airoha_qdma *qdma = port->qdma;
24402459
u32 nr_frags = 1 + sinfo->nr_frags;
24412460
struct netdev_queue *txq;
24422461
struct airoha_queue *q;
24432462
void *data = skb->data;
2463+
int i, qid;
24442464
u16 index;
24452465
u8 fport;
24462466

2467+
qid = skb_get_queue_mapping(skb) % ARRAY_SIZE(qdma->q_tx);
2468+
msg0 = FIELD_PREP(QDMA_ETH_TXMSG_CHAN_MASK,
2469+
qid / AIROHA_NUM_QOS_QUEUES) |
2470+
FIELD_PREP(QDMA_ETH_TXMSG_QUEUE_MASK,
2471+
qid % AIROHA_NUM_QOS_QUEUES);
24472472
if (skb->ip_summed == CHECKSUM_PARTIAL)
24482473
msg0 |= FIELD_PREP(QDMA_ETH_TXMSG_TCO_MASK, 1) |
24492474
FIELD_PREP(QDMA_ETH_TXMSG_UCO_MASK, 1) |
@@ -2617,6 +2642,7 @@ static const struct net_device_ops airoha_netdev_ops = {
26172642
.ndo_init = airoha_dev_init,
26182643
.ndo_open = airoha_dev_open,
26192644
.ndo_stop = airoha_dev_stop,
2645+
.ndo_select_queue = airoha_dev_select_queue,
26202646
.ndo_start_xmit = airoha_dev_xmit,
26212647
.ndo_get_stats64 = airoha_dev_get_stats64,
26222648
.ndo_set_mac_address = airoha_dev_set_macaddr,

0 commit comments

Comments
 (0)