Skip to content

Commit a29b8eb

Browse files
ahduyckkuba-moo
authored andcommitted
eth: fbnic: Add basic Rx handling
Handle Rx packets with basic csum and Rx hash offloads. NIC writes back to the completion ring a head buffer descriptor (data buffer allocated from header pages), variable number of payload descriptors (data buffers in payload pages), an optional metadata descriptor (type 2) and finally the primary metadata descriptor (type 3). This format makes scatter support fairly easy - start gathering the pages when we see head page, gather until we see the primary metadata descriptor, do the processing. Use XDP infra to collect the packet fragments as we traverse the descriptors. XDP itself is not supported yet, but it will be soon. Signed-off-by: Alexander Duyck <[email protected]> Link: https://patch.msgid.link/172079942839.1778861.10509071985738726125.stgit@ahduyck-xeon-server.home.arpa Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 9a57bac commit a29b8eb

File tree

5 files changed

+402
-3
lines changed

5 files changed

+402
-3
lines changed

drivers/net/ethernet/meta/fbnic/fbnic_csr.h

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,69 @@ enum {
121121
#define FBNIC_BD_PAGE_ID_MASK \
122122
(FBNIC_BD_DESC_ID_MASK & ~FBNIC_BD_FRAG_ID_MASK)
123123

124+
/* Rx Completion Queue Descriptors */
125+
#define FBNIC_RCD_TYPE_MASK DESC_GENMASK(62, 61)
126+
enum {
127+
FBNIC_RCD_TYPE_HDR_AL = 0,
128+
FBNIC_RCD_TYPE_PAY_AL = 1,
129+
FBNIC_RCD_TYPE_OPT_META = 2,
130+
FBNIC_RCD_TYPE_META = 3,
131+
};
132+
133+
#define FBNIC_RCD_DONE DESC_BIT(63)
134+
135+
/* Address/Length Completion Descriptors */
136+
#define FBNIC_RCD_AL_BUFF_ID_MASK DESC_GENMASK(15, 0)
137+
#define FBNIC_RCD_AL_BUFF_FRAG_MASK (FBNIC_BD_FRAG_COUNT - 1)
138+
#define FBNIC_RCD_AL_BUFF_PAGE_MASK \
139+
(FBNIC_RCD_AL_BUFF_ID_MASK & ~FBNIC_RCD_AL_BUFF_FRAG_MASK)
140+
#define FBNIC_RCD_AL_BUFF_LEN_MASK DESC_GENMASK(28, 16)
141+
#define FBNIC_RCD_AL_BUFF_OFF_MASK DESC_GENMASK(43, 32)
142+
#define FBNIC_RCD_AL_PAGE_FIN DESC_BIT(60)
143+
144+
/* Header AL specific values */
145+
#define FBNIC_RCD_HDR_AL_OVERFLOW DESC_BIT(53)
146+
#define FBNIC_RCD_HDR_AL_DMA_HINT_MASK DESC_GENMASK(59, 54)
147+
enum {
148+
FBNIC_RCD_HDR_AL_DMA_HINT_NONE = 0,
149+
FBNIC_RCD_HDR_AL_DMA_HINT_L2 = 1,
150+
FBNIC_RCD_HDR_AL_DMA_HINT_L3 = 2,
151+
FBNIC_RCD_HDR_AL_DMA_HINT_L4 = 4,
152+
};
153+
154+
/* Optional Metadata Completion Descriptors */
155+
#define FBNIC_RCD_OPT_META_TS_MASK DESC_GENMASK(39, 0)
156+
#define FBNIC_RCD_OPT_META_ACTION_MASK DESC_GENMASK(45, 40)
157+
#define FBNIC_RCD_OPT_META_ACTION DESC_BIT(57)
158+
#define FBNIC_RCD_OPT_META_TS DESC_BIT(58)
159+
#define FBNIC_RCD_OPT_META_TYPE_MASK DESC_GENMASK(60, 59)
160+
161+
/* Metadata Completion Descriptors */
162+
#define FBNIC_RCD_META_RSS_HASH_MASK DESC_GENMASK(31, 0)
163+
#define FBNIC_RCD_META_L2_CSUM_MASK DESC_GENMASK(47, 32)
164+
#define FBNIC_RCD_META_L3_TYPE_MASK DESC_GENMASK(49, 48)
165+
enum {
166+
FBNIC_RCD_META_L3_TYPE_OTHER = 0,
167+
FBNIC_RCD_META_L3_TYPE_IPV4 = 1,
168+
FBNIC_RCD_META_L3_TYPE_IPV6 = 2,
169+
FBNIC_RCD_META_L3_TYPE_V6V6 = 3,
170+
};
171+
172+
#define FBNIC_RCD_META_L4_TYPE_MASK DESC_GENMASK(51, 50)
173+
enum {
174+
FBNIC_RCD_META_L4_TYPE_OTHER = 0,
175+
FBNIC_RCD_META_L4_TYPE_TCP = 1,
176+
FBNIC_RCD_META_L4_TYPE_UDP = 2,
177+
};
178+
179+
#define FBNIC_RCD_META_L4_CSUM_UNNECESSARY DESC_BIT(52)
180+
#define FBNIC_RCD_META_ERR_MAC_EOP DESC_BIT(53)
181+
#define FBNIC_RCD_META_ERR_TRUNCATED_FRAME DESC_BIT(54)
182+
#define FBNIC_RCD_META_ERR_PARSER DESC_BIT(55)
183+
#define FBNIC_RCD_META_UNCORRECTABLE_ERR_MASK \
184+
(FBNIC_RCD_META_ERR_MAC_EOP | FBNIC_RCD_META_ERR_TRUNCATED_FRAME)
185+
#define FBNIC_RCD_META_ECN DESC_BIT(60)
186+
124187
/* Register Definitions
125188
*
126189
* The registers are laid as indexes into an le32 array. As such the actual

drivers/net/ethernet/meta/fbnic/fbnic_netdev.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,10 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd)
171171
fbnic_reset_queues(fbn, default_queues, default_queues);
172172

173173
netdev->features |=
174+
NETIF_F_RXHASH |
174175
NETIF_F_SG |
175-
NETIF_F_HW_CSUM;
176+
NETIF_F_HW_CSUM |
177+
NETIF_F_RXCSUM;
176178

177179
netdev->hw_features |= netdev->features;
178180
netdev->vlan_features |= netdev->features;

drivers/net/ethernet/meta/fbnic/fbnic_pci.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,9 @@ static void fbnic_service_task(struct work_struct *work)
195195

196196
fbnic_health_check(fbd);
197197

198+
if (netif_carrier_ok(fbd->netdev))
199+
fbnic_napi_depletion_check(fbd->netdev);
200+
198201
if (netif_running(fbd->netdev))
199202
schedule_delayed_work(&fbd->service_task, HZ);
200203

0 commit comments

Comments
 (0)