return -ENOMEM;
        }
        qca->net_dev = qcaspi_devs;
 -      qca->spi_dev = spi_device;
 +      qca->spi_dev = spi;
        qca->legacy_mode = legacy_mode;
  
 -      spi_set_drvdata(spi_device, qcaspi_devs);
++      spi_set_drvdata(spi, qcaspi_devs);
+ 
 -      mac = of_get_mac_address(spi_device->dev.of_node);
 +      mac = of_get_mac_address(spi->dev.of_node);
  
        if (mac)
                ether_addr_copy(qca->net_dev->dev_addr, mac);
 
  /**
   * struct codel_params - contains codel parameters
   * @target:   target queue size (in time units)
 + * @ce_threshold:  threshold for marking packets with ECN CE
   * @interval: width of moving time window
+  * @mtu:      device mtu, or minimal queue backlog in bytes.
   * @ecn:      is Explicit Congestion Notification enabled
   */
  struct codel_params {
        codel_time_t    target;
 +      codel_time_t    ce_threshold;
        codel_time_t    interval;
+       u32             mtu;
        bool            ecn;
  };
  
        u32             maxpacket;
        u32             drop_count;
        u32             ecn_mark;
 +      u32             ce_mark;
  };
  
- static void codel_params_init(struct codel_params *params)
 +#define CODEL_DISABLED_THRESHOLD INT_MAX
 +
+ static void codel_params_init(struct codel_params *params,
+                             const struct Qdisc *sch)
  {
        params->interval = MS2TIME(100);
        params->target = MS2TIME(5);
+       params->mtu = psched_mtu(qdisc_dev(sch));
 +      params->ce_threshold = CODEL_DISABLED_THRESHOLD;
        params->ecn = false;
  }
  
 
                goto out;
        }
  
 +      id = peernet2id(net, peer);
        err = rtnl_net_fill(msg, NETLINK_CB(skb).portid, nlh->nlmsg_seq, 0,
-                           RTM_GETNSID, net, id);
 -                          RTM_NEWNSID, net, peer, -1);
++                          RTM_NEWNSID, net, id);
        if (err < 0)
                goto err_out;
  
 
         * (because if we remove a STA after ops->remove_interface()
         * the driver will have removed the vif info already!)
         *
-        * This is relevant only in WDS mode, in all other modes we've
-        * already removed all stations when disconnecting or similar,
-        * so warn otherwise.
+        * In WDS mode a station must exist here and be flushed, for
+        * AP_VLANs stations may exist since there's nothing else that
+        * would have removed them, but in other modes there shouldn't
+        * be any stations.
         */
        flushed = sta_info_flush(sdata);
-       WARN_ON_ONCE((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
-                    (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1));
+       WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
+                    ((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
+                     (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1)));
  
 -      /* don't count this interface for promisc/allmulti while it is down */
 +      /* don't count this interface for allmulti while it is down */
        if (sdata->flags & IEEE80211_SDATA_ALLMULTI)
                atomic_dec(&local->iff_allmultis);