|
@@ -290,10 +290,9 @@ dma_unmap_wqe_err:
|
|
|
|
|
|
static inline void mlx5e_fill_sq_frag_edge(struct mlx5e_txqsq *sq,
|
|
|
struct mlx5_wq_cyc *wq,
|
|
|
- u16 pi, u16 frag_pi)
|
|
|
+ u16 pi, u16 nnops)
|
|
|
{
|
|
|
struct mlx5e_tx_wqe_info *edge_wi, *wi = &sq->db.wqe_info[pi];
|
|
|
- u8 nnops = mlx5_wq_cyc_get_frag_size(wq) - frag_pi;
|
|
|
|
|
|
edge_wi = wi + nnops;
|
|
|
|
|
@@ -348,8 +347,8 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|
|
struct mlx5e_tx_wqe_info *wi;
|
|
|
|
|
|
struct mlx5e_sq_stats *stats = sq->stats;
|
|
|
+ u16 headlen, ihs, contig_wqebbs_room;
|
|
|
u16 ds_cnt, ds_cnt_inl = 0;
|
|
|
- u16 headlen, ihs, frag_pi;
|
|
|
u8 num_wqebbs, opcode;
|
|
|
u32 num_bytes;
|
|
|
int num_dma;
|
|
@@ -386,9 +385,9 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|
|
}
|
|
|
|
|
|
num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
|
|
|
- frag_pi = mlx5_wq_cyc_ctr2fragix(wq, sq->pc);
|
|
|
- if (unlikely(frag_pi + num_wqebbs > mlx5_wq_cyc_get_frag_size(wq))) {
|
|
|
- mlx5e_fill_sq_frag_edge(sq, wq, pi, frag_pi);
|
|
|
+ contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
|
|
|
+ if (unlikely(contig_wqebbs_room < num_wqebbs)) {
|
|
|
+ mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
|
|
|
mlx5e_sq_fetch_wqe(sq, &wqe, &pi);
|
|
|
}
|
|
|
|
|
@@ -636,7 +635,7 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|
|
struct mlx5e_tx_wqe_info *wi;
|
|
|
|
|
|
struct mlx5e_sq_stats *stats = sq->stats;
|
|
|
- u16 headlen, ihs, pi, frag_pi;
|
|
|
+ u16 headlen, ihs, pi, contig_wqebbs_room;
|
|
|
u16 ds_cnt, ds_cnt_inl = 0;
|
|
|
u8 num_wqebbs, opcode;
|
|
|
u32 num_bytes;
|
|
@@ -672,13 +671,14 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
|
|
|
}
|
|
|
|
|
|
num_wqebbs = DIV_ROUND_UP(ds_cnt, MLX5_SEND_WQEBB_NUM_DS);
|
|
|
- frag_pi = mlx5_wq_cyc_ctr2fragix(wq, sq->pc);
|
|
|
- if (unlikely(frag_pi + num_wqebbs > mlx5_wq_cyc_get_frag_size(wq))) {
|
|
|
+ pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
|
|
+ contig_wqebbs_room = mlx5_wq_cyc_get_contig_wqebbs(wq, pi);
|
|
|
+ if (unlikely(contig_wqebbs_room < num_wqebbs)) {
|
|
|
+ mlx5e_fill_sq_frag_edge(sq, wq, pi, contig_wqebbs_room);
|
|
|
pi = mlx5_wq_cyc_ctr2ix(wq, sq->pc);
|
|
|
- mlx5e_fill_sq_frag_edge(sq, wq, pi, frag_pi);
|
|
|
}
|
|
|
|
|
|
- mlx5i_sq_fetch_wqe(sq, &wqe, &pi);
|
|
|
+ mlx5i_sq_fetch_wqe(sq, &wqe, pi);
|
|
|
|
|
|
/* fill wqe */
|
|
|
wi = &sq->db.wqe_info[pi];
|