Skip to content

Commit 9a57bac

Browse files
ahduyckkuba-moo
authored andcommitted
eth: fbnic: Add basic Tx handling
Handle Tx of simple packets. Support checksum offload and gather. Use .ndo_features_check to make sure packet geometry will be supported by the HW, i.e. we can fit the header lengths into the descriptor fields. The device writes to the completion rings the position of the tail (consumer) pointer. Read all those writebacks, obviously the last one will be the most recent, complete skbs up to that point. Signed-off-by: Alexander Duyck <[email protected]> Link: https://patch.msgid.link/172079942464.1778861.17919428039428796180.stgit@ahduyck-xeon-server.home.arpa Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 6968437 commit 9a57bac

File tree

4 files changed

+477
-1
lines changed

4 files changed

+477
-1
lines changed

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,72 @@
2424

2525
#define FBNIC_CLOCK_FREQ (600 * (1000 * 1000))
2626

27+
/* Transmit Work Descriptor Format */
28+
/* Length, Type, Offset Masks and Shifts */
29+
#define FBNIC_TWD_L2_HLEN_MASK DESC_GENMASK(5, 0)
30+
31+
#define FBNIC_TWD_L3_TYPE_MASK DESC_GENMASK(7, 6)
32+
enum {
33+
FBNIC_TWD_L3_TYPE_OTHER = 0,
34+
FBNIC_TWD_L3_TYPE_IPV4 = 1,
35+
FBNIC_TWD_L3_TYPE_IPV6 = 2,
36+
FBNIC_TWD_L3_TYPE_V6V6 = 3,
37+
};
38+
39+
#define FBNIC_TWD_L3_OHLEN_MASK DESC_GENMASK(15, 8)
40+
#define FBNIC_TWD_L3_IHLEN_MASK DESC_GENMASK(23, 16)
41+
42+
enum {
43+
FBNIC_TWD_L4_TYPE_OTHER = 0,
44+
FBNIC_TWD_L4_TYPE_TCP = 1,
45+
FBNIC_TWD_L4_TYPE_UDP = 2,
46+
};
47+
48+
#define FBNIC_TWD_CSUM_OFFSET_MASK DESC_GENMASK(27, 24)
49+
#define FBNIC_TWD_L4_HLEN_MASK DESC_GENMASK(31, 28)
50+
51+
/* Flags and Type */
52+
#define FBNIC_TWD_L4_TYPE_MASK DESC_GENMASK(33, 32)
53+
#define FBNIC_TWD_FLAG_REQ_TS DESC_BIT(34)
54+
#define FBNIC_TWD_FLAG_REQ_LSO DESC_BIT(35)
55+
#define FBNIC_TWD_FLAG_REQ_CSO DESC_BIT(36)
56+
#define FBNIC_TWD_FLAG_REQ_COMPLETION DESC_BIT(37)
57+
#define FBNIC_TWD_FLAG_DEST_MAC DESC_BIT(43)
58+
#define FBNIC_TWD_FLAG_DEST_BMC DESC_BIT(44)
59+
#define FBNIC_TWD_FLAG_DEST_FW DESC_BIT(45)
60+
#define FBNIC_TWD_TYPE_MASK DESC_GENMASK(47, 46)
61+
enum {
62+
FBNIC_TWD_TYPE_META = 0,
63+
FBNIC_TWD_TYPE_OPT_META = 1,
64+
FBNIC_TWD_TYPE_AL = 2,
65+
FBNIC_TWD_TYPE_LAST_AL = 3,
66+
};
67+
68+
/* MSS and Completion Req */
69+
#define FBNIC_TWD_MSS_MASK DESC_GENMASK(61, 48)
70+
71+
#define FBNIC_TWD_TS_MASK DESC_GENMASK(39, 0)
72+
#define FBNIC_TWD_ADDR_MASK DESC_GENMASK(45, 0)
73+
#define FBNIC_TWD_LEN_MASK DESC_GENMASK(63, 48)
74+
75+
/* Tx Completion Descriptor Format */
76+
#define FBNIC_TCD_TYPE0_HEAD0_MASK DESC_GENMASK(15, 0)
77+
#define FBNIC_TCD_TYPE0_HEAD1_MASK DESC_GENMASK(31, 16)
78+
79+
#define FBNIC_TCD_TYPE1_TS_MASK DESC_GENMASK(39, 0)
80+
81+
#define FBNIC_TCD_STATUS_MASK DESC_GENMASK(59, 48)
82+
#define FBNIC_TCD_STATUS_TS_INVALID DESC_BIT(48)
83+
#define FBNIC_TCD_STATUS_ILLEGAL_TS_REQ DESC_BIT(49)
84+
#define FBNIC_TCD_TWQ1 DESC_BIT(60)
85+
#define FBNIC_TCD_TYPE_MASK DESC_GENMASK(62, 61)
86+
enum {
87+
FBNIC_TCD_TYPE_0 = 0,
88+
FBNIC_TCD_TYPE_1 = 1,
89+
};
90+
91+
#define FBNIC_TCD_DONE DESC_BIT(63)
92+
2793
/* Rx Buffer Descriptor Format
2894
*
2995
* The layout of this can vary depending on the page size of the system.

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ static const struct net_device_ops fbnic_netdev_ops = {
9191
.ndo_stop = fbnic_stop,
9292
.ndo_validate_addr = eth_validate_addr,
9393
.ndo_start_xmit = fbnic_xmit_frame,
94+
.ndo_features_check = fbnic_features_check,
9495
};
9596

9697
void fbnic_reset_queues(struct fbnic_net *fbn,
@@ -169,6 +170,14 @@ struct net_device *fbnic_netdev_alloc(struct fbnic_dev *fbd)
169170

170171
fbnic_reset_queues(fbn, default_queues, default_queues);
171172

173+
netdev->features |=
174+
NETIF_F_SG |
175+
NETIF_F_HW_CSUM;
176+
177+
netdev->hw_features |= netdev->features;
178+
netdev->vlan_features |= netdev->features;
179+
netdev->hw_enc_features |= netdev->features;
180+
172181
netdev->min_mtu = IPV6_MIN_MTU;
173182
netdev->max_mtu = FBNIC_MAX_JUMBO_FRAME_SIZE - ETH_HLEN;
174183

0 commit comments

Comments
 (0)