mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 21:44:27 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 153e22c0ff1260035cd7fe72c8aeead1f5fac757 Mon Sep 17 00:00:00 2001
 | |
| From: Wright Feng <Wright.Feng@cypress.com>
 | |
| Date: Mon, 5 Nov 2018 05:51:54 +0000
 | |
| Subject: [PATCH] brcmfmac: add credit numbers updating support
 | |
| 
 | |
| The credit numbers are static and tunable per chip in firmware side.
 | |
| However the credit number may be changed that is based on packet pool
 | |
| length and will send BRCMF_E_FIFO_CREDIT_MAP event to notify host driver
 | |
| updates the credit numbers during interface up.
 | |
| The purpose of this patch is making host driver has ability of updating
 | |
| the credit numbers when receiving the BRCMF_E_FIFO_CREDIT_MAP event.
 | |
| 
 | |
| Signed-off-by: Wright Feng <wright.feng@cypress.com>
 | |
| Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
 | |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | |
| ---
 | |
|  .../broadcom/brcm80211/brcmfmac/fwsignal.c    | 23 ++++++++++++-------
 | |
|  1 file changed, 15 insertions(+), 8 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
 | |
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c
 | |
| @@ -511,6 +511,7 @@ struct brcmf_fws_info {
 | |
|  	struct work_struct fws_dequeue_work;
 | |
|  	u32 fifo_enqpkt[BRCMF_FWS_FIFO_COUNT];
 | |
|  	int fifo_credit[BRCMF_FWS_FIFO_COUNT];
 | |
| +	int init_fifo_credit[BRCMF_FWS_FIFO_COUNT];
 | |
|  	int credits_borrowed[BRCMF_FWS_FIFO_AC_VO + 1];
 | |
|  	int deq_node_pos[BRCMF_FWS_FIFO_COUNT];
 | |
|  	u32 fifo_credit_map;
 | |
| @@ -1237,6 +1238,9 @@ static void brcmf_fws_return_credits(str
 | |
|  	}
 | |
|  
 | |
|  	fws->fifo_credit[fifo] += credits;
 | |
| +	if (fws->fifo_credit[fifo] > fws->init_fifo_credit[fifo])
 | |
| +		fws->fifo_credit[fifo] = fws->init_fifo_credit[fifo];
 | |
| +
 | |
|  }
 | |
|  
 | |
|  static void brcmf_fws_schedule_deq(struct brcmf_fws_info *fws)
 | |
| @@ -1595,19 +1599,21 @@ static int brcmf_fws_notify_credit_map(s
 | |
|  		brcmf_err("event payload too small (%d)\n", e->datalen);
 | |
|  		return -EINVAL;
 | |
|  	}
 | |
| -	if (fws->creditmap_received)
 | |
| -		return 0;
 | |
|  
 | |
|  	fws->creditmap_received = true;
 | |
|  
 | |
|  	brcmf_dbg(TRACE, "enter: credits %pM\n", credits);
 | |
|  	brcmf_fws_lock(fws);
 | |
|  	for (i = 0; i < ARRAY_SIZE(fws->fifo_credit); i++) {
 | |
| -		if (*credits)
 | |
| +		fws->fifo_credit[i] += credits[i] - fws->init_fifo_credit[i];
 | |
| +		fws->init_fifo_credit[i] = credits[i];
 | |
| +		if (fws->fifo_credit[i] > 0)
 | |
|  			fws->fifo_credit_map |= 1 << i;
 | |
|  		else
 | |
|  			fws->fifo_credit_map &= ~(1 << i);
 | |
| -		fws->fifo_credit[i] = *credits++;
 | |
| +		WARN_ONCE(fws->fifo_credit[i] < 0,
 | |
| +			  "fifo_credit[%d] is negative(%d)\n", i,
 | |
| +			  fws->fifo_credit[i]);
 | |
|  	}
 | |
|  	brcmf_fws_schedule_deq(fws);
 | |
|  	brcmf_fws_unlock(fws);
 | |
| @@ -2013,7 +2019,7 @@ static int brcmf_fws_borrow_credit(struc
 | |
|  	}
 | |
|  
 | |
|  	for (lender_ac = 0; lender_ac <= BRCMF_FWS_FIFO_AC_VO; lender_ac++) {
 | |
| -		if (fws->fifo_credit[lender_ac]) {
 | |
| +		if (fws->fifo_credit[lender_ac] > 0) {
 | |
|  			fws->credits_borrowed[lender_ac]++;
 | |
|  			fws->fifo_credit[lender_ac]--;
 | |
|  			if (fws->fifo_credit[lender_ac] == 0)
 | |
| @@ -2210,8 +2216,9 @@ static void brcmf_fws_dequeue_worker(str
 | |
|  			}
 | |
|  			continue;
 | |
|  		}
 | |
| -		while ((fws->fifo_credit[fifo]) || ((!fws->bcmc_credit_check) &&
 | |
| -		       (fifo == BRCMF_FWS_FIFO_BCMC))) {
 | |
| +		while ((fws->fifo_credit[fifo] > 0) ||
 | |
| +		       ((!fws->bcmc_credit_check) &&
 | |
| +			(fifo == BRCMF_FWS_FIFO_BCMC))) {
 | |
|  			skb = brcmf_fws_deq(fws, fifo);
 | |
|  			if (!skb)
 | |
|  				break;
 | |
| @@ -2222,7 +2229,7 @@ static void brcmf_fws_dequeue_worker(str
 | |
|  				break;
 | |
|  		}
 | |
|  		if ((fifo == BRCMF_FWS_FIFO_AC_BE) &&
 | |
| -		    (fws->fifo_credit[fifo] == 0) &&
 | |
| +		    (fws->fifo_credit[fifo] <= 0) &&
 | |
|  		    (!fws->bus_flow_blocked)) {
 | |
|  			while (brcmf_fws_borrow_credit(fws) == 0) {
 | |
|  				skb = brcmf_fws_deq(fws, fifo);
 |