Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae47c45f authored by Shahar Levi's avatar Shahar Levi Committed by Luciano Coelho
Browse files

wl12xx: 1281/1283 support - Add dummy packet support



Support sending dummy packet to wl128x FW as results of
dummy packet event. That is part of dynamic TX mem blocks mechanism.

Only send dummy packet when not in AP mode.

[Even though the DUMMY_PACKET_EVENT_ID and the
STA_REMOVE_COMPLETE_EVENT_ID events are defined to the same value, we
need to treat them separately in the code.  Keep the check and enable
STA_REMOVE_COMPLETE_EVENT_ID for AP mode and DUMMY_PACKET_EVENT_ID for
STA.  Moved one warning to a cleaner place.  Use WL1271_TID_MGMT for
dummy packets -- Luca]

Signed-off-by: default avatarShahar Levi <shahar_levi@ti.com>
Reviewed-by: default avatarLuciano Coelho <coelho@ti.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent ae77eccf
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -482,6 +482,8 @@ static int wl1271_boot_run_firmware(struct wl1271 *wl)

	if (wl->bss_type == BSS_TYPE_AP_BSS)
		wl->event_mask |= STA_REMOVE_COMPLETE_EVENT_ID;
	else
		wl->event_mask |= DUMMY_PACKET_EVENT_ID;

	ret = wl1271_event_unmask(wl);
	if (ret < 0) {
+6 −0
Original line number Diff line number Diff line
@@ -228,6 +228,12 @@ static int wl1271_event_process(struct wl1271 *wl, struct event_mailbox *mbox)
			wl1271_event_rssi_trigger(wl, mbox);
	}

	if ((vector & DUMMY_PACKET_EVENT_ID) && !is_ap) {
		wl1271_debug(DEBUG_EVENT, "DUMMY_PACKET_ID_EVENT_ID");
		if (wl->vif)
			wl1271_tx_dummy_packet(wl);
	}

	if (wl->vif && beacon_loss)
		ieee80211_connection_loss(wl->vif);

+4 −1
Original line number Diff line number Diff line
@@ -59,7 +59,10 @@ enum {
	BSS_LOSE_EVENT_ID			 = BIT(18),
	REGAINED_BSS_EVENT_ID			 = BIT(19),
	ROAMING_TRIGGER_MAX_TX_RETRY_EVENT_ID	 = BIT(20),
	STA_REMOVE_COMPLETE_EVENT_ID		 = BIT(21), /* AP */
	/* STA: dummy paket for dynamic mem blocks */
	DUMMY_PACKET_EVENT_ID                    = BIT(21),
	/* AP: STA remove complete */
	STA_REMOVE_COMPLETE_EVENT_ID             = BIT(21),
	SOFT_GEMINI_SENSE_EVENT_ID		 = BIT(22),
	SOFT_GEMINI_PREDICTION_EVENT_ID		 = BIT(23),
	SOFT_GEMINI_AVALANCHE_EVENT_ID		 = BIT(24),
+1 −0
Original line number Diff line number Diff line
@@ -170,5 +170,6 @@ struct ieee80211_hw *wl1271_alloc_hw(void);
int wl1271_free_hw(struct wl1271 *wl);
irqreturn_t wl1271_irq(int irq, void *data);
bool wl1271_set_block_size(struct wl1271 *wl);
int wl1271_tx_dummy_packet(struct wl1271 *wl);

#endif
+42 −0
Original line number Diff line number Diff line
@@ -1174,6 +1174,48 @@ static void wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
	spin_unlock_irqrestore(&wl->wl_lock, flags);
}

#define TX_DUMMY_PACKET_SIZE 1400
int wl1271_tx_dummy_packet(struct wl1271 *wl)
{
	struct sk_buff *skb = NULL;
	struct ieee80211_hdr_3addr *hdr;
	int ret = 0;

	skb = dev_alloc_skb(
		sizeof(struct wl1271_tx_hw_descr) + sizeof(*hdr) +
		TX_DUMMY_PACKET_SIZE);
	if (!skb) {
		wl1271_warning("failed to allocate buffer for dummy packet");
		ret = -ENOMEM;
		goto out;
	}

	skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));

	hdr = (struct ieee80211_hdr_3addr *) skb_put(skb, sizeof(*hdr));
	memset(hdr, 0, sizeof(*hdr));
	hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
					 IEEE80211_FCTL_TODS  |
					 IEEE80211_STYPE_NULLFUNC);

	memcpy(hdr->addr1, wl->bssid, ETH_ALEN);
	memcpy(hdr->addr2, wl->mac_addr, ETH_ALEN);
	memcpy(hdr->addr3, wl->bssid, ETH_ALEN);

	skb_put(skb, TX_DUMMY_PACKET_SIZE);

	memset(skb->data, 0, TX_DUMMY_PACKET_SIZE);

	skb->pkt_type = TX_PKT_TYPE_DUMMY_REQ;
	/* CONF_TX_AC_VO */
	skb->queue_mapping = 0;

	wl1271_op_tx(wl->hw, skb);

out:
	return ret;
}

static struct notifier_block wl1271_dev_notifier = {
	.notifier_call = wl1271_dev_notify,
};
Loading