On Wed, 2010-11-24 at 18:33 +0200, ext Shahar Levi wrote: > Add new ampdu_action ops to support receiver BA. > The BA initiator session management in FW independently. > > Signed-off-by: Shahar Levi <shahar_levi@xxxxxx> > --- > > +int wl1271_op_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, > + enum ieee80211_ampdu_mlme_action action, > + struct ieee80211_sta *sta, u16 tid, u16 *ssn) > +{ > + struct wl1271 *wl = hw->priv; > + int ret; > + > + ret = wl1271_ps_elp_wakeup(wl, false); > + if (ret < 0) > + goto out; > + > + switch (action) { > + case IEEE80211_AMPDU_RX_START: > + if (wl->ba_allowed) { > + ret = wl1271_acx_set_ba_receiver_session(wl, tid, ssn, > + true); > + if (!ret) > + wl->ba_rx_bitmap |= (u8)(BIT(0) << tid); > + } else > + ret = -EPERM; > + break; > + > + case IEEE80211_AMPDU_RX_STOP: > + ret = wl1271_acx_set_ba_receiver_session(wl, tid, ssn, false); > + if (!ret) > + wl->ba_rx_bitmap &= ~(u8)(BIT(0) << tid); > + break; > + > + /* > + * The BA initiator session management in FW independently. > + * Falling break here on purpose for all TX APDU commands. > + */ > + case IEEE80211_AMPDU_TX_START: > + case IEEE80211_AMPDU_TX_STOP: > + case IEEE80211_AMPDU_TX_OPERATIONAL: > + ret = -EINVAL; > + break; > + > + default: > + wl1271_error("Incorrect ampdu action id=%x\n", action); > + ret = -ENODEV; > + } > + > + wl1271_ps_elp_sleep(wl); > + > +out: > + return ret; > +} > + Seems to me that locking of the wl1271 mutex is missing here. Also, I think it would be good to add checking for interface status (wl->state == WL1271_STATE_OFF) here too. In normal cases this would not be needed, but there are at least some hardware recovery scenarios where this could be called while the firmware is off, causing all types of odd behavior. -Juuso -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html