const struct mt76_driver_ops *drv_ops)
 {
        struct ieee80211_hw *hw;
+       struct mt76_phy *phy;
        struct mt76_dev *dev;
        int i;
 
        dev->dev = pdev;
        dev->drv = drv_ops;
 
+       phy = &dev->phy;
+       phy->dev = dev;
+       phy->hw = hw;
+
        spin_lock_init(&dev->rx_lock);
        spin_lock_init(&dev->lock);
        spin_lock_init(&dev->cc_lock);
 
        s8 chain_signal[IEEE80211_MAX_CHAINS];
 };
 
+struct mt76_phy {
+       struct ieee80211_hw *hw;
+       struct mt76_dev *dev;
+};
+
 struct mt76_dev {
+       struct mt76_phy phy; /* must be first */
+
        struct ieee80211_hw *hw;
        struct cfg80211_chan_def chandef;
        struct ieee80211_channel *main_chan;
 #define __mt76_rmw_field(_dev, _reg, _field, _val)     \
        __mt76_rmw(_dev, _reg, _field, FIELD_PREP(_field, _val))
 
-#define mt76_hw(dev) (dev)->mt76.hw
+#define mt76_hw(dev) (dev)->mphy.hw
 
 bool __mt76_poll(struct mt76_dev *dev, u32 offset, u32 mask, u32 val,
                 int timeout);
 
        (dev)->beacon_ops->pre_tbtt_enable(dev, enable)
 
 struct mt76x02_dev {
-       struct mt76_dev mt76; /* must be first */
+       union { /* must be first */
+               struct mt76_dev mt76;
+               struct mt76_phy mphy;
+       };
 
        struct mac_address macaddr_list[8];