Re: [PATCH] mlx4_en: fix transmit of packages when blue frame is enabled
From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Date: 2011-10-09 07:20:02
Also in:
netdev
On Tue, 2011-10-04 at 17:26 -0300, Thadeu Lima de Souza Cascardo wrote:
if (ring->bf_enabled && desc_size <= MAX_BF && !bounce &&
!vlan_tag) {
*(u32 *) (&tx_desc->ctrl.vlan_tag) |=
ring->doorbell_qpn;Could this have endianness problems ?
op_own |= htonl((bf_index & 0xffff) << 8);
Probably better to use cpu_to_be/lexx() here. Also make sure your descriptors are defined with the appropriate __beXX or __leXX types so sparse can tell you when you get this wrong
/* Ensure new descirptor hits memory
* before setting ownership of this descriptor to HW */
wmb();
tx_desc->ctrl.owner_opcode = op_own; wmb();
mlx4_bf_copy(ring->bf.reg + ring->bf.offset, (unsigned
long *) &tx_desc->ctrl,
desc_size);What does the above do ?
wmb();
ring->bf.offset ^= ring->bf.buf_size;
Is this HW visible ? It's a bit odd, are you doing double bufferring and
trying to flip a bit ? If it's HW visible, is endian correct ?
} else { /* Ensure new descirptor hits memory
* before setting ownership of this descriptor to HW */
wmb();
tx_desc->ctrl.owner_opcode = op_own;
- wmb();
- writel(ring->doorbell_qpn, ring->bf.uar->map +
MLX4_SEND_DOORBELL);
}
+ wmb();
+ writel(ring->doorbell_qpn, ring->bf.uar->map +
MLX4_SEND_DOORBELL);
+
---Cheers, Ben.