forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/net/ethernet/mellanox/mlx5/core/en_accel/tls_rxtx.c
....@@ -181,16 +181,12 @@
181181 */
182182 nskb->ip_summed = CHECKSUM_PARTIAL;
183183
184
- nskb->xmit_more = 1;
185184 nskb->queue_mapping = skb->queue_mapping;
186185 }
187186
188
-static struct sk_buff *
189
-mlx5e_tls_handle_ooo(struct mlx5e_tls_offload_context_tx *context,
190
- struct mlx5e_txqsq *sq, struct sk_buff *skb,
191
- struct mlx5e_tx_wqe **wqe,
192
- u16 *pi,
193
- struct mlx5e_tls *tls)
187
+static bool mlx5e_tls_handle_ooo(struct mlx5e_tls_offload_context_tx *context,
188
+ struct mlx5e_txqsq *sq, struct sk_buff *skb,
189
+ struct mlx5e_tls *tls)
194190 {
195191 u32 tcp_seq = ntohl(tcp_hdr(skb)->seq);
196192 struct sync_info info;
....@@ -218,7 +214,7 @@
218214 if (likely(payload <= -info.sync_len))
219215 /* SKB payload doesn't require offload
220216 */
221
- return skb;
217
+ return true;
222218
223219 atomic64_inc(&tls->sw_stats.tx_tls_drop_bypass_required);
224220 goto err_out;
....@@ -248,20 +244,17 @@
248244 sq->stats->tls_resync_bytes += nskb->len;
249245 mlx5e_tls_complete_sync_skb(skb, nskb, tcp_seq, headln,
250246 cpu_to_be64(info.rcd_sn));
251
- mlx5e_sq_xmit(sq, nskb, *wqe, *pi);
252
- mlx5e_sq_fetch_wqe(sq, wqe, pi);
253
- return skb;
247
+ mlx5e_sq_xmit_simple(sq, nskb, true);
248
+
249
+ return true;
254250
255251 err_out:
256252 dev_kfree_skb_any(skb);
257
- return NULL;
253
+ return false;
258254 }
259255
260
-struct sk_buff *mlx5e_tls_handle_tx_skb(struct net_device *netdev,
261
- struct mlx5e_txqsq *sq,
262
- struct sk_buff *skb,
263
- struct mlx5e_tx_wqe **wqe,
264
- u16 *pi)
256
+bool mlx5e_tls_handle_tx_skb(struct net_device *netdev, struct mlx5e_txqsq *sq,
257
+ struct sk_buff *skb, struct mlx5e_accel_tx_tls_state *state)
265258 {
266259 struct mlx5e_priv *priv = netdev_priv(netdev);
267260 struct mlx5e_tls_offload_context_tx *context;
....@@ -271,35 +264,47 @@
271264 u32 skb_seq;
272265
273266 if (!skb->sk || !tls_is_sk_tx_device_offloaded(skb->sk))
274
- goto out;
267
+ return true;
275268
276269 datalen = skb->len - (skb_transport_offset(skb) + tcp_hdrlen(skb));
277270 if (!datalen)
278
- goto out;
271
+ return true;
272
+
273
+ mlx5e_tx_mpwqe_ensure_complete(sq);
279274
280275 tls_ctx = tls_get_ctx(skb->sk);
281
- if (unlikely(tls_ctx->netdev != netdev))
282
- goto out;
276
+ if (WARN_ON_ONCE(tls_ctx->netdev != netdev))
277
+ goto err_out;
283278
279
+ if (mlx5_accel_is_ktls_tx(sq->channel->mdev))
280
+ return mlx5e_ktls_handle_tx_skb(tls_ctx, sq, skb, datalen, state);
281
+
282
+ /* FPGA */
284283 skb_seq = ntohl(tcp_hdr(skb)->seq);
285284 context = mlx5e_get_tls_tx_context(tls_ctx);
286285 expected_seq = context->expected_seq;
287286
288
- if (unlikely(expected_seq != skb_seq)) {
289
- skb = mlx5e_tls_handle_ooo(context, sq, skb, wqe, pi, priv->tls);
290
- goto out;
291
- }
287
+ if (unlikely(expected_seq != skb_seq))
288
+ return mlx5e_tls_handle_ooo(context, sq, skb, priv->tls);
292289
293290 if (unlikely(mlx5e_tls_add_metadata(skb, context->swid))) {
294291 atomic64_inc(&priv->tls->sw_stats.tx_tls_drop_metadata);
295292 dev_kfree_skb_any(skb);
296
- skb = NULL;
297
- goto out;
293
+ return false;
298294 }
299295
300296 context->expected_seq = skb_seq + datalen;
301
-out:
302
- return skb;
297
+ return true;
298
+
299
+err_out:
300
+ dev_kfree_skb_any(skb);
301
+ return false;
302
+}
303
+
304
+void mlx5e_tls_handle_tx_wqe(struct mlx5e_txqsq *sq, struct mlx5_wqe_ctrl_seg *cseg,
305
+ struct mlx5e_accel_tx_tls_state *state)
306
+{
307
+ cseg->tis_tir_num = cpu_to_be32(state->tls_tisn << 8);
303308 }
304309
305310 static int tls_update_resync_sn(struct net_device *netdev,
....@@ -348,14 +353,12 @@
348353 return 0;
349354 }
350355
351
-void mlx5e_tls_handle_rx_skb(struct net_device *netdev, struct sk_buff *skb,
352
- u32 *cqe_bcnt)
356
+/* FPGA tls rx handler */
357
+void mlx5e_tls_handle_rx_skb_metadata(struct mlx5e_rq *rq, struct sk_buff *skb,
358
+ u32 *cqe_bcnt)
353359 {
354360 struct mlx5e_tls_metadata *mdata;
355361 struct mlx5e_priv *priv;
356
-
357
- if (!is_metadata_hdr_valid(skb))
358
- return;
359362
360363 /* Use the metadata */
361364 mdata = (struct mlx5e_tls_metadata *)(skb->data + ETH_HLEN);
....@@ -364,13 +367,13 @@
364367 skb->decrypted = 1;
365368 break;
366369 case SYNDROM_RESYNC_REQUEST:
367
- tls_update_resync_sn(netdev, skb, mdata);
368
- priv = netdev_priv(netdev);
370
+ tls_update_resync_sn(rq->netdev, skb, mdata);
371
+ priv = netdev_priv(rq->netdev);
369372 atomic64_inc(&priv->tls->sw_stats.rx_tls_resync_request);
370373 break;
371374 case SYNDROM_AUTH_FAILED:
372375 /* Authentication failure will be observed and verified by kTLS */
373
- priv = netdev_priv(netdev);
376
+ priv = netdev_priv(rq->netdev);
374377 atomic64_inc(&priv->tls->sw_stats.rx_tls_auth_fail);
375378 break;
376379 default:
....@@ -381,3 +384,18 @@
381384 remove_metadata_hdr(skb);
382385 *cqe_bcnt -= MLX5E_METADATA_ETHER_LEN;
383386 }
387
+
388
+u16 mlx5e_tls_get_stop_room(struct mlx5e_txqsq *sq)
389
+{
390
+ struct mlx5_core_dev *mdev = sq->channel->mdev;
391
+
392
+ if (!mlx5_accel_is_tls_device(mdev))
393
+ return 0;
394
+
395
+ if (mlx5_accel_is_ktls_device(mdev))
396
+ return mlx5e_ktls_get_stop_room(sq);
397
+
398
+ /* FPGA */
399
+ /* Resync SKB. */
400
+ return mlx5e_stop_room_for_wqe(MLX5_SEND_WQE_MAX_WQEBBS);
401
+}