struct list_head region_list;
        struct devlink *devlink;
        unsigned int index;
-       spinlock_t type_lock; /* Protects type and type_dev
-                              * pointer consistency.
+       spinlock_t type_lock; /* Protects type and type_eth/ib
+                              * structures consistency.
                               */
        enum devlink_port_type type;
        enum devlink_port_type desired_type;
-       void *type_dev;
+       union {
+               struct {
+                       struct net_device *netdev;
+               } type_eth;
+               struct {
+                       struct ib_device *ibdev;
+               } type_ib;
+       };
        struct devlink_port_attrs attrs;
        u8 attrs_set:1,
           switch_port:1,
 
                goto nla_put_failure_type_locked;
        if (devlink_port->type == DEVLINK_PORT_TYPE_ETH) {
                struct net *net = devlink_net(devlink_port->devlink);
-               struct net_device *netdev = devlink_port->type_dev;
+               struct net_device *netdev = devlink_port->type_eth.netdev;
 
                if (netdev && net_eq(net, dev_net(netdev)) &&
                    (nla_put_u32(msg, DEVLINK_ATTR_PORT_NETDEV_IFINDEX,
                        goto nla_put_failure_type_locked;
        }
        if (devlink_port->type == DEVLINK_PORT_TYPE_IB) {
-               struct ib_device *ibdev = devlink_port->type_dev;
+               struct ib_device *ibdev = devlink_port->type_ib.ibdev;
 
                if (ibdev &&
                    nla_put_string(msg, DEVLINK_ATTR_PORT_IBDEV_NAME,
        devlink_port_type_warn_cancel(devlink_port);
        spin_lock_bh(&devlink_port->type_lock);
        devlink_port->type = type;
-       devlink_port->type_dev = type_dev;
+       switch (type) {
+       case DEVLINK_PORT_TYPE_ETH:
+               devlink_port->type_eth.netdev = type_dev;
+               break;
+       case DEVLINK_PORT_TYPE_IB:
+               devlink_port->type_ib.ibdev = type_dev;
+               break;
+       default:
+               break;
+       }
        spin_unlock_bh(&devlink_port->type_lock);
        devlink_port_notify(devlink_port, DEVLINK_CMD_PORT_NEW);
 }
 
        spin_lock(&in_devlink_port->type_lock);
        if (in_devlink_port->type == DEVLINK_PORT_TYPE_ETH)
-               metadata->input_dev = in_devlink_port->type_dev;
+               metadata->input_dev = in_devlink_port->type_eth.netdev;
        spin_unlock(&in_devlink_port->type_lock);
 }