Change any use of htole* macro in static context to instead manually check
for endianness and use __bswap_constant_* macro instead.

The current glibc definitions of the htole* macros don't allow their use
in a static context; on big endian systems the build fails with:

  HOSTCC  Documentation/mic/mpssd/mpssd.o
In file included from /usr/include/bits/byteswap.h:34:0,
                 from /usr/include/endian.h:60,
                 from /usr/include/bits/waitstatus.h:64,
                 from /usr/include/stdlib.h:42,
                 from .../Documentation/mic/mpssd/mpssd.c:23:
.../Documentation/mic/mpssd/mpssd.c:93:10:
error: braced-group within expression allowed only inside a function
   .num = htole16(MIC_VRING_ENTRIES),

...and...

.../Documentation/mic/mpssd/mpssd.c:119:3:
error: initializer element is not constant
   .host_features = htole32(

I also opened a glibc bug:
https://sourceware.org/bugzilla/show_bug.cgi?id=17679

But this patch is still needed to prevent build failures with the current
glibc htole* macro definitions.

Signed-off-by: Dan Streetman <[email protected]>
---
 Documentation/mic/mpssd/mpssd.c | 54 ++++++++++++++++++++++++++++-------------
 1 file changed, 37 insertions(+), 17 deletions(-)

diff --git a/Documentation/mic/mpssd/mpssd.c b/Documentation/mic/mpssd/mpssd.c
index 3c5c379..b6cfbf0 100644
--- a/Documentation/mic/mpssd/mpssd.c
+++ b/Documentation/mic/mpssd/mpssd.c
@@ -77,6 +77,33 @@ static struct mic_info mic_list;
 #define VIRTIO_NET_HDR_F_DATA_VALID    2       /* Csum is valid */
 #endif
 
+#define VIRTNET_HOST_FEATURES                  \
+       (1 << VIRTIO_NET_F_CSUM |               \
+       1 << VIRTIO_NET_F_GSO |                 \
+       1 << VIRTIO_NET_F_GUEST_TSO4 |          \
+       1 << VIRTIO_NET_F_GUEST_TSO6 |          \
+       1 << VIRTIO_NET_F_GUEST_ECN |           \
+       1 << VIRTIO_NET_F_GUEST_UFO)
+
+/* Currently, glibc htole* macros don't allow use in static context,
+ * so we check and use __bswap_constant_* instead
+ */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define MIC_VRING_ENTRIES_LE          MIC_VRING_ENTRIES
+# define VIRTNET_HOST_FEATURES_LE      VIRTNET_HOST_FEATURES
+# define VIRTBLK_HOST_FEATURES_LE      (1<<VIRTIO_BLK_F_SEG_MAX)
+# define VIRTBLK_CONFIG_SEG_MAX_LE     (MIC_VRING_ENTRIES - 2)
+#else /* __BIG_ENDIAN */
+# define MIC_VRING_ENTRIES_LE          \
+               __bswap_constant_16(MIC_VRING_ENTRIES)
+# define VIRTNET_HOST_FEATURES_LE      \
+               __bswap_constant_32(VIRTNET_HOST_FEATURES)
+# define VIRTBLK_HOST_FEATURES_LE      \
+               __bswap_constant_32(1<<VIRTIO_BLK_F_SEG_MAX)
+# define VIRTBLK_CONFIG_SEG_MAX_LE     \
+               __bswap_constant_32(MIC_VRING_ENTRIES - 2)
+#endif
+
 static struct {
        struct mic_device_desc dd;
        struct mic_vqconfig vqconfig[2];
@@ -90,10 +117,10 @@ static struct {
                .config_len = sizeof(virtcons_dev_page.cons_config),
        },
        .vqconfig[0] = {
-               .num = htole16(MIC_VRING_ENTRIES),
+               .num = MIC_VRING_ENTRIES_LE,
        },
        .vqconfig[1] = {
-               .num = htole16(MIC_VRING_ENTRIES),
+               .num = MIC_VRING_ENTRIES_LE,
        },
 };
 
@@ -110,21 +137,15 @@ static struct {
                .config_len = sizeof(virtnet_dev_page.net_config),
        },
        .vqconfig[0] = {
-               .num = htole16(MIC_VRING_ENTRIES),
+               .num = MIC_VRING_ENTRIES_LE,
        },
        .vqconfig[1] = {
-               .num = htole16(MIC_VRING_ENTRIES),
+               .num = MIC_VRING_ENTRIES_LE,
        },
 #if GSO_ENABLED
-               .host_features = htole32(
-               1 << VIRTIO_NET_F_CSUM |
-               1 << VIRTIO_NET_F_GSO |
-               1 << VIRTIO_NET_F_GUEST_TSO4 |
-               1 << VIRTIO_NET_F_GUEST_TSO6 |
-               1 << VIRTIO_NET_F_GUEST_ECN |
-               1 << VIRTIO_NET_F_GUEST_UFO),
+       .host_features = VIRTNET_HOST_FEATURES_LE,
 #else
-               .host_features = 0,
+       .host_features = 0,
 #endif
 };
 
@@ -143,13 +164,12 @@ static struct {
                .config_len = sizeof(virtblk_dev_page.blk_config),
        },
        .vqconfig[0] = {
-               .num = htole16(MIC_VRING_ENTRIES),
+               .num = MIC_VRING_ENTRIES_LE,
        },
-       .host_features =
-               htole32(1<<VIRTIO_BLK_F_SEG_MAX),
+       .host_features = VIRTBLK_HOST_FEATURES_LE,
        .blk_config = {
-               .seg_max = htole32(MIC_VRING_ENTRIES - 2),
-               .capacity = htole64(0),
+               .seg_max = VIRTBLK_CONFIG_SEG_MAX_LE,
+               .capacity = 0,
         }
 };
 
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to