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

Commit e7582561 authored by Ben M Cahill's avatar Ben M Cahill Committed by James Ketrenos
Browse files

Fixes missed beacon logic in relation to on-network AP roaming.

parent 8935f39e
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
@@ -4082,6 +4082,11 @@ static void ipw_bg_gather_stats(void *data)
	up(&priv->sem);
}

/* Missed beacon behavior:
 * 1st missed -> roaming_threshold, just wait, don't do any scan/roam.
 * roaming_threshold -> disassociate_threshold, scan and roam for better signal.
 * Above disassociate threshold, give up and stop scanning.
 * Roaming is disabled if disassociate_threshold <= roaming_threshold  */
static inline void ipw_handle_missed_beacon(struct ipw_priv *priv,
					    int missed_count)
{
@@ -4116,9 +4121,12 @@ static inline void ipw_handle_missed_beacon(struct ipw_priv *priv,
		return;
	}

	if (missed_count > priv->roaming_threshold) {
	if (missed_count > priv->roaming_threshold &&
	    missed_count <= priv->disassociate_threshold) {
		/* If we are not already roaming, set the ROAM
		 * bit in the status and kick off a scan */
		 * bit in the status and kick off a scan.
		 * This can happen several times before we reach
		 * disassociate_threshold. */
		IPW_DEBUG(IPW_DL_NOTIF | IPW_DL_STATE,
			  "Missed beacon: %d - initiate "
			  "roaming\n", missed_count);
@@ -4480,11 +4488,16 @@ static inline void ipw_rx_notification(struct ipw_priv *priv,
					      STATUS_DISASSOCIATING)))
				queue_work(priv->workqueue, &priv->associate);
			else if (priv->status & STATUS_ROAMING) {
				if (x->status == SCAN_COMPLETED_STATUS_COMPLETE)
					/* If a scan completed and we are in roam mode, then
					 * the scan that completed was the one requested as a
					 * result of entering roam... so, schedule the
					 * roam work */
				queue_work(priv->workqueue, &priv->roam);
					queue_work(priv->workqueue,
						   &priv->roam);
				else
					/* Don't schedule if we aborted the scan */
					priv->status &= ~STATUS_ROAMING;
			} else if (priv->status & STATUS_SCAN_PENDING)
				queue_work(priv->workqueue,
					   &priv->request_scan);
+3 −0
Original line number Diff line number Diff line
@@ -590,6 +590,9 @@ struct notif_channel_result {
	u8 uReserved;
} __attribute__ ((packed));

#define SCAN_COMPLETED_STATUS_COMPLETE  1
#define SCAN_COMPLETED_STATUS_ABORTED   2

struct notif_scan_complete {
	u8 scan_type;
	u8 num_channels;