浏览代码

net/mlx4_en: Doorbell is byteswapped in Little Endian archs

iowrite32() will byteswap it's argument on big endian archs.
iowrite32be() will byteswap on little endian archs.
Since we don't want to do this unnecessary byteswap on the fast path,
doorbell is stored in the NIC's native endianness. Using the right
iowrite() according to the arch endianness.

CC: Wei Yang <weiyang@linux.vnet.ibm.com>
CC: David Laight <david.laight@aculab.com>
Fixes: 6a4e812 ("net/mlx4_en: Avoid calling bswap in tx fast path")
Signed-off-by: Amir Vadai <amirv@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Amir Vadai 10 年之前
父节点
当前提交
492f5add4b
共有 1 个文件被更改,包括 11 次插入1 次删除
  1. 11 1
      drivers/net/ethernet/mellanox/mlx4/en_tx.c

+ 11 - 1
drivers/net/ethernet/mellanox/mlx4/en_tx.c

@@ -962,7 +962,17 @@ netdev_tx_t mlx4_en_xmit(struct sk_buff *skb, struct net_device *dev)
 		tx_desc->ctrl.owner_opcode = op_own;
 		tx_desc->ctrl.owner_opcode = op_own;
 		if (send_doorbell) {
 		if (send_doorbell) {
 			wmb();
 			wmb();
-			iowrite32(ring->doorbell_qpn,
+			/* Since there is no iowrite*_native() that writes the
+			 * value as is, without byteswapping - using the one
+			 * the doesn't do byteswapping in the relevant arch
+			 * endianness.
+			 */
+#if defined(__LITTLE_ENDIAN)
+			iowrite32(
+#else
+			iowrite32be(
+#endif
+				  ring->doorbell_qpn,
 				  ring->bf.uar->map + MLX4_SEND_DOORBELL);
 				  ring->bf.uar->map + MLX4_SEND_DOORBELL);
 		} else {
 		} else {
 			ring->xmit_more++;
 			ring->xmit_more++;