wil6210: fix device ready detection
Adjust driver behavior during FW boot. Proper sequence of events after reset and FW download, is as following: - FW prepares mailbox structure and reports IRQ "FW_READY" - driver caches mailbox registers, marks mailbox readiness - FW sends WMI_FW_READY event, ignore it - FW sends WMI_READY event with some data - driver stores relevant data marks FW is operational Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
		
							parent
							
								
									e3d2ed9434
								
							
						
					
					
						commit
						817f185344
					
				| @ -236,7 +236,7 @@ static irqreturn_t wil6210_irq_rx(int irq, void *cookie) | ||||
| 
 | ||||
| 		isr &= ~(BIT_DMA_EP_RX_ICR_RX_DONE | | ||||
| 			 BIT_DMA_EP_RX_ICR_RX_HTRSH); | ||||
| 		if (likely(test_bit(wil_status_reset_done, wil->status))) { | ||||
| 		if (likely(test_bit(wil_status_fwready, wil->status))) { | ||||
| 			if (likely(test_bit(wil_status_napi_en, wil->status))) { | ||||
| 				wil_dbg_txrx(wil, "NAPI(Rx) schedule\n"); | ||||
| 				need_unmask = false; | ||||
| @ -286,7 +286,7 @@ static irqreturn_t wil6210_irq_tx(int irq, void *cookie) | ||||
| 		isr &= ~BIT_DMA_EP_TX_ICR_TX_DONE; | ||||
| 		/* clear also all VRING interrupts */ | ||||
| 		isr &= ~(BIT(25) - 1UL); | ||||
| 		if (likely(test_bit(wil_status_reset_done, wil->status))) { | ||||
| 		if (likely(test_bit(wil_status_fwready, wil->status))) { | ||||
| 			wil_dbg_txrx(wil, "NAPI(Tx) schedule\n"); | ||||
| 			need_unmask = false; | ||||
| 			napi_schedule(&wil->napi_tx); | ||||
| @ -364,7 +364,7 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie) | ||||
| 	if (isr & ISR_MISC_FW_READY) { | ||||
| 		wil_dbg_irq(wil, "IRQ: FW ready\n"); | ||||
| 		wil_cache_mbox_regs(wil); | ||||
| 		set_bit(wil_status_reset_done, wil->status); | ||||
| 		set_bit(wil_status_mbox_ready, wil->status); | ||||
| 		/**
 | ||||
| 		 * Actual FW ready indicated by the | ||||
| 		 * WMI_FW_READY_EVENTID | ||||
|  | ||||
| @ -402,11 +402,11 @@ struct vring_tx_data { | ||||
| }; | ||||
| 
 | ||||
| enum { /* for wil6210_priv.status */ | ||||
| 	wil_status_fwready = 0, | ||||
| 	wil_status_fwready = 0, /* FW operational */ | ||||
| 	wil_status_fwconnecting, | ||||
| 	wil_status_fwconnected, | ||||
| 	wil_status_dontscan, | ||||
| 	wil_status_reset_done, | ||||
| 	wil_status_mbox_ready, /* MBOX structures ready */ | ||||
| 	wil_status_irqen, /* FIXME: interrupts enabled - for debug */ | ||||
| 	wil_status_napi_en, /* NAPI enabled protected by wil->mutex */ | ||||
| 	wil_status_resetting, /* reset in progress */ | ||||
|  | ||||
| @ -293,12 +293,6 @@ static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len) | ||||
| 	/* ignore MAC address, we already have it from the boot loader */ | ||||
| 	snprintf(wdev->wiphy->fw_version, sizeof(wdev->wiphy->fw_version), | ||||
| 		 "%d", wil->fw_version); | ||||
| } | ||||
| 
 | ||||
| static void wmi_evt_fw_ready(struct wil6210_priv *wil, int id, void *d, | ||||
| 			     int len) | ||||
| { | ||||
| 	wil_dbg_wmi(wil, "WMI: got FW ready event\n"); | ||||
| 
 | ||||
| 	wil_set_recovery_state(wil, fw_recovery_idle); | ||||
| 	set_bit(wil_status_fwready, wil->status); | ||||
| @ -699,7 +693,7 @@ static const struct { | ||||
| 			void *data, int data_len); | ||||
| } wmi_evt_handlers[] = { | ||||
| 	{WMI_READY_EVENTID,		wmi_evt_ready}, | ||||
| 	{WMI_FW_READY_EVENTID,		wmi_evt_fw_ready}, | ||||
| 	{WMI_FW_READY_EVENTID,			wmi_evt_ignore}, | ||||
| 	{WMI_RX_MGMT_PACKET_EVENTID,	wmi_evt_rx_mgmt}, | ||||
| 	{WMI_TX_MGMT_PACKET_EVENTID,		wmi_evt_tx_mgmt}, | ||||
| 	{WMI_SCAN_COMPLETE_EVENTID,	wmi_evt_scan_complete}, | ||||
| @ -730,7 +724,7 @@ void wmi_recv_cmd(struct wil6210_priv *wil) | ||||
| 	ulong flags; | ||||
| 	unsigned n; | ||||
| 
 | ||||
| 	if (!test_bit(wil_status_reset_done, wil->status)) { | ||||
| 	if (!test_bit(wil_status_mbox_ready, wil->status)) { | ||||
| 		wil_err(wil, "Reset in progress. Cannot handle WMI event\n"); | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user