net/mlx5: Use order-0 allocations for all WQ types
[linux-2.6-block.git] / drivers / net / ethernet / mellanox / mlx5 / core / en_tx.c
index fc68e72b0b2bc3b373b4aa332ab3b650139b633b..d37566be06e1197444f3f0433a666866db831fea 100644 (file)
@@ -296,16 +296,16 @@ dma_unmap_wqe_err:
        return -ENOMEM;
 }
 
-static inline void mlx5e_fill_sq_edge(struct mlx5e_txqsq *sq,
-                                     struct mlx5_wq_cyc *wq,
-                                     u16 pi)
+static inline void mlx5e_fill_sq_frag_edge(struct mlx5e_txqsq *sq,
+                                          struct mlx5_wq_cyc *wq,
+                                          u16 pi, u16 frag_pi)
 {
        struct mlx5e_tx_wqe_info *edge_wi, *wi = &sq->db.wqe_info[pi];
-       u8 nnops = mlx5_wq_cyc_get_size(wq) - pi;
+       u8 nnops = mlx5_wq_cyc_get_frag_size(wq) - frag_pi;
 
        edge_wi = wi + nnops;
 
-       /* fill sq edge with nops to avoid wqe wrap around */
+       /* fill sq frag edge with nops to avoid wqe wrapping two pages */
        for (; wi < edge_wi; wi++) {
                wi->skb        = NULL;
                wi->num_wqebbs = 1;
@@ -358,8 +358,8 @@ netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
        unsigned char *skb_data = skb->data;
        unsigned int skb_len = skb->len;
        u16 ds_cnt, ds_cnt_inl = 0;
+       u16 headlen, ihs, frag_pi;
        u8 num_wqebbs, opcode;
-       u16 headlen, ihs;
        u32 num_bytes;
        int num_dma;
        __be16 mss;
@@ -395,8 +395,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);
-       if (unlikely(pi + num_wqebbs > mlx5_wq_cyc_get_size(wq))) {
-               mlx5e_fill_sq_edge(sq, wq, pi);
+       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);
                mlx5e_sq_fetch_wqe(sq, &wqe, &pi);
        }
 
@@ -642,9 +643,9 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb,
 
        unsigned char *skb_data = skb->data;
        unsigned int skb_len = skb->len;
+       u16 headlen, ihs, pi, frag_pi;
        u16 ds_cnt, ds_cnt_inl = 0;
        u8 num_wqebbs, opcode;
-       u16 headlen, ihs, pi;
        u32 num_bytes;
        int num_dma;
        __be16 mss;
@@ -680,8 +681,9 @@ 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);
-       if (unlikely(pi + num_wqebbs > mlx5_wq_cyc_get_size(wq))) {
-               mlx5e_fill_sq_edge(sq, wq, pi);
+       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);
                mlx5i_sq_fetch_wqe(sq, &wqe, &pi);
        }