OSDN Git Service

net: marvell: prestera: fix hw structure laid out
authorVolodymyr Mytnyk <vmytnyk@marvell.com>
Fri, 5 Nov 2021 16:49:24 +0000 (18:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sun, 7 Nov 2021 19:33:55 +0000 (19:33 +0000)
The prestera FW v4.0 support commit has been merged
accidentally w/o review comments addressed and waiting
for the final patch set to be uploaded. So, fix the remaining
comments related to structure laid out and build issues.

Reported-by: kernel test robot <lkp@intel.com>
Fixes: bb5dbf2cc64d ("net: marvell: prestera: add firmware v4.0 support")
Signed-off-by: Volodymyr Mytnyk <vmytnyk@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/prestera/prestera_hw.c

index bc3c931..9b8b1ed 100644 (file)
@@ -180,109 +180,113 @@ struct prestera_msg_common_resp {
        struct prestera_msg_ret ret;
 };
 
-union prestera_msg_switch_param {
-       u8 mac[ETH_ALEN];
-       __le32 ageing_timeout_ms;
-} __packed;
-
 struct prestera_msg_switch_attr_req {
        struct prestera_msg_cmd cmd;
        __le32 attr;
-       union prestera_msg_switch_param param;
-       u8 pad[2];
+       union {
+               __le32 ageing_timeout_ms;
+               struct {
+                       u8 mac[ETH_ALEN];
+                       u8 __pad[2];
+               };
+       } param;
 };
 
 struct prestera_msg_switch_init_resp {
        struct prestera_msg_ret ret;
        __le32 port_count;
        __le32 mtu_max;
-       u8  switch_id;
-       u8  lag_max;
-       u8  lag_member_max;
        __le32 size_tbl_router_nexthop;
-} __packed __aligned(4);
+       u8 switch_id;
+       u8 lag_max;
+       u8 lag_member_max;
+};
 
 struct prestera_msg_event_port_param {
        union {
                struct {
-                       u8 oper;
                        __le32 mode;
                        __le32 speed;
+                       u8 oper;
                        u8 duplex;
                        u8 fc;
                        u8 fec;
-               } __packed mac;
+               } mac;
                struct {
-                       u8 mdix;
                        __le64 lmode_bmap;
+                       u8 mdix;
                        u8 fc;
-               } __packed phy;
-       } __packed;
-} __packed __aligned(4);
+                       u8 __pad[2];
+               } __packed phy; /* make sure always 12 bytes size */
+       };
+};
 
 struct prestera_msg_port_cap_param {
        __le64 link_mode;
-       u8  type;
-       u8  fec;
-       u8  fc;
-       u8  transceiver;
+       u8 type;
+       u8 fec;
+       u8 fc;
+       u8 transceiver;
 };
 
 struct prestera_msg_port_flood_param {
        u8 type;
        u8 enable;
+       u8 __pad[2];
 };
 
 union prestera_msg_port_param {
+       __le32 mtu;
+       __le32 speed;
+       __le32 link_mode;
        u8 admin_state;
        u8 oper_state;
-       __le32 mtu;
        u8 mac[ETH_ALEN];
        u8 accept_frm_type;
-       __le32 speed;
        u8 learning;
        u8 flood;
-       __le32 link_mode;
        u8 type;
        u8 duplex;
        u8 fec;
        u8 fc;
-
        union {
                struct {
-                       u8 admin:1;
+                       u8 admin;
                        u8 fc;
                        u8 ap_enable;
+                       u8 __reserved[5];
                        union {
                                struct {
                                        __le32 mode;
-                                       u8  inband:1;
                                        __le32 speed;
-                                       u8  duplex;
-                                       u8  fec;
-                                       u8  fec_supp;
-                               } __packed reg_mode;
+                                       u8 inband;
+                                       u8 duplex;
+                                       u8 fec;
+                                       u8 fec_supp;
+                               } reg_mode;
                                struct {
                                        __le32 mode;
                                        __le32 speed;
-                                       u8  fec;
-                                       u8  fec_supp;
-                               } __packed ap_modes[PRESTERA_AP_PORT_MAX];
-                       } __packed;
-               } __packed mac;
+                                       u8 fec;
+                                       u8 fec_supp;
+                                       u8 __pad[2];
+                               } ap_modes[PRESTERA_AP_PORT_MAX];
+                       };
+               } mac;
                struct {
-                       u8 admin:1;
-                       u8 adv_enable;
                        __le64 modes;
                        __le32 mode;
+                       u8 admin;
+                       u8 adv_enable;
                        u8 mdix;
-               } __packed phy;
-       } __packed link;
+                       u8 __pad;
+               } phy;
+       } link;
 
        struct prestera_msg_port_cap_param cap;
        struct prestera_msg_port_flood_param flood_ext;
        struct prestera_msg_event_port_param link_evt;
-} __packed;
+};
 
 struct prestera_msg_port_attr_req {
        struct prestera_msg_cmd cmd;
@@ -290,14 +294,12 @@ struct prestera_msg_port_attr_req {
        __le32 port;
        __le32 dev;
        union prestera_msg_port_param param;
-} __packed __aligned(4);
-
+};
 
 struct prestera_msg_port_attr_resp {
        struct prestera_msg_ret ret;
        union prestera_msg_port_param param;
-} __packed __aligned(4);
-
+};
 
 struct prestera_msg_port_stats_resp {
        struct prestera_msg_ret ret;
@@ -322,13 +324,13 @@ struct prestera_msg_vlan_req {
        __le32 port;
        __le32 dev;
        __le16 vid;
-       u8  is_member;
-       u8  is_tagged;
+       u8 is_member;
+       u8 is_tagged;
 };
 
 struct prestera_msg_fdb_req {
        struct prestera_msg_cmd cmd;
-       u8 dest_type;
+       __le32 flush_mode;
        union {
                struct {
                        __le32 port;
@@ -336,11 +338,12 @@ struct prestera_msg_fdb_req {
                };
                __le16 lag_id;
        } dest;
-       u8  mac[ETH_ALEN];
        __le16 vid;
-       u8  dynamic;
-       __le32 flush_mode;
-} __packed __aligned(4);
+       u8 dest_type;
+       u8 dynamic;
+       u8 mac[ETH_ALEN];
+       u8 __pad[2];
+};
 
 struct prestera_msg_bridge_req {
        struct prestera_msg_cmd cmd;
@@ -363,11 +366,12 @@ struct prestera_msg_acl_action {
 
 struct prestera_msg_acl_match {
        __le32 type;
+       __le32 __reserved;
        union {
                struct {
                        u8 key;
                        u8 mask;
-               } __packed u8;
+               } u8;
                struct {
                        __le16 key;
                        __le16 mask;
@@ -383,7 +387,7 @@ struct prestera_msg_acl_match {
                struct {
                        u8 key[ETH_ALEN];
                        u8 mask[ETH_ALEN];
-               } __packed mac;
+               } mac;
        } keymask;
 };
 
@@ -446,7 +450,8 @@ struct prestera_msg_stp_req {
        __le32 port;
        __le32 dev;
        __le16 vid;
-       u8  state;
+       u8 state;
+       u8 __pad;
 };
 
 struct prestera_msg_rxtx_req {
@@ -497,21 +502,21 @@ union prestera_msg_event_fdb_param {
 
 struct prestera_msg_event_fdb {
        struct prestera_msg_event id;
-       u8 dest_type;
+       __le32 vid;
        union {
                __le32 port_id;
                __le16 lag_id;
        } dest;
-       __le32 vid;
        union prestera_msg_event_fdb_param param;
-} __packed __aligned(4);
+       u8 dest_type;
+};
 
-static inline void prestera_hw_build_tests(void)
+static void prestera_hw_build_tests(void)
 {
        /* check requests */
        BUILD_BUG_ON(sizeof(struct prestera_msg_common_req) != 4);
        BUILD_BUG_ON(sizeof(struct prestera_msg_switch_attr_req) != 16);
-       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_req) != 120);
+       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_req) != 144);
        BUILD_BUG_ON(sizeof(struct prestera_msg_port_info_req) != 8);
        BUILD_BUG_ON(sizeof(struct prestera_msg_vlan_req) != 16);
        BUILD_BUG_ON(sizeof(struct prestera_msg_fdb_req) != 28);
@@ -528,7 +533,7 @@ static inline void prestera_hw_build_tests(void)
        /* check responses */
        BUILD_BUG_ON(sizeof(struct prestera_msg_common_resp) != 8);
        BUILD_BUG_ON(sizeof(struct prestera_msg_switch_init_resp) != 24);
-       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_resp) != 112);
+       BUILD_BUG_ON(sizeof(struct prestera_msg_port_attr_resp) != 136);
        BUILD_BUG_ON(sizeof(struct prestera_msg_port_stats_resp) != 248);
        BUILD_BUG_ON(sizeof(struct prestera_msg_port_info_resp) != 20);
        BUILD_BUG_ON(sizeof(struct prestera_msg_bridge_resp) != 12);
@@ -561,9 +566,9 @@ static int __prestera_cmd_ret(struct prestera_switch *sw,
        if (err)
                return err;
 
-       if (__le32_to_cpu(ret->cmd.type) != PRESTERA_CMD_TYPE_ACK)
+       if (ret->cmd.type != __cpu_to_le32(PRESTERA_CMD_TYPE_ACK))
                return -EBADE;
-       if (__le32_to_cpu(ret->status) != PRESTERA_CMD_ACK_OK)
+       if (ret->status != __cpu_to_le32(PRESTERA_CMD_ACK_OK))
                return -EINVAL;
 
        return 0;