Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 17d5ceb6 authored by David Ahern's avatar David Ahern Committed by David S. Miller
Browse files

net/mlx4_core: Fix unaligned accesses



Addresses the following kernel logs seen during boot:

Kernel unaligned access at TPC[100ee150] mlx4_QUERY_HCA+0x80/0x248 [mlx4_core]
Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core]
Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core]
Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core]
Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core]

Signed-off-by: default avatarDavid Ahern <david.ahern@oracle.com>
Acked-by: default avatarOr Gerlitz <ogerlitz@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f94813f3
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -56,11 +56,13 @@ MODULE_PARM_DESC(enable_qos, "Enable Enhanced QoS support (default: on)");
#define MLX4_GET(dest, source, offset)				      \
#define MLX4_GET(dest, source, offset)				      \
	do {							      \
	do {							      \
		void *__p = (char *) (source) + (offset);	      \
		void *__p = (char *) (source) + (offset);	      \
		u64 val;                                              \
		switch (sizeof (dest)) {			      \
		switch (sizeof (dest)) {			      \
		case 1: (dest) = *(u8 *) __p;	    break;	      \
		case 1: (dest) = *(u8 *) __p;	    break;	      \
		case 2: (dest) = be16_to_cpup(__p); break;	      \
		case 2: (dest) = be16_to_cpup(__p); break;	      \
		case 4: (dest) = be32_to_cpup(__p); break;	      \
		case 4: (dest) = be32_to_cpup(__p); break;	      \
		case 8: (dest) = be64_to_cpup(__p); break;	      \
		case 8: val = get_unaligned((u64 *)__p);              \
			(dest) = be64_to_cpu(val);  break;            \
		default: __buggy_use_of_MLX4_GET();		      \
		default: __buggy_use_of_MLX4_GET();		      \
		}						      \
		}						      \
	} while (0)
	} while (0)
@@ -1605,9 +1607,17 @@ static void get_board_id(void *vsd, char *board_id)
		 * swaps each 4-byte word before passing it back to
		 * swaps each 4-byte word before passing it back to
		 * us.  Therefore we need to swab it before printing.
		 * us.  Therefore we need to swab it before printing.
		 */
		 */
		for (i = 0; i < 4; ++i)
		u32 *bid_u32 = (u32 *)board_id;
			((u32 *) board_id)[i] =

				swab32(*(u32 *) (vsd + VSD_OFFSET_MLX_BOARD_ID + i * 4));
		for (i = 0; i < 4; ++i) {
			u32 *addr;
			u32 val;

			addr = (u32 *) (vsd + VSD_OFFSET_MLX_BOARD_ID + i * 4);
			val = get_unaligned(addr);
			val = swab32(val);
			put_unaligned(val, &bid_u32[i]);
		}
	}
	}
}
}