mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			143 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From 8f13c87ccc495e30de5f58bbda967f6edd5bec53 Mon Sep 17 00:00:00 2001
 | |
| From: Ian Molton <ian@mnementh.co.uk>
 | |
| Date: Fri, 8 Dec 2017 13:10:26 +0100
 | |
| Subject: [PATCH] brcmfmac: Split brcmf_sdiod_buffrw function up.
 | |
| 
 | |
| This function needs to be split up into separate read / write variants
 | |
| for clarity.
 | |
| 
 | |
| Signed-off-by: Ian Molton <ian@mnementh.co.uk>
 | |
| Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
 | |
| Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
 | |
| Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
 | |
| ---
 | |
|  .../wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c  | 67 +++++++++++++++-------
 | |
|  1 file changed, 45 insertions(+), 22 deletions(-)
 | |
| 
 | |
| --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | |
| +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
 | |
| @@ -414,8 +414,8 @@ void brcmf_sdiod_regwl(struct brcmf_sdio
 | |
|  		*ret = retval;
 | |
|  }
 | |
|  
 | |
| -static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
 | |
| -			     bool write, u32 addr, struct sk_buff *pkt)
 | |
| +static int brcmf_sdiod_buff_read(struct brcmf_sdio_dev *sdiodev, uint fn,
 | |
| +				 u32 addr, struct sk_buff *pkt)
 | |
|  {
 | |
|  	unsigned int req_sz;
 | |
|  	int err;
 | |
| @@ -424,18 +424,36 @@ static int brcmf_sdiod_buffrw(struct brc
 | |
|  	req_sz = pkt->len + 3;
 | |
|  	req_sz &= (uint)~3;
 | |
|  
 | |
| -	if (write)
 | |
| -		err = sdio_memcpy_toio(sdiodev->func[fn], addr,
 | |
| -				       ((u8 *)(pkt->data)), req_sz);
 | |
| -	else if (fn == 1)
 | |
| -		err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
 | |
| -					 addr, req_sz);
 | |
| +	if (fn == 1)
 | |
| +		err = sdio_memcpy_fromio(sdiodev->func[fn],
 | |
| +					 ((u8 *)(pkt->data)), addr, req_sz);
 | |
|  	else
 | |
|  		/* function 2 read is FIFO operation */
 | |
| -		err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
 | |
| -				  req_sz);
 | |
| +		err = sdio_readsb(sdiodev->func[fn],
 | |
| +				  ((u8 *)(pkt->data)), addr, req_sz);
 | |
| +
 | |
| +	if (err == -ENOMEDIUM)
 | |
| +		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
 | |
| +
 | |
| +	return err;
 | |
| +}
 | |
| +
 | |
| +static int brcmf_sdiod_buff_write(struct brcmf_sdio_dev *sdiodev, uint fn,
 | |
| +				  u32 addr, struct sk_buff *pkt)
 | |
| +{
 | |
| +	unsigned int req_sz;
 | |
| +	int err;
 | |
| +
 | |
| +	/* Single skb use the standard mmc interface */
 | |
| +	req_sz = pkt->len + 3;
 | |
| +	req_sz &= (uint)~3;
 | |
| +
 | |
| +	err = sdio_memcpy_toio(sdiodev->func[fn], addr,
 | |
| +			       ((u8 *)(pkt->data)), req_sz);
 | |
| +
 | |
|  	if (err == -ENOMEDIUM)
 | |
|  		brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
 | |
| +
 | |
|  	return err;
 | |
|  }
 | |
|  
 | |
| @@ -643,7 +661,7 @@ int brcmf_sdiod_recv_pkt(struct brcmf_sd
 | |
|  	if (err)
 | |
|  		goto done;
 | |
|  
 | |
| -	err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr, pkt);
 | |
| +	err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr, pkt);
 | |
|  
 | |
|  done:
 | |
|  	return err;
 | |
| @@ -665,14 +683,14 @@ int brcmf_sdiod_recv_chain(struct brcmf_
 | |
|  		goto done;
 | |
|  
 | |
|  	if (pktq->qlen == 1)
 | |
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
 | |
| -					 pktq->next);
 | |
| +		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
 | |
| +					    pktq->next);
 | |
|  	else if (!sdiodev->sg_support) {
 | |
|  		glom_skb = brcmu_pkt_buf_get_skb(totlen);
 | |
|  		if (!glom_skb)
 | |
|  			return -ENOMEM;
 | |
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, false, addr,
 | |
| -					 glom_skb);
 | |
| +		err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_2, addr,
 | |
| +					    glom_skb);
 | |
|  		if (err)
 | |
|  			goto done;
 | |
|  
 | |
| @@ -707,8 +725,7 @@ int brcmf_sdiod_send_buf(struct brcmf_sd
 | |
|  	err = brcmf_sdiod_addrprep(sdiodev, &addr);
 | |
|  
 | |
|  	if (!err)
 | |
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true, addr,
 | |
| -					 mypkt);
 | |
| +		err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2, addr, mypkt);
 | |
|  
 | |
|  	brcmu_pkt_buf_free_skb(mypkt);
 | |
|  	return err;
 | |
| @@ -730,8 +747,8 @@ int brcmf_sdiod_send_pkt(struct brcmf_sd
 | |
|  
 | |
|  	if (pktq->qlen == 1 || !sdiodev->sg_support)
 | |
|  		skb_queue_walk(pktq, skb) {
 | |
| -			err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_2, true,
 | |
| -						 addr, skb);
 | |
| +			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_2,
 | |
| +						     addr, skb);
 | |
|  			if (err)
 | |
|  				break;
 | |
|  		}
 | |
| @@ -783,10 +800,16 @@ brcmf_sdiod_ramrw(struct brcmf_sdio_dev
 | |
|  		sdaddr |= SBSDIO_SB_ACCESS_2_4B_FLAG;
 | |
|  
 | |
|  		skb_put(pkt, dsize);
 | |
| -		if (write)
 | |
| +
 | |
| +		if (write) {
 | |
|  			memcpy(pkt->data, data, dsize);
 | |
| -		err = brcmf_sdiod_buffrw(sdiodev, SDIO_FUNC_1, write, sdaddr,
 | |
| -					 pkt);
 | |
| +			err = brcmf_sdiod_buff_write(sdiodev, SDIO_FUNC_1,
 | |
| +						     sdaddr, pkt);
 | |
| +		} else {
 | |
| +			err = brcmf_sdiod_buff_read(sdiodev, SDIO_FUNC_1,
 | |
| +						    sdaddr, pkt);
 | |
| +		}
 | |
| +
 | |
|  		if (err) {
 | |
|  			brcmf_err("membytes transfer failed\n");
 | |
|  			break;
 |