Commit 92a0dcb8 authored by Tan Tee Min's avatar Tan Tee Min Committed by Tony Nguyen

igc: offload queue max SDU from tc-taprio

Add support for configuring the max SDU for each Tx queue.
If not specified, keep the default.
Signed-off-by: default avatarTan Tee Min <tee.min.tan@linux.intel.com>
Signed-off-by: default avatarMuhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
Tested-by: default avatarNaama Meir <naamax.meir@linux.intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent ae4fe469
...@@ -99,6 +99,7 @@ struct igc_ring { ...@@ -99,6 +99,7 @@ struct igc_ring {
u32 start_time; u32 start_time;
u32 end_time; u32 end_time;
u32 max_sdu;
/* CBS parameters */ /* CBS parameters */
bool cbs_enable; /* indicates if CBS is enabled */ bool cbs_enable; /* indicates if CBS is enabled */
......
...@@ -273,6 +273,7 @@ struct igc_hw_stats { ...@@ -273,6 +273,7 @@ struct igc_hw_stats {
u64 o2bspc; u64 o2bspc;
u64 b2ospc; u64 b2ospc;
u64 b2ogprc; u64 b2ogprc;
u64 txdrop;
}; };
struct net_device *igc_get_hw_dev(struct igc_hw *hw); struct net_device *igc_get_hw_dev(struct igc_hw *hw);
......
...@@ -1501,6 +1501,7 @@ static int igc_tso(struct igc_ring *tx_ring, ...@@ -1501,6 +1501,7 @@ static int igc_tso(struct igc_ring *tx_ring,
static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb, static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
struct igc_ring *tx_ring) struct igc_ring *tx_ring)
{ {
struct igc_adapter *adapter = netdev_priv(tx_ring->netdev);
bool first_flag = false, insert_empty = false; bool first_flag = false, insert_empty = false;
u16 count = TXD_USE_COUNT(skb_headlen(skb)); u16 count = TXD_USE_COUNT(skb_headlen(skb));
__be16 protocol = vlan_get_protocol(skb); __be16 protocol = vlan_get_protocol(skb);
...@@ -1563,9 +1564,19 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb, ...@@ -1563,9 +1564,19 @@ static netdev_tx_t igc_xmit_frame_ring(struct sk_buff *skb,
first->bytecount = skb->len; first->bytecount = skb->len;
first->gso_segs = 1; first->gso_segs = 1;
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { if (tx_ring->max_sdu > 0) {
struct igc_adapter *adapter = netdev_priv(tx_ring->netdev); u32 max_sdu = 0;
max_sdu = tx_ring->max_sdu +
(skb_vlan_tagged(first->skb) ? VLAN_HLEN : 0);
if (first->bytecount > max_sdu) {
adapter->stats.txdrop++;
goto out_drop;
}
}
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
/* FIXME: add support for retrieving timestamps from /* FIXME: add support for retrieving timestamps from
* the other timer registers before skipping the * the other timer registers before skipping the
* timestamping request. * timestamping request.
...@@ -4920,7 +4931,8 @@ void igc_update_stats(struct igc_adapter *adapter) ...@@ -4920,7 +4931,8 @@ void igc_update_stats(struct igc_adapter *adapter)
net_stats->tx_window_errors = adapter->stats.latecol; net_stats->tx_window_errors = adapter->stats.latecol;
net_stats->tx_carrier_errors = adapter->stats.tncrs; net_stats->tx_carrier_errors = adapter->stats.tncrs;
/* Tx Dropped needs to be maintained elsewhere */ /* Tx Dropped */
net_stats->tx_dropped = adapter->stats.txdrop;
/* Management Stats */ /* Management Stats */
adapter->stats.mgptc += rd32(IGC_MGTPTC); adapter->stats.mgptc += rd32(IGC_MGTPTC);
...@@ -6056,6 +6068,7 @@ static int igc_tsn_clear_schedule(struct igc_adapter *adapter) ...@@ -6056,6 +6068,7 @@ static int igc_tsn_clear_schedule(struct igc_adapter *adapter)
ring->start_time = 0; ring->start_time = 0;
ring->end_time = NSEC_PER_SEC; ring->end_time = NSEC_PER_SEC;
ring->max_sdu = 0;
} }
return 0; return 0;
...@@ -6139,6 +6152,16 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter, ...@@ -6139,6 +6152,16 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
} }
} }
for (i = 0; i < adapter->num_tx_queues; i++) {
struct igc_ring *ring = adapter->tx_ring[i];
struct net_device *dev = adapter->netdev;
if (qopt->max_sdu[i])
ring->max_sdu = qopt->max_sdu[i] + dev->hard_header_len;
else
ring->max_sdu = 0;
}
return 0; return 0;
} }
...@@ -6237,8 +6260,10 @@ static int igc_tc_query_caps(struct igc_adapter *adapter, ...@@ -6237,8 +6260,10 @@ static int igc_tc_query_caps(struct igc_adapter *adapter,
caps->broken_mqprio = true; caps->broken_mqprio = true;
if (hw->mac.type == igc_i225) if (hw->mac.type == igc_i225) {
caps->supports_queue_max_sdu = true;
caps->gate_mask_per_txq = true; caps->gate_mask_per_txq = true;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment