};
 
 struct wpan_phy {
-       struct mutex pib_lock;
-
        /* If multiple wpan_phys are registered and you're handed e.g.
         * a regular netdev with assigned ieee802154_ptr, you won't
         * know whether it points to a wpan_phy your driver has registered
 
        /* atomic_inc_return makes it start at 1, make it start at 0 */
        rdev->wpan_phy_idx--;
 
-       mutex_init(&rdev->wpan_phy.pib_lock);
-
        INIT_LIST_HEAD(&rdev->wpan_dev_list);
        device_initialize(&rdev->wpan_phy.dev);
        dev_set_name(&rdev->wpan_phy.dev, PHY_NAME "%d", rdev->wpan_phy_idx);
 
        if (!hdr)
                goto out;
 
-       mutex_lock(&phy->pib_lock);
+       rtnl_lock();
        if (nla_put_string(msg, IEEE802154_ATTR_PHY_NAME, wpan_phy_name(phy)) ||
            nla_put_u8(msg, IEEE802154_ATTR_PAGE, phy->current_page) ||
            nla_put_u8(msg, IEEE802154_ATTR_CHANNEL, phy->current_channel))
            nla_put(msg, IEEE802154_ATTR_CHANNEL_PAGE_LIST,
                    pages * sizeof(uint32_t), buf))
                goto nla_put_failure;
-       mutex_unlock(&phy->pib_lock);
+       rtnl_unlock();
        kfree(buf);
        genlmsg_end(msg, hdr);
        return 0;
 
 nla_put_failure:
-       mutex_unlock(&phy->pib_lock);
+       rtnl_unlock();
        genlmsg_cancel(msg, hdr);
 out:
        kfree(buf);
 
        struct ieee802154_sub_if_data *sdata = IEEE802154_DEV_TO_SUB_IF(dev);
        struct ieee802154_local *local = sdata->local;
        struct wpan_dev *wpan_dev = &sdata->wpan_dev;
-       struct wpan_phy *phy = sdata->local->phy;
 
        rc = ieee802154_check_concurrent_iface(sdata, sdata->vif.type);
        if (rc < 0)
        if (rc < 0)
                return rc;
 
-       mutex_lock(&phy->pib_lock);
-
        if (local->hw.flags & IEEE802154_HW_PROMISCUOUS) {
                rc = drv_set_promiscuous_mode(local,
                                              wpan_dev->promiscuous_mode);
                        goto out;
        }
 
-       mutex_unlock(&phy->pib_lock);
-       return 0;
-
 out:
-       mutex_unlock(&phy->pib_lock);
        return rc;
 }
 
 
        struct ieee802154_local *local = sdata->local;
        int res;
 
+       ASSERT_RTNL();
+
        BUG_ON(dev->type != ARPHRD_IEEE802154);
 
        res = drv_set_channel(local, page, chan);
        if (res) {
                pr_debug("set_channel failed\n");
        } else {
-               mutex_lock(&local->phy->pib_lock);
                local->phy->current_channel = chan;
                local->phy->current_page = page;
-               mutex_unlock(&local->phy->pib_lock);
        }
 }