Skip to content

Commit 6818c4d

Browse files
jahay1anguy11
authored andcommitted
idpf: add splitq start_xmit
Add start_xmit support for split queue model. To start with, add the necessary checks to linearize the skb if it uses more number of buffers than the hardware supported limit. Stop the transmit queue if there are no enough descriptors available for the skb to use or if there we're going to potentially overrun the completion queue. Finally prepare the descriptor with all the required information and update the tail. Signed-off-by: Joshua Hay <[email protected]> Co-developed-by: Alan Brady <[email protected]> Signed-off-by: Alan Brady <[email protected]> Co-developed-by: Madhu Chittim <[email protected]> Signed-off-by: Madhu Chittim <[email protected]> Co-developed-by: Phani Burra <[email protected]> Signed-off-by: Phani Burra <[email protected]> Reviewed-by: Sridhar Samudrala <[email protected]> Reviewed-by: Willem de Bruijn <[email protected]> Co-developed-by: Pavan Kumar Linga <[email protected]> Signed-off-by: Pavan Kumar Linga <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent d4d5587 commit 6818c4d

File tree

5 files changed

+1107
-1
lines changed

5 files changed

+1107
-1
lines changed

drivers/net/ethernet/intel/idpf/idpf.h

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct idpf_vport_max_q;
1313
#include <linux/aer.h>
1414
#include <linux/etherdevice.h>
1515
#include <linux/pci.h>
16+
#include <linux/bitfield.h>
1617

1718
#include "virtchnl2.h"
1819
#include "idpf_lan_txrx.h"

drivers/net/ethernet/intel/idpf/idpf_lan_txrx.h

+143
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,64 @@ enum idpf_rss_hash {
5656
BIT_ULL(IDPF_HASH_NONF_UNICAST_IPV6_UDP) | \
5757
BIT_ULL(IDPF_HASH_NONF_MULTICAST_IPV6_UDP))
5858

59+
#define IDPF_TXD_CTX_QW1_MSS_S 50
60+
#define IDPF_TXD_CTX_QW1_MSS_M GENMASK_ULL(63, 50)
61+
#define IDPF_TXD_CTX_QW1_TSO_LEN_S 30
62+
#define IDPF_TXD_CTX_QW1_TSO_LEN_M GENMASK_ULL(47, 30)
63+
#define IDPF_TXD_CTX_QW1_CMD_S 4
64+
#define IDPF_TXD_CTX_QW1_CMD_M GENMASK_ULL(15, 4)
65+
#define IDPF_TXD_CTX_QW1_DTYPE_S 0
66+
#define IDPF_TXD_CTX_QW1_DTYPE_M GENMASK_ULL(3, 0)
67+
#define IDPF_TXD_QW1_L2TAG1_S 48
68+
#define IDPF_TXD_QW1_L2TAG1_M GENMASK_ULL(63, 48)
69+
#define IDPF_TXD_QW1_TX_BUF_SZ_S 34
70+
#define IDPF_TXD_QW1_TX_BUF_SZ_M GENMASK_ULL(47, 34)
71+
#define IDPF_TXD_QW1_OFFSET_S 16
72+
#define IDPF_TXD_QW1_OFFSET_M GENMASK_ULL(33, 16)
73+
#define IDPF_TXD_QW1_CMD_S 4
74+
#define IDPF_TXD_QW1_CMD_M GENMASK_ULL(15, 4)
75+
#define IDPF_TXD_QW1_DTYPE_S 0
76+
#define IDPF_TXD_QW1_DTYPE_M GENMASK_ULL(3, 0)
77+
78+
enum idpf_tx_desc_dtype_value {
79+
IDPF_TX_DESC_DTYPE_DATA = 0,
80+
IDPF_TX_DESC_DTYPE_CTX = 1,
81+
/* DTYPE 2 is reserved
82+
* DTYPE 3 is free for future use
83+
* DTYPE 4 is reserved
84+
*/
85+
IDPF_TX_DESC_DTYPE_FLEX_TSO_CTX = 5,
86+
/* DTYPE 6 is reserved */
87+
IDPF_TX_DESC_DTYPE_FLEX_L2TAG1_L2TAG2 = 7,
88+
/* DTYPE 8, 9 are free for future use
89+
* DTYPE 10 is reserved
90+
* DTYPE 11 is free for future use
91+
*/
92+
IDPF_TX_DESC_DTYPE_FLEX_FLOW_SCHE = 12,
93+
/* DTYPE 13, 14 are free for future use */
94+
95+
/* DESC_DONE - HW has completed write-back of descriptor */
96+
IDPF_TX_DESC_DTYPE_DESC_DONE = 15,
97+
};
98+
99+
enum idpf_tx_base_desc_cmd_bits {
100+
IDPF_TX_DESC_CMD_EOP = BIT(0),
101+
IDPF_TX_DESC_CMD_RS = BIT(1),
102+
/* only on VFs else RSVD */
103+
IDPF_TX_DESC_CMD_ICRC = BIT(2),
104+
IDPF_TX_DESC_CMD_IL2TAG1 = BIT(3),
105+
IDPF_TX_DESC_CMD_RSVD1 = BIT(4),
106+
IDPF_TX_DESC_CMD_IIPT_IPV6 = BIT(5),
107+
IDPF_TX_DESC_CMD_IIPT_IPV4 = BIT(6),
108+
IDPF_TX_DESC_CMD_IIPT_IPV4_CSUM = GENMASK(6, 5),
109+
IDPF_TX_DESC_CMD_RSVD2 = BIT(7),
110+
IDPF_TX_DESC_CMD_L4T_EOFT_TCP = BIT(8),
111+
IDPF_TX_DESC_CMD_L4T_EOFT_SCTP = BIT(9),
112+
IDPF_TX_DESC_CMD_L4T_EOFT_UDP = GENMASK(9, 8),
113+
IDPF_TX_DESC_CMD_RSVD3 = BIT(10),
114+
IDPF_TX_DESC_CMD_RSVD4 = BIT(11),
115+
};
116+
59117
/* Transmit descriptors */
60118
/* splitq tx buf, singleq tx buf and singleq compl desc */
61119
struct idpf_base_tx_desc {
@@ -74,4 +132,89 @@ struct idpf_splitq_tx_compl_desc {
74132
u8 rsvd; /* Reserved */
75133
}; /* writeback used with completion queues */
76134

135+
/* Common cmd field defines for all desc except Flex Flow Scheduler (0x0C) */
136+
enum idpf_tx_flex_desc_cmd_bits {
137+
IDPF_TX_FLEX_DESC_CMD_EOP = BIT(0),
138+
IDPF_TX_FLEX_DESC_CMD_RS = BIT(1),
139+
IDPF_TX_FLEX_DESC_CMD_RE = BIT(2),
140+
IDPF_TX_FLEX_DESC_CMD_IL2TAG1 = BIT(3),
141+
IDPF_TX_FLEX_DESC_CMD_DUMMY = BIT(4),
142+
IDPF_TX_FLEX_DESC_CMD_CS_EN = BIT(5),
143+
IDPF_TX_FLEX_DESC_CMD_FILT_AU_EN = BIT(6),
144+
IDPF_TX_FLEX_DESC_CMD_FILT_AU_EVICT = BIT(7),
145+
};
146+
147+
struct idpf_flex_tx_desc {
148+
__le64 buf_addr; /* Packet buffer address */
149+
struct {
150+
#define IDPF_FLEX_TXD_QW1_DTYPE_S 0
151+
#define IDPF_FLEX_TXD_QW1_DTYPE_M GENMASK(4, 0)
152+
#define IDPF_FLEX_TXD_QW1_CMD_S 5
153+
#define IDPF_FLEX_TXD_QW1_CMD_M GENMASK(15, 5)
154+
__le16 cmd_dtype;
155+
/* DTYPE=IDPF_TX_DESC_DTYPE_FLEX_L2TAG1_L2TAG2 (0x07) */
156+
struct {
157+
__le16 l2tag1;
158+
__le16 l2tag2;
159+
} l2tags;
160+
__le16 buf_size;
161+
} qw1;
162+
};
163+
164+
struct idpf_flex_tx_sched_desc {
165+
__le64 buf_addr; /* Packet buffer address */
166+
167+
/* DTYPE = IDPF_TX_DESC_DTYPE_FLEX_FLOW_SCHE_16B (0x0C) */
168+
struct {
169+
u8 cmd_dtype;
170+
#define IDPF_TXD_FLEX_FLOW_DTYPE_M GENMASK(4, 0)
171+
#define IDPF_TXD_FLEX_FLOW_CMD_EOP BIT(5)
172+
#define IDPF_TXD_FLEX_FLOW_CMD_CS_EN BIT(6)
173+
#define IDPF_TXD_FLEX_FLOW_CMD_RE BIT(7)
174+
175+
/* [23:23] Horizon Overflow bit, [22:0] timestamp */
176+
u8 ts[3];
177+
#define IDPF_TXD_FLOW_SCH_HORIZON_OVERFLOW_M BIT(7)
178+
179+
__le16 compl_tag;
180+
__le16 rxr_bufsize;
181+
#define IDPF_TXD_FLEX_FLOW_RXR BIT(14)
182+
#define IDPF_TXD_FLEX_FLOW_BUFSIZE_M GENMASK(13, 0)
183+
} qw1;
184+
};
185+
186+
/* Common cmd fields for all flex context descriptors
187+
* Note: these defines already account for the 5 bit dtype in the cmd_dtype
188+
* field
189+
*/
190+
enum idpf_tx_flex_ctx_desc_cmd_bits {
191+
IDPF_TX_FLEX_CTX_DESC_CMD_TSO = BIT(5),
192+
IDPF_TX_FLEX_CTX_DESC_CMD_TSYN_EN = BIT(6),
193+
IDPF_TX_FLEX_CTX_DESC_CMD_L2TAG2 = BIT(7),
194+
IDPF_TX_FLEX_CTX_DESC_CMD_SWTCH_UPLNK = BIT(9),
195+
IDPF_TX_FLEX_CTX_DESC_CMD_SWTCH_LOCAL = BIT(10),
196+
IDPF_TX_FLEX_CTX_DESC_CMD_SWTCH_TARGETVSI = GENMASK(10, 9),
197+
};
198+
199+
/* Standard flex descriptor TSO context quad word */
200+
struct idpf_flex_tx_tso_ctx_qw {
201+
__le32 flex_tlen;
202+
#define IDPF_TXD_FLEX_CTX_TLEN_M GENMASK(17, 0)
203+
#define IDPF_TXD_FLEX_TSO_CTX_FLEX_S 24
204+
__le16 mss_rt;
205+
#define IDPF_TXD_FLEX_CTX_MSS_RT_M GENMASK(13, 0)
206+
u8 hdr_len;
207+
u8 flex;
208+
};
209+
210+
struct idpf_flex_tx_ctx_desc {
211+
/* DTYPE = IDPF_TX_DESC_DTYPE_FLEX_TSO_CTX (0x05) */
212+
struct {
213+
struct idpf_flex_tx_tso_ctx_qw qw0;
214+
struct {
215+
__le16 cmd_dtype;
216+
u8 flex[6];
217+
} qw1;
218+
} tso;
219+
};
77220
#endif /* _IDPF_LAN_TXRX_H_ */

drivers/net/ethernet/intel/idpf/idpf_lib.c

+1
Original file line numberDiff line numberDiff line change
@@ -1557,6 +1557,7 @@ void idpf_free_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem)
15571557
static const struct net_device_ops idpf_netdev_ops_splitq = {
15581558
.ndo_open = idpf_open,
15591559
.ndo_stop = idpf_stop,
1560+
.ndo_start_xmit = idpf_tx_splitq_start,
15601561
};
15611562

15621563
static const struct net_device_ops idpf_netdev_ops_singleq = {

0 commit comments

Comments
 (0)