@@ -132,16 +132,29 @@ struct qed_sp_vport_update_params {
132
132
struct qed_filter_accept_flags accept_flags ;
133
133
};
134
134
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
+
135
153
#define QED_MAX_SGES_NUM 16
136
154
#define CRC32_POLY 0x1edc6f41
137
155
138
156
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 )
145
158
{
146
159
struct vport_start_ramrod_data * p_ramrod = NULL ;
147
160
struct qed_spq_entry * p_ent = NULL ;
@@ -150,13 +163,13 @@ static int qed_sp_vport_start(struct qed_hwfn *p_hwfn,
150
163
u16 rx_mode = 0 ;
151
164
u8 abs_vport_id = 0 ;
152
165
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 );
154
167
if (rc != 0 )
155
168
return rc ;
156
169
157
170
memset (& init_data , 0 , sizeof (init_data ));
158
171
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 ;
160
173
init_data .comp_mode = QED_SPQ_MODE_EBLOCK ;
161
174
162
175
rc = qed_sp_init_request (p_hwfn , & p_ent ,
@@ -168,9 +181,9 @@ static int qed_sp_vport_start(struct qed_hwfn *p_hwfn,
168
181
p_ramrod = & p_ent -> ramrod .vport_start ;
169
182
p_ramrod -> vport_id = abs_vport_id ;
170
183
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 ;
174
187
175
188
SET_FIELD (rx_mode , ETH_VPORT_RX_MODE_UCAST_DROP_ALL , 1 );
176
189
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,
181
194
memset (& p_ramrod -> tpa_param , 0 ,
182
195
sizeof (struct eth_vport_tpa_param ));
183
196
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
+
184
214
/* Software Function ID in hwfn (PFs are 0 - 15, VFs are 16 - 135) */
185
215
p_ramrod -> sw_fid = qed_concrete_to_sw_fid (p_hwfn -> cdev ,
186
- concrete_fid );
216
+ p_params -> concrete_fid );
187
217
188
218
return qed_spq_post (p_hwfn , p_ent , NULL );
189
219
}
@@ -1592,24 +1622,25 @@ static void qed_register_eth_ops(struct qed_dev *cdev,
1592
1622
}
1593
1623
1594
1624
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 )
1599
1626
{
1600
1627
int rc , i ;
1601
1628
1602
1629
for_each_hwfn (cdev , i ) {
1630
+ struct qed_sp_vport_start_params start = { 0 };
1603
1631
struct qed_hwfn * p_hwfn = & cdev -> hwfns [i ];
1604
1632
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 );
1613
1644
if (rc ) {
1614
1645
DP_ERR (cdev , "Failed to start VPORT\n" );
1615
1646
return rc ;
@@ -1619,7 +1650,7 @@ static int qed_start_vport(struct qed_dev *cdev,
1619
1650
1620
1651
DP_VERBOSE (cdev , (QED_MSG_SPQ | NETIF_MSG_IFUP ),
1621
1652
"Started V-PORT %d with MTU %d\n" ,
1622
- vport_id , mtu );
1653
+ start . vport_id , start . mtu );
1623
1654
}
1624
1655
1625
1656
qed_reset_vport_stats (cdev );
0 commit comments