On Mon, Oct 10, 2011 at 01:42:23PM -0300, Thadeu Lima de Souza Cascardo wrote: > The doorbell register was being unconditionally swapped. In x86, that > meant it was being swapped to BE and written to the descriptor and to > memory, depending on the case of blue frame support or writing to > doorbell register. On PPC, this meant it was being swapped to LE and > then swapped back to BE while writing to the register. But in the blue > frame case, it was being written as LE to the descriptor. > > The fix is not to swap doorbell unconditionally, write it to the > register as BE and convert it to BE when writing it to the descriptor. > > Signed-off-by: Thadeu Lima de Souza Cascardo <casca...@linux.vnet.ibm.com> > Reported-by: Richard Hendrickson <richh...@us.ibm.com> > Cc: Eli Cohen <e...@dev.mellanox.co.il> > Cc: Yevgeny Petrilin <yevge...@mellanox.co.il> > Cc: Benjamin Herrenschmidt <b...@kernel.crashing.org> > ---
So I tested this patch and it works for me. Thanks Ben and Eli for finding out the problem with doorbell in the descriptor. Regards, Cascardo. > drivers/net/mlx4/en_tx.c | 6 +++--- > 1 files changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/mlx4/en_tx.c b/drivers/net/mlx4/en_tx.c > index 6e03de0..f76ab6b 100644 > --- a/drivers/net/mlx4/en_tx.c > +++ b/drivers/net/mlx4/en_tx.c > @@ -172,7 +172,7 @@ int mlx4_en_activate_tx_ring(struct mlx4_en_priv *priv, > memset(ring->buf, 0, ring->buf_size); > > ring->qp_state = MLX4_QP_STATE_RST; > - ring->doorbell_qpn = swab32(ring->qp.qpn << 8); > + ring->doorbell_qpn = ring->qp.qpn << 8; > > mlx4_en_fill_qp_context(priv, ring->size, ring->stride, 1, 0, ring->qpn, > ring->cqn, &ring->context); > @@ -791,7 +791,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct > net_device *dev) > skb_orphan(skb); > > if (ring->bf_enabled && desc_size <= MAX_BF && !bounce && !vlan_tag) { > - *(u32 *) (&tx_desc->ctrl.vlan_tag) |= ring->doorbell_qpn; > + *(__be32 *) (&tx_desc->ctrl.vlan_tag) |= > cpu_to_be32(ring->doorbell_qpn); > op_own |= htonl((bf_index & 0xffff) << 8); > /* Ensure new descirptor hits memory > * before setting ownership of this descriptor to HW */ > @@ -812,7 +812,7 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct > net_device *dev) > wmb(); > tx_desc->ctrl.owner_opcode = op_own; > wmb(); > - writel(ring->doorbell_qpn, ring->bf.uar->map + > MLX4_SEND_DOORBELL); > + iowrite32be(ring->doorbell_qpn, ring->bf.uar->map + > MLX4_SEND_DOORBELL); > } > > /* Poll CQ here */ > -- > 1.7.4.4 > _______________________________________________ Linuxppc-dev mailing list Linuxppc-dev@lists.ozlabs.org https://lists.ozlabs.org/listinfo/linuxppc-dev