···17281728 sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);17291729}1730173017311731+void b43_dma_handle_rx_overflow(struct b43_dmaring *ring)17321732+{17331733+ int current_slot, previous_slot;17341734+17351735+ B43_WARN_ON(ring->tx);17361736+17371737+ /* Device has filled all buffers, drop all packets and let TCP17381738+ * decrease speed.17391739+ * Decrement RX index by one will let the device to see all slots17401740+ * as free again17411741+ */17421742+ /*17431743+ *TODO: How to increase rx_drop in mac80211?17441744+ */17451745+ current_slot = ring->ops->get_current_rxslot(ring);17461746+ previous_slot = prev_slot(ring, current_slot);17471747+ ring->ops->set_current_rxslot(ring, previous_slot);17481748+}17491749+17311750void b43_dma_rx(struct b43_dmaring *ring)17321751{17331752 const struct b43_dma_ops *ops = ring->ops;
···9696 } else {9797 /* Multicast */9898 priv->curr_pkt_filter &= ~HostCmd_ACT_MAC_PROMISCUOUS_ENABLE;9999- if (mcast_list->mode == MWIFIEX_MULTICAST_MODE) {9999+ if (mcast_list->mode == MWIFIEX_ALL_MULTI_MODE) {100100 dev_dbg(priv->adapter->dev,101101 "info: Enabling All Multicast!\n");102102 priv->curr_pkt_filter |=···108108 dev_dbg(priv->adapter->dev,109109 "info: Set multicast list=%d\n",110110 mcast_list->num_multicast_addr);111111- /* Set multicast addresses to firmware */112112- if (old_pkt_filter == priv->curr_pkt_filter) {113113- /* Send request to firmware */114114- ret = mwifiex_send_cmd_async(priv,115115- HostCmd_CMD_MAC_MULTICAST_ADR,116116- HostCmd_ACT_GEN_SET, 0,117117- mcast_list);118118- } else {119119- /* Send request to firmware */120120- ret = mwifiex_send_cmd_async(priv,121121- HostCmd_CMD_MAC_MULTICAST_ADR,122122- HostCmd_ACT_GEN_SET, 0,123123- mcast_list);124124- }111111+ /* Send multicast addresses to firmware */112112+ ret = mwifiex_send_cmd_async(priv,113113+ HostCmd_CMD_MAC_MULTICAST_ADR,114114+ HostCmd_ACT_GEN_SET, 0,115115+ mcast_list);125116 }126117 }127118 }
+8-4
include/net/mac80211.h
···30533053 * This function may not be called in IRQ context. Calls to this function30543054 * for a single hardware must be synchronized against each other. Calls to30553055 * this function, ieee80211_rx_ni() and ieee80211_rx_irqsafe() may not be30563056- * mixed for a single hardware.30563056+ * mixed for a single hardware. Must not run concurrently with30573057+ * ieee80211_tx_status() or ieee80211_tx_status_ni().30573058 *30583059 * In process context use instead ieee80211_rx_ni().30593060 *···30703069 * (internally defers to a tasklet.)30713070 *30723071 * Calls to this function, ieee80211_rx() or ieee80211_rx_ni() may not30733073- * be mixed for a single hardware.30723072+ * be mixed for a single hardware.Must not run concurrently with30733073+ * ieee80211_tx_status() or ieee80211_tx_status_ni().30743074 *30753075 * @hw: the hardware this frame came in on30763076 * @skb: the buffer to receive, owned by mac80211 after this call···30853083 * (internally disables bottom halves).30863084 *30873085 * Calls to this function, ieee80211_rx() and ieee80211_rx_irqsafe() may30883088- * not be mixed for a single hardware.30863086+ * not be mixed for a single hardware. Must not run concurrently with30873087+ * ieee80211_tx_status() or ieee80211_tx_status_ni().30893088 *30903089 * @hw: the hardware this frame came in on30913090 * @skb: the buffer to receive, owned by mac80211 after this call···32093206 * This function may not be called in IRQ context. Calls to this function32103207 * for a single hardware must be synchronized against each other. Calls32113208 * to this function, ieee80211_tx_status_ni() and ieee80211_tx_status_irqsafe()32123212- * may not be mixed for a single hardware.32093209+ * may not be mixed for a single hardware. Must not run concurrently with32103210+ * ieee80211_rx() or ieee80211_rx_ni().32133211 *32143212 * @hw: the hardware the frame was transmitted by32153213 * @skb: the frame that was transmitted, owned by mac80211 after this call
···474474 master->control_port_protocol;475475 sdata->control_port_no_encrypt =476476 master->control_port_no_encrypt;477477+ sdata->vif.cab_queue = master->vif.cab_queue;478478+ memcpy(sdata->vif.hw_queue, master->vif.hw_queue,479479+ sizeof(sdata->vif.hw_queue));477480 break;478481 }479482 case NL80211_IFTYPE_AP:···656653657654 ieee80211_recalc_ps(local, -1);658655659659- if (dev) {656656+ if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||657657+ sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {658658+ /* XXX: for AP_VLAN, actually track AP queues */659659+ netif_tx_start_all_queues(dev);660660+ } else if (dev) {660661 unsigned long flags;661662 int n_acs = IEEE80211_NUM_ACS;662663 int ac;···17021695 LIST_HEAD(wdev_list);1703169617041697 ASSERT_RTNL();16981698+16991699+ /*17001700+ * Close all AP_VLAN interfaces first, as otherwise they17011701+ * might be closed while the AP interface they belong to17021702+ * is closed, causing unregister_netdevice_many() to crash.17031703+ */17041704+ list_for_each_entry(sdata, &local->interfaces, list)17051705+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)17061706+ dev_close(sdata->dev);1705170717061708 mutex_lock(&local->iflist_mtx);17071709 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
···688688 struct ieee80211_sta *pubsta,689689 struct ieee80211_sta_rates *rates)690690{691691- struct ieee80211_sta_rates *old = rcu_dereference(pubsta->rates);691691+ struct ieee80211_sta_rates *old;692692693693+ /*694694+ * mac80211 guarantees that this function will not be called695695+ * concurrently, so the following RCU access is safe, even without696696+ * extra locking. This can not be checked easily, so we just set697697+ * the condition to true.698698+ */699699+ old = rcu_dereference_protected(pubsta->rates, true);693700 rcu_assign_pointer(pubsta->rates, rates);694701 if (old)695702 kfree_rcu(old, rcu_head);
+3
net/mac80211/rx.c
···30543054 * and location updates. Note that mac8021130553055 * itself never looks at these frames.30563056 */30573057+ if (!multicast &&30583058+ !ether_addr_equal(sdata->vif.addr, hdr->addr1))30593059+ return 0;30573060 if (ieee80211_is_public_action(hdr, skb->len))30583061 return 1;30593062 if (!ieee80211_is_beacon(hdr->frame_control))