Skip to content

Commit 088c861

Browse files
Manish Chopradavem330
authored andcommitted
qed/qede: Add infrastructure support for hardware GRO
This patch adds mainly structures and APIs prototype changes in order to give support for qede slowpath/fastpath support for the same. Signed-off-by: Yuval Mintz <[email protected]> Signed-off-by: Manish Chopra <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 49cc66e commit 088c861

File tree

4 files changed

+88
-36
lines changed

4 files changed

+88
-36
lines changed

drivers/net/ethernet/qlogic/qed/qed_hsi.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2919,7 +2919,19 @@ struct eth_vport_rx_mode {
29192919
};
29202920

29212921
struct eth_vport_tpa_param {
2922-
u64 reserved[2];
2922+
u8 tpa_ipv4_en_flg;
2923+
u8 tpa_ipv6_en_flg;
2924+
u8 tpa_ipv4_tunn_en_flg;
2925+
u8 tpa_ipv6_tunn_en_flg;
2926+
u8 tpa_pkt_split_flg;
2927+
u8 tpa_hdr_data_split_flg;
2928+
u8 tpa_gro_consistent_flg;
2929+
u8 tpa_max_aggs_num;
2930+
u16 tpa_max_size;
2931+
u16 tpa_min_size_to_start;
2932+
u16 tpa_min_size_to_cont;
2933+
u8 max_buff_num;
2934+
u8 reserved;
29232935
};
29242936

29252937
struct eth_vport_tx_mode {

drivers/net/ethernet/qlogic/qed/qed_l2.c

Lines changed: 56 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -132,16 +132,29 @@ struct qed_sp_vport_update_params {
132132
struct qed_filter_accept_flags accept_flags;
133133
};
134134

135+
enum qed_tpa_mode {
136+
QED_TPA_MODE_NONE,
137+
QED_TPA_MODE_UNUSED,
138+
QED_TPA_MODE_GRO,
139+
QED_TPA_MODE_MAX
140+
};
141+
142+
struct qed_sp_vport_start_params {
143+
enum qed_tpa_mode tpa_mode;
144+
bool remove_inner_vlan;
145+
bool drop_ttl0;
146+
u8 max_buffers_per_cqe;
147+
u32 concrete_fid;
148+
u16 opaque_fid;
149+
u8 vport_id;
150+
u16 mtu;
151+
};
152+
135153
#define QED_MAX_SGES_NUM 16
136154
#define CRC32_POLY 0x1edc6f41
137155

138156
static int qed_sp_vport_start(struct qed_hwfn *p_hwfn,
139-
u32 concrete_fid,
140-
u16 opaque_fid,
141-
u8 vport_id,
142-
u16 mtu,
143-
u8 drop_ttl0_flg,
144-
u8 inner_vlan_removal_en_flg)
157+
struct qed_sp_vport_start_params *p_params)
145158
{
146159
struct vport_start_ramrod_data *p_ramrod = NULL;
147160
struct qed_spq_entry *p_ent = NULL;
@@ -150,13 +163,13 @@ static int qed_sp_vport_start(struct qed_hwfn *p_hwfn,
150163
u16 rx_mode = 0;
151164
u8 abs_vport_id = 0;
152165

153-
rc = qed_fw_vport(p_hwfn, vport_id, &abs_vport_id);
166+
rc = qed_fw_vport(p_hwfn, p_params->vport_id, &abs_vport_id);
154167
if (rc != 0)
155168
return rc;
156169

157170
memset(&init_data, 0, sizeof(init_data));
158171
init_data.cid = qed_spq_get_cid(p_hwfn);
159-
init_data.opaque_fid = opaque_fid;
172+
init_data.opaque_fid = p_params->opaque_fid;
160173
init_data.comp_mode = QED_SPQ_MODE_EBLOCK;
161174

162175
rc = qed_sp_init_request(p_hwfn, &p_ent,
@@ -168,9 +181,9 @@ static int qed_sp_vport_start(struct qed_hwfn *p_hwfn,
168181
p_ramrod = &p_ent->ramrod.vport_start;
169182
p_ramrod->vport_id = abs_vport_id;
170183

171-
p_ramrod->mtu = cpu_to_le16(mtu);
172-
p_ramrod->inner_vlan_removal_en = inner_vlan_removal_en_flg;
173-
p_ramrod->drop_ttl0_en = drop_ttl0_flg;
184+
p_ramrod->mtu = cpu_to_le16(p_params->mtu);
185+
p_ramrod->inner_vlan_removal_en = p_params->remove_inner_vlan;
186+
p_ramrod->drop_ttl0_en = p_params->drop_ttl0;
174187

175188
SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_UCAST_DROP_ALL, 1);
176189
SET_FIELD(rx_mode, ETH_VPORT_RX_MODE_MCAST_DROP_ALL, 1);
@@ -181,9 +194,26 @@ static int qed_sp_vport_start(struct qed_hwfn *p_hwfn,
181194
memset(&p_ramrod->tpa_param, 0,
182195
sizeof(struct eth_vport_tpa_param));
183196

197+
p_ramrod->tpa_param.max_buff_num = p_params->max_buffers_per_cqe;
198+
199+
switch (p_params->tpa_mode) {
200+
case QED_TPA_MODE_GRO:
201+
p_ramrod->tpa_param.tpa_max_aggs_num = ETH_TPA_MAX_AGGS_NUM;
202+
p_ramrod->tpa_param.tpa_max_size = (u16)-1;
203+
p_ramrod->tpa_param.tpa_min_size_to_cont = p_params->mtu / 2;
204+
p_ramrod->tpa_param.tpa_min_size_to_start = p_params->mtu / 2;
205+
p_ramrod->tpa_param.tpa_ipv4_en_flg = 1;
206+
p_ramrod->tpa_param.tpa_ipv6_en_flg = 1;
207+
p_ramrod->tpa_param.tpa_pkt_split_flg = 1;
208+
p_ramrod->tpa_param.tpa_gro_consistent_flg = 1;
209+
break;
210+
default:
211+
break;
212+
}
213+
184214
/* Software Function ID in hwfn (PFs are 0 - 15, VFs are 16 - 135) */
185215
p_ramrod->sw_fid = qed_concrete_to_sw_fid(p_hwfn->cdev,
186-
concrete_fid);
216+
p_params->concrete_fid);
187217

188218
return qed_spq_post(p_hwfn, p_ent, NULL);
189219
}
@@ -1592,24 +1622,25 @@ static void qed_register_eth_ops(struct qed_dev *cdev,
15921622
}
15931623

15941624
static int qed_start_vport(struct qed_dev *cdev,
1595-
u8 vport_id,
1596-
u16 mtu,
1597-
u8 drop_ttl0_flg,
1598-
u8 inner_vlan_removal_en_flg)
1625+
struct qed_start_vport_params *params)
15991626
{
16001627
int rc, i;
16011628

16021629
for_each_hwfn(cdev, i) {
1630+
struct qed_sp_vport_start_params start = { 0 };
16031631
struct qed_hwfn *p_hwfn = &cdev->hwfns[i];
16041632

1605-
rc = qed_sp_vport_start(p_hwfn,
1606-
p_hwfn->hw_info.concrete_fid,
1607-
p_hwfn->hw_info.opaque_fid,
1608-
vport_id,
1609-
mtu,
1610-
drop_ttl0_flg,
1611-
inner_vlan_removal_en_flg);
1612-
1633+
start.tpa_mode = params->gro_enable ? QED_TPA_MODE_GRO :
1634+
QED_TPA_MODE_NONE;
1635+
start.remove_inner_vlan = params->remove_inner_vlan;
1636+
start.drop_ttl0 = params->drop_ttl0;
1637+
start.opaque_fid = p_hwfn->hw_info.opaque_fid;
1638+
start.concrete_fid = p_hwfn->hw_info.concrete_fid;
1639+
start.vport_id = params->vport_id;
1640+
start.max_buffers_per_cqe = 16;
1641+
start.mtu = params->mtu;
1642+
1643+
rc = qed_sp_vport_start(p_hwfn, &start);
16131644
if (rc) {
16141645
DP_ERR(cdev, "Failed to start VPORT\n");
16151646
return rc;
@@ -1619,7 +1650,7 @@ static int qed_start_vport(struct qed_dev *cdev,
16191650

16201651
DP_VERBOSE(cdev, (QED_MSG_SPQ | NETIF_MSG_IFUP),
16211652
"Started V-PORT %d with MTU %d\n",
1622-
vport_id, mtu);
1653+
start.vport_id, start.mtu);
16231654
}
16241655

16251656
qed_reset_vport_stats(cdev);

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2466,22 +2466,25 @@ static int qede_stop_queues(struct qede_dev *edev)
24662466
static int qede_start_queues(struct qede_dev *edev)
24672467
{
24682468
int rc, tc, i;
2469-
int vport_id = 0, drop_ttl0_flg = 1, vlan_removal_en = 1;
2469+
int vlan_removal_en = 1;
24702470
struct qed_dev *cdev = edev->cdev;
24712471
struct qed_update_vport_rss_params *rss_params = &edev->rss_params;
24722472
struct qed_update_vport_params vport_update_params;
24732473
struct qed_queue_start_common_params q_params;
2474+
struct qed_start_vport_params start = {0};
24742475

24752476
if (!edev->num_rss) {
24762477
DP_ERR(edev,
24772478
"Cannot update V-VPORT as active as there are no Rx queues\n");
24782479
return -EINVAL;
24792480
}
24802481

2481-
rc = edev->ops->vport_start(cdev, vport_id,
2482-
edev->ndev->mtu,
2483-
drop_ttl0_flg,
2484-
vlan_removal_en);
2482+
start.mtu = edev->ndev->mtu;
2483+
start.vport_id = 0;
2484+
start.drop_ttl0 = true;
2485+
start.remove_inner_vlan = vlan_removal_en;
2486+
2487+
rc = edev->ops->vport_start(cdev, &start);
24852488

24862489
if (rc) {
24872490
DP_ERR(edev, "Start V-PORT failed %d\n", rc);
@@ -2490,7 +2493,7 @@ static int qede_start_queues(struct qede_dev *edev)
24902493

24912494
DP_VERBOSE(edev, NETIF_MSG_IFUP,
24922495
"Start vport ramrod passed, vport_id = %d, MTU = %d, vlan_removal_en = %d\n",
2493-
vport_id, edev->ndev->mtu + 0xe, vlan_removal_en);
2496+
start.vport_id, edev->ndev->mtu + 0xe, vlan_removal_en);
24942497

24952498
for_each_rss(i) {
24962499
struct qede_fastpath *fp = &edev->fp_array[i];
@@ -2555,7 +2558,7 @@ static int qede_start_queues(struct qede_dev *edev)
25552558

25562559
/* Prepare and send the vport enable */
25572560
memset(&vport_update_params, 0, sizeof(vport_update_params));
2558-
vport_update_params.vport_id = vport_id;
2561+
vport_update_params.vport_id = start.vport_id;
25592562
vport_update_params.update_vport_active_flg = 1;
25602563
vport_update_params.vport_active_flg = 1;
25612564

include/linux/qed/qed_eth_if.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ struct qed_update_vport_params {
3939
struct qed_update_vport_rss_params rss_params;
4040
};
4141

42+
struct qed_start_vport_params {
43+
bool remove_inner_vlan;
44+
bool gro_enable;
45+
bool drop_ttl0;
46+
u8 vport_id;
47+
u16 mtu;
48+
};
49+
4250
struct qed_stop_rxq_params {
4351
u8 rss_id;
4452
u8 rx_queue_id;
@@ -118,9 +126,7 @@ struct qed_eth_ops {
118126
void *cookie);
119127

120128
int (*vport_start)(struct qed_dev *cdev,
121-
u8 vport_id, u16 mtu,
122-
u8 drop_ttl0_flg,
123-
u8 inner_vlan_removal_en_flg);
129+
struct qed_start_vport_params *params);
124130

125131
int (*vport_stop)(struct qed_dev *cdev,
126132
u8 vport_id);

0 commit comments

Comments
 (0)